Home | History | Annotate | Line # | Download | only in include
      1  1.1  skrll /*	$NetBSD: sbi.h,v 1.1 2023/05/07 12:41:48 skrll Exp $	*/
      2  1.1  skrll 
      3  1.1  skrll /*-
      4  1.1  skrll  * Copyright (c) 2023 The NetBSD Foundation, Inc.
      5  1.1  skrll  * All rights reserved.
      6  1.1  skrll  *
      7  1.1  skrll  * This code is derived from software contributed to The NetBSD Foundation
      8  1.1  skrll  * by Nick Hudson
      9  1.1  skrll  *
     10  1.1  skrll  * Redistribution and use in source and binary forms, with or without
     11  1.1  skrll  * modification, are permitted provided that the following conditions
     12  1.1  skrll  * are met:
     13  1.1  skrll  * 1. Redistributions of source code must retain the above copyright
     14  1.1  skrll  *    notice, this list of conditions and the following disclaimer.
     15  1.1  skrll  * 2. Redistributions in binary form must reproduce the above copyright
     16  1.1  skrll  *    notice, this list of conditions and the following disclaimer in the
     17  1.1  skrll  *    documentation and/or other materials provided with the distribution.
     18  1.1  skrll  *
     19  1.1  skrll  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20  1.1  skrll  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21  1.1  skrll  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22  1.1  skrll  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23  1.1  skrll  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24  1.1  skrll  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25  1.1  skrll  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26  1.1  skrll  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27  1.1  skrll  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28  1.1  skrll  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29  1.1  skrll  * POSSIBILITY OF SUCH DAMAGE.
     30  1.1  skrll  */
     31  1.1  skrll 
     32  1.1  skrll #ifndef _RISCV_SBI_H_
     33  1.1  skrll #define _RISCV_SBI_H_
     34  1.1  skrll 
     35  1.1  skrll #include <sys/types.h>
     36  1.1  skrll 
     37  1.1  skrll struct sbiret {
     38  1.1  skrll 	long error;
     39  1.1  skrll 	long value;
     40  1.1  skrll };
     41  1.1  skrll 
     42  1.1  skrll #define	SBI_SUCCESS			 0
     43  1.1  skrll #define	SBI_ERR_FAILED			-1
     44  1.1  skrll #define	SBI_ERR_NOT_SUPPORTED		-2
     45  1.1  skrll #define	SBI_ERR_INVALID_PARAM		-3
     46  1.1  skrll #define	SBI_ERR_DENIED			-4
     47  1.1  skrll #define	SBI_ERR_INVALID_ADDRESS		-5
     48  1.1  skrll #define	SBI_ERR_ALREADY_AVAILABLE	-6
     49  1.1  skrll #define	SBI_ERR_ALREADY_STARTED		-7
     50  1.1  skrll #define	SBI_ERR_ALREADY_STOPPED		-8
     51  1.1  skrll 
     52  1.1  skrll #define	SBI_EID_BASE		      0x10
     53  1.1  skrll #define	SBI_EID_TIMER		0x54494D45	// "TIME"
     54  1.1  skrll #define	SBI_EID_IPI		0x00735049	//  "sPI"
     55  1.1  skrll #define	SBI_EID_RFENCE		0x52464E43	// "RFNC"
     56  1.1  skrll #define	SBI_EID_HSM		0x0048534D	//  "HSM"
     57  1.1  skrll #define	SBI_EID_SRST		0x53525354	// "SRST"
     58  1.1  skrll #define	SBI_EID_PMU		0x00504D55	//  "PMU"
     59  1.1  skrll 
     60  1.1  skrll /*
     61  1.1  skrll | Function Name            | SBI Version | FID | EID
     62  1.1  skrll | sbi_get_sbi_spec_version | 0.2         |   0 | 0x10
     63  1.1  skrll | sbi_get_sbi_impl_id      | 0.2         |   1 | 0x10
     64  1.1  skrll | sbi_get_sbi_impl_version | 0.2         |   2 | 0x10
     65  1.1  skrll | sbi_probe_extension      | 0.2         |   3 | 0x10
     66  1.1  skrll | sbi_get_mvendorid        | 0.2         |   4 | 0x10
     67  1.1  skrll | sbi_get_marchid          | 0.2         |   5 | 0x10
     68  1.1  skrll | sbi_get_mimpid           | 0.2         |   6 | 0x10
     69  1.1  skrll */
     70  1.1  skrll 
     71  1.1  skrll #define SBI_FID_BASE_GETSPECVERSION	0
     72  1.1  skrll #define SBI_FID_BASE_GETIMPLID		1
     73  1.1  skrll #define SBI_FID_BASE_GETIMPLVERSION	2
     74  1.1  skrll #define SBI_FID_BASE_PROBEEXTENTION	3
     75  1.1  skrll #define SBI_FID_BASE_GETMVENDORID	4
     76  1.1  skrll #define SBI_FID_BASE_GETMARCHID		5
     77  1.1  skrll #define SBI_FID_BASE_GETMIMPID		6
     78  1.1  skrll 
     79  1.1  skrll struct sbiret sbi_get_spec_version(void);
     80  1.1  skrll struct sbiret sbi_get_impl_id(void);
     81  1.1  skrll struct sbiret sbi_get_impl_version(void);
     82  1.1  skrll struct sbiret sbi_probe_extension(long extension_id);
     83  1.1  skrll struct sbiret sbi_get_mvendorid(void);
     84  1.1  skrll struct sbiret sbi_get_marchid(void);
     85  1.1  skrll struct sbiret sbi_get_mimpid(void);
     86  1.1  skrll 
     87  1.1  skrll 
     88  1.1  skrll /*
     89  1.1  skrll | Implementation ID | Name
     90  1.1  skrll | 0                 | Berkeley Boot Loader (BBL)
     91  1.1  skrll | 1                 | OpenSBI
     92  1.1  skrll | 2                 | Xvisor
     93  1.1  skrll | 3                 | KVM
     94  1.1  skrll | 4                 | RustSBI
     95  1.1  skrll | 5                 | Diosix
     96  1.1  skrll */
     97  1.1  skrll 
     98  1.1  skrll #define	SBI_IMPLID_BERKELEY		0
     99  1.1  skrll #define	SBI_IMPLID_OPENSBI		1
    100  1.1  skrll #define	SBI_IMPLID_XVISOR		2
    101  1.1  skrll #define	SBI_IMPLID_KVM			3
    102  1.1  skrll #define	SBI_IMPLID_RUSTSBI		4
    103  1.1  skrll #define	SBI_IMPLID_DIOSIX		5
    104  1.1  skrll 
    105  1.1  skrll 
    106  1.1  skrll #define SBI_FID_TIMER_SET		0
    107  1.1  skrll struct sbiret sbi_set_timer(uint64_t stime_value);
    108  1.1  skrll 
    109  1.1  skrll #define SBI_FID_IPI_SEND		0
    110  1.1  skrll struct sbiret sbi_send_ipi(unsigned long hart_mask,
    111  1.1  skrll                            unsigned long hart_mask_base);
    112  1.1  skrll 
    113  1.1  skrll #define SBI_FID_RFENCE_FENCEI		0
    114  1.1  skrll #define SBI_FID_RFENCE_SFENCEVMA	1
    115  1.1  skrll #define	SBI_FID_RFENCE_SFENCEVMAASID	2
    116  1.1  skrll #define	SBI_FID_RFENCE_HFENCEGVMAVMID	3
    117  1.1  skrll #define	SBI_FID_RFENCE_HFENCEGVMA	4
    118  1.1  skrll #define	SBI_FID_RFENCE_HFENCEVVMAASID	5
    119  1.1  skrll #define	SBI_FID_RFENCE_HFENCEVVMA	6
    120  1.1  skrll 
    121  1.1  skrll 
    122  1.1  skrll struct sbiret sbi_remote_fence_i(unsigned long hart_mask,
    123  1.1  skrll                                  unsigned long hart_mask_base);
    124  1.1  skrll struct sbiret sbi_remote_sfence_vma(unsigned long hart_mask,
    125  1.1  skrll                                     unsigned long hart_mask_base,
    126  1.1  skrll                                     unsigned long start_addr,
    127  1.1  skrll                                     unsigned long size);
    128  1.1  skrll struct sbiret sbi_remote_sfence_vma_asid(unsigned long hart_mask,
    129  1.1  skrll                                          unsigned long hart_mask_base,
    130  1.1  skrll                                          unsigned long start_addr,
    131  1.1  skrll                                          unsigned long size,
    132  1.1  skrll                                          unsigned long asid);
    133  1.1  skrll struct sbiret sbi_remote_hfence_gvma_vmid(unsigned long hart_mask,
    134  1.1  skrll                                           unsigned long hart_mask_base,
    135  1.1  skrll                                           unsigned long start_addr,
    136  1.1  skrll                                           unsigned long size,
    137  1.1  skrll                                           unsigned long vmid);
    138  1.1  skrll struct sbiret sbi_remote_hfence_gvma(unsigned long hart_mask,
    139  1.1  skrll                                      unsigned long hart_mask_base,
    140  1.1  skrll                                      unsigned long start_addr,
    141  1.1  skrll                                      unsigned long size);
    142  1.1  skrll struct sbiret sbi_remote_hfence_vvma_asid(unsigned long hart_mask,
    143  1.1  skrll                                           unsigned long hart_mask_base,
    144  1.1  skrll                                           unsigned long start_addr,
    145  1.1  skrll                                           unsigned long size,
    146  1.1  skrll                                           unsigned long asid);
    147  1.1  skrll struct sbiret sbi_remote_hfence_vvma(unsigned long hart_mask,
    148  1.1  skrll                                      unsigned long hart_mask_base,
    149  1.1  skrll                                      unsigned long start_addr,
    150  1.1  skrll                                      unsigned long size);
    151  1.1  skrll 
    152  1.1  skrll #define	SBI_FID_HSM_START		0
    153  1.1  skrll #define	SBI_FID_HSM_STOP		1
    154  1.1  skrll #define	SBI_FID_HSM_GETSTATUS		2
    155  1.1  skrll #define	SBI_FID_HSM_SUSPEND		3
    156  1.1  skrll 
    157  1.1  skrll struct sbiret sbi_hart_start(unsigned long hartid,
    158  1.1  skrll                              unsigned long start_addr,
    159  1.1  skrll                              unsigned long opaque);
    160  1.1  skrll struct sbiret sbi_hart_stop(void);
    161  1.1  skrll struct sbiret sbi_hart_get_status(unsigned long hartid);
    162  1.1  skrll struct sbiret sbi_hart_suspend(uint32_t suspend_type,
    163  1.1  skrll                                unsigned long resume_addr,
    164  1.1  skrll                                unsigned long opaque);
    165  1.1  skrll 
    166  1.1  skrll #define SBI_HART_STARTED		0
    167  1.1  skrll #define SBI_HART_STOPPED		1
    168  1.1  skrll #define SBI_HART_STARTPENDING		2
    169  1.1  skrll #define SBI_HART_STOPPENDING		3
    170  1.1  skrll #define SBI_HART_SUSPENDED		4
    171  1.1  skrll #define SBI_HART_SUSPENDPENDING		5
    172  1.1  skrll #define SBI_HART_RESUMEPENDING		6
    173  1.1  skrll 
    174  1.1  skrll 
    175  1.1  skrll #define SBI_FID_SRST_SYSTEMRESET	0
    176  1.1  skrll struct sbiret sbi_system_reset(uint32_t reset_type, uint32_t reset_reason);
    177  1.1  skrll 
    178  1.1  skrll #define SBI_RESET_TYPE_SHUTDOWN		0
    179  1.1  skrll #define SBI_RESET_TYPE_COLDREBOOT	1
    180  1.1  skrll #define SBI_RESET_TYPE_WARNREBOOT	2
    181  1.1  skrll 
    182  1.1  skrll #define SBI_RESET_REASON_NONE		0
    183  1.1  skrll #define SBI_RESET_REASON_FAILURE	1
    184  1.1  skrll 
    185  1.1  skrll 
    186  1.1  skrll 
    187  1.1  skrll #define SBU_FID_PMU_GETCOUNTERS		0
    188  1.1  skrll #define SBU_FID_PMU_COUNTERDETAILS	1
    189  1.1  skrll #define SBU_FID_PMU_CONFIGCOUNTER	2
    190  1.1  skrll #define SBU_FID_PMU_STARTCOUNTERS	3
    191  1.1  skrll #define SBU_FID_PMU_STOPCOUNTERS	4
    192  1.1  skrll #define SBU_FID_PMU_READCOUNTER		5
    193  1.1  skrll 
    194  1.1  skrll #define	SBI_PMU_HW_NO_EVENT                 0	// Unused event because
    195  1.1  skrll 						// ...`event_idx` cannot be zero
    196  1.1  skrll #define	SBI_PMU_HW_CPU_CYCLES               1	// Event for each CPU cycle
    197  1.1  skrll #define	SBI_PMU_HW_INSTRUCTIONS             2	// Event for each completed
    198  1.1  skrll 						// ... instruction
    199  1.1  skrll #define	SBI_PMU_HW_CACHE_REFERENCES         3	// Event for cache hit
    200  1.1  skrll #define	SBI_PMU_HW_CACHE_MISSES             4	// Event for cache miss
    201  1.1  skrll #define	SBI_PMU_HW_BRANCH_INSTRUCTIONS      5	// Event for a branch instruction
    202  1.1  skrll #define	SBI_PMU_HW_BRANCH_MISSES            6	// Event for a branch misprediction
    203  1.1  skrll #define	SBI_PMU_HW_BUS_CYCLES               7	// Event for each BUS cycle
    204  1.1  skrll #define	SBI_PMU_HW_STALLED_CYCLES_FRONTEND  8	// Event for a stalled cycle in
    205  1.1  skrll 						// ... microarchitecture frontend
    206  1.1  skrll #define	SBI_PMU_HW_STALLED_CYCLES_BACKEND   9	// Event for a stalled cycle in
    207  1.1  skrll 						// ... microarchitecture backend
    208  1.1  skrll #define	SBI_PMU_HW_REF_CPU_CYCLES          10	// Event for each reference
    209  1.1  skrll 						// ... CPU cycle
    210  1.1  skrll 
    211  1.1  skrll #define	SBI_PMU_HW_CACHE_L1D   0		// Level1 data cache event
    212  1.1  skrll #define	SBI_PMU_HW_CACHE_L1I   1		// Level1 instruction cache event
    213  1.1  skrll #define	SBI_PMU_HW_CACHE_LL    2		// Last level cache event
    214  1.1  skrll #define	SBI_PMU_HW_CACHE_DTLB  3		// Data TLB event
    215  1.1  skrll #define	SBI_PMU_HW_CACHE_ITLB  4		// Instruction TLB event
    216  1.1  skrll #define	SBI_PMU_HW_CACHE_BPU   5		// Branch predictor unit event
    217  1.1  skrll #define	SBI_PMU_HW_CACHE_NODE  6		// NUMA node cache event
    218  1.1  skrll 
    219  1.1  skrll #define	SBI_PMU_HW_CACHE_OP_READ      0		// Read cache line
    220  1.1  skrll #define	SBI_PMU_HW_CACHE_OP_WRITE     1		// Write cache line
    221  1.1  skrll #define	SBI_PMU_HW_CACHE_OP_PREFETCH  2		// Prefetch cache line
    222  1.1  skrll 
    223  1.1  skrll #define	SBI_PMU_HW_CACHE_RESULT_ACCESS 0	// Cache access
    224  1.1  skrll #define	SBI_PMU_HW_CACHE_RESULT_MISS   1	// Cache miss
    225  1.1  skrll 
    226  1.1  skrll #define	SBI_PMU_FW_MISALIGNED_LOAD            0	// Misaligned load trap event
    227  1.1  skrll #define	SBI_PMU_FW_MISALIGNED_STORE           1	// Misaligned store trap event
    228  1.1  skrll #define	SBI_PMU_FW_ACCESS_LOAD                2	// Load access trap event
    229  1.1  skrll #define	SBI_PMU_FW_ACCESS_STORE               3	// Store access trap event
    230  1.1  skrll #define	SBI_PMU_FW_ILLEGAL_INSN               4	// Illegal instruction trap event
    231  1.1  skrll #define	SBI_PMU_FW_SET_TIMER                  5	// Set timer event
    232  1.1  skrll #define	SBI_PMU_FW_IPI_SENT                   6	// Sent IPI to other HART event
    233  1.1  skrll #define	SBI_PMU_FW_IPI_RECEIVED               7	// Received IPI from other
    234  1.1  skrll                                                 // ... HART event
    235  1.1  skrll #define	SBI_PMU_FW_FENCE_I_SENT               8	// Sent FENCE.I request to
    236  1.1  skrll                                                 // ... other HART event
    237  1.1  skrll #define	SBI_PMU_FW_FENCE_I_RECEIVED           9	// Received FENCE.I request
    238  1.1  skrll                                                 // ... from other HART event
    239  1.1  skrll #define	SBI_PMU_FW_SFENCE_VMA_SENT           10	// Sent SFENCE.VMA request
    240  1.1  skrll                                                 // ... to other HART event
    241  1.1  skrll #define	SBI_PMU_FW_SFENCE_VMA_RECEIVED       11	// Received SFENCE.VMA request
    242  1.1  skrll                                                 // ... from other HART event
    243  1.1  skrll #define	SBI_PMU_FW_SFENCE_VMA_ASID_SENT      12	// Sent SFENCE.VMA with ASID
    244  1.1  skrll                                                 // ... request to other HART event
    245  1.1  skrll #define	SBI_PMU_FW_SFENCE_VMA_ASID_RECEIVED  13	// Received SFENCE.VMA with ASID
    246  1.1  skrll                                                 // ... request from other HART event
    247  1.1  skrll #define	SBI_PMU_FW_HFENCE_GVMA_SENT          14	// Sent HFENCE.GVMA request to
    248  1.1  skrll                                                 // ... other HART event
    249  1.1  skrll #define	SBI_PMU_FW_HFENCE_GVMA_RECEIVED      15	// Received HFENCE.GVMA request
    250  1.1  skrll                                                 // ... from other HART event
    251  1.1  skrll #define	SBI_PMU_FW_HFENCE_GVMA_VMID_SENT     16	// Sent HFENCE.GVMA with VMID
    252  1.1  skrll                                                 // ... request to other HART event
    253  1.1  skrll #define	SBI_PMU_FW_HFENCE_GVMA_VMID_RECEIVED 17	// Received HFENCE.GVMA with VMID
    254  1.1  skrll                                                 // ... request from other HART event
    255  1.1  skrll #define	SBI_PMU_FW_HFENCE_VVMA_SENT          18	// Sent HFENCE.VVMA request to
    256  1.1  skrll                                                 // ... other HART event
    257  1.1  skrll #define	SBI_PMU_FW_HFENCE_VVMA_RECEIVED      19	// Received HFENCE.VVMA request
    258  1.1  skrll                                                 // ... from other HART event
    259  1.1  skrll #define	SBI_PMU_FW_HFENCE_VVMA_ASID_SENT     20	// Sent HFENCE.VVMA with ASID
    260  1.1  skrll                                                 // ... request to other HART event
    261  1.1  skrll #define	SBI_PMU_FW_HFENCE_VVMA_ASID_RECEIVED 21	// Received HFENCE.VVMA with ASID
    262  1.1  skrll                                                 // ... request from other HART event
    263  1.1  skrll 
    264  1.1  skrll 
    265  1.1  skrll struct sbiret sbi_pmu_num_counters(void);
    266  1.1  skrll struct sbiret sbi_pmu_counter_get_info(unsigned long counter_idx);
    267  1.1  skrll 
    268  1.1  skrll struct sbiret sbi_pmu_counter_config_matching(unsigned long counter_idx_base,
    269  1.1  skrll 					      unsigned long counter_idx_mask,
    270  1.1  skrll 					      unsigned long config_flags,
    271  1.1  skrll 					      unsigned long event_idx,
    272  1.1  skrll 					      uint64_t event_data);
    273  1.1  skrll struct sbiret sbi_pmu_counter_start(unsigned long counter_idx_base,
    274  1.1  skrll 				    unsigned long counter_idx_mask,
    275  1.1  skrll 				    unsigned long start_flags,
    276  1.1  skrll 				    uint64_t initial_value);
    277  1.1  skrll struct sbiret sbi_pmu_counter_stop(unsigned long counter_idx_base,
    278  1.1  skrll 				    unsigned long counter_idx_mask,
    279  1.1  skrll 				    unsigned long stop_flags);
    280  1.1  skrll struct sbiret sbi_pmu_counter_fw_read(unsigned long counter_idx);
    281  1.1  skrll 
    282  1.1  skrll 
    283  1.1  skrll 
    284  1.1  skrll static inline struct sbiret
    285  1.1  skrll sbi_call(int eid, int fid,
    286  1.1  skrll     unsigned long arg0, unsigned long arg1, unsigned long arg2,
    287  1.1  skrll     unsigned long arg3, unsigned long arg4, unsigned long arg5)
    288  1.1  skrll {
    289  1.1  skrll 	struct sbiret ret;
    290  1.1  skrll 
    291  1.1  skrll 	register register_t _a7 __asm ("a7") = eid;
    292  1.1  skrll 	register register_t _a6 __asm ("a6") = fid;
    293  1.1  skrll 
    294  1.1  skrll 	register register_t _a0 __asm ("a0") = arg0;
    295  1.1  skrll 	register register_t _a1 __asm ("a1") = arg1;
    296  1.1  skrll 	register register_t _a2 __asm ("a2") = arg2;
    297  1.1  skrll 	register register_t _a3 __asm ("a3") = arg3;
    298  1.1  skrll 	register register_t _a4 __asm ("a4") = arg4;
    299  1.1  skrll 	register register_t _a5 __asm ("a5") = arg5;
    300  1.1  skrll 
    301  1.1  skrll 	__asm __volatile (
    302  1.1  skrll 		"ecall"
    303  1.1  skrll 		: "+r" (_a0), "+r" (_a1)
    304  1.1  skrll 		: "r" (_a2), "r" (_a3), "r" (_a4), "r" (_a5), "r" (_a6), "r" (_a7)
    305  1.1  skrll 		: "memory");
    306  1.1  skrll 	ret.error = _a0;
    307  1.1  skrll 	ret.value = _a1;
    308  1.1  skrll 
    309  1.1  skrll 	return ret;
    310  1.1  skrll }
    311  1.1  skrll 
    312  1.1  skrll 
    313  1.1  skrll #define SBI_CALL0(eid, fid)                         sbi_call(eid, fid,  0,  0,  0,  0,  0,   0)
    314  1.1  skrll #define SBI_CALL1(eid, fid, a0)                     sbi_call(eid, fid, a0,  0,  0,  0,  0,   0)
    315  1.1  skrll #define SBI_CALL2(eid, fid, a0, a1)                 sbi_call(eid, fid, a0, a1,  0,  0,  0,   0)
    316  1.1  skrll #define SBI_CALL3(eid, fid, a0, a1, a2)             sbi_call(eid, fid, a0, a1, a2,  0,  0,   0)
    317  1.1  skrll #define SBI_CALL4(eid, fid, a0, a1, a2, a3)         sbi_call(eid, fid, a0, a1, a2, a3,  0,   0)
    318  1.1  skrll #define SBI_CALL5(eid, fid, a0, a1, a2, a3, a4)     sbi_call(eid, fid, a0, a1, a2, a3, a4,   0)
    319  1.1  skrll #define SBI_CALL6(eid, fid, a0, a1, a2, a3, a4, a5) sbi_call(eid, fid, a0, a1, a2, a3, a4,  a5)
    320  1.1  skrll 
    321  1.1  skrll 
    322  1.1  skrll 
    323  1.1  skrll #if defined(__RVSBI_LEGACY)
    324  1.1  skrll 
    325  1.1  skrll #define SBI_LEGACY_SET_TIMER              0
    326  1.1  skrll #define SBI_LEGACY_CONSOLE_PUTCHAR        1
    327  1.1  skrll #define SBI_LEGACY_CONSOLE_GETCHAR        2
    328  1.1  skrll #define SBI_LEGACY_CLEAR_IPI              3
    329  1.1  skrll #define SBI_LEGACY_SEND_IPI               4
    330  1.1  skrll #define SBI_LEGACY_REMOTE_FENCE_I         5
    331  1.1  skrll #define SBI_LEGACY_REMOTE_SFENCE_VMA      6
    332  1.1  skrll #define SBI_LEGACY_REMOTE_SFENCE_VMA_ASID 7
    333  1.1  skrll #define SBI_LEGACY_SHUTDOWN               8
    334  1.1  skrll 
    335  1.1  skrll #define SBI_LEGACY_CALL0(eid)                         sbi_call(eid, 0,  0,  0,  0,  0,  0,  0)
    336  1.1  skrll #define SBI_LEGACY_CALL1(eid, a0)                     sbi_call(eid, 0, a0,  0,  0,  0,  0,  0)
    337  1.1  skrll #define SBI_LEGACY_CALL2(eid, a0, a1)                 sbi_call(eid, 0, a0, a1,  0,  0,  0,  0)
    338  1.1  skrll #define SBI_LEGACY_CALL3(eid, a0, a1, a2)             sbi_call(eid, 0, a0, a1, a2,  0,  0,  0)
    339  1.1  skrll #define SBI_LEGACY_CALL4(eid, a0, a1, a2, a3)         sbi_call(eid, 0, a0, a1, a2, a3,  0,  0)
    340  1.1  skrll #define SBI_LEGACY_CALL5(eid, a0, a1, a2, a3, a4)     sbi_call(eid, 0, a0, a1, a2, a3, a4,  0)
    341  1.1  skrll 
    342  1.1  skrll 
    343  1.1  skrll /*
    344  1.1  skrll  * void sbi_set_timer(uint64_t stime_value)
    345  1.1  skrll  */
    346  1.1  skrll 
    347  1.1  skrll static inline long
    348  1.1  skrll sbi_legacy_set_timer(uint64_t stime_value)
    349  1.1  skrll {
    350  1.1  skrll #ifdef _LP64
    351  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_SET_TIMER, stime_value);
    352  1.1  skrll #else
    353  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL2(SBI_LEGACY_SET_TIMER,
    354  1.1  skrll 	    stime_value, stime_value >> 32);
    355  1.1  skrll #endif
    356  1.1  skrll 	return ret.error;
    357  1.1  skrll }
    358  1.1  skrll 
    359  1.1  skrll /*
    360  1.1  skrll  * void sbi_console_putchar(int ch)
    361  1.1  skrll  */
    362  1.1  skrll 
    363  1.1  skrll static inline long
    364  1.1  skrll sbi_legacy_console_putchar(int c) {
    365  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_CONSOLE_PUTCHAR, c);
    366  1.1  skrll 
    367  1.1  skrll 	return ret.error;
    368  1.1  skrll }
    369  1.1  skrll 
    370  1.1  skrll /*
    371  1.1  skrll  * long sbi_console_getchar(void)
    372  1.1  skrll  */
    373  1.1  skrll static inline long
    374  1.1  skrll sbi_legacy_console_getchar(void) {
    375  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL0(SBI_LEGACY_CONSOLE_GETCHAR);
    376  1.1  skrll 
    377  1.1  skrll 	return ret.error;
    378  1.1  skrll }
    379  1.1  skrll 
    380  1.1  skrll /*
    381  1.1  skrll  * long sbi_clear_ipi(void)
    382  1.1  skrll  */
    383  1.1  skrll static inline long
    384  1.1  skrll sbi_legacy_clear_ipi(void) {
    385  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL0(SBI_LEGACY_CLEAR_IPI);
    386  1.1  skrll 
    387  1.1  skrll 	return ret.error;
    388  1.1  skrll }
    389  1.1  skrll 
    390  1.1  skrll 
    391  1.1  skrll /*
    392  1.1  skrll  * hart_mask is a virtual address that points to a bit-vector of harts. The
    393  1.1  skrll  * bit vector is represented as a sequence of unsigned longs whose length
    394  1.1  skrll  * equals the number of harts in the system divided by the number of bits
    395  1.1  skrll  * in an unsigned long, rounded up to the next integer.
    396  1.1  skrll */
    397  1.1  skrll 
    398  1.1  skrll /*
    399  1.1  skrll  * void sbi_send_ipi(const unsigned long *hart_mask)
    400  1.1  skrll  */
    401  1.1  skrll static inline long
    402  1.1  skrll sbi_legacy_send_ipi(const unsigned long *hart_mask) {
    403  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_SEND_IPI,
    404  1.1  skrll 	    (unsigned long)hart_mask);
    405  1.1  skrll 
    406  1.1  skrll 	return ret.error;
    407  1.1  skrll }
    408  1.1  skrll 
    409  1.1  skrll /*
    410  1.1  skrll  * long sbi_remote_fence_i(const unsigned long *hart_mask)
    411  1.1  skrll  */
    412  1.1  skrll static inline long
    413  1.1  skrll sbi_legacy_remote_fence_i(const unsigned long *hart_mask) {
    414  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL1(SBI_LEGACY_REMOTE_FENCE_I,
    415  1.1  skrll 	    (unsigned long)hart_mask);
    416  1.1  skrll 
    417  1.1  skrll 	return ret.error;
    418  1.1  skrll }
    419  1.1  skrll 
    420  1.1  skrll /*
    421  1.1  skrll  * long sbi_remote_sfence_vma(const unsigned long *hart_mask,
    422  1.1  skrll  *                            unsigned long start,
    423  1.1  skrll  *                            unsigned long size)
    424  1.1  skrll  */
    425  1.1  skrll static inline long
    426  1.1  skrll sbi_legacy_remote_sfence_vma(const unsigned long *hart_mask,
    427  1.1  skrll     unsigned long start, unsigned long size)
    428  1.1  skrll {
    429  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL3(SBI_LEGACY_REMOTE_SFENCE_VMA,
    430  1.1  skrll 	    (unsigned long)hart_mask, start, size);
    431  1.1  skrll 
    432  1.1  skrll 	return ret.error;
    433  1.1  skrll }
    434  1.1  skrll 
    435  1.1  skrll /*
    436  1.1  skrll  * long sbi_remote_sfence_vma_asid(const unsigned long *hart_mask,
    437  1.1  skrll  *                                 unsigned long start,
    438  1.1  skrll  *                                 unsigned long size,
    439  1.1  skrll  *                                 unsigned long asid)
    440  1.1  skrll  */
    441  1.1  skrll static inline long
    442  1.1  skrll sbi_legacy_remote_sfence_vma_asid(const unsigned long *hart_mask,
    443  1.1  skrll     unsigned long start, unsigned long size, unsigned long asid)
    444  1.1  skrll {
    445  1.1  skrll 	struct sbiret ret = SBI_LEGACY_CALL4(SBI_LEGACY_REMOTE_SFENCE_VMA_ASID,
    446  1.1  skrll 	    (unsigned long)hart_mask, start, size, asid);
    447  1.1  skrll 
    448  1.1  skrll 	return ret.error;
    449  1.1  skrll }
    450  1.1  skrll 
    451  1.1  skrll /*
    452  1.1  skrll  * void sbi_shutdown(void)
    453  1.1  skrll  */
    454  1.1  skrll static inline void
    455  1.1  skrll sbi_legacy_shutdown(void) {
    456  1.1  skrll 	SBI_LEGACY_CALL0(SBI_LEGACY_SHUTDOWN);
    457  1.1  skrll }
    458  1.1  skrll 
    459  1.1  skrll #endif
    460  1.1  skrll 
    461  1.1  skrll 
    462  1.1  skrll #endif /* _RISCV_SBI_H_ */
    463