lib: Introduce sbi_ipi_send_halt() API

Instead of directly calling sbi_ipi_send_many(), we introduce
sbi_ipi_send_halt() for halting a set of HARTs.

This way in future we can assign any IPI event number for HART
halting within sbi_ipi.c only.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
This commit is contained in:
Anup Patel
2020-01-15 11:16:54 +05:30
committed by Anup Patel
parent 3d2aaac69a
commit da9b76b957
3 changed files with 12 additions and 6 deletions

View File

@@ -29,6 +29,8 @@ int sbi_ipi_send_smode(struct sbi_scratch *scratch, ulong hmask, ulong hbase);
void sbi_ipi_clear_smode(struct sbi_scratch *scratch); void sbi_ipi_clear_smode(struct sbi_scratch *scratch);
int sbi_ipi_send_halt(struct sbi_scratch *scratch, ulong hmask, ulong hbase);
void sbi_ipi_process(struct sbi_scratch *scratch); void sbi_ipi_process(struct sbi_scratch *scratch);
int sbi_ipi_init(struct sbi_scratch *scratch, bool cold_boot); int sbi_ipi_init(struct sbi_scratch *scratch, bool cold_boot);

View File

@@ -112,6 +112,12 @@ void sbi_ipi_clear_smode(struct sbi_scratch *scratch)
csr_clear(CSR_MIP, MIP_SSIP); csr_clear(CSR_MIP, MIP_SSIP);
} }
int sbi_ipi_send_halt(struct sbi_scratch *scratch, ulong hmask, ulong hbase)
{
return sbi_ipi_send_many(scratch, hmask, hbase,
SBI_IPI_EVENT_HALT, NULL);
}
void sbi_ipi_process(struct sbi_scratch *scratch) void sbi_ipi_process(struct sbi_scratch *scratch)
{ {
unsigned long ipi_type; unsigned long ipi_type;

View File

@@ -39,9 +39,8 @@ void __noreturn sbi_system_reboot(struct sbi_scratch *scratch, u32 type)
u32 current_hartid_mask = 1UL << sbi_current_hartid(); u32 current_hartid_mask = 1UL << sbi_current_hartid();
/* Send HALT IPI to every hart other than the current hart */ /* Send HALT IPI to every hart other than the current hart */
sbi_ipi_send_many(scratch, sbi_ipi_send_halt(scratch,
sbi_hart_available_mask() & ~current_hartid_mask, sbi_hart_available_mask() & ~current_hartid_mask, 0);
0, SBI_IPI_EVENT_HALT, NULL);
/* Platform specific reooot */ /* Platform specific reooot */
sbi_platform_system_reboot(sbi_platform_ptr(scratch), type); sbi_platform_system_reboot(sbi_platform_ptr(scratch), type);
@@ -55,9 +54,8 @@ void __noreturn sbi_system_shutdown(struct sbi_scratch *scratch, u32 type)
u32 current_hartid_mask = 1UL << sbi_current_hartid(); u32 current_hartid_mask = 1UL << sbi_current_hartid();
/* Send HALT IPI to every hart other than the current hart */ /* Send HALT IPI to every hart other than the current hart */
sbi_ipi_send_many(scratch, sbi_ipi_send_halt(scratch,
sbi_hart_available_mask() & ~current_hartid_mask, sbi_hart_available_mask() & ~current_hartid_mask, 0);
0, SBI_IPI_EVENT_HALT, NULL);
/* Platform specific shutdown */ /* Platform specific shutdown */
sbi_platform_system_shutdown(sbi_platform_ptr(scratch), type); sbi_platform_system_shutdown(sbi_platform_ptr(scratch), type);