pci alloc mis irq support new interface

Signed-off-by: yezhonghui <yezhonghui@xiaomi.com>
This commit is contained in:
yezhonghui
2024-09-30 15:41:28 +08:00
committed by Xiang Xiao
parent edd7d718eb
commit 85591fc360
9 changed files with 42 additions and 57 deletions
+6 -5
View File
@@ -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;
+8 -7
View File
@@ -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;
+5 -21
View File
@@ -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);
}
/****************************************************************************
+2 -3
View File
@@ -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);
+9 -9
View File
@@ -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);
+1 -1
View File
@@ -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;
+5 -6
View File
@@ -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,
+4 -4
View File
@@ -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);
/****************************************************************************
+2 -1
View File
@@ -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);