Commit | Line | Data |
---|---|---|
c575b7ee OA |
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_ */ |