]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/amd/display: Restructure DMI quirks
authorMario Limonciello <mario.limonciello@amd.com>
Tue, 22 Apr 2025 20:58:41 +0000 (15:58 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 13 May 2025 13:30:52 +0000 (09:30 -0400)
[Why]
DMI quirks are relatively big code that makes amdgpu_dm 200 lines
larger.

[How]
Move DMI quirks into a dedicated source file and make all quirks
variables for `struct amdgpu_display_manager`.

Reviewed-by: Alex Hung <alex.hung@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Ray Wu <ray.wu@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/Makefile
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_quirks.c [new file with mode: 0644]

index ab2a97e354da1fe0f430871ab4c88d70ea47f42b..7329b8cc2576eaaf2a58dbbac8577d11f8072eac 100644 (file)
@@ -38,6 +38,7 @@ AMDGPUDM = \
        amdgpu_dm_pp_smu.o \
        amdgpu_dm_psr.o \
        amdgpu_dm_replay.o \
+       amdgpu_dm_quirks.o \
        amdgpu_dm_wb.o
 
 ifdef CONFIG_DRM_AMD_DC_FP
index 020c98efaeb74b1c8592ac8703243d5badce1494..a78a40584dd3fd3795bc1d6d75278fbd87cc52b0 100644 (file)
@@ -80,7 +80,6 @@
 #include <linux/power_supply.h>
 #include <linux/firmware.h>
 #include <linux/component.h>
-#include <linux/dmi.h>
 #include <linux/sort.h>
 
 #include <drm/display/drm_dp_mst_helper.h>
@@ -1679,153 +1678,6 @@ static bool dm_should_disable_stutter(struct pci_dev *pdev)
        return false;
 }
 
-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 645 14 inch G11 Notebook PC"),
-               },
-       },
-       {
-               .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"),
-               },
-       },
-       {
-               .callback = edp0_on_dp1_callback,
-               .matches = {
-                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-                       DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook 445 14 inch G11 Notebook PC"),
-               },
-       },
-       {
-               .callback = edp0_on_dp1_callback,
-               .matches = {
-                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
-                       DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook 465 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, struct dc_init_data *init_data)
-{
-       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);
-
-       if (!dmi_id)
-               return;
-
-       if (quirk_entries.aux_hpd_discon) {
-               dm->aux_hpd_discon_quirk = true;
-               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, "support_edp0_on_dp1 attached\n");
-       }
-}
 
 void*
 dm_allocate_gpu_mem(
@@ -2112,7 +1964,9 @@ 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, &init_data);
+       retrieve_dmi_info(&adev->dm);
+       if (adev->dm.edp0_on_dp1_quirk)
+               init_data.flags.support_edp0_on_dp1 = true;
 
        if (adev->dm.bb_from_dmub)
                init_data.bb_from_dmub = adev->dm.bb_from_dmub;
index 4b615071e93bf658ba28aaecb0b790e036a764b4..d7d92f9911e465d46c01acd97d18982eed2471ee 100644 (file)
@@ -618,6 +618,13 @@ struct amdgpu_display_manager {
         */
        bool aux_hpd_discon_quirk;
 
+       /**
+        * @edp0_on_dp1_quirk:
+        *
+        * quirk for platforms that put edp0 on DP1.
+        */
+       bool edp0_on_dp1_quirk;
+
        /**
         * @dpia_aux_lock:
         *
@@ -1068,4 +1075,6 @@ void hdmi_cec_set_edid(struct amdgpu_dm_connector *aconnector);
 void hdmi_cec_unset_edid(struct amdgpu_dm_connector *aconnector);
 int amdgpu_dm_initialize_hdmi_connector(struct amdgpu_dm_connector *aconnector);
 
+void retrieve_dmi_info(struct amdgpu_display_manager *dm);
+
 #endif /* __AMDGPU_DM_H__ */
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_quirks.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_quirks.c
new file mode 100644 (file)
index 0000000..1da07eb
--- /dev/null
@@ -0,0 +1,178 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright 2025 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors: AMD
+ *
+ */
+
+#include <linux/dmi.h>
+
+#include "amdgpu.h"
+#include "amdgpu_dm.h"
+
+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 645 14 inch G11 Notebook PC"),
+               },
+       },
+       {
+               .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"),
+               },
+       },
+       {
+               .callback = edp0_on_dp1_callback,
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook 445 14 inch G11 Notebook PC"),
+               },
+       },
+       {
+               .callback = edp0_on_dp1_callback,
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "HP"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "HP ProBook 465 16 inch G11 Notebook PC"),
+               },
+       },
+       {}
+       /* TODO: refactor this from a fixed table to a dynamic option */
+};
+
+void retrieve_dmi_info(struct amdgpu_display_manager *dm)
+{
+       struct drm_device *dev = dm->ddev;
+       int dmi_id;
+
+       dm->aux_hpd_discon_quirk = false;
+       dm->edp0_on_dp1_quirk = false;
+
+       dmi_id = dmi_check_system(dmi_quirk_table);
+
+       if (!dmi_id)
+               return;
+
+       if (quirk_entries.aux_hpd_discon) {
+               dm->aux_hpd_discon_quirk = true;
+               drm_info(dev, "aux_hpd_discon_quirk attached\n");
+       }
+       if (quirk_entries.support_edp0_on_dp1) {
+               dm->edp0_on_dp1_quirk = true;
+               drm_info(dev, "support_edp0_on_dp1 attached\n");
+       }
+}