@@ -2412,6 +2412,7 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
2412
2412
static const u8 pre_computed_values [] = {
2413
2413
50 , 51 , 52 , 53 , 55 , 56 , 57 , 58 , 59 , 61 , 62 , 63 , 65 , 66 , 68 , 69 ,
2414
2414
71 , 72 , 74 , 75 , 77 , 79 , 81 , 82 , 84 , 86 , 88 , 90 , 92 , 94 , 96 , 98 };
2415
+ int i ;
2415
2416
2416
2417
if (!aconnector || !aconnector -> dc_link )
2417
2418
return ;
@@ -2423,7 +2424,13 @@ static void update_connector_ext_caps(struct amdgpu_dm_connector *aconnector)
2423
2424
conn_base = & aconnector -> base ;
2424
2425
adev = drm_to_adev (conn_base -> dev );
2425
2426
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 ];
2427
2434
caps -> ext_caps = & aconnector -> dc_link -> dpcd_sink_ext_caps ;
2428
2435
caps -> aux_support = false;
2429
2436
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)
3423
3430
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE ) || \
3424
3431
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE )
3425
3432
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 )
3427
3435
{
3428
3436
#if defined(CONFIG_ACPI )
3429
3437
struct amdgpu_dm_backlight_caps caps ;
3430
3438
3431
3439
memset (& caps , 0 , sizeof (caps ));
3432
3440
3433
- if (dm -> backlight_caps .caps_valid )
3441
+ if (dm -> backlight_caps [ bl_idx ] .caps_valid )
3434
3442
return ;
3435
3443
3436
3444
amdgpu_acpi_get_backlight_caps (& caps );
3437
3445
if (caps .caps_valid ) {
3438
- dm -> backlight_caps .caps_valid = true;
3446
+ dm -> backlight_caps [ bl_idx ] .caps_valid = true;
3439
3447
if (caps .aux_support )
3440
3448
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 ;
3443
3451
} else {
3444
- dm -> backlight_caps .min_input_signal =
3452
+ dm -> backlight_caps [ bl_idx ] .min_input_signal =
3445
3453
AMDGPU_DM_DEFAULT_MIN_BACKLIGHT ;
3446
- dm -> backlight_caps .max_input_signal =
3454
+ dm -> backlight_caps [ bl_idx ] .max_input_signal =
3447
3455
AMDGPU_DM_DEFAULT_MAX_BACKLIGHT ;
3448
3456
}
3449
3457
#else
3450
- if (dm -> backlight_caps .aux_support )
3458
+ if (dm -> backlight_caps [ bl_idx ] .aux_support )
3451
3459
return ;
3452
3460
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 ;
3455
3463
#endif
3456
3464
}
3457
3465
@@ -3502,41 +3510,31 @@ static u32 convert_brightness_to_user(const struct amdgpu_dm_backlight_caps *cap
3502
3510
}
3503
3511
3504
3512
static int amdgpu_dm_backlight_set_level (struct amdgpu_display_manager * dm ,
3513
+ int bl_idx ,
3505
3514
u32 user_brightness )
3506
3515
{
3507
3516
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 ;
3510
3519
bool rc ;
3511
- int i ;
3512
3520
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 ] ;
3515
3523
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 ];
3521
3527
3522
3528
/* Change brightness based on AUX property */
3523
3529
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 );
3532
3534
} 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 );
3540
3538
}
3541
3539
3542
3540
return rc ? 0 : 1 ;
@@ -3545,42 +3543,57 @@ static int amdgpu_dm_backlight_set_level(struct amdgpu_display_manager *dm,
3545
3543
static int amdgpu_dm_backlight_update_status (struct backlight_device * bd )
3546
3544
{
3547
3545
struct amdgpu_display_manager * dm = bl_get_data (bd );
3546
+ int i ;
3548
3547
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 );
3550
3555
3551
3556
return 0 ;
3552
3557
}
3553
3558
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 )
3555
3561
{
3556
3562
struct amdgpu_dm_backlight_caps caps ;
3563
+ struct dc_link * link = (struct dc_link * )dm -> backlight_link [bl_idx ];
3557
3564
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 ] ;
3560
3567
3561
3568
if (caps .aux_support ) {
3562
- struct dc_link * link = (struct dc_link * )dm -> backlight_link [0 ];
3563
3569
u32 avg , peak ;
3564
3570
bool rc ;
3565
3571
3566
3572
rc = dc_link_get_backlight_level_nits (link , & avg , & peak );
3567
3573
if (!rc )
3568
- return dm -> brightness [0 ];
3574
+ return dm -> brightness [bl_idx ];
3569
3575
return convert_brightness_to_user (& caps , avg );
3570
3576
} else {
3571
- int ret = dc_link_get_backlight_level (dm -> backlight_link [ 0 ] );
3577
+ int ret = dc_link_get_backlight_level (link );
3572
3578
3573
3579
if (ret == DC_ERROR_UNEXPECTED )
3574
- return dm -> brightness [0 ];
3580
+ return dm -> brightness [bl_idx ];
3575
3581
return convert_brightness_to_user (& caps , ret );
3576
3582
}
3577
3583
}
3578
3584
3579
3585
static int amdgpu_dm_backlight_get_brightness (struct backlight_device * bd )
3580
3586
{
3581
3587
struct amdgpu_display_manager * dm = bl_get_data (bd );
3588
+ int i ;
3582
3589
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 );
3584
3597
}
3585
3598
3586
3599
static const struct backlight_ops amdgpu_dm_backlight_ops = {
@@ -3594,31 +3607,28 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
3594
3607
{
3595
3608
char bl_name [16 ];
3596
3609
struct backlight_properties props = { 0 };
3597
- int i ;
3598
3610
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 ;
3602
3613
3603
3614
props .max_brightness = AMDGPU_MAX_BL_LEVEL ;
3604
3615
props .brightness = AMDGPU_MAX_BL_LEVEL ;
3605
3616
props .type = BACKLIGHT_RAW ;
3606
3617
3607
3618
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 );
3609
3620
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 );
3615
3626
3616
- if (IS_ERR (dm -> backlight_dev ))
3627
+ if (IS_ERR (dm -> backlight_dev [ dm -> num_of_edps ] ))
3617
3628
DRM_ERROR ("DM: Backlight registration failed!\n" );
3618
3629
else
3619
3630
DRM_DEBUG_DRIVER ("DM: Registered Backlight device: %s\n" , bl_name );
3620
3631
}
3621
-
3622
3632
#endif
3623
3633
3624
3634
static int initialize_plane (struct amdgpu_display_manager * dm ,
@@ -3675,10 +3685,10 @@ static void register_backlight_device(struct amdgpu_display_manager *dm,
3675
3685
* DM initialization because not having a backlight control
3676
3686
* is better then a black screen.
3677
3687
*/
3678
- if (!dm -> backlight_dev )
3688
+ if (!dm -> backlight_dev [ dm -> num_of_edps ] )
3679
3689
amdgpu_dm_register_backlight_device (dm );
3680
3690
3681
- if (dm -> backlight_dev ) {
3691
+ if (dm -> backlight_dev [ dm -> num_of_edps ] ) {
3682
3692
dm -> backlight_link [dm -> num_of_edps ] = link ;
3683
3693
dm -> num_of_edps ++ ;
3684
3694
}
@@ -6198,6 +6208,7 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
6198
6208
const struct dc_link * link = aconnector -> dc_link ;
6199
6209
struct amdgpu_device * adev = drm_to_adev (connector -> dev );
6200
6210
struct amdgpu_display_manager * dm = & adev -> dm ;
6211
+ int i ;
6201
6212
6202
6213
/*
6203
6214
* 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)
6208
6219
6209
6220
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE ) || \
6210
6221
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
+ }
6217
6227
}
6218
6228
#endif
6219
6229
@@ -9193,8 +9203,11 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
9193
9203
#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE ) || \
9194
9204
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE )
9195
9205
/* 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
+ }
9198
9211
#endif
9199
9212
/*
9200
9213
* send vblank event on all events not handled in flip and
0 commit comments