pci alloc mis irq support new interface

Signed-off-by: yezhonghui <yezhonghui@xiaomi.com>
This commit is contained in:
yezhonghui 2024-08-21 19:59:23 +08:00 committed by Xiang Xiao
parent edd7d718eb
commit 85591fc360
9 changed files with 42 additions and 57 deletions

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;

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;

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);
}
/****************************************************************************

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);

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);

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;

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,

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);
/****************************************************************************

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);