summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/display/dc/bios/bios_parser.c')
-rw-r--r--drivers/gpu/drm/amd/display/dc/bios/bios_parser.c54
1 files changed, 37 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
index d1471f34e419..242032c047ed 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
@@ -98,7 +98,7 @@ struct dc_bios *bios_parser_create(
{
struct bios_parser *bp;
- bp = kzalloc(sizeof(struct bios_parser), GFP_KERNEL);
+ bp = kzalloc_obj(struct bios_parser);
if (!bp)
return NULL;
@@ -763,14 +763,14 @@ static enum bp_result bios_parser_encoder_control(
return BP_RESULT_FAILURE;
return bp->cmd_tbl.dac1_encoder_control(
- bp, cntl->action == ENCODER_CONTROL_ENABLE,
+ bp, cntl->action,
cntl->pixel_clock, ATOM_DAC1_PS2);
} else if (cntl->engine_id == ENGINE_ID_DACB) {
if (!bp->cmd_tbl.dac2_encoder_control)
return BP_RESULT_FAILURE;
return bp->cmd_tbl.dac2_encoder_control(
- bp, cntl->action == ENCODER_CONTROL_ENABLE,
+ bp, cntl->action,
cntl->pixel_clock, ATOM_DAC1_PS2);
}
@@ -780,28 +780,33 @@ static enum bp_result bios_parser_encoder_control(
return bp->cmd_tbl.dig_encoder_control(bp, cntl);
}
+static enum bp_result bios_parser_external_encoder_control(
+ struct dc_bios *dcb,
+ struct bp_external_encoder_control *cntl)
+{
+ struct bios_parser *bp = BP_FROM_DCB(dcb);
+
+ if (!bp->cmd_tbl.external_encoder_control)
+ return BP_RESULT_UNSUPPORTED;
+
+ return bp->cmd_tbl.external_encoder_control(bp, cntl);
+}
+
static enum bp_result bios_parser_dac_load_detection(
struct dc_bios *dcb,
enum engine_id engine_id,
- enum dal_device_type device_type,
- uint32_t enum_id)
+ struct graphics_object_id ext_enc_id)
{
struct bios_parser *bp = BP_FROM_DCB(dcb);
struct dc_context *ctx = dcb->ctx;
struct bp_load_detection_parameters bp_params = {0};
- enum bp_result bp_result;
+ struct bp_external_encoder_control ext_cntl = {0};
+ enum bp_result bp_result = BP_RESULT_UNSUPPORTED;
uint32_t bios_0_scratch;
uint32_t device_id_mask = 0;
- bp_params.engine_id = engine_id;
- bp_params.device_id = get_support_mask_for_device_id(device_type, enum_id);
-
- if (engine_id != ENGINE_ID_DACA &&
- engine_id != ENGINE_ID_DACB)
- return BP_RESULT_UNSUPPORTED;
-
- if (!bp->cmd_tbl.dac_load_detection)
- return BP_RESULT_UNSUPPORTED;
+ bp_params.device_id = get_support_mask_for_device_id(
+ DEVICE_TYPE_CRT, engine_id == ENGINE_ID_DACB ? 2 : 1);
if (bp_params.device_id == ATOM_DEVICE_CRT1_SUPPORT)
device_id_mask = ATOM_S0_CRT1_MASK;
@@ -815,7 +820,20 @@ static enum bp_result bios_parser_dac_load_detection(
bios_0_scratch &= ~device_id_mask;
dm_write_reg(ctx, bp->base.regs->BIOS_SCRATCH_0, bios_0_scratch);
- bp_result = bp->cmd_tbl.dac_load_detection(bp, &bp_params);
+ if (engine_id == ENGINE_ID_DACA || engine_id == ENGINE_ID_DACB) {
+ if (!bp->cmd_tbl.dac_load_detection)
+ return BP_RESULT_UNSUPPORTED;
+
+ bp_params.engine_id = engine_id;
+ bp_result = bp->cmd_tbl.dac_load_detection(bp, &bp_params);
+ } else if (ext_enc_id.id) {
+ if (!bp->cmd_tbl.external_encoder_control)
+ return BP_RESULT_UNSUPPORTED;
+
+ ext_cntl.action = EXTERNAL_ENCODER_CONTROL_DAC_LOAD_DETECT;
+ ext_cntl.encoder_id = ext_enc_id;
+ bp_result = bp->cmd_tbl.external_encoder_control(bp, &ext_cntl);
+ }
if (bp_result != BP_RESULT_OK)
return bp_result;
@@ -2667,7 +2685,7 @@ static struct integrated_info *bios_parser_create_integrated_info(
struct bios_parser *bp = BP_FROM_DCB(dcb);
struct integrated_info *info;
- info = kzalloc(sizeof(struct integrated_info), GFP_KERNEL);
+ info = kzalloc_obj(struct integrated_info);
if (info == NULL) {
ASSERT_CRITICAL(0);
@@ -2912,6 +2930,8 @@ static const struct dc_vbios_funcs vbios_funcs = {
.encoder_control = bios_parser_encoder_control,
+ .external_encoder_control = bios_parser_external_encoder_control,
+
.dac_load_detection = bios_parser_dac_load_detection,
.transmitter_control = bios_parser_transmitter_control,