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[])
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;
/*
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;
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)
{
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;
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;
}
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),
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,
};
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)
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;
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;
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)) {
/* 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);
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,
};
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;
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);
};