From: Alvin Lee <[email protected]>

[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 <[email protected]>
Signed-off-by: Alvin Lee <[email protected]>
Signed-off-by: George Zhang <[email protected]>
---
 drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c | 29 ++++++++++++-----
 drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h | 34 +++++++++++++++++---
 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 66836b38d0e1..3fe30c8769d3 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(
--
2.54.0

Reply via email to