summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormickey <mickey@openbsd.org>2005-05-22 01:38:09 +0000
committermickey <mickey@openbsd.org>2005-05-22 01:38:09 +0000
commit0da4e2f008b922412843c24bb3ee77582c2f3d5b (patch)
tree7d0cd56fc8dccb5c14a91c045e37fce5fef7528c
parentCheck if the scsi_request has been released in the COMPLETE case as (diff)
downloadwireguard-openbsd-0da4e2f008b922412843c24bb3ee77582c2f3d5b.tar.xz
wireguard-openbsd-0da4e2f008b922412843c24bb3ee77582c2f3d5b.zip
devices scan for the early new hppa64 machines.
match on product id as well as names in correspondent drivers. chain pluto later in case it shows up too early...
-rw-r--r--sys/arch/hppa64/dev/cpu.c10
-rw-r--r--sys/arch/hppa64/dev/elroy.c14
-rw-r--r--sys/arch/hppa64/dev/mem.c12
-rw-r--r--sys/arch/hppa64/dev/pluto.c35
-rw-r--r--sys/arch/hppa64/hppa64/autoconf.c56
-rw-r--r--sys/arch/hppa64/hppa64/mainbus.c5
-rw-r--r--sys/arch/hppa64/include/autoconf.h5
7 files changed, 102 insertions, 35 deletions
diff --git a/sys/arch/hppa64/dev/cpu.c b/sys/arch/hppa64/dev/cpu.c
index a4ce15560e2..f57c4b619b4 100644
--- a/sys/arch/hppa64/dev/cpu.c
+++ b/sys/arch/hppa64/dev/cpu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */
+/* $OpenBSD: cpu.c,v 1.2 2005/05/22 01:38:09 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -56,10 +56,12 @@ cpumatch(parent, cfdata, aux)
struct confargs *ca = aux;
/* struct cfdata *cf = cfdata; */
- if (strcmp(ca->ca_name, "cpu"))
- return 0;
+ if ((ca->ca_name && !strcmp(ca->ca_name, "cpu")) ||
+ (ca->ca_type.iodc_type == HPPA_TYPE_NPROC &&
+ ca->ca_type.iodc_sv_model == HPPA_NPROC_HPPA))
+ return 1;
- return 1;
+ return 0;
}
int
diff --git a/sys/arch/hppa64/dev/elroy.c b/sys/arch/hppa64/dev/elroy.c
index 9f7d3f6b6b4..36538cdfd00 100644
--- a/sys/arch/hppa64/dev/elroy.c
+++ b/sys/arch/hppa64/dev/elroy.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: elroy.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */
+/* $OpenBSD: elroy.c,v 1.2 2005/05/22 01:38:09 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -29,6 +29,8 @@
#include <machine/iomod.h>
#include <machine/autoconf.h>
+#include <arch/hppa/dev/cpudevs.h>
+
#if NCARDBUS > 0
#include <dev/cardbus/rbus.h>
#endif
@@ -68,10 +70,13 @@ elroymatch(parent, cfdata, aux)
struct confargs *ca = aux;
/* struct cfdata *cf = cfdata; */
- if (strcmp(ca->ca_name, "lba"))
- return (0);
+ if ((ca->ca_name && !strcmp(ca->ca_name, "lba")) ||
+ (ca->ca_type.iodc_type == HPPA_TYPE_BRIDGE &&
+ ca->ca_type.iodc_sv_model == HPPA_BRIDGE_DINO &&
+ ca->ca_type.iodc_model == 0x78))
+ return (1);
- return (1);
+ return (0);
}
void
@@ -1141,6 +1146,7 @@ elroyattach(parent, self, aux)
printf(": %s TR%d.%d%s", p, sc->sc_ver >> 4, sc->sc_ver & 0xf, q);
apic_attach(sc);
+ printf("\n");
/* TODO reserve elroy's pci space ? */
diff --git a/sys/arch/hppa64/dev/mem.c b/sys/arch/hppa64/dev/mem.c
index 4b6fcc17fe0..484a94c6ab5 100644
--- a/sys/arch/hppa64/dev/mem.c
+++ b/sys/arch/hppa64/dev/mem.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mem.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */
+/* $OpenBSD: mem.c,v 1.2 2005/05/22 01:38:09 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -82,6 +82,8 @@
#include <machine/autoconf.h>
#include <machine/pmap.h>
+#include <arch/hppa/dev/cpudevs.h>
+
struct mem_softc {
struct device sc_dev;
};
@@ -107,10 +109,12 @@ memmatch(parent, cfdata, aux)
{
struct confargs *ca = aux;
- if (strcmp(ca->ca_name, "memory"))
- return 0;
+ if ((ca->ca_name && !strcmp(ca->ca_name, "memory")) ||
+ (ca->ca_type.iodc_type == HPPA_TYPE_MEMORY &&
+ ca->ca_type.iodc_sv_model == HPPA_MEMORY_PDEP))
+ return 1;
- return 1;
+ return 0;
}
void
diff --git a/sys/arch/hppa64/dev/pluto.c b/sys/arch/hppa64/dev/pluto.c
index f69dcc0d7a7..e813dc71795 100644
--- a/sys/arch/hppa64/dev/pluto.c
+++ b/sys/arch/hppa64/dev/pluto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pluto.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */
+/* $OpenBSD: pluto.c,v 1.2 2005/05/22 01:38:09 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -28,6 +28,8 @@
#include <machine/autoconf.h>
#include <machine/bus.h>
+#include <arch/hppa/dev/cpudevs.h>
+
struct pluto_regs {
u_int32_t version; /* 0x000: version */
u_int32_t pad00;
@@ -58,7 +60,8 @@ struct pluto_regs {
struct pluto_softc {
struct device sc_dv;
- struct pluto_regs volatile *sc_regs;
+ volatile struct pluto_regs *sc_regs;
+ struct confargs sc_ca;
};
int plutomatch(struct device *, void *, void *);
@@ -68,6 +71,8 @@ struct cfattach plut_ca = {
sizeof(struct pluto_softc), plutomatch, plutoattach
};
+void pluto_scan(struct device *self);
+
struct cfdriver plut_cd = {
NULL, "plut", DV_DULL
};
@@ -81,10 +86,16 @@ plutomatch(parent, cfdata, aux)
struct confargs *ca = aux;
/* struct cfdata *cf = cfdata; */
- if (strcmp(ca->ca_name, "sba"))
- return 0;
+ if ((ca->ca_name && !strcmp(ca->ca_name, "sba")) ||
+ (ca->ca_type.iodc_type == HPPA_TYPE_IOA &&
+ ca->ca_type.iodc_sv_model == HPPA_IOA_PLUTO) ||
+ (ca->ca_type.iodc_type == HPPA_TYPE_IOA &&
+ ca->ca_type.iodc_sv_model == HPPA_IOA_UTURN &&
+ ca->ca_type.iodc_model == 0x58 &&
+ ca->ca_type.iodc_revision >= 0x20))
+ return 1;
- return 1;
+ return 0;
}
void
@@ -93,7 +104,7 @@ plutoattach(parent, self, aux)
struct device *self;
void *aux;
{
- struct confargs *ca = aux, nca;
+ struct confargs *ca = aux;
struct pluto_softc *sc = (struct pluto_softc *)self;
struct pluto_regs volatile *r;
bus_space_handle_t ioh;
@@ -140,6 +151,14 @@ plutoattach(parent, self, aux)
printf(": %s\n", buf);
- nca = *ca; /* clone from us */
- pdc_patscan(self, &nca, 0);
+ sc->sc_ca = *ca; /* clone from us */
+ config_defer(self, &pluto_scan);
+}
+
+void
+pluto_scan(struct device *self)
+{
+ struct pluto_softc *sc = (struct pluto_softc *)self;
+
+ pdc_scan(self, &sc->sc_ca);
}
diff --git a/sys/arch/hppa64/hppa64/autoconf.c b/sys/arch/hppa64/hppa64/autoconf.c
index 3605b9ec49b..e6d35b146bc 100644
--- a/sys/arch/hppa64/hppa64/autoconf.c
+++ b/sys/arch/hppa64/hppa64/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */
+/* $OpenBSD: autoconf.c,v 1.2 2005/05/22 01:38:09 mickey Exp $ */
/*
* Copyright (c) 1998-2005 Michael Shalayeff
@@ -629,6 +629,7 @@ getstr(cp, size)
}
}
+struct pdc_sysmap_find pdc_find PDC_ALIGNMENT;
struct pdc_iodc_read pdc_iodc_read PDC_ALIGNMENT;
struct pdc_pat_cell_id pdc_pat_cell_id PDC_ALIGNMENT;
struct pdc_pat_cell_module pdc_pat_cell_module PDC_ALIGNMENT;
@@ -644,21 +645,54 @@ const char *pat_names[] = {
};
void
-pdc_patscan(struct device *self, struct confargs *ca, int mod)
+pdc_scan(struct device *self, struct confargs *ca)
{
+ struct device_path path;
+ struct confargs nca;
u_long rv[16];
- int i, err;
+ int i, err, mod = ca->ca_mod;
if (pdc_call((iodcio_t)pdc, 0, PDC_PAT_CELL, PDC_PAT_CELL_GETID,
- &pdc_pat_cell_id, 0)) {
- printf("pat_fetch: cannot fetch cell number\n");
- return;
- }
+ &pdc_pat_cell_id, 0))
+ for (i = 0; !(err = pdc_call((iodcio_t)pdc, 0, PDC_SYSMAP,
+ PDC_SYSMAP_FIND, &pdc_find, &path, i)); i++) {
+ if (autoconf_verbose)
+ printf(">> hpa %x/%x dp %d/%d/%d/%d/%d/%d.%d\n",
+ pdc_find.hpa, pdc_find.size,
+ path.dp_bc[0], path.dp_bc[1], path.dp_bc[2],
+ path.dp_bc[3], path.dp_bc[4], path.dp_bc[5],
+ path.dp_mod);
+
+ if (path.dp_bc[5] == mod) {
+ nca = *ca;
+ nca.ca_name = NULL;
+ nca.ca_hpa = 0xffffffff00000000ULL |
+ (hppa_hpa_t)pdc_find.hpa;
+ nca.ca_hpasz = pdc_find.size;
+ nca.ca_mod = path.dp_mod;
+
+ err = pdc_call((iodcio_t)pdc, 0, PDC_IODC,
+ PDC_IODC_READ, &pdc_iodc_read, nca.ca_hpa,
+ IODC_DATA, &nca.ca_type, sizeof(nca.ca_type));
+ if (err < 0 || pdc_iodc_read.size < 8) {
+ if (autoconf_verbose)
+ printf(">> iodc_data error %d\n", err);
+ bzero(&nca.ca_type, sizeof(nca.ca_type));
+ }
+
+ if (autoconf_verbose) {
+ u_int *p = (u_int *)&nca.ca_type;
+ printf(">> iodc_data 0x%08x 0x%08x\n",
+ p[0], p[1]);
+ }
+
+ config_found(self, &nca, mbprint);
+ }
+ }
- i = 0;
- for (i = 0; !pdc_call((iodcio_t)pdc, 0, PDC_PAT_CELL,
+ for (i = 0; !(err = pdc_call((iodcio_t)pdc, 0, PDC_PAT_CELL,
PDC_PAT_CELL_MODULE, rv, pdc_pat_cell_id.loc, i,
- PDC_PAT_PAVIEW, &pdc_pat_cell_module, 0); i++) {
+ PDC_PAT_PAVIEW, &pdc_pat_cell_module, 0)); i++) {
if (autoconf_verbose)
printf(">> chpa %lx info %lx loc %lx "
"dp %d/%d/%d/%d/%d/%d.%d\n",
@@ -673,7 +707,6 @@ pdc_patscan(struct device *self, struct confargs *ca, int mod)
pdc_pat_cell_module.dp.dp_mod);
if (pdc_pat_cell_module.dp.dp_bc[5] == mod) {
- struct confargs nca;
int t;
t = PDC_PAT_CELL_MODTYPE(pdc_pat_cell_module.info);
@@ -686,6 +719,7 @@ pdc_patscan(struct device *self, struct confargs *ca, int mod)
~(u_long)PAGE_MASK;
nca.ca_hpasz =
PDC_PAT_CELL_MODSIZE(pdc_pat_cell_module.info);
+ nca.ca_mod = pdc_pat_cell_module.dp.dp_mod;
err = pdc_call((iodcio_t)pdc, 0, PDC_IODC,
PDC_IODC_READ, &pdc_iodc_read, nca.ca_hpa,
diff --git a/sys/arch/hppa64/hppa64/mainbus.c b/sys/arch/hppa64/hppa64/mainbus.c
index 871d032d846..b1276b56140 100644
--- a/sys/arch/hppa64/hppa64/mainbus.c
+++ b/sys/arch/hppa64/hppa64/mainbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mainbus.c,v 1.1 2005/04/01 10:40:47 mickey Exp $ */
+/* $OpenBSD: mainbus.c,v 1.2 2005/05/22 01:38:09 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -627,7 +627,8 @@ mbattach(parent, self, aux)
bzero (&nca, sizeof(nca));
nca.ca_iot = &hppa_bustag;
nca.ca_dmatag = &hppa_dmatag;
- pdc_patscan(self, &nca, -1);
+ nca.ca_mod = -1;
+ pdc_scan(self, &nca);
}
/*
diff --git a/sys/arch/hppa64/include/autoconf.h b/sys/arch/hppa64/include/autoconf.h
index 2d40eb5e236..14495bd005b 100644
--- a/sys/arch/hppa64/include/autoconf.h
+++ b/sys/arch/hppa64/include/autoconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.h,v 1.1 2005/04/01 10:40:48 mickey Exp $ */
+/* $OpenBSD: autoconf.h,v 1.2 2005/05/22 01:38:09 mickey Exp $ */
/*
* Copyright (c) 2005 Michael Shalayeff
@@ -27,6 +27,7 @@ struct confargs {
bus_dma_tag_t ca_dmatag; /* DMA tag */
hppa_hpa_t ca_hpa; /* module HPA */
u_int ca_hpasz; /* module HPA size (if avail) */
+ int ca_mod; /* this module */
};
/* this is used for hppa_knownmodules table
@@ -47,7 +48,7 @@ extern void (*cold_hook)(int);
struct device;
const char *hppa_mod_info(int, int);
-void pdc_patscan(struct device *, struct confargs *, int);
+void pdc_scan(struct device *, struct confargs *);
int mbprint(void *, const char *);
void dumpconf(void);