Hello Bhawanpreet Lakha,

This is a semi-automatic email about new static checker warnings.

The patch 581b9589487e: "drm/amd/display: Add DCN3 HWSEQ" from May
21, 2020, leads to the following Smatch complaint:

    drivers/gpu/drm/amd/amdgpu/../display/dc/dcn30/dcn30_hwseq.c:618 
dcn30_init_hw()
    error: we previously assumed 'dc->clk_mgr' could be null (see line 433)

drivers/gpu/drm/amd/amdgpu/../display/dc/dcn30/dcn30_hwseq.c
   432  
   433          if (dc->clk_mgr && dc->clk_mgr->funcs->init_clocks)
                    ^^^^^^^^^^^
This code assumes ->clk_mgr can be NULL.

   434                  dc->clk_mgr->funcs->init_clocks(dc->clk_mgr);
   435  
   436          // Initialize the dccg
   437          if (res_pool->dccg->funcs->dccg_init)
   438                  res_pool->dccg->funcs->dccg_init(res_pool->dccg);
   439  
   440          //Enable ability to power gate / don't force power on 
permanently
   441          hws->funcs.enable_power_gating_plane(dc->hwseq, true);
   442  
   443          if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
   444                  REG_WRITE(RBBMIF_TIMEOUT_DIS, 0xFFFFFFFF);
   445                  REG_WRITE(RBBMIF_TIMEOUT_DIS_2, 0xFFFFFFFF);
   446  
   447                  hws->funcs.dccg_init(hws);
   448  
   449                  REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, 
