mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 14:33:24 -04:00
wifi: ath12k: refactor QMI memory assignment
ath12k_qmi_assign_target_mem_chunk() uses a large switch-case to handle both memory region identification and allocation for each memory request type, leading to redundant allocation logic. Refactor this by introducing ath12k_qmi_get_mem_reg_name() to map memory request types to their corresponding reserved memory region names. Tested-on: IPQ5332 hw1.0 AHB WLAN.WBE.1.6-01275-QCAHKSWPL_SILICONZ-1 Reviewed-by: Rameshkumar Sundaram <rameshkumar.sundaram@oss.qualcomm.com> Reviewed-by: Baochen Qiang <baochen.qiang@oss.qualcomm.com> Signed-off-by: Aaradhana Sahu <aaradhana.sahu@oss.qualcomm.com> Link: https://patch.msgid.link/20260630062048.1615178-3-aaradhana.sahu@oss.qualcomm.com Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
This commit is contained in:
committed by
Jeff Johnson
parent
3fe59edd19
commit
ecb517f97e
@@ -2777,120 +2777,85 @@ static int ath12k_qmi_alloc_target_mem_chunk(struct ath12k_base *ab)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const char *ath12k_qmi_get_mem_reg_name(int mem_type)
|
||||
{
|
||||
switch (mem_type) {
|
||||
case HOST_DDR_REGION_TYPE:
|
||||
case BDF_MEM_REGION_TYPE:
|
||||
return "q6-region";
|
||||
case M3_DUMP_REGION_TYPE:
|
||||
return "m3-dump";
|
||||
case CALDB_MEM_REGION_TYPE:
|
||||
return "q6-caldb";
|
||||
case MLO_GLOBAL_MEM_REGION_TYPE:
|
||||
return "mlo-global-mem";
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static int ath12k_qmi_assign_target_mem_chunk(struct ath12k_base *ab)
|
||||
{
|
||||
struct device_node *np = ab->dev->of_node;
|
||||
struct target_mem_chunk *chunk;
|
||||
size_t avail_rmem_size;
|
||||
struct resource res;
|
||||
const char *rname;
|
||||
int i, idx, ret;
|
||||
|
||||
for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
|
||||
switch (ab->qmi.target_mem[i].type) {
|
||||
case HOST_DDR_REGION_TYPE:
|
||||
ret = of_reserved_mem_region_to_resource_byname(np, "q6-region",
|
||||
&res);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
avail_rmem_size = resource_size(&res);
|
||||
if (avail_rmem_size < ab->qmi.target_mem[i].size) {
|
||||
ath12k_dbg(ab, ATH12K_DBG_QMI,
|
||||
"failed to assign mem type %u req size %u avail size %zu\n",
|
||||
ab->qmi.target_mem[i].type,
|
||||
ab->qmi.target_mem[i].size,
|
||||
avail_rmem_size);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ab->qmi.target_mem[idx].paddr = res.start;
|
||||
ab->qmi.target_mem[idx].v.ioaddr =
|
||||
ioremap(ab->qmi.target_mem[idx].paddr,
|
||||
ab->qmi.target_mem[i].size);
|
||||
if (!ab->qmi.target_mem[idx].v.ioaddr) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
|
||||
ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
|
||||
idx++;
|
||||
break;
|
||||
case BDF_MEM_REGION_TYPE:
|
||||
ret = of_reserved_mem_region_to_resource_byname(np, "q6-region",
|
||||
&res);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
avail_rmem_size = resource_size(&res) -
|
||||
ab->hw_params->bdf_addr_offset;
|
||||
if (avail_rmem_size < ab->qmi.target_mem[i].size) {
|
||||
ath12k_dbg(ab, ATH12K_DBG_QMI,
|
||||
"failed to assign mem type %u req size %u avail size %zu\n",
|
||||
ab->qmi.target_mem[i].type,
|
||||
ab->qmi.target_mem[i].size,
|
||||
avail_rmem_size);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
ab->qmi.target_mem[idx].paddr =
|
||||
res.start + ab->hw_params->bdf_addr_offset;
|
||||
ab->qmi.target_mem[idx].v.ioaddr =
|
||||
ioremap(ab->qmi.target_mem[idx].paddr,
|
||||
ab->qmi.target_mem[i].size);
|
||||
if (!ab->qmi.target_mem[idx].v.ioaddr) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
|
||||
ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
|
||||
idx++;
|
||||
break;
|
||||
case CALDB_MEM_REGION_TYPE:
|
||||
/* Cold boot calibration is not enabled in Ath12k. Hence,
|
||||
chunk = &ab->qmi.target_mem[i];
|
||||
if (chunk->type == CALDB_MEM_REGION_TYPE) {
|
||||
/*
|
||||
* Cold boot calibration is not enabled in Ath12k. Hence,
|
||||
* assign paddr = 0.
|
||||
* Once cold boot calibration is enabled add support to
|
||||
* assign reserved memory from DT.
|
||||
*/
|
||||
ab->qmi.target_mem[idx].paddr = 0;
|
||||
ab->qmi.target_mem[idx].v.ioaddr = NULL;
|
||||
ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
|
||||
ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
|
||||
ab->qmi.target_mem[idx].size = chunk->size;
|
||||
ab->qmi.target_mem[idx].type = chunk->type;
|
||||
idx++;
|
||||
break;
|
||||
case M3_DUMP_REGION_TYPE:
|
||||
ret = of_reserved_mem_region_to_resource_byname(np, "m3-dump",
|
||||
&res);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
avail_rmem_size = resource_size(&res);
|
||||
if (avail_rmem_size < ab->qmi.target_mem[i].size) {
|
||||
ath12k_dbg(ab, ATH12K_DBG_QMI,
|
||||
"failed to assign mem type %u req size %u avail size %zu\n",
|
||||
ab->qmi.target_mem[i].type,
|
||||
ab->qmi.target_mem[i].size,
|
||||
avail_rmem_size);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ab->qmi.target_mem[idx].paddr = res.start;
|
||||
ab->qmi.target_mem[idx].v.ioaddr =
|
||||
ioremap(ab->qmi.target_mem[idx].paddr,
|
||||
ab->qmi.target_mem[i].size);
|
||||
if (!ab->qmi.target_mem[idx].v.ioaddr) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
|
||||
ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
|
||||
idx++;
|
||||
break;
|
||||
default:
|
||||
ath12k_warn(ab, "qmi ignore invalid mem req type %u\n",
|
||||
ab->qmi.target_mem[i].type);
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
rname = ath12k_qmi_get_mem_reg_name(chunk->type);
|
||||
if (!rname) {
|
||||
ath12k_warn(ab, "qmi ignore invalid mem req type %u\n",
|
||||
chunk->type);
|
||||
continue;
|
||||
}
|
||||
|
||||
ret = of_reserved_mem_region_to_resource_byname(np, rname, &res);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
avail_rmem_size = resource_size(&res);
|
||||
if (chunk->type == BDF_MEM_REGION_TYPE) {
|
||||
avail_rmem_size -= ab->hw_params->bdf_addr_offset;
|
||||
res.start += ab->hw_params->bdf_addr_offset;
|
||||
}
|
||||
|
||||
if (avail_rmem_size < chunk->size) {
|
||||
ath12k_dbg(ab, ATH12K_DBG_QMI,
|
||||
"failed to assign mem type %u req size %u avail size %zu\n",
|
||||
chunk->type, chunk->size, avail_rmem_size);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ab->qmi.target_mem[idx].paddr = res.start;
|
||||
ab->qmi.target_mem[idx].v.ioaddr = ioremap(ab->qmi.target_mem[idx].paddr,
|
||||
chunk->size);
|
||||
if (!ab->qmi.target_mem[idx].v.ioaddr) {
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ab->qmi.target_mem[idx].size = chunk->size;
|
||||
ab->qmi.target_mem[idx].type = chunk->type;
|
||||
idx++;
|
||||
}
|
||||
ab->qmi.mem_seg_count = idx;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user