summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
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(