2013-07-16 11:04:04 +04:00
|
|
|
/*
|
2014-04-17 17:59:48 +04:00
|
|
|
* QEMU S390x floating interrupt controller (flic)
|
2013-07-16 11:04:04 +04:00
|
|
|
*
|
|
|
|
* Copyright 2014 IBM Corp.
|
|
|
|
* Author(s): Jens Freimann <jfrei@linux.vnet.ibm.com>
|
2014-04-17 17:59:48 +04:00
|
|
|
* Cornelia Huck <cornelia.huck@de.ibm.com>
|
2013-07-16 11:04:04 +04:00
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or (at
|
|
|
|
* your option) any later version. See the COPYING file in the top-level
|
|
|
|
* directory.
|
|
|
|
*/
|
|
|
|
|
2016-06-29 14:47:03 +03:00
|
|
|
#ifndef HW_S390_FLIC_H
|
|
|
|
#define HW_S390_FLIC_H
|
2013-07-16 11:04:04 +04:00
|
|
|
|
|
|
|
#include "hw/sysbus.h"
|
2013-07-15 19:45:03 +04:00
|
|
|
#include "hw/s390x/adapter.h"
|
|
|
|
#include "hw/virtio/virtio.h"
|
2018-01-29 15:56:13 +03:00
|
|
|
#include "qemu/queue.h"
|
2020-09-03 23:43:22 +03:00
|
|
|
#include "qom/object.h"
|
2013-07-15 19:45:03 +04:00
|
|
|
|
2016-12-09 22:00:21 +03:00
|
|
|
/*
|
|
|
|
* Reserve enough gsis to accommodate all virtio devices.
|
|
|
|
* If any other user of adapter routes needs more of these,
|
|
|
|
* we need to bump the value; but virtio looks like the
|
|
|
|
* maximum right now.
|
|
|
|
*/
|
|
|
|
#define ADAPTER_ROUTES_MAX_GSI VIRTIO_QUEUE_MAX
|
2015-05-29 09:15:27 +03:00
|
|
|
|
2013-07-15 19:45:03 +04:00
|
|
|
typedef struct AdapterRoutes {
|
|
|
|
AdapterInfo adapter;
|
|
|
|
int num_routes;
|
2015-05-29 09:15:27 +03:00
|
|
|
int gsi[ADAPTER_ROUTES_MAX_GSI];
|
2013-07-15 19:45:03 +04:00
|
|
|
} AdapterRoutes;
|
2013-07-16 11:04:04 +04:00
|
|
|
|
2017-07-04 00:34:14 +03:00
|
|
|
extern const VMStateDescription vmstate_adapter_routes;
|
|
|
|
|
|
|
|
#define VMSTATE_ADAPTER_ROUTES(_f, _s) \
|
|
|
|
VMSTATE_STRUCT(_f, _s, 1, vmstate_adapter_routes, AdapterRoutes)
|
|
|
|
|
2014-04-17 17:59:48 +04:00
|
|
|
#define TYPE_S390_FLIC_COMMON "s390-flic"
|
2020-09-01 00:07:37 +03:00
|
|
|
OBJECT_DECLARE_TYPE(S390FLICState, S390FLICStateClass,
|
qom: Remove module_obj_name parameter from OBJECT_DECLARE* macros
One of the goals of having less boilerplate on QOM declarations
is to avoid human error. Requiring an extra argument that is
never used is an opportunity for mistakes.
Remove the unused argument from OBJECT_DECLARE_TYPE and
OBJECT_DECLARE_SIMPLE_TYPE.
Coccinelle patch used to convert all users of the macros:
@@
declarer name OBJECT_DECLARE_TYPE;
identifier InstanceType, ClassType, lowercase, UPPERCASE;
@@
OBJECT_DECLARE_TYPE(InstanceType, ClassType,
- lowercase,
UPPERCASE);
@@
declarer name OBJECT_DECLARE_SIMPLE_TYPE;
identifier InstanceType, lowercase, UPPERCASE;
@@
OBJECT_DECLARE_SIMPLE_TYPE(InstanceType,
- lowercase,
UPPERCASE);
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Acked-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: Paul Durrant <paul@xen.org>
Acked-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20200916182519.415636-4-ehabkost@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
2020-09-16 21:25:17 +03:00
|
|
|
S390_FLIC_COMMON)
|
2014-04-17 17:59:48 +04:00
|
|
|
|
2020-09-03 23:43:22 +03:00
|
|
|
struct S390FLICState {
|
2014-04-17 17:59:48 +04:00
|
|
|
SysBusDevice parent_obj;
|
2016-12-09 15:51:46 +03:00
|
|
|
/* to limit AdapterRoutes.num_routes for compat */
|
|
|
|
uint32_t adapter_routes_max_batch;
|
2017-02-17 09:23:44 +03:00
|
|
|
bool ais_supported;
|
2020-09-03 23:43:22 +03:00
|
|
|
};
|
2014-04-17 17:59:48 +04:00
|
|
|
|
|
|
|
|
2020-09-03 23:43:22 +03:00
|
|
|
struct S390FLICStateClass {
|
2014-04-17 17:59:48 +04:00
|
|
|
DeviceClass parent_class;
|
|
|
|
|
2013-07-15 19:45:03 +04:00
|
|
|
int (*register_io_adapter)(S390FLICState *fs, uint32_t id, uint8_t isc,
|
2017-03-07 06:07:44 +03:00
|
|
|
bool swap, bool maskable, uint8_t flags);
|
2013-07-15 19:45:03 +04:00
|
|
|
int (*io_adapter_map)(S390FLICState *fs, uint32_t id, uint64_t map_addr,
|
|
|
|
bool do_map);
|
|
|
|
int (*add_adapter_routes)(S390FLICState *fs, AdapterRoutes *routes);
|
|
|
|
void (*release_adapter_routes)(S390FLICState *fs, AdapterRoutes *routes);
|
2016-01-27 15:03:44 +03:00
|
|
|
int (*clear_io_irq)(S390FLICState *fs, uint16_t subchannel_id,
|
|
|
|
uint16_t subchannel_nr);
|
2017-02-17 09:23:44 +03:00
|
|
|
int (*modify_ais_mode)(S390FLICState *fs, uint8_t isc, uint16_t mode);
|
2017-02-17 10:00:59 +03:00
|
|
|
int (*inject_airq)(S390FLICState *fs, uint8_t type, uint8_t isc,
|
|
|
|
uint8_t flags);
|
2018-01-29 15:56:10 +03:00
|
|
|
void (*inject_service)(S390FLICState *fs, uint32_t parm);
|
|
|
|
void (*inject_io)(S390FLICState *fs, uint16_t subchannel_id,
|
|
|
|
uint16_t subchannel_nr, uint32_t io_int_parm,
|
|
|
|
uint32_t io_int_word);
|
|
|
|
void (*inject_crw_mchk)(S390FLICState *fs);
|
2020-09-03 23:43:22 +03:00
|
|
|
};
|
2014-04-17 17:59:48 +04:00
|
|
|
|
|
|
|
#define TYPE_KVM_S390_FLIC "s390-flic-kvm"
|
2020-08-25 22:20:17 +03:00
|
|
|
typedef struct KVMS390FLICState KVMS390FLICState;
|
2020-09-01 00:07:33 +03:00
|
|
|
DECLARE_INSTANCE_CHECKER(KVMS390FLICState, KVM_S390_FLIC,
|
|
|
|
TYPE_KVM_S390_FLIC)
|
2013-07-16 11:04:04 +04:00
|
|
|
|
2014-04-17 17:59:48 +04:00
|
|
|
#define TYPE_QEMU_S390_FLIC "s390-flic-qemu"
|
2020-09-16 21:25:19 +03:00
|
|
|
OBJECT_DECLARE_SIMPLE_TYPE(QEMUS390FLICState, QEMU_S390_FLIC)
|
2013-07-16 11:04:04 +04:00
|
|
|
|
2017-02-17 09:23:44 +03:00
|
|
|
#define SIC_IRQ_MODE_ALL 0
|
|
|
|
#define SIC_IRQ_MODE_SINGLE 1
|
|
|
|
#define AIS_MODE_MASK(isc) (0x80 >> isc)
|
|
|
|
|
2018-01-29 15:56:13 +03:00
|
|
|
#define ISC_TO_PENDING_IO(_isc) (0x80 >> (_isc))
|
|
|
|
#define CR6_TO_PENDING_IO(_cr6) (((_cr6) >> 24) & 0xff)
|
|
|
|
|
|
|
|
/* organize the ISC bits so that the macros above work */
|
|
|
|
#define FLIC_PENDING_IO_ISC7 (1 << 0)
|
|
|
|
#define FLIC_PENDING_IO_ISC6 (1 << 1)
|
|
|
|
#define FLIC_PENDING_IO_ISC5 (1 << 2)
|
|
|
|
#define FLIC_PENDING_IO_ISC4 (1 << 3)
|
|
|
|
#define FLIC_PENDING_IO_ISC3 (1 << 4)
|
|
|
|
#define FLIC_PENDING_IO_ISC2 (1 << 5)
|
|
|
|
#define FLIC_PENDING_IO_ISC1 (1 << 6)
|
|
|
|
#define FLIC_PENDING_IO_ISC0 (1 << 7)
|
|
|
|
#define FLIC_PENDING_SERVICE (1 << 8)
|
|
|
|
#define FLIC_PENDING_MCHK_CR (1 << 9)
|
|
|
|
|
|
|
|
#define FLIC_PENDING_IO (FLIC_PENDING_IO_ISC0 | FLIC_PENDING_IO_ISC1 | \
|
|
|
|
FLIC_PENDING_IO_ISC2 | FLIC_PENDING_IO_ISC3 | \
|
|
|
|
FLIC_PENDING_IO_ISC4 | FLIC_PENDING_IO_ISC5 | \
|
|
|
|
FLIC_PENDING_IO_ISC6 | FLIC_PENDING_IO_ISC7)
|
|
|
|
|
|
|
|
typedef struct QEMUS390FlicIO {
|
|
|
|
uint16_t id;
|
|
|
|
uint16_t nr;
|
|
|
|
uint32_t parm;
|
|
|
|
uint32_t word;
|
|
|
|
QLIST_ENTRY(QEMUS390FlicIO) next;
|
|
|
|
} QEMUS390FlicIO;
|
|
|
|
|
2020-09-03 23:43:22 +03:00
|
|
|
struct QEMUS390FLICState {
|
2014-04-17 17:59:48 +04:00
|
|
|
S390FLICState parent_obj;
|
2018-01-29 15:56:13 +03:00
|
|
|
uint32_t pending;
|
|
|
|
uint32_t service_param;
|
2017-02-17 09:23:44 +03:00
|
|
|
uint8_t simm;
|
|
|
|
uint8_t nimm;
|
2018-01-29 15:56:13 +03:00
|
|
|
QLIST_HEAD(, QEMUS390FlicIO) io[8];
|
2020-09-03 23:43:22 +03:00
|
|
|
};
|
2013-07-16 11:04:04 +04:00
|
|
|
|
2018-01-29 15:56:13 +03:00
|
|
|
uint32_t qemu_s390_flic_dequeue_service(QEMUS390FLICState *flic);
|
|
|
|
QEMUS390FlicIO *qemu_s390_flic_dequeue_io(QEMUS390FLICState *flic,
|
|
|
|
uint64_t cr6);
|
|
|
|
void qemu_s390_flic_dequeue_crw_mchk(QEMUS390FLICState *flic);
|
|
|
|
bool qemu_s390_flic_has_service(QEMUS390FLICState *flic);
|
|
|
|
bool qemu_s390_flic_has_io(QEMUS390FLICState *fs, uint64_t cr6);
|
|
|
|
bool qemu_s390_flic_has_crw_mchk(QEMUS390FLICState *flic);
|
|
|
|
bool qemu_s390_flic_has_any(QEMUS390FLICState *flic);
|
|
|
|
|
2013-07-16 11:04:04 +04:00
|
|
|
void s390_flic_init(void);
|
2014-04-17 17:59:48 +04:00
|
|
|
|
|
|
|
S390FLICState *s390_get_flic(void);
|
2018-01-29 15:56:21 +03:00
|
|
|
QEMUS390FLICState *s390_get_qemu_flic(S390FLICState *fs);
|
2018-01-29 15:56:23 +03:00
|
|
|
S390FLICStateClass *s390_get_flic_class(S390FLICState *fs);
|
2017-05-16 13:58:44 +03:00
|
|
|
bool ais_needed(void *opaque);
|
2014-04-17 17:59:48 +04:00
|
|
|
|
2016-06-29 14:47:03 +03:00
|
|
|
#endif /* HW_S390_FLIC_H */
|