Patchwork PPC: Use interrupts for escc

login
register
mail settings
Submitter Alexander Graf
Date Dec. 18, 2009, 10:37 p.m.
Message ID <1261175847-16915-2-git-send-email-agraf@suse.de>
Download mbox | patch
Permalink /patch/41435/
State New
Headers show

Comments

Alexander Graf - Dec. 18, 2009, 10:37 p.m.
When using the escc with Linux, we need interrupts. So instead of creating
a dummy device, let's just map them to the openpic we have anyways.

This makes Linux on PPC64 with console=ttyPZ0 work.

Obviously, this change needs to be reflected in openbios. Patch for that
follows this one. Please update the binary then.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 hw/ppc_newworld.c |    6 +-----
 1 files changed, 1 insertions(+), 5 deletions(-)
Andreas Färber - Dec. 19, 2009, 9:58 p.m.
Am 18.12.2009 um 23:37 schrieb Alexander Graf:

> When using the escc with Linux, we need interrupts. So instead of  
> creating
> a dummy device, let's just map them to the openpic we have anyways.
>
> This makes Linux on PPC64 with console=ttyPZ0 work.

With these patches and OpenBIOS r646, booting 'install64' on the  
following Debian CDs worked for me:

debian-40r4a-powerpc-netinst.iso
debian-503-powerpc-netinst.iso

By default however you get the following error:

invalid/unsupported opcode: 1e - 12 - 1b (782106e4) 00000000014080e4 1
invalid/unsupported opcode: 00 - 00 - 00 (00000000) 0000000000008734 0

which translates to: qemu-system-ppc64 is using a 32-bit CPU by default.
'-cpu ppc64' (970FX according to OpenBIOS) worked, while '-cpu 970'  
was not recognized by OpenBIOS.

If you change only the CPU to 'ppc64', it will be rejected:
qemu: hardware error: Bus model not supported on OldWorld Mac machine

That's why Alex mentioned '-M mac99' elsewhere, I guess. Can't we  
change the defaults? I believe the G5 was the first 64-bit Mac and is  
considered New World, so Old World shouldn't even be selectable IMO.

`install64 console=ttyPZ0` only gets me to the penguin and appears to  
hang...
`install64` gets me through to the installer screen on Linux/amd64  
host. There are merely some FATALs visible while trying to load  
drivers for therm_* and windfarm_* devices ("No such device").

Andreas

