Skip to content

Commit 5834c33

Browse files
Timur Kristófalexdeucher
authored andcommitted
drm/amd/display: Add concept of analog encoders (v2)
Add a num_analog_stream_encoders field to indicate how many analog stream encoders are present. When analog stream encoders are present, create them. Additionally, add an analog_engine field to link encoders and search for supported analog encoders in the BIOS for each link. When connecting an RGB signal, search for analog stream encoders. The actual DCE analog link and stream encoder is going to be added in a subsequent commit. v2: Add check to see if an analog engine is really supported. Signed-off-by: Timur Kristóf <timur.kristof@gmail.com> Reviewed-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent c219287 commit 5834c33

5 files changed

Lines changed: 51 additions & 3 deletions

File tree

drivers/gpu/drm/amd/display/dc/core/dc_resource.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,14 @@ bool resource_construct(
446446
DC_ERR("DC: failed to create stream_encoder!\n");
447447
pool->stream_enc_count++;
448448
}
449+
450+
for (i = 0; i < caps->num_analog_stream_encoder; i++) {
451+
pool->stream_enc[caps->num_stream_encoder + i] =
452+
create_funcs->create_stream_encoder(ENGINE_ID_DACA + i, ctx);
453+
if (pool->stream_enc[caps->num_stream_encoder + i] == NULL)
454+
DC_ERR("DC: failed to create analog stream_encoder %d!\n", i);
455+
pool->stream_enc_count++;
456+
}
449457
}
450458

451459
pool->hpo_dp_stream_enc_count = 0;

drivers/gpu/drm/amd/display/dc/inc/hw/link_encoder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ struct encoder_init_data {
4747
enum hpd_source_id hpd_source;
4848
/* TODO: in DAL2, here was pointer to EventManagerInterface */
4949
struct graphics_object_id encoder;
50+
enum engine_id analog_engine;
5051
struct dc_context *ctx;
5152
enum transmitter transmitter;
5253
};
@@ -83,6 +84,7 @@ struct link_encoder {
8384
struct graphics_object_id connector;
8485
uint32_t output_signals;
8586
enum engine_id preferred_engine;
87+
enum engine_id analog_engine;
8688
struct encoder_feature_support features;
8789
enum transmitter transmitter;
8890
enum hpd_source_id hpd_source;

drivers/gpu/drm/amd/display/dc/inc/resource.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct resource_caps {
4949
int num_video_plane;
5050
int num_audio;
5151
int num_stream_encoder;
52+
int num_analog_stream_encoder;
5253
int num_pll;
5354
int num_dwb;
5455
int num_ddc;

drivers/gpu/drm/amd/display/dc/link/link_factory.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,32 @@ static enum channel_id get_ddc_line(struct dc_link *link)
451451
return channel;
452452
}
453453

454+
static enum engine_id find_analog_engine(struct dc_link *link)
455+
{
456+
struct dc_bios *bp = link->ctx->dc_bios;
457+
struct graphics_object_id encoder = {0};
458+
enum bp_result bp_result = BP_RESULT_OK;
459+
int i;
460+
461+
for (i = 0; i < 3; i++) {
462+
bp_result = bp->funcs->get_src_obj(bp, link->link_id, i, &encoder);
463+
464+
if (bp_result != BP_RESULT_OK)
465+
return ENGINE_ID_UNKNOWN;
466+
467+
switch (encoder.id) {
468+
case ENCODER_ID_INTERNAL_DAC1:
469+
case ENCODER_ID_INTERNAL_KLDSCP_DAC1:
470+
return ENGINE_ID_DACA;
471+
case ENCODER_ID_INTERNAL_DAC2:
472+
case ENCODER_ID_INTERNAL_KLDSCP_DAC2:
473+
return ENGINE_ID_DACB;
474+
}
475+
}
476+
477+
return ENGINE_ID_UNKNOWN;
478+
}
479+
454480
static bool transmitter_supported(const enum transmitter transmitter)
455481
{
456482
return transmitter != TRANSMITTER_UNKNOWN &&
@@ -459,6 +485,12 @@ static bool transmitter_supported(const enum transmitter transmitter)
459485
transmitter != TRANSMITTER_TRAVIS_LCD;
460486
}
461487

488+
static bool analog_engine_supported(const enum engine_id engine_id)
489+
{
490+
return engine_id == ENGINE_ID_DACA ||
491+
engine_id == ENGINE_ID_DACB;
492+
}
493+
462494
static bool construct_phy(struct dc_link *link,
463495
const struct link_init_data *init_params)
464496
{
@@ -495,8 +527,10 @@ static bool construct_phy(struct dc_link *link,
495527
*/
496528
bp_funcs->get_src_obj(bios, link->link_id, 0, &enc_init_data.encoder);
497529
enc_init_data.transmitter = translate_encoder_to_transmitter(enc_init_data.encoder);
530+
enc_init_data.analog_engine = find_analog_engine(link);
498531

499-
if (!transmitter_supported(enc_init_data.transmitter)) {
532+
if (!transmitter_supported(enc_init_data.transmitter) &&
533+
!analog_engine_supported(enc_init_data.analog_engine)) {
500534
DC_LOG_WARNING("link_id %d has unsupported encoder\n", link->link_id.id);
501535
return false;
502536
}

drivers/gpu/drm/amd/display/dc/resource/dce100/dce100_resource.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,10 @@ struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
954954
int i;
955955
int j = -1;
956956
struct dc_link *link = stream->link;
957+
enum engine_id preferred_engine = link->link_enc->preferred_engine;
958+
959+
if (dc_is_rgb_signal(stream->signal))
960+
preferred_engine = link->link_enc->analog_engine;
957961

958962
for (i = 0; i < pool->stream_enc_count; i++) {
959963
if (!res_ctx->is_stream_enc_acquired[i] &&
@@ -962,8 +966,7 @@ struct stream_encoder *dce100_find_first_free_match_stream_enc_for_link(
962966
* in daisy chain use case
963967
*/
964968
j = i;
965-
if (pool->stream_enc[i]->id ==
966-
link->link_enc->preferred_engine)
969+
if (pool->stream_enc[i]->id == preferred_engine)
967970
return pool->stream_enc[i];
968971
}
969972
}

0 commit comments

Comments
 (0)