Lines Matching +full:entry +full:- +full:method

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
4 * Copyright (C) 2019-2024 Intel Corporation
7 #include "iwl-drv.h"
8 #include "iwl-debug.h"
33 static int iwl_acpi_get_handle(struct device *dev, acpi_string method, in iwl_acpi_get_handle() argument
43 return -ENOENT; in iwl_acpi_get_handle()
46 status = acpi_get_handle(root_handle, method, ret_handle); in iwl_acpi_get_handle()
49 "ACPI: %s method not found\n", method); in iwl_acpi_get_handle()
50 return -ENOENT; in iwl_acpi_get_handle()
55 static void *iwl_acpi_get_object(struct device *dev, acpi_string method) in iwl_acpi_get_object() argument
62 ret = iwl_acpi_get_handle(dev, method, &handle); in iwl_acpi_get_object()
64 return ERR_PTR(-ENOENT); in iwl_acpi_get_object()
66 /* Call the method with no arguments */ in iwl_acpi_get_object()
70 "ACPI: %s method invocation failed (status: 0x%x)\n", in iwl_acpi_get_object()
71 method, status); in iwl_acpi_get_object()
72 return ERR_PTR(-ENOENT); in iwl_acpi_get_object()
78 * Generic function for evaluating a method defined in the device specific
79 * method (DSM) interface. The returned acpi object must be freed by calling
92 "ACPI: DSM method invocation failed (rev: %d, func:%d)\n", in iwl_acpi_get_dsm_object()
94 return ERR_PTR(-ENOENT); in iwl_acpi_get_dsm_object()
118 return -ENOENT; in iwl_acpi_get_dsm_integer()
121 if (obj->type == ACPI_TYPE_INTEGER) { in iwl_acpi_get_dsm_integer()
122 *value = obj->integer.value; in iwl_acpi_get_dsm_integer()
123 } else if (obj->type == ACPI_TYPE_BUFFER) { in iwl_acpi_get_dsm_integer()
127 ret = -EINVAL; in iwl_acpi_get_dsm_integer()
132 if (obj->buffer.length != expected_size) in iwl_acpi_get_dsm_integer()
135 obj->buffer.length); in iwl_acpi_get_dsm_integer()
138 memcpy(&le_value, obj->buffer.pointer, in iwl_acpi_get_dsm_integer()
139 min_t(size_t, expected_size, (size_t)obj->buffer.length)); in iwl_acpi_get_dsm_integer()
143 "ACPI: DSM method did not return a valid object, type=%d\n", in iwl_acpi_get_dsm_integer()
144 obj->type); in iwl_acpi_get_dsm_integer()
145 ret = -EINVAL; in iwl_acpi_get_dsm_integer()
150 "ACPI: DSM method evaluated: func=%d, value=%lld\n", in iwl_acpi_get_dsm_integer()
160 * according to Intel BIOS spec, and fills in the value in a 32-bit field.
161 * In case the expected size is smaller than 32-bit, padding will be added.
173 return -EINVAL; in iwl_acpi_get_dsm()
177 /* Currently all ACPI DSMs are either 8-bit or 32-bit */ in iwl_acpi_get_dsm()
179 return -EOPNOTSUPP; in iwl_acpi_get_dsm()
181 ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV, func, in iwl_acpi_get_dsm()
206 * We need at least one entry in the wifi package that in iwl_acpi_get_wifi_pkg_range()
207 * describes the domain, and one more entry, otherwise there's in iwl_acpi_get_wifi_pkg_range()
211 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
219 if (data->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
220 data->package.count < 2 || in iwl_acpi_get_wifi_pkg_range()
221 data->package.elements[0].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_wifi_pkg_range()
223 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
226 *tbl_rev = data->package.elements[0].integer.value; in iwl_acpi_get_wifi_pkg_range()
229 for (i = 1; i < data->package.count; i++) { in iwl_acpi_get_wifi_pkg_range()
232 wifi_pkg = &data->package.elements[i]; in iwl_acpi_get_wifi_pkg_range()
235 if (wifi_pkg->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
236 wifi_pkg->package.count < min_data_size || in iwl_acpi_get_wifi_pkg_range()
237 wifi_pkg->package.count > max_data_size) in iwl_acpi_get_wifi_pkg_range()
240 domain = &wifi_pkg->package.elements[0]; in iwl_acpi_get_wifi_pkg_range()
241 if (domain->type == ACPI_TYPE_INTEGER && in iwl_acpi_get_wifi_pkg_range()
242 domain->integer.value == ACPI_WIFI_DOMAIN) in iwl_acpi_get_wifi_pkg_range()
246 return ERR_PTR(-ENOENT); in iwl_acpi_get_wifi_pkg_range()
268 data = iwl_acpi_get_object(fwrt->dev, ACPI_WTAS_METHOD); in iwl_acpi_get_tas_table()
273 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_tas_table()
282 wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_tas_table()
283 ret = -EINVAL; in iwl_acpi_get_tas_table()
287 tas_selection = (u32)wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_tas_table()
292 tas_data->table_source = BIOS_SOURCE_ACPI; in iwl_acpi_get_tas_table()
293 tas_data->table_revision = tbl_rev; in iwl_acpi_get_tas_table()
294 tas_data->tas_selection = tas_selection; in iwl_acpi_get_tas_table()
300 if (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_tas_table()
301 wifi_pkg->package.elements[2].integer.value > in iwl_acpi_get_tas_table()
304 wifi_pkg->package.elements[2].integer.value); in iwl_acpi_get_tas_table()
305 ret = -EINVAL; in iwl_acpi_get_tas_table()
309 block_list_size = wifi_pkg->package.elements[2].integer.value; in iwl_acpi_get_tas_table()
310 tas_data->block_list_size = block_list_size; in iwl_acpi_get_tas_table()
317 if (wifi_pkg->package.elements[3 + i].type != in iwl_acpi_get_tas_table()
321 ret = -EINVAL; in iwl_acpi_get_tas_table()
325 country = wifi_pkg->package.elements[3 + i].integer.value; in iwl_acpi_get_tas_table()
326 tas_data->block_list_array[i] = country; in iwl_acpi_get_tas_table()
342 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDD_METHOD); in iwl_acpi_get_mcc()
346 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_mcc()
354 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_mcc()
356 ret = -EINVAL; in iwl_acpi_get_mcc()
360 mcc_val = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_mcc()
362 ret = -EINVAL; in iwl_acpi_get_mcc()
380 int tbl_rev, ret = -EINVAL; in iwl_acpi_get_pwr_limit()
383 data = iwl_acpi_get_object(fwrt->dev, ACPI_SPLC_METHOD); in iwl_acpi_get_pwr_limit()
387 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_pwr_limit()
390 wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) in iwl_acpi_get_pwr_limit()
393 *dflt_pwr_limit = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_pwr_limit()
406 data = iwl_acpi_get_object(fwrt->dev, ACPI_ECKV_METHOD); in iwl_acpi_get_eckv()
410 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_eckv()
418 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_eckv()
420 ret = -EINVAL; in iwl_acpi_get_eckv()
424 *extl_clk = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_eckv()
444 } else if (table->type != ACPI_TYPE_INTEGER || in iwl_acpi_parse_chains_table()
445 table->integer.value > U8_MAX) { in iwl_acpi_parse_chains_table()
446 return -EINVAL; in iwl_acpi_parse_chains_table()
449 table->integer.value; in iwl_acpi_parse_chains_table()
465 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD); in iwl_acpi_get_wrds_table()
470 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wrds_table()
475 ret = -EINVAL; in iwl_acpi_get_wrds_table()
486 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wrds_table()
491 ret = -EINVAL; in iwl_acpi_get_wrds_table()
502 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wrds_table()
507 ret = -EINVAL; in iwl_acpi_get_wrds_table()
521 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_wrds_table()
522 ret = -EINVAL; in iwl_acpi_get_wrds_table()
528 flags = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_wrds_table()
529 fwrt->reduced_power_flags = flags >> IWL_REDUCE_POWER_FLAGS_POS; in iwl_acpi_get_wrds_table()
532 table = &wifi_pkg->package.elements[2]; in iwl_acpi_get_wrds_table()
537 ret = iwl_acpi_parse_chains_table(table, fwrt->sar_profiles[0].chains, in iwl_acpi_get_wrds_table()
540 fwrt->sar_profiles[0].enabled = true; in iwl_acpi_get_wrds_table()
555 data = iwl_acpi_get_object(fwrt->dev, ACPI_EWRD_METHOD); in iwl_acpi_get_ewrd_table()
560 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ewrd_table()
565 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
575 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ewrd_table()
580 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
590 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ewrd_table()
595 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
608 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_ewrd_table()
609 wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ewrd_table()
610 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
614 enabled = !!(wifi_pkg->package.elements[1].integer.value); in iwl_acpi_get_ewrd_table()
615 n_profiles = wifi_pkg->package.elements[2].integer.value; in iwl_acpi_get_ewrd_table()
620 * ACPI_SAR_PROFILES_NUM - 1. in iwl_acpi_get_ewrd_table()
623 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
633 /* parse non-cdb chains for all profiles */ in iwl_acpi_get_ewrd_table()
635 union acpi_object *table = &wifi_pkg->package.elements[pos]; in iwl_acpi_get_ewrd_table()
638 * save them in sar_profiles[1-3] (because we don't in iwl_acpi_get_ewrd_table()
642 fwrt->sar_profiles[i + 1].chains, in iwl_acpi_get_ewrd_table()
652 /* non-cdb table revisions */ in iwl_acpi_get_ewrd_table()
661 table = &wifi_pkg->package.elements[pos]; in iwl_acpi_get_ewrd_table()
662 chains = &fwrt->sar_profiles[i + 1].chains[ACPI_SAR_NUM_CHAINS_REV0]; in iwl_acpi_get_ewrd_table()
676 fwrt->sar_profiles[i + 1].enabled = enabled; in iwl_acpi_get_ewrd_table()
718 data = iwl_acpi_get_object(fwrt->dev, ACPI_WGDS_METHOD); in iwl_acpi_get_wgds_table()
737 wifi_pkg = iwl_acpi_get_wifi_pkg_range(fwrt->dev, data, in iwl_acpi_get_wgds_table()
749 union acpi_object *entry; in iwl_acpi_get_wgds_table() local
751 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_acpi_get_wgds_table()
753 if (entry->type != ACPI_TYPE_INTEGER || in iwl_acpi_get_wgds_table()
754 entry->integer.value > num_profiles || in iwl_acpi_get_wgds_table()
755 entry->integer.value < in iwl_acpi_get_wgds_table()
757 ret = -EINVAL; in iwl_acpi_get_wgds_table()
765 if (wifi_pkg->package.count != in iwl_acpi_get_wgds_table()
767 ret = -EINVAL; in iwl_acpi_get_wgds_table()
772 num_profiles = entry->integer.value; in iwl_acpi_get_wgds_table()
781 ret = -ENOENT; in iwl_acpi_get_wgds_table()
785 fwrt->geo_rev = tbl_rev; in iwl_acpi_get_wgds_table()
788 union acpi_object *entry; in iwl_acpi_get_wgds_table() local
796 fwrt->geo_profiles[i].bands[j].max = in iwl_acpi_get_wgds_table()
797 fwrt->geo_profiles[i].bands[1].max; in iwl_acpi_get_wgds_table()
799 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_acpi_get_wgds_table()
801 if (entry->type != ACPI_TYPE_INTEGER || in iwl_acpi_get_wgds_table()
802 entry->integer.value > U8_MAX) { in iwl_acpi_get_wgds_table()
803 ret = -EINVAL; in iwl_acpi_get_wgds_table()
807 fwrt->geo_profiles[i].bands[j].max = in iwl_acpi_get_wgds_table()
808 entry->integer.value; in iwl_acpi_get_wgds_table()
814 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_acpi_get_wgds_table()
815 fwrt->geo_profiles[i].bands[1].chains[k]; in iwl_acpi_get_wgds_table()
817 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_acpi_get_wgds_table()
819 if (entry->type != ACPI_TYPE_INTEGER || in iwl_acpi_get_wgds_table()
820 entry->integer.value > U8_MAX) { in iwl_acpi_get_wgds_table()
821 ret = -EINVAL; in iwl_acpi_get_wgds_table()
825 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_acpi_get_wgds_table()
826 entry->integer.value; in iwl_acpi_get_wgds_table()
832 fwrt->geo_num_profiles = num_profiles; in iwl_acpi_get_wgds_table()
833 fwrt->geo_enabled = true; in iwl_acpi_get_wgds_table()
846 data = iwl_acpi_get_object(fwrt->dev, ACPI_PPAG_METHOD); in iwl_acpi_get_ppag_table()
851 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
862 ret = -EINVAL; in iwl_acpi_get_ppag_table()
868 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
873 ret = -EINVAL; in iwl_acpi_get_ppag_table()
885 fwrt->ppag_ver = tbl_rev; in iwl_acpi_get_ppag_table()
886 flags = &wifi_pkg->package.elements[1]; in iwl_acpi_get_ppag_table()
888 if (flags->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
889 ret = -EINVAL; in iwl_acpi_get_ppag_table()
893 fwrt->ppag_flags = iwl_bios_get_ppag_flags(flags->integer.value, in iwl_acpi_get_ppag_table()
894 fwrt->ppag_ver); in iwl_acpi_get_ppag_table()
898 * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the in iwl_acpi_get_ppag_table()
899 * following sub-bands to High-Band (5GHz). in iwl_acpi_get_ppag_table()
905 ent = &wifi_pkg->package.elements[idx++]; in iwl_acpi_get_ppag_table()
906 if (ent->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
907 ret = -EINVAL; in iwl_acpi_get_ppag_table()
911 fwrt->ppag_chains[i].subbands[j] = ent->integer.value; in iwl_acpi_get_ppag_table()
929 data = iwl_acpi_get_object(fwrt->dev, ACPI_WPFC_METHOD); in iwl_acpi_get_phy_filters()
933 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_phy_filters()
942 BUILD_BUG_ON(ARRAY_SIZE(filters->filter_cfg_chains) != in iwl_acpi_get_phy_filters()
943 ACPI_WPFC_WIFI_DATA_SIZE - 1); in iwl_acpi_get_phy_filters()
945 for (i = 0; i < ARRAY_SIZE(filters->filter_cfg_chains); i++) { in iwl_acpi_get_phy_filters()
946 if (wifi_pkg->package.elements[i + 1].type != ACPI_TYPE_INTEGER) in iwl_acpi_get_phy_filters()
949 cpu_to_le32(wifi_pkg->package.elements[i + 1].integer.value); in iwl_acpi_get_phy_filters()
964 data = iwl_acpi_get_object(fwrt->dev, ACPI_GLAI_METHOD); in iwl_acpi_get_guid_lock_status()
968 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_guid_lock_status()
979 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_guid_lock_status()
980 wifi_pkg->package.elements[1].integer.value > ACPI_GLAI_MAX_STATUS) in iwl_acpi_get_guid_lock_status()
983 fwrt->uefi_tables_lock_status = in iwl_acpi_get_guid_lock_status()
984 wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_guid_lock_status()
988 fwrt->uefi_tables_lock_status); in iwl_acpi_get_guid_lock_status()
997 int ret = -ENOENT; in iwl_acpi_get_wbem()
1000 data = iwl_acpi_get_object(fwrt->dev, ACPI_WBEM_METHOD); in iwl_acpi_get_wbem()
1004 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wbem()
1016 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) in iwl_acpi_get_wbem()
1019 *value = wifi_pkg->package.elements[1].integer.value & in iwl_acpi_get_wbem()
1031 int ret = -ENOENT; in iwl_acpi_get_dsbr()
1034 data = iwl_acpi_get_object(fwrt->dev, ACPI_DSBR_METHOD); in iwl_acpi_get_dsbr()
1038 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_dsbr()
1050 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) in iwl_acpi_get_dsbr()
1053 *value = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_dsbr()