[PATCH 19/36] AArch64: Device specific operations
This patch adds several definitions for device communication, including I/O accessors and ioremap(). The __raw_* accessors are implemented as inline asm to avoid compiler generation of post-indexed accesses (less efficient to emulate in a virtualised environment). Signed-off-by: Will Deacon Signed-off-by: Catalin Marinas --- arch/aarch64/include/asm/device.h | 27 arch/aarch64/include/asm/fb.h | 35 + arch/aarch64/include/asm/io.h | 260 + arch/aarch64/kernel/io.c | 65 + arch/aarch64/mm/ioremap.c | 102 +++ 5 files changed, 489 insertions(+), 0 deletions(-) create mode 100644 arch/aarch64/include/asm/device.h create mode 100644 arch/aarch64/include/asm/fb.h create mode 100644 arch/aarch64/include/asm/io.h create mode 100644 arch/aarch64/kernel/io.c create mode 100644 arch/aarch64/mm/ioremap.c diff --git a/arch/aarch64/include/asm/device.h b/arch/aarch64/include/asm/device.h new file mode 100644 index 000..0fc1008 --- /dev/null +++ b/arch/aarch64/include/asm/device.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2012 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ASM_DEVICE_H +#define __ASM_DEVICE_H + +struct dev_archdata { + struct dma_map_ops *dma_ops; +}; + +struct pdev_archdata { +}; + +#endif diff --git a/arch/aarch64/include/asm/fb.h b/arch/aarch64/include/asm/fb.h new file mode 100644 index 000..be9167e --- /dev/null +++ b/arch/aarch64/include/asm/fb.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2012 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ASM_FB_H_ +#define __ASM_FB_H_ + +#include +#include +#include + +static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, + unsigned long off) +{ + vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); +} + +static inline int fb_is_primary_device(struct fb_info *info) +{ + return 0; +} + +#endif /* __ASM_FB_H_ */ diff --git a/arch/aarch64/include/asm/io.h b/arch/aarch64/include/asm/io.h new file mode 100644 index 000..958cb7c --- /dev/null +++ b/arch/aarch64/include/asm/io.h @@ -0,0 +1,260 @@ +/* + * Based on arch/arm/include/asm/io.h + * + * Copyright (C) 1996-2000 Russell King + * Copyright (C) 2012 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ASM_IO_H +#define __ASM_IO_H + +#ifdef __KERNEL__ + +#include + +#include +#include + +/* + * Generic IO read/write. These perform native-endian accesses. + */ +static inline void __raw_writeb(u8 val, volatile void __iomem *addr) +{ + asm volatile("strb %w0, [%1]" : : "r" (val), "r" (addr)); +} + +static inline void __raw_writew(u16 val, volatile void __iomem *addr) +{ + asm volatile("strh %w0, [%1]" : : "r" (val), "r" (addr)); +} + +static inline void __raw_writel(u32 val, volatile void __iomem *addr) +{ + asm volatile("str %w0, [%1]" : : "r" (val), "r" (addr)); +} + +static inline void __raw_writeq(u64 val, volatile void __iomem *addr) +{ + asm volatile("str %0, [%1]" : : "r" (val), "r" (addr)); +} + +static inline
[PATCH 19/36] AArch64: Device specific operations
This patch adds several definitions for device communication, including I/O accessors and ioremap(). The __raw_* accessors are implemented as inline asm to avoid compiler generation of post-indexed accesses (less efficient to emulate in a virtualised environment). Signed-off-by: Will Deacon will.dea...@arm.com Signed-off-by: Catalin Marinas catalin.mari...@arm.com --- arch/aarch64/include/asm/device.h | 27 arch/aarch64/include/asm/fb.h | 35 + arch/aarch64/include/asm/io.h | 260 + arch/aarch64/kernel/io.c | 65 + arch/aarch64/mm/ioremap.c | 102 +++ 5 files changed, 489 insertions(+), 0 deletions(-) create mode 100644 arch/aarch64/include/asm/device.h create mode 100644 arch/aarch64/include/asm/fb.h create mode 100644 arch/aarch64/include/asm/io.h create mode 100644 arch/aarch64/kernel/io.c create mode 100644 arch/aarch64/mm/ioremap.c diff --git a/arch/aarch64/include/asm/device.h b/arch/aarch64/include/asm/device.h new file mode 100644 index 000..0fc1008 --- /dev/null +++ b/arch/aarch64/include/asm/device.h @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2012 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ASM_DEVICE_H +#define __ASM_DEVICE_H + +struct dev_archdata { + struct dma_map_ops *dma_ops; +}; + +struct pdev_archdata { +}; + +#endif diff --git a/arch/aarch64/include/asm/fb.h b/arch/aarch64/include/asm/fb.h new file mode 100644 index 000..be9167e --- /dev/null +++ b/arch/aarch64/include/asm/fb.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2012 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ASM_FB_H_ +#define __ASM_FB_H_ + +#include linux/fb.h +#include linux/fs.h +#include asm/page.h + +static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma, + unsigned long off) +{ + vma-vm_page_prot = pgprot_writecombine(vma-vm_page_prot); +} + +static inline int fb_is_primary_device(struct fb_info *info) +{ + return 0; +} + +#endif /* __ASM_FB_H_ */ diff --git a/arch/aarch64/include/asm/io.h b/arch/aarch64/include/asm/io.h new file mode 100644 index 000..958cb7c --- /dev/null +++ b/arch/aarch64/include/asm/io.h @@ -0,0 +1,260 @@ +/* + * Based on arch/arm/include/asm/io.h + * + * Copyright (C) 1996-2000 Russell King + * Copyright (C) 2012 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifndef __ASM_IO_H +#define __ASM_IO_H + +#ifdef __KERNEL__ + +#include linux/types.h + +#include asm/byteorder.h +#include asm/barrier.h + +/* + * Generic IO read/write. These perform native-endian accesses. + */ +static inline void __raw_writeb(u8 val, volatile void __iomem *addr) +{ + asm volatile(strb %w0, [%1] : : r (val), r (addr)); +} + +static inline void __raw_writew(u16 val, volatile void __iomem *addr) +{ + asm volatile(strh %w0, [%1] : : r (val), r (addr)); +} + +static inline void __raw_writel(u32 val, volatile void __iomem *addr) +{ + asm volatile(str %w0, [%1] : : r (val), r (addr)); +} + +static inline void __raw_writeq(u64 val, volatile void __iomem