1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * arc_hostlink.c: Pseudo-driver for Metaware provided "hostlink" facility 4 * 5 * Allows Linux userland access to host in absence of any peripherals. 6 * 7 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 8 */ 9 10 #include <linux/fs.h> /* file_operations */ 11 #include <linux/miscdevice.h> 12 #include <linux/mm.h> /* VM_IO */ 13 #include <linux/module.h> 14 #include <linux/uaccess.h> 15 16 static unsigned char __HOSTLINK__[4 * PAGE_SIZE] __aligned(PAGE_SIZE); 17 18 static int arc_hl_mmap(struct file *fp, struct vm_area_struct *vma) 19 { 20 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 21 22 if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, 23 vma->vm_end - vma->vm_start, 24 vma->vm_page_prot)) { 25 pr_warn("Hostlink buffer mmap ERROR\n"); 26 return -EAGAIN; 27 } 28 return 0; 29 } 30 31 static long arc_hl_ioctl(struct file *file, unsigned int cmd, 32 unsigned long arg) 33 { 34 /* we only support, returning the physical addr to mmap in user space */ 35 put_user((unsigned int)__HOSTLINK__, (int __user *)arg); 36 return 0; 37 } 38 39 static const struct file_operations arc_hl_fops = { 40 .unlocked_ioctl = arc_hl_ioctl, 41 .mmap = arc_hl_mmap, 42 }; 43 44 static struct miscdevice arc_hl_dev = { 45 .minor = MISC_DYNAMIC_MINOR, 46 .name = "hostlink", 47 .fops = &arc_hl_fops 48 }; 49 50 static int __init arc_hl_init(void) 51 { 52 pr_info("ARC Hostlink driver mmap at 0x%p\n", __HOSTLINK__); 53 return misc_register(&arc_hl_dev); 54 } 55 module_init(arc_hl_init); 56