Skip to content

Commit deb072d

Browse files
Timur Kristófalexdeucher
authored andcommitted
drm/amd/display: Implement DCE analog stream encoders
Add analog stream encoders for DCE which will be used when connecting an analog display through VGA or DVI-I. Considering that all stream encoder functions currently deal with digital streams, there is nothing for an analog stream encoder to do, making them basically a no-op. That being said, we still need some kind of stream encoder to represent an analog stream, and it is beneficial to split them from digital stream encoders in the code to make sure they don't accidentally write any DIG* registers. On supported chips there is currently up to 1 analog encoder, which is DACA. There are references to DACB in some code such as VBIOS commands and register files but it seems to be not present on DCE 6 and newer. Set num_analog_stream_encoder = 1 so that we can support the analog connectors on DCE 6-10, for now. 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 5834c33 commit deb072d

5 files changed

Lines changed: 41 additions & 0 deletions

File tree

drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,3 +1567,17 @@ void dce110_stream_encoder_construct(
15671567
enc110->se_shift = se_shift;
15681568
enc110->se_mask = se_mask;
15691569
}
1570+
1571+
static const struct stream_encoder_funcs dce110_an_str_enc_funcs = {0};
1572+
1573+
void dce110_analog_stream_encoder_construct(
1574+
struct dce110_stream_encoder *enc110,
1575+
struct dc_context *ctx,
1576+
struct dc_bios *bp,
1577+
enum engine_id eng_id)
1578+
{
1579+
enc110->base.funcs = &dce110_an_str_enc_funcs;
1580+
enc110->base.ctx = ctx;
1581+
enc110->base.id = eng_id;
1582+
enc110->base.bp = bp;
1583+
}

drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -708,6 +708,11 @@ void dce110_stream_encoder_construct(
708708
const struct dce_stream_encoder_shift *se_shift,
709709
const struct dce_stream_encoder_mask *se_mask);
710710

711+
void dce110_analog_stream_encoder_construct(
712+
struct dce110_stream_encoder *enc110,
713+
struct dc_context *ctx,
714+
struct dc_bios *bp,
715+
enum engine_id eng_id);
711716

712717
void dce110_se_audio_mute_control(
713718
struct stream_encoder *enc, bool mute);

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ static const struct bios_registers bios_regs = {
375375
static const struct resource_caps res_cap = {
376376
.num_timing_generator = 6,
377377
.num_audio = 6,
378+
.num_analog_stream_encoder = 1,
378379
.num_stream_encoder = 6,
379380
.num_pll = 3,
380381
.num_ddc = 6,
@@ -486,6 +487,11 @@ static struct stream_encoder *dce100_stream_encoder_create(
486487
if (!enc110)
487488
return NULL;
488489

490+
if (eng_id == ENGINE_ID_DACA || eng_id == ENGINE_ID_DACB) {
491+
dce110_analog_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id);
492+
return &enc110->base;
493+
}
494+
489495
dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
490496
&stream_enc_regs[eng_id], &se_shift, &se_mask);
491497
return &enc110->base;

drivers/gpu/drm/amd/display/dc/resource/dce60/dce60_resource.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ static const struct bios_registers bios_regs = {
373373
static const struct resource_caps res_cap = {
374374
.num_timing_generator = 6,
375375
.num_audio = 6,
376+
.num_analog_stream_encoder = 1,
376377
.num_stream_encoder = 6,
377378
.num_pll = 3,
378379
.num_ddc = 6,
@@ -382,13 +383,15 @@ static const struct resource_caps res_cap_61 = {
382383
.num_timing_generator = 4,
383384
.num_audio = 6,
384385
.num_stream_encoder = 6,
386+
.num_analog_stream_encoder = 1,
385387
.num_pll = 3,
386388
.num_ddc = 6,
387389
};
388390

389391
static const struct resource_caps res_cap_64 = {
390392
.num_timing_generator = 2,
391393
.num_audio = 2,
394+
.num_analog_stream_encoder = 1,
392395
.num_stream_encoder = 2,
393396
.num_pll = 3,
394397
.num_ddc = 2,
@@ -599,6 +602,11 @@ static struct stream_encoder *dce60_stream_encoder_create(
599602
if (!enc110)
600603
return NULL;
601604

605+
if (eng_id == ENGINE_ID_DACA || eng_id == ENGINE_ID_DACB) {
606+
dce110_analog_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id);
607+
return &enc110->base;
608+
}
609+
602610
dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
603611
&stream_enc_regs[eng_id],
604612
&se_shift, &se_mask);

drivers/gpu/drm/amd/display/dc/resource/dce80/dce80_resource.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@ static const struct bios_registers bios_regs = {
375375
static const struct resource_caps res_cap = {
376376
.num_timing_generator = 6,
377377
.num_audio = 6,
378+
.num_analog_stream_encoder = 1,
378379
.num_stream_encoder = 6,
379380
.num_pll = 3,
380381
.num_ddc = 6,
@@ -383,6 +384,7 @@ static const struct resource_caps res_cap = {
383384
static const struct resource_caps res_cap_81 = {
384385
.num_timing_generator = 4,
385386
.num_audio = 7,
387+
.num_analog_stream_encoder = 1,
386388
.num_stream_encoder = 7,
387389
.num_pll = 3,
388390
.num_ddc = 6,
@@ -391,6 +393,7 @@ static const struct resource_caps res_cap_81 = {
391393
static const struct resource_caps res_cap_83 = {
392394
.num_timing_generator = 2,
393395
.num_audio = 6,
396+
.num_analog_stream_encoder = 1,
394397
.num_stream_encoder = 6,
395398
.num_pll = 2,
396399
.num_ddc = 2,
@@ -607,6 +610,11 @@ static struct stream_encoder *dce80_stream_encoder_create(
607610
if (!enc110)
608611
return NULL;
609612

613+
if (eng_id == ENGINE_ID_DACA || eng_id == ENGINE_ID_DACB) {
614+
dce110_analog_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id);
615+
return &enc110->base;
616+
}
617+
610618
dce110_stream_encoder_construct(enc110, ctx, ctx->dc_bios, eng_id,
611619
&stream_enc_regs[eng_id],
612620
&se_shift, &se_mask);

0 commit comments

Comments
 (0)