Commit 7494f980 authored by Rahul Lakkireddy's avatar Rahul Lakkireddy Committed by David S. Miller

cxgb4: speed up on-chip memory read

Use readq() (via t4_read_reg64()) to read 64-bits at a time.
Read residual in 32-bit multiples.
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarGanesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1a4330cd
...@@ -884,7 +884,8 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win, ...@@ -884,7 +884,8 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win,
u32 win_pf, memoffset, mem_aperture, mem_base; u32 win_pf, memoffset, mem_aperture, mem_base;
struct adapter *adap = pdbg_init->adap; struct adapter *adap = pdbg_init->adap;
u32 pos, offset, resid; u32 pos, offset, resid;
u32 *buf; u32 *res_buf;
u64 *buf;
int ret; int ret;
/* Argument sanity checks ... /* Argument sanity checks ...
...@@ -892,10 +893,10 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win, ...@@ -892,10 +893,10 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win,
if (addr & 0x3 || (uintptr_t)hbuf & 0x3) if (addr & 0x3 || (uintptr_t)hbuf & 0x3)
return -EINVAL; return -EINVAL;
buf = (u32 *)hbuf; buf = (u64 *)hbuf;
/* Try to do 32-bit reads. Residual will be handled later. */ /* Try to do 64-bit reads. Residual will be handled later. */
resid = len & 0x3; resid = len & 0x7;
len -= resid; len -= resid;
ret = t4_memory_rw_init(adap, win, mtype, &memoffset, &mem_base, ret = t4_memory_rw_init(adap, win, mtype, &memoffset, &mem_base,
...@@ -916,10 +917,28 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win, ...@@ -916,10 +917,28 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win,
/* Transfer data from the adapter */ /* Transfer data from the adapter */
while (len > 0) { while (len > 0) {
*buf++ = le32_to_cpu((__force __le32) *buf++ = le64_to_cpu((__force __le64)
t4_read_reg64(adap, mem_base + offset));
offset += sizeof(u64);
len -= sizeof(u64);
/* If we've reached the end of our current window aperture,
* move the PCI-E Memory Window on to the next.
*/
if (offset == mem_aperture) {
pos += mem_aperture;
offset = 0;
t4_memory_update_win(adap, win, pos | win_pf);
}
}
res_buf = (u32 *)buf;
/* Read residual in 32-bit multiples */
while (resid > sizeof(u32)) {
*res_buf++ = le32_to_cpu((__force __le32)
t4_read_reg(adap, mem_base + offset)); t4_read_reg(adap, mem_base + offset));
offset += sizeof(u32); offset += sizeof(u32);
len -= sizeof(u32); resid -= sizeof(u32);
/* If we've reached the end of our current window aperture, /* If we've reached the end of our current window aperture,
* move the PCI-E Memory Window on to the next. * move the PCI-E Memory Window on to the next.
...@@ -931,10 +950,10 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win, ...@@ -931,10 +950,10 @@ static int cudbg_memory_read(struct cudbg_init *pdbg_init, int win,
} }
} }
/* Transfer residual */ /* Transfer residual < 32-bits */
if (resid) if (resid)
t4_memory_rw_residual(adap, resid, mem_base + offset, t4_memory_rw_residual(adap, resid, mem_base + offset,
(u8 *)buf, T4_MEMORY_READ); (u8 *)res_buf, T4_MEMORY_READ);
return 0; return 0;
} }
......
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