cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vfio_ccw_private.h (5486B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Private stuff for vfio_ccw driver
      4 *
      5 * Copyright IBM Corp. 2017
      6 * Copyright Red Hat, Inc. 2019
      7 *
      8 * Author(s): Dong Jia Shi <bjsdjshi@linux.vnet.ibm.com>
      9 *            Xiao Feng Ren <renxiaof@linux.vnet.ibm.com>
     10 *            Cornelia Huck <cohuck@redhat.com>
     11 */
     12
     13#ifndef _VFIO_CCW_PRIVATE_H_
     14#define _VFIO_CCW_PRIVATE_H_
     15
     16#include <linux/completion.h>
     17#include <linux/eventfd.h>
     18#include <linux/workqueue.h>
     19#include <linux/vfio_ccw.h>
     20#include <linux/vfio.h>
     21#include <asm/crw.h>
     22#include <asm/debug.h>
     23
     24#include "css.h"
     25#include "vfio_ccw_cp.h"
     26
     27#define VFIO_CCW_OFFSET_SHIFT   10
     28#define VFIO_CCW_OFFSET_TO_INDEX(off)	(off >> VFIO_CCW_OFFSET_SHIFT)
     29#define VFIO_CCW_INDEX_TO_OFFSET(index)	((u64)(index) << VFIO_CCW_OFFSET_SHIFT)
     30#define VFIO_CCW_OFFSET_MASK	(((u64)(1) << VFIO_CCW_OFFSET_SHIFT) - 1)
     31
     32/* capability chain handling similar to vfio-pci */
     33struct vfio_ccw_private;
     34struct vfio_ccw_region;
     35
     36struct vfio_ccw_regops {
     37	ssize_t	(*read)(struct vfio_ccw_private *private, char __user *buf,
     38			size_t count, loff_t *ppos);
     39	ssize_t	(*write)(struct vfio_ccw_private *private,
     40			 const char __user *buf, size_t count, loff_t *ppos);
     41	void	(*release)(struct vfio_ccw_private *private,
     42			   struct vfio_ccw_region *region);
     43};
     44
     45struct vfio_ccw_region {
     46	u32				type;
     47	u32				subtype;
     48	const struct vfio_ccw_regops	*ops;
     49	void				*data;
     50	size_t				size;
     51	u32				flags;
     52};
     53
     54int vfio_ccw_register_dev_region(struct vfio_ccw_private *private,
     55				 unsigned int subtype,
     56				 const struct vfio_ccw_regops *ops,
     57				 size_t size, u32 flags, void *data);
     58void vfio_ccw_unregister_dev_regions(struct vfio_ccw_private *private);
     59
     60int vfio_ccw_register_async_dev_regions(struct vfio_ccw_private *private);
     61int vfio_ccw_register_schib_dev_regions(struct vfio_ccw_private *private);
     62int vfio_ccw_register_crw_dev_regions(struct vfio_ccw_private *private);
     63
     64struct vfio_ccw_crw {
     65	struct list_head	next;
     66	struct crw		crw;
     67};
     68
     69/**
     70 * struct vfio_ccw_private
     71 * @vdev: Embedded VFIO device
     72 * @sch: pointer to the subchannel
     73 * @state: internal state of the device
     74 * @completion: synchronization helper of the I/O completion
     75 * @avail: available for creating a mediated device
     76 * @mdev: pointer to the mediated device
     77 * @nb: notifier for vfio events
     78 * @io_region: MMIO region to input/output I/O arguments/results
     79 * @io_mutex: protect against concurrent update of I/O regions
     80 * @region: additional regions for other subchannel operations
     81 * @cmd_region: MMIO region for asynchronous I/O commands other than START
     82 * @schib_region: MMIO region for SCHIB information
     83 * @crw_region: MMIO region for getting channel report words
     84 * @num_regions: number of additional regions
     85 * @cp: channel program for the current I/O operation
     86 * @irb: irb info received from interrupt
     87 * @scsw: scsw info
     88 * @io_trigger: eventfd ctx for signaling userspace I/O results
     89 * @crw_trigger: eventfd ctx for signaling userspace CRW information
     90 * @req_trigger: eventfd ctx for signaling userspace to return device
     91 * @io_work: work for deferral process of I/O handling
     92 * @crw_work: work for deferral process of CRW handling
     93 */
     94struct vfio_ccw_private {
     95	struct vfio_device vdev;
     96	struct subchannel	*sch;
     97	int			state;
     98	struct completion	*completion;
     99	atomic_t		avail;
    100	struct mdev_device	*mdev;
    101	struct notifier_block	nb;
    102	struct ccw_io_region	*io_region;
    103	struct mutex		io_mutex;
    104	struct vfio_ccw_region *region;
    105	struct ccw_cmd_region	*cmd_region;
    106	struct ccw_schib_region *schib_region;
    107	struct ccw_crw_region	*crw_region;
    108	int num_regions;
    109
    110	struct channel_program	cp;
    111	struct irb		irb;
    112	union scsw		scsw;
    113	struct list_head	crw;
    114
    115	struct eventfd_ctx	*io_trigger;
    116	struct eventfd_ctx	*crw_trigger;
    117	struct eventfd_ctx	*req_trigger;
    118	struct work_struct	io_work;
    119	struct work_struct	crw_work;
    120} __aligned(8);
    121
    122extern int vfio_ccw_mdev_reg(struct subchannel *sch);
    123extern void vfio_ccw_mdev_unreg(struct subchannel *sch);
    124
    125extern int vfio_ccw_sch_quiesce(struct subchannel *sch);
    126
    127extern struct mdev_driver vfio_ccw_mdev_driver;
    128
    129/*
    130 * States of the device statemachine.
    131 */
    132enum vfio_ccw_state {
    133	VFIO_CCW_STATE_NOT_OPER,
    134	VFIO_CCW_STATE_STANDBY,
    135	VFIO_CCW_STATE_IDLE,
    136	VFIO_CCW_STATE_CP_PROCESSING,
    137	VFIO_CCW_STATE_CP_PENDING,
    138	/* last element! */
    139	NR_VFIO_CCW_STATES
    140};
    141
    142/*
    143 * Asynchronous events of the device statemachine.
    144 */
    145enum vfio_ccw_event {
    146	VFIO_CCW_EVENT_NOT_OPER,
    147	VFIO_CCW_EVENT_IO_REQ,
    148	VFIO_CCW_EVENT_INTERRUPT,
    149	VFIO_CCW_EVENT_ASYNC_REQ,
    150	/* last element! */
    151	NR_VFIO_CCW_EVENTS
    152};
    153
    154/*
    155 * Action called through jumptable.
    156 */
    157typedef void (fsm_func_t)(struct vfio_ccw_private *, enum vfio_ccw_event);
    158extern fsm_func_t *vfio_ccw_jumptable[NR_VFIO_CCW_STATES][NR_VFIO_CCW_EVENTS];
    159
    160static inline void vfio_ccw_fsm_event(struct vfio_ccw_private *private,
    161				     int event)
    162{
    163	trace_vfio_ccw_fsm_event(private->sch->schid, private->state, event);
    164	vfio_ccw_jumptable[private->state][event](private, event);
    165}
    166
    167extern struct workqueue_struct *vfio_ccw_work_q;
    168
    169
    170/* s390 debug feature, similar to base cio */
    171extern debug_info_t *vfio_ccw_debug_msg_id;
    172extern debug_info_t *vfio_ccw_debug_trace_id;
    173
    174#define VFIO_CCW_TRACE_EVENT(imp, txt) \
    175		debug_text_event(vfio_ccw_debug_trace_id, imp, txt)
    176
    177#define VFIO_CCW_MSG_EVENT(imp, args...) \
    178		debug_sprintf_event(vfio_ccw_debug_msg_id, imp, ##args)
    179
    180static inline void VFIO_CCW_HEX_EVENT(int level, void *data, int length)
    181{
    182	debug_event(vfio_ccw_debug_trace_id, level, data, length);
    183}
    184
    185#endif