2015-03-16 14:08:42 -06:00
/*
* Copyright ( C ) 2013 - Virtual Open Systems
* Author : Antonios Motakis < a . motakis @ virtualopensystems . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License , version 2 , as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*/
# ifndef VFIO_PLATFORM_PRIVATE_H
# define VFIO_PLATFORM_PRIVATE_H
# include <linux/types.h>
# include <linux/interrupt.h>
2015-03-16 14:08:46 -06:00
# define VFIO_PLATFORM_OFFSET_SHIFT 40
# define VFIO_PLATFORM_OFFSET_MASK (((u64)(1) << VFIO_PLATFORM_OFFSET_SHIFT) - 1)
# define VFIO_PLATFORM_OFFSET_TO_INDEX(off) \
( off > > VFIO_PLATFORM_OFFSET_SHIFT )
# define VFIO_PLATFORM_INDEX_TO_OFFSET(index) \
( ( u64 ) ( index ) < < VFIO_PLATFORM_OFFSET_SHIFT )
2015-03-16 14:08:48 -06:00
struct vfio_platform_irq {
u32 flags ;
u32 count ;
2015-03-16 14:08:49 -06:00
int hwirq ;
2015-03-16 14:08:50 -06:00
char * name ;
struct eventfd_ctx * trigger ;
2015-03-16 14:08:50 -06:00
bool masked ;
spinlock_t lock ;
2015-03-16 14:08:55 -06:00
struct virqfd * unmask ;
struct virqfd * mask ;
2015-03-16 14:08:48 -06:00
} ;
2015-03-16 14:08:46 -06:00
struct vfio_platform_region {
u64 addr ;
resource_size_t size ;
u32 flags ;
u32 type ;
# define VFIO_PLATFORM_REGION_TYPE_MMIO 1
# define VFIO_PLATFORM_REGION_TYPE_PIO 2
2015-03-16 14:08:47 -06:00
void __iomem * ioaddr ;
2015-03-16 14:08:46 -06:00
} ;
2015-03-16 14:08:42 -06:00
struct vfio_platform_device {
2015-03-16 14:08:46 -06:00
struct vfio_platform_region * regions ;
u32 num_regions ;
2015-03-16 14:08:48 -06:00
struct vfio_platform_irq * irqs ;
u32 num_irqs ;
2015-03-16 14:08:46 -06:00
int refcnt ;
2015-03-16 14:08:49 -06:00
struct mutex igate ;
2015-03-16 14:08:46 -06:00
2015-03-16 14:08:42 -06:00
/*
* These fields should be filled by the bus specific binder
*/
void * opaque ;
const char * name ;
uint32_t flags ;
/* callbacks to discover device resources */
struct resource *
( * get_resource ) ( struct vfio_platform_device * vdev , int i ) ;
int ( * get_irq ) ( struct vfio_platform_device * vdev , int i ) ;
2015-06-15 11:09:43 +02:00
int ( * reset ) ( struct vfio_platform_device * vdev ) ;
2015-03-16 14:08:42 -06:00
} ;
2015-06-15 11:09:42 +02:00
struct vfio_platform_reset_combo {
const char * compat ;
const char * reset_function_name ;
const char * module_name ;
} ;
2015-03-16 14:08:42 -06:00
extern int vfio_platform_probe_common ( struct vfio_platform_device * vdev ,
struct device * dev ) ;
extern struct vfio_platform_device * vfio_platform_remove_common
( struct device * dev ) ;
2015-03-16 14:08:48 -06:00
extern int vfio_platform_irq_init ( struct vfio_platform_device * vdev ) ;
extern void vfio_platform_irq_cleanup ( struct vfio_platform_device * vdev ) ;
2015-03-16 14:08:49 -06:00
extern int vfio_platform_set_irqs_ioctl ( struct vfio_platform_device * vdev ,
uint32_t flags , unsigned index ,
unsigned start , unsigned count ,
void * data ) ;
2015-03-16 14:08:42 -06:00
# endif /* VFIO_PLATFORM_PRIVATE_H */