All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ryan Lin <tsung-hua.lin@amd.com>
Cc: "Jake Wang" <haonan.wang2@amd.com>,
	"David Airlie" <airlied@linux.ie>,
	leon.li@amd.com, "Lijo Lazar" <lijo.lazar@amd.com>,
	"Shirish S" <shirish.s@amd.corp-partner.google.com>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	"Michel Dänzer" <mdaenzer@redhat.com>,
	"Huang Rui" <ray.huang@amd.com>,
	"Eric Huang" <jinhuieric.huang@amd.com>,
	"Likun Gao" <Likun.Gao@amd.com>, "Jun Lei" <Jun.Lei@amd.com>,
	"Jimmy Kizito" <Jimmy.Kizito@amd.com>,
	"Rodrigo Siqueira" <Rodrigo.Siqueira@amd.com>,
	amd-gfx@lists.freedesktop.org,
	"Rouven Czerwinski" <rouven@czerwinskis.de>,
	"Fangzhi Zuo" <Jerry.Zuo@amd.com>,
	"Robin Singh" <robin.singh@amd.com>,
	"Stylon Wang" <stylon.wang@amd.com>,
	"Yifan Zhang" <yifan1.zhang@amd.com>,
	"Leo Li" <sunpeng.li@amd.com>,
	"Wenjing Liu" <wenjing.liu@amd.com>,
	"Nikola Cornij" <nikola.cornij@amd.com>,
	"Sean Paul" <seanpaul@chromium.org>,
	"Chris Park" <Chris.Park@amd.com>,
	"Mikita Lipski" <mikita.lipski@amd.com>,
	Ching-shih.Li@amd.com,
	"Pratik Vishwakarma" <Pratik.Vishwakarma@amd.com>,
	"Sathishkumar S" <sathishkumar.sundararaju@amd.com>,
	"Roy Chan" <roy.chan@amd.com>,
	"Linux Patches Robot"
	<linux-patches-robot@chromeos-missing-patches.google.com.iam.gserviceaccount.com>,
	"Chengming Gui" <Jack.Gui@amd.com>,
	"Jiri Kosina" <jkosina@suse.cz>,
	"Qingqing Zhuo" <qingqing.zhuo@amd.com>,
	"Pan, Xinhui" <Xinhui.Pan@amd.com>, "Roman Li" <Roman.Li@amd.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Jude Shih" <shenshih@amd.com>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Nicholas Kazlauskas" <nicholas.kazlauskas@amd.com>,
	"Ryan Lin" <tsung-hua.lin@amd.com>,
	"Hawking Zhang" <Hawking.Zhang@amd.com>
Subject: [PATCH v5] drm/amdgpu: Disable ABM when AC mode
Date: Wed, 18 May 2022 08:40:14 +0800	[thread overview]
Message-ID: <20220518004018.311332-1-tsung-hua.lin@amd.com> (raw)
In-Reply-To: <20220324231000.4072275-1-tsung-hua.lin@amd.com>

Disable ABM feature when the system is running on AC mode to get the more
perfect contrast of the display.

v2: remove "UPSTREAM" from the subject.

v3: adv->pm.ac_power updating by amd gpu_acpi_event_handler.

v4: Add the file I lost to fix the build error.

v5: Move that function of the setting abm disabled from DC to amdgpu_dm.

Signed-off-by: Ryan Lin <tsung-hua.lin@amd.com>

---
 drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c        |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c      |  1 +
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 17 +++++++++++++++++
 drivers/gpu/drm/amd/display/dc/core/dc_link.c   | 10 ++++++++++
 drivers/gpu/drm/amd/display/dc/dc_link.h        |  2 ++
 drivers/gpu/drm/amd/include/amd_acpi.h          |  1 +
 drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h         |  1 +
 7 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
