summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/mvmeppc/pci/mpcpcibr.c89
1 files changed, 41 insertions, 48 deletions
diff --git a/sys/arch/mvmeppc/pci/mpcpcibr.c b/sys/arch/mvmeppc/pci/mpcpcibr.c
index 5980bbfa16a..ecc306c8be4 100644
--- a/sys/arch/mvmeppc/pci/mpcpcibr.c
+++ b/sys/arch/mvmeppc/pci/mpcpcibr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpcpcibr.c,v 1.14 2004/01/29 10:58:10 miod Exp $ */
+/* $OpenBSD: mpcpcibr.c,v 1.15 2004/01/29 20:27:37 miod Exp $ */
/*
* Copyright (c) 2001 Steve Murphree, Jr.
@@ -46,14 +46,16 @@
#include <uvm/uvm_extern.h>
#include <machine/autoconf.h>
-#include <machine/bat.h>
#include <machine/bus.h>
+#include <machine/pcb.h>
+
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include <dev/pci/pcidevs.h>
#include <mvmeppc/pci/pcibrvar.h>
#include <mvmeppc/dev/ravenreg.h>
+#include <mvmeppc/dev/ravenvar.h>
int mpcpcibrmatch(struct device *, void *, void *);
void mpcpcibrattach(struct device *, struct device *, void *);
@@ -97,16 +99,6 @@ int mpcpcibrprint(void *, const char *pnp);
struct pcibr_config mpc_config;
-/*
- * config types
- * bit meanings
- * 0 - standard cf8/cfc type configurations,
- * sometimes the base addresses for these are different
- * 1 - Config Method #2 configuration - uni-north
- *
- * 2 - 64 bit config bus, data for accesses &4 is at daddr+4;
- */
-
struct powerpc_bus_dma_tag pci_bus_dma_tag = {
NULL,
_bus_dmamap_create,
@@ -135,10 +127,7 @@ mpcpcibrmatch(parent, match, aux)
/* We must be a child of the raven device */
if (strcmp(parent->dv_cfdata->cf_driver->cd_name, "raven") != 0)
return (0);
-#if 0
- if (strcmp(ca->ca_name, mpcpcibr_cd.cd_name) != 0)
- return (0);
-#endif
+
return 1;
}
@@ -150,13 +139,9 @@ mpcpcibrattach(parent, self, aux)
struct pcibr_softc *sc = (struct pcibr_softc *)self;
struct pcibr_config *lcp;
struct pcibus_attach_args pba;
- char *bridge;
lcp = sc->sc_pcibr = &mpc_config;
- /*
-addbatmap(RAVEN_V_PCI_MEM_SPACE, RAVEN_P_PCI_MEM_SPACE, BAT_I);
-*/
sc->sc_membus_space = prep_mem_space_tag;
sc->sc_iobus_space = prep_io_space_tag;
@@ -185,9 +170,8 @@ addbatmap(RAVEN_V_PCI_MEM_SPACE, RAVEN_P_PCI_MEM_SPACE, BAT_I);
lcp->lc_pc.pc_intr_establish = mpc_intr_establish;
lcp->lc_pc.pc_intr_disestablish = mpc_intr_disestablish;
- printf(": Raven, Revision 0x%x.\n",
- mpc_cfg_read_1(lcp, RAVEN_PCI_REVID));
- bridge = "RAVEN";
+ printf(": revision 0x%x\n",
+ mpc_cfg_read_1(lcp, RAVEN_PCI_REVID));
pba.pba_dmat = &pci_bus_dma_tag;
pba.pba_busname = "pci";
@@ -195,21 +179,20 @@ addbatmap(RAVEN_V_PCI_MEM_SPACE, RAVEN_P_PCI_MEM_SPACE, BAT_I);
pba.pba_memt = &sc->sc_membus_space;
pba.pba_pc = &lcp->lc_pc;
pba.pba_bus = 0;
-/*
- pba.pba_flags = PCI_FLAGS_MEM_ENABLED | PCI_FLAGS_IO_ENABLED;
-*/
+
#if 0
/* set up prep environment */
- *(unsigned int *)RAVEN_MSADD0 = RAVEN_MSADD0_PREP;
- *(unsigned int *)RAVEN_MSOFF0 = RAVEN_MSOFF0_PREP;
- *(unsigned int *)RAVEN_MSADD1 = RAVEN_MSADD1_PREP;
- *(unsigned int *)RAVEN_MSOFF1 = RAVEN_MSOFF1_PREP;
- *(unsigned int *)RAVEN_MSADD2 = RAVEN_MSADD2_PREP;
- *(unsigned int *)RAVEN_MSOFF2 = RAVEN_MSOFF2_PREP;
- *(unsigned int *)RAVEN_MSADD3 = RAVEN_MSADD3_PREP;
- *(unsigned int *)RAVEN_MSOFF3 = RAVEN_MSOFF3_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSADD0) = RAVEN_MSADD0_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSOFF0) = RAVEN_MSOFF0_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSADD1) = RAVEN_MSADD1_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSOFF1) = RAVEN_MSOFF1_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSADD2) = RAVEN_MSADD2_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSOFF2) = RAVEN_MSOFF2_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSADD3) = RAVEN_MSADD3_PREP;
+ *(u_int32_t *)(ravenregs + RAVEN_MSOFF3) = RAVEN_MSOFF3_PREP;
/* set up PCI local bus */
+ mpc_cfg_write_4(lcp, RAVEN_PCI_MEM, MPCIC_BASE);
mpc_cfg_write_4(lcp, RAVEN_PCI_PSADD0, RAVEN_PCI_PSADD0_VAL);
mpc_cfg_write_4(lcp, RAVEN_PCI_PSOFF0, RAVEN_PCI_PSOFF0_VAL);
mpc_cfg_write_4(lcp, RAVEN_PCI_PSADD1, RAVEN_PCI_PSADD1_VAL);
@@ -261,13 +244,12 @@ vtophys(paddr_t pa)
vaddr_t va = (vaddr_t) pa;
if (va < VM_MIN_KERNEL_ADDRESS)
- return pa;
- else {
- if (pmap_extract(pmap_kernel(), va, &pa))
- return pa;
- }
+ pa = va;
+ else
+ if (pmap_extract(pmap_kernel(), va, &pa) != 0)
+ return NULL;
- return NULL;
+ return pa;
}
void
@@ -373,21 +355,24 @@ mpc_conf_read(cpv, tag, offset)
int offset;
{
struct pcibr_config *cp = cpv;
-
pcireg_t data;
u_int32_t reg;
int s;
int daddr = 0;
+ faultbuf env;
+ void *oldh;
if (offset & 3 || offset < 0 || offset >= 0x100) {
+#ifdef DEBUG_CONFIG
printf ("pci_conf_read: bad reg %x\n", offset);
+#endif
return (~0);
}
reg = mpc_gen_config_reg(cpv, tag, offset);
/* if invalid tag, return -1 */
if (reg == 0xffffffff) {
- return 0xffffffff;
+ return (~0);
}
if ((cp->config_type & 2) && (offset & 0x04)) {
@@ -396,12 +381,21 @@ mpc_conf_read(cpv, tag, offset)
s = splhigh();
+ oldh = curpcb->pcb_onfault;
+ if (setfault(&env)) {
+ /* did we fault during the read? */
+ curpcb->pcb_onfault = oldh;
+ return (~0);
+ }
+
bus_space_write_4(cp->lc_iot, cp->ioh_cf8, 0, reg);
bus_space_read_4(cp->lc_iot, cp->ioh_cf8, 0); /* XXX */
data = bus_space_read_4(cp->lc_iot, cp->ioh_cfc, daddr);
bus_space_write_4(cp->lc_iot, cp->ioh_cf8, 0, 0); /* disable */
bus_space_read_4(cp->lc_iot, cp->ioh_cf8, 0); /* XXX */
+ curpcb->pcb_onfault = oldh;
+
splx(s);
#ifdef DEBUG_CONFIG
if (!((offset == 0) && (data == 0xffffffff))) {
@@ -435,9 +429,9 @@ mpc_conf_write(cpv, tag, offset, data)
if (reg == 0xffffffff) {
return;
}
- if ((cp->config_type & 2) && (offset & 0x04)) {
+ if ((cp->config_type & 2) && (offset & 0x04))
daddr += 4;
- }
+
#ifdef DEBUG_CONFIG
{
unsigned int bus, dev, fcn;
@@ -460,7 +454,7 @@ mpc_conf_write(cpv, tag, offset, data)
splx(s);
}
-
+/*ARGSUSED*/
int
mpc_intr_map(lcv, bustag, buspin, line, ihp)
void *lcv;
@@ -472,8 +466,7 @@ mpc_intr_map(lcv, bustag, buspin, line, ihp)
*ihp = -1;
if (buspin == 0) {
- /* No IRQ used. */
- error = 1;
+ error = 1; /* No IRQ used. */
} else if (buspin > 4) {
printf("mpc_intr_map: bad interrupt pin %d\n", buspin);
error = 1;
@@ -519,7 +512,7 @@ mpc_intr_establish(lcv, ih, level, func, arg, name)
char *name;
{
return (*intr_establish_func)(lcv, ih, IST_LEVEL, level, func, arg,
- name);
+ name);
}
void