Add indirect CSR access to access CLIC register to satisfy the current CLIC spec (Version v0.9, 2024-06-28: Draf). Add CONFIG_LEGACY_CLIC_MEMORYMAP_ACCESS for legacy CLIC implementation with memory-mapped CLIC register. Signed-off-by: Jimmy Zheng <jimmyzhe@andestech.com>
126 lines
2.9 KiB
C
126 lines
2.9 KiB
C
/*
|
|
* Copyright (c) 2021 Tokita, Hiroshi <tokita.hiroshi@gmail.com>
|
|
* Copyright (c) 2025 Andes Technology Corporation
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_CLIC_H_
|
|
#define ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_CLIC_H_
|
|
|
|
/* CLIC relative CSR number */
|
|
#define CSR_MTVT (0x307)
|
|
#define CSR_MNXTI (0x345)
|
|
#define CSR_MINTTHRESH (0x347)
|
|
#define CSR_MISELECT (0x350)
|
|
#define CSR_MIREG (0x351)
|
|
#define CSR_MIREG2 (0x352)
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
#include <stddef.h>
|
|
|
|
#ifdef CONFIG_LEGACY_CLIC_MEMORYMAP_ACCESS
|
|
/* CLIC Memory mapped register offset */
|
|
#define CLIC_CFG (0x0)
|
|
#define CLIC_CTRL(irq) (0x1000 + 4 * (irq))
|
|
#define CLIC_INTIP(irq) (CLIC_CTRL(irq) + offsetof(union CLICCTRL, w.INTIP))
|
|
#define CLIC_INTIE(irq) (CLIC_CTRL(irq) + offsetof(union CLICCTRL, w.INTIE))
|
|
#define CLIC_INTATTR(irq) (CLIC_CTRL(irq) + offsetof(union CLICCTRL, w.INTATTR))
|
|
#define CLIC_INTCTRL(irq) (CLIC_CTRL(irq) + offsetof(union CLICCTRL, w.INTCTRL))
|
|
#else
|
|
/* Indirect CSR Access miselect offset */
|
|
#define CLIC_CFG (0x14A0)
|
|
#define CLIC_CTRL(irq) (0x0) /* Dummy value for driver compatibility */
|
|
#define CLIC_INTIP(irq) (0x1400 + (irq) / 32)
|
|
#define CLIC_INTIE(irq) (0x1400 + (irq) / 32)
|
|
#define CLIC_INTATTR(irq) (0x1000 + (irq) / 4)
|
|
#define CLIC_INTCTRL(irq) (0x1000 + (irq) / 4)
|
|
#endif /* !CONFIG_LEGACY_CLIC_MEMORYMAP_ACCESS */
|
|
|
|
/* Nuclei ECLIC memory mapped register offset */
|
|
#define CLIC_INFO (0x4)
|
|
#define CLIC_MTH (0x8)
|
|
|
|
/* CLIC register structure */
|
|
union CLICCFG {
|
|
struct {
|
|
#ifdef CONFIG_NUCLEI_ECLIC
|
|
uint32_t _reserved0: 1;
|
|
#endif /* CONFIG_NUCLEI_ECLIC */
|
|
/** number of interrupt level bits */
|
|
uint32_t nlbits: 4;
|
|
/** number of clicintattr[i].MODE bits */
|
|
uint32_t nmbits: 2;
|
|
uint32_t _reserved1: 25;
|
|
} w;
|
|
uint32_t qw;
|
|
};
|
|
|
|
union CLICINTIP {
|
|
struct {
|
|
/** Interrupt Pending */
|
|
uint8_t IP: 1;
|
|
uint8_t reserved0: 7;
|
|
} b;
|
|
uint8_t w;
|
|
};
|
|
|
|
union CLICINTIE {
|
|
struct {
|
|
/** Interrupt Enabled */
|
|
uint8_t IE: 1;
|
|
uint8_t reserved0: 7;
|
|
} b;
|
|
uint8_t w;
|
|
};
|
|
|
|
union CLICINTATTR {
|
|
struct {
|
|
/** 0: non-vectored 1:vectored */
|
|
uint8_t shv: 1;
|
|
/** 0: level 1: rising edge 2: falling edge */
|
|
uint8_t trg: 2;
|
|
uint8_t reserved0: 3;
|
|
uint8_t mode: 2;
|
|
} b;
|
|
uint8_t w;
|
|
};
|
|
|
|
union CLICCTRL {
|
|
struct {
|
|
volatile union CLICINTIP INTIP;
|
|
volatile union CLICINTIE INTIE;
|
|
volatile union CLICINTATTR INTATTR;
|
|
volatile uint8_t INTCTRL;
|
|
} w;
|
|
uint32_t qw;
|
|
};
|
|
|
|
/* Nuclei ECLIC register structure */
|
|
union CLICINFO {
|
|
struct {
|
|
/** number of max supported interrupts */
|
|
uint32_t numint: 13;
|
|
/** architecture version */
|
|
uint32_t version: 8;
|
|
/** supported bits in the clicintctl */
|
|
uint32_t intctlbits: 4;
|
|
uint32_t _reserved0: 7;
|
|
} b;
|
|
uint32_t qw;
|
|
};
|
|
|
|
union CLICMTH {
|
|
struct {
|
|
uint32_t reserved0: 24;
|
|
/** machine mode interrupt level threshold */
|
|
uint32_t mth: 8;
|
|
} b;
|
|
uint32_t qw;
|
|
};
|
|
|
|
#endif /*__ASSEMBLER__*/
|
|
|
|
#endif /* ZEPHYR_DRIVERS_INTERRUPT_CONTROLLER_INTC_CLIC_H_ */
|