Lines Matching refs:zdev
159 static int kvm_zpci_set_airq(struct zpci_dev *zdev) in kvm_zpci_set_airq() argument
161 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_REG_INT); in kvm_zpci_set_airq()
165 fib.fmt0.isc = zdev->kzdev->fib.fmt0.isc; in kvm_zpci_set_airq()
167 fib.fmt0.noi = airq_iv_end(zdev->aibv); in kvm_zpci_set_airq()
168 fib.fmt0.aibv = virt_to_phys(zdev->aibv->vector); in kvm_zpci_set_airq()
170 fib.fmt0.aisb = virt_to_phys(aift->sbv->vector + (zdev->aisb / 64) * 8); in kvm_zpci_set_airq()
171 fib.fmt0.aisbo = zdev->aisb & 63; in kvm_zpci_set_airq()
172 fib.gd = zdev->gisa; in kvm_zpci_set_airq()
178 static int kvm_zpci_clear_airq(struct zpci_dev *zdev) in kvm_zpci_clear_airq() argument
180 u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, ZPCI_MOD_FC_DEREG_INT); in kvm_zpci_clear_airq()
184 fib.gd = zdev->gisa; in kvm_zpci_clear_airq()
223 static int kvm_s390_pci_aif_enable(struct zpci_dev *zdev, struct zpci_fib *fib, in kvm_s390_pci_aif_enable() argument
238 if (zdev->gisa == 0) in kvm_s390_pci_aif_enable()
241 kvm = zdev->kzdev->kvm; in kvm_s390_pci_aif_enable()
242 msi_vecs = min_t(unsigned int, fib->fmt0.noi, zdev->max_msi); in kvm_s390_pci_aif_enable()
287 zdev->aisb = bit; /* store the summary bit number */ in kvm_s390_pci_aif_enable()
288 zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA | in kvm_s390_pci_aif_enable()
294 gaite = (struct zpci_gaite *)aift->gait + (zdev->aisb * in kvm_s390_pci_aif_enable()
308 aift->kzdev[zdev->aisb] = zdev->kzdev; in kvm_s390_pci_aif_enable()
312 fib->fmt0.aisbo = zdev->aisb & 63; in kvm_s390_pci_aif_enable()
313 fib->fmt0.aisb = virt_to_phys(aift->sbv->vector + (zdev->aisb / 64) * 8); in kvm_s390_pci_aif_enable()
317 zdev->kzdev->fib.fmt0.isc = fib->fmt0.isc; in kvm_s390_pci_aif_enable()
318 zdev->kzdev->fib.fmt0.aibv = fib->fmt0.aibv; in kvm_s390_pci_aif_enable()
322 rc = kvm_zpci_set_airq(zdev); in kvm_s390_pci_aif_enable()
336 static int kvm_s390_pci_aif_disable(struct zpci_dev *zdev, bool force) in kvm_s390_pci_aif_disable() argument
338 struct kvm_zdev *kzdev = zdev->kzdev; in kvm_s390_pci_aif_disable()
344 if (zdev->gisa == 0) in kvm_s390_pci_aif_disable()
354 rc = kvm_zpci_clear_airq(zdev); in kvm_s390_pci_aif_disable()
358 if (zdev->kzdev->fib.fmt0.aibv == 0) in kvm_s390_pci_aif_disable()
361 gaite = (struct zpci_gaite *)aift->gait + (zdev->aisb * in kvm_s390_pci_aif_disable()
375 aift->kzdev[zdev->aisb] = NULL; in kvm_s390_pci_aif_disable()
377 airq_iv_free_bit(aift->sbv, zdev->aisb); in kvm_s390_pci_aif_disable()
378 airq_iv_release(zdev->aibv); in kvm_s390_pci_aif_disable()
379 zdev->aisb = 0; in kvm_s390_pci_aif_disable()
380 zdev->aibv = NULL; in kvm_s390_pci_aif_disable()
403 static int kvm_s390_pci_dev_open(struct zpci_dev *zdev) in kvm_s390_pci_dev_open() argument
411 kzdev->zdev = zdev; in kvm_s390_pci_dev_open()
412 zdev->kzdev = kzdev; in kvm_s390_pci_dev_open()
417 static void kvm_s390_pci_dev_release(struct zpci_dev *zdev) in kvm_s390_pci_dev_release() argument
421 kzdev = zdev->kzdev; in kvm_s390_pci_dev_release()
422 WARN_ON(kzdev->zdev != zdev); in kvm_s390_pci_dev_release()
423 zdev->kzdev = NULL; in kvm_s390_pci_dev_release()
435 struct zpci_dev *zdev = opaque; in kvm_s390_pci_register_kvm() local
438 if (!zdev) in kvm_s390_pci_register_kvm()
441 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
443 if (zdev->kzdev || zdev->gisa != 0 || !kvm) { in kvm_s390_pci_register_kvm()
444 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
452 rc = kvm_s390_pci_dev_open(zdev); in kvm_s390_pci_register_kvm()
470 if (zdev_enabled(zdev)) { in kvm_s390_pci_register_kvm()
471 rc = zpci_disable_device(zdev); in kvm_s390_pci_register_kvm()
480 zdev->gisa = (u32)virt_to_phys(&kvm->arch.sie_page2->gisa); in kvm_s390_pci_register_kvm()
482 rc = zpci_reenable_device(zdev); in kvm_s390_pci_register_kvm()
487 zdev->kzdev->kvm = kvm; in kvm_s390_pci_register_kvm()
490 list_add_tail(&zdev->kzdev->entry, &kvm->arch.kzdev_list); in kvm_s390_pci_register_kvm()
494 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
498 zdev->gisa = 0; in kvm_s390_pci_register_kvm()
500 if (zdev->kzdev) in kvm_s390_pci_register_kvm()
501 kvm_s390_pci_dev_release(zdev); in kvm_s390_pci_register_kvm()
503 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
510 struct zpci_dev *zdev = opaque; in kvm_s390_pci_unregister_kvm() local
513 if (!zdev) in kvm_s390_pci_unregister_kvm()
516 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
518 if (WARN_ON(!zdev->kzdev)) { in kvm_s390_pci_unregister_kvm()
519 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
523 kvm = zdev->kzdev->kvm; in kvm_s390_pci_unregister_kvm()
530 if (zdev->gisa == 0) in kvm_s390_pci_unregister_kvm()
534 if (zdev->kzdev->fib.fmt0.aibv != 0) in kvm_s390_pci_unregister_kvm()
535 kvm_s390_pci_aif_disable(zdev, true); in kvm_s390_pci_unregister_kvm()
538 zdev->gisa = 0; in kvm_s390_pci_unregister_kvm()
540 if (zdev_enabled(zdev)) { in kvm_s390_pci_unregister_kvm()
541 if (zpci_disable_device(zdev)) in kvm_s390_pci_unregister_kvm()
545 zpci_reenable_device(zdev); in kvm_s390_pci_unregister_kvm()
549 list_del(&zdev->kzdev->entry); in kvm_s390_pci_unregister_kvm()
551 kvm_s390_pci_dev_release(zdev); in kvm_s390_pci_unregister_kvm()
554 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
578 struct zpci_dev *zdev = NULL; in get_zdev_from_kvm_by_fh() local
583 if (kzdev->zdev->fh == fh) { in get_zdev_from_kvm_by_fh()
584 zdev = kzdev->zdev; in get_zdev_from_kvm_by_fh()
590 return zdev; in get_zdev_from_kvm_by_fh()
593 static int kvm_s390_pci_zpci_reg_aen(struct zpci_dev *zdev, in kvm_s390_pci_zpci_reg_aen() argument
613 return kvm_s390_pci_aif_enable(zdev, &fib, hostflag); in kvm_s390_pci_zpci_reg_aen()
619 struct zpci_dev *zdev; in kvm_s390_pci_zpci_op() local
622 zdev = get_zdev_from_kvm_by_fh(kvm, args->fh); in kvm_s390_pci_zpci_op()
623 if (!zdev) in kvm_s390_pci_zpci_op()
626 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_zpci_op()
629 kzdev = zdev->kzdev; in kvm_s390_pci_zpci_op()
646 r = kvm_s390_pci_zpci_reg_aen(zdev, args); in kvm_s390_pci_zpci_op()
649 r = kvm_s390_pci_aif_disable(zdev, false); in kvm_s390_pci_zpci_op()
657 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_zpci_op()