summaryrefslogtreecommitdiffstats
path: root/sys/alpha
diff options
context:
space:
mode:
authorticso <ticso@FreeBSD.org>2005-09-19 13:50:07 +0000
committerticso <ticso@FreeBSD.org>2005-09-19 13:50:07 +0000
commit67624ed0f75907065578f29229d87b84e7a071fc (patch)
treee5a92c6294c73c413dd73635b6ace4b05147b50f /sys/alpha
parentdb795b2c7606fa5ffdcc900c11384e51ad99d8b1 (diff)
downloadFreeBSD-src-67624ed0f75907065578f29229d87b84e7a071fc.zip
FreeBSD-src-67624ed0f75907065578f29229d87b84e7a071fc.tar.gz
Relocate direct map specs into struct alpha_chipset.
Prepare for PCI Scatter-Gather map. Panic if driver tries alpha_XXX_dmamap() out of range.
Diffstat (limited to 'sys/alpha')
-rw-r--r--sys/alpha/alpha/busdma_machdep.c10
-rw-r--r--sys/alpha/include/chipset.h11
-rw-r--r--sys/alpha/include/pmap.h13
-rw-r--r--sys/alpha/mcbus/mcpcia.c43
-rw-r--r--sys/alpha/pci/apecs.c3
-rw-r--r--sys/alpha/pci/cia.c3
-rw-r--r--sys/alpha/pci/irongate.c4
-rw-r--r--sys/alpha/pci/lca.c4
-rw-r--r--sys/alpha/pci/t2.c3
-rw-r--r--sys/alpha/pci/tsunami.c4
-rw-r--r--sys/alpha/tlsb/dwlpx.c11
11 files changed, 76 insertions, 33 deletions
diff --git a/sys/alpha/alpha/busdma_machdep.c b/sys/alpha/alpha/busdma_machdep.c
index a7eb1c5..4a3bd6d 100644
--- a/sys/alpha/alpha/busdma_machdep.c
+++ b/sys/alpha/alpha/busdma_machdep.c
@@ -472,8 +472,6 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)
* Map the buffer buf into bus space using the dmamap map.
*/
-vm_offset_t alpha_XXX_dmamap_or = 1024UL*1024UL*1024UL; /*XXX */
-
int
bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
bus_size_t buflen, bus_dmamap_callback_t *callback,
@@ -581,7 +579,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
}
if (sg->ds_len == 0) {
- sg->ds_addr = paddr | alpha_XXX_dmamap_or;
+ sg->ds_addr = paddr + chipset.dmoffset;
sg->ds_len = size;
} else if (paddr == nextpaddr) {
sg->ds_len += size;
@@ -591,7 +589,7 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
seg++;
if (seg > dmat->nsegments)
break;
- sg->ds_addr = paddr | alpha_XXX_dmamap_or;
+ sg->ds_addr = paddr + chipset.dmoffset;
sg->ds_len = size;
}
vaddr += size;
@@ -671,7 +669,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
* previous segment if possible.
*/
if (first) {
- segs[seg].ds_addr = curaddr | alpha_XXX_dmamap_or;
+ segs[seg].ds_addr = curaddr + chipset.dmoffset;
segs[seg].ds_len = sgsize;
first = 0;
} else {
@@ -683,7 +681,7 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
else {
if (++seg >= dmat->nsegments)
break;
- segs[seg].ds_addr = curaddr | alpha_XXX_dmamap_or;
+ segs[seg].ds_addr = curaddr + chipset.dmoffset;;
segs[seg].ds_len = sgsize;
}
}
diff --git a/sys/alpha/include/chipset.h b/sys/alpha/include/chipset.h
index 048fbed..54031a5 100644
--- a/sys/alpha/include/chipset.h
+++ b/sys/alpha/include/chipset.h
@@ -45,6 +45,17 @@ typedef struct alpha_chipset {
* Scatter-Gather map for ISA dma.
*/
struct sgmap* sgmap;
+
+ /*
+ * Scatter-Gather map for PCI dma.
+ */
+ struct sgmap* pci_sgmap;
+
+ /*
+ * direct map
+ */
+ long dmsize;
+ long dmoffset;
} alpha_chipset_t;
extern alpha_chipset_t chipset;
diff --git a/sys/alpha/include/pmap.h b/sys/alpha/include/pmap.h
index 56c9d6a..08c78dc 100644
--- a/sys/alpha/include/pmap.h
+++ b/sys/alpha/include/pmap.h
@@ -45,6 +45,9 @@
#ifndef _MACHINE_PMAP_H_
#define _MACHINE_PMAP_H_
+#include <machine/chipset.h>
+#include <sys/systm.h>
+
/*
* Define meanings for a few software bits in the pte
*/
@@ -142,12 +145,16 @@ pmap_kextract(vm_offset_t va)
#define vtophys(va) pmap_kextract(((vm_offset_t) (va)))
-extern vm_offset_t alpha_XXX_dmamap_or;
-
static __inline vm_offset_t
alpha_XXX_dmamap(vm_offset_t va)
{
- return (pmap_kextract(va) | alpha_XXX_dmamap_or);
+ vm_offset_t pa = pmap_kextract(va);
+ if (pa >= chipset.dmsize)
+ panic ("driver uses alpha_XXX_dmamap() for an address that"
+ "is not within direct map");
+ if (chipset.pci_sgmap != NULL)
+ panic ("driver uses alpha_XXX_dmamap() on largemem system");
+ return (pa + chipset.dmoffset);
}
#endif /* _KERNEL */
diff --git a/sys/alpha/mcbus/mcpcia.c b/sys/alpha/mcbus/mcpcia.c
index 6059f37..6ef27d4 100644
--- a/sys/alpha/mcbus/mcpcia.c
+++ b/sys/alpha/mcbus/mcpcia.c
@@ -172,6 +172,7 @@ mcpcia_probe(device_t dev)
}
sc->mcpcia_inst = unit;
if ((xc = mcpcia_root) == NULL) {
+ chipset.pci_sgmap = NULL;
mcpcia_root = sc;
} else {
while (xc->next)
@@ -633,10 +634,12 @@ mcbus_get_mid(dev), bus , slot, func, sz, off, paddr, data, new_data);
static void
mcpcia_sgmap_map(void *arg, bus_addr_t ba, vm_offset_t pa)
{
+ struct mcpcia_softc *sc;
u_int64_t *sgtable = arg;
int index = alpha_btop(ba - MCPCIA_ISA_SG_MAPPED_BASE);
if (pa) {
+ /* XXX */
if (pa > (1L<<32))
panic("mcpcia_sgmap_map: can't map address 0x%lx", pa);
sgtable[index] = ((pa >> 13) << 1) | 1;
@@ -644,12 +647,18 @@ mcpcia_sgmap_map(void *arg, bus_addr_t ba, vm_offset_t pa)
sgtable[index] = 0;
}
alpha_mb();
- MCPCIA_SGTLB_INVALIDATE(mcpcia_eisa);
+ if ((struct sgmap*)sgtable == chipset.sgmap)
+ MCPCIA_SGTLB_INVALIDATE(mcpcia_eisa);
+ else {
+ for (sc = mcpcia_root; sc != NULL; sc = sc->next)
+ MCPCIA_SGTLB_INVALIDATE(sc);
+ }
}
static void
mcpcia_dma_init(struct mcpcia_softc *sc)
{
+ void *sgtable;
/*
* Disable all windows first.
@@ -672,7 +681,6 @@ mcpcia_dma_init(struct mcpcia_softc *sc)
*/
if (sc == mcpcia_eisa) {
- void *sgtable;
REGVAL(MCPCIA_W0_MASK(sc)) = MCPCIA_WMASK_8M;
sgtable = contigmalloc(8192, M_DEVBUF,
@@ -699,6 +707,8 @@ mcpcia_dma_init(struct mcpcia_softc *sc)
* Set up window 1 as a 2 GB Direct-mapped window starting at 2GB.
*/
+ chipset.dmsize = 2UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = MCPCIA_DIRECT_MAPPED_BASE;
REGVAL(MCPCIA_W1_MASK(sc)) = MCPCIA_WMASK_2G;
REGVAL(MCPCIA_T1_BASE(sc)) = 0;
alpha_mb();
@@ -706,30 +716,33 @@ mcpcia_dma_init(struct mcpcia_softc *sc)
MCPCIA_DIRECT_MAPPED_BASE | MCPCIA_WBASE_EN;
alpha_mb();
- /*
- * When we get around to redoing the 'chipset' stuff to have more
- * than one sgmap handler...
- */
+ if (alpha_ptob(Maxmem) <= chipset.dmsize)
+ return;
-#if 0
/*
* Set up window 2 as a 1G SGMAP-mapped window starting at 1G.
*/
+ if (chipset.pci_sgmap == NULL) {
+ sgtable = contigmalloc(1048576, M_DEVBUF,
+ M_NOWAIT, 0, 1L<<34, 32<<10, 1L<<34);
+ if (sgtable == NULL) {
+ panic("mcpcia_dma_init: cannot allocate pci_sgmap");
+ /* NOTREACHED */
+ }
+ chipset.pci_sgmap = sgmap_map_create(MCPCIA_PCI_SG_MAPPED_BASE,
+ MCPCIA_PCI_SG_MAPPED_BASE + MCPCIA_PCI_SG_MAPPED_SIZE - 1,
+ mcpcia_sgmap_map, sgtable);
+ }
REGVAL(MCPCIA_W2_MASK(sc)) = MCPCIA_WMASK_1G;
REGVAL(MCPCIA_T2_BASE(sc)) =
- ccp->cc_pci_sgmap.aps_ptpa >> MCPCIA_TBASEX_SHIFT;
+ pmap_kextract((vm_offset_t)chipset.pci_sgmap) >>
+ MCPCIA_TBASEX_SHIFT;
alpha_mb();
REGVAL(MCPCIA_W2_BASE(sc)) =
MCPCIA_WBASE_EN | MCPCIA_WBASE_SG | MCPCIA_PCI_SG_MAPPED_BASE;
alpha_mb();
-#endif
-
- /* XXX XXX BEGIN XXX XXX */
- { /* XXX */
- alpha_XXX_dmamap_or = MCPCIA_DIRECT_MAPPED_BASE;/* XXX */
- } /* XXX */
- /* XXX XXX END XXX XXX */
+ MCPCIA_SGTLB_INVALIDATE(sc);
}
/*
diff --git a/sys/alpha/pci/apecs.c b/sys/alpha/pci/apecs.c
index 3faf1e1..a5c9c26 100644
--- a/sys/alpha/pci/apecs.c
+++ b/sys/alpha/pci/apecs.c
@@ -235,6 +235,9 @@ apecs_init_sgmap(void)
chipset.sgmap = sgmap_map_create(APECS_SGMAP_BASE,
APECS_SGMAP_BASE + APECS_SGMAP_SIZE,
apecs_sgmap_map, sgtable);
+ chipset.pci_sgmap = NULL;
+ chipset.dmsize = 1UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = 1UL * 1024UL * 1024UL * 1024UL;
}
void
diff --git a/sys/alpha/pci/cia.c b/sys/alpha/pci/cia.c
index 91deb35..c025bbf 100644
--- a/sys/alpha/pci/cia.c
+++ b/sys/alpha/pci/cia.c
@@ -314,6 +314,9 @@ cia_init_sgmap(void)
chipset.sgmap = sgmap_map_create(CIA_SGMAP_BASE,
CIA_SGMAP_BASE + CIA_SGMAP_SIZE - 1,
cia_sgmap_map, sgtable);
+ chipset.pci_sgmap = NULL;
+ chipset.dmsize = 1UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = 1UL * 1024UL * 1024UL * 1024UL;
if (cia_ispyxis) {
/*
diff --git a/sys/alpha/pci/irongate.c b/sys/alpha/pci/irongate.c
index a744c3d..6092bd7 100644
--- a/sys/alpha/pci/irongate.c
+++ b/sys/alpha/pci/irongate.c
@@ -123,7 +123,6 @@ irongate_init()
initted = 1;
chipset = irongate_chipset;
- alpha_XXX_dmamap_or = 0UL;
bwx_init_space(&io_space, KV(IRONGATE_IO));
bwx_init_space(&mem_space, KV(IRONGATE_MEM));
@@ -166,6 +165,9 @@ irongate_attach(device_t dev)
chipset_dense = IRONGATE_MEM;
/* no s/g support in this chipset, must use bounce-buffers */
chipset.sgmap = NULL;
+ chipset.pci_sgmap = NULL;
+ chipset.dmsize = 4UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = 0;
bus_generic_attach(dev);
diff --git a/sys/alpha/pci/lca.c b/sys/alpha/pci/lca.c
index e279555..c631a93 100644
--- a/sys/alpha/pci/lca.c
+++ b/sys/alpha/pci/lca.c
@@ -186,7 +186,9 @@ lca_init_sgmap(void)
chipset.sgmap = sgmap_map_create(LCA_SGMAP_BASE,
LCA_SGMAP_BASE + LCA_SGMAP_SIZE,
lca_sgmap_map, sgtable);
-
+ chipset.pci_sgmap = NULL;
+ chipset.dmsize = 1UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = 1UL * 1024UL * 1024UL * 1024UL;
REGVAL64(LCA_IOC_W_T_BASE0) = pmap_kextract((vm_offset_t) sgtable);
alpha_mb();
diff --git a/sys/alpha/pci/t2.c b/sys/alpha/pci/t2.c
index b1c0b26..fb412cc 100644
--- a/sys/alpha/pci/t2.c
+++ b/sys/alpha/pci/t2.c
@@ -252,6 +252,9 @@ t2_init_sgmap(int h)
chipset.sgmap = sgmap_map_create(T2_SGMAP_BASE,
T2_SGMAP_BASE + T2_SGMAP_SIZE,
t2_sgmap_map, sgtable);
+ chipset.pci_sgmap = NULL;
+ chipset.dmsize = 2UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = 1UL * 1024UL * 1024UL * 1024UL;
}
static void
diff --git a/sys/alpha/pci/tsunami.c b/sys/alpha/pci/tsunami.c
index 23dd370..bef551a 100644
--- a/sys/alpha/pci/tsunami.c
+++ b/sys/alpha/pci/tsunami.c
@@ -234,6 +234,7 @@ tsunami_init_sgmap(void)
chipset.sgmap = sgmap_map_create(TSUNAMI_SGMAP_BASE,
TSUNAMI_SGMAP_BASE + TSUNAMI_SGMAP_SIZE,
tsunami_sgmap_map, sgtable);
+ chipset.pci_sgmap = NULL;
}
void
@@ -258,7 +259,8 @@ tsunami_init()
chipset = tsunami_chipset;
platform.pci_intr_enable = tsunami_intr_enable;
platform.pci_intr_disable = tsunami_intr_disable;
- alpha_XXX_dmamap_or = 2UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmsize = 2UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = 2UL * 1024UL * 1024UL * 1024UL;
if (platform.pci_intr_init)
platform.pci_intr_init();
diff --git a/sys/alpha/tlsb/dwlpx.c b/sys/alpha/tlsb/dwlpx.c
index e95f10e..66b65df 100644
--- a/sys/alpha/tlsb/dwlpx.c
+++ b/sys/alpha/tlsb/dwlpx.c
@@ -707,7 +707,12 @@ dwlpx_dma_init(struct dwlpx_softc *sc)
* SGVA base: 0
*/
chipset.sgmap = sgmap_map_create(sgwbase, sgwend, dwlpx_sgmap_map, tbl);
+#else
+ chipset.sgmap = NULL;
#endif
+ chipset.pci_sgmap = NULL;
+ chipset.dmsize = 2UL * 1024UL * 1024UL * 1024UL;
+ chipset.dmoffset = DWLPx_DIRECT_MAPPED_BASE;
/*
* Set up DMA windows for this DWLPx.
@@ -729,12 +734,6 @@ dwlpx_dma_init(struct dwlpx_softc *sc)
sgwbase | PCIA_WBASE_W_EN | PCIA_WBASE_SG_EN;
}
alpha_mb();
-
- /* XXX XXX BEGIN XXX XXX */
- { /* XXX */
- alpha_XXX_dmamap_or = DWLPx_DIRECT_MAPPED_BASE; /* XXX */
- } /* XXX */
- /* XXX XXX END XXX XXX */
}
/*
OpenPOWER on IntegriCloud