qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [Qemu-ppc] [PATCH 3/5] PPC: E500: Generate dt pci irq m


From: Alexander Graf
Subject: Re: [Qemu-devel] [Qemu-ppc] [PATCH 3/5] PPC: E500: Generate dt pci irq map dynamically
Date: Thu, 13 Dec 2012 00:38:32 +0100

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 <address@hidden>
>> ---
>> 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]