kfree(dm_state);
}
+static struct drm_private_state *
+dm_atomic_create_state(struct drm_private_obj *obj)
+{
+ struct amdgpu_device *adev = drm_to_adev(obj->dev);
+ struct dm_atomic_state *dm_state;
+ struct dc_state *context;
+
+ dm_state = kzalloc_obj(*dm_state);
+ if (!dm_state)
+ return ERR_PTR(-ENOMEM);
+
+ context = dc_state_create_current_copy(adev->dm.dc);
+ if (!context) {
+ kfree(dm_state);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ __drm_atomic_helper_private_obj_create_state(obj, &dm_state->base);
+ dm_state->context = context;
+
+ return &dm_state->base;
+}
+
static struct drm_private_state_funcs dm_atomic_state_funcs = {
+ .atomic_create_state = dm_atomic_create_state,
.atomic_duplicate_state = dm_atomic_duplicate_state,
.atomic_destroy_state = dm_atomic_destroy_state,
};
static int amdgpu_dm_mode_config_init(struct amdgpu_device *adev)
{
- struct dm_atomic_state *state;
int r;
adev->mode_info.mode_config_initialized = true;
/* indicates support for immediate flip */
adev_to_drm(adev)->mode_config.async_page_flip = true;
- state = kzalloc_obj(*state);
- if (!state)
- return -ENOMEM;
-
- state->context = dc_state_create_current_copy(adev->dm.dc);
- if (!state->context) {
- kfree(state);
- return -ENOMEM;
- }
-
drm_atomic_private_obj_init(adev_to_drm(adev),
&adev->dm.atomic_obj,
- &state->base,
+ NULL,
&dm_atomic_state_funcs);
r = amdgpu_display_modeset_create_props(adev);
- if (r) {
- dc_state_release(state->context);
- kfree(state);
+ if (r)
return r;
- }
#ifdef AMD_PRIVATE_COLOR
- if (amdgpu_dm_create_color_properties(adev)) {
- dc_state_release(state->context);
- kfree(state);
+ if (amdgpu_dm_create_color_properties(adev))
return -ENOMEM;
- }
#endif
r = amdgpu_dm_audio_init(adev);
- if (r) {
- dc_state_release(state->context);
- kfree(state);
+ if (r)
return r;
- }
return 0;
}