162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
262306a36Sopenharmony_ci/* Copyright(c) 2021-2023  Realtek Corporation
362306a36Sopenharmony_ci */
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/acpi.h>
662306a36Sopenharmony_ci#include <linux/uuid.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "acpi.h"
962306a36Sopenharmony_ci#include "debug.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistatic const guid_t rtw89_guid = GUID_INIT(0xD2A8C3E8, 0x4B69, 0x4F00,
1262306a36Sopenharmony_ci					   0x82, 0xBD, 0xFE, 0x86,
1362306a36Sopenharmony_ci					   0x07, 0x80, 0x3A, 0xA7);
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic int rtw89_acpi_dsm_get(struct rtw89_dev *rtwdev, union acpi_object *obj,
1662306a36Sopenharmony_ci			      u8 *value)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	switch (obj->type) {
1962306a36Sopenharmony_ci	case ACPI_TYPE_INTEGER:
2062306a36Sopenharmony_ci		*value = (u8)obj->integer.value;
2162306a36Sopenharmony_ci		break;
2262306a36Sopenharmony_ci	case ACPI_TYPE_BUFFER:
2362306a36Sopenharmony_ci		*value = obj->buffer.pointer[0];
2462306a36Sopenharmony_ci		break;
2562306a36Sopenharmony_ci	default:
2662306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
2762306a36Sopenharmony_ci			    "acpi dsm return unhandled type: %d\n", obj->type);
2862306a36Sopenharmony_ci		return -EINVAL;
2962306a36Sopenharmony_ci	}
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	return 0;
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciint rtw89_acpi_evaluate_dsm(struct rtw89_dev *rtwdev,
3562306a36Sopenharmony_ci			    enum rtw89_acpi_dsm_func func, u8 *value)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	union acpi_object *obj;
3862306a36Sopenharmony_ci	int ret;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	obj = acpi_evaluate_dsm(ACPI_HANDLE(rtwdev->dev), &rtw89_guid,
4162306a36Sopenharmony_ci				0, func, NULL);
4262306a36Sopenharmony_ci	if (!obj) {
4362306a36Sopenharmony_ci		rtw89_debug(rtwdev, RTW89_DBG_UNEXP,
4462306a36Sopenharmony_ci			    "acpi dsm fail to evaluate func: %d\n", func);
4562306a36Sopenharmony_ci		return -ENOENT;
4662306a36Sopenharmony_ci	}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	ret = rtw89_acpi_dsm_get(rtwdev, obj, value);
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	ACPI_FREE(obj);
5162306a36Sopenharmony_ci	return ret;
5262306a36Sopenharmony_ci}
53