[OpenBIOS] [PATCH 5/5] ppc: fix up IDE device tree and control transfer

Alexander Graf agraf at suse.de
Wed Aug 26 08:49:08 CET 2015



On 21.08.15 00:45, Cormac O'Brien wrote:
> Mac OS 9 is finicky about devices having the correct properties, so we change
> some IDE data to more closely model a real New World Mac.

Please split this into 2 separate patches.

> We also add
> ide_exit() to ciface_quiesce() to properly prepare the drives for transferring
> control to the operating system.
> 
> Signed-off-by: Cormac O'Brien <cormac at c-obrien.org>
> ---
>  arch/ppc/qemu/methods.c |  2 ++
>  drivers/ide.c           | 34 ++++++++++++++++++++++++++++++----
>  2 files changed, 32 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/ppc/qemu/methods.c b/arch/ppc/qemu/methods.c
> index cb72bc1..adf3ea2 100644
> --- a/arch/ppc/qemu/methods.c
> +++ b/arch/ppc/qemu/methods.c
> @@ -109,11 +109,13 @@ NODE_METHODS( tty ) = {
>  
>  DECLARE_NODE( ciface, 0, 0, "+/openprom/client-services" );
>  
> +extern void ide_exit(void);
>  /* ( -- ) */
>  static void
>  ciface_quiesce( unsigned long args[], unsigned long ret[] )
>  {
>  	usb_exit();
> +	ide_exit();
>  #if 0
>  	unsigned long msr;
>  	/* This seems to be the correct thing to do - but I'm not sure */
> diff --git a/drivers/ide.c b/drivers/ide.c
> index 327c64a..8ef34cb 100644
> --- a/drivers/ide.c
> +++ b/drivers/ide.c
> @@ -1581,6 +1581,12 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels)
>  		set_property(dnode, "compatible", (is_oldworld() ?
>  			     "heathrow-ata" : "keylargo-ata"), 13);
>  
> +		set_property(dnode, "model", ((current_channel == 3) ?
> +			     "ata-3" : "ata-4"), strlen("ata-*") + 1);

As Segher mentioned somewhere else, please introduce a helper for string
properties.

> +
> +		set_property(dnode, "AAPL,connector", "ata",
> +                             strlen("ata") + 1);
> +
>  		props[0] = 0x00000526;
>  		props[1] = 0x00000085;
>  		props[2] = 0x00000025;
> @@ -1589,8 +1595,8 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels)
>  		props[5] = 0x00000000;
>  		props[6] = 0x00000000;
>  		props[7] = 0x00000000;
> -		OLDWORLD(set_property(dnode, "AAPL,pio-timing",
> -				      (char *)&props, 8*sizeof(props[0])));
> +		set_property(dnode, "AAPL,pio-timing",
> +				      (char *)&props, 8*sizeof(props[0]));
>  
>  		/* The first interrupt entry is the ide interrupt, the second
>  		   the dbdma interrupt */
> @@ -1634,8 +1640,8 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels)
>  				      (char *)&props, 2*sizeof(props[0])));
>  
>  		props[0] = 0;
> -		OLDWORLD(set_property(dnode, "AAPL,bus-id", (char*)props,
> -			 1 * sizeof(props[0])));
> +		set_property(dnode, "AAPL,bus-id", (char*)props,
> +			 1 * sizeof(props[0]));
>  		IDE_DPRINTF(DEV_NAME": [io ports 0x%lx]\n",
>  		            current_channel, chan->mmio);
>  
> @@ -1683,3 +1689,23 @@ int macio_ide_init(const char *path, uint32_t addr, int nb_channels)
>  	return 0;
>  }
>  #endif /* CONFIG_DRIVER_MACIO */
> +
> +void ide_exit(void);

This should go into a header file.


Alex

> +void ide_exit(void)
> +{
> +	struct ide_channel *current;
> +
> +	current = channels;
> +	while (current) {
> +		struct ide_drive *drive;
> +		int i;
> +
> +		for (i = 0; i < 2; i++) {
> +			drive = &current->drives[i];
> +			ob_ide_select_drive(drive);
> +			ob_ide_software_reset(drive);
> +			ob_ide_device_type_check(drive);
> +		}
> +		current = current->next;
> +	}
> +}
> 



More information about the OpenBIOS mailing list