mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 14:53:58 -04:00
Merge tag 'amd-drm-next-6.18-2025-09-19' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-next-6.18-2025-09-19: amdgpu: - Fence drv clean up fix - DPC fixes - Misc display fixes - Support the MMIO remap page as a ttm pool - JPEG parser updates - UserQ updates - VCN ctx handling fixes - Documentation updates - Misc cleanups - SMU 13.0.x updates - SI DPM updates - GC 11.x cleaner shader updates - DMCUB updates - DML fixes - Improve fallback handling for pixel encoding - VCN reset improvements - DCE6 DC updates - DSC fixes - Use devm for i2c buses - GPUVM locking updates - GPUVM documentation improvements - Drop non-DC DCE11 code - S0ix fixes - Backlight fix - SR-IOV fixes amdkfd: - SVM updates Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://lore.kernel.org/r/20250919193354.2989255-1-alexander.deucher@amd.com
This commit is contained in:
@@ -123,6 +123,7 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
|
||||
case AMDGPU_PL_GWS:
|
||||
case AMDGPU_PL_OA:
|
||||
case AMDGPU_PL_DOORBELL:
|
||||
case AMDGPU_PL_MMIO_REMAP:
|
||||
placement->num_placement = 0;
|
||||
return;
|
||||
|
||||
@@ -448,7 +449,8 @@ bool amdgpu_res_cpu_visible(struct amdgpu_device *adev,
|
||||
return false;
|
||||
|
||||
if (res->mem_type == TTM_PL_SYSTEM || res->mem_type == TTM_PL_TT ||
|
||||
res->mem_type == AMDGPU_PL_PREEMPT || res->mem_type == AMDGPU_PL_DOORBELL)
|
||||
res->mem_type == AMDGPU_PL_PREEMPT || res->mem_type == AMDGPU_PL_DOORBELL ||
|
||||
res->mem_type == AMDGPU_PL_MMIO_REMAP)
|
||||
return true;
|
||||
|
||||
if (res->mem_type != TTM_PL_VRAM)
|
||||
@@ -539,10 +541,12 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,
|
||||
old_mem->mem_type == AMDGPU_PL_GWS ||
|
||||
old_mem->mem_type == AMDGPU_PL_OA ||
|
||||
old_mem->mem_type == AMDGPU_PL_DOORBELL ||
|
||||
old_mem->mem_type == AMDGPU_PL_MMIO_REMAP ||
|
||||
new_mem->mem_type == AMDGPU_PL_GDS ||
|
||||
new_mem->mem_type == AMDGPU_PL_GWS ||
|
||||
new_mem->mem_type == AMDGPU_PL_OA ||
|
||||
new_mem->mem_type == AMDGPU_PL_DOORBELL) {
|
||||
new_mem->mem_type == AMDGPU_PL_DOORBELL ||
|
||||
new_mem->mem_type == AMDGPU_PL_MMIO_REMAP) {
|
||||
/* Nothing to save here */
|
||||
amdgpu_bo_move_notify(bo, evict, new_mem);
|
||||
ttm_bo_move_null(bo, new_mem);
|
||||
@@ -630,6 +634,12 @@ static int amdgpu_ttm_io_mem_reserve(struct ttm_device *bdev,
|
||||
mem->bus.is_iomem = true;
|
||||
mem->bus.caching = ttm_uncached;
|
||||
break;
|
||||
case AMDGPU_PL_MMIO_REMAP:
|
||||
mem->bus.offset = mem->start << PAGE_SHIFT;
|
||||
mem->bus.offset += adev->rmmio_remap.bus_addr;
|
||||
mem->bus.is_iomem = true;
|
||||
mem->bus.caching = ttm_uncached;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -647,6 +657,8 @@ static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,
|
||||
|
||||
if (bo->resource->mem_type == AMDGPU_PL_DOORBELL)
|
||||
return ((uint64_t)(adev->doorbell.base + cursor.start)) >> PAGE_SHIFT;
|
||||
else if (bo->resource->mem_type == AMDGPU_PL_MMIO_REMAP)
|
||||
return ((uint64_t)(adev->rmmio_remap.bus_addr + cursor.start)) >> PAGE_SHIFT;
|
||||
|
||||
return (adev->gmc.aper_base + cursor.start) >> PAGE_SHIFT;
|
||||
}
|
||||
@@ -1356,7 +1368,8 @@ uint64_t amdgpu_ttm_tt_pde_flags(struct ttm_tt *ttm, struct ttm_resource *mem)
|
||||
|
||||
if (mem && (mem->mem_type == TTM_PL_TT ||
|
||||
mem->mem_type == AMDGPU_PL_DOORBELL ||
|
||||
mem->mem_type == AMDGPU_PL_PREEMPT)) {
|
||||
mem->mem_type == AMDGPU_PL_PREEMPT ||
|
||||
mem->mem_type == AMDGPU_PL_MMIO_REMAP)) {
|
||||
flags |= AMDGPU_PTE_SYSTEM;
|
||||
|
||||
if (ttm->caching == ttm_cached)
|
||||
@@ -1843,6 +1856,59 @@ static void amdgpu_ttm_pools_fini(struct amdgpu_device *adev)
|
||||
adev->mman.ttm_pools = NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_ttm_mmio_remap_bo_init - Allocate the singleton 4K MMIO_REMAP BO
|
||||
* @adev: amdgpu device
|
||||
*
|
||||
* Allocates a one-page (4K) GEM BO in AMDGPU_GEM_DOMAIN_MMIO_REMAP when the
|
||||
* hardware exposes a remap base (adev->rmmio_remap.bus_addr) and the host
|
||||
* PAGE_SIZE is <= AMDGPU_GPU_PAGE_SIZE (4K). The BO is created as a regular
|
||||
* GEM object (amdgpu_bo_create).
|
||||
*
|
||||
* Return:
|
||||
* * 0 on success or intentional skip (feature not present/unsupported)
|
||||
* * negative errno on allocation failure
|
||||
*/
|
||||
static int amdgpu_ttm_mmio_remap_bo_init(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_bo_param bp;
|
||||
int r;
|
||||
|
||||
/* Skip if HW doesn't expose remap, or if PAGE_SIZE > AMDGPU_GPU_PAGE_SIZE (4K). */
|
||||
if (!adev->rmmio_remap.bus_addr || PAGE_SIZE > AMDGPU_GPU_PAGE_SIZE)
|
||||
return 0;
|
||||
|
||||
memset(&bp, 0, sizeof(bp));
|
||||
|
||||
/* Create exactly one GEM BO in the MMIO_REMAP domain. */
|
||||
bp.type = ttm_bo_type_device; /* userspace-mappable GEM */
|
||||
bp.size = AMDGPU_GPU_PAGE_SIZE; /* 4K */
|
||||
bp.byte_align = AMDGPU_GPU_PAGE_SIZE;
|
||||
bp.domain = AMDGPU_GEM_DOMAIN_MMIO_REMAP;
|
||||
bp.flags = 0;
|
||||
bp.resv = NULL;
|
||||
bp.bo_ptr_size = sizeof(struct amdgpu_bo);
|
||||
|
||||
r = amdgpu_bo_create(adev, &bp, &adev->rmmio_remap.bo);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_ttm_mmio_remap_bo_fini - Free the singleton MMIO_REMAP BO
|
||||
* @adev: amdgpu device
|
||||
*
|
||||
* Frees the kernel-owned MMIO_REMAP BO if it was allocated by
|
||||
* amdgpu_ttm_mmio_remap_bo_init().
|
||||
*/
|
||||
static void amdgpu_ttm_mmio_remap_bo_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
amdgpu_bo_unref(&adev->rmmio_remap.bo);
|
||||
adev->rmmio_remap.bo = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* amdgpu_ttm_init - Init the memory management (ttm) as well as various
|
||||
* gtt/vram related fields.
|
||||
@@ -1879,11 +1945,13 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||
}
|
||||
adev->mman.initialized = true;
|
||||
|
||||
/* Initialize VRAM pool with all of VRAM divided into pages */
|
||||
r = amdgpu_vram_mgr_init(adev);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Failed initializing VRAM heap.\n");
|
||||
return r;
|
||||
if (!adev->gmc.is_app_apu) {
|
||||
/* Initialize VRAM pool with all of VRAM divided into pages */
|
||||
r = amdgpu_vram_mgr_init(adev);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Failed initializing VRAM heap.\n");
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
||||
/* Change the size here instead of the init above so only lpfn is affected */
|
||||
@@ -2010,6 +2078,18 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Initialize MMIO-remap pool (single page 4K) */
|
||||
r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_MMIO_REMAP, 1);
|
||||
if (r) {
|
||||
dev_err(adev->dev, "Failed initializing MMIO-remap heap.\n");
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Allocate the singleton MMIO_REMAP BO (4K) if supported */
|
||||
r = amdgpu_ttm_mmio_remap_bo_init(adev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
/* Initialize preemptible memory pool */
|
||||
r = amdgpu_preempt_mgr_init(adev);
|
||||
if (r) {
|
||||
@@ -2072,6 +2152,8 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
|
||||
}
|
||||
amdgpu_bo_free_kernel(&adev->mman.sdma_access_bo, NULL,
|
||||
&adev->mman.sdma_access_ptr);
|
||||
|
||||
amdgpu_ttm_mmio_remap_bo_fini(adev);
|
||||
amdgpu_ttm_fw_reserve_vram_fini(adev);
|
||||
amdgpu_ttm_drv_reserve_vram_fini(adev);
|
||||
|
||||
@@ -2084,7 +2166,8 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
|
||||
drm_dev_exit(idx);
|
||||
}
|
||||
|
||||
amdgpu_vram_mgr_fini(adev);
|
||||
if (!adev->gmc.is_app_apu)
|
||||
amdgpu_vram_mgr_fini(adev);
|
||||
amdgpu_gtt_mgr_fini(adev);
|
||||
amdgpu_preempt_mgr_fini(adev);
|
||||
amdgpu_doorbell_fini(adev);
|
||||
@@ -2093,6 +2176,7 @@ void amdgpu_ttm_fini(struct amdgpu_device *adev)
|
||||
ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GWS);
|
||||
ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_OA);
|
||||
ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_DOORBELL);
|
||||
ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_MMIO_REMAP);
|
||||
ttm_device_fini(&adev->mman.bdev);
|
||||
adev->mman.initialized = false;
|
||||
dev_info(adev->dev, "amdgpu: ttm finalized\n");
|
||||
|
||||
Reference in New Issue
Block a user