j
: Next unread message k
: Previous unread message j a
: Jump to all threads
j l
: Jump to MailingList overview
Author: mcayland Date: Fri Oct 23 14:58:22 2015 New Revision: 1353 URL: http://tracker.coreboot.org/trac/openbios/changeset/1353
Log: ppc: add ob_ide_quiesce() and call it from the PPC CIF quiesce word
Add a new ob_ide_quiesce() function and hook it into QEMU PPC's ciface_quiesce() routine to properly prepare the drives for transferring control to the operating system.
Without this OS 9 becomes confused about the initial drive state on boot and refuses to correctly detect and initialise it.
Based upon an original patch by Cormac O'Brien cormac@c-obrien.org.
Signed-off-by: Mark Cave-Ayland mark.cave-ayland@ilande.co.uk
Modified: trunk/openbios-devel/arch/ppc/qemu/methods.c trunk/openbios-devel/drivers/ide.c trunk/openbios-devel/include/drivers/drivers.h
Modified: trunk/openbios-devel/arch/ppc/qemu/methods.c ============================================================================== --- trunk/openbios-devel/arch/ppc/qemu/methods.c Fri Oct 23 14:58:20 2015 (r1352) +++ trunk/openbios-devel/arch/ppc/qemu/methods.c Fri Oct 23 14:58:22 2015 (r1353) @@ -114,6 +114,8 @@ ciface_quiesce( unsigned long args[], unsigned long ret[] ) { usb_exit(); + + ob_ide_quiesce(); #if 0 unsigned long msr; /* This seems to be the correct thing to do - but I'm not sure */
Modified: trunk/openbios-devel/drivers/ide.c ============================================================================== --- trunk/openbios-devel/drivers/ide.c Fri Oct 23 14:58:20 2015 (r1352) +++ trunk/openbios-devel/drivers/ide.c Fri Oct 23 14:58:22 2015 (r1353) @@ -1488,6 +1488,28 @@ return 0; }
+void ob_ide_quiesce(void) +{ + struct ide_channel *channel; + int i; + + channel = channels; + while (channel) { + for (i = 0; i < 2; i++) { + struct ide_drive *drive = &channel->drives[i]; + + if (!drive->present) + continue; + + ob_ide_select_drive(drive); + ob_ide_software_reset(drive); + ob_ide_device_type_check(drive); + } + + channel = channel->next; + } +} + #if defined(CONFIG_DRIVER_MACIO) static unsigned char macio_ide_inb(struct ide_channel *chan, unsigned int port)
Modified: trunk/openbios-devel/include/drivers/drivers.h ============================================================================== --- trunk/openbios-devel/include/drivers/drivers.h Fri Oct 23 14:58:20 2015 (r1352) +++ trunk/openbios-devel/include/drivers/drivers.h Fri Oct 23 14:58:22 2015 (r1353) @@ -52,6 +52,7 @@ /* drivers/ide.c */ int ob_ide_init(const char *path, uint32_t io_port0, uint32_t ctl_port0, uint32_t io_port1, uint32_t ctl_port1); +void ob_ide_quiesce(void); int macio_ide_init(const char *path, uint32_t addr, int nb_channels); #endif #ifdef CONFIG_DRIVER_ESP