Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause /* * Copyright (C) 2020 - 2021 Intel Corporation */ #include "mvm.h" #include "fw/api/commands.h" #include "fw/api/phy-ctxt.h" /** * DDR needs frequency in units of 16.666MHz, so provide FW with the * frequency values in the adjusted format. */ static const struct iwl_rfi_lut_entry iwl_rfi_table[IWL_RFI_LUT_SIZE] = { /* LPDDR4 */ /* frequency 3733MHz */ {cpu_to_le16(223), {114, 116, 118, 120, 122,}, {PHY_BAND_5, PHY_BAND_5, PHY_BAND_5, PHY_BAND_5, PHY_BAND_5,}}, /* frequency 4267MHz */ {cpu_to_le16(256), {79, 83, 85, 87, 89, 91, 93,}, {PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6,}}, /* DDR5ePOR */ /* frequency 4000MHz */ {cpu_to_le16(240), {3, 5, 7, 9, 11, 13, 15,}, {PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6,}}, /* frequency 4400MHz */ {cpu_to_le16(264), {111, 119, 123, 125, 129, 131, 133, 135, 143,}, {PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6,}}, /* LPDDR5iPOR */ /* frequency 5200MHz */ {cpu_to_le16(312), {36, 38, 40, 42, 50,}, {PHY_BAND_5, PHY_BAND_5, PHY_BAND_5, PHY_BAND_5, PHY_BAND_5,}}, /* frequency 6000MHz */ {cpu_to_le16(360), {3, 5, 7, 9, 11, 13, 15,}, {PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6,}}, /* frequency 6400MHz */ {cpu_to_le16(384), {79, 83, 85, 87, 89, 91, 93,}, {PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6, PHY_BAND_6,}}, }; int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm, struct iwl_rfi_lut_entry *rfi_table) { int ret; struct iwl_rfi_config_cmd cmd; struct iwl_host_cmd hcmd = { .id = WIDE_ID(SYSTEM_GROUP, RFI_CONFIG_CMD), .dataflags[0] = IWL_HCMD_DFL_DUP, .data[0] = &cmd, .len[0] = sizeof(cmd), }; if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_RFIM_SUPPORT)) return -EOPNOTSUPP; lockdep_assert_held(&mvm->mutex); /* in case no table is passed, use the default one */ if (!rfi_table) { memcpy(cmd.table, iwl_rfi_table, sizeof(cmd.table)); } else { memcpy(cmd.table, rfi_table, sizeof(cmd.table)); /* notify FW the table is not the default one */ cmd.oem = 1; } ret = iwl_mvm_send_cmd(mvm, &hcmd); if (ret) IWL_ERR(mvm, "Failed to send RFI config cmd %d\n", ret); return ret; } struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm) { struct iwl_rfi_freq_table_resp_cmd *resp; int resp_size = sizeof(*resp); int ret; struct iwl_host_cmd cmd = { .id = WIDE_ID(SYSTEM_GROUP, RFI_GET_FREQ_TABLE_CMD), .flags = CMD_WANT_SKB, }; if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_RFIM_SUPPORT)) return ERR_PTR(-EOPNOTSUPP); mutex_lock(&mvm->mutex); ret = iwl_mvm_send_cmd(mvm, &cmd); mutex_unlock(&mvm->mutex); if (ret) return ERR_PTR(ret); if (WARN_ON_ONCE(iwl_rx_packet_payload_len(cmd.resp_pkt) != resp_size)) { iwl_free_resp(&cmd); return ERR_PTR(-EIO); } resp = kmemdup(cmd.resp_pkt->data, resp_size, GFP_KERNEL); iwl_free_resp(&cmd); if (!resp) return ERR_PTR(-ENOMEM); return resp; } |