diff options
| -rw-r--r-- | arch/tile/Kconfig | 4 | ||||
| -rw-r--r-- | arch/tile/include/asm/compat.h | 2 | ||||
| -rw-r--r-- | arch/tile/include/asm/hardwall.h | 56 | ||||
| -rw-r--r-- | arch/tile/include/asm/processor.h | 17 | ||||
| -rw-r--r-- | arch/tile/kernel/Makefile | 1 | ||||
| -rw-r--r-- | arch/tile/kernel/hardwall.c | 794 | ||||
| -rw-r--r-- | arch/tile/kernel/intvec_32.S | 6 |
7 files changed, 874 insertions, 6 deletions
diff --git a/arch/tile/Kconfig b/arch/tile/Kconfig index 290ef4161939..1eb308cb711a 100644 --- a/arch/tile/Kconfig +++ b/arch/tile/Kconfig | |||
| @@ -310,6 +310,10 @@ config VMALLOC_RESERVE | |||
| 310 | hex | 310 | hex |
| 311 | default 0x1000000 | 311 | default 0x1000000 |
| 312 | 312 | ||
| 313 | config HARDWALL | ||
| 314 | bool "Hardwall support to allow access to user dynamic network" | ||
| 315 | default y | ||
| 316 | |||
| 313 | endmenu # Tilera-specific configuration | 317 | endmenu # Tilera-specific configuration |
| 314 | 318 | ||
| 315 | menu "Bus options" | 319 | menu "Bus options" |
diff --git a/arch/tile/include/asm/compat.h b/arch/tile/include/asm/compat.h index e133c53f6c4f..b09292bcc19f 100644 --- a/arch/tile/include/asm/compat.h +++ b/arch/tile/include/asm/compat.h | |||
| @@ -222,7 +222,7 @@ struct compat_shmid64_ds { | |||
| 222 | 222 | ||
| 223 | static inline void __user *compat_ptr(compat_uptr_t uptr) | 223 | static inline void __user *compat_ptr(compat_uptr_t uptr) |
| 224 | { | 224 | { |
| 225 | return (void __user *)(unsigned long)uptr; | 225 | return (void __user *)(long)(s32)uptr; |
| 226 | } | 226 | } |
| 227 | 227 | ||
| 228 | static inline compat_uptr_t ptr_to_compat(void __user *uptr) | 228 | static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
diff --git a/arch/tile/include/asm/hardwall.h b/arch/tile/include/asm/hardwall.h new file mode 100644 index 000000000000..0bed3ec7b42c --- /dev/null +++ b/arch/tile/include/asm/hardwall.h | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2010 Tilera Corporation. All Rights Reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or | ||
| 5 | * modify it under the terms of the GNU General Public License | ||
| 6 | * as published by the Free Software Foundation, version 2. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, but | ||
| 9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 11 | * NON INFRINGEMENT. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | * | ||
| 14 | * Provide methods for the HARDWALL_FILE for accessing the UDN. | ||
| 15 | */ | ||
| 16 | |||
| 17 | #ifndef _ASM_TILE_HARDWALL_H | ||
| 18 | #define _ASM_TILE_HARDWALL_H | ||
| 19 | |||
| 20 | #include <linux/ioctl.h> | ||
| 21 | |||
| 22 | #define HARDWALL_IOCTL_BASE 0xa2 | ||
| 23 | |||
| 24 | /* | ||
| 25 | * The HARDWALL_CREATE() ioctl is a macro with a "size" argument. | ||
| 26 | * The resulting ioctl value is passed to the kernel in conjunction | ||
| 27 | * with a pointer to a little-endian bitmask of cpus, which must be | ||
| 28 | * physically in a rectangular configuration on the chip. | ||
| 29 | * The "size" is the number of bytes of cpu mask data. | ||
| 30 | */ | ||
| 31 | #define _HARDWALL_CREATE 1 | ||
| 32 | #define HARDWALL_CREATE(size) \ | ||
| 33 | _IOC(_IOC_READ, HARDWALL_IOCTL_BASE, _HARDWALL_CREATE, (size)) | ||
| 34 | |||
| 35 | #define _HARDWALL_ACTIVATE 2 | ||
| 36 | #define HARDWALL_ACTIVATE \ | ||
| 37 | _IO(HARDWALL_IOCTL_BASE, _HARDWALL_ACTIVATE) | ||
| 38 | |||
| 39 | #define _HARDWALL_DEACTIVATE 3 | ||
| 40 | #define HARDWALL_DEACTIVATE \ | ||
| 41 | _IO(HARDWALL_IOCTL_BASE, _HARDWALL_DEACTIVATE) | ||
| 42 | |||
| 43 | #ifndef __KERNEL__ | ||
| 44 | |||
| 45 | /* This is the canonical name expected by userspace. */ | ||
| 46 | #define HARDWALL_FILE "/dev/hardwall" | ||
| 47 | |||
| 48 | #else | ||
| 49 | |||
| 50 | /* Hook for /proc/tile/hardwall. */ | ||
| 51 | struct seq_file; | ||
| 52 | int proc_tile_hardwall_show(struct seq_file *sf, void *v); | ||
| 53 | |||
| 54 | #endif | ||
| 55 | |||
| 56 | #endif /* _ASM_TILE_HARDWALL_H */ | ||
diff --git a/arch/tile/include/asm/processor.h b/arch/tile/include/asm/processor.h index 96c50d2c4c2b..09584e263b00 100644 --- a/arch/tile/include/asm/processor.h +++ b/arch/tile/include/asm/processor.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | * NOTE: we don't include <linux/ptrace.h> or <linux/percpu.h> as one | 21 | * NOTE: we don't include <linux/ptrace.h> or <linux/percpu.h> as one |
| 22 | * normally would, due to #include dependencies. | 22 | * normally would, due to #include dependencies. |
| 23 | */ | 23 | */ |
| 24 | #include <linux/types.h> | ||
| 24 | #include <asm/ptrace.h> | 25 | #include <asm/ptrace.h> |
| 25 | #include <asm/percpu.h> | 26 | #include <asm/percpu.h> |
| 26 | 27 | ||
| @@ -29,7 +30,6 @@ | |||
| 29 | 30 | ||
| 30 | struct task_struct; | 31 | struct task_struct; |
| 31 | struct thread_struct; | 32 | struct thread_struct; |
| 32 | struct list_head; | ||
| 33 | 33 | ||
| 34 | typedef struct { | 34 | typedef struct { |
| 35 | unsigned long seg; | 35 | unsigned long seg; |
| @@ -74,6 +74,9 @@ struct async_tlb { | |||
| 74 | unsigned long address; /* what address faulted? */ | 74 | unsigned long address; /* what address faulted? */ |
| 75 | }; | 75 | }; |
| 76 | 76 | ||
| 77 | #ifdef CONFIG_HARDWALL | ||
| 78 | struct hardwall_info; | ||
| 79 | #endif | ||
| 77 | 80 | ||
| 78 | struct thread_struct { | 81 | struct thread_struct { |
| 79 | /* kernel stack pointer */ | 82 | /* kernel stack pointer */ |
| @@ -100,6 +103,12 @@ struct thread_struct { | |||
| 100 | /* Any other miscellaneous processor state bits */ | 103 | /* Any other miscellaneous processor state bits */ |
| 101 | unsigned long proc_status; | 104 | unsigned long proc_status; |
| 102 | #endif | 105 | #endif |
| 106 | #ifdef CONFIG_HARDWALL | ||
| 107 | /* Is this task tied to an activated hardwall? */ | ||
| 108 | struct hardwall_info *hardwall; | ||
| 109 | /* Chains this task into the list at hardwall->list. */ | ||
| 110 | struct list_head hardwall_list; | ||
| 111 | #endif | ||
| 103 | #if CHIP_HAS_TILE_DMA() | 112 | #if CHIP_HAS_TILE_DMA() |
| 104 | /* Async DMA TLB fault information */ | 113 | /* Async DMA TLB fault information */ |
| 105 | struct async_tlb dma_async_tlb; | 114 | struct async_tlb dma_async_tlb; |
| @@ -194,8 +203,6 @@ static inline void release_thread(struct task_struct *dead_task) | |||
| 194 | 203 | ||
| 195 | extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); | 204 | extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); |
| 196 | 205 | ||
| 197 | /* Helper routines for setting home cache modes at exec() time. */ | ||
| 198 | |||
| 199 | 206 | ||
| 200 | /* | 207 | /* |
| 201 | * Return saved (kernel) PC of a blocked thread. | 208 | * Return saved (kernel) PC of a blocked thread. |
| @@ -240,6 +247,10 @@ struct siginfo; | |||
| 240 | extern void arch_coredump_signal(struct siginfo *, struct pt_regs *); | 247 | extern void arch_coredump_signal(struct siginfo *, struct pt_regs *); |
| 241 | #define arch_coredump_signal arch_coredump_signal | 248 | #define arch_coredump_signal arch_coredump_signal |
| 242 | 249 | ||
| 250 | /* Info on this processor (see fs/proc/cpuinfo.c) */ | ||
| 251 | struct seq_operations; | ||
| 252 | extern const struct seq_operations cpuinfo_op; | ||
| 253 | |||
| 243 | /* Provide information about the chip model. */ | 254 | /* Provide information about the chip model. */ |
| 244 | extern char chip_model[64]; | 255 | extern char chip_model[64]; |
| 245 | 256 | ||
diff --git a/arch/tile/kernel/Makefile b/arch/tile/kernel/Makefile index 756e6ec452d3..112b1e248f05 100644 --- a/arch/tile/kernel/Makefile +++ b/arch/tile/kernel/Makefile | |||
| @@ -8,6 +8,7 @@ obj-y := backtrace.o entry.o init_task.o irq.o messaging.o \ | |||
| 8 | setup.o signal.o single_step.o stack.o sys.o time.o traps.o \ | 8 | setup.o signal.o single_step.o stack.o sys.o time.o traps.o \ |
| 9 | intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o | 9 | intvec_$(BITS).o regs_$(BITS).o tile-desc_$(BITS).o |
| 10 | 10 | ||
| 11 | obj-$(CONFIG_HARDWALL) += hardwall.o | ||
| 11 | obj-$(CONFIG_TILEGX) += futex_64.o | 12 | obj-$(CONFIG_TILEGX) += futex_64.o |
| 12 | obj-$(CONFIG_COMPAT) += compat.o compat_signal.o | 13 | obj-$(CONFIG_COMPAT) += compat.o compat_signal.o |
| 13 | obj-$(CONFIG_SMP) += smpboot.o smp.o tlb.o | 14 | obj-$(CONFIG_SMP) += smpboot.o smp.o tlb.o |
diff --git a/arch/tile/kernel/hardwall.c b/arch/tile/kernel/hardwall.c new file mode 100644 index 000000000000..7bf0627b733d --- /dev/null +++ b/arch/tile/kernel/hardwall.c | |||
| @@ -0,0 +1,794 @@ | |||
| 1 | /* | ||
| 2 | * Copyright 2010 Tilera Corporation. All Rights Reserved. | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or | ||
| 5 | * modify it under the terms of the GNU General Public License | ||
| 6 | * as published by the Free Software Foundation, version 2. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, but | ||
| 9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or | ||
| 11 | * NON INFRINGEMENT. See the GNU General Public License for | ||
| 12 | * more details. | ||
| 13 | */ | ||
| 14 | |||
| 15 | #include <linux/fs.h> | ||
| 16 | #include <linux/proc_fs.h> | ||
| 17 | #include <linux/seq_file.h> | ||
| 18 | #include <linux/rwsem.h> | ||
| 19 | #include <linux/kprobes.h> | ||
| 20 | #include <linux/sched.h> | ||
| 21 | #include <linux/hardirq.h> | ||
| 22 | #include <linux/uaccess.h> | ||
| 23 | #include <linux/smp.h> | ||
| 24 | #include <linux/cdev.h> | ||
| 25 | #include <linux/compat.h> | ||
| 26 | #include <asm/hardwall.h> | ||
| 27 | #include <asm/traps.h> | ||
| 28 | #include <asm/siginfo.h> | ||
| 29 | #include <asm/irq_regs.h> | ||
| 30 | |||
| 31 | #include <arch/interrupts.h> | ||
| 32 | |||
