We needed to import some uapi headers, e.g. lib/arm/asm/uapi-psci.h, and will need some others, e.g. pci_regs.h, in the future. Create a linux directory for them in lib so that they can be included with the familiar <linux/header.h> reference. (Note, x86 has been cheating. lib/x86/pci.c already includes <linux/pci_regs.h>, which it's been getting away with as its include paths are less strict than arm's, i.e. it *does* look in /usr/include) Signed-off-by: Andrew Jones <drjones@xxxxxxxxxx> --- Makefile | 2 +- lib/arm/asm/page.h | 2 +- lib/arm/asm/psci.h | 2 +- lib/arm64/asm/page.h | 2 +- lib/arm64/asm/psci.h | 2 +- lib/asm-generic/page.h | 4 +-- lib/const.h | 11 ------ lib/linux/const.h | 27 +++++++++++++++ lib/linux/psci.h | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 124 insertions(+), 18 deletions(-) delete mode 100644 lib/const.h create mode 100644 lib/linux/const.h create mode 100644 lib/linux/psci.h diff --git a/Makefile b/Makefile index 3e60b4f8e4a57..0be2b6670daf6 100644 --- a/Makefile +++ b/Makefile @@ -85,7 +85,7 @@ distclean: clean libfdt_clean $(RM) lib/asm config.mak $(TEST_DIR)-run test.log msr.out cscope.* $(RM) -r tests -cscope: common_dirs = lib lib/libfdt lib/asm lib/asm-generic +cscope: common_dirs = lib lib/libfdt lib/linux lib/asm lib/asm-generic cscope: $(RM) ./cscope.* find -L $(TEST_DIR) lib/$(TEST_DIR) lib/$(ARCH) $(common_dirs) -maxdepth 1 \ diff --git a/lib/arm/asm/page.h b/lib/arm/asm/page.h index 039e2ddfb8e0f..df76969964ed3 100644 --- a/lib/arm/asm/page.h +++ b/lib/arm/asm/page.h @@ -6,7 +6,7 @@ * This work is licensed under the terms of the GNU LGPL, version 2. */ -#include <const.h> +#include <linux/const.h> #define PAGE_SHIFT 12 #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) diff --git a/lib/arm/asm/psci.h b/lib/arm/asm/psci.h index c5fe78184b5ac..11ac45028d787 100644 --- a/lib/arm/asm/psci.h +++ b/lib/arm/asm/psci.h @@ -1,7 +1,7 @@ #ifndef _ASMARM_PSCI_H_ #define _ASMARM_PSCI_H_ #include <libcflat.h> -#include <asm/uapi-psci.h> +#include <linux/psci.h> #define PSCI_INVOKE_ARG_TYPE u32 #define PSCI_FN_CPU_ON PSCI_0_2_FN_CPU_ON diff --git a/lib/arm64/asm/page.h b/lib/arm64/asm/page.h index 29ad1f1f720c4..3144e8efcc7ae 100644 --- a/lib/arm64/asm/page.h +++ b/lib/arm64/asm/page.h @@ -11,7 +11,7 @@ * This work is licensed under the terms of the GNU LGPL, version 2. */ -#include <const.h> +#include <linux/const.h> #define PGTABLE_LEVELS 2 #define VA_BITS 42 diff --git a/lib/arm64/asm/psci.h b/lib/arm64/asm/psci.h index 940d61d34c05d..0a7d7c854e2b3 100644 --- a/lib/arm64/asm/psci.h +++ b/lib/arm64/asm/psci.h @@ -1,7 +1,7 @@ #ifndef _ASMARM64_PSCI_H_ #define _ASMARM64_PSCI_H_ #include <libcflat.h> -#include <asm/uapi-psci.h> +#include <linux/psci.h> #define PSCI_INVOKE_ARG_TYPE u64 #define PSCI_FN_CPU_ON PSCI_0_2_FN64_CPU_ON diff --git a/lib/asm-generic/page.h b/lib/asm-generic/page.h index 66c72a62bb0f7..7b8a08bfaacce 100644 --- a/lib/asm-generic/page.h +++ b/lib/asm-generic/page.h @@ -9,7 +9,7 @@ * This work is licensed under the terms of the GNU LGPL, version 2. */ -#include "const.h" +#include <linux/const.h> #define PAGE_SHIFT 12 #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) @@ -24,6 +24,6 @@ #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT) #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT) -#endif /* __ASSEMBLY__ */ +#endif /* !__ASSEMBLY__ */ #endif /* _ASM_GENERIC_PAGE_H_ */ diff --git a/lib/const.h b/lib/const.h deleted file mode 100644 index 5cd94d7067541..0000000000000 --- a/lib/const.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef _CONST_H_ -#define _CONST_H_ -#ifdef __ASSEMBLY__ -#define _AC(X,Y) X -#define _AT(T,X) X -#else -#define __AC(X,Y) (X##Y) -#define _AC(X,Y) __AC(X,Y) -#define _AT(T,X) ((T)(X)) -#endif -#endif diff --git a/lib/linux/const.h b/lib/linux/const.h new file mode 100644 index 0000000000000..c872bfd25e139 --- /dev/null +++ b/lib/linux/const.h @@ -0,0 +1,27 @@ +/* const.h: Macros for dealing with constants. */ + +#ifndef _LINUX_CONST_H +#define _LINUX_CONST_H + +/* Some constant macros are used in both assembler and + * C code. Therefore we cannot annotate them always with + * 'UL' and other type specifiers unilaterally. We + * use the following macros to deal with this. + * + * Similarly, _AT() will cast an expression with a type in C, but + * leave it unchanged in asm. + */ + +#ifdef __ASSEMBLY__ +#define _AC(X,Y) X +#define _AT(T,X) X +#else +#define __AC(X,Y) (X##Y) +#define _AC(X,Y) __AC(X,Y) +#define _AT(T,X) ((T)(X)) +#endif + +#define _BITUL(x) (_AC(1,UL) << (x)) +#define _BITULL(x) (_AC(1,ULL) << (x)) + +#endif /* !(_LINUX_CONST_H) */ diff --git a/lib/linux/psci.h b/lib/linux/psci.h new file mode 100644 index 0000000000000..5a7676307b44d --- /dev/null +++ b/lib/linux/psci.h @@ -0,0 +1,90 @@ +/* + * ARM Power State and Coordination Interface (PSCI) header + * + * This header holds common PSCI defines and macros shared + * by: ARM kernel, ARM64 kernel, KVM ARM/ARM64 and user space. + * + * Copyright (C) 2014 Linaro Ltd. + * Author: Anup Patel <anup.patel@xxxxxxxxxx> + */ + +#ifndef _LINUX_PSCI_H +#define _LINUX_PSCI_H + +/* + * PSCI v0.1 interface + * + * The PSCI v0.1 function numbers are implementation defined. + * + * Only PSCI return values such as: SUCCESS, NOT_SUPPORTED, + * INVALID_PARAMS, and DENIED defined below are applicable + * to PSCI v0.1. + */ + +/* PSCI v0.2 interface */ +#define PSCI_0_2_FN_BASE 0x84000000 +#define PSCI_0_2_FN(n) (PSCI_0_2_FN_BASE + (n)) +#define PSCI_0_2_64BIT 0x40000000 +#define PSCI_0_2_FN64_BASE \ + (PSCI_0_2_FN_BASE + PSCI_0_2_64BIT) +#define PSCI_0_2_FN64(n) (PSCI_0_2_FN64_BASE + (n)) + +#define PSCI_0_2_FN_PSCI_VERSION PSCI_0_2_FN(0) +#define PSCI_0_2_FN_CPU_SUSPEND PSCI_0_2_FN(1) +#define PSCI_0_2_FN_CPU_OFF PSCI_0_2_FN(2) +#define PSCI_0_2_FN_CPU_ON PSCI_0_2_FN(3) +#define PSCI_0_2_FN_AFFINITY_INFO PSCI_0_2_FN(4) +#define PSCI_0_2_FN_MIGRATE PSCI_0_2_FN(5) +#define PSCI_0_2_FN_MIGRATE_INFO_TYPE PSCI_0_2_FN(6) +#define PSCI_0_2_FN_MIGRATE_INFO_UP_CPU PSCI_0_2_FN(7) +#define PSCI_0_2_FN_SYSTEM_OFF PSCI_0_2_FN(8) +#define PSCI_0_2_FN_SYSTEM_RESET PSCI_0_2_FN(9) + +#define PSCI_0_2_FN64_CPU_SUSPEND PSCI_0_2_FN64(1) +#define PSCI_0_2_FN64_CPU_ON PSCI_0_2_FN64(3) +#define PSCI_0_2_FN64_AFFINITY_INFO PSCI_0_2_FN64(4) +#define PSCI_0_2_FN64_MIGRATE PSCI_0_2_FN64(5) +#define PSCI_0_2_FN64_MIGRATE_INFO_UP_CPU PSCI_0_2_FN64(7) + +/* PSCI v0.2 power state encoding for CPU_SUSPEND function */ +#define PSCI_0_2_POWER_STATE_ID_MASK 0xffff +#define PSCI_0_2_POWER_STATE_ID_SHIFT 0 +#define PSCI_0_2_POWER_STATE_TYPE_SHIFT 16 +#define PSCI_0_2_POWER_STATE_TYPE_MASK \ + (0x1 << PSCI_0_2_POWER_STATE_TYPE_SHIFT) +#define PSCI_0_2_POWER_STATE_AFFL_SHIFT 24 +#define PSCI_0_2_POWER_STATE_AFFL_MASK \ + (0x3 << PSCI_0_2_POWER_STATE_AFFL_SHIFT) + +/* PSCI v0.2 affinity level state returned by AFFINITY_INFO */ +#define PSCI_0_2_AFFINITY_LEVEL_ON 0 +#define PSCI_0_2_AFFINITY_LEVEL_OFF 1 +#define PSCI_0_2_AFFINITY_LEVEL_ON_PENDING 2 + +/* PSCI v0.2 multicore support in Trusted OS returned by MIGRATE_INFO_TYPE */ +#define PSCI_0_2_TOS_UP_MIGRATE 0 +#define PSCI_0_2_TOS_UP_NO_MIGRATE 1 +#define PSCI_0_2_TOS_MP 2 + +/* PSCI version decoding (independent of PSCI version) */ +#define PSCI_VERSION_MAJOR_SHIFT 16 +#define PSCI_VERSION_MINOR_MASK \ + ((1U << PSCI_VERSION_MAJOR_SHIFT) - 1) +#define PSCI_VERSION_MAJOR_MASK ~PSCI_VERSION_MINOR_MASK +#define PSCI_VERSION_MAJOR(ver) \ + (((ver) & PSCI_VERSION_MAJOR_MASK) >> PSCI_VERSION_MAJOR_SHIFT) +#define PSCI_VERSION_MINOR(ver) \ + ((ver) & PSCI_VERSION_MINOR_MASK) + +/* PSCI return values (inclusive of all PSCI versions) */ +#define PSCI_RET_SUCCESS 0 +#define PSCI_RET_NOT_SUPPORTED -1 +#define PSCI_RET_INVALID_PARAMS -2 +#define PSCI_RET_DENIED -3 +#define PSCI_RET_ALREADY_ON -4 +#define PSCI_RET_ON_PENDING -5 +#define PSCI_RET_INTERNAL_FAILURE -6 +#define PSCI_RET_NOT_PRESENT -7 +#define PSCI_RET_DISABLED -8 + +#endif /* _LINUX_PSCI_H */ -- 2.4.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html