From 3fa2ce08907d0ed02b24e79b5ecf8d5fceeb13fa Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Sun, 1 Jan 2023 12:40:41 -0800 Subject: [PATCH] freedreno/registers: Fix bo fields with low != 0 We need to add the missing left-shift. And a right-shift is negative! Signed-off-by: Rob Clark Part-of: --- src/freedreno/registers/gen_header.py | 3 ++- src/freedreno/vulkan/tu_cs.h | 2 ++ src/gallium/drivers/freedreno/a6xx/fd6_pack.h | 6 ++++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/freedreno/registers/gen_header.py b/src/freedreno/registers/gen_header.py index 06c35578e2b..0fd58121264 100644 --- a/src/freedreno/registers/gen_header.py +++ b/src/freedreno/registers/gen_header.py @@ -193,7 +193,8 @@ class Bitset(object): if f.type == "waddress": print(" .bo_write = true,") print(" .bo_offset = fields.bo_offset,") - print(" .bo_shift = %d" % address.shr) + print(" .bo_shift = %d," % address.shr) + print(" .bo_low = %d," % address.low) print(" };\n}\n") diff --git a/src/freedreno/vulkan/tu_cs.h b/src/freedreno/vulkan/tu_cs.h index 4ba64da40f3..fb78f167223 100644 --- a/src/freedreno/vulkan/tu_cs.h +++ b/src/freedreno/vulkan/tu_cs.h @@ -457,6 +457,7 @@ struct tu_reg_value { bool bo_write; uint32_t bo_offset; uint32_t bo_shift; + uint32_t bo_low; }; #define fd_reg_pair tu_reg_value @@ -479,6 +480,7 @@ struct tu_reg_value { if (regs[i].bo) { \ uint64_t v = regs[i].bo->iova + regs[i].bo_offset; \ v >>= regs[i].bo_shift; \ + v <<= regs[i].bo_low; \ v |= regs[i].value; \ \ *p++ = v; \ diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_pack.h b/src/gallium/drivers/freedreno/a6xx/fd6_pack.h index f6d1fbf092a..752a3e2920d 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_pack.h +++ b/src/gallium/drivers/freedreno/a6xx/fd6_pack.h @@ -34,6 +34,7 @@ struct fd_reg_pair { bool bo_write; uint32_t bo_offset; uint32_t bo_shift; + uint32_t bo_low; }; #define __bo_type struct fd_bo * @@ -62,8 +63,9 @@ struct fd_reg_pair { __assert_eq(regs[0].reg + i, regs[i].reg); \ if (regs[i].bo) { \ uint64_t *p64 = (uint64_t *)p; \ - *p64 = __reloc_iova(regs[i].bo, regs[i].bo_offset, regs[i].value, \ - regs[i].bo_shift); \ + *p64 = (__reloc_iova(regs[i].bo, regs[i].bo_offset, 0, \ + -regs[i].bo_shift) << regs[i].bo_low) | \ + regs[i].value; \ p += 2; \ fd_ringbuffer_attach_bo(ring, regs[i].bo); \ } else { \