From: Yilin Chen <yilin.c...@amd.com>

[why]
some board designs have eDP0 connected to DP1, need a way to enable
support_edp0_on_dp1 flag, otherwise edp related features cannot work

[how]
do a dmi check during dm initialization to identify systems that
require support_edp0_on_dp1. Optimize quirk table with callback
functions to set quirk entries, retrieve_dmi_info can set quirks
according to quirk entries

Cc: Mario Limonciello <mario.limoncie...@amd.com>
Cc: sta...@vger.kernel.org

Reviewed-by: Mario Limonciello <mario.limoncie...@amd.com>
Reviewed-by: Nicholas Kazlauskas <nicholas.kazlaus...@amd.com>
Signed-off-by: Yilin Chen <yilin.c...@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.moha...@amd.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 69 +++++++++++++++++--
 1 file changed, 62 insertions(+), 7 deletions(-)

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 0d21448ea700..9f53d88ad7ca 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1622,75 +1622,130 @@ static bool dm_should_disable_stutter(struct pci_dev 
*pdev)
        return false;
 }
 
-static const struct dmi_system_id hpd_disconnect_quirk_table[] = {
+struct amdgpu_dm_quirks {
+       bool aux_hpd_discon;
+       bool support_edp0_on_dp1;
+};
+
+static struct amdgpu_dm_quirks quirk_entries = {
+       .aux_hpd_discon = false,
+       .support_edp0_on_dp1 = false
+};
+
+static int edp0_on_dp1_callback(const struct dmi_system_id *id)
+{
+       quirk_entries.support_edp0_on_dp1 = true;
+       return 0;
+}
+
+static int aux_hpd_discon_callback(const struct dmi_system_id *id)
+{
+       quirk_entries.aux_hpd_discon = true;
+       return 0;
+}
+
+static const struct dmi_system_id dmi_quirk_table[] = {
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3660"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3260"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "Precision 3460"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Tower Plus 7010"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Tower 7010"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex SFF Plus 7010"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex SFF 7010"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Micro Plus 7010"),
                },
        },
        {
+               .callback = aux_hpd_discon_callback,
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
                        DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex Micro 7010"),
                },
        },
+       {
+               .callback = edp0_on_dp1_callback,
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "HP Elite mt645 G8 Mobile 
Thin Client"),
+               },
+       },
+       {
+               .callback = edp0_on_dp1_callback,
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "HP EliteBook 665 16 inch 
G11 Notebook PC"),
+               },
+       },
        {}
        /* TODO: refactor this from a fixed table to a dynamic option */
 };
 
-static void retrieve_dmi_info(struct amdgpu_display_manager *dm)
+static void retrieve_dmi_info(struct amdgpu_display_manager *dm, struct 
dc_init_data *init_data)
 {
-       const struct dmi_system_id *dmi_id;
+       int dmi_id;
+       struct drm_device *dev = dm->ddev;
 
        dm->aux_hpd_discon_quirk = false;
+       init_data->flags.support_edp0_on_dp1 = false;
+
+       dmi_id = dmi_check_system(dmi_quirk_table);
 
-       dmi_id = dmi_first_match(hpd_disconnect_quirk_table);
-       if (dmi_id) {
+       if (!dmi_id)
+               return;
+
+       if (quirk_entries.aux_hpd_discon) {
                dm->aux_hpd_discon_quirk = true;
-               DRM_INFO("aux_hpd_discon_quirk attached\n");
+               drm_info(dev, "aux_hpd_discon_quirk attached\n");
+       }
+       if (quirk_entries.support_edp0_on_dp1) {
+               init_data->flags.support_edp0_on_dp1 = true;
+               drm_info(dev, "aux_hpd_discon_quirk attached\n");
        }
 }
 
@@ -1999,7 +2054,7 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
        if (amdgpu_ip_version(adev, DCE_HWIP, 0) >= IP_VERSION(3, 0, 0))
                init_data.num_virtual_links = 1;
 
-       retrieve_dmi_info(&adev->dm);
+       retrieve_dmi_info(&adev->dm, &init_data);
 
        if (adev->dm.bb_from_dmub)
                init_data.bb_from_dmub = adev->dm.bb_from_dmub;
-- 
2.34.1

Reply via email to