Hello Aurabindo Pillai,

Commit 7f7d7ea1fa51 ("drm/amd/display: Add new sources for DCN6")
from Jul 22, 2026 (linux-next), leads to the following Smatch static
checker warning:

        drivers/gpu/drm/amd/amdgpu/../display/dc/hwss/dcn50/dcn50_hwseq.c:641 
dcn50_init_hw()
        error: we previously assumed 'dc->clk_mgr' could be null (see line 541)

drivers/gpu/drm/amd/amdgpu/../display/dc/hwss/dcn50/dcn50_hwseq.c
    529 void dcn50_init_hw(struct dc *dc)
    530 {
    531         struct abm **abms = dc->res_pool->multiple_abms;
    532         struct dce_hwseq *hws = dc->hwseq;
    533         struct dc_bios *dcb = dc->ctx->dc_bios;
    534         struct resource_pool *res_pool = dc->res_pool;
    535         unsigned int i;
    536         unsigned int edp_num;
    537         uint32_t backlight = MAX_BACKLIGHT_LEVEL;
    538         uint32_t user_level = MAX_BACKLIGHT_LEVEL;
    539         int current_dchub_ref_freq = 0;
    540 
    541         if (dc->clk_mgr && dc->clk_mgr->funcs && 
dc->clk_mgr->funcs->init_clocks) {
                    ^^^^^^^^^^^
Check for NULL

    542                 dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
    543 
    544                 // mark dcmode limits present if any clock has distinct 
AC and DC values from SMU
    545                 dc->caps.dcmode_power_limits_present = 
dc->clk_mgr->funcs->is_dc_mode_present &&
    546                                 
dc->clk_mgr->funcs->is_dc_mode_present(dc->clk_mgr);
    547         }
    548 
    549         // Initialize the dccg
    550         if (res_pool->dccg->funcs->dccg_init)
    551                 res_pool->dccg->funcs->dccg_init(res_pool->dccg);
    552 
    553         // Disable DMUB Initialization until IPS state programming is 
finalized
    554         //if (!dcb->funcs->is_accelerated_mode(dcb)) {
    555         //        hws->funcs.bios_golden_init(dc);
    556         //}
    557 
    558         // Set default OPTC memory power states
    559         if (dc->debug.enable_mem_low_power.bits.optc) {
    560                 // Shutdown when unassigned and light sleep in VBLANK
    561                 REG_SET_2(ODM_MEM_PWR_CTRL3, 0, 
ODM_MEM_UNASSIGNED_PWR_MODE, 3, ODM_MEM_VBLANK_PWR_MODE, 1);
    562         }
    563 
    564         if (dc->debug.enable_mem_low_power.bits.vga) {
    565                 // Power down VGA memory
    566                 REG_UPDATE(MMHUBBUB_MEM_PWR_CNTL, VGA_MEM_PWR_FORCE, 1);
    567         }
    568 
    569         if (dc->ctx->dc_bios->fw_info_valid) {
    570                 res_pool->ref_clocks.xtalin_clock_inKhz =
    571                                 
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
    572 
    573                 if (res_pool->hubbub) {
    574                         
(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg,
    575                                         
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
    576                                         
&res_pool->ref_clocks.dccg_ref_clock_inKhz);
    577 
    578                         current_dchub_ref_freq = 
res_pool->ref_clocks.dchub_ref_clock_inKhz / 1000;
    579 
    580                         
(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub,
    581                                         
res_pool->ref_clocks.dccg_ref_clock_inKhz,
    582                                         
&res_pool->ref_clocks.dchub_ref_clock_inKhz);
    583                 } else {
    584                         // Not all ASICs have DCCG sw component
    585                         res_pool->ref_clocks.dccg_ref_clock_inKhz =
    586                                         
res_pool->ref_clocks.xtalin_clock_inKhz;
    587                         res_pool->ref_clocks.dchub_ref_clock_inKhz =
    588                                         
res_pool->ref_clocks.xtalin_clock_inKhz;
    589                 }
    590         } else
    591                 ASSERT_CRITICAL(false);
    592 
    593         for (i = 0; i < dc->link_count; i++) {
    594                 /* Power up AND update implementation according to the
    595                  * required signal (which may be different from the
    596                  * default signal on connector).
    597                  */
    598                 struct dc_link *link = dc->links[i];
    599 
    600                 link->link_enc->funcs->hw_init(link->link_enc);
    601 
    602                 /* Check for enabled DIG to identify enabled display */
    603                 if (link->link_enc->funcs->is_dig_enabled &&
    604                         
link->link_enc->funcs->is_dig_enabled(link->link_enc)) {
    605                         link->link_status.link_active = true;
    606                         link->phy_state.symclk_state = SYMCLK_ON_TX_ON;
    607                         if (link->link_enc->funcs->fec_is_active &&
    608                                         
link->link_enc->funcs->fec_is_active(link->link_enc))
    609                                 link->fec_state = dc_link_fec_enabled;
    610                 }
    611         }
    612 
    613         /* enable_power_gating_plane before dsc_pg_control because
    614          * FORCEON = 1 with hw default value on bootup, resume from s3
    615          */
    616         if (hws->funcs.enable_power_gating_plane)
    617                 hws->funcs.enable_power_gating_plane(dc->hwseq, true);
    618 
    619         /* we want to turn off all dp displays before doing detection */
    620         dc->link_srv->blank_all_dp_displays(dc);
    621 
    622         /* If taking control over from VBIOS, we may want to optimize 
our first
    623          * mode set, so we need to skip powering down pipes until we 
know which
    624          * pipes we want to use.
    625          * Otherwise, if taking control is not possible, we need to 
power
    626          * everything down.
    627          */
    628         if (dcb->funcs->is_accelerated_mode(dcb) || 
!dc->config.seamless_boot_edp_requested) {
    629                 /* Disable boot optimizations means power down 
everything including PHY, DIG,
    630                  * and OTG (i.e. the boot is not optimized because we 
do a full power down).
    631                  */
    632                 if (dc->hwss.enable_accelerated_mode && 
dc->debug.disable_boot_optimizations)
    633                         dc->hwss.enable_accelerated_mode(dc, 
dc->current_state);
    634                 else
    635                         hws->funcs.init_pipes(dc, dc->current_state);
    636 
    637                 if 
(dc->res_pool->hubbub->funcs->allow_self_refresh_control)
    638                         
dc->res_pool->hubbub->funcs->allow_self_refresh_control(dc->res_pool->hubbub,
    639                                         
!dc->res_pool->hubbub->ctx->dc->debug.disable_stutter);
    640 
--> 641                 dcn50_initialize_min_clocks(dc);
                                                    ^^
Unchecked dereference.

    642 
    643                 /* On HW init, allow idle optimizations after pipes 
have been turned off.
    644                  *
    645                  * In certain D3 cases (i.e. BOCO / BOMACO) it's 
possible that hardware state
    646                  * is reset (i.e. not in idle at the time hw init is 
called), but software state
    647                  * still has idle_optimizations = true, so we must 
disable idle optimizations first
    648                  * (i.e. set false), then re-enable (set true).
    649                  */
    650                 dc_allow_idle_optimizations(dc, false);
    651                 dc_allow_idle_optimizations(dc, true);
    652         }

This email is a free service from the Smatch-CI project [smatch.sf.net].

regards,
dan carpenter

Reply via email to