Module Name: src
Committed By: skrll
Date: Thu Jan 13 21:15:16 UTC 2011
Modified Files:
src/sys/arch/hp700/dev: astro.c dino.c gecko.c lasi.c pdc.c phantomas.c
uturn.c
src/sys/arch/hp700/gsc: gscbus.c
src/sys/arch/hp700/hp700: autoconf.c machdep.c mainbus.c
src/sys/arch/hp700/include: autoconf.h iomod.h pdc.h
Log Message:
Redo the way devices are found.
Probe "Snake" machines with PDC_MEMMAP and others with PDC_SYSTEM_MAP.
Some PDCs don't tell us about all devices and/or the whole device tree.
Walk each bus to find these unreported devices.
To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/hp700/dev/astro.c
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/hp700/dev/dino.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/hp700/dev/gecko.c
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/hp700/dev/lasi.c
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/hp700/dev/pdc.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/hp700/dev/phantomas.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/hp700/dev/uturn.c
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/hp700/gsc/gscbus.c
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/hp700/hp700/autoconf.c
cvs rdiff -u -r1.95 -r1.96 src/sys/arch/hp700/hp700/machdep.c
cvs rdiff -u -r1.75 -r1.76 src/sys/arch/hp700/hp700/mainbus.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/hp700/include/autoconf.h
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/hp700/include/iomod.h
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/hp700/include/pdc.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/hp700/dev/astro.c
diff -u src/sys/arch/hp700/dev/astro.c:1.12 src/sys/arch/hp700/dev/astro.c:1.13
--- src/sys/arch/hp700/dev/astro.c:1.12 Tue Jan 4 10:42:33 2011
+++ src/sys/arch/hp700/dev/astro.c Thu Jan 13 21:15:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: astro.c,v 1.12 2011/01/04 10:42:33 skrll Exp $ */
+/* $NetBSD: astro.c,v 1.13 2011/01/13 21:15:13 skrll Exp $ */
/* $OpenBSD: astro.c,v 1.8 2007/10/06 23:50:54 krw Exp $ */
@@ -156,7 +156,7 @@
int astro_match(device_t, cfdata_t, void *);
void astro_attach(device_t, device_t, void *);
-static void astro_callback(device_t self, struct confargs *ca);
+static device_t astro_callback(device_t self, struct confargs *ca);
CFATTACH_DECL_NEW(astro, sizeof(struct astro_softc),
astro_match, astro_attach, NULL, NULL);
@@ -232,6 +232,7 @@
psize_t size;
vaddr_t va;
paddr_t pa;
+ void *p;
struct vm_page *m;
struct pglist mlist;
int iova_bits;
@@ -244,8 +245,8 @@
aprint_error(": can't map IO space\n");
return;
}
- sc->sc_regs = r = (struct astro_regs *)ca->ca_hpa;
-
+ p = bus_space_vaddr(ca->ca_iot, ioh);
+ sc->sc_regs = r = p;
rid = le32toh(r->rid);
aprint_normal(": Astro rev %d.%d\n", (rid & 7) + 1, (rid >> 3) & 3);
@@ -333,18 +334,17 @@
sc->sc_dmatag._cookie = sc;
nca = *ca; /* clone from us */
-// nca.ca_hpamask = HPPA_IOBEGIN;
nca.ca_dmatag = &sc->sc_dmatag;
- nca.ca_hpabase = 0; /* HPPA_UNDEF */
+ nca.ca_hpabase = IOMOD_IO_IO_LOW(p);
nca.ca_nmodules = MAXMODBUS;
pdc_scanbus(self, &nca, astro_callback);
}
-static void
+static device_t
astro_callback(device_t self, struct confargs *ca)
{
- config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
+ return config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
}
int
Index: src/sys/arch/hp700/dev/dino.c
diff -u src/sys/arch/hp700/dev/dino.c:1.27 src/sys/arch/hp700/dev/dino.c:1.28
--- src/sys/arch/hp700/dev/dino.c:1.27 Sun Dec 5 12:19:09 2010
+++ src/sys/arch/hp700/dev/dino.c Thu Jan 13 21:15:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: dino.c,v 1.27 2010/12/05 12:19:09 skrll Exp $ */
+/* $NetBSD: dino.c,v 1.28 2011/01/13 21:15:13 skrll Exp $ */
/* $OpenBSD: dino.c,v 1.5 2004/02/13 20:39:31 mickey Exp $ */
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dino.c,v 1.27 2010/12/05 12:19:09 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dino.c,v 1.28 2011/01/13 21:15:13 skrll Exp $");
/* #include "cardbus.h" */
@@ -135,12 +135,11 @@
int dinomatch(device_t, struct cfdata *, void *);
void dinoattach(device_t, device_t, void *);
-static void dino_callback(device_t, struct confargs *);
+static device_t dino_callback(device_t, struct confargs *);
CFATTACH_DECL_NEW(dino, sizeof(struct dino_softc), dinomatch, dinoattach, NULL,
NULL);
-
void dino_attach_hook(device_t, device_t,
struct pcibus_attach_args *);
void dino_enable_bus(struct dino_softc *, int);
@@ -1734,9 +1733,9 @@
config_found_ia(self, "pcibus", &pba, pcibusprint);
}
-static void
+static device_t
dino_callback(device_t self, struct confargs *ca)
{
- config_found_sm_loc(self, "dino", NULL, ca, mbprint, mbsubmatch);
+ return config_found_sm_loc(self, "dino", NULL, ca, mbprint, mbsubmatch);
}
Index: src/sys/arch/hp700/dev/gecko.c
diff -u src/sys/arch/hp700/dev/gecko.c:1.2 src/sys/arch/hp700/dev/gecko.c:1.3
--- src/sys/arch/hp700/dev/gecko.c:1.2 Sat May 30 17:45:59 2009
+++ src/sys/arch/hp700/dev/gecko.c Thu Jan 13 21:15:13 2011
@@ -38,7 +38,7 @@
int gecko_match(device_t, cfdata_t, void *);
void gecko_attach(device_t, device_t, void *);
-static void gecko_callback(device_t, struct confargs *);
+static device_t gecko_callback(device_t, struct confargs *);
CFATTACH_DECL_NEW(gecko, sizeof(struct gecko_softc), gecko_match,
gecko_attach, NULL, NULL);
@@ -86,10 +86,11 @@
pdc_scanbus(self, &nca, gecko_callback);
}
-static void
+static device_t
gecko_callback(device_t self, struct confargs *ca)
{
- config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
+ return config_found_sm_loc(self, "gedoens", NULL, ca, mbprint,
+ mbsubmatch);
}
Index: src/sys/arch/hp700/dev/lasi.c
diff -u src/sys/arch/hp700/dev/lasi.c:1.18 src/sys/arch/hp700/dev/lasi.c:1.19
--- src/sys/arch/hp700/dev/lasi.c:1.18 Tue Jan 4 10:42:33 2011
+++ src/sys/arch/hp700/dev/lasi.c Thu Jan 13 21:15:13 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: lasi.c,v 1.18 2011/01/04 10:42:33 skrll Exp $ */
+/* $NetBSD: lasi.c,v 1.19 2011/01/13 21:15:13 skrll Exp $ */
/* $OpenBSD: lasi.c,v 1.4 2001/06/09 03:57:19 mickey Exp $ */
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lasi.c,v 1.18 2011/01/04 10:42:33 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lasi.c,v 1.19 2011/01/13 21:15:13 skrll Exp $");
#undef LASIDEBUG
@@ -197,15 +197,6 @@
/* Attach the GSC bus. */
ga.ga_ca = *ca; /* clone from us */
- if (strcmp(parent->dv_xname, "mainbus0") == 0) {
- ga.ga_dp.dp_bc[0] = ga.ga_dp.dp_bc[1];
- ga.ga_dp.dp_bc[1] = ga.ga_dp.dp_bc[2];
- ga.ga_dp.dp_bc[2] = ga.ga_dp.dp_bc[3];
- ga.ga_dp.dp_bc[3] = ga.ga_dp.dp_bc[4];
- ga.ga_dp.dp_bc[4] = ga.ga_dp.dp_bc[5];
- ga.ga_dp.dp_bc[5] = ga.ga_dp.dp_mod;
- ga.ga_dp.dp_mod = 0;
- }
ga.ga_name = "gsc";
ga.ga_int_reg = &sc->sc_int_reg;
Index: src/sys/arch/hp700/dev/pdc.c
diff -u src/sys/arch/hp700/dev/pdc.c:1.37 src/sys/arch/hp700/dev/pdc.c:1.38
--- src/sys/arch/hp700/dev/pdc.c:1.37 Tue Jan 4 10:42:33 2011
+++ src/sys/arch/hp700/dev/pdc.c Thu Jan 13 21:15:14 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pdc.c,v 1.37 2011/01/04 10:42:33 skrll Exp $ */
+/* $NetBSD: pdc.c,v 1.38 2011/01/13 21:15:14 skrll Exp $ */
/* $OpenBSD: pdc.c,v 1.14 2001/04/29 21:05:43 mickey Exp $ */
@@ -29,7 +29,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.37 2011/01/04 10:42:33 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pdc.c,v 1.38 2011/01/13 21:15:14 skrll Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -48,6 +48,7 @@
#include <machine/autoconf.h>
#include <hp700/hp700/machdep.h>
+#include <hp700/dev/cpudevs.h>
typedef
struct pdc_softc {
@@ -58,6 +59,8 @@
pdcio_t pdc;
+enum pdc_type pdc_type;
+
static struct pdc_result pdcret1 PDC_ALIGNMENT;
static struct pdc_result pdcret2 PDC_ALIGNMENT;
@@ -145,6 +148,78 @@
todr_attach(&todr);
}
+void
+pdc_settype(int modelno)
+{
+ switch (modelno) {
+ /* 720, 750, 730, 735, 755 */
+ case HPPA_BOARD_HP720:
+ case HPPA_BOARD_HP750_66:
+ case HPPA_BOARD_HP730_66:
+ case HPPA_BOARD_HP735_99:
+ case HPPA_BOARD_HP755_99:
+ case HPPA_BOARD_HP755_125:
+ case HPPA_BOARD_HP735_130:
+
+ /* 710, 705, 7[12]5 */
+ case HPPA_BOARD_HP710:
+ case HPPA_BOARD_HP705:
+ case HPPA_BOARD_HP715_50:
+ case HPPA_BOARD_HP715_33:
+ case HPPA_BOARD_HP715S_50:
+ case HPPA_BOARD_HP715S_33:
+ case HPPA_BOARD_HP715T_50:
+ case HPPA_BOARD_HP715T_33:
+ case HPPA_BOARD_HP715_75:
+ case HPPA_BOARD_HP715_99:
+ case HPPA_BOARD_HP725_50:
+ case HPPA_BOARD_HP725_75:
+ case HPPA_BOARD_HP725_99:
+
+ /* 745, 742, 747 */
+ case HPPA_BOARD_HP745I_50:
+ case HPPA_BOARD_HP742I_50:
+ case HPPA_BOARD_HP747I_100:
+
+ /* 712/{60,80,100,120}, 715/{64,80,100,...}, etc */
+ case HPPA_BOARD_HP712_60:
+ case HPPA_BOARD_HP712_80:
+ case HPPA_BOARD_HP712_100:
+ case HPPA_BOARD_HP743I_64:
+ case HPPA_BOARD_HP743I_100:
+ case HPPA_BOARD_HP712_120:
+ case HPPA_BOARD_HP715_80:
+ case HPPA_BOARD_HP715_64:
+ case HPPA_BOARD_HP715_100:
+ case HPPA_BOARD_HP715_100XC:
+ case HPPA_BOARD_HP725_100:
+ case HPPA_BOARD_HP725_120:
+ case HPPA_BOARD_HP715_100L:
+ case HPPA_BOARD_HP715_120L:
+ case HPPA_BOARD_HP725_80L:
+ case HPPA_BOARD_HP725_100L:
+ case HPPA_BOARD_HP725_120L:
+ case HPPA_BOARD_HP743_50:
+ case HPPA_BOARD_HP743_100:
+ case HPPA_BOARD_HP715_80M:
+ case HPPA_BOARD_HP811:
+ case HPPA_BOARD_HP801:
+ case HPPA_BOARD_HP743T:
+ pdc_type = PDC_TYPE_SNAKE;
+ break;
+
+ default:
+ pdc_type = PDC_TYPE_UNKNOWN;
+ }
+}
+
+enum pdc_type
+pdc_gettype(void)
+{
+
+ return pdc_type;
+}
+
int
pdcmatch(device_t parent, cfdata_t cf, void *aux)
{
Index: src/sys/arch/hp700/dev/phantomas.c
diff -u src/sys/arch/hp700/dev/phantomas.c:1.7 src/sys/arch/hp700/dev/phantomas.c:1.8
--- src/sys/arch/hp700/dev/phantomas.c:1.7 Tue Nov 3 05:07:25 2009
+++ src/sys/arch/hp700/dev/phantomas.c Thu Jan 13 21:15:14 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: phantomas.c,v 1.7 2009/11/03 05:07:25 snj Exp $ */
+/* $NetBSD: phantomas.c,v 1.8 2011/01/13 21:15:14 skrll Exp $ */
/* $OpenBSD: phantomas.c,v 1.1 2002/12/18 23:52:45 mickey Exp $ */
/*
@@ -42,7 +42,7 @@
int phantomasmatch(device_t, cfdata_t, void *);
void phantomasattach(device_t, device_t, void *);
-static void phantomas_callback(device_t self, struct confargs *ca);
+static device_t phantomas_callback(device_t self, struct confargs *ca);
CFATTACH_DECL_NEW(phantomas, sizeof(struct phantomas_softc),
phantomasmatch, phantomasattach, NULL, NULL);
@@ -74,9 +74,9 @@
pdc_scanbus(self, &nca, phantomas_callback);
}
-static void
+static device_t
phantomas_callback(device_t self, struct confargs *ca)
{
- config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
+ return config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
}
Index: src/sys/arch/hp700/dev/uturn.c
diff -u src/sys/arch/hp700/dev/uturn.c:1.13 src/sys/arch/hp700/dev/uturn.c:1.14
--- src/sys/arch/hp700/dev/uturn.c:1.13 Sun Dec 12 08:23:14 2010
+++ src/sys/arch/hp700/dev/uturn.c Thu Jan 13 21:15:14 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: uturn.c,v 1.13 2010/12/12 08:23:14 skrll Exp $ */
+/* $NetBSD: uturn.c,v 1.14 2011/01/13 21:15:14 skrll Exp $ */
/* $OpenBSD: uturn.c,v 1.6 2007/12/29 01:26:14 kettenis Exp $ */
@@ -112,7 +112,7 @@
int uturnmatch(device_t, cfdata_t, void *);
void uturnattach(device_t, device_t, void *);
-static void uturn_callback(device_t self, struct confargs *ca);
+static device_t uturn_callback(device_t self, struct confargs *ca);
CFATTACH_DECL_NEW(uturn, sizeof(struct uturn_softc),
uturnmatch, uturnattach, NULL, NULL);
@@ -201,36 +201,19 @@
* it always is module 63, hence the MAXMODBUS - 1 below.
*/
nca = *ca;
- nca.ca_hpabase = 0;
+ nca.ca_hpabase = r->io_io_low << 16;
nca.ca_dmatag = &sc->sc_dmatag;
nca.ca_nmodules = MAXMODBUS - 1;
pdc_scanbus(self, &nca, uturn_callback);
- /* XXX On some machines, PDC doesn't tell us about all devices. */
- switch (cpu_modelno) {
- case HPPA_BOARD_HP809:
- case HPPA_BOARD_HP819:
- case HPPA_BOARD_HP829:
- case HPPA_BOARD_HP839:
- case HPPA_BOARD_HP849:
- case HPPA_BOARD_HP859:
- case HPPA_BOARD_HP869:
-
- case HPPA_BOARD_HP800D:
- case HPPA_BOARD_HP821:
- nca.ca_hpabase = r->io_io_low << 16;
- pdc_scanbus(self, &nca, uturn_callback);
- break;
- default:
- break;
- }
}
-static void
+static device_t
uturn_callback(device_t self, struct confargs *ca)
{
- config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
+ return config_found_sm_loc(self, "gedoens", NULL, ca, mbprint,
+ mbsubmatch);
}
Index: src/sys/arch/hp700/gsc/gscbus.c
diff -u src/sys/arch/hp700/gsc/gscbus.c:1.20 src/sys/arch/hp700/gsc/gscbus.c:1.21
--- src/sys/arch/hp700/gsc/gscbus.c:1.20 Sun Dec 5 12:19:09 2010
+++ src/sys/arch/hp700/gsc/gscbus.c Thu Jan 13 21:15:14 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: gscbus.c,v 1.20 2010/12/05 12:19:09 skrll Exp $ */
+/* $NetBSD: gscbus.c,v 1.21 2011/01/13 21:15:14 skrll Exp $ */
/* $OpenBSD: gscbus.c,v 1.13 2001/08/01 20:32:04 miod Exp $ */
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: gscbus.c,v 1.20 2010/12/05 12:19:09 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: gscbus.c,v 1.21 2011/01/13 21:15:14 skrll Exp $");
#define GSCDEBUG
@@ -106,8 +106,8 @@
* to fix up the module's attach arguments, then we match
* and attach it.
*/
-static void gsc_module_callback(device_t, struct confargs *);
-static void
+static device_t gsc_module_callback(device_t, struct confargs *);
+static device_t
gsc_module_callback(device_t self, struct confargs *ca)
{
struct gsc_softc *sc = device_private(self);
@@ -120,7 +120,7 @@
ga.ga_dmatag = sc->sc_ga.ga_dmatag;
(*sc->sc_ga.ga_fix_args)(sc->sc_ga.ga_fix_args_cookie, &ga);
- config_found_sm_loc(self, "gsc", NULL, &ga, mbprint, mbsubmatch);
+ return config_found_sm_loc(self, "gsc", NULL, &ga, mbprint, mbsubmatch);
}
int
Index: src/sys/arch/hp700/hp700/autoconf.c
diff -u src/sys/arch/hp700/hp700/autoconf.c:1.35 src/sys/arch/hp700/hp700/autoconf.c:1.36
--- src/sys/arch/hp700/hp700/autoconf.c:1.35 Tue Jan 4 10:42:34 2011
+++ src/sys/arch/hp700/hp700/autoconf.c Thu Jan 13 21:15:14 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.c,v 1.35 2011/01/04 10:42:34 skrll Exp $ */
+/* $NetBSD: autoconf.c,v 1.36 2011/01/13 21:15:14 skrll Exp $ */
/* $OpenBSD: autoconf.c,v 1.15 2001/06/25 00:43:10 mickey Exp $ */
@@ -86,7 +86,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.35 2011/01/04 10:42:34 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.36 2011/01/13 21:15:14 skrll Exp $");
#include "opt_kgdb.h"
#include "opt_useleds.h"
@@ -100,6 +100,7 @@
#include <sys/reboot.h>
#include <sys/device.h>
#include <sys/callout.h>
+#include <sys/kmem.h>
#ifdef KGDB
#include <sys/kgdb.h>
@@ -127,6 +128,23 @@
PSW_C | /* Instruction Address Translation Enable */
PSW_D; /* Data Address Translation Enable */
+static TAILQ_HEAD(hppa_pdcmodule_head, hppa_pdcmodule) hppa_pdcmodule_list =
+ TAILQ_HEAD_INITIALIZER(hppa_pdcmodule_list);
+
+struct hppa_pdcmodule {
+ TAILQ_ENTRY(hppa_pdcmodule) hm_link;
+ bool hm_registered;
+ struct pdc_iodc_read hm_pir;
+ struct iodc_data hm_type;
+ struct device_path hm_dp;
+ hppa_hpa_t hm_hpa;
+ u_int hm_hpasz;
+ u_int hm_naddrs; /* only PDC_SYSTEM_MAP */
+ u_int hm_modindex; /* only PDC_SYSTEM_MAP */
+};
+
+#define HPPA_SYSTEMMAPMODULES 256
+
/*
* LED blinking thing
*/
@@ -139,6 +157,12 @@
void (*cold_hook)(int); /* see below */
+struct hppa_pdcmodule *hppa_pdcmodule_create(struct hppa_pdcmodule *,
+ const char *);
+void hppa_walkbus(struct confargs *ca);
+static void hppa_pdc_snake_scan(void);
+static void hppa_pdc_system_map_scan(void);
+
/*
* cpu_configure:
* called at boot time, configure all devices on system
@@ -458,113 +482,160 @@
/*static struct device fakerdrootdev = { DV_DISK, {}, NULL, 0, "rd0", NULL };*/
#endif
-static struct pdc_memmap pdc_memmap;
-static struct pdc_system_map_find_mod pdc_find_mod;
-static struct pdc_system_map_find_addr pdc_find_addr;
-
void
-pdc_scanbus(device_t self, struct confargs *ca,
- void (*callback)(device_t, struct confargs *))
+hppa_walkbus(struct confargs *ca)
{
+ struct hppa_pdcmodule nhm, *hm;
int i;
+ if (ca->ca_hpabase == 0)
+ return;
+
+ aprint_verbose(">> Walking bus at HPA 0x%lx\n", ca->ca_hpabase);
+
for (i = 0; i < ca->ca_nmodules; i++) {
- struct confargs nca;
+ int error;
+
+ memset(&nhm, 0, sizeof(nhm));
+ nhm.hm_dp.dp_bc[0] = ca->ca_dp.dp_bc[1];
+ nhm.hm_dp.dp_bc[1] = ca->ca_dp.dp_bc[2];
+ nhm.hm_dp.dp_bc[2] = ca->ca_dp.dp_bc[3];
+ nhm.hm_dp.dp_bc[3] = ca->ca_dp.dp_bc[4];
+ nhm.hm_dp.dp_bc[4] = ca->ca_dp.dp_bc[5];
+ nhm.hm_dp.dp_bc[5] = ca->ca_dp.dp_mod;
+ nhm.hm_hpa = ca->ca_hpabase + IOMOD_HPASIZE * i;
+ nhm.hm_hpasz = 0;
+ nhm.hm_dp.dp_mod = i;
+ nhm.hm_naddrs = 0;
+
+ error = pdcproc_iodc_read(nhm.hm_hpa, IODC_DATA, NULL,
+ &nhm.hm_pir, sizeof(nhm.hm_pir), &nhm.hm_type,
+ sizeof(nhm.hm_type));
+ if (error < 0)
+ continue;
+
+ aprint_verbose(">> HPA 0x%lx[0x%x]", nhm.hm_hpa,
+ nhm.hm_hpasz);
+
+ TAILQ_FOREACH(hm, &hppa_pdcmodule_list, hm_link) {
+ if (nhm.hm_hpa == hm->hm_hpa) {
+ aprint_verbose(" found by firmware\n");
+ break;
+ }
+ }
+
+ /* If we've found the module move onto the next one. */
+ if (hm) {
+ aprint_verbose("\n");
+ continue;
+ }
+
+ /* Expect PDC to report devices of the following types */
+ if (nhm.hm_type.iodc_type == HPPA_TYPE_FIO) {
+ aprint_verbose(" expected to be missing\n");
+ continue;
+ }
+
+ hppa_pdcmodule_create(&nhm, "Bus walk");
+ }
+}
+
+void
+pdc_scanbus(device_t self, struct confargs *ca,
+ device_t (*callback)(device_t, struct confargs *))
+{
+ struct hppa_pdcmodule *hm;
+ struct confargs nca;
+ device_t dev;
+ int ia;
+
+ hppa_walkbus(ca);
+
+ TAILQ_FOREACH(hm, &hppa_pdcmodule_list, hm_link) {
char buf[128];
int error;
+ if (hm->hm_registered)
+ continue;
+
+ if (!(hm->hm_dp.dp_bc[0] == ca->ca_dp.dp_bc[1] &&
+ hm->hm_dp.dp_bc[1] == ca->ca_dp.dp_bc[2] &&
+ hm->hm_dp.dp_bc[2] == ca->ca_dp.dp_bc[3] &&
+ hm->hm_dp.dp_bc[3] == ca->ca_dp.dp_bc[4] &&
+ hm->hm_dp.dp_bc[4] == ca->ca_dp.dp_bc[5] &&
+ hm->hm_dp.dp_bc[5] == ca->ca_dp.dp_mod))
+ continue;
+
memset(&nca, 0, sizeof(nca));
nca.ca_iot = ca->ca_iot;
nca.ca_dmatag = ca->ca_dmatag;
- nca.ca_dp.dp_bc[0] = ca->ca_dp.dp_bc[1];
- nca.ca_dp.dp_bc[1] = ca->ca_dp.dp_bc[2];
- nca.ca_dp.dp_bc[2] = ca->ca_dp.dp_bc[3];
- nca.ca_dp.dp_bc[3] = ca->ca_dp.dp_bc[4];
- nca.ca_dp.dp_bc[4] = ca->ca_dp.dp_bc[5];
- nca.ca_dp.dp_bc[5] = ca->ca_dp.dp_mod;
- nca.ca_dp.dp_mod = i;
- nca.ca_naddrs = 0;
- nca.ca_hpa = 0;
-
- if (ca->ca_hpabase) {
- nca.ca_hpa = ca->ca_hpabase + IOMOD_HPASIZE * i;
- nca.ca_dp.dp_mod = i;
- } else if ((error = pdcproc_memmap(&pdc_memmap,
- &nca.ca_dp)) == 0)
- nca.ca_hpa = pdc_memmap.hpa;
- else if ((error = pdcproc_system_map_trans_path(&pdc_memmap,
- &nca.ca_dp)) == 0) {
- struct device_path path;
- int im, ia;
-
- nca.ca_hpa = pdc_memmap.hpa;
-
- for (im = 0; !(error = pdcproc_system_map_find_mod(
- &pdc_find_mod, &path, im)) &&
- pdc_find_mod.hpa != nca.ca_hpa; im++)
- ;
-
- if (!error)
- nca.ca_hpasz = pdc_find_mod.size << PGSHIFT;
-
- if (!error && pdc_find_mod.naddrs) {
- nca.ca_naddrs = pdc_find_mod.naddrs;
- if (nca.ca_naddrs > HP700_MAXIOADDRS) {
- nca.ca_naddrs = HP700_MAXIOADDRS;
- aprint_error("WARNING: "
- "too many (%d) addrs\n",
- pdc_find_mod.naddrs);
- }
-
- aprint_verbose(">> ADDRS: ");
- for (ia = 0; ia < nca.ca_naddrs; ia++) {
- error = pdcproc_system_map_find_addr(
- &pdc_find_addr, im, ia + 1);
- if (error)
- break;
- nca.ca_addrs[ia].addr =
- pdc_find_addr.hpa;
- nca.ca_addrs[ia].size =
- pdc_find_addr.size << PGSHIFT;
-
- aprint_verbose(" 0x%lx[0x%x]",
- nca.ca_addrs[ia].addr,
- nca.ca_addrs[ia].size);
- }
- aprint_verbose("\n");
+ nca.ca_pir = hm->hm_pir;
+ nca.ca_type = hm->hm_type;
+ nca.ca_hpa = hm->hm_hpa;
+ nca.ca_dp = hm->hm_dp;
+ nca.ca_hpa = hm->hm_hpa;
+ nca.ca_hpasz = hm->hm_hpasz;
+
+ if (hm->hm_naddrs) {
+ if (hm->hm_naddrs > HP700_MAXIOADDRS) {
+ nca.ca_naddrs = HP700_MAXIOADDRS;
+ aprint_error("WARNING: too many (%d) addrs\n",
+ hm->hm_naddrs);
+ } else
+ nca.ca_naddrs = hm->hm_naddrs;
+
+ aprint_verbose(">> ADDRS[%d/%d]: ", nca.ca_naddrs,
+ hm->hm_modindex);
+
+ KASSERT(hm->hm_modindex != -1);
+ for (ia = 0; ia < nca.ca_naddrs; ia++) {
+ struct pdc_system_map_find_addr pdc_find_addr;
+
+ error = pdcproc_system_map_find_addr(
+ &pdc_find_addr, hm->hm_modindex, ia + 1);
+ if (error < 0)
+ break;
+ nca.ca_addrs[ia].addr = pdc_find_addr.hpa;
+ nca.ca_addrs[ia].size =
+ pdc_find_addr.size << PGSHIFT;
+
+ aprint_verbose(" 0x%lx[0x%x]",
+ nca.ca_addrs[ia].addr,
+ nca.ca_addrs[ia].size);
}
+ aprint_verbose("\n");
}
- if (!nca.ca_hpa)
- continue;
-
aprint_verbose(">> HPA 0x%lx[0x%x]\n", nca.ca_hpa,
nca.ca_hpasz);
- if ((error = pdcproc_iodc_read(nca.ca_hpa, IODC_DATA, NULL,
- &nca.ca_pir, sizeof(nca.ca_pir),
- &nca.ca_type, sizeof(nca.ca_type))) < 0) {
- aprint_verbose(">> iodc_data error %d\n", error);
- continue;
+ snprintb(buf, sizeof(buf), PZF_BITS, nca.ca_dp.dp_flags);
+ aprint_verbose(">> probing: flags %s ", buf);
+ if (nca.ca_dp.dp_mod >=0) {
+ int n;
+
+ aprint_verbose(" path ");
+ for (n = 0; n < 6; n++) {
+ if (nca.ca_dp.dp_bc[n] >= 0)
+ aprint_verbose("%d/",
+ nca.ca_dp.dp_bc[n]);
+ }
+ aprint_verbose("%d", nca.ca_dp.dp_mod);
}
- snprintb(buf, sizeof(buf), PZF_BITS, nca.ca_dp.dp_flags);
- aprint_verbose(">> probing: flags %s bc %d/%d/%d/%d/%d/%d ",
- buf,
- nca.ca_dp.dp_bc[0], nca.ca_dp.dp_bc[1],
- nca.ca_dp.dp_bc[2], nca.ca_dp.dp_bc[3],
- nca.ca_dp.dp_bc[4], nca.ca_dp.dp_bc[5]);
- aprint_verbose("mod %x hpa %lx type %x sv %x\n",
- nca.ca_dp.dp_mod, nca.ca_hpa,
+ aprint_verbose(" type %x sv %x\n",
nca.ca_type.iodc_type, nca.ca_type.iodc_sv_model);
nca.ca_irq = HP700CF_IRQ_UNDEF;
nca.ca_name = hppa_mod_info(nca.ca_type.iodc_type,
nca.ca_type.iodc_sv_model);
- (*callback)(self, &nca);
- }
+ dev = callback(self, &nca);
+ if (dev)
+ hm->hm_registered = true;
+
+ }
}
static const struct hppa_mod_info hppa_knownmods[] = {
@@ -586,3 +657,203 @@
} else
return mi->mi_name;
}
+
+/*
+ * Create the device on our device list. Keep the devices in order. */
+struct hppa_pdcmodule *
+hppa_pdcmodule_create(struct hppa_pdcmodule *hm, const char *who)
+{
+ struct hppa_pdcmodule *nhm, *ahm;
+ int i;
+
+ nhm = kmem_zalloc(sizeof(*nhm), KM_SLEEP);
+
+ nhm->hm_registered = false;
+ nhm->hm_type = hm->hm_type;
+ nhm->hm_dp = hm->hm_dp;
+ nhm->hm_hpa = hm->hm_hpa;
+ nhm->hm_hpasz = hm->hm_hpasz;
+ nhm->hm_naddrs = hm->hm_naddrs;
+ nhm->hm_modindex = hm->hm_modindex;
+
+ /* Find start of new path */
+ for (i = 0; i < 6; i++) {
+ if (hm->hm_dp.dp_bc[i] != -1)
+ break;
+ }
+
+ /*
+ * Look, in reverse, for the first device that has a path before our
+ * new one. In reverse because PDC reports most (all?) devices in path
+ * order and therefore the common case is to add to the end of the
+ * list.
+ */
+ TAILQ_FOREACH_REVERSE(ahm, &hppa_pdcmodule_list, hppa_pdcmodule_head,
+ hm_link) {
+ int check;
+ int j, k;
+
+ for (j = 0; j < 6; j++) {
+ if (ahm->hm_dp.dp_bc[j] != -1)
+ break;
+ }
+
+ for (check = 0, k = i; j < 7 && k < 7; j++, k++) {
+ char nid, aid;
+
+ nid = (k == 6) ? hm->hm_dp.dp_mod : hm->hm_dp.dp_bc[k];
+ aid = (j == 6) ? ahm->hm_dp.dp_mod : ahm->hm_dp.dp_bc[j];
+
+ if (nid == aid)
+ continue;
+ check = nid - aid;
+ break;
+ }
+ if (check >= 0)
+ break;
+ else if (check < 0)
+ continue;
+ }
+ if (ahm == NULL)
+ TAILQ_INSERT_HEAD(&hppa_pdcmodule_list, nhm, hm_link);
+ else
+ TAILQ_INSERT_AFTER(&hppa_pdcmodule_list, ahm, nhm, hm_link);
+
+ if (hm->hm_dp.dp_mod >= 0) {
+ int n;
+
+ aprint_verbose(">> %s device at path ", who);
+ for (n = 0; n < 6; n++) {
+ if (hm->hm_dp.dp_bc[n] >= 0)
+ aprint_verbose("%d/", hm->hm_dp.dp_bc[n]);
+ }
+ aprint_verbose("%d addrs %d\n", hm->hm_dp.dp_mod,
+ hm->hm_naddrs);
+ }
+
+ return nhm;
+}
+
+/*
+ * This is used for Snake machines
+ */
+static struct hppa_pdcmodule *
+hppa_memmap_query(struct device_path *devp)
+{
+ static struct hppa_pdcmodule nhm;
+ struct pdc_memmap pdc_memmap;
+ int error;
+
+ error = pdcproc_memmap(&pdc_memmap, devp);
+
+ if (error < 0)
+ return NULL;
+
+ memset(&nhm, 0, sizeof(nhm));
+ nhm.hm_dp = *devp;
+ nhm.hm_hpa = pdc_memmap.hpa;
+ nhm.hm_hpasz = pdc_memmap.morepages;
+ nhm.hm_naddrs = 0;
+ nhm.hm_modindex = -1;
+
+ error = pdcproc_iodc_read(nhm.hm_hpa, IODC_DATA, NULL, &nhm.hm_pir,
+ sizeof(nhm.hm_pir), &nhm.hm_type, sizeof(nhm.hm_type));
+
+ if (error < 0)
+ return NULL;
+
+ return hppa_pdcmodule_create(&nhm, "PDC (memmap)");
+}
+
+
+static void
+hppa_pdc_snake_scan(void)
+{
+ struct device_path path;
+ struct hppa_pdcmodule *hm;
+ int im, ba;
+
+ memset(&path, 0, sizeof(path));
+ for (im = 0; im < 16; im++) {
+ path.dp_bc[0] = path.dp_bc[1] = path.dp_bc[2] =
+ path.dp_bc[3] = path.dp_bc[4] = path.dp_bc[5] = -1;
+ path.dp_mod = im;
+
+ hm = hppa_memmap_query(&path);
+
+ if (!hm)
+ continue;
+
+ if (hm->hm_type.iodc_type != HPPA_TYPE_BHA)
+ continue;
+
+ path.dp_bc[0] = path.dp_bc[1] =
+ path.dp_bc[2] = path.dp_bc[3] = -1;
+ path.dp_bc[4] = im;
+ path.dp_bc[5] = 0;
+
+ for (ba = 0; ba < 16; ba++) {
+ path.dp_mod = ba;
+ hppa_memmap_query(&path);
+ }
+ }
+}
+
+static void
+hppa_pdc_system_map_scan(void)
+{
+ struct pdc_system_map_find_mod pdc_find_mod;
+ struct device_path path;
+ struct hppa_pdcmodule hm;
+ int error;
+ int im;
+
+ for (im = 0; im < HPPA_SYSTEMMAPMODULES; im++) {
+ memset(&path, 0, sizeof(path));
+ error = pdcproc_system_map_find_mod(&pdc_find_mod, &path, im);
+ if (error == PDC_ERR_NMOD)
+ break;
+
+ if (error < 0)
+ continue;
+
+ memset(&hm, 0, sizeof(hm));
+ hm.hm_dp = path;
+ hm.hm_hpa = pdc_find_mod.hpa;
+ hm.hm_hpasz = pdc_find_mod.size << PGSHIFT;
+ hm.hm_naddrs = pdc_find_mod.naddrs;
+ hm.hm_modindex = im;
+
+ error = pdcproc_iodc_read(hm.hm_hpa, IODC_DATA, NULL,
+ &hm.hm_pir, sizeof(hm.hm_pir), &hm.hm_type,
+ sizeof(hm.hm_type));
+ if (error < 0)
+ continue;
+
+ hppa_pdcmodule_create(&hm, "PDC (system map)");
+ }
+}
+
+void
+hppa_modules_scan(void)
+{
+ switch (pdc_gettype()) {
+ case PDC_TYPE_SNAKE:
+ hppa_pdc_snake_scan();
+ break;
+
+ case PDC_TYPE_UNKNOWN:
+ hppa_pdc_system_map_scan();
+ }
+}
+
+void
+hppa_modules_done(void)
+{
+ struct hppa_pdcmodule *hm, *nhm;
+
+ TAILQ_FOREACH_SAFE(hm, &hppa_pdcmodule_list, hm_link, nhm) {
+ TAILQ_REMOVE(&hppa_pdcmodule_list, hm, hm_link);
+ kmem_free(hm, sizeof(*hm));
+ }
+}
Index: src/sys/arch/hp700/hp700/machdep.c
diff -u src/sys/arch/hp700/hp700/machdep.c:1.95 src/sys/arch/hp700/hp700/machdep.c:1.96
--- src/sys/arch/hp700/hp700/machdep.c:1.95 Tue Jan 4 10:42:34 2011
+++ src/sys/arch/hp700/hp700/machdep.c Thu Jan 13 21:15:15 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: machdep.c,v 1.95 2011/01/04 10:42:34 skrll Exp $ */
+/* $NetBSD: machdep.c,v 1.96 2011/01/13 21:15:15 skrll Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.95 2011/01/04 10:42:34 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.96 2011/01/13 21:15:15 skrll Exp $");
#include "opt_cputype.h"
#include "opt_ddb.h"
@@ -658,6 +658,7 @@
#ifdef DEBUG
printf("%s: model %s\n", __func__, model);
#endif
+ pdc_settype(cpu_modelno);
memset(&pdc_cpuid, 0, sizeof(pdc_cpuid));
error = pdcproc_model_cpuid(&pdc_cpuid);
Index: src/sys/arch/hp700/hp700/mainbus.c
diff -u src/sys/arch/hp700/hp700/mainbus.c:1.75 src/sys/arch/hp700/hp700/mainbus.c:1.76
--- src/sys/arch/hp700/hp700/mainbus.c:1.75 Tue Jan 4 10:42:34 2011
+++ src/sys/arch/hp700/hp700/mainbus.c Thu Jan 13 21:15:15 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: mainbus.c,v 1.75 2011/01/04 10:42:34 skrll Exp $ */
+/* $NetBSD: mainbus.c,v 1.76 2011/01/13 21:15:15 skrll Exp $ */
/*-
* Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.75 2011/01/04 10:42:34 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.76 2011/01/13 21:15:15 skrll Exp $");
#include "locators.h"
#include "power.h"
@@ -1333,22 +1333,24 @@
return 1;
}
-static void
+static device_t
mb_module_callback(device_t self, struct confargs *ca)
{
if (ca->ca_type.iodc_type == HPPA_TYPE_NPROC ||
ca->ca_type.iodc_type == HPPA_TYPE_MEMORY)
- return;
- config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
+ return NULL;
+
+ return config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
}
-static void
+static device_t
mb_cpu_mem_callback(device_t self, struct confargs *ca)
{
- if ((ca->ca_type.iodc_type == HPPA_TYPE_NPROC ||
- ca->ca_type.iodc_type == HPPA_TYPE_MEMORY))
- config_found_sm_loc(self, "gedoens", NULL, ca, mbprint,
- mbsubmatch);
+ if ((ca->ca_type.iodc_type != HPPA_TYPE_NPROC &&
+ ca->ca_type.iodc_type != HPPA_TYPE_MEMORY))
+ return NULL;
+
+ return config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
}
void
@@ -1357,7 +1359,6 @@
struct mainbus_softc *sc = device_private(self);
struct confargs nca;
bus_space_handle_t ioh;
- hppa_hpa_t hpabase;
hppa_hpa_t prochpa;
int err;
@@ -1427,48 +1428,13 @@
}
#endif
- switch (cpu_modelno) {
- case HPPA_BOARD_HPE23:
- case HPPA_BOARD_HPE25:
- case HPPA_BOARD_HPE35:
- case HPPA_BOARD_HPE45:
-
- case HPPA_BOARD_HP809:
- case HPPA_BOARD_HP819:
- case HPPA_BOARD_HP829:
- case HPPA_BOARD_HP839:
- case HPPA_BOARD_HP849:
- case HPPA_BOARD_HP859:
- case HPPA_BOARD_HP869:
-#if 0
- case HPPA_BOARD_HP770_J200:
- case HPPA_BOARD_HP770_J210:
- case HPPA_BOARD_HP770_J210XC:
- case HPPA_BOARD_HP780_J282:
- case HPPA_BOARD_HP782_J2240:
-#endif
- case HPPA_BOARD_HP780_C160:
- case HPPA_BOARD_HP780_C180P:
- case HPPA_BOARD_HP780_C180XP:
- case HPPA_BOARD_HP780_C200:
- case HPPA_BOARD_HP780_C230:
- case HPPA_BOARD_HP780_C240:
- case HPPA_BOARD_HP785_C360:
-
- case HPPA_BOARD_HP800D:
- case HPPA_BOARD_HP821:
- hpabase = HPPA_FPA;
- break;
- default:
- hpabase = 0;
- break;
- }
+ hppa_modules_scan();
/* Search and attach all CPUs and memory controllers. */
memset(&nca, 0, sizeof(nca));
nca.ca_name = "mainbus";
nca.ca_hpa = 0;
- nca.ca_hpabase = hpabase;
+ nca.ca_hpabase = HPPA_FPA; /* Central bus */
nca.ca_nmodules = MAXMODBUS;
nca.ca_irq = HP700CF_IRQ_UNDEF;
nca.ca_iot = &hppa_bustag;
@@ -1482,7 +1448,7 @@
memset(&nca, 0, sizeof(nca));
nca.ca_name = "mainbus";
nca.ca_hpa = 0;
- nca.ca_hpabase = hpabase;
+ nca.ca_hpabase = 0; /* Central bus already walked above */
nca.ca_nmodules = MAXMODBUS;
nca.ca_irq = HP700CF_IRQ_UNDEF;
nca.ca_iot = &hppa_bustag;
@@ -1491,6 +1457,8 @@
nca.ca_dp.dp_bc[3] = nca.ca_dp.dp_bc[4] = nca.ca_dp.dp_bc[5] = -1;
nca.ca_dp.dp_mod = -1;
pdc_scanbus(self, &nca, mb_module_callback);
+
+ hppa_modules_done();
}
/*
Index: src/sys/arch/hp700/include/autoconf.h
diff -u src/sys/arch/hp700/include/autoconf.h:1.16 src/sys/arch/hp700/include/autoconf.h:1.17
--- src/sys/arch/hp700/include/autoconf.h:1.16 Wed Jan 5 07:40:16 2011
+++ src/sys/arch/hp700/include/autoconf.h Thu Jan 13 21:15:16 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: autoconf.h,v 1.16 2011/01/05 07:40:16 skrll Exp $ */
+/* $NetBSD: autoconf.h,v 1.17 2011/01/13 21:15:16 skrll Exp $ */
/* $OpenBSD: autoconf.h,v 1.10 2001/05/05 22:33:42 art Exp $ */
@@ -58,7 +58,7 @@
bus_dma_tag_t ca_dmatag; /* DMA tag */
int ca_irq; /* module IRQ */
int ca_naddrs; /* number of valid addr ents */
- hppa_hpa_t ca_hpabase; /* HPA base to use or 0 for PDC */
+ hppa_hpa_t ca_hpabase; /* HPA base to use */
int ca_nmodules; /* check for modules 0 to nmodules - 1 */
};
@@ -82,8 +82,11 @@
const char *hppa_mod_info(int, int);
-void pdc_scanbus(device_t, struct confargs *,
- void (*)(device_t, struct confargs *));
+void hppa_modules_scan(void);
+void hppa_modules_done(void);
+
+void pdc_scanbus(device_t, struct confargs *,
+ device_t (*)(device_t, struct confargs *));
int mbprint(void *, const char *);
int mbsubmatch(device_t, struct cfdata *, const int *, void *);
Index: src/sys/arch/hp700/include/iomod.h
diff -u src/sys/arch/hp700/include/iomod.h:1.8 src/sys/arch/hp700/include/iomod.h:1.9
--- src/sys/arch/hp700/include/iomod.h:1.8 Fri Apr 23 15:04:09 2010
+++ src/sys/arch/hp700/include/iomod.h Thu Jan 13 21:15:16 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: iomod.h,v 1.8 2010/04/23 15:04:09 skrll Exp $ */
+/* $NetBSD: iomod.h,v 1.9 2011/01/13 21:15:16 skrll Exp $ */
/* $OpenBSD: iomod.h,v 1.18 2007/10/20 16:41:45 miod Exp $ */
@@ -356,6 +356,10 @@
u_int hvrs[512]; /* HVRSes (HVERSION-dependent Register Sets) */
};
+
+#define IOMOD_IO_IO_LOW(mod) (((struct iomod *)(mod))->io_io_low)
+#define IOMOD_IO_IO_HIGH(mod) (((struct iomod *)(mod))->io_io_high)
+
#endif /* !_LOCORE */
/* primarily for a "reboot" and "_rtt" routines */
Index: src/sys/arch/hp700/include/pdc.h
diff -u src/sys/arch/hp700/include/pdc.h:1.17 src/sys/arch/hp700/include/pdc.h:1.18
--- src/sys/arch/hp700/include/pdc.h:1.17 Tue Jan 4 10:42:34 2011
+++ src/sys/arch/hp700/include/pdc.h Thu Jan 13 21:15:16 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: pdc.h,v 1.17 2011/01/04 10:42:34 skrll Exp $ */
+/* $NetBSD: pdc.h,v 1.18 2011/01/13 21:15:16 skrll Exp $ */
/* $OpenBSD: pdc.h,v 1.35 2007/07/15 20:03:48 kettenis Exp $ */
@@ -755,7 +755,15 @@
extern int kernelmapped;
+enum pdc_type {
+ PDC_TYPE_UNKNOWN,
+ PDC_TYPE_SNAKE
+};
+
void pdc_init(void);
+void pdc_settype(int);
+enum pdc_type pdc_gettype(void);
+
int pdc_call(iodcio_t, int, ...);
void pdccnprobe(struct consdev *);