]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00174323 vpu: Fix system hang issue of multi-instances processing
authorSammy He <r62914@freescale.com>
Tue, 14 Feb 2012 02:09:05 +0000 (10:09 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Fri, 24 May 2013 06:34:00 +0000 (08:34 +0200)
VPU registers have been mapped with ioremap() at probe which
L_PTE_XN is 1, and the same physical address must be mapped multiple
times with same type when doing mmap() to user space, so also need
to set it to 1. Otherwise, there may be unexpected result in video
codec.
Here, Use new defined pgprot_noncachedxn for vm_page_prot in mmap().

Signed-off-by: Sammy He <r62914@freescale.com>
drivers/mxc/vpu/mxc_vpu.c

index 0e0e03835e87113be14e567c18a9edf0bd9c3df6..20d523aac9e1cfae052841a45725f178aec986ac 100644 (file)
 
 #include <mach/mxc_vpu.h>
 
+/* Define one new pgprot which combined uncached and XN(never executable) */
+#define pgprot_noncachedxn(prot) \
+       __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED | L_PTE_XN)
+
 struct vpu_priv {
        struct fasync_struct *async_queue;
        struct work_struct work;
@@ -511,7 +515,13 @@ static int vpu_map_hwregs(struct file *fp, struct vm_area_struct *vm)
        unsigned long pfn;
 
        vm->vm_flags |= VM_IO | VM_RESERVED;
-       vm->vm_page_prot = pgprot_noncached(vm->vm_page_prot);
+       /*
+        * Since vpu registers have been mapped with ioremap() at probe
+        * which L_PTE_XN is 1, and the same physical address must be
+        * mapped multiple times with same type, so set L_PTE_XN to 1 here.
+        * Otherwise, there may be unexpected result in video codec.
+        */
+       vm->vm_page_prot = pgprot_noncachedxn(vm->vm_page_prot);
        pfn = phy_vpu_base_addr >> PAGE_SHIFT;
        pr_debug("size=0x%x,  page no.=0x%x\n",
                 (int)(vm->vm_end - vm->vm_start), (int)pfn);