1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (C) 2019 Fraunhofer AISEC, 4 * Lukas Auer <lukas.auer@aisec.fraunhofer.de> 5 */ 6 7#ifndef _ASM_RISCV_SMP_H 8#define _ASM_RISCV_SMP_H 9 10#include <linux/types.h> 11 12/** 13 * struct ipi_data - Inter-processor interrupt (IPI) data structure 14 * 15 * IPIs are used for SMP support to communicate to other harts what function to 16 * call. Functions are in the form 17 * void (*addr)(ulong hart, ulong arg0, ulong arg1). 18 * 19 * The function address and the two arguments, arg0 and arg1, are stored in the 20 * IPI data structure. The hart ID is inserted by the hart handling the IPI and 21 * calling the function. 22 * 23 * @valid is used to determine whether a sent IPI originated from U-Boot. It is 24 * initialized to zero by board_init_f_alloc_reserve. When U-Boot sends its 25 * first IPI, it is set to 1. This prevents already-pending IPIs not sent by 26 * U-Boot from being taken. 27 * 28 * @addr: Address of function 29 * @arg0: First argument of function 30 * @arg1: Second argument of function 31 * @valid: Whether this IPI is valid 32 */ 33struct ipi_data { 34 ulong addr; 35 ulong arg0; 36 ulong arg1; 37 unsigned int valid; 38}; 39 40/** 41 * handle_ipi() - interrupt handler for software interrupts 42 * 43 * The IPI interrupt handler must be called to handle software interrupts. It 44 * calls the function specified in the hart's IPI data structure. 45 * 46 * @hart: Hart ID of the current hart 47 */ 48void handle_ipi(ulong hart); 49 50/** 51 * smp_call_function() - Call a function on all other harts 52 * 53 * Send IPIs with the specified function call to all harts. 54 * 55 * @addr: Address of function 56 * @arg0: First argument of function 57 * @arg1: Second argument of function 58 * @wait: Wait for harts to acknowledge request 59 * Return: 0 if OK, -ve on error 60 */ 61int smp_call_function(ulong addr, ulong arg0, ulong arg1, int wait); 62 63/** 64 * riscv_init_ipi() - Initialize inter-process interrupt (IPI) driver 65 * 66 * Platform code must provide this function. This function is called once after 67 * the cpu driver is initialized. No other riscv_*_ipi() calls will be made 68 * before this function is called. 69 * 70 * Return: 0 if OK, -ve on error 71 */ 72int riscv_init_ipi(void); 73 74/** 75 * riscv_send_ipi() - Send inter-processor interrupt (IPI) 76 * 77 * Platform code must provide this function. 78 * 79 * @hart: Hart ID of receiving hart 80 * Return: 0 if OK, -ve on error 81 */ 82int riscv_send_ipi(int hart); 83 84/** 85 * riscv_clear_ipi() - Clear inter-processor interrupt (IPI) 86 * 87 * Platform code must provide this function. 88 * 89 * @hart: Hart ID of hart to be cleared 90 * Return: 0 if OK, -ve on error 91 */ 92int riscv_clear_ipi(int hart); 93 94/** 95 * riscv_get_ipi() - Get status of inter-processor interrupt (IPI) 96 * 97 * Platform code must provide this function. 98 * 99 * @hart: Hart ID of hart to be checked 100 * @pending: Pointer to variable with result of the check, 101 * 1 if IPI is pending, 0 otherwise 102 * Return: 0 if OK, -ve on error 103 */ 104int riscv_get_ipi(int hart, int *pending); 105 106#endif 107