Gx Chip Driver Now
struct gx_disp *disp = dev_id; u32 status = readl(disp->base + DISP_IRQ_STS); if (status & DISP_IRQ_VSYNC) writel(DISP_IRQ_VSYNC, disp->base + DISP_IRQ_STS); drm_crtc_handle_vblank(&disp->crtc); return IRQ_HANDLED;
can occur if status register is not cleared exactly once. 6. Debugging GX Drivers Without Vendor Support 6.1 Tools & Methods | Tool | Purpose | |------|---------| | devmem2 | Read/write raw registers (e.g., devmem2 0xF0000020 ) | | strace | Trace ioctl calls to DRM/V4L2 | | dmesg -w | Watch driver prints (enable with DYNAMIC_DEBUG ) | | cat /sys/kernel/debug/dri/*/state | DRM state | | gdb + KGDB | Kernel debugging over serial | 6.2 Common Errors & Fixes Error: gx_vpu: timeout waiting for interrupt → Check VPU clock (is it enabled?), firmware loaded? Try clk_enable(vpu_clk) . gx chip driver
Example (display vsync):
writel_relaxed(val, i2c->base + reg);
GX PM is notoriously minimal : only suspend/resume for system sleep, no runtime PM. Causes high idle power. struct gx_disp *disp = dev_id; u32 status =
echo 0x1f > /sys/module/gx_vpu/parameters/debug to enable verbose logging. Check cat /proc/interrupts | grep vpu for interrupt count. 4.4 I2C / SPI Drivers ( gx_i2c , gx_spi ) These are simple wrapper drivers around DesignWare IP or a custom bit-bang. The GX implementation often lacks proper clock gating or recovery on bus hang. Try clk_enable(vpu_clk)
gx_i2c: bus stuck → Implement i2c recovery (toggle SCL 9 times manually).