From b6cd8cd68137a6b3b37b78fade3096d7f1d53ca5 Mon Sep 17 00:00:00 2001 From: Tony Xie Date: Sun, 8 Nov 2020 20:16:30 +0800 Subject: [PATCH] firmware: arm_sdei: add some functions for fiq debugger. 1. add sdei_event_routing_set() 2. add sdei_event_routing_set_nolock() 3. add sdei_event_enable_nolock() and sdei_event_disable_nolock() Signed-off-by: Tony Xie Change-Id: Ia2471a3ac6a9189888a465a529875957ab9661b6 --- drivers/firmware/arm_sdei.c | 39 +++++++++++++++++++++++++++++++++++++ include/linux/arm_sdei.h | 9 +++++++++ 2 files changed, 48 insertions(+) diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 840754dcc6ca..b4778becc6a1 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -920,6 +920,45 @@ int sdei_unregister_ghes(struct ghes *ghes) return err; } +#ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE +int sdei_event_enable_nolock(u32 event_num) +{ + return sdei_api_event_enable(event_num); +} + +int sdei_event_disable_nolock(u32 event_num) +{ + return sdei_api_event_disable(event_num); +} + +int sdei_event_routing_set_nolock(u32 event_num, unsigned long flags, + unsigned long affinity) +{ + return invoke_sdei_fn(SDEI_1_0_FN_SDEI_EVENT_ROUTING_SET, event_num, + (unsigned long)flags, (unsigned long)affinity, + 0, 0, 0); +} + +int sdei_event_routing_set(u32 event_num, unsigned long flags, + unsigned long affinity) +{ + int err = -EINVAL; + struct sdei_event *event; + + mutex_lock(&sdei_events_lock); + event = sdei_event_find(event_num); + if (!event) { + mutex_unlock(&sdei_events_lock); + return -ENOENT; + } + + err = sdei_event_routing_set_nolock(event_num, flags, affinity); + mutex_unlock(&sdei_events_lock); + + return err; +} +#endif + static int sdei_get_conduit(struct platform_device *pdev) { const char *method; diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h index 0a241c5c911d..b5a6346fd567 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -37,6 +37,15 @@ int sdei_event_unregister(u32 event_num); int sdei_event_enable(u32 event_num); int sdei_event_disable(u32 event_num); +#ifdef CONFIG_FIQ_DEBUGGER_TRUST_ZONE +int sdei_event_enable_nolock(u32 event_num); +int sdei_event_disable_nolock(u32 event_num); +int sdei_event_routing_set_nolock(u32 event_num, unsigned long flags, + unsigned long affinity); +int sdei_event_routing_set(u32 event_num, unsigned long flags, + unsigned long affinity); +#endif + /* GHES register/unregister helpers */ int sdei_register_ghes(struct ghes *ghes, sdei_event_callback *normal_cb, sdei_event_callback *critical_cb);