/* * RISC-V ACLINT (Advanced Core Local Interruptor) interface * * Copyright (c) 2016-2017 Sagar Karandikar, sagark@eecs.berkeley.edu * Copyright (c) 2017 SiFive, Inc. * 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 . */ #ifndef HW_RISCV_ACLINT_H #define HW_RISCV_ACLINT_H #include "hw/sysbus.h" #define TYPE_RISCV_ACLINT_MTIMER "riscv.aclint.mtimer" #define RISCV_ACLINT_MTIMER(obj) \ OBJECT_CHECK(RISCVAclintMTimerState, (obj), TYPE_RISCV_ACLINT_MTIMER) typedef struct RISCVAclintMTimerState { /*< private >*/ SysBusDevice parent_obj; uint64_t time_delta; uint64_t *timecmp; QEMUTimer **timers; /*< public >*/ MemoryRegion mmio; uint32_t hartid_base; uint32_t num_harts; uint32_t timecmp_base; uint32_t time_base; uint32_t aperture_size; uint32_t timebase_freq; qemu_irq *timer_irqs; } RISCVAclintMTimerState; DeviceState *riscv_aclint_mtimer_create(hwaddr addr, hwaddr size, uint32_t hartid_base, uint32_t num_harts, uint32_t timecmp_base, uint32_t time_base, uint32_t timebase_freq, bool provide_rdtime); #define TYPE_RISCV_ACLINT_SWI "riscv.aclint.swi" #define RISCV_ACLINT_SWI(obj) \ OBJECT_CHECK(RISCVAclintSwiState, (obj), TYPE_RISCV_ACLINT_SWI) typedef struct RISCVAclintSwiState { /*< private >*/ SysBusDevice parent_obj; /*< public >*/ MemoryRegion mmio; uint32_t hartid_base; uint32_t num_harts; uint32_t sswi; qemu_irq *soft_irqs; } RISCVAclintSwiState; DeviceState *riscv_aclint_swi_create(hwaddr addr, uint32_t hartid_base, uint32_t num_harts, bool sswi); enum { RISCV_ACLINT_DEFAULT_MTIMECMP = 0x0, RISCV_ACLINT_DEFAULT_MTIME = 0x7ff8, RISCV_ACLINT_DEFAULT_MTIMER_SIZE = 0x8000, RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ = 10000000, RISCV_ACLINT_MAX_HARTS = 4095, RISCV_ACLINT_SWI_SIZE = 0x4000 }; #endif