diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 5833a6997fd66..074afabaf0844 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -654,7 +654,7 @@ static int vc4_hdmi_write_infoframe(struct drm_connector *connector, if (!drm_dev_enter(drm, &idx)) return 0; - if (len > sizeof(buffer)) { + if (len > VC4_HDMI_PACKET_SIZE) { ret = -ENOMEM; goto out; } @@ -680,6 +680,9 @@ static int vc4_hdmi_write_infoframe(struct drm_connector *connector, base + packet_reg); packet_reg += 4; + if (packet_reg >= packet_reg_next) + break; + writel(buffer[i + 3] << 0 | buffer[i + 4] << 8 | buffer[i + 5] << 16 | diff --git a/drivers/gpu/drm/vc4/vc4_hdmi_regs.h b/drivers/gpu/drm/vc4/vc4_hdmi_regs.h index 59bfd69f54d98..fb97e8a72b59f 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi_regs.h +++ b/drivers/gpu/drm/vc4/vc4_hdmi_regs.h @@ -7,6 +7,12 @@ #define VC4_HDMI_PACKET_STRIDE 0x24 +/* + * A packet RAM slot is 9 words, holding a 3-byte packet header followed by + * four 7-byte subpackets, so only 31 of its 36 bytes are addressable. + */ +#define VC4_HDMI_PACKET_SIZE 31 + enum vc4_hdmi_regs { VC4_INVALID = 0, VC4_HDMI,