mirror of https://gitee.com/openkylin/linux.git
drm/atomic: Make prepare_fb/cleanup_fb only take state, v3.
This removes the need to separately track fb changes i915. That will be done as a separate commit, however. Changes since v1: - Add dri-devel to cc. - Fix a check in intel's prepare and cleanup fb to take rotation into account. Changes since v2: - Split out i915 changes to a separate commit. Cc: dri-devel@lists.freedesktop.org Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Daniel Stone <daniels@collabora.com> [danvet: Squash in msm fixup from Maarten.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
825926d8e0
commit
844f9111f6
|
@ -712,11 +712,13 @@ static int atmel_hlcdc_plane_atomic_check(struct drm_plane *p,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int atmel_hlcdc_plane_prepare_fb(struct drm_plane *p,
|
static int atmel_hlcdc_plane_prepare_fb(struct drm_plane *p,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state)
|
const struct drm_plane_state *new_state)
|
||||||
{
|
{
|
||||||
struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p);
|
struct atmel_hlcdc_plane *plane = drm_plane_to_atmel_hlcdc_plane(p);
|
||||||
|
|
||||||
|
if (!new_state->fb)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return atmel_hlcdc_layer_update_start(&plane->layer);
|
return atmel_hlcdc_layer_update_start(&plane->layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1111,17 +1111,14 @@ int drm_atomic_helper_prepare_planes(struct drm_device *dev,
|
||||||
const struct drm_plane_helper_funcs *funcs;
|
const struct drm_plane_helper_funcs *funcs;
|
||||||
struct drm_plane *plane = state->planes[i];
|
struct drm_plane *plane = state->planes[i];
|
||||||
struct drm_plane_state *plane_state = state->plane_states[i];
|
struct drm_plane_state *plane_state = state->plane_states[i];
|
||||||
struct drm_framebuffer *fb;
|
|
||||||
|
|
||||||
if (!plane)
|
if (!plane)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
funcs = plane->helper_private;
|
funcs = plane->helper_private;
|
||||||
|
|
||||||
fb = plane_state->fb;
|
if (funcs->prepare_fb) {
|
||||||
|
ret = funcs->prepare_fb(plane, plane_state);
|
||||||
if (fb && funcs->prepare_fb) {
|
|
||||||
ret = funcs->prepare_fb(plane, fb, plane_state);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -1134,17 +1131,14 @@ int drm_atomic_helper_prepare_planes(struct drm_device *dev,
|
||||||
const struct drm_plane_helper_funcs *funcs;
|
const struct drm_plane_helper_funcs *funcs;
|
||||||
struct drm_plane *plane = state->planes[i];
|
struct drm_plane *plane = state->planes[i];
|
||||||
struct drm_plane_state *plane_state = state->plane_states[i];
|
struct drm_plane_state *plane_state = state->plane_states[i];
|
||||||
struct drm_framebuffer *fb;
|
|
||||||
|
|
||||||
if (!plane)
|
if (!plane)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
funcs = plane->helper_private;
|
funcs = plane->helper_private;
|
||||||
|
|
||||||
fb = state->plane_states[i]->fb;
|
if (funcs->cleanup_fb)
|
||||||
|
funcs->cleanup_fb(plane, plane_state);
|
||||||
if (fb && funcs->cleanup_fb)
|
|
||||||
funcs->cleanup_fb(plane, fb, plane_state);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1300,14 +1294,11 @@ void drm_atomic_helper_cleanup_planes(struct drm_device *dev,
|
||||||
|
|
||||||
for_each_plane_in_state(old_state, plane, plane_state, i) {
|
for_each_plane_in_state(old_state, plane, plane_state, i) {
|
||||||
const struct drm_plane_helper_funcs *funcs;
|
const struct drm_plane_helper_funcs *funcs;
|
||||||
struct drm_framebuffer *old_fb;
|
|
||||||
|
|
||||||
funcs = plane->helper_private;
|
funcs = plane->helper_private;
|
||||||
|
|
||||||
old_fb = plane_state->fb;
|
if (funcs->cleanup_fb)
|
||||||
|
funcs->cleanup_fb(plane, plane_state);
|
||||||
if (old_fb && funcs->cleanup_fb)
|
|
||||||
funcs->cleanup_fb(plane, old_fb, plane_state);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
|
EXPORT_SYMBOL(drm_atomic_helper_cleanup_planes);
|
||||||
|
|
|
@ -426,7 +426,7 @@ int drm_plane_helper_commit(struct drm_plane *plane,
|
||||||
|
|
||||||
if (plane_funcs->prepare_fb && plane_state->fb &&
|
if (plane_funcs->prepare_fb && plane_state->fb &&
|
||||||
plane_state->fb != old_fb) {
|
plane_state->fb != old_fb) {
|
||||||
ret = plane_funcs->prepare_fb(plane, plane_state->fb,
|
ret = plane_funcs->prepare_fb(plane,
|
||||||
plane_state);
|
plane_state);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -479,8 +479,8 @@ int drm_plane_helper_commit(struct drm_plane *plane,
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (plane_funcs->cleanup_fb && old_fb)
|
if (plane_funcs->cleanup_fb)
|
||||||
plane_funcs->cleanup_fb(plane, old_fb, plane_state);
|
plane_funcs->cleanup_fb(plane, plane_state);
|
||||||
out:
|
out:
|
||||||
if (plane_state) {
|
if (plane_state) {
|
||||||
if (plane->funcs->atomic_destroy_state)
|
if (plane->funcs->atomic_destroy_state)
|
||||||
|
|
|
@ -13313,10 +13313,10 @@ static void intel_shared_dpll_init(struct drm_device *dev)
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
intel_prepare_plane_fb(struct drm_plane *plane,
|
intel_prepare_plane_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state)
|
const struct drm_plane_state *new_state)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = plane->dev;
|
struct drm_device *dev = plane->dev;
|
||||||
|
struct drm_framebuffer *fb = new_state->fb;
|
||||||
struct intel_plane *intel_plane = to_intel_plane(plane);
|
struct intel_plane *intel_plane = to_intel_plane(plane);
|
||||||
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
||||||
struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb);
|
struct drm_i915_gem_object *old_obj = intel_fb_obj(plane->fb);
|
||||||
|
@ -13354,19 +13354,18 @@ intel_prepare_plane_fb(struct drm_plane *plane,
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
intel_cleanup_plane_fb(struct drm_plane *plane,
|
intel_cleanup_plane_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *old_state)
|
const struct drm_plane_state *old_state)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = plane->dev;
|
struct drm_device *dev = plane->dev;
|
||||||
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
|
struct drm_i915_gem_object *obj = intel_fb_obj(old_state->fb);
|
||||||
|
|
||||||
if (WARN_ON(!obj))
|
if (!obj)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (plane->type != DRM_PLANE_TYPE_CURSOR ||
|
if (plane->type != DRM_PLANE_TYPE_CURSOR ||
|
||||||
!INTEL_INFO(dev)->cursor_needs_physical) {
|
!INTEL_INFO(dev)->cursor_needs_physical) {
|
||||||
mutex_lock(&dev->struct_mutex);
|
mutex_lock(&dev->struct_mutex);
|
||||||
intel_unpin_fb_obj(fb, old_state);
|
intel_unpin_fb_obj(old_state->fb, old_state);
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1038,10 +1038,8 @@ void intel_finish_page_flip(struct drm_device *dev, int pipe);
|
||||||
void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
|
void intel_finish_page_flip_plane(struct drm_device *dev, int plane);
|
||||||
void intel_check_page_flip(struct drm_device *dev, int pipe);
|
void intel_check_page_flip(struct drm_device *dev, int pipe);
|
||||||
int intel_prepare_plane_fb(struct drm_plane *plane,
|
int intel_prepare_plane_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state);
|
const struct drm_plane_state *new_state);
|
||||||
void intel_cleanup_plane_fb(struct drm_plane *plane,
|
void intel_cleanup_plane_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *old_state);
|
const struct drm_plane_state *old_state);
|
||||||
int intel_plane_atomic_get_property(struct drm_plane *plane,
|
int intel_plane_atomic_get_property(struct drm_plane *plane,
|
||||||
const struct drm_plane_state *state,
|
const struct drm_plane_state *state,
|
||||||
|
|
|
@ -99,22 +99,28 @@ static const struct drm_plane_funcs mdp4_plane_funcs = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mdp4_plane_prepare_fb(struct drm_plane *plane,
|
static int mdp4_plane_prepare_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state)
|
const struct drm_plane_state *new_state)
|
||||||
{
|
{
|
||||||
struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
|
struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
|
||||||
struct mdp4_kms *mdp4_kms = get_kms(plane);
|
struct mdp4_kms *mdp4_kms = get_kms(plane);
|
||||||
|
struct drm_framebuffer *fb = new_state->fb;
|
||||||
|
|
||||||
|
if (!fb)
|
||||||
|
return 0;
|
||||||
|
|
||||||
DBG("%s: prepare: FB[%u]", mdp4_plane->name, fb->base.id);
|
DBG("%s: prepare: FB[%u]", mdp4_plane->name, fb->base.id);
|
||||||
return msm_framebuffer_prepare(fb, mdp4_kms->id);
|
return msm_framebuffer_prepare(fb, mdp4_kms->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
|
static void mdp4_plane_cleanup_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *old_state)
|
const struct drm_plane_state *old_state)
|
||||||
{
|
{
|
||||||
struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
|
struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane);
|
||||||
struct mdp4_kms *mdp4_kms = get_kms(plane);
|
struct mdp4_kms *mdp4_kms = get_kms(plane);
|
||||||
|
struct drm_framebuffer *fb = old_state->fb;
|
||||||
|
|
||||||
|
if (!fb)
|
||||||
|
return;
|
||||||
|
|
||||||
DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id);
|
DBG("%s: cleanup: FB[%u]", mdp4_plane->name, fb->base.id);
|
||||||
msm_framebuffer_cleanup(fb, mdp4_kms->id);
|
msm_framebuffer_cleanup(fb, mdp4_kms->id);
|
||||||
|
|
|
@ -250,22 +250,28 @@ static const struct drm_plane_funcs mdp5_plane_funcs = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mdp5_plane_prepare_fb(struct drm_plane *plane,
|
static int mdp5_plane_prepare_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state)
|
const struct drm_plane_state *new_state)
|
||||||
{
|
{
|
||||||
struct mdp5_plane *mdp5_plane = to_mdp5_plane(plane);
|
struct mdp5_plane *mdp5_plane = to_mdp5_plane(plane);
|
||||||
struct mdp5_kms *mdp5_kms = get_kms(plane);
|
struct mdp5_kms *mdp5_kms = get_kms(plane);
|
||||||
|
struct drm_framebuffer *fb = new_state->fb;
|
||||||
|
|
||||||
|
if (!new_state->fb)
|
||||||
|
return 0;
|
||||||
|
|
||||||
DBG("%s: prepare: FB[%u]", mdp5_plane->name, fb->base.id);
|
DBG("%s: prepare: FB[%u]", mdp5_plane->name, fb->base.id);
|
||||||
return msm_framebuffer_prepare(fb, mdp5_kms->id);
|
return msm_framebuffer_prepare(fb, mdp5_kms->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mdp5_plane_cleanup_fb(struct drm_plane *plane,
|
static void mdp5_plane_cleanup_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *old_state)
|
const struct drm_plane_state *old_state)
|
||||||
{
|
{
|
||||||
struct mdp5_plane *mdp5_plane = to_mdp5_plane(plane);
|
struct mdp5_plane *mdp5_plane = to_mdp5_plane(plane);
|
||||||
struct mdp5_kms *mdp5_kms = get_kms(plane);
|
struct mdp5_kms *mdp5_kms = get_kms(plane);
|
||||||
|
struct drm_framebuffer *fb = old_state->fb;
|
||||||
|
|
||||||
|
if (!fb)
|
||||||
|
return;
|
||||||
|
|
||||||
DBG("%s: cleanup: FB[%u]", mdp5_plane->name, fb->base.id);
|
DBG("%s: cleanup: FB[%u]", mdp5_plane->name, fb->base.id);
|
||||||
msm_framebuffer_cleanup(fb, mdp5_kms->id);
|
msm_framebuffer_cleanup(fb, mdp5_kms->id);
|
||||||
|
|
|
@ -60,17 +60,19 @@ to_omap_plane_state(struct drm_plane_state *state)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int omap_plane_prepare_fb(struct drm_plane *plane,
|
static int omap_plane_prepare_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state)
|
const struct drm_plane_state *new_state)
|
||||||
{
|
{
|
||||||
return omap_framebuffer_pin(fb);
|
if (!new_state->fb)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return omap_framebuffer_pin(new_state->fb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void omap_plane_cleanup_fb(struct drm_plane *plane,
|
static void omap_plane_cleanup_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *old_state)
|
const struct drm_plane_state *old_state)
|
||||||
{
|
{
|
||||||
omap_framebuffer_unpin(fb);
|
if (old_state->fb)
|
||||||
|
omap_framebuffer_unpin(old_state->fb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void omap_plane_atomic_update(struct drm_plane *plane,
|
static void omap_plane_atomic_update(struct drm_plane *plane,
|
||||||
|
|
|
@ -480,14 +480,12 @@ static const struct drm_plane_funcs tegra_primary_plane_funcs = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tegra_plane_prepare_fb(struct drm_plane *plane,
|
static int tegra_plane_prepare_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state)
|
const struct drm_plane_state *new_state)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tegra_plane_cleanup_fb(struct drm_plane *plane,
|
static void tegra_plane_cleanup_fb(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *old_fb)
|
const struct drm_plane_state *old_fb)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,10 +58,8 @@ int drm_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
|
||||||
*/
|
*/
|
||||||
struct drm_plane_helper_funcs {
|
struct drm_plane_helper_funcs {
|
||||||
int (*prepare_fb)(struct drm_plane *plane,
|
int (*prepare_fb)(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *new_state);
|
const struct drm_plane_state *new_state);
|
||||||
void (*cleanup_fb)(struct drm_plane *plane,
|
void (*cleanup_fb)(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
|
||||||
const struct drm_plane_state *old_state);
|
const struct drm_plane_state *old_state);
|
||||||
|
|
||||||
int (*atomic_check)(struct drm_plane *plane,
|
int (*atomic_check)(struct drm_plane *plane,
|
||||||
|
|
Loading…
Reference in New Issue