summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/arch/aviion/aviion/autoconf.c195
-rw-r--r--sys/arch/aviion/aviion/av400_machdep.c31
-rw-r--r--sys/arch/aviion/aviion/av530_machdep.c39
-rw-r--r--sys/arch/aviion/aviion/locore.S32
-rw-r--r--sys/arch/aviion/aviion/machdep.c3
-rw-r--r--sys/arch/aviion/include/autoconf.h3
-rw-r--r--sys/arch/aviion/include/av400.h3
-rw-r--r--sys/arch/aviion/include/board.h5
-rw-r--r--sys/arch/aviion/include/prom.h22
9 files changed, 214 insertions, 119 deletions
diff --git a/sys/arch/aviion/aviion/autoconf.c b/sys/arch/aviion/aviion/autoconf.c
index 373112379eb..fbbebfef585 100644
--- a/sys/arch/aviion/aviion/autoconf.c
+++ b/sys/arch/aviion/aviion/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.15 2013/10/09 21:28:33 miod Exp $ */
+/* $OpenBSD: autoconf.c,v 1.16 2013/10/10 21:24:58 miod Exp $ */
/*
* Copyright (c) 1998 Steve Murphree, Jr.
* Copyright (c) 1996 Nivas Madhur
@@ -44,7 +44,7 @@
#include <machine/autoconf.h>
#include <machine/board.h>
#include <machine/cpu.h>
-#include <machine/vmparam.h>
+#include <machine/prom.h>
#ifdef AV530
#include <machine/av530.h>
@@ -68,25 +68,14 @@ void dumpconf(void);
int cold = 1; /* 1 if still booting */
-struct device *bootdv; /* set by device drivers (if found) */
-
-uint32_t bootdevtype;
-
-/* cied */
-#define BT_CIEN 0x6369656e
-/* cimd */
-/* cird */
-/* cisc */
-#define BT_DGEN 0x6467656e
-#define BT_DGSC 0x64677363
-/* hada */
-#define BT_HKEN 0x686b656e
-#define BT_INEN 0x696e656e
-#define BT_INSC 0x696e7363
-#define BT_NCSC 0x6e637363
-/* nvrd */
-/* pefn */
-/* vitr */
+static struct device *bootctrl; /* boot controller */
+static struct device *bootdv; /* boot device (if found) */
+u_int bootdev = 0; /* set in locore.S, can't be in .bss */
+u_int bootunit = 0; /* set in locore.S, can't be in .bss */
+u_int bootlun = 0; /* set in locore.S, can't be in .bss */
+u_int bootpart = 0; /* set in locore.S, can't be in .bss */
+static uint32_t bootdevtype; /* boot controller SCM name */
+static paddr_t bootctrlpaddr; /* boot controller address */
/*
* called at boot time, configure all devices on the system.
@@ -94,8 +83,8 @@ uint32_t bootdevtype;
void
cpu_configure()
{
- printf("bootpath: '%s' dev %u unit %u part %u\n",
- bootargs, bootdev, bootunit, bootpart);
+ printf("bootpath: '%s' dev %u unit %u lun %u\n",
+ bootargs, bootdev, bootunit, bootlun);
softintr_init();
@@ -146,11 +135,36 @@ stws(char *p)
return (p);
}
+/* parse a positive base 10 number */
+static u_int strtoi(const char *);
+static u_int
+strtoi(const char *s)
+{
+ int c;
+ u_int val = 0;
+
+ if (s == NULL || *s == '\0')
+ return 0;
+
+ /* skip whitespace */
+ do {
+ c = *s++;
+ } while (c == ' ' || c == '\t');
+
+ for (;;) {
+ if (c < '0' || c > '9')
+ break;
+ val *= 10;
+ val += c - '0';
+ }
+
+ return val;
+}
+
void
cmdline_parse(void)
{
char *p;
-
/*
* If the boot commandline has been manually entered, it
@@ -196,13 +210,33 @@ cmdline_parse(void)
* However, in the sd() or st() cases, we need to figure out the
* SCSI controller name (if not the default one) and address, if
* provided.
+ *
+ * Note that we will override bootdev at this point. If no boot
+ * controller number or address was provided, bootdev will be set
+ * to zero anyway.
*/
if (memcmp(bootargs, "sd", 2) == 0 ||
memcmp(bootargs, "st", 2) == 0) {
- bcopy(platform->default_boot, &bootdevtype, sizeof(uint32_t));
- /* search for a controller specification */
- } else
+ /*
+ * Either
+ * sd(bootdev,bootunit,bootlun)
+ * or
+ * sd(ctrl(bootdev,id),bootunit,bootlun)
+ * We already know bootdev, bootunit and bootlun.
+ * All we need here is to figure out the controller type
+ * and address.
+ */
+ if (bootargs[7] == '(') {
+ bcopy(bootargs + 3, &bootdevtype, sizeof(uint32_t));
+ bootdev = strtoi(bootargs + 8);
+ }
+ } else {
bcopy(bootargs, &bootdevtype, sizeof(int));
+ bootdev = strtoi(bootargs + 5);
+ }
+
+ /* fill the holes */
+ bootctrlpaddr = platform->get_boot_device(&bootdevtype, bootdev);
}
void
@@ -210,85 +244,52 @@ device_register(struct device *dev, void *aux)
{
struct confargs *ca = (struct confargs *)aux;
struct cfdriver *cf = dev->dv_cfdata->cf_driver;
+ struct device *parent = dev->dv_parent;
if (bootdv != NULL)
return;
-/* SCSI -> match bootunit/bootpart as id:lun iff controller matches */
- switch (bootdevtype) {
- /*
- * Network devices
- */
-
- case BT_INEN:
- /*
- * Internal LANCE Ethernet is le at syscon only, and we do not
- * care about controller and unit numbers.
- */
- if (strcmp("le", cf->cd_name) == 0 && strcmp("syscon",
- dev->dv_parent->dv_cfdata->cf_driver->cd_name) == 0)
- bootdv = dev;
- break;
- case BT_DGEN:
- /*
- * Internal ILACC Ethernet is le at syscon only, and need to
- * match the controller address.
- */
- if (strcmp("le", cf->cd_name) == 0 && strcmp("syscon",
- dev->dv_parent->dv_cfdata->cf_driver->cd_name) == 0) {
- switch (cpuid) {
-#ifdef AV530
- case AVIION_4600_530:
- if ((bootdev == 0 &&
- ca->ca_paddr == AV530_LAN1) ||
- (bootdev == 1 &&
- ca->ca_paddr == AV530_LAN2))
- bootdv = dev;
- break;
-#endif
- default:
- break;
- }
- }
- break;
-
- /*
- * SCSI controllers
- */
+ if (bootctrl == NULL) {
+ if (ca->ca_paddr != bootctrlpaddr)
+ return;
+
+ switch (bootdevtype) {
+ case SCM_INEN:
+ case SCM_DGEN:
+ if (strcmp("le", cf->cd_name) == 0 &&
+ strcmp("syscon",
+ parent->dv_cfdata->cf_driver->cd_name) == 0)
+ bootctrl = dev;
+ break;
- case BT_NCSC:
- /*
- * Internal 53C700 controller is oosiop at syscon only, and
- * needs to match the controller address, as well as SCSI
- * unit and lun numbers.
- */
- {
- struct scsi_attach_args *sa = aux;
- struct device *grandp;
-
- if (memcmp(cf->cd_name, bootargs, 2) != 0 ||
- (strcmp("sd", cf->cd_name) != 0 &&
- strcmp("st", cf->cd_name) != 0) ||
- sa->sa_sc_link->target != bootunit ||
- sa->sa_sc_link->lun != bootpart)
+ case SCM_INSC:
+ if (strcmp("oaic", cf->cd_name) == 0 &&
+ strcmp("syscon",
+ parent->dv_cfdata->cf_driver->cd_name) == 0)
+ bootctrl = dev;
break;
- grandp = dev->dv_parent->dv_parent;
- if (strcmp("oosiop",
- grandp->dv_cfdata->cf_driver->cd_name) == 0) {
- bootdv = dev; /* XXX second controller */
+ case SCM_NCSC:
+ if (strcmp("oosiop", cf->cd_name) == 0 &&
+ strcmp("syscon",
+ parent->dv_cfdata->cf_driver->cd_name) == 0)
+ bootctrl = dev;
+ break;
}
- }
- break;
- case BT_INSC:
- /*
- * Internal AIC-6250 controller is oaic at syscon only, and
- * needs to match the controller address, as well as SCSI
- * unit and lun numbers.
- */
- /* XXX TBD */
- break;
+ if (bootctrl != NULL && bootctrl->dv_class == DV_IFNET)
+ bootdv = bootctrl;
+ return;
+ }
+
+ if (memcmp(cf->cd_name, bootargs, 2) == 0 &&
+ (strcmp("sd", cf->cd_name) == 0 ||
+ strcmp("st", cf->cd_name) == 0)) {
+ struct scsi_attach_args *saa = aux;
+ if (saa->sa_sc_link->target == bootunit &&
+ saa->sa_sc_link->lun == bootlun &&
+ parent->dv_parent == bootctrl)
+ bootdv = dev;
}
}
diff --git a/sys/arch/aviion/aviion/av400_machdep.c b/sys/arch/aviion/aviion/av400_machdep.c
index 4faa32433c0..ad06858f2d5 100644
--- a/sys/arch/aviion/aviion/av400_machdep.c
+++ b/sys/arch/aviion/aviion/av400_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: av400_machdep.c,v 1.24 2013/10/09 21:28:33 miod Exp $ */
+/* $OpenBSD: av400_machdep.c,v 1.25 2013/10/10 21:24:58 miod Exp $ */
/*
* Copyright (c) 2006, 2007, Miodrag Vallat.
*
@@ -193,6 +193,7 @@ const struct board board_av400 = {
av400_bootstrap,
av400_memsize,
av400_startup,
+ av400_get_boot_device,
av400_intr,
cio_init_clocks,
av400_getipl,
@@ -206,8 +207,7 @@ const struct board board_av400 = {
av400_exintsrc,
av400_get_vme_ranges,
- av400_ptable,
- "insc"
+ av400_ptable
};
/*
@@ -310,6 +310,31 @@ av400_bootstrap()
}
/*
+ * Return the address of the boot device, providing the default boot device
+ * if none is requested.
+ */
+paddr_t
+av400_get_boot_device(uint32_t *name, u_int unit)
+{
+ /* default boot device is on-board insc() */
+ if (*name == 0)
+ *name = SCM_INSC;
+
+ switch (*name) {
+ case SCM_INEN:
+ if (unit == 0)
+ return AV400_LAN;
+ break;
+ case SCM_INSC:
+ if (unit == 0)
+ return AV400_SCSI;
+ break;
+ }
+
+ return 0;
+}
+
+/*
* Return the next ipl >= ``curlevel'' at which we can reenable interrupts
* while keeping ``mask'' masked.
*/
diff --git a/sys/arch/aviion/aviion/av530_machdep.c b/sys/arch/aviion/aviion/av530_machdep.c
index a74636cbb5c..c0603e9b740 100644
--- a/sys/arch/aviion/aviion/av530_machdep.c
+++ b/sys/arch/aviion/aviion/av530_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: av530_machdep.c,v 1.10 2013/10/09 21:28:33 miod Exp $ */
+/* $OpenBSD: av530_machdep.c,v 1.11 2013/10/10 21:24:58 miod Exp $ */
/*
* Copyright (c) 2006, 2007, 2010 Miodrag Vallat.
*
@@ -82,6 +82,7 @@ const struct board board_av530 = {
av530_bootstrap,
av530_memsize,
av530_startup,
+ av530_get_boot_device,
av530_intr,
rtc_init_clocks,
av530_getipl,
@@ -95,8 +96,7 @@ const struct board board_av530 = {
av530_exintsrc,
av530_get_vme_ranges,
- av530_ptable,
- "ncsc"
+ av530_ptable
};
/*
@@ -197,6 +197,39 @@ av530_bootstrap()
}
/*
+ * Return the address of the boot device, providing the default boot device
+ * if none is requested.
+ */
+paddr_t
+av530_get_boot_device(uint32_t *name, u_int unit)
+{
+ /* default boot device is on-board ncsc() */
+ if (*name == 0)
+ *name = SCM_NCSC;
+
+ switch (*name) {
+ case SCM_DGEN:
+ switch (unit) {
+ case 0:
+ return AV530_LAN1;
+ case 1:
+ return AV530_LAN2;
+ }
+ break;
+ case SCM_NCSC:
+ switch (unit) {
+ case 0:
+ return AV530_SCSI1;
+ case 1:
+ return AV530_SCSI1;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+/*
* Return the next ipl >= ``curlevel'' at which we can reenable interrupts
* while keeping ``mask'' and ``exmask'' masked.
*/
diff --git a/sys/arch/aviion/aviion/locore.S b/sys/arch/aviion/aviion/locore.S
index 2b924365288..4dffeaf315b 100644
--- a/sys/arch/aviion/aviion/locore.S
+++ b/sys/arch/aviion/aviion/locore.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.S,v 1.19 2013/10/07 19:10:40 miod Exp $ */
+/* $OpenBSD: locore.S,v 1.20 2013/10/10 21:24:59 miod Exp $ */
/*
* Copyright (c) 2005, Miodrag Vallat.
* Copyright (c) 1998 Steve Murphree, Jr.
@@ -68,7 +68,7 @@
#include <machine/trap.h>
#include <machine/vmparam.h>
-#define SYM_MAGIC 0x6274ef2e
+#define BOOT_MAGIC 0x6274ef2e
.text
@@ -123,18 +123,34 @@ ASLOCAL(main_start)
st %r3, %r13, %lo16(_C_LABEL(bootdev))
or.u %r13, %r0, %hi16(_C_LABEL(bootunit))
st %r4, %r13, %lo16(_C_LABEL(bootunit))
+ or.u %r13, %r0, %hi16(_C_LABEL(bootlun))
+ st %r5, %r13, %lo16(_C_LABEL(bootlun))
+
+ or.u %r12, %r0, %hi16(BOOT_MAGIC)
+ or %r12, %r12, %lo16(BOOT_MAGIC)
+ cmp %r2, %r6, %r12
+ bb1 eq, %r2, 1f
+ addu %r12, %r12, 1 /* BOOT_MAGIC + 1 */
+ cmp %r2, %r6, %r12
+ bb1 ne, %r2, 2f
+
+ /* BOOT_MAGIC + 1 */
or.u %r13, %r0, %hi16(_C_LABEL(bootpart))
- st %r5, %r13, %lo16(_C_LABEL(bootpart))
+ st %r7, %r13, %lo16(_C_LABEL(bootpart))
#if defined(DDB) || NKSYMS > 0
- or.u %r12, %r0, %hi16(SYM_MAGIC)
- or %r12, %r12, %lo16(SYM_MAGIC)
- cmp %r2, %r6, %r12
- bb1 ne, %r2, 1f
or.u %r13, %r0, %hi16(_C_LABEL(esym))
- st %r7, %r13, %lo16(_C_LABEL(esym))
+ st %r8, %r13, %lo16(_C_LABEL(esym))
+#endif
+ br 2f
+
+ /* BOOT_MAGIC */
1:
+#if defined(DDB) || NKSYMS > 0
+ or.u %r13, %r0, %hi16(_C_LABEL(esym))
+ st %r7, %r13, %lo16(_C_LABEL(esym))
#endif
+2:
/* set cputyp */
ldcr %r1, PID
extu %r8, %r1, 8<8>
diff --git a/sys/arch/aviion/aviion/machdep.c b/sys/arch/aviion/aviion/machdep.c
index 6e9febe5673..cef8e4944ba 100644
--- a/sys/arch/aviion/aviion/machdep.c
+++ b/sys/arch/aviion/aviion/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.56 2013/10/07 19:11:39 miod Exp $ */
+/* $OpenBSD: machdep.c,v 1.57 2013/10/10 21:24:59 miod Exp $ */
/*
* Copyright (c) 2007 Miodrag Vallat.
*
@@ -151,7 +151,6 @@ extern vaddr_t esym;
const char *prom_bootargs; /* set in locore.S */
char bootargs[256]; /* local copy */
-u_int bootdev, bootunit, bootpart; /* set in locore.S */
int32_t cpuid;
diff --git a/sys/arch/aviion/include/autoconf.h b/sys/arch/aviion/include/autoconf.h
index 8e5f8c86086..87c4fac0de6 100644
--- a/sys/arch/aviion/include/autoconf.h
+++ b/sys/arch/aviion/include/autoconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.h,v 1.2 2011/03/23 16:54:34 pirofti Exp $ */
+/* $OpenBSD: autoconf.h,v 1.3 2013/10/10 21:24:59 miod Exp $ */
/*
* Copyright (c) 1999, Steve Murphree, Jr.
* Copyright (c) 1996 Nivas Madhur
@@ -49,7 +49,6 @@ struct confargs {
void cmdline_parse(void);
void myetheraddr(u_char *);
-extern u_int bootdev, bootunit, bootpart;
extern char bootargs[256];
#endif
diff --git a/sys/arch/aviion/include/av400.h b/sys/arch/aviion/include/av400.h
index e95c8a7fe4e..f680189fa6e 100644
--- a/sys/arch/aviion/include/av400.h
+++ b/sys/arch/aviion/include/av400.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: av400.h,v 1.9 2013/09/24 20:14:35 miod Exp $ */
+/* $OpenBSD: av400.h,v 1.10 2013/10/10 21:24:59 miod Exp $ */
/*
* Copyright (c) 1999 Steve Murphree, Jr.
* All rights reserved.
@@ -130,6 +130,7 @@
* Onboard device addresses
*/
+#define AV400_SCSI 0xfff8a000
#define AV400_LAN 0xfff8c000
/*
diff --git a/sys/arch/aviion/include/board.h b/sys/arch/aviion/include/board.h
index b7647a0ae26..6946b1ad329 100644
--- a/sys/arch/aviion/include/board.h
+++ b/sys/arch/aviion/include/board.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: board.h,v 1.12 2013/10/09 21:28:33 miod Exp $ */
+/* $OpenBSD: board.h,v 1.13 2013/10/10 21:24:59 miod Exp $ */
/*
* Copyright (c) 2006, 2007, Miodrag Vallat
*
@@ -78,6 +78,7 @@ struct board {
u_int (*bootstrap)(void);
vaddr_t (*memsize)(void);
void (*startup)(void);
+ paddr_t (*get_boot_device)(uint32_t *, u_int);
void (*intr)(struct trapframe *);
void (*init_clocks)(void);
@@ -94,7 +95,6 @@ struct board {
const struct vme_range *(*get_vme_ranges)(void);
const struct pmap_table *ptable;
- const char *default_boot;
};
#define md_interrupt_func(f) platform->intr(f)
@@ -104,6 +104,7 @@ extern const struct board board_av##b; \
u_int av##b##_bootstrap(void); \
vaddr_t av##b##_memsize(void); \
void av##b##_startup(void); \
+paddr_t av##b##_get_boot_device(uint32_t *, u_int); \
void av##b##_intr(struct trapframe *); \
void av##b##_init_clocks(void); \
u_int av##b##_getipl(void); \
diff --git a/sys/arch/aviion/include/prom.h b/sys/arch/aviion/include/prom.h
index d6a0f254933..ce577504523 100644
--- a/sys/arch/aviion/include/prom.h
+++ b/sys/arch/aviion/include/prom.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: prom.h,v 1.5 2011/03/23 16:54:34 pirofti Exp $ */
+/* $OpenBSD: prom.h,v 1.6 2013/10/10 21:24:59 miod Exp $ */
/*
* Copyright (c) 2006, Miodrag Vallat.
*
@@ -82,4 +82,24 @@ void scm_putcrlf(void);
__dead void scm_reboot(const char *);
u_int scm_sysid(void);
+/*
+ * SCM boot device names
+ */
+
+/* cied */
+#define SCM_CIEN 0x6369656e
+/* cimd */
+/* cird */
+/* cisc */
+#define SCM_DGEN 0x6467656e
+#define SCM_DGSC 0x64677363
+/* hada */
+#define SCM_HKEN 0x686b656e
+#define SCM_INEN 0x696e656e
+#define SCM_INSC 0x696e7363
+#define SCM_NCSC 0x6e637363
+/* nvrd */
+/* pefn */
+/* vitr */
+
#endif /* _MACHINE_PROM_H_ */