DCHUBBUB_GLOBAL_TIMER_REFDIV, 2);
   450                  REG_UPDATE(DCHUBBUB_GLOBAL_TIMER_CNTL, 
DCHUBBUB_GLOBAL_TIMER_ENABLE, 1);
   451                  REG_WRITE(REFCLK_CNTL, 0);
   452          } else {
   453                  if (!dcb->funcs->is_accelerated_mode(dcb)) {
   454                          hws->funcs.bios_golden_init(dc);
   455                          hws->funcs.disable_vga(dc->hwseq);
   456                  }
   457  
   458                  if (dc->ctx->dc_bios->fw_info_valid) {
   459                          res_pool->ref_clocks.xtalin_clock_inKhz =
   460                                          
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
   461  
   462                          if 
(!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) {
   463                                  if (res_pool->dccg && res_pool->hubbub) 
{
   464  
   465                                          
(res_pool->dccg->funcs->get_dccg_ref_freq)(res_pool->dccg,
   466                                                          
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
   467                                                          
&res_pool->ref_clocks.dccg_ref_clock_inKhz);
   468  
   469                                          
(res_pool->hubbub->funcs->get_dchub_ref_freq)(res_pool->hubbub,
   470                                                          
res_pool->ref_clocks.dccg_ref_clock_inKhz,
   471                                                          
&res_pool->ref_clocks.dchub_ref_clock_inKhz);
   472                                  } else {
   473                                          // Not all ASICs have DCCG sw 
component
   474                                          
res_pool->ref_clocks.dccg_ref_clock_inKhz =
   475                                                          
res_pool->ref_clocks.xtalin_clock_inKhz;
   476                                          
res_pool->ref_clocks.dchub_ref_clock_inKhz =
   477                                                          
res_pool->ref_clocks.xtalin_clock_inKhz;
   478                                  }
   479                          }
   480                  } else
   481                          ASSERT_CRITICAL(false);
   482  
   483                  for (i = 0; i < dc->link_count; i++) {
   484                          /* Power up AND update implementation according 
to the
   485                           * required signal (which may be different from 
the
   486                           * default signal on connector).
   487                           */
   488                          struct dc_link *link = dc->links[i];
   489  
   490                          link->link_enc->funcs->hw_init(link->link_enc);
   491                  }
   492          }
   493  
   494          /* Power gate DSCs */
   495          for (i = 0; i < res_pool->res_cap->num_dsc; i++)
   496                  hws->funcs.dsc_pg_control(hws, res_pool->dscs[i]->inst, 
false);
   497  
   498          /* Blank pixel data with OPP DPG */
   499          for (i = 0; i < dc->res_pool->timing_generator_count; i++) {
   500                  struct timing_generator *tg = 
dc->res_pool->timing_generators[i];
   501  
   502                  if (tg->funcs->is_tg_enabled(tg))
   503                          hws->funcs.init_blank(dc, tg);
   504          }
   505  
   506          for (i = 0; i < res_pool->timing_generator_count; i++) {
   507                  struct timing_generator *tg = 
dc->res_pool->timing_generators[i];
   508  
   509                  if (tg->funcs->is_tg_enabled(tg))
   510                          tg->funcs->lock(tg);
   511          }
   512  
   513          for (i = 0; i < dc->res_pool->pipe_count; i++) {
   514                  struct dpp *dpp = res_pool->dpps[i];
   515  
   516                  dpp->funcs->dpp_reset(dpp);
   517          }
   518  
   519          /* Reset all MPCC muxes */
   520          res_pool->mpc->funcs->mpc_init(res_pool->mpc);
   521  
   522          /* initialize OPP mpc_tree parameter */
   523          for (i = 0; i < dc->res_pool->res_cap->num_opp; i++) {
   524                  res_pool->opps[i]->mpc_tree_params.opp_id = 
res_pool->opps[i]->inst;
   525                  res_pool->opps[i]->mpc_tree_params.opp_list = NULL;
   526                  for (j = 0; j < MAX_PIPES; j++)
   527                          res_pool->opps[i]->mpcc_disconnect_pending[j] = 
false;
   528          }
   529  
   530          for (i = 0; i < dc->res_pool->pipe_count; i++) {
   531                  struct timing_generator *tg = 
dc->res_pool->timing_generators[i];
   532                  struct pipe_ctx *pipe_ctx = 
&context->res_ctx.pipe_ctx[i];
   533                  struct hubp *hubp = dc->res_pool->hubps[i];
   534                  struct dpp *dpp = dc->res_pool->dpps[i];
   535  
   536                  pipe_ctx->stream_res.tg = tg;
   537                  pipe_ctx->pipe_idx = i;
   538  
   539                  pipe_ctx->plane_res.hubp = hubp;
   540                  pipe_ctx->plane_res.dpp = dpp;
   541                  pipe_ctx->plane_res.mpcc_inst = dpp->inst;
   542                  hubp->mpcc_id = dpp->inst;
   543                  hubp->opp_id = OPP_ID_INVALID;
   544                  hubp->power_gated = false;
   545                  pipe_ctx->stream_res.opp = NULL;
   546  
   547                  hubp->funcs->hubp_init(hubp);
   548  
   549                  //dc->res_pool->opps[i]->mpc_tree_params.opp_id = 
dc->res_pool->opps[i]->inst;
   550                  //dc->res_pool->opps[i]->mpc_tree_params.opp_list = 
NULL;
   551                  
dc->res_pool->opps[i]->mpcc_disconnect_pending[pipe_ctx->plane_res.mpcc_inst] = 
true;
   552                  pipe_ctx->stream_res.opp = dc->res_pool->opps[i];
   553                  /*to do*/
   554                  hws->funcs.plane_atomic_disconnect(dc, pipe_ctx);
   555          }
   556  
   557          /* initialize DWB pointer to MCIF_WB */
   558          for (i = 0; i < res_pool->res_cap->num_dwb; i++)
   559                  res_pool->dwbc[i]->mcif = res_pool->mcif_wb[i];
   560  
   561          for (i = 0; i < dc->res_pool->timing_generator_count; i++) {
   562                  struct timing_generator *tg = 
dc->res_pool->timing_generators[i];
   563  
   564                  if (tg->funcs->is_tg_enabled(tg))
   565                          tg->funcs->unlock(tg);
   566          }
   567  
   568          for (i = 0; i < dc->res_pool->pipe_count; i++) {
   569                  struct pipe_ctx *pipe_ctx = 
&context->res_ctx.pipe_ctx[i];
   570  
   571                  dc->hwss.disable_plane(dc, pipe_ctx);
   572  
   573                  pipe_ctx->stream_res.tg = NULL;
   574                  pipe_ctx->plane_res.hubp = NULL;
   575          }
   576  
   577          for (i = 0; i < dc->res_pool->timing_generator_count; i++) {
   578                  struct timing_generator *tg = 
dc->res_pool->timing_generators[i];
   579  
   580                  tg->funcs->tg_init(tg);
   581          }
   582  
   583          /* end of FPGA. Below if real ASIC */
   584          if (IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment))
   585                  return;
   586  
   587  
   588          for (i = 0; i < res_pool->audio_count; i++) {
   589                  struct audio *audio = res_pool->audios[i];
   590  
   591                  audio->funcs->hw_init(audio);
   592          }
   593  
   594          for (i = 0; i < dc->link_count; i++) {
   595                  struct dc_link *link = dc->links[i];
   596  
   597                  if (link->panel_cntl)
   598                          backlight = 
link->panel_cntl->funcs->hw_init(link->panel_cntl);
   599          }
   600  
   601          for (i = 0; i < dc->res_pool->pipe_count; i++) {
   602                  if (abms[i] != NULL)
   603                          abms[i]->funcs->abm_init(abms[i], backlight);
   604          }
   605  
   606          /* power AFMT HDMI memory TODO: may move to dis/en output save 
power*/
   607          REG_WRITE(DIO_MEM_PWR_CTRL, 0);
   608  
   609          if (!dc->debug.disable_clock_gate) {
   610                  /* enable all DCN clock gating */
   611                  REG_WRITE(DCCG_GATE_DISABLE_CNTL, 0);
   612  
   613                  REG_WRITE(DCCG_GATE_DISABLE_CNTL2, 0);
   614  
   615                  REG_UPDATE(DCFCLK_CNTL, DCFCLK_GATE_DIS, 0);
   616          }
   617  
   618          if (dc->clk_mgr->funcs->notify_wm_ranges)
                    ^^^^^^^^^^^
This code dereferences it without checking for NULL.

   619                  dc->clk_mgr->funcs->notify_wm_ranges(dc->clk_mgr);
   620  

regards,
dan carpenter
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to