wifi: iwlwifi: add support for new ini region types
YoYo introduces 2 new region types: prph mac and phy blocks. The data in this regions consists of a list of (base address, size) pairs. This way we can set a block of consecutive registers by the base address and the size, instead of a list of registers. Add support for parsing and dumping these new region types Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20231004123422.0a10320f4259.I680ef6e16267d95329ee239f05d0999f5a1719ac@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
440a561c43
commit
66125c42fd
@ -1,6 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
/*
|
||||
* Copyright (C) 2018-2022 Intel Corporation
|
||||
* Copyright (C) 2018-2023 Intel Corporation
|
||||
*/
|
||||
#ifndef __iwl_fw_dbg_tlv_h__
|
||||
#define __iwl_fw_dbg_tlv_h__
|
||||
@ -42,6 +42,30 @@ struct iwl_fw_ini_header {
|
||||
/* followed by the data */
|
||||
} __packed; /* FW_TLV_DEBUG_HEADER_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_addr_size - Base address and size that defines
|
||||
* a chunk of memory
|
||||
*
|
||||
* @addr: the base address (fixed size - 4 bytes)
|
||||
* @size: the size to read
|
||||
*/
|
||||
struct iwl_fw_ini_addr_size {
|
||||
__le32 addr;
|
||||
__le32 size;
|
||||
} __packed; /* FW_TLV_DEBUG_ADDR_SIZE_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_region_dev_addr_range - Configuration to read
|
||||
* device address range
|
||||
*
|
||||
* @offset: offset to add to the base address of each chunk
|
||||
* The addrs[] array will be treated as an array of &iwl_fw_ini_addr_size -
|
||||
* an array of (addr, size) pairs.
|
||||
*/
|
||||
struct iwl_fw_ini_region_dev_addr_range {
|
||||
__le32 offset;
|
||||
} __packed; /* FW_TLV_DEBUG_DEVICE_ADDR_RANGE_API_S_VER_1 */
|
||||
|
||||
/**
|
||||
* struct iwl_fw_ini_region_dev_addr - Configuration to read device addresses
|
||||
*
|
||||
@ -135,6 +159,9 @@ struct iwl_fw_ini_region_internal_buffer {
|
||||
* &IWL_FW_INI_REGION_PAGING, &IWL_FW_INI_REGION_CSR,
|
||||
* &IWL_FW_INI_REGION_DRAM_IMR and &IWL_FW_INI_REGION_PCI_IOSF_CONFIG
|
||||
* &IWL_FW_INI_REGION_DBGI_SRAM, &FW_TLV_DEBUG_REGION_TYPE_DBGI_SRAM,
|
||||
* @dev_addr_range: device address range configuration. Used by
|
||||
* &IWL_FW_INI_REGION_PERIPHERY_MAC_RANGE and
|
||||
* &IWL_FW_INI_REGION_PERIPHERY_PHY_RANGE
|
||||
* @fifos: fifos configuration. Used by &IWL_FW_INI_REGION_TXF and
|
||||
* &IWL_FW_INI_REGION_RXF
|
||||
* @err_table: error table configuration. Used by
|
||||
@ -157,6 +184,7 @@ struct iwl_fw_ini_region_tlv {
|
||||
u8 name[IWL_FW_INI_MAX_NAME];
|
||||
union {
|
||||
struct iwl_fw_ini_region_dev_addr dev_addr;
|
||||
struct iwl_fw_ini_region_dev_addr_range dev_addr_range;
|
||||
struct iwl_fw_ini_region_fifos fifos;
|
||||
struct iwl_fw_ini_region_err_table err_table;
|
||||
struct iwl_fw_ini_region_internal_buffer internal_buffer;
|
||||
@ -362,6 +390,8 @@ enum iwl_fw_ini_buffer_location {
|
||||
* @IWL_FW_INI_REGION_PCI_IOSF_CONFIG: PCI/IOSF config
|
||||
* @IWL_FW_INI_REGION_SPECIAL_DEVICE_MEMORY: special device memory
|
||||
* @IWL_FW_INI_REGION_DBGI_SRAM: periphery registers of DBGI SRAM
|
||||
* @IWL_FW_INI_REGION_PERIPHERY_MAC_RANGE: a range of periphery registers of MAC
|
||||
* @IWL_FW_INI_REGION_PERIPHERY_PHY_RANGE: a range of periphery registers of PHY
|
||||
* @IWL_FW_INI_REGION_NUM: number of region types
|
||||
*/
|
||||
enum iwl_fw_ini_region_type {
|
||||
@ -384,6 +414,8 @@ enum iwl_fw_ini_region_type {
|
||||
IWL_FW_INI_REGION_PCI_IOSF_CONFIG,
|
||||
IWL_FW_INI_REGION_SPECIAL_DEVICE_MEMORY,
|
||||
IWL_FW_INI_REGION_DBGI_SRAM,
|
||||
IWL_FW_INI_REGION_PERIPHERY_MAC_RANGE,
|
||||
IWL_FW_INI_REGION_PERIPHERY_PHY_RANGE,
|
||||
IWL_FW_INI_REGION_NUM
|
||||
}; /* FW_TLV_DEBUG_REGION_TYPE_API_E */
|
||||
|
||||
|
@ -1055,6 +1055,20 @@ iwl_dump_ini_prph_mac_iter(struct iwl_fw_runtime *fwrt,
|
||||
reg->dev_addr.size);
|
||||
}
|
||||
|
||||
static int
|
||||
iwl_dump_ini_prph_mac_block_iter(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data,
|
||||
void *range_ptr, u32 range_len, int idx)
|
||||
{
|
||||
struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
|
||||
struct iwl_fw_ini_addr_size *pairs = (void *)reg->addrs;
|
||||
u32 addr = le32_to_cpu(reg->dev_addr_range.offset) +
|
||||
le32_to_cpu(pairs[idx].addr);
|
||||
|
||||
return iwl_dump_ini_prph_mac_iter_common(fwrt, range_ptr, addr,
|
||||
pairs[idx].size);
|
||||
}
|
||||
|
||||
static int iwl_dump_ini_prph_phy_iter_common(struct iwl_fw_runtime *fwrt,
|
||||
void *range_ptr, u32 addr,
|
||||
__le32 size, __le32 offset)
|
||||
@ -1115,6 +1129,20 @@ iwl_dump_ini_prph_phy_iter(struct iwl_fw_runtime *fwrt,
|
||||
reg->dev_addr.offset);
|
||||
}
|
||||
|
||||
static int
|
||||
iwl_dump_ini_prph_phy_block_iter(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data,
|
||||
void *range_ptr, u32 range_len, int idx)
|
||||
{
|
||||
struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
|
||||
struct iwl_fw_ini_addr_size *pairs = (void *)reg->addrs;
|
||||
u32 addr = le32_to_cpu(pairs[idx].addr);
|
||||
|
||||
return iwl_dump_ini_prph_phy_iter_common(fwrt, range_ptr, addr,
|
||||
pairs[idx].size,
|
||||
reg->dev_addr_range.offset);
|
||||
}
|
||||
|
||||
static int iwl_dump_ini_csr_iter(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data,
|
||||
void *range_ptr, u32 range_len, int idx)
|
||||
@ -1799,6 +1827,16 @@ static u32 iwl_dump_ini_mem_ranges(struct iwl_fw_runtime *fwrt,
|
||||
return iwl_tlv_array_len(reg_data->reg_tlv, reg, addrs);
|
||||
}
|
||||
|
||||
static u32
|
||||
iwl_dump_ini_mem_block_ranges(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data)
|
||||
{
|
||||
struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
|
||||
size_t size = sizeof(struct iwl_fw_ini_addr_size);
|
||||
|
||||
return iwl_tlv_array_len_with_size(reg_data->reg_tlv, reg, size);
|
||||
}
|
||||
|
||||
static u32 iwl_dump_ini_paging_ranges(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data)
|
||||
{
|
||||
@ -1884,6 +1922,25 @@ static u32 iwl_dump_ini_mem_get_size(struct iwl_fw_runtime *fwrt,
|
||||
(size + sizeof(struct iwl_fw_ini_error_dump_range));
|
||||
}
|
||||
|
||||
static u32
|
||||
iwl_dump_ini_mem_block_get_size(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data)
|
||||
{
|
||||
struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
|
||||
struct iwl_fw_ini_addr_size *pairs = (void *)reg->addrs;
|
||||
u32 ranges = iwl_dump_ini_mem_block_ranges(fwrt, reg_data);
|
||||
u32 size = sizeof(struct iwl_fw_ini_error_dump);
|
||||
int range;
|
||||
|
||||
if (!ranges)
|
||||
return 0;
|
||||
|
||||
for (range = 0; range < ranges; range++)
|
||||
size += le32_to_cpu(pairs[range].size);
|
||||
|
||||
return size + ranges * sizeof(struct iwl_fw_ini_error_dump_range);
|
||||
}
|
||||
|
||||
static u32
|
||||
iwl_dump_ini_paging_get_size(struct iwl_fw_runtime *fwrt,
|
||||
struct iwl_dump_ini_region_data *reg_data)
|
||||
@ -2431,6 +2488,18 @@ static const struct iwl_dump_ini_mem_ops iwl_dump_ini_region_ops[] = {
|
||||
.fill_mem_hdr = iwl_dump_ini_mem_fill_header,
|
||||
.fill_range = iwl_dump_ini_prph_phy_iter,
|
||||
},
|
||||
[IWL_FW_INI_REGION_PERIPHERY_MAC_RANGE] = {
|
||||
.get_num_of_ranges = iwl_dump_ini_mem_block_ranges,
|
||||
.get_size = iwl_dump_ini_mem_block_get_size,
|
||||
.fill_mem_hdr = iwl_dump_ini_mem_fill_header,
|
||||
.fill_range = iwl_dump_ini_prph_mac_block_iter,
|
||||
},
|
||||
[IWL_FW_INI_REGION_PERIPHERY_PHY_RANGE] = {
|
||||
.get_num_of_ranges = iwl_dump_ini_mem_block_ranges,
|
||||
.get_size = iwl_dump_ini_mem_block_get_size,
|
||||
.fill_mem_hdr = iwl_dump_ini_mem_fill_header,
|
||||
.fill_range = iwl_dump_ini_prph_phy_block_iter,
|
||||
},
|
||||
[IWL_FW_INI_REGION_PERIPHERY_AUX] = {},
|
||||
[IWL_FW_INI_REGION_PAGING] = {
|
||||
.fill_mem_hdr = iwl_dump_ini_mem_fill_header,
|
||||
@ -2510,7 +2579,8 @@ static u32 iwl_dump_ini_trigger(struct iwl_fw_runtime *fwrt,
|
||||
if (reg_type >= ARRAY_SIZE(iwl_dump_ini_region_ops))
|
||||
continue;
|
||||
|
||||
if (reg_type == IWL_FW_INI_REGION_PERIPHERY_PHY &&
|
||||
if ((reg_type == IWL_FW_INI_REGION_PERIPHERY_PHY ||
|
||||
reg_type == IWL_FW_INI_REGION_PERIPHERY_PHY_RANGE) &&
|
||||
tp_id != IWL_FW_INI_TIME_POINT_FW_ASSERT) {
|
||||
IWL_WARN(fwrt,
|
||||
"WRT: trying to collect phy prph at time point: %d, skipping\n",
|
||||
|
@ -975,4 +975,6 @@ static inline size_t _iwl_tlv_array_len(const struct iwl_ucode_tlv *tlv,
|
||||
_iwl_tlv_array_len((_tlv_ptr), sizeof(*(_struct_ptr)), \
|
||||
sizeof(_struct_ptr->_memb[0]))
|
||||
|
||||
#define iwl_tlv_array_len_with_size(_tlv_ptr, _struct_ptr, _size) \
|
||||
_iwl_tlv_array_len((_tlv_ptr), sizeof(*(_struct_ptr)), _size)
|
||||
#endif /* __iwl_fw_file_h__ */
|
||||
|
Loading…
x
Reference in New Issue
Block a user