forked from Mirrors/opensbi
		
	include: sbi_platform: Introduce HART index to HART id table
A platform can have discontinuous and/or sparse HART ids so we cannot always assume a set of HARTs with continuous HART ids. This patch adds support for discontinuous and sparse HART ids by introducing HART index to HART id table. This table has platform hart_count entries and it maps HART index to HART id. The HART index to HART id table has only two restrictions: 1. HART index < sbi_platform hart_count 2. HART id < SBI_HARTMASK_MAX_BITS Example1: Let's say we have a platform with 2 HART ids 11 and 22, for such a a platform: hart_count = 2 hart_index2id[0] = 11 hart_index2id[1] = 22 Example2: Let's say we have a platform with 5 HARTs ids 0, 1, 2, 3, and 4 but out of these HART with id 0 is not usable so for such a platform: hart_count = 5 hart_index2id[0] = -1U hart_index2id[1] = 1 hart_index2id[2] = 2 hart_index2id[3] = 3 hart_index2id[4] = 4 OR hart_count = 4 hart_index2id[0] = 1 hart_index2id[1] = 2 hart_index2id[2] = 3 hart_index2id[3] = 4 With HART index to HART id table in place, the hart_disabled() callback is now redundant so we remove it as well. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
		@@ -351,6 +351,7 @@ _start_warm:
 | 
			
		||||
	csrw	CSR_MIE, zero
 | 
			
		||||
	csrw	CSR_MIP, zero
 | 
			
		||||
 | 
			
		||||
	/* Find HART count and HART stack size */
 | 
			
		||||
	la	a4, platform
 | 
			
		||||
#if __riscv_xlen == 64
 | 
			
		||||
	lwu	s7, SBI_PLATFORM_HART_COUNT_OFFSET(a4)
 | 
			
		||||
@@ -359,12 +360,29 @@ _start_warm:
 | 
			
		||||
	lw	s7, SBI_PLATFORM_HART_COUNT_OFFSET(a4)
 | 
			
		||||
	lw	s8, SBI_PLATFORM_HART_STACK_SIZE_OFFSET(a4)
 | 
			
		||||
#endif
 | 
			
		||||
	REG_L	s9, SBI_PLATFORM_HART_INDEX2ID_OFFSET(a4)
 | 
			
		||||
 | 
			
		||||
	/* HART ID should be within expected limit */
 | 
			
		||||
	/* Find HART id */
 | 
			
		||||
	csrr	s6, CSR_MHARTID
 | 
			
		||||
	bge	s6, s7, _start_hang
 | 
			
		||||
 | 
			
		||||
	/* find the scratch space for this hart */
 | 
			
		||||
	/* Find HART index */
 | 
			
		||||
	beqz	s9, 3f
 | 
			
		||||
	li	a4, 0
 | 
			
		||||
1:
 | 
			
		||||
#if __riscv_xlen == 64
 | 
			
		||||
	lwu	a5, (s9)
 | 
			
		||||
#else
 | 
			
		||||
	lw	a5, (s9)
 | 
			
		||||
#endif
 | 
			
		||||
	beq	a5, s6, 2f
 | 
			
		||||
	add	s9, s9, 4
 | 
			
		||||
	add	a4, a4, 1
 | 
			
		||||
	blt	a4, s7, 1b
 | 
			
		||||
	li	a4, -1
 | 
			
		||||
2:	add	s6, a4, zero
 | 
			
		||||
3:	bge	s6, s7, _start_hang
 | 
			
		||||
 | 
			
		||||
	/* Find the scratch space based on HART index */
 | 
			
		||||
	la	tp, _fw_end
 | 
			
		||||
	mul	a5, s7, s8
 | 
			
		||||
	add	tp, tp, a5
 | 
			
		||||
@@ -411,6 +429,7 @@ _link_end:
 | 
			
		||||
_hartid_to_scratch:
 | 
			
		||||
	/*
 | 
			
		||||
	 * a0 -> HART ID (passed by caller)
 | 
			
		||||
	 * a1 -> HART Index (passed by caller)
 | 
			
		||||
	 * t0 -> HART Stack Size
 | 
			
		||||
	 * t1 -> HART Stack End
 | 
			
		||||
	 * t2 -> Temporary
 | 
			
		||||
@@ -423,7 +442,7 @@ _hartid_to_scratch:
 | 
			
		||||
	lw	t0, SBI_PLATFORM_HART_STACK_SIZE_OFFSET(t2)
 | 
			
		||||
	lw	t2, SBI_PLATFORM_HART_COUNT_OFFSET(t2)
 | 
			
		||||
#endif
 | 
			
		||||
	sub	t2, t2, a0
 | 
			
		||||
	sub	t2, t2, a1
 | 
			
		||||
	mul	t2, t2, t0
 | 
			
		||||
	la	t1, _fw_end
 | 
			
		||||
	add	t1, t1, t2
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user