svn commit: r326893 - head/sys/dev/bhnd/bhndb
Landon J. Fuller
landonf at FreeBSD.org
Sat Dec 16 04:35:38 UTC 2017
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) {
More information about the svn-src-all
mailing list