diff mbox series

[v5] media: mtk-vpu: Ensure alignment of 8 for DTCM buffer

Message ID 20211204144732.13472-1-dafna.hirschfeld@collabora.com (mailing list archive)
State New, archived
Headers show
Series [v5] media: mtk-vpu: Ensure alignment of 8 for DTCM buffer | expand

Commit Message

Dafna Hirschfeld Dec. 4, 2021, 2:47 p.m. UTC
From: Alexandre Courbot <acourbot@chromium.org>

When running memcpy_toio:
memcpy_toio(send_obj->share_buf, buf, len);
it was found that errors appear if len is not a multiple of 8:

[58.350841] mtk-mdp 14001000.rdma: processing failed: -22

This is because in ARM64, memcpy_toio does byte-size access
when the length is not a multiple of 8 while access to the
vpu iomem must be 4 aligned.

This patch ensures the copy of a multiple of 8 size by calling
round_up(len, 8) when copying

Fixes: e6599adfad30 ("media: mtk-vpu: avoid unaligned access to DTCM buffer.")
Signed-off-by: Alexandre Courbot <acourbot@chromium.org>
Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
Reviewed-by: Houlong Wei <houlong.wei@mediatek.com>
---
changes since v4:
1. replace data[SHARE_BUF_SIZE]; with data[sizeof(send_obj->share_buf)]
2. Add the explanation for the failure in commit log and inline doc

changes since v3:
1. multile -> multiple
2. add inline doc

changes since v2:
1. do the extra copy only if len is not multiple of 8

changes since v1:
1. change sign-off-by tags
2. change values to memset

 drivers/media/platform/mtk-vpu/mtk_vpu.c | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Comments

houlong.wei Dec. 6, 2021, 1:21 a.m. UTC | #1
cc mtk-vpu expert irui.wang.

On Sat, 2021-12-04 at 22:47 +0800, Dafna Hirschfeld wrote:
> From: Alexandre Courbot <acourbot@chromium.org>
> 
> When running memcpy_toio:
> memcpy_toio(send_obj->share_buf, buf, len);
> it was found that errors appear if len is not a multiple of 8:
> 
> [58.350841] mtk-mdp 14001000.rdma: processing failed: -22
> 
> This is because in ARM64, memcpy_toio does byte-size access
> when the length is not a multiple of 8 while access to the
> vpu iomem must be 4 aligned.
> 
> This patch ensures the copy of a multiple of 8 size by calling
> round_up(len, 8) when copying
> 
> Fixes: e6599adfad30 ("media: mtk-vpu: avoid unaligned access to DTCM
> buffer.")
> Signed-off-by: Alexandre Courbot <acourbot@chromium.org>
> Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
> Reviewed-by: Houlong Wei <houlong.wei@mediatek.com>
> ---
> changes since v4:
> 1. replace data[SHARE_BUF_SIZE]; with data[sizeof(send_obj-
> >share_buf)]
> 2. Add the explanation for the failure in commit log and inline doc
> 
> changes since v3:
> 1. multile -> multiple
> 2. add inline doc
> 
> changes since v2:
> 1. do the extra copy only if len is not multiple of 8
> 
> changes since v1:
> 1. change sign-off-by tags
> 2. change values to memset
> 
>  drivers/media/platform/mtk-vpu/mtk_vpu.c | 17 ++++++++++++++++-
>  1 file changed, 16 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/media/platform/mtk-vpu/mtk_vpu.c
> b/drivers/media/platform/mtk-vpu/mtk_vpu.c
> index 7f1647da0ade..2ef93db239b9 100644
> --- a/drivers/media/platform/mtk-vpu/mtk_vpu.c
> +++ b/drivers/media/platform/mtk-vpu/mtk_vpu.c
> @@ -349,7 +349,22 @@ int vpu_ipi_send(struct platform_device *pdev,
>  		}
>  	} while (vpu_cfg_readl(vpu, HOST_TO_VPU));
>  
> -	memcpy_toio(send_obj->share_buf, buf, len);
> +	/*
> +	 * On Arm64, the memcpy_toio does byte-size access as long as
> address or length are
> +	 * not 8 aligned. Access to the vpu iomem must be 4 aligned.
> Byte-size access is
> +	 * not allowed and cause processing to fail. Therefore make
> sure the length
> +	 * sent to memcpy_toio is a multiply of 8.
> +	 */
> +	if (len % 8 != 0) {
> +		unsigned char data[sizeof(send_obj->share_buf)];
> +
> +		memset(data + len, 0, sizeof(data) - len);
> +		memcpy(data, buf, len);
> +		memcpy_toio(send_obj->share_buf, data, round_up(len,
> 8));
> +	} else {
> +		memcpy_toio(send_obj->share_buf, buf, len);
> +	}
> +
>  	writel(len, &send_obj->len);
>  	writel(id, &send_obj->id);
>  
> -- 
> 2.17.1
>
Hans Verkuil Nov. 24, 2022, 8:42 a.m. UTC | #2
Hi Dafna, Houlong,

