mirror of
https://github.com/NVIDIA/open-gpu-kernel-modules.git
synced 2026-02-05 23:59:59 +00:00
580.65.06
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: Copyright (c) 1999-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-FileCopyrightText: Copyright (c) 1999-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -61,16 +61,11 @@ static NV_STATUS nv_dma_map_contig(
|
||||
NvU64 *va
|
||||
)
|
||||
{
|
||||
#if defined(NV_DMA_MAP_PAGE_ATTRS_PRESENT) && defined(NV_DMA_ATTR_SKIP_CPU_SYNC_PRESENT)
|
||||
*va = dma_map_page_attrs(dma_map->dev, dma_map->pages[0], 0,
|
||||
dma_map->page_count * PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL,
|
||||
(dma_map->cache_type == NV_MEMORY_UNCACHED) ?
|
||||
DMA_ATTR_SKIP_CPU_SYNC : 0);
|
||||
#else
|
||||
*va = dma_map_page(dma_map->dev, dma_map->pages[0], 0,
|
||||
dma_map->page_count * PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||
#endif
|
||||
if (dma_mapping_error(dma_map->dev, *va))
|
||||
{
|
||||
return NV_ERR_OPERATING_SYSTEM;
|
||||
@@ -95,16 +90,11 @@ static NV_STATUS nv_dma_map_contig(
|
||||
|
||||
static void nv_dma_unmap_contig(nv_dma_map_t *dma_map)
|
||||
{
|
||||
#if defined(NV_DMA_MAP_PAGE_ATTRS_PRESENT) && defined(NV_DMA_ATTR_SKIP_CPU_SYNC_PRESENT)
|
||||
dma_unmap_page_attrs(dma_map->dev, dma_map->mapping.contig.dma_addr,
|
||||
dma_map->page_count * PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL,
|
||||
(dma_map->cache_type == NV_MEMORY_UNCACHED) ?
|
||||
DMA_ATTR_SKIP_CPU_SYNC : 0);
|
||||
#else
|
||||
dma_unmap_page(dma_map->dev, dma_map->mapping.contig.dma_addr,
|
||||
dma_map->page_count * PAGE_SIZE, DMA_BIDIRECTIONAL);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void nv_fill_scatterlist
|
||||
@@ -386,7 +376,7 @@ NV_STATUS NV_API_CALL nv_dma_map_sgt(
|
||||
return NV_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
if (page_count > NV_NUM_PHYSPAGES)
|
||||
if (page_count > get_num_physpages())
|
||||
{
|
||||
NV_DMA_DEV_PRINTF(NV_DBG_ERRORS, dma_dev,
|
||||
"DMA mapping request too large!\n");
|
||||
@@ -467,7 +457,7 @@ static NV_STATUS NV_API_CALL nv_dma_map_pages(
|
||||
return NV_ERR_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
if (page_count > NV_NUM_PHYSPAGES)
|
||||
if (page_count > get_num_physpages())
|
||||
{
|
||||
NV_DMA_DEV_PRINTF(NV_DBG_ERRORS, dma_dev,
|
||||
"DMA mapping request too large!\n");
|
||||
@@ -537,7 +527,7 @@ static NV_STATUS NV_API_CALL nv_dma_unmap_pages(
|
||||
|
||||
dma_map = *priv;
|
||||
|
||||
if (page_count > NV_NUM_PHYSPAGES)
|
||||
if (page_count > get_num_physpages())
|
||||
{
|
||||
NV_DMA_DEV_PRINTF(NV_DBG_ERRORS, dma_dev,
|
||||
"DMA unmapping request too large!\n");
|
||||
@@ -708,16 +698,13 @@ static NvBool nv_dma_use_map_resource
|
||||
nv_dma_device_t *dma_dev
|
||||
)
|
||||
{
|
||||
#if defined(NV_DMA_MAP_RESOURCE_PRESENT)
|
||||
const struct dma_map_ops *ops = get_dma_ops(dma_dev->dev);
|
||||
#endif
|
||||
|
||||
if (nv_dma_remap_peer_mmio == NV_DMA_REMAP_PEER_MMIO_DISABLE)
|
||||
{
|
||||
return NV_FALSE;
|
||||
}
|
||||
|
||||
#if defined(NV_DMA_MAP_RESOURCE_PRESENT)
|
||||
if (ops == NULL)
|
||||
{
|
||||
/* On pre-5.0 kernels, if dma_map_resource() is present, then we
|
||||
@@ -732,9 +719,32 @@ static NvBool nv_dma_use_map_resource
|
||||
}
|
||||
|
||||
return (ops->map_resource != NULL);
|
||||
#else
|
||||
return NV_FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* DMA-map a peer device's C2C aperture for peer access. */
|
||||
NV_STATUS NV_API_CALL nv_dma_map_non_pci_peer
|
||||
(
|
||||
nv_dma_device_t *dma_dev,
|
||||
NvU64 page_count,
|
||||
NvU64 *va
|
||||
)
|
||||
{
|
||||
NV_STATUS status;
|
||||
|
||||
if (nv_dma_use_map_resource(dma_dev))
|
||||
{
|
||||
status = nv_dma_map_mmio(dma_dev, page_count, va);
|
||||
}
|
||||
else
|
||||
{
|
||||
/*
|
||||
* Best effort - can't map through the iommu but at least try to
|
||||
* use SPA as is.
|
||||
*/
|
||||
status = NV_OK;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/* DMA-map a peer PCI device's BAR for peer access. */
|
||||
@@ -817,7 +827,6 @@ NV_STATUS NV_API_CALL nv_dma_map_mmio
|
||||
NvU64 *va
|
||||
)
|
||||
{
|
||||
#if defined(NV_DMA_MAP_RESOURCE_PRESENT)
|
||||
BUG_ON(!va);
|
||||
|
||||
if (nv_dma_use_map_resource(dma_dev))
|
||||
@@ -844,9 +853,6 @@ NV_STATUS NV_API_CALL nv_dma_map_mmio
|
||||
}
|
||||
|
||||
return NV_OK;
|
||||
#else
|
||||
return NV_ERR_NOT_SUPPORTED;
|
||||
#endif
|
||||
}
|
||||
|
||||
void NV_API_CALL nv_dma_unmap_mmio
|
||||
@@ -856,13 +862,11 @@ void NV_API_CALL nv_dma_unmap_mmio
|
||||
NvU64 va
|
||||
)
|
||||
{
|
||||
#if defined(NV_DMA_MAP_RESOURCE_PRESENT)
|
||||
if (nv_dma_use_map_resource(dma_dev))
|
||||
{
|
||||
dma_unmap_resource(dma_dev->dev, va, page_count * PAGE_SIZE,
|
||||
DMA_BIDIRECTIONAL, 0);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -905,40 +909,16 @@ void NV_API_CALL nv_dma_cache_invalidate
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(NV_LINUX_DMA_BUF_H_PRESENT) && \
|
||||
defined(NV_DRM_AVAILABLE) && defined(NV_DRM_DRM_GEM_H_PRESENT)
|
||||
|
||||
/*
|
||||
* drm_gem_object_{get/put}() added by commit
|
||||
* e6b62714e87c8811d5564b6a0738dcde63a51774 (2017-02-28) and
|
||||
* drm_gem_object_{reference/unreference}() removed by commit
|
||||
* 3e70fd160cf0b1945225eaa08dd2cb8544f21cb8 (2018-11-15).
|
||||
*/
|
||||
#if defined(NV_DRM_AVAILABLE)
|
||||
|
||||
static inline void
|
||||
nv_dma_gem_object_unreference_unlocked(struct drm_gem_object *gem)
|
||||
nv_dma_gem_object_put_unlocked(struct drm_gem_object *gem)
|
||||
{
|
||||
#if defined(NV_DRM_GEM_OBJECT_GET_PRESENT)
|
||||
|
||||
#if defined(NV_DRM_GEM_OBJECT_PUT_UNLOCK_PRESENT)
|
||||
drm_gem_object_put_unlocked(gem);
|
||||
#else
|
||||
drm_gem_object_put(gem);
|
||||
#endif
|
||||
|
||||
#else
|
||||
drm_gem_object_unreference_unlocked(gem);
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void
|
||||
nv_dma_gem_object_reference(struct drm_gem_object *gem)
|
||||
{
|
||||
#if defined(NV_DRM_GEM_OBJECT_GET_PRESENT)
|
||||
drm_gem_object_get(gem);
|
||||
#else
|
||||
drm_gem_object_reference(gem);
|
||||
#endif
|
||||
}
|
||||
|
||||
NV_STATUS NV_API_CALL nv_dma_import_sgt
|
||||
@@ -967,7 +947,7 @@ NV_STATUS NV_API_CALL nv_dma_import_sgt
|
||||
|
||||
// Do nothing with SGT, it is already mapped and pinned by the exporter
|
||||
|
||||
nv_dma_gem_object_reference(gem);
|
||||
drm_gem_object_get(gem);
|
||||
|
||||
return NV_OK;
|
||||
}
|
||||
@@ -986,7 +966,7 @@ void NV_API_CALL nv_dma_release_sgt
|
||||
// Do nothing with SGT, it will be unmapped and unpinned by the exporter
|
||||
WARN_ON(sgt == NULL);
|
||||
|
||||
nv_dma_gem_object_unreference_unlocked(gem);
|
||||
nv_dma_gem_object_put_unlocked(gem);
|
||||
|
||||
module_put(gem->dev->driver->fops->owner);
|
||||
}
|
||||
@@ -1010,4 +990,4 @@ void NV_API_CALL nv_dma_release_sgt
|
||||
)
|
||||
{
|
||||
}
|
||||
#endif /* NV_LINUX_DMA_BUF_H_PRESENT && NV_DRM_AVAILABLE && NV_DRM_DRM_GEM_H_PRESENT */
|
||||
#endif /* NV_DRM_AVAILABLE */
|
||||
|
||||
Reference in New Issue
Block a user