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,
43 return -ENOENT;
46 status = acpi_get_handle(root_handle, method, ret_handle);
49 "ACPI: %s method not found\n", method);
50 return -ENOENT;
55 static void *iwl_acpi_get_object(struct device *dev, acpi_string method)
62 ret = iwl_acpi_get_handle(dev, method, &handle);
64 return ERR_PTR(-ENOENT);
66 /* Call the method with no arguments */
70 "ACPI: %s method invocation failed (status: 0x%x)\n",
71 method, status);
72 return ERR_PTR(-ENOENT);
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",
94 return ERR_PTR(-ENOENT);
118 return -ENOENT;
121 if (obj->type == ACPI_TYPE_INTEGER) {
122 *value = obj->integer.value;
123 } else if (obj->type == ACPI_TYPE_BUFFER) {
127 return -EINVAL;
130 if (obj->buffer.length != expected_size)
133 obj->buffer.length);
136 memcpy(&le_value, obj->buffer.pointer,
137 min_t(size_t, expected_size, (size_t)obj->buffer.length));
141 "ACPI: DSM method did not return a valid object, type=%d\n",
142 obj->type);
143 ret = -EINVAL;
148 "ACPI: DSM method evaluated: func=%d, ret=%d\n",
157 * according to Intel BIOS spec, and fills in the value in a 32-bit field.
158 * In case the expected size is smaller than 32-bit, padding will be added.
170 return -EINVAL;
174 /* Currently all ACPI DSMs are either 8-bit or 32-bit */
176 return -EOPNOTSUPP;
178 ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV, func,
203 * We need at least one entry in the wifi package that
204 * describes the domain, and one more entry, otherwise there's
208 return ERR_PTR(-EINVAL);
216 if (data->type != ACPI_TYPE_PACKAGE ||
217 data->package.count < 2 ||
218 data->package.elements[0].type != ACPI_TYPE_INTEGER) {
220 return ERR_PTR(-EINVAL);
223 *tbl_rev = data->package.elements[0].integer.value;
226 for (i = 1; i < data->package.count; i++) {
229 wifi_pkg = &data->package.elements[i];
232 if (wifi_pkg->type != ACPI_TYPE_PACKAGE ||
233 wifi_pkg->package.count < min_data_size ||
234 wifi_pkg->package.count > max_data_size)
237 domain = &wifi_pkg->package.elements[0];
238 if (domain->type == ACPI_TYPE_INTEGER &&
239 domain->integer.value == ACPI_WIFI_DOMAIN)
243 return ERR_PTR(-ENOENT);
264 data = iwl_acpi_get_object(fwrt->dev, ACPI_WTAS_METHOD);
269 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
277 if (tbl_rev == 1 && wifi_pkg->package.elements[1].type ==
280 (u32)wifi_pkg->package.elements[1].integer.value;
286 wifi_pkg->package.elements[1].type == ACPI_TYPE_INTEGER) {
287 enabled = !!wifi_pkg->package.elements[1].integer.value;
289 ret = -EINVAL;
300 if (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER ||
301 wifi_pkg->package.elements[2].integer.value >
304 wifi_pkg->package.elements[2].integer.value);
305 ret = -EINVAL;
308 block_list_size = wifi_pkg->package.elements[2].integer.value;
309 tas_data->block_list_size = cpu_to_le32(block_list_size);
316 if (wifi_pkg->package.elements[3 + i].type !=
320 ret = -EINVAL;
324 country = wifi_pkg->package.elements[3 + i].integer.value;
325 tas_data->block_list_array[i] = cpu_to_le32(country);
341 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDD_METHOD);
345 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
353 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
355 ret = -EINVAL;
359 mcc_val = wifi_pkg->package.elements[1].integer.value;
374 int tbl_rev, ret = -EINVAL;
377 data = iwl_acpi_get_object(fwrt->dev, ACPI_SPLC_METHOD);
381 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
384 wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER)
387 *dflt_pwr_limit = wifi_pkg->package.elements[1].integer.value;
400 data = iwl_acpi_get_object(fwrt->dev, ACPI_ECKV_METHOD);
404 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
412 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
414 ret = -EINVAL;
418 *extl_clk = wifi_pkg->package.elements[1].integer.value;
442 profile->chains[i].subbands[j] = 0;
446 return -EINVAL;
448 profile->chains[i].subbands[j] =
457 profile->enabled = enabled;
469 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD);
474 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
479 ret = -EINVAL;
490 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
495 ret = -EINVAL;
506 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
511 ret = -EINVAL;
525 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) {
526 ret = -EINVAL;
532 flags = wifi_pkg->package.elements[1].integer.value;
533 fwrt->reduced_power_flags = flags >> IWL_REDUCE_POWER_FLAGS_POS;
536 table = &wifi_pkg->package.elements[2];
541 ret = iwl_acpi_sar_set_profile(table, &fwrt->sar_profiles[0],
557 data = iwl_acpi_get_object(fwrt->dev, ACPI_EWRD_METHOD);
562 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
567 ret = -EINVAL;
578 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
583 ret = -EINVAL;
594 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
599 ret = -EINVAL;
613 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
614 wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER) {
615 ret = -EINVAL;
619 enabled = !!(wifi_pkg->package.elements[1].integer.value);
620 n_profiles = wifi_pkg->package.elements[2].integer.value;
625 * ACPI_SAR_PROFILES_NUM - 1.
628 ret = -EINVAL;
636 union acpi_object *table = &wifi_pkg->package.elements[pos];
638 * save them in sar_profiles[1-3] (because we don't
642 &fwrt->sar_profiles[i + 1],
692 data = iwl_acpi_get_object(fwrt->dev, ACPI_WGDS_METHOD);
711 wifi_pkg = iwl_acpi_get_wifi_pkg_range(fwrt->dev, data,
723 union acpi_object *entry;
725 entry = &wifi_pkg->package.elements[entry_idx];
727 if (entry->type != ACPI_TYPE_INTEGER ||
728 entry->integer.value > num_profiles ||
729 entry->integer.value <
731 ret = -EINVAL;
739 if (wifi_pkg->package.count !=
741 ret = -EINVAL;
746 num_profiles = entry->integer.value;
755 ret = -ENOENT;
759 fwrt->geo_rev = tbl_rev;
762 union acpi_object *entry;
770 fwrt->geo_profiles[i].bands[j].max =
771 fwrt->geo_profiles[i].bands[1].max;
773 entry = &wifi_pkg->package.elements[entry_idx];
775 if (entry->type != ACPI_TYPE_INTEGER ||
776 entry->integer.value > U8_MAX) {
777 ret = -EINVAL;
781 fwrt->geo_profiles[i].bands[j].max =
782 entry->integer.value;
788 fwrt->geo_profiles[i].bands[j].chains[k] =
789 fwrt->geo_profiles[i].bands[1].chains[k];
791 entry = &wifi_pkg->package.elements[entry_idx];
793 if (entry->type != ACPI_TYPE_INTEGER ||
794 entry->integer.value > U8_MAX) {
795 ret = -EINVAL;
799 fwrt->geo_profiles[i].bands[j].chains[k] =
800 entry->integer.value;
806 fwrt->geo_num_profiles = num_profiles;
807 fwrt->geo_enabled = true;
820 data = iwl_acpi_get_object(fwrt->dev, ACPI_PPAG_METHOD);
825 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
836 ret = -EINVAL;
842 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
847 ret = -EINVAL;
859 fwrt->ppag_ver = tbl_rev;
860 flags = &wifi_pkg->package.elements[1];
862 if (flags->type != ACPI_TYPE_INTEGER) {
863 ret = -EINVAL;
867 fwrt->ppag_flags = iwl_bios_get_ppag_flags(flags->integer.value,
868 fwrt->ppag_ver);
872 * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the
873 * following sub-bands to High-Band (5GHz).
879 ent = &wifi_pkg->package.elements[idx++];
880 if (ent->type != ACPI_TYPE_INTEGER) {
881 ret = -EINVAL;
885 fwrt->ppag_chains[i].subbands[j] = ent->integer.value;
903 data = iwl_acpi_get_object(fwrt->dev, ACPI_WPFC_METHOD);
907 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
916 BUILD_BUG_ON(ARRAY_SIZE(filters->filter_cfg_chains) !=
917 ACPI_WPFC_WIFI_DATA_SIZE - 1);
919 for (i = 0; i < ARRAY_SIZE(filters->filter_cfg_chains); i++) {
920 if (wifi_pkg->package.elements[i + 1].type != ACPI_TYPE_INTEGER)
923 cpu_to_le32(wifi_pkg->package.elements[i + 1].integer.value);
938 data = iwl_acpi_get_object(fwrt->dev, ACPI_GLAI_METHOD);
942 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
953 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER ||
954 wifi_pkg->package.elements[1].integer.value > ACPI_GLAI_MAX_STATUS)
957 fwrt->uefi_tables_lock_status =
958 wifi_pkg->package.elements[1].integer.value;
962 fwrt->uefi_tables_lock_status);
971 int ret = -ENOENT;
974 data = iwl_acpi_get_object(fwrt->dev, ACPI_WBEM_METHOD);
978 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data,
990 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
993 *value = wifi_pkg->package.elements[1].integer.value &