1 /* 2 * Copyright (c) 2006-2021, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2021-05-20 bigmagic first version 9 * 2021-10-20 bernard fix s-mode issue 10 */ 11 12 #ifndef __PLIC_H__ 13 #define __PLIC_H__ 14 15 #include <rtconfig.h> 16 #include <rthw.h> 17 18 #define PLIC_PRIORITY_BASE 0x0 19 #define PLIC_PENDING_BASE 0x1000 20 #define PLIC_ENABLE_BASE 0x2000 21 #define PLIC_CONTEXT_BASE 0x200000 22 23 extern size_t plic_base; 24 25 #define VIRT_PLIC_BASE (plic_base) 26 27 #define PLIC_PRIORITY_OFFSET (0x0) 28 #define PLIC_PENDING_OFFSET (0x1000) 29 30 #define PLIC_ENABLE_STRIDE 0x80 31 #define PLIC_CONTEXT_STRIDE 0x1000 32 33 /* RT-Thread runs in S-mode on virt64 by default */ 34 #define RISCV_VIRT64_S_MODE 35 36 #ifndef RISCV_VIRT64_S_MODE 37 #define PLIC_MENABLE_OFFSET (0x2000) 38 #define PLIC_MTHRESHOLD_OFFSET (0x200000) 39 #define PLIC_MCLAIM_OFFSET (0x200004) 40 #define PLIC_MCOMPLETE_OFFSET (0x200004) 41 42 #define PLIC_ENABLE(hart) (VIRT_PLIC_BASE + PLIC_MENABLE_OFFSET + (hart * 2) * PLIC_ENABLE_STRIDE) 43 #define PLIC_THRESHOLD(hart) (VIRT_PLIC_BASE + PLIC_MTHRESHOLD_OFFSET + (hart * 2) * PLIC_CONTEXT_STRIDE) 44 #define PLIC_CLAIM(hart) (VIRT_PLIC_BASE + PLIC_MCLAIM_OFFSET + (hart * 2) * PLIC_CONTEXT_STRIDE) 45 #define PLIC_COMPLETE(hart) (VIRT_PLIC_BASE + PLIC_MCOMPLETE_OFFSET + (hart * 2) * PLIC_CONTEXT_STRIDE) 46 47 #else 48 #define PLIC_SENABLE_OFFSET (0x2000 + PLIC_ENABLE_STRIDE) 49 #define PLIC_STHRESHOLD_OFFSET (0x200000 + PLIC_CONTEXT_STRIDE) 50 #define PLIC_SCLAIM_OFFSET (0x200004 + PLIC_CONTEXT_STRIDE) 51 #define PLIC_SCOMPLETE_OFFSET (0x200004 + PLIC_CONTEXT_STRIDE) 52 53 #define PLIC_ENABLE(hart) (VIRT_PLIC_BASE + PLIC_SENABLE_OFFSET + (hart * 2) * PLIC_ENABLE_STRIDE) 54 #define PLIC_THRESHOLD(hart) (VIRT_PLIC_BASE + PLIC_STHRESHOLD_OFFSET + (hart * 2) * PLIC_CONTEXT_STRIDE) 55 #define PLIC_CLAIM(hart) (VIRT_PLIC_BASE + PLIC_SCLAIM_OFFSET + (hart * 2) * PLIC_CONTEXT_STRIDE) 56 #define PLIC_COMPLETE(hart) (VIRT_PLIC_BASE + PLIC_SCOMPLETE_OFFSET + (hart * 2) * PLIC_CONTEXT_STRIDE) 57 #endif 58 59 #define PLIC_PRIORITY(id) (VIRT_PLIC_BASE + PLIC_PRIORITY_OFFSET + (id) * 4) 60 #define PLIC_PENDING(id) (VIRT_PLIC_BASE + PLIC_PENDING_OFFSET + ((id) / 32)) 61 62 #define WORD_CNT_BYTE (1024 / 8) 63 64 /* IRQ config in system, max 1024 (from 0 to 1023) */ 65 #define CONFIG_IRQ_NR (128) 66 #define CONFIG_IRQ_WORD (CONFIG_IRQ_NR / 32) 67 68 void plic_set_priority(int irq, int priority); 69 void plic_irq_enable(int irq); 70 void plic_irq_disable(int irq); 71 void plic_set_threshold(int mthreshold); 72 int plic_claim(void); 73 void plic_complete(int irq); 74 75 void plic_set_thresh(rt_uint32_t val); 76 void plic_set_ie(rt_uint32_t word_index,rt_uint32_t val); 77 void plic_init(); 78 void plic_handle_irq(void); 79 80 #endif 81