Regression with mainline kernel on rpi4

Sudip Mukherjee sudipm.mukherjee at gmail.com
Wed Sep 22 20:19:06 UTC 2021


On Wed, Sep 22, 2021 at 7:23 PM Linus Torvalds
<torvalds at linux-foundation.org> wrote:
>
> On Wed, Sep 22, 2021 at 10:02 AM Sudip Mukherjee
> <sudipm.mukherjee at gmail.com> wrote:
> >
> >
> > Attached is a complete dmesg and also the decoded trace.
> > This is done on 4357f03d6611 ("Merge tag 'pm-5.15-rc2' of
> > git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm")
>
> drivers/gpu/drm/vc4/vc4_hdmi.c:1214 is
>
>         tmp = (u64)(mode->clock * 1000) * n;
>
> in vc4_hdmi_set_n_cts(), which has apparently been inlined from
> vc4_hdmi_audio_prepare() in vc4_hdmi.c:1398.
>
> So it looks like 'mode' is some offset off a NULL pointer.
>
> Which looks not impossible:
>
>   1207          struct drm_connector *connector = &vc4_hdmi->connector;
>   1208          struct drm_crtc *crtc = connector->state->crtc;
>   1209          const struct drm_display_mode *mode =
> &crtc->state->adjusted_mode;
>
> looks like crtc->state perhaps might be NULL.

I added some debugs to print the addresses, and I am getting:
[   38.813809] sudip crtc 0000000000000000

This is from struct drm_crtc *crtc = connector->state->crtc;

connector and connector->state had valid addresses.
[   38.805302] sudip connector ffff000040bac578
[   38.809779] sudip state ffff000057eb5400

This is the diff of the debug I added:
diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c
index 4a1115043114..2a8f06948094 100644
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1205,11 +1205,20 @@ static void
vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi,
 static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned
int samplerate)
 {
        struct drm_connector *connector = &vc4_hdmi->connector;
-       struct drm_crtc *crtc = connector->state->crtc;
-       const struct drm_display_mode *mode = &crtc->state->adjusted_mode;
+       struct drm_crtc *crtc;
+       struct drm_display_mode *mode;
        u32 n, cts;
        u64 tmp;

+
+       pr_err("sudip connector %px\n", connector);
+       pr_err("sudip state %px\n", connector->state);
+       crtc = connector->state->crtc;
+
+       pr_err("sudip crtc %px\n", crtc);
+       pr_err("sudip state %px\n", crtc->state);
+       pr_err("state mode %px\n", &crtc->state->adjusted_mode);
+       mode = &crtc->state->adjusted_mode;
        n = 128 * samplerate / 1000;
        tmp = (u64)(mode->clock * 1000) * n;
        do_div(tmp, 128 * samplerate);


-- 
Regards
Sudip


More information about the dri-devel mailing list