[OpenBIOS] [commit] r1350 - trunk/openbios-devel/drivers
repository service
svn at openbios.org
Fri Oct 23 14:58:16 CEST 2015
Author: mcayland
Date: Fri Oct 23 14:58:16 2015
New Revision: 1350
URL: http://tracker.coreboot.org/trac/openbios/changeset/1350
Log:
ppc: add ESCC legacy support
Mac OS 9 requires that the host provide escc-legacy serial ports, so we add
them here to get further in the boot process.
Signed-off-by: Cormac O'Brien <cormac at c-obrien.org>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
Modified:
trunk/openbios-devel/drivers/escc.c
trunk/openbios-devel/drivers/escc.h
trunk/openbios-devel/drivers/pci.c
Modified: trunk/openbios-devel/drivers/escc.c
==============================================================================
--- trunk/openbios-devel/drivers/escc.c Fri Oct 23 14:58:13 2015 (r1349)
+++ trunk/openbios-devel/drivers/escc.c Fri Oct 23 14:58:16 2015 (r1350)
@@ -380,12 +380,22 @@
static void
escc_add_channel(const char *path, const char *node, phys_addr_t addr,
- uint32_t offset)
+ int esnum)
{
char buf[64], tty[32];
phandle_t dnode, aliases;
- int len;
- cell props[2];
+
+ cell props[10];
+ int offset;
+ int legacy;
+
+ switch (esnum) {
+ case 2: offset = 1; legacy = 0; break;
+ case 3: offset = 0; legacy = 0; break;
+ case 4: offset = 1; legacy = 1; break;
+ case 5: offset = 0; legacy = 1; break;
+ default: return;
+ }
/* add device */
@@ -411,16 +421,28 @@
set_property(dnode, "device_type", "serial",
strlen("serial") + 1);
- snprintf(buf, sizeof(buf), "ch-%s", node);
- len = strlen(buf) + 1;
- snprintf(buf + len, sizeof(buf) - len, "CHRP,es2");
- set_property(dnode, "compatible", buf, len + 9);
-
- props[0] = IO_ESCC_OFFSET + offset * 0x20;
- props[1] = 0x00000020;
- set_property(dnode, "reg", (char *)&props, 2 * sizeof(cell));
+ snprintf(buf, sizeof(buf), "chrp,es%d", esnum);
+ set_property(dnode, "compatible", buf, 9);
- props[0] = addr + IO_ESCC_OFFSET + offset * 0x20;
+ if (legacy) {
+ props[0] = IO_ESCC_LEGACY_OFFSET + offset * 0x4;
+ props[1] = 0x00000001;
+ props[2] = IO_ESCC_LEGACY_OFFSET + offset * 0x4 + 2;
+ props[3] = 0x00000001;
+ props[4] = IO_ESCC_LEGACY_OFFSET + offset * 0x4 + 6;
+ props[5] = 0x00000001;
+ set_property(dnode, "reg", (char *)&props, 6 * sizeof(cell));
+ } else {
+ props[0] = IO_ESCC_OFFSET + offset * 0x20;
+ props[1] = 0x00000020;
+ set_property(dnode, "reg", (char *)&props, 2 * sizeof(cell));
+ }
+
+ if (legacy) {
+ props[0] = addr + IO_ESCC_LEGACY_OFFSET + offset * 0x4;
+ } else {
+ props[0] = addr + IO_ESCC_OFFSET + offset * 0x20;
+ }
OLDWORLD(set_property(dnode, "AAPL,address",
(char *)&props, 1 * sizeof(cell)));
@@ -430,13 +452,21 @@
props[0] = (0x24) + offset;
props[1] = 0;
+ props[2] = 0;
NEWWORLD(set_property(dnode, "interrupts",
- (char *)&props, 2 * sizeof(cell)));
+ (char *)&props, 3 * sizeof(cell)));
device_end();
- uart_init_line((unsigned char*)addr + IO_ESCC_OFFSET + offset * 0x20,
- CONFIG_SERIAL_SPEED);
+ if (legacy) {
+ uart_init_line(
+ (unsigned char*)addr + IO_ESCC_LEGACY_OFFSET + offset * 0x4,
+ CONFIG_SERIAL_SPEED);
+ } else {
+ uart_init_line(
+ (unsigned char*)addr + IO_ESCC_OFFSET + offset * 0x20,
+ CONFIG_SERIAL_SPEED);
+ }
}
void
@@ -467,10 +497,34 @@
fword("finish-device");
- escc_add_channel(buf, "a", addr, 1);
- escc_add_channel(buf, "b", addr, 0);
+ escc_add_channel(buf, "a", addr, 2);
+ escc_add_channel(buf, "b", addr, 3);
escc_serial_dev = (unsigned char *)addr + IO_ESCC_OFFSET +
(CONFIG_SERIAL_PORT ? 0 : 0x20);
+
+ push_str(path);
+ fword("find-device");
+ fword("new-device");
+
+ push_str("escc-legacy");
+ fword("device-name");
+
+ snprintf(buf, sizeof(buf), "%s/escc-legacy", path);
+
+ dnode = find_dev(buf);
+
+ set_int_property(dnode, "#address-cells", 1);
+ props[0] = __cpu_to_be32(IO_ESCC_LEGACY_OFFSET);
+ props[1] = __cpu_to_be32(IO_ESCC_LEGACY_SIZE);
+ set_property(dnode, "reg", (char *)&props, sizeof(props));
+ set_property(dnode, "device_type", "escc-legacy",
+ strlen("escc-legacy") + 1);
+ set_property(dnode, "compatible", "chrp,es1", 9);
+
+ fword("finish-device");
+
+ escc_add_channel(buf, "a", addr, 4);
+ escc_add_channel(buf, "b", addr, 5);
}
#endif
Modified: trunk/openbios-devel/drivers/escc.h
==============================================================================
--- trunk/openbios-devel/drivers/escc.h Fri Oct 23 14:58:13 2015 (r1349)
+++ trunk/openbios-devel/drivers/escc.h Fri Oct 23 14:58:16 2015 (r1350)
@@ -1,6 +1,8 @@
#define IO_ESCC_SIZE 0x00001000
#define IO_ESCC_OFFSET 0x00013000
+#define IO_ESCC_LEGACY_SIZE 0x00001000
+#define IO_ESCC_LEGACY_OFFSET 0x00012000
#define ZS_REGS 8
Modified: trunk/openbios-devel/drivers/pci.c
==============================================================================
--- trunk/openbios-devel/drivers/pci.c Fri Oct 23 14:58:13 2015 (r1349)
+++ trunk/openbios-devel/drivers/pci.c Fri Oct 23 14:58:16 2015 (r1350)
@@ -1420,6 +1420,12 @@
target_node = find_dev("/pci/mac-io/escc/ch-b");
set_int_property(target_node, "interrupt-parent", dnode);
+ target_node = find_dev("/pci/mac-io/escc-legacy/ch-a");
+ set_int_property(target_node, "interrupt-parent", dnode);
+
+ target_node = find_dev("/pci/mac-io/escc-legacy/ch-b");
+ set_int_property(target_node, "interrupt-parent", dnode);
+
/* QEMU only emulates 2 of the 3 ata buses currently */
/* On a new world Mac these are not numbered but named by the
* ATA version they support. Thus we have: ata-3, ata-3, ata-4
More information about the OpenBIOS
mailing list