index 4811b0faafd9..6ac331ee4255 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
@@ -822,7 +822,8 @@ static int amdgpu_acpi_event(struct notifier_block *nb,
 	struct amdgpu_device *adev = container_of(nb, struct amdgpu_device, acpi_nb);
 	struct acpi_bus_event *entry = (struct acpi_bus_event *)data;
 
-	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) {
+	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0 ||
+	    strcmp(entry->device_class, ACPI_BATTERY_CLASS) == 0) {
 		if (power_supply_is_system_supplied() > 0)
 			DRM_DEBUG_DRIVER("pm: AC\n");
 		else
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index abfcc1304ba0..b959d256ce46 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3454,6 +3454,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 
 	adev->gfx.gfx_off_req_count = 1;
 	adev->pm.ac_power = power_supply_is_system_supplied() > 0;
+	adev->pm.old_ac_power = false;
 
 	atomic_set(&adev->throttling_logging_enabled, 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 87283e2da8c1..1ed1f2d00350 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3652,6 +3652,11 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
 }
 #endif
 
+static void amdgpu_dm_abm_set_level(struct amdgpu_display_manager *dm, int level)
+{
+	dc_link_set_abm_level(dm->backlight_link[0], level);
+}
+
 static int initialize_plane(struct amdgpu_display_manager *dm,
 			    struct amdgpu_mode_info *mode_info, int plane_id,
 			    enum drm_plane_type plane_type,
@@ -9072,6 +9077,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 		hdr_changed =
 			!drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state);
 
+		if (adev->pm.ac_power)
+			dm_new_crtc_state->abm_level = 0;
+
 		if (!scaling_changed && !abm_changed && !hdr_changed)
 			continue;
 
@@ -9220,6 +9228,15 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 			amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
 	}
 #endif
+
+	if (adev->pm.ac_power != adev->pm.old_ac_power) {
+		if (adev->pm.ac_power)
+			amdgpu_dm_abm_set_level(dm, 0);
+		else
+			amdgpu_dm_abm_set_level(dm, amdgpu_dm_abm_level);
+		adev->pm.old_ac_power = adev->pm.ac_power;
+	}
+
 	/*
 	 * send vblank event on all events not handled in flip and
 	 * mark consumed event for drm_atomic_helper_commit_hw_done
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index fb012ecd23a1..5edcf2a9dc4e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -2616,6 +2616,16 @@ int dc_link_get_backlight_level(const struct dc_link *link)
 		return DC_ERROR_UNEXPECTED;
 }
 
+int dc_link_set_abm_level(const struct dc_link *link, int level)
+{
+	struct abm *abm = get_abm_from_stream_res(link);
+
+	if (abm != NULL && abm->funcs->set_abm_level != NULL)
+		return (int) abm->funcs->set_abm_level(abm, level);
+	else
+		return DC_ERROR_UNEXPECTED;
+}
+
 int dc_link_get_target_backlight_pwm(const struct dc_link *link)
 {
 	struct abm *abm = get_abm_from_stream_res(link);
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
index 83845d006c54..b69a114ce154 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -258,6 +258,8 @@ bool dc_link_set_default_brightness_aux(struct dc_link *link);
 
 int dc_link_get_backlight_level(const struct dc_link *dc_link);
 
+int dc_link_set_abm_level(const struct dc_link *link, int level);
+
 int dc_link_get_target_backlight_pwm(const struct dc_link *link);
 
 bool dc_link_set_psr_allow_active(struct dc_link *dc_link, bool enable,
diff --git a/drivers/gpu/drm/amd/include/amd_acpi.h b/drivers/gpu/drm/amd/include/amd_acpi.h
index 2d089d30518f..2d9aad582985 100644
--- a/drivers/gpu/drm/amd/include/amd_acpi.h
+++ b/drivers/gpu/drm/amd/include/amd_acpi.h
@@ -25,6 +25,7 @@
 #define AMD_ACPI_H
 
 #define ACPI_AC_CLASS           "ac_adapter"
+#define ACPI_BATTERY_CLASS	 "battery"
 
 struct atif_verify_interface {
 	u16 size;		/* structure size in bytes (includes size field) */
diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
index f6e0e7d8a007..de459411a0e8 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
@@ -445,6 +445,7 @@ struct amdgpu_pm {
 	uint32_t                smu_prv_buffer_size;
 	struct amdgpu_bo        *smu_prv_buffer;
 	bool ac_power;
+	bool old_ac_power;
 	/* powerplay feature */
 	uint32_t pp_feature;
 
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Ryan Lin <tsung-hua.lin@amd.com>
Cc: "Jake Wang" <haonan.wang2@amd.com>,
	"David Airlie" <airlied@linux.ie>,
	leon.li@amd.com, "Lijo Lazar" <lijo.lazar@amd.com>,
	"Shirish S" <shirish.s@amd.corp-partner.google.com>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	"Michel Dänzer" <mdaenzer@redhat.com>,
	"Huang Rui" <ray.huang@amd.com>,
	"Eric Huang" <jinhuieric.huang@amd.com>,
	"Likun Gao" <Likun.Gao@amd.com>, "Jun Lei" <Jun.Lei@amd.com>,
	"Jimmy Kizito" <Jimmy.Kizito@amd.com>,
	"Rodrigo Siqueira" <Rodrigo.Siqueira@amd.com>,
	amd-gfx@lists.freedesktop.org,
	"Rouven Czerwinski" <rouven@czerwinskis.de>,
	"Fangzhi Zuo" <Jerry.Zuo@amd.com>,
	"Robin Singh" <robin.singh@amd.com>,
	"Harry Wentland" <harry.wentland@amd.com>,
	"Stylon Wang" <stylon.wang@amd.com>,
	"Andrey Grodzovsky" <andrey.grodzovsky@amd.com>,
	"Yifan Zhang" <yifan1.zhang@amd.com>,
	"Leo Li" <sunpeng.li@amd.com>,
	"Wenjing Liu" <wenjing.liu@amd.com>,
	"Nikola Cornij" <nikola.cornij@amd.com>,
	"Sean Paul" <seanpaul@chromium.org>,
	"Chris Park" <Chris.Park@amd.com>,
	"Mikita Lipski" <mikita.lipski@amd.com>,
	Ching-shih.Li@amd.com,
	"Pratik Vishwakarma" <Pratik.Vishwakarma@amd.com>,
	"Sathishkumar S" <sathishkumar.sundararaju@amd.com>,
	"Roy Chan" <roy.chan@amd.com>,
	"Linux Patches Robot"
	<linux-patches-robot@chromeos-missing-patches.google.com.iam.gserviceaccount.com>,
	"Chengming Gui" <Jack.Gui@amd.com>,
	"Jiri Kosina" <jkosina@suse.cz>,
	"Qingqing Zhuo" <qingqing.zhuo@amd.com>,
	"Pan, Xinhui" <Xinhui.Pan@amd.com>, "Roman Li" <Roman.Li@amd.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Daniel Vetter" <daniel@ffwll.ch>, "Jude Shih" <shenshih@amd.com>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Nicholas Kazlauskas" <nicholas.kazlauskas@amd.com>,
	"Ryan Lin" <tsung-hua.lin@amd.com>,
	"Hawking Zhang" <Hawking.Zhang@amd.com>
Subject: [PATCH v5] drm/amdgpu: Disable ABM when AC mode
Date: Wed, 18 May 2022 08:40:14 +0800	[thread overview]
Message-ID: <20220518004018.311332-1-tsung-hua.lin@amd.com> (raw)
In-Reply-To: <20220324231000.4072275-1-tsung-hua.lin@amd.com>

Disable ABM feature when the system is running on AC mode to get the more
perfect contrast of the display.

v2: remove "UPSTREAM" from the subject.

v3: adv->pm.ac_power updating by amd gpu_acpi_event_handler.

v4: Add the file I lost to fix the build error.

v5: Move that function of the setting abm disabled from DC to amdgpu_dm.

Signed-off-by: Ryan Lin <tsung-hua.lin@amd.com>

---
 drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c        |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c      |  1 +
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 17 +++++++++++++++++
 drivers/gpu/drm/amd/display/dc/core/dc_link.c   | 10 ++++++++++
 drivers/gpu/drm/amd/display/dc/dc_link.h        |  2 ++
 drivers/gpu/drm/amd/include/amd_acpi.h          |  1 +
 drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h         |  1 +
 7 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
index 4811b0faafd9..6ac331ee4255 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
@@ -822,7 +822,8 @@ static int amdgpu_acpi_event(struct notifier_block *nb,
 	struct amdgpu_device *adev = container_of(nb, struct amdgpu_device, acpi_nb);
 	struct acpi_bus_event *entry = (struct acpi_bus_event *)data;
 
-	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) {
+	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0 ||
+	    strcmp(entry->device_class, ACPI_BATTERY_CLASS) == 0) {
 		if (power_supply_is_system_supplied() > 0)
 			DRM_DEBUG_DRIVER("pm: AC\n");
 		else
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index abfcc1304ba0..b959d256ce46 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3454,6 +3454,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 
 	adev->gfx.gfx_off_req_count = 1;
 	adev->pm.ac_power = power_supply_is_system_supplied() > 0;
+	adev->pm.old_ac_power = false;
 
 	atomic_set(&adev->throttling_logging_enabled, 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 87283e2da8c1..1ed1f2d00350 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3652,6 +3652,11 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
 }
 #endif
 
+static void amdgpu_dm_abm_set_level(struct amdgpu_display_manager *dm, int level)
+{
+	dc_link_set_abm_level(dm->backlight_link[0], level);
+}
+
 static int initialize_plane(struct amdgpu_display_manager *dm,
 			    struct amdgpu_mode_info *mode_info, int plane_id,
 			    enum drm_plane_type plane_type,
@@ -9072,6 +9077,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 		hdr_changed =
 			!drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state);
 
+		if (adev->pm.ac_power)
+			dm_new_crtc_state->abm_level = 0;
+
 		if (!scaling_changed && !abm_changed && !hdr_changed)
 			continue;
 
@@ -9220,6 +9228,15 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 			amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
 	}
 #endif
+
+	if (adev->pm.ac_power != adev->pm.old_ac_power) {
+		if (adev->pm.ac_power)
+			amdgpu_dm_abm_set_level(dm, 0);
+		else
+			amdgpu_dm_abm_set_level(dm, amdgpu_dm_abm_level);
+		adev->pm.old_ac_power = adev->pm.ac_power;
+	}
+
 	/*
 	 * send vblank event on all events not handled in flip and
 	 * mark consumed event for drm_atomic_helper_commit_hw_done
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index fb012ecd23a1..5edcf2a9dc4e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -2616,6 +2616,16 @@ int dc_link_get_backlight_level(const struct dc_link *link)
 		return DC_ERROR_UNEXPECTED;
 }
 
+int dc_link_set_abm_level(const struct dc_link *link, int level)
+{
+	struct abm *abm = get_abm_from_stream_res(link);
+
+	if (abm != NULL && abm->funcs->set_abm_level != NULL)
+		return (int) abm->funcs->set_abm_level(abm, level);
+	else
+		return DC_ERROR_UNEXPECTED;
+}
+
 int dc_link_get_target_backlight_pwm(const struct dc_link *link)
 {
 	struct abm *abm = get_abm_from_stream_res(link);
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
index 83845d006c54..b69a114ce154 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -258,6 +258,8 @@ bool dc_link_set_default_brightness_aux(struct dc_link *link);
 
 int dc_link_get_backlight_level(const struct dc_link *dc_link);
 
+int dc_link_set_abm_level(const struct dc_link *link, int level);
+
 int dc_link_get_target_backlight_pwm(const struct dc_link *link);
 
 bool dc_link_set_psr_allow_active(struct dc_link *dc_link, bool enable,
diff --git a/drivers/gpu/drm/amd/include/amd_acpi.h b/drivers/gpu/drm/amd/include/amd_acpi.h
index 2d089d30518f..2d9aad582985 100644
--- a/drivers/gpu/drm/amd/include/amd_acpi.h
+++ b/drivers/gpu/drm/amd/include/amd_acpi.h
@@ -25,6 +25,7 @@
 #define AMD_ACPI_H
 
 #define ACPI_AC_CLASS           "ac_adapter"
+#define ACPI_BATTERY_CLASS	 "battery"
 
 struct atif_verify_interface {
 	u16 size;		/* structure size in bytes (includes size field) */
diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
index f6e0e7d8a007..de459411a0e8 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
@@ -445,6 +445,7 @@ struct amdgpu_pm {
 	uint32_t                smu_prv_buffer_size;
 	struct amdgpu_bo        *smu_prv_buffer;
 	bool ac_power;
+	bool old_ac_power;
 	/* powerplay feature */
 	uint32_t pp_feature;
 
-- 
2.25.1


WARNING: multiple messages have this Message-ID (diff)
From: Ryan Lin <tsung-hua.lin@amd.com>
To: unlisted-recipients:; (no To-header on input)
Cc: leon.li@amd.com, Ching-shih.Li@amd.com,
	"Ryan Lin" <tsung-hua.lin@amd.com>,
	"Alex Deucher" <alexander.deucher@amd.com>,
	"Christian König" <christian.koenig@amd.com>,
	"Pan, Xinhui" <Xinhui.Pan@amd.com>,
	"David Airlie" <airlied@linux.ie>,
	"Daniel Vetter" <daniel@ffwll.ch>,
	"Harry Wentland" <harry.wentland@amd.com>,
	"Leo Li" <sunpeng.li@amd.com>,
	"Sean Paul" <seanpaul@chromium.org>,
	"Pratik Vishwakarma" <Pratik.Vishwakarma@amd.com>,
	"Lijo Lazar" <lijo.lazar@amd.com>,
	"Sathishkumar S" <sathishkumar.sundararaju@amd.com>,
	"Linux Patches Robot"
	<linux-patches-robot@chromeos-missing-patches.google.com.iam.gserviceaccount.com>,
	"Andrey Grodzovsky" <andrey.grodzovsky@amd.com>,
	"Hawking Zhang" <Hawking.Zhang@amd.com>,
	"Chengming Gui" <Jack.Gui@amd.com>,
	"Huang Rui" <ray.huang@amd.com>,
	"Eric Huang" <jinhuieric.huang@amd.com>,
	"Likun Gao" <Likun.Gao@amd.com>,
	"Yifan Zhang" <yifan1.zhang@amd.com>,
	"Michel Dänzer" <mdaenzer@redhat.com>,
	"Jiri Kosina" <jkosina@suse.cz>,
	"Nicholas Kazlauskas" <nicholas.kazlauskas@amd.com>,
	"Roman Li" <Roman.Li@amd.com>,
	"Shirish S" <shirish.s@amd.corp-partner.google.com>,
	"Jude Shih" <shenshih@amd.com>, "Fangzhi Zuo" <Jerry.Zuo@amd.com>,
	"Rodrigo Siqueira" <Rodrigo.Siqueira@amd.com>,
	"Stylon Wang" <stylon.wang@amd.com>,
	"Wenjing Liu" <wenjing.liu@amd.com>,
	"Jimmy Kizito" <Jimmy.Kizito@amd.com>,
	"Mikita Lipski" <mikita.lipski@amd.com>,
	"Chris Park" <Chris.Park@amd.com>,
	"Robin Singh" <robin.singh@amd.com>,
	"Roy Chan" <roy.chan@amd.com>,
	"Rouven Czerwinski" <rouven@czerwinskis.de>,
	"Qingqing Zhuo" <qingqing.zhuo@amd.com>,
	"Jun Lei" <Jun.Lei@amd.com>, "Jake Wang" <haonan.wang2@amd.com>,
	"Nikola Cornij" <nikola.cornij@amd.com>,
	amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH v5] drm/amdgpu: Disable ABM when AC mode
Date: Wed, 18 May 2022 08:40:14 +0800	[thread overview]
Message-ID: <20220518004018.311332-1-tsung-hua.lin@amd.com> (raw)
In-Reply-To: <20220324231000.4072275-1-tsung-hua.lin@amd.com>

Disable ABM feature when the system is running on AC mode to get the more
perfect contrast of the display.

v2: remove "UPSTREAM" from the subject.

v3: adv->pm.ac_power updating by amd gpu_acpi_event_handler.

v4: Add the file I lost to fix the build error.

v5: Move that function of the setting abm disabled from DC to amdgpu_dm.

Signed-off-by: Ryan Lin <tsung-hua.lin@amd.com>

---
 drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c        |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c      |  1 +
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c   | 17 +++++++++++++++++
 drivers/gpu/drm/amd/display/dc/core/dc_link.c   | 10 ++++++++++
 drivers/gpu/drm/amd/display/dc/dc_link.h        |  2 ++
 drivers/gpu/drm/amd/include/amd_acpi.h          |  1 +
 drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h         |  1 +
 7 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
index 4811b0faafd9..6ac331ee4255 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
@@ -822,7 +822,8 @@ static int amdgpu_acpi_event(struct notifier_block *nb,
 	struct amdgpu_device *adev = container_of(nb, struct amdgpu_device, acpi_nb);
 	struct acpi_bus_event *entry = (struct acpi_bus_event *)data;
 
-	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) {
+	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0 ||
+	    strcmp(entry->device_class, ACPI_BATTERY_CLASS) == 0) {
 		if (power_supply_is_system_supplied() > 0)
 			DRM_DEBUG_DRIVER("pm: AC\n");
 		else
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index abfcc1304ba0..b959d256ce46 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3454,6 +3454,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 
 	adev->gfx.gfx_off_req_count = 1;
 	adev->pm.ac_power = power_supply_is_system_supplied() > 0;
+	adev->pm.old_ac_power = false;
 
 	atomic_set(&adev->throttling_logging_enabled, 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 87283e2da8c1..1ed1f2d00350 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -3652,6 +3652,11 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
 }
 #endif
 
+static void amdgpu_dm_abm_set_level(struct amdgpu_display_manager *dm, int level)
+{
+	dc_link_set_abm_level(dm->backlight_link[0], level);
+}
+
 static int initialize_plane(struct amdgpu_display_manager *dm,
 			    struct amdgpu_mode_info *mode_info, int plane_id,
 			    enum drm_plane_type plane_type,
@@ -9072,6 +9077,9 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 		hdr_changed =
 			!drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state);
 
+		if (adev->pm.ac_power)
+			dm_new_crtc_state->abm_level = 0;
+
 		if (!scaling_changed && !abm_changed && !hdr_changed)
 			continue;
 
@@ -9220,6 +9228,15 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
 			amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
 	}
 #endif
+
+	if (adev->pm.ac_power != adev->pm.old_ac_power) {
+		if (adev->pm.ac_power)
+			amdgpu_dm_abm_set_level(dm, 0);
+		else
+			amdgpu_dm_abm_set_level(dm, amdgpu_dm_abm_level);
+		adev->pm.old_ac_power = adev->pm.ac_power;
+	}
+
 	/*
 	 * send vblank event on all events not handled in flip and
 	 * mark consumed event for drm_atomic_helper_commit_hw_done
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index fb012ecd23a1..5edcf2a9dc4e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -2616,6 +2616,16 @@ int dc_link_get_backlight_level(const struct dc_link *link)
 		return DC_ERROR_UNEXPECTED;
 }
 
+int dc_link_set_abm_level(const struct dc_link *link, int level)
+{
+	struct abm *abm = get_abm_from_stream_res(link);
+
+	if (abm != NULL && abm->funcs->set_abm_level != NULL)
+		return (int) abm->funcs->set_abm_level(abm, level);
+	else
+		return DC_ERROR_UNEXPECTED;
+}
+
 int dc_link_get_target_backlight_pwm(const struct dc_link *link)
 {
 	struct abm *abm = get_abm_from_stream_res(link);
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
index 83845d006c54..b69a114ce154 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -258,6 +258,8 @@ bool dc_link_set_default_brightness_aux(struct dc_link *link);
 
 int dc_link_get_backlight_level(const struct dc_link *dc_link);
 
+int dc_link_set_abm_level(const struct dc_link *link, int level);
+
 int dc_link_get_target_backlight_pwm(const struct dc_link *link);
 
 bool dc_link_set_psr_allow_active(struct dc_link *dc_link, bool enable,
diff --git a/drivers/gpu/drm/amd/include/amd_acpi.h b/drivers/gpu/drm/amd/include/amd_acpi.h
index 2d089d30518f..2d9aad582985 100644
--- a/drivers/gpu/drm/amd/include/amd_acpi.h
+++ b/drivers/gpu/drm/amd/include/amd_acpi.h
@@ -25,6 +25,7 @@
 #define AMD_ACPI_H
 
 #define ACPI_AC_CLASS           "ac_adapter"
+#define ACPI_BATTERY_CLASS	 "battery"
 
 struct atif_verify_interface {
 	u16 size;		/* structure size in bytes (includes size field) */
diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
index f6e0e7d8a007..de459411a0e8 100644
--- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
+++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
@@ -445,6 +445,7 @@ struct amdgpu_pm {
 	uint32_t                smu_prv_buffer_size;
 	struct amdgpu_bo        *smu_prv_buffer;
 	bool ac_power;
+	bool old_ac_power;
 	/* powerplay feature */
 	uint32_t pp_feature;
 
-- 
2.25.1


  parent reply	other threads:[~2022-05-18  4:08 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-24 23:10 [PATCH] UPSTREAM: drm/amdgpu: Disable ABM when AC mode Ryan Lin
2022-03-25  2:45 ` Bas Nieuwenhuizen
2022-03-25  2:45   ` Bas Nieuwenhuizen
2022-03-29  8:52 ` Ryan Lin
2022-03-29  8:52   ` Ryan Lin
2022-03-29  8:52   ` Ryan Lin
2022-03-29 14:03   ` Alex Deucher
2022-03-29 14:03     ` Alex Deucher
2022-03-29 14:33 ` [PATCH] UPSTREAM: " Harry Wentland
2022-03-29 14:46   ` Harry Wentland
2022-04-27  1:50 ` [PATCH v3] " Ryan Lin
2022-04-27  8:08 ` [PATCH v4] " Ryan Lin
2022-04-27 15:21   ` Harry Wentland
2022-05-18  0:40 ` Ryan Lin [this message]
2022-05-18  0:40   ` [PATCH v5] " Ryan Lin
2022-05-18  0:40   ` Ryan Lin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220518004018.311332-1-tsung-hua.lin@amd.com \
    --to=tsung-hua.lin@amd.com \
    --cc=Ching-shih.Li@amd.com \
    --cc=Chris.Park@amd.com \
    --cc=Hawking.Zhang@amd.com \
    --cc=Jack.Gui@amd.com \
    --cc=Jerry.Zuo@amd.com \
    --cc=Jimmy.Kizito@amd.com \
    --cc=Jun.Lei@amd.com \
    --cc=Likun.Gao@amd.com \
    --cc=Pratik.Vishwakarma@amd.com \
    --cc=Rodrigo.Siqueira@amd.com \
    --cc=Roman.Li@amd.com \
    --cc=Xinhui.Pan@amd.com \
    --cc=airlied@linux.ie \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=haonan.wang2@amd.com \
    --cc=jinhuieric.huang@amd.com \
    --cc=jkosina@suse.cz \
    --cc=leon.li@amd.com \
    --cc=lijo.lazar@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-patches-robot@chromeos-missing-patches.google.com.iam.gserviceaccount.com \
    --cc=mdaenzer@redhat.com \
    --cc=mikita.lipski@amd.com \
    --cc=nicholas.kazlauskas@amd.com \
    --cc=nikola.cornij@amd.com \
    --cc=qingqing.zhuo@amd.com \
    --cc=ray.huang@amd.com \
    --cc=robin.singh@amd.com \
    --cc=rouven@czerwinskis.de \
    --cc=roy.chan@amd.com \
    --cc=sathishkumar.sundararaju@amd.com \
    --cc=seanpaul@chromium.org \
    --cc=shenshih@amd.com \
    --cc=shirish.s@amd.corp-partner.google.com \
    --cc=stylon.wang@amd.com \
    --cc=sunpeng.li@amd.com \
    --cc=wenjing.liu@amd.com \
    --cc=yifan1.zhang@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.