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_platform_private.h (3314B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2013 - Virtual Open Systems
      4 * Author: Antonios Motakis <a.motakis@virtualopensystems.com>
      5 */
      6
      7#ifndef VFIO_PLATFORM_PRIVATE_H
      8#define VFIO_PLATFORM_PRIVATE_H
      9
     10#include <linux/types.h>
     11#include <linux/interrupt.h>
     12#include <linux/vfio.h>
     13
     14#define VFIO_PLATFORM_OFFSET_SHIFT   40
     15#define VFIO_PLATFORM_OFFSET_MASK (((u64)(1) << VFIO_PLATFORM_OFFSET_SHIFT) - 1)
     16
     17#define VFIO_PLATFORM_OFFSET_TO_INDEX(off)	\
     18	(off >> VFIO_PLATFORM_OFFSET_SHIFT)
     19
     20#define VFIO_PLATFORM_INDEX_TO_OFFSET(index)	\
     21	((u64)(index) << VFIO_PLATFORM_OFFSET_SHIFT)
     22
     23struct vfio_platform_irq {
     24	u32			flags;
     25	u32			count;
     26	int			hwirq;
     27	char			*name;
     28	struct eventfd_ctx	*trigger;
     29	bool			masked;
     30	spinlock_t		lock;
     31	struct virqfd		*unmask;
     32	struct virqfd		*mask;
     33};
     34
     35struct vfio_platform_region {
     36	u64			addr;
     37	resource_size_t		size;
     38	u32			flags;
     39	u32			type;
     40#define VFIO_PLATFORM_REGION_TYPE_MMIO	1
     41#define VFIO_PLATFORM_REGION_TYPE_PIO	2
     42	void __iomem		*ioaddr;
     43};
     44
     45struct vfio_platform_device {
     46	struct vfio_device		vdev;
     47	struct vfio_platform_region	*regions;
     48	u32				num_regions;
     49	struct vfio_platform_irq	*irqs;
     50	u32				num_irqs;
     51	struct mutex			igate;
     52	const char			*compat;
     53	const char			*acpihid;
     54	struct module			*reset_module;
     55	struct device			*device;
     56
     57	/*
     58	 * These fields should be filled by the bus specific binder
     59	 */
     60	void		*opaque;
     61	const char	*name;
     62	uint32_t	flags;
     63	/* callbacks to discover device resources */
     64	struct resource*
     65		(*get_resource)(struct vfio_platform_device *vdev, int i);
     66	int	(*get_irq)(struct vfio_platform_device *vdev, int i);
     67	int	(*of_reset)(struct vfio_platform_device *vdev);
     68
     69	bool				reset_required;
     70};
     71
     72typedef int (*vfio_platform_reset_fn_t)(struct vfio_platform_device *vdev);
     73
     74struct vfio_platform_reset_node {
     75	struct list_head link;
     76	char *compat;
     77	struct module *owner;
     78	vfio_platform_reset_fn_t of_reset;
     79};
     80
     81extern int vfio_platform_probe_common(struct vfio_platform_device *vdev,
     82				      struct device *dev);
     83void vfio_platform_remove_common(struct vfio_platform_device *vdev);
     84
     85extern int vfio_platform_irq_init(struct vfio_platform_device *vdev);
     86extern void vfio_platform_irq_cleanup(struct vfio_platform_device *vdev);
     87
     88extern int vfio_platform_set_irqs_ioctl(struct vfio_platform_device *vdev,
     89					uint32_t flags, unsigned index,
     90					unsigned start, unsigned count,
     91					void *data);
     92
     93extern void __vfio_platform_register_reset(struct vfio_platform_reset_node *n);
     94extern void vfio_platform_unregister_reset(const char *compat,
     95					   vfio_platform_reset_fn_t fn);
     96#define vfio_platform_register_reset(__compat, __reset)		\
     97static struct vfio_platform_reset_node __reset ## _node = {	\
     98	.owner = THIS_MODULE,					\
     99	.compat = __compat,					\
    100	.of_reset = __reset,					\
    101};								\
    102__vfio_platform_register_reset(&__reset ## _node)
    103
    104#define module_vfio_reset_handler(compat, reset)		\
    105MODULE_ALIAS("vfio-reset:" compat);				\
    106static int __init reset ## _module_init(void)			\
    107{								\
    108	vfio_platform_register_reset(compat, reset);		\
    109	return 0;						\
    110};								\
    111static void __exit reset ## _module_exit(void)			\
    112{								\
    113	vfio_platform_unregister_reset(compat, reset);		\
    114};								\
    115module_init(reset ## _module_init);				\
    116module_exit(reset ## _module_exit)
    117
    118#endif /* VFIO_PLATFORM_PRIVATE_H */