// SPDX-License-Identifier: BSD-3-Clause-Clear /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. * Copyright (c) 2021-2025 Qualcomm Innovation Center, Inc. All rights reserved.
*/
break; case ATH12K_ACPI_DSM_FUNC_TAS_DATA: if (obj->buffer.length != ATH12K_ACPI_DSM_TAS_DATA_SIZE) {
ath12k_warn(ab, "invalid ACPI DSM TAS data size: %d\n",
obj->buffer.length);
ret = -EINVAL; goto out;
}
break; case ATH12K_ACPI_DSM_FUNC_BIOS_SAR: if (obj->buffer.length != ATH12K_ACPI_DSM_BIOS_SAR_DATA_SIZE) {
ath12k_warn(ab, "invalid ACPI BIOS SAR data size: %d\n",
obj->buffer.length);
ret = -EINVAL; goto out;
}
break; case ATH12K_ACPI_DSM_FUNC_INDEX_CCA: if (obj->buffer.length != ATH12K_ACPI_DSM_CCA_DATA_SIZE) {
ath12k_warn(ab, "invalid ACPI DSM CCA data size: %d\n",
obj->buffer.length);
ret = -EINVAL; goto out;
}
break; case ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE: if (obj->buffer.length != ATH12K_ACPI_DSM_BAND_EDGE_DATA_SIZE) {
ath12k_warn(ab, "invalid ACPI DSM band edge data size: %d\n",
obj->buffer.length);
ret = -EINVAL; goto out;
}
if (tas_sar_power_table[0] != ATH12K_ACPI_TAS_DATA_VERSION ||
tas_sar_power_table[1] != ATH12K_ACPI_TAS_DATA_ENABLE) {
ath12k_warn(ab, "latest ACPI TAS data is invalid\n"); return -EINVAL;
}
ret = ath12k_wmi_set_bios_cmd(ab, WMI_BIOS_PARAM_TAS_DATA_TYPE,
tas_sar_power_table,
ATH12K_ACPI_DSM_TAS_DATA_SIZE); if (ret) {
ath12k_warn(ab, "failed to send ACPI TAS data table: %d\n", ret); return ret;
}
return ret;
}
staticint ath12k_acpi_set_bios_sar_power(struct ath12k_base *ab)
{ int ret;
if (ab->acpi.bios_sar_data[0] != ATH12K_ACPI_POWER_LIMIT_VERSION ||
ab->acpi.bios_sar_data[1] != ATH12K_ACPI_POWER_LIMIT_ENABLE_FLAG) {
ath12k_warn(ab, "invalid latest ACPI BIOS SAR data\n"); return -EINVAL;
}
ret = ath12k_wmi_set_bios_sar_cmd(ab, ab->acpi.bios_sar_data); if (ret) {
ath12k_warn(ab, "failed to set ACPI BIOS SAR table: %d\n", ret); return ret;
}
if (!ab->acpi.acpi_tas_enable) {
ath12k_dbg(ab, ATH12K_DBG_BOOT, "acpi_tas_enable is false\n"); return;
}
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_DATA); if (ret) {
ath12k_warn(ab, "failed to update ACPI TAS data table: %d\n", ret); return;
}
ret = ath12k_acpi_set_power_limit(ab); if (ret) {
ath12k_warn(ab, "failed to set ACPI TAS power limit data: %d", ret); return;
}
if (!ab->acpi.acpi_bios_sar_enable) return;
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_BIOS_SAR); if (ret) {
ath12k_warn(ab, "failed to update BIOS SAR: %d\n", ret); return;
}
ret = ath12k_acpi_set_bios_sar_power(ab); if (ret) {
ath12k_warn(ab, "failed to set BIOS SAR power limit: %d\n", ret); return;
}
}
staticint ath12k_acpi_set_bios_sar_params(struct ath12k_base *ab)
{ int ret;
ret = ath12k_wmi_set_bios_sar_cmd(ab, ab->acpi.bios_sar_data); if (ret) {
ath12k_warn(ab, "failed to set ACPI BIOS SAR table: %d\n", ret); return ret;
}
ret = ath12k_wmi_set_bios_geo_cmd(ab, ab->acpi.geo_offset_data); if (ret) {
ath12k_warn(ab, "failed to set ACPI BIOS GEO table: %d\n", ret); return ret;
}
return 0;
}
staticint ath12k_acpi_set_tas_params(struct ath12k_base *ab)
{ int ret;
ret = ath12k_wmi_set_bios_cmd(ab, WMI_BIOS_PARAM_TAS_CONFIG_TYPE,
ab->acpi.tas_cfg,
ATH12K_ACPI_DSM_TAS_CFG_SIZE); if (ret) {
ath12k_warn(ab, "failed to send ACPI TAS config table parameter: %d\n",
ret); return ret;
}
ret = ath12k_wmi_set_bios_cmd(ab, WMI_BIOS_PARAM_TAS_DATA_TYPE,
ab->acpi.tas_sar_power_table,
ATH12K_ACPI_DSM_TAS_DATA_SIZE); if (ret) {
ath12k_warn(ab, "failed to send ACPI TAS data table parameter: %d\n",
ret); return ret;
}
void ath12k_acpi_set_dsm_func(struct ath12k_base *ab)
{ int ret;
u8 *buf;
if (!ab->hw_params->acpi_guid) /* not supported with this hardware */ return;
if (ab->acpi.acpi_tas_enable) {
ret = ath12k_acpi_set_tas_params(ab); if (ret) {
ath12k_warn(ab, "failed to send ACPI TAS parameters: %d\n", ret); return;
}
}
if (ab->acpi.acpi_bios_sar_enable) {
ret = ath12k_acpi_set_bios_sar_params(ab); if (ret) {
ath12k_warn(ab, "failed to send ACPI BIOS SAR: %d\n", ret); return;
}
}
if (ab->acpi.acpi_cca_enable) {
buf = ab->acpi.cca_data + ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET;
ret = ath12k_wmi_set_bios_cmd(ab,
WMI_BIOS_PARAM_CCA_THRESHOLD_TYPE,
buf,
ATH12K_ACPI_CCA_THR_OFFSET_LEN); if (ret) {
ath12k_warn(ab, "failed to set ACPI DSM CCA threshold: %d\n",
ret); return;
}
}
if (ab->acpi.acpi_band_edge_enable) {
ret = ath12k_wmi_set_bios_cmd(ab,
WMI_BIOS_PARAM_TYPE_BANDEDGE,
ab->acpi.band_edge_power, sizeof(ab->acpi.band_edge_power)); if (ret) {
ath12k_warn(ab, "failed to set ACPI DSM band edge channel power: %d\n",
ret); return;
}
}
}
int ath12k_acpi_start(struct ath12k_base *ab)
{
acpi_status status; int ret;
if (!ab->hw_params->acpi_guid) /* not supported with this hardware */ return 0;
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS); if (ret) {
ath12k_dbg(ab, ATH12K_DBG_BOOT, "failed to get ACPI DSM data: %d\n", ret); return ret;
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_DISABLE_FLAG)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_DISABLE_FLAG); if (ret) {
ath12k_warn(ab, "failed to get ACPI DISABLE FLAG: %d\n", ret); return ret;
}
if (ATH12K_ACPI_CHEK_BIT_VALID(ab->acpi,
ATH12K_ACPI_DSM_DISABLE_11BE_BIT))
ab->acpi.acpi_disable_11be = true;
if (!ATH12K_ACPI_CHEK_BIT_VALID(ab->acpi,
ATH12K_ACPI_DSM_DISABLE_RFKILL_BIT))
ab->acpi.acpi_disable_rfkill = true;
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_BDF_EXT)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_BDF_EXT); if (ret || ab->acpi.bdf_string[0] == '\0') {
ath12k_warn(ab, "failed to get ACPI BDF EXT: %d\n", ret); return ret;
}
ab->acpi.acpi_enable_bdf = true;
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_TAS_CFG)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_CFG); if (ret) {
ath12k_warn(ab, "failed to get ACPI TAS config table: %d\n", ret); return ret;
}
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_TAS_DATA)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_DATA); if (ret) {
ath12k_warn(ab, "failed to get ACPI TAS data table: %d\n", ret); return ret;
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_BIOS_SAR)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_BIOS_SAR); if (ret) {
ath12k_warn(ab, "failed to get ACPI bios sar data: %d\n", ret); return ret;
}
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_GEO_OFFSET)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_GEO_OFFSET); if (ret) {
ath12k_warn(ab, "failed to get ACPI geo offset data: %d\n", ret); return ret;
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_CCA)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_CCA); if (ret) {
ath12k_warn(ab, "failed to get ACPI DSM CCA threshold configuration: %d\n",
ret); return ret;
}
if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi,
ATH12K_ACPI_FUNC_BIT_BAND_EDGE_CHAN_POWER)) {
ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE); if (ret) {
ath12k_warn(ab, "failed to get ACPI DSM band edge channel power: %d\n",
ret); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.