[PATCH v2 3/5] drm/rockchip: vop: introduce VOP_REG_MASK
Tomasz Figa
tfiga at chromium.org
Thu Jun 2 07:19:23 UTC 2016
Hi Mark,
Mark Yao <mark.yao <at> rock-chips.com> writes:
>
> Some new vop register support mask, bit[16-31] is mask,
> bit[0-15] is value, the mask is correspond to the value.
Please see my comments inline.
>
> Signed-off-by: Mark Yao <mark.yao <at> rock-chips.com>
> ---
> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 45 ++++++++++++++-------
------
> drivers/gpu/drm/rockchip/rockchip_drm_vop.h | 1 +
> drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 9 +++++-
> 3 files changed, 32 insertions(+), 23 deletions(-)
>
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> index 28596e7..59f24cd 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c
[snip]
> -static inline void vop_mask_write_relaxed(struct vop *vop, uint32_t
offset,
> - uint32_t mask, uint32_t v)
> -{
> - if (mask) {
> + if (write_mask) {
> + v = (v << shift) | (mask << (shift + 16));
If the caller gives "v" too big, it might get over the bit 16 and affect
the mask. IMHO it would be much safer to mask (v << shift) with 0xffff
just in case.
> + } else {
> uint32_t cached_val = vop->regsbak[offset >> 2];
>
> - cached_val = (cached_val & ~mask) | v;
> - writel_relaxed(cached_val, vop->regs + offset);
> - vop->regsbak[offset >> 2] = cached_val;
> + v = (cached_val & ~(mask << shift)) | (v << shift);
Should we also mask "v" with "mask" for better safety?
Best regards,
Tomasz
More information about the dri-devel
mailing list