From: Antheas Kapenekakis <lkml@antheas.dev>
To: amd-gfx@lists.freedesktop.org
Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
"Alex Deucher" <alexander.deucher@amd.com>,
"Christian König" <christian.koenig@amd.com>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Harry Wentland" <harry.wentland@amd.com>,
"Rodrigo Siqueira" <siqueira@igalia.com>,
"Mario Limonciello" <mario.limonciello@amd.com>,
"Peyton Lee" <peytolee@amd.com>, "Lang Yu" <lang.yu@amd.com>,
"Antheas Kapenekakis" <lkml@antheas.dev>
Subject: [PATCH v1 2/2] drm/amd/display: Adjust AUX brightness to be a granularity of 100
Date: Sun, 24 Aug 2025 10:53:51 +0200 [thread overview]
Message-ID: <20250824085351.454619-2-lkml@antheas.dev> (raw)
In-Reply-To: <20250824085351.454619-1-lkml@antheas.dev>
Certain OLED devices malfunction on specific brightness levels.
Specifically, when DP_SOURCE_BACKLIGHT_LEVEL is written to with
the minor byte being 0x00 and sometimes 0x01, the panel forcibly
turns off until the device sleeps again. This is an issue on
multiple handhelds, including OneXPlayer F1 Pro and Ayaneo 3
(the panel is suspected to be the same-1080p 7in OLED).
Below are some examples. This was found by iterating over brighness
ranges while printing DP_SOURCE_BACKLIGHT_LEVEL. It was found that
the screen would malfunction on specific values, and some of them
were collected.
Broken:
86016: 10101000000000000
86272: 10101000100000000
87808: 10101011100000000
251648: 111101011100000000
251649: 111101011100000001
Working:
86144: 10101000010000000
87809: 10101011100000001
251650: 111101011100000010
The reason for this is that the range manipulation is too granular.
AUX is currently written to with a granularity of 1. Forcing 100,
which on the Ayaneo 3 OLED yields 400*10=4000 values, is plenty of
granularity and fixes this issue. Iterating over the values through
Python shows that the final byte is never 0x00, and testing over the
entire range with a cadence of 0.2s/it and 73 increments (to saturate
the range) shows no issues. Windows likewise shows no issues.
Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/3803
Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
---
.../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 28 +++++++++++--------
1 file changed, 17 insertions(+), 11 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 cd0e2976e268..bb16adcafb88 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -4739,7 +4739,8 @@ static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm,
}
static int get_brightness_range(const struct amdgpu_dm_backlight_caps *caps,
- unsigned int *min, unsigned int *max)
+ unsigned int *min, unsigned int *max,
+ unsigned int *multiple)
{
if (!caps)
return 0;
@@ -4748,10 +4749,12 @@ static int get_brightness_range(const struct amdgpu_dm_backlight_caps *caps,
// Firmware limits are in nits, DC API wants millinits.
*max = 1000 * caps->aux_max_input_signal;
*min = 1000 * caps->aux_min_input_signal;
+ *multiple = 100;
} else {
// Firmware limits are 8-bit, PWM control is 16-bit.
*max = 0x101 * caps->max_input_signal;
*min = 0x101 * caps->min_input_signal;
+ *multiple = 1;
}
return 1;
}
@@ -4813,23 +4816,25 @@ static void convert_custom_brightness(const struct amdgpu_dm_backlight_caps *cap
static u32 convert_brightness_from_user(const struct amdgpu_dm_backlight_caps *caps,
uint32_t brightness)
{
- unsigned int min, max;
+ unsigned int min, max, multiple;
- if (!get_brightness_range(caps, &min, &max))
+ if (!get_brightness_range(caps, &min, &max, &multiple))
return brightness;
convert_custom_brightness(caps, min, max, &brightness);
- // Rescale 0..max to min..max
- return min + DIV_ROUND_CLOSEST_ULL((u64)(max - min) * brightness, max);
+ // Rescale 0..max to min..max rounding to nearest multiple
+ return rounddown(
+ min + DIV_ROUND_CLOSEST_ULL((u64)(max - min) * brightness, max),
+ multiple);
}
static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *caps,
uint32_t brightness)
{
- unsigned int min, max;
+ unsigned int min, max, multiple;
- if (!get_brightness_range(caps, &min, &max))
+ if (!get_brightness_range(caps, &min, &max, &multiple))
return brightness;
if (brightness < min)
@@ -4970,7 +4975,7 @@ amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector)
struct backlight_properties props = { 0 };
struct amdgpu_dm_backlight_caps *caps;
char bl_name[16];
- int min, max;
+ int min, max, multiple;
if (aconnector->bl_idx == -1)
return;
@@ -4983,15 +4988,16 @@ amdgpu_dm_register_backlight_device(struct amdgpu_dm_connector *aconnector)
}
caps = &dm->backlight_caps[aconnector->bl_idx];
- if (get_brightness_range(caps, &min, &max)) {
+ if (get_brightness_range(caps, &min, &max, &multiple)) {
if (power_supply_is_system_supplied() > 0)
props.brightness = DIV_ROUND_CLOSEST((max - min) * caps->ac_level, 100);
else
props.brightness = DIV_ROUND_CLOSEST((max - min) * caps->dc_level, 100);
/* min is zero, so max needs to be adjusted */
props.max_brightness = max - min;
- drm_dbg(drm, "Backlight caps: min: %d, max: %d, ac %d, dc %d\n", min, max,
- caps->ac_level, caps->dc_level);
+ drm_dbg(drm,
+ "Backlight caps: min: %d, max: %d, ac %d, dc %d, multiple: %d\n",
+ min, max, caps->ac_level, caps->dc_level, multiple);
} else
props.brightness = props.max_brightness = MAX_BACKLIGHT_LEVEL;
--
2.50.1
next prev parent reply other threads:[~2025-08-24 8:54 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-24 8:53 [PATCH v1 1/2] drm/amdgpu/vpe: increase VPE_IDLE_TIMEOUT to fix hang on Strix Halo Antheas Kapenekakis
2025-08-24 8:53 ` Antheas Kapenekakis [this message]
2025-08-24 11:29 ` [PATCH v1 2/2] drm/amd/display: Adjust AUX brightness to be a granularity of 100 kernel test robot
2025-08-24 19:33 ` Antheas Kapenekakis
2025-08-25 7:02 ` Philip Mueller
2025-08-24 20:16 ` [PATCH v1 1/2] drm/amdgpu/vpe: increase VPE_IDLE_TIMEOUT to fix hang on Strix Halo Mario Limonciello
2025-08-24 20:46 ` Antheas Kapenekakis
2025-08-25 1:38 ` Mario Limonciello
2025-08-25 13:39 ` Antheas Kapenekakis
2025-08-26 13:41 ` Alex Deucher
2025-08-26 19:19 ` Mario Limonciello
2025-08-26 19:21 ` Antheas Kapenekakis
2025-08-26 20:12 ` Matthew Schwartz
2025-08-26 20:58 ` Antheas Kapenekakis
2025-08-27 0:50 ` Matthew Schwartz
[not found] ` <MN2PR12MB43736AAF6E8166AD962843F48638A@MN2PR12MB4373.namprd12.prod.outlook.com>
2025-08-27 15:42 ` Matthew Schwartz
2025-08-25 13:20 ` Alex Deucher
2025-08-25 13:33 ` Antheas Kapenekakis
2025-08-25 14:01 ` Antheas Kapenekakis
2025-08-25 16:41 ` Mario Limonciello
2025-08-25 21:00 ` Antheas Kapenekakis
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=20250824085351.454619-2-lkml@antheas.dev \
--to=lkml@antheas.dev \
--cc=airlied@gmail.com \
--cc=alexander.deucher@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=harry.wentland@amd.com \
--cc=lang.yu@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mario.limonciello@amd.com \
--cc=peytolee@amd.com \
--cc=simona@ffwll.ch \
--cc=siqueira@igalia.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®