History

gpu: host1x: handle the correct # of syncpt regs

BIT_WORD() truncates rather than rounds, so the loops in syncpt_thresh_isr() and _host1x_intr_disable_all_syncpt_intrs() use <= rather than < in an attempt to process the correct number of registers when rounding of the conversion of count of bits to count of words is necessary. However, when rounding isn't necessary because the value is already a multiple of the divisor (as is the case for all values of nb_pts the code actually sees), this causes one too many registers to be processed. Solve this by using and explicit DIV_ROUND_UP() call, rather than BIT_WORD(), and comparing with < rather than <=.

Stephen Warren committed 12 years ago

Commit 22bbd5d1 parent c9eaa441 file · +2 −2Browse files

Unified · Split

drivers/gpu/host1x/hw/intr_hw.c+2−2
@@ -47,7 +47,7 @@ static irqreturn_t syncpt_thresh_isr(int irq, void *dev_id) · 46 unmodified lines
4747 unsigned long reg;
4848 int i, id;
4949
50− for (i = 0; i <= BIT_WORD(host->info->nb_pts); i++) {
50+ for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); i++) {
5151 reg = host1x_sync_readl(host,
5252 HOST1X_SYNC_SYNCPT_THRESH_CPU0_INT_STATUS(i));
5353 for_each_set_bit(id, &reg, BITS_PER_LONG) {
@@ -64,7 +64,7 @@ static void _host1x_intr_disable_all_syncpt_intrs(struct host1x *host) · 10 unmodified lines
6464 {
6565 u32 i;
6666
67− for (i = 0; i <= BIT_WORD(host->info->nb_pts); ++i) {
67+ for (i = 0; i < DIV_ROUND_UP(host->info->nb_pts, 32); ++i) {
6868 host1x_sync_writel(host, 0xffffffffu,
6969 HOST1X_SYNC_SYNCPT_THRESH_INT_DISABLE(i));
7070 host1x_sync_writel(host, 0xffffffffu,