[OpenBIOS] [PATCH 5/5] ppc: fix up IDE device tree and control transfer
Cormac O'Brien
cormac at c-obrien.org
Thu Aug 20 22:45:17 CET 2015
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. 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);
+
+ 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);
+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 = ¤t->drives[i];
+ ob_ide_select_drive(drive);
+ ob_ide_software_reset(drive);
+ ob_ide_device_type_check(drive);
+ }
+ current = current->next;
+ }
+}
--
2.5.0
More information about the OpenBIOS
mailing list