Skip to content

Commit aec773a

Browse files
srishanmalexdeucher
authored andcommitted
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 <[email protected]> Cc: Alex Deucher <[email protected]> Signed-off-by: Alex Deucher <[email protected]> Signed-off-by: Srinivasan Shanmugam <[email protected]> Suggested-by: Christian König <[email protected]>
1 parent f49280f commit aec773a

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1416,3 +1416,38 @@ void amdgpu_gfx_sysfs_fini(struct amdgpu_device *adev)
14161416
device_remove_file(adev->dev, &dev_attr_current_compute_partition);
14171417
device_remove_file(adev->dev, &dev_attr_available_compute_partition);
14181418
}
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+
}

drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,14 @@ struct amdgpu_gfx {
446446
uint32_t *ip_dump_gfx_queues;
447447

448448
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;
449457
};
450458

451459
struct amdgpu_gfx_ras_reg_entry {
@@ -547,6 +555,12 @@ void amdgpu_gfx_ras_error_func(struct amdgpu_device *adev,
547555
void *ras_error_status,
548556
void (*func)(struct amdgpu_device *adev, void *ras_error_status,
549557
int xcc_id));
558+
int amdgpu_gfx_cleaner_shader_sw_init(struct amdgpu_device *adev,
559+
unsigned int cleaner_shader_size);
560+
void amdgpu_gfx_cleaner_shader_sw_fini(struct amdgpu_device *adev);
561+
void amdgpu_gfx_cleaner_shader_init(struct amdgpu_device *adev,
562+
unsigned int cleaner_shader_size,
563+
const void *cleaner_shader_ptr);
550564

551565
static inline const char *amdgpu_gfx_compute_mode_desc(int mode)
552566
{

0 commit comments

Comments
 (0)