[bug report] drm/amd/dc: Add dc display driver (v2)

Dan Carpenter dan.carpenter at oracle.com
Thu Nov 1 09:48:17 UTC 2018


Hello Harry Wentland,

The patch 4562236b3bc0: "drm/amd/dc: Add dc display driver (v2)" from
Sep 12, 2017, leads to the following static checker warning:

	drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.c:688 construct()
	error: we previously assumed 'dc->current_state' could be null (see line 617)

drivers/gpu/drm/amd/amdgpu/../display/dc/core/dc.c
   519  static void destruct(struct dc *dc)
   520  {
   521          dc_release_state(dc->current_state);
                                 ^^^^^^^^^^^^^^^^^
destruct assumes that dc->current_state is non-NULL

   522          dc->current_state = NULL;
   523  
   524          destroy_links(dc);
   525  
   526          dc_destroy_resource_pool(dc);
   527  
   528          if (dc->ctx->gpio_service)
                    ^^^^^^^

This is also a NULL dereference bug but Smatch does not catch it.

   529                  dal_gpio_service_destroy(&dc->ctx->gpio_service);
   530  
   531          if (dc->ctx->i2caux)
   532                  dal_i2caux_destroy(&dc->ctx->i2caux);
   533  
   534          if (dc->ctx->created_bios)
   535                  dal_bios_parser_destroy(&dc->ctx->dc_bios);
   536  
   537          kfree(dc->ctx);
   538          dc->ctx = NULL;
   539  
   540          kfree(dc->bw_vbios);
   541          dc->bw_vbios = NULL;
   542  
   543          kfree(dc->bw_dceip);
   544          dc->bw_dceip = NULL;
   545  
   546  #ifdef CONFIG_DRM_AMD_DC_DCN1_0
   547          kfree(dc->dcn_soc);
   548          dc->dcn_soc = NULL;
   549  
   550          kfree(dc->dcn_ip);
   551          dc->dcn_ip = NULL;
   552  
   553  #endif
   554  }
   555  
   556  static bool construct(struct dc *dc,
   557                  const struct dc_init_data *init_params)
   558  {
   559          struct dc_context *dc_ctx;
   560          struct bw_calcs_dceip *dc_dceip;
   561          struct bw_calcs_vbios *dc_vbios;
   562  #ifdef CONFIG_DRM_AMD_DC_DCN1_0
   563          struct dcn_soc_bounding_box *dcn_soc;
   564          struct dcn_ip_params *dcn_ip;
   565  #endif
   566  
   567          enum dce_version dc_version = DCE_VERSION_UNKNOWN;
   568  
   569          dc_dceip = kzalloc(sizeof(*dc_dceip), GFP_KERNEL);
   570          if (!dc_dceip) {
   571                  dm_error("%s: failed to create dceip\n", __func__);
   572                  goto fail;
   573          }
   574  
   575          dc->bw_dceip = dc_dceip;
   576  
   577          dc_vbios = kzalloc(sizeof(*dc_vbios), GFP_KERNEL);
   578          if (!dc_vbios) {
   579                  dm_error("%s: failed to create vbios\n", __func__);
   580                  goto fail;
   581          }
   582  
   583          dc->bw_vbios = dc_vbios;
   584  #ifdef CONFIG_DRM_AMD_DC_DCN1_0
   585          dcn_soc = kzalloc(sizeof(*dcn_soc), GFP_KERNEL);
   586          if (!dcn_soc) {
   587                  dm_error("%s: failed to create dcn_soc\n", __func__);
   588                  goto fail;
   589          }
   590  
   591          dc->dcn_soc = dcn_soc;
   592  
   593          dcn_ip = kzalloc(sizeof(*dcn_ip), GFP_KERNEL);
   594          if (!dcn_ip) {
   595                  dm_error("%s: failed to create dcn_ip\n", __func__);
   596                  goto fail;
   597          }
   598  
   599          dc->dcn_ip = dcn_ip;
   600  #endif
   601  
   602          dc_ctx = kzalloc(sizeof(*dc_ctx), GFP_KERNEL);
   603          if (!dc_ctx) {
   604                  dm_error("%s: failed to create ctx\n", __func__);
   605                  goto fail;
   606          }
   607  
   608          dc_ctx->cgs_device = init_params->cgs_device;
   609          dc_ctx->driver_context = init_params->driver;
   610          dc_ctx->dc = dc;
   611          dc_ctx->asic_id = init_params->asic_id;
   612          dc_ctx->dc_sink_id_count = 0;
   613          dc->ctx = dc_ctx;
   614  
   615          dc->current_state = dc_create_state();
   616  
   617          if (!dc->current_state) {
                    ^^^^^^^^^^^^^^^^^^
Check for NULL.

   618                  dm_error("%s: failed to create validate ctx\n", __func__);
   619                  goto fail;
   620          }
   621  
   622          /* Create logger */
   623  
   624          dc_ctx->dce_environment = init_params->dce_environment;
   625  
   626          dc_version = resource_parse_asic_id(init_params->asic_id);
   627          dc_ctx->dce_version = dc_version;
   628  
   629          /* Resource should construct all asic specific resources.
   630           * This should be the only place where we need to parse the asic id
   631           */
   632          if (init_params->vbios_override)
   633                  dc_ctx->dc_bios = init_params->vbios_override;
   634          else {
   635                  /* Create BIOS parser */
   636                  struct bp_init_data bp_init_data;
   637  
   638                  bp_init_data.ctx = dc_ctx;
   639                  bp_init_data.bios = init_params->asic_id.atombios_base_address;
   640  
   641                  dc_ctx->dc_bios = dal_bios_parser_create(
   642                                  &bp_init_data, dc_version);
   643  
   644                  if (!dc_ctx->dc_bios) {
   645                          ASSERT_CRITICAL(false);
   646                          goto fail;
   647                  }
   648  
   649                  dc_ctx->created_bios = true;
   650                  }
   651  
   652          /* Create I2C AUX */
   653          dc_ctx->i2caux = dal_i2caux_create(dc_ctx);
   654  
   655          if (!dc_ctx->i2caux) {
   656                  ASSERT_CRITICAL(false);
   657                  goto fail;
   658          }
   659  
   660          /* Create GPIO service */
   661          dc_ctx->gpio_service = dal_gpio_service_create(
   662                          dc_version,
   663                          dc_ctx->dce_environment,
   664                          dc_ctx);
   665  
   666          if (!dc_ctx->gpio_service) {
   667                  ASSERT_CRITICAL(false);
   668                  goto fail;
   669          }
   670  
   671          dc->res_pool = dc_create_resource_pool(
   672                          dc,
   673                          init_params->num_virtual_links,
   674                          dc_version,
   675                          init_params->asic_id);
   676          if (!dc->res_pool)
   677                  goto fail;
   678  
   679          dc_resource_state_construct(dc, dc->current_state);
   680  
   681          if (!create_links(dc, init_params->num_virtual_links))
   682                  goto fail;
   683  
   684          return true;
   685  
   686  fail:
   687  
   688          destruct(dc);
   689          return false;
   690  }

regards,
dan carpenter


More information about the amd-gfx mailing list