]> git.proxmox.com Git - mirror_qemu.git/blob - hw/s390x/s390-pci-bus.c
69b0291e8a8f62bf7bd21abacc87add33369de41
[mirror_qemu.git] / hw / s390x / s390-pci-bus.c
1 /*
2 * s390 PCI BUS
3 *
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>
8 *
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
11 * directory.
12 */
13
14 #include "qemu/osdep.h"
15 #include "qapi/error.h"
16 #include "qapi/visitor.h"
17 #include "qemu-common.h"
18 #include "cpu.h"
19 #include "s390-pci-bus.h"
20 #include "s390-pci-inst.h"
21 #include "hw/pci/pci_bus.h"
22 #include "hw/pci/pci_bridge.h"
23 #include "hw/pci/msi.h"
24 #include "qemu/error-report.h"
25
26 /* #define DEBUG_S390PCI_BUS */
27 #ifdef DEBUG_S390PCI_BUS
28 #define DPRINTF(fmt, ...) \
29 do { fprintf(stderr, "S390pci-bus: " fmt, ## __VA_ARGS__); } while (0)
30 #else
31 #define DPRINTF(fmt, ...) \
32 do { } while (0)
33 #endif
34
35 S390pciState *s390_get_phb(void)
36 {
37 static S390pciState *phb;
38
39 if (!phb) {
40 phb = S390_PCI_HOST_BRIDGE(
41 object_resolve_path(TYPE_S390_PCI_HOST_BRIDGE, NULL));
42 assert(phb != NULL);
43 }
44
45 return phb;
46 }
47
48 int chsc_sei_nt2_get_event(void *res)
49 {
50 ChscSeiNt2Res *nt2_res = (ChscSeiNt2Res *)res;
51 PciCcdfAvail *accdf;
52 PciCcdfErr *eccdf;
53 int rc = 1;
54 SeiContainer *sei_cont;
55 S390pciState *s = s390_get_phb();
56
57 sei_cont = QTAILQ_FIRST(&s->pending_sei);
58 if (sei_cont) {
59 QTAILQ_REMOVE(&s->pending_sei, sei_cont, link);
60 nt2_res->nt = 2;
61 nt2_res->cc = sei_cont->cc;
62 nt2_res->length = cpu_to_be16(sizeof(ChscSeiNt2Res));
63 switch (sei_cont->cc) {
64 case 1: /* error event */
65 eccdf = (PciCcdfErr *)nt2_res->ccdf;
66 eccdf->fid = cpu_to_be32(sei_cont->fid);
67 eccdf->fh = cpu_to_be32(sei_cont->fh);
68 eccdf->e = cpu_to_be32(sei_cont->e);
69 eccdf->faddr = cpu_to_be64(sei_cont->faddr);
70 eccdf->pec = cpu_to_be16(sei_cont->pec);
71 break;
72 case 2: /* availability event */
73 accdf = (PciCcdfAvail *)nt2_res->ccdf;
74 accdf->fid = cpu_to_be32(sei_cont->fid);
75 accdf->fh = cpu_to_be32(sei_cont->fh);
76 accdf->pec = cpu_to_be16(sei_cont->pec);
77 break;
78 default:
79 abort();
80 }
81 g_free(sei_cont);
82 rc = 0;
83 }
84
85 return rc;
86 }
87
88 int chsc_sei_nt2_have_event(void)
89 {
90 S390pciState *s = s390_get_phb();
91
92 return !QTAILQ_EMPTY(&s->pending_sei);
93 }
94
95 S390PCIBusDevice *s390_pci_find_next_avail_dev(S390pciState *s,
96 S390PCIBusDevice *pbdev)
97 {
98 S390PCIBusDevice *ret = pbdev ? QTAILQ_NEXT(pbdev, link) :
99 QTAILQ_FIRST(&s->zpci_devs);
100
101 while (ret && ret->state == ZPCI_FS_RESERVED) {
102 ret = QTAILQ_NEXT(ret, link);
103 }
104
105 return ret;
106 }
107
108 S390PCIBusDevice *s390_pci_find_dev_by_fid(S390pciState *s, uint32_t fid)
109 {
110 S390PCIBusDevice *pbdev;
111
112 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) {
113 if (pbdev->fid == fid) {
114 return pbdev;
115 }
116 }
117
118 return NULL;
119 }
120
121 void s390_pci_sclp_configure(SCCB *sccb)
122 {
123 PciCfgSccb *psccb = (PciCfgSccb *)sccb;
124 S390PCIBusDevice *pbdev = s390_pci_find_dev_by_fid(s390_get_phb(),
125 be32_to_cpu(psccb->aid));
126 uint16_t rc;
127
128 if (be16_to_cpu(sccb->h.length) < 16) {
129 rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH;
130 goto out;
131 }
132
133 if (!pbdev) {
134 DPRINTF("sclp config no dev found\n");
135 rc = SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED;
136 goto out;
137 }
138
139 switch (pbdev->state) {
140 case ZPCI_FS_RESERVED:
141 rc = SCLP_RC_ADAPTER_IN_RESERVED_STATE;
142 break;
143 case ZPCI_FS_STANDBY:
144 pbdev->state = ZPCI_FS_DISABLED;
145 rc = SCLP_RC_NORMAL_COMPLETION;
146 break;
147 default:
148 rc = SCLP_RC_NO_ACTION_REQUIRED;
149 }
150 out:
151 psccb->header.response_code = cpu_to_be16(rc);
152 }
153
154 void s390_pci_sclp_deconfigure(SCCB *sccb)
155 {
156 PciCfgSccb *psccb = (PciCfgSccb *)sccb;
157 S390PCIBusDevice *pbdev = s390_pci_find_dev_by_fid(s390_get_phb(),
158 be32_to_cpu(psccb->aid));
159 uint16_t rc;
160
161 if (be16_to_cpu(sccb->h.length) < 16) {
162 rc = SCLP_RC_INSUFFICIENT_SCCB_LENGTH;
163 goto out;
164 }
165
166 if (!pbdev) {
167 DPRINTF("sclp deconfig no dev found\n");
168 rc = SCLP_RC_ADAPTER_ID_NOT_RECOGNIZED;
169 goto out;
170 }
171
172 switch (pbdev->state) {
173 case ZPCI_FS_RESERVED:
174 rc = SCLP_RC_ADAPTER_IN_RESERVED_STATE;
175 break;
176 case ZPCI_FS_STANDBY:
177 rc = SCLP_RC_NO_ACTION_REQUIRED;
178 break;
179 default:
180 if (pbdev->summary_ind) {
181 pci_dereg_irqs(pbdev);
182 }
183 if (pbdev->iommu->enabled) {
184 pci_dereg_ioat(pbdev->iommu);
185 }
186 pbdev->state = ZPCI_FS_STANDBY;
187 rc = SCLP_RC_NORMAL_COMPLETION;
188
189 if (pbdev->release_timer) {
190 qdev_unplug(DEVICE(pbdev->pdev), NULL);
191 }
192 }
193 out:
194 psccb->header.response_code = cpu_to_be16(rc);
195 }
196
197 static S390PCIBusDevice *s390_pci_find_dev_by_uid(S390pciState *s, uint16_t uid)
198 {
199 S390PCIBusDevice *pbdev;
200
201 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) {
202 if (pbdev->uid == uid) {
203 return pbdev;
204 }
205 }
206
207 return NULL;
208 }
209
210 static S390PCIBusDevice *s390_pci_find_dev_by_target(S390pciState *s,
211 const char *target)
212 {
213 S390PCIBusDevice *pbdev;
214
215 if (!target) {
216 return NULL;
217 }
218
219 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) {
220 if (!strcmp(pbdev->target, target)) {
221 return pbdev;
222 }
223 }
224
225 return NULL;
226 }
227
228 S390PCIBusDevice *s390_pci_find_dev_by_idx(S390pciState *s, uint32_t idx)
229 {
230 return g_hash_table_lookup(s->zpci_table, &idx);
231 }
232
233 S390PCIBusDevice *s390_pci_find_dev_by_fh(S390pciState *s, uint32_t fh)
234 {
235 uint32_t idx = FH_MASK_INDEX & fh;
236 S390PCIBusDevice *pbdev = s390_pci_find_dev_by_idx(s, idx);
237
238 if (pbdev && pbdev->fh == fh) {
239 return pbdev;
240 }
241
242 return NULL;
243 }
244
245 static void s390_pci_generate_event(uint8_t cc, uint16_t pec, uint32_t fh,
246 uint32_t fid, uint64_t faddr, uint32_t e)
247 {
248 SeiContainer *sei_cont;
249 S390pciState *s = s390_get_phb();
250
251 sei_cont = g_malloc0(sizeof(SeiContainer));
252 sei_cont->fh = fh;
253 sei_cont->fid = fid;
254 sei_cont->cc = cc;
255 sei_cont->pec = pec;
256 sei_cont->faddr = faddr;
257 sei_cont->e = e;
258
259 QTAILQ_INSERT_TAIL(&s->pending_sei, sei_cont, link);
260 css_generate_css_crws(0);
261 }
262
263 static void s390_pci_generate_plug_event(uint16_t pec, uint32_t fh,
264 uint32_t fid)
265 {
266 s390_pci_generate_event(2, pec, fh, fid, 0, 0);
267 }
268
269 void s390_pci_generate_error_event(uint16_t pec, uint32_t fh, uint32_t fid,
270 uint64_t faddr, uint32_t e)
271 {
272 s390_pci_generate_event(1, pec, fh, fid, faddr, e);
273 }
274
275 static void s390_pci_set_irq(void *opaque, int irq, int level)
276 {
277 /* nothing to do */
278 }
279
280 static int s390_pci_map_irq(PCIDevice *pci_dev, int irq_num)
281 {
282 /* nothing to do */
283 return 0;
284 }
285
286 static uint64_t s390_pci_get_table_origin(uint64_t iota)
287 {
288 return iota & ~ZPCI_IOTA_RTTO_FLAG;
289 }
290
291 static unsigned int calc_rtx(dma_addr_t ptr)
292 {
293 return ((unsigned long) ptr >> ZPCI_RT_SHIFT) & ZPCI_INDEX_MASK;
294 }
295
296 static unsigned int calc_sx(dma_addr_t ptr)
297 {
298 return ((unsigned long) ptr >> ZPCI_ST_SHIFT) & ZPCI_INDEX_MASK;
299 }
300
301 static unsigned int calc_px(dma_addr_t ptr)
302 {
303 return ((unsigned long) ptr >> PAGE_SHIFT) & ZPCI_PT_MASK;
304 }
305
306 static uint64_t get_rt_sto(uint64_t entry)
307 {
308 return ((entry & ZPCI_TABLE_TYPE_MASK) == ZPCI_TABLE_TYPE_RTX)
309 ? (entry & ZPCI_RTE_ADDR_MASK)
310 : 0;
311 }
312
313 static uint64_t get_st_pto(uint64_t entry)
314 {
315 return ((entry & ZPCI_TABLE_TYPE_MASK) == ZPCI_TABLE_TYPE_SX)
316 ? (entry & ZPCI_STE_ADDR_MASK)
317 : 0;
318 }
319
320 static uint64_t s390_guest_io_table_walk(uint64_t guest_iota,
321 uint64_t guest_dma_address)
322 {
323 uint64_t sto_a, pto_a, px_a;
324 uint64_t sto, pto, pte;
325 uint32_t rtx, sx, px;
326
327 rtx = calc_rtx(guest_dma_address);
328 sx = calc_sx(guest_dma_address);
329 px = calc_px(guest_dma_address);
330
331 sto_a = guest_iota + rtx * sizeof(uint64_t);
332 sto = address_space_ldq(&address_space_memory, sto_a,
333 MEMTXATTRS_UNSPECIFIED, NULL);
334 sto = get_rt_sto(sto);
335 if (!sto) {
336 pte = 0;
337 goto out;
338 }
339
340 pto_a = sto + sx * sizeof(uint64_t);
341 pto = address_space_ldq(&address_space_memory, pto_a,
342 MEMTXATTRS_UNSPECIFIED, NULL);
343 pto = get_st_pto(pto);
344 if (!pto) {
345 pte = 0;
346 goto out;
347 }
348
349 px_a = pto + px * sizeof(uint64_t);
350 pte = address_space_ldq(&address_space_memory, px_a,
351 MEMTXATTRS_UNSPECIFIED, NULL);
352
353 out:
354 return pte;
355 }
356
357 static IOMMUTLBEntry s390_translate_iommu(MemoryRegion *mr, hwaddr addr,
358 bool is_write)
359 {
360 uint64_t pte;
361 uint32_t flags;
362 S390PCIIOMMU *iommu = container_of(mr, S390PCIIOMMU, iommu_mr);
363 IOMMUTLBEntry ret = {
364 .target_as = &address_space_memory,
365 .iova = 0,
366 .translated_addr = 0,
367 .addr_mask = ~(hwaddr)0,
368 .perm = IOMMU_NONE,
369 };
370
371 switch (iommu->pbdev->state) {
372 case ZPCI_FS_ENABLED:
373 case ZPCI_FS_BLOCKED:
374 if (!iommu->enabled) {
375 return ret;
376 }
377 break;
378 default:
379 return ret;
380 }
381
382 DPRINTF("iommu trans addr 0x%" PRIx64 "\n", addr);
383
384 if (addr < iommu->pba || addr > iommu->pal) {
385 return ret;
386 }
387
388 pte = s390_guest_io_table_walk(s390_pci_get_table_origin(iommu->g_iota),
389 addr);
390 if (!pte) {
391 return ret;
392 }
393
394 flags = pte & ZPCI_PTE_FLAG_MASK;
395 ret.iova = addr;
396 ret.translated_addr = pte & ZPCI_PTE_ADDR_MASK;
397 ret.addr_mask = 0xfff;
398
399 if (flags & ZPCI_PTE_INVALID) {
400 ret.perm = IOMMU_NONE;
401 } else {
402 ret.perm = IOMMU_RW;
403 }
404
405 return ret;
406 }
407
408 static const MemoryRegionIOMMUOps s390_iommu_ops = {
409 .translate = s390_translate_iommu,
410 };
411
412 static S390PCIIOMMU *s390_pci_get_iommu(S390pciState *s, PCIBus *bus,
413 int devfn)
414 {
415 uint64_t key = (uintptr_t)bus;
416 S390PCIIOMMUTable *table = g_hash_table_lookup(s->iommu_table, &key);
417 S390PCIIOMMU *iommu;
418
419 if (!table) {
420 table = g_malloc0(sizeof(S390PCIIOMMUTable));
421 table->key = key;
422 g_hash_table_insert(s->iommu_table, &table->key, table);
423 }
424
425 iommu = table->iommu[PCI_SLOT(devfn)];
426 if (!iommu) {
427 iommu = S390_PCI_IOMMU(object_new(TYPE_S390_PCI_IOMMU));
428
429 char *mr_name = g_strdup_printf("iommu-root-%02x:%02x.%01x",
430 pci_bus_num(bus),
431 PCI_SLOT(devfn),
432 PCI_FUNC(devfn));
433 char *as_name = g_strdup_printf("iommu-pci-%02x:%02x.%01x",
434 pci_bus_num(bus),
435 PCI_SLOT(devfn),
436 PCI_FUNC(devfn));
437 memory_region_init(&iommu->mr, OBJECT(iommu), mr_name, UINT64_MAX);
438 address_space_init(&iommu->as, &iommu->mr, as_name);
439 table->iommu[PCI_SLOT(devfn)] = iommu;
440
441 g_free(mr_name);
442 g_free(as_name);
443 }
444
445 return iommu;
446 }
447
448 static AddressSpace *s390_pci_dma_iommu(PCIBus *bus, void *opaque, int devfn)
449 {
450 S390pciState *s = opaque;
451 S390PCIIOMMU *iommu = s390_pci_get_iommu(s, bus, devfn);
452
453 return &iommu->as;
454 }
455
456 static uint8_t set_ind_atomic(uint64_t ind_loc, uint8_t to_be_set)
457 {
458 uint8_t ind_old, ind_new;
459 hwaddr len = 1;
460 uint8_t *ind_addr;
461
462 ind_addr = cpu_physical_memory_map(ind_loc, &len, 1);
463 if (!ind_addr) {
464 s390_pci_generate_error_event(ERR_EVENT_AIRERR, 0, 0, 0, 0);
465 return -1;
466 }
467 do {
468 ind_old = *ind_addr;
469 ind_new = ind_old | to_be_set;
470 } while (atomic_cmpxchg(ind_addr, ind_old, ind_new) != ind_old);
471 cpu_physical_memory_unmap(ind_addr, len, 1, len);
472
473 return ind_old;
474 }
475
476 static void s390_msi_ctrl_write(void *opaque, hwaddr addr, uint64_t data,
477 unsigned int size)
478 {
479 S390PCIBusDevice *pbdev = opaque;
480 uint32_t idx = data >> ZPCI_MSI_VEC_BITS;
481 uint32_t vec = data & ZPCI_MSI_VEC_MASK;
482 uint64_t ind_bit;
483 uint32_t sum_bit;
484 uint32_t e = 0;
485
486 DPRINTF("write_msix data 0x%" PRIx64 " idx %d vec 0x%x\n", data, idx, vec);
487
488 if (!pbdev) {
489 e |= (vec << ERR_EVENT_MVN_OFFSET);
490 s390_pci_generate_error_event(ERR_EVENT_NOMSI, idx, 0, addr, e);
491 return;
492 }
493
494 if (pbdev->state != ZPCI_FS_ENABLED) {
495 return;
496 }
497
498 ind_bit = pbdev->routes.adapter.ind_offset;
499 sum_bit = pbdev->routes.adapter.summary_offset;
500
501 set_ind_atomic(pbdev->routes.adapter.ind_addr + (ind_bit + vec) / 8,
502 0x80 >> ((ind_bit + vec) % 8));
503 if (!set_ind_atomic(pbdev->routes.adapter.summary_addr + sum_bit / 8,
504 0x80 >> (sum_bit % 8))) {
505 css_adapter_interrupt(pbdev->isc);
506 }
507 }
508
509 static uint64_t s390_msi_ctrl_read(void *opaque, hwaddr addr, unsigned size)
510 {
511 return 0xffffffff;
512 }
513
514 static const MemoryRegionOps s390_msi_ctrl_ops = {
515 .write = s390_msi_ctrl_write,
516 .read = s390_msi_ctrl_read,
517 .endianness = DEVICE_LITTLE_ENDIAN,
518 };
519
520 void s390_pci_iommu_enable(S390PCIIOMMU *iommu)
521 {
522 char *name = g_strdup_printf("iommu-s390-%04x", iommu->pbdev->uid);
523 memory_region_init_iommu(&iommu->iommu_mr, OBJECT(&iommu->mr),
524 &s390_iommu_ops, name, iommu->pal + 1);
525 iommu->enabled = true;
526 memory_region_add_subregion(&iommu->mr, 0, &iommu->iommu_mr);
527 g_free(name);
528 }
529
530 void s390_pci_iommu_disable(S390PCIIOMMU *iommu)
531 {
532 iommu->enabled = false;
533 memory_region_del_subregion(&iommu->mr, &iommu->iommu_mr);
534 object_unparent(OBJECT(&iommu->iommu_mr));
535 }
536
537 static void s390_pci_iommu_free(S390pciState *s, PCIBus *bus, int32_t devfn)
538 {
539 uint64_t key = (uintptr_t)bus;
540 S390PCIIOMMUTable *table = g_hash_table_lookup(s->iommu_table, &key);
541 S390PCIIOMMU *iommu = table ? table->iommu[PCI_SLOT(devfn)] : NULL;
542
543 if (!table || !iommu) {
544 return;
545 }
546
547 table->iommu[PCI_SLOT(devfn)] = NULL;
548 address_space_destroy(&iommu->as);
549 object_unparent(OBJECT(&iommu->mr));
550 object_unparent(OBJECT(iommu));
551 object_unref(OBJECT(iommu));
552 }
553
554 static int s390_pcihost_init(SysBusDevice *dev)
555 {
556 PCIBus *b;
557 BusState *bus;
558 PCIHostState *phb = PCI_HOST_BRIDGE(dev);
559 S390pciState *s = S390_PCI_HOST_BRIDGE(dev);
560
561 DPRINTF("host_init\n");
562
563 b = pci_register_bus(DEVICE(dev), NULL,
564 s390_pci_set_irq, s390_pci_map_irq, NULL,
565 get_system_memory(), get_system_io(), 0, 64,
566 TYPE_PCI_BUS);
567 pci_setup_iommu(b, s390_pci_dma_iommu, s);
568
569 bus = BUS(b);
570 qbus_set_hotplug_handler(bus, DEVICE(dev), NULL);
571 phb->bus = b;
572
573 s->bus = S390_PCI_BUS(qbus_create(TYPE_S390_PCI_BUS, DEVICE(s), NULL));
574 qbus_set_hotplug_handler(BUS(s->bus), DEVICE(s), NULL);
575
576 s->iommu_table = g_hash_table_new_full(g_int64_hash, g_int64_equal,
577 NULL, g_free);
578 s->zpci_table = g_hash_table_new_full(g_int_hash, g_int_equal, NULL, NULL);
579 s->bus_no = 0;
580 QTAILQ_INIT(&s->pending_sei);
581 QTAILQ_INIT(&s->zpci_devs);
582 return 0;
583 }
584
585 static int s390_pci_msix_init(S390PCIBusDevice *pbdev)
586 {
587 char *name;
588 uint8_t pos;
589 uint16_t ctrl;
590 uint32_t table, pba;
591
592 pos = pci_find_capability(pbdev->pdev, PCI_CAP_ID_MSIX);
593 if (!pos) {
594 pbdev->msix.available = false;
595 return -1;
596 }
597
598 ctrl = pci_host_config_read_common(pbdev->pdev, pos + PCI_MSIX_FLAGS,
599 pci_config_size(pbdev->pdev), sizeof(ctrl));
600 table = pci_host_config_read_common(pbdev->pdev, pos + PCI_MSIX_TABLE,
601 pci_config_size(pbdev->pdev), sizeof(table));
602 pba = pci_host_config_read_common(pbdev->pdev, pos + PCI_MSIX_PBA,
603 pci_config_size(pbdev->pdev), sizeof(pba));
604
605 pbdev->msix.table_bar = table & PCI_MSIX_FLAGS_BIRMASK;
606 pbdev->msix.table_offset = table & ~PCI_MSIX_FLAGS_BIRMASK;
607 pbdev->msix.pba_bar = pba & PCI_MSIX_FLAGS_BIRMASK;
608 pbdev->msix.pba_offset = pba & ~PCI_MSIX_FLAGS_BIRMASK;
609 pbdev->msix.entries = (ctrl & PCI_MSIX_FLAGS_QSIZE) + 1;
610 pbdev->msix.available = true;
611
612 name = g_strdup_printf("msix-s390-%04x", pbdev->uid);
613 memory_region_init_io(&pbdev->msix_notify_mr, OBJECT(pbdev),
614 &s390_msi_ctrl_ops, pbdev, name, PAGE_SIZE);
615 memory_region_add_subregion(&pbdev->iommu->mr, ZPCI_MSI_ADDR,
616 &pbdev->msix_notify_mr);
617 g_free(name);
618
619 return 0;
620 }
621
622 static void s390_pci_msix_free(S390PCIBusDevice *pbdev)
623 {
624 memory_region_del_subregion(&pbdev->iommu->mr, &pbdev->msix_notify_mr);
625 object_unparent(OBJECT(&pbdev->msix_notify_mr));
626 }
627
628 static S390PCIBusDevice *s390_pci_device_new(S390pciState *s,
629 const char *target)
630 {
631 DeviceState *dev = NULL;
632
633 dev = qdev_try_create(BUS(s->bus), TYPE_S390_PCI_DEVICE);
634 if (!dev) {
635 return NULL;
636 }
637
638 qdev_prop_set_string(dev, "target", target);
639 qdev_init_nofail(dev);
640
641 return S390_PCI_DEVICE(dev);
642 }
643
644 static bool s390_pci_alloc_idx(S390pciState *s, S390PCIBusDevice *pbdev)
645 {
646 uint32_t idx;
647
648 idx = s->next_idx;
649 while (s390_pci_find_dev_by_idx(s, idx)) {
650 idx = (idx + 1) & FH_MASK_INDEX;
651 if (idx == s->next_idx) {
652 return false;
653 }
654 }
655
656 pbdev->idx = idx;
657 s->next_idx = (idx + 1) & FH_MASK_INDEX;
658
659 return true;
660 }
661
662 static void s390_pcihost_hot_plug(HotplugHandler *hotplug_dev,
663 DeviceState *dev, Error **errp)
664 {
665 PCIDevice *pdev = NULL;
666 S390PCIBusDevice *pbdev = NULL;
667 S390pciState *s = s390_get_phb();
668
669 if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
670 BusState *bus;
671 PCIBridge *pb = PCI_BRIDGE(dev);
672 PCIDevice *pdev = PCI_DEVICE(dev);
673
674 pci_bridge_map_irq(pb, dev->id, s390_pci_map_irq);
675 pci_setup_iommu(&pb->sec_bus, s390_pci_dma_iommu, s);
676
677 bus = BUS(&pb->sec_bus);
678 qbus_set_hotplug_handler(bus, DEVICE(s), errp);
679
680 if (dev->hotplugged) {
681 pci_default_write_config(pdev, PCI_PRIMARY_BUS, s->bus_no, 1);
682 s->bus_no += 1;
683 pci_default_write_config(pdev, PCI_SECONDARY_BUS, s->bus_no, 1);
684 do {
685 pdev = pdev->bus->parent_dev;
686 pci_default_write_config(pdev, PCI_SUBORDINATE_BUS,
687 s->bus_no, 1);
688 } while (pdev->bus && pci_bus_num(pdev->bus));
689 }
690 } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
691 pdev = PCI_DEVICE(dev);
692
693 if (!dev->id) {
694 /* In the case the PCI device does not define an id */
695 /* we generate one based on the PCI address */
696 dev->id = g_strdup_printf("auto_%02x:%02x.%01x",
697 pci_bus_num(pdev->bus),
698 PCI_SLOT(pdev->devfn),
699 PCI_FUNC(pdev->devfn));
700 }
701
702 pbdev = s390_pci_find_dev_by_target(s, dev->id);
703 if (!pbdev) {
704 pbdev = s390_pci_device_new(s, dev->id);
705 if (!pbdev) {
706 error_setg(errp, "create zpci device failed");
707 return;
708 }
709 }
710
711 if (object_dynamic_cast(OBJECT(dev), "vfio-pci")) {
712 pbdev->fh |= FH_SHM_VFIO;
713 } else {
714 pbdev->fh |= FH_SHM_EMUL;
715 }
716
717 pbdev->pdev = pdev;
718 pbdev->iommu = s390_pci_get_iommu(s, pdev->bus, pdev->devfn);
719 pbdev->iommu->pbdev = pbdev;
720 pbdev->state = ZPCI_FS_STANDBY;
721
722 if (s390_pci_msix_init(pbdev)) {
723 error_setg(errp, "MSI-X support is mandatory "
724 "in the S390 architecture");
725 return;
726 }
727
728 if (dev->hotplugged) {
729 s390_pci_generate_plug_event(HP_EVENT_RESERVED_TO_STANDBY,
730 pbdev->fh, pbdev->fid);
731 }
732 } else if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
733 pbdev = S390_PCI_DEVICE(dev);
734
735 if (!s390_pci_alloc_idx(s, pbdev)) {
736 error_setg(errp, "no slot for plugging zpci device");
737 return;
738 }
739 pbdev->fh = pbdev->idx;
740 QTAILQ_INSERT_TAIL(&s->zpci_devs, pbdev, link);
741 g_hash_table_insert(s->zpci_table, &pbdev->idx, pbdev);
742 }
743 }
744
745 static void s390_pcihost_timer_cb(void *opaque)
746 {
747 S390PCIBusDevice *pbdev = opaque;
748
749 if (pbdev->summary_ind) {
750 pci_dereg_irqs(pbdev);
751 }
752 if (pbdev->iommu->enabled) {
753 pci_dereg_ioat(pbdev->iommu);
754 }
755
756 pbdev->state = ZPCI_FS_STANDBY;
757 s390_pci_generate_plug_event(HP_EVENT_CONFIGURED_TO_STBRES,
758 pbdev->fh, pbdev->fid);
759 qdev_unplug(DEVICE(pbdev), NULL);
760 }
761
762 static void s390_pcihost_hot_unplug(HotplugHandler *hotplug_dev,
763 DeviceState *dev, Error **errp)
764 {
765 PCIDevice *pci_dev = NULL;
766 PCIBus *bus;
767 int32_t devfn;
768 S390PCIBusDevice *pbdev = NULL;
769 S390pciState *s = s390_get_phb();
770
771 if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_BRIDGE)) {
772 error_setg(errp, "PCI bridge hot unplug currently not supported");
773 return;
774 } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
775 pci_dev = PCI_DEVICE(dev);
776
777 QTAILQ_FOREACH(pbdev, &s->zpci_devs, link) {
778 if (pbdev->pdev == pci_dev) {
779 break;
780 }
781 }
782 assert(pbdev != NULL);
783 } else if (object_dynamic_cast(OBJECT(dev), TYPE_S390_PCI_DEVICE)) {
784 pbdev = S390_PCI_DEVICE(dev);
785 pci_dev = pbdev->pdev;
786 }
787
788 switch (pbdev->state) {
789 case ZPCI_FS_RESERVED:
790 goto out;
791 case ZPCI_FS_STANDBY:
792 break;
793 default:
794 s390_pci_generate_plug_event(HP_EVENT_DECONFIGURE_REQUEST,
795 pbdev->fh, pbdev->fid);
796 pbdev->release_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL,
797 s390_pcihost_timer_cb,
798 pbdev);
799 timer_mod(pbdev->release_timer,
800 qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + HOT_UNPLUG_TIMEOUT);
801 return;
802 }
803
804 if (pbdev->release_timer && timer_pending(pbdev->release_timer)) {
805 timer_del(pbdev->release_timer);
806 timer_free(pbdev->release_timer);
807 pbdev->release_timer = NULL;
808 }
809
810 s390_pci_generate_plug_event(HP_EVENT_STANDBY_TO_RESERVED,
811 pbdev->fh, pbdev->fid);
812 bus = pci_dev->bus;
813 devfn = pci_dev->devfn;
814 object_unparent(OBJECT(pci_dev));
815 s390_pci_msix_free(pbdev);
816 s390_pci_iommu_free(s, bus, devfn);
817 pbdev->pdev = NULL;
818 pbdev->state = ZPCI_FS_RESERVED;
819 out:
820 pbdev->fid = 0;
821 QTAILQ_REMOVE(&s->zpci_devs, pbdev, link);
822 g_hash_table_remove(s->zpci_table, &pbdev->idx);
823 object_unparent(OBJECT(pbdev));
824 }
825
826 static void s390_pci_enumerate_bridge(PCIBus *bus, PCIDevice *pdev,
827 void *opaque)
828 {
829 S390pciState *s = opaque;
830 unsigned int primary = s->bus_no;
831 unsigned int subordinate = 0xff;
832 PCIBus *sec_bus = NULL;
833
834 if ((pci_default_read_config(pdev, PCI_HEADER_TYPE, 1) !=
835 PCI_HEADER_TYPE_BRIDGE)) {
836 return;
837 }
838
839 (s->bus_no)++;
840 pci_default_write_config(pdev, PCI_PRIMARY_BUS, primary, 1);
841 pci_default_write_config(pdev, PCI_SECONDARY_BUS, s->bus_no, 1);
842 pci_default_write_config(pdev, PCI_SUBORDINATE_BUS, s->bus_no, 1);
843
844 sec_bus = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev));
845 if (!sec_bus) {
846 return;
847 }
848
849 pci_default_write_config(pdev, PCI_SUBORDINATE_BUS, subordinate, 1);
850 pci_for_each_device(sec_bus, pci_bus_num(sec_bus),
851 s390_pci_enumerate_bridge, s);
852 pci_default_write_config(pdev, PCI_SUBORDINATE_BUS, s->bus_no, 1);
853 }
854
855 static void s390_pcihost_reset(DeviceState *dev)
856 {
857 S390pciState *s = S390_PCI_HOST_BRIDGE(dev);
858 PCIBus *bus = s->parent_obj.bus;
859
860 s->bus_no = 0;
861 pci_for_each_device(bus, pci_bus_num(bus), s390_pci_enumerate_bridge, s);
862 }
863
864 static void s390_pcihost_class_init(ObjectClass *klass, void *data)
865 {
866 SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
867 DeviceClass *dc = DEVICE_CLASS(klass);
868 HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(klass);
869
870 dc->cannot_instantiate_with_device_add_yet = true;
871 dc->reset = s390_pcihost_reset;
872 k->init = s390_pcihost_init;
873 hc->plug = s390_pcihost_hot_plug;
874 hc->unplug = s390_pcihost_hot_unplug;
875 msi_nonbroken = true;
876 }
877
878 static const TypeInfo s390_pcihost_info = {
879 .name = TYPE_S390_PCI_HOST_BRIDGE,
880 .parent = TYPE_PCI_HOST_BRIDGE,
881 .instance_size = sizeof(S390pciState),
882 .class_init = s390_pcihost_class_init,
883 .interfaces = (InterfaceInfo[]) {
884 { TYPE_HOTPLUG_HANDLER },
885 { }
886 }
887 };
888
889 static const TypeInfo s390_pcibus_info = {
890 .name = TYPE_S390_PCI_BUS,
891 .parent = TYPE_BUS,
892 .instance_size = sizeof(S390PCIBus),
893 };
894
895 static uint16_t s390_pci_generate_uid(S390pciState *s)
896 {
897 uint16_t uid = 0;
898
899 do {
900 uid++;
901 if (!s390_pci_find_dev_by_uid(s, uid)) {
902 return uid;
903 }
904 } while (uid < ZPCI_MAX_UID);
905
906 return UID_UNDEFINED;
907 }
908
909 static uint32_t s390_pci_generate_fid(S390pciState *s, Error **errp)
910 {
911 uint32_t fid = 0;
912
913 do {
914 if (!s390_pci_find_dev_by_fid(s, fid)) {
915 return fid;
916 }
917 } while (fid++ != ZPCI_MAX_FID);
918
919 error_setg(errp, "no free fid could be found");
920 return 0;
921 }
922
923 static void s390_pci_device_realize(DeviceState *dev, Error **errp)
924 {
925 S390PCIBusDevice *zpci = S390_PCI_DEVICE(dev);
926 S390pciState *s = s390_get_phb();
927
928 if (!zpci->target) {
929 error_setg(errp, "target must be defined");
930 return;
931 }
932
933 if (s390_pci_find_dev_by_target(s, zpci->target)) {
934 error_setg(errp, "target %s already has an associated zpci device",
935 zpci->target);
936 return;
937 }
938
939 if (zpci->uid == UID_UNDEFINED) {
940 zpci->uid = s390_pci_generate_uid(s);
941 if (!zpci->uid) {
942 error_setg(errp, "no free uid could be found");
943 return;
944 }
945 } else if (s390_pci_find_dev_by_uid(s, zpci->uid)) {
946 error_setg(errp, "uid %u already in use", zpci->uid);
947 return;
948 }
949
950 if (!zpci->fid_defined) {
951 Error *local_error = NULL;
952
953 zpci->fid = s390_pci_generate_fid(s, &local_error);
954 if (local_error) {
955 error_propagate(errp, local_error);
956 return;
957 }
958 } else if (s390_pci_find_dev_by_fid(s, zpci->fid)) {
959 error_setg(errp, "fid %u already in use", zpci->fid);
960 return;
961 }
962
963 zpci->state = ZPCI_FS_RESERVED;
964 }
965
966 static void s390_pci_device_reset(DeviceState *dev)
967 {
968 S390PCIBusDevice *pbdev = S390_PCI_DEVICE(dev);
969
970 switch (pbdev->state) {
971 case ZPCI_FS_RESERVED:
972 return;
973 case ZPCI_FS_STANDBY:
974 break;
975 default:
976 pbdev->fh &= ~FH_MASK_ENABLE;
977 pbdev->state = ZPCI_FS_DISABLED;
978 break;
979 }
980
981 if (pbdev->summary_ind) {
982 pci_dereg_irqs(pbdev);
983 }
984 if (pbdev->iommu->enabled) {
985 pci_dereg_ioat(pbdev->iommu);
986 }
987
988 pbdev->fmb_addr = 0;
989 }
990
991 static void s390_pci_get_fid(Object *obj, Visitor *v, const char *name,
992 void *opaque, Error **errp)
993 {
994 Property *prop = opaque;
995 uint32_t *ptr = qdev_get_prop_ptr(DEVICE(obj), prop);
996
997 visit_type_uint32(v, name, ptr, errp);
998 }
999
1000 static void s390_pci_set_fid(Object *obj, Visitor *v, const char *name,
1001 void *opaque, Error **errp)
1002 {
1003 DeviceState *dev = DEVICE(obj);
1004 S390PCIBusDevice *zpci = S390_PCI_DEVICE(obj);
1005 Property *prop = opaque;
1006 uint32_t *ptr = qdev_get_prop_ptr(dev, prop);
1007
1008 if (dev->realized) {
1009 qdev_prop_set_after_realize(dev, name, errp);
1010 return;
1011 }
1012
1013 visit_type_uint32(v, name, ptr, errp);
1014 zpci->fid_defined = true;
1015 }
1016
1017 static PropertyInfo s390_pci_fid_propinfo = {
1018 .name = "zpci_fid",
1019 .get = s390_pci_get_fid,
1020 .set = s390_pci_set_fid,
1021 };
1022
1023 #define DEFINE_PROP_S390_PCI_FID(_n, _s, _f) \
1024 DEFINE_PROP(_n, _s, _f, s390_pci_fid_propinfo, uint32_t)
1025
1026 static Property s390_pci_device_properties[] = {
1027 DEFINE_PROP_UINT16("uid", S390PCIBusDevice, uid, UID_UNDEFINED),
1028 DEFINE_PROP_S390_PCI_FID("fid", S390PCIBusDevice, fid),
1029 DEFINE_PROP_STRING("target", S390PCIBusDevice, target),
1030 DEFINE_PROP_END_OF_LIST(),
1031 };
1032
1033 static void s390_pci_device_class_init(ObjectClass *klass, void *data)
1034 {
1035 DeviceClass *dc = DEVICE_CLASS(klass);
1036
1037 dc->desc = "zpci device";
1038 dc->reset = s390_pci_device_reset;
1039 dc->bus_type = TYPE_S390_PCI_BUS;
1040 dc->realize = s390_pci_device_realize;
1041 dc->props = s390_pci_device_properties;
1042 }
1043
1044 static const TypeInfo s390_pci_device_info = {
1045 .name = TYPE_S390_PCI_DEVICE,
1046 .parent = TYPE_DEVICE,
1047 .instance_size = sizeof(S390PCIBusDevice),
1048 .class_init = s390_pci_device_class_init,
1049 };
1050
1051 static TypeInfo s390_pci_iommu_info = {
1052 .name = TYPE_S390_PCI_IOMMU,
1053 .parent = TYPE_OBJECT,
1054 .instance_size = sizeof(S390PCIIOMMU),
1055 };
1056
1057 static void s390_pci_register_types(void)
1058 {
1059 type_register_static(&s390_pcihost_info);
1060 type_register_static(&s390_pcibus_info);
1061 type_register_static(&s390_pci_device_info);
1062 type_register_static(&s390_pci_iommu_info);
1063 }
1064
1065 type_init(s390_pci_register_types)