Move intel_reuse_initial_plane_obj() into common display code, and split the ->find_obj hook into ->alloc_obj and ->setup hooks.
Return the struct drm_gem_object from ->alloc_obj in preparation for moving more things to display. Signed-off-by: Jani Nikula <[email protected]> --- .../drm/i915/display/intel_initial_plane.c | 55 ++++++++++++++- drivers/gpu/drm/i915/i915_initial_plane.c | 70 ++++--------------- drivers/gpu/drm/xe/display/xe_initial_plane.c | 67 ++++-------------- include/drm/intel/display_parent_interface.h | 7 +- 4 files changed, 88 insertions(+), 111 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_initial_plane.c b/drivers/gpu/drm/i915/display/intel_initial_plane.c index 9e67da94ac02..cbfcc52f180f 100644 --- a/drivers/gpu/drm/i915/display/intel_initial_plane.c +++ b/drivers/gpu/drm/i915/display/intel_initial_plane.c @@ -14,6 +14,43 @@ void intel_initial_plane_vblank_wait(struct intel_crtc *crtc) display->parent->initial_plane->vblank_wait(&crtc->base); } +static const struct intel_plane_state * +intel_reuse_initial_plane_obj(struct intel_crtc *this, + const struct intel_initial_plane_config plane_configs[]) +{ + struct intel_display *display = to_intel_display(this); + struct intel_crtc *crtc; + + for_each_intel_crtc(display->drm, crtc) { + struct intel_plane *plane = + to_intel_plane(crtc->base.primary); + const struct intel_plane_state *plane_state = + to_intel_plane_state(plane->base.state); + const struct intel_crtc_state *crtc_state = + to_intel_crtc_state(crtc->base.state); + + if (!crtc_state->hw.active) + continue; + + if (!plane_state->ggtt_vma) + continue; + + if (plane_configs[this->pipe].base == plane_configs[crtc->pipe].base) + return plane_state; + } + + return NULL; +} + +static struct drm_gem_object * +intel_alloc_initial_plane_obj(struct intel_crtc *crtc, + struct intel_initial_plane_config *plane_config) +{ + struct intel_display *display = to_intel_display(crtc); + + return display->parent->initial_plane->alloc_obj(&crtc->base, plane_config); +} + static void intel_find_initial_plane_obj(struct intel_crtc *crtc, struct intel_initial_plane_config plane_configs[]) @@ -21,6 +58,8 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc, struct intel_display *display = to_intel_display(crtc); struct intel_initial_plane_config *plane_config = &plane_configs[crtc->pipe]; struct intel_plane *plane = to_intel_plane(crtc->base.primary); + struct drm_framebuffer *fb; + struct i915_vma *vma; int ret; /* @@ -31,7 +70,21 @@ intel_find_initial_plane_obj(struct intel_crtc *crtc, if (!plane_config->fb) return; - ret = display->parent->initial_plane->find_obj(&crtc->base, plane_configs); + if (intel_alloc_initial_plane_obj(crtc, plane_config)) { + fb = &plane_config->fb->base; + vma = plane_config->vma; + } else { + const struct intel_plane_state *other_plane_state; + + other_plane_state = intel_reuse_initial_plane_obj(crtc, plane_configs); + if (!other_plane_state) + goto nofb; + + fb = other_plane_state->hw.fb; + vma = other_plane_state->ggtt_vma; + } + + ret = display->parent->initial_plane->setup(&crtc->base, plane_config, fb, vma); if (ret) goto nofb; diff --git a/drivers/gpu/drm/i915/i915_initial_plane.c b/drivers/gpu/drm/i915/i915_initial_plane.c index 40b9f981c9ac..0117f9e115d1 100644 --- a/drivers/gpu/drm/i915/i915_initial_plane.c +++ b/drivers/gpu/drm/i915/i915_initial_plane.c @@ -25,34 +25,6 @@ static void i915_initial_plane_vblank_wait(struct drm_crtc *crtc) intel_crtc_wait_for_next_vblank(to_intel_crtc(crtc)); } -static const struct intel_plane_state * -intel_reuse_initial_plane_obj(struct intel_crtc *this, - const struct intel_initial_plane_config plane_configs[]) -{ - struct intel_display *display = to_intel_display(this); - struct intel_crtc *crtc; - - for_each_intel_crtc(display->drm, crtc) { - struct intel_plane *plane = - to_intel_plane(crtc->base.primary); - const struct intel_plane_state *plane_state = - to_intel_plane_state(plane->base.state); - const struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - - if (!crtc_state->hw.active) - continue; - - if (!plane_state->ggtt_vma) - continue; - - if (plane_configs[this->pipe].base == plane_configs[crtc->pipe].base) - return plane_state; - } - - return NULL; -} - static enum intel_memory_type initial_plane_memory_type(struct intel_display *display) { @@ -258,10 +230,11 @@ initial_plane_vma(struct intel_display *display, return NULL; } -static bool -intel_alloc_initial_plane_obj(struct intel_crtc *crtc, - struct intel_initial_plane_config *plane_config) +static struct drm_gem_object * +i915_alloc_initial_plane_obj(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config) { + struct intel_crtc *crtc = to_intel_crtc(_crtc); struct intel_display *display = to_intel_display(crtc); struct drm_mode_fb_cmd2 mode_cmd = {}; struct drm_framebuffer *fb = &plane_config->fb->base; @@ -277,12 +250,12 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, drm_dbg(display->drm, "Unsupported modifier for initial FB: 0x%llx\n", fb->modifier); - return false; + return NULL; } vma = initial_plane_vma(display, plane_config); if (!vma) - return false; + return NULL; mode_cmd.pixel_format = fb->format->format; mode_cmd.width = fb->width; @@ -299,41 +272,25 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, } plane_config->vma = vma; - return true; + return intel_bo_to_drm_bo(vma->obj); err_vma: i915_vma_put(vma); - return false; + return NULL; } static int -i915_find_initial_plane_obj(struct drm_crtc *_crtc, - struct intel_initial_plane_config plane_configs[]) +i915_initial_plane_setup(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config, + struct drm_framebuffer *fb, + struct i915_vma *vma) { struct intel_crtc *crtc = to_intel_crtc(_crtc); struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); - struct intel_initial_plane_config *plane_config = - &plane_configs[crtc->pipe]; struct intel_plane *plane = to_intel_plane(crtc->base.primary); struct intel_plane_state *plane_state = to_intel_plane_state(plane->base.state); - struct drm_framebuffer *fb; - struct i915_vma *vma; - - if (intel_alloc_initial_plane_obj(crtc, plane_config)) { - fb = &plane_config->fb->base; - vma = plane_config->vma; - } else { - const struct intel_plane_state *other_plane_state; - - other_plane_state = intel_reuse_initial_plane_obj(crtc, plane_configs); - if (!other_plane_state) - return -EINVAL; - - fb = other_plane_state->hw.fb; - vma = other_plane_state->ggtt_vma; - } plane_state->uapi.rotation = plane_config->rotation; intel_fb_fill_view(to_intel_framebuffer(fb), @@ -379,6 +336,7 @@ static void i915_plane_config_fini(struct intel_initial_plane_config *plane_conf const struct intel_display_initial_plane_interface i915_display_initial_plane_interface = { .vblank_wait = i915_initial_plane_vblank_wait, - .find_obj = i915_find_initial_plane_obj, + .alloc_obj = i915_alloc_initial_plane_obj, + .setup = i915_initial_plane_setup, .config_fini = i915_plane_config_fini, }; diff --git a/drivers/gpu/drm/xe/display/xe_initial_plane.c b/drivers/gpu/drm/xe/display/xe_initial_plane.c index 42d2c2f8138e..2ce0f78cd7b1 100644 --- a/drivers/gpu/drm/xe/display/xe_initial_plane.c +++ b/drivers/gpu/drm/xe/display/xe_initial_plane.c @@ -45,34 +45,6 @@ static void xe_initial_plane_vblank_wait(struct drm_crtc *_crtc) drm_warn(&xe->drm, "waiting for early vblank failed with %i\n", ret); } -static const struct intel_plane_state * -intel_reuse_initial_plane_obj(struct intel_crtc *this, - const struct intel_initial_plane_config plane_configs[]) -{ - struct xe_device *xe = to_xe_device(this->base.dev); - struct intel_crtc *crtc; - - for_each_intel_crtc(&xe->drm, crtc) { - struct intel_plane *plane = - to_intel_plane(crtc->base.primary); - const struct intel_plane_state *plane_state = - to_intel_plane_state(plane->base.state); - const struct intel_crtc_state *crtc_state = - to_intel_crtc_state(crtc->base.state); - - if (!crtc_state->hw.active) - continue; - - if (!plane_state->ggtt_vma) - continue; - - if (plane_configs[this->pipe].base == plane_configs[crtc->pipe].base) - return plane_state; - } - - return NULL; -} - static struct xe_bo * initial_plane_bo(struct xe_device *xe, struct intel_initial_plane_config *plane_config) @@ -152,10 +124,11 @@ initial_plane_bo(struct xe_device *xe, return bo; } -static bool -intel_alloc_initial_plane_obj(struct intel_crtc *crtc, - struct intel_initial_plane_config *plane_config) +static struct drm_gem_object * +xe_alloc_initial_plane_obj(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config) { + struct intel_crtc *crtc = to_intel_crtc(_crtc); struct xe_device *xe = to_xe_device(crtc->base.dev); struct drm_mode_fb_cmd2 mode_cmd = { 0 }; struct drm_framebuffer *fb = &plane_config->fb->base; @@ -171,7 +144,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, drm_dbg_kms(&xe->drm, "Unsupported modifier for initial FB: 0x%llx\n", fb->modifier); - return false; + return NULL; } mode_cmd.pixel_format = fb->format->format; @@ -183,7 +156,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, bo = initial_plane_bo(xe, plane_config); if (!bo) - return false; + return NULL; if (intel_framebuffer_init(to_intel_framebuffer(fb), &bo->ttm.base, fb->format, &mode_cmd)) { @@ -193,39 +166,26 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, /* Reference handed over to fb */ xe_bo_put(bo); - return true; + return &bo->ttm.base; err_bo: xe_bo_unpin_map_no_vm(bo); - return false; + return NULL; } static int -xe_find_initial_plane_obj(struct drm_crtc *_crtc, - struct intel_initial_plane_config plane_configs[]) +xe_initial_plane_setup(struct drm_crtc *_crtc, + struct intel_initial_plane_config *plane_config, + struct drm_framebuffer *fb, + struct i915_vma *_unused) { struct intel_crtc *crtc = to_intel_crtc(_crtc); - struct intel_initial_plane_config *plane_config = - &plane_configs[crtc->pipe]; struct intel_plane *plane = to_intel_plane(crtc->base.primary); struct intel_plane_state *plane_state = to_intel_plane_state(plane->base.state); - struct drm_framebuffer *fb; struct i915_vma *vma; - if (intel_alloc_initial_plane_obj(crtc, plane_config)) { - fb = &plane_config->fb->base; - } else { - const struct intel_plane_state *other_plane_state; - - other_plane_state = intel_reuse_initial_plane_obj(crtc, plane_configs); - if (!other_plane_state) - return -EINVAL; - - fb = other_plane_state->hw.fb; - } - plane_state->uapi.rotation = plane_config->rotation; intel_fb_fill_view(to_intel_framebuffer(fb), plane_state->uapi.rotation, &plane_state->view); @@ -268,6 +228,7 @@ static void xe_plane_config_fini(struct intel_initial_plane_config *plane_config const struct intel_display_initial_plane_interface xe_display_initial_plane_interface = { .vblank_wait = xe_initial_plane_vblank_wait, - .find_obj = xe_find_initial_plane_obj, + .alloc_obj = xe_alloc_initial_plane_obj, + .setup = xe_initial_plane_setup, .config_fini = xe_plane_config_fini, }; diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index 1be6320a5fc4..164f3d473e3a 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -9,7 +9,10 @@ struct dma_fence; struct drm_crtc; struct drm_device; +struct drm_framebuffer; +struct drm_gem_object; struct drm_scanout_buffer; +struct i915_vma; struct intel_hdcp_gsc_context; struct intel_initial_plane_config; struct intel_panic; @@ -29,7 +32,9 @@ struct intel_display_hdcp_interface { struct intel_display_initial_plane_interface { void (*vblank_wait)(struct drm_crtc *crtc); - int (*find_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_configs); + struct drm_gem_object *(*alloc_obj)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_config); + int (*setup)(struct drm_crtc *crtc, struct intel_initial_plane_config *plane_config, + struct drm_framebuffer *fb, struct i915_vma *vma); void (*config_fini)(struct intel_initial_plane_config *plane_configs); }; -- 2.47.3
