1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Private data and functions for adjunct processor VFIO matrix driver. 4 * 5 * Author(s): Tony Krowiak <akrowiak@linux.ibm.com> 6 * Halil Pasic <pasic@linux.ibm.com> 7 * Pierre Morel <pmorel@linux.ibm.com> 8 * 9 * Copyright IBM Corp. 2018 10 */ 11 12 #ifndef _VFIO_AP_PRIVATE_H_ 13 #define _VFIO_AP_PRIVATE_H_ 14 15 #include <linux/types.h> 16 #include <linux/device.h> 17 #include <linux/mdev.h> 18 #include <linux/delay.h> 19 #include <linux/mutex.h> 20 #include <linux/kvm_host.h> 21 #include <linux/vfio.h> 22 23 #include "ap_bus.h" 24 25 #define VFIO_AP_MODULE_NAME "vfio_ap" 26 #define VFIO_AP_DRV_NAME "vfio_ap" 27 28 /** 29 * struct ap_matrix_dev - Contains the data for the matrix device. 30 * 31 * @device: generic device structure associated with the AP matrix device 32 * @available_instances: number of mediated matrix devices that can be created 33 * @info: the struct containing the output from the PQAP(QCI) instruction 34 * @mdev_list: the list of mediated matrix devices created 35 * @lock: mutex for locking the AP matrix device. This lock will be 36 * taken every time we fiddle with state managed by the vfio_ap 37 * driver, be it using @mdev_list or writing the state of a 38 * single ap_matrix_mdev device. It's quite coarse but we don't 39 * expect much contention. 40 * @vfio_ap_drv: the vfio_ap device driver 41 */ 42 struct ap_matrix_dev { 43 struct device device; 44 atomic_t available_instances; 45 struct ap_config_info info; 46 struct list_head mdev_list; 47 struct mutex lock; 48 struct ap_driver *vfio_ap_drv; 49 }; 50 51 extern struct ap_matrix_dev *matrix_dev; 52 53 /** 54 * struct ap_matrix - matrix of adapters, domains and control domains 55 * 56 * @apm_max: max adapter number in @apm 57 * @apm: identifies the AP adapters in the matrix 58 * @aqm_max: max domain number in @aqm 59 * @aqm: identifies the AP queues (domains) in the matrix 60 * @adm_max: max domain number in @adm 61 * @adm: identifies the AP control domains in the matrix 62 * 63 * The AP matrix is comprised of three bit masks identifying the adapters, 64 * queues (domains) and control domains that belong to an AP matrix. The bits in 65 * each mask, from left to right, correspond to IDs 0 to 255. When a bit is set 66 * the corresponding ID belongs to the matrix. 67 */ 68 struct ap_matrix { 69 unsigned long apm_max; 70 DECLARE_BITMAP(apm, 256); 71 unsigned long aqm_max; 72 DECLARE_BITMAP(aqm, 256); 73 unsigned long adm_max; 74 DECLARE_BITMAP(adm, 256); 75 }; 76 77 /** 78 * struct ap_matrix_mdev - Contains the data associated with a matrix mediated 79 * device. 80 * @vdev: the vfio device 81 * @node: allows the ap_matrix_mdev struct to be added to a list 82 * @matrix: the adapters, usage domains and control domains assigned to the 83 * mediated matrix device. 84 * @group_notifier: notifier block used for specifying callback function for 85 * handling the VFIO_GROUP_NOTIFY_SET_KVM event 86 * @iommu_notifier: notifier block used for specifying callback function for 87 * handling the VFIO_IOMMU_NOTIFY_DMA_UNMAP even 88 * @kvm: the struct holding guest's state 89 * @pqap_hook: the function pointer to the interception handler for the 90 * PQAP(AQIC) instruction. 91 * @mdev: the mediated device 92 */ 93 struct ap_matrix_mdev { 94 struct vfio_device vdev; 95 struct list_head node; 96 struct ap_matrix matrix; 97 struct notifier_block group_notifier; 98 struct notifier_block iommu_notifier; 99 struct kvm *kvm; 100 crypto_hook pqap_hook; 101 struct mdev_device *mdev; 102 }; 103 104 /** 105 * struct vfio_ap_queue - contains the data associated with a queue bound to the 106 * vfio_ap device driver 107 * @matrix_mdev: the matrix mediated device 108 * @saved_pfn: the guest PFN pinned for the guest 109 * @apqn: the APQN of the AP queue device 110 * @saved_isc: the guest ISC registered with the GIB interface 111 */ 112 struct vfio_ap_queue { 113 struct ap_matrix_mdev *matrix_mdev; 114 unsigned long saved_pfn; 115 int apqn; 116 #define VFIO_AP_ISC_INVALID 0xff 117 unsigned char saved_isc; 118 }; 119 120 int vfio_ap_mdev_register(void); 121 void vfio_ap_mdev_unregister(void); 122 int vfio_ap_mdev_reset_queue(struct vfio_ap_queue *q, 123 unsigned int retry); 124 125 #endif /* _VFIO_AP_PRIVATE_H_ */ 126