1fb1ff4c1SBharat Bhushan /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
2fb1ff4c1SBharat Bhushan /*
3fb1ff4c1SBharat Bhushan  * Copyright 2013-2016 Freescale Semiconductor Inc.
4fb1ff4c1SBharat Bhushan  * Copyright 2016,2019-2020 NXP
5fb1ff4c1SBharat Bhushan  */
6fb1ff4c1SBharat Bhushan 
7fb1ff4c1SBharat Bhushan #ifndef VFIO_FSL_MC_PRIVATE_H
8fb1ff4c1SBharat Bhushan #define VFIO_FSL_MC_PRIVATE_H
9fb1ff4c1SBharat Bhushan 
10df747bcdSDiana Craciun #define VFIO_FSL_MC_OFFSET_SHIFT    40
11df747bcdSDiana Craciun #define VFIO_FSL_MC_OFFSET_MASK (((u64)(1) << VFIO_FSL_MC_OFFSET_SHIFT) - 1)
12df747bcdSDiana Craciun 
13df747bcdSDiana Craciun #define VFIO_FSL_MC_OFFSET_TO_INDEX(off) ((off) >> VFIO_FSL_MC_OFFSET_SHIFT)
14df747bcdSDiana Craciun 
15df747bcdSDiana Craciun #define VFIO_FSL_MC_INDEX_TO_OFFSET(index)	\
16df747bcdSDiana Craciun 	((u64)(index) << VFIO_FSL_MC_OFFSET_SHIFT)
17df747bcdSDiana Craciun 
18cc0ee20bSDiana Craciun struct vfio_fsl_mc_irq {
19cc0ee20bSDiana Craciun 	u32         flags;
20cc0ee20bSDiana Craciun 	u32         count;
21cc0ee20bSDiana Craciun 	struct eventfd_ctx  *trigger;
22cc0ee20bSDiana Craciun 	char            *name;
23cc0ee20bSDiana Craciun };
24cc0ee20bSDiana Craciun 
25f2ba7e8cSDiana Craciun struct vfio_fsl_mc_reflck {
26f2ba7e8cSDiana Craciun 	struct kref		kref;
27f2ba7e8cSDiana Craciun 	struct mutex		lock;
28f2ba7e8cSDiana Craciun };
29f2ba7e8cSDiana Craciun 
30df747bcdSDiana Craciun struct vfio_fsl_mc_region {
31df747bcdSDiana Craciun 	u32			flags;
32df747bcdSDiana Craciun 	u32			type;
33df747bcdSDiana Craciun 	u64			addr;
34df747bcdSDiana Craciun 	resource_size_t		size;
351bb141edSDiana Craciun 	void __iomem		*ioaddr;
36df747bcdSDiana Craciun };
37df747bcdSDiana Craciun 
38fb1ff4c1SBharat Bhushan struct vfio_fsl_mc_device {
39*0ca78666SJason Gunthorpe 	struct vfio_device		vdev;
40fb1ff4c1SBharat Bhushan 	struct fsl_mc_device		*mc_dev;
41704f5082SDiana Craciun 	struct notifier_block        nb;
42df747bcdSDiana Craciun 	int				refcnt;
43df747bcdSDiana Craciun 	struct vfio_fsl_mc_region	*regions;
44f2ba7e8cSDiana Craciun 	struct vfio_fsl_mc_reflck   *reflck;
452e0d2956SDiana Craciun 	struct mutex         igate;
46cc0ee20bSDiana Craciun 	struct vfio_fsl_mc_irq      *mc_irqs;
47fb1ff4c1SBharat Bhushan };
48fb1ff4c1SBharat Bhushan 
492e0d2956SDiana Craciun extern int vfio_fsl_mc_set_irqs_ioctl(struct vfio_fsl_mc_device *vdev,
502e0d2956SDiana Craciun 			       u32 flags, unsigned int index,
512e0d2956SDiana Craciun 			       unsigned int start, unsigned int count,
522e0d2956SDiana Craciun 			       void *data);
532e0d2956SDiana Craciun 
54cc0ee20bSDiana Craciun void vfio_fsl_mc_irqs_cleanup(struct vfio_fsl_mc_device *vdev);
55cc0ee20bSDiana Craciun 
56fb1ff4c1SBharat Bhushan #endif /* VFIO_FSL_MC_PRIVATE_H */
57