diff options
Diffstat (limited to 'arch/arm64/include/asm')
| -rw-r--r-- | arch/arm64/include/asm/Kbuild | 2 | ||||
| -rw-r--r-- | arch/arm64/include/asm/bitops.h | 18 | ||||
| -rw-r--r-- | arch/arm64/include/asm/cmpxchg.h | 3 | ||||
| -rw-r--r-- | arch/arm64/include/asm/compat.h | 22 | ||||
| -rw-r--r-- | arch/arm64/include/asm/cputype.h | 30 | ||||
| -rw-r--r-- | arch/arm64/include/asm/esr.h | 55 | ||||
| -rw-r--r-- | arch/arm64/include/asm/exception.h | 1 | ||||
| -rw-r--r-- | arch/arm64/include/asm/hardirq.h | 5 | ||||
| -rw-r--r-- | arch/arm64/include/asm/io.h | 4 | ||||
| -rw-r--r-- | arch/arm64/include/asm/irq.h | 1 | ||||
| -rw-r--r-- | arch/arm64/include/asm/smp_plat.h | 30 | ||||
| -rw-r--r-- | arch/arm64/include/asm/string.h | 37 | 
12 files changed, 196 insertions, 12 deletions
diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild index e5fe4f99fe1..79a642d199f 100644 --- a/arch/arm64/include/asm/Kbuild +++ b/arch/arm64/include/asm/Kbuild @@ -39,7 +39,6 @@ generic-y += shmbuf.h  generic-y += sizes.h  generic-y += socket.h  generic-y += sockios.h -generic-y += string.h  generic-y += switch_to.h  generic-y += swab.h  generic-y += termbits.h @@ -49,4 +48,5 @@ generic-y += trace_clock.h  generic-y += types.h  generic-y += unaligned.h  generic-y += user.h +generic-y += vga.h  generic-y += xor.h diff --git a/arch/arm64/include/asm/bitops.h b/arch/arm64/include/asm/bitops.h index 5e693073b03..aa5b59d6ba4 100644 --- a/arch/arm64/include/asm/bitops.h +++ b/arch/arm64/include/asm/bitops.h @@ -32,6 +32,16 @@  #error only <linux/bitops.h> can be included directly  #endif +/* + * Little endian assembly atomic bitops. + */ +extern void set_bit(int nr, volatile unsigned long *p); +extern void clear_bit(int nr, volatile unsigned long *p); +extern void change_bit(int nr, volatile unsigned long *p); +extern int test_and_set_bit(int nr, volatile unsigned long *p); +extern int test_and_clear_bit(int nr, volatile unsigned long *p); +extern int test_and_change_bit(int nr, volatile unsigned long *p); +  #include <asm-generic/bitops/builtin-__ffs.h>  #include <asm-generic/bitops/builtin-ffs.h>  #include <asm-generic/bitops/builtin-__fls.h> @@ -45,9 +55,13 @@  #include <asm-generic/bitops/hweight.h>  #include <asm-generic/bitops/lock.h> -#include <asm-generic/bitops/atomic.h>  #include <asm-generic/bitops/non-atomic.h>  #include <asm-generic/bitops/le.h> -#include <asm-generic/bitops/ext2-atomic.h> + +/* + * Ext2 is defined to use little-endian byte ordering. + */ +#define ext2_set_bit_atomic(lock, nr, p)	test_and_set_bit_le(nr, p) +#define ext2_clear_bit_atomic(lock, nr, p)	test_and_clear_bit_le(nr, p)  #endif /* __ASM_BITOPS_H */ diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h index 968b5cbfc26..8a8ce0e73a3 100644 --- a/arch/arm64/include/asm/cmpxchg.h +++ b/arch/arm64/include/asm/cmpxchg.h @@ -170,4 +170,7 @@ static inline unsigned long __cmpxchg_mb(volatile void *ptr, unsigned long old,  				       (unsigned long)(n),		\  				       sizeof(*(ptr)))) +#define cmpxchg64(ptr,o,n)		cmpxchg((ptr),(o),(n)) +#define cmpxchg64_local(ptr,o,n)	cmpxchg_local((ptr),(o),(n)) +  #endif	/* __ASM_CMPXCHG_H */ diff --git a/arch/arm64/include/asm/compat.h b/arch/arm64/include/asm/compat.h index 618b450e5a1..899af807ef0 100644 --- a/arch/arm64/include/asm/compat.h +++ b/arch/arm64/include/asm/compat.h @@ -35,14 +35,16 @@ typedef s32		compat_clock_t;  typedef s32		compat_pid_t;  typedef u32		__compat_uid_t;  typedef u32		__compat_gid_t; +typedef u16		__compat_uid16_t; +typedef u16		__compat_gid16_t;  typedef u32		__compat_uid32_t;  typedef u32		__compat_gid32_t; -typedef u32		compat_mode_t; +typedef u16		compat_mode_t;  typedef u32		compat_ino_t;  typedef u32		compat_dev_t;  typedef s32		compat_off_t;  typedef s64		compat_loff_t; -typedef s16		compat_nlink_t; +typedef s32		compat_nlink_t;  typedef u16		compat_ipc_pid_t;  typedef s32		compat_daddr_t;  typedef u32		compat_caddr_t; @@ -50,9 +52,11 @@ typedef __kernel_fsid_t	compat_fsid_t;  typedef s32		compat_key_t;  typedef s32		compat_timer_t; +typedef s16		compat_short_t;  typedef s32		compat_int_t;  typedef s32		compat_long_t;  typedef s64		compat_s64; +typedef u16		compat_ushort_t;  typedef u32		compat_uint_t;  typedef u32		compat_ulong_t;  typedef u64		compat_u64; @@ -72,20 +76,20 @@ struct compat_stat {  	compat_dev_t	st_dev;  	compat_ino_t	st_ino;  	compat_mode_t	st_mode; -	compat_nlink_t	st_nlink; -	__compat_uid32_t	st_uid; -	__compat_gid32_t	st_gid; +	compat_ushort_t	st_nlink; +	__compat_uid16_t	st_uid; +	__compat_gid16_t	st_gid;  	compat_dev_t	st_rdev;  	compat_off_t	st_size;  	compat_off_t	st_blksize;  	compat_off_t	st_blocks;  	compat_time_t	st_atime; -	u32		st_atime_nsec; +	compat_ulong_t	st_atime_nsec;  	compat_time_t	st_mtime; -	u32		st_mtime_nsec; +	compat_ulong_t	st_mtime_nsec;  	compat_time_t	st_ctime; -	u32		st_ctime_nsec; -	u32		__unused4[2]; +	compat_ulong_t	st_ctime_nsec; +	compat_ulong_t	__unused4[2];  };  struct compat_flock { diff --git a/arch/arm64/include/asm/cputype.h b/arch/arm64/include/asm/cputype.h index ef54125e6c1..cf2749488cd 100644 --- a/arch/arm64/include/asm/cputype.h +++ b/arch/arm64/include/asm/cputype.h @@ -17,6 +17,7 @@  #define __ASM_CPUTYPE_H  #define ID_MIDR_EL1		"midr_el1" +#define ID_MPIDR_EL1		"mpidr_el1"  #define ID_CTR_EL0		"ctr_el0"  #define ID_AA64PFR0_EL1		"id_aa64pfr0_el1" @@ -25,12 +26,24 @@  #define ID_AA64ISAR0_EL1	"id_aa64isar0_el1"  #define ID_AA64MMFR0_EL1	"id_aa64mmfr0_el1" +#define INVALID_HWID		ULONG_MAX + +#define MPIDR_HWID_BITMASK	0xff00ffffff +  #define read_cpuid(reg) ({						\  	u64 __val;							\  	asm("mrs	%0, " reg : "=r" (__val));			\  	__val;								\  }) +#define ARM_CPU_IMP_ARM		0x41 + +#define ARM_CPU_PART_AEM_V8	0xD0F0 +#define ARM_CPU_PART_FOUNDATION	0xD000 +#define ARM_CPU_PART_CORTEX_A57	0xD070 + +#ifndef __ASSEMBLY__ +  /*   * The CPU ID never changes at run time, so we might as well tell the   * compiler that it's constant.  Use this function to read the CPU ID @@ -41,9 +54,26 @@ static inline u32 __attribute_const__ read_cpuid_id(void)  	return read_cpuid(ID_MIDR_EL1);  } +static inline u64 __attribute_const__ read_cpuid_mpidr(void) +{ +	return read_cpuid(ID_MPIDR_EL1); +} + +static inline unsigned int __attribute_const__ read_cpuid_implementor(void) +{ +	return (read_cpuid_id() & 0xFF000000) >> 24; +} + +static inline unsigned int __attribute_const__ read_cpuid_part_number(void) +{ +	return (read_cpuid_id() & 0xFFF0); +} +  static inline u32 __attribute_const__ read_cpuid_cachetype(void)  {  	return read_cpuid(ID_CTR_EL0);  } +#endif /* __ASSEMBLY__ */ +  #endif diff --git a/arch/arm64/include/asm/esr.h b/arch/arm64/include/asm/esr.h new file mode 100644 index 00000000000..78834123a32 --- /dev/null +++ b/arch/arm64/include/asm/esr.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2013 - ARM Ltd + * Author: Marc Zyngier <marc.zyngier@arm.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __ASM_ESR_H +#define __ASM_ESR_H + +#define ESR_EL1_EC_SHIFT	(26) +#define ESR_EL1_IL		(1U << 25) + +#define ESR_EL1_EC_UNKNOWN	(0x00) +#define ESR_EL1_EC_WFI		(0x01) +#define ESR_EL1_EC_CP15_32	(0x03) +#define ESR_EL1_EC_CP15_64	(0x04) +#define ESR_EL1_EC_CP14_MR	(0x05) +#define ESR_EL1_EC_CP14_LS	(0x06) +#define ESR_EL1_EC_FP_ASIMD	(0x07) +#define ESR_EL1_EC_CP10_ID	(0x08) +#define ESR_EL1_EC_CP14_64	(0x0C) +#define ESR_EL1_EC_ILL_ISS	(0x0E) +#define ESR_EL1_EC_SVC32	(0x11) +#define ESR_EL1_EC_SVC64	(0x15) +#define ESR_EL1_EC_SYS64	(0x18) +#define ESR_EL1_EC_IABT_EL0	(0x20) +#define ESR_EL1_EC_IABT_EL1	(0x21) +#define ESR_EL1_EC_PC_ALIGN	(0x22) +#define ESR_EL1_EC_DABT_EL0	(0x24) +#define ESR_EL1_EC_DABT_EL1	(0x25) +#define ESR_EL1_EC_SP_ALIGN	(0x26) +#define ESR_EL1_EC_FP_EXC32	(0x28) +#define ESR_EL1_EC_FP_EXC64	(0x2C) +#define ESR_EL1_EC_SERRROR	(0x2F) +#define ESR_EL1_EC_BREAKPT_EL0	(0x30) +#define ESR_EL1_EC_BREAKPT_EL1	(0x31) +#define ESR_EL1_EC_SOFTSTP_EL0	(0x32) +#define ESR_EL1_EC_SOFTSTP_EL1	(0x33) +#define ESR_EL1_EC_WATCHPT_EL0	(0x34) +#define ESR_EL1_EC_WATCHPT_EL1	(0x35) +#define ESR_EL1_EC_BKPT32	(0x38) +#define ESR_EL1_EC_BRK64	(0x3C) + +#endif /* __ASM_ESR_H */ diff --git a/arch/arm64/include/asm/exception.h b/arch/arm64/include/asm/exception.h index ac63519b7b9..0303705fcad 100644 --- a/arch/arm64/include/asm/exception.h +++ b/arch/arm64/include/asm/exception.h @@ -19,5 +19,6 @@  #define __ASM_EXCEPTION_H  #define __exception	__attribute__((section(".exception.text"))) +#define __exception_irq_entry	__exception  #endif	/* __ASM_EXCEPTION_H */ diff --git a/arch/arm64/include/asm/hardirq.h b/arch/arm64/include/asm/hardirq.h index 507546353d6..990c051e782 100644 --- a/arch/arm64/include/asm/hardirq.h +++ b/arch/arm64/include/asm/hardirq.h @@ -49,4 +49,9 @@ static inline void ack_bad_irq(unsigned int irq)  extern void handle_IRQ(unsigned int, struct pt_regs *); +/* + * No arch-specific IRQ flags. + */ +#define set_irq_flags(irq, flags) +  #endif /* __ASM_HARDIRQ_H */ diff --git a/arch/arm64/include/asm/io.h b/arch/arm64/include/asm/io.h index 57f12c991de..2e12258aa7e 100644 --- a/arch/arm64/include/asm/io.h +++ b/arch/arm64/include/asm/io.h @@ -92,10 +92,12 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)  #define readb_relaxed(c)	({ u8  __v = __raw_readb(c); __v; })  #define readw_relaxed(c)	({ u16 __v = le16_to_cpu((__force __le16)__raw_readw(c)); __v; })  #define readl_relaxed(c)	({ u32 __v = le32_to_cpu((__force __le32)__raw_readl(c)); __v; }) +#define readq_relaxed(c)	({ u64 __v = le64_to_cpu((__force __le64)__raw_readq(c)); __v; })  #define writeb_relaxed(v,c)	((void)__raw_writeb((v),(c)))  #define writew_relaxed(v,c)	((void)__raw_writew((__force u16)cpu_to_le16(v),(c)))  #define writel_relaxed(v,c)	((void)__raw_writel((__force u32)cpu_to_le32(v),(c))) +#define writeq_relaxed(v,c)	((void)__raw_writeq((__force u64)cpu_to_le64(v),(c)))  /*   * I/O memory access primitives. Reads are ordered relative to any @@ -105,10 +107,12 @@ static inline u64 __raw_readq(const volatile void __iomem *addr)  #define readb(c)		({ u8  __v = readb_relaxed(c); __iormb(); __v; })  #define readw(c)		({ u16 __v = readw_relaxed(c); __iormb(); __v; })  #define readl(c)		({ u32 __v = readl_relaxed(c); __iormb(); __v; }) +#define readq(c)		({ u64 __v = readq_relaxed(c); __iormb(); __v; })  #define writeb(v,c)		({ __iowmb(); writeb_relaxed((v),(c)); })  #define writew(v,c)		({ __iowmb(); writew_relaxed((v),(c)); })  #define writel(v,c)		({ __iowmb(); writel_relaxed((v),(c)); }) +#define writeq(v,c)		({ __iowmb(); writeq_relaxed((v),(c)); })  /*   *  I/O port access primitives. diff --git a/arch/arm64/include/asm/irq.h b/arch/arm64/include/asm/irq.h index a4e1cad3202..0332fc077f6 100644 --- a/arch/arm64/include/asm/irq.h +++ b/arch/arm64/include/asm/irq.h @@ -4,5 +4,6 @@  #include <asm-generic/irq.h>  extern void (*handle_arch_irq)(struct pt_regs *); +extern void set_handle_irq(void (*handle_irq)(struct pt_regs *));  #endif diff --git a/arch/arm64/include/asm/smp_plat.h b/arch/arm64/include/asm/smp_plat.h new file mode 100644 index 00000000000..ed43a0d2b1b --- /dev/null +++ b/arch/arm64/include/asm/smp_plat.h @@ -0,0 +1,30 @@ +/* + * Definitions specific to SMP platforms. + * + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef __ASM_SMP_PLAT_H +#define __ASM_SMP_PLAT_H + +#include <asm/types.h> + +/* + * Logical CPU mapping. + */ +extern u64 __cpu_logical_map[NR_CPUS]; +#define cpu_logical_map(cpu)    __cpu_logical_map[cpu] + +#endif /* __ASM_SMP_PLAT_H */ diff --git a/arch/arm64/include/asm/string.h b/arch/arm64/include/asm/string.h new file mode 100644 index 00000000000..3ee8b303d9a --- /dev/null +++ b/arch/arm64/include/asm/string.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2013 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef __ASM_STRING_H +#define __ASM_STRING_H + +#define __HAVE_ARCH_STRRCHR +extern char *strrchr(const char *, int c); + +#define __HAVE_ARCH_STRCHR +extern char *strchr(const char *, int c); + +#define __HAVE_ARCH_MEMCPY +extern void *memcpy(void *, const void *, __kernel_size_t); + +#define __HAVE_ARCH_MEMMOVE +extern void *memmove(void *, const void *, __kernel_size_t); + +#define __HAVE_ARCH_MEMCHR +extern void *memchr(const void *, int, __kernel_size_t); + +#define __HAVE_ARCH_MEMSET +extern void *memset(void *, int, __kernel_size_t); + +#endif  |