Author: blueswirl
Date: 2009-02-08 13:22:04 +0100 (Sun, 08 Feb 2009)
New Revision: 449
Modified:
openbios-devel/arch/ppc/qemu/init.c
openbios-devel/arch/ppc/qemu/ldscript
openbios-devel/drivers/macio.c
openbios-devel/drivers/macio.h
openbios-devel/drivers/pci.c
openbios-devel/drivers/pci_database.c
openbios-devel/drivers/pci_database.h
Log:
Add basic Mac99 machine support
Modified: openbios-devel/arch/ppc/qemu/init.c
===================================================================
--- openbios-devel/arch/ppc/qemu/init.c 2009-02-05 21:37:26 UTC (rev 448)
+++ openbios-devel/arch/ppc/qemu/init.c 2009-02-08 12:22:04 UTC (rev 449)
@@ -462,12 +462,12 @@
/* model */
- push_str("PowerMac1,1");
+ push_str("PowerMac2,1");
fword("model");
/* compatible */
- push_str("PowerMac1,1");
+ push_str("PowerMac2,1");
fword("encode-string");
push_str("MacRISC");
fword("encode-string");
Modified: openbios-devel/arch/ppc/qemu/ldscript
===================================================================
--- openbios-devel/arch/ppc/qemu/ldscript 2009-02-05 21:37:26 UTC (rev 448)
+++ openbios-devel/arch/ppc/qemu/ldscript 2009-02-08 12:22:04 UTC (rev 449)
@@ -7,7 +7,7 @@
/* As NVRAM is at 0xfff04000, the .text needs to be after that
*/
-TEXT_ADDR = 0xfff06000;
+TEXT_ADDR = 0xfff08000;
/* Hard reset vector address
*/
Modified: openbios-devel/drivers/macio.c
===================================================================
--- openbios-devel/drivers/macio.c 2009-02-05 21:37:26 UTC (rev 448)
+++ openbios-devel/drivers/macio.c 2009-02-08 12:22:04 UTC (rev 449)
@@ -19,15 +19,26 @@
#include "cuda.h"
#include "escc.h"
-#define IO_NVRAM_SIZE 0x00020000
-#define IO_NVRAM_OFFSET 0x00060000
+#define OW_IO_NVRAM_SIZE 0x00020000
+#define OW_IO_NVRAM_OFFSET 0x00060000
+#define OW_IO_NVRAM_SHIFT 4
+#define NW_IO_NVRAM_SIZE 0x00004000
+#define NW_IO_NVRAM_OFFSET 0xfff04000
+#define NW_IO_NVRAM_SHIFT 1
+
+#define IO_OPENPIC_SIZE 0x00040000
+#define IO_OPENPIC_OFFSET 0x00040000
+
static char *nvram;
int
arch_nvram_size( void )
{
- return IO_NVRAM_SIZE>>4;
+ if (is_oldworld())
+ return OW_IO_NVRAM_SIZE >> OW_IO_NVRAM_SHIFT;
+ else
+ return NW_IO_NVRAM_SIZE >> NW_IO_NVRAM_SHIFT;
}
void macio_nvram_init(const char *path, uint32_t addr)
@@ -36,14 +47,28 @@
phandle_t dnode;
int props[2];
char buf[64];
+ unsigned long nvram_size, nvram_offset;
- nvram = (char*)addr + IO_NVRAM_OFFSET;
+ if (is_oldworld()) {
+ nvram_offset = OW_IO_NVRAM_OFFSET;
+ nvram_size = OW_IO_NVRAM_SIZE;
+ } else {
+ nvram_offset = NW_IO_NVRAM_OFFSET;
+ nvram_size = NW_IO_NVRAM_SIZE;
+ push_str("/");
+ fword("find-device");
+ fword("new-device");
+ push_str("nvram");
+ fword("device-name");
+ fword("finish-device");
+ }
+ nvram = (char*)addr + nvram_offset;
snprintf(buf, sizeof(buf), "%s/nvram", path);
nvram_init(buf);
dnode = find_dev(buf);
set_int_property(dnode, "#bytes", arch_nvram_size() );
- props[0] = __cpu_to_be32(IO_NVRAM_OFFSET);
- props[1] = __cpu_to_be32(IO_NVRAM_SIZE);
+ props[0] = __cpu_to_be32(nvram_offset);
+ props[1] = __cpu_to_be32(nvram_size);
set_property(dnode, "reg", (char *)&props, sizeof(props));
set_property(dnode, "device_type", "nvram", 6);
@@ -81,8 +106,15 @@
arch_nvram_put( char *buf )
{
int i;
+ unsigned int it_shift;
+
+ if (is_oldworld())
+ it_shift = OW_IO_NVRAM_SHIFT;
+ else
+ it_shift = NW_IO_NVRAM_SHIFT;
+
for (i=0; i< arch_nvram_size() ; i++)
- nvram[i<<4]=buf[i];
+ nvram[i << it_shift] = buf[i];
#ifdef DUMP_NVRAM
printk("new nvram:\n");
dump_nvram();
@@ -93,8 +125,15 @@
arch_nvram_get( char *buf )
{
int i;
+ unsigned int it_shift;
+
+ if (is_oldworld())
+ it_shift = OW_IO_NVRAM_SHIFT;
+ else
+ it_shift = NW_IO_NVRAM_SHIFT;
+
for (i=0; i< arch_nvram_size(); i++)
- buf[i]=nvram[i<<4];
+ buf[i] = nvram[i << it_shift];
#ifdef DUMP_NVRAM
printk("current nvram:\n");
@@ -102,8 +141,36 @@
#endif
}
+static void
+openpic_init(const char *path, uint32_t addr)
+{
+ phandle_t dnode;
+ int props[2];
+ char buf[128];
+
+ push_str(path);
+ fword("find-device");
+ fword("new-device");
+ push_str("interrupt-controller");
+ fword("device-name");
+ fword("finish-device");
+
+ snprintf(buf, sizeof(buf), "%s/interrupt-controller", path);
+ dnode = find_dev(buf);
+ set_property(dnode, "device_type", "open-pic", 9);
+ set_property(dnode, "compatible", "chrp,open-pic", 14);
+ set_property(dnode, "built-in", "", 0);
+ props[0] = __cpu_to_be32(IO_OPENPIC_OFFSET);
+ props[1] = __cpu_to_be32(IO_OPENPIC_SIZE);
+ set_property(dnode, "reg", (char *)&props, sizeof(props));
+ set_int_property(dnode, "#interrupt-cells", 2);
+ set_int_property(dnode, "#address-cells", 0);
+ set_property(dnode, "interrupt-controller", "", 0);
+ set_int_property(dnode, "clock-frequency", 4166666);
+}
+
void
-ob_macio_init(const char *path, uint32_t addr)
+ob_macio_heathrow_init(const char *path, uint32_t addr)
{
phandle_t aliases;
@@ -115,3 +182,19 @@
escc_init(path, addr);
macio_ide_init(path, addr, 1);
}
+
+void
+ob_macio_keylargo_init(const char *path, uint32_t addr)
+{
+ phandle_t aliases;
+
+ aliases = find_dev("/aliases");
+ set_property(aliases, "mac-io", path, strlen(path) + 1);
+
+ cuda_init(path, addr);
+ /* The NewWorld NVRAM is not located in the MacIO device */
+ macio_nvram_init("", 0);
+ escc_init(path, addr);
+ macio_ide_init(path, addr, 3);
+ openpic_init(path, addr);
+}
Modified: openbios-devel/drivers/macio.h
===================================================================
--- openbios-devel/drivers/macio.h 2009-02-05 21:37:26 UTC (rev 448)
+++ openbios-devel/drivers/macio.h 2009-02-08 12:22:04 UTC (rev 449)
@@ -1,4 +1,5 @@
extern phandle_t pic_handle;
-void ob_macio_init(const char *path, uint32_t addr);
+void ob_macio_heathrow_init(const char *path, uint32_t addr);
+void ob_macio_keylargo_init(const char *path, uint32_t addr);
void macio_nvram_init(const char *path, uint32_t addr);
Modified: openbios-devel/drivers/pci.c
===================================================================
--- openbios-devel/drivers/pci.c 2009-02-05 21:37:26 UTC (rev 448)
+++ openbios-devel/drivers/pci.c 2009-02-08 12:22:04 UTC (rev 449)
@@ -419,16 +419,26 @@
set_property(dev, "ranges", (char *)props, ncells * sizeof(cell));
}
-int macio_config_cb (const pci_config_t *config)
+int macio_heathrow_config_cb (const pci_config_t *config)
{
pci_set_ranges(config);
#ifdef CONFIG_DRIVER_MACIO
- ob_macio_init(config->path, config->assigned[0] & ~0x0000000F);
+ ob_macio_heathrow_init(config->path, config->assigned[0] & ~0x0000000F);
#endif
return 0;
}
+int macio_keylargo_config_cb (const pci_config_t *config)
+{
+ pci_set_ranges(config);
+
+#ifdef CONFIG_DRIVER_MACIO
+ ob_macio_keylargo_init(config->path, config->assigned[0] & ~0x0000000F);
+#endif
+ return 0;
+}
+
int vga_config_cb (const pci_config_t *config)
{
if (config->assigned[0] != 0x00000000)
Modified: openbios-devel/drivers/pci_database.c
===================================================================
--- openbios-devel/drivers/pci_database.c 2009-02-05 21:37:26 UTC (rev 448)
+++ openbios-devel/drivers/pci_database.c 2009-02-08 12:22:04 UTC (rev 449)
@@ -289,7 +289,7 @@
PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_PCI, NULL,
"pci", "AAPL,UniNorth", "uni-north\0",
3, 2, 1,
- NULL, NULL
+ host_config_cb, NULL,
},
{
PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_I_PCI, NULL,
@@ -1071,21 +1071,21 @@
PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_343S1201,
"mac-io", "mac-io", "AAPL,343S1201", "heathrow\0",
1, 1, 1,
- &macio_config_cb, NULL,
+ &macio_heathrow_config_cb, NULL,
},
/* Paddington Mac I/O */
{
PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_343S1211,
"mac-io", "mac-io", "AAPL,343S1211", "paddington\0heathrow\0",
1, 1, 1,
- &macio_config_cb, NULL,
+ &macio_heathrow_config_cb, NULL,
},
/* KeyLargo Mac I/O */
{
PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_KEYL,
"mac-io", "mac-io", "AAPL,Keylargo", "Keylargo\0",
1, 1, 2,
- &macio_config_cb, NULL,
+ &macio_keylargo_config_cb, NULL,
},
{
0xFFFF, 0xFFFF,
Modified: openbios-devel/drivers/pci_database.h
===================================================================
--- openbios-devel/drivers/pci_database.h 2009-02-05 21:37:26 UTC (rev 448)
+++ openbios-devel/drivers/pci_database.h 2009-02-08 12:22:04 UTC (rev 449)
@@ -27,7 +27,8 @@
extern int ide_config_cb2(const pci_config_t *config);
extern int eth_config_cb(const pci_config_t *config);
-extern int macio_config_cb(const pci_config_t *config);
+extern int macio_heathrow_config_cb(const pci_config_t *config);
+extern int macio_keylargo_config_cb(const pci_config_t *config);
extern int vga_config_cb(const pci_config_t *config);
extern int host_config_cb(const pci_config_t *config);
extern int bridge_config_cb(const pci_config_t *config);