Loading Documentation/PCI/pci.rst +1 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ need pass only as many optional fields as necessary: - subvendor and subdevice fields default to PCI_ANY_ID (FFFFFFFF) - class and classmask fields default to 0 - driver_data defaults to 0UL. - override_only field defaults to 0. Note that driver_data must match the value used by any of the pci_device_id entries defined in the driver. This makes the driver_data field mandatory Loading MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -19466,6 +19466,7 @@ T: git git://github.com/awilliam/linux-vfio.git F: Documentation/driver-api/vfio.rst F: drivers/vfio/ F: include/linux/vfio.h F: include/linux/vfio_pci_core.h F: include/uapi/linux/vfio.h VFIO FSL-MC DRIVER arch/s390/include/asm/kvm_host.h +3 −5 Original line number Diff line number Diff line Loading @@ -798,14 +798,12 @@ struct kvm_s390_cpu_model { unsigned short ibc; }; struct kvm_s390_module_hook { int (*hook)(struct kvm_vcpu *vcpu); struct module *owner; }; typedef int (*crypto_hook)(struct kvm_vcpu *vcpu); struct kvm_s390_crypto { struct kvm_s390_crypto_cb *crycb; struct kvm_s390_module_hook *pqap_hook; struct rw_semaphore pqap_hook_rwsem; crypto_hook *pqap_hook; __u32 crycbd; __u8 aes_kw; __u8 dea_kw; Loading arch/s390/kvm/kvm-s390.c +28 −4 Original line number Diff line number Diff line Loading @@ -2559,12 +2559,26 @@ static void kvm_s390_set_crycb_format(struct kvm *kvm) kvm->arch.crypto.crycbd |= CRYCB_FORMAT1; } /* * kvm_arch_crypto_set_masks * * @kvm: pointer to the target guest's KVM struct containing the crypto masks * to be set. * @apm: the mask identifying the accessible AP adapters * @aqm: the mask identifying the accessible AP domains * @adm: the mask identifying the accessible AP control domains * * Set the masks that identify the adapters, domains and control domains to * which the KVM guest is granted access. * * Note: The kvm->lock mutex must be locked by the caller before invoking this * function. */ void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm, unsigned long *aqm, unsigned long *adm) { struct kvm_s390_crypto_cb *crycb = kvm->arch.crypto.crycb; mutex_lock(&kvm->lock); kvm_s390_vcpu_block_all(kvm); switch (kvm->arch.crypto.crycbd & CRYCB_FORMAT_MASK) { Loading Loading @@ -2595,13 +2609,23 @@ void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm, /* recreate the shadow crycb for each vcpu */ kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART); kvm_s390_vcpu_unblock_all(kvm); mutex_unlock(&kvm->lock); } EXPORT_SYMBOL_GPL(kvm_arch_crypto_set_masks); /* * kvm_arch_crypto_clear_masks * * @kvm: pointer to the target guest's KVM struct containing the crypto masks * to be cleared. * * Clear the masks that identify the adapters, domains and control domains to * which the KVM guest is granted access. * * Note: The kvm->lock mutex must be locked by the caller before invoking this * function. */ void kvm_arch_crypto_clear_masks(struct kvm *kvm) { mutex_lock(&kvm->lock); kvm_s390_vcpu_block_all(kvm); memset(&kvm->arch.crypto.crycb->apcb0, 0, Loading @@ -2613,7 +2637,6 @@ void kvm_arch_crypto_clear_masks(struct kvm *kvm) /* recreate the shadow crycb for each vcpu */ kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART); kvm_s390_vcpu_unblock_all(kvm); mutex_unlock(&kvm->lock); } EXPORT_SYMBOL_GPL(kvm_arch_crypto_clear_masks); Loading @@ -2630,6 +2653,7 @@ static void kvm_s390_crypto_init(struct kvm *kvm) { kvm->arch.crypto.crycb = &kvm->arch.sie_page2->crycb; kvm_s390_set_crycb_format(kvm); init_rwsem(&kvm->arch.crypto.pqap_hook_rwsem); if (!test_kvm_facility(kvm, 76)) return; Loading arch/s390/kvm/priv.c +9 −6 Original line number Diff line number Diff line Loading @@ -610,6 +610,7 @@ static int handle_io_inst(struct kvm_vcpu *vcpu) static int handle_pqap(struct kvm_vcpu *vcpu) { struct ap_queue_status status = {}; crypto_hook pqap_hook; unsigned long reg0; int ret; uint8_t fc; Loading Loading @@ -654,18 +655,20 @@ static int handle_pqap(struct kvm_vcpu *vcpu) return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); /* * Verify that the hook callback is registered, lock the owner * and call the hook. * If the hook callback is registered, there will be a pointer to the * hook function pointer in the kvm_s390_crypto structure. Lock the * owner, retrieve the hook function pointer and call the hook. */ down_read(&vcpu->kvm->arch.crypto.pqap_hook_rwsem); if (vcpu->kvm->arch.crypto.pqap_hook) { if (!try_module_get(vcpu->kvm->arch.crypto.pqap_hook->owner)) return -EOPNOTSUPP; ret = vcpu->kvm->arch.crypto.pqap_hook->hook(vcpu); module_put(vcpu->kvm->arch.crypto.pqap_hook->owner); pqap_hook = *vcpu->kvm->arch.crypto.pqap_hook; ret = pqap_hook(vcpu); if (!ret && vcpu->run->s.regs.gprs[1] & 0x00ff0000) kvm_s390_set_psw_cc(vcpu, 3); up_read(&vcpu->kvm->arch.crypto.pqap_hook_rwsem); return ret; } up_read(&vcpu->kvm->arch.crypto.pqap_hook_rwsem); /* * A vfio_driver must register a hook. * No hook means no driver to enable the SIE CRYCB and no queues. Loading Loading
Documentation/PCI/pci.rst +1 −0 Original line number Diff line number Diff line Loading @@ -103,6 +103,7 @@ need pass only as many optional fields as necessary: - subvendor and subdevice fields default to PCI_ANY_ID (FFFFFFFF) - class and classmask fields default to 0 - driver_data defaults to 0UL. - override_only field defaults to 0. Note that driver_data must match the value used by any of the pci_device_id entries defined in the driver. This makes the driver_data field mandatory Loading
MAINTAINERS +1 −0 Original line number Diff line number Diff line Loading @@ -19466,6 +19466,7 @@ T: git git://github.com/awilliam/linux-vfio.git F: Documentation/driver-api/vfio.rst F: drivers/vfio/ F: include/linux/vfio.h F: include/linux/vfio_pci_core.h F: include/uapi/linux/vfio.h VFIO FSL-MC DRIVER
arch/s390/include/asm/kvm_host.h +3 −5 Original line number Diff line number Diff line Loading @@ -798,14 +798,12 @@ struct kvm_s390_cpu_model { unsigned short ibc; }; struct kvm_s390_module_hook { int (*hook)(struct kvm_vcpu *vcpu); struct module *owner; }; typedef int (*crypto_hook)(struct kvm_vcpu *vcpu); struct kvm_s390_crypto { struct kvm_s390_crypto_cb *crycb; struct kvm_s390_module_hook *pqap_hook; struct rw_semaphore pqap_hook_rwsem; crypto_hook *pqap_hook; __u32 crycbd; __u8 aes_kw; __u8 dea_kw; Loading
arch/s390/kvm/kvm-s390.c +28 −4 Original line number Diff line number Diff line Loading @@ -2559,12 +2559,26 @@ static void kvm_s390_set_crycb_format(struct kvm *kvm) kvm->arch.crypto.crycbd |= CRYCB_FORMAT1; } /* * kvm_arch_crypto_set_masks * * @kvm: pointer to the target guest's KVM struct containing the crypto masks * to be set. * @apm: the mask identifying the accessible AP adapters * @aqm: the mask identifying the accessible AP domains * @adm: the mask identifying the accessible AP control domains * * Set the masks that identify the adapters, domains and control domains to * which the KVM guest is granted access. * * Note: The kvm->lock mutex must be locked by the caller before invoking this * function. */ void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm, unsigned long *aqm, unsigned long *adm) { struct kvm_s390_crypto_cb *crycb = kvm->arch.crypto.crycb; mutex_lock(&kvm->lock); kvm_s390_vcpu_block_all(kvm); switch (kvm->arch.crypto.crycbd & CRYCB_FORMAT_MASK) { Loading Loading @@ -2595,13 +2609,23 @@ void kvm_arch_crypto_set_masks(struct kvm *kvm, unsigned long *apm, /* recreate the shadow crycb for each vcpu */ kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART); kvm_s390_vcpu_unblock_all(kvm); mutex_unlock(&kvm->lock); } EXPORT_SYMBOL_GPL(kvm_arch_crypto_set_masks); /* * kvm_arch_crypto_clear_masks * * @kvm: pointer to the target guest's KVM struct containing the crypto masks * to be cleared. * * Clear the masks that identify the adapters, domains and control domains to * which the KVM guest is granted access. * * Note: The kvm->lock mutex must be locked by the caller before invoking this * function. */ void kvm_arch_crypto_clear_masks(struct kvm *kvm) { mutex_lock(&kvm->lock); kvm_s390_vcpu_block_all(kvm); memset(&kvm->arch.crypto.crycb->apcb0, 0, Loading @@ -2613,7 +2637,6 @@ void kvm_arch_crypto_clear_masks(struct kvm *kvm) /* recreate the shadow crycb for each vcpu */ kvm_s390_sync_request_broadcast(kvm, KVM_REQ_VSIE_RESTART); kvm_s390_vcpu_unblock_all(kvm); mutex_unlock(&kvm->lock); } EXPORT_SYMBOL_GPL(kvm_arch_crypto_clear_masks); Loading @@ -2630,6 +2653,7 @@ static void kvm_s390_crypto_init(struct kvm *kvm) { kvm->arch.crypto.crycb = &kvm->arch.sie_page2->crycb; kvm_s390_set_crycb_format(kvm); init_rwsem(&kvm->arch.crypto.pqap_hook_rwsem); if (!test_kvm_facility(kvm, 76)) return; Loading
arch/s390/kvm/priv.c +9 −6 Original line number Diff line number Diff line Loading @@ -610,6 +610,7 @@ static int handle_io_inst(struct kvm_vcpu *vcpu) static int handle_pqap(struct kvm_vcpu *vcpu) { struct ap_queue_status status = {}; crypto_hook pqap_hook; unsigned long reg0; int ret; uint8_t fc; Loading Loading @@ -654,18 +655,20 @@ static int handle_pqap(struct kvm_vcpu *vcpu) return kvm_s390_inject_program_int(vcpu, PGM_SPECIFICATION); /* * Verify that the hook callback is registered, lock the owner * and call the hook. * If the hook callback is registered, there will be a pointer to the * hook function pointer in the kvm_s390_crypto structure. Lock the * owner, retrieve the hook function pointer and call the hook. */ down_read(&vcpu->kvm->arch.crypto.pqap_hook_rwsem); if (vcpu->kvm->arch.crypto.pqap_hook) { if (!try_module_get(vcpu->kvm->arch.crypto.pqap_hook->owner)) return -EOPNOTSUPP; ret = vcpu->kvm->arch.crypto.pqap_hook->hook(vcpu); module_put(vcpu->kvm->arch.crypto.pqap_hook->owner); pqap_hook = *vcpu->kvm->arch.crypto.pqap_hook; ret = pqap_hook(vcpu); if (!ret && vcpu->run->s.regs.gprs[1] & 0x00ff0000) kvm_s390_set_psw_cc(vcpu, 3); up_read(&vcpu->kvm->arch.crypto.pqap_hook_rwsem); return ret; } up_read(&vcpu->kvm->arch.crypto.pqap_hook_rwsem); /* * A vfio_driver must register a hook. * No hook means no driver to enable the SIE CRYCB and no queues. Loading