From 680a9153133794d54695c5442c5c378c73f4d09c Mon Sep 17 00:00:00 2001 From: yezhonghui Date: Wed, 21 Aug 2024 19:59:23 +0800 Subject: [PATCH] pci alloc mis irq support new interface Signed-off-by: yezhonghui --- arch/arm/src/armv7-a/arm_gicv2m.c | 11 ++++++----- arch/arm64/src/common/arm64_gicv2m.c | 15 ++++++++------- arch/x86_64/src/common/x86_64_pci.c | 26 +++++--------------------- arch/x86_64/src/intel64/intel64_hpet.c | 5 ++--- arch/x86_64/src/intel64/intel64_irq.c | 18 +++++++++--------- drivers/pci/pci.c | 2 +- drivers/pci/pci_ecam.c | 11 +++++------ include/nuttx/arch.h | 8 ++++---- include/nuttx/pci/pci.h | 3 ++- 9 files changed, 42 insertions(+), 57 deletions(-) diff --git a/arch/arm/src/armv7-a/arm_gicv2m.c b/arch/arm/src/armv7-a/arm_gicv2m.c index 6752862e729c9..ca979fc290784 100644 --- a/arch/arm/src/armv7-a/arm_gicv2m.c +++ b/arch/arm/src/armv7-a/arm_gicv2m.c @@ -102,7 +102,7 @@ int gic_v2m_initialize(void) return 0; } -int up_alloc_irq_msi(int *num) +int up_alloc_irq_msi(uint8_t busno, uint32_t devfn, int *pirq, int num) { irqstate_t flags; int offset; @@ -110,15 +110,16 @@ int up_alloc_irq_msi(int *num) int i; flags = spin_lock_irqsave(&g_v2m.lock); - offset = bitmap_find_free_region(g_v2m.spi_bitmap, g_v2m.spi_number, *num); + offset = bitmap_find_free_region(g_v2m.spi_bitmap, g_v2m.spi_number, num); spin_unlock_irqrestore(&g_v2m.lock, flags); irq = g_v2m.spi_start + offset; - for (i = 0; i < *num; i++) + for (i = 0; i < num; i++) { arm_gic_irq_trigger(i + irq, true); + pirq[i] = i + irq; } - return irq; + return num; } void up_release_irq_msi(int *irq, int num) @@ -130,7 +131,7 @@ void up_release_irq_msi(int *irq, int num) spin_unlock_irqrestore(&g_v2m.lock, flags); } -int up_connect_irq(int *irq, int num, +int up_connect_irq(const int *irq, int num, uintptr_t *mar, uint32_t *mdr) { *mar = GIC_V2MSETSPI; diff --git a/arch/arm64/src/common/arm64_gicv2m.c b/arch/arm64/src/common/arm64_gicv2m.c index ec9acc412136d..8dc3a628eac77 100644 --- a/arch/arm64/src/common/arm64_gicv2m.c +++ b/arch/arm64/src/common/arm64_gicv2m.c @@ -117,7 +117,7 @@ int arm64_gic_v2m_initialize(void) return 0; } -int up_alloc_irq_msi(FAR int *num) +int up_alloc_irq_msi(uint8_t busno, uint32_t devfn, int *pirq, int num) { irqstate_t flags; int offset; @@ -125,18 +125,19 @@ int up_alloc_irq_msi(FAR int *num) int i; flags = spin_lock_irqsave(&g_v2m.lock); - offset = bitmap_find_free_region(g_v2m.spi_bitmap, g_v2m.spi_number, *num); + offset = bitmap_find_free_region(g_v2m.spi_bitmap, g_v2m.spi_number, num); spin_unlock_irqrestore(&g_v2m.lock, flags); irq = g_v2m.spi_start + offset; - for (i = 0; i < *num; i++) + for (i = 0; i < num; i++) { arm64_gicv_irq_trigger(i + irq, true); + pirq[i] = irq + i; } - return irq; + return num; } -void up_release_irq_msi(FAR int *irq, int num) +void up_release_irq_msi(int *irq, int num) { irqstate_t flags; @@ -145,8 +146,8 @@ void up_release_irq_msi(FAR int *irq, int num) spin_unlock_irqrestore(&g_v2m.lock, flags); } -int up_connect_irq(FAR int *irq, int num, - FAR uintptr_t *mar, FAR uint32_t *mdr) +int up_connect_irq(const int *irq, int num, + uintptr_t *mar, uint32_t *mdr) { *mar = GIC_V2MSETSPI; *mdr = *irq; diff --git a/arch/x86_64/src/common/x86_64_pci.c b/arch/x86_64/src/common/x86_64_pci.c index a7ecd3c92f2f1..e9d683ecd1b1f 100644 --- a/arch/x86_64/src/common/x86_64_pci.c +++ b/arch/x86_64/src/common/x86_64_pci.c @@ -74,7 +74,7 @@ static int x86_64_pci_write_io(struct pci_bus_s *bus, uintptr_t addr, static int x86_64_pci_get_irq(struct pci_bus_s *bus, uint32_t devfn, uint8_t line, uint8_t pin); -static int x86_64_pci_alloc_irq(struct pci_bus_s *bus, +static int x86_64_pci_alloc_irq(struct pci_bus_s *bus, uint32_t devfn, int *irq, int num); static void x86_64_pci_release_irq(struct pci_bus_s *bus, int *irq, int num); @@ -344,6 +344,7 @@ static int x86_64_pci_get_irq(struct pci_bus_s *bus, uint32_t devfn, * bus - Bus that PCI device resides * irq - allocated vectors array * num - number of vectors to allocate + * devfn - The pci device and function number * * Returned Value: * >0: success, return number of allocated vectors, @@ -351,27 +352,10 @@ static int x86_64_pci_get_irq(struct pci_bus_s *bus, uint32_t devfn, * ****************************************************************************/ -static int x86_64_pci_alloc_irq(struct pci_bus_s *bus, int *irq, int num) +static int x86_64_pci_alloc_irq(struct pci_bus_s *bus, uint32_t devfn, + int *irq, int num) { - int tmp = 0; - int i = 0; - - /* Try to get irq */ - - tmp = up_alloc_irq_msi(&num); - if (tmp < 0) - { - return tmp; - } - - /* Copy allocated interrupts */ - - for (i = 0; i < num; i++) - { - irq[i] = tmp++; - } - - return num; + return up_alloc_irq_msi(bus->ctrl->busno, devfn, irq, num); } /**************************************************************************** diff --git a/arch/x86_64/src/intel64/intel64_hpet.c b/arch/x86_64/src/intel64/intel64_hpet.c index 9bf3ce35b7909..f14f6bae851e1 100644 --- a/arch/x86_64/src/intel64/intel64_hpet.c +++ b/arch/x86_64/src/intel64/intel64_hpet.c @@ -465,9 +465,8 @@ static void intel64_hpet_fsb(struct intel64_hpet_s *hpet) { /* Allocate MSI vector */ - vect = 1; - irq = up_alloc_irq_msi(&vect); - if (irq < 0 && vect != 1) + vect = up_alloc_irq_msi(0, 0, &irq, 1); + if (vect != 1) { tmrerr("failed to allocate MSI for timer %d\n", i); ASSERT(0); diff --git a/arch/x86_64/src/intel64/intel64_irq.c b/arch/x86_64/src/intel64/intel64_irq.c index 374a240c68140..aae0f6f0c7b20 100644 --- a/arch/x86_64/src/intel64/intel64_irq.c +++ b/arch/x86_64/src/intel64/intel64_irq.c @@ -648,7 +648,7 @@ int up_get_legacy_irq(uint32_t devfn, uint8_t line, uint8_t pin) * ****************************************************************************/ -int up_alloc_irq_msi(int *num) +int up_alloc_irq_msi(uint8_t busno, uint32_t devfn, int *pirq, int num) { irqstate_t flags = spin_lock_irqsave(&g_irq_spin); int irq = 0; @@ -656,12 +656,12 @@ int up_alloc_irq_msi(int *num) /* Limit requested number of vectors */ - if (g_msi_now + *num > IRQ255) + if (g_msi_now + num > IRQ255) { - *num = IRQ255 - g_msi_now; + num = IRQ255 - g_msi_now; } - if (*num <= 0) + if (num <= 0) { spin_unlock_irqrestore(&g_irq_spin, flags); @@ -671,19 +671,20 @@ int up_alloc_irq_msi(int *num) } irq = g_msi_now; - g_msi_now += *num; + g_msi_now += num; /* Mark IRQs as MSI/MSI-X */ - for (i = 0; i < *num; i++) + for (i = 0; i < num; i++) { ASSERT(g_irq_priv[irq + i].busy == 0); g_irq_priv[irq + i].msi = true; + pirq[i] = irq + i; } spin_unlock_irqrestore(&g_irq_spin, flags); - return irq; + return num; } /**************************************************************************** @@ -717,8 +718,7 @@ void up_release_irq_msi(int *irq, int num) * ****************************************************************************/ -int up_connect_irq(FAR int *irq, int num, - FAR uintptr_t *mar, FAR uint32_t *mdr) +int up_connect_irq(const int *irq, int num, uintptr_t *mar, uint32_t *mdr) { UNUSED(num); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index c50337b5e0d2c..25efb0663fe20 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1787,7 +1787,7 @@ int pci_alloc_irq(FAR struct pci_device_s *dev, FAR int *irq, int num) { if (dev->bus->ctrl->ops->alloc_irq) { - return dev->bus->ctrl->ops->alloc_irq(dev->bus, irq, num); + return dev->bus->ctrl->ops->alloc_irq(dev->bus, dev->devfn, irq, num); } return -ENOTSUP; diff --git a/drivers/pci/pci_ecam.c b/drivers/pci/pci_ecam.c index 111baa20c4812..1b76e71b94d49 100644 --- a/drivers/pci/pci_ecam.c +++ b/drivers/pci/pci_ecam.c @@ -66,8 +66,8 @@ static int pci_ecam_get_irq(FAR struct pci_bus_s *bus, uint32_t devfn, uint8_t line, uint8_t pin); #ifdef CONFIG_PCI_MSIX -static int pci_ecam_alloc_irq(FAR struct pci_bus_s *bus, FAR int *irq, - int num); +static int pci_ecam_alloc_irq(FAR struct pci_bus_s *bus, uint32_t devfn, + FAR int *irq, int num); static void pci_ecam_release_irq(FAR struct pci_bus_s *bus, FAR int *irq, int num); @@ -391,11 +391,10 @@ static int pci_ecam_write_io(FAR struct pci_bus_s *bus, uintptr_t addr, } #ifdef CONFIG_PCI_MSIX -static int pci_ecam_alloc_irq(FAR struct pci_bus_s *bus, FAR int *irq, - int num) +static int pci_ecam_alloc_irq(FAR struct pci_bus_s *bus, uint32_t devfn, + FAR int *irq, int num) { - *irq = up_alloc_irq_msi(&num); - return num; + return up_alloc_irq_msi(bus->ctrl->busno, devfn, irq, num); } static void pci_ecam_release_irq(FAR struct pci_bus_s *bus, FAR int *irq, diff --git a/include/nuttx/arch.h b/include/nuttx/arch.h index 184cfaebc8dc6..249ba1c58cd41 100644 --- a/include/nuttx/arch.h +++ b/include/nuttx/arch.h @@ -3084,7 +3084,8 @@ int up_debugpoint_remove(int type, FAR void *addr, size_t size); * Allocate interrupts for MSI/MSI-X vector. * * Input Parameters: - * bus - Bus that PCI device resides + * busno - Bus num that PCI device resides + * devfn - Device and function number * irq - allocated vectors array * num - number of vectors to allocate * @@ -3094,7 +3095,7 @@ int up_debugpoint_remove(int type, FAR void *addr, size_t size); * ****************************************************************************/ -int up_alloc_irq_msi(FAR int *num); +int up_alloc_irq_msi(uint8_t busno, uint32_t devfn, FAR int *irq, int num); /**************************************************************************** * Name: up_release_irq_msi @@ -3121,7 +3122,6 @@ void up_release_irq_msi(FAR int *irq, int num); * Connect interrupt for MSI/MSI-X. * * Input Parameters: - * bus - Bus that PCI device resides * irq - vectors array * num - number of vectors in array * mar - returned value for Message Address Register @@ -3132,7 +3132,7 @@ void up_release_irq_msi(FAR int *irq, int num); * ****************************************************************************/ -int up_connect_irq(FAR int *irq, int num, +int up_connect_irq(FAR const int *irq, int num, FAR uintptr_t *mar, FAR uint32_t *mdr); /**************************************************************************** diff --git a/include/nuttx/pci/pci.h b/include/nuttx/pci/pci.h index 0ba1aecdb79a9..7fd1926f7b5d5 100644 --- a/include/nuttx/pci/pci.h +++ b/include/nuttx/pci/pci.h @@ -316,7 +316,8 @@ struct pci_ops_s /* Allocate interrupt for MSI/MSI-X */ - CODE int (*alloc_irq)(FAR struct pci_bus_s *bus, FAR int *irq, int num); + CODE int (*alloc_irq)(FAR struct pci_bus_s *bus, uint32_t devfn, + FAR int *irq, int num); CODE void (*release_irq)(FAR struct pci_bus_s *bus, FAR int *irq, int num);