|  | @@ -3,6 +3,8 @@
 | 
	
		
			
				|  |  |  Kendryte K210 is a dual-core RISC-V RV64GC chip with hardware accelerated AI peripheral.
 | 
	
		
			
				|  |  |  According to its manual, K210 is taped out in TSMC 7nm and can speed up to 400MHz.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +## Implementation details
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  The K210 SoC implements version 1.9.1 of RISC-V's privileged specification.
 | 
	
		
			
				|  |  |  This version differents from latest version (by current version 1.11) in the following aspects:
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -20,3 +22,39 @@ Machine external handler and timer set calls is modified to meet the requirement
 | 
	
		
			
				|  |  |  interrupt handlers.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  If there are mistakes or missing features in current support module, we welcome further contributions!
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +## Private SBI functions
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +To solve the issue 3 in previous section, RustSBI's current implementation includes a RustSBI specific
 | 
	
		
			
				|  |  | +SBI call as a function. 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The K210 supervisor-level external interrupt handler register function is declared as:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +```rust
 | 
	
		
			
				|  |  | +fn sbi_rustsbi_k210_sext(phys_addr: usize) -> SbiRet;
 | 
	
		
			
				|  |  | +```
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This function registers a device interrupt handler to machine level environment. 
 | 
	
		
			
				|  |  | +On any machine-level external interrupt, the RustSBI's K210 environment would call the function provided.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The function's physical address shall be stored in register `a0` before calling this function.
 | 
	
		
			
				|  |  | +RustSBI will regard `a0` as a function wiout any parameters and any return values, or a `phys_addr: fn()`.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This function will always return `SbiRet` value of `SBI_SUCCESS`.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +### Function Listing
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +According to RISC-V SBI specification:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +> Firmware Code Base Specific SBI Extension Space, Extension Ids 0x0A000000 through 0x0AFFFFFF
 | 
	
		
			
				|  |  | +> 
 | 
	
		
			
				|  |  | +> Low bits is SBI implementation ID. The firmware code base SBI extension is the additional SBI extensions to SBI
 | 
	
		
			
				|  |  | +> implementation. That provides the firmware code base specific SBI functions which are defined in the external
 | 
	
		
			
				|  |  | +> firmware specification.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Since RustSBI has the implementation ID 4, its specific SBI extension is `0x0A000004`. We add a function
 | 
	
		
			
				|  |  | +to this specific SBI extension.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +| Function Name | Function ID | Extension ID |
 | 
	
		
			
				|  |  | +|:-----|:----|:----|
 | 
	
		
			
				|  |  | +| sbi_rustsbi_k210_sext | 0x210 | 0x0A000004 |
 |