[OpenBIOS] r431 - in openbios-devel: drivers include/openbios

svn at openbios.org svn at openbios.org
Fri Jan 30 08:44:48 CET 2009


Author: laurent
Date: 2009-01-30 08:44:48 +0100 (Fri, 30 Jan 2009)
New Revision: 431

Modified:
   openbios-devel/drivers/ide.c
   openbios-devel/drivers/macio.c
   openbios-devel/include/openbios/drivers.h
Log:
Add mac-io IDE driver

Modified: openbios-devel/drivers/ide.c
===================================================================
--- openbios-devel/drivers/ide.c	2009-01-29 19:56:41 UTC (rev 430)
+++ openbios-devel/drivers/ide.c	2009-01-30 07:44:48 UTC (rev 431)
@@ -1294,30 +1294,14 @@
 static void
 ob_ide_ctrl_initialize(int *idx)
 {
-	int len, props[6];
 	phandle_t ph=get_cur_dev();
-	char *idename;
-	struct ide_channel *chan;
 
 	/* set device type */
 	push_str(DEV_TYPE);
 	fword("device-type");
 
-	idename=get_property(ph, "name", &len);
-	chan = ide_seek_channel(idename);
-
-	/* Create interrupt properties. */
-	props[0]=14; props[1]=0;
-	set_property(ph, "interrupts", (char *)&props, 2*sizeof(int));
-
 	set_int_property(ph, "#address-cells", 1);
 	set_int_property(ph, "#size-cells", 0);
-
-	props[0] = __cpu_to_be32(chan->io_regs[0]);
-	props[1] = __cpu_to_be32(1); props[2] = __cpu_to_be32(8);
-	props[3] = __cpu_to_be32(chan->io_regs[8]);
-	props[4] = __cpu_to_be32(1); props[5] = __cpu_to_be32(2);
-	set_property(ph, "reg", (char *)&props, 6*sizeof(int));
 }
 
 static void
@@ -1378,6 +1362,7 @@
 	struct ide_channel *chan;
 	int io_ports[IDE_MAX_CHANNELS];
 	int ctl_ports[IDE_MAX_CHANNELS];
+	cell props[6];
 
 	io_ports[0] = io_port0;
 	ctl_ports[0] = ctl_port0 + 2;
@@ -1433,6 +1418,19 @@
                 snprintf(nodebuff, sizeof(nodebuff), "%s/" DEV_NAME, path,
                          current_channel);
 		REGISTER_NAMED_NODE(ob_ide_ctrl, nodebuff);
+
+		dnode = find_dev(nodebuff);
+
+		props[0]=14; props[1]=0;
+		set_property(dnode, "interrupts",
+			     (char *)&props, 2*sizeof(cell));
+
+		props[0] = __cpu_to_be32(chan->io_regs[0]);
+		props[1] = __cpu_to_be32(1); props[2] = __cpu_to_be32(8);
+		props[3] = __cpu_to_be32(chan->io_regs[8]);
+		props[4] = __cpu_to_be32(1); props[5] = __cpu_to_be32(2);
+		set_property(dnode, "reg", (char *)&props, 6*sizeof(cell));
+
 #ifdef CONFIG_DEBUG_IDE
 		printk(DEV_NAME": [io ports 0x%x-0x%x,0x%x]\n",
 		       current_channel, chan->io_regs[0],
@@ -1486,3 +1484,177 @@
 
 	return 0;
 }
