bhnd(4): Use the new BHND_CAP_BP64 capability flag to exclude DMA

translations unsupported by the backplane.
This commit is contained in:
Landon J. Fuller 2018-03-29 19:48:50 +00:00
parent b9a9e8e9bd
commit be9a13138e
2 changed files with 11 additions and 3 deletions

View File

@ -2128,7 +2128,14 @@ bhndb_get_dma_translation(device_t dev, device_t child, u_int width,
if (sc->bus_res->res->dma_tags == NULL)
return (ENODEV);
/* Find the best matching descriptor for the requested type */
/* Is the requested width supported? */
if (width > BHND_DMA_ADDR_32BIT) {
/* Backplane must support 64-bit addressing */
if (!(sc->chipid.chip_caps & BHND_CAP_BP64))
width = BHND_DMA_ADDR_32BIT;
}
/* Find the best matching descriptor for the requested width */
addr_mask = BHND_DMA_ADDR_BITMASK(width);
match = NULL;

View File

@ -234,10 +234,11 @@ bhnd_nexus_get_dma_translation(device_t dev, device_t child,
KASSERT(width > 0 && width <= BHND_DMA_ADDR_64BIT,
("invalid width %u", width));
/* Is the requested width supported? */
if (width > BHND_DMA_ADDR_32BIT) {
/* Backplane must support 64-bit addressing */
if (!(bp->cc_caps & CHIPC_CAP_BKPLN64))
return (ENOENT);
if (!(bp->cid.chip_caps & BHND_CAP_BP64))
width = BHND_DMA_ADDR_32BIT;
}
/* No DMA address translation required */