brintos

brintos / linux-shallow public Read only

0
0
Text · 4.3 KiB · a987c78 Raw
157 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR MIT */2 3/*4 *  Xen para-virtual DRM device5 *6 * Copyright (C) 2016-2018 EPAM Systems Inc.7 *8 * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>9 */10 11#ifndef __XEN_DRM_FRONT_H_12#define __XEN_DRM_FRONT_H_13 14#include <linux/scatterlist.h>15 16#include <drm/drm_connector.h>17#include <drm/drm_simple_kms_helper.h>18 19#include "xen_drm_front_cfg.h"20 21struct drm_device;22struct drm_framebuffer;23struct drm_gem_object;24struct drm_pending_vblank_event;25 26/**27 * DOC: Driver modes of operation in terms of display buffers used28 *29 * Depending on the requirements for the para-virtualized environment, namely30 * requirements dictated by the accompanying DRM/(v)GPU drivers running in both31 * host and guest environments, display buffers can be allocated by either32 * frontend driver or backend.33 */34 35/**36 * DOC: Buffers allocated by the frontend driver37 *38 * In this mode of operation driver allocates buffers from system memory.39 *40 * Note! If used with accompanying DRM/(v)GPU drivers this mode of operation41 * may require IOMMU support on the platform, so accompanying DRM/vGPU42 * hardware can still reach display buffer memory while importing PRIME43 * buffers from the frontend driver.44 */45 46/**47 * DOC: Buffers allocated by the backend48 *49 * This mode of operation is run-time configured via guest domain configuration50 * through XenStore entries.51 *52 * For systems which do not provide IOMMU support, but having specific53 * requirements for display buffers it is possible to allocate such buffers54 * at backend side and share those with the frontend.55 * For example, if host domain is 1:1 mapped and has DRM/GPU hardware expecting56 * physically contiguous memory, this allows implementing zero-copying57 * use-cases.58 *59 * Note, while using this scenario the following should be considered:60 *61 * #. If guest domain dies then pages/grants received from the backend62 *    cannot be claimed back63 *64 * #. Misbehaving guest may send too many requests to the65 *    backend exhausting its grant references and memory66 *    (consider this from security POV)67 */68 69/**70 * DOC: Driver limitations71 *72 * #. Only primary plane without additional properties is supported.73 *74 * #. Only one video mode per connector supported which is configured75 *    via XenStore.76 *77 * #. All CRTCs operate at fixed frequency of 60Hz.78 */79 80/* timeout in ms to wait for backend to respond */81#define XEN_DRM_FRONT_WAIT_BACK_MS	300082 83struct xen_drm_front_info {84	struct xenbus_device *xb_dev;85	struct xen_drm_front_drm_info *drm_info;86 87	/* to protect data between backend IO code and interrupt handler */88	spinlock_t io_lock;89 90	int num_evt_pairs;91	struct xen_drm_front_evtchnl_pair *evt_pairs;92	struct xen_drm_front_cfg cfg;93 94	/* display buffers */95	struct list_head dbuf_list;96};97 98struct xen_drm_front_drm_pipeline {99	struct xen_drm_front_drm_info *drm_info;100 101	int index;102 103	struct drm_simple_display_pipe pipe;104 105	struct drm_connector conn;106	/* These are only for connector mode checking */107	int width, height;108 109	struct drm_pending_vblank_event *pending_event;110 111	struct delayed_work pflip_to_worker;112 113	bool conn_connected;114};115 116struct xen_drm_front_drm_info {117	struct xen_drm_front_info *front_info;118	struct drm_device *drm_dev;119 120	struct xen_drm_front_drm_pipeline pipeline[XEN_DRM_FRONT_MAX_CRTCS];121};122 123static inline u64 xen_drm_front_fb_to_cookie(struct drm_framebuffer *fb)124{125	return (uintptr_t)fb;126}127 128static inline u64 xen_drm_front_dbuf_to_cookie(struct drm_gem_object *gem_obj)129{130	return (uintptr_t)gem_obj;131}132 133int xen_drm_front_mode_set(struct xen_drm_front_drm_pipeline *pipeline,134			   u32 x, u32 y, u32 width, u32 height,135			   u32 bpp, u64 fb_cookie);136 137int xen_drm_front_dbuf_create(struct xen_drm_front_info *front_info,138			      u64 dbuf_cookie, u32 width, u32 height,139			      u32 bpp, u64 size, u32 offset, struct page **pages);140 141int xen_drm_front_fb_attach(struct xen_drm_front_info *front_info,142			    u64 dbuf_cookie, u64 fb_cookie, u32 width,143			    u32 height, u32 pixel_format);144 145int xen_drm_front_fb_detach(struct xen_drm_front_info *front_info,146			    u64 fb_cookie);147 148int xen_drm_front_page_flip(struct xen_drm_front_info *front_info,149			    int conn_idx, u64 fb_cookie);150 151void xen_drm_front_on_frame_done(struct xen_drm_front_info *front_info,152				 int conn_idx, u64 fb_cookie);153 154void xen_drm_front_gem_object_free(struct drm_gem_object *obj);155 156#endif /* __XEN_DRM_FRONT_H_ */157