mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-06 10:00:17 +00:00
drm/amd/display: Add DSC Support for Synaptics Cascaded MST Hub
commit f4f3b7dedb upstream.
Traditional synaptics hub has one MST branch device without virtual dpcd.
Synaptics cascaded hub has two chained MST branch devices. DSC decoding
is performed via root MST branch device, instead of the second MST branch
device.
Reviewed-by: Hersen Wu <hersenxs.wu@amd.com>
Acked-by: Qingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: Fangzhi Zuo <Jerry.Zuo@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
ef3064e461
commit
4194f31dca
@@ -208,6 +208,21 @@ bool needs_dsc_aux_workaround(struct dc_link *link)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_synaptics_cascaded_panamera(struct dc_link *link, struct drm_dp_mst_port *port)
|
||||||
|
{
|
||||||
|
u8 branch_vendor_data[4] = { 0 }; // Vendor data 0x50C ~ 0x50F
|
||||||
|
|
||||||
|
if (drm_dp_dpcd_read(port->mgr->aux, DP_BRANCH_VENDOR_SPECIFIC_START, &branch_vendor_data, 4) == 4) {
|
||||||
|
if (link->dpcd_caps.branch_dev_id == DP_BRANCH_DEVICE_ID_90CC24 &&
|
||||||
|
IS_SYNAPTICS_CASCADED_PANAMERA(link->dpcd_caps.branch_dev_name, branch_vendor_data)) {
|
||||||
|
DRM_INFO("Synaptics Cascaded MST hub\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnector)
|
static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnector)
|
||||||
{
|
{
|
||||||
struct dc_sink *dc_sink = aconnector->dc_sink;
|
struct dc_sink *dc_sink = aconnector->dc_sink;
|
||||||
@@ -231,6 +246,10 @@ static bool validate_dsc_caps_on_connector(struct amdgpu_dm_connector *aconnecto
|
|||||||
needs_dsc_aux_workaround(aconnector->dc_link))
|
needs_dsc_aux_workaround(aconnector->dc_link))
|
||||||
aconnector->dsc_aux = &aconnector->mst_port->dm_dp_aux.aux;
|
aconnector->dsc_aux = &aconnector->mst_port->dm_dp_aux.aux;
|
||||||
|
|
||||||
|
/* synaptics cascaded MST hub case */
|
||||||
|
if (!aconnector->dsc_aux && is_synaptics_cascaded_panamera(aconnector->dc_link, port))
|
||||||
|
aconnector->dsc_aux = port->mgr->aux;
|
||||||
|
|
||||||
if (!aconnector->dsc_aux)
|
if (!aconnector->dsc_aux)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,18 @@
|
|||||||
#define SYNAPTICS_RC_OFFSET 0x4BC
|
#define SYNAPTICS_RC_OFFSET 0x4BC
|
||||||
#define SYNAPTICS_RC_DATA 0x4C0
|
#define SYNAPTICS_RC_DATA 0x4C0
|
||||||
|
|
||||||
|
#define DP_BRANCH_VENDOR_SPECIFIC_START 0x50C
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Panamera MST Hub detection
|
||||||
|
* Offset DPCD 050Eh == 0x5A indicates cascaded MST hub case
|
||||||
|
* Check from beginning of branch device vendor specific field (050Ch)
|
||||||
|
*/
|
||||||
|
#define IS_SYNAPTICS_PANAMERA(branchDevName) (((int)branchDevName[4] & 0xF0) == 0x50 ? 1 : 0)
|
||||||
|
#define BRANCH_HW_REVISION_PANAMERA_A2 0x10
|
||||||
|
#define SYNAPTICS_CASCADED_HUB_ID 0x5A
|
||||||
|
#define IS_SYNAPTICS_CASCADED_PANAMERA(devName, data) ((IS_SYNAPTICS_PANAMERA(devName) && ((int)data[2] == SYNAPTICS_CASCADED_HUB_ID)) ? 1 : 0)
|
||||||
|
|
||||||
struct amdgpu_display_manager;
|
struct amdgpu_display_manager;
|
||||||
struct amdgpu_dm_connector;
|
struct amdgpu_dm_connector;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user