I am marking this patch as 'Obsoleted' in patchwork because there has been
no updates or comments and it is too old. If you believe this is still
needed, then please repost after rebasing it.

Regards,

	Hans

On 06/12/2021 02:21, houlong wei wrote:
> cc mtk-vpu expert irui.wang.
> 
> On Sat, 2021-12-04 at 22:47 +0800, Dafna Hirschfeld wrote:
>> From: Alexandre Courbot <acourbot@chromium.org>
>>
>> When running memcpy_toio:
>> memcpy_toio(send_obj->share_buf, buf, len);
>> it was found that errors appear if len is not a multiple of 8:
>>
>> [58.350841] mtk-mdp 14001000.rdma: processing failed: -22
>>
>> This is because in ARM64, memcpy_toio does byte-size access
>> when the length is not a multiple of 8 while access to the
>> vpu iomem must be 4 aligned.
>>
>> This patch ensures the copy of a multiple of 8 size by calling
>> round_up(len, 8) when copying
>>
>> Fixes: e6599adfad30 ("media: mtk-vpu: avoid unaligned access to DTCM
>> buffer.")
>> Signed-off-by: Alexandre Courbot <acourbot@chromium.org>
>> Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com>
>> Reviewed-by: Houlong Wei <houlong.wei@mediatek.com>
>> ---
>> changes since v4:
>> 1. replace data[SHARE_BUF_SIZE]; with data[sizeof(send_obj-
>>> share_buf)]
>> 2. Add the explanation for the failure in commit log and inline doc
>>
>> changes since v3:
>> 1. multile -> multiple
>> 2. add inline doc
>>
>> changes since v2:
>> 1. do the extra copy only if len is not multiple of 8
>>
>> changes since v1:
>> 1. change sign-off-by tags
>> 2. change values to memset
>>
>>  drivers/media/platform/mtk-vpu/mtk_vpu.c | 17 ++++++++++++++++-
>>  1 file changed, 16 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/media/platform/mtk-vpu/mtk_vpu.c
>> b/drivers/media/platform/mtk-vpu/mtk_vpu.c
>> index 7f1647da0ade..2ef93db239b9 100644
>> --- a/drivers/media/platform/mtk-vpu/mtk_vpu.c
>> +++ b/drivers/media/platform/mtk-vpu/mtk_vpu.c
>> @@ -349,7 +349,22 @@ int vpu_ipi_send(struct platform_device *pdev,
>>  		}
>>  	} while (vpu_cfg_readl(vpu, HOST_TO_VPU));
>>  
>> -	memcpy_toio(send_obj->share_buf, buf, len);
>> +	/*
>> +	 * On Arm64, the memcpy_toio does byte-size access as long as
>> address or length are
>> +	 * not 8 aligned. Access to the vpu iomem must be 4 aligned.
>> Byte-size access is
>> +	 * not allowed and cause processing to fail. Therefore make
>> sure the length
>> +	 * sent to memcpy_toio is a multiply of 8.
>> +	 */
>> +	if (len % 8 != 0) {
>> +		unsigned char data[sizeof(send_obj->share_buf)];
>> +
>> +		memset(data + len, 0, sizeof(data) - len);
>> +		memcpy(data, buf, len);
>> +		memcpy_toio(send_obj->share_buf, data, round_up(len,
>> 8));
>> +	} else {
>> +		memcpy_toio(send_obj->share_buf, buf, len);
>> +	}
>> +
>>  	writel(len, &send_obj->len);
>>  	writel(id, &send_obj->id);
>>  
>> -- 
>> 2.17.1
>>
diff mbox series

Patch

diff --git a/drivers/media/platform/mtk-vpu/mtk_vpu.c b/drivers/media/platform/mtk-vpu/mtk_vpu.c
index 7f1647da0ade..2ef93db239b9 100644
--- a/drivers/media/platform/mtk-vpu/mtk_vpu.c
+++ b/drivers/media/platform/mtk-vpu/mtk_vpu.c
@@ -349,7 +349,22 @@  int vpu_ipi_send(struct platform_device *pdev,
 		}
 	} while (vpu_cfg_readl(vpu, HOST_TO_VPU));
 
-	memcpy_toio(send_obj->share_buf, buf, len);
+	/*
+	 * On Arm64, the memcpy_toio does byte-size access as long as address or length are
+	 * not 8 aligned. Access to the vpu iomem must be 4 aligned. Byte-size access is
+	 * not allowed and cause processing to fail. Therefore make sure the length
+	 * sent to memcpy_toio is a multiply of 8.
+	 */
+	if (len % 8 != 0) {
+		unsigned char data[sizeof(send_obj->share_buf)];
+
+		memset(data + len, 0, sizeof(data) - len);
+		memcpy(data, buf, len);
+		memcpy_toio(send_obj->share_buf, data, round_up(len, 8));
+	} else {
+		memcpy_toio(send_obj->share_buf, buf, len);
+	}
+
 	writel(len, &send_obj->len);
 	writel(id, &send_obj->id);