drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:2730 dm_resume() error: we previously assumed 'aconnector->dc_link' could be null (see line 2717)

From: Dan Carpenter
Date: Tue Oct 25 2022 - 03:06:32 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 337a0a0b63f1c30195733eaacf39e4310a592a68
commit: f4346fb3edf7720db3f7f5e1cab1f667cd024280 drm/amd/display: Fix allocate_mst_payload assert on resume
config: mips-randconfig-m031-20221018
compiler: mips64el-linux-gcc (GCC) 12.1.0

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Reported-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx>

New smatch warnings:
drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:2730 dm_resume() error: we previously assumed 'aconnector->dc_link' could be null (see line 2717)

Old smatch warnings:
drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:1747 amdgpu_dm_fini() warn: variable dereferenced before check 'adev->dm.dc' (see line 1720)
drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:4019 amdgpu_dm_backlight_update_status() error: testing array offset 'i' after use.
drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:4061 amdgpu_dm_backlight_get_brightness() error: testing array offset 'i' after use.
drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:6530 create_stream_for_sink() error: we previously assumed 'aconnector->dc_sink' could be null (see line 6429)
drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c:8918 handle_cursor_update() error: we previously assumed 'afb' could be null (see line 8877)

vim +2730 drivers/gpu/drm/amd/amdgpu/../display/amdgpu_dm/amdgpu_dm.c

