mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-03-04 12:49:49 +00:00
515.48.07
This commit is contained in:
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "os-interface.h"
|
||||
#include "nv-linux.h"
|
||||
#include "nv-reg.h"
|
||||
|
||||
#define NV_DMA_DEV_PRINTF(debuglevel, dma_dev, format, ... ) \
|
||||
nv_printf(debuglevel, "NVRM: %s: " format, \
|
||||
@@ -32,6 +33,8 @@
|
||||
NULL), \
|
||||
## __VA_ARGS__)
|
||||
|
||||
NvU32 nv_dma_remap_peer_mmio = NV_DMA_REMAP_PEER_MMIO_ENABLE;
|
||||
|
||||
NV_STATUS nv_create_dma_map_scatterlist (nv_dma_map_t *dma_map);
|
||||
void nv_destroy_dma_map_scatterlist(nv_dma_map_t *dma_map);
|
||||
NV_STATUS nv_map_dma_map_scatterlist (nv_dma_map_t *dma_map);
|
||||
@@ -766,11 +769,16 @@ NV_STATUS NV_API_CALL nv_dma_unmap_alloc
|
||||
return status;
|
||||
}
|
||||
|
||||
static NvBool nv_dma_is_map_resource_implemented
|
||||
static NvBool nv_dma_use_map_resource
|
||||
(
|
||||
nv_dma_device_t *dma_dev
|
||||
)
|
||||
{
|
||||
if (nv_dma_remap_peer_mmio == NV_DMA_REMAP_PEER_MMIO_DISABLE)
|
||||
{
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
#if defined(NV_DMA_MAP_RESOURCE_PRESENT)
|
||||
const struct dma_map_ops *ops = get_dma_ops(dma_dev->dev);
|
||||
|
||||
@@ -833,7 +841,7 @@ NV_STATUS NV_API_CALL nv_dma_map_peer
|
||||
return NV_ERR_INVALID_REQUEST;
|
||||
}
|
||||
|
||||
if (nv_dma_is_map_resource_implemented(dma_dev))
|
||||
if (nv_dma_use_map_resource(dma_dev))
|
||||
{
|
||||
status = nv_dma_map_mmio(dma_dev, page_count, va);
|
||||
}
|
||||
@@ -858,7 +866,7 @@ void NV_API_CALL nv_dma_unmap_peer
|
||||
NvU64 va
|
||||
)
|
||||
{
|
||||
if (nv_dma_is_map_resource_implemented(dma_dev))
|
||||
if (nv_dma_use_map_resource(dma_dev))
|
||||
{
|
||||
nv_dma_unmap_mmio(dma_dev, page_count, va);
|
||||
}
|
||||
@@ -873,29 +881,28 @@ NV_STATUS NV_API_CALL nv_dma_map_mmio
|
||||
)
|
||||
{
|
||||
#if defined(NV_DMA_MAP_RESOURCE_PRESENT)
|
||||
NvU64 mmio_addr;
|
||||
|
||||
BUG_ON(!va);
|
||||
|
||||
mmio_addr = *va;
|
||||
|
||||
*va = dma_map_resource(dma_dev->dev, mmio_addr, page_count * PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL, 0);
|
||||
if (dma_mapping_error(dma_dev->dev, *va))
|
||||
if (nv_dma_use_map_resource(dma_dev))
|
||||
{
|
||||
NV_DMA_DEV_PRINTF(NV_DBG_ERRORS, dma_dev,
|
||||
"Failed to DMA map MMIO range [0x%llx-0x%llx]\n",
|
||||
mmio_addr, mmio_addr + page_count * PAGE_SIZE - 1);
|
||||
return NV_ERR_OPERATING_SYSTEM;
|
||||
NvU64 mmio_addr = *va;
|
||||
*va = dma_map_resource(dma_dev->dev, mmio_addr, page_count * PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL, 0);
|
||||
if (dma_mapping_error(dma_dev->dev, *va))
|
||||
{
|
||||
NV_DMA_DEV_PRINTF(NV_DBG_ERRORS, dma_dev,
|
||||
"Failed to DMA map MMIO range [0x%llx-0x%llx]\n",
|
||||
mmio_addr, mmio_addr + page_count * PAGE_SIZE - 1);
|
||||
return NV_ERR_OPERATING_SYSTEM;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* The default implementation passes through the source address
|
||||
* without failing. Adjust it using the DMA start address to keep RM's
|
||||
* validation schemes happy.
|
||||
*/
|
||||
if (!nv_dma_is_map_resource_implemented(dma_dev))
|
||||
else
|
||||
{
|
||||
/*
|
||||
* If dma_map_resource is not available, pass through the source address
|
||||
* without failing. Further, adjust it using the DMA start address to
|
||||
* keep RM's validation schemes happy.
|
||||
*/
|
||||
*va = *va + dma_dev->addressable_range.start;
|
||||
}
|
||||
|
||||
@@ -915,15 +922,13 @@ void NV_API_CALL nv_dma_unmap_mmio
|
||||
)
|
||||
{
|
||||
#if defined(NV_DMA_MAP_RESOURCE_PRESENT)
|
||||
if (!nv_dma_is_map_resource_implemented(dma_dev))
|
||||
{
|
||||
va = va - dma_dev->addressable_range.start;
|
||||
}
|
||||
|
||||
nv_dma_nvlink_addr_decompress(dma_dev, &va, page_count, NV_TRUE);
|
||||
|
||||
dma_unmap_resource(dma_dev->dev, va, page_count * PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL, 0);
|
||||
if (nv_dma_use_map_resource(dma_dev))
|
||||
{
|
||||
dma_unmap_resource(dma_dev->dev, va, page_count * PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user