[PATCH 2/2] gpu: host1x: Fix bitshift/mask multipliers
Dmitry Osipenko
digetx at gmail.com
Wed Aug 2 11:06:17 UTC 2017
On 02.08.2017 12:55, Mikko Perttunen wrote:
> Some parts of Host1x uses BIT_WORD/BIT_MASK/BITS_PER_LONG to calculate
> register or field offsets. This worked fine on ARMv7, but now that
> BITS_PER_LONG is 64 but our registers are still 32-bit things are
> broken.
>
> Fix by replacing..
> - BIT_WORD with (x / 32)
> - BIT_MASK with BIT(x % 32)
> - BITS_PER_LONG with 32
>
> Signed-off-by: Mikko Perttunen <mperttunen at nvidia.com>
> ---
> drivers/gpu/host1x/hw/intr_hw.c | 24 ++++++++++++------------
> drivers/gpu/host1x/hw/syncpt_hw.c | 2 +-
> 2 files changed, 13 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/host1x/hw/intr_hw.c b/drivers/gpu/host1x/hw/intr_hw.c
> index dacb8009a605..37ebb51703fa 100644
> --- a/drivers/gpu/host1x/hw/intr_hw.c
> +++ b/drivers/gpu/host1x/hw/intr_hw.c
> @@ -33,10 +33,10 @@ static void host1x_intr_syncpt_handle(struct host1x_syncpt *syncpt)
> unsigned int id = syncpt->id;
> struct host1x *host = syncpt->host;
>
> - host1x_sync_writel(host, BIT_MASK(id),
> - HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(BIT_WORD(id)));
> - host1x_sync_writel(host, BIT_MASK(id),
> - HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(BIT_WORD(id)));
> + host1x_sync_writel(host, BIT(id % 32),
> + HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(id / 32));
> + host1x_sync_writel(host, BIT(id % 32),
> + HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(id / 32));
>
> schedule_work(&syncpt->intr.work);
> }
> @@ -50,9 +50,9 @@ static irqreturn_t syncpt_thresh_isr(int irq, void *dev_id)
> for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); i++) {
> reg = host1x_sync_readl(host,
> HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(i));
> - for_each_set_bit(id, ®, BITS_PER_LONG) {
> + for_each_set_bit(id, ®, 32) {
> struct host1x_syncpt *syncpt =
> - host->syncpt + (i * BITS_PER_LONG + id);
> + host->syncpt + (i * 32 + id);
> host1x_intr_syncpt_handle(syncpt);
> }
> }
> @@ -117,17 +117,17 @@ static void _host1x_intr_set_syncpt_threshold(struct host1x *host,
> static void _host1x_intr_enable_syncpt_intr(struct host1x *host,
> unsigned int id)
> {
> - host1x_sync_writel(host, BIT_MASK(id),
> - HOST1X_SYNC_SYNCPT_THRESH_INT_ENABLE_CPU0(BIT_WORD(id)));
> + host1x_sync_writel(host, BIT(id % 32),
> + HOST1X_SYNC_SYNCPT_THRESH_INT_ENABLE_CPU0(id / 32));
> }
>
> static void _host1x_intr_disable_syncpt_intr(struct host1x *host,
> unsigned int id)
> {
> - host1x_sync_writel(host, BIT_MASK(id),
> - HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(BIT_WORD(id)));
> - host1x_sync_writel(host, BIT_MASK(id),
> - HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(BIT_WORD(id)));
> + host1x_sync_writel(host, BIT(id % 32),
> + HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(id / 32));
> + host1x_sync_writel(host, BIT(id % 32),
> + HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(id / 32));
> }
>
> static int _host1x_free_syncpt_irq(struct host1x *host)
> diff --git a/drivers/gpu/host1x/hw/syncpt_hw.c b/drivers/gpu/host1x/hw/syncpt_hw.c
> index c93f74fcce72..7b0270d60742 100644
> --- a/drivers/gpu/host1x/hw/syncpt_hw.c
> +++ b/drivers/gpu/host1x/hw/syncpt_hw.c
> @@ -89,7 +89,7 @@ static int syncpt_cpu_incr(struct host1x_syncpt *sp)
> host1x_syncpt_idle(sp))
> return -EINVAL;
>
> - host1x_sync_writel(host, BIT_MASK(sp->id),
> + host1x_sync_writel(host, BIT(sp->id % 32),
> HOST1X_SYNC_SYNCPT_CPU_INCR(reg_offset));
> wmb();
>
>
Reviewed-by: Dmitry Osipenko <digetx at gmail.com>
Tested-by: Dmitry Osipenko <digetx at gmail.com>
--
Dmitry
More information about the dri-devel
mailing list