Skip to content

Commit 7fd13ba

Browse files
committed
drm/amdgpu/display: add support for multiple backlights
On platforms that support multiple backlights, register each one separately. This lets us manage them independently rather than registering a single backlight and applying the same settings to both. v2: fix typo: Reported-by: kernel test robot <[email protected]> Reviewed-by: Roman Li <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 50dea4e commit 7fd13ba

File tree

3 files changed

+84
-71
lines changed

3 files changed

+84
-71
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -854,8 +854,8 @@ int amdgpu_acpi_init(struct amdgpu_device *adev)
854854
if (amdgpu_device_has_dc_support(adev)) {
855855
#if defined(CONFIG_DRM_AMD_DC)
856856
struct amdgpu_display_manager *dm = &adev->dm;
857-
if (dm->backlight_dev)
858-
atif->bd = dm->backlight_dev;
857+
if (dm->backlight_dev[0])
858+
atif->bd = dm->backlight_dev[0];
859859
#endif
860860
} else {
861861
struct drm_encoder *tmp;

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

Lines changed: 80 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -2412,6 +2412,7 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
24122412
static const u8 pre_computed_values[] = {
24132413
50, 51, 52, 53, 55, 56, 57, 58, 59, 61, 62, 63, 65, 66, 68, 69,
24142414
71, 72, 74, 75, 77, 79, 81, 82, 84, 86, 88, 90, 92, 94, 96, 98};
2415+
int i;
24152416

24162417
if (!aconnector || !aconnector->dc_link)
24172418
return;
@@ -2423,7 +2424,13 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
24232424
conn_base = &aconnector->base;
24242425
adev = drm_to_adev(conn_base->dev);
24252426
dm = &adev->dm;
2426-
caps = &dm->backlight_caps;
2427+
for (i = 0; i < dm->num_of_edps; i++) {
2428+
if (link == dm->backlight_link[i])
2429+
break;
2430+
}
2431+
if (i >= dm->num_of_edps)
2432+
return;
2433+
caps = &dm->backlight_caps[i];
24272434
caps->ext_caps = &aconnector->dc_link->dpcd_sink_ext_caps;
24282435
caps->aux_support = false;
24292436
max_cll = conn_base->hdr_sink_metadata.hdmi_type1.max_cll;
@@ -3423,35 +3430,36 @@ static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
34233430
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
34243431
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
34253432

3426-
static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm)
3433+
static void amdgpu_dm_update_backlight_caps(struct amdgpu_display_manager *dm,
3434+
int bl_idx)
34273435
{
34283436
#if defined(CONFIG_ACPI)
34293437
struct amdgpu_dm_backlight_caps caps;
34303438

34313439
memset(&caps, 0, sizeof(caps));
34323440

3433-
if (dm->backlight_caps.caps_valid)
3441+
if (dm->backlight_caps[bl_idx].caps_valid)
34343442
return;
34353443

34363444
amdgpu_acpi_get_backlight_caps(&caps);
34373445
if (caps.caps_valid) {
3438-
dm->backlight_caps.caps_valid = true;
3446+
dm->backlight_caps[bl_idx].caps_valid = true;
34393447
if (caps.aux_support)
34403448
return;
3441-
dm->backlight_caps.min_input_signal = caps.min_input_signal;
3442-
dm->backlight_caps.max_input_signal = caps.max_input_signal;
3449+
dm->backlight_caps[bl_idx].min_input_signal = caps.min_input_signal;
3450+
dm->backlight_caps[bl_idx].max_input_signal = caps.max_input_signal;
34433451
} else {
3444-
dm->backlight_caps.min_input_signal =
3452+
dm->backlight_caps[bl_idx].min_input_signal =
34453453
AMDGPU_DM_DEFAULT_MIN_BACKLIGHT;
3446-
dm->backlight_caps.max_input_signal =
3454+
dm->backlight_caps[bl_idx].max_input_signal =
34473455
AMDGPU_DM_DEFAULT_MAX_BACKLIGHT;
34483456
}
34493457
#else
3450-
if (dm->backlight_caps.aux_support)
3458+
if (dm->backlight_caps[bl_idx].aux_support)
34513459
return;
34523460

3453-
dm->backlight_caps.min_input_signal = AMDGPU_DM_DEFAULT_MIN_BACKLIGHT;
3454-
dm->backlight_caps.max_input_signal = AMDGPU_DM_DEFAULT_MAX_BACKLIGHT;
3461+
dm->backlight_caps[bl_idx].min_input_signal = AMDGPU_DM_DEFAULT_MIN_BACKLIGHT;
3462+
dm->backlight_caps[bl_idx].max_input_signal = AMDGPU_DM_DEFAULT_MAX_BACKLIGHT;
34553463
#endif
34563464
}
34573465

