Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/alpha/pci Fix a silly bug present since rev 1.1; th...



details:   https://anonhg.NetBSD.org/src/rev/00e774f666ff
branches:  trunk
changeset: 471948:00e774f666ff
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Thu Apr 15 23:47:52 1999 +0000

description:
Fix a silly bug present since rev 1.1; the direct-mapped window is
supposed to be Window 1, but a cut'n'paste error made it stomp over
Window 0, thus breaking ISA DMA.  Fix this.  (Confirmed to work with
floppy driver.)

While I'm here, do something I've been meaning to do for a while: change
Window 1 from a 1G at 2G to a 2G at 2G direct-mapped window, and add
a Window 2 of 1G at 1G SGMAP-mapped.  Chain Window 2 to Window 1, and
use it as a fall-back for PCI DMA if the system has more than 2G of RAM.

diffstat:

 sys/arch/alpha/pci/mcpcia_dma.c |  112 +++++++++++++++++++++++++--------------
 1 files changed, 71 insertions(+), 41 deletions(-)

diffs (202 lines):

diff -r e1c3cff04e68 -r 00e774f666ff sys/arch/alpha/pci/mcpcia_dma.c
--- a/sys/arch/alpha/pci/mcpcia_dma.c   Thu Apr 15 22:41:24 1999 +0000
+++ b/sys/arch/alpha/pci/mcpcia_dma.c   Thu Apr 15 23:47:52 1999 +0000
@@ -1,7 +1,7 @@
-/* $NetBSD: mcpcia_dma.c,v 1.11 1999/04/15 22:32:21 thorpej Exp $ */
+/* $NetBSD: mcpcia_dma.c,v 1.12 1999/04/15 23:47:52 thorpej Exp $ */
 
 /*-
- * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997, 1998, 1999 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -39,7 +39,7 @@
 
 #include <sys/cdefs.h>                 /* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: mcpcia_dma.c,v 1.11 1999/04/15 22:32:21 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mcpcia_dma.c,v 1.12 1999/04/15 23:47:52 thorpej Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -79,13 +79,16 @@
 void   mcpcia_bus_dmamap_unload_sgmap __P((bus_dma_tag_t, bus_dmamap_t));
 
 /*
- * Direct-mapped window: 1G at 2G
- *
- * XXX Should consider making this 2G at 2G, and creating a 1G at 1G
- * XXX SGMAP window for fallback if we have more than 2G of RAM.
+ * Direct-mapped window: 2G at 2G
  */
 #define        MCPCIA_DIRECT_MAPPED_BASE       (2UL*1024UL*1024UL*1024UL)
-#define        MCPCIA_DIRECT_MAPPED_SIZE       (1UL*1024UL*1024UL*1024UL)
+#define        MCPCIA_DIRECT_MAPPED_SIZE       (2UL*1024UL*1024UL*1024UL)
+
+/*
+ * SGMAP window for PCI: 1G at 1G
+ */
+#define        MCPCIA_PCI_SG_MAPPED_BASE       (1UL*1024UL*1024UL*1024UL)
+#define        MCPCIA_PCI_SG_MAPPED_SIZE       (1UL*1024UL*1024UL*1024UL)
 
 /*
  * SGMAP window for ISA: 8M at 8M
@@ -113,7 +116,7 @@
        t->_cookie = ccp;
        t->_wbase = MCPCIA_DIRECT_MAPPED_BASE;
        t->_wsize = MCPCIA_DIRECT_MAPPED_SIZE;
-       t->_next_window = NULL;                 /* XXX See above. */
+       t->_next_window = &ccp->cc_dmat_pci_sgmap;
        t->_boundary = 0;
        t->_sgmap = NULL;
        t->_get_tag = mcpcia_dma_get_tag;
@@ -133,15 +136,15 @@
        t->_dmamem_mmap = _bus_dmamem_mmap;
 
        /*
-        * Initialize the DMA tag used for sgmap-mapped ISA DMA.
+        * Initialize the DMA tag used for sgmap-mapped PCI DMA.
         */