> Obviously, this change needs to be reflected in openbios. Patch for  
> that
> follows this one. Please update the binary then.
>
> Signed-off-by: Alexander Graf <agraf@suse.de>
> ---
> hw/ppc_newworld.c |    6 +-----
> 1 files changed, 1 insertions(+), 5 deletions(-)
>
> diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c
> index b29a7bc..a09f096 100644
> --- a/hw/ppc_newworld.c
> +++ b/hw/ppc_newworld.c
> @@ -108,7 +108,6 @@ static void ppc_core99_init (ram_addr_t ram_size,
>     MacIONVRAMState *nvr;
>     int nvram_mem_index;
>     int vga_bios_size, bios_size;
> -    qemu_irq *dummy_irq;
>     int pic_mem_index, dbdma_mem_index, cuda_mem_index,  
> escc_mem_index;
>     int ppc_boot_device;
>     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
> @@ -318,10 +317,7 @@ static void ppc_core99_init (ram_addr_t ram_size,
>     /* init basic PC hardware */
>     pci_vga_init(pci_bus, vga_bios_offset, vga_bios_size);
>
> -    /* XXX: suppress that */
> -    dummy_irq = i8259_init(NULL);
> -
> -    escc_mem_index = escc_init(0x80013000, dummy_irq[4],  
> dummy_irq[5],
> +    escc_mem_index = escc_init(0x80013000, pic[0x25], pic[0x24],
>                                serial_hds[0], serial_hds[1],  
> ESCC_CLOCK, 4);
>
>     for(i = 0; i < nb_nics; i++)
> -- 
> 1.6.0.2
>
>
>
Alexander Graf - Dec. 19, 2009, 10:08 p.m.
Am 19.12.2009 um 22:58 schrieb Andreas Färber <andreas.faerber@web.de>:

> Am 18.12.2009 um 23:37 schrieb Alexander Graf:
>
>> When using the escc with Linux, we need interrupts. So instead of  
>> creating
>> a dummy device, let's just map them to the openpic we have anyways.
>>
>> This makes Linux on PPC64 with console=ttyPZ0 work.
>
> With these patches and OpenBIOS r646, booting 'install64' on the  
> following Debian CDs worked for me:
>
> debian-40r4a-powerpc-netinst.iso
> debian-503-powerpc-netinst.iso

Nice, interesting!

>
> By default however you get the following error:
>
> invalid/unsupported opcode: 1e - 12 - 1b (782106e4) 00000000014080e4 1
> invalid/unsupported opcode: 00 - 00 - 00 (00000000) 0000000000008734 0
>
> which translates to: qemu-system-ppc64 is using a 32-bit CPU by  
> default.
> '-cpu ppc64' (970FX according to OpenBIOS) worked, while '-cpu 970'  
> was not recognized by OpenBIOS.

Yes, I only test whatever I do with -cpu 970fx.

>
> If you change only the CPU to 'ppc64', it will be rejected:
> qemu: hardware error: Bus model not supported on OldWorld Mac machine
>
> That's why Alex mentioned '-M mac99' elsewhere, I guess. Can't we  
> change the defaults? I believe the G5 was the first 64-bit Mac and  
> is considered New World, so Old World shouldn't even be selectable  
> IMO.

I agree. Please send a patch, CC me and I'll ack it.

>
> `install64 console=ttyPZ0` only gets me to the penguin and appears  
> to hang...

Well, on older kernels this was console=ttyS0.

> `install64` gets me through to the installer screen on Linux/amd64  
> host. There are merely some FATALs visible while trying to load  
> drivers for therm_* and windfarm_* devices ("No such device").

Yesh, ADB shouldn't work either so you don't get input devices :-(.

Alex

>
> Andreas
>
>> Obviously, this change needs to be reflected in openbios. Patch for  
>> that
>> follows this one. Please update the binary then.
>>
>> Signed-off-by: Alexander Graf <agraf@suse.de>
>> ---
>> hw/ppc_newworld.c |    6 +-----
>> 1 files changed, 1 insertions(+), 5 deletions(-)
>>
>> diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c
>> index b29a7bc..a09f096 100644
>> --- a/hw/ppc_newworld.c
>> +++ b/hw/ppc_newworld.c
>> @@ -108,7 +108,6 @@ static void ppc_core99_init (ram_addr_t ram_size,
>>    MacIONVRAMState *nvr;
>>    int nvram_mem_index;
>>    int vga_bios_size, bios_size;
>> -    qemu_irq *dummy_irq;
>>    int pic_mem_index, dbdma_mem_index, cuda_mem_index,  
>> escc_mem_index;
>>    int ppc_boot_device;
>>    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
>> @@ -318,10 +317,7 @@ static void ppc_core99_init (ram_addr_t  
>> ram_size,
>>    /* init basic PC hardware */
>>    pci_vga_init(pci_bus, vga_bios_offset, vga_bios_size);
>>
>> -    /* XXX: suppress that */
>> -    dummy_irq = i8259_init(NULL);
>> -
>> -    escc_mem_index = escc_init(0x80013000, dummy_irq[4], dummy_irq 
>> [5],
>> +    escc_mem_index = escc_init(0x80013000, pic[0x25], pic[0x24],
>>                               serial_hds[0], serial_hds[1],  
>> ESCC_CLOCK, 4);
>>
>>    for(i = 0; i < nb_nics; i++)
>> -- 
>> 1.6.0.2
>>
>>
>>
>

Patch

diff --git a/hw/ppc_newworld.c b/hw/ppc_newworld.c
index b29a7bc..a09f096 100644
--- a/hw/ppc_newworld.c
+++ b/hw/ppc_newworld.c
@@ -108,7 +108,6 @@  static void ppc_core99_init (ram_addr_t ram_size,
     MacIONVRAMState *nvr;
     int nvram_mem_index;
     int vga_bios_size, bios_size;
-    qemu_irq *dummy_irq;
     int pic_mem_index, dbdma_mem_index, cuda_mem_index, escc_mem_index;
     int ppc_boot_device;
     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
@@ -318,10 +317,7 @@  static void ppc_core99_init (ram_addr_t ram_size,
     /* init basic PC hardware */
     pci_vga_init(pci_bus, vga_bios_offset, vga_bios_size);
 
-    /* XXX: suppress that */
-    dummy_irq = i8259_init(NULL);
-
-    escc_mem_index = escc_init(0x80013000, dummy_irq[4], dummy_irq[5],
+    escc_mem_index = escc_init(0x80013000, pic[0x25], pic[0x24],
                                serial_hds[0], serial_hds[1], ESCC_CLOCK, 4);
 
     for(i = 0; i < nb_nics; i++)