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-11-03 18:12:12 +00:00
struct module * parent_module ;
2015-11-03 18:12:16 +00:00
const char * compat ;
2016-07-19 09:01:44 -04:00
const char * acpihid ;
2015-11-03 18:12:17 +00:00
struct module * reset_module ;
2015-11-03 18:12:18 +00:00
struct device * device ;
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 ) ;
2016-07-19 09:01:41 -04:00
int ( * of_reset ) ( struct vfio_platform_device * vdev ) ;
2016-07-19 09:01:47 -04:00
bool reset_required ;
2015-03-16 14:08:42 -06:00
} ;
2015-11-03 18:12:13 +00:00
typedef int ( * vfio_platform_reset_fn_t ) ( struct vfio_platform_device * vdev ) ;
struct vfio_platform_reset_node {
struct list_head link ;
char * compat ;
struct module * owner ;
2016-07-19 09:01:41 -04:00
vfio_platform_reset_fn_t of_reset ;
2015-11-03 18:12:13 +00:00
} ;
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-11-03 18:12:13 +00:00
extern void __vfio_platform_register_reset ( struct vfio_platform_reset_node * n ) ;
extern void vfio_platform_unregister_reset ( const char * compat ,
vfio_platform_reset_fn_t fn ) ;
# define vfio_platform_register_reset(__compat, __reset) \
static struct vfio_platform_reset_node __reset # # _node = { \
. owner = THIS_MODULE , \
. compat = __compat , \
2016-07-19 09:01:41 -04:00
. of_reset = __reset , \
2015-11-03 18:12:13 +00:00
} ; \
__vfio_platform_register_reset ( & __reset # # _node )
2015-11-03 18:12:14 +00:00
# define module_vfio_reset_handler(compat, reset) \
MODULE_ALIAS ( " vfio-reset: " compat ) ; \
static int __init reset # # _module_init ( void ) \
{ \
vfio_platform_register_reset ( compat , reset ) ; \
return 0 ; \
} ; \
static void __exit reset # # _module_exit ( void ) \
{ \
vfio_platform_unregister_reset ( compat , reset ) ; \
} ; \
module_init ( reset # # _module_init ) ; \
module_exit ( reset # # _module_exit )
2015-03-16 14:08:42 -06:00
# endif /* VFIO_PLATFORM_PRIVATE_H */