/* 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_ */