18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc.
48c2ecf20Sopenharmony_ci * Copyright 2016,2019-2020 NXP
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef VFIO_FSL_MC_PRIVATE_H
88c2ecf20Sopenharmony_ci#define VFIO_FSL_MC_PRIVATE_H
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#define VFIO_FSL_MC_OFFSET_SHIFT    40
118c2ecf20Sopenharmony_ci#define VFIO_FSL_MC_OFFSET_MASK (((u64)(1) << VFIO_FSL_MC_OFFSET_SHIFT) - 1)
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#define VFIO_FSL_MC_OFFSET_TO_INDEX(off) ((off) >> VFIO_FSL_MC_OFFSET_SHIFT)
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define VFIO_FSL_MC_INDEX_TO_OFFSET(index)	\
168c2ecf20Sopenharmony_ci	((u64)(index) << VFIO_FSL_MC_OFFSET_SHIFT)
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistruct vfio_fsl_mc_irq {
198c2ecf20Sopenharmony_ci	u32         flags;
208c2ecf20Sopenharmony_ci	u32         count;
218c2ecf20Sopenharmony_ci	struct eventfd_ctx  *trigger;
228c2ecf20Sopenharmony_ci	char            *name;
238c2ecf20Sopenharmony_ci};
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistruct vfio_fsl_mc_reflck {
268c2ecf20Sopenharmony_ci	struct kref		kref;
278c2ecf20Sopenharmony_ci	struct mutex		lock;
288c2ecf20Sopenharmony_ci};
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistruct vfio_fsl_mc_region {
318c2ecf20Sopenharmony_ci	u32			flags;
328c2ecf20Sopenharmony_ci	u32			type;
338c2ecf20Sopenharmony_ci	u64			addr;
348c2ecf20Sopenharmony_ci	resource_size_t		size;
358c2ecf20Sopenharmony_ci	void __iomem		*ioaddr;
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistruct vfio_fsl_mc_device {
398c2ecf20Sopenharmony_ci	struct fsl_mc_device		*mc_dev;
408c2ecf20Sopenharmony_ci	struct notifier_block        nb;
418c2ecf20Sopenharmony_ci	int				refcnt;
428c2ecf20Sopenharmony_ci	struct vfio_fsl_mc_region	*regions;
438c2ecf20Sopenharmony_ci	struct vfio_fsl_mc_reflck   *reflck;
448c2ecf20Sopenharmony_ci	struct mutex         igate;
458c2ecf20Sopenharmony_ci	struct vfio_fsl_mc_irq      *mc_irqs;
468c2ecf20Sopenharmony_ci};
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ciextern int vfio_fsl_mc_set_irqs_ioctl(struct vfio_fsl_mc_device *vdev,
498c2ecf20Sopenharmony_ci			       u32 flags, unsigned int index,
508c2ecf20Sopenharmony_ci			       unsigned int start, unsigned int count,
518c2ecf20Sopenharmony_ci			       void *data);
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_civoid vfio_fsl_mc_irqs_cleanup(struct vfio_fsl_mc_device *vdev);
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci#endif /* VFIO_FSL_MC_PRIVATE_H */
56