diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/m68k/sun3/idprom.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/m68k/sun3/idprom.c')
-rw-r--r-- | arch/m68k/sun3/idprom.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/arch/m68k/sun3/idprom.c b/arch/m68k/sun3/idprom.c new file mode 100644 index 000000000000..02c1fee6fe74 --- /dev/null +++ b/arch/m68k/sun3/idprom.c | |||
@@ -0,0 +1,129 @@ | |||
1 | /* $Id: idprom.c,v 1.22 1996/11/13 05:09:25 davem Exp $ | ||
2 | * idprom.c: Routines to load the idprom into kernel addresses and | ||
3 | * interpret the data contained within. | ||
4 | * | ||
5 | * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) | ||
6 | * Sun3/3x models added by David Monro (davidm@psrg.cs.usyd.edu.au) | ||
7 | */ | ||
8 | |||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/types.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/string.h> | ||
13 | |||
14 | #include <asm/oplib.h> | ||
15 | #include <asm/idprom.h> | ||
16 | #include <asm/machines.h> /* Fun with Sun released architectures. */ | ||
17 | |||
18 | struct idprom *idprom; | ||
19 | static struct idprom idprom_buffer; | ||
20 | |||
21 | /* Here is the master table of Sun machines which use some implementation | ||
22 | * of the Sparc CPU and have a meaningful IDPROM machtype value that we | ||
23 | * know about. See asm-sparc/machines.h for empirical constants. | ||
24 | */ | ||
25 | struct Sun_Machine_Models Sun_Machines[NUM_SUN_MACHINES] = { | ||
26 | /* First, Sun3's */ | ||
27 | { .name = "Sun 3/160 Series", .id_machtype = (SM_SUN3 | SM_3_160) }, | ||
28 | { .name = "Sun 3/50", .id_machtype = (SM_SUN3 | SM_3_50) }, | ||
29 | { .name = "Sun 3/260 Series", .id_machtype = (SM_SUN3 | SM_3_260) }, | ||
30 | { .name = "Sun 3/110 Series", .id_machtype = (SM_SUN3 | SM_3_110) }, | ||
31 | { .name = "Sun 3/60", .id_machtype = (SM_SUN3 | SM_3_60) }, | ||
32 | { .name = "Sun 3/E", .id_machtype = (SM_SUN3 | SM_3_E) }, | ||
33 | /* Now, Sun3x's */ | ||
34 | { .name = "Sun 3/460 Series", .id_machtype = (SM_SUN3X | SM_3_460) }, | ||
35 | { .name = "Sun 3/80", .id_machtype = (SM_SUN3X | SM_3_80) }, | ||
36 | /* Then, Sun4's */ | ||
37 | // { .name = "Sun 4/100 Series", .id_machtype = (SM_SUN4 | SM_4_110) }, | ||
38 | // { .name = "Sun 4/200 Series", .id_machtype = (SM_SUN4 | SM_4_260) }, | ||
39 | // { .name = "Sun 4/300 Series", .id_machtype = (SM_SUN4 | SM_4_330) }, | ||
40 | // { .name = "Sun 4/400 Series", .id_machtype = (SM_SUN4 | SM_4_470) }, | ||
41 | /* And now, Sun4c's */ | ||
42 | // { .name = "Sun4c SparcStation 1", .id_machtype = (SM_SUN4C | SM_4C_SS1) }, | ||
43 | // { .name = "Sun4c SparcStation IPC", .id_machtype = (SM_SUN4C | SM_4C_IPC) }, | ||
44 | // { .name = "Sun4c SparcStation 1+", .id_machtype = (SM_SUN4C | SM_4C_SS1PLUS) }, | ||
45 | // { .name = "Sun4c SparcStation SLC", .id_machtype = (SM_SUN4C | SM_4C_SLC) }, | ||
46 | // { .name = "Sun4c SparcStation 2", .id_machtype = (SM_SUN4C | SM_4C_SS2) }, | ||
47 | // { .name = "Sun4c SparcStation ELC", .id_machtype = (SM_SUN4C | SM_4C_ELC) }, | ||
48 | // { .name = "Sun4c SparcStation IPX", .id_machtype = (SM_SUN4C | SM_4C_IPX) }, | ||
49 | /* Finally, early Sun4m's */ | ||
50 | // { .name = "Sun4m SparcSystem600", .id_machtype = (SM_SUN4M | SM_4M_SS60) }, | ||
51 | // { .name = "Sun4m SparcStation10/20", .id_machtype = (SM_SUN4M | SM_4M_SS50) }, | ||
52 | // { .name = "Sun4m SparcStation5", .id_machtype = (SM_SUN4M | SM_4M_SS40) }, | ||
53 | /* One entry for the OBP arch's which are sun4d, sun4e, and newer sun4m's */ | ||
54 | // { .name = "Sun4M OBP based system", .id_machtype = (SM_SUN4M_OBP | 0x0) } | ||
55 | }; | ||
56 | |||
57 | static void __init display_system_type(unsigned char machtype) | ||
58 | { | ||
59 | register int i; | ||
60 | |||
61 | for (i = 0; i < NUM_SUN_MACHINES; i++) { | ||
62 | if(Sun_Machines[i].id_machtype == machtype) { | ||
63 | if (machtype != (SM_SUN4M_OBP | 0x00)) | ||
64 | printk("TYPE: %s\n", Sun_Machines[i].name); | ||
65 | else { | ||
66 | #if 0 | ||
67 | prom_getproperty(prom_root_node, "banner-name", | ||
68 | sysname, sizeof(sysname)); | ||
69 | printk("TYPE: %s\n", sysname); | ||
70 | #endif | ||
71 | } | ||
72 | return; | ||
73 | } | ||
74 | } | ||
75 | |||
76 | prom_printf("IDPROM: Bogus id_machtype value, 0x%x\n", machtype); | ||
77 | prom_halt(); | ||
78 | } | ||
79 | |||
80 | void sun3_get_model(unsigned char* model) | ||
81 | { | ||
82 | register int i; | ||
83 | |||
84 | for (i = 0; i < NUM_SUN_MACHINES; i++) { | ||
85 | if(Sun_Machines[i].id_machtype == idprom->id_machtype) { | ||
86 | strcpy(model, Sun_Machines[i].name); | ||
87 | return; | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | |||
92 | |||
93 | |||
94 | /* Calculate the IDPROM checksum (xor of the data bytes). */ | ||
95 | static unsigned char __init calc_idprom_cksum(struct idprom *idprom) | ||
96 | { | ||
97 | unsigned char cksum, i, *ptr = (unsigned char *)idprom; | ||
98 | |||
99 | for (i = cksum = 0; i <= 0x0E; i++) | ||
100 | cksum ^= *ptr++; | ||
101 | |||
102 | return cksum; | ||
103 | } | ||
104 | |||
105 | /* Create a local IDPROM copy, verify integrity, and display information. */ | ||
106 | void __init idprom_init(void) | ||
107 | { | ||
108 | prom_get_idprom((char *) &idprom_buffer, sizeof(idprom_buffer)); | ||
109 | |||
110 | idprom = &idprom_buffer; | ||
111 | |||
112 | if (idprom->id_format != 0x01) { | ||
113 | prom_printf("IDPROM: Unknown format type!\n"); | ||
114 | prom_halt(); | ||
115 | } | ||
116 | |||
117 | if (idprom->id_cksum != calc_idprom_cksum(idprom)) { | ||
118 | prom_printf("IDPROM: Checksum failure (nvram=%x, calc=%x)!\n", | ||
119 | idprom->id_cksum, calc_idprom_cksum(idprom)); | ||
120 | prom_halt(); | ||
121 | } | ||
122 | |||
123 | display_system_type(idprom->id_machtype); | ||
124 | |||
125 | printk("Ethernet address: %x:%x:%x:%x:%x:%x\n", | ||
126 | idprom->id_ethaddr[0], idprom->id_ethaddr[1], | ||
127 | idprom->id_ethaddr[2], idprom->id_ethaddr[3], | ||
128 | idprom->id_ethaddr[4], idprom->id_ethaddr[5]); | ||
129 | } | ||