msm: ipa3: fix to read hw tables from debugfs

Fix to IPA driver debugfs logic to read filtering
and routing directly from HW.

CRs-Fixed: 1020271
Change-Id: I6bb5f9a01e3f41107d7b5bdf7c19557546573463
Acked-by: Ady Abraham <adya@qti.qualcomm.com>
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
This commit is contained in:
Skylar Chang 2016-05-24 16:27:17 -07:00 committed by Kyle Yan
parent 57799c7a59
commit db200c1e6e
3 changed files with 38 additions and 10 deletions

View file

@ -694,6 +694,7 @@ static ssize_t ipa3_read_rt_hw(struct file *file, char __user *ubuf,
if (!entry) if (!entry)
return -ENOMEM; return -ENOMEM;
IPA_ACTIVE_CLIENTS_INC_SIMPLE();
mutex_lock(&ipa3_ctx->lock); mutex_lock(&ipa3_ctx->lock);
for (j = 0; j < num_tbls; j++) { for (j = 0; j < num_tbls; j++) {
pr_err("== NON HASHABLE TABLE tbl:%d ==\n", j); pr_err("== NON HASHABLE TABLE tbl:%d ==\n", j);
@ -742,6 +743,7 @@ static ssize_t ipa3_read_rt_hw(struct file *file, char __user *ubuf,
} }
mutex_unlock(&ipa3_ctx->lock); mutex_unlock(&ipa3_ctx->lock);
kfree(entry); kfree(entry);
IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
return 0; return 0;
} }
@ -866,6 +868,7 @@ static ssize_t ipa3_read_flt_hw(struct file *file, char __user *ubuf,
if (!entry) if (!entry)
return -ENOMEM; return -ENOMEM;
IPA_ACTIVE_CLIENTS_INC_SIMPLE();
mutex_lock(&ipa3_ctx->lock); mutex_lock(&ipa3_ctx->lock);
for (j = 0; j < ipa3_ctx->ipa_num_pipes; j++) { for (j = 0; j < ipa3_ctx->ipa_num_pipes; j++) {
if (!ipa_is_ep_support_flt(j)) if (!ipa_is_ep_support_flt(j))
@ -903,6 +906,7 @@ static ssize_t ipa3_read_flt_hw(struct file *file, char __user *ubuf,
} }
mutex_unlock(&ipa3_ctx->lock); mutex_unlock(&ipa3_ctx->lock);
kfree(entry); kfree(entry);
IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
return 0; return 0;
} }

View file

@ -1821,6 +1821,7 @@ int ipa3_flt_read_tbl_from_hw(u32 pipe_idx,
int rule_idx; int rule_idx;
u8 rule_size; u8 rule_size;
int i; int i;
void *ipa_sram_mmio;
IPADBG("pipe_idx=%d ip_type=%d hashable=%d\n", IPADBG("pipe_idx=%d ip_type=%d hashable=%d\n",
pipe_idx, ip_type, hashable); pipe_idx, ip_type, hashable);
@ -1837,6 +1838,18 @@ int ipa3_flt_read_tbl_from_hw(u32 pipe_idx,
return -EINVAL; return -EINVAL;
} }
/* map IPA SRAM */
ipa_sram_mmio = ioremap(ipa3_ctx->ipa_wrapper_base +
ipa3_ctx->ctrl->ipa_reg_base_ofst +
ipahal_get_reg_n_ofst(
IPA_SRAM_DIRECT_ACCESS_n,
0),
ipa3_ctx->smem_sz);
if (!ipa_sram_mmio) {
IPAERR("fail to ioremap IPA SRAM\n");
return -ENOMEM;
}
memset(entry, 0, sizeof(*entry) * (*num_entry)); memset(entry, 0, sizeof(*entry) * (*num_entry));
/* calculate the offset of the tbl entry */ /* calculate the offset of the tbl entry */
tbl_entry_idx = 1; /* to skip the bitmap */ tbl_entry_idx = 1; /* to skip the bitmap */
@ -1870,16 +1883,14 @@ int ipa3_flt_read_tbl_from_hw(u32 pipe_idx,
IPADBG("tbl_entry_in_hdr_ofst=0x%llx\n", tbl_entry_in_hdr_ofst); IPADBG("tbl_entry_in_hdr_ofst=0x%llx\n", tbl_entry_in_hdr_ofst);
tbl_entry_in_hdr = ipa3_ctx->mmio + tbl_entry_in_hdr = ipa_sram_mmio + tbl_entry_in_hdr_ofst;
ipahal_get_reg_n_ofst(IPA_SRAM_DIRECT_ACCESS_n, 0) +
tbl_entry_in_hdr_ofst;
/* for tables resides in DDR access it from the virtual memory */ /* for tables resides in DDR access it from the virtual memory */
if (*tbl_entry_in_hdr & 0x1) { if (*tbl_entry_in_hdr & 0x1) {
/* local */ /* local */
hdr = (void *)(tbl_entry_in_hdr - hdr = (void *)((u8 *)tbl_entry_in_hdr -
tbl_entry_idx * IPA_HW_TBL_HDR_WIDTH + tbl_entry_idx * IPA_HW_TBL_HDR_WIDTH +
(*tbl_entry_in_hdr - 1) * 16); (*tbl_entry_in_hdr - 1) / 16);
} else { } else {
/* system */ /* system */
if (hashable) if (hashable)
@ -1921,6 +1932,7 @@ int ipa3_flt_read_tbl_from_hw(u32 pipe_idx,
} }
*num_entry = rule_idx; *num_entry = rule_idx;
iounmap(ipa_sram_mmio);
return 0; return 0;
} }

