| /* SPDX-License-Identifier: GPL-2.0 OR MIT */ |
| |
| /* |
| * Xen para-virtual DRM device |
| * |
| * Copyright (C) 2016-2018 EPAM Systems Inc. |
| * |
| * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> |
| */ |
| |
| #ifndef __XEN_DRM_FRONT_EVTCHNL_H_ |
| #define __XEN_DRM_FRONT_EVTCHNL_H_ |
| |
| #include <linux/completion.h> |
| #include <linux/types.h> |
| |
| #include <xen/interface/io/ring.h> |
| #include <xen/interface/io/displif.h> |
| |
| /* |
| * All operations which are not connector oriented use this ctrl event channel, |
| * e.g. fb_attach/destroy which belong to a DRM device, not to a CRTC. |
| */ |
| #define GENERIC_OP_EVT_CHNL 0 |
| |
| enum xen_drm_front_evtchnl_state { |
| EVTCHNL_STATE_DISCONNECTED, |
| EVTCHNL_STATE_CONNECTED, |
| }; |
| |
| enum xen_drm_front_evtchnl_type { |
| EVTCHNL_TYPE_REQ, |
| EVTCHNL_TYPE_EVT, |
| }; |
| |
| struct xen_drm_front_drm_info; |
| |
| struct xen_drm_front_evtchnl { |
| struct xen_drm_front_info *front_info; |
| int gref; |
| int port; |
| int irq; |
| int index; |
| enum xen_drm_front_evtchnl_state state; |
| enum xen_drm_front_evtchnl_type type; |
| /* either response id or incoming event id */ |
| u16 evt_id; |
| /* next request id or next expected event id */ |
| u16 evt_next_id; |
| union { |
| struct { |
| struct xen_displif_front_ring ring; |
| struct completion completion; |
| /* latest response status */ |
| int resp_status; |
| /* serializer for backend IO: request/response */ |
| struct mutex req_io_lock; |
| } req; |
| struct { |
| struct xendispl_event_page *page; |
| } evt; |
| } u; |
| }; |
| |
| struct xen_drm_front_evtchnl_pair { |
| struct xen_drm_front_evtchnl req; |
| struct xen_drm_front_evtchnl evt; |
| }; |
| |
| int xen_drm_front_evtchnl_create_all(struct xen_drm_front_info *front_info); |
| |
| int xen_drm_front_evtchnl_publish_all(struct xen_drm_front_info *front_info); |
| |
| void xen_drm_front_evtchnl_flush(struct xen_drm_front_evtchnl *evtchnl); |
| |
| void xen_drm_front_evtchnl_set_state(struct xen_drm_front_info *front_info, |
| enum xen_drm_front_evtchnl_state state); |
| |
| void xen_drm_front_evtchnl_free_all(struct xen_drm_front_info *front_info); |
| |
| #endif /* __XEN_DRM_FRONT_EVTCHNL_H_ */ |