@@ -3502,41 +3510,31 @@ static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *cap
35023510
}
35033511

35043512
static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
3513+
int bl_idx,
35053514
u32 user_brightness)
35063515
{
35073516
struct amdgpu_dm_backlight_caps caps;
3508-
struct dc_link *link[AMDGPU_DM_MAX_NUM_EDP];
3509-
u32 brightness[AMDGPU_DM_MAX_NUM_EDP];
3517+
struct dc_link *link;
3518+
u32 brightness;
35103519
bool rc;
3511-
int i;
35123520

3513-
amdgpu_dm_update_backlight_caps(dm);
3514-
caps = dm->backlight_caps;
3521+
amdgpu_dm_update_backlight_caps(dm, bl_idx);
3522+
caps = dm->backlight_caps[bl_idx];
35153523

3516-
for (i = 0; i < dm->num_of_edps; i++) {
3517-
dm->brightness[i] = user_brightness;
3518-
brightness[i] = convert_brightness_from_user(&caps, dm->brightness[i]);
3519-
link[i] = (struct dc_link *)dm->backlight_link[i];
3520-
}
3524+
dm->brightness[bl_idx] = user_brightness;
3525+
brightness = convert_brightness_from_user(&caps, dm->brightness[bl_idx]);
3526+
link = (struct dc_link *)dm->backlight_link[bl_idx];
35213527

35223528
/* Change brightness based on AUX property */
35233529
if (caps.aux_support) {
3524-
for (i = 0; i < dm->num_of_edps; i++) {
3525-
rc = dc_link_set_backlight_level_nits(link[i], true, brightness[i],
3526-
AUX_BL_DEFAULT_TRANSITION_TIME_MS);
3527-
if (!rc) {
3528-
DRM_DEBUG("DM: Failed to update backlight via AUX on eDP[%d]\n", i);
3529-
break;
3530-
}
3531-
}
3530+
rc = dc_link_set_backlight_level_nits(link, true, brightness,
3531+
AUX_BL_DEFAULT_TRANSITION_TIME_MS);
3532+
if (!rc)
3533+
DRM_DEBUG("DM: Failed to update backlight via AUX on eDP[%d]\n", bl_idx);
35323534
} else {
3533-
for (i = 0; i < dm->num_of_edps; i++) {
3534-
rc = dc_link_set_backlight_level(dm->backlight_link[i], brightness[i], 0);
3535-
if (!rc) {
3536-
DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", i);
3537-
break;
3538-
}
3539-
}
3535+
rc = dc_link_set_backlight_level(link, brightness, 0);
3536+
if (!rc)
3537+
DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", bl_idx);
35403538
}
35413539

35423540
return rc ? 0 : 1;
@@ -3545,42 +3543,57 @@ static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
35453543
static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
35463544
{
35473545
struct amdgpu_display_manager *dm = bl_get_data(bd);
3546+
int i;
35483547

3549-
amdgpu_dm_backlight_set_level(dm, bd->props.brightness);
3548+
for (i = 0; i < dm->num_of_edps; i++) {
3549+
if (bd == dm->backlight_dev[i])
3550+
break;
3551+
}
3552+
if (i >= AMDGPU_DM_MAX_NUM_EDP)
3553+
i = 0;
3554+
amdgpu_dm_backlight_set_level(dm, i, bd->props.brightness);
35503555

35513556
return 0;
35523557
}
35533558

3554-
static u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm)
3559+
static u32 amdgpu_dm_backlight_get_level(struct amdgpu_display_manager *dm,
3560+
int bl_idx)
35553561
{
35563562
struct amdgpu_dm_backlight_caps caps;
3563+
struct dc_link *link = (struct dc_link *)dm->backlight_link[bl_idx];
35573564

3558-
amdgpu_dm_update_backlight_caps(dm);
3559-
caps = dm->backlight_caps;
3565+
amdgpu_dm_update_backlight_caps(dm, bl_idx);
3566+
caps = dm->backlight_caps[bl_idx];
35603567

35613568
if (caps.aux_support) {
3562-
struct dc_link *link = (struct dc_link *)dm->backlight_link[0];
35633569
u32 avg, peak;
35643570
bool rc;
35653571

35663572
rc = dc_link_get_backlight_level_nits(link, &avg, &peak);
35673573
if (!rc)
3568-
return dm->brightness[0];
3574+
return dm->brightness[bl_idx];
35693575
return convert_brightness_to_user(&caps, avg);
35703576
} else {
3571-
int ret = dc_link_get_backlight_level(dm->backlight_link[0]);
3577+
int ret = dc_link_get_backlight_level(link);
35723578

35733579
if (ret == DC_ERROR_UNEXPECTED)
3574-
return dm->brightness[0];
3580+
return dm->brightness[bl_idx];
35753581
return convert_brightness_to_user(&caps, ret);
35763582
}
35773583
}
35783584

