Commit ccdc3d6d authored by Shahar S Matityahu's avatar Shahar S Matityahu Committed by Luca Coelho

iwlwifi: dbg_ini: maintain buffer allocations from trans instead of TLVs buffer

Maintain DRAM debug buffer status in trans instead of keeping it as
part of the TLVs buffer to avoid allocating extra space for it.
Needed for future changes.
Signed-off-by: default avatarShahar S Matityahu <shahar.s.matityahu@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 15995b75
...@@ -439,6 +439,7 @@ enum iwl_fw_ini_apply_point { ...@@ -439,6 +439,7 @@ enum iwl_fw_ini_apply_point {
* @IWL_FW_INI_ALLOCATION_ID_SDFX: for SDFX module * @IWL_FW_INI_ALLOCATION_ID_SDFX: for SDFX module
* @IWL_FW_INI_ALLOCATION_ID_FW_DUMP: used for crash and runtime dumps * @IWL_FW_INI_ALLOCATION_ID_FW_DUMP: used for crash and runtime dumps
* @IWL_FW_INI_ALLOCATION_ID_USER_DEFINED: for future user scenarios * @IWL_FW_INI_ALLOCATION_ID_USER_DEFINED: for future user scenarios
* @IWL_FW_INI_ALLOCATION_NUM: number of allocation ids
*/ */
enum iwl_fw_ini_allocation_id { enum iwl_fw_ini_allocation_id {
IWL_FW_INI_ALLOCATION_INVALID, IWL_FW_INI_ALLOCATION_INVALID,
...@@ -448,6 +449,7 @@ enum iwl_fw_ini_allocation_id { ...@@ -448,6 +449,7 @@ enum iwl_fw_ini_allocation_id {
IWL_FW_INI_ALLOCATION_ID_SDFX, IWL_FW_INI_ALLOCATION_ID_SDFX,
IWL_FW_INI_ALLOCATION_ID_FW_DUMP, IWL_FW_INI_ALLOCATION_ID_FW_DUMP,
IWL_FW_INI_ALLOCATION_ID_USER_DEFINED, IWL_FW_INI_ALLOCATION_ID_USER_DEFINED,
IWL_FW_INI_ALLOCATION_NUM,
}; /* FW_DEBUG_TLV_ALLOCATION_ID_E_VER_1 */ }; /* FW_DEBUG_TLV_ALLOCATION_ID_E_VER_1 */
/** /**
......
...@@ -2503,7 +2503,7 @@ iwl_fw_dbg_buffer_allocation(struct iwl_fw_runtime *fwrt, u32 size) ...@@ -2503,7 +2503,7 @@ iwl_fw_dbg_buffer_allocation(struct iwl_fw_runtime *fwrt, u32 size)
} }
static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt,
struct iwl_fw_ini_allocation_data *alloc, struct iwl_fw_ini_allocation_tlv *alloc,
enum iwl_fw_ini_apply_point pnt) enum iwl_fw_ini_apply_point pnt)
{ {
struct iwl_trans *trans = fwrt->trans; struct iwl_trans *trans = fwrt->trans;
...@@ -2518,7 +2518,14 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, ...@@ -2518,7 +2518,14 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt,
.len[0] = sizeof(ldbg_cmd), .len[0] = sizeof(ldbg_cmd),
}; };
int block_idx = trans->dbg.num_blocks; int block_idx = trans->dbg.num_blocks;
u32 buf_location = le32_to_cpu(alloc->tlv.buffer_location); u32 buf_location = le32_to_cpu(alloc->buffer_location);
u32 alloc_id = le32_to_cpu(alloc->allocation_id);
if (alloc_id <= IWL_FW_INI_ALLOCATION_INVALID ||
alloc_id >= IWL_FW_INI_ALLOCATION_NUM) {
IWL_ERR(fwrt, "WRT: Invalid allocation id %d\n", alloc_id);
return;
}
if (fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID) if (fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID)
fwrt->trans->dbg.ini_dest = buf_location; fwrt->trans->dbg.ini_dest = buf_location;
...@@ -2543,12 +2550,11 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, ...@@ -2543,12 +2550,11 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt,
if (buf_location != IWL_FW_INI_LOCATION_DRAM_PATH) if (buf_location != IWL_FW_INI_LOCATION_DRAM_PATH)
return; return;
if (!alloc->is_alloc) { if (!(BIT(alloc_id) & fwrt->trans->dbg.is_alloc)) {
iwl_fw_dbg_buffer_allocation(fwrt, iwl_fw_dbg_buffer_allocation(fwrt, le32_to_cpu(alloc->size));
le32_to_cpu(alloc->tlv.size));
if (block_idx == trans->dbg.num_blocks) if (block_idx == trans->dbg.num_blocks)
return; return;
alloc->is_alloc = 1; fwrt->trans->dbg.is_alloc |= BIT(alloc_id);
} }
/* First block is assigned via registers / context info */ /* First block is assigned via registers / context info */
...@@ -2561,9 +2567,9 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt, ...@@ -2561,9 +2567,9 @@ static void iwl_fw_dbg_buffer_apply(struct iwl_fw_runtime *fwrt,
cmd->num_frags = cpu_to_le32(1); cmd->num_frags = cpu_to_le32(1);
cmd->fragments[0].address = cmd->fragments[0].address =
cpu_to_le64(trans->dbg.fw_mon[block_idx].physical); cpu_to_le64(trans->dbg.fw_mon[block_idx].physical);
cmd->fragments[0].size = alloc->tlv.size; cmd->fragments[0].size = alloc->size;
cmd->allocation_id = alloc->tlv.allocation_id; cmd->allocation_id = alloc->allocation_id;
cmd->buffer_location = alloc->tlv.buffer_location; cmd->buffer_location = alloc->buffer_location;
iwl_trans_send_cmd(trans, &hcmd); iwl_trans_send_cmd(trans, &hcmd);
} }
...@@ -2788,20 +2794,15 @@ static void _iwl_fw_dbg_apply_point(struct iwl_fw_runtime *fwrt, ...@@ -2788,20 +2794,15 @@ static void _iwl_fw_dbg_apply_point(struct iwl_fw_runtime *fwrt,
case IWL_UCODE_TLV_TYPE_DEBUG_INFO: case IWL_UCODE_TLV_TYPE_DEBUG_INFO:
iwl_fw_dbg_info_apply(fwrt, ini_tlv, ext, pnt); iwl_fw_dbg_info_apply(fwrt, ini_tlv, ext, pnt);
break; break;
case IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION: { case IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION:
struct iwl_fw_ini_allocation_data *buf_alloc = ini_tlv;
if (pnt != IWL_FW_INI_APPLY_EARLY) { if (pnt != IWL_FW_INI_APPLY_EARLY) {
IWL_ERR(fwrt, IWL_ERR(fwrt,
"WRT: ext=%d. Invalid apply point %d for buffer allocation\n", "WRT: ext=%d. Invalid apply point %d for buffer allocation\n",
ext, pnt); ext, pnt);
goto next; goto next;
} }
iwl_fw_dbg_buffer_apply(fwrt, ini_tlv, pnt); iwl_fw_dbg_buffer_apply(fwrt, ini_tlv, pnt);
iter += sizeof(buf_alloc->is_alloc);
break; break;
}
case IWL_UCODE_TLV_TYPE_HCMD: case IWL_UCODE_TLV_TYPE_HCMD:
if (pnt < IWL_FW_INI_APPLY_AFTER_ALIVE) { if (pnt < IWL_FW_INI_APPLY_AFTER_ALIVE) {
IWL_ERR(fwrt, IWL_ERR(fwrt,
......
...@@ -227,15 +227,6 @@ struct iwl_fw_dbg { ...@@ -227,15 +227,6 @@ struct iwl_fw_dbg {
u32 dump_mask; u32 dump_mask;
}; };
/**
* @tlv: the buffer allocation tlv
* @is_alloc: indicates if the buffer was already allocated
*/
struct iwl_fw_ini_allocation_data {
struct iwl_fw_ini_allocation_tlv tlv;
u32 is_alloc;
} __packed;
/** /**
* struct iwl_fw_ini_active_triggers * struct iwl_fw_ini_active_triggers
* @active: is this trigger active * @active: is this trigger active
......
...@@ -85,14 +85,6 @@ void iwl_dbg_tlv_copy(struct iwl_trans *trans, struct iwl_ucode_tlv *tlv, ...@@ -85,14 +85,6 @@ void iwl_dbg_tlv_copy(struct iwl_trans *trans, struct iwl_ucode_tlv *tlv,
else else
data = &trans->dbg.apply_points[apply_point]; data = &trans->dbg.apply_points[apply_point];
/* add room for is_alloc field in &iwl_fw_ini_allocation_data struct */
if (le32_to_cpu(tlv->type) == IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION) {
struct iwl_fw_ini_allocation_data *buf_alloc =
(void *)tlv->data;
offset_size += sizeof(buf_alloc->is_alloc);
}
/* /*
* Make sure we still have room to copy this TLV. Offset points to the * Make sure we still have room to copy this TLV. Offset points to the
* location the last copy ended. * location the last copy ended.
...@@ -145,16 +137,6 @@ void iwl_dbg_tlv_alloc(struct iwl_trans *trans, size_t len, const u8 *data, ...@@ -145,16 +137,6 @@ void iwl_dbg_tlv_alloc(struct iwl_trans *trans, size_t len, const u8 *data,
if (WARN_ON(apply >= IWL_FW_INI_APPLY_NUM)) if (WARN_ON(apply >= IWL_FW_INI_APPLY_NUM))
continue; continue;
/* add room for is_alloc field in &iwl_fw_ini_allocation_data
* struct
*/
if (tlv_type == IWL_UCODE_TLV_TYPE_BUFFER_ALLOCATION) {
struct iwl_fw_ini_allocation_data *buf_alloc =
(void *)tlv->data;
size[apply] += sizeof(buf_alloc->is_alloc);
}
size[apply] += sizeof(*tlv) + tlv_len; size[apply] += sizeof(*tlv) + tlv_len;
} }
......
...@@ -695,6 +695,7 @@ struct iwl_self_init_dram { ...@@ -695,6 +695,7 @@ struct iwl_self_init_dram {
* @ini_valid: indicates if debug ini mode is on * @ini_valid: indicates if debug ini mode is on
* @num_blocks: number of blocks in fw_mon * @num_blocks: number of blocks in fw_mon
* @fw_mon: address of the buffers for firmware monitor * @fw_mon: address of the buffers for firmware monitor
* @is_alloc: bit i is set if buffer i was allocated
* @hw_error: equals true if hw error interrupt was received from the FW * @hw_error: equals true if hw error interrupt was received from the FW
* @ini_dest: debug monitor destination uses &enum iwl_fw_ini_buffer_location * @ini_dest: debug monitor destination uses &enum iwl_fw_ini_buffer_location
*/ */
...@@ -717,7 +718,8 @@ struct iwl_trans_debug { ...@@ -717,7 +718,8 @@ struct iwl_trans_debug {
struct iwl_apply_point_data apply_points_ext[IWL_FW_INI_APPLY_NUM]; struct iwl_apply_point_data apply_points_ext[IWL_FW_INI_APPLY_NUM];
int num_blocks; int num_blocks;
struct iwl_dram_data fw_mon[IWL_FW_INI_APPLY_NUM]; struct iwl_dram_data fw_mon[IWL_FW_INI_ALLOCATION_NUM];
u32 is_alloc;
bool hw_error; bool hw_error;
enum iwl_fw_ini_buffer_location ini_dest; enum iwl_fw_ini_buffer_location ini_dest;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment