Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: Add infrastructure for Cleaner Shader feature

The cleaner shader is used by the CP firmware to clean LDS and GPRs
between processes on the CUs.

This adds an internal API for GFX IP code to allocate and initialize the
cleaner shader.

Cc: Christian König <christian.koenig@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam@amd.com>
Suggested-by: Christian König <christian.koenig@amd.com>

authored by

Srinivasan Shanmugam and committed by
Alex Deucher
aec773a1 f49280ff

+49
+35
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
··· 1416 1416 device_remove_file(adev->dev, &dev_attr_current_compute_partition); 1417 1417 device_remove_file(adev->dev, &dev_attr_available_compute_partition); 1418 1418 } 1419 + 1420 + int amdgpu_gfx_cleaner_shader_sw_init(struct amdgpu_device *adev, 1421 + unsigned int cleaner_shader_size) 1422 + { 1423 + if (!adev->gfx.enable_cleaner_shader) 1424 + return -EOPNOTSUPP; 1425 + 1426 + return amdgpu_bo_create_kernel(adev, cleaner_shader_size, PAGE_SIZE, 1427 + AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT, 1428 + &adev->gfx.cleaner_shader_obj, 1429 + &adev->gfx.cleaner_shader_gpu_addr, 1430 + (void **)&adev->gfx.cleaner_shader_cpu_ptr); 1431 + } 1432 + 1433 + void amdgpu_gfx_cleaner_shader_sw_fini(struct amdgpu_device *adev) 1434 + { 1435 + if (!adev->gfx.enable_cleaner_shader) 1436 + return; 1437 + 1438 + amdgpu_bo_free_kernel(&adev->gfx.cleaner_shader_obj, 1439 + &adev->gfx.cleaner_shader_gpu_addr, 1440 + (void **)&adev->gfx.cleaner_shader_cpu_ptr); 1441 + } 1442 + 1443 + void amdgpu_gfx_cleaner_shader_init(struct amdgpu_device *adev, 1444 + unsigned int cleaner_shader_size, 1445 + const void *cleaner_shader_ptr) 1446 + { 1447 + if (!adev->gfx.enable_cleaner_shader) 1448 + return; 1449 + 1450 + if (adev->gfx.cleaner_shader_cpu_ptr && cleaner_shader_ptr) 1451 + memcpy_toio(adev->gfx.cleaner_shader_cpu_ptr, cleaner_shader_ptr, 1452 + cleaner_shader_size); 1453 + }
+14
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
··· 446 446 uint32_t *ip_dump_gfx_queues; 447 447 448 448 struct mutex reset_sem_mutex; 449 + 450 + /* cleaner shader */ 451 + struct amdgpu_bo *cleaner_shader_obj; 452 + unsigned int cleaner_shader_size; 453 + u64 cleaner_shader_gpu_addr; 454 + void *cleaner_shader_cpu_ptr; 455 + const void *cleaner_shader_ptr; 456 + bool enable_cleaner_shader; 449 457 }; 450 458 451 459 struct amdgpu_gfx_ras_reg_entry { ··· 555 547 void *ras_error_status, 556 548 void (*func)(struct amdgpu_device *adev, void *ras_error_status, 557 549 int xcc_id)); 550 + int amdgpu_gfx_cleaner_shader_sw_init(struct amdgpu_device *adev, 551 + unsigned int cleaner_shader_size); 552 + void amdgpu_gfx_cleaner_shader_sw_fini(struct amdgpu_device *adev); 553 + void amdgpu_gfx_cleaner_shader_init(struct amdgpu_device *adev, 554 + unsigned int cleaner_shader_size, 555 + const void *cleaner_shader_ptr); 558 556 559 557 static inline const char *amdgpu_gfx_compute_mode_desc(int mode) 560 558 {