4 * Copyright 2014 IBM Corp.
5 * Author(s): Frank Blaschka <frank.blaschka@de.ibm.com>
6 * Hong Bo Li <lihbbj@cn.ibm.com>
7 * Yi Min Zhao <zyimin@cn.ibm.com>
9 * This work is licensed under the terms of the GNU GPL, version 2 or (at
10 * your option) any later version. See the COPYING file in the top-level
14 #include "qemu/osdep.h"
15 #include "qapi/error.h"
16 #include "qapi/visitor.h"
17 #include "hw/s390x/s390-pci-bus.h"
18 #include "hw/s390x/s390-pci-inst.h"
19 #include "hw/s390x/s390-pci-kvm.h"
20 #include "hw/s390x/s390-pci-vfio.h"
21 #include "hw/pci/pci_bus.h"
22 #include "hw/qdev-properties.h"
23 #include "hw/pci/pci_bridge.h"
24 #include "hw/pci/msi.h"
25 #include "qemu/error-report.h"
26 #include "qemu/module.h"
27 #include "sysemu/reset.h"
28 #include "sysemu/runstate.h"
30 #ifndef DEBUG_S390PCI_BUS
31 #define DEBUG_S390PCI_BUS 0
34 #define DPRINTF(fmt, ...) \
36 if (DEBUG_S390PCI_BUS) { \
37 fprintf(stderr, "S390pci-bus: " fmt, ## __VA_ARGS__); \
41 S390pciState
*s390_get_phb(void)
43 static S390pciState
*phb
;
46 phb
= S390_PCI_HOST_BRIDGE(
47 object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE
, NULL
));
54 int pci_chsc_sei_nt2_get_event(void *res
)
56 ChscSeiNt2Res
*nt2_res
= (ChscSeiNt2Res
*)res
;
60 SeiContainer
*sei_cont
;
61 S390pciState
*s
= s390_get_phb();
63 sei_cont
= QTAILQ_FIRST(&s
->pending_sei
);
65 QTAILQ_REMOVE(&s
->pending_sei
, sei_cont
, link
);
67 nt2_res
->cc
= sei_cont
->cc
;
68 nt2_res
->length
= cpu_to_be16(sizeof(ChscSeiNt2Res
));
69 switch (sei_cont
->cc
) {
70 case 1: /* error event */
71 eccdf
= (PciCcdfErr
*)nt2_res
->ccdf
;
72 eccdf
->fid
= cpu_to_be32(sei_cont
->fid
);
73 eccdf
->fh
= cpu_to_be32(sei_cont
->fh
);
74 eccdf
->e
= cpu_to_be32(sei_cont
->e
);
75 eccdf
->faddr
= cpu_to_be64(sei_cont
->faddr
);
76 eccdf
->pec
= cpu_to_be16(sei_cont
->pec
);
78 case 2: /* availability event */
79 accdf
= (PciCcdfAvail
*)nt2_res
->ccdf
;
80 accdf
->fid
= cpu_to_be32(sei_cont
->fid
);
81 accdf
->fh
= cpu_to_be32(sei_cont
->fh
);
82 accdf
->pec
= cpu_to_be16(sei_cont
->pec
);
94 int pci_chsc_sei_nt2_have_event(void)
96 S390pciState
*s
= s390_get_phb();
98 return !QTAILQ_EMPTY(&s
->pending_sei
);
101 S390PCIBusDevice
*s390_pci_find_next_avail_dev(S390pciState
*s
,
102 S390PCIBusDevice
*pbdev
)
104 S390PCIBusDevice
*ret
= pbdev
? QTAILQ_NEXT(pbdev
, link
) :
105 QTAILQ_FIRST(&s
->zpci_devs
);
107 while (ret
&& ret
->state
== ZPCI_FS_RESERVED
) {
108 ret
= QTAILQ_NEXT(ret
, link
);
114 S390PCIBusDevice
*s390_pci_find_dev_by_fid(S390pciState
*s
, uint32_t fid
)
116 S390PCIBusDevice
*pbdev
;
118 QTAILQ_FOREACH(pbdev
, &s
->zpci_devs
, link
) {
119 if (pbdev
->fid
== fid
) {
127 void s390_pci_sclp_configure(SCCB
*sccb
)
129 IoaCfgSccb
*psccb
= (IoaCfgSccb
*)sccb
;
130 S390PCIBusDevice
*pbdev
= s390_pci_find_dev_by_fid(s390_get_phb(),
131 be32_to_cpu(psccb
->aid
));
135 DPRINTF("sclp config no dev found\n");
136 rc
= SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED
;
140 switch (pbdev
->state
) {
141 case ZPCI_FS_RESERVED
:
142 rc
= SCLP_RC_ADAPTER_IN_RESERVED_STATE
;
144 case ZPCI_FS_STANDBY
:
145 pbdev
->state
= ZPCI_FS_DISABLED
;
146 rc
= SCLP_RC_NORMAL_COMPLETION
;
149 rc
= SCLP_RC_NO_ACTION_REQUIRED
;
152 psccb
->header
.response_code
= cpu_to_be16(rc
);
155 static void s390_pci_shutdown_notifier(Notifier
*n
, void *opaque
)
157 S390PCIBusDevice
*pbdev
= container_of(n
, S390PCIBusDevice
,
160 pci_device_reset(pbdev
->pdev
);
163 static void s390_pci_reset_cb(void *opaque
)
165 S390PCIBusDevice
*pbdev
= opaque
;
167 pci_device_reset(pbdev
->pdev
);
170 static void s390_pci_perform_unplug(S390PCIBusDevice
*pbdev
)
172 HotplugHandler
*hotplug_ctrl
;
174 if (pbdev
->pft
== ZPCI_PFT_ISM
) {
175 notifier_remove(&pbdev
->shutdown_notifier
);
176 qemu_unregister_reset(s390_pci_reset_cb
, pbdev
);
179 /* Unplug the PCI device */
181 DeviceState
*pdev
= DEVICE(pbdev
->pdev
);
183 hotplug_ctrl
= qdev_get_hotplug_handler(pdev
);
184 hotplug_handler_unplug(hotplug_ctrl
, pdev
, &error_abort
);
185 object_unparent(OBJECT(pdev
));
188 /* Unplug the zPCI device */
189 hotplug_ctrl
= qdev_get_hotplug_handler(DEVICE(pbdev
));
190 hotplug_handler_unplug(hotplug_ctrl
, DEVICE(pbdev
), &error_abort
);
191 object_unparent(OBJECT(pbdev
));
194 void s390_pci_sclp_deconfigure(SCCB
*sccb
)
196 IoaCfgSccb
*psccb
= (IoaCfgSccb
*)sccb
;
197 S390PCIBusDevice
*pbdev
= s390_pci_find_dev_by_fid(s390_get_phb(),
198 be32_to_cpu(psccb
->aid
));
202 DPRINTF("sclp deconfig no dev found\n");
203 rc
= SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED
;
207 switch (pbdev
->state
) {
208 case ZPCI_FS_RESERVED
:
209 rc
= SCLP_RC_ADAPTER_IN_RESERVED_STATE
;
211 case ZPCI_FS_STANDBY
:
212 rc
= SCLP_RC_NO_ACTION_REQUIRED
;
215 if (pbdev
->interp
&& (pbdev
->fh
& FH_MASK_ENABLE
)) {
216 /* Interpreted devices were using interrupt forwarding */
217 s390_pci_kvm_aif_disable(pbdev
);
218 } else if (pbdev
->summary_ind
) {
219 pci_dereg_irqs(pbdev
);
221 if (pbdev
->iommu
->enabled
) {
222 pci_dereg_ioat(pbdev
->iommu
);
224 pbdev
->state
= ZPCI_FS_STANDBY
;
225 rc
= SCLP_RC_NORMAL_COMPLETION
;
227 if (pbdev
->unplug_requested
) {
228 s390_pci_perform_unplug(pbdev
);
232 psccb
->header
.response_code
= cpu_to_be16(rc
);
235 static S390PCIBusDevice
*s390_pci_find_dev_by_uid(S390pciState
*s
, uint16_t uid
)
237 S390PCIBusDevice
*pbdev
;
239 QTAILQ_FOREACH(pbdev
, &s
->zpci_devs
, link
) {
240 if (pbdev
->uid
== uid
) {
248 S390PCIBusDevice
*s390_pci_find_dev_by_target(S390pciState
*s
,
251 S390PCIBusDevice
*pbdev
;
257 QTAILQ_FOREACH(pbdev
, &s
->zpci_devs
, link
) {
258 if (!strcmp(pbdev
->target
, target
)) {
266 static S390PCIBusDevice
*s390_pci_find_dev_by_pci(S390pciState
*s
,
269 S390PCIBusDevice
*pbdev
;
275 QTAILQ_FOREACH(pbdev
, &s
->zpci_devs
, link
) {
276 if (pbdev
->pdev
== pci_dev
) {
284 S390PCIBusDevice
*s390_pci_find_dev_by_idx(S390pciState
*s
, uint32_t idx
)
286 return g_hash_table_lookup(s
->zpci_table
, &idx
);
289 S390PCIBusDevice
*s390_pci_find_dev_by_fh(S390pciState
*s
, uint32_t fh
)
291 uint32_t idx
= FH_MASK_INDEX
& fh
;
292 S390PCIBusDevice
*pbdev
= s390_pci_find_dev_by_idx(s
, idx
);
294 if (pbdev
&& pbdev
->fh
== fh
) {
301 static void s390_pci_generate_event(uint8_t cc
, uint16_t pec
, uint32_t fh
,
302 uint32_t fid
, uint64_t faddr
, uint32_t e
)
304 SeiContainer
*sei_cont
;
305 S390pciState
*s
= s390_get_phb();
307 sei_cont
= g_new0(SeiContainer
, 1);
312 sei_cont
->faddr
= faddr
;
315 QTAILQ_INSERT_TAIL(&s
->pending_sei
, sei_cont
, link
);
316 css_generate_css_crws(0);
319 static void s390_pci_generate_plug_event(uint16_t pec
, uint32_t fh
,
322 s390_pci_generate_event(2, pec
, fh
, fid
, 0, 0);
325 void s390_pci_generate_error_event(uint16_t pec
, uint32_t fh
, uint32_t fid
,
326 uint64_t faddr
, uint32_t e
)
328 s390_pci_generate_event(1, pec
, fh
, fid
, faddr
, e
);
331 static void s390_pci_set_irq(void *opaque
, int irq
, int level
)
336 static int s390_pci_map_irq(PCIDevice
*pci_dev
, int irq_num
)
342 static uint64_t s390_pci_get_table_origin(uint64_t iota
)
344 return iota
& ~ZPCI_IOTA_RTTO_FLAG
;
347 static unsigned int calc_rtx(dma_addr_t ptr
)
349 return ((unsigned long) ptr
>> ZPCI_RT_SHIFT
) & ZPCI_INDEX_MASK
;
352 static unsigned int calc_sx(dma_addr_t ptr
)
354 return ((unsigned long) ptr
>> ZPCI_ST_SHIFT
) & ZPCI_INDEX_MASK
;
357 static unsigned int calc_px(dma_addr_t ptr
)
359 return ((unsigned long) ptr
>> TARGET_PAGE_BITS
) & ZPCI_PT_MASK
;
362 static uint64_t get_rt_sto(uint64_t entry
)
364 return ((entry
& ZPCI_TABLE_TYPE_MASK
) == ZPCI_TABLE_TYPE_RTX
)
365 ? (entry
& ZPCI_RTE_ADDR_MASK
)
369 static uint64_t get_st_pto(uint64_t entry
)
371 return ((entry
& ZPCI_TABLE_TYPE_MASK
) == ZPCI_TABLE_TYPE_SX
)
372 ? (entry
& ZPCI_STE_ADDR_MASK
)
376 static bool rt_entry_isvalid(uint64_t entry
)
378 return (entry
& ZPCI_TABLE_VALID_MASK
) == ZPCI_TABLE_VALID
;
381 static bool pt_entry_isvalid(uint64_t entry
)
383 return (entry
& ZPCI_PTE_VALID_MASK
) == ZPCI_PTE_VALID
;
386 static bool entry_isprotected(uint64_t entry
)
388 return (entry
& ZPCI_TABLE_PROT_MASK
) == ZPCI_TABLE_PROTECTED
;
391 /* ett is expected table type, -1 page table, 0 segment table, 1 region table */
392 static uint64_t get_table_index(uint64_t iova
, int8_t ett
)
396 return calc_px(iova
);
398 return calc_sx(iova
);
400 return calc_rtx(iova
);
406 static bool entry_isvalid(uint64_t entry
, int8_t ett
)
410 return pt_entry_isvalid(entry
);
413 return rt_entry_isvalid(entry
);
419 /* Return true if address translation is done */
420 static bool translate_iscomplete(uint64_t entry
, int8_t ett
)
424 return (entry
& ZPCI_TABLE_FC
) ? true : false;
432 static uint64_t get_frame_size(int8_t ett
)
446 static uint64_t get_next_table_origin(uint64_t entry
, int8_t ett
)
450 return entry
& ZPCI_PTE_ADDR_MASK
;
452 return get_st_pto(entry
);
454 return get_rt_sto(entry
);
461 * table_translate: do translation within one table and return the following
464 * @entry: the entry being translated, the result is stored in this.
465 * @to: the address of table origin.
466 * @ett: expected table type, 1 region table, 0 segment table and -1 page table.
469 static uint64_t table_translate(S390IOTLBEntry
*entry
, uint64_t to
, int8_t ett
,
472 uint64_t tx
, te
, nto
= 0;
475 tx
= get_table_index(entry
->iova
, ett
);
476 te
= address_space_ldq(&address_space_memory
, to
+ tx
* sizeof(uint64_t),
477 MEMTXATTRS_UNSPECIFIED
, NULL
);
480 err
= ERR_EVENT_INVALTE
;
484 if (!entry_isvalid(te
, ett
)) {
485 entry
->perm
&= IOMMU_NONE
;
489 if (ett
== ZPCI_ETT_RT
&& ((te
& ZPCI_TABLE_LEN_RTX
) != ZPCI_TABLE_LEN_RTX
490 || te
& ZPCI_TABLE_OFFSET_MASK
)) {
491 err
= ERR_EVENT_INVALTL
;
495 nto
= get_next_table_origin(te
, ett
);
501 if (entry_isprotected(te
)) {
502 entry
->perm
&= IOMMU_RO
;
504 entry
->perm
&= IOMMU_RW
;
507 if (translate_iscomplete(te
, ett
)) {
510 entry
->translated_addr
= te
& ZPCI_PTE_ADDR_MASK
;
513 entry
->translated_addr
= (te
& ZPCI_SFAA_MASK
) |
514 (entry
->iova
& ~ZPCI_SFAA_MASK
);
521 entry
->perm
= IOMMU_NONE
;
524 entry
->len
= get_frame_size(ett
);
528 uint16_t s390_guest_io_table_walk(uint64_t g_iota
, hwaddr addr
,
529 S390IOTLBEntry
*entry
)
531 uint64_t to
= s390_pci_get_table_origin(g_iota
);
535 entry
->iova
= addr
& TARGET_PAGE_MASK
;
536 entry
->translated_addr
= 0;
537 entry
->perm
= IOMMU_RW
;
539 if (entry_isprotected(g_iota
)) {
540 entry
->perm
&= IOMMU_RO
;
544 to
= table_translate(entry
, to
, ett
--, &error
);
550 static IOMMUTLBEntry
s390_translate_iommu(IOMMUMemoryRegion
*mr
, hwaddr addr
,
551 IOMMUAccessFlags flag
, int iommu_idx
)
553 S390PCIIOMMU
*iommu
= container_of(mr
, S390PCIIOMMU
, iommu_mr
);
554 S390IOTLBEntry
*entry
;
555 uint64_t iova
= addr
& TARGET_PAGE_MASK
;
557 IOMMUTLBEntry ret
= {
558 .target_as
= &address_space_memory
,
560 .translated_addr
= 0,
561 .addr_mask
= ~(hwaddr
)0,
565 switch (iommu
->pbdev
->state
) {
566 case ZPCI_FS_ENABLED
:
567 case ZPCI_FS_BLOCKED
:
568 if (!iommu
->enabled
) {
576 DPRINTF("iommu trans addr 0x%" PRIx64
"\n", addr
);
578 if (addr
< iommu
->pba
|| addr
> iommu
->pal
) {
579 error
= ERR_EVENT_OORANGE
;
583 entry
= g_hash_table_lookup(iommu
->iotlb
, &iova
);
585 ret
.iova
= entry
->iova
;
586 ret
.translated_addr
= entry
->translated_addr
;
587 ret
.addr_mask
= entry
->len
- 1;
588 ret
.perm
= entry
->perm
;
591 ret
.addr_mask
= ~TARGET_PAGE_MASK
;
592 ret
.perm
= IOMMU_NONE
;
595 if (flag
!= IOMMU_NONE
&& !(flag
& ret
.perm
)) {
596 error
= ERR_EVENT_TPROTE
;
600 iommu
->pbdev
->state
= ZPCI_FS_ERROR
;
601 s390_pci_generate_error_event(error
, iommu
->pbdev
->fh
,
602 iommu
->pbdev
->fid
, addr
, 0);
607 static void s390_pci_iommu_replay(IOMMUMemoryRegion
*iommu
,
608 IOMMUNotifier
*notifier
)
610 /* It's impossible to plug a pci device on s390x that already has iommu
611 * mappings which need to be replayed, that is due to the "one iommu per
612 * zpci device" construct. But when we support migration of vfio-pci
613 * devices in future, we need to revisit this.
618 static S390PCIIOMMU
*s390_pci_get_iommu(S390pciState
*s
, PCIBus
*bus
,
621 uint64_t key
= (uintptr_t)bus
;
622 S390PCIIOMMUTable
*table
= g_hash_table_lookup(s
->iommu_table
, &key
);
626 table
= g_new0(S390PCIIOMMUTable
, 1);
628 g_hash_table_insert(s
->iommu_table
, &table
->key
, table
);
631 iommu
= table
->iommu
[PCI_SLOT(devfn
)];
633 iommu
= S390_PCI_IOMMU(object_new(TYPE_S390_PCI_IOMMU
));
635 char *mr_name
= g_strdup_printf("iommu-root-%02x:%02x.%01x",
639 char *as_name
= g_strdup_printf("iommu-pci-%02x:%02x.%01x",
643 memory_region_init(&iommu
->mr
, OBJECT(iommu
), mr_name
, UINT64_MAX
);
644 address_space_init(&iommu
->as
, &iommu
->mr
, as_name
);
645 iommu
->iotlb
= g_hash_table_new_full(g_int64_hash
, g_int64_equal
,
647 table
->iommu
[PCI_SLOT(devfn
)] = iommu
;
656 static AddressSpace
*s390_pci_dma_iommu(PCIBus
*bus
, void *opaque
, int devfn
)
658 S390pciState
*s
= opaque
;
659 S390PCIIOMMU
*iommu
= s390_pci_get_iommu(s
, bus
, devfn
);
664 static uint8_t set_ind_atomic(uint64_t ind_loc
, uint8_t to_be_set
)
666 uint8_t expected
, actual
;
668 /* avoid multiple fetches */
669 uint8_t volatile *ind_addr
;
671 ind_addr
= cpu_physical_memory_map(ind_loc
, &len
, true);
673 s390_pci_generate_error_event(ERR_EVENT_AIRERR
, 0, 0, 0, 0);
679 actual
= qatomic_cmpxchg(ind_addr
, expected
, expected
| to_be_set
);
680 } while (actual
!= expected
);
681 cpu_physical_memory_unmap((void *)ind_addr
, len
, 1, len
);
686 static void s390_msi_ctrl_write(void *opaque
, hwaddr addr
, uint64_t data
,
689 S390PCIBusDevice
*pbdev
= opaque
;
690 uint32_t vec
= data
& ZPCI_MSI_VEC_MASK
;
695 DPRINTF("write_msix data 0x%" PRIx64
" idx %d vec 0x%x\n", data
,
698 if (pbdev
->state
!= ZPCI_FS_ENABLED
) {
702 ind_bit
= pbdev
->routes
.adapter
.ind_offset
;
703 sum_bit
= pbdev
->routes
.adapter
.summary_offset
;
705 set_ind_atomic(pbdev
->routes
.adapter
.ind_addr
+ (ind_bit
+ vec
) / 8,
706 0x80 >> ((ind_bit
+ vec
) % 8));
707 if (!set_ind_atomic(pbdev
->routes
.adapter
.summary_addr
+ sum_bit
/ 8,
708 0x80 >> (sum_bit
% 8))) {
709 css_adapter_interrupt(CSS_IO_ADAPTER_PCI
, pbdev
->isc
);
713 static uint64_t s390_msi_ctrl_read(void *opaque
, hwaddr addr
, unsigned size
)
718 static const MemoryRegionOps s390_msi_ctrl_ops
= {
719 .write
= s390_msi_ctrl_write
,
720 .read
= s390_msi_ctrl_read
,
721 .endianness
= DEVICE_LITTLE_ENDIAN
,
724 void s390_pci_iommu_enable(S390PCIIOMMU
*iommu
)
727 * The iommu region is initialized against a 0-mapped address space,
728 * so the smallest IOMMU region we can define runs from 0 to the end
729 * of the PCI address space.
731 char *name
= g_strdup_printf("iommu-s390-%04x", iommu
->pbdev
->uid
);
732 memory_region_init_iommu(&iommu
->iommu_mr
, sizeof(iommu
->iommu_mr
),
733 TYPE_S390_IOMMU_MEMORY_REGION
, OBJECT(&iommu
->mr
),
734 name
, iommu
->pal
+ 1);
735 iommu
->enabled
= true;
736 memory_region_add_subregion(&iommu
->mr
, 0, MEMORY_REGION(&iommu
->iommu_mr
));
740 void s390_pci_iommu_disable(S390PCIIOMMU
*iommu
)
742 iommu
->enabled
= false;
743 g_hash_table_remove_all(iommu
->iotlb
);
744 memory_region_del_subregion(&iommu
->mr
, MEMORY_REGION(&iommu
->iommu_mr
));
745 object_unparent(OBJECT(&iommu
->iommu_mr
));
748 static void s390_pci_iommu_free(S390pciState
*s
, PCIBus
*bus
, int32_t devfn
)
750 uint64_t key
= (uintptr_t)bus
;
751 S390PCIIOMMUTable
*table
= g_hash_table_lookup(s
->iommu_table
, &key
);
752 S390PCIIOMMU
*iommu
= table
? table
->iommu
[PCI_SLOT(devfn
)] : NULL
;
754 if (!table
|| !iommu
) {
758 table
->iommu
[PCI_SLOT(devfn
)] = NULL
;
759 g_hash_table_destroy(iommu
->iotlb
);
761 * An attached PCI device may have memory listeners, eg. VFIO PCI.
762 * The associated subregion will already have been unmapped in
763 * s390_pci_iommu_disable in response to the guest deconfigure request.
764 * Remove the listeners now before destroying the address space.
766 address_space_remove_listeners(&iommu
->as
);
767 address_space_destroy(&iommu
->as
);
768 object_unparent(OBJECT(&iommu
->mr
));
769 object_unparent(OBJECT(iommu
));
770 object_unref(OBJECT(iommu
));
773 S390PCIGroup
*s390_group_create(int id
, int host_id
)
776 S390pciState
*s
= s390_get_phb();
778 group
= g_new0(S390PCIGroup
, 1);
780 group
->host_id
= host_id
;
781 QTAILQ_INSERT_TAIL(&s
->zpci_groups
, group
, link
);
785 S390PCIGroup
*s390_group_find(int id
)
788 S390pciState
*s
= s390_get_phb();
790 QTAILQ_FOREACH(group
, &s
->zpci_groups
, link
) {
791 if (group
->id
== id
) {
798 S390PCIGroup
*s390_group_find_host_sim(int host_id
)
801 S390pciState
*s
= s390_get_phb();
803 QTAILQ_FOREACH(group
, &s
->zpci_groups
, link
) {
804 if (group
->id
>= ZPCI_SIM_GRP_START
&& group
->host_id
== host_id
) {
811 static void s390_pci_init_default_group(void)
814 ClpRspQueryPciGrp
*resgrp
;
816 group
= s390_group_create(ZPCI_DEFAULT_FN_GRP
, ZPCI_DEFAULT_FN_GRP
);
817 resgrp
= &group
->zpci_group
;
820 resgrp
->msia
= ZPCI_MSI_ADDR
;
821 resgrp
->mui
= DEFAULT_MUI
;
823 resgrp
->maxstbl
= 128;
825 resgrp
->dtsm
= ZPCI_DTSM
;
828 static void set_pbdev_info(S390PCIBusDevice
*pbdev
)
830 pbdev
->zpci_fn
.sdma
= ZPCI_SDMA_ADDR
;
831 pbdev
->zpci_fn
.edma
= ZPCI_EDMA_ADDR
;
832 pbdev
->zpci_fn
.pchid
= 0;
833 pbdev
->zpci_fn
.pfgid
= ZPCI_DEFAULT_FN_GRP
;
834 pbdev
->zpci_fn
.fid
= pbdev
->fid
;
835 pbdev
->zpci_fn
.uid
= pbdev
->uid
;
836 pbdev
->pci_group
= s390_group_find(ZPCI_DEFAULT_FN_GRP
);
839 static void s390_pcihost_realize(DeviceState
*dev
, Error
**errp
)
843 PCIHostState
*phb
= PCI_HOST_BRIDGE(dev
);
844 S390pciState
*s
= S390_PCI_HOST_BRIDGE(dev
);
846 DPRINTF("host_init\n");
848 b
= pci_register_root_bus(dev
, NULL
, s390_pci_set_irq
, s390_pci_map_irq
,
849 NULL
, get_system_memory(), get_system_io(), 0,
851 pci_setup_iommu(b
, s390_pci_dma_iommu
, s
);
854 qbus_set_hotplug_handler(bus
, OBJECT(dev
));
857 s
->bus
= S390_PCI_BUS(qbus_new(TYPE_S390_PCI_BUS
, dev
, NULL
));
858 qbus_set_hotplug_handler(BUS(s
->bus
), OBJECT(dev
));
860 s
->iommu_table
= g_hash_table_new_full(g_int64_hash
, g_int64_equal
,
862 s
->zpci_table
= g_hash_table_new_full(g_int_hash
, g_int_equal
, NULL
, NULL
);
864 s
->next_sim_grp
= ZPCI_SIM_GRP_START
;
865 QTAILQ_INIT(&s
->pending_sei
);
866 QTAILQ_INIT(&s
->zpci_devs
);
867 QTAILQ_INIT(&s
->zpci_dma_limit
);
868 QTAILQ_INIT(&s
->zpci_groups
);
870 s390_pci_init_default_group();
871 css_register_io_adapters(CSS_IO_ADAPTER_PCI
, true, false,
872 S390_ADAPTER_SUPPRESSIBLE
, errp
);
875 static void s390_pcihost_unrealize(DeviceState
*dev
)
878 S390pciState
*s
= S390_PCI_HOST_BRIDGE(dev
);
880 while (!QTAILQ_EMPTY(&s
->zpci_groups
)) {
881 group
= QTAILQ_FIRST(&s
->zpci_groups
);
882 QTAILQ_REMOVE(&s
->zpci_groups
, group
, link
);
886 static int s390_pci_msix_init(S390PCIBusDevice
*pbdev
)
893 pos
= pci_find_capability(pbdev
->pdev
, PCI_CAP_ID_MSIX
);
898 ctrl
= pci_host_config_read_common(pbdev
->pdev
, pos
+ PCI_MSIX_FLAGS
,
899 pci_config_size(pbdev
->pdev
), sizeof(ctrl
));
900 table
= pci_host_config_read_common(pbdev
->pdev
, pos
+ PCI_MSIX_TABLE
,
901 pci_config_size(pbdev
->pdev
), sizeof(table
));
902 pba
= pci_host_config_read_common(pbdev
->pdev
, pos
+ PCI_MSIX_PBA
,
903 pci_config_size(pbdev
->pdev
), sizeof(pba
));
905 pbdev
->msix
.table_bar
= table
& PCI_MSIX_FLAGS_BIRMASK
;
906 pbdev
->msix
.table_offset
= table
& ~PCI_MSIX_FLAGS_BIRMASK
;
907 pbdev
->msix
.pba_bar
= pba
& PCI_MSIX_FLAGS_BIRMASK
;
908 pbdev
->msix
.pba_offset
= pba
& ~PCI_MSIX_FLAGS_BIRMASK
;
909 pbdev
->msix
.entries
= (ctrl
& PCI_MSIX_FLAGS_QSIZE
) + 1;
911 name
= g_strdup_printf("msix-s390-%04x", pbdev
->uid
);
912 memory_region_init_io(&pbdev
->msix_notify_mr
, OBJECT(pbdev
),
913 &s390_msi_ctrl_ops
, pbdev
, name
, TARGET_PAGE_SIZE
);
914 memory_region_add_subregion(&pbdev
->iommu
->mr
,
915 pbdev
->pci_group
->zpci_group
.msia
,
916 &pbdev
->msix_notify_mr
);
922 static void s390_pci_msix_free(S390PCIBusDevice
*pbdev
)
924 if (pbdev
->msix
.entries
== 0) {
928 memory_region_del_subregion(&pbdev
->iommu
->mr
, &pbdev
->msix_notify_mr
);
929 object_unparent(OBJECT(&pbdev
->msix_notify_mr
));
932 static S390PCIBusDevice
*s390_pci_device_new(S390pciState
*s
,
933 const char *target
, Error
**errp
)
935 Error
*local_err
= NULL
;
938 dev
= qdev_try_new(TYPE_S390_PCI_DEVICE
);
940 error_setg(errp
, "zPCI device could not be created");
944 if (!object_property_set_str(OBJECT(dev
), "target", target
, &local_err
)) {
945 object_unparent(OBJECT(dev
));
946 error_propagate_prepend(errp
, local_err
,
947 "zPCI device could not be created: ");
950 if (!qdev_realize_and_unref(dev
, BUS(s
->bus
), &local_err
)) {
951 object_unparent(OBJECT(dev
));
952 error_propagate_prepend(errp
, local_err
,
953 "zPCI device could not be created: ");
957 return S390_PCI_DEVICE(dev
);
960 static bool s390_pci_alloc_idx(S390pciState
*s
, S390PCIBusDevice
*pbdev
)
965 while (s390_pci_find_dev_by_idx(s
, idx
)) {
966 idx
= (idx
+ 1) & FH_MASK_INDEX
;
967 if (idx
== s
->next_idx
) {
976 static void s390_pcihost_pre_plug(HotplugHandler
*hotplug_dev
, DeviceState
*dev
,
979 S390pciState
*s
= S390_PCI_HOST_BRIDGE(hotplug_dev
);
981 if (!s390_has_feat(S390_FEAT_ZPCI
)) {
982 warn_report("Plugging a PCI/zPCI device without the 'zpci' CPU "
983 "feature enabled; the guest will not be able to see/use "
987 if (object_dynamic_cast(OBJECT(dev
), TYPE_PCI_DEVICE
)) {
988 PCIDevice
*pdev
= PCI_DEVICE(dev
);
990 if (pdev
->cap_present
& QEMU_PCI_CAP_MULTIFUNCTION
) {
991 error_setg(errp
, "multifunction not supported in s390");
994 } else if (object_dynamic_cast(OBJECT(dev
), TYPE_S390_PCI_DEVICE
)) {
995 S390PCIBusDevice
*pbdev
= S390_PCI_DEVICE(dev
);
997 if (!s390_pci_alloc_idx(s
, pbdev
)) {
998 error_setg(errp
, "no slot for plugging zpci device");
1004 static void s390_pci_update_subordinate(PCIDevice
*dev
, uint32_t nr
)
1008 pci_default_write_config(dev
, PCI_SUBORDINATE_BUS
, nr
, 1);
1009 while (!pci_bus_is_root(pci_get_bus(dev
))) {
1010 dev
= pci_get_bus(dev
)->parent_dev
;
1012 old_nr
= pci_default_read_config(dev
, PCI_SUBORDINATE_BUS
, 1);
1014 pci_default_write_config(dev
, PCI_SUBORDINATE_BUS
, nr
, 1);
1019 static int s390_pci_interp_plug(S390pciState
*s
, S390PCIBusDevice
*pbdev
)
1023 if (!s390_pci_get_host_fh(pbdev
, &fh
)) {
1028 * The host device is already in an enabled state, but we always present
1029 * the initial device state to the guest as disabled (ZPCI_FS_DISABLED).
1030 * Therefore, mask off the enable bit from the passthrough handle until
1031 * the guest issues a CLP SET PCI FN later to enable the device.
1033 pbdev
->fh
= fh
& ~FH_MASK_ENABLE
;
1035 /* Next, see if the idx is already in-use */
1036 idx
= pbdev
->fh
& FH_MASK_INDEX
;
1037 if (pbdev
->idx
!= idx
) {
1038 if (s390_pci_find_dev_by_idx(s
, idx
)) {
1042 * Update the idx entry with the passed through idx
1043 * If the relinquished idx is lower than next_idx, use it
1044 * to replace next_idx
1046 g_hash_table_remove(s
->zpci_table
, &pbdev
->idx
);
1047 if (idx
< s
->next_idx
) {
1051 g_hash_table_insert(s
->zpci_table
, &pbdev
->idx
, pbdev
);
1057 static void s390_pcihost_plug(HotplugHandler
*hotplug_dev
, DeviceState
*dev
,
1060 S390pciState
*s
= S390_PCI_HOST_BRIDGE(hotplug_dev
);
1061 PCIDevice
*pdev
= NULL
;
1062 S390PCIBusDevice
*pbdev
= NULL
;
1065 if (object_dynamic_cast(OBJECT(dev
), TYPE_PCI_BRIDGE
)) {
1066 PCIBridge
*pb
= PCI_BRIDGE(dev
);
1068 pdev
= PCI_DEVICE(dev
);
1069 pci_bridge_map_irq(pb
, dev
->id
, s390_pci_map_irq
);
1070 pci_setup_iommu(&pb
->sec_bus
, s390_pci_dma_iommu
, s
);
1072 qbus_set_hotplug_handler(BUS(&pb
->sec_bus
), OBJECT(s
));
1074 if (dev
->hotplugged
) {
1075 pci_default_write_config(pdev
, PCI_PRIMARY_BUS
,
1076 pci_dev_bus_num(pdev
), 1);
1078 pci_default_write_config(pdev
, PCI_SECONDARY_BUS
, s
->bus_no
, 1);
1080 s390_pci_update_subordinate(pdev
, s
->bus_no
);
1082 } else if (object_dynamic_cast(OBJECT(dev
), TYPE_PCI_DEVICE
)) {
1083 pdev
= PCI_DEVICE(dev
);
1086 /* In the case the PCI device does not define an id */
1087 /* we generate one based on the PCI address */
1088 dev
->id
= g_strdup_printf("auto_%02x:%02x.%01x",
1089 pci_dev_bus_num(pdev
),
1090 PCI_SLOT(pdev
->devfn
),
1091 PCI_FUNC(pdev
->devfn
));
1094 pbdev
= s390_pci_find_dev_by_target(s
, dev
->id
);
1096 pbdev
= s390_pci_device_new(s
, dev
->id
, errp
);
1103 pbdev
->iommu
= s390_pci_get_iommu(s
, pci_get_bus(pdev
), pdev
->devfn
);
1104 pbdev
->iommu
->pbdev
= pbdev
;
1105 pbdev
->state
= ZPCI_FS_DISABLED
;
1106 set_pbdev_info(pbdev
);
1108 if (object_dynamic_cast(OBJECT(dev
), "vfio-pci")) {
1110 * By default, interpretation is always requested; if the available
1111 * facilities indicate it is not available, fallback to the
1112 * interception model.
1114 if (pbdev
->interp
) {
1115 if (s390_pci_kvm_interp_allowed()) {
1116 rc
= s390_pci_interp_plug(s
, pbdev
);
1118 error_setg(errp
, "Plug failed for zPCI device in "
1119 "interpretation mode: %d", rc
);
1123 DPRINTF("zPCI interpretation facilities missing.\n");
1124 pbdev
->interp
= false;
1125 pbdev
->forwarding_assist
= false;
1128 pbdev
->iommu
->dma_limit
= s390_pci_start_dma_count(s
, pbdev
);
1129 /* Fill in CLP information passed via the vfio region */
1130 s390_pci_get_clp_info(pbdev
);
1131 if (!pbdev
->interp
) {
1132 /* Do vfio passthrough but intercept for I/O */
1133 pbdev
->fh
|= FH_SHM_VFIO
;
1134 pbdev
->forwarding_assist
= false;
1136 /* Register shutdown notifier and reset callback for ISM devices */
1137 if (pbdev
->pft
== ZPCI_PFT_ISM
) {
1138 pbdev
->shutdown_notifier
.notify
= s390_pci_shutdown_notifier
;
1139 qemu_register_shutdown_notifier(&pbdev
->shutdown_notifier
);
1140 qemu_register_reset(s390_pci_reset_cb
, pbdev
);
1143 pbdev
->fh
|= FH_SHM_EMUL
;
1144 /* Always intercept emulated devices */
1145 pbdev
->interp
= false;
1146 pbdev
->forwarding_assist
= false;
1149 if (s390_pci_msix_init(pbdev
) && !pbdev
->interp
) {
1150 error_setg(errp
, "MSI-X support is mandatory "
1151 "in the S390 architecture");
1155 if (dev
->hotplugged
) {
1156 s390_pci_generate_plug_event(HP_EVENT_TO_CONFIGURED
,
1157 pbdev
->fh
, pbdev
->fid
);
1159 } else if (object_dynamic_cast(OBJECT(dev
), TYPE_S390_PCI_DEVICE
)) {
1160 pbdev
= S390_PCI_DEVICE(dev
);
1162 /* the allocated idx is actually getting used */
1163 s
->next_idx
= (pbdev
->idx
+ 1) & FH_MASK_INDEX
;
1164 pbdev
->fh
= pbdev
->idx
;
1165 QTAILQ_INSERT_TAIL(&s
->zpci_devs
, pbdev
, link
);
1166 g_hash_table_insert(s
->zpci_table
, &pbdev
->idx
, pbdev
);
1168 g_assert_not_reached();
1172 static void s390_pcihost_unplug(HotplugHandler
*hotplug_dev
, DeviceState
*dev
,
1175 S390pciState
*s
= S390_PCI_HOST_BRIDGE(hotplug_dev
);
1176 S390PCIBusDevice
*pbdev
= NULL
;
1178 if (object_dynamic_cast(OBJECT(dev
), TYPE_PCI_DEVICE
)) {
1179 PCIDevice
*pci_dev
= PCI_DEVICE(dev
);
1183 pbdev
= s390_pci_find_dev_by_pci(s
, PCI_DEVICE(dev
));
1186 s390_pci_generate_plug_event(HP_EVENT_STANDBY_TO_RESERVED
,
1187 pbdev
->fh
, pbdev
->fid
);
1188 bus
= pci_get_bus(pci_dev
);
1189 devfn
= pci_dev
->devfn
;
1190 qdev_unrealize(dev
);
1192 s390_pci_msix_free(pbdev
);
1193 s390_pci_iommu_free(s
, bus
, devfn
);
1195 pbdev
->state
= ZPCI_FS_RESERVED
;
1196 } else if (object_dynamic_cast(OBJECT(dev
), TYPE_S390_PCI_DEVICE
)) {
1197 pbdev
= S390_PCI_DEVICE(dev
);
1199 QTAILQ_REMOVE(&s
->zpci_devs
, pbdev
, link
);
1200 g_hash_table_remove(s
->zpci_table
, &pbdev
->idx
);
1201 if (pbdev
->iommu
->dma_limit
) {
1202 s390_pci_end_dma_count(s
, pbdev
->iommu
->dma_limit
);
1204 qdev_unrealize(dev
);
1208 static void s390_pcihost_unplug_request(HotplugHandler
*hotplug_dev
,
1212 S390pciState
*s
= S390_PCI_HOST_BRIDGE(hotplug_dev
);
1213 S390PCIBusDevice
*pbdev
;
1215 if (object_dynamic_cast(OBJECT(dev
), TYPE_PCI_BRIDGE
)) {
1216 error_setg(errp
, "PCI bridge hot unplug currently not supported");
1217 } else if (object_dynamic_cast(OBJECT(dev
), TYPE_PCI_DEVICE
)) {
1219 * Redirect the unplug request to the zPCI device and remember that
1220 * we've checked the PCI device already (to prevent endless recursion).
1222 pbdev
= s390_pci_find_dev_by_pci(s
, PCI_DEVICE(dev
));
1224 pbdev
->pci_unplug_request_processed
= true;
1225 qdev_unplug(DEVICE(pbdev
), errp
);
1226 } else if (object_dynamic_cast(OBJECT(dev
), TYPE_S390_PCI_DEVICE
)) {
1227 pbdev
= S390_PCI_DEVICE(dev
);
1230 * If unplug was initially requested for the zPCI device, we
1231 * first have to redirect to the PCI device, which will in return
1232 * redirect back to us after performing its checks (if the request
1233 * is not blocked, e.g. because it's a PCI bridge).
1235 if (pbdev
->pdev
&& !pbdev
->pci_unplug_request_processed
) {
1236 qdev_unplug(DEVICE(pbdev
->pdev
), errp
);
1239 pbdev
->pci_unplug_request_processed
= false;
1241 switch (pbdev
->state
) {
1242 case ZPCI_FS_STANDBY
:
1243 case ZPCI_FS_RESERVED
:
1244 s390_pci_perform_unplug(pbdev
);
1248 * Allow to send multiple requests, e.g. if the guest crashed
1249 * before releasing the device, we would not be able to send
1250 * another request to the same VM (e.g. fresh OS).
1252 pbdev
->unplug_requested
= true;
1253 s390_pci_generate_plug_event(HP_EVENT_DECONFIGURE_REQUEST
,
1254 pbdev
->fh
, pbdev
->fid
);
1257 g_assert_not_reached();
1261 static void s390_pci_enumerate_bridge(PCIBus
*bus
, PCIDevice
*pdev
,
1264 S390pciState
*s
= opaque
;
1265 PCIBus
*sec_bus
= NULL
;
1267 if ((pci_default_read_config(pdev
, PCI_HEADER_TYPE
, 1) !=
1268 PCI_HEADER_TYPE_BRIDGE
)) {
1273 pci_default_write_config(pdev
, PCI_PRIMARY_BUS
, pci_dev_bus_num(pdev
), 1);
1274 pci_default_write_config(pdev
, PCI_SECONDARY_BUS
, s
->bus_no
, 1);
1275 pci_default_write_config(pdev
, PCI_SUBORDINATE_BUS
, s
->bus_no
, 1);
1277 sec_bus
= pci_bridge_get_sec_bus(PCI_BRIDGE(pdev
));
1282 /* Assign numbers to all child bridges. The last is the highest number. */
1283 pci_for_each_device_under_bus(sec_bus
, s390_pci_enumerate_bridge
, s
);
1284 pci_default_write_config(pdev
, PCI_SUBORDINATE_BUS
, s
->bus_no
, 1);
1287 static void s390_pcihost_reset(DeviceState
*dev
)
1289 S390pciState
*s
= S390_PCI_HOST_BRIDGE(dev
);
1290 PCIBus
*bus
= s
->parent_obj
.bus
;
1291 S390PCIBusDevice
*pbdev
, *next
;
1293 /* Process all pending unplug requests */
1294 QTAILQ_FOREACH_SAFE(pbdev
, &s
->zpci_devs
, link
, next
) {
1295 if (pbdev
->unplug_requested
) {
1296 if (pbdev
->interp
&& (pbdev
->fh
& FH_MASK_ENABLE
)) {
1297 /* Interpreted devices were using interrupt forwarding */
1298 s390_pci_kvm_aif_disable(pbdev
);
1299 } else if (pbdev
->summary_ind
) {
1300 pci_dereg_irqs(pbdev
);
1302 if (pbdev
->iommu
->enabled
) {
1303 pci_dereg_ioat(pbdev
->iommu
);
1305 pbdev
->state
= ZPCI_FS_STANDBY
;
1306 s390_pci_perform_unplug(pbdev
);
1311 * When resetting a PCI bridge, the assigned numbers are set to 0. So
1312 * on every system reset, we also have to reassign numbers.
1315 pci_for_each_device_under_bus(bus
, s390_pci_enumerate_bridge
, s
);
1318 static void s390_pcihost_class_init(ObjectClass
*klass
, void *data
)
1320 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1321 HotplugHandlerClass
*hc
= HOTPLUG_HANDLER_CLASS(klass
);
1323 dc
->reset
= s390_pcihost_reset
;
1324 dc
->realize
= s390_pcihost_realize
;
1325 dc
->unrealize
= s390_pcihost_unrealize
;
1326 hc
->pre_plug
= s390_pcihost_pre_plug
;
1327 hc
->plug
= s390_pcihost_plug
;
1328 hc
->unplug_request
= s390_pcihost_unplug_request
;
1329 hc
->unplug
= s390_pcihost_unplug
;
1330 msi_nonbroken
= true;
1333 static const TypeInfo s390_pcihost_info
= {
1334 .name
= TYPE_S390_PCI_HOST_BRIDGE
,
1335 .parent
= TYPE_PCI_HOST_BRIDGE
,
1336 .instance_size
= sizeof(S390pciState
),
1337 .class_init
= s390_pcihost_class_init
,
1338 .interfaces
= (InterfaceInfo
[]) {
1339 { TYPE_HOTPLUG_HANDLER
},
1344 static const TypeInfo s390_pcibus_info
= {
1345 .name
= TYPE_S390_PCI_BUS
,
1347 .instance_size
= sizeof(S390PCIBus
),
1350 static uint16_t s390_pci_generate_uid(S390pciState
*s
)
1356 if (!s390_pci_find_dev_by_uid(s
, uid
)) {
1359 } while (uid
< ZPCI_MAX_UID
);
1361 return UID_UNDEFINED
;
1364 static uint32_t s390_pci_generate_fid(S390pciState
*s
, Error
**errp
)
1369 if (!s390_pci_find_dev_by_fid(s
, fid
)) {
1372 } while (fid
++ != ZPCI_MAX_FID
);
1374 error_setg(errp
, "no free fid could be found");
1378 static void s390_pci_device_realize(DeviceState
*dev
, Error
**errp
)
1380 S390PCIBusDevice
*zpci
= S390_PCI_DEVICE(dev
);
1381 S390pciState
*s
= s390_get_phb();
1383 if (!zpci
->target
) {
1384 error_setg(errp
, "target must be defined");
1388 if (s390_pci_find_dev_by_target(s
, zpci
->target
)) {
1389 error_setg(errp
, "target %s already has an associated zpci device",
1394 if (zpci
->uid
== UID_UNDEFINED
) {
1395 zpci
->uid
= s390_pci_generate_uid(s
);
1397 error_setg(errp
, "no free uid could be found");
1400 } else if (s390_pci_find_dev_by_uid(s
, zpci
->uid
)) {
1401 error_setg(errp
, "uid %u already in use", zpci
->uid
);
1405 if (!zpci
->fid_defined
) {
1406 Error
*local_error
= NULL
;
1408 zpci
->fid
= s390_pci_generate_fid(s
, &local_error
);
1410 error_propagate(errp
, local_error
);
1413 } else if (s390_pci_find_dev_by_fid(s
, zpci
->fid
)) {
1414 error_setg(errp
, "fid %u already in use", zpci
->fid
);
1418 zpci
->state
= ZPCI_FS_RESERVED
;
1419 zpci
->fmb
.format
= ZPCI_FMB_FORMAT
;
1422 static void s390_pci_device_reset(DeviceState
*dev
)
1424 S390PCIBusDevice
*pbdev
= S390_PCI_DEVICE(dev
);
1426 switch (pbdev
->state
) {
1427 case ZPCI_FS_RESERVED
:
1429 case ZPCI_FS_STANDBY
:
1432 pbdev
->fh
&= ~FH_MASK_ENABLE
;
1433 pbdev
->state
= ZPCI_FS_DISABLED
;
1437 if (pbdev
->interp
&& (pbdev
->fh
& FH_MASK_ENABLE
)) {
1438 /* Interpreted devices were using interrupt forwarding */
1439 s390_pci_kvm_aif_disable(pbdev
);
1440 } else if (pbdev
->summary_ind
) {
1441 pci_dereg_irqs(pbdev
);
1443 if (pbdev
->iommu
->enabled
) {
1444 pci_dereg_ioat(pbdev
->iommu
);
1447 fmb_timer_free(pbdev
);
1450 static void s390_pci_get_fid(Object
*obj
, Visitor
*v
, const char *name
,
1451 void *opaque
, Error
**errp
)
1453 Property
*prop
= opaque
;
1454 uint32_t *ptr
= object_field_prop_ptr(obj
, prop
);
1456 visit_type_uint32(v
, name
, ptr
, errp
);
1459 static void s390_pci_set_fid(Object
*obj
, Visitor
*v
, const char *name
,
1460 void *opaque
, Error
**errp
)
1462 S390PCIBusDevice
*zpci
= S390_PCI_DEVICE(obj
);
1463 Property
*prop
= opaque
;
1464 uint32_t *ptr
= object_field_prop_ptr(obj
, prop
);
1466 if (!visit_type_uint32(v
, name
, ptr
, errp
)) {
1469 zpci
->fid_defined
= true;
1472 static const PropertyInfo s390_pci_fid_propinfo
= {
1474 .get
= s390_pci_get_fid
,
1475 .set
= s390_pci_set_fid
,
1478 #define DEFINE_PROP_S390_PCI_FID(_n, _s, _f) \
1479 DEFINE_PROP(_n, _s, _f, s390_pci_fid_propinfo, uint32_t)
1481 static Property s390_pci_device_properties
[] = {
1482 DEFINE_PROP_UINT16("uid", S390PCIBusDevice
, uid
, UID_UNDEFINED
),
1483 DEFINE_PROP_S390_PCI_FID("fid", S390PCIBusDevice
, fid
),
1484 DEFINE_PROP_STRING("target", S390PCIBusDevice
, target
),
1485 DEFINE_PROP_BOOL("interpret", S390PCIBusDevice
, interp
, true),
1486 DEFINE_PROP_BOOL("forwarding-assist", S390PCIBusDevice
, forwarding_assist
,
1488 DEFINE_PROP_END_OF_LIST(),
1491 static const VMStateDescription s390_pci_device_vmstate
= {
1492 .name
= TYPE_S390_PCI_DEVICE
,
1494 * TODO: add state handling here, so migration works at least with
1495 * emulated pci devices on s390x
1500 static void s390_pci_device_class_init(ObjectClass
*klass
, void *data
)
1502 DeviceClass
*dc
= DEVICE_CLASS(klass
);
1504 dc
->desc
= "zpci device";
1505 set_bit(DEVICE_CATEGORY_MISC
, dc
->categories
);
1506 dc
->reset
= s390_pci_device_reset
;
1507 dc
->bus_type
= TYPE_S390_PCI_BUS
;
1508 dc
->realize
= s390_pci_device_realize
;
1509 device_class_set_props(dc
, s390_pci_device_properties
);
1510 dc
->vmsd
= &s390_pci_device_vmstate
;
1513 static const TypeInfo s390_pci_device_info
= {
1514 .name
= TYPE_S390_PCI_DEVICE
,
1515 .parent
= TYPE_DEVICE
,
1516 .instance_size
= sizeof(S390PCIBusDevice
),
1517 .class_init
= s390_pci_device_class_init
,
1520 static const TypeInfo s390_pci_iommu_info
= {
1521 .name
= TYPE_S390_PCI_IOMMU
,
1522 .parent
= TYPE_OBJECT
,
1523 .instance_size
= sizeof(S390PCIIOMMU
),
1526 static void s390_iommu_memory_region_class_init(ObjectClass
*klass
, void *data
)
1528 IOMMUMemoryRegionClass
*imrc
= IOMMU_MEMORY_REGION_CLASS(klass
);
1530 imrc
->translate
= s390_translate_iommu
;
1531 imrc
->replay
= s390_pci_iommu_replay
;
1534 static const TypeInfo s390_iommu_memory_region_info
= {
1535 .parent
= TYPE_IOMMU_MEMORY_REGION
,
1536 .name
= TYPE_S390_IOMMU_MEMORY_REGION
,
1537 .class_init
= s390_iommu_memory_region_class_init
,
1540 static void s390_pci_register_types(void)
1542 type_register_static(&s390_pcihost_info
);
1543 type_register_static(&s390_pcibus_info
);
1544 type_register_static(&s390_pci_device_info
);
1545 type_register_static(&s390_pci_iommu_info
);
1546 type_register_static(&s390_iommu_memory_region_info
);
1549 type_init(s390_pci_register_types
)