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

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
4 * Copyright (C) 2019-2023 Intel Corporation
8 #include "iwl-drv.h"
9 #include "iwl-debug.h"
44 { .ident = "GOOGLE-HP",
50 { .ident = "GOOGLE-ASUS",
56 { .ident = "GOOGLE-SAMSUNG",
80 static int iwl_acpi_get_handle(struct device *dev, acpi_string method, in iwl_acpi_get_handle() argument
90 return -ENOENT; in iwl_acpi_get_handle()
93 status = acpi_get_handle(root_handle, method, ret_handle); in iwl_acpi_get_handle()
96 "ACPI: %s method not found\n", method); in iwl_acpi_get_handle()
97 return -ENOENT; in iwl_acpi_get_handle()
102 static void *iwl_acpi_get_object(struct device *dev, acpi_string method) in iwl_acpi_get_object() argument
109 ret = iwl_acpi_get_handle(dev, method, &handle); in iwl_acpi_get_object()
111 return ERR_PTR(-ENOENT); in iwl_acpi_get_object()
113 /* Call the method with no arguments */ in iwl_acpi_get_object()
117 "ACPI: %s method invocation failed (status: 0x%x)\n", in iwl_acpi_get_object()
118 method, status); in iwl_acpi_get_object()
119 return ERR_PTR(-ENOENT); in iwl_acpi_get_object()
125 * Generic function for evaluating a method defined in the device specific
126 * method (DSM) interface. The returned acpi object must be freed by calling
139 "ACPI: DSM method invocation failed (rev: %d, func:%d)\n", in iwl_acpi_get_dsm_object()
141 return ERR_PTR(-ENOENT); in iwl_acpi_get_dsm_object()
165 return -ENOENT; in iwl_acpi_get_dsm_integer()
168 if (obj->type == ACPI_TYPE_INTEGER) { in iwl_acpi_get_dsm_integer()
169 *value = obj->integer.value; in iwl_acpi_get_dsm_integer()
170 } else if (obj->type == ACPI_TYPE_BUFFER) { in iwl_acpi_get_dsm_integer()
174 return -EINVAL; in iwl_acpi_get_dsm_integer()
177 if (obj->buffer.length != expected_size) in iwl_acpi_get_dsm_integer()
180 obj->buffer.length); in iwl_acpi_get_dsm_integer()
183 memcpy(&le_value, obj->buffer.pointer, in iwl_acpi_get_dsm_integer()
184 min_t(size_t, expected_size, (size_t)obj->buffer.length)); in iwl_acpi_get_dsm_integer()
188 "ACPI: DSM method did not return a valid object, type=%d\n", in iwl_acpi_get_dsm_integer()
189 obj->type); in iwl_acpi_get_dsm_integer()
190 ret = -EINVAL; in iwl_acpi_get_dsm_integer()
195 "ACPI: DSM method evaluated: func=%d, ret=%d\n", in iwl_acpi_get_dsm_integer()
255 * We need at least one entry in the wifi package that in iwl_acpi_get_wifi_pkg_range()
256 * describes the domain, and one more entry, otherwise there's in iwl_acpi_get_wifi_pkg_range()
260 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
268 if (data->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
269 data->package.count < 2 || in iwl_acpi_get_wifi_pkg_range()
270 data->package.elements[0].type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_wifi_pkg_range()
272 return ERR_PTR(-EINVAL); in iwl_acpi_get_wifi_pkg_range()
275 *tbl_rev = data->package.elements[0].integer.value; in iwl_acpi_get_wifi_pkg_range()
278 for (i = 1; i < data->package.count; i++) { in iwl_acpi_get_wifi_pkg_range()
281 wifi_pkg = &data->package.elements[i]; in iwl_acpi_get_wifi_pkg_range()
284 if (wifi_pkg->type != ACPI_TYPE_PACKAGE || in iwl_acpi_get_wifi_pkg_range()
285 wifi_pkg->package.count < min_data_size || in iwl_acpi_get_wifi_pkg_range()
286 wifi_pkg->package.count > max_data_size) in iwl_acpi_get_wifi_pkg_range()
289 domain = &wifi_pkg->package.elements[0]; in iwl_acpi_get_wifi_pkg_range()
290 if (domain->type == ACPI_TYPE_INTEGER && in iwl_acpi_get_wifi_pkg_range()
291 domain->integer.value == ACPI_WIFI_DOMAIN) in iwl_acpi_get_wifi_pkg_range()
295 return ERR_PTR(-ENOENT); in iwl_acpi_get_wifi_pkg_range()
317 data = iwl_acpi_get_object(fwrt->dev, ACPI_WTAS_METHOD); in iwl_acpi_get_tas()
322 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_tas()
330 if (tbl_rev == 1 && wifi_pkg->package.elements[1].type == in iwl_acpi_get_tas()
333 (u32)wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_tas()
343 cmd->v3.override_tas_iec = cpu_to_le16(override_iec); in iwl_acpi_get_tas()
344 cmd->v3.enable_tas_iec = cpu_to_le16(enabled_iec); in iwl_acpi_get_tas()
346 cmd->v4.usa_tas_uhb_allowed = usa_tas_uhb; in iwl_acpi_get_tas()
347 cmd->v4.override_tas_iec = (u8)override_iec; in iwl_acpi_get_tas()
348 cmd->v4.enable_tas_iec = (u8)enabled_iec; in iwl_acpi_get_tas()
352 wifi_pkg->package.elements[1].type == ACPI_TYPE_INTEGER) { in iwl_acpi_get_tas()
353 enabled = !!wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_tas()
355 ret = -EINVAL; in iwl_acpi_get_tas()
366 if (wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_tas()
367 wifi_pkg->package.elements[2].integer.value > in iwl_acpi_get_tas()
370 wifi_pkg->package.elements[2].integer.value); in iwl_acpi_get_tas()
371 ret = -EINVAL; in iwl_acpi_get_tas()
374 block_list_size = wifi_pkg->package.elements[2].integer.value; in iwl_acpi_get_tas()
375 cmd->v4.block_list_size = cpu_to_le32(block_list_size); in iwl_acpi_get_tas()
381 ret = -EINVAL; in iwl_acpi_get_tas()
388 if (wifi_pkg->package.elements[3 + i].type != in iwl_acpi_get_tas()
392 ret = -EINVAL; in iwl_acpi_get_tas()
396 country = wifi_pkg->package.elements[3 + i].integer.value; in iwl_acpi_get_tas()
397 cmd->v4.block_list_array[i] = cpu_to_le32(country); in iwl_acpi_get_tas()
425 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_mcc()
427 ret = -EINVAL; in iwl_acpi_get_mcc()
431 mcc_val = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_mcc()
459 wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) { in iwl_acpi_get_pwr_limit()
464 dflt_pwr_limit = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_pwr_limit()
488 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_acpi_get_eckv()
490 ret = -EINVAL; in iwl_acpi_get_eckv()
494 *extl_clk = wifi_pkg->package.elements[1].integer.value; in iwl_acpi_get_eckv()
518 profile->chains[i].subbands[j] = 0; in iwl_sar_set_profile()
522 return -EINVAL; in iwl_sar_set_profile()
524 profile->chains[i].subbands[j] = in iwl_sar_set_profile()
533 profile->enabled = enabled; in iwl_sar_set_profile()
550 return -EPERM; in iwl_sar_fill_table()
554 return -EINVAL; in iwl_sar_fill_table()
557 prof = &fwrt->sar_profiles[profs[i] - 1]; in iwl_sar_fill_table()
560 if (!prof->enabled) { in iwl_sar_fill_table()
577 cpu_to_le16(prof->chains[i].subbands[j]); in iwl_sar_fill_table()
579 j, prof->chains[i].subbands[j]); in iwl_sar_fill_table()
611 data = iwl_acpi_get_object(fwrt->dev, ACPI_WRDS_METHOD); in iwl_sar_get_wrds_table()
616 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_wrds_table()
621 ret = -EINVAL; in iwl_sar_get_wrds_table()
632 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_wrds_table()
637 ret = -EINVAL; in iwl_sar_get_wrds_table()
648 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_wrds_table()
653 ret = -EINVAL; in iwl_sar_get_wrds_table()
667 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) { in iwl_sar_get_wrds_table()
668 ret = -EINVAL; in iwl_sar_get_wrds_table()
674 flags = wifi_pkg->package.elements[1].integer.value; in iwl_sar_get_wrds_table()
675 fwrt->reduced_power_flags = flags >> IWL_REDUCE_POWER_FLAGS_POS; in iwl_sar_get_wrds_table()
678 table = &wifi_pkg->package.elements[2]; in iwl_sar_get_wrds_table()
683 ret = iwl_sar_set_profile(table, &fwrt->sar_profiles[0], in iwl_sar_get_wrds_table()
700 data = iwl_acpi_get_object(fwrt->dev, ACPI_EWRD_METHOD); in iwl_sar_get_ewrd_table()
705 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_ewrd_table()
710 ret = -EINVAL; in iwl_sar_get_ewrd_table()
721 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_ewrd_table()
726 ret = -EINVAL; in iwl_sar_get_ewrd_table()
737 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_sar_get_ewrd_table()
742 ret = -EINVAL; in iwl_sar_get_ewrd_table()
756 if (wifi_pkg->package.elements[1].type != ACPI_TYPE_INTEGER || in iwl_sar_get_ewrd_table()
757 wifi_pkg->package.elements[2].type != ACPI_TYPE_INTEGER) { in iwl_sar_get_ewrd_table()
758 ret = -EINVAL; in iwl_sar_get_ewrd_table()
762 enabled = !!(wifi_pkg->package.elements[1].integer.value); in iwl_sar_get_ewrd_table()
763 n_profiles = wifi_pkg->package.elements[2].integer.value; in iwl_sar_get_ewrd_table()
768 * ACPI_SAR_PROFILES_NUM - 1. in iwl_sar_get_ewrd_table()
771 ret = -EINVAL; in iwl_sar_get_ewrd_table()
780 * save them in sar_profiles[1-3] (because we don't in iwl_sar_get_ewrd_table()
783 ret = iwl_sar_set_profile(&wifi_pkg->package.elements[pos], in iwl_sar_get_ewrd_table()
784 &fwrt->sar_profiles[i + 1], enabled, in iwl_sar_get_ewrd_table()
834 data = iwl_acpi_get_object(fwrt->dev, ACPI_WGDS_METHOD); in iwl_sar_get_wgds_table()
853 wifi_pkg = iwl_acpi_get_wifi_pkg_range(fwrt->dev, data, in iwl_sar_get_wgds_table()
865 union acpi_object *entry; in iwl_sar_get_wgds_table() local
867 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_sar_get_wgds_table()
869 if (entry->type != ACPI_TYPE_INTEGER || in iwl_sar_get_wgds_table()
870 entry->integer.value > num_profiles) { in iwl_sar_get_wgds_table()
871 ret = -EINVAL; in iwl_sar_get_wgds_table()
874 num_profiles = entry->integer.value; in iwl_sar_get_wgds_table()
881 if (wifi_pkg->package.count != in iwl_sar_get_wgds_table()
883 ret = -EINVAL; in iwl_sar_get_wgds_table()
894 ret = -ENOENT; in iwl_sar_get_wgds_table()
898 fwrt->geo_rev = tbl_rev; in iwl_sar_get_wgds_table()
901 union acpi_object *entry; in iwl_sar_get_wgds_table() local
909 fwrt->geo_profiles[i].bands[j].max = in iwl_sar_get_wgds_table()
910 fwrt->geo_profiles[i].bands[1].max; in iwl_sar_get_wgds_table()
912 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_sar_get_wgds_table()
914 if (entry->type != ACPI_TYPE_INTEGER || in iwl_sar_get_wgds_table()
915 entry->integer.value > U8_MAX) { in iwl_sar_get_wgds_table()
916 ret = -EINVAL; in iwl_sar_get_wgds_table()
920 fwrt->geo_profiles[i].bands[j].max = in iwl_sar_get_wgds_table()
921 entry->integer.value; in iwl_sar_get_wgds_table()
927 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_sar_get_wgds_table()
928 fwrt->geo_profiles[i].bands[1].chains[k]; in iwl_sar_get_wgds_table()
930 entry = &wifi_pkg->package.elements[entry_idx]; in iwl_sar_get_wgds_table()
932 if (entry->type != ACPI_TYPE_INTEGER || in iwl_sar_get_wgds_table()
933 entry->integer.value > U8_MAX) { in iwl_sar_get_wgds_table()
934 ret = -EINVAL; in iwl_sar_get_wgds_table()
938 fwrt->geo_profiles[i].bands[j].chains[k] = in iwl_sar_get_wgds_table()
939 entry->integer.value; in iwl_sar_get_wgds_table()
945 fwrt->geo_num_profiles = num_profiles; in iwl_sar_get_wgds_table()
946 fwrt->geo_enabled = true; in iwl_sar_get_wgds_table()
967 return IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) >= 38 || in iwl_sar_geo_support()
968 (IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 17 && in iwl_sar_geo_support()
969 fwrt->trans->hw_rev != CSR_HW_REV_TYPE_3160) || in iwl_sar_geo_support()
970 (IWL_UCODE_SERIAL(fwrt->fw->ucode_ver) == 29 && in iwl_sar_geo_support()
971 ((fwrt->trans->hw_rev & CSR_HW_REV_TYPE_MSK) == in iwl_sar_geo_support()
982 if (!fwrt->geo_enabled) in iwl_sar_geo_init()
983 return -ENODATA; in iwl_sar_geo_init()
986 return -EOPNOTSUPP; in iwl_sar_geo_init()
993 chain->max_tx_power = in iwl_sar_geo_init()
994 cpu_to_le16(fwrt->geo_profiles[i].bands[j].max); in iwl_sar_geo_init()
995 chain->chain_a = fwrt->geo_profiles[i].bands[j].chains[0]; in iwl_sar_geo_init()
996 chain->chain_b = fwrt->geo_profiles[i].bands[j].chains[1]; in iwl_sar_geo_init()
1000 fwrt->geo_profiles[i].bands[j].chains[0], in iwl_sar_geo_init()
1001 fwrt->geo_profiles[i].bands[j].chains[1], in iwl_sar_geo_init()
1002 fwrt->geo_profiles[i].bands[j].max); in iwl_sar_geo_init()
1021 switch (CSR_HW_RFID_TYPE(fwrt->trans->hw_rf_id)) { in iwl_acpi_get_lari_config_bitmap()
1026 ret = iwl_acpi_get_dsm_u8(fwrt->dev, 0, in iwl_acpi_get_lari_config_bitmap()
1041 ret = iwl_acpi_get_dsm_u8(fwrt->dev, 0, in iwl_acpi_get_lari_config_bitmap()
1053 if (fw_has_capa(&fwrt->fw->ucode_capa, in iwl_acpi_get_lari_config_bitmap()
1058 ret = iwl_acpi_get_dsm_u32(fwrt->dev, 0, in iwl_acpi_get_lari_config_bitmap()
1081 fwrt->ppag_flags = 0; in iwl_acpi_get_ppag_table()
1082 fwrt->ppag_table_valid = false; in iwl_acpi_get_ppag_table()
1084 data = iwl_acpi_get_object(fwrt->dev, ACPI_PPAG_METHOD); in iwl_acpi_get_ppag_table()
1089 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
1100 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1106 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_ppag_table()
1111 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1123 fwrt->ppag_ver = tbl_rev; in iwl_acpi_get_ppag_table()
1124 flags = &wifi_pkg->package.elements[1]; in iwl_acpi_get_ppag_table()
1126 if (flags->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
1127 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1131 fwrt->ppag_flags = flags->integer.value & ACPI_PPAG_MASK; in iwl_acpi_get_ppag_table()
1132 cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw, in iwl_acpi_get_ppag_table()
1137 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1140 if (!fwrt->ppag_flags && cmd_ver <= 3) { in iwl_acpi_get_ppag_table()
1147 * first sub-band (j=0) corresponds to Low-Band (2.4GHz), and the in iwl_acpi_get_ppag_table()
1148 * following sub-bands to High-Band (5GHz). in iwl_acpi_get_ppag_table()
1154 ent = &wifi_pkg->package.elements[idx++]; in iwl_acpi_get_ppag_table()
1155 if (ent->type != ACPI_TYPE_INTEGER) { in iwl_acpi_get_ppag_table()
1156 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1160 fwrt->ppag_chains[i].subbands[j] = ent->integer.value; in iwl_acpi_get_ppag_table()
1165 (fwrt->ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_LB || in iwl_acpi_get_ppag_table()
1166 fwrt->ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_LB)) || in iwl_acpi_get_ppag_table()
1168 (fwrt->ppag_chains[i].subbands[j] > ACPI_PPAG_MAX_HB || in iwl_acpi_get_ppag_table()
1169 fwrt->ppag_chains[i].subbands[j] < ACPI_PPAG_MIN_HB))) { in iwl_acpi_get_ppag_table()
1170 ret = -EINVAL; in iwl_acpi_get_ppag_table()
1176 fwrt->ppag_table_valid = true; in iwl_acpi_get_ppag_table()
1193 if (CSR_HW_RFID_TYPE(fwrt->trans->hw_rf_id) == in iwl_read_ppag_table()
1195 return -EOPNOTSUPP; in iwl_read_ppag_table()
1197 if (!fw_has_capa(&fwrt->fw->ucode_capa, IWL_UCODE_TLV_CAPA_SET_PPAG)) { in iwl_read_ppag_table()
1200 return -EINVAL; in iwl_read_ppag_table()
1203 cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw, in iwl_read_ppag_table()
1207 if (!fwrt->ppag_table_valid || (cmd_ver <= 3 && !fwrt->ppag_flags)) { in iwl_read_ppag_table()
1209 return -EINVAL; in iwl_read_ppag_table()
1215 cmd->v1.flags = cpu_to_le32(fwrt->ppag_flags); in iwl_read_ppag_table()
1220 gain = cmd->v1.gain[0]; in iwl_read_ppag_table()
1221 *cmd_size = sizeof(cmd->v1); in iwl_read_ppag_table()
1222 if (fwrt->ppag_ver == 1 || fwrt->ppag_ver == 2) { in iwl_read_ppag_table()
1226 fwrt->ppag_ver); in iwl_read_ppag_table()
1230 gain = cmd->v2.gain[0]; in iwl_read_ppag_table()
1231 *cmd_size = sizeof(cmd->v2); in iwl_read_ppag_table()
1232 if (fwrt->ppag_ver == 0) { in iwl_read_ppag_table()
1239 return -EINVAL; in iwl_read_ppag_table()
1245 cmd->v1.flags & cpu_to_le32(ACPI_PPAG_MASK)); in iwl_read_ppag_table()
1246 if ((cmd_ver == 1 && !fw_has_capa(&fwrt->fw->ucode_capa, in iwl_read_ppag_table()
1248 (cmd_ver == 2 && fwrt->ppag_ver == 2)) { in iwl_read_ppag_table()
1249 cmd->v1.flags &= cpu_to_le32(IWL_PPAG_ETSI_MASK); in iwl_read_ppag_table()
1257 cmd->v1.flags & cpu_to_le32(ACPI_PPAG_MASK)); in iwl_read_ppag_table()
1262 fwrt->ppag_chains[i].subbands[j]; in iwl_read_ppag_table()
1280 fwrt->ppag_flags = 0; in iwl_acpi_is_ppag_approved()
1295 data = iwl_acpi_get_object(fwrt->dev, ACPI_WPFC_METHOD); in iwl_acpi_get_phy_filters()
1300 wifi_pkg = iwl_acpi_get_wifi_pkg(fwrt->dev, data, in iwl_acpi_get_phy_filters()
1309 BUILD_BUG_ON(ARRAY_SIZE(filters->filter_cfg_chains) != ACPI_WPFC_WIFI_DATA_SIZE); in iwl_acpi_get_phy_filters()
1311 for (i = 0; i < ARRAY_SIZE(filters->filter_cfg_chains); i++) { in iwl_acpi_get_phy_filters()
1312 if (wifi_pkg->package.elements[i].type != ACPI_TYPE_INTEGER) in iwl_acpi_get_phy_filters()
1315 cpu_to_le32(wifi_pkg->package.elements[i].integer.value); in iwl_acpi_get_phy_filters()