Message ID | 20221027080217.6290-1-andrzej.p@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: rkvdec: Add required padding | expand |
Le jeudi 27 octobre 2022 à 10:02 +0200, Andrzej Pietrasiewicz a écrit : > The addresses of two elements of the segmap[][] member are passed to the > hardware which expects 128-bit aligned addresses. However, without this > patch offsetof(struct rkvdec_vp9_priv_tbl, segmap[0]) is an odd number > (2421) but the hardware just ignores the 5 least significant bits of the > address. As a result, the hardware writes the segmentation map to incorrect > locations. > > Inserting 11 bytes of padding corrects this situation by making the said > addresses divisible by 16 (i.e. aligned on a 128-bit boundary). > > Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> For backport purposes, perhaps add ? Fixes: f25709c4ff15 ("media: rkvdec: Add the VP9 backend") > --- > drivers/staging/media/rkvdec/rkvdec-vp9.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/staging/media/rkvdec/rkvdec-vp9.c b/drivers/staging/media/rkvdec/rkvdec-vp9.c > index d8c1c0db15c7..cfae99b40ccb 100644 > --- a/drivers/staging/media/rkvdec/rkvdec-vp9.c > +++ b/drivers/staging/media/rkvdec/rkvdec-vp9.c > @@ -84,6 +84,8 @@ struct rkvdec_vp9_probs { > struct rkvdec_vp9_inter_frame_probs inter; > struct rkvdec_vp9_intra_only_frame_probs intra_only; > }; > + /* 128 bit alignment */ > + u8 padding1[11]; > }; > > /* Data structure describing auxiliary buffer format. */ > @@ -1006,6 +1008,7 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx) > > ctx->priv = vp9_ctx; > > + BUILD_BUG_ON(sizeof(priv_tbl->probs) % 16); /* ensure probs size is 128-bit aligned */ > priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), > &vp9_ctx->priv_tbl.dma, GFP_KERNEL); > if (!priv_tbl) {
diff --git a/drivers/staging/media/rkvdec/rkvdec-vp9.c b/drivers/staging/media/rkvdec/rkvdec-vp9.c index d8c1c0db15c7..cfae99b40ccb 100644 --- a/drivers/staging/media/rkvdec/rkvdec-vp9.c +++ b/drivers/staging/media/rkvdec/rkvdec-vp9.c @@ -84,6 +84,8 @@ struct rkvdec_vp9_probs { struct rkvdec_vp9_inter_frame_probs inter; struct rkvdec_vp9_intra_only_frame_probs intra_only; }; + /* 128 bit alignment */ + u8 padding1[11]; }; /* Data structure describing auxiliary buffer format. */ @@ -1006,6 +1008,7 @@ static int rkvdec_vp9_start(struct rkvdec_ctx *ctx) ctx->priv = vp9_ctx; + BUILD_BUG_ON(sizeof(priv_tbl->probs) % 16); /* ensure probs size is 128-bit aligned */ priv_tbl = dma_alloc_coherent(rkvdec->dev, sizeof(*priv_tbl), &vp9_ctx->priv_tbl.dma, GFP_KERNEL); if (!priv_tbl) {
The addresses of two elements of the segmap[][] member are passed to the hardware which expects 128-bit aligned addresses. However, without this patch offsetof(struct rkvdec_vp9_priv_tbl, segmap[0]) is an odd number (2421) but the hardware just ignores the 5 least significant bits of the address. As a result, the hardware writes the segmentation map to incorrect locations. Inserting 11 bytes of padding corrects this situation by making the said addresses divisible by 16 (i.e. aligned on a 128-bit boundary). Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> --- drivers/staging/media/rkvdec/rkvdec-vp9.c | 3 +++ 1 file changed, 3 insertions(+)