Thread (9 messages) 9 messages, 2 authors, 2019-08-05

Re: [PATCH v13 2/5] remoteproc/mediatek: add SCP support for mt8183

From: Pi-Hsun Shih <hidden>
Date: 2019-08-05 10:32:06
Also in: linux-mediatek, linux-remoteproc, lkml

Thanks for the review. I'll address most of the comments in the next version.

On Mon, Jul 22, 2019 at 5:37 PM Alexandre Courbot [off-list ref] wrote:
Hi Pi-Hsun,

On Tue, Jul 9, 2019 at 4:27 PM Pi-Hsun Shih [off-list ref] wrote:
quoted
+static void *scp_da_to_va(struct rproc *rproc, u64 da, int len)
+{
+       struct mtk_scp *scp = (struct mtk_scp *)rproc->priv;
+       int offset;
+
+       if (da < scp->sram_size) {
+               offset = da;
+               if (offset >= 0 && ((offset + len) < scp->sram_size))
+                       return (__force void *)(scp->sram_base + offset);
+       } else if (da >= scp->sram_size &&
+                  da < (scp->sram_size + MAX_CODE_SIZE)) {
+               offset = da;
This line looks suspicious. Shouldn't it be

    offset = da - scp->sram_size?
Actually the whole "else if (...)" is not used. Would remove this in
next version.
quoted
+
+/*
+ * Copy src to dst, where dst is in SCP SRAM region.
+ * Since AP access of SCP SRAM don't support byte write, this always write a
+ * full word at a time, and may cause some extra bytes to be written at the
+ * beginning & ending of dst.
+ */
+void scp_memcpy_aligned(void *dst, const void *src, unsigned int len)
+{
+       void *ptr;
+       u32 val;
+       unsigned int i = 0;
+
+       if (!IS_ALIGNED((unsigned long)dst, 4)) {
+               ptr = (void *)ALIGN_DOWN((unsigned long)dst, 4);
+               i = 4 - (dst - ptr);
+               val = readl_relaxed(ptr);
+               memcpy((u8 *)&val + (4 - i), src, i);
+               writel_relaxed(val, ptr);
+       }
+
+       while (i + 4 <= len) {
+               val = *((u32 *)(src + i));
+               writel_relaxed(val, dst + i);
If dst is not aligned to 4, this is going to write to an address that
is not a multiple of 4, even though it writes a long. Is this ok?
Typically limitations in write size come with alignment limitations.
If dst is not aligned to 4, the first if (!IS_ALIGNED(...)) block
should make that the (dst + i) is a multiple of 4, so the write here
is aligned.
quoted
+               i += 4;
+       }
+       if (i < len) {
+               val = readl_relaxed(dst + i);
+               memcpy(&val, src + i, len - i);
+               writel_relaxed(val, dst + i);
+       }
+}
+EXPORT_SYMBOL_GPL(scp_memcpy_aligned);
IIUC this function's symbol does not need to be exported since it is
only used in the current kernel module.
I've tried to remove this EXPORT line, but then there would be error
while compiling:
ERROR: "scp_memcpy_aligned" [drivers/remoteproc/mtk_scp.ko] undefined!
I think it's because the mtk_scp.c and mtk_scp_ipi.c both use the
scp_memcpy_aligned, but is compiled as separate .o files. So the
EXPORT_SYMBOL is needed.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help