diff options
| author | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2024-11-04 14:44:16 +0100 | 
|---|---|---|
| committer | Maarten Lankhorst <maarten.lankhorst@linux.intel.com> | 2024-11-04 14:45:21 +0100 | 
| commit | d78f0ee0406803cda8801fd5201746ccf89e5e4a (patch) | |
| tree | d0d145319344a07cb6f4b47578f01236b71ad473 /drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c | |
| parent | a88f9ed63b3cec761b04cba8104b2d0b2b66b25d (diff) | |
| parent | 30169bb64580bd7bce9290c1952bf0aa6cc37fe5 (diff) | |
Merge remote-tracking branch 'drm/drm-next' into drm-misc-next
Didn't notice drm/drm-next had the build fix for drm_bridge, so ended up
committing the same patch. Sync with drm and pretend it didn't happen?
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c | 73 | 
1 files changed, 73 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c index 6df99cb00d9a..95e2796919fc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c @@ -342,3 +342,76 @@ int amdgpu_jpeg_psp_update_sram(struct amdgpu_device *adev, int inst_idx,  	return psp_execute_ip_fw_load(&adev->psp, &ucode);  } + +/* + * debugfs for to enable/disable jpeg job submission to specific core. + */ +#if defined(CONFIG_DEBUG_FS) +static int amdgpu_debugfs_jpeg_sched_mask_set(void *data, u64 val) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)data; +	u32 i, j; +	u64 mask = 0; +	struct amdgpu_ring *ring; + +	if (!adev) +		return -ENODEV; + +	mask = (1 << (adev->jpeg.num_jpeg_inst * adev->jpeg.num_jpeg_rings)) - 1; +	if ((val & mask) == 0) +		return -EINVAL; + +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			ring = &adev->jpeg.inst[i].ring_dec[j]; +			if (val & (1 << ((i * adev->jpeg.num_jpeg_rings) + j))) +				ring->sched.ready = true; +			else +				ring->sched.ready = false; +		} +	} +	/* publish sched.ready flag update effective immediately across smp */ +	smp_rmb(); +	return 0; +} + +static int amdgpu_debugfs_jpeg_sched_mask_get(void *data, u64 *val) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)data; +	u32 i, j; +	u64 mask = 0; +	struct amdgpu_ring *ring; + +	if (!adev) +		return -ENODEV; +	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { +		for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) { +			ring = &adev->jpeg.inst[i].ring_dec[j]; +			if (ring->sched.ready) +				mask |= 1 << ((i * adev->jpeg.num_jpeg_rings) + j); +		} +	} +	*val = mask; +	return 0; +} + +DEFINE_DEBUGFS_ATTRIBUTE(amdgpu_debugfs_jpeg_sched_mask_fops, +			 amdgpu_debugfs_jpeg_sched_mask_get, +			 amdgpu_debugfs_jpeg_sched_mask_set, "%llx\n"); + +#endif + +void amdgpu_debugfs_jpeg_sched_mask_init(struct amdgpu_device *adev) +{ +#if defined(CONFIG_DEBUG_FS) +	struct drm_minor *minor = adev_to_drm(adev)->primary; +	struct dentry *root = minor->debugfs_root; +	char name[32]; + +	if (!(adev->jpeg.num_jpeg_inst > 1) && !(adev->jpeg.num_jpeg_rings > 1)) +		return; +	sprintf(name, "amdgpu_jpeg_sched_mask"); +	debugfs_create_file(name, 0600, root, adev, +			    &amdgpu_debugfs_jpeg_sched_mask_fops); +#endif +}  | 
