diff options
| author | Tom Rini <trini@konsulko.com> | 2020-07-06 15:46:38 -0400 | 
|---|---|---|
| committer | Tom Rini <trini@konsulko.com> | 2020-07-06 15:46:38 -0400 | 
| commit | 6e7d7aa2e2062995c1cbc3af81cf40c04c50ad30 (patch) | |
| tree | 3c560d567a76e9850e0195fb892d7e1fbaeed198 /arch/riscv/lib | |
| parent | 2f5fbb5b39f7b67044dda5c35e4a4b31685a3109 (diff) | |
| parent | 621e09cb3bf7e6d4fce9dd5e6de97e057adebc3a (diff) | |
Merge branch 'next'
Merge all outstanding changes from the current next branch in now that
we have released.
Diffstat (limited to 'arch/riscv/lib')
| -rw-r--r-- | arch/riscv/lib/andes_plic.c | 34 | ||||
| -rw-r--r-- | arch/riscv/lib/reset.c | 2 | ||||
| -rw-r--r-- | arch/riscv/lib/sbi_ipi.c | 5 | ||||
| -rw-r--r-- | arch/riscv/lib/sifive_clint.c | 33 | ||||
| -rw-r--r-- | arch/riscv/lib/smp.c | 49 | 
5 files changed, 37 insertions, 86 deletions
| diff --git a/arch/riscv/lib/andes_plic.c b/arch/riscv/lib/andes_plic.c index 20529ab3eb5..5cf29df670c 100644 --- a/arch/riscv/lib/andes_plic.c +++ b/arch/riscv/lib/andes_plic.c @@ -30,20 +30,6 @@  #define SEND_IPI_TO_HART(hart)  (0x80 >> (hart))  DECLARE_GLOBAL_DATA_PTR; -static int init_plic(void); - -#define PLIC_BASE_GET(void)						\ -	do {								\ -		long *ret;						\ -									\ -		if (!gd->arch.plic) {					\ -			ret = syscon_get_first_range(RISCV_SYSCON_PLIC); \ -			if (IS_ERR(ret))				\ -				return PTR_ERR(ret);			\ -			gd->arch.plic = ret;				\ -			init_plic();					\ -		}							\ -	} while (0)  static int enable_ipi(int hart)  { @@ -93,13 +79,21 @@ static int init_plic(void)  	return -ENODEV;  } -int riscv_send_ipi(int hart) +int riscv_init_ipi(void)  { -	unsigned int ipi; +	long *ret = syscon_get_first_range(RISCV_SYSCON_PLIC); + +	if (IS_ERR(ret)) +		return PTR_ERR(ret); +	gd->arch.plic = ret; + +	return init_plic(); +} -	PLIC_BASE_GET(); +int riscv_send_ipi(int hart) +{ +	unsigned int ipi = (SEND_IPI_TO_HART(hart) << (8 * gd->arch.boot_hart)); -	ipi = (SEND_IPI_TO_HART(hart) << (8 * gd->arch.boot_hart));  	writel(ipi, (void __iomem *)PENDING_REG(gd->arch.plic,  				gd->arch.boot_hart)); @@ -110,8 +104,6 @@ int riscv_clear_ipi(int hart)  {  	u32 source_id; -	PLIC_BASE_GET(); -  	source_id = readl((void __iomem *)CLAIM_REG(gd->arch.plic, hart));  	writel(source_id, (void __iomem *)CLAIM_REG(gd->arch.plic, hart)); @@ -120,8 +112,6 @@ int riscv_clear_ipi(int hart)  int riscv_get_ipi(int hart, int *pending)  { -	PLIC_BASE_GET(); -  	*pending = readl((void __iomem *)PENDING_REG(gd->arch.plic,  						     gd->arch.boot_hart));  	*pending = !!(*pending & SEND_IPI_TO_HART(hart)); diff --git a/arch/riscv/lib/reset.c b/arch/riscv/lib/reset.c index 8779c619cc5..6008bbe78e7 100644 --- a/arch/riscv/lib/reset.c +++ b/arch/riscv/lib/reset.c @@ -7,6 +7,7 @@  #include <command.h>  #include <hang.h> +#ifndef CONFIG_SYSRESET  int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])  {  	printf("resetting ...\n"); @@ -16,3 +17,4 @@ int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])  	return 0;  } +#endif diff --git a/arch/riscv/lib/sbi_ipi.c b/arch/riscv/lib/sbi_ipi.c index abafca9e5c1..d02e2b4c488 100644 --- a/arch/riscv/lib/sbi_ipi.c +++ b/arch/riscv/lib/sbi_ipi.c @@ -8,6 +8,11 @@  #include <asm/encoding.h>  #include <asm/sbi.h> +int riscv_init_ipi(void) +{ +	return 0; +} +  int riscv_send_ipi(int hart)  {  	ulong mask; diff --git a/arch/riscv/lib/sifive_clint.c b/arch/riscv/lib/sifive_clint.c index 5e0d25720bd..78fc6c868dd 100644 --- a/arch/riscv/lib/sifive_clint.c +++ b/arch/riscv/lib/sifive_clint.c @@ -24,22 +24,8 @@  DECLARE_GLOBAL_DATA_PTR; -#define CLINT_BASE_GET(void)						\ -	do {								\ -		long *ret;						\ -									\ -		if (!gd->arch.clint) {					\ -			ret = syscon_get_first_range(RISCV_SYSCON_CLINT); \ -			if (IS_ERR(ret))				\ -				return PTR_ERR(ret);			\ -			gd->arch.clint = ret;				\ -		}							\ -	} while (0) -  int riscv_get_time(u64 *time)  { -	CLINT_BASE_GET(); -  	*time = readq((void __iomem *)MTIME_REG(gd->arch.clint));  	return 0; @@ -47,17 +33,24 @@ int riscv_get_time(u64 *time)  int riscv_set_timecmp(int hart, u64 cmp)  { -	CLINT_BASE_GET(); -  	writeq(cmp, (void __iomem *)MTIMECMP_REG(gd->arch.clint, hart));  	return 0;  } -int riscv_send_ipi(int hart) +int riscv_init_ipi(void)  { -	CLINT_BASE_GET(); +	long *ret = syscon_get_first_range(RISCV_SYSCON_CLINT); + +	if (IS_ERR(ret)) +		return PTR_ERR(ret); +	gd->arch.clint = ret; + +	return 0; +} +int riscv_send_ipi(int hart) +{  	writel(1, (void __iomem *)MSIP_REG(gd->arch.clint, hart));  	return 0; @@ -65,8 +58,6 @@ int riscv_send_ipi(int hart)  int riscv_clear_ipi(int hart)  { -	CLINT_BASE_GET(); -  	writel(0, (void __iomem *)MSIP_REG(gd->arch.clint, hart));  	return 0; @@ -74,8 +65,6 @@ int riscv_clear_ipi(int hart)  int riscv_get_ipi(int hart, int *pending)  { -	CLINT_BASE_GET(); -  	*pending = readl((void __iomem *)MSIP_REG(gd->arch.clint, hart));  	return 0; diff --git a/arch/riscv/lib/smp.c b/arch/riscv/lib/smp.c index 17adb35730d..ac22136314f 100644 --- a/arch/riscv/lib/smp.c +++ b/arch/riscv/lib/smp.c @@ -12,38 +12,6 @@  DECLARE_GLOBAL_DATA_PTR; -/** - * riscv_send_ipi() - Send inter-processor interrupt (IPI) - * - * Platform code must provide this function. - * - * @hart: Hart ID of receiving hart - * @return 0 if OK, -ve on error - */ -extern int riscv_send_ipi(int hart); - -/** - * riscv_clear_ipi() - Clear inter-processor interrupt (IPI) - * - * Platform code must provide this function. - * - * @hart: Hart ID of hart to be cleared - * @return 0 if OK, -ve on error - */ -extern int riscv_clear_ipi(int hart); - -/** - * riscv_get_ipi() - Get status of inter-processor interrupt (IPI) - * - * Platform code must provide this function. - * - * @hart: Hart ID of hart to be checked - * @pending: Pointer to variable with result of the check, - *           1 if IPI is pending, 0 otherwise - * @return 0 if OK, -ve on error - */ -extern int riscv_get_ipi(int hart, int *pending); -  static int send_ipi_many(struct ipi_data *ipi, int wait)  {  	ofnode node, cpus; @@ -124,7 +92,7 @@ void handle_ipi(ulong hart)  	 */  	ret = riscv_clear_ipi(hart);  	if (ret) { -		pr_err("Cannot clear IPI of hart %ld\n", hart); +		pr_err("Cannot clear IPI of hart %ld (error %d)\n", hart, ret);  		return;  	} @@ -133,14 +101,11 @@ void handle_ipi(ulong hart)  int smp_call_function(ulong addr, ulong arg0, ulong arg1, int wait)  { -	int ret = 0; -	struct ipi_data ipi; - -	ipi.addr = addr; -	ipi.arg0 = arg0; -	ipi.arg1 = arg1; - -	ret = send_ipi_many(&ipi, wait); +	struct ipi_data ipi = { +		.addr = addr, +		.arg0 = arg0, +		.arg1 = arg1, +	}; -	return ret; +	return send_ipi_many(&ipi, wait);  } | 
