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

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
4 * Copyright (C) 2019-2022 Intel Corporation
8 #include "iwl-drv.h"
9 #include "iwl-debug.h"
47 static int iwl_acpi_get_handle(struct device *dev, acpi_string method, in iwl_acpi_get_handle() argument
57 return -ENOENT; in iwl_acpi_get_handle()
60 status = acpi_get_handle(root_handle, method, ret_handle); in iwl_acpi_get_handle()
63 "ACPI: %s method not found\n", method); in iwl_acpi_get_handle()
64 return -ENOENT; in iwl_acpi_get_handle()
69 void *iwl_acpi_get_object(struct device *dev, acpi_string method) in iwl_acpi_get_object() argument
76 ret = iwl_acpi_get_handle(dev, method, &handle); in iwl_acpi_get_object()
78 return ERR_PTR(-ENOENT); in iwl_acpi_get_object()
80 /* Call the method with no arguments */ in iwl_acpi_get_object()
84 "ACPI: %s method invocation failed (status: 0x%x)\n", in iwl_acpi_get_object()
85 method, status); in iwl_acpi_get_object()
86 return ERR_PTR(-ENOENT); in iwl_acpi_get_object()
93 * Generic function for evaluating a method defined in the device specific
94 * method (DSM) interface. The returned acpi object must be freed by calling
107 "ACPI: DSM method invocation failed (rev: %d, func:%d)\n", in iwl_acpi_get_dsm_object()
109 return ERR_PTR(-ENOENT); in iwl_acpi_get_dsm_object()
133 return -ENOENT; in iwl_acpi_get_dsm_integer()
136 if (obj->type == ACPI_TYPE_INTEGER) { in iwl_acpi_get_dsm_integer()
137 *value = obj->integer.value; in iwl_acpi_get_dsm_integer()
138 } else if (obj->type == ACPI_TYPE_BUFFER) { in iwl_acpi_get_dsm_integer()
142 return -EINVAL; in iwl_acpi_get_dsm_integer()
145 if (obj->buffer.length != expected_size) in iwl_acpi_get_dsm_integer()
148 obj->buffer.length); in iwl_acpi_get_dsm_integer()
151 memcpy(&le_value, obj->buffer.pointer, in iwl_acpi_get_dsm_integer()
152 min_t(size_t, expected_size, (size_t)obj->buffer.length)); in iwl_acpi_get_dsm_integer()
156 "ACPI: DSM method did not return a valid object, type=%d\n", in iwl_acpi_get_dsm_integer()
157 obj->type); in iwl_acpi_get_dsm_integer()
158 ret = -EINVAL; in iwl_acpi_get_dsm_integer()
163 "ACPI: DSM method evaluated: func=%d, ret=%d\n", in iwl_acpi_get_dsm_integer()
222 * We need at least one entry in the wifi package that in iwl_acpi_get_wifi_pkg_range()
223 * describes the domain, and one more entry, otherwise there's in iwl_acpi_get_wifi_pkg_range()
227 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
235 if (data->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
236 data->package.count < 2 || in iwl_acpi_get_wifi_pkg_range()
237 data->package.elements[0].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_wifi_pkg_range()
239 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
242 *tbl_rev = data->package.elements[0].integer.value; in iwl_acpi_get_wifi_pkg_range()
245 for (i = 1; i < data->package.count; i++) { in iwl_acpi_get_wifi_pkg_range()
248 wifi_pkg = &data->package.elements[i]; in iwl_acpi_get_wifi_pkg_range()
251 if (wifi_pkg->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
252 wifi_pkg->package.count < min_data_size || in iwl_acpi_get_wifi_pkg_range()
253 wifi_pkg->package.count > max_data_size) in iwl_acpi_get_wifi_pkg_range()
256 domain = &wifi_pkg->package.elements[0]; in iwl_acpi_get_wifi_pkg_range()
257 if (domain->type == ACPI_TYPE_INTEGER && in iwl_acpi_get_wifi_pkg_range()
258 domain->integer.value == ACPI_WIFI_DOMAIN) in iwl_acpi_get_wifi_pkg_range()
262 return ERR_PTR(-ENOENT); in iwl_acpi_get_wifi_pkg_range()
275 data = iwl_acpi_get_object(fwrt->dev, ACPI_WTAS_METHOD); in iwl_acpi_get_tas()
280 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_tas()
288 if (tbl_rev == 1 && wifi_pkg->package.elements[1].type == in iwl_acpi_get_tas()
291 (u32)wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_tas()
301 cmd->v3.override_tas_iec = cpu_to_le16(override_iec); in iwl_acpi_get_tas()
302 cmd->v3.enable_tas_iec = cpu_to_le16(enabled_iec); in iwl_acpi_get_tas()
304 cmd->v4.usa_tas_uhb_allowed = usa_tas_uhb; in iwl_acpi_get_tas()
305 cmd->v4.override_tas_iec = (u8)override_iec; in iwl_acpi_get_tas()
306 cmd->v4.enable_tas_iec = (u8)enabled_iec; in iwl_acpi_get_tas()
310 wifi_pkg->package.elements[1].type == ACPI_TYPE_INTEGER) { in iwl_acpi_get_tas()
311 enabled = !!wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_tas()
313 ret = -EINVAL; in iwl_acpi_get_tas()
324 if (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_tas()
325 wifi_pkg->package.elements[2].integer.value > in iwl_acpi_get_tas()
328 wifi_pkg->package.elements[2].integer.value); in iwl_acpi_get_tas()
329 ret = -EINVAL; in iwl_acpi_get_tas()
332 block_list_size = wifi_pkg->package.elements[2].integer.value; in iwl_acpi_get_tas()
333 cmd->v4.block_list_size = cpu_to_le32(block_list_size); in iwl_acpi_get_tas()
339 ret = -EINVAL; in iwl_acpi_get_tas()
346 if (wifi_pkg->package.elements[3 + i].type != in iwl_acpi_get_tas()
350 ret = -EINVAL; in iwl_acpi_get_tas()
354 country = wifi_pkg->package.elements[3 + i].integer.value; in iwl_acpi_get_tas()
355 cmd->v4.block_list_array[i] = cpu_to_le32(country); in iwl_acpi_get_tas()
383 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_mcc()
385 ret = -EINVAL; in iwl_acpi_get_mcc()
389 mcc_val = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_mcc()
417 wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) { in iwl_acpi_get_pwr_limit()
422 dflt_pwr_limit = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_pwr_limit()
446 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_eckv()
448 ret = -EINVAL; in iwl_acpi_get_eckv()
452 *extl_clk = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_eckv()
476 profile->chains[i].subbands[j] = 0; in iwl_sar_set_profile()
480 return -EINVAL; in iwl_sar_set_profile()
482 profile->chains[i].subbands[j] = in iwl_sar_set_profile()
491 profile->enabled = enabled; in iwl_sar_set_profile()
508 return -EPERM; in iwl_sar_fill_table()
512 return -EINVAL; in iwl_sar_fill_table()
515 prof = &fwrt->sar_profiles[profs[i] - 1]; in iwl_sar_fill_table()
518 if (!prof->enabled) { in iwl_sar_fill_table()
535 cpu_to_le16(prof->chains[i].subbands[j]); in iwl_sar_fill_table()
537 j, prof->chains[i].subbands[j]); in iwl_sar_fill_table()
569 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD); in iwl_sar_get_wrds_table()
574 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_wrds_table()
590 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_wrds_table()
606 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_wrds_table()
625 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { in iwl_sar_get_wrds_table()
626 ret = -EINVAL; in iwl_sar_get_wrds_table()
632 flags = wifi_pkg->package.elements[1].integer.value; in iwl_sar_get_wrds_table()
633 fwrt->reduced_power_flags = flags >> IWL_REDUCE_POWER_FLAGS_POS; in iwl_sar_get_wrds_table()
636 table = &wifi_pkg->package.elements[2]; in iwl_sar_get_wrds_table()
641 ret = iwl_sar_set_profile(table, &fwrt->sar_profiles[0], in iwl_sar_get_wrds_table()
658 data = iwl_acpi_get_object(fwrt->dev, ACPI_EWRD_METHOD); in iwl_sar_get_ewrd_table()
663 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_ewrd_table()
679 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_ewrd_table()
695 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_ewrd_table()
714 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_sar_get_ewrd_table()
715 wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER) { in iwl_sar_get_ewrd_table()
716 ret = -EINVAL; in iwl_sar_get_ewrd_table()
720 enabled = !!(wifi_pkg->package.elements[1].integer.value); in iwl_sar_get_ewrd_table()
721 n_profiles = wifi_pkg->package.elements[2].integer.value; in iwl_sar_get_ewrd_table()
726 * ACPI_SAR_PROFILES_NUM - 1. in iwl_sar_get_ewrd_table()
729 ret = -EINVAL; in iwl_sar_get_ewrd_table()
738 * save them in sar_profiles[1-3] (because we don't in iwl_sar_get_ewrd_table()
741 ret = iwl_sar_set_profile(&wifi_pkg->package.elements[pos], in iwl_sar_get_ewrd_table()
742 &fwrt->sar_profiles[i + 1], enabled, in iwl_sar_get_ewrd_table()
792 data = iwl_acpi_get_object(fwrt->dev, ACPI_WGDS_METHOD); in iwl_sar_get_wgds_table()
811 wifi_pkg = iwl_acpi_get_wifi_pkg_range(fwrt->dev, data, in iwl_sar_get_wgds_table()
823 union acpi_object *entry; in iwl_sar_get_wgds_table() local
825 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_sar_get_wgds_table()
827 if (entry->type != ACPI_TYPE_INTEGER || in iwl_sar_get_wgds_table()
828 entry->integer.value > num_profiles) { in iwl_sar_get_wgds_table()
829 ret = -EINVAL; in iwl_sar_get_wgds_table()
832 num_profiles = entry->integer.value; in iwl_sar_get_wgds_table()
839 if (wifi_pkg->package.count != in iwl_sar_get_wgds_table()
841 ret = -EINVAL; in iwl_sar_get_wgds_table()
852 ret = -ENOENT; in iwl_sar_get_wgds_table()
856 fwrt->geo_rev = tbl_rev; in iwl_sar_get_wgds_table()
859 union acpi_object *entry; in iwl_sar_get_wgds_table() local
867 fwrt->geo_profiles[i].bands[j].max = in iwl_sar_get_wgds_table()
868 fwrt->geo_profiles[i].bands[1].max; in iwl_sar_get_wgds_table()
870 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_sar_get_wgds_table()
872 if (entry->type != ACPI_TYPE_INTEGER || in iwl_sar_get_wgds_table()
873 entry->integer.value > U8_MAX) { in iwl_sar_get_wgds_table()
874 ret = -EINVAL; in iwl_sar_get_wgds_table()
878 fwrt->geo_profiles[i].bands[j].max = in iwl_sar_get_wgds_table()
879 entry->integer.value; in iwl_sar_get_wgds_table()
885 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_sar_get_wgds_table()
886 fwrt->geo_profiles[i].bands[1].chains[k]; in iwl_sar_get_wgds_table()
888 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_sar_get_wgds_table()
890 if (entry->type != ACPI_TYPE_INTEGER || in iwl_sar_get_wgds_table()
891 entry->integer.value > U8_MAX) { in iwl_sar_get_wgds_table()
892 ret = -EINVAL; in iwl_sar_get_wgds_table()
896 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_sar_get_wgds_table()
897 entry->integer.value; in iwl_sar_get_wgds_table()
903 fwrt->geo_num_profiles = num_profiles; in iwl_sar_get_wgds_table()
904 fwrt->geo_enabled = true; in iwl_sar_get_wgds_table()
925 return IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) >= 38 || in iwl_sar_geo_support()
926 (IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 17 && in iwl_sar_geo_support()
927 fwrt->trans->hw_rev != CSR_HW_REV_TYPE_3160) || in iwl_sar_geo_support()
928 (IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 29 && in iwl_sar_geo_support()
929 ((fwrt->trans->hw_rev & CSR_HW_REV_TYPE_MSK) == in iwl_sar_geo_support()
940 if (!fwrt->geo_enabled) in iwl_sar_geo_init()
941 return -ENODATA; in iwl_sar_geo_init()
944 return -EOPNOTSUPP; in iwl_sar_geo_init()
951 chain->max_tx_power = in iwl_sar_geo_init()
952 cpu_to_le16(fwrt->geo_profiles[i].bands[j].max); in iwl_sar_geo_init()
953 chain->chain_a = fwrt->geo_profiles[i].bands[j].chains[0]; in iwl_sar_geo_init()
954 chain->chain_b = fwrt->geo_profiles[i].bands[j].chains[1]; in iwl_sar_geo_init()
958 fwrt->geo_profiles[i].bands[j].chains[0], in iwl_sar_geo_init()
959 fwrt->geo_profiles[i].bands[j].chains[1], in iwl_sar_geo_init()
960 fwrt->geo_profiles[i].bands[j].max); in iwl_sar_geo_init()
977 ret = iwl_acpi_get_dsm_u8(fwrt->dev, 0, in iwl_acpi_get_lari_config_bitmap()
988 ret = iwl_acpi_get_dsm_u8(fwrt->dev, 0, in iwl_acpi_get_lari_config_bitmap()
1010 fwrt->ppag_flags = 0; in iwl_acpi_get_ppag_table()
1012 data = iwl_acpi_get_object(fwrt->dev, ACPI_PPAG_METHOD); in iwl_acpi_get_ppag_table()
1017 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
1028 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1034 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
1039 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1048 fwrt->ppag_ver = tbl_rev; in iwl_acpi_get_ppag_table()
1049 flags = &wifi_pkg->package.elements[1]; in iwl_acpi_get_ppag_table()
1051 if (flags->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
1052 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1056 fwrt->ppag_flags = flags->integer.value & ACPI_PPAG_MASK; in iwl_acpi_get_ppag_table()
1058 if (!fwrt->ppag_flags) { in iwl_acpi_get_ppag_table()
1065 * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the in iwl_acpi_get_ppag_table()
1066 * following sub-bands to High-Band (5GHz). in iwl_acpi_get_ppag_table()
1072 ent = &wifi_pkg->package.elements[idx++]; in iwl_acpi_get_ppag_table()
1073 if (ent->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
1074 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1078 fwrt->ppag_chains[i].subbands[j] = ent->integer.value; in iwl_acpi_get_ppag_table()
1081 (fwrt->ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_LB || in iwl_acpi_get_ppag_table()
1082 fwrt->ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_LB)) || in iwl_acpi_get_ppag_table()
1084 (fwrt->ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_HB || in iwl_acpi_get_ppag_table()
1085 fwrt->ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_HB))) { in iwl_acpi_get_ppag_table()
1086 fwrt->ppag_flags = 0; in iwl_acpi_get_ppag_table()
1087 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1109 if (!fw_has_capa(&fwrt->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) { in iwl_read_ppag_table()
1112 return -EINVAL; in iwl_read_ppag_table()
1114 if (!fwrt->ppag_flags) { in iwl_read_ppag_table()
1116 return -EINVAL; in iwl_read_ppag_table()
1122 cmd->v1.flags = cpu_to_le32(fwrt->ppag_flags); in iwl_read_ppag_table()
1123 cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw, in iwl_read_ppag_table()
1128 gain = cmd->v1.gain[0]; in iwl_read_ppag_table()
1129 *cmd_size = sizeof(cmd->v1); in iwl_read_ppag_table()
1130 if (fwrt->ppag_ver == 1 || fwrt->ppag_ver == 2) { in iwl_read_ppag_table()
1133 fwrt->ppag_ver); in iwl_read_ppag_table()
1134 cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK); in iwl_read_ppag_table()
1138 gain = cmd->v2.gain[0]; in iwl_read_ppag_table()
1139 *cmd_size = sizeof(cmd->v2); in iwl_read_ppag_table()
1140 if (fwrt->ppag_ver == 0) { in iwl_read_ppag_table()
1143 } else if (cmd_ver == 2 && fwrt->ppag_ver == 2) { in iwl_read_ppag_table()
1146 cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK); in iwl_read_ppag_table()
1150 return -EINVAL; in iwl_read_ppag_table()
1156 fwrt->ppag_chains[i].subbands[j]; in iwl_read_ppag_table()
1174 fwrt->ppag_flags = 0; in iwl_acpi_is_ppag_approved()