diff --git a/drivers/gpu/drm/amd/amdgpu/Kconfig b/drivers/gpu/drm/amd/amdgpu/Kconfig
index 22d88f8ef527..2ab57ccf6f21 100644
--- a/drivers/gpu/drm/amd/amdgpu/Kconfig
+++ b/drivers/gpu/drm/amd/amdgpu/Kconfig
@@ -80,6 +80,78 @@ config DRM_AMDGPU_WERROR
 	  Add -Werror to the build flags for amdgpu.ko.
 	  Only enable this if you are warning code for amdgpu.ko.
 
+choice
+	prompt "Amdgpu panel power Savings"
+	default AMDGPU_SYSFS_ABM
+	help
+		Control the default behavior for adaptive panel power savings.
+
+		Panel power savings features will sacrifice color accuracy
+		in exchange for power savings.
+
+		This can be configured for:
+		- dynamic control by the DRM master
+		- dynamic control by sysfs nodes
+		- statically by the user at kernel compile time
+
+		This value can also be overridden by the amdgpu.abmlevel
+		module parameter.
+
+config AMDGPU_DRM_ABM
+	bool "DRM Master control"
+	help
+		Export a property called 'abm_level' that can be
+		manipulated by the DRM master for supported hardware.
+
+config AMDGPU_SYSFS_ABM
+	bool "sysfs control"
+	help
+		Export a sysfs file 'panel_power_savings' that can be
+		manipulated by userspace for supported hardware.
+
+config AMDGPU_HARDCODE_ABM0
+	bool "No Panel power savings"
+	help
+		Disable panel power savings.
+		It can only overridden by the kernel command line.
+
+config AMDGPU_HARDCODE_ABM1
+	bool "25% Panel power savings"
+	help
+		Set the ABM panel power savings algorithm to 25%.
+		It can only overridden by the kernel command line.
+
+config AMDGPU_HARDCODE_ABM2
+	bool "50% Panel power savings"
+	help
+		Set the ABM panel power savings algorithm to 50%.
+		It can only overridden by the kernel command line.
+
+config AMDGPU_HARDCODE_ABM3
+	bool "75% Panel power savings"
+	help
+		Set the ABM panel power savings algorithm to 75%.
+		It can only overridden by the kernel command line.
+
+config AMDGPU_HARDCODE_ABM4
+	bool "100% Panel power savings"
+	help
+		Set the ABM panel power savings algorithm to 100%.
+		It can only overridden by the kernel command line.
+endchoice
+
+config AMDGPU_ABM_POLICY
+	int
+	default -2 if AMDGPU_DRM_ABM
+	default -1 if AMDGPU_SYSFS_ABM
+	default 0 if AMDGPU_HARDCODE_ABM0
+	default 1 if AMDGPU_HARDCODE_ABM1
+	default 2 if AMDGPU_HARDCODE_ABM2
+	default 3 if AMDGPU_HARDCODE_ABM3
+	default 4 if AMDGPU_HARDCODE_ABM4
+	default -1
+
+
 source "drivers/gpu/drm/amd/acp/Kconfig"
 source "drivers/gpu/drm/amd/display/Kconfig"
 source "drivers/gpu/drm/amd/amdkfd/Kconfig"
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index af7fae7907d7..00d6c8b58716 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -844,17 +844,24 @@ module_param_named(visualconfirm, amdgpu_dc_visual_confirm, uint, 0444);
  * DOC: abmlevel (uint)
  * Override the default ABM (Adaptive Backlight Management) level used for DC
  * enabled hardware. Requires DMCU to be supported and loaded.
- * Valid levels are 0-4. A value of 0 indicates that ABM should be disabled by
- * default. Values 1-4 control the maximum allowable brightness reduction via
- * the ABM algorithm, with 1 being the least reduction and 4 being the most
- * reduction.
+ * Valid levels are -2 through 4.
  *
- * Defaults to -1, or disabled. Userspace can only override this level after
- * boot if it's set to auto.
+ *  -2: indicates that ABM should be controlled by DRM property 'abm_level.
+ *  -1: indicates that ABM should be controlled by the sysfs file
+ *      'panel_power_savings'.
+ *   0: indicates that ABM should be disabled.
+ * 1-4: control the maximum allowable brightness reduction via
+ *      the ABM algorithm, with 1 being the least reduction and 4 being the most
+ *      reduction.
+ *
+ * Both the DRM property 'abm_level' and the sysfs file 'panel_power_savings'
+ * will only be available on supported hardware configurations.
+ *
+ * The default value is configured by kernel configuration option AMDGPU_ABM_POLICY
  */
-int amdgpu_dm_abm_level = -1;
+int amdgpu_dm_abm_level = CONFIG_AMDGPU_ABM_POLICY;
 MODULE_PARM_DESC(abmlevel,
-		 "ABM level (0 = off, 1-4 = backlight reduction level, -1 auto (default))");
+		 "ABM level (0 = off, 1-4 = backlight reduction level, -1 = sysfs control, -2 = drm control");
 module_param_named(abmlevel, amdgpu_dm_abm_level, int, 0444);
 
 int amdgpu_backlight = -1;
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 b9ac3d2f8029..147fe744f82e 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -6515,7 +6515,7 @@ 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 &&
-	    amdgpu_dm_abm_level < 0)
+	    amdgpu_dm_abm_level == -1)
 		sysfs_remove_group(&connector->kdev->kobj, &amdgpu_group);
 
 	drm_dp_aux_unregister(&amdgpu_dm_connector->dm_dp_aux.aux);
@@ -6623,7 +6623,7 @@ amdgpu_dm_connector_late_register(struct drm_connector *connector)
 	int r;
 
 	if (connector->connector_type == DRM_MODE_CONNECTOR_eDP &&
-	    amdgpu_dm_abm_level < 0) {
+	    amdgpu_dm_abm_level == -1) {
 		r = sysfs_create_group(&connector->kdev->kobj,
 				       &amdgpu_group);
 		if (r)
@@ -7654,7 +7654,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
 
 	if (connector_type == DRM_MODE_CONNECTOR_eDP &&
 	    (dc_is_dmcu_initialized(adev->dm.dc) ||
-	     adev->dm.dc->ctx->dmub_srv) && amdgpu_dm_abm_level < 0) {
+	     adev->dm.dc->ctx->dmub_srv) && amdgpu_dm_abm_level == -2) {
 		drm_object_attach_property(&aconnector->base.base,
 				adev->mode_info.abm_level_property, 0);
 	}
