xref: /openbsd-src/sys/dev/pci/drm/radeon/radeon_acpi.c (revision 33a3edb17759836de63cc1c20bcbaf9911c431fc)
11099013bSjsg /*
21099013bSjsg  * Copyright 2012 Advanced Micro Devices, Inc.
31099013bSjsg  *
41099013bSjsg  * Permission is hereby granted, free of charge, to any person obtaining a
51099013bSjsg  * copy of this software and associated documentation files (the "Software"),
61099013bSjsg  * to deal in the Software without restriction, including without limitation
71099013bSjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
81099013bSjsg  * and/or sell copies of the Software, and to permit persons to whom the
91099013bSjsg  * Software is furnished to do so, subject to the following conditions:
101099013bSjsg  *
111099013bSjsg  * The above copyright notice and this permission notice shall be included in
121099013bSjsg  * all copies or substantial portions of the Software.
131099013bSjsg  *
141099013bSjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
151099013bSjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
161099013bSjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
171099013bSjsg  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
181099013bSjsg  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
191099013bSjsg  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
201099013bSjsg  * OTHER DEALINGS IN THE SOFTWARE.
211099013bSjsg  *
221099013bSjsg  */
231099013bSjsg 
247f4dd379Sjsg #include <linux/acpi.h>
25f005ef32Sjsg #include <linux/backlight.h>
26c349dbc7Sjsg #include <linux/pci.h>
277f4dd379Sjsg #include <linux/pm_runtime.h>
28c349dbc7Sjsg #include <linux/power_supply.h>
29c349dbc7Sjsg #include <linux/slab.h>
30c349dbc7Sjsg 
31c349dbc7Sjsg #include <acpi/acpi_bus.h>
327ccd5a2cSjsg #include <acpi/video.h>
33c349dbc7Sjsg 
34c349dbc7Sjsg #include <drm/drm_probe_helper.h>
35c349dbc7Sjsg 
36c349dbc7Sjsg #include "atom.h"
371099013bSjsg #include "radeon.h"
381099013bSjsg #include "radeon_acpi.h"
395ca02815Sjsg #include "radeon_pm.h"
401099013bSjsg 
417f4dd379Sjsg #if defined(CONFIG_VGA_SWITCHEROO)
427f4dd379Sjsg bool radeon_atpx_dgpu_req_power_for_displays(void);
437f4dd379Sjsg #else
447f4dd379Sjsg static inline bool radeon_atpx_dgpu_req_power_for_displays(void) { return false; }
457f4dd379Sjsg #endif
467f4dd379Sjsg 
471099013bSjsg #define ACPI_AC_CLASS           "ac_adapter"
481099013bSjsg 
491099013bSjsg struct atif_verify_interface {
501099013bSjsg 	u16 size;		/* structure size in bytes (includes size field) */
511099013bSjsg 	u16 version;		/* version */
521099013bSjsg 	u32 notification_mask;	/* supported notifications mask */
531099013bSjsg 	u32 function_bits;	/* supported functions bit vector */
541099013bSjsg } __packed;
551099013bSjsg 
561099013bSjsg struct atif_system_params {
571099013bSjsg 	u16 size;		/* structure size in bytes (includes size field) */
581099013bSjsg 	u32 valid_mask;		/* valid flags mask */
591099013bSjsg 	u32 flags;		/* flags */
601099013bSjsg 	u8 command_code;	/* notify command code */
611099013bSjsg } __packed;
621099013bSjsg 
631099013bSjsg struct atif_sbios_requests {
641099013bSjsg 	u16 size;		/* structure size in bytes (includes size field) */
651099013bSjsg 	u32 pending;		/* pending sbios requests */
661099013bSjsg 	u8 panel_exp_mode;	/* panel expansion mode */
671099013bSjsg 	u8 thermal_gfx;		/* thermal state: target gfx controller */
681099013bSjsg 	u8 thermal_state;	/* thermal state: state id (0: exit state, non-0: state) */
691099013bSjsg 	u8 forced_power_gfx;	/* forced power state: target gfx controller */
701099013bSjsg 	u8 forced_power_state;	/* forced power state: state id */
711099013bSjsg 	u8 system_power_src;	/* system power source */
721099013bSjsg 	u8 backlight_level;	/* panel backlight level (0-255) */
731099013bSjsg } __packed;
741099013bSjsg 
751099013bSjsg #define ATIF_NOTIFY_MASK	0x3
761099013bSjsg #define ATIF_NOTIFY_NONE	0
771099013bSjsg #define ATIF_NOTIFY_81		1
781099013bSjsg #define ATIF_NOTIFY_N		2
791099013bSjsg 
801099013bSjsg struct atcs_verify_interface {
811099013bSjsg 	u16 size;		/* structure size in bytes (includes size field) */
821099013bSjsg 	u16 version;		/* version */
831099013bSjsg 	u32 function_bits;	/* supported functions bit vector */
841099013bSjsg } __packed;
851099013bSjsg 
867ccd5a2cSjsg #define ATCS_VALID_FLAGS_MASK	0x3
877ccd5a2cSjsg 
887ccd5a2cSjsg struct atcs_pref_req_input {
897ccd5a2cSjsg 	u16 size;		/* structure size in bytes (includes size field) */
907ccd5a2cSjsg 	u16 client_id;		/* client id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */
917ccd5a2cSjsg 	u16 valid_flags_mask;	/* valid flags mask */
927ccd5a2cSjsg 	u16 flags;		/* flags */
937ccd5a2cSjsg 	u8 req_type;		/* request type */
947ccd5a2cSjsg 	u8 perf_req;		/* performance request */
957ccd5a2cSjsg } __packed;
967ccd5a2cSjsg 
977ccd5a2cSjsg struct atcs_pref_req_output {
987ccd5a2cSjsg 	u16 size;		/* structure size in bytes (includes size field) */
997ccd5a2cSjsg 	u8 ret_val;		/* return value */
1007ccd5a2cSjsg } __packed;
1017ccd5a2cSjsg 
1021099013bSjsg /* Call the ATIF method
1031099013bSjsg  */
1041099013bSjsg /**
1051099013bSjsg  * radeon_atif_call - call an ATIF method
1061099013bSjsg  *
1071099013bSjsg  * @handle: acpi handle
1081099013bSjsg  * @function: the ATIF function to execute
1091099013bSjsg  * @params: ATIF function params
1101099013bSjsg  *
1111099013bSjsg  * Executes the requested ATIF function (all asics).
1121099013bSjsg  * Returns a pointer to the acpi output buffer.
1131099013bSjsg  */
1141099013bSjsg static union acpi_object *radeon_atif_call(acpi_handle handle, int function,
1151099013bSjsg 		struct acpi_buffer *params)
1161099013bSjsg {
1171099013bSjsg 	acpi_status status;
1181099013bSjsg 	union acpi_object atif_arg_elements[2];
1191099013bSjsg 	struct acpi_object_list atif_arg;
1201099013bSjsg 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
1211099013bSjsg 
1221099013bSjsg 	atif_arg.count = 2;
1231099013bSjsg 	atif_arg.pointer = &atif_arg_elements[0];
1241099013bSjsg 
1251099013bSjsg 	atif_arg_elements[0].type = ACPI_TYPE_INTEGER;
1261099013bSjsg 	atif_arg_elements[0].integer.value = function;
1271099013bSjsg 
1281099013bSjsg 	if (params) {
1291099013bSjsg 		atif_arg_elements[1].type = ACPI_TYPE_BUFFER;
1301099013bSjsg 		atif_arg_elements[1].buffer.length = params->length;
1311099013bSjsg 		atif_arg_elements[1].buffer.pointer = params->pointer;
1321099013bSjsg 	} else {
1331099013bSjsg 		/* We need a second fake parameter */
1341099013bSjsg 		atif_arg_elements[1].type = ACPI_TYPE_INTEGER;
1351099013bSjsg 		atif_arg_elements[1].integer.value = 0;
1361099013bSjsg 	}
1371099013bSjsg 
1381099013bSjsg 	status = acpi_evaluate_object(handle, "ATIF", &atif_arg, &buffer);
1391099013bSjsg 
1401099013bSjsg 	/* Fail only if calling the method fails and ATIF is supported */
1411099013bSjsg 	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
1421099013bSjsg 		DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
1431099013bSjsg 				 acpi_format_exception(status));
144de5631a0Sjsg 		kfree(buffer.pointer);
1451099013bSjsg 		return NULL;
1461099013bSjsg 	}
1471099013bSjsg 
1481099013bSjsg 	return buffer.pointer;
1491099013bSjsg }
1501099013bSjsg 
1511099013bSjsg /**
1521099013bSjsg  * radeon_atif_parse_notification - parse supported notifications
1531099013bSjsg  *
1541099013bSjsg  * @n: supported notifications struct
1551099013bSjsg  * @mask: supported notifications mask from ATIF
1561099013bSjsg  *
1571099013bSjsg  * Use the supported notifications mask from ATIF function
1581099013bSjsg  * ATIF_FUNCTION_VERIFY_INTERFACE to determine what notifications
1591099013bSjsg  * are supported (all asics).
1601099013bSjsg  */
1611099013bSjsg static void radeon_atif_parse_notification(struct radeon_atif_notifications *n, u32 mask)
1621099013bSjsg {
1631099013bSjsg 	n->display_switch = mask & ATIF_DISPLAY_SWITCH_REQUEST_SUPPORTED;
1641099013bSjsg 	n->expansion_mode_change = mask & ATIF_EXPANSION_MODE_CHANGE_REQUEST_SUPPORTED;
1651099013bSjsg 	n->thermal_state = mask & ATIF_THERMAL_STATE_CHANGE_REQUEST_SUPPORTED;
1661099013bSjsg 	n->forced_power_state = mask & ATIF_FORCED_POWER_STATE_CHANGE_REQUEST_SUPPORTED;
1671099013bSjsg 	n->system_power_state = mask & ATIF_SYSTEM_POWER_SOURCE_CHANGE_REQUEST_SUPPORTED;
1681099013bSjsg 	n->display_conf_change = mask & ATIF_DISPLAY_CONF_CHANGE_REQUEST_SUPPORTED;
1691099013bSjsg 	n->px_gfx_switch = mask & ATIF_PX_GFX_SWITCH_REQUEST_SUPPORTED;
1701099013bSjsg 	n->brightness_change = mask & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST_SUPPORTED;
1711099013bSjsg 	n->dgpu_display_event = mask & ATIF_DGPU_DISPLAY_EVENT_SUPPORTED;
1721099013bSjsg }
1731099013bSjsg 
1741099013bSjsg /**
1751099013bSjsg  * radeon_atif_parse_functions - parse supported functions
1761099013bSjsg  *
1771099013bSjsg  * @f: supported functions struct
1781099013bSjsg  * @mask: supported functions mask from ATIF
1791099013bSjsg  *
1801099013bSjsg  * Use the supported functions mask from ATIF function
1811099013bSjsg  * ATIF_FUNCTION_VERIFY_INTERFACE to determine what functions
1821099013bSjsg  * are supported (all asics).
1831099013bSjsg  */
1841099013bSjsg static void radeon_atif_parse_functions(struct radeon_atif_functions *f, u32 mask)
1851099013bSjsg {
1861099013bSjsg 	f->system_params = mask & ATIF_GET_SYSTEM_PARAMETERS_SUPPORTED;
1871099013bSjsg 	f->sbios_requests = mask & ATIF_GET_SYSTEM_BIOS_REQUESTS_SUPPORTED;
1881099013bSjsg 	f->select_active_disp = mask & ATIF_SELECT_ACTIVE_DISPLAYS_SUPPORTED;
1891099013bSjsg 	f->lid_state = mask & ATIF_GET_LID_STATE_SUPPORTED;
1901099013bSjsg 	f->get_tv_standard = mask & ATIF_GET_TV_STANDARD_FROM_CMOS_SUPPORTED;
1911099013bSjsg 	f->set_tv_standard = mask & ATIF_SET_TV_STANDARD_IN_CMOS_SUPPORTED;
1921099013bSjsg 	f->get_panel_expansion_mode = mask & ATIF_GET_PANEL_EXPANSION_MODE_FROM_CMOS_SUPPORTED;
1931099013bSjsg 	f->set_panel_expansion_mode = mask & ATIF_SET_PANEL_EXPANSION_MODE_IN_CMOS_SUPPORTED;
1941099013bSjsg 	f->temperature_change = mask & ATIF_TEMPERATURE_CHANGE_NOTIFICATION_SUPPORTED;
1951099013bSjsg 	f->graphics_device_types = mask & ATIF_GET_GRAPHICS_DEVICE_TYPES_SUPPORTED;
1961099013bSjsg }
1971099013bSjsg 
1981099013bSjsg /**
1991099013bSjsg  * radeon_atif_verify_interface - verify ATIF
2001099013bSjsg  *
2011099013bSjsg  * @handle: acpi handle
2021099013bSjsg  * @atif: radeon atif struct
2031099013bSjsg  *
2041099013bSjsg  * Execute the ATIF_FUNCTION_VERIFY_INTERFACE ATIF function
2051099013bSjsg  * to initialize ATIF and determine what features are supported
2061099013bSjsg  * (all asics).
2071099013bSjsg  * returns 0 on success, error on failure.
2081099013bSjsg  */
2091099013bSjsg static int radeon_atif_verify_interface(acpi_handle handle,
2101099013bSjsg 		struct radeon_atif *atif)
2111099013bSjsg {
2121099013bSjsg 	union acpi_object *info;
2131099013bSjsg 	struct atif_verify_interface output;
2141099013bSjsg 	size_t size;
2151099013bSjsg 	int err = 0;
2161099013bSjsg 
2171099013bSjsg 	info = radeon_atif_call(handle, ATIF_FUNCTION_VERIFY_INTERFACE, NULL);
2181099013bSjsg 	if (!info)
2191099013bSjsg 		return -EIO;
2201099013bSjsg 
2211099013bSjsg 	memset(&output, 0, sizeof(output));
2221099013bSjsg 
2231099013bSjsg 	size = *(u16 *) info->buffer.pointer;
2241099013bSjsg 	if (size < 12) {
2251099013bSjsg 		DRM_INFO("ATIF buffer is too small: %zu\n", size);
2261099013bSjsg 		err = -EINVAL;
2271099013bSjsg 		goto out;
2281099013bSjsg 	}
2291099013bSjsg 	size = min(sizeof(output), size);
2301099013bSjsg 
2311099013bSjsg 	memcpy(&output, info->buffer.pointer, size);
2321099013bSjsg 
2331099013bSjsg 	/* TODO: check version? */
2341099013bSjsg 	DRM_DEBUG_DRIVER("ATIF version %u\n", output.version);
2351099013bSjsg 
2361099013bSjsg 	radeon_atif_parse_notification(&atif->notifications, output.notification_mask);
2371099013bSjsg 	radeon_atif_parse_functions(&atif->functions, output.function_bits);
2381099013bSjsg 
2391099013bSjsg out:
240de5631a0Sjsg 	kfree(info);
2411099013bSjsg 	return err;
2421099013bSjsg }
2431099013bSjsg 
2441099013bSjsg /**
2451099013bSjsg  * radeon_atif_get_notification_params - determine notify configuration
2461099013bSjsg  *
2471099013bSjsg  * @handle: acpi handle
2481099013bSjsg  * @n: atif notification configuration struct
2491099013bSjsg  *
2501099013bSjsg  * Execute the ATIF_FUNCTION_GET_SYSTEM_PARAMETERS ATIF function
2511099013bSjsg  * to determine if a notifier is used and if so which one
2521099013bSjsg  * (all asics).  This is either Notify(VGA, 0x81) or Notify(VGA, n)
2531099013bSjsg  * where n is specified in the result if a notifier is used.
2541099013bSjsg  * Returns 0 on success, error on failure.
2551099013bSjsg  */
2561099013bSjsg static int radeon_atif_get_notification_params(acpi_handle handle,
2571099013bSjsg 		struct radeon_atif_notification_cfg *n)
2581099013bSjsg {
2591099013bSjsg 	union acpi_object *info;
2601099013bSjsg 	struct atif_system_params params;
2611099013bSjsg 	size_t size;
2621099013bSjsg 	int err = 0;
2631099013bSjsg 
2641099013bSjsg 	info = radeon_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_PARAMETERS, NULL);
2651099013bSjsg 	if (!info) {
2661099013bSjsg 		err = -EIO;
2671099013bSjsg 		goto out;
2681099013bSjsg 	}
2691099013bSjsg 
2701099013bSjsg 	size = *(u16 *) info->buffer.pointer;
2711099013bSjsg 	if (size < 10) {
2721099013bSjsg 		err = -EINVAL;
2731099013bSjsg 		goto out;
2741099013bSjsg 	}
2751099013bSjsg 
2761099013bSjsg 	memset(&params, 0, sizeof(params));
2771099013bSjsg 	size = min(sizeof(params), size);
2781099013bSjsg 	memcpy(&params, info->buffer.pointer, size);
2791099013bSjsg 
2801099013bSjsg 	DRM_DEBUG_DRIVER("SYSTEM_PARAMS: mask = %#x, flags = %#x\n",
2811099013bSjsg 			params.flags, params.valid_mask);
2821099013bSjsg 	params.flags = params.flags & params.valid_mask;
2831099013bSjsg 
2841099013bSjsg 	if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_NONE) {
2851099013bSjsg 		n->enabled = false;
2861099013bSjsg 		n->command_code = 0;
2871099013bSjsg 	} else if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_81) {
2881099013bSjsg 		n->enabled = true;
2891099013bSjsg 		n->command_code = 0x81;
2901099013bSjsg 	} else {
2911099013bSjsg 		if (size < 11) {
2921099013bSjsg 			err = -EINVAL;
2931099013bSjsg 			goto out;
2941099013bSjsg 		}
2951099013bSjsg 		n->enabled = true;
2961099013bSjsg 		n->command_code = params.command_code;
2971099013bSjsg 	}
2981099013bSjsg 
2991099013bSjsg out:
3001099013bSjsg 	DRM_DEBUG_DRIVER("Notification %s, command code = %#x\n",
3011099013bSjsg 			(n->enabled ? "enabled" : "disabled"),
3021099013bSjsg 			n->command_code);
303de5631a0Sjsg 	kfree(info);
3041099013bSjsg 	return err;
3051099013bSjsg }
3061099013bSjsg 
3071099013bSjsg /**
3081099013bSjsg  * radeon_atif_get_sbios_requests - get requested sbios event
3091099013bSjsg  *
3101099013bSjsg  * @handle: acpi handle
3111099013bSjsg  * @req: atif sbios request struct
3121099013bSjsg  *
3131099013bSjsg  * Execute the ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS ATIF function
3141099013bSjsg  * to determine what requests the sbios is making to the driver
3151099013bSjsg  * (all asics).
3161099013bSjsg  * Returns 0 on success, error on failure.
3171099013bSjsg  */
3181099013bSjsg static int radeon_atif_get_sbios_requests(acpi_handle handle,
3191099013bSjsg 		struct atif_sbios_requests *req)
3201099013bSjsg {
3211099013bSjsg 	union acpi_object *info;
3221099013bSjsg 	size_t size;
3231099013bSjsg 	int count = 0;
3241099013bSjsg 
3251099013bSjsg 	info = radeon_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS, NULL);
3261099013bSjsg 	if (!info)
3271099013bSjsg 		return -EIO;
3281099013bSjsg 
3291099013bSjsg 	size = *(u16 *)info->buffer.pointer;
3301099013bSjsg 	if (size < 0xd) {
3311099013bSjsg 		count = -EINVAL;
3321099013bSjsg 		goto out;
3331099013bSjsg 	}
3341099013bSjsg 	memset(req, 0, sizeof(*req));
3351099013bSjsg 
3361099013bSjsg 	size = min(sizeof(*req), size);
3371099013bSjsg 	memcpy(req, info->buffer.pointer, size);
3381099013bSjsg 	DRM_DEBUG_DRIVER("SBIOS pending requests: %#x\n", req->pending);
3391099013bSjsg 
3401099013bSjsg 	count = hweight32(req->pending);
3411099013bSjsg 
3421099013bSjsg out:
343de5631a0Sjsg 	kfree(info);
3441099013bSjsg 	return count;
3451099013bSjsg }
3461099013bSjsg 
3471099013bSjsg /**
3481099013bSjsg  * radeon_atif_handler - handle ATIF notify requests
3491099013bSjsg  *
3501099013bSjsg  * @rdev: radeon_device pointer
3511099013bSjsg  * @event: atif sbios request struct
3521099013bSjsg  *
3531099013bSjsg  * Checks the acpi event and if it matches an atif event,
3541099013bSjsg  * handles it.
3551099013bSjsg  * Returns NOTIFY code
3561099013bSjsg  */
3577f4dd379Sjsg static int radeon_atif_handler(struct radeon_device *rdev,
3581099013bSjsg 		struct acpi_bus_event *event)
3591099013bSjsg {
3601099013bSjsg 	struct radeon_atif *atif = &rdev->atif;
3611099013bSjsg 	struct atif_sbios_requests req;
3621099013bSjsg 	acpi_handle handle;
3631099013bSjsg 	int count;
3641099013bSjsg 
3651099013bSjsg 	DRM_DEBUG_DRIVER("event, device_class = %s, type = %#x\n",
3661099013bSjsg 			event->device_class, event->type);
3671099013bSjsg 
3681099013bSjsg 	if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0)
3691099013bSjsg 		return NOTIFY_DONE;
3701099013bSjsg 
3711099013bSjsg 	if (!atif->notification_cfg.enabled ||
3721099013bSjsg 			event->type != atif->notification_cfg.command_code)
3731099013bSjsg 		/* Not our event */
3741099013bSjsg 		return NOTIFY_DONE;
3751099013bSjsg 
3761099013bSjsg 	/* Check pending SBIOS requests */
3777ccd5a2cSjsg 	handle = ACPI_HANDLE(&rdev->pdev->dev);
3781099013bSjsg 	count = radeon_atif_get_sbios_requests(handle, &req);
3791099013bSjsg 
3801099013bSjsg 	if (count <= 0)
3811099013bSjsg 		return NOTIFY_DONE;
3821099013bSjsg 
3831099013bSjsg 	DRM_DEBUG_DRIVER("ATIF: %d pending SBIOS requests\n", count);
3841099013bSjsg 
3851099013bSjsg 	if (req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) {
3861099013bSjsg 		struct radeon_encoder *enc = atif->encoder_for_bl;
3871099013bSjsg 
3881099013bSjsg 		if (enc) {
3891099013bSjsg 			DRM_DEBUG_DRIVER("Changing brightness to %d\n",
3901099013bSjsg 					req.backlight_level);
3911099013bSjsg 
3921099013bSjsg 			radeon_set_backlight_level(rdev, enc, req.backlight_level);
3931099013bSjsg 
3941099013bSjsg 			if (rdev->is_atom_bios) {
3951099013bSjsg 				struct radeon_encoder_atom_dig *dig = enc->enc_priv;
3961099013bSjsg 				backlight_force_update(dig->bl_dev,
3971099013bSjsg 						       BACKLIGHT_UPDATE_HOTKEY);
3981099013bSjsg 			} else {
3991099013bSjsg 				struct radeon_encoder_lvds *dig = enc->enc_priv;
4001099013bSjsg 				backlight_force_update(dig->bl_dev,
4011099013bSjsg 						       BACKLIGHT_UPDATE_HOTKEY);
4021099013bSjsg 			}
4031099013bSjsg 		}
4041099013bSjsg 	}
4057f4dd379Sjsg 	if (req.pending & ATIF_DGPU_DISPLAY_EVENT) {
4067f4dd379Sjsg 		if ((rdev->flags & RADEON_IS_PX) &&
4077f4dd379Sjsg 		    radeon_atpx_dgpu_req_power_for_displays()) {
408*33a3edb1Sjsg 			pm_runtime_get_sync(rdev_to_drm(rdev)->dev);
4097f4dd379Sjsg 			/* Just fire off a uevent and let userspace tell us what to do */
410*33a3edb1Sjsg 			drm_helper_hpd_irq_event(rdev_to_drm(rdev));
411*33a3edb1Sjsg 			pm_runtime_mark_last_busy(rdev_to_drm(rdev)->dev);
412*33a3edb1Sjsg 			pm_runtime_put_autosuspend(rdev_to_drm(rdev)->dev);
4137f4dd379Sjsg 		}
4147f4dd379Sjsg 	}
4151099013bSjsg 	/* TODO: check other events */
4161099013bSjsg 
4171099013bSjsg 	/* We've handled the event, stop the notifier chain. The ACPI interface
4181099013bSjsg 	 * overloads ACPI_VIDEO_NOTIFY_PROBE, we don't want to send that to
4191099013bSjsg 	 * userspace if the event was generated only to signal a SBIOS
4201099013bSjsg 	 * request.
4211099013bSjsg 	 */
4221099013bSjsg 	return NOTIFY_BAD;
4231099013bSjsg }
4241099013bSjsg 
4251099013bSjsg /* Call the ATCS method
4261099013bSjsg  */
4271099013bSjsg /**
4281099013bSjsg  * radeon_atcs_call - call an ATCS method
4291099013bSjsg  *
4301099013bSjsg  * @handle: acpi handle
4311099013bSjsg  * @function: the ATCS function to execute
4321099013bSjsg  * @params: ATCS function params
4331099013bSjsg  *
4341099013bSjsg  * Executes the requested ATCS function (all asics).
4351099013bSjsg  * Returns a pointer to the acpi output buffer.
4361099013bSjsg  */
4371099013bSjsg static union acpi_object *radeon_atcs_call(acpi_handle handle, int function,
4381099013bSjsg 					   struct acpi_buffer *params)
4391099013bSjsg {
4401099013bSjsg 	acpi_status status;
4411099013bSjsg 	union acpi_object atcs_arg_elements[2];
4421099013bSjsg 	struct acpi_object_list atcs_arg;
4431099013bSjsg 	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
4441099013bSjsg 
4451099013bSjsg 	atcs_arg.count = 2;
4461099013bSjsg 	atcs_arg.pointer = &atcs_arg_elements[0];
4471099013bSjsg 
4481099013bSjsg 	atcs_arg_elements[0].type = ACPI_TYPE_INTEGER;
4491099013bSjsg 	atcs_arg_elements[0].integer.value = function;
4501099013bSjsg 
4511099013bSjsg 	if (params) {
4521099013bSjsg 		atcs_arg_elements[1].type = ACPI_TYPE_BUFFER;
4531099013bSjsg 		atcs_arg_elements[1].buffer.length = params->length;
4541099013bSjsg 		atcs_arg_elements[1].buffer.pointer = params->pointer;
4551099013bSjsg 	} else {
4561099013bSjsg 		/* We need a second fake parameter */
4571099013bSjsg 		atcs_arg_elements[1].type = ACPI_TYPE_INTEGER;
4581099013bSjsg 		atcs_arg_elements[1].integer.value = 0;
4591099013bSjsg 	}
4601099013bSjsg 
4611099013bSjsg 	status = acpi_evaluate_object(handle, "ATCS", &atcs_arg, &buffer);
4621099013bSjsg 
4631099013bSjsg 	/* Fail only if calling the method fails and ATIF is supported */
4641099013bSjsg 	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
4651099013bSjsg 		DRM_DEBUG_DRIVER("failed to evaluate ATCS got %s\n",
4661099013bSjsg 				 acpi_format_exception(status));
467de5631a0Sjsg 		kfree(buffer.pointer);
4681099013bSjsg 		return NULL;
4691099013bSjsg 	}
4701099013bSjsg 
4711099013bSjsg 	return buffer.pointer;
4721099013bSjsg }
4731099013bSjsg 
4741099013bSjsg /**
4751099013bSjsg  * radeon_atcs_parse_functions - parse supported functions
4761099013bSjsg  *
4771099013bSjsg  * @f: supported functions struct
4781099013bSjsg  * @mask: supported functions mask from ATCS
4791099013bSjsg  *
4801099013bSjsg  * Use the supported functions mask from ATCS function
4811099013bSjsg  * ATCS_FUNCTION_VERIFY_INTERFACE to determine what functions
4821099013bSjsg  * are supported (all asics).
4831099013bSjsg  */
4841099013bSjsg static void radeon_atcs_parse_functions(struct radeon_atcs_functions *f, u32 mask)
4851099013bSjsg {
4861099013bSjsg 	f->get_ext_state = mask & ATCS_GET_EXTERNAL_STATE_SUPPORTED;
4871099013bSjsg 	f->pcie_perf_req = mask & ATCS_PCIE_PERFORMANCE_REQUEST_SUPPORTED;
4881099013bSjsg 	f->pcie_dev_rdy = mask & ATCS_PCIE_DEVICE_READY_NOTIFICATION_SUPPORTED;
4891099013bSjsg 	f->pcie_bus_width = mask & ATCS_SET_PCIE_BUS_WIDTH_SUPPORTED;
4901099013bSjsg }
4911099013bSjsg 
4921099013bSjsg /**
4931099013bSjsg  * radeon_atcs_verify_interface - verify ATCS
4941099013bSjsg  *
4951099013bSjsg  * @handle: acpi handle
4961099013bSjsg  * @atcs: radeon atcs struct
4971099013bSjsg  *
4981099013bSjsg  * Execute the ATCS_FUNCTION_VERIFY_INTERFACE ATCS function
4991099013bSjsg  * to initialize ATCS and determine what features are supported
5001099013bSjsg  * (all asics).
5011099013bSjsg  * returns 0 on success, error on failure.
5021099013bSjsg  */
5031099013bSjsg static int radeon_atcs_verify_interface(acpi_handle handle,
5041099013bSjsg 					struct radeon_atcs *atcs)
5051099013bSjsg {
5061099013bSjsg 	union acpi_object *info;
5071099013bSjsg 	struct atcs_verify_interface output;
5081099013bSjsg 	size_t size;
5091099013bSjsg 	int err = 0;
5101099013bSjsg 
5111099013bSjsg 	info = radeon_atcs_call(handle, ATCS_FUNCTION_VERIFY_INTERFACE, NULL);
5121099013bSjsg 	if (!info)
5131099013bSjsg 		return -EIO;
5141099013bSjsg 
5151099013bSjsg 	memset(&output, 0, sizeof(output));
5161099013bSjsg 
5171099013bSjsg 	size = *(u16 *) info->buffer.pointer;
5181099013bSjsg 	if (size < 8) {
5191099013bSjsg 		DRM_INFO("ATCS buffer is too small: %zu\n", size);
5201099013bSjsg 		err = -EINVAL;
5211099013bSjsg 		goto out;
5221099013bSjsg 	}
5231099013bSjsg 	size = min(sizeof(output), size);
5241099013bSjsg 
5251099013bSjsg 	memcpy(&output, info->buffer.pointer, size);
5261099013bSjsg 
5271099013bSjsg 	/* TODO: check version? */
5281099013bSjsg 	DRM_DEBUG_DRIVER("ATCS version %u\n", output.version);
5291099013bSjsg 
5301099013bSjsg 	radeon_atcs_parse_functions(&atcs->functions, output.function_bits);
5311099013bSjsg 
5321099013bSjsg out:
533de5631a0Sjsg 	kfree(info);
5341099013bSjsg 	return err;
5351099013bSjsg }
5361099013bSjsg 
5371099013bSjsg /**
5387ccd5a2cSjsg  * radeon_acpi_is_pcie_performance_request_supported
5397ccd5a2cSjsg  *
5407ccd5a2cSjsg  * @rdev: radeon_device pointer
5417ccd5a2cSjsg  *
5427ccd5a2cSjsg  * Check if the ATCS pcie_perf_req and pcie_dev_rdy methods
5437ccd5a2cSjsg  * are supported (all asics).
5447ccd5a2cSjsg  * returns true if supported, false if not.
5457ccd5a2cSjsg  */
5467ccd5a2cSjsg bool radeon_acpi_is_pcie_performance_request_supported(struct radeon_device *rdev)
5477ccd5a2cSjsg {
5487ccd5a2cSjsg 	struct radeon_atcs *atcs = &rdev->atcs;
5497ccd5a2cSjsg 
5507ccd5a2cSjsg 	if (atcs->functions.pcie_perf_req && atcs->functions.pcie_dev_rdy)
5517ccd5a2cSjsg 		return true;
5527ccd5a2cSjsg 
5537ccd5a2cSjsg 	return false;
5547ccd5a2cSjsg }
5557ccd5a2cSjsg 
5567ccd5a2cSjsg /**
5577ccd5a2cSjsg  * radeon_acpi_pcie_notify_device_ready
5587ccd5a2cSjsg  *
5597ccd5a2cSjsg  * @rdev: radeon_device pointer
5607ccd5a2cSjsg  *
5617ccd5a2cSjsg  * Executes the PCIE_DEVICE_READY_NOTIFICATION method
5627ccd5a2cSjsg  * (all asics).
5637ccd5a2cSjsg  * returns 0 on success, error on failure.
5647ccd5a2cSjsg  */
5657ccd5a2cSjsg int radeon_acpi_pcie_notify_device_ready(struct radeon_device *rdev)
5667ccd5a2cSjsg {
5677ccd5a2cSjsg 	acpi_handle handle;
5687ccd5a2cSjsg 	union acpi_object *info;
5697ccd5a2cSjsg 	struct radeon_atcs *atcs = &rdev->atcs;
5707ccd5a2cSjsg 
5717ccd5a2cSjsg 	/* Get the device handle */
5727ccd5a2cSjsg 	handle = ACPI_HANDLE(&rdev->pdev->dev);
5737ccd5a2cSjsg 	if (!handle)
5747ccd5a2cSjsg 		return -EINVAL;
5757ccd5a2cSjsg 
5767ccd5a2cSjsg 	if (!atcs->functions.pcie_dev_rdy)
5777ccd5a2cSjsg 		return -EINVAL;
5787ccd5a2cSjsg 
5797ccd5a2cSjsg 	info = radeon_atcs_call(handle, ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION, NULL);
5807ccd5a2cSjsg 	if (!info)
5817ccd5a2cSjsg 		return -EIO;
5827ccd5a2cSjsg 
5837ccd5a2cSjsg 	kfree(info);
5847ccd5a2cSjsg 
5857ccd5a2cSjsg 	return 0;
5867ccd5a2cSjsg }
5877ccd5a2cSjsg 
5887ccd5a2cSjsg /**
5897ccd5a2cSjsg  * radeon_acpi_pcie_performance_request
5907ccd5a2cSjsg  *
5917ccd5a2cSjsg  * @rdev: radeon_device pointer
5927ccd5a2cSjsg  * @perf_req: requested perf level (pcie gen speed)
5937ccd5a2cSjsg  * @advertise: set advertise caps flag if set
5947ccd5a2cSjsg  *
5957ccd5a2cSjsg  * Executes the PCIE_PERFORMANCE_REQUEST method to
5967ccd5a2cSjsg  * change the pcie gen speed (all asics).
5977ccd5a2cSjsg  * returns 0 on success, error on failure.
5987ccd5a2cSjsg  */
5997ccd5a2cSjsg int radeon_acpi_pcie_performance_request(struct radeon_device *rdev,
6007ccd5a2cSjsg 					 u8 perf_req, bool advertise)
6017ccd5a2cSjsg {
6027ccd5a2cSjsg 	acpi_handle handle;
6037ccd5a2cSjsg 	union acpi_object *info;
6047ccd5a2cSjsg 	struct radeon_atcs *atcs = &rdev->atcs;
6057ccd5a2cSjsg 	struct atcs_pref_req_input atcs_input;
6067ccd5a2cSjsg 	struct atcs_pref_req_output atcs_output;
6077ccd5a2cSjsg 	struct acpi_buffer params;
6087ccd5a2cSjsg 	size_t size;
6097ccd5a2cSjsg 	u32 retry = 3;
6107ccd5a2cSjsg 
6117ccd5a2cSjsg 	/* Get the device handle */
6127ccd5a2cSjsg 	handle = ACPI_HANDLE(&rdev->pdev->dev);
6137ccd5a2cSjsg 	if (!handle)
6147ccd5a2cSjsg 		return -EINVAL;
6157ccd5a2cSjsg 
6167ccd5a2cSjsg 	if (!atcs->functions.pcie_perf_req)
6177ccd5a2cSjsg 		return -EINVAL;
6187ccd5a2cSjsg 
6197ccd5a2cSjsg 	atcs_input.size = sizeof(struct atcs_pref_req_input);
6207ccd5a2cSjsg 	/* client id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */
621f005ef32Sjsg 	atcs_input.client_id = pci_dev_id(rdev->pdev);
6227ccd5a2cSjsg 	atcs_input.valid_flags_mask = ATCS_VALID_FLAGS_MASK;
6237ccd5a2cSjsg 	atcs_input.flags = ATCS_WAIT_FOR_COMPLETION;
6247ccd5a2cSjsg 	if (advertise)
6257ccd5a2cSjsg 		atcs_input.flags |= ATCS_ADVERTISE_CAPS;
6267ccd5a2cSjsg 	atcs_input.req_type = ATCS_PCIE_LINK_SPEED;
6277ccd5a2cSjsg 	atcs_input.perf_req = perf_req;
6287ccd5a2cSjsg 
6297ccd5a2cSjsg 	params.length = sizeof(struct atcs_pref_req_input);
6307ccd5a2cSjsg 	params.pointer = &atcs_input;
6317ccd5a2cSjsg 
6327ccd5a2cSjsg 	while (retry--) {
6337ccd5a2cSjsg 		info = radeon_atcs_call(handle, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, &params);
6347ccd5a2cSjsg 		if (!info)
6357ccd5a2cSjsg 			return -EIO;
6367ccd5a2cSjsg 
6377ccd5a2cSjsg 		memset(&atcs_output, 0, sizeof(atcs_output));
6387ccd5a2cSjsg 
6397ccd5a2cSjsg 		size = *(u16 *) info->buffer.pointer;
6407ccd5a2cSjsg 		if (size < 3) {
6417ccd5a2cSjsg 			DRM_INFO("ATCS buffer is too small: %zu\n", size);
6427ccd5a2cSjsg 			kfree(info);
6437ccd5a2cSjsg 			return -EINVAL;
6447ccd5a2cSjsg 		}
6457ccd5a2cSjsg 		size = min(sizeof(atcs_output), size);
6467ccd5a2cSjsg 
6477ccd5a2cSjsg 		memcpy(&atcs_output, info->buffer.pointer, size);
6487ccd5a2cSjsg 
6497ccd5a2cSjsg 		kfree(info);
6507ccd5a2cSjsg 
6517ccd5a2cSjsg 		switch (atcs_output.ret_val) {
6527ccd5a2cSjsg 		case ATCS_REQUEST_REFUSED:
6537ccd5a2cSjsg 		default:
6547ccd5a2cSjsg 			return -EINVAL;
6557ccd5a2cSjsg 		case ATCS_REQUEST_COMPLETE:
6567ccd5a2cSjsg 			return 0;
6577ccd5a2cSjsg 		case ATCS_REQUEST_IN_PROGRESS:
6587ccd5a2cSjsg 			udelay(10);
6597ccd5a2cSjsg 			break;
6607ccd5a2cSjsg 		}
6617ccd5a2cSjsg 	}
6627ccd5a2cSjsg 
6637ccd5a2cSjsg 	return 0;
6647ccd5a2cSjsg }
6657ccd5a2cSjsg 
6667ccd5a2cSjsg /**
6671099013bSjsg  * radeon_acpi_event - handle notify events
6681099013bSjsg  *
6691099013bSjsg  * @nb: notifier block
6701099013bSjsg  * @val: val
6711099013bSjsg  * @data: acpi event
6721099013bSjsg  *
6731099013bSjsg  * Calls relevant radeon functions in response to various
6741099013bSjsg  * acpi events.
6751099013bSjsg  * Returns NOTIFY code
6761099013bSjsg  */
6771099013bSjsg static int radeon_acpi_event(struct notifier_block *nb,
6781099013bSjsg 			     unsigned long val,
6791099013bSjsg 			     void *data)
6801099013bSjsg {
6811099013bSjsg 	struct radeon_device *rdev = container_of(nb, struct radeon_device, acpi_nb);
6821099013bSjsg 	struct acpi_bus_event *entry = (struct acpi_bus_event *)data;
6831099013bSjsg 
6841099013bSjsg 	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) {
6851099013bSjsg 		if (power_supply_is_system_supplied() > 0)
6861099013bSjsg 			DRM_DEBUG_DRIVER("pm: AC\n");
6871099013bSjsg 		else
6881099013bSjsg 			DRM_DEBUG_DRIVER("pm: DC\n");
6891099013bSjsg 
6901099013bSjsg 		radeon_pm_acpi_event_handler(rdev);
6911099013bSjsg 	}
6921099013bSjsg 
6931099013bSjsg 	/* Check for pending SBIOS requests */
6941099013bSjsg 	return radeon_atif_handler(rdev, entry);
6951099013bSjsg }
6961099013bSjsg 
6971099013bSjsg /* Call all ACPI methods here */
6981099013bSjsg /**
6991099013bSjsg  * radeon_acpi_init - init driver acpi support
7001099013bSjsg  *
7011099013bSjsg  * @rdev: radeon_device pointer
7021099013bSjsg  *
7031099013bSjsg  * Verifies the AMD ACPI interfaces and registers with the acpi
7041099013bSjsg  * notifier chain (all asics).
7051099013bSjsg  * Returns 0 on success, error on failure.
7061099013bSjsg  */
7071099013bSjsg int radeon_acpi_init(struct radeon_device *rdev)
7081099013bSjsg {
7091099013bSjsg 	acpi_handle handle;
7101099013bSjsg 	struct radeon_atif *atif = &rdev->atif;
7111099013bSjsg 	struct radeon_atcs *atcs = &rdev->atcs;
7121099013bSjsg 	int ret;
7131099013bSjsg 
7141099013bSjsg 	/* Get the device handle */
7157ccd5a2cSjsg 	handle = ACPI_HANDLE(&rdev->pdev->dev);
7161099013bSjsg 
7171099013bSjsg 	/* No need to proceed if we're sure that ATIF is not supported */
7181099013bSjsg 	if (!ASIC_IS_AVIVO(rdev) || !rdev->bios || !handle)
7191099013bSjsg 		return 0;
7201099013bSjsg 
7211099013bSjsg 	/* Call the ATCS method */
7221099013bSjsg 	ret = radeon_atcs_verify_interface(handle, atcs);
7231099013bSjsg 	if (ret) {
7241099013bSjsg 		DRM_DEBUG_DRIVER("Call to ATCS verify_interface failed: %d\n", ret);
7251099013bSjsg 	}
7261099013bSjsg 
7271099013bSjsg 	/* Call the ATIF method */
7281099013bSjsg 	ret = radeon_atif_verify_interface(handle, atif);
7291099013bSjsg 	if (ret) {
7301099013bSjsg 		DRM_DEBUG_DRIVER("Call to ATIF verify_interface failed: %d\n", ret);
7311099013bSjsg 		goto out;
7321099013bSjsg 	}
7331099013bSjsg 
7341099013bSjsg 	if (atif->notifications.brightness_change) {
7351099013bSjsg 		struct drm_encoder *tmp;
7361099013bSjsg 		struct radeon_encoder *target = NULL;
7371099013bSjsg 
7381099013bSjsg 		/* Find the encoder controlling the brightness */
739*33a3edb1Sjsg 		list_for_each_entry(tmp, &rdev_to_drm(rdev)->mode_config.encoder_list,
7401099013bSjsg 				head) {
7411099013bSjsg 			struct radeon_encoder *enc = to_radeon_encoder(tmp);
7421099013bSjsg 
7431099013bSjsg 			if ((enc->devices & (ATOM_DEVICE_LCD_SUPPORT)) &&
7441099013bSjsg 			    enc->enc_priv) {
7451099013bSjsg 				if (rdev->is_atom_bios) {
7461099013bSjsg 					struct radeon_encoder_atom_dig *dig = enc->enc_priv;
7471099013bSjsg 					if (dig->bl_dev) {
7481099013bSjsg 						target = enc;
7491099013bSjsg 						break;
7501099013bSjsg 					}
7511099013bSjsg 				} else {
7521099013bSjsg 					struct radeon_encoder_lvds *dig = enc->enc_priv;
7531099013bSjsg 					if (dig->bl_dev) {
7541099013bSjsg 						target = enc;
7551099013bSjsg 						break;
7561099013bSjsg 					}
7571099013bSjsg 				}
7581099013bSjsg 			}
7591099013bSjsg 		}
7601099013bSjsg 
7611099013bSjsg 		atif->encoder_for_bl = target;
7621099013bSjsg 	}
7631099013bSjsg 
7641099013bSjsg 	if (atif->functions.sbios_requests && !atif->functions.system_params) {
7651099013bSjsg 		/* XXX check this workraround, if sbios request function is
7661099013bSjsg 		 * present we have to see how it's configured in the system
7671099013bSjsg 		 * params
7681099013bSjsg 		 */
7691099013bSjsg 		atif->functions.system_params = true;
7701099013bSjsg 	}
7711099013bSjsg 
7721099013bSjsg 	if (atif->functions.system_params) {
7731099013bSjsg 		ret = radeon_atif_get_notification_params(handle,
7741099013bSjsg 				&atif->notification_cfg);
7751099013bSjsg 		if (ret) {
7761099013bSjsg 			DRM_DEBUG_DRIVER("Call to GET_SYSTEM_PARAMS failed: %d\n",
7771099013bSjsg 					ret);
7781099013bSjsg 			/* Disable notification */
7791099013bSjsg 			atif->notification_cfg.enabled = false;
7801099013bSjsg 		}
7811099013bSjsg 	}
7821099013bSjsg 
7831099013bSjsg out:
7841099013bSjsg 	rdev->acpi_nb.notifier_call = radeon_acpi_event;
7851099013bSjsg 	register_acpi_notifier(&rdev->acpi_nb);
7861099013bSjsg 
7871099013bSjsg 	return ret;
7881099013bSjsg }
7891099013bSjsg 
7901099013bSjsg /**
7911099013bSjsg  * radeon_acpi_fini - tear down driver acpi support
7921099013bSjsg  *
7931099013bSjsg  * @rdev: radeon_device pointer
7941099013bSjsg  *
7951099013bSjsg  * Unregisters with the acpi notifier chain (all asics).
7961099013bSjsg  */
7971099013bSjsg void radeon_acpi_fini(struct radeon_device *rdev)
7981099013bSjsg {
7991099013bSjsg 	unregister_acpi_notifier(&rdev->acpi_nb);
8001099013bSjsg }
801