Message ID | 20180322181445.23298-9-james.morse@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi James, I love your patch! Yet something to improve: [auto build test ERROR on pm/linux-next] [also build test ERROR on v4.16-rc6] [cannot apply to arm64/for-next/core next-20180323] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/James-Morse/APEI-in_nmi-rework-and-arm64-SDEI-wire-up/20180325-064638 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next config: arm64-allmodconfig (attached as .config) compiler: aarch64-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=arm64 All errors (new ones prefixed by >>): drivers//firmware/arm_sdei.c: In function 'sdei_register_ghes': >> drivers//firmware/arm_sdei.c:921:26: error: 'FIX_APEI_GHES_SDEI_CRITICAL' undeclared (first use in this function) ghes->nmi_fixmap_idx = FIX_APEI_GHES_SDEI_CRITICAL; ^~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers//firmware/arm_sdei.c:921:26: note: each undeclared identifier is reported only once for each function it appears in >> drivers//firmware/arm_sdei.c:924:26: error: 'FIX_APEI_GHES_SDEI_NORMAL' undeclared (first use in this function); did you mean 'FIX_APEI_GHES_SDEI_CRITICAL'? ghes->nmi_fixmap_idx = FIX_APEI_GHES_SDEI_NORMAL; ^~~~~~~~~~~~~~~~~~~~~~~~~ FIX_APEI_GHES_SDEI_CRITICAL vim +/FIX_APEI_GHES_SDEI_CRITICAL +921 drivers//firmware/arm_sdei.c 895 896 int sdei_register_ghes(struct ghes *ghes, sdei_event_callback *cb) 897 { 898 int err; 899 u32 event_num; 900 u64 result; 901 902 if (acpi_disabled) 903 return -EOPNOTSUPP; 904 905 event_num = ghes->generic->notify.vector; 906 if (event_num == 0) { 907 /* 908 * Event 0 is reserved by the specification for 909 * SDEI_EVENT_SIGNAL. 910 */ 911 return -EINVAL; 912 } 913 914 err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_PRIORITY, 915 &result); 916 if (err) 917 return err; 918 919 if (result == SDEI_EVENT_PRIORITY_CRITICAL) { 920 ghes->nmi_fixmap_lock = &sdei_ghes_fixmap_lock_critical; > 921 ghes->nmi_fixmap_idx = FIX_APEI_GHES_SDEI_CRITICAL; 922 } else { 923 ghes->nmi_fixmap_lock = &sdei_ghes_fixmap_lock_normal; > 924 ghes->nmi_fixmap_idx = FIX_APEI_GHES_SDEI_NORMAL; 925 } 926 927 err = sdei_event_register(event_num, cb, ghes); 928 if (!err) 929 err = sdei_event_enable(event_num); 930 931 return err; 932 } 933 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Hi kbuild test robot, On 25/03/18 02:41, kbuild test robot wrote: > I love your patch! Yet something to improve: > > [auto build test ERROR on pm/linux-next] > [also build test ERROR on v4.16-rc6] > [cannot apply to arm64/for-next/core next-20180323] This is the potential conflict I referred to in v1's cover letter... > All errors (new ones prefixed by >>): > > drivers//firmware/arm_sdei.c: In function 'sdei_register_ghes': >>> drivers//firmware/arm_sdei.c:921:26: error: 'FIX_APEI_GHES_SDEI_CRITICAL' undeclared (first use in this function) > ghes->nmi_fixmap_idx = FIX_APEI_GHES_SDEI_CRITICAL; Looks like I forgot to include asm/fixmap.h! I hate header-soup. Thanks, James
diff --git a/arch/arm64/include/asm/fixmap.h b/arch/arm64/include/asm/fixmap.h index c3974517c2cb..e2b423a5feaf 100644 --- a/arch/arm64/include/asm/fixmap.h +++ b/arch/arm64/include/asm/fixmap.h @@ -58,6 +58,10 @@ enum fixed_addresses { #ifdef CONFIG_ACPI_APEI_SEA FIX_APEI_GHES_SEA, #endif +#ifdef CONFIG_ARM_SDE_INTERFACE + FIX_APEI_GHES_SDEI_NORMAL, + FIX_APEI_GHES_SDEI_CRITICAL, +#endif #endif /* CONFIG_ACPI_APEI_GHES */ #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 1ea71640fdc2..8e37c34ef733 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -2,6 +2,7 @@ // Copyright (C) 2017 Arm Ltd. #define pr_fmt(fmt) "sdei: " fmt +#include <acpi/ghes.h> #include <linux/acpi.h> #include <linux/arm_sdei.h> #include <linux/arm-smccc.h> @@ -887,6 +888,80 @@ static void sdei_smccc_hvc(unsigned long function_id, arm_smccc_hvc(function_id, arg0, arg1, arg2, arg3, arg4, 0, 0, res); } +#ifdef CONFIG_ACPI +/* These stop private notifications using the fixmap entries simultaneously */ +static DEFINE_RAW_SPINLOCK(sdei_ghes_fixmap_lock_normal); +static DEFINE_RAW_SPINLOCK(sdei_ghes_fixmap_lock_critical); + +int sdei_register_ghes(struct ghes *ghes, sdei_event_callback *cb) +{ + int err; + u32 event_num; + u64 result; + + if (acpi_disabled) + return -EOPNOTSUPP; + + event_num = ghes->generic->notify.vector; + if (event_num == 0) { + /* + * Event 0 is reserved by the specification for + * SDEI_EVENT_SIGNAL. + */ + return -EINVAL; + } + + err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_PRIORITY, + &result); + if (err) + return err; + + if (result == SDEI_EVENT_PRIORITY_CRITICAL) { + ghes->nmi_fixmap_lock = &sdei_ghes_fixmap_lock_critical; + ghes->nmi_fixmap_idx = FIX_APEI_GHES_SDEI_CRITICAL; + } else { + ghes->nmi_fixmap_lock = &sdei_ghes_fixmap_lock_normal; + ghes->nmi_fixmap_idx = FIX_APEI_GHES_SDEI_NORMAL; + } + + err = sdei_event_register(event_num, cb, ghes); + if (!err) + err = sdei_event_enable(event_num); + + return err; +} + +int sdei_unregister_ghes(struct ghes *ghes) +{ + int i; + int err; + u32 event_num = ghes->generic->notify.vector; + + might_sleep(); + + if (acpi_disabled) + return -EOPNOTSUPP; + + /* + * The event may be running on another CPU. Disable it + * to stop new events, then try to unregister a few times. + */ + err = sdei_event_disable(event_num); + if (err) + return err; + + for (i = 0; i < 3; i++) { + err = sdei_event_unregister(event_num); + if (err != -EINPROGRESS) + break; + + schedule(); + } + + return err; +} +#endif /* CONFIG_ACPI */ + 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 942afbd544b7..5fdf799be026 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -11,6 +11,7 @@ enum sdei_conduit_types { CONDUIT_HVC, }; +#include <acpi/ghes.h> #include <asm/sdei.h> /* Arch code should override this to set the entry point from firmware... */ @@ -39,6 +40,10 @@ int sdei_event_unregister(u32 event_num); int sdei_event_enable(u32 event_num); int sdei_event_disable(u32 event_num); +/* GHES register/unregister helpers */ +int sdei_register_ghes(struct ghes *ghes, sdei_event_callback *cb); +int sdei_unregister_ghes(struct ghes *ghes); + #ifdef CONFIG_ARM_SDE_INTERFACE /* For use by arch code when CPU hotplug notifiers are not appropriate. */ int sdei_mask_local_cpu(void);