View file

@ -1843,6 +1843,7 @@ int ipa3_rt_read_tbl_from_hw(u32 tbl_idx,
u8 *buf; u8 *buf;
int rule_idx; int rule_idx;
u8 rule_size; u8 rule_size;
void *ipa_sram_mmio;
IPADBG("tbl_idx=%d ip_type=%d hashable=%d\n", IPADBG("tbl_idx=%d ip_type=%d hashable=%d\n",
tbl_idx, ip_type, hashable); tbl_idx, ip_type, hashable);
@ -1857,6 +1858,18 @@ int ipa3_rt_read_tbl_from_hw(u32 tbl_idx,
return -EFAULT; return -EFAULT;
} }
/* map IPA SRAM */
ipa_sram_mmio = ioremap(ipa3_ctx->ipa_wrapper_base +
ipa3_ctx->ctrl->ipa_reg_base_ofst +
ipahal_get_reg_n_ofst(
IPA_SRAM_DIRECT_ACCESS_n,
0),
ipa3_ctx->smem_sz);
if (!ipa_sram_mmio) {
IPAERR("fail to ioremap IPA SRAM\n");
return -ENOMEM;
}
memset(entry, 0, sizeof(*entry) * (*num_entry)); memset(entry, 0, sizeof(*entry) * (*num_entry));
if (hashable) { if (hashable) {
if (ip_type == IPA_IP_v4) if (ip_type == IPA_IP_v4)
@ -1884,9 +1897,7 @@ int ipa3_rt_read_tbl_from_hw(u32 tbl_idx,
IPADBG("tbl_entry_in_hdr_ofst=0x%llx\n", tbl_entry_in_hdr_ofst); IPADBG("tbl_entry_in_hdr_ofst=0x%llx\n", tbl_entry_in_hdr_ofst);
tbl_entry_in_hdr = ipa3_ctx->mmio + tbl_entry_in_hdr = ipa_sram_mmio + tbl_entry_in_hdr_ofst;
ipahal_get_reg_n_ofst(IPA_SRAM_DIRECT_ACCESS_n, 0) +
tbl_entry_in_hdr_ofst;
/* for tables which reside in DDR access it from the virtual memory */ /* for tables which reside in DDR access it from the virtual memory */
if (!(*tbl_entry_in_hdr & 0x1)) { if (!(*tbl_entry_in_hdr & 0x1)) {
@ -1907,9 +1918,9 @@ int ipa3_rt_read_tbl_from_hw(u32 tbl_idx,
hdr = ipa3_ctx->empty_rt_tbl_mem.base; hdr = ipa3_ctx->empty_rt_tbl_mem.base;
} else { } else {
/* local */ /* local */
hdr = (void *)(tbl_entry_in_hdr - hdr = (void *)((u8 *)tbl_entry_in_hdr -
tbl_idx * IPA_HW_TBL_HDR_WIDTH + tbl_idx * IPA_HW_TBL_HDR_WIDTH +
(*tbl_entry_in_hdr - 1) * 16); (*tbl_entry_in_hdr - 1) / 16);
} }
IPADBG("*tbl_entry_in_hdr=0x%llx\n", *tbl_entry_in_hdr); IPADBG("*tbl_entry_in_hdr=0x%llx\n", *tbl_entry_in_hdr);
IPADBG("hdr=0x%p\n", hdr); IPADBG("hdr=0x%p\n", hdr);
@ -1941,6 +1952,7 @@ int ipa3_rt_read_tbl_from_hw(u32 tbl_idx,
} }
*num_entry = rule_idx; *num_entry = rule_idx;
iounmap(ipa_sram_mmio);
return 0; return 0;
} }