1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */ 2 3 /* 4 * Xen para-virtual DRM device 5 * 6 * Copyright (C) 2016-2018 EPAM Systems Inc. 7 * 8 * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> 9 */ 10 11 #ifndef __XEN_DRM_FRONT_EVTCHNL_H_ 12 #define __XEN_DRM_FRONT_EVTCHNL_H_ 13 14 #include <linux/completion.h> 15 #include <linux/types.h> 16 17 #include <xen/interface/io/ring.h> 18 #include <xen/interface/io/displif.h> 19 20 /* 21 * All operations which are not connector oriented use this ctrl event channel, 22 * e.g. fb_attach/destroy which belong to a DRM device, not to a CRTC. 23 */ 24 #define GENERIC_OP_EVT_CHNL 0 25 26 enum xen_drm_front_evtchnl_state { 27 EVTCHNL_STATE_DISCONNECTED, 28 EVTCHNL_STATE_CONNECTED, 29 }; 30 31 enum xen_drm_front_evtchnl_type { 32 EVTCHNL_TYPE_REQ, 33 EVTCHNL_TYPE_EVT, 34 }; 35 36 struct xen_drm_front_drm_info; 37 38 struct xen_drm_front_evtchnl { 39 struct xen_drm_front_info *front_info; 40 int gref; 41 int port; 42 int irq; 43 int index; 44 enum xen_drm_front_evtchnl_state state; 45 enum xen_drm_front_evtchnl_type type; 46 /* either response id or incoming event id */ 47 u16 evt_id; 48 /* next request id or next expected event id */ 49 u16 evt_next_id; 50 union { 51 struct { 52 struct xen_displif_front_ring ring; 53 struct completion completion; 54 /* latest response status */ 55 int resp_status; 56 /* serializer for backend IO: request/response */ 57 struct mutex req_io_lock; 58 } req; 59 struct { 60 struct xendispl_event_page *page; 61 } evt; 62 } u; 63 }; 64 65 struct xen_drm_front_evtchnl_pair { 66 struct xen_drm_front_evtchnl req; 67 struct xen_drm_front_evtchnl evt; 68 }; 69 70 int xen_drm_front_evtchnl_create_all(struct xen_drm_front_info *front_info); 71 72 int xen_drm_front_evtchnl_publish_all(struct xen_drm_front_info *front_info); 73 74 void xen_drm_front_evtchnl_flush(struct xen_drm_front_evtchnl *evtchnl); 75 76 void xen_drm_front_evtchnl_set_state(struct xen_drm_front_info *front_info, 77 enum xen_drm_front_evtchnl_state state); 78 79 void xen_drm_front_evtchnl_free_all(struct xen_drm_front_info *front_info); 80 81 #endif /* __XEN_DRM_FRONT_EVTCHNL_H_ */ 82