Lines Matching +full:display +full:- +full:backend
1 // SPDX-License-Identifier: GPL-2.0 OR MIT
4 * Xen para-virtual DRM device
6 * Copyright (C) 2016-2018 EPAM Systems Inc.
27 * Timeout in ms to wait for frame done event from the backend:
28 * must be a bit more than IO time-out
40 struct xen_drm_front_drm_info *drm_info = fb->dev->dev_private; in fb_destroy()
43 if (drm_dev_enter(fb->dev, &idx)) { in fb_destroy()
44 xen_drm_front_fb_detach(drm_info->front_info, in fb_destroy()
59 struct xen_drm_front_drm_info *drm_info = dev->dev_private; in fb_create()
68 gem_obj = fb->obj[0]; in fb_create()
70 ret = xen_drm_front_fb_attach(drm_info->front_info, in fb_create()
73 fb->width, fb->height, in fb_create()
74 fb->format->format); in fb_create()
95 struct drm_crtc *crtc = &pipeline->pipe.crtc; in send_pending_event()
96 struct drm_device *dev = crtc->dev; in send_pending_event()
99 spin_lock_irqsave(&dev->event_lock, flags); in send_pending_event()
100 if (pipeline->pending_event) in send_pending_event()
101 drm_crtc_send_vblank_event(crtc, pipeline->pending_event); in send_pending_event()
102 pipeline->pending_event = NULL; in send_pending_event()
103 spin_unlock_irqrestore(&dev->event_lock, flags); in send_pending_event()
112 struct drm_crtc *crtc = &pipe->crtc; in display_enable()
113 struct drm_framebuffer *fb = plane_state->fb; in display_enable()
116 if (!drm_dev_enter(pipe->crtc.dev, &idx)) in display_enable()
119 ret = xen_drm_front_mode_set(pipeline, crtc->x, crtc->y, in display_enable()
120 fb->width, fb->height, in display_enable()
121 fb->format->cpp[0] * 8, in display_enable()
125 DRM_ERROR("Failed to enable display: %d\n", ret); in display_enable()
126 pipeline->conn_connected = false; in display_enable()
138 if (drm_dev_enter(pipe->crtc.dev, &idx)) { in display_disable()
144 DRM_ERROR("Failed to disable display: %d\n", ret); in display_disable()
147 pipeline->conn_connected = true; in display_disable()
158 * drm_info->front_info->io_lock, so we cannot call _sync version in xen_drm_front_kms_on_frame_done()
161 cancel_delayed_work(&pipeline->pflip_to_worker); in xen_drm_front_kms_on_frame_done()
174 DRM_ERROR("Frame done timed-out, releasing"); in pflip_to_worker()
182 drm_atomic_get_new_plane_state(old_plane_state->state, in display_send_page_flip()
183 &pipe->plane); in display_send_page_flip()
186 * If old_plane_state->fb is NULL and plane_state->fb is not, in display_send_page_flip()
187 * then this is an atomic commit which will enable display. in display_send_page_flip()
188 * If old_plane_state->fb is not NULL and plane_state->fb is, in display_send_page_flip()
189 * then this is an atomic commit which will disable display. in display_send_page_flip()
191 * sent to the backend as a part of display_set_config call. in display_send_page_flip()
193 if (old_plane_state->fb && plane_state->fb) { in display_send_page_flip()
196 struct xen_drm_front_drm_info *drm_info = pipeline->drm_info; in display_send_page_flip()
199 schedule_delayed_work(&pipeline->pflip_to_worker, in display_send_page_flip()
202 ret = xen_drm_front_page_flip(drm_info->front_info, in display_send_page_flip()
203 pipeline->index, in display_send_page_flip()
204 xen_drm_front_fb_to_cookie(plane_state->fb)); in display_send_page_flip()
206 DRM_ERROR("Failed to send page flip request to backend: %d\n", ret); in display_send_page_flip()
208 pipeline->conn_connected = false; in display_send_page_flip()
211 * sent, unblocking user-space. in display_send_page_flip()
217 * on frame done event from the backend. in display_send_page_flip()
238 crtc_state->no_vblank = false; in display_check()
248 struct drm_crtc *crtc = &pipe->crtc; in display_update()
252 event = crtc->state->event; in display_update()
254 struct drm_device *dev = crtc->dev; in display_update()
257 WARN_ON(pipeline->pending_event); in display_update()
259 spin_lock_irqsave(&dev->event_lock, flags); in display_update()
260 crtc->state->event = NULL; in display_update()
262 pipeline->pending_event = event; in display_update()
263 spin_unlock_irqrestore(&dev->event_lock, flags); in display_update()
266 if (!drm_dev_enter(pipe->crtc.dev, &idx)) { in display_update()
272 * Send page flip request to the backend *after* we have event cached in display_update()
273 * above, so on page flip done event from the backend we can in display_update()
275 * event from the backend. in display_update()
276 * If this is not a page flip, e.g. no flip done event from the backend in display_update()
293 if (mode->hdisplay != pipeline->width) in display_mode_valid()
296 if (mode->vdisplay != pipeline->height) in display_mode_valid()
314 struct drm_device *dev = drm_info->drm_dev; in display_pipe_init()
319 pipeline->drm_info = drm_info; in display_pipe_init()
320 pipeline->index = index; in display_pipe_init()
321 pipeline->height = cfg->height; in display_pipe_init()
322 pipeline->width = cfg->width; in display_pipe_init()
324 INIT_DELAYED_WORK(&pipeline->pflip_to_worker, pflip_to_worker); in display_pipe_init()
326 ret = xen_drm_front_conn_init(drm_info, &pipeline->conn); in display_pipe_init()
332 return drm_simple_display_pipe_init(dev, &pipeline->pipe, in display_pipe_init()
335 &pipeline->conn); in display_pipe_init()
340 struct drm_device *dev = drm_info->drm_dev; in xen_drm_front_kms_init()
345 dev->mode_config.min_width = 0; in xen_drm_front_kms_init()
346 dev->mode_config.min_height = 0; in xen_drm_front_kms_init()
347 dev->mode_config.max_width = 4095; in xen_drm_front_kms_init()
348 dev->mode_config.max_height = 2047; in xen_drm_front_kms_init()
349 dev->mode_config.funcs = &mode_config_funcs; in xen_drm_front_kms_init()
351 for (i = 0; i < drm_info->front_info->cfg.num_connectors; i++) { in xen_drm_front_kms_init()
353 &drm_info->front_info->cfg.connectors[i]; in xen_drm_front_kms_init()
355 &drm_info->pipeline[i]; in xen_drm_front_kms_init()
373 for (i = 0; i < drm_info->front_info->cfg.num_connectors; i++) { in xen_drm_front_kms_fini()
375 &drm_info->pipeline[i]; in xen_drm_front_kms_fini()
377 cancel_delayed_work_sync(&pipeline->pflip_to_worker); in xen_drm_front_kms_fini()