+
+#if defined(CONFIG_DRIVER_MACIO)
+static unsigned char
+macio_ide_inb(struct ide_channel *chan, unsigned int port)
+{
+	return in_8((unsigned char*)(chan->mmio + (port << 4)));
+}
+
+static void
+macio_ide_outb(struct ide_channel *chan, unsigned char data, unsigned int port)
+{
+	out_8((unsigned char*)(chan->mmio + (port << 4)), data);
+}
+
+static void
+macio_ide_insw(struct ide_channel *chan,
+	       unsigned int port, unsigned char *addr, unsigned int count)
+{
+	_insw((uint16_t*)(chan->mmio + (port << 4)), addr, count);
+}
+
+static void
+macio_ide_outsw(struct ide_channel *chan,
+		unsigned int port, unsigned char *addr, unsigned int count)
+{
+	_outsw((uint16_t*)(chan->mmio + (port << 4)), addr, count);
+}
+
+#define MACIO_IDE_OFFSET	0x00020000
+#define MACIO_IDE_SIZE		0x00001000
+
+int macio_ide_init(const char *path, uint32_t addr, int nb_channels)
+{
+	int i, j;
+	char nodebuff[128];
+	phandle_t dnode;
+	cell props[8];
+	struct ide_channel *chan;
+
+	for (i = 0; i < nb_channels; i++, current_channel++) {
+
+		chan = malloc(sizeof(struct ide_channel));
+
+		snprintf(chan->name, sizeof(chan->name),
+			 DEV_NAME, current_channel);
+
+		chan->mmio = addr + MACIO_IDE_OFFSET + i * MACIO_IDE_SIZE;
+
+		chan->obide_inb = macio_ide_inb;
+		chan->obide_insw = macio_ide_insw;
+		chan->obide_outb = macio_ide_outb;
+		chan->obide_outsw = macio_ide_outsw;
+
+		chan->selected = -1;
+
+		/*
+		 * assume it's there, if not io port dead check will clear
+		 */
+		chan->present = 1;
+
+		for (j = 0; j < 2; j++) {
+			chan->drives[j].present = 0;
+			chan->drives[j].unit = j;
+			chan->drives[j].channel = chan;
+			/* init with a decent value */
+			chan->drives[j].bs = 512;
+
+			chan->drives[j].nr = i * 2 + j;
+		}
+
+		ob_ide_probe(chan);
+
+		if (!chan->present) {
+			free(chan);
+			continue;
+		}
+
+		ide_add_channel(chan);
+
+		ob_ide_identify_drives(chan);
+
+                snprintf(nodebuff, sizeof(nodebuff), "%s/" DEV_NAME, path,
+                         current_channel);
+		REGISTER_NAMED_NODE(ob_ide_ctrl, nodebuff);
+
+		dnode = find_dev(nodebuff);
+
+		set_property(dnode, "compatible", "heathrow-ata", 13);
+
+		props[0] = 0x00000526;
+		props[1] = 0x00000085;
+		props[2] = 0x00000025;
+		props[3] = 0x00000025;
+		props[4] = 0x00000025;
+		props[5] = 0x00000000;
+		props[6] = 0x00000000;
+		props[7] = 0x00000000;
+		OLDWORLD(set_property(dnode, "AAPL,pio-timing",
+				      (char *)&props, 8*sizeof(cell)));
+
+		props[0] = 0x0000000d;
+		props[1] = 0x00000000;
+		set_property(dnode, "interrupts",
+			     (char *)&props, 2*sizeof(cell));
+		OLDWORLD(set_property(dnode, "AAPL,interrupts",
+				      (char *)&props, 2*sizeof(cell)));
+
+		props[0] = MACIO_IDE_OFFSET + i * MACIO_IDE_SIZE;
+		props[1] = MACIO_IDE_SIZE;
+		props[2] = 0x00008b00 + i * 0x0200;
+		props[3] = 0x0200;
+		set_property(dnode, "reg", (char *)&props, 4*sizeof(cell));
+
+		props[0] = addr + MACIO_IDE_OFFSET  + i * MACIO_IDE_SIZE;
+		props[1] = addr + 0x00008b00 + i * 0x0200;
+		OLDWORLD(set_property(dnode, "AAPL,address",
+				      (char *)&props, 2*sizeof(cell)));
+
+		props[0] = 0;
+		OLDWORLD(set_property(dnode, "AAPL,bus-id", (char*)props,
+			 1 * sizeof(cell)));
+#ifdef CONFIG_DEBUG_IDE
+		printk(DEV_NAME": [io ports 0x%lx]\n",
+		       current_channel, chan->mmio);
+#endif
+
+		for (j = 0; j < 2; j++) {
+			struct ide_drive *drive = &chan->drives[j];
+                        const char *media = "UNKNOWN";
+
+			if (!drive->present)
+				continue;
+
+#ifdef CONFIG_DEBUG_IDE
+			printk("    drive%d [ATA%s ", j,
+			       drive->type == ide_type_atapi ? "PI" : "");
+#endif
+			switch (drive->media) {
+				case ide_media_floppy:
+					media = "floppy";
+					break;
+				case ide_media_cdrom:
+					media = "cdrom";
+					break;
+				case ide_media_optical:
+					media = "mo";
+					break;
+				case ide_media_disk:
+					media = "disk";
+					break;
+			}
+#ifdef CONFIG_DEBUG_IDE
+			printk("%s]: %s\n", media, drive->model);
+#endif
+                        snprintf(nodebuff, sizeof(nodebuff),
+                                 "%s/" DEV_NAME "/%s", path, current_channel,
+                                 media);
+			REGISTER_NAMED_NODE(ob_ide, nodebuff);
+			dnode = find_dev(nodebuff);
+			set_int_property(dnode, "reg", j);
+
+			/* create aliases */
+
+			set_ide_alias(nodebuff);
+			if (drive->media == ide_media_cdrom)
+				set_cd_alias(nodebuff);
+			if (drive->media == ide_media_disk)
+				set_hd_alias(nodebuff);
+		}
+	}
+
+	return 0;
+}
+#endif /* CONFIG_DRIVER_MACIO */

Modified: openbios-devel/drivers/macio.c
===================================================================
--- openbios-devel/drivers/macio.c	2009-01-29 19:56:41 UTC (rev 430)
+++ openbios-devel/drivers/macio.c	2009-01-30 07:44:48 UTC (rev 431)
@@ -14,6 +14,7 @@
 #include "libc/byteorder.h"
 #include "libc/vsprintf.h"
 
+#include "openbios/drivers.h"
 #include "macio.h"
 #include "cuda.h"
 #include "escc.h"
@@ -112,4 +113,5 @@
 	cuda_init(path, addr);
 	macio_nvram_init(path, addr);
         escc_init(path, addr);
+	macio_ide_init(path, addr, 1);
 }

Modified: openbios-devel/include/openbios/drivers.h
===================================================================
--- openbios-devel/include/openbios/drivers.h	2009-01-29 19:56:41 UTC (rev 430)
+++ openbios-devel/include/openbios/drivers.h	2009-01-30 07:44:48 UTC (rev 431)
@@ -47,6 +47,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);
+int macio_ide_init(const char *path, uint32_t addr, int nb_channels);
 #endif
 #ifdef CONFIG_DRIVER_ESP
 /* drivers/esp.c */




More information about the OpenBIOS mailing list