mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 01:26:44 +07:00
drm/radeon/kms: add support for load detection on dp bridges
dp to vga bridges for example. Signed-off-by: Alex Deucher <alexdeucher@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
7ec478f835
commit
d629a3ceb4
@ -1235,6 +1235,16 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
|
|||||||
ret = connector_status_connected;
|
ret = connector_status_connected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ret == connector_status_disconnected) &&
|
||||||
|
radeon_connector->dac_load_detect) {
|
||||||
|
struct drm_encoder *encoder = radeon_best_single_encoder(connector);
|
||||||
|
struct drm_encoder_helper_funcs *encoder_funcs;
|
||||||
|
if (encoder) {
|
||||||
|
encoder_funcs = encoder->helper_private;
|
||||||
|
ret = encoder_funcs->detect(encoder, connector);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
radeon_connector_update_scratch_regs(connector, ret);
|
radeon_connector_update_scratch_regs(connector, ret);
|
||||||
@ -1408,6 +1418,10 @@ radeon_add_atom_connector(struct drm_device *dev,
|
|||||||
default:
|
default:
|
||||||
connector->interlace_allowed = true;
|
connector->interlace_allowed = true;
|
||||||
connector->doublescan_allowed = true;
|
connector->doublescan_allowed = true;
|
||||||
|
radeon_connector->dac_load_detect = true;
|
||||||
|
drm_connector_attach_property(&radeon_connector->base,
|
||||||
|
rdev->mode_info.load_detect_property,
|
||||||
|
1);
|
||||||
break;
|
break;
|
||||||
case DRM_MODE_CONNECTOR_DVII:
|
case DRM_MODE_CONNECTOR_DVII:
|
||||||
case DRM_MODE_CONNECTOR_DVID:
|
case DRM_MODE_CONNECTOR_DVID:
|
||||||
@ -1429,6 +1443,12 @@ radeon_add_atom_connector(struct drm_device *dev,
|
|||||||
connector->doublescan_allowed = true;
|
connector->doublescan_allowed = true;
|
||||||
else
|
else
|
||||||
connector->doublescan_allowed = false;
|
connector->doublescan_allowed = false;
|
||||||
|
if (connector_type == DRM_MODE_CONNECTOR_DVII) {
|
||||||
|
radeon_connector->dac_load_detect = true;
|
||||||
|
drm_connector_attach_property(&radeon_connector->base,
|
||||||
|
rdev->mode_info.load_detect_property,
|
||||||
|
1);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DRM_MODE_CONNECTOR_LVDS:
|
case DRM_MODE_CONNECTOR_LVDS:
|
||||||
case DRM_MODE_CONNECTOR_eDP:
|
case DRM_MODE_CONNECTOR_eDP:
|
||||||
|
@ -1999,6 +1999,53 @@ radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connec
|
|||||||
return connector_status_disconnected;
|
return connector_status_disconnected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum drm_connector_status
|
||||||
|
radeon_atom_dig_detect(struct drm_encoder *encoder, struct drm_connector *connector)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = encoder->dev;
|
||||||
|
struct radeon_device *rdev = dev->dev_private;
|
||||||
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||||
|
struct radeon_connector *radeon_connector = to_radeon_connector(connector);
|
||||||
|
struct drm_encoder *ext_encoder = radeon_atom_get_external_encoder(encoder);
|
||||||
|
u32 bios_0_scratch;
|
||||||
|
|
||||||
|
if (!ASIC_IS_DCE4(rdev))
|
||||||
|
return connector_status_unknown;
|
||||||
|
|
||||||
|
if (!ext_encoder)
|
||||||
|
return connector_status_unknown;
|
||||||
|
|
||||||
|
if ((radeon_connector->devices & ATOM_DEVICE_CRT_SUPPORT) == 0)
|
||||||
|
return connector_status_unknown;
|
||||||
|
|
||||||
|
/* load detect on the dp bridge */
|
||||||
|
atombios_external_encoder_setup(encoder, ext_encoder,
|
||||||
|
EXTERNAL_ENCODER_ACTION_V3_DACLOAD_DETECTION);
|
||||||
|
|
||||||
|
bios_0_scratch = RREG32(R600_BIOS_0_SCRATCH);
|
||||||
|
|
||||||
|
DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices);
|
||||||
|
if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {
|
||||||
|
if (bios_0_scratch & ATOM_S0_CRT1_MASK)
|
||||||
|
return connector_status_connected;
|
||||||
|
}
|
||||||
|
if (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT) {
|
||||||
|
if (bios_0_scratch & ATOM_S0_CRT2_MASK)
|
||||||
|
return connector_status_connected;
|
||||||
|
}
|
||||||
|
if (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT) {
|
||||||
|
if (bios_0_scratch & (ATOM_S0_CV_MASK|ATOM_S0_CV_MASK_A))
|
||||||
|
return connector_status_connected;
|
||||||
|
}
|
||||||
|
if (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT) {
|
||||||
|
if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A))
|
||||||
|
return connector_status_connected; /* CTV */
|
||||||
|
else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A))
|
||||||
|
return connector_status_connected; /* STV */
|
||||||
|
}
|
||||||
|
return connector_status_disconnected;
|
||||||
|
}
|
||||||
|
|
||||||
static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
|
static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
|
||||||
{
|
{
|
||||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||||
@ -2162,7 +2209,7 @@ static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = {
|
|||||||
.mode_set = radeon_atom_encoder_mode_set,
|
.mode_set = radeon_atom_encoder_mode_set,
|
||||||
.commit = radeon_atom_encoder_commit,
|
.commit = radeon_atom_encoder_commit,
|
||||||
.disable = radeon_atom_encoder_disable,
|
.disable = radeon_atom_encoder_disable,
|
||||||
/* no detect for TMDS/LVDS yet */
|
.detect = radeon_atom_dig_detect,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
|
static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
|
||||||
|
Loading…
Reference in New Issue
Block a user