xref: /freebsd/sys/contrib/dev/rtw89/acpi.c (revision e2340276fc734a1f0bd0d2cf16fcfba7936c9462)
1*e2340276SBjoern A. Zeeb // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2*e2340276SBjoern A. Zeeb /* Copyright(c) 2021-2023  Realtek Corporation
3*e2340276SBjoern A. Zeeb  */
4*e2340276SBjoern A. Zeeb 
5*e2340276SBjoern A. Zeeb #include <linux/acpi.h>
6*e2340276SBjoern A. Zeeb #include <linux/uuid.h>
7*e2340276SBjoern A. Zeeb 
8*e2340276SBjoern A. Zeeb #include "acpi.h"
9*e2340276SBjoern A. Zeeb #include "debug.h"
10*e2340276SBjoern A. Zeeb 
11*e2340276SBjoern A. Zeeb #if defined(__linux__)
12*e2340276SBjoern A. Zeeb static const guid_t rtw89_guid = GUID_INIT(0xD2A8C3E8, 0x4B69, 0x4F00,
13*e2340276SBjoern A. Zeeb 					   0x82, 0xBD, 0xFE, 0x86,
14*e2340276SBjoern A. Zeeb 					   0x07, 0x80, 0x3A, 0xA7);
15*e2340276SBjoern A. Zeeb 
16*e2340276SBjoern A. Zeeb static int rtw89_acpi_dsm_get(struct rtw89_dev *rtwdev, union acpi_object *obj,
17*e2340276SBjoern A. Zeeb 			      u8 *value)
18*e2340276SBjoern A. Zeeb {
19*e2340276SBjoern A. Zeeb 	switch (obj->type) {
20*e2340276SBjoern A. Zeeb 	case ACPI_TYPE_INTEGER:
21*e2340276SBjoern A. Zeeb 		*value = (u8)obj->integer.value;
22*e2340276SBjoern A. Zeeb 		break;
23*e2340276SBjoern A. Zeeb 	case ACPI_TYPE_BUFFER:
24*e2340276SBjoern A. Zeeb 		*value = obj->buffer.pointer[0];
25*e2340276SBjoern A. Zeeb 		break;
26*e2340276SBjoern A. Zeeb 	default:
27*e2340276SBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
28*e2340276SBjoern A. Zeeb 			    "acpi dsm return unhandled type: %d\n", obj->type);
29*e2340276SBjoern A. Zeeb 		return -EINVAL;
30*e2340276SBjoern A. Zeeb 	}
31*e2340276SBjoern A. Zeeb 
32*e2340276SBjoern A. Zeeb 	return 0;
33*e2340276SBjoern A. Zeeb }
34*e2340276SBjoern A. Zeeb 
35*e2340276SBjoern A. Zeeb int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
36*e2340276SBjoern A. Zeeb 			    enum rtw89_acpi_dsm_func func, u8 *value)
37*e2340276SBjoern A. Zeeb {
38*e2340276SBjoern A. Zeeb 	union acpi_object *obj;
39*e2340276SBjoern A. Zeeb 	int ret;
40*e2340276SBjoern A. Zeeb 
41*e2340276SBjoern A. Zeeb 	obj = acpi_evaluate_dsm(ACPI_HANDLE(rtwdev->dev), &rtw89_guid,
42*e2340276SBjoern A. Zeeb 				0, func, NULL);
43*e2340276SBjoern A. Zeeb 	if (!obj) {
44*e2340276SBjoern A. Zeeb 		rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
45*e2340276SBjoern A. Zeeb 			    "acpi dsm fail to evaluate func: %d\n", func);
46*e2340276SBjoern A. Zeeb 		return -ENOENT;
47*e2340276SBjoern A. Zeeb 	}
48*e2340276SBjoern A. Zeeb 
49*e2340276SBjoern A. Zeeb 	ret = rtw89_acpi_dsm_get(rtwdev, obj, value);
50*e2340276SBjoern A. Zeeb 
51*e2340276SBjoern A. Zeeb 	ACPI_FREE(obj);
52*e2340276SBjoern A. Zeeb 	return ret;
53*e2340276SBjoern A. Zeeb }
54*e2340276SBjoern A. Zeeb #elif defined(__FreeBSD__)
55*e2340276SBjoern A. Zeeb int rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
56*e2340276SBjoern A. Zeeb 			    enum rtw89_acpi_dsm_func func, u8 *value)
57*e2340276SBjoern A. Zeeb {
58*e2340276SBjoern A. Zeeb 	return -ENOENT;
59*e2340276SBjoern A. Zeeb }
60*e2340276SBjoern A. Zeeb #endif
61