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