summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDale S. Rahn <rahnds@cvs.openbsd.org>1998-08-22 18:32:01 +0000
committerDale S. Rahn <rahnds@cvs.openbsd.org>1998-08-22 18:32:01 +0000
commit060a293d1a09ab519d6430a038d1d58180e490b5 (patch)
tree47fc5f33d48bde6670af2182423ef0d188cc78e7
parentb14c08b6614b3ddf135f84c2140f08af903e259e (diff)
Various changes to allow mixing of ofw drivers and real drivers.
NCR driver seems to work. Major changes are isa can be child of pci or mainbus. ofroot is child of mainbus not root. ofw bus configured before pci bus Note that if a pci device configures accessing of driver will crash the system. they need to be exclusive.
-rw-r--r--sys/arch/powerpc/conf/OFWTST97
-rw-r--r--sys/arch/powerpc/conf/files.powerpc20
-rw-r--r--sys/arch/powerpc/include/autoconf.h5
-rw-r--r--sys/arch/powerpc/isa/isa_machdep.h4
-rw-r--r--sys/arch/powerpc/isa/isabus.c35
-rw-r--r--sys/arch/powerpc/pci/mpcpcibus.c38
-rw-r--r--sys/arch/powerpc/powerpc/autoconf.c10
-rw-r--r--sys/arch/powerpc/powerpc/locore.S12
-rw-r--r--sys/arch/powerpc/powerpc/machdep.c44
-rw-r--r--sys/arch/powerpc/powerpc/mainbus.c11
-rw-r--r--sys/arch/powerpc/powerpc/pmap.c30
11 files changed, 276 insertions, 30 deletions
diff --git a/sys/arch/powerpc/conf/OFWTST b/sys/arch/powerpc/conf/OFWTST
new file mode 100644
index 00000000000..49d92fb9930
--- /dev/null
+++ b/sys/arch/powerpc/conf/OFWTST
@@ -0,0 +1,97 @@
+#
+# First try for PPC GENERIC config file
+#
+
+machine powerpc
+
+maxusers 32
+
+# Standard system options (should go into std.powerpc?)
+options SWAPPAGER, VNODEPAGER, DEVPAGER
+options EXEC_ELF
+options SYS_TYPE=OFWMACH
+
+# various hacks due to bugs in Openfirmware implementation
+options FIREPOWERBUGS
+
+#options IPKDBUSERHACK
+#makeoptions DEBUG="-g"
+
+options DDB
+options KTRACE
+options SYSCALL_DEBUG
+options TCP_COMPAT_42
+options COMPAT_43
+#options COMPAT_09
+#options COMPAT_10
+#options COMPAT_12
+
+options FFS
+options MFS
+
+options NFSCLIENT
+options NFSSERVER
+
+options CD9660
+options MSDOSFS
+options FDESC
+options FIFO
+options KERNFS
+options NULLFS
+options PORTAL
+options PROCFS
+options UMAPFS
+options UNION
+
+options INET
+options NMBCLUSTERS=1024
+
+# System V options
+option SYSVMSG # System V-like message queues
+option SYSVSEM # System V-like semaphores
+option SYSVSHM # System V-like memory sharing
+#option SHMMAXPGS=1024 # 1024 pages is the default
+
+#options MAXUSERS=20
+#options TARGET_ELF
+
+config bsd swap generic
+
+mainbus0 at root
+cpu* at mainbus0
+ofroot* at mainbus0
+mpcpcibr* at mainbus0 # MPC106 PCI Bridge.
+isabr* at pci? # ISA dev bridge.
+
+pci* at mpcpcibr?
+
+isa* at isabr?
+#com0 at isa? port 0x2f8 irq 3
+#com1 at isa? port 0x3f8 irq 4
+
+ncr* at pci? dev ? function ?
+#de* at pci? dev ? function ?
+
+scsibus* at ncr?
+sd* at scsibus? target ? lun ?
+st* at scsibus? target ? lun ?
+cd* at scsibus? target ? lun ?
+
+
+ofbus* at openfirm?
+
+#ofdisk* at openfirm?
+
+ofnet* at openfirm?
+#ipkdbif0 at ofnet?
+
+ofcons* at openfirm?
+
+ofrtc* at openfirm?
+
+pseudo-device loop
+pseudo-device pty 64
+pseudo-device random 1
+pseudo-device rd
+pseudo-device vnd 2
+pseudo-device bpfilter 8 # packet filter
diff --git a/sys/arch/powerpc/conf/files.powerpc b/sys/arch/powerpc/conf/files.powerpc
index 32e9cf193d6..00276b4b694 100644
--- a/sys/arch/powerpc/conf/files.powerpc
+++ b/sys/arch/powerpc/conf/files.powerpc
@@ -45,6 +45,10 @@ file arch/powerpc/powerpc/db_trace.c ddb
file arch/powerpc/powerpc/ofwreal.S
+#
+# Openfirmware support
+#
+
define mainbus {}
device mainbus
attach mainbus at root
@@ -54,34 +58,32 @@ device cpu
attach cpu at mainbus
file arch/powerpc/powerpc/cpu.c
+include "../../../dev/ofw/files.ofw"
+file arch/powerpc/powerpc/opendev.c ofcons | ofnet | ofdisk
+major { ofdisk = 4 }
+
pseudo-device rd
file dev/ramdisk.c rd needs-flag
file arch/powerpc/powerpc/rd_root.c ramdisk_hooks
major {rd = 17}
+include "../../../dev/pci/files.pci"
+
device mpcpcibr {} : pcibus
attach mpcpcibr at mainbus
file arch/powerpc/pci/mpcpcibus.c mpcpcibr
device isabr {} : isabus
-attach isabr at mainbus
+attach isabr at mainbus, pci
file arch/powerpc/isa/isabus.c isabr
include "../../../scsi/files.scsi"
major {sd = 2} # hey this was 0 but at slot 2 in bdevsw XXX
major {cd = 3}
define pcmcia {} # XXX dummy decl...
-include "../../../dev/pci/files.pci"
include "../../../dev/isa/files.isa"
major { wd = 5 } # Not even in bdevsw XXX
include "../../../dev/isa/files.isapnp"
file arch/arc/isa/isapnp_machdep.c isapnp
-#
-# Openfirmware support
-#
-
-include "../../../dev/ofw/files.ofw"
-file arch/powerpc/powerpc/opendev.c ofcons | ofnet | ofdisk
-major { ofdisk = 4 }
diff --git a/sys/arch/powerpc/include/autoconf.h b/sys/arch/powerpc/include/autoconf.h
index d11e53617c2..8502deed616 100644
--- a/sys/arch/powerpc/include/autoconf.h
+++ b/sys/arch/powerpc/include/autoconf.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.h,v 1.2 1998/05/29 04:15:32 rahnds Exp $ */
+/* $OpenBSD: autoconf.h,v 1.3 1998/08/22 18:31:44 rahnds Exp $ */
/*
* Copyright (c) 1997 Per Fogelstrom
@@ -41,8 +41,9 @@
/*
* System types.
*/
-#define OFWMACH 0 /* Openfirmware drivers */
+#define OFWMACH 0 /* Openfirmware drivers */
#define POWER4e 1 /* V.I Power.4e board */
+#define PWRSTK 2 /* Motorola Powerstack series */
extern int system_type;
diff --git a/sys/arch/powerpc/isa/isa_machdep.h b/sys/arch/powerpc/isa/isa_machdep.h
index 6504688de3a..6395937d1da 100644
--- a/sys/arch/powerpc/isa/isa_machdep.h
+++ b/sys/arch/powerpc/isa/isa_machdep.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: isa_machdep.h,v 1.2 1998/06/29 05:47:40 downsj Exp $ */
+/* $OpenBSD: isa_machdep.h,v 1.3 1998/08/22 18:31:46 rahnds Exp $ */
/*
* Copyright (c) 1997 Per Fogelstrom
@@ -87,7 +87,7 @@ struct intrhand {
/*
* Let com.c know where our console is!
*/
-#define CONADDR (0x2e8)
+#define CONADDR (0x2f8)
#define COM_FREQ (1843200 / 3) /* Clocked with 8Mhz instead of 24! */
extern void * isabr_intr_establish(isa_chipset_tag_t, int, int, int, int (*ih_fun) __P((void *)), void *, char *);
diff --git a/sys/arch/powerpc/isa/isabus.c b/sys/arch/powerpc/isa/isabus.c
index f45d31e16f2..06b0d80ac40 100644
--- a/sys/arch/powerpc/isa/isabus.c
+++ b/sys/arch/powerpc/isa/isabus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: isabus.c,v 1.2 1998/05/29 04:15:35 rahnds Exp $ */
+/* $OpenBSD: isabus.c,v 1.3 1998/08/22 18:31:48 rahnds Exp $ */
/* $NetBSD: isa.c,v 1.33 1995/06/28 04:30:51 cgd Exp $ */
/*-
@@ -102,6 +102,8 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <machine/autoconf.h>
#include <machine/intr.h>
+#include <dev/pci/pcidevs.h>
+#include <dev/pci/pcivar.h>
#include <dev/isa/isareg.h>
#include <dev/isa/isavar.h>
@@ -151,16 +153,25 @@ isabrmatch(parent, cfdata, aux)
struct confargs *ca = aux;
/* Make sure that we're looking for a ISABR. */
- if (strcmp(ca->ca_name, isabr_cd.cd_name) != 0)
- return (0);
+ if (strcmp(ca->ca_name, isabr_cd.cd_name) == 0)
+ return (1);
+ {
+ struct pci_attach_args *pa = aux;
+
+ if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL &&
+ PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_INTEL_SIO)
+ return (1);
+
+ }
- return (1);
+ return (0);
}
typedef void (void_f) (void);
extern void_f *pending_int_f;
void isa_do_pending_int();
+struct evcnt evirq[ICU_LEN];
void
isabrattach(parent, self, aux)
struct device *parent;
@@ -170,6 +181,9 @@ isabrattach(parent, self, aux)
struct isabr_softc *sc = (struct isabr_softc *)self;
struct isabus_attach_args iba;
+ /* notyet -dsr
+ ppc_intr_setup( isabr_intr_establish, isabr_intr_disestablish);
+ */
pending_int_f = isa_do_pending_int;
printf("\n");
@@ -190,6 +204,12 @@ isabrattach(parent, self, aux)
iba.iba_iot = (bus_space_tag_t)&p4e_isa_io;
iba.iba_memt = (bus_space_tag_t)&p4e_isa_mem;
iba.iba_ic = &sc->p4e_isa_cs;
+ {
+ int i;
+ for (i = 0; i < ICU_LEN; i++) {
+ evcnt_attach(self,"intr",&evirq[i]);
+ }
+ }
config_found(self, &iba, isabrprint);
}
@@ -402,23 +422,24 @@ static int processing;
vector = ffs(hwpend) - 1;
hwpend &= ~(1L << vector);
ih = intrhand[vector];
+ evirq[vector].ev_count++;
while(ih) {
(*ih->ih_fun)(ih->ih_arg);
ih = ih->ih_next;
}
}
- if(ipending & SINT_CLOCK) {
+ if((ipending & SINT_CLOCK)& ~pcpl) {
ipending &= ~SINT_CLOCK;
softclock();
}
- if(ipending & SINT_NET) {
+ if((ipending & SINT_NET)& ~pcpl){
extern int netisr;
int pisr = netisr;
netisr = 0;
ipending &= ~SINT_NET;
softnet(pisr);
}
- ipending &= pcpl;
+ ipending &= ~hwpend;
cpl = pcpl; /* Don't use splx... we are here already! */
__asm__ volatile("mtmsr %0" :: "r"(emsr));
processing = 0;
diff --git a/sys/arch/powerpc/pci/mpcpcibus.c b/sys/arch/powerpc/pci/mpcpcibus.c
index 6e263c607c7..ae58a8c1f98 100644
--- a/sys/arch/powerpc/pci/mpcpcibus.c
+++ b/sys/arch/powerpc/pci/mpcpcibus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpcpcibus.c,v 1.5 1998/08/06 15:04:00 pefo Exp $ */
+/* $OpenBSD: mpcpcibus.c,v 1.6 1998/08/22 18:31:50 rahnds Exp $ */
/*
* Copyright (c) 1997 Per Fogelstrom
@@ -45,6 +45,7 @@
#include <vm/vm.h>
#include <machine/autoconf.h>
+#include <machine/bat.h>
#include <dev/isa/isareg.h>
#include <dev/isa/isavar.h>
@@ -156,6 +157,41 @@ mpcpcibrattach(parent, self, aux)
mpc_cfg_read_1(MPC106_PCI_REVID));
mpc_cfg_write_2(MPC106_PCI_STAT, 0xff80); /* Reset status */
break;
+ case OFWMACH:
+ case PWRSTK:
+ lcp = sc->sc_pcibr = &mpc_config;
+
+ addbatmap(0x80000000, 0x80000000, BAT_I);
+ addbatmap(MPC106_P_PCI_MEM_SPACE,
+ MPC106_P_PCI_MEM_SPACE, BAT_I);
+
+ sc->sc_membus_space.bus_base = MPC106_V_PCI_MEM_SPACE;
+ sc->sc_membus_space.bus_reverse = 1;
+ sc->sc_iobus_space.bus_base = MPC106_PCI_IO_SPACE;
+ sc->sc_iobus_space.bus_reverse = 1;
+
+ lcp->lc_pc.pc_conf_v = lcp;
+ lcp->lc_pc.pc_attach_hook = mpc_attach_hook;
+ lcp->lc_pc.pc_bus_maxdevs = mpc_bus_maxdevs;
+ lcp->lc_pc.pc_make_tag = mpc_make_tag;
+ lcp->lc_pc.pc_decompose_tag = mpc_decompose_tag;
+ lcp->lc_pc.pc_conf_read = mpc_conf_read;
+ lcp->lc_pc.pc_conf_write = mpc_conf_write;
+ lcp->lc_pc.pc_ether_hw_addr = mpc_ether_hw_addr;
+
+ lcp->lc_pc.pc_intr_v = lcp;
+ lcp->lc_pc.pc_intr_map = mpc_intr_map;
+ lcp->lc_pc.pc_intr_string = mpc_intr_string;
+ lcp->lc_pc.pc_intr_establish = mpc_intr_establish;
+ lcp->lc_pc.pc_intr_disestablish = mpc_intr_disestablish;
+
+ printf(": MPC106, Revision %x.\n",
+ mpc_cfg_read_1(MPC106_PCI_REVID));
+ mpc_cfg_write_2(MPC106_PCI_STAT, 0xff80); /* Reset status */
+ break;
+ default:
+ printf("unknown system_type %d\n",system_type);
+ return;
}
pba.pba_busname = "pci";
diff --git a/sys/arch/powerpc/powerpc/autoconf.c b/sys/arch/powerpc/powerpc/autoconf.c
index 1e47d7a851e..97fc7b4b99f 100644
--- a/sys/arch/powerpc/powerpc/autoconf.c
+++ b/sys/arch/powerpc/powerpc/autoconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: autoconf.c,v 1.6 1998/08/06 15:04:05 pefo Exp $ */
+/* $OpenBSD: autoconf.c,v 1.7 1998/08/22 18:31:52 rahnds Exp $ */
/*
* Copyright (c) 1996, 1997 Per Fogelstrom
* Copyright (c) 1995 Theo de Raadt
@@ -41,7 +41,7 @@
* from: Utah Hdr: autoconf.c 1.31 91/01/21
*
* from: @(#)autoconf.c 8.1 (Berkeley) 6/10/93
- * $Id: autoconf.c,v 1.6 1998/08/06 15:04:05 pefo Exp $
+ * $Id: autoconf.c,v 1.7 1998/08/22 18:31:52 rahnds Exp $
*/
/*
@@ -91,11 +91,13 @@ void
configure()
{
(void)splhigh(); /* To be really sure.. */
- if(config_rootfound("mainbus", "mainbus") == 0)
- panic("no mainbus found");
+ /*
if(system_type == OFWMACH) {
ofrootfound();
}
+ */
+ if(config_rootfound("mainbus", "mainbus") == 0)
+ panic("no mainbus found");
(void)spl0();
setroot();
diff --git a/sys/arch/powerpc/powerpc/locore.S b/sys/arch/powerpc/powerpc/locore.S
index b77e0fc749a..52c611505d2 100644
--- a/sys/arch/powerpc/powerpc/locore.S
+++ b/sys/arch/powerpc/powerpc/locore.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.S,v 1.5 1997/10/13 13:42:58 pefo Exp $ */
+/* $OpenBSD: locore.S,v 1.6 1998/08/22 18:31:55 rahnds Exp $ */
/* $NetBSD: locore.S,v 1.2 1996/10/16 19:33:09 ws Exp $ */
/*
@@ -1255,3 +1255,13 @@ _C_LABEL(sigcode):
li 0,SYS_exit
sc /* exit(errno) */
_C_LABEL(esigcode):
+
+
+
+_C_LABEL(intrnames):
+ .string "none"
+_C_LABEL(eintrnames):
+ .align 4
+_C_LABEL(intrcnt):
+ .long 0
+_C_LABEL(eintrcnt):
diff --git a/sys/arch/powerpc/powerpc/machdep.c b/sys/arch/powerpc/powerpc/machdep.c
index aa029c8630e..daa7f35d5a0 100644
--- a/sys/arch/powerpc/powerpc/machdep.c
+++ b/sys/arch/powerpc/powerpc/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.13 1998/05/29 04:15:39 rahnds Exp $ */
+/* $OpenBSD: machdep.c,v 1.14 1998/08/22 18:31:57 rahnds Exp $ */
/* $NetBSD: machdep.c,v 1.4 1996/10/16 19:33:11 ws Exp $ */
/*
@@ -824,3 +824,45 @@ do_pending_int()
(*pending_int_f)();
}
}
+
+/*
+ * set system type from string
+ */
+void
+systype(char *name)
+{
+ if (strncmp (name, "MOT,", 4) == 0) {
+ system_type = PWRSTK;
+ printf("recognized system type of %s as PWRSTK\n", name);
+ }
+}
+/*
+ * one attempt at interrupt stuff..
+ *
+ */
+#include <dev/pci/pcivar.h>
+typedef void *(intr_establish_t) __P((void *, pci_intr_handle_t,
+ int, int (*func)(void *), void *, char *));
+typedef void (intr_disestablish_t) __P((void *, void *));
+
+void *
+ppc_intr_establish(lcv, ih, level, func, arg, name)
+ void *lcv;
+ pci_intr_handle_t ih;
+ int level;
+ int (*func) __P((void *));
+ void *arg;
+ char *name;
+{
+ panic("ppc_intr_establish called before interrupt controller configured: driver %s\n", name);
+}
+
+intr_establish_t *intr_establish_func = ppc_intr_establish;;
+intr_disestablish_t *intr_disestablish_func;
+
+void
+ppc_intr_setup(intr_establish_t *establish, intr_disestablish_t *disestablish)
+{
+ intr_establish_func = establish;
+ intr_disestablish_func = disestablish;
+}
diff --git a/sys/arch/powerpc/powerpc/mainbus.c b/sys/arch/powerpc/powerpc/mainbus.c
index d38616b3a82..711720be72c 100644
--- a/sys/arch/powerpc/powerpc/mainbus.c
+++ b/sys/arch/powerpc/powerpc/mainbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mainbus.c,v 1.1 1997/10/13 13:42:59 pefo Exp $ */
+/* $OpenBSD: mainbus.c,v 1.2 1998/08/22 18:31:59 rahnds Exp $ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -97,6 +97,13 @@ mbattach(parent, self, aux)
nca.ca_bus = &sc->sc_bus;
config_found(self, &nca, mbprint);
+ /* Set up Openfirmware.*/
+ if (system_type != POWER4e) { /* for now */
+ nca.ca_name = "ofroot";
+ nca.ca_bus = &sc->sc_bus;
+ config_found(self, &nca, mbprint);
+ }
+
/* The following machines have an ISA bus */
/* Do ISA first so the interrupt controller is set up! */
@@ -107,7 +114,7 @@ mbattach(parent, self, aux)
}
/* The following machines have a PCI bus */
- if (system_type == POWER4e) {
+ if (system_type != OFWMACH) {
nca.ca_name = "mpcpcibr";
nca.ca_bus = &sc->sc_bus;
config_found(self, &nca, mbprint);
diff --git a/sys/arch/powerpc/powerpc/pmap.c b/sys/arch/powerpc/powerpc/pmap.c
index a3fb386b855..cc1f532e2a6 100644
--- a/sys/arch/powerpc/powerpc/pmap.c
+++ b/sys/arch/powerpc/powerpc/pmap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pmap.c,v 1.6 1998/03/04 10:58:16 niklas Exp $ */
+/* $OpenBSD: pmap.c,v 1.7 1998/08/22 18:32:00 rahnds Exp $ */
/* $NetBSD: pmap.c,v 1.1 1996/09/30 16:34:52 ws Exp $ */
/*
@@ -1318,3 +1318,31 @@ pmap_page_protect(pa, prot)
}
splx(s);
}
+/*
+ * this code to manipulate the BAT tables was added here
+ * because it is closely related to the vm system.
+ * --dsr
+ */
+
+#include <machine/bat.h>
+
+/* one major problem of mapping IO with bats, is that it
+ * is not possible to use caching on any level of granularity
+ * that is reasonable.
+ * This is just enhancing an existing design (that should be
+ * replaced in my opinion).
+ *
+ * Current design only allow mapping of 256 MB block. (normally 1-1)
+ * but not necessarily (in the case of PCI io at 0xf0000000 where
+ * it might be desireable to map it elsewhere because that is
+ * where the stack is?)
+ */
+void
+addbatmap(u_int32_t vaddr, u_int32_t raddr, u_int32_t wimg)
+{
+ u_int32_t segment;
+ segment = vaddr >> (32 - 4);
+ battable[segment].batu = BATU(vaddr);
+ battable[segment].batl = BATL(raddr, wimg);
+}
+