aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
diff options
context:
space:
mode:
authorDavid Francis <David.Francis@amd.com>2018-11-26 11:44:06 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-11-26 15:54:39 -0500
commit206bbafe00dcacccf40e6f09e624329ec124201b (patch)
tree3324c64471524c6ea4c95add3ff2ee6bc9fe4114 /drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
parent7349a3afaaea4600be86b2663a3b9e775f9590eb (diff)
drm/amd: Query and use ACPI backlight caps
ACPI ATIF has a function called query backlight transfer characteristics. Among the information returned by this function is the minimum and maximum input signals for the backlight Call that function on ACPI init. When DM backlight device is updated, copy over the backlight caps into DM, but only once. Use the backlight caps in the backlight-to-dc calculation Signed-off-by: David Francis <David.Francis@amd.com> Reviewed-by: Harry Wentland <harry.wentland@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
index 471266901d1b..47db65926d71 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
@@ -65,6 +65,7 @@ struct amdgpu_atif {
65 struct amdgpu_atif_functions functions; 65 struct amdgpu_atif_functions functions;
66 struct amdgpu_atif_notification_cfg notification_cfg; 66 struct amdgpu_atif_notification_cfg notification_cfg;
67 struct amdgpu_encoder *encoder_for_bl; 67 struct amdgpu_encoder *encoder_for_bl;
68 struct amdgpu_dm_backlight_caps backlight_caps;
68}; 69};
69 70
70/* Call the ATIF method 71/* Call the ATIF method
@@ -298,6 +299,65 @@ out:
298} 299}
299 300
300/** 301/**
302 * amdgpu_atif_query_backlight_caps - get min and max backlight input signal
303 *
304 * @handle: acpi handle
305 *
306 * Execute the QUERY_BRIGHTNESS_TRANSFER_CHARACTERISTICS ATIF function
307 * to determine the acceptable range of backlight values
308 *
309 * Backlight_caps.caps_valid will be set to true if the query is successful
310 *
311 * The input signals are in range 0-255
312 *
313 * This function assumes the display with backlight is the first LCD
314 *
315 * Returns 0 on success, error on failure.
316 */
317static int amdgpu_atif_query_backlight_caps(struct amdgpu_atif *atif)
318{
319 union acpi_object *info;
320 struct atif_qbtc_output characteristics;
321 struct atif_qbtc_arguments arguments;
322 struct acpi_buffer params;
323 size_t size;
324 int err = 0;
325
326 arguments.size = sizeof(arguments);
327 arguments.requested_display = ATIF_QBTC_REQUEST_LCD1;
328
329 params.length = sizeof(arguments);
330 params.pointer = (void *)&arguments;
331
332 info = amdgpu_atif_call(atif,
333 ATIF_FUNCTION_QUERY_BRIGHTNESS_TRANSFER_CHARACTERISTICS,
334 &params);
335 if (!info) {
336 err = -EIO;
337 goto out;
338 }
339
340 size = *(u16 *) info->buffer.pointer;
341 if (size < 10) {
342 err = -EINVAL;
343 goto out;
344 }
345
346 memset(&characteristics, 0, sizeof(characteristics));
347 size = min(sizeof(characteristics), size);
348 memcpy(&characteristics, info->buffer.pointer, size);
349
350 atif->backlight_caps.caps_valid = true;
351 atif->backlight_caps.min_input_signal =
352 characteristics.min_input_signal;
353 atif->backlight_caps.max_input_signal =
354 characteristics.max_input_signal;
355out:
356 kfree(info);
357 return err;
358}
359
360/**
301 * amdgpu_atif_get_sbios_requests - get requested sbios event 361 * amdgpu_atif_get_sbios_requests - get requested sbios event
302 * 362 *
303 * @handle: acpi handle 363 * @handle: acpi handle
@@ -786,6 +846,17 @@ int amdgpu_acpi_init(struct amdgpu_device *adev)
786 } 846 }
787 } 847 }
788 848
849 if (atif->functions.query_backlight_transfer_characteristics) {
850 ret = amdgpu_atif_query_backlight_caps(atif);
851 if (ret) {
852 DRM_DEBUG_DRIVER("Call to QUERY_BACKLIGHT_TRANSFER_CHARACTERISTICS failed: %d\n",
853 ret);
854 atif->backlight_caps.caps_valid = false;
855 }
856 } else {
857 atif->backlight_caps.caps_valid = false;
858 }
859
789out: 860out:
790 adev->acpi_nb.notifier_call = amdgpu_acpi_event; 861 adev->acpi_nb.notifier_call = amdgpu_acpi_event;
791 register_acpi_notifier(&adev->acpi_nb); 862 register_acpi_notifier(&adev->acpi_nb);
@@ -793,6 +864,18 @@ out:
793 return ret; 864 return ret;
794} 865}
795 866
867void amdgpu_acpi_get_backlight_caps(struct amdgpu_device *adev,
868 struct amdgpu_dm_backlight_caps *caps)
869{
870 if (!adev->atif) {
871 caps->caps_valid = false;
872 return;
873 }
874 caps->caps_valid = adev->atif->backlight_caps.caps_valid;
875 caps->min_input_signal = adev->atif->backlight_caps.min_input_signal;
876 caps->max_input_signal = adev->atif->backlight_caps.max_input_signal;
877}
878
796/** 879/**
797 * amdgpu_acpi_fini - tear down driver acpi support 880 * amdgpu_acpi_fini - tear down driver acpi support
798 * 881 *