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()
224 static int kvm_s390_pci_aif_enable(struct zpci_dev *zdev, struct zpci_fib *fib, in kvm_s390_pci_aif_enable() argument
239 if (zdev->gisa == 0) in kvm_s390_pci_aif_enable()
242 kvm = zdev->kzdev->kvm; in kvm_s390_pci_aif_enable()
243 msi_vecs = min_t(unsigned int, fib->fmt0.noi, zdev->max_msi); in kvm_s390_pci_aif_enable()
288 zdev->aisb = bit; /* store the summary bit number */ in kvm_s390_pci_aif_enable()
289 zdev->aibv = airq_iv_create(msi_vecs, AIRQ_IV_DATA | in kvm_s390_pci_aif_enable()
295 gaite = (struct zpci_gaite *)aift->gait + (zdev->aisb * in kvm_s390_pci_aif_enable()
309 aift->kzdev[zdev->aisb] = zdev->kzdev; in kvm_s390_pci_aif_enable()
313 fib->fmt0.aisbo = zdev->aisb & 63; in kvm_s390_pci_aif_enable()
314 fib->fmt0.aisb = virt_to_phys(aift->sbv->vector + (zdev->aisb / 64) * 8); in kvm_s390_pci_aif_enable()
318 zdev->kzdev->fib.fmt0.isc = fib->fmt0.isc; in kvm_s390_pci_aif_enable()
319 zdev->kzdev->fib.fmt0.aibv = fib->fmt0.aibv; in kvm_s390_pci_aif_enable()
323 rc = kvm_zpci_set_airq(zdev); in kvm_s390_pci_aif_enable()
337 static int kvm_s390_pci_aif_disable(struct zpci_dev *zdev, bool force) in kvm_s390_pci_aif_disable() argument
339 struct kvm_zdev *kzdev = zdev->kzdev; in kvm_s390_pci_aif_disable()
345 if (zdev->gisa == 0) in kvm_s390_pci_aif_disable()
355 rc = kvm_zpci_clear_airq(zdev); in kvm_s390_pci_aif_disable()
359 if (zdev->kzdev->fib.fmt0.aibv == 0) in kvm_s390_pci_aif_disable()
362 gaite = (struct zpci_gaite *)aift->gait + (zdev->aisb * in kvm_s390_pci_aif_disable()
376 aift->kzdev[zdev->aisb] = NULL; in kvm_s390_pci_aif_disable()
378 airq_iv_free_bit(aift->sbv, zdev->aisb); in kvm_s390_pci_aif_disable()
379 airq_iv_release(zdev->aibv); in kvm_s390_pci_aif_disable()
380 zdev->aisb = 0; in kvm_s390_pci_aif_disable()
381 zdev->aibv = NULL; in kvm_s390_pci_aif_disable()
404 static int kvm_s390_pci_dev_open(struct zpci_dev *zdev) in kvm_s390_pci_dev_open() argument
412 kzdev->zdev = zdev; in kvm_s390_pci_dev_open()
413 zdev->kzdev = kzdev; in kvm_s390_pci_dev_open()
418 static void kvm_s390_pci_dev_release(struct zpci_dev *zdev) in kvm_s390_pci_dev_release() argument
422 kzdev = zdev->kzdev; in kvm_s390_pci_dev_release()
423 WARN_ON(kzdev->zdev != zdev); in kvm_s390_pci_dev_release()
424 zdev->kzdev = NULL; in kvm_s390_pci_dev_release()
436 struct zpci_dev *zdev = opaque; in kvm_s390_pci_register_kvm() local
440 if (!zdev) in kvm_s390_pci_register_kvm()
443 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
445 if (zdev->kzdev || zdev->gisa != 0 || !kvm) { in kvm_s390_pci_register_kvm()
446 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
454 rc = kvm_s390_pci_dev_open(zdev); in kvm_s390_pci_register_kvm()
472 if (zdev_enabled(zdev)) { in kvm_s390_pci_register_kvm()
473 rc = zpci_disable_device(zdev); in kvm_s390_pci_register_kvm()
482 zdev->gisa = (u32)virt_to_phys(&kvm->arch.sie_page2->gisa); in kvm_s390_pci_register_kvm()
484 rc = zpci_enable_device(zdev); in kvm_s390_pci_register_kvm()
489 rc = zpci_register_ioat(zdev, 0, zdev->start_dma, zdev->end_dma, in kvm_s390_pci_register_kvm()
490 virt_to_phys(zdev->dma_table), &status); in kvm_s390_pci_register_kvm()
495 zdev->kzdev->kvm = kvm; in kvm_s390_pci_register_kvm()
498 list_add_tail(&zdev->kzdev->entry, &kvm->arch.kzdev_list); in kvm_s390_pci_register_kvm()
502 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
506 zdev->gisa = 0; in kvm_s390_pci_register_kvm()
508 if (zdev->kzdev) in kvm_s390_pci_register_kvm()
509 kvm_s390_pci_dev_release(zdev); in kvm_s390_pci_register_kvm()
511 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_register_kvm()
518 struct zpci_dev *zdev = opaque; in kvm_s390_pci_unregister_kvm() local
522 if (!zdev) in kvm_s390_pci_unregister_kvm()
525 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
527 if (WARN_ON(!zdev->kzdev)) { in kvm_s390_pci_unregister_kvm()
528 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
532 kvm = zdev->kzdev->kvm; in kvm_s390_pci_unregister_kvm()
539 if (zdev->gisa == 0) in kvm_s390_pci_unregister_kvm()
543 if (zdev->kzdev->fib.fmt0.aibv != 0) in kvm_s390_pci_unregister_kvm()
544 kvm_s390_pci_aif_disable(zdev, true); in kvm_s390_pci_unregister_kvm()
547 zdev->gisa = 0; in kvm_s390_pci_unregister_kvm()
549 if (zdev_enabled(zdev)) { in kvm_s390_pci_unregister_kvm()
550 if (zpci_disable_device(zdev)) in kvm_s390_pci_unregister_kvm()
554 if (zpci_enable_device(zdev)) in kvm_s390_pci_unregister_kvm()
558 zpci_register_ioat(zdev, 0, zdev->start_dma, zdev->end_dma, in kvm_s390_pci_unregister_kvm()
559 virt_to_phys(zdev->dma_table), &status); in kvm_s390_pci_unregister_kvm()
563 list_del(&zdev->kzdev->entry); in kvm_s390_pci_unregister_kvm()
565 kvm_s390_pci_dev_release(zdev); in kvm_s390_pci_unregister_kvm()
568 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_unregister_kvm()
592 struct zpci_dev *zdev = NULL; in get_zdev_from_kvm_by_fh() local
597 if (kzdev->zdev->fh == fh) { in get_zdev_from_kvm_by_fh()
598 zdev = kzdev->zdev; in get_zdev_from_kvm_by_fh()
604 return zdev; in get_zdev_from_kvm_by_fh()
607 static int kvm_s390_pci_zpci_reg_aen(struct zpci_dev *zdev, in kvm_s390_pci_zpci_reg_aen() argument
627 return kvm_s390_pci_aif_enable(zdev, &fib, hostflag); in kvm_s390_pci_zpci_reg_aen()
633 struct zpci_dev *zdev; in kvm_s390_pci_zpci_op() local
636 zdev = get_zdev_from_kvm_by_fh(kvm, args->fh); in kvm_s390_pci_zpci_op()
637 if (!zdev) in kvm_s390_pci_zpci_op()
640 mutex_lock(&zdev->kzdev_lock); in kvm_s390_pci_zpci_op()
643 kzdev = zdev->kzdev; in kvm_s390_pci_zpci_op()
660 r = kvm_s390_pci_zpci_reg_aen(zdev, args); in kvm_s390_pci_zpci_op()
663 r = kvm_s390_pci_aif_disable(zdev, false); in kvm_s390_pci_zpci_op()
671 mutex_unlock(&zdev->kzdev_lock); in kvm_s390_pci_zpci_op()