4562236b3bc0a2 Harry Wentland 2017-09-12 2606 static int dm_resume(void *handle)
4562236b3bc0a2 Harry Wentland 2017-09-12 2607 {
4562236b3bc0a2 Harry Wentland 2017-09-12 2608 struct amdgpu_device *adev = handle;
4a580877bdcb83 Luben Tuikov 2020-08-24 2609 struct drm_device *ddev = adev_to_drm(adev);
4562236b3bc0a2 Harry Wentland 2017-09-12 2610 struct amdgpu_display_manager *dm = &adev->dm;
c84dec2fe8837f Harry Wentland 2017-09-05 2611 struct amdgpu_dm_connector *aconnector;
4562236b3bc0a2 Harry Wentland 2017-09-12 2612 struct drm_connector *connector;
f8d2d39eb40694 Lyude Paul 2019-09-03 2613 struct drm_connector_list_iter iter;
4562236b3bc0a2 Harry Wentland 2017-09-12 2614 struct drm_crtc *crtc;
c2cea7063b85fc Leo (Sunpeng Li 2017-10-12 2615) struct drm_crtc_state *new_crtc_state;
fcb4019e090b95 Leo (Sunpeng Li 2017-11-01 2616) struct dm_crtc_state *dm_new_crtc_state;
fcb4019e090b95 Leo (Sunpeng Li 2017-11-01 2617) struct drm_plane *plane;
fcb4019e090b95 Leo (Sunpeng Li 2017-11-01 2618) struct drm_plane_state *new_plane_state;
fcb4019e090b95 Leo (Sunpeng Li 2017-11-01 2619) struct dm_plane_state *dm_new_plane_state;
113b7a01087211 Leo Li 2019-03-19 2620 struct dm_atomic_state *dm_state = to_dm_atomic_state(dm->atomic_obj.state);
fbbdadf2faf17c Bhawanpreet Lakha 2018-09-26 2621 enum dc_connection_type new_connection_type = dc_connection_none;
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2622 struct dc_state *dc_state;
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2623 int i, r, j;
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2624
53b3f8f40e6cff Dennis Li 2020-08-19 2625 if (amdgpu_in_reset(adev)) {
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2626 dc_state = dm->cached_dc_state;
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2627
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2628 /*
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2629 * The dc->current_state is backed up into dm->cached_dc_state
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2630 * before we commit 0 streams.
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2631 *
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2632 * DC will clear link encoder assignments on the real state
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2633 * but the changes won't propagate over to the copy we made
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2634 * before the 0 streams commit.
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2635 *
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2636 * DC expects that link encoder assignments are *not* valid
32685b32d825ca Nicholas Kazlauskas 2022-02-28 2637 * when committing a state, so as a workaround we can copy
32685b32d825ca Nicholas Kazlauskas 2022-02-28 2638 * off of the current state.
32685b32d825ca Nicholas Kazlauskas 2022-02-28 2639 *
32685b32d825ca Nicholas Kazlauskas 2022-02-28 2640 * We lose the previous assignments, but we had already
32685b32d825ca Nicholas Kazlauskas 2022-02-28 2641 * commit 0 streams anyway.
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2642 */
32685b32d825ca Nicholas Kazlauskas 2022-02-28 2643 link_enc_cfg_copy(adev->dm.dc->current_state, dc_state);
6d63fcc2a334f7 Nicholas Kazlauskas 2021-11-09 2644
af6902ec415655 Nicholas Kazlauskas 2021-11-23 2645 if (dc_enable_dmub_notifications(adev->dm.dc))
524a0ba6fab955 Nicholas Kazlauskas 2021-11-08 2646 amdgpu_dm_outbox_init(adev);
524a0ba6fab955 Nicholas Kazlauskas 2021-11-08 2647
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2648 r = dm_dmub_hw_init(adev);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2649 if (r)
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2650 DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2651
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2652 dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2653 dc_resume(dm->dc);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2654
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2655 amdgpu_dm_irq_resume_early(adev);
4562236b3bc0a2 Harry Wentland 2017-09-12 2656
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2657 for (i = 0; i < dc_state->stream_count; i++) {
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2658 dc_state->streams[i]->mode_changed = true;
6984fa418b8efd Nicholas Kazlauskas 2021-11-09 2659 for (j = 0; j < dc_state->stream_status[i].plane_count; j++) {
6984fa418b8efd Nicholas Kazlauskas 2021-11-09 2660 dc_state->stream_status[i].plane_states[j]->update_flags.raw
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2661 = 0xffffffff;
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2662 }
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2663 }
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2664
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2665 WARN_ON(!dc_commit_state(dm->dc, dc_state));
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2666
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2667 dm_gpureset_commit_state(dm->cached_dc_state, dm);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2668
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2669 dm_gpureset_toggle_interrupts(adev, dm->cached_dc_state, true);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2670
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2671 dc_release_state(dm->cached_dc_state);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2672 dm->cached_dc_state = NULL;
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2673
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2674 amdgpu_dm_irq_resume_late(adev);
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2675
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2676 mutex_unlock(&dm->dc_lock);
4562236b3bc0a2 Harry Wentland 2017-09-12 2677
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2678 return 0;
cdaae8371aa9d4 Bhawanpreet Lakha 2020-05-11 2679 }
113b7a01087211 Leo Li 2019-03-19 2680 /* Recreate dc_state - DC invalidates it when setting power state to S3. */
113b7a01087211 Leo Li 2019-03-19 2681 dc_release_state(dm_state->context);
113b7a01087211 Leo Li 2019-03-19 2682 dm_state->context = dc_create_state(dm->dc);
113b7a01087211 Leo Li 2019-03-19 2683 /* TODO: Remove dc_state->dccg, use dc->dccg directly. */
113b7a01087211 Leo Li 2019-03-19 2684 dc_resource_state_construct(dm->dc, dm_state->context);
113b7a01087211 Leo Li 2019-03-19 2685
af6902ec415655 Nicholas Kazlauskas 2021-11-23 2686 /* Re-enable outbox interrupts for DPIA. */
af6902ec415655 Nicholas Kazlauskas 2021-11-23 2687 if (dc_enable_dmub_notifications(adev->dm.dc))
af6902ec415655 Nicholas Kazlauskas 2021-11-23 2688 amdgpu_dm_outbox_init(adev);
af6902ec415655 Nicholas Kazlauskas 2021-11-23 2689
8c7aea404d55da Nicholas Kazlauskas 2019-11-25 2690 /* Before powering on DC we need to re-initialize DMUB. */
79d6b9351f086e Nicholas Kazlauskas 2021-12-15 2691 dm_dmub_hw_resume(adev);
8c7aea404d55da Nicholas Kazlauskas 2019-11-25 2692
a80aa93de1a0e6 Mikita Lipski 2018-02-03 2693 /* power on hardware */
a80aa93de1a0e6 Mikita Lipski 2018-02-03 2694 dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
a80aa93de1a0e6 Mikita Lipski 2018-02-03 2695
4562236b3bc0a2 Harry Wentland 2017-09-12 2696 /* program HPD filter */
4562236b3bc0a2 Harry Wentland 2017-09-12 2697 dc_resume(dm->dc);
4562236b3bc0a2 Harry Wentland 2017-09-12 2698
4562236b3bc0a2 Harry Wentland 2017-09-12 2699 /*
4562236b3bc0a2 Harry Wentland 2017-09-12 2700 * early enable HPD Rx IRQ, should be done before set mode as short
4562236b3bc0a2 Harry Wentland 2017-09-12 2701 * pulse interrupts are used for MST
4562236b3bc0a2 Harry Wentland 2017-09-12 2702 */
4562236b3bc0a2 Harry Wentland 2017-09-12 2703 amdgpu_dm_irq_resume_early(adev);
4562236b3bc0a2 Harry Wentland 2017-09-12 2704
684cd480fd4e6d Lyude Paul 2019-09-25 2705 /* On resume we need to rewrite the MSTM control bits to enable MST*/
684cd480fd4e6d Lyude Paul 2019-09-25 2706 s3_handle_mst(ddev, false);
684cd480fd4e6d Lyude Paul 2019-09-25 2707
4562236b3bc0a2 Harry Wentland 2017-09-12 2708 /* Do detection*/
f8d2d39eb40694 Lyude Paul 2019-09-03 2709 drm_connector_list_iter_begin(ddev, &iter);
f8d2d39eb40694 Lyude Paul 2019-09-03 2710 drm_for_each_connector_iter(connector, &iter) {
c84dec2fe8837f Harry Wentland 2017-09-05 2711 aconnector = to_amdgpu_dm_connector(connector);
4562236b3bc0a2 Harry Wentland 2017-09-12 2712
4562236b3bc0a2 Harry Wentland 2017-09-12 2713 /*
4562236b3bc0a2 Harry Wentland 2017-09-12 2714 * this is the case when traversing through already created
4562236b3bc0a2 Harry Wentland 2017-09-12 2715 * MST connectors, should be skipped
4562236b3bc0a2 Harry Wentland 2017-09-12 2716 */
f4346fb3edf772 Roman Li 2022-03-17 @2717 if (aconnector->dc_link &&
^^^^^^^^^^^^^^^^^^^
Probably this check can be deleted...

f4346fb3edf772 Roman Li 2022-03-17 2718 aconnector->dc_link->type == dc_connection_mst_branch)
4562236b3bc0a2 Harry Wentland 2017-09-12 2719 continue;
4562236b3bc0a2 Harry Wentland 2017-09-12 2720
03ea364c8e156b Arindam Nath 2017-04-26 2721 mutex_lock(&aconnector->hpd_lock);
fbbdadf2faf17c Bhawanpreet Lakha 2018-09-26 2722 if (!dc_link_detect_sink(aconnector->dc_link, &new_connection_type))
fbbdadf2faf17c Bhawanpreet Lakha 2018-09-26 2723 DRM_ERROR("KMS: Failed to detect connector\n");
fbbdadf2faf17c Bhawanpreet Lakha 2018-09-26 2724
fbbdadf2faf17c Bhawanpreet Lakha 2018-09-26 2725 if (aconnector->base.force && new_connection_type == dc_connection_none)
fbbdadf2faf17c Bhawanpreet Lakha 2018-09-26 2726 emulated_link_detect(aconnector->dc_link);
fbbdadf2faf17c Bhawanpreet Lakha 2018-09-26 2727 else
8f38b66c826188 Hersen Wu 2017-09-11 2728 dc_link_detect(aconnector->dc_link, DETECT_REASON_HPD);
3eb4eba42263cc Roman Li 2017-10-20 2729
3eb4eba42263cc Roman Li 2017-10-20 @2730 if (aconnector->fake_enable && aconnector->dc_link->local_sink)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The other code does not bother to check.

3eb4eba42263cc Roman Li 2017-10-20 2731 aconnector->fake_enable = false;
3eb4eba42263cc Roman Li 2017-10-20 2732
dcd5fb82ffb484 Mathias Fröhlich 2019-02-10 2733 if (aconnector->dc_sink)

--
0-DAY CI Kernel Test Service
https://01.org/lkp