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

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
4 * Copyright (C) 2019-2025 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 if (!fwrt->acpi_dsm_funcs_valid) { in iwl_acpi_get_dsm()
182 ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV, in iwl_acpi_get_dsm()
187 /* always indicate BIT(0) to avoid re-reading */ in iwl_acpi_get_dsm()
188 fwrt->acpi_dsm_funcs_valid = BIT(0); in iwl_acpi_get_dsm()
194 /* always indicate BIT(0) to avoid re-reading */ in iwl_acpi_get_dsm()
195 fwrt->acpi_dsm_funcs_valid = tmp | BIT(0); in iwl_acpi_get_dsm()
198 if (!(fwrt->acpi_dsm_funcs_valid & BIT(func))) { in iwl_acpi_get_dsm()
201 return -ENODATA; in iwl_acpi_get_dsm()
204 ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV, func, in iwl_acpi_get_dsm()
229 * We need at least one entry in the wifi package that in iwl_acpi_get_wifi_pkg_range()
230 * describes the domain, and one more entry, otherwise there's in iwl_acpi_get_wifi_pkg_range()
234 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
242 if (data->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
243 data->package.count < 2 || in iwl_acpi_get_wifi_pkg_range()
244 data->package.elements[0].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_wifi_pkg_range()
246 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
249 *tbl_rev = data->package.elements[0].integer.value; in iwl_acpi_get_wifi_pkg_range()
252 for (i = 1; i < data->package.count; i++) { in iwl_acpi_get_wifi_pkg_range()
255 wifi_pkg = &data->package.elements[i]; in iwl_acpi_get_wifi_pkg_range()
258 if (wifi_pkg->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
259 wifi_pkg->package.count < min_data_size || in iwl_acpi_get_wifi_pkg_range()
260 wifi_pkg->package.count > max_data_size) in iwl_acpi_get_wifi_pkg_range()
263 domain = &wifi_pkg->package.elements[0]; in iwl_acpi_get_wifi_pkg_range()
264 if (domain->type == ACPI_TYPE_INTEGER && in iwl_acpi_get_wifi_pkg_range()
265 domain->integer.value == ACPI_WIFI_DOMAIN) in iwl_acpi_get_wifi_pkg_range()
269 return ERR_PTR(-ENOENT); in iwl_acpi_get_wifi_pkg_range()
291 data = iwl_acpi_get_object(fwrt->dev, ACPI_WTAS_METHOD); in iwl_acpi_get_tas_table()
296 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_tas_table()
305 wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_tas_table()
306 ret = -EINVAL; in iwl_acpi_get_tas_table()
310 tas_selection = (u32)wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_tas_table()
315 tas_data->table_source = BIOS_SOURCE_ACPI; in iwl_acpi_get_tas_table()
316 tas_data->table_revision = tbl_rev; in iwl_acpi_get_tas_table()
317 tas_data->tas_selection = tas_selection; in iwl_acpi_get_tas_table()
323 if (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_tas_table()
324 wifi_pkg->package.elements[2].integer.value > in iwl_acpi_get_tas_table()
327 wifi_pkg->package.elements[2].integer.value); in iwl_acpi_get_tas_table()
328 ret = -EINVAL; in iwl_acpi_get_tas_table()
332 block_list_size = wifi_pkg->package.elements[2].integer.value; in iwl_acpi_get_tas_table()
333 tas_data->block_list_size = block_list_size; in iwl_acpi_get_tas_table()
340 if (wifi_pkg->package.elements[3 + i].type != in iwl_acpi_get_tas_table()
344 ret = -EINVAL; in iwl_acpi_get_tas_table()
348 country = wifi_pkg->package.elements[3 + i].integer.value; in iwl_acpi_get_tas_table()
349 tas_data->block_list_array[i] = country; in iwl_acpi_get_tas_table()
365 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDD_METHOD); in iwl_acpi_get_mcc()
369 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_mcc()
377 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_mcc()
379 ret = -EINVAL; in iwl_acpi_get_mcc()
383 mcc_val = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_mcc()
385 ret = -EINVAL; in iwl_acpi_get_mcc()
403 int tbl_rev, ret = -EINVAL; in iwl_acpi_get_pwr_limit()
406 data = iwl_acpi_get_object(fwrt->dev, ACPI_SPLC_METHOD); in iwl_acpi_get_pwr_limit()
410 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_pwr_limit()
413 wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) in iwl_acpi_get_pwr_limit()
416 *dflt_pwr_limit = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_pwr_limit()
429 data = iwl_acpi_get_object(fwrt->dev, ACPI_ECKV_METHOD); in iwl_acpi_get_eckv()
433 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_eckv()
441 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_eckv()
443 ret = -EINVAL; in iwl_acpi_get_eckv()
447 *extl_clk = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_eckv()
467 } else if (table->type != ACPI_TYPE_INTEGER || in iwl_acpi_parse_chains_table()
468 table->integer.value > U8_MAX) { in iwl_acpi_parse_chains_table()
469 return -EINVAL; in iwl_acpi_parse_chains_table()
472 table->integer.value; in iwl_acpi_parse_chains_table()
488 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD); in iwl_acpi_get_wrds_table()
493 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wrds_table()
498 ret = -EINVAL; in iwl_acpi_get_wrds_table()
509 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wrds_table()
514 ret = -EINVAL; in iwl_acpi_get_wrds_table()
525 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wrds_table()
530 ret = -EINVAL; in iwl_acpi_get_wrds_table()
544 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_wrds_table()
545 ret = -EINVAL; in iwl_acpi_get_wrds_table()
551 flags = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_wrds_table()
552 fwrt->reduced_power_flags = flags >> IWL_REDUCE_POWER_FLAGS_POS; in iwl_acpi_get_wrds_table()
555 table = &wifi_pkg->package.elements[2]; in iwl_acpi_get_wrds_table()
560 ret = iwl_acpi_parse_chains_table(table, fwrt->sar_profiles[0].chains, in iwl_acpi_get_wrds_table()
563 fwrt->sar_profiles[0].enabled = true; in iwl_acpi_get_wrds_table()
578 data = iwl_acpi_get_object(fwrt->dev, ACPI_EWRD_METHOD); in iwl_acpi_get_ewrd_table()
583 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ewrd_table()
588 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
598 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ewrd_table()
603 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
613 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ewrd_table()
618 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
631 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_ewrd_table()
632 wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ewrd_table()
633 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
637 enabled = !!(wifi_pkg->package.elements[1].integer.value); in iwl_acpi_get_ewrd_table()
638 n_profiles = wifi_pkg->package.elements[2].integer.value; in iwl_acpi_get_ewrd_table()
643 * ACPI_SAR_PROFILES_NUM - 1. in iwl_acpi_get_ewrd_table()
646 ret = -EINVAL; in iwl_acpi_get_ewrd_table()
656 /* parse non-cdb chains for all profiles */ in iwl_acpi_get_ewrd_table()
658 union acpi_object *table = &wifi_pkg->package.elements[pos]; in iwl_acpi_get_ewrd_table()
661 * save them in sar_profiles[1-3] (because we don't in iwl_acpi_get_ewrd_table()
665 fwrt->sar_profiles[i + 1].chains, in iwl_acpi_get_ewrd_table()
675 /* non-cdb table revisions */ in iwl_acpi_get_ewrd_table()
684 table = &wifi_pkg->package.elements[pos]; in iwl_acpi_get_ewrd_table()
685 chains = &fwrt->sar_profiles[i + 1].chains[ACPI_SAR_NUM_CHAINS_REV0]; in iwl_acpi_get_ewrd_table()
699 fwrt->sar_profiles[i + 1].enabled = enabled; in iwl_acpi_get_ewrd_table()
741 data = iwl_acpi_get_object(fwrt->dev, ACPI_WGDS_METHOD); in iwl_acpi_get_wgds_table()
760 wifi_pkg = iwl_acpi_get_wifi_pkg_range(fwrt->dev, data, in iwl_acpi_get_wgds_table()
772 union acpi_object *entry; in iwl_acpi_get_wgds_table() local
774 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_acpi_get_wgds_table()
776 if (entry->type != ACPI_TYPE_INTEGER || in iwl_acpi_get_wgds_table()
777 entry->integer.value > num_profiles || in iwl_acpi_get_wgds_table()
778 entry->integer.value < in iwl_acpi_get_wgds_table()
780 ret = -EINVAL; in iwl_acpi_get_wgds_table()
788 if (wifi_pkg->package.count != in iwl_acpi_get_wgds_table()
790 ret = -EINVAL; in iwl_acpi_get_wgds_table()
795 num_profiles = entry->integer.value; in iwl_acpi_get_wgds_table()
804 ret = -ENOENT; in iwl_acpi_get_wgds_table()
808 fwrt->geo_rev = tbl_rev; in iwl_acpi_get_wgds_table()
811 union acpi_object *entry; in iwl_acpi_get_wgds_table() local
819 fwrt->geo_profiles[i].bands[j].max = in iwl_acpi_get_wgds_table()
820 fwrt->geo_profiles[i].bands[1].max; in iwl_acpi_get_wgds_table()
822 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_acpi_get_wgds_table()
824 if (entry->type != ACPI_TYPE_INTEGER || in iwl_acpi_get_wgds_table()
825 entry->integer.value > U8_MAX) { in iwl_acpi_get_wgds_table()
826 ret = -EINVAL; in iwl_acpi_get_wgds_table()
830 fwrt->geo_profiles[i].bands[j].max = in iwl_acpi_get_wgds_table()
831 entry->integer.value; in iwl_acpi_get_wgds_table()
837 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_acpi_get_wgds_table()
838 fwrt->geo_profiles[i].bands[1].chains[k]; in iwl_acpi_get_wgds_table()
840 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_acpi_get_wgds_table()
842 if (entry->type != ACPI_TYPE_INTEGER || in iwl_acpi_get_wgds_table()
843 entry->integer.value > U8_MAX) { in iwl_acpi_get_wgds_table()
844 ret = -EINVAL; in iwl_acpi_get_wgds_table()
848 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_acpi_get_wgds_table()
849 entry->integer.value; in iwl_acpi_get_wgds_table()
855 fwrt->geo_num_profiles = num_profiles; in iwl_acpi_get_wgds_table()
856 fwrt->geo_enabled = true; in iwl_acpi_get_wgds_table()
869 data = iwl_acpi_get_object(fwrt->dev, ACPI_PPAG_METHOD); in iwl_acpi_get_ppag_table()
874 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
885 ret = -EINVAL; in iwl_acpi_get_ppag_table()
891 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
896 ret = -EINVAL; in iwl_acpi_get_ppag_table()
908 fwrt->ppag_bios_rev = tbl_rev; in iwl_acpi_get_ppag_table()
909 flags = &wifi_pkg->package.elements[1]; in iwl_acpi_get_ppag_table()
911 if (flags->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
912 ret = -EINVAL; in iwl_acpi_get_ppag_table()
916 fwrt->ppag_flags = iwl_bios_get_ppag_flags(flags->integer.value, in iwl_acpi_get_ppag_table()
917 fwrt->ppag_bios_rev); in iwl_acpi_get_ppag_table()
921 * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the in iwl_acpi_get_ppag_table()
922 * following sub-bands to High-Band (5GHz). in iwl_acpi_get_ppag_table()
928 ent = &wifi_pkg->package.elements[idx++]; in iwl_acpi_get_ppag_table()
929 if (ent->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
930 ret = -EINVAL; in iwl_acpi_get_ppag_table()
934 fwrt->ppag_chains[i].subbands[j] = ent->integer.value; in iwl_acpi_get_ppag_table()
938 fwrt->ppag_bios_source = BIOS_SOURCE_ACPI; in iwl_acpi_get_ppag_table()
948 struct iwl_phy_specific_cfg *filters = &fwrt->phy_filters; in iwl_acpi_get_phy_filters()
953 data = iwl_acpi_get_object(fwrt->dev, ACPI_WPFC_METHOD); in iwl_acpi_get_phy_filters()
957 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_phy_filters()
964 return -EINVAL; in iwl_acpi_get_phy_filters()
966 BUILD_BUG_ON(ARRAY_SIZE(filters->filter_cfg_chains) != in iwl_acpi_get_phy_filters()
967 ACPI_WPFC_WIFI_DATA_SIZE - 1); in iwl_acpi_get_phy_filters()
969 for (i = 0; i < ARRAY_SIZE(filters->filter_cfg_chains); i++) { in iwl_acpi_get_phy_filters()
970 if (wifi_pkg->package.elements[i + 1].type != ACPI_TYPE_INTEGER) in iwl_acpi_get_phy_filters()
971 return -EINVAL; in iwl_acpi_get_phy_filters()
973 cpu_to_le32(wifi_pkg->package.elements[i + 1].integer.value); in iwl_acpi_get_phy_filters()
987 data = iwl_acpi_get_object(fwrt->dev, ACPI_GLAI_METHOD); in iwl_acpi_get_guid_lock_status()
991 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_guid_lock_status()
1002 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_guid_lock_status()
1003 wifi_pkg->package.elements[1].integer.value > ACPI_GLAI_MAX_STATUS) in iwl_acpi_get_guid_lock_status()
1006 fwrt->uefi_tables_lock_status = in iwl_acpi_get_guid_lock_status()
1007 wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_guid_lock_status()
1011 fwrt->uefi_tables_lock_status); in iwl_acpi_get_guid_lock_status()
1020 int ret = -ENOENT; in iwl_acpi_get_wbem()
1023 data = iwl_acpi_get_object(fwrt->dev, ACPI_WBEM_METHOD); in iwl_acpi_get_wbem()
1027 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_wbem()
1039 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) in iwl_acpi_get_wbem()
1042 *value = wifi_pkg->package.elements[1].integer.value & in iwl_acpi_get_wbem()
1054 int ret = -ENOENT; in iwl_acpi_get_dsbr()
1057 data = iwl_acpi_get_object(fwrt->dev, ACPI_DSBR_METHOD); in iwl_acpi_get_dsbr()
1061 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_dsbr()
1073 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) in iwl_acpi_get_dsbr()
1076 *value = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_dsbr()