summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2020-12-10 09:40:31 -0500
committerAlex Deucher <alexander.deucher@amd.com>2020-12-10 09:40:31 -0500
commit1819edfc6c14d298ccf1ea4df37881da77523113 (patch)
tree1e3a862eb19169aef39436b790e6ab69ef6acaff
parent3c9996e61b48fff7755b4c21fb50bc4cac7d4a6e (diff)
drm/amdgpu/display: register backlight latebacklight_wip
We previously registered the backlight interface while we were enumerating the display topology, but that can race with userspace attempting to use the BL interface since we have not finished enumerating the displays in some cases. Bug: https://gitlab.freedesktop.org/drm/amd/-/issues/1337 Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c15
1 files changed, 13 insertions, 2 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 85c008a0f70a..946ff449658b 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -213,6 +213,9 @@ static bool amdgpu_dm_psr_disable_all(struct amdgpu_display_manager *dm);
static const struct drm_format_info *
amd_get_format_info(const struct drm_mode_fb_cmd2 *cmd);
+static void register_backlight_device(struct amdgpu_display_manager *dm,
+ struct dc_link *link);
+
/*
* dm_vblank_get_counter
*
@@ -1542,7 +1545,7 @@ static int detect_mst_link_for_all_connectors(struct drm_device *dev)
static int dm_late_init(void *handle)
{
struct amdgpu_device *adev = (struct amdgpu_device *)handle;
-
+ struct amdgpu_display_manager *dm = &adev->dm;
struct dmcu_iram_parameters params;
unsigned int linear_lut[16];
int i;
@@ -1577,6 +1580,15 @@ static int dm_late_init(void *handle)
if (!ret)
return -EINVAL;
+ /* register the backlight at this point */
+ if (!dm->backlight_dev) {
+ for (i = 0; i < dm->dc->caps.max_links; i++) {
+ struct dc_link *link = dc_get_link_at_index(dm->dc, i);
+
+ register_backlight_device(dm, link);
+ }
+ }
+
return detect_mst_link_for_all_connectors(adev_to_drm(adev));
}
@@ -3501,7 +3513,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
} else if (dc_link_detect(link, DETECT_REASON_BOOT)) {
amdgpu_dm_update_connector_after_detect(aconnector);
- register_backlight_device(dm, link);
if (amdgpu_dc_feature_mask & DC_PSR_MASK)
amdgpu_dm_set_psr_caps(link);
}