1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef HW_S390_FLIC_H
14#define HW_S390_FLIC_H
15
16#include "hw/sysbus.h"
17#include "hw/s390x/adapter.h"
18#include "hw/virtio/virtio.h"
19
20
21
22
23
24
25
26#define ADAPTER_ROUTES_MAX_GSI VIRTIO_QUEUE_MAX
27
28typedef struct AdapterRoutes {
29 AdapterInfo adapter;
30 int num_routes;
31 int gsi[ADAPTER_ROUTES_MAX_GSI];
32} AdapterRoutes;
33
34#define TYPE_S390_FLIC_COMMON "s390-flic"
35#define S390_FLIC_COMMON(obj) \
36 OBJECT_CHECK(S390FLICState, (obj), TYPE_S390_FLIC_COMMON)
37
38typedef struct S390FLICState {
39 SysBusDevice parent_obj;
40
41 uint32_t adapter_routes_max_batch;
42
43} S390FLICState;
44
45#define S390_FLIC_COMMON_CLASS(klass) \
46 OBJECT_CLASS_CHECK(S390FLICStateClass, (klass), TYPE_S390_FLIC_COMMON)
47#define S390_FLIC_COMMON_GET_CLASS(obj) \
48 OBJECT_GET_CLASS(S390FLICStateClass, (obj), TYPE_S390_FLIC_COMMON)
49
50typedef struct S390FLICStateClass {
51 DeviceClass parent_class;
52
53 int (*register_io_adapter)(S390FLICState *fs, uint32_t id, uint8_t isc,
54 bool swap, bool maskable);
55 int (*io_adapter_map)(S390FLICState *fs, uint32_t id, uint64_t map_addr,
56 bool do_map);
57 int (*add_adapter_routes)(S390FLICState *fs, AdapterRoutes *routes);
58 void (*release_adapter_routes)(S390FLICState *fs, AdapterRoutes *routes);
59 int (*clear_io_irq)(S390FLICState *fs, uint16_t subchannel_id,
60 uint16_t subchannel_nr);
61} S390FLICStateClass;
62
63#define TYPE_KVM_S390_FLIC "s390-flic-kvm"
64#define KVM_S390_FLIC(obj) \
65 OBJECT_CHECK(KVMS390FLICState, (obj), TYPE_KVM_S390_FLIC)
66
67#define TYPE_QEMU_S390_FLIC "s390-flic-qemu"
68#define QEMU_S390_FLIC(obj) \
69 OBJECT_CHECK(QEMUS390FLICState, (obj), TYPE_QEMU_S390_FLIC)
70
71typedef struct QEMUS390FLICState {
72 S390FLICState parent_obj;
73} QEMUS390FLICState;
74
75void s390_flic_init(void);
76
77S390FLICState *s390_get_flic(void);
78
79#ifdef CONFIG_KVM
80DeviceState *s390_flic_kvm_create(void);
81#else
82static inline DeviceState *s390_flic_kvm_create(void)
83{
84 return NULL;
85}
86#endif
87
88#endif
89