35793585
static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd)
35803586
{
35813587
struct amdgpu_display_manager *dm = bl_get_data(bd);
3588+
int i;
35823589

3583-
return amdgpu_dm_backlight_get_level(dm);
3590+
for (i = 0; i < dm->num_of_edps; i++) {
3591+
if (bd == dm->backlight_dev[i])
3592+
break;
3593+
}
3594+
if (i >= AMDGPU_DM_MAX_NUM_EDP)
3595+
i = 0;
3596+
return amdgpu_dm_backlight_get_level(dm, i);
35843597
}
35853598

35863599
static const struct backlight_ops amdgpu_dm_backlight_ops = {
@@ -3594,31 +3607,28 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
35943607
{
35953608
char bl_name[16];
35963609
struct backlight_properties props = { 0 };
3597-
int i;
35983610

3599-
amdgpu_dm_update_backlight_caps(dm);
3600-
for (i = 0; i < dm->num_of_edps; i++)
3601-
dm->brightness[i] = AMDGPU_MAX_BL_LEVEL;
3611+
amdgpu_dm_update_backlight_caps(dm, dm->num_of_edps);
3612+
dm->brightness[dm->num_of_edps] = AMDGPU_MAX_BL_LEVEL;
36023613

36033614
props.max_brightness = AMDGPU_MAX_BL_LEVEL;
36043615
props.brightness = AMDGPU_MAX_BL_LEVEL;
36053616
props.type = BACKLIGHT_RAW;
36063617

36073618
snprintf(bl_name, sizeof(bl_name), "amdgpu_bl%d",
3608-
adev_to_drm(dm->adev)->primary->index);
3619+
adev_to_drm(dm->adev)->primary->index + dm->num_of_edps);
36093620

3610-
dm->backlight_dev = backlight_device_register(bl_name,
3611-
adev_to_drm(dm->adev)->dev,
3612-
dm,
3613-
&amdgpu_dm_backlight_ops,
3614-
&props);
3621+
dm->backlight_dev[dm->num_of_edps] = backlight_device_register(bl_name,
3622+
adev_to_drm(dm->adev)->dev,
3623+
dm,
3624+
&amdgpu_dm_backlight_ops,
3625+
&props);
36153626

3616-
if (IS_ERR(dm->backlight_dev))
3627+
if (IS_ERR(dm->backlight_dev[dm->num_of_edps]))
36173628
DRM_ERROR("DM: Backlight registration failed!\n");
36183629
else
36193630
DRM_DEBUG_DRIVER("DM: Registered Backlight device: %s\n", bl_name);
36203631
}
3621-
36223632
#endif
36233633

