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.
25 * Timeout in ms to wait for frame done event from the backend:
26 * must be a bit more than IO time-out
38 struct xen_drm_front_drm_info *drm_info = fb->dev->dev_private; in fb_destroy()
41 if (drm_dev_enter(fb->dev, &idx)) { in fb_destroy()
42 xen_drm_front_fb_detach(drm_info->front_info, in fb_destroy()
57 struct xen_drm_front_drm_info *drm_info = dev->dev_private; in fb_create()
66 gem_obj = fb->obj[0]; in fb_create()
68 ret = xen_drm_front_fb_attach(drm_info->front_info, in fb_create()
71 fb->width, fb->height, in fb_create()
72 fb->format->format); in fb_create()
93 struct drm_crtc *crtc = &pipeline->pipe.crtc; in send_pending_event()
94 struct drm_device *dev = crtc->dev; in send_pending_event()
97 spin_lock_irqsave(&dev->event_lock, flags); in send_pending_event()
98 if (pipeline->pending_event) in send_pending_event()
99 drm_crtc_send_vblank_event(crtc, pipeline->pending_event); in send_pending_event()
100 pipeline->pending_event = NULL; in send_pending_event()
101 spin_unlock_irqrestore(&dev->event_lock, flags); in send_pending_event()
110 struct drm_crtc *crtc = &pipe->crtc; in display_enable()
111 struct drm_framebuffer *fb = plane_state->fb; in display_enable()
114 if (!drm_dev_enter(pipe->crtc.dev, &idx)) in display_enable()
117 ret = xen_drm_front_mode_set(pipeline, crtc->x, crtc->y, in display_enable()
118 fb->width, fb->height, in display_enable()
119 fb->format->cpp[0] * 8, in display_enable()
123 DRM_ERROR("Failed to enable display: %d\n", ret); in display_enable()
124 pipeline->conn_connected = false; in display_enable()
136 if (drm_dev_enter(pipe->crtc.dev, &idx)) { in display_disable()
142 DRM_ERROR("Failed to disable display: %d\n", ret); in display_disable()
145 pipeline->conn_connected = true; in display_disable()
156 * drm_info->front_info->io_lock, so we cannot call _sync version in xen_drm_front_kms_on_frame_done()
159 cancel_delayed_work(&pipeline->pflip_to_worker); in xen_drm_front_kms_on_frame_done()
172 DRM_ERROR("Frame done timed-out, releasing"); in pflip_to_worker()
180 drm_atomic_get_new_plane_state(old_plane_state->state, in display_send_page_flip()
181 &pipe->plane); in display_send_page_flip()
184 * If old_plane_state->fb is NULL and plane_state->fb is not, in display_send_page_flip()
185 * then this is an atomic commit which will enable display. in display_send_page_flip()
186 * If old_plane_state->fb is not NULL and plane_state->fb is, in display_send_page_flip()
187 * then this is an atomic commit which will disable display. in display_send_page_flip()
189 * sent to the backend as a part of display_set_config call. in display_send_page_flip()
191 if (old_plane_state->fb && plane_state->fb) { in display_send_page_flip()
194 struct xen_drm_front_drm_info *drm_info = pipeline->drm_info; in display_send_page_flip()
197 schedule_delayed_work(&pipeline->pflip_to_worker, in display_send_page_flip()
200 ret = xen_drm_front_page_flip(drm_info->front_info, in display_send_page_flip()
201 pipeline->index, in display_send_page_flip()
202 xen_drm_front_fb_to_cookie(plane_state->fb)); in display_send_page_flip()
204 DRM_ERROR("Failed to send page flip request to backend: %d\n", ret); in display_send_page_flip()
206 pipeline->conn_connected = false; in display_send_page_flip()
209 * sent, unblocking user-space. in display_send_page_flip()
215 * on frame done event from the backend. in display_send_page_flip()
236 crtc_state->no_vblank = false; in display_check()
246 struct drm_crtc *crtc = &pipe->crtc; in display_update()
250 event = crtc->state->event; in display_update()
252 struct drm_device *dev = crtc->dev; in display_update()
255 WARN_ON(pipeline->pending_event); in display_update()
257 spin_lock_irqsave(&dev->event_lock, flags); in display_update()
258 crtc->state->event = NULL; in display_update()
260 pipeline->pending_event = event; in display_update()
261 spin_unlock_irqrestore(&dev->event_lock, flags); in display_update()
264 if (!drm_dev_enter(pipe->crtc.dev, &idx)) { in display_update()
270 * Send page flip request to the backend *after* we have event cached in display_update()
271 * above, so on page flip done event from the backend we can in display_update()
273 * event from the backend. in display_update()
274 * If this is not a page flip, e.g. no flip done event from the backend in display_update()
291 if (mode->hdisplay != pipeline->width) in display_mode_valid()
294 if (mode->vdisplay != pipeline->height) in display_mode_valid()
313 struct drm_device *dev = drm_info->drm_dev; in display_pipe_init()
318 pipeline->drm_info = drm_info; in display_pipe_init()
319 pipeline->index = index; in display_pipe_init()
320 pipeline->height = cfg->height; in display_pipe_init()
321 pipeline->width = cfg->width; in display_pipe_init()
323 INIT_DELAYED_WORK(&pipeline->pflip_to_worker, pflip_to_worker); in display_pipe_init()
325 ret = xen_drm_front_conn_init(drm_info, &pipeline->conn); in display_pipe_init()
331 return drm_simple_display_pipe_init(dev, &pipeline->pipe, in display_pipe_init()
334 &pipeline->conn); in display_pipe_init()
339 struct drm_device *dev = drm_info->drm_dev; in xen_drm_front_kms_init()
344 dev->mode_config.min_width = 0; in xen_drm_front_kms_init()
345 dev->mode_config.min_height = 0; in xen_drm_front_kms_init()
346 dev->mode_config.max_width = 4095; in xen_drm_front_kms_init()
347 dev->mode_config.max_height = 2047; in xen_drm_front_kms_init()
348 dev->mode_config.funcs = &mode_config_funcs; in xen_drm_front_kms_init()
350 for (i = 0; i < drm_info->front_info->cfg.num_connectors; i++) { in xen_drm_front_kms_init()
352 &drm_info->front_info->cfg.connectors[i]; in xen_drm_front_kms_init()
354 &drm_info->pipeline[i]; in xen_drm_front_kms_init()
372 for (i = 0; i < drm_info->front_info->cfg.num_connectors; i++) { in xen_drm_front_kms_fini()
374 &drm_info->pipeline[i]; in xen_drm_front_kms_fini()
376 cancel_delayed_work_sync(&pipeline->pflip_to_worker); in xen_drm_front_kms_fini()