diff --git a/sys/dev/drm/drm_mode_config.c b/sys/dev/drm/drm_mode_config.c index 0000000..0000001 100644 --- a/sys/dev/drm/drm_mode_config.c +++ b/sys/dev/drm/drm_mode_config.c @@ -365,14 +365,16 @@ EXPORT_SYMBOL(drm_mode_config_reset); * driver's problem to ensure this guarantee. * */ -void drm_mode_config_init(struct drm_device *dev) +int drm_mode_config_init(struct drm_device *dev) { + int ret; + lockinit(&dev->mode_config.mutex, "drmmcm", 0, LK_CANRECURSE); drm_modeset_lock_init(&dev->mode_config.connection_mutex); lockinit(&dev->mode_config.idr_mutex, "mcfgidr", 0, LK_CANRECURSE); lockinit(&dev->mode_config.fb_lock, "drmfbl", 0, LK_CANRECURSE); lockinit(&dev->mode_config.blob_lock, "drmcbl", 0, LK_CANRECURSE); @@ -387,9 +389,13 @@ void drm_mode_config_init(struct drm_device *dev) INIT_WORK(&dev->mode_config.connector_free_work, drm_connector_free_work_fn); - drm_mode_create_standard_properties(dev); + ret = drm_mode_create_standard_properties(dev); + if (ret) + return ret; /* Just to be sure */ dev->mode_config.num_fb = 0; @@ -397,6 +403,8 @@ void drm_mode_config_init(struct drm_device *dev) dev->mode_config.num_crtc = 0; dev->mode_config.num_encoder = 0; dev->mode_config.num_total_plane = 0; + + return 0; } EXPORT_SYMBOL(drm_mode_config_init); diff --git a/sys/dev/drm/include/drm/drm_mode_config.h b/sys/dev/drm/include/drm/drm_mode_config.h index 0000000..0000002 100644 --- a/sys/dev/drm/include/drm/drm_mode_config.h +++ b/sys/dev/drm/include/drm/drm_mode_config.h @@ -869,7 +869,7 @@ struct drm_mode_config { const struct drm_mode_config_helper_funcs *helper_private; }; -void drm_mode_config_init(struct drm_device *dev); +int drm_mode_config_init(struct drm_device *dev); void drm_mode_config_reset(struct drm_device *dev); void drm_mode_config_cleanup(struct drm_device *dev); diff --git a/sys/dev/drm/i915/intel_display.c b/sys/dev/drm/i915/intel_display.c index 0000000..0000003 100644 --- a/sys/dev/drm/i915/intel_display.c +++ b/sys/dev/drm/i915/intel_display.c @@ -15340,7 +15340,10 @@ int intel_modeset_init(struct drm_device *dev) dev_priv->modeset_wq = alloc_ordered_workqueue("i915_modeset", 0); - drm_mode_config_init(dev); + ret = drm_mode_config_init(dev); + if (ret) + return ret; dev->mode_config.min_width = 0; dev->mode_config.min_height = 0; diff --git a/sys/dev/drm/radeon/radeon_display.c b/sys/dev/drm/radeon/radeon_display.c index 0000000..0000004 100644 --- a/sys/dev/drm/radeon/radeon_display.c +++ b/sys/dev/drm/radeon/radeon_display.c @@ -1576,8 +1576,10 @@ int radeon_modeset_init(struct radeon_device *rdev) int i; int ret; - drm_mode_config_init(rdev->ddev); + ret = drm_mode_config_init(rdev->ddev); + if (ret) + return ret; rdev->mode_info.mode_config_initialized = true; rdev->ddev->mode_config.funcs = &radeon_mode_funcs; diff --git a/sys/dev/drm/amd/amdgpu/amdgpu_device.c b/sys/dev/drm/amd/amdgpu/amdgpu_device.c index 0000000..0000005 100644 --- a/sys/dev/drm/amd/amdgpu/amdgpu_device.c +++ b/sys/dev/drm/amd/amdgpu/amdgpu_device.c @@ -2601,8 +2601,11 @@ fence_driver_init: kprintf("amdgpu_device_init: 8\n"); /* init the mode config */ - drm_mode_config_init(adev->ddev); + r = drm_mode_config_init(adev->ddev); + if (r) + goto failed; r = amdgpu_device_ip_init(adev);