Commit 830821a6 authored by Nicholas Kazlauskas's avatar Nicholas Kazlauskas Committed by Alex Deucher

drm/amd/display: Fallback to DMCUB when command table is missing

[Why]
If the command table isn't available then we can fallback to DMCUB
offloading if it's enabled and available.

[How]
Instead of assigning NULL for supported command table functions we can
fallback to the DMCUB when it's available.
Signed-off-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: default avatarWesley Chalmers <Wesley.Chalmers@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 153ca760
...@@ -89,6 +89,10 @@ static enum bp_result encoder_control_digx_v1_5( ...@@ -89,6 +89,10 @@ static enum bp_result encoder_control_digx_v1_5(
struct bios_parser *bp, struct bios_parser *bp,
struct bp_encoder_control *cntl); struct bp_encoder_control *cntl);
static enum bp_result encoder_control_fallback(
struct bios_parser *bp,
struct bp_encoder_control *cntl);
static void init_dig_encoder_control(struct bios_parser *bp) static void init_dig_encoder_control(struct bios_parser *bp)
{ {
uint32_t version = uint32_t version =
...@@ -100,7 +104,7 @@ static void init_dig_encoder_control(struct bios_parser *bp) ...@@ -100,7 +104,7 @@ static void init_dig_encoder_control(struct bios_parser *bp)
break; break;
default: default:
dm_output_to_console("Don't have dig_encoder_control for v%d\n", version); dm_output_to_console("Don't have dig_encoder_control for v%d\n", version);
bp->cmd_tbl.dig_encoder_control = NULL; bp->cmd_tbl.dig_encoder_control = encoder_control_fallback;
break; break;
} }
} }
...@@ -184,6 +188,18 @@ static enum bp_result encoder_control_digx_v1_5( ...@@ -184,6 +188,18 @@ static enum bp_result encoder_control_digx_v1_5(
return result; return result;
} }
static enum bp_result encoder_control_fallback(
struct bios_parser *bp,
struct bp_encoder_control *cntl)
{
if (bp->base.ctx->dc->ctx->dmub_srv &&
bp->base.ctx->dc->debug.dmub_command_table) {
return encoder_control_digx_v1_5(bp, cntl);
}
return BP_RESULT_FAILURE;
}
/***************************************************************************** /*****************************************************************************
****************************************************************************** ******************************************************************************
** **
...@@ -196,6 +212,10 @@ static enum bp_result transmitter_control_v1_6( ...@@ -196,6 +212,10 @@ static enum bp_result transmitter_control_v1_6(
struct bios_parser *bp, struct bios_parser *bp,
struct bp_transmitter_control *cntl); struct bp_transmitter_control *cntl);
static enum bp_result transmitter_control_fallback(
struct bios_parser *bp,
struct bp_transmitter_control *cntl);
static void init_transmitter_control(struct bios_parser *bp) static void init_transmitter_control(struct bios_parser *bp)
{ {
uint8_t frev; uint8_t frev;
...@@ -209,7 +229,7 @@ static void init_transmitter_control(struct bios_parser *bp) ...@@ -209,7 +229,7 @@ static void init_transmitter_control(struct bios_parser *bp)
break; break;
default: default:
dm_output_to_console("Don't have transmitter_control for v%d\n", crev); dm_output_to_console("Don't have transmitter_control for v%d\n", crev);
bp->cmd_tbl.transmitter_control = NULL; bp->cmd_tbl.transmitter_control = transmitter_control_fallback;
break; break;
} }
} }
...@@ -273,6 +293,18 @@ static enum bp_result transmitter_control_v1_6( ...@@ -273,6 +293,18 @@ static enum bp_result transmitter_control_v1_6(
return result; return result;
} }
static enum bp_result transmitter_control_fallback(
struct bios_parser *bp,
struct bp_transmitter_control *cntl)
{
if (bp->base.ctx->dc->ctx->dmub_srv &&
bp->base.ctx->dc->debug.dmub_command_table) {
return transmitter_control_v1_6(bp, cntl);
}
return BP_RESULT_FAILURE;
}
/****************************************************************************** /******************************************************************************
****************************************************************************** ******************************************************************************
** **
...@@ -285,6 +317,10 @@ static enum bp_result set_pixel_clock_v7( ...@@ -285,6 +317,10 @@ static enum bp_result set_pixel_clock_v7(
struct bios_parser *bp, struct bios_parser *bp,
struct bp_pixel_clock_parameters *bp_params); struct bp_pixel_clock_parameters *bp_params);
static enum bp_result set_pixel_clock_fallback(
struct bios_parser *bp,
struct bp_pixel_clock_parameters *bp_params);
static void init_set_pixel_clock(struct bios_parser *bp) static void init_set_pixel_clock(struct bios_parser *bp)
{ {
switch (BIOS_CMD_TABLE_PARA_REVISION(setpixelclock)) { switch (BIOS_CMD_TABLE_PARA_REVISION(setpixelclock)) {
...@@ -294,7 +330,7 @@ static void init_set_pixel_clock(struct bios_parser *bp) ...@@ -294,7 +330,7 @@ static void init_set_pixel_clock(struct bios_parser *bp)
default: default:
dm_output_to_console("Don't have set_pixel_clock for v%d\n", dm_output_to_console("Don't have set_pixel_clock for v%d\n",
BIOS_CMD_TABLE_PARA_REVISION(setpixelclock)); BIOS_CMD_TABLE_PARA_REVISION(setpixelclock));
bp->cmd_tbl.set_pixel_clock = NULL; bp->cmd_tbl.set_pixel_clock = set_pixel_clock_fallback;
break; break;
} }
} }
...@@ -400,6 +436,18 @@ static enum bp_result set_pixel_clock_v7( ...@@ -400,6 +436,18 @@ static enum bp_result set_pixel_clock_v7(
return result; return result;
} }
static enum bp_result set_pixel_clock_fallback(
struct bios_parser *bp,
struct bp_pixel_clock_parameters *bp_params)
{
if (bp->base.ctx->dc->ctx->dmub_srv &&
bp->base.ctx->dc->debug.dmub_command_table) {
return set_pixel_clock_v7(bp, bp_params);
}
return BP_RESULT_FAILURE;
}
/****************************************************************************** /******************************************************************************
****************************************************************************** ******************************************************************************
** **
...@@ -632,6 +680,11 @@ static enum bp_result enable_disp_power_gating_v2_1( ...@@ -632,6 +680,11 @@ static enum bp_result enable_disp_power_gating_v2_1(
enum controller_id crtc_id, enum controller_id crtc_id,
enum bp_pipe_control_action action); enum bp_pipe_control_action action);
static enum bp_result enable_disp_power_gating_fallback(
struct bios_parser *bp,
enum controller_id crtc_id,
enum bp_pipe_control_action action);
static void init_enable_disp_power_gating( static void init_enable_disp_power_gating(
struct bios_parser *bp) struct bios_parser *bp)
{ {
...@@ -643,7 +696,7 @@ static void init_enable_disp_power_gating( ...@@ -643,7 +696,7 @@ static void init_enable_disp_power_gating(
default: default:
dm_output_to_console("Don't enable_disp_power_gating enable_crtc for v%d\n", dm_output_to_console("Don't enable_disp_power_gating enable_crtc for v%d\n",
BIOS_CMD_TABLE_PARA_REVISION(enabledisppowergating)); BIOS_CMD_TABLE_PARA_REVISION(enabledisppowergating));
bp->cmd_tbl.enable_disp_power_gating = NULL; bp->cmd_tbl.enable_disp_power_gating = enable_disp_power_gating_fallback;
break; break;
} }
} }
...@@ -695,6 +748,19 @@ static enum bp_result enable_disp_power_gating_v2_1( ...@@ -695,6 +748,19 @@ static enum bp_result enable_disp_power_gating_v2_1(
return result; return result;
} }
static enum bp_result enable_disp_power_gating_fallback(
struct bios_parser *bp,
enum controller_id crtc_id,
enum bp_pipe_control_action action)
{
if (bp->base.ctx->dc->ctx->dmub_srv &&
bp->base.ctx->dc->debug.dmub_command_table) {
return enable_disp_power_gating_v2_1(bp, crtc_id, action);
}
return BP_RESULT_FAILURE;
}
/****************************************************************************** /******************************************************************************
******************************************************************************* *******************************************************************************
** **
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment