diff mbox series

[3/4] hw/pci-host/prep: Fix PCI swizzling in map_irq()

Message ID 20201012071906.3301481-4-f4bug@amsat.org
State New
Headers show
Series hw/pci-host/prep: Fix PCI swizzling in map_irq() | expand

Commit Message

Philippe Mathieu-Daudé Oct. 12, 2020, 7:19 a.m. UTC
In commit a01d8cadadf we changed the number of IRQs to 4 but
forgot to update the map_irq() function. Do it now.

Fixes: a01d8cadadf ("Fix memory corruption ... in PreP emulation")
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
Cc: Jocelyn Mayer <l_indien@magic.fr>
Cc: Julian Seward <julian@valgrind.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/pci-host/prep.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Mark Cave-Ayland Oct. 12, 2020, 9:37 a.m. UTC | #1
On 12/10/2020 08:19, Philippe Mathieu-Daudé wrote:

> In commit a01d8cadadf we changed the number of IRQs to 4 but
> forgot to update the map_irq() function. Do it now.
> 
> Fixes: a01d8cadadf ("Fix memory corruption ... in PreP emulation")
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> Cc: Jocelyn Mayer <l_indien@magic.fr>
> Cc: Julian Seward <julian@valgrind.org>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/pci-host/prep.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
> index 064593d1e52..2224135fedb 100644
> --- a/hw/pci-host/prep.c
> +++ b/hw/pci-host/prep.c
> @@ -195,7 +195,7 @@ static const MemoryRegionOps raven_io_ops = {
>  
>  static int raven_map_irq(PCIDevice *pci_dev, int irq_num)
>  {
> -    return (irq_num + (pci_dev->devfn >> 3)) & 1;
> +    return (irq_num + (pci_dev->devfn >> 3)) & 3;
>  }
>  
>  static void raven_set_irq(void *opaque, int irq_num, int level)

It feels like this should also have a corresponding change in OpenBIOS for
consistency, even though technically because of the OR on IRQ 15 it doesn't really
matter. The relevant part in OpenBIOS can be found here:
https://git.qemu.org/?p=openbios.git;a=blob;f=drivers/pci.c;h=34ae69a907b6312a3a7ab218afe8ba9efded1df7;hb=7f28286f5cb1ca682e3ba0a8706d8884f12bc49e#l2001
and in particular this section:

    /* Use the same "physical" routing as QEMU's raven_map_irq() although
       ultimately all 4 PCI interrupts are ORd to IRQ 15 as indicated
       by the PReP specification */
    props[(*ncells)++] = arch->irqs[((intno - 1) + (addr >> 11)) & 1];


ATB,

Mark.
Philippe Mathieu-Daudé Oct. 12, 2020, 11:01 a.m. UTC | #2
On 10/12/20 11:37 AM, Mark Cave-Ayland wrote:
> On 12/10/2020 08:19, Philippe Mathieu-Daudé wrote:
> 
>> In commit a01d8cadadf we changed the number of IRQs to 4 but
>> forgot to update the map_irq() function. Do it now.
>>
>> Fixes: a01d8cadadf ("Fix memory corruption ... in PreP emulation")
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>> Cc: Jocelyn Mayer <l_indien@magic.fr>
>> Cc: Julian Seward <julian@valgrind.org>
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>>   hw/pci-host/prep.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
>> index 064593d1e52..2224135fedb 100644
>> --- a/hw/pci-host/prep.c
>> +++ b/hw/pci-host/prep.c
>> @@ -195,7 +195,7 @@ static const MemoryRegionOps raven_io_ops = {
>>   
>>   static int raven_map_irq(PCIDevice *pci_dev, int irq_num)
>>   {
>> -    return (irq_num + (pci_dev->devfn >> 3)) & 1;
>> +    return (irq_num + (pci_dev->devfn >> 3)) & 3;
>>   }
>>   
>>   static void raven_set_irq(void *opaque, int irq_num, int level)
> 
> It feels like this should also have a corresponding change in OpenBIOS for
> consistency, even though technically because of the OR on IRQ 15 it doesn't really
> matter. The relevant part in OpenBIOS can be found here:
> https://git.qemu.org/?p=openbios.git;a=blob;f=drivers/pci.c;h=34ae69a907b6312a3a7ab218afe8ba9efded1df7;hb=7f28286f5cb1ca682e3ba0a8706d8884f12bc49e#l2001
> and in particular this section:
> 
>      /* Use the same "physical" routing as QEMU's raven_map_irq() although
>         ultimately all 4 PCI interrupts are ORd to IRQ 15 as indicated
>         by the PReP specification */
>      props[(*ncells)++] = arch->irqs[((intno - 1) + (addr >> 11)) & 1];

Done:
https://github.com/openbios/openbios/pull/7

> 
> 
> ATB,
> 
> Mark.
>
diff mbox series

Patch

diff --git a/hw/pci-host/prep.c b/hw/pci-host/prep.c
index 064593d1e52..2224135fedb 100644
--- a/hw/pci-host/prep.c
+++ b/hw/pci-host/prep.c
@@ -195,7 +195,7 @@  static const MemoryRegionOps raven_io_ops = {
 
 static int raven_map_irq(PCIDevice *pci_dev, int irq_num)
 {
-    return (irq_num + (pci_dev->devfn >> 3)) & 1;
+    return (irq_num + (pci_dev->devfn >> 3)) & 3;
 }
 
 static void raven_set_irq(void *opaque, int irq_num, int level)