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 */