/*
 * 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 <http://www.gnu.org/licenses/>.
 */

#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