-       t = &ccp->cc_dmat_sgmap;
+       t = &ccp->cc_dmat_pci_sgmap;
        t->_cookie = ccp;
-       t->_wbase = MCPCIA_ISA_SG_MAPPED_BASE;
-       t->_wsize = MCPCIA_ISA_SG_MAPPED_SIZE;
+       t->_wbase = MCPCIA_PCI_SG_MAPPED_BASE;
+       t->_wsize = MCPCIA_PCI_SG_MAPPED_SIZE;
        t->_next_window = NULL;
        t->_boundary = 0;
-       t->_sgmap = &ccp->cc_sgmap;
+       t->_sgmap = &ccp->cc_pci_sgmap;
        t->_get_tag = mcpcia_dma_get_tag;
        t->_dmamap_create = mcpcia_bus_dmamap_create_sgmap;
        t->_dmamap_destroy = mcpcia_bus_dmamap_destroy_sgmap;
@@ -159,32 +162,44 @@
        t->_dmamem_mmap = _bus_dmamem_mmap;
 
        /*
-        * The SRM console is supposed to set up an 8MB direct mapped window
-        * at 8MB (window 0) and a 1MB direct mapped window at 1MB. Useless.
-        *
-        * The DU && OpenVMS convention is to have an 8MB S/G window
-        * at 8MB for window 0, a 1GB direct mapped window at 2GB
-        * for window 1, a 1 GB S/G window at window 2 and a 512 MB
-        * S/G window at window 3. This seems overkill.
-        *
-        * We'll just go with the 8MB S/G window and one 1GB direct window.
-        * XXX See comment above.
+        * Initialize the DMA tag used for sgmap-mapped ISA DMA.
         */
+       t = &ccp->cc_dmat_isa_sgmap;
+       t->_cookie = ccp;
+       t->_wbase = MCPCIA_ISA_SG_MAPPED_BASE;
+       t->_wsize = MCPCIA_ISA_SG_MAPPED_SIZE;
+       t->_next_window = NULL;
+       t->_boundary = 0;
+       t->_sgmap = &ccp->cc_isa_sgmap;
+       t->_get_tag = mcpcia_dma_get_tag;
+       t->_dmamap_create = mcpcia_bus_dmamap_create_sgmap;
+       t->_dmamap_destroy = mcpcia_bus_dmamap_destroy_sgmap;
+       t->_dmamap_load = mcpcia_bus_dmamap_load_sgmap;
+       t->_dmamap_load_mbuf = mcpcia_bus_dmamap_load_mbuf_sgmap;
+       t->_dmamap_load_uio = mcpcia_bus_dmamap_load_uio_sgmap;
+       t->_dmamap_load_raw = mcpcia_bus_dmamap_load_raw_sgmap;
+       t->_dmamap_unload = mcpcia_bus_dmamap_unload_sgmap;
+       t->_dmamap_sync = _bus_dmamap_sync;
+
+       t->_dmamem_alloc = _bus_dmamem_alloc;
+       t->_dmamem_free = _bus_dmamem_free;
+       t->_dmamem_map = _bus_dmamem_map;
+       t->_dmamem_unmap = _bus_dmamem_unmap;
+       t->_dmamem_mmap = _bus_dmamem_mmap;
 
        /*
-        * Initialize the SGMAP.
-        *
-        * Must align page table to its size.
+        * Initialize the SGMAPs.
         */
