123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- /*
- * ITS support for ARM GICv3
- *
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
- * Written by Pavel Fedin
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, see <http://www.gnu.org/licenses/>.
- */
- #ifndef QEMU_ARM_GICV3_ITS_COMMON_H
- #define QEMU_ARM_GICV3_ITS_COMMON_H
- #include "hw/sysbus.h"
- #include "hw/intc/arm_gicv3_common.h"
- #include "qom/object.h"
- #define TYPE_ARM_GICV3_ITS "arm-gicv3-its"
- #define ITS_CONTROL_SIZE 0x10000
- #define ITS_TRANS_SIZE 0x10000
- #define ITS_SIZE (ITS_CONTROL_SIZE + ITS_TRANS_SIZE)
- #define GITS_CTLR 0x0
- #define GITS_IIDR 0x4
- #define GITS_TYPER 0x8
- #define GITS_CBASER 0x80
- #define GITS_CWRITER 0x88
- #define GITS_CREADR 0x90
- #define GITS_BASER 0x100
- #define GITS_TRANSLATER 0x0040
- typedef struct {
- bool indirect;
- uint16_t entry_sz;
- uint32_t page_sz;
- uint32_t num_entries;
- uint64_t base_addr;
- } TableDesc;
- typedef struct {
- uint32_t num_entries;
- uint64_t base_addr;
- } CmdQDesc;
- struct GICv3ITSState {
- SysBusDevice parent_obj;
- MemoryRegion iomem_main;
- MemoryRegion iomem_its_cntrl;
- MemoryRegion iomem_its_translation;
- GICv3State *gicv3;
- int dev_fd; /* kvm device fd if backed by kvm vgic support */
- uint64_t gits_translater_gpa;
- bool translater_gpa_known;
- uint8_t itt_entry_size;
- /* Registers */
- uint32_t ctlr;
- uint32_t iidr;
- uint64_t typer;
- uint64_t cbaser;
- uint64_t cwriter;
- uint64_t creadr;
- uint64_t baser[8];
- TableDesc dt;
- TableDesc ct;
- TableDesc vpet;
- CmdQDesc cq;
- Error *migration_blocker;
- };
- typedef struct GICv3ITSState GICv3ITSState;
- void gicv3_its_init_mmio(GICv3ITSState *s, const MemoryRegionOps *ops,
- const MemoryRegionOps *tops);
- /*
- * The ITS should call this when it is realized to add itself
- * to its GIC's list of connected ITSes.
- */
- static inline void gicv3_add_its(GICv3State *s, DeviceState *its)
- {
- g_ptr_array_add(s->itslist, its);
- }
- /*
- * The ITS can use this for operations that must be performed on
- * every ITS connected to the same GIC that it is
- */
- static inline void gicv3_foreach_its(GICv3State *s, GFunc func, void *opaque)
- {
- g_ptr_array_foreach(s->itslist, func, opaque);
- }
- #define TYPE_ARM_GICV3_ITS_COMMON "arm-gicv3-its-common"
- typedef struct GICv3ITSCommonClass GICv3ITSCommonClass;
- DECLARE_OBJ_CHECKERS(GICv3ITSState, GICv3ITSCommonClass,
- ARM_GICV3_ITS_COMMON, TYPE_ARM_GICV3_ITS_COMMON)
- struct GICv3ITSCommonClass {
- /*< private >*/
- SysBusDeviceClass parent_class;
- /*< public >*/
- int (*send_msi)(GICv3ITSState *s, uint32_t data, uint16_t devid);
- void (*pre_save)(GICv3ITSState *s);
- void (*post_load)(GICv3ITSState *s);
- };
- /**
- * its_class_name:
- *
- * Return the ITS class name to use depending on whether KVM acceleration
- * and KVM CAP_SIGNAL_MSI are supported
- *
- * Returns: class name to use or NULL
- */
- const char *its_class_name(void);
- #endif
|