* [PATCH 21/21] drm/amd/display: Ignore First MST Sideband Message Return Error
[not found] <20220708163529.3534276-1-solomon.chiu@amd.com>
@ 2022-07-12 15:42 ` Solomon Chiu
2022-07-12 15:47 ` [21/21] " Limonciello, Mario
0 siblings, 1 reply; 2+ messages in thread
From: Solomon Chiu @ 2022-07-12 15:42 UTC (permalink / raw)
To: amd-gfx
Cc: Harry.Wentland, Sunpeng.Li, Bhawanpreet.Lakha, Rodrigo.Siqueira,
Aurabindo.Pillai, qingqing.zhuo, roman.li, wayne.lin, stylon.wang,
solomon.chiu, pavle.kotarac, agustin.gutierrez, Fangzhi Zuo,
stable, Daniel Wheeler
From: Fangzhi Zuo <Jerry.Zuo@amd.com>
[why]
First MST sideband message returns AUX_RET_ERROR_HPD_DISCON
on certain intel platform. Aux transaction considered failure
if HPD unexpected pulled low. The actual aux transaction success
in such case, hence do not return error.
[how]
Not returning error when AUX_RET_ERROR_HPD_DISCON detected
on the first sideband message.
Cc: stable@vger.kernel.org # 4.18+
Signed-off-by: Fangzhi Zuo <Jerry.Zuo@amd.com>
Acked-by: Solomon Chiu <solomon.chiu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
---
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 +++++++++++++++++++
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 8 ++++++
.../display/amdgpu_dm/amdgpu_dm_mst_types.c | 17 ++++++++++++
3 files changed, 52 insertions(+)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 476fe60f4b7d..e203d75834de 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -72,6 +72,7 @@
#include <linux/pci.h>
#include <linux/firmware.h>
#include <linux/component.h>
+#include <linux/dmi.h>
#include <drm/drm_atomic.h>
#include <drm/drm_atomic_uapi.h>
@@ -1400,6 +1401,29 @@ static bool dm_should_disable_stutter(struct pci_dev *pdev)
return false;
}
+static const struct dmi_system_id hpd_disconnect_quirk_table[] = {
+ {
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3660"),
+ },
+ },
+ {}
+};
+
+void retrieve_dmi_info(struct amdgpu_display_manager *dm)
+{
+ const struct dmi_system_id *dmi_id;
+
+ dm->aux_hpd_discon_quirk = false;
+
+ dmi_id = dmi_first_match(hpd_disconnect_quirk_table);
+ if (dmi_id) {
+ dm->aux_hpd_discon_quirk = true;
+ DRM_INFO("aux_hpd_discon_quirk attached\n");
+ }
+}
+
static int amdgpu_dm_init(struct amdgpu_device *adev)
{
struct dc_init_data init_data;
@@ -1531,6 +1555,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
init_data.nbio_reg_offsets = adev->reg_offset[NBIO_HWIP][0];
INIT_LIST_HEAD(&adev->dm.da_list);
+
+ retrieve_dmi_info(&adev->dm);
+
/* Display Core create. */
adev->dm.dc = dc_create(&init_data);
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
index e04e6b3f609f..33d66d4897dc 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
@@ -547,6 +547,14 @@ struct amdgpu_display_manager {
* last successfully applied backlight values.
*/
u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP];
+
+ /**
+ * @aux_hpd_discon_quirk:
+ *
+ * quirk for hpd discon while aux is on-going.
+ * occurred on certain intel platform
+ */
+ bool aux_hpd_discon_quirk;
};
enum dsc_clock_force_state {
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 8237029cedf5..168d5676b657 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -56,6 +56,8 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
ssize_t result = 0;
struct aux_payload payload;
enum aux_return_code_type operation_result;
+ struct amdgpu_device *adev;
+ struct ddc_service *ddc;
if (WARN_ON(msg->size > 16))
return -E2BIG;
@@ -74,6 +76,21 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
result = dc_link_aux_transfer_raw(TO_DM_AUX(aux)->ddc_service, &payload,
&operation_result);
+ /*
+ * w/a on certain intel platform where hpd is unexpected to pull low during
+ * 1st sideband message transaction by return AUX_RET_ERROR_HPD_DISCON
+ * aux transaction is succuess in such case, therefore bypass the error
+ */
+ ddc = TO_DM_AUX(aux)->ddc_service;
+ adev = ddc->ctx->driver_context;
+ if (adev->dm.aux_hpd_discon_quirk) {
+ if (msg->address == DP_SIDEBAND_MSG_DOWN_REQ_BASE &&
+ operation_result == AUX_RET_ERROR_HPD_DISCON) {
+ result = 0;
+ operation_result = AUX_RET_SUCCESS;
+ }
+ }
+
if (payload.write && result >= 0)
result = msg->size;
--
2.25.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [21/21] drm/amd/display: Ignore First MST Sideband Message Return Error
2022-07-12 15:42 ` [PATCH 21/21] drm/amd/display: Ignore First MST Sideband Message Return Error Solomon Chiu
@ 2022-07-12 15:47 ` Limonciello, Mario
0 siblings, 0 replies; 2+ messages in thread
From: Limonciello, Mario @ 2022-07-12 15:47 UTC (permalink / raw)
To: Solomon Chiu, amd-gfx
Cc: stylon.wang, Sunpeng.Li, Harry.Wentland, qingqing.zhuo,
Rodrigo.Siqueira, roman.li, stable, Daniel Wheeler, Fangzhi Zuo,
Aurabindo.Pillai, wayne.lin, Bhawanpreet.Lakha, agustin.gutierrez,
pavle.kotarac
On 7/12/2022 10:42, Solomon Chiu wrote:
> From: Fangzhi Zuo <Jerry.Zuo@amd.com>
>
> [why]
> First MST sideband message returns AUX_RET_ERROR_HPD_DISCON
> on certain intel platform. Aux transaction considered failure
> if HPD unexpected pulled low. The actual aux transaction success
> in such case, hence do not return error.
>
> [how]
> Not returning error when AUX_RET_ERROR_HPD_DISCON detected
> on the first sideband message.
>
> Cc: stable@vger.kernel.org # 4.18+
> Signed-off-by: Fangzhi Zuo <Jerry.Zuo@amd.com>
> Acked-by: Solomon Chiu <solomon.chiu@amd.com>
> Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
This particular patch was sent separately yesterday:
https://patchwork.freedesktop.org/patch/493547/
It needs to be be re-spun though as the platform list for the quirk was
jumbled.
> ---
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 27 +++++++++++++++++++
> .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 8 ++++++
> .../display/amdgpu_dm/amdgpu_dm_mst_types.c | 17 ++++++++++++
> 3 files changed, 52 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> index 476fe60f4b7d..e203d75834de 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
> @@ -72,6 +72,7 @@
> #include <linux/pci.h>
> #include <linux/firmware.h>
> #include <linux/component.h>
> +#include <linux/dmi.h>
>
> #include <drm/drm_atomic.h>
> #include <drm/drm_atomic_uapi.h>
> @@ -1400,6 +1401,29 @@ static bool dm_should_disable_stutter(struct pci_dev *pdev)
> return false;
> }
>
> +static const struct dmi_system_id hpd_disconnect_quirk_table[] = {
> + {
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
> + DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3660"),
> + },
> + },
> + {}
> +};
> +
> +void retrieve_dmi_info(struct amdgpu_display_manager *dm)
> +{
> + const struct dmi_system_id *dmi_id;
> +
> + dm->aux_hpd_discon_quirk = false;
> +
> + dmi_id = dmi_first_match(hpd_disconnect_quirk_table);
> + if (dmi_id) {
> + dm->aux_hpd_discon_quirk = true;
> + DRM_INFO("aux_hpd_discon_quirk attached\n");
> + }
> +}
> +
> static int amdgpu_dm_init(struct amdgpu_device *adev)
> {
> struct dc_init_data init_data;
> @@ -1531,6 +1555,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
> init_data.nbio_reg_offsets = adev->reg_offset[NBIO_HWIP][0];
>
> INIT_LIST_HEAD(&adev->dm.da_list);
> +
> + retrieve_dmi_info(&adev->dm);
> +
> /* Display Core create. */
> adev->dm.dc = dc_create(&init_data);
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> index e04e6b3f609f..33d66d4897dc 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
> @@ -547,6 +547,14 @@ struct amdgpu_display_manager {
> * last successfully applied backlight values.
> */
> u32 actual_brightness[AMDGPU_DM_MAX_NUM_EDP];
> +
> + /**
> + * @aux_hpd_discon_quirk:
> + *
> + * quirk for hpd discon while aux is on-going.
> + * occurred on certain intel platform
> + */
> + bool aux_hpd_discon_quirk;
> };
>
> enum dsc_clock_force_state {
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> index 8237029cedf5..168d5676b657 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
> @@ -56,6 +56,8 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
> ssize_t result = 0;
> struct aux_payload payload;
> enum aux_return_code_type operation_result;
> + struct amdgpu_device *adev;
> + struct ddc_service *ddc;
>
> if (WARN_ON(msg->size > 16))
> return -E2BIG;
> @@ -74,6 +76,21 @@ static ssize_t dm_dp_aux_transfer(struct drm_dp_aux *aux,
> result = dc_link_aux_transfer_raw(TO_DM_AUX(aux)->ddc_service, &payload,
> &operation_result);
>
> + /*
> + * w/a on certain intel platform where hpd is unexpected to pull low during
> + * 1st sideband message transaction by return AUX_RET_ERROR_HPD_DISCON
> + * aux transaction is succuess in such case, therefore bypass the error
> + */
> + ddc = TO_DM_AUX(aux)->ddc_service;
> + adev = ddc->ctx->driver_context;
> + if (adev->dm.aux_hpd_discon_quirk) {
> + if (msg->address == DP_SIDEBAND_MSG_DOWN_REQ_BASE &&
> + operation_result == AUX_RET_ERROR_HPD_DISCON) {
> + result = 0;
> + operation_result = AUX_RET_SUCCESS;
> + }
> + }
> +
> if (payload.write && result >= 0)
> result = msg->size;
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-07-12 15:47 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20220708163529.3534276-1-solomon.chiu@amd.com>
2022-07-12 15:42 ` [PATCH 21/21] drm/amd/display: Ignore First MST Sideband Message Return Error Solomon Chiu
2022-07-12 15:47 ` [21/21] " Limonciello, Mario
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox