On 12.12.2012, at 19:40, Scott Wood wrote: > On 12/12/2012 08:09:56 AM, Alexander Graf wrote: >> Today we're hardcoding the PCI interrupt map in the e500 machine file. >> Instead, let's write it dynamically so that different machine types >> can have different slot properties. >> Signed-off-by: Alexander Graf <ag...@suse.de> >> --- >> hw/ppc/e500.c | 51 +++++++++++++++++++++++++++++++-------------------- >> 1 files changed, 31 insertions(+), 20 deletions(-) >> diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c >> index 1034f93..ebb6d96 100644 >> --- a/hw/ppc/e500.c >> +++ b/hw/ppc/e500.c >> @@ -66,25 +66,33 @@ struct boot_info >> uint32_t entry; >> }; >> -static void pci_map_create(void *fdt, uint32_t *pci_map, uint32_t mpic) >> +static uint32_t *pci_map_create(void *fdt, uint32_t mpic, int first_slot, >> + int nr_slots, int *len) >> { >> - int i; >> - const uint32_t tmp[] = { >> - /* IDSEL 0x11 J17 Slot 1 */ >> - 0x8800, 0x0, 0x0, 0x1, mpic, 0x2, 0x1, >> - 0x8800, 0x0, 0x0, 0x2, mpic, 0x3, 0x1, >> - 0x8800, 0x0, 0x0, 0x3, mpic, 0x4, 0x1, >> - 0x8800, 0x0, 0x0, 0x4, mpic, 0x1, 0x1, >> - >> - /* IDSEL 0x12 J16 Slot 2 */ >> - 0x9000, 0x0, 0x0, 0x1, mpic, 0x3, 0x1, >> - 0x9000, 0x0, 0x0, 0x2, mpic, 0x4, 0x1, >> - 0x9000, 0x0, 0x0, 0x3, mpic, 0x2, 0x1, >> - 0x9000, 0x0, 0x0, 0x4, mpic, 0x1, 0x1, >> - }; >> - for (i = 0; i < (7 * 8); i++) { >> - pci_map[i] = cpu_to_be32(tmp[i]); >> + int i = 0; >> + int slot; >> + int pci_irq; >> + int last_slot = first_slot + nr_slots; >> + uint32_t *pci_map; >> + >> + *len = nr_slots * 4 * 7 * sizeof(uint32_t); >> + pci_map = g_malloc(*len); >> + >> + for (slot = first_slot; slot < last_slot; slot++) { >> + for (pci_irq = 0; pci_irq < 4; pci_irq++) { >> + pci_map[i++] = cpu_to_be32(slot << 11); >> + pci_map[i++] = cpu_to_be32(0x0); >> + pci_map[i++] = cpu_to_be32(0x0); >> + pci_map[i++] = cpu_to_be32(pci_irq + 1); >> + pci_map[i++] = cpu_to_be32(mpic); >> + pci_map[i++] = cpu_to_be32(((pci_irq + slot) % 4) + 1); >> + pci_map[i++] = cpu_to_be32(0x1); >> + } >> } > > It would be nice if the slot-to-IRQ calculation were done in only one place > rather than duplicated here.
Sure, what exactly would you suggest to do? :) We can move the whole function to ppce500_pci.c. We could export the function(slot, pci_irq) through the header of ppce500_pci.c. We could also try and traverse the pci bus to find the function that is actually called to convert irq numbers internally, so we potentially support other pci host controllers. Alex