Author: landonf
Date: Sat Dec 16 04:35:37 2017
New Revision: 326893
URL: https://svnweb.freebsd.org/changeset/base/326893

Log:
  bhndb(4): Enable addrext support on DMA64 devices, and fix an incorrect DMA
  DMA boundary constraint applied in bhndb_dma_tag_create().
  
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/dev/bhnd/bhndb/bhndb_pci_hwdata.c
  head/sys/dev/bhnd/bhndb/bhndb_subr.c

Modified: head/sys/dev/bhnd/bhndb/bhndb_pci_hwdata.c
==============================================================================
--- head/sys/dev/bhnd/bhndb/bhndb_pci_hwdata.c  Sat Dec 16 00:47:45 2017        
(r326892)
+++ head/sys/dev/bhnd/bhndb/bhndb_pci_hwdata.c  Sat Dec 16 04:35:37 2017        
(r326893)
@@ -511,7 +511,7 @@ static const struct bhndb_hwcfg bhndb_pci_hwcfg_v1_pci
                {
                        .base_addr      = BHND_PCIE_DMA64_TRANSLATION,
                        .addr_mask      = ~BHND_PCIE_DMA64_MASK,
-                       .addrext_mask   = 0
+                       .addrext_mask   = BHND_PCIE_DMA64_MASK
                },
                BHND_DMA_TRANSLATION_TABLE_END
        }
@@ -594,7 +594,7 @@ static const struct bhndb_hwcfg bhndb_pci_hwcfg_v2 = {
                {
                        .base_addr      = BHND_PCIE_DMA64_TRANSLATION,
                        .addr_mask      = ~BHND_PCIE_DMA64_MASK,
-                       .addrext_mask   = 0
+                       .addrext_mask   = BHND_PCIE_DMA64_MASK
                },
                BHND_DMA_TRANSLATION_TABLE_END
        }
@@ -672,7 +672,7 @@ static const struct bhndb_hwcfg bhndb_pci_hwcfg_v3 = {
                {
                        .base_addr      = BHND_PCIE2_DMA64_TRANSLATION,
                        .addr_mask      = ~BHND_PCIE2_DMA64_MASK,
-                       .addrext_mask   = 0
+                       .addrext_mask   = BHND_PCIE_DMA64_MASK
                },
                BHND_DMA_TRANSLATION_TABLE_END
        }

Modified: head/sys/dev/bhnd/bhndb/bhndb_subr.c
==============================================================================
--- head/sys/dev/bhnd/bhndb/bhndb_subr.c        Sat Dec 16 00:47:45 2017        
(r326892)
+++ head/sys/dev/bhnd/bhndb/bhndb_subr.c        Sat Dec 16 04:35:37 2017        
(r326893)
@@ -521,12 +521,12 @@ bhndb_dma_tag_create(device_t dev, bus_dma_tag_t paren
 {
        bus_dma_tag_t   translation_tag;
        bhnd_addr_t     dt_mask;
-       bus_addr_t      boundary;
        bus_addr_t      lowaddr, highaddr;
+       bus_size_t      maxsegsz;
        int             error;
 
        highaddr = BUS_SPACE_MAXADDR;
-       boundary = 0;
+       maxsegsz = BUS_SPACE_MAXSIZE;
 
        /* Determine full addressable mask */
        dt_mask = (translation->addr_mask | translation->addrext_mask);
@@ -536,19 +536,17 @@ bhndb_dma_tag_create(device_t dev, bus_dma_tag_t paren
        /* (addr_mask|addrext_mask) is our maximum supported address */
        lowaddr = MIN(dt_mask, BUS_SPACE_MAXADDR);
 
-       /* Do we need to to avoid crossing a DMA translation window boundary? */
-       if (translation->addr_mask < BUS_SPACE_MAXADDR) {
-               /* round down to nearest power of two */
-               boundary = translation->addr_mask & (~1ULL);
-       }
+       /* Constrain to translation window size */
+       if (translation->addr_mask < maxsegsz)
+               maxsegsz = translation->addr_mask;
 
        /* Create our DMA tag */
        error = bus_dma_tag_create(parent_dmat,
-           1,                          /* alignment */
-           boundary, lowaddr, highaddr,
+           1, 0,                       /* alignment, boundary */
+           lowaddr, highaddr,
            NULL, NULL,                 /* filter, filterarg */
            BUS_SPACE_MAXSIZE, 0,       /* maxsize, nsegments */
-           BUS_SPACE_MAXSIZE, 0,       /* maxsegsize, flags */
+           maxsegsz, 0,                /* maxsegsize, flags */
            NULL, NULL,                 /* lockfunc, lockarg */
            &translation_tag);
        if (error) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to