qemu/include/hw/intc/riscv_aplic.h
Daniel Henrique Barboza 7d0b35b3c9 hw/intc/riscv_aplic: rename is_kvm_aia()
The helper is_kvm_aia() is checking not only for AIA, but for
aplic-imsic (i.e. "aia=aplic-imsic" in 'virt' RISC-V machine) with an
in-kernel chip present.

Rename it to be a bit clear what the helper is doing since we'll add
more AIA helpers in the next patches.

Make the helper public because the 'virt' machine will use it as well.

Signed-off-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-ID: <20241119191706.718860-2-dbarboza@ventanamicro.com>
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
2024-12-20 11:22:47 +10:00

80 lines
2.4 KiB
C

/*
* RISC-V APLIC (Advanced Platform Level Interrupt Controller) interface
*
* Copyright (c) 2021 Western Digital Corporation or its affiliates.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2 or later, as published by the Free Software Foundation.
*
* This program is distributed in the hope 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 HW_RISCV_APLIC_H
#define HW_RISCV_APLIC_H
#include "hw/sysbus.h"
#include "qom/object.h"
#define TYPE_RISCV_APLIC "riscv.aplic"
typedef struct RISCVAPLICState RISCVAPLICState;
DECLARE_INSTANCE_CHECKER(RISCVAPLICState, RISCV_APLIC, TYPE_RISCV_APLIC)
#define APLIC_MIN_SIZE 0x4000
#define APLIC_SIZE_ALIGN(__x) (((__x) + (APLIC_MIN_SIZE - 1)) & \
~(APLIC_MIN_SIZE - 1))
#define APLIC_SIZE(__num_harts) (APLIC_MIN_SIZE + \
APLIC_SIZE_ALIGN(32 * (__num_harts)))
struct RISCVAPLICState {
/*< private >*/
SysBusDevice parent_obj;
qemu_irq *external_irqs;
/*< public >*/
MemoryRegion mmio;
uint32_t bitfield_words;
uint32_t domaincfg;
uint32_t mmsicfgaddr;
uint32_t mmsicfgaddrH;
uint32_t smsicfgaddr;
uint32_t smsicfgaddrH;
uint32_t genmsi;
uint32_t *sourcecfg;
uint32_t *state;
uint32_t *target;
uint32_t *idelivery;
uint32_t *iforce;
uint32_t *ithreshold;
/* topology */
#define QEMU_APLIC_MAX_CHILDREN 16
struct RISCVAPLICState *parent;
struct RISCVAPLICState *children[QEMU_APLIC_MAX_CHILDREN];
uint16_t num_children;
/* config */
uint32_t aperture_size;
uint32_t hartid_base;
uint32_t num_harts;
uint32_t iprio_mask;
uint32_t num_irqs;
bool msimode;
bool mmode;
};
void riscv_aplic_add_child(DeviceState *parent, DeviceState *child);
bool riscv_is_kvm_aia_aplic_imsic(bool msimode);
DeviceState *riscv_aplic_create(hwaddr addr, hwaddr size,
uint32_t hartid_base, uint32_t num_harts, uint32_t num_sources,
uint32_t iprio_bits, bool msimode, bool mmode, DeviceState *parent);
#endif