-       alpha_sgmap_init(t, &ccp->cc_sgmap, "mcpcia_sgmap",
+       alpha_sgmap_init(&ccp->cc_dmat_pci_sgmap, &ccp->cc_pci_sgmap,
+           "mcpcia pci sgmap",
+           MCPCIA_PCI_SG_MAPPED_BASE, 0, MCPCIA_PCI_SG_MAPPED_SIZE,
+           sizeof(u_int64_t), NULL, 0);
+
+       alpha_sgmap_init(&ccp->cc_dmat_isa_sgmap, &ccp->cc_isa_sgmap,
+           "mcpcia isa sgmap",
            MCPCIA_ISA_SG_MAPPED_BASE, 0, MCPCIA_ISA_SG_MAPPED_SIZE,
            sizeof(u_int64_t), NULL, 0);
 
-       if (ccp->cc_sgmap.aps_ptpa & (1024-1)) {
-               panic("mcpcia_dma_init: bad page table address 0x%lx",
-                       ccp->cc_sgmap.aps_ptpa);
-       }
-
        /*
         * Disable windows first.
         */
@@ -204,7 +219,8 @@
         */
        REGVAL(MCPCIA_W0_MASK(ccp)) = MCPCIA_WMASK_8M;
        REGVAL(MCPCIA_T0_BASE(ccp)) =
-               ccp->cc_sgmap.aps_ptpa >> MCPCIA_TBASEX_SHIFT;
+               ccp->cc_isa_sgmap.aps_ptpa >> MCPCIA_TBASEX_SHIFT;
+       alpha_mb();
        REGVAL(MCPCIA_W0_BASE(ccp)) =
                MCPCIA_WBASE_EN | MCPCIA_WBASE_SG | MCPCIA_ISA_SG_MAPPED_BASE;
        alpha_mb();
@@ -212,15 +228,28 @@
        MCPCIA_SGTLB_INVALIDATE(ccp);
 
        /*
-        * Set up window 1 as a 1 GB Direct-mapped window starting at 2GB.
+        * Set up window 1 as a 2 GB Direct-mapped window starting at 2GB.
         */
 
-       REGVAL(MCPCIA_W0_MASK(ccp)) = MCPCIA_WMASK_1G;
-       REGVAL(MCPCIA_T0_BASE(ccp)) = 0;
-       REGVAL(MCPCIA_W0_BASE(ccp)) =
+       REGVAL(MCPCIA_W1_MASK(ccp)) = MCPCIA_WMASK_2G;
+       REGVAL(MCPCIA_T1_BASE(ccp)) = 0;
+       alpha_mb();
+       REGVAL(MCPCIA_W1_BASE(ccp)) =
                MCPCIA_DIRECT_MAPPED_BASE | MCPCIA_WBASE_EN;
        alpha_mb();
 
+       /*
+        * Set up window 2 as a 1G SGMAP-mapped window starting at 1G.
+        */
+
+       REGVAL(MCPCIA_W2_MASK(ccp)) = MCPCIA_WMASK_1G;
+       REGVAL(MCPCIA_T2_BASE(ccp)) =
+               ccp->cc_pci_sgmap.aps_ptpa >> MCPCIA_TBASEX_SHIFT;
+       alpha_mb();
+       REGVAL(MCPCIA_W2_BASE(ccp)) =
+               MCPCIA_WBASE_EN | MCPCIA_WBASE_SG | MCPCIA_PCI_SG_MAPPED_BASE;
+       alpha_mb();
+
        /* XXX XXX BEGIN XXX XXX */
        {                                                       /* XXX */
                extern paddr_t alpha_XXX_dmamap_or;             /* XXX */
@@ -244,8 +273,9 @@
        case ALPHA_BUS_PCI:
        case ALPHA_BUS_EISA:
                /*
-                * Just always use direct-mapped for now; see comment
-                * above about chaining with SGMAPs.
+                * Start off using the direct-mapped window.  We will
+                * automatically fall backed onto the chained PCI SGMAP
+                * window if necessary.
                 */
                return (&ccp->cc_dmat_direct);
 
@@ -255,7 +285,7 @@
                 * the direct-mapped DMA window, so we must use
                 * SGMAPs.
                 */
-               return (&ccp->cc_dmat_sgmap);
+               return (&ccp->cc_dmat_isa_sgmap);
 
        default:
                panic("mcpcia_dma_get_tag: shouldn't be here, really...");



Home | Main Index | Thread Index | Old Index