Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/vc4: tests: Fail the current test if we access a register

Accessing a register when running under kunit is a bad idea since our
device is completely mocked.

Fail the current test if we ever access any of our hardware registers.

Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Reviewed-by: Maíra Canal <mcanal@igalia.com>
Link: https://lore.kernel.org/r/20221123-rpi-kunit-tests-v3-18-4615a663a84a@cerno.tech
Signed-off-by: Maxime Ripard <maxime@cerno.tech>

+81 -13
+11 -2
drivers/gpu/drm/vc4/vc4_crtc.c
··· 50 50 51 51 #define HVS_FIFO_LATENCY_PIX 6 52 52 53 - #define CRTC_WRITE(offset, val) writel(val, vc4_crtc->regs + (offset)) 54 - #define CRTC_READ(offset) readl(vc4_crtc->regs + (offset)) 53 + #define CRTC_WRITE(offset, val) \ 54 + do { \ 55 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 56 + writel(val, vc4_crtc->regs + (offset)); \ 57 + } while (0) 58 + 59 + #define CRTC_READ(offset) \ 60 + ({ \ 61 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 62 + readl(vc4_crtc->regs + (offset)); \ 63 + }) 55 64 56 65 static const struct debugfs_reg32 crtc_regs[] = { 57 66 VC4_REG32(PV_CONTROL),
+11 -2
drivers/gpu/drm/vc4/vc4_dpi.c
··· 103 103 return container_of(encoder, struct vc4_dpi, encoder.base); 104 104 } 105 105 106 - #define DPI_READ(offset) readl(dpi->regs + (offset)) 107 - #define DPI_WRITE(offset, val) writel(val, dpi->regs + (offset)) 106 + #define DPI_READ(offset) \ 107 + ({ \ 108 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 109 + readl(dpi->regs + (offset)); \ 110 + }) 111 + 112 + #define DPI_WRITE(offset, val) \ 113 + do { \ 114 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 115 + writel(val, dpi->regs + (offset)); \ 116 + } while (0) 108 117 109 118 static const struct debugfs_reg32 dpi_regs[] = { 110 119 VC4_REG32(DPI_C),
+25 -4
drivers/gpu/drm/vc4/vc4_drv.h
··· 19 19 #include <drm/drm_mm.h> 20 20 #include <drm/drm_modeset_lock.h> 21 21 22 + #include <kunit/test-bug.h> 23 + 22 24 #include "uapi/drm/vc4_drm.h" 23 25 24 26 struct drm_device; ··· 647 645 return container_of(crtc_state, struct vc4_crtc_state, base); 648 646 } 649 647 650 - #define V3D_READ(offset) readl(vc4->v3d->regs + offset) 651 - #define V3D_WRITE(offset, val) writel(val, vc4->v3d->regs + offset) 652 - #define HVS_READ(offset) readl(hvs->regs + offset) 653 - #define HVS_WRITE(offset, val) writel(val, hvs->regs + offset) 648 + #define V3D_READ(offset) \ 649 + ({ \ 650 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 651 + readl(vc4->v3d->regs + (offset)); \ 652 + }) 653 + 654 + #define V3D_WRITE(offset, val) \ 655 + do { \ 656 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 657 + writel(val, vc4->v3d->regs + (offset)); \ 658 + } while (0) 659 + 660 + #define HVS_READ(offset) \ 661 + ({ \ 662 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 663 + readl(hvs->regs + (offset)); \ 664 + }) 665 + 666 + #define HVS_WRITE(offset, val) \ 667 + do { \ 668 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 669 + writel(val, hvs->regs + (offset)); \ 670 + } while (0) 654 671 655 672 #define VC4_REG32(reg) { .name = #reg, .offset = reg } 656 673
+8 -1
drivers/gpu/drm/vc4/vc4_dsi.c
··· 617 617 dma_cookie_t cookie; 618 618 int ret; 619 619 620 + kunit_fail_current_test("Accessing a register in a unit test!\n"); 621 + 620 622 /* DSI0 should be able to write normally. */ 621 623 if (!chan) { 622 624 writel(val, dsi->regs + offset); ··· 647 645 DRM_ERROR("Failed to wait for DMA: %d\n", ret); 648 646 } 649 647 650 - #define DSI_READ(offset) readl(dsi->regs + (offset)) 648 + #define DSI_READ(offset) \ 649 + ({ \ 650 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 651 + readl(dsi->regs + (offset)); \ 652 + }) 653 + 651 654 #define DSI_WRITE(offset, val) dsi_dma_workaround_write(dsi, offset, val) 652 655 #define DSI_PORT_READ(offset) \ 653 656 DSI_READ(dsi->variant->port ? DSI1_##offset : DSI0_##offset)
+4
drivers/gpu/drm/vc4/vc4_hdmi_regs.h
··· 456 456 457 457 WARN_ON(pm_runtime_status_suspended(&hdmi->pdev->dev)); 458 458 459 + kunit_fail_current_test("Accessing an HDMI register in a unit test!\n"); 460 + 459 461 if (reg >= variant->num_registers) { 460 462 dev_warn(&hdmi->pdev->dev, 461 463 "Invalid register ID %u\n", reg); ··· 487 485 lockdep_assert_held(&hdmi->hw_lock); 488 486 489 487 WARN_ON(pm_runtime_status_suspended(&hdmi->pdev->dev)); 488 + 489 + kunit_fail_current_test("Accessing an HDMI register in a unit test!\n"); 490 490 491 491 if (reg >= variant->num_registers) { 492 492 dev_warn(&hdmi->pdev->dev,
+11 -2
drivers/gpu/drm/vc4/vc4_txp.c
··· 145 145 /* Number of lines received and committed to memory. */ 146 146 #define TXP_PROGRESS 0x10 147 147 148 - #define TXP_READ(offset) readl(txp->regs + (offset)) 149 - #define TXP_WRITE(offset, val) writel(val, txp->regs + (offset)) 148 + #define TXP_READ(offset) \ 149 + ({ \ 150 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 151 + readl(txp->regs + (offset)); \ 152 + }) 153 + 154 + #define TXP_WRITE(offset, val) \ 155 + do { \ 156 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 157 + writel(val, txp->regs + (offset)); \ 158 + } while (0) 150 159 151 160 struct vc4_txp { 152 161 struct vc4_crtc base;
+11 -2
drivers/gpu/drm/vc4/vc4_vec.c
··· 207 207 struct debugfs_regset32 regset; 208 208 }; 209 209 210 - #define VEC_READ(offset) readl(vec->regs + (offset)) 211 - #define VEC_WRITE(offset, val) writel(val, vec->regs + (offset)) 210 + #define VEC_READ(offset) \ 211 + ({ \ 212 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 213 + readl(vec->regs + (offset)); \ 214 + }) 215 + 216 + #define VEC_WRITE(offset, val) \ 217 + do { \ 218 + kunit_fail_current_test("Accessing a register in a unit test!\n"); \ 219 + writel(val, vec->regs + (offset)); \ 220 + } while (0) 212 221 213 222 static inline struct vc4_vec * 214 223 encoder_to_vc4_vec(struct drm_encoder *encoder)