[PATCH v3 6/7] drm: Validate encoder->possible_crtcs
Jan Kiszka
jan.kiszka at web.de
Sun Sep 6 11:19:21 UTC 2020
On 11.02.20 18:04, Daniel Vetter wrote:
> On Tue, Feb 11, 2020 at 06:22:07PM +0200, Ville Syrjala wrote:
>> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>>
>> WARN if the encoder possible_crtcs is effectively empty or contains
>> bits for non-existing crtcs.
>>
>> v2: Move to drm_mode_config_validate() (Daniel)
>> Make the docs say we WARN when this is wrong (Daniel)
>> Extract full_crtc_mask()
>>
>> Cc: Thomas Zimmermann <tzimmermann at suse.de>
>> Cc: Daniel Vetter <daniel at ffwll.ch>
>> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> When pushing the fixup needs to be applied before the validation patch
> here, because we don't want to anger the bisect gods.
>
> Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
>
> I think with the fixup we should be good enough with the existing nonsense
> in drivers. Fingers crossed.
> -Daniel
>
>
>> ---
>> drivers/gpu/drm/drm_mode_config.c | 27 ++++++++++++++++++++++++++-
>> include/drm/drm_encoder.h | 2 +-
>> 2 files changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c
>> index afc91447293a..4c1b350ddb95 100644
>> --- a/drivers/gpu/drm/drm_mode_config.c
>> +++ b/drivers/gpu/drm/drm_mode_config.c
>> @@ -581,6 +581,29 @@ static void validate_encoder_possible_clones(struct drm_encoder *encoder)
>> encoder->possible_clones, encoder_mask);
>> }
>>
>> +static u32 full_crtc_mask(struct drm_device *dev)
>> +{
>> + struct drm_crtc *crtc;
>> + u32 crtc_mask = 0;
>> +
>> + drm_for_each_crtc(crtc, dev)
>> + crtc_mask |= drm_crtc_mask(crtc);
>> +
>> + return crtc_mask;
>> +}
>> +
>> +static void validate_encoder_possible_crtcs(struct drm_encoder *encoder)
>> +{
>> + u32 crtc_mask = full_crtc_mask(encoder->dev);
>> +
>> + WARN((encoder->possible_crtcs & crtc_mask) == 0 ||
>> + (encoder->possible_crtcs & ~crtc_mask) != 0,
>> + "Bogus possible_crtcs: "
>> + "[ENCODER:%d:%s] possible_crtcs=0x%x (full crtc mask=0x%x)\n",
>> + encoder->base.id, encoder->name,
>> + encoder->possible_crtcs, crtc_mask);
>> +}
>> +
>> void drm_mode_config_validate(struct drm_device *dev)
>> {
>> struct drm_encoder *encoder;
>> @@ -588,6 +611,8 @@ void drm_mode_config_validate(struct drm_device *dev)
>> drm_for_each_encoder(encoder, dev)
>> fixup_encoder_possible_clones(encoder);
>>
>> - drm_for_each_encoder(encoder, dev)
>> + drm_for_each_encoder(encoder, dev) {
>> validate_encoder_possible_clones(encoder);
>> + validate_encoder_possible_crtcs(encoder);
>> + }
>> }
>> diff --git a/include/drm/drm_encoder.h b/include/drm/drm_encoder.h
>> index 3741963b9587..b236269f41ac 100644
>> --- a/include/drm/drm_encoder.h
>> +++ b/include/drm/drm_encoder.h
>> @@ -142,7 +142,7 @@ struct drm_encoder {
>> * the bits for all &drm_crtc objects this encoder can be connected to
>> * before calling drm_dev_register().
>> *
>> - * In reality almost every driver gets this wrong.
>> + * You will get a WARN if you get this wrong in the driver.
>> *
>> * Note that since CRTC objects can't be hotplugged the assigned indices
>> * are stable and hence known before registering all objects.
>> --
>> 2.24.1
>>
>
Triggers on an Advantech AIMB-228 (R1505G, 3 DP outputs):
[ 14.033246] ------------[ cut here ]------------
[ 14.033248] Bogus possible_crtcs: [ENCODER:65:TMDS-65] possible_crtcs=0xf (full crtc mask=0x7)
[ 14.033279] WARNING: CPU: 0 PID: 282 at ../drivers/gpu/drm/drm_mode_config.c:622 drm_mode_config_validate+0x17d/0x200 [drm]
[ 14.033279] Modules linked in: amdgpu(E+) mfd_core(E) snd_hda_codec_realtek(E) kvm_amd(E) gpu_sched(E) i2c_algo_bit(E) ttm(E) snd_hda_codec_generic(E) kvm(E) ledtrig_audio(E) snd_hda_codec_hdmi(E) drm_kms_helper(E) snd_hda_intel(E) snd_intel_dspcfg(E) snd_hda_codec(E) cec(E) snd_hwdep(E) drm(E) irqbypass(E) snd_hda_core(E) crc32_pclmul(E) snd_pcm(E) ghash_clmulni_intel(E) snd_timer(E) sg(E) aesni_intel(E) snd(E) ccp(E) soundcore(E) rng_core(E) glue_helper(E) libaes(E) crypto_simd(E) k10temp(E) efi_pstore(E) sp5100_tco(E) evdev(E) cryptd(E) pcspkr(E) efivars(E) video(E) button(E) acpi_cpufreq(E) w83627hf_wdt(E) watchdog(E) nct6775(E) hwmon_vid(E) efivarfs(E) ip_tables(E) x_tables(E) autofs4(E) ext4(E) crc32c_generic(E) crc16(E) mbcache(E) jbd2(E) sd_mod(E) t10_pi(E) crc_t10dif(E) crct10dif_generic(E) uas(E) usb_storage(E) ahci(E) libahci(E) xhci_pci(E) r8169(E) realtek(E) mdio_devres(E) xhci_hcd(E) libata(E) i2c_amd_mp2_pci(E) crct10dif_pclmul(E) crct10dif_common(E) scsi_mod(E)
[ 14.033306] crc32c_intel(E) i2c_piix4(E) usbcore(E) libphy(E)
[ 14.033310] CPU: 0 PID: 282 Comm: systemd-udevd Tainted: G E 5.9.0-rc3+ #2
[ 14.033311] Hardware name: Default string Default string/Default string, BIOS 5.0.1.4 02/14/2020
[ 14.033324] RIP: 0010:drm_mode_config_validate+0x17d/0x200 [drm]
[ 14.033327] Code: 42 f0 75 e6 41 85 f8 74 09 44 89 c0 f7 d0 85 f8 74 1a 49 8b 54 24 38 41 8b 74 24 18 89 f9 48 c7 c7 80 7d 70 c0 e8 13 66 9a d5 <0f> 0b 49 8b 44 24 08 49 39 c5 4c 8d 60 f8 0f 85 e9 fe ff ff 5b 5d
[ 14.033328] RSP: 0018:ffffae5f404b7a90 EFLAGS: 00010282
[ 14.033329] RAX: 0000000000000000 RBX: ffff9c6907bd0ad0 RCX: 0000000000000027
[ 14.033330] RDX: 0000000000000000 RSI: 0000000000000086 RDI: ffff9c6910a18ac8
[ 14.033331] RBP: 0000000000000001 R08: 0000000000000064 R09: ffffffff9784a724
[ 14.033331] R10: 0000000000000001 R11: 0000000000000000 R12: ffff9c690bf8b800
[ 14.033332] R13: ffff9c6907bd0ad8 R14: ffff9c6907bd0ad8 R15: 000000000000003f
[ 14.033333] FS: 00007feace9d4d40(0000) GS:ffff9c6910a00000(0000) knlGS:0000000000000000
[ 14.033334] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 14.033335] CR2: 0000557a37b7e270 CR3: 000000038d5fa000 CR4: 00000000003506f0
[ 14.033335] Call Trace:
[ 14.033350] drm_dev_register+0x117/0x1e0 [drm]
[ 14.033423] amdgpu_pci_probe+0x134/0x200 [amdgpu]
[ 14.033428] local_pci_probe+0x42/0x90
[ 14.033430] pci_device_probe+0x108/0x1c0
[ 14.033433] really_probe+0xef/0x4a0
[ 14.033435] driver_probe_device+0xde/0x150
[ 14.033436] device_driver_attach+0x4f/0x60
[ 14.033438] __driver_attach+0x9a/0x140
[ 14.033439] ? device_driver_attach+0x60/0x60
[ 14.033441] bus_for_each_dev+0x76/0xc0
[ 14.033443] ? klist_add_tail+0x3b/0x70
[ 14.033445] bus_add_driver+0x144/0x220
[ 14.033446] ? 0xffffffffc0949000
[ 14.033447] driver_register+0x5b/0xf0
[ 14.033448] ? 0xffffffffc0949000
[ 14.033451] do_one_initcall+0x46/0x1f4
[ 14.033454] ? _cond_resched+0x15/0x40
[ 14.033456] ? kmem_cache_alloc_trace+0x40/0x440
[ 14.033459] ? do_init_module+0x22/0x213
[ 14.033460] do_init_module+0x5b/0x213
[ 14.033462] load_module+0x258c/0x2d30
[ 14.033465] ? __kernel_read+0xf5/0x160
[ 14.033467] ? __do_sys_finit_module+0xe9/0x110
[ 14.033468] __do_sys_finit_module+0xe9/0x110
[ 14.033471] do_syscall_64+0x33/0x80
[ 14.033473] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 14.033474] RIP: 0033:0x7feacf1bef59
[ 14.033477] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 07 6f 0c 00 f7 d8 64 89 01 48
[ 14.033477] RSP: 002b:00007ffd03534438 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 14.033478] RAX: ffffffffffffffda RBX: 0000565489749410 RCX: 00007feacf1bef59
[ 14.033479] RDX: 0000000000000000 RSI: 00007feacf0c3cad RDI: 0000000000000015
[ 14.033479] RBP: 00007feacf0c3cad R08: 0000000000000000 R09: 0000000000000000
[ 14.033480] R10: 0000000000000015 R11: 0000000000000246 R12: 0000000000000000
[ 14.033480] R13: 00005654897472c0 R14: 0000000000020000 R15: 0000565489749410
[ 14.033482] ---[ end trace 16aeaa08847a13d8 ]---
[ 14.033483] ------------[ cut here ]------------
[ 14.033484] Bogus possible_crtcs: [ENCODER:69:TMDS-69] possible_crtcs=0xf (full crtc mask=0x7)
[ 14.033507] WARNING: CPU: 0 PID: 282 at ../drivers/gpu/drm/drm_mode_config.c:622 drm_mode_config_validate+0x17d/0x200 [drm]
[ 14.033507] Modules linked in: amdgpu(E+) mfd_core(E) snd_hda_codec_realtek(E) kvm_amd(E) gpu_sched(E) i2c_algo_bit(E) ttm(E) snd_hda_codec_generic(E) kvm(E) ledtrig_audio(E) snd_hda_codec_hdmi(E) drm_kms_helper(E) snd_hda_intel(E) snd_intel_dspcfg(E) snd_hda_codec(E) cec(E) snd_hwdep(E) drm(E) irqbypass(E) snd_hda_core(E) crc32_pclmul(E) snd_pcm(E) ghash_clmulni_intel(E) snd_timer(E) sg(E) aesni_intel(E) snd(E) ccp(E) soundcore(E) rng_core(E) glue_helper(E) libaes(E) crypto_simd(E) k10temp(E) efi_pstore(E) sp5100_tco(E) evdev(E) cryptd(E) pcspkr(E) efivars(E) video(E) button(E) acpi_cpufreq(E) w83627hf_wdt(E) watchdog(E) nct6775(E) hwmon_vid(E) efivarfs(E) ip_tables(E) x_tables(E) autofs4(E) ext4(E) crc32c_generic(E) crc16(E) mbcache(E) jbd2(E) sd_mod(E) t10_pi(E) crc_t10dif(E) crct10dif_generic(E) uas(E) usb_storage(E) ahci(E) libahci(E) xhci_pci(E) r8169(E) realtek(E) mdio_devres(E) xhci_hcd(E) libata(E) i2c_amd_mp2_pci(E) crct10dif_pclmul(E) crct10dif_common(E) scsi_mod(E)
[ 14.033522] crc32c_intel(E) i2c_piix4(E) usbcore(E) libphy(E)
[ 14.033524] CPU: 0 PID: 282 Comm: systemd-udevd Tainted: G W E 5.9.0-rc3+ #2
[ 14.033525] Hardware name: Default string Default string/Default string, BIOS 5.0.1.4 02/14/2020
[ 14.033538] RIP: 0010:drm_mode_config_validate+0x17d/0x200 [drm]
[ 14.033539] Code: 42 f0 75 e6 41 85 f8 74 09 44 89 c0 f7 d0 85 f8 74 1a 49 8b 54 24 38 41 8b 74 24 18 89 f9 48 c7 c7 80 7d 70 c0 e8 13 66 9a d5 <0f> 0b 49 8b 44 24 08 49 39 c5 4c 8d 60 f8 0f 85 e9 fe ff ff 5b 5d
[ 14.033540] RSP: 0018:ffffae5f404b7a90 EFLAGS: 00010282
[ 14.033540] RAX: 0000000000000000 RBX: ffff9c6907bd0ad0 RCX: 0000000000000027
[ 14.033541] RDX: 0000000000000000 RSI: 0000000000000086 RDI: ffff9c6910a18ac8
[ 14.033542] RBP: 0000000000000001 R08: 0000000000000064 R09: ffffffff9784a724
[ 14.033542] R10: 0000000000000001 R11: 0000000000000000 R12: ffff9c690bf89800
[ 14.033543] R13: ffff9c6907bd0ad8 R14: ffff9c6907bd0ad8 R15: 000000000000003f
[ 14.033544] FS: 00007feace9d4d40(0000) GS:ffff9c6910a00000(0000) knlGS:0000000000000000
[ 14.033544] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 14.033545] CR2: 0000557a37b7e270 CR3: 000000038d5fa000 CR4: 00000000003506f0
[ 14.033545] Call Trace:
[ 14.033557] drm_dev_register+0x117/0x1e0 [drm]
[ 14.033625] amdgpu_pci_probe+0x134/0x200 [amdgpu]
[ 14.033627] local_pci_probe+0x42/0x90
[ 14.033629] pci_device_probe+0x108/0x1c0
[ 14.033630] really_probe+0xef/0x4a0
[ 14.033632] driver_probe_device+0xde/0x150
[ 14.033633] device_driver_attach+0x4f/0x60
[ 14.033634] __driver_attach+0x9a/0x140
[ 14.033635] ? device_driver_attach+0x60/0x60
[ 14.033636] bus_for_each_dev+0x76/0xc0
[ 14.033638] ? klist_add_tail+0x3b/0x70
[ 14.033639] bus_add_driver+0x144/0x220
[ 14.033640] ? 0xffffffffc0949000
[ 14.033641] driver_register+0x5b/0xf0
[ 14.033642] ? 0xffffffffc0949000
[ 14.033643] do_one_initcall+0x46/0x1f4
[ 14.033645] ? _cond_resched+0x15/0x40
[ 14.033646] ? kmem_cache_alloc_trace+0x40/0x440
[ 14.033648] ? do_init_module+0x22/0x213
[ 14.033649] do_init_module+0x5b/0x213
[ 14.033650] load_module+0x258c/0x2d30
[ 14.033652] ? __kernel_read+0xf5/0x160
[ 14.033654] ? __do_sys_finit_module+0xe9/0x110
[ 14.033655] __do_sys_finit_module+0xe9/0x110
[ 14.033657] do_syscall_64+0x33/0x80
[ 14.033659] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 14.033660] RIP: 0033:0x7feacf1bef59
[ 14.033661] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 07 6f 0c 00 f7 d8 64 89 01 48
[ 14.033662] RSP: 002b:00007ffd03534438 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 14.033663] RAX: ffffffffffffffda RBX: 0000565489749410 RCX: 00007feacf1bef59
[ 14.033663] RDX: 0000000000000000 RSI: 00007feacf0c3cad RDI: 0000000000000015
[ 14.033664] RBP: 00007feacf0c3cad R08: 0000000000000000 R09: 0000000000000000
[ 14.033664] R10: 0000000000000015 R11: 0000000000000246 R12: 0000000000000000
[ 14.033665] R13: 00005654897472c0 R14: 0000000000020000 R15: 0000565489749410
[ 14.033666] ---[ end trace 16aeaa08847a13d9 ]---
[ 14.033667] ------------[ cut here ]------------
[ 14.033668] Bogus possible_crtcs: [ENCODER:73:TMDS-73] possible_crtcs=0xf (full crtc mask=0x7)
[ 14.033690] WARNING: CPU: 0 PID: 282 at ../drivers/gpu/drm/drm_mode_config.c:622 drm_mode_config_validate+0x17d/0x200 [drm]
[ 14.033690] Modules linked in: amdgpu(E+) mfd_core(E) snd_hda_codec_realtek(E) kvm_amd(E) gpu_sched(E) i2c_algo_bit(E) ttm(E) snd_hda_codec_generic(E) kvm(E) ledtrig_audio(E) snd_hda_codec_hdmi(E) drm_kms_helper(E) snd_hda_intel(E) snd_intel_dspcfg(E) snd_hda_codec(E) cec(E) snd_hwdep(E) drm(E) irqbypass(E) snd_hda_core(E) crc32_pclmul(E) snd_pcm(E) ghash_clmulni_intel(E) snd_timer(E) sg(E) aesni_intel(E) snd(E) ccp(E) soundcore(E) rng_core(E) glue_helper(E) libaes(E) crypto_simd(E) k10temp(E) efi_pstore(E) sp5100_tco(E) evdev(E) cryptd(E) pcspkr(E) efivars(E) video(E) button(E) acpi_cpufreq(E) w83627hf_wdt(E) watchdog(E) nct6775(E) hwmon_vid(E) efivarfs(E) ip_tables(E) x_tables(E) autofs4(E) ext4(E) crc32c_generic(E) crc16(E) mbcache(E) jbd2(E) sd_mod(E) t10_pi(E) crc_t10dif(E) crct10dif_generic(E) uas(E) usb_storage(E) ahci(E) libahci(E) xhci_pci(E) r8169(E) realtek(E) mdio_devres(E) xhci_hcd(E) libata(E) i2c_amd_mp2_pci(E) crct10dif_pclmul(E) crct10dif_common(E) scsi_mod(E)
[ 14.033704] crc32c_intel(E) i2c_piix4(E) usbcore(E) libphy(E)
[ 14.033706] CPU: 0 PID: 282 Comm: systemd-udevd Tainted: G W E 5.9.0-rc3+ #2
[ 14.033707] Hardware name: Default string Default string/Default string, BIOS 5.0.1.4 02/14/2020
[ 14.033719] RIP: 0010:drm_mode_config_validate+0x17d/0x200 [drm]
[ 14.033721] Code: 42 f0 75 e6 41 85 f8 74 09 44 89 c0 f7 d0 85 f8 74 1a 49 8b 54 24 38 41 8b 74 24 18 89 f9 48 c7 c7 80 7d 70 c0 e8 13 66 9a d5 <0f> 0b 49 8b 44 24 08 49 39 c5 4c 8d 60 f8 0f 85 e9 fe ff ff 5b 5d
[ 14.033721] RSP: 0018:ffffae5f404b7a90 EFLAGS: 00010282
[ 14.033722] RAX: 0000000000000000 RBX: ffff9c6907bd0ad0 RCX: 0000000000000027
[ 14.033723] RDX: 0000000000000000 RSI: 0000000000000086 RDI: ffff9c6910a18ac8
[ 14.033723] RBP: 0000000000000001 R08: 0000000000000064 R09: ffffffff9784a724
[ 14.033724] R10: 0000000000000001 R11: 0000000000000000 R12: ffff9c690bf7c000
[ 14.033724] R13: ffff9c6907bd0ad8 R14: ffff9c6907bd0ad8 R15: 000000000000003f
[ 14.033725] FS: 00007feace9d4d40(0000) GS:ffff9c6910a00000(0000) knlGS:0000000000000000
[ 14.033726] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 14.033726] CR2: 0000557a37b7e270 CR3: 000000038d5fa000 CR4: 00000000003506f0
[ 14.033727] Call Trace:
[ 14.033739] drm_dev_register+0x117/0x1e0 [drm]
[ 14.033806] amdgpu_pci_probe+0x134/0x200 [amdgpu]
[ 14.033808] local_pci_probe+0x42/0x90
[ 14.033810] pci_device_probe+0x108/0x1c0
[ 14.033811] really_probe+0xef/0x4a0
[ 14.033813] driver_probe_device+0xde/0x150
[ 14.033814] device_driver_attach+0x4f/0x60
[ 14.033815] __driver_attach+0x9a/0x140
[ 14.033816] ? device_driver_attach+0x60/0x60
[ 14.033817] bus_for_each_dev+0x76/0xc0
[ 14.033818] ? klist_add_tail+0x3b/0x70
[ 14.033820] bus_add_driver+0x144/0x220
[ 14.033821] ? 0xffffffffc0949000
[ 14.033822] driver_register+0x5b/0xf0
[ 14.033823] ? 0xffffffffc0949000
[ 14.033824] do_one_initcall+0x46/0x1f4
[ 14.033825] ? _cond_resched+0x15/0x40
[ 14.033827] ? kmem_cache_alloc_trace+0x40/0x440
[ 14.033828] ? do_init_module+0x22/0x213
[ 14.033829] do_init_module+0x5b/0x213
[ 14.033831] load_module+0x258c/0x2d30
[ 14.033833] ? __kernel_read+0xf5/0x160
[ 14.033834] ? __do_sys_finit_module+0xe9/0x110
[ 14.033835] __do_sys_finit_module+0xe9/0x110
[ 14.033838] do_syscall_64+0x33/0x80
[ 14.033839] entry_SYSCALL_64_after_hwframe+0x44/0xa9
[ 14.033840] RIP: 0033:0x7feacf1bef59
[ 14.033841] Code: 00 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 07 6f 0c 00 f7 d8 64 89 01 48
[ 14.033842] RSP: 002b:00007ffd03534438 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
[ 14.033843] RAX: ffffffffffffffda RBX: 0000565489749410 RCX: 00007feacf1bef59
[ 14.033843] RDX: 0000000000000000 RSI: 00007feacf0c3cad RDI: 0000000000000015
[ 14.033844] RBP: 00007feacf0c3cad R08: 0000000000000000 R09: 0000000000000000
[ 14.033844] R10: 0000000000000015 R11: 0000000000000246 R12: 0000000000000000
[ 14.033845] R13: 00005654897472c0 R14: 0000000000020000 R15: 0000565489749410
[ 14.033846] ---[ end trace 16aeaa08847a13da ]---
Probably the same issue as in
https://bugzilla.kernel.org/show_bug.cgi?id=209123. What does it
practically mean? Can/should it be silenced in this setup?
Jan
More information about the dri-devel
mailing list