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