From: Dave Airlie <airl...@redhat.com>

These allow overriding the encoder id with the frontend,
we need this for setting up MST.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 drivers/gpu/drm/radeon/atombios_encoders.c | 29 ++++++++++++++++++++++++-----
 drivers/gpu/drm/radeon/radeon_mode.h       |  4 ++++
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c 
b/drivers/gpu/drm/radeon/atombios_encoders.c
index 7c9df1e..dc55139 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -819,7 +819,7 @@ union dig_encoder_control {
 };

 void
-atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int 
panel_mode)
+atombios_dig_encoder_setup2(struct drm_encoder *encoder, int action, int 
panel_mode, int enc_override)
 {
        struct drm_device *dev = encoder->dev;
        struct radeon_device *rdev = dev->dev_private;
@@ -916,7 +916,10 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, 
int action, int panel_mo

                        if (ENCODER_MODE_IS_DP(args.v3.ucEncoderMode) && 
(dp_clock == 270000))
                                args.v1.ucConfig |= 
ATOM_ENCODER_CONFIG_V3_DPLINKRATE_2_70GHZ;
-                       args.v3.acConfig.ucDigSel = dig->dig_encoder;
+                       if (enc_override != -1)
+                               args.v3.acConfig.ucDigSel = enc_override;
+                       else
+                               args.v3.acConfig.ucDigSel = dig->dig_encoder;
                        args.v3.ucBitPerColor = radeon_atom_get_bpc(encoder);
                        break;
                case 4:
@@ -944,7 +947,11 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, 
int action, int panel_mo
                                else
                                        args.v1.ucConfig |= 
ATOM_ENCODER_CONFIG_V4_DPLINKRATE_1_62GHZ;
                        }
-                       args.v4.acConfig.ucDigSel = dig->dig_encoder;
+
+                       if (enc_override != -1)
+                               args.v4.acConfig.ucDigSel = enc_override;
+                       else
+                               args.v4.acConfig.ucDigSel = dig->dig_encoder;
                        args.v4.ucBitPerColor = radeon_atom_get_bpc(encoder);
                        if (hpd_id == RADEON_HPD_NONE)
                                args.v4.ucHPD_ID = 0;
@@ -965,6 +972,12 @@ atombios_dig_encoder_setup(struct drm_encoder *encoder, 
int action, int panel_mo

 }

+void
+atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int 
panel_mode)
+{
+       atombios_dig_encoder_setup2(encoder, action, panel_mode, -1);
+}
+
 union dig_transmitter_control {
        DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1;
        DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
@@ -974,7 +987,7 @@ union dig_transmitter_control {
 };

 void
-atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, 
uint8_t lane_num, uint8_t lane_set)
+atombios_dig_transmitter_setup2(struct drm_encoder *encoder, int action, 
uint8_t lane_num, uint8_t lane_set, int fe)
 {
        struct drm_device *dev = encoder->dev;
        struct radeon_device *rdev = dev->dev_private;
@@ -1324,7 +1337,7 @@ atombios_dig_transmitter_setup(struct drm_encoder 
*encoder, int action, uint8_t
                                args.v5.asConfig.ucHPDSel = 0;
                        else
                                args.v5.asConfig.ucHPDSel = hpd_id + 1;
-                       args.v5.ucDigEncoderSel = 1 << dig_encoder;
+                       args.v5.ucDigEncoderSel = (fe != -1) ? (1 << fe) : (1 
<< dig_encoder);
                        args.v5.ucDPLaneSet = lane_set;
                        break;
                default:
@@ -1340,6 +1353,12 @@ atombios_dig_transmitter_setup(struct drm_encoder 
*encoder, int action, uint8_t
        atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t 
*)&args);
 }

+void
+atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, 
uint8_t lane_num, uint8_t lane_set)
+{
+       atombios_dig_transmitter_setup2(encoder, action, lane_num, lane_set, 
-1);
+}
+
 bool
 atombios_set_edp_panel_power(struct drm_connector *connector, int action)
 {
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h 
b/drivers/gpu/drm/radeon/radeon_mode.h
index 6c91c97..59dd712 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -715,11 +715,15 @@ extern ssize_t
 radeon_dp_aux_transfer_native(struct drm_dp_aux *aux, struct drm_dp_aux_msg 
*msg);

 extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int 
action, int panel_mode);
+extern void atombios_dig_encoder_setup2(struct drm_encoder *encoder, int 
action, int panel_mode, int enc_override);
 extern void radeon_atom_encoder_init(struct radeon_device *rdev);
 extern void radeon_atom_disp_eng_pll_init(struct radeon_device *rdev);
 extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder,
                                           int action, uint8_t lane_num,
                                           uint8_t lane_set);
+extern void atombios_dig_transmitter_setup2(struct drm_encoder *encoder,
+                                           int action, uint8_t lane_num,
+                                           uint8_t lane_set, int fe);
 extern void radeon_atom_ext_encoder_setup_ddc(struct drm_encoder *encoder);
 extern struct drm_encoder *radeon_get_external_encoder(struct drm_encoder 
*encoder);
 void radeon_atom_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le);
-- 
2.1.0

Reply via email to