summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorAlvin Lee <Alvin.Lee2@amd.com>2026-05-05 20:45:10 -0400
committerAlex Deucher <alexander.deucher@amd.com>2026-07-01 11:17:39 -0400
commit1f8722455ed9e1771cd4fdaa8b2459a3dadc33d2 (patch)
treefb2d4740da3f3e39c231b0ac679038dceb834930 /drivers/gpu/drm
parent073875c5d27c89e7fe831e9496f8f9c2fd9e95ea (diff)
downloadlinux-next-1f8722455ed9e1771cd4fdaa8b2459a3dadc33d2.tar.gz
linux-next-1f8722455ed9e1771cd4fdaa8b2459a3dadc33d2.zip
drm/amd/display: Update LSDMA commands to explicitly handle DCC fields
[Description] - Previously linear copy commands for LSDMA assumed no DCC - Update so that there is explicit assignment for DCC related fields - Caller can 0 out the fields if DCC is not used - For linear copy command don't subtract 1 from the count - this will be done at a lower layer Reviewed-by: Rafal Ostrowski <rafal.ostrowski@amd.com> Signed-off-by: Alvin Lee <Alvin.Lee2@amd.com> Signed-off-by: George Zhang <george.zhang@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c29
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h34
2 files changed, 51 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
index 4c81989898e2..68ed0e16639d 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
+++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
@@ -2125,9 +2125,7 @@ bool dmub_lsdma_init(struct dc_dmub_srv *dc_dmub_srv)
bool dmub_lsdma_send_linear_copy_command(
struct dc_dmub_srv *dc_dmub_srv,
- uint64_t src_addr,
- uint64_t dst_addr,
- uint32_t count
+ struct lsdma_linear_copy_params copy_data
)
{
struct dc_context *dc_ctx = dc_dmub_srv->ctx;
@@ -2142,11 +2140,20 @@ bool dmub_lsdma_send_linear_copy_command(
cmd.cmd_common.header.sub_type = DMUB_CMD__LSDMA_LINEAR_COPY;
wait_type = DM_DMUB_WAIT_TYPE_NO_WAIT;
- lsdma_data->u.linear_copy_data.count = count - 1; // LSDMA controller expects bytes to copy -1
- lsdma_data->u.linear_copy_data.src_lo = src_addr & 0xFFFFFFFF;
- lsdma_data->u.linear_copy_data.src_hi = (src_addr >> 32) & 0xFFFFFFFF;
- lsdma_data->u.linear_copy_data.dst_lo = dst_addr & 0xFFFFFFFF;
- lsdma_data->u.linear_copy_data.dst_hi = (dst_addr >> 32) & 0xFFFFFFFF;
+ lsdma_data->u.linear_copy_data.count = copy_data.count;
+ lsdma_data->u.linear_copy_data.src_lo = copy_data.src_lo;
+ lsdma_data->u.linear_copy_data.src_hi = copy_data.src_hi;
+ lsdma_data->u.linear_copy_data.dst_lo = copy_data.dst_lo;
+ lsdma_data->u.linear_copy_data.dst_hi = copy_data.dst_hi;
+ lsdma_data->u.linear_copy_data.tmz = copy_data.tmz;
+ lsdma_data->u.linear_copy_data.data_format = copy_data.data_format;
+ lsdma_data->u.linear_copy_data.num_type = copy_data.num_type;
+ lsdma_data->u.linear_copy_data.read_compress = copy_data.read_compress;
+ lsdma_data->u.linear_copy_data.write_compress = copy_data.write_compress;
+ lsdma_data->u.linear_copy_data.max_com = copy_data.max_com;
+ lsdma_data->u.linear_copy_data.max_uncom = copy_data.max_uncom;
+ lsdma_data->u.linear_copy_data.cache_policy_src = copy_data.cache_policy_src;
+ lsdma_data->u.linear_copy_data.cache_policy_dst = copy_data.cache_policy_dst;
result = dc_wake_and_execute_dmub_cmd(dc_ctx, &cmd, wait_type);
@@ -2191,6 +2198,12 @@ bool dmub_lsdma_send_linear_sub_window_copy_command(
lsdma_data->u.linear_sub_window_copy_data.rect_y = copy_data.rect_y;
lsdma_data->u.linear_sub_window_copy_data.src_cache_policy = copy_data.src_cache_policy;
lsdma_data->u.linear_sub_window_copy_data.dst_cache_policy = copy_data.dst_cache_policy;
+ lsdma_data->u.linear_sub_window_copy_data.data_format = copy_data.data_format;
+ lsdma_data->u.linear_sub_window_copy_data.num_type = copy_data.num_type;
+ lsdma_data->u.linear_sub_window_copy_data.read_compress = copy_data.read_compress;
+ lsdma_data->u.linear_sub_window_copy_data.write_compress = copy_data.write_compress;
+ lsdma_data->u.linear_sub_window_copy_data.max_com = copy_data.max_com;
+ lsdma_data->u.linear_sub_window_copy_data.max_uncom = copy_data.max_uncom;
result = dc_wake_and_execute_dmub_cmd(dc_ctx, &cmd, wait_type);
diff --git a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h
index 5d399e6a8345..8bdaac0b0f98 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h
@@ -203,11 +203,31 @@ void dc_dmub_srv_fams2_passthrough_flip(
int surface_count);
bool dmub_lsdma_init(struct dc_dmub_srv *dc_dmub_srv);
+
+struct lsdma_linear_copy_params {
+ uint32_t src_lo;
+ uint32_t src_hi;
+
+ uint32_t dst_lo;
+ uint32_t dst_hi;
+
+ uint32_t count : 30;
+ uint32_t read_compress : 2;
+
+ uint32_t tmz : 4;
+ uint32_t cache_policy_src : 3;
+ uint32_t cache_policy_dst : 3;
+ uint32_t data_format : 6;
+ uint32_t num_type : 3;
+ uint32_t write_compress : 2;
+ uint32_t max_com : 2;
+ uint32_t max_uncom : 1;
+ uint32_t reserved0 : 8;
+};
+
bool dmub_lsdma_send_linear_copy_command(
struct dc_dmub_srv *dc_dmub_srv,
- uint64_t src_addr,
- uint64_t dst_addr,
- uint32_t count);
+ struct lsdma_linear_copy_params copy_data);
struct lsdma_linear_sub_window_copy_params {
uint32_t src_lo;
@@ -235,7 +255,13 @@ struct lsdma_linear_sub_window_copy_params {
uint32_t element_size : 3;
uint32_t src_cache_policy : 3;
uint32_t dst_cache_policy : 3;
- uint32_t padding : 19;
+ uint32_t data_format : 6;
+ uint32_t num_type : 3;
+ uint32_t read_compress : 2;
+ uint32_t write_compress : 2;
+ uint32_t max_com : 2;
+ uint32_t max_uncom : 1;
+ uint32_t reserved0 : 3;
};
bool dmub_lsdma_send_linear_sub_window_copy_command(