From: Tony Krowiak <akrowiak@xxxxxxxxxxxxx>
Configures the AP adapters, usage domains and control domains for the
+static inline void kvm_ap_clear_crycb_masks(struct ap_matrix_mdev *matrix_mdev)
+{
+ memset(&matrix_mdev->kvm->arch.crypto.crycb->apcb0, 0,
+ sizeof(matrix_mdev->kvm->arch.crypto.crycb->apcb0));
+ memset(&matrix_mdev->kvm->arch.crypto.crycb->apcb1, 0,
+ sizeof(matrix_mdev->kvm->arch.crypto.crycb->apcb1));
+}
+
+static void kvm_ap_set_crycb_masks(struct ap_matrix_mdev *matrix_mdev)
+{
+ int nbytes;
+ unsigned long *apm, *aqm, *adm;
+
+ kvm_ap_clear_crycb_masks(matrix_mdev);
+
+ apm = kvm_ap_get_crycb_apm(matrix_mdev);
+ aqm = kvm_ap_get_crycb_aqm(matrix_mdev);
+ adm = kvm_ap_get_crycb_adm(matrix_mdev);
+
+ nbytes = KVM_AP_MASK_BYTES(matrix_mdev->matrix.apm_max + 1);
+ memcpy(apm, matrix_mdev->matrix.apm, nbytes);
+
+ nbytes = KVM_AP_MASK_BYTES(matrix_mdev->matrix.aqm_max + 1);
+ memcpy(aqm, matrix_mdev->matrix.aqm, nbytes);
+
+ /*
+ * Merge the AQM and ADM since the ADM is a superset of the
+ * AQM by agreed-upon convention.
+ */
+ bitmap_or(adm, matrix_mdev->matrix.adm, matrix_mdev->matrix.aqm,
+ matrix_mdev->matrix.adm_max + 1);
+}
+
+
+static int kvm_ap_configure_matrix(struct ap_matrix_mdev *matrix_mdev)
+{
+ int ret = 0;
+
+ mutex_lock(&matrix_mdev->kvm->lock);
+
+ ret = kvm_ap_validate_queue_sharing(matrix_mdev);
+ if (ret)
+ goto done;
+
+ kvm_ap_set_crycb_masks(matrix_mdev);
+
+done:
+ mutex_unlock(&matrix_mdev->kvm->lock);
+
+ return ret;
+}
+
+void kvm_ap_deconfigure_matrix(struct ap_matrix_mdev *matrix_mdev)
+{
+ mutex_lock(&matrix_mdev->kvm->lock);
+ kvm_ap_clear_crycb_masks(matrix_mdev);
+ mutex_unlock(&matrix_mdev->kvm->lock);
+}
+