Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pci alloc msi irq support new interface #13709

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions arch/arm/src/armv7-a/arm_gicv2m.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,23 +102,24 @@ 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;
int irq;
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)
Expand All @@ -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;
Expand Down
15 changes: 8 additions & 7 deletions arch/arm64/src/common/arm64_gicv2m.c
Original file line number Diff line number Diff line change
Expand Up @@ -117,26 +117,27 @@ 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;
int irq;
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;

Expand All @@ -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;
Expand Down
26 changes: 5 additions & 21 deletions arch/x86_64/src/common/x86_64_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -344,34 +344,18 @@ 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,
* <0: A negative value errno
*
****************************************************************************/

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

/****************************************************************************
Expand Down
5 changes: 2 additions & 3 deletions arch/x86_64/src/intel64/intel64_hpet.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
18 changes: 9 additions & 9 deletions arch/x86_64/src/intel64/intel64_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -648,20 +648,20 @@ 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;
int i = 0;

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

Expand All @@ -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;
}

/****************************************************************************
Expand Down Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion drivers/pci/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
11 changes: 5 additions & 6 deletions drivers/pci/pci_ecam.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand Down
8 changes: 4 additions & 4 deletions include/nuttx/arch.h
Original file line number Diff line number Diff line change
Expand Up @@ -3074,7 +3074,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
*
Expand All @@ -3084,7 +3085,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
Expand All @@ -3111,7 +3112,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
Expand All @@ -3122,7 +3122,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);

/****************************************************************************
Expand Down
3 changes: 2 additions & 1 deletion include/nuttx/pci/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Loading