patch-2.4.22 linux-2.4.22/arch/mips/dec/prom/identify.c
Next file: linux-2.4.22/arch/mips/dec/prom/init.c
Previous file: linux-2.4.22/arch/mips/dec/prom/cmdline.c
Back to the patch index
Back to the overall index
- Lines: 194
- Date:
2003-08-25 04:44:39.000000000 -0700
- Orig file:
linux-2.4.21/arch/mips/dec/prom/identify.c
- Orig date:
2002-11-28 15:53:10.000000000 -0800
diff -urN linux-2.4.21/arch/mips/dec/prom/identify.c linux-2.4.22/arch/mips/dec/prom/identify.c
@@ -2,50 +2,104 @@
* identify.c: machine identification code.
*
* Copyright (C) 1998 Harald Koerfgen and Paul M. Antoine
+ * Copyright (C) 2002, 2003 Maciej W. Rozycki
*/
#include <linux/init.h>
#include <linux/kernel.h>
+#include <linux/mc146818rtc.h>
#include <linux/string.h>
+#include <linux/types.h>
#include <asm/bootinfo.h>
+#include <asm/dec/ioasic.h>
+#include <asm/dec/ioasic_addrs.h>
+#include <asm/dec/kn01.h>
+#include <asm/dec/kn02.h>
+#include <asm/dec/kn02ba.h>
+#include <asm/dec/kn02ca.h>
+#include <asm/dec/kn03.h>
+#include <asm/dec/kn230.h>
+#include <asm/dec/prom.h>
#include "dectypes.h"
-#include "prom.h"
-
-extern char *(*prom_getenv)(char *);
-extern int (*prom_printf)(char *, ...);
-extern int (*rex_getsysid)(void);
extern unsigned long mips_machgroup;
extern unsigned long mips_machtype;
-extern unsigned long mips_machtype;
+static const char *dec_system_strings[] = {
+ [MACH_DSUNKNOWN] "unknown DECstation",
+ [MACH_DS23100] "DECstation 2100/3100",
+ [MACH_DS5100] "DECsystem 5100",
+ [MACH_DS5000_200] "DECstation 5000/200",
+ [MACH_DS5000_1XX] "DECstation 5000/1xx",
+ [MACH_DS5000_XX] "Personal DECstation 5000/xx",
+ [MACH_DS5000_2X0] "DECstation 5000/2x0",
+ [MACH_DS5400] "DECsystem 5400",
+ [MACH_DS5500] "DECsystem 5500",
+ [MACH_DS5800] "DECsystem 5800",
+ [MACH_DS5900] "DECsystem 5900",
+};
+
const char *get_system_type(void)
{
- static char system[32];
- int called = 0;
- const char *dec_system_strings[] = { "unknown", "DECstation 2100/3100",
- "DECstation 5100", "DECstation 5000/200", "DECstation 5000/1xx",
- "Personal DECstation 5000/xx", "DECstation 5000/2x0",
- "DECstation 5400", "DECstation 5500", "DECstation 5800"
- };
+#define STR_BUF_LEN 64
+ static char system[STR_BUF_LEN];
+ static int called = 0;
if (called == 0) {
called = 1;
- strcpy(system, "Digital ");
- strcat(system, dec_system_strings[mips_machtype]);
+ snprintf(system, STR_BUF_LEN, "Digital %s",
+ dec_system_strings[mips_machtype]);
}
return system;
}
-void __init prom_identify_arch (unsigned int magic)
+
+/*
+ * Setup essential system-specific memory addresses. We need them
+ * early. Semantically the functions belong to prom/init.c, but they
+ * are compact enough we want them inlined. --macro
+ */
+static inline void prom_init_kn01(void)
{
- unsigned char dec_cpunum, dec_firmrev, dec_etc;
- int dec_systype;
- unsigned long dec_sysid;
+ dec_rtc_base = (void *)KN01_RTC_BASE;
+ dec_kn_slot_size = KN01_SLOT_SIZE;
+}
- if (magic != REX_PROM_MAGIC) {
+static inline void prom_init_kn230(void)
+{
+ dec_rtc_base = (void *)KN01_RTC_BASE;
+ dec_kn_slot_size = KN01_SLOT_SIZE;
+}
+
+static inline void prom_init_kn02(void)
+{
+ dec_rtc_base = (void *)KN02_RTC_BASE;
+ dec_kn_slot_size = KN02_SLOT_SIZE;
+}
+
+static inline void prom_init_kn02xa(void)
+{
+ ioasic_base = (void *)KN02XA_IOASIC_BASE;
+ dec_rtc_base = (void *)KN02XA_RTC_BASE;
+ dec_kn_slot_size = IOASIC_SLOT_SIZE;
+}
+
+static inline void prom_init_kn03(void)
+{
+ ioasic_base = (void *)KN03_IOASIC_BASE;
+ dec_rtc_base = (void *)KN03_RTC_BASE;
+ dec_kn_slot_size = IOASIC_SLOT_SIZE;
+}
+
+
+void __init prom_identify_arch(u32 magic)
+{
+ unsigned char dec_cpunum, dec_firmrev, dec_etc, dec_systype;
+ u32 dec_sysid;
+
+ if (!prom_is_rex(magic)) {
dec_sysid = simple_strtoul(prom_getenv("systype"), (char **)0, 0);
} else {
dec_sysid = rex_getsysid();
@@ -67,50 +121,52 @@
* FIXME: This may not be an exhaustive list of DECStations/Servers!
* Put all model-specific initialisation calls here.
*/
- prom_printf("This DECstation is a ");
-
switch (dec_systype) {
case DS2100_3100:
- prom_printf("DS2100/3100\n");
mips_machtype = MACH_DS23100;
+ prom_init_kn01();
break;
case DS5100: /* DS5100 MIPSMATE */
- prom_printf("DS5100\n");
mips_machtype = MACH_DS5100;
+ prom_init_kn230();
break;
case DS5000_200: /* DS5000 3max */
- prom_printf("DS5000/200\n");
mips_machtype = MACH_DS5000_200;
+ prom_init_kn02();
break;
case DS5000_1XX: /* DS5000/100 3min */
- prom_printf("DS5000/1xx\n");
mips_machtype = MACH_DS5000_1XX;
+ prom_init_kn02xa();
break;
- case DS5000_2X0: /* DS5000/240 3max+ */
- prom_printf("DS5000/2x0\n");
+ case DS5000_2X0: /* DS5000/240 3max+ or DS5900 bigmax */
mips_machtype = MACH_DS5000_2X0;
+ prom_init_kn03();
+ if (!(ioasic_read(IO_REG_SIR) & KN03_IO_INR_3MAXP))
+ mips_machtype = MACH_DS5900;
break;
- case DS5000_XX: /* Personal DS5000/2x */
- prom_printf("Personal DS5000/xx\n");
+ case DS5000_XX: /* Personal DS5000/xx maxine */
mips_machtype = MACH_DS5000_XX;
+ prom_init_kn02xa();
break;
case DS5800: /* DS5800 Isis */
- prom_printf("DS5800\n");
mips_machtype = MACH_DS5800;
break;
case DS5400: /* DS5400 MIPSfair */
- prom_printf("DS5400\n");
mips_machtype = MACH_DS5400;
break;
case DS5500: /* DS5500 MIPSfair-2 */
- prom_printf("DS5500\n");
mips_machtype = MACH_DS5500;
break;
default:
- prom_printf("unknown, id is %x", dec_systype);
mips_machtype = MACH_DSUNKNOWN;
break;
}
-}
-
+ if (mips_machtype == MACH_DSUNKNOWN)
+ prom_printf("This is an %s, id is %x\n",
+ dec_system_strings[mips_machtype],
+ dec_systype);
+ else
+ prom_printf("This is a %s\n",
+ dec_system_strings[mips_machtype]);
+}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)