mirror of
https://github.com/apache/nuttx.git
synced 2026-08-15 01:13:29 +00:00
pci alloc mis irq support new interface
Signed-off-by: yezhonghui <yezhonghui@xiaomi.com>
This commit is contained in:
parent
edd7d718eb
commit
85591fc360
9 changed files with 42 additions and 57 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
/****************************************************************************
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue