Author: blueswirl
Date: 2007-04-25 21:57:23 +0200 (Wed, 25 Apr 2007)
New Revision: 130
Modified:
openbios-devel/drivers/obio.c
Log:
CPU specific properties
Modified: openbios-devel/drivers/obio.c
===================================================================
--- openbios-devel/drivers/obio.c 2007-04-24 20:00:02 UTC (rev 129)
+++ openbios-devel/drivers/obio.c 2007-04-25 19:57:23 UTC (rev 130)
@@ -306,23 +306,141 @@
return NVRAM_SIZE;
}
+static void mb86904_init(void)
+{
+ PUSH(32);
+ fword("encode-int");
+ push_str("cache-line-size");
+ fword("property");
+
+ PUSH(512);
+ fword("encode-int");
+ push_str("cache-nlines");
+ fword("property");
+
+ PUSH(0x23);
+ fword("encode-int");
+ push_str("mask_rev");
+ fword("property");
+}
+
+static void tms390z55_init(void)
+{
+ push_str("");
+ fword("encode-string");
+ push_str("ecache-parity?");
+ fword("property");
+
+ push_str("");
+ fword("encode-string");
+ push_str("bfill?");
+ fword("property");
+
+ push_str("");
+ fword("encode-string");
+ push_str("bcopy?");
+ fword("property");
+
+ push_str("");
+ fword("encode-string");
+ push_str("cache-physical?");
+ fword("property");
+
+ PUSH(0xf);
+ fword("encode-int");
+ PUSH(0xf8fffffc);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(4);
+ fword("encode-int");
+ fword("encode+");
+
+ PUSH(0xf);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(0xf8c00000);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(0x1000);
+ fword("encode-int");
+ fword("encode+");
+
+ PUSH(0xf);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(0xf8000000);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(0x1000);
+ fword("encode-int");
+ fword("encode+");
+
+ PUSH(0xf);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(0xf8800000);
+ fword("encode-int");
+ fword("encode+");
+ PUSH(0x1000);
+ fword("encode-int");
+ fword("encode+");
+ push_str("reg");
+ fword("property");
+}
+
struct cpudef {
- const unsigned char *name;
unsigned long iu_version;
+ const char *name;
+ int psr_impl, psr_vers, impl, vers;
+ int dcache_line_size, dcache_lines, dcache_assoc;
+ int icache_line_size, icache_lines, icache_assoc;
+ int ecache_line_size, ecache_lines, ecache_assoc;
+ int mmu_nctx;
+ void (*initfn)(void);
};
static const struct cpudef sparc_defs[] = {
{
+ .iu_version = 0x04 << 24, /* Impl 0, ver 4 */
.name = "FMI,MB86904",
- .iu_version = 0x04 << 24, /* Impl 0, ver 4 */
+ .psr_impl = 0,
+ .psr_vers = 5,
+ .impl = 0,
+ .vers = 5,
+ .dcache_line_size = 0x20,
+ .dcache_lines = 0x200,
+ .dcache_assoc = 1,
+ .icache_line_size = 0x20,
+ .icache_lines = 0x200,
+ .icache_assoc = 1,
+ .ecache_line_size = 0x20,
+ .ecache_lines = 0x4000,
+ .ecache_assoc = 1,
+ .mmu_nctx = 0x100,
+ .initfn = mb86904_init,
},
{
+ .iu_version = 0x40000000,
.name = "TI,TMS390Z55",
- .iu_version = 0x40000000,
+ .psr_impl = 4,
+ .psr_vers = 0,
+ .impl = 0,
+ .vers = 4,
+ .dcache_line_size = 0x20,
+ .dcache_lines = 0x80,
+ .dcache_assoc = 4,
+ .icache_line_size = 0x40,
+ .icache_lines = 0x40,
+ .icache_assoc = 5,
+ .ecache_line_size = 0x20,
+ .ecache_lines = 0x8000,
+ .ecache_assoc = 1,
+ .mmu_nctx = 0x10000,
+ .initfn = tms390z55_init,
},
};
-static const char *
+static const struct cpudef *
id_cpu(void)
{
unsigned long iu_version;
@@ -334,9 +452,10 @@
for (i = 0; i < sizeof(sparc_defs)/sizeof(struct cpudef); i++) {
if (iu_version == sparc_defs[i].iu_version)
- return sparc_defs[i].name;
+ return &sparc_defs[i];
}
- return "CPU,Unknown";
+ printk("Unknown cpu (psr %lx), freezing!\n", iu_version);
+ for (;;);
}
static void
@@ -351,11 +470,12 @@
extern const char *obp_stdin_path, *obp_stdout_path;
extern uint16_t graphic_depth;
- const char *stdin, *stdout, *cpuname;
+ const char *stdin, *stdout;
unsigned int i;
char nographic;
uint32_t size;
unsigned int machine_id;
+ struct cpudef *cpu;
ob_new_obio_device("eeprom", NULL);
@@ -445,36 +565,31 @@
fword("new-device");
- cpuname = id_cpu();
- push_str(cpuname);
+ cpu = id_cpu();
+ push_str(cpu->name);
fword("device-name");
push_str("cpu");
fword("device-type");
- PUSH(0);
+ PUSH(cpu->psr_impl);
fword("encode-int");
- push_str("implementation");
+ push_str("psr-implementation");
fword("property");
- PUSH(4);
+ PUSH(cpu->psr_vers);
fword("encode-int");
- push_str("version");
+ push_str("psr-version");
fword("property");
- push_str("");
- fword("encode-string");
- push_str("cache-physical?");
- fword("property");
-
- PUSH(32);
+ PUSH(cpu->impl);
fword("encode-int");
- push_str("cache-line-size");
+ push_str("implementation");
fword("property");
- PUSH(512);
+ PUSH(cpu->vers);
fword("encode-int");
- push_str("cache-nlines");
+ push_str("version");
fword("property");
PUSH(4096);
@@ -482,48 +597,47 @@
push_str("page-size");
fword("property");
- PUSH(16);
+ PUSH(cpu->dcache_line_size);
fword("encode-int");
push_str("dcache-line-size");
fword("property");
- PUSH(512);
+ PUSH(cpu->dcache_lines);
fword("encode-int");
push_str("dcache-nlines");
fword("property");
- PUSH(1);
+ PUSH(cpu->dcache_assoc);
fword("encode-int");
push_str("dcache-associativity");
fword("property");
- PUSH(16);
+ PUSH(cpu->icache_line_size);
fword("encode-int");
push_str("icache-line-size");
fword("property");
- PUSH(512);
+ PUSH(cpu->icache_lines);
fword("encode-int");
push_str("icache-nlines");
fword("property");
- PUSH(1);
+ PUSH(cpu->icache_assoc);
fword("encode-int");
push_str("icache-associativity");
fword("property");
-
- PUSH(0x20);
+ PUSH(cpu->ecache_line_size);
fword("encode-int");
push_str("ecache-line-size");
fword("property");
- PUSH(0x4000);
+ PUSH(cpu->ecache_lines);
fword("encode-int");
push_str("ecache-nlines");
fword("property");
- PUSH(1);
+ PUSH(cpu->ecache_assoc);
fword("encode-int");
push_str("ecache-associativity");
fword("property");
@@ -533,7 +647,7 @@
push_str("ncaches");
fword("property");
- PUSH(4096);
+ PUSH(cpu->mmu_nctx);
fword("encode-int");
push_str("mmu-nctx");
fword("property");
@@ -543,18 +657,18 @@
push_str("sparc-version");
fword("property");
- PUSH(37);
- fword("encode-int");
- push_str("mask_rev");
+ push_str("");
+ fword("encode-string");
+ push_str("cache-coherence?");
fword("property");
PUSH(i);
fword("encode-int");
push_str("mid");
fword("property");
+
+ cpu->initfn();
-
-
fword("finish-device");
}