Lines Matching +full:write +full:- +full:assist

10  * your option) any later version. See the COPYING file in the top-level
18 #include "hw/s390x/s390-pci-bus.h"
19 #include "hw/s390x/s390-pci-inst.h"
20 #include "hw/s390x/s390-pci-kvm.h"
21 #include "hw/s390x/s390-pci-vfio.h"
22 #include "hw/s390x/s390-virtio-ccw.h"
25 #include "hw/qdev-properties.h"
28 #include "qemu/error-report.h"
57 sei_cont = QTAILQ_FIRST(&s->pending_sei); in pci_chsc_sei_nt2_get_event()
59 QTAILQ_REMOVE(&s->pending_sei, sei_cont, link); in pci_chsc_sei_nt2_get_event()
60 nt2_res->nt = 2; in pci_chsc_sei_nt2_get_event()
61 nt2_res->cc = sei_cont->cc; in pci_chsc_sei_nt2_get_event()
62 nt2_res->length = cpu_to_be16(sizeof(ChscSeiNt2Res)); in pci_chsc_sei_nt2_get_event()
63 switch (sei_cont->cc) { in pci_chsc_sei_nt2_get_event()
65 eccdf = (PciCcdfErr *)nt2_res->ccdf; in pci_chsc_sei_nt2_get_event()
66 eccdf->fid = cpu_to_be32(sei_cont->fid); in pci_chsc_sei_nt2_get_event()
67 eccdf->fh = cpu_to_be32(sei_cont->fh); in pci_chsc_sei_nt2_get_event()
68 eccdf->e = cpu_to_be32(sei_cont->e); in pci_chsc_sei_nt2_get_event()
69 eccdf->faddr = cpu_to_be64(sei_cont->faddr); in pci_chsc_sei_nt2_get_event()
70 eccdf->pec = cpu_to_be16(sei_cont->pec); in pci_chsc_sei_nt2_get_event()
73 accdf = (PciCcdfAvail *)nt2_res->ccdf; in pci_chsc_sei_nt2_get_event()
74 accdf->fid = cpu_to_be32(sei_cont->fid); in pci_chsc_sei_nt2_get_event()
75 accdf->fh = cpu_to_be32(sei_cont->fh); in pci_chsc_sei_nt2_get_event()
76 accdf->pec = cpu_to_be16(sei_cont->pec); in pci_chsc_sei_nt2_get_event()
92 return !QTAILQ_EMPTY(&s->pending_sei); in pci_chsc_sei_nt2_have_event()
99 QTAILQ_FIRST(&s->zpci_devs); in s390_pci_find_next_avail_dev()
101 while (ret && ret->state == ZPCI_FS_RESERVED) { in s390_pci_find_next_avail_dev()
112 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) { in s390_pci_find_dev_by_fid()
113 if (pbdev->fid == fid) { in s390_pci_find_dev_by_fid()
125 be32_to_cpu(psccb->aid)); in s390_pci_sclp_configure()
129 trace_s390_pci_sclp_nodev("configure", be32_to_cpu(psccb->aid)); in s390_pci_sclp_configure()
134 switch (pbdev->state) { in s390_pci_sclp_configure()
139 pbdev->state = ZPCI_FS_DISABLED; in s390_pci_sclp_configure()
146 psccb->header.response_code = cpu_to_be16(rc); in s390_pci_sclp_configure()
154 pci_device_reset(pbdev->pdev); in s390_pci_shutdown_notifier()
161 if (pbdev->pft == ZPCI_PFT_ISM) { in s390_pci_perform_unplug()
162 notifier_remove(&pbdev->shutdown_notifier); in s390_pci_perform_unplug()
166 if (pbdev->pdev) { in s390_pci_perform_unplug()
167 DeviceState *pdev = DEVICE(pbdev->pdev); in s390_pci_perform_unplug()
184 be32_to_cpu(psccb->aid)); in s390_pci_sclp_deconfigure()
188 trace_s390_pci_sclp_nodev("deconfigure", be32_to_cpu(psccb->aid)); in s390_pci_sclp_deconfigure()
193 switch (pbdev->state) { in s390_pci_sclp_deconfigure()
201 if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) { in s390_pci_sclp_deconfigure()
204 } else if (pbdev->summary_ind) { in s390_pci_sclp_deconfigure()
207 if (pbdev->iommu->enabled) { in s390_pci_sclp_deconfigure()
208 pci_dereg_ioat(pbdev->iommu); in s390_pci_sclp_deconfigure()
210 pbdev->state = ZPCI_FS_STANDBY; in s390_pci_sclp_deconfigure()
213 if (pbdev->unplug_requested) { in s390_pci_sclp_deconfigure()
218 psccb->header.response_code = cpu_to_be16(rc); in s390_pci_sclp_deconfigure()
225 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) { in s390_pci_find_dev_by_uid()
226 if (pbdev->uid == uid) { in s390_pci_find_dev_by_uid()
243 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) { in s390_pci_find_dev_by_target()
244 if (!strcmp(pbdev->target, target)) { in s390_pci_find_dev_by_target()
261 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) { in s390_pci_find_dev_by_pci()
262 if (pbdev->pdev == pci_dev) { in s390_pci_find_dev_by_pci()
272 return g_hash_table_lookup(s->zpci_table, &idx); in s390_pci_find_dev_by_idx()
280 if (pbdev && pbdev->fh == fh) { in s390_pci_find_dev_by_fh()
294 sei_cont->fh = fh; in s390_pci_generate_event()
295 sei_cont->fid = fid; in s390_pci_generate_event()
296 sei_cont->cc = cc; in s390_pci_generate_event()
297 sei_cont->pec = pec; in s390_pci_generate_event()
298 sei_cont->faddr = faddr; in s390_pci_generate_event()
299 sei_cont->e = e; in s390_pci_generate_event()
301 QTAILQ_INSERT_TAIL(&s->pending_sei, sei_cont, link); in s390_pci_generate_event()
377 /* ett is expected table type, -1 page table, 0 segment table, 1 region table */
454 * @ett: expected table type, 1 region table, 0 segment table and -1 page table.
463 tx = get_table_index(entry->iova, ett); in table_translate()
473 entry->perm &= IOMMU_NONE; in table_translate()
490 entry->perm &= IOMMU_RO; in table_translate()
492 entry->perm &= IOMMU_RW; in table_translate()
498 entry->translated_addr = te & ZPCI_PTE_ADDR_MASK; in table_translate()
501 entry->translated_addr = (te & ZPCI_SFAA_MASK) | in table_translate()
502 (entry->iova & ~ZPCI_SFAA_MASK); in table_translate()
509 entry->perm = IOMMU_NONE; in table_translate()
512 entry->len = get_frame_size(ett); in table_translate()
523 entry->iova = addr & TARGET_PAGE_MASK; in s390_guest_io_table_walk()
524 entry->translated_addr = 0; in s390_guest_io_table_walk()
525 entry->perm = IOMMU_RW; in s390_guest_io_table_walk()
528 entry->perm &= IOMMU_RO; in s390_guest_io_table_walk()
532 to = table_translate(entry, to, ett--, &error); in s390_guest_io_table_walk()
553 switch (iommu->pbdev->state) { in s390_translate_iommu()
556 if (!iommu->enabled) { in s390_translate_iommu()
566 if (addr < iommu->pba || addr > iommu->pal) { in s390_translate_iommu()
571 entry = g_hash_table_lookup(iommu->iotlb, &iova); in s390_translate_iommu()
573 ret.iova = entry->iova; in s390_translate_iommu()
574 ret.translated_addr = entry->translated_addr; in s390_translate_iommu()
575 ret.addr_mask = entry->len - 1; in s390_translate_iommu()
576 ret.perm = entry->perm; in s390_translate_iommu()
588 iommu->pbdev->state = ZPCI_FS_ERROR; in s390_translate_iommu()
589 s390_pci_generate_error_event(error, iommu->pbdev->fh, in s390_translate_iommu()
590 iommu->pbdev->fid, addr, 0); in s390_translate_iommu()
600 * zpci device" construct. But when we support migration of vfio-pci in s390_pci_iommu_replay()
609 S390PCIIOMMUTable *table = g_hash_table_lookup(s->iommu_table, &key); in s390_pci_get_iommu()
614 table->key = key; in s390_pci_get_iommu()
615 g_hash_table_insert(s->iommu_table, &table->key, table); in s390_pci_get_iommu()
618 iommu = table->iommu[PCI_SLOT(devfn)]; in s390_pci_get_iommu()
622 char *mr_name = g_strdup_printf("iommu-root-%02x:%02x.%01x", in s390_pci_get_iommu()
626 char *as_name = g_strdup_printf("iommu-pci-%02x:%02x.%01x", in s390_pci_get_iommu()
630 memory_region_init(&iommu->mr, OBJECT(iommu), mr_name, UINT64_MAX); in s390_pci_get_iommu()
631 address_space_init(&iommu->as, &iommu->mr, as_name); in s390_pci_get_iommu()
632 iommu->iotlb = g_hash_table_new_full(g_int64_hash, g_int64_equal, in s390_pci_get_iommu()
634 table->iommu[PCI_SLOT(devfn)] = iommu; in s390_pci_get_iommu()
648 return &iommu->as; in s390_pci_dma_iommu()
665 return -1; in set_ind_atomic()
687 trace_s390_pci_msi_ctrl_write(data, pbdev->idx, vec); in s390_msi_ctrl_write()
689 if (pbdev->state != ZPCI_FS_ENABLED) { in s390_msi_ctrl_write()
693 ind_bit = pbdev->routes.adapter.ind_offset; in s390_msi_ctrl_write()
694 sum_bit = pbdev->routes.adapter.summary_offset; in s390_msi_ctrl_write()
696 set_ind_atomic(pbdev->routes.adapter.ind_addr + (ind_bit + vec) / 8, in s390_msi_ctrl_write()
698 if (!set_ind_atomic(pbdev->routes.adapter.summary_addr + sum_bit / 8, in s390_msi_ctrl_write()
700 css_adapter_interrupt(CSS_IO_ADAPTER_PCI, pbdev->isc); in s390_msi_ctrl_write()
710 .write = s390_msi_ctrl_write,
718 * The iommu region is initialized against a 0-mapped address space, in s390_pci_iommu_enable()
722 char *name = g_strdup_printf("iommu-s390-%04x", iommu->pbdev->uid); in s390_pci_iommu_enable()
723 memory_region_init_iommu(&iommu->iommu_mr, sizeof(iommu->iommu_mr), in s390_pci_iommu_enable()
724 TYPE_S390_IOMMU_MEMORY_REGION, OBJECT(&iommu->mr), in s390_pci_iommu_enable()
725 name, iommu->pal + 1); in s390_pci_iommu_enable()
726 iommu->enabled = true; in s390_pci_iommu_enable()
727 memory_region_add_subregion(&iommu->mr, 0, MEMORY_REGION(&iommu->iommu_mr)); in s390_pci_iommu_enable()
737 * For direct-mapping we must map the entire guest address space. Rather in s390_pci_iommu_direct_map_enable()
741 g_autofree char *name = g_strdup_printf("iommu-dm-s390-%04x", in s390_pci_iommu_direct_map_enable()
742 iommu->pbdev->uid); in s390_pci_iommu_direct_map_enable()
744 iommu->dm_mr = g_malloc0(sizeof(*iommu->dm_mr)); in s390_pci_iommu_direct_map_enable()
745 memory_region_init_alias(iommu->dm_mr, OBJECT(&iommu->mr), name, in s390_pci_iommu_direct_map_enable()
748 iommu->enabled = true; in s390_pci_iommu_direct_map_enable()
749 memory_region_add_subregion(&iommu->mr, iommu->pbdev->zpci_fn.sdma, in s390_pci_iommu_direct_map_enable()
750 iommu->dm_mr); in s390_pci_iommu_direct_map_enable()
755 iommu->enabled = false; in s390_pci_iommu_disable()
756 g_hash_table_remove_all(iommu->iotlb); in s390_pci_iommu_disable()
757 if (iommu->dm_mr) { in s390_pci_iommu_disable()
758 memory_region_del_subregion(&iommu->mr, iommu->dm_mr); in s390_pci_iommu_disable()
759 object_unparent(OBJECT(iommu->dm_mr)); in s390_pci_iommu_disable()
760 g_free(iommu->dm_mr); in s390_pci_iommu_disable()
761 iommu->dm_mr = NULL; in s390_pci_iommu_disable()
763 memory_region_del_subregion(&iommu->mr, in s390_pci_iommu_disable()
764 MEMORY_REGION(&iommu->iommu_mr)); in s390_pci_iommu_disable()
765 object_unparent(OBJECT(&iommu->iommu_mr)); in s390_pci_iommu_disable()
772 S390PCIIOMMUTable *table = g_hash_table_lookup(s->iommu_table, &key); in s390_pci_iommu_free()
773 S390PCIIOMMU *iommu = table ? table->iommu[PCI_SLOT(devfn)] : NULL; in s390_pci_iommu_free()
779 table->iommu[PCI_SLOT(devfn)] = NULL; in s390_pci_iommu_free()
780 g_hash_table_destroy(iommu->iotlb); in s390_pci_iommu_free()
787 address_space_remove_listeners(&iommu->as); in s390_pci_iommu_free()
788 address_space_destroy(&iommu->as); in s390_pci_iommu_free()
789 object_unparent(OBJECT(&iommu->mr)); in s390_pci_iommu_free()
800 group->id = id; in s390_group_create()
801 group->host_id = host_id; in s390_group_create()
802 QTAILQ_INSERT_TAIL(&s->zpci_groups, group, link); in s390_group_create()
811 QTAILQ_FOREACH(group, &s->zpci_groups, link) { in s390_group_find()
812 if (group->id == id) { in s390_group_find()
824 QTAILQ_FOREACH(group, &s->zpci_groups, link) { in s390_group_find_host_sim()
825 if (group->id >= ZPCI_SIM_GRP_START && group->host_id == host_id) { in s390_group_find_host_sim()
838 resgrp = &group->zpci_group; in s390_pci_init_default_group()
839 resgrp->fr = 1; in s390_pci_init_default_group()
840 resgrp->dasm = 0; in s390_pci_init_default_group()
841 resgrp->msia = ZPCI_MSI_ADDR; in s390_pci_init_default_group()
842 resgrp->mui = DEFAULT_MUI; in s390_pci_init_default_group()
843 resgrp->i = 128; in s390_pci_init_default_group()
844 resgrp->maxstbl = 128; in s390_pci_init_default_group()
845 resgrp->version = 0; in s390_pci_init_default_group()
846 resgrp->dtsm = ZPCI_DTSM; in s390_pci_init_default_group()
851 pbdev->zpci_fn.sdma = ZPCI_SDMA_ADDR; in set_pbdev_info()
852 pbdev->zpci_fn.edma = ZPCI_EDMA_ADDR; in set_pbdev_info()
853 pbdev->zpci_fn.pchid = 0; in set_pbdev_info()
854 pbdev->zpci_fn.pfgid = ZPCI_DEFAULT_FN_GRP; in set_pbdev_info()
855 pbdev->zpci_fn.fid = pbdev->fid; in set_pbdev_info()
856 pbdev->zpci_fn.uid = pbdev->uid; in set_pbdev_info()
857 pbdev->pci_group = s390_group_find(ZPCI_DEFAULT_FN_GRP); in set_pbdev_info()
876 phb->bus = b; in s390_pcihost_realize()
878 s->bus = S390_PCI_BUS(qbus_new(TYPE_S390_PCI_BUS, dev, NULL)); in s390_pcihost_realize()
879 qbus_set_hotplug_handler(BUS(s->bus), OBJECT(dev)); in s390_pcihost_realize()
881 s->iommu_table = g_hash_table_new_full(g_int64_hash, g_int64_equal, in s390_pcihost_realize()
883 s->zpci_table = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, NULL); in s390_pcihost_realize()
884 s->bus_no = 0; in s390_pcihost_realize()
885 s->next_sim_grp = ZPCI_SIM_GRP_START; in s390_pcihost_realize()
886 QTAILQ_INIT(&s->pending_sei); in s390_pcihost_realize()
887 QTAILQ_INIT(&s->zpci_devs); in s390_pcihost_realize()
888 QTAILQ_INIT(&s->zpci_dma_limit); in s390_pcihost_realize()
889 QTAILQ_INIT(&s->zpci_groups); in s390_pcihost_realize()
901 while (!QTAILQ_EMPTY(&s->zpci_groups)) { in s390_pcihost_unrealize()
902 group = QTAILQ_FIRST(&s->zpci_groups); in s390_pcihost_unrealize()
903 QTAILQ_REMOVE(&s->zpci_groups, group, link); in s390_pcihost_unrealize()
914 pos = pci_find_capability(pbdev->pdev, PCI_CAP_ID_MSIX); in s390_pci_msix_init()
916 return -1; in s390_pci_msix_init()
919 ctrl = pci_host_config_read_common(pbdev->pdev, pos + PCI_MSIX_FLAGS, in s390_pci_msix_init()
920 pci_config_size(pbdev->pdev), sizeof(ctrl)); in s390_pci_msix_init()
921 table = pci_host_config_read_common(pbdev->pdev, pos + PCI_MSIX_TABLE, in s390_pci_msix_init()
922 pci_config_size(pbdev->pdev), sizeof(table)); in s390_pci_msix_init()
923 pba = pci_host_config_read_common(pbdev->pdev, pos + PCI_MSIX_PBA, in s390_pci_msix_init()
924 pci_config_size(pbdev->pdev), sizeof(pba)); in s390_pci_msix_init()
926 pbdev->msix.table_bar = table & PCI_MSIX_FLAGS_BIRMASK; in s390_pci_msix_init()
927 pbdev->msix.table_offset = table & ~PCI_MSIX_FLAGS_BIRMASK; in s390_pci_msix_init()
928 pbdev->msix.pba_bar = pba & PCI_MSIX_FLAGS_BIRMASK; in s390_pci_msix_init()
929 pbdev->msix.pba_offset = pba & ~PCI_MSIX_FLAGS_BIRMASK; in s390_pci_msix_init()
930 pbdev->msix.entries = (ctrl & PCI_MSIX_FLAGS_QSIZE) + 1; in s390_pci_msix_init()
932 name = g_strdup_printf("msix-s390-%04x", pbdev->uid); in s390_pci_msix_init()
933 memory_region_init_io(&pbdev->msix_notify_mr, OBJECT(pbdev), in s390_pci_msix_init()
935 memory_region_add_subregion(&pbdev->iommu->mr, in s390_pci_msix_init()
936 pbdev->pci_group->zpci_group.msia, in s390_pci_msix_init()
937 &pbdev->msix_notify_mr); in s390_pci_msix_init()
945 if (pbdev->msix.entries == 0) { in s390_pci_msix_free()
949 memory_region_del_subregion(&pbdev->iommu->mr, &pbdev->msix_notify_mr); in s390_pci_msix_free()
950 object_unparent(OBJECT(&pbdev->msix_notify_mr)); in s390_pci_msix_free()
971 if (!qdev_realize_and_unref(dev, BUS(s->bus), &local_err)) { in s390_pci_device_new()
985 idx = s->next_idx; in s390_pci_alloc_idx()
988 if (idx == s->next_idx) { in s390_pci_alloc_idx()
993 pbdev->idx = idx; in s390_pci_alloc_idx()
1024 dev = pci_get_bus(dev)->parent_dev; in s390_pci_update_subordinate()
1038 return -EPERM; in s390_pci_interp_plug()
1047 pbdev->fh = fh & ~FH_MASK_ENABLE; in s390_pci_interp_plug()
1049 /* Next, see if the idx is already in-use */ in s390_pci_interp_plug()
1050 idx = pbdev->fh & FH_MASK_INDEX; in s390_pci_interp_plug()
1051 if (pbdev->idx != idx) { in s390_pci_interp_plug()
1053 return -EINVAL; in s390_pci_interp_plug()
1060 g_hash_table_remove(s->zpci_table, &pbdev->idx); in s390_pci_interp_plug()
1061 if (idx < s->next_idx) { in s390_pci_interp_plug()
1062 s->next_idx = idx; in s390_pci_interp_plug()
1064 pbdev->idx = idx; in s390_pci_interp_plug()
1065 g_hash_table_insert(s->zpci_table, &pbdev->idx, pbdev); in s390_pci_interp_plug()
1083 pci_bridge_map_irq(pb, dev->id, s390_pci_map_irq); in s390_pcihost_plug()
1084 pci_setup_iommu(&pb->sec_bus, &s390_iommu_ops, s); in s390_pcihost_plug()
1086 qbus_set_hotplug_handler(BUS(&pb->sec_bus), OBJECT(s)); in s390_pcihost_plug()
1088 if (dev->hotplugged) { in s390_pcihost_plug()
1091 s->bus_no += 1; in s390_pcihost_plug()
1092 pci_default_write_config(pdev, PCI_SECONDARY_BUS, s->bus_no, 1); in s390_pcihost_plug()
1094 s390_pci_update_subordinate(pdev, s->bus_no); in s390_pcihost_plug()
1101 * do not check for multifunction capability for SR-IOV devices because in s390_pcihost_plug()
1102 * SR-IOV devices automatically add the multifunction capability whether in s390_pcihost_plug()
1105 if (pdev->cap_present & QEMU_PCI_CAP_MULTIFUNCTION && in s390_pcihost_plug()
1106 !pdev->exp.sriov_cap) { in s390_pcihost_plug()
1111 if (!dev->id) { in s390_pcihost_plug()
1114 dev->id = g_strdup_printf("auto_%02x:%02x.%01x", in s390_pcihost_plug()
1116 PCI_SLOT(pdev->devfn), in s390_pcihost_plug()
1117 PCI_FUNC(pdev->devfn)); in s390_pcihost_plug()
1120 pbdev = s390_pci_find_dev_by_target(s, dev->id); in s390_pcihost_plug()
1132 pbdev = s390_pci_device_new(s, dev->id, errp); in s390_pcihost_plug()
1138 pbdev->pdev = pdev; in s390_pcihost_plug()
1139 pbdev->iommu = s390_pci_get_iommu(s, pci_get_bus(pdev), pdev->devfn); in s390_pcihost_plug()
1140 pbdev->iommu->pbdev = pbdev; in s390_pcihost_plug()
1141 pbdev->state = ZPCI_FS_DISABLED; in s390_pcihost_plug()
1144 if (object_dynamic_cast(OBJECT(dev), "vfio-pci")) { in s390_pcihost_plug()
1150 if (pbdev->interp) { in s390_pcihost_plug()
1160 pbdev->interp = false; in s390_pcihost_plug()
1161 pbdev->forwarding_assist = false; in s390_pcihost_plug()
1164 pbdev->iommu->dma_limit = s390_pci_start_dma_count(s, pbdev); in s390_pcihost_plug()
1167 if (!pbdev->interp) { in s390_pcihost_plug()
1169 pbdev->fh |= FH_SHM_VFIO; in s390_pcihost_plug()
1170 pbdev->forwarding_assist = false; in s390_pcihost_plug()
1173 if (pbdev->pft == ZPCI_PFT_ISM) { in s390_pcihost_plug()
1174 pbdev->shutdown_notifier.notify = s390_pci_shutdown_notifier; in s390_pcihost_plug()
1175 qemu_register_shutdown_notifier(&pbdev->shutdown_notifier); in s390_pcihost_plug()
1178 pbdev->fh |= FH_SHM_EMUL; in s390_pcihost_plug()
1180 pbdev->interp = false; in s390_pcihost_plug()
1181 pbdev->forwarding_assist = false; in s390_pcihost_plug()
1182 pbdev->rtr_avail = false; in s390_pcihost_plug()
1185 if (s390_pci_msix_init(pbdev) && !pbdev->interp) { in s390_pcihost_plug()
1186 error_setg(errp, "MSI-X support is mandatory " in s390_pcihost_plug()
1191 if (dev->hotplugged) { in s390_pcihost_plug()
1193 pbdev->fh, pbdev->fid); in s390_pcihost_plug()
1199 s->next_idx = (pbdev->idx + 1) & FH_MASK_INDEX; in s390_pcihost_plug()
1200 pbdev->fh = pbdev->idx; in s390_pcihost_plug()
1201 QTAILQ_INSERT_TAIL(&s->zpci_devs, pbdev, link); in s390_pcihost_plug()
1202 g_hash_table_insert(s->zpci_table, &pbdev->idx, pbdev); in s390_pcihost_plug()
1226 pbdev->fh, pbdev->fid); in s390_pcihost_unplug()
1228 devfn = pci_dev->devfn; in s390_pcihost_unplug()
1233 pbdev->pdev = NULL; in s390_pcihost_unplug()
1234 pbdev->state = ZPCI_FS_RESERVED; in s390_pcihost_unplug()
1237 pbdev->fid = 0; in s390_pcihost_unplug()
1238 QTAILQ_REMOVE(&s->zpci_devs, pbdev, link); in s390_pcihost_unplug()
1239 g_hash_table_remove(s->zpci_table, &pbdev->idx); in s390_pcihost_unplug()
1240 if (pbdev->iommu->dma_limit) { in s390_pcihost_unplug()
1241 s390_pci_end_dma_count(s, pbdev->iommu->dma_limit); in s390_pcihost_unplug()
1267 pbdev->pci_unplug_request_processed = true; in s390_pcihost_unplug_request()
1278 if (pbdev->pdev && !pbdev->pci_unplug_request_processed) { in s390_pcihost_unplug_request()
1279 qdev_unplug(DEVICE(pbdev->pdev), errp); in s390_pcihost_unplug_request()
1282 pbdev->pci_unplug_request_processed = false; in s390_pcihost_unplug_request()
1284 switch (pbdev->state) { in s390_pcihost_unplug_request()
1295 pbdev->unplug_requested = true; in s390_pcihost_unplug_request()
1297 pbdev->fh, pbdev->fid); in s390_pcihost_unplug_request()
1315 (s->bus_no)++; in s390_pci_enumerate_bridge()
1317 pci_default_write_config(pdev, PCI_SECONDARY_BUS, s->bus_no, 1); in s390_pci_enumerate_bridge()
1318 pci_default_write_config(pdev, PCI_SUBORDINATE_BUS, s->bus_no, 1); in s390_pci_enumerate_bridge()
1327 pci_default_write_config(pdev, PCI_SUBORDINATE_BUS, s->bus_no, 1); in s390_pci_enumerate_bridge()
1336 /* Trigger reset event for each passthrough ISM device currently in-use */ in s390_pci_ism_reset()
1337 QTAILQ_FOREACH_SAFE(pbdev, &s->zpci_devs, link, next) { in s390_pci_ism_reset()
1338 if (pbdev->interp && pbdev->pft == ZPCI_PFT_ISM && in s390_pci_ism_reset()
1339 pbdev->fh & FH_MASK_ENABLE) { in s390_pci_ism_reset()
1342 pci_device_reset(pbdev->pdev); in s390_pci_ism_reset()
1350 PCIBus *bus = s->parent_obj.bus; in s390_pcihost_reset()
1354 QTAILQ_FOREACH_SAFE(pbdev, &s->zpci_devs, link, next) { in s390_pcihost_reset()
1355 if (pbdev->unplug_requested) { in s390_pcihost_reset()
1356 if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) { in s390_pcihost_reset()
1359 } else if (pbdev->summary_ind) { in s390_pcihost_reset()
1362 if (pbdev->iommu->enabled) { in s390_pcihost_reset()
1363 pci_dereg_ioat(pbdev->iommu); in s390_pcihost_reset()
1365 pbdev->state = ZPCI_FS_STANDBY; in s390_pcihost_reset()
1374 s->bus_no = 0; in s390_pcihost_reset()
1384 dc->realize = s390_pcihost_realize; in s390_pcihost_class_init()
1385 dc->unrealize = s390_pcihost_unrealize; in s390_pcihost_class_init()
1386 hc->pre_plug = s390_pcihost_pre_plug; in s390_pcihost_class_init()
1387 hc->plug = s390_pcihost_plug; in s390_pcihost_class_init()
1388 hc->unplug_request = s390_pcihost_unplug_request; in s390_pcihost_class_init()
1389 hc->unplug = s390_pcihost_unplug; in s390_pcihost_class_init()
1443 if (!zpci->target) { in s390_pci_device_realize()
1448 if (s390_pci_find_dev_by_target(s, zpci->target)) { in s390_pci_device_realize()
1450 zpci->target); in s390_pci_device_realize()
1454 if (zpci->uid == UID_UNDEFINED) { in s390_pci_device_realize()
1455 zpci->uid = s390_pci_generate_uid(s); in s390_pci_device_realize()
1456 if (!zpci->uid) { in s390_pci_device_realize()
1460 } else if (s390_pci_find_dev_by_uid(s, zpci->uid)) { in s390_pci_device_realize()
1461 error_setg(errp, "uid %u already in use", zpci->uid); in s390_pci_device_realize()
1465 if (!zpci->fid_defined) { in s390_pci_device_realize()
1468 zpci->fid = s390_pci_generate_fid(s, &local_error); in s390_pci_device_realize()
1473 } else if (s390_pci_find_dev_by_fid(s, zpci->fid)) { in s390_pci_device_realize()
1474 error_setg(errp, "fid %u already in use", zpci->fid); in s390_pci_device_realize()
1478 zpci->state = ZPCI_FS_RESERVED; in s390_pci_device_realize()
1479 zpci->fmb.format = ZPCI_FMB_FORMAT; in s390_pci_device_realize()
1486 switch (pbdev->state) { in s390_pci_device_reset()
1492 pbdev->fh &= ~FH_MASK_ENABLE; in s390_pci_device_reset()
1493 pbdev->state = ZPCI_FS_DISABLED; in s390_pci_device_reset()
1497 if (pbdev->interp && (pbdev->fh & FH_MASK_ENABLE)) { in s390_pci_device_reset()
1500 } else if (pbdev->summary_ind) { in s390_pci_device_reset()
1503 if (pbdev->iommu->enabled) { in s390_pci_device_reset()
1504 pci_dereg_ioat(pbdev->iommu); in s390_pci_device_reset()
1529 zpci->fid_defined = true; in s390_pci_set_fid()
1547 DEFINE_PROP_BOOL("forwarding-assist", S390PCIBusDevice, forwarding_assist,
1549 DEFINE_PROP_BOOL("relaxed-translation", S390PCIBusDevice, rtr_avail,
1566 dc->desc = "zpci device"; in s390_pci_device_class_init()
1567 set_bit(DEVICE_CATEGORY_MISC, dc->categories); in s390_pci_device_class_init()
1569 dc->bus_type = TYPE_S390_PCI_BUS; in s390_pci_device_class_init()
1570 dc->realize = s390_pci_device_realize; in s390_pci_device_class_init()
1572 dc->vmsd = &s390_pci_device_vmstate; in s390_pci_device_class_init()
1593 imrc->translate = s390_translate_iommu; in s390_iommu_memory_region_class_init()
1594 imrc->replay = s390_pci_iommu_replay; in s390_iommu_memory_region_class_init()