Lines Matching full:ab
11 static int ath12k_acpi_dsm_get_data(struct ath12k_base *ab, int func) in ath12k_acpi_dsm_get_data() argument
17 root_handle = ACPI_HANDLE(ab->dev); in ath12k_acpi_dsm_get_data()
19 ath12k_dbg(ab, ATH12K_DBG_BOOT, "invalid acpi handler\n"); in ath12k_acpi_dsm_get_data()
23 obj = acpi_evaluate_dsm(root_handle, ab->hw_params->acpi_guid, 0, func, in ath12k_acpi_dsm_get_data()
27 ath12k_dbg(ab, ATH12K_DBG_BOOT, "acpi_evaluate_dsm() failed\n"); in ath12k_acpi_dsm_get_data()
34 ab->acpi.func_bit = obj->integer.value; in ath12k_acpi_dsm_get_data()
37 ab->acpi.bit_flag = obj->integer.value; in ath12k_acpi_dsm_get_data()
47 ath12k_warn(ab, "invalid ACPI DSM BDF size: %d\n", in ath12k_acpi_dsm_get_data()
53 memcpy(ab->acpi.bdf_string, obj->string.pointer, in ath12k_acpi_dsm_get_data()
63 ath12k_warn(ab, "invalid ACPI DSM func size: %d\n", in ath12k_acpi_dsm_get_data()
69 ab->acpi.func_bit = 0; in ath12k_acpi_dsm_get_data()
71 ab->acpi.func_bit += obj->buffer.pointer[i] << (i * 8); in ath12k_acpi_dsm_get_data()
76 ath12k_warn(ab, "invalid ACPI DSM TAS config size: %d\n", in ath12k_acpi_dsm_get_data()
82 memcpy(&ab->acpi.tas_cfg, obj->buffer.pointer, in ath12k_acpi_dsm_get_data()
88 ath12k_warn(ab, "invalid ACPI DSM TAS data size: %d\n", in ath12k_acpi_dsm_get_data()
94 memcpy(&ab->acpi.tas_sar_power_table, obj->buffer.pointer, in ath12k_acpi_dsm_get_data()
100 ath12k_warn(ab, "invalid ACPI BIOS SAR data size: %d\n", in ath12k_acpi_dsm_get_data()
106 memcpy(&ab->acpi.bios_sar_data, obj->buffer.pointer, in ath12k_acpi_dsm_get_data()
112 ath12k_warn(ab, "invalid ACPI GEO OFFSET data size: %d\n", in ath12k_acpi_dsm_get_data()
118 memcpy(&ab->acpi.geo_offset_data, obj->buffer.pointer, in ath12k_acpi_dsm_get_data()
124 ath12k_warn(ab, "invalid ACPI DSM CCA data size: %d\n", in ath12k_acpi_dsm_get_data()
130 memcpy(&ab->acpi.cca_data, obj->buffer.pointer, in ath12k_acpi_dsm_get_data()
136 ath12k_warn(ab, "invalid ACPI DSM band edge data size: %d\n", in ath12k_acpi_dsm_get_data()
142 memcpy(&ab->acpi.band_edge_power, obj->buffer.pointer, in ath12k_acpi_dsm_get_data()
148 ath12k_warn(ab, "ACPI DSM method returned an unsupported object type: %d\n", in ath12k_acpi_dsm_get_data()
161 static int ath12k_acpi_set_power_limit(struct ath12k_base *ab) in ath12k_acpi_set_power_limit() argument
163 const u8 *tas_sar_power_table = ab->acpi.tas_sar_power_table; in ath12k_acpi_set_power_limit()
168 ath12k_warn(ab, "latest ACPI TAS data is invalid\n"); in ath12k_acpi_set_power_limit()
172 ret = ath12k_wmi_set_bios_cmd(ab, WMI_BIOS_PARAM_TAS_DATA_TYPE, in ath12k_acpi_set_power_limit()
176 ath12k_warn(ab, "failed to send ACPI TAS data table: %d\n", ret); in ath12k_acpi_set_power_limit()
183 static int ath12k_acpi_set_bios_sar_power(struct ath12k_base *ab) in ath12k_acpi_set_bios_sar_power() argument
187 if (ab->acpi.bios_sar_data[0] != ATH12K_ACPI_POWER_LIMIT_VERSION || in ath12k_acpi_set_bios_sar_power()
188 ab->acpi.bios_sar_data[1] != ATH12K_ACPI_POWER_LIMIT_ENABLE_FLAG) { in ath12k_acpi_set_bios_sar_power()
189 ath12k_warn(ab, "invalid latest ACPI BIOS SAR data\n"); in ath12k_acpi_set_bios_sar_power()
193 ret = ath12k_wmi_set_bios_sar_cmd(ab, ab->acpi.bios_sar_data); in ath12k_acpi_set_bios_sar_power()
195 ath12k_warn(ab, "failed to set ACPI BIOS SAR table: %d\n", ret); in ath12k_acpi_set_bios_sar_power()
205 struct ath12k_base *ab = data; in ath12k_acpi_dsm_notify() local
208 ath12k_warn(ab, "unknown acpi notify %u\n", event); in ath12k_acpi_dsm_notify()
212 if (!ab->acpi.acpi_tas_enable) { in ath12k_acpi_dsm_notify()
213 ath12k_dbg(ab, ATH12K_DBG_BOOT, "acpi_tas_enable is false\n"); in ath12k_acpi_dsm_notify()
217 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_DATA); in ath12k_acpi_dsm_notify()
219 ath12k_warn(ab, "failed to update ACPI TAS data table: %d\n", ret); in ath12k_acpi_dsm_notify()
223 ret = ath12k_acpi_set_power_limit(ab); in ath12k_acpi_dsm_notify()
225 ath12k_warn(ab, "failed to set ACPI TAS power limit data: %d", ret); in ath12k_acpi_dsm_notify()
229 if (!ab->acpi.acpi_bios_sar_enable) in ath12k_acpi_dsm_notify()
232 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_BIOS_SAR); in ath12k_acpi_dsm_notify()
234 ath12k_warn(ab, "failed to update BIOS SAR: %d\n", ret); in ath12k_acpi_dsm_notify()
238 ret = ath12k_acpi_set_bios_sar_power(ab); in ath12k_acpi_dsm_notify()
240 ath12k_warn(ab, "failed to set BIOS SAR power limit: %d\n", ret); in ath12k_acpi_dsm_notify()
245 static int ath12k_acpi_set_bios_sar_params(struct ath12k_base *ab) in ath12k_acpi_set_bios_sar_params() argument
249 ret = ath12k_wmi_set_bios_sar_cmd(ab, ab->acpi.bios_sar_data); in ath12k_acpi_set_bios_sar_params()
251 ath12k_warn(ab, "failed to set ACPI BIOS SAR table: %d\n", ret); in ath12k_acpi_set_bios_sar_params()
255 ret = ath12k_wmi_set_bios_geo_cmd(ab, ab->acpi.geo_offset_data); in ath12k_acpi_set_bios_sar_params()
257 ath12k_warn(ab, "failed to set ACPI BIOS GEO table: %d\n", ret); in ath12k_acpi_set_bios_sar_params()
264 static int ath12k_acpi_set_tas_params(struct ath12k_base *ab) in ath12k_acpi_set_tas_params() argument
268 ret = ath12k_wmi_set_bios_cmd(ab, WMI_BIOS_PARAM_TAS_CONFIG_TYPE, in ath12k_acpi_set_tas_params()
269 ab->acpi.tas_cfg, in ath12k_acpi_set_tas_params()
272 ath12k_warn(ab, "failed to send ACPI TAS config table parameter: %d\n", in ath12k_acpi_set_tas_params()
277 ret = ath12k_wmi_set_bios_cmd(ab, WMI_BIOS_PARAM_TAS_DATA_TYPE, in ath12k_acpi_set_tas_params()
278 ab->acpi.tas_sar_power_table, in ath12k_acpi_set_tas_params()
281 ath12k_warn(ab, "failed to send ACPI TAS data table parameter: %d\n", in ath12k_acpi_set_tas_params()
289 bool ath12k_acpi_get_disable_rfkill(struct ath12k_base *ab) in ath12k_acpi_get_disable_rfkill() argument
291 return ab->acpi.acpi_disable_rfkill; in ath12k_acpi_get_disable_rfkill()
294 bool ath12k_acpi_get_disable_11be(struct ath12k_base *ab) in ath12k_acpi_get_disable_11be() argument
296 return ab->acpi.acpi_disable_11be; in ath12k_acpi_get_disable_11be()
299 void ath12k_acpi_set_dsm_func(struct ath12k_base *ab) in ath12k_acpi_set_dsm_func() argument
304 if (!ab->hw_params->acpi_guid) in ath12k_acpi_set_dsm_func()
308 if (ab->acpi.acpi_tas_enable) { in ath12k_acpi_set_dsm_func()
309 ret = ath12k_acpi_set_tas_params(ab); in ath12k_acpi_set_dsm_func()
311 ath12k_warn(ab, "failed to send ACPI TAS parameters: %d\n", ret); in ath12k_acpi_set_dsm_func()
316 if (ab->acpi.acpi_bios_sar_enable) { in ath12k_acpi_set_dsm_func()
317 ret = ath12k_acpi_set_bios_sar_params(ab); in ath12k_acpi_set_dsm_func()
319 ath12k_warn(ab, "failed to send ACPI BIOS SAR: %d\n", ret); in ath12k_acpi_set_dsm_func()
324 if (ab->acpi.acpi_cca_enable) { in ath12k_acpi_set_dsm_func()
325 buf = ab->acpi.cca_data + ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET; in ath12k_acpi_set_dsm_func()
326 ret = ath12k_wmi_set_bios_cmd(ab, in ath12k_acpi_set_dsm_func()
331 ath12k_warn(ab, "failed to set ACPI DSM CCA threshold: %d\n", in ath12k_acpi_set_dsm_func()
337 if (ab->acpi.acpi_band_edge_enable) { in ath12k_acpi_set_dsm_func()
338 ret = ath12k_wmi_set_bios_cmd(ab, in ath12k_acpi_set_dsm_func()
340 ab->acpi.band_edge_power, in ath12k_acpi_set_dsm_func()
341 sizeof(ab->acpi.band_edge_power)); in ath12k_acpi_set_dsm_func()
343 ath12k_warn(ab, in ath12k_acpi_set_dsm_func()
351 int ath12k_acpi_start(struct ath12k_base *ab) in ath12k_acpi_start() argument
356 ab->acpi.acpi_tas_enable = false; in ath12k_acpi_start()
357 ab->acpi.acpi_disable_11be = false; in ath12k_acpi_start()
358 ab->acpi.acpi_disable_rfkill = false; in ath12k_acpi_start()
359 ab->acpi.acpi_bios_sar_enable = false; in ath12k_acpi_start()
360 ab->acpi.acpi_cca_enable = false; in ath12k_acpi_start()
361 ab->acpi.acpi_band_edge_enable = false; in ath12k_acpi_start()
362 ab->acpi.acpi_enable_bdf = false; in ath12k_acpi_start()
363 ab->acpi.bdf_string[0] = '\0'; in ath12k_acpi_start()
365 if (!ab->hw_params->acpi_guid) in ath12k_acpi_start()
369 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_SUPPORT_FUNCS); in ath12k_acpi_start()
371 ath12k_dbg(ab, ATH12K_DBG_BOOT, "failed to get ACPI DSM data: %d\n", ret); in ath12k_acpi_start()
375 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_DISABLE_FLAG)) { in ath12k_acpi_start()
376 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_DISABLE_FLAG); in ath12k_acpi_start()
378 ath12k_warn(ab, "failed to get ACPI DISABLE FLAG: %d\n", ret); in ath12k_acpi_start()
382 if (ATH12K_ACPI_CHEK_BIT_VALID(ab->acpi, in ath12k_acpi_start()
384 ab->acpi.acpi_disable_11be = true; in ath12k_acpi_start()
386 if (!ATH12K_ACPI_CHEK_BIT_VALID(ab->acpi, in ath12k_acpi_start()
388 ab->acpi.acpi_disable_rfkill = true; in ath12k_acpi_start()
391 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_BDF_EXT)) { in ath12k_acpi_start()
392 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_BDF_EXT); in ath12k_acpi_start()
393 if (ret || ab->acpi.bdf_string[0] == '\0') { in ath12k_acpi_start()
394 ath12k_warn(ab, "failed to get ACPI BDF EXT: %d\n", ret); in ath12k_acpi_start()
398 ab->acpi.acpi_enable_bdf = true; in ath12k_acpi_start()
401 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_TAS_CFG)) { in ath12k_acpi_start()
402 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_CFG); in ath12k_acpi_start()
404 ath12k_warn(ab, "failed to get ACPI TAS config table: %d\n", ret); in ath12k_acpi_start()
409 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_TAS_DATA)) { in ath12k_acpi_start()
410 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_TAS_DATA); in ath12k_acpi_start()
412 ath12k_warn(ab, "failed to get ACPI TAS data table: %d\n", ret); in ath12k_acpi_start()
416 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_TAS_CFG) && in ath12k_acpi_start()
417 ab->acpi.tas_sar_power_table[0] == ATH12K_ACPI_TAS_DATA_VERSION && in ath12k_acpi_start()
418 ab->acpi.tas_sar_power_table[1] == ATH12K_ACPI_TAS_DATA_ENABLE) in ath12k_acpi_start()
419 ab->acpi.acpi_tas_enable = true; in ath12k_acpi_start()
422 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_BIOS_SAR)) { in ath12k_acpi_start()
423 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_BIOS_SAR); in ath12k_acpi_start()
425 ath12k_warn(ab, "failed to get ACPI bios sar data: %d\n", ret); in ath12k_acpi_start()
430 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_GEO_OFFSET)) { in ath12k_acpi_start()
431 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_GEO_OFFSET); in ath12k_acpi_start()
433 ath12k_warn(ab, "failed to get ACPI geo offset data: %d\n", ret); in ath12k_acpi_start()
437 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_BIOS_SAR) && in ath12k_acpi_start()
438 ab->acpi.bios_sar_data[0] == ATH12K_ACPI_POWER_LIMIT_VERSION && in ath12k_acpi_start()
439 ab->acpi.bios_sar_data[1] == ATH12K_ACPI_POWER_LIMIT_ENABLE_FLAG && in ath12k_acpi_start()
440 !ab->acpi.acpi_tas_enable) in ath12k_acpi_start()
441 ab->acpi.acpi_bios_sar_enable = true; in ath12k_acpi_start()
444 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, ATH12K_ACPI_FUNC_BIT_CCA)) { in ath12k_acpi_start()
445 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_CCA); in ath12k_acpi_start()
447 ath12k_warn(ab, "failed to get ACPI DSM CCA threshold configuration: %d\n", in ath12k_acpi_start()
452 if (ab->acpi.cca_data[0] == ATH12K_ACPI_CCA_THR_VERSION && in ath12k_acpi_start()
453 ab->acpi.cca_data[ATH12K_ACPI_CCA_THR_OFFSET_DATA_OFFSET] == in ath12k_acpi_start()
455 ab->acpi.acpi_cca_enable = true; in ath12k_acpi_start()
458 if (ATH12K_ACPI_FUNC_BIT_VALID(ab->acpi, in ath12k_acpi_start()
460 ret = ath12k_acpi_dsm_get_data(ab, ATH12K_ACPI_DSM_FUNC_INDEX_BAND_EDGE); in ath12k_acpi_start()
462 ath12k_warn(ab, "failed to get ACPI DSM band edge channel power: %d\n", in ath12k_acpi_start()
467 if (ab->acpi.band_edge_power[0] == ATH12K_ACPI_BAND_EDGE_VERSION && in ath12k_acpi_start()
468 ab->acpi.band_edge_power[1] == ATH12K_ACPI_BAND_EDGE_ENABLE_FLAG) in ath12k_acpi_start()
469 ab->acpi.acpi_band_edge_enable = true; in ath12k_acpi_start()
472 status = acpi_install_notify_handler(ACPI_HANDLE(ab->dev), in ath12k_acpi_start()
474 ath12k_acpi_dsm_notify, ab); in ath12k_acpi_start()
476 ath12k_warn(ab, "failed to install DSM notify callback: %d\n", status); in ath12k_acpi_start()
480 ab->acpi.started = true; in ath12k_acpi_start()
485 int ath12k_acpi_check_bdf_variant_name(struct ath12k_base *ab) in ath12k_acpi_check_bdf_variant_name() argument
487 size_t max_len = sizeof(ab->qmi.target.bdf_ext); in ath12k_acpi_check_bdf_variant_name()
489 if (!ab->acpi.acpi_enable_bdf) in ath12k_acpi_check_bdf_variant_name()
492 if (strscpy(ab->qmi.target.bdf_ext, ab->acpi.bdf_string + 4, max_len) < 0) in ath12k_acpi_check_bdf_variant_name()
493 ath12k_dbg(ab, ATH12K_DBG_BOOT, in ath12k_acpi_check_bdf_variant_name()
495 ab->acpi.bdf_string); in ath12k_acpi_check_bdf_variant_name()
500 void ath12k_acpi_stop(struct ath12k_base *ab) in ath12k_acpi_stop() argument
502 if (!ab->acpi.started) in ath12k_acpi_stop()
505 acpi_remove_notify_handler(ACPI_HANDLE(ab->dev), in ath12k_acpi_stop()
509 memset(&ab->acpi, 0, sizeof(ab->acpi)); in ath12k_acpi_stop()