36243634
static int initialize_plane(struct amdgpu_display_manager *dm,
@@ -3675,10 +3685,10 @@ static void register_backlight_device(struct amdgpu_display_manager *dm,
36753685
* DM initialization because not having a backlight control
36763686
* is better then a black screen.
36773687
*/
3678-
if (!dm->backlight_dev)
3688+
if (!dm->backlight_dev[dm->num_of_edps])
36793689
amdgpu_dm_register_backlight_device(dm);
36803690

3681-
if (dm->backlight_dev) {
3691+
if (dm->backlight_dev[dm->num_of_edps]) {
36823692
dm->backlight_link[dm->num_of_edps] = link;
36833693
dm->num_of_edps++;
36843694
}
@@ -6198,6 +6208,7 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
61986208
const struct dc_link *link = aconnector->dc_link;
61996209
struct amdgpu_device *adev = drm_to_adev(connector->dev);
62006210
struct amdgpu_display_manager *dm = &adev->dm;
6211+
int i;
62016212

62026213
/*
62036214
* Call only if mst_mgr was iniitalized before since it's not done
@@ -6208,12 +6219,11 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
62086219

62096220
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) ||\
62106221
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
6211-
6212-
if ((link->connector_signal & (SIGNAL_TYPE_EDP | SIGNAL_TYPE_LVDS)) &&
6213-
link->type != dc_connection_none &&
6214-
dm->backlight_dev) {
6215-
backlight_device_unregister(dm->backlight_dev);
6216-
dm->backlight_dev = NULL;
6222+
for (i = 0; i < dm->num_of_edps; i++) {
6223+
if ((link == dm->backlight_link[i]) && dm->backlight_dev[i]) {
6224+
backlight_device_unregister(dm->backlight_dev[i]);
6225+
dm->backlight_dev[i] = NULL;
6226+
}
62176227
}
62186228
#endif
62196229

@@ -9193,8 +9203,11 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
91939203
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || \
91949204
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
91959205
/* restore the backlight level */
9196-
if (dm->backlight_dev && (amdgpu_dm_backlight_get_level(dm) != dm->brightness[0]))
9197-
amdgpu_dm_backlight_set_level(dm, dm->brightness[0]);
9206+
for (i = 0; i < dm->num_of_edps; i++) {
9207+
if (dm->backlight_dev[i] &&
9208+
(amdgpu_dm_backlight_get_level(dm, i) != dm->brightness[i]))
9209+
amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
9210+
}
91989211
#endif
91999212
/*
92009213
* send vblank event on all events not handled in flip and

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,13 +365,13 @@ struct amdgpu_display_manager {
365365

366366
spinlock_t irq_handler_list_table_lock;
367367

368-
struct backlight_device *backlight_dev;
368+
struct backlight_device *backlight_dev[AMDGPU_DM_MAX_NUM_EDP];
369369

370370
const struct dc_link *backlight_link[AMDGPU_DM_MAX_NUM_EDP];
371371

372372
uint8_t num_of_edps;
373373

374-
struct amdgpu_dm_backlight_caps backlight_caps;
374+
struct amdgpu_dm_backlight_caps backlight_caps[AMDGPU_DM_MAX_NUM_EDP];
375375

376376
struct mod_freesync *freesync_module;
377377
#ifdef CONFIG_DRM_AMD_DC_HDCP

0 commit comments

Comments
 (0)