]> xenbits.xensource.com Git - people/aperard/linux.git/commitdiff
drm/amdgpu: respect the abmlevel module parameter value if it is set
authorHamza Mahfooz <hamza.mahfooz@amd.com>
Fri, 9 Feb 2024 19:45:15 +0000 (14:45 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 12 Feb 2024 21:14:05 +0000 (16:14 -0500)
Currently, if the abmlevel module parameter is set, it is possible for
user space to override the ABM level at some point after boot. However,
that is undesirable because it means that we aren't respecting the
user's wishes with regard to the level that they want to use. So,
prevent user space from changing the ABM level if the module parameter
is set to a non-auto value.

Tested-by: Mario Limonciello <mario.limonciello@amd.com>
Reviewed-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 1291b8eb9dffa3cfa0209d26e9fa3271eb8973cc..f5c8187e0d5829399463933719c0b0cd51cfce89 100644 (file)
@@ -196,7 +196,7 @@ extern int amdgpu_smu_pptable_id;
 extern uint amdgpu_dc_feature_mask;
 extern uint amdgpu_dc_debug_mask;
 extern uint amdgpu_dc_visual_confirm;
-extern uint amdgpu_dm_abm_level;
+extern int amdgpu_dm_abm_level;
 extern int amdgpu_backlight;
 extern int amdgpu_damage_clips;
 extern struct amdgpu_mgpu_info mgpu_info;
index 6ef7f22c1152c163f106cac24954ec2550595401..af7fae7907d71ed9efb771f50acdf483b4230113 100644 (file)
@@ -849,12 +849,13 @@ module_param_named(visualconfirm, amdgpu_dc_visual_confirm, uint, 0444);
  * the ABM algorithm, with 1 being the least reduction and 4 being the most
  * reduction.
  *
- * Defaults to 0, or disabled. Userspace can still override this level later
- * after boot.
+ * Defaults to -1, or disabled. Userspace can only override this level after
+ * boot if it's set to auto.
  */
-uint amdgpu_dm_abm_level;
-MODULE_PARM_DESC(abmlevel, "ABM level (0 = off (default), 1-4 = backlight reduction level) ");
-module_param_named(abmlevel, amdgpu_dm_abm_level, uint, 0444);
+int amdgpu_dm_abm_level = -1;
+MODULE_PARM_DESC(abmlevel,
+                "ABM level (0 = off, 1-4 = backlight reduction level, -1 auto (default))");
+module_param_named(abmlevel, amdgpu_dm_abm_level, int, 0444);
 
 int amdgpu_backlight = -1;
 MODULE_PARM_DESC(backlight, "Backlight control (0 = pwm, 1 = aux, -1 auto (default))");
index ede6469c80afb2a399a40c427e8cfecb194bd089..367868ad20d7783e09028713b468f38c24d7a20d 100644 (file)
@@ -6512,7 +6512,8 @@ static void amdgpu_dm_connector_unregister(struct drm_connector *connector)
 {
        struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector);
 
-       if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
+       if (connector->connector_type == DRM_MODE_CONNECTOR_eDP &&
+           amdgpu_dm_abm_level < 0)
                sysfs_remove_group(&connector->kdev->kobj, &amdgpu_group);
 
        drm_dp_aux_unregister(&amdgpu_dm_connector->dm_dp_aux.aux);
@@ -6576,9 +6577,12 @@ void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
                state->vcpi_slots = 0;
                state->pbn = 0;
 
-               if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
-                       state->abm_level = amdgpu_dm_abm_level ?:
-                               ABM_LEVEL_IMMEDIATE_DISABLE;
+               if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
+                       if (amdgpu_dm_abm_level <= 0)
+                               state->abm_level = ABM_LEVEL_IMMEDIATE_DISABLE;
+                       else
+                               state->abm_level = amdgpu_dm_abm_level;
+               }
 
                __drm_atomic_helper_connector_reset(connector, &state->base);
        }
@@ -6616,7 +6620,8 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector)
                to_amdgpu_dm_connector(connector);
        int r;
 
-       if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
+       if (connector->connector_type == DRM_MODE_CONNECTOR_eDP &&
+           amdgpu_dm_abm_level < 0) {
                r = sysfs_create_group(&connector->kdev->kobj,
                                       &amdgpu_group);
                if (r)
@@ -7646,7 +7651,8 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
        aconnector->base.state->max_requested_bpc = aconnector->base.state->max_bpc;
 
        if (connector_type == DRM_MODE_CONNECTOR_eDP &&
-           (dc_is_dmcu_initialized(adev->dm.dc) || adev->dm.dc->ctx->dmub_srv)) {
+           (dc_is_dmcu_initialized(adev->dm.dc) ||
+            adev->dm.dc->ctx->dmub_srv) && amdgpu_dm_abm_level < 0) {
                drm_object_attach_property(&aconnector->base.base,
                                adev->mode_info.abm_level_property, 0);
        }