freedreno/a6xx: fix OUT_REG() vs growable cmdstream
authorRob Clark <robdclark@chromium.org>
Sat, 14 Dec 2019 17:09:08 +0000 (09:09 -0800)
committerRob Clark <robdclark@chromium.org>
Sat, 14 Dec 2019 17:12:39 +0000 (09:12 -0800)
BEGIN_RING() could decide we can't fit the next packet in the current
cmdstream segment, and grow a new segment.  So we need to grab ring->cur
*after* BEGIN_RING(), otherwise we are writing cmdstream past the end of
the previous segment.

Fixes: bdd98b892f3 ("freedreno: New struct packing macros")
Signed-off-by: Rob Clark <robdclark@chromium.org>
src/gallium/drivers/freedreno/a6xx/fd6_pack.h

index 84b232e74a2d8a4e038ef5148945293f7a16a0d4..f5f8e2ca5f7b663077c7f8041e402ca403bb6cb5 100644 (file)
@@ -76,12 +76,12 @@ struct fd_reg_pair {
        do {                                                                                                    \
                const struct fd_reg_pair regs[] = { __VA_ARGS__ };      \
                unsigned count = ARRAY_SIZE(regs);                                      \
-               uint32_t *p = ring->cur;                                                        \
                                                                                                                        \
                STATIC_ASSERT(count > 0);                                                       \
                STATIC_ASSERT(count <= 16);                                                     \
                                                                                                                        \
                BEGIN_RING(ring, count + 1);                                            \
+               uint32_t *p = ring->cur;                                                        \
                *p++ = CP_TYPE4_PKT | count |                                           \
                        (_odd_parity_bit(count) << 7) |                                 \
                        ((regs[0].reg & 0x3ffff) << 8) |                                \