diff options
author | Wenjing Liu <wenjing.liu@amd.com> | 2022-01-19 16:24:40 +0800 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2022-01-25 18:00:34 -0500 |
commit | ccba4e5bc856471ed009d92747376ee506fcc6ad (patch) | |
tree | 2066a523dcd6a738362c314a733b5f270194672e /drivers | |
parent | 5279e091616b74ff0e4a24e220e0552b10d88d46 (diff) | |
download | linux-ccba4e5bc856471ed009d92747376ee506fcc6ad.tar.gz linux-ccba4e5bc856471ed009d92747376ee506fcc6ad.tar.bz2 linux-ccba4e5bc856471ed009d92747376ee506fcc6ad.zip |
drm/amd/display: add more link_hwss types and method to decide which one
[why]
as we add more link_hwss we are making a generic way to determine which type
of link_hwss we should use.
Later on we may think of introduce a link policy layer. it could be a thin layer
that decide the type of link_hwss we use. So instead of passing in link and link_res
we can just pass in link_policy and swtich based on link_policy->get_link_hwss_type.
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Aric Cyr <Aric.Cyr@amd.com>
Acked-by: Rodrigo Siqueira <Rodrigo.Siqueira@amd.com>
Signed-off-by: Wenjing Liu <wenjing.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | 53 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/display/dc/inc/link_hwss.h | 3 |
2 files changed, 50 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c index 93392c67c909..c65955eafaa2 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c @@ -844,7 +844,16 @@ void setup_dp_hpo_stream(struct pipe_ctx *pipe_ctx, bool enable) } } -/******************************* dio_link_hwss ********************************/ +static void set_dummy_throttled_vcp_size(struct pipe_ctx *pipe_ctx, + struct fixed31_32 throttled_vcp_size); + +/************************* below goes to dio_link_hwss ************************/ +static bool can_use_dio_link_hwss(const struct dc_link *link, + const struct link_resource *link_res) +{ + return link->link_enc != NULL; +} + static void set_dio_throttled_vcp_size(struct pipe_ctx *pipe_ctx, struct fixed31_32 throttled_vcp_size) { @@ -855,7 +864,17 @@ static void set_dio_throttled_vcp_size(struct pipe_ctx *pipe_ctx, throttled_vcp_size); } -/***************************** hpo_dp_link_hwss *******************************/ +static const struct dc_link_hwss dio_link_hwss = { + .set_throttled_vcp_size = set_dio_throttled_vcp_size, +}; + +/*********************** below goes to hpo_dp_link_hwss ***********************/ +static bool can_use_dp_hpo_link_hwss(const struct dc_link *link, + const struct link_resource *link_res) +{ + return link_res->hpo_dp_link_enc != NULL; +} + static void set_dp_hpo_throttled_vcp_size(struct pipe_ctx *pipe_ctx, struct fixed31_32 throttled_vcp_size) { @@ -898,15 +917,33 @@ static const struct dc_link_hwss hpo_dp_link_hwss = { */ .set_hblank_min_symbol_width = set_dp_hpo_hblank_min_symbol_width, }; +/*********************** below goes to dpia_link_hwss *************************/ +static bool can_use_dpia_link_hwss(const struct dc_link *link, + const struct link_resource *link_res) +{ + return link->is_dig_mapping_flexible && + link->dc->res_pool->funcs->link_encs_assign; +} -static const struct dc_link_hwss dio_link_hwss = { - .set_throttled_vcp_size = set_dio_throttled_vcp_size, +static const struct dc_link_hwss dpia_link_hwss = { + .set_throttled_vcp_size = set_dummy_throttled_vcp_size, +}; + +/*********************** below goes to link_hwss ******************************/ +static void set_dummy_throttled_vcp_size(struct pipe_ctx *pipe_ctx, + struct fixed31_32 throttled_vcp_size) +{ + return; +} + +static const struct dc_link_hwss dummy_link_hwss = { + .set_throttled_vcp_size = set_dummy_throttled_vcp_size, }; const struct dc_link_hwss *dc_link_hwss_get(const struct dc_link *link, const struct link_resource *link_res) { - if (link_res->hpo_dp_link_enc) + if (can_use_dp_hpo_link_hwss(link, link_res)) /* TODO: some assumes that if decided link settings is 128b/132b * channel coding format hpo_dp_link_enc should be used. * Others believe that if hpo_dp_link_enc is available in link @@ -925,8 +962,12 @@ const struct dc_link_hwss *dc_link_hwss_get(const struct dc_link *link, * do work for all functions */ return &hpo_dp_link_hwss; - else + else if (can_use_dpia_link_hwss(link, link_res)) + return &dpia_link_hwss; + else if (can_use_dio_link_hwss(link, link_res)) return &dio_link_hwss; + else + return &dummy_link_hwss; } #undef DC_LOGGER diff --git a/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h b/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h index bd3b2b807431..8eff386da95e 100644 --- a/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h +++ b/drivers/gpu/drm/amd/display/dc/inc/link_hwss.h @@ -78,6 +78,9 @@ struct fixed31_32; struct pipe_ctx; struct dc_link_hwss { + /* you must define a dummy implementation and assign the function to + * dummy_link_hwss if you don't want to check for NULL pointer + */ void (*set_throttled_vcp_size)(struct pipe_ctx *pipe_ctx, struct fixed31_32 throttled_vcp_size); |