Lines Matching refs:zdev
158 static int kvm_zpci_set_airq(struct zpci_dev *zdev) in kvm_zpci_set_airq() argument
160 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_REG_INT); in kvm_zpci_set_airq()
164 fib.fmt0.isc = zdev->kzdev->fib.fmt0.isc; in kvm_zpci_set_airq()
166 fib.fmt0.noi = airq_iv_end(zdev->aibv); in kvm_zpci_set_airq()
167 fib.fmt0.aibv = virt_to_phys(zdev->aibv->vector); in kvm_zpci_set_airq()
169 fib.fmt0.aisb = virt_to_phys(aift->sbv->vector + (zdev->aisb / 64) * 8); in kvm_zpci_set_airq()
170 fib.fmt0.aisbo = zdev->aisb & 63; in kvm_zpci_set_airq()
171 fib.gd = zdev->gisa; in kvm_zpci_set_airq()
177 static int kvm_zpci_clear_airq(struct zpci_dev *zdev) in kvm_zpci_clear_airq() argument
179 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_DEREG_INT); in kvm_zpci_clear_airq()
183 fib.gd = zdev->gisa; in kvm_zpci_clear_airq()
222 static int kvm_s390_pci_aif_enable(struct zpci_dev *zdev, struct zpci_fib *fib, in kvm_s390_pci_aif_enable() argument
237 if (zdev->gisa == 0) in kvm_s390_pci_aif_enable()
240 kvm = zdev->kzdev->kvm; in kvm_s390_pci_aif_enable()
241 msi_vecs = min_t(unsigned int, fib->fmt0.noi, zdev->max_msi); in kvm_s390_pci_aif_enable()
286 zdev->aisb = bit; /* store the summary bit number */ in kvm_s390_pci_aif_enable()
287 zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA | in kvm_s390_pci_aif_enable()
293 gaite = (struct zpci_gaite *)aift->gait + (zdev->aisb * in kvm_s390_pci_aif_enable()
307 aift->kzdev[zdev->aisb] = zdev->kzdev; in kvm_s390_pci_aif_enable()
311 fib->fmt0.aisbo = zdev->aisb & 63; in kvm_s390_pci_aif_enable()
312 fib->fmt0.aisb = virt_to_phys(aift->sbv->vector + (zdev->aisb / 64) * 8); in kvm_s390_pci_aif_enable()
316 zdev->kzdev->fib.fmt0.isc = fib->fmt0.isc; in kvm_s390_pci_aif_enable()
317 zdev->kzdev->fib.fmt0.aibv = fib->fmt0.aibv; in kvm_s390_pci_aif_enable()
321 rc = kvm_zpci_set_airq(zdev); in kvm_s390_pci_aif_enable()
335 static int kvm_s390_pci_aif_disable(struct zpci_dev *zdev, bool force) in kvm_s390_pci_aif_disable() argument
337 struct kvm_zdev *kzdev = zdev->kzdev; in kvm_s390_pci_aif_disable()
343 if (zdev->gisa == 0) in kvm_s390_pci_aif_disable()
353 rc = kvm_zpci_clear_airq(zdev); in kvm_s390_pci_aif_disable()
357 if (zdev->kzdev->fib.fmt0.aibv == 0) in kvm_s390_pci_aif_disable()
360 gaite = (struct zpci_gaite *)aift->gait + (zdev->aisb * in kvm_s390_pci_aif_disable()
374 aift->kzdev[zdev->aisb] = NULL; in kvm_s390_pci_aif_disable()
376 airq_iv_free_bit(aift->sbv, zdev->aisb); in kvm_s390_pci_aif_disable()
377 airq_iv_release(zdev->aibv); in kvm_s390_pci_aif_disable()
378 zdev->aisb = 0; in kvm_s390_pci_aif_disable()
379 zdev->aibv = NULL; in kvm_s390_pci_aif_disable()
402 static int kvm_s390_pci_dev_open(struct zpci_dev *zdev) in kvm_s390_pci_dev_open() argument
410 kzdev->zdev = zdev; in kvm_s390_pci_dev_open()
411 zdev->kzdev = kzdev; in kvm_s390_pci_dev_open()
416 static void kvm_s390_pci_dev_release(struct zpci_dev *zdev) in kvm_s390_pci_dev_release() argument
420 kzdev = zdev->kzdev; in kvm_s390_pci_dev_release()
421 WARN_ON(kzdev->zdev != zdev); in kvm_s390_pci_dev_release()
422 zdev->kzdev = NULL; in kvm_s390_pci_dev_release()
434 struct zpci_dev *zdev = opaque; in kvm_s390_pci_register_kvm() local
437 if (!zdev) in kvm_s390_pci_register_kvm()
440 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
442 if (zdev->kzdev || zdev->gisa != 0 || !kvm) { in kvm_s390_pci_register_kvm()
443 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
451 rc = kvm_s390_pci_dev_open(zdev); in kvm_s390_pci_register_kvm()
469 if (zdev_enabled(zdev)) { in kvm_s390_pci_register_kvm()
470 rc = zpci_disable_device(zdev); in kvm_s390_pci_register_kvm()
479 zdev->gisa = (u32)virt_to_phys(&kvm->arch.sie_page2->gisa); in kvm_s390_pci_register_kvm()
481 rc = zpci_reenable_device(zdev); in kvm_s390_pci_register_kvm()
486 zdev->kzdev->kvm = kvm; in kvm_s390_pci_register_kvm()
489 list_add_tail(&zdev->kzdev->entry, &kvm->arch.kzdev_list); in kvm_s390_pci_register_kvm()
493 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
497 zdev->gisa = 0; in kvm_s390_pci_register_kvm()
499 if (zdev->kzdev) in kvm_s390_pci_register_kvm()
500 kvm_s390_pci_dev_release(zdev); in kvm_s390_pci_register_kvm()
502 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
509 struct zpci_dev *zdev = opaque; in kvm_s390_pci_unregister_kvm() local
512 if (!zdev) in kvm_s390_pci_unregister_kvm()
515 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
517 if (WARN_ON(!zdev->kzdev)) { in kvm_s390_pci_unregister_kvm()
518 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
522 kvm = zdev->kzdev->kvm; in kvm_s390_pci_unregister_kvm()
529 if (zdev->gisa == 0) in kvm_s390_pci_unregister_kvm()
533 if (zdev->kzdev->fib.fmt0.aibv != 0) in kvm_s390_pci_unregister_kvm()
534 kvm_s390_pci_aif_disable(zdev, true); in kvm_s390_pci_unregister_kvm()
537 zdev->gisa = 0; in kvm_s390_pci_unregister_kvm()
539 if (zdev_enabled(zdev)) { in kvm_s390_pci_unregister_kvm()
540 if (zpci_disable_device(zdev)) in kvm_s390_pci_unregister_kvm()
544 zpci_reenable_device(zdev); in kvm_s390_pci_unregister_kvm()
548 list_del(&zdev->kzdev->entry); in kvm_s390_pci_unregister_kvm()
550 kvm_s390_pci_dev_release(zdev); in kvm_s390_pci_unregister_kvm()
553 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
577 struct zpci_dev *zdev = NULL; in get_zdev_from_kvm_by_fh() local
582 if (kzdev->zdev->fh == fh) { in get_zdev_from_kvm_by_fh()
583 zdev = kzdev->zdev; in get_zdev_from_kvm_by_fh()
589 return zdev; in get_zdev_from_kvm_by_fh()
592 static int kvm_s390_pci_zpci_reg_aen(struct zpci_dev *zdev, in kvm_s390_pci_zpci_reg_aen() argument
612 return kvm_s390_pci_aif_enable(zdev, &fib, hostflag); in kvm_s390_pci_zpci_reg_aen()
618 struct zpci_dev *zdev; in kvm_s390_pci_zpci_op() local
621 zdev = get_zdev_from_kvm_by_fh(kvm, args->fh); in kvm_s390_pci_zpci_op()
622 if (!zdev) in kvm_s390_pci_zpci_op()
625 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_zpci_op()
628 kzdev = zdev->kzdev; in kvm_s390_pci_zpci_op()
645 r = kvm_s390_pci_zpci_reg_aen(zdev, args); in kvm_s390_pci_zpci_op()
648 r = kvm_s390_pci_aif_disable(zdev, false); in kvm_s390_pci_zpci_op()
656 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_zpci_op()