Skip to content

Commit

Permalink
[POWERPC] spufs: restore mapping of mssync register
Browse files Browse the repository at this point in the history
A recent change to the way that the mfc file gets mapped made it
impossible to map the SPE Multi-Source Synchronization register
into user space, but that may be needed by some applications.

This restores the missing functionality.

Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
  • Loading branch information
arnd@arndb.de authored and Paul Mackerras committed Jun 21, 2006
1 parent 91edfa4 commit d9379c4
Showing 1 changed file with 50 additions and 0 deletions.
50 changes: 50 additions & 0 deletions arch/powerpc/platforms/cell/spufs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -824,6 +824,55 @@ static u64 spufs_signal2_type_get(void *data)
DEFINE_SIMPLE_ATTRIBUTE(spufs_signal2_type, spufs_signal2_type_get,
spufs_signal2_type_set, "%llu");

#ifdef CONFIG_SPUFS_MMAP
static struct page *spufs_mss_mmap_nopage(struct vm_area_struct *vma,
unsigned long address, int *type)
{
return spufs_ps_nopage(vma, address, type, 0x0000);
}

static struct vm_operations_struct spufs_mss_mmap_vmops = {
.nopage = spufs_mss_mmap_nopage,
};

/*
* mmap support for problem state MFC DMA area [0x0000 - 0x0fff].
* Mapping this area requires that the application have CAP_SYS_RAWIO,
* as these registers require special care when read/writing.
*/
static int spufs_mss_mmap(struct file *file, struct vm_area_struct *vma)
{
if (!(vma->vm_flags & VM_SHARED))
return -EINVAL;

if (!capable(CAP_SYS_RAWIO))
return -EPERM;

vma->vm_flags |= VM_RESERVED;
vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot)
| _PAGE_NO_CACHE);

vma->vm_ops = &spufs_mss_mmap_vmops;
return 0;
}
#endif

static int spufs_mss_open(struct inode *inode, struct file *file)
{
struct spufs_inode_info *i = SPUFS_I(inode);

file->private_data = i->i_ctx;
return nonseekable_open(inode, file);
}

static struct file_operations spufs_mss_fops = {
.open = spufs_mss_open,
#ifdef CONFIG_SPUFS_MMAP
.mmap = spufs_mss_mmap,
#endif
};


#ifdef CONFIG_SPUFS_MMAP
static struct page *spufs_mfc_mmap_nopage(struct vm_area_struct *vma,
unsigned long address, int *type)
Expand Down Expand Up @@ -1292,6 +1341,7 @@ struct tree_descr spufs_dir_contents[] = {
{ "signal2", &spufs_signal2_fops, 0666, },
{ "signal1_type", &spufs_signal1_type, 0666, },
{ "signal2_type", &spufs_signal2_type, 0666, },
{ "mss", &spufs_mss_fops, 0666, },
{ "mfc", &spufs_mfc_fops, 0666, },
{ "cntl", &spufs_cntl_fops, 0666, },
{ "npc", &spufs_npc_ops, 0666, },
Expand Down

0 comments on commit d9379c4

Please sign in to comment.