diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2010-06-25 17:00:56 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2010-07-06 13:34:15 -0400 |
commit | 9f9c0382cda2334b35b40b00f4ed9d6f89f37a7b (patch) | |
tree | 8d862fd0883343e8788f86b8f7d37823db0e19a5 /arch/tile/include | |
parent | fb702b942bf638baa6cbbbda9f76794db62921ef (diff) | |
download | talos-op-linux-9f9c0382cda2334b35b40b00f4ed9d6f89f37a7b.tar.gz talos-op-linux-9f9c0382cda2334b35b40b00f4ed9d6f89f37a7b.zip |
arch/tile: Add driver to enable access to the user dynamic network.
This network (the "UDN") connects all the cpus on the chip in a
wormhole-routed dynamic network. Subrectangles of the chip can
be allocated by a "create" ioctl on /dev/hardwall, and then to access the
UDN in that rectangle, tasks must perform an "activate" ioctl on that
same file object after affinitizing themselves to a single cpu in
the region. Sending a wormhole-routed message that tries to leave
that subrectangle causes all activated tasks to receive a SIGILL
(just as they would if they tried to access the UDN without first
activating themselves to a hardwall rectangle).
The original submission of this code to LKML had the driver
instantiated under /proc/tile/hardwall. Now we just use a character
device for this, conventionally /dev/hardwall. Some futures planning
for the TILE-Gx chip suggests that we may want to have other types of
devices that share the general model of "bind a task to a cpu, then
'activate' a file descriptor on a pseudo-device that gives access to
some hardware resource". As such, we are using a device rather
than, for example, a syscall, to set up and activate this code.
As part of this change, the compat_ptr() declaration was fixed and used
to pass the compat_ioctl argument to the normal ioctl. So far we limit
compat code to 2GB, so the difference between zero-extend and sign-extend
(the latter being correct, eventually) had been overlooked.
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'arch/tile/include')
-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 |
3 files changed, 71 insertions, 4 deletions
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 { static inline void __user *compat_ptr(compat_uptr_t uptr) { - return (void __user *)(unsigned long)uptr; + return (void __user *)(long)(s32)uptr; } 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 @@ +/* + * Copyright 2010 Tilera Corporation. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, version 2. + * + * 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, GOOD TITLE or + * NON INFRINGEMENT. See the GNU General Public License for + * more details. + * + * Provide methods for the HARDWALL_FILE for accessing the UDN. + */ + +#ifndef _ASM_TILE_HARDWALL_H +#define _ASM_TILE_HARDWALL_H + +#include <linux/ioctl.h> + +#define HARDWALL_IOCTL_BASE 0xa2 + +/* + * The HARDWALL_CREATE() ioctl is a macro with a "size" argument. + * The resulting ioctl value is passed to the kernel in conjunction + * with a pointer to a little-endian bitmask of cpus, which must be + * physically in a rectangular configuration on the chip. + * The "size" is the number of bytes of cpu mask data. + */ +#define _HARDWALL_CREATE 1 +#define HARDWALL_CREATE(size) \ + _IOC(_IOC_READ, HARDWALL_IOCTL_BASE, _HARDWALL_CREATE, (size)) + +#define _HARDWALL_ACTIVATE 2 +#define HARDWALL_ACTIVATE \ + _IO(HARDWALL_IOCTL_BASE, _HARDWALL_ACTIVATE) + +#define _HARDWALL_DEACTIVATE 3 +#define HARDWALL_DEACTIVATE \ + _IO(HARDWALL_IOCTL_BASE, _HARDWALL_DEACTIVATE) + +#ifndef __KERNEL__ + +/* This is the canonical name expected by userspace. */ +#define HARDWALL_FILE "/dev/hardwall" + +#else + +/* Hook for /proc/tile/hardwall. */ +struct seq_file; +int proc_tile_hardwall_show(struct seq_file *sf, void *v); + +#endif + +#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 @@ * NOTE: we don't include <linux/ptrace.h> or <linux/percpu.h> as one * normally would, due to #include dependencies. */ +#include <linux/types.h> #include <asm/ptrace.h> #include <asm/percpu.h> @@ -29,7 +30,6 @@ struct task_struct; struct thread_struct; -struct list_head; typedef struct { unsigned long seg; @@ -74,6 +74,9 @@ struct async_tlb { unsigned long address; /* what address faulted? */ }; +#ifdef CONFIG_HARDWALL +struct hardwall_info; +#endif struct thread_struct { /* kernel stack pointer */ @@ -100,6 +103,12 @@ struct thread_struct { /* Any other miscellaneous processor state bits */ unsigned long proc_status; #endif +#ifdef CONFIG_HARDWALL + /* Is this task tied to an activated hardwall? */ + struct hardwall_info *hardwall; + /* Chains this task into the list at hardwall->list. */ + struct list_head hardwall_list; +#endif #if CHIP_HAS_TILE_DMA() /* Async DMA TLB fault information */ struct async_tlb dma_async_tlb; @@ -194,8 +203,6 @@ static inline void release_thread(struct task_struct *dead_task) extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags); -/* Helper routines for setting home cache modes at exec() time. */ - /* * Return saved (kernel) PC of a blocked thread. @@ -240,6 +247,10 @@ struct siginfo; extern void arch_coredump_signal(struct siginfo *, struct pt_regs *); #define arch_coredump_signal arch_coredump_signal +/* Info on this processor (see fs/proc/cpuinfo.c) */ +struct seq_operations; +extern const struct seq_operations cpuinfo_op; + /* Provide information about the chip model. */ extern char chip_model[64]; |