Merge branch 'unicore32' of git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 4 Apr 2011 15:33:21 +0000 (08:33 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 4 Apr 2011 15:33:21 +0000 (08:33 -0700)
* 'unicore32' of git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32:
  unicore32 framebuffer fix: get videomemory by __get_free_pages() and make it floatable
  unicore32 core architecture: remove duplicated #include
  unicore32 rtc driver fix: cleanup irq_set_freq and irq_set_state
  unicore32 fix: remove arch-specific futex support
  unicore32 ldscript fix: add cacheline parameter to PERCPU() macro

arch/unicore32/Makefile
arch/unicore32/include/asm/futex.h [deleted file]
arch/unicore32/include/mach/PKUnity.h
arch/unicore32/include/mach/memory.h
arch/unicore32/kernel/puv3-core.c
arch/unicore32/kernel/rtc.c
arch/unicore32/kernel/setup.c
arch/unicore32/kernel/traps.c
arch/unicore32/kernel/vmlinux.lds.S
arch/unicore32/mm/mmu.c
drivers/video/fb-puv3.c

index e08d6d3..76a8bee 100644 (file)
@@ -48,7 +48,7 @@ ASM_GENERIC_HEADERS   += bitsperlong.h bug.h bugs.h
 ASM_GENERIC_HEADERS    += cputime.h current.h
 ASM_GENERIC_HEADERS    += device.h div64.h
 ASM_GENERIC_HEADERS    += emergency-restart.h errno.h
-ASM_GENERIC_HEADERS    += fb.h fcntl.h ftrace.h
+ASM_GENERIC_HEADERS    += fb.h fcntl.h ftrace.h futex.h
 ASM_GENERIC_HEADERS    += hardirq.h hw_irq.h
 ASM_GENERIC_HEADERS    += ioctl.h ioctls.h ipcbuf.h irq_regs.h
 ASM_GENERIC_HEADERS    += kdebug.h kmap_types.h
diff --git a/arch/unicore32/include/asm/futex.h b/arch/unicore32/include/asm/futex.h
deleted file mode 100644 (file)
index 07dea61..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * linux/arch/unicore32/include/asm/futex.h
- *
- * Code specific to PKUnity SoC and UniCore ISA
- *
- * Copyright (C) 2001-2010 GUAN Xue-tao
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#ifndef __UNICORE_FUTEX_H__
-#define __UNICORE_FUTEX_H__
-
-#ifdef __KERNEL__
-
-#include <linux/futex.h>
-#include <linux/preempt.h>
-#include <linux/uaccess.h>
-#include <linux/errno.h>
-
-#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg)     \
-       __asm__ __volatile__(                                   \
-       "1:     ldw.u   %1, [%2]\n"                             \
-       "       " insn "\n"                                     \
-       "2:     stw.u   %0, [%2]\n"                             \
-       "       mov     %0, #0\n"                               \
-       "3:\n"                                                  \
-       "       .pushsection __ex_table,\"a\"\n"                \
-       "       .align  3\n"                                    \
-       "       .long   1b, 4f, 2b, 4f\n"                       \
-       "       .popsection\n"                                  \
-       "       .pushsection .fixup,\"ax\"\n"                   \
-       "4:     mov     %0, %4\n"                               \
-       "       b       3b\n"                                   \
-       "       .popsection"                                    \
-       : "=&r" (ret), "=&r" (oldval)                           \
-       : "r" (uaddr), "r" (oparg), "Ir" (-EFAULT)              \
-       : "cc", "memory")
-
-static inline int
-futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
-{
-       int op = (encoded_op >> 28) & 7;
-       int cmp = (encoded_op >> 24) & 15;
-       int oparg = (encoded_op << 8) >> 20;
-       int cmparg = (encoded_op << 20) >> 20;
-       int oldval = 0, ret;
-
-       if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
-               oparg = 1 << oparg;
-
-       if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
-               return -EFAULT;
-
-       pagefault_disable();    /* implies preempt_disable() */
-
-       switch (op) {
-       case FUTEX_OP_SET:
-               __futex_atomic_op("mov  %0, %3", ret, oldval, uaddr, oparg);
-               break;
-       case FUTEX_OP_ADD:
-               __futex_atomic_op("add  %0, %1, %3", ret, oldval, uaddr, oparg);
-               break;
-       case FUTEX_OP_OR:
-               __futex_atomic_op("or   %0, %1, %3", ret, oldval, uaddr, oparg);
-               break;
-       case FUTEX_OP_ANDN:
-               __futex_atomic_op("and  %0, %1, %3",
-                               ret, oldval, uaddr, ~oparg);
-               break;
-       case FUTEX_OP_XOR:
-               __futex_atomic_op("xor  %0, %1, %3", ret, oldval, uaddr, oparg);
-               break;
-       default:
-               ret = -ENOSYS;
-       }
-
-       pagefault_enable();     /* subsumes preempt_enable() */
-
-       if (!ret) {
-               switch (cmp) {
-               case FUTEX_OP_CMP_EQ:
-                       ret = (oldval == cmparg);
-                       break;
-               case FUTEX_OP_CMP_NE:
-                       ret = (oldval != cmparg);
-                       break;
-               case FUTEX_OP_CMP_LT:
-                       ret = (oldval <  cmparg);
-                       break;
-               case FUTEX_OP_CMP_GE:
-                       ret = (oldval >= cmparg);
-                       break;
-               case FUTEX_OP_CMP_LE:
-                       ret = (oldval <= cmparg);
-                       break;
-               case FUTEX_OP_CMP_GT:
-                       ret = (oldval >  cmparg);
-                       break;
-               default:
-                       ret = -ENOSYS;
-               }
-       }
-       return ret;
-}
-
-static inline int
-futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
-{
-       int val;
-
-       if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
-               return -EFAULT;
-
-       pagefault_disable();    /* implies preempt_disable() */
-
-       __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n"
-       "1:     ldw.u   %0, [%3]\n"
-       "       cmpxor.a        %0, %1\n"
-       "       bne     3f\n"
-       "2:     stw.u   %2, [%3]\n"
-       "3:\n"
-       "       .pushsection __ex_table,\"a\"\n"
-       "       .align  3\n"
-       "       .long   1b, 4f, 2b, 4f\n"
-       "       .popsection\n"
-       "       .pushsection .fixup,\"ax\"\n"
-       "4:     mov     %0, %4\n"
-       "       b       3b\n"
-       "       .popsection"
-       : "=&r" (val)
-       : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT)
-       : "cc", "memory");
-
-       pagefault_enable();     /* subsumes preempt_enable() */
-
-       return val;
-}
-
-#endif /* __KERNEL__ */
-#endif /* __UNICORE_FUTEX_H__ */
index a18bdc3..8040d57 100644 (file)
 #define PKUNITY_SDRAM_BASE             0x00000000 /* 0x00000000 - 0x7FFFFFFF 2GB */
 #define PKUNITY_MMIO_BASE              0x80000000 /* 0x80000000 - 0xFFFFFFFF 2GB */
 
-/*
- * PKUNITY Memory Map Addresses: 0x0D000000 - 0x0EFFFFFF (32MB)
- *     0x0D000000 - 0x0DFFFFFF 16MB: for UVC
- *     0x0E000000 - 0x0EFFFFFF 16MB: for UNIGFX
- */
-#define PKUNITY_UVC_MMAP_BASE          0x0D000000
-#define PKUNITY_UVC_MMAP_SIZE          0x01000000 /* 16MB */
-#define PKUNITY_UNIGFX_MMAP_BASE        0x0E000000
-#define PKUNITY_UNIGFX_MMAP_SIZE        0x01000000 /* 16MB */
-
 /*
  * PKUNITY System Bus Addresses (PCI): 0x80000000 - 0xBFFFFFFF (1GB)
  * 0x80000000 - 0x8000000B 12B    PCI Configuration regs
index 0bf21c9..4be72c2 100644 (file)
@@ -50,7 +50,6 @@ void puv3_pci_adjust_zones(unsigned long *size, unsigned long *holes);
 
 /* kuser area */
 #define KUSER_VECPAGE_BASE     (KUSER_BASE + UL(0x3fff0000))
-#define KUSER_UNIGFX_BASE      (PAGE_OFFSET + PKUNITY_UNIGFX_MMAP_BASE)
 /* kuser_vecpage (0xbfff0000) is ro, and vectors page (0xffff0000) is rw */
 #define kuser_vecpage_to_vectors(x)    ((x) - (KUSER_VECPAGE_BASE)     \
                                        + (VECTORS_BASE))
index 8b1b6be..1a505a7 100644 (file)
@@ -99,11 +99,6 @@ static struct resource puv3_unigfx_resources[] = {
                .end    = io_v2p(PKUNITY_UNIGFX_BASE) + 0xfff,
                .flags  = IORESOURCE_MEM,
        },
-       [1] = {
-               .start  = PKUNITY_UNIGFX_MMAP_BASE,
-               .end    = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE,
-               .flags  = IORESOURCE_MEM,
-       },
 };
 
 static struct resource puv3_rtc_resources[] = {
index c5f0682..8cad70b 100644 (file)
@@ -88,11 +88,6 @@ static int puv3_rtc_setpie(struct device *dev, int enabled)
        return 0;
 }
 
-static int puv3_rtc_setfreq(struct device *dev, int freq)
-{
-       return 0;
-}
-
 /* Time read/write */
 
 static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
@@ -214,8 +209,6 @@ static const struct rtc_class_ops puv3_rtcops = {
        .set_time       = puv3_rtc_settime,
        .read_alarm     = puv3_rtc_getalarm,
        .set_alarm      = puv3_rtc_setalarm,
-       .irq_set_freq   = puv3_rtc_setfreq,
-       .irq_set_state  = puv3_rtc_setpie,
        .proc           = puv3_rtc_proc,
 };
 
@@ -294,8 +287,6 @@ static int puv3_rtc_probe(struct platform_device *pdev)
 
        puv3_rtc_enable(pdev, 1);
 
-       puv3_rtc_setfreq(&pdev->dev, 1);
-
        /* register RTC and exit */
 
        rtc = rtc_device_register("pkunity", &pdev->dev, &puv3_rtcops,
index 1e175a8..471b6bc 100644 (file)
@@ -63,12 +63,6 @@ static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
  * Standard memory resources
  */
 static struct resource mem_res[] = {
-       {
-               .name = "Video RAM",
-               .start = 0,
-               .end = 0,
-               .flags = IORESOURCE_MEM
-       },
        {
                .name = "Kernel text",
                .start = 0,
@@ -83,9 +77,8 @@ static struct resource mem_res[] = {
        }
 };
 
-#define video_ram   mem_res[0]
-#define kernel_code mem_res[1]
-#define kernel_data mem_res[2]
+#define kernel_code mem_res[0]
+#define kernel_data mem_res[1]
 
 /*
  * These functions re-use the assembly code in head.S, which
@@ -224,10 +217,6 @@ request_standard_resources(struct meminfo *mi)
                    kernel_data.end <= res->end)
                        request_resource(res, &kernel_data);
        }
-
-       video_ram.start = PKUNITY_UNIGFX_MMAP_BASE;
-       video_ram.end   = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE;
-       request_resource(&iomem_resource, &video_ram);
 }
 
 static void (*init_machine)(void) __initdata;
index 25abbb1..254e36f 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/delay.h>
 #include <linux/hardirq.h>
 #include <linux/init.h>
-#include <linux/uaccess.h>
 #include <linux/atomic.h>
 #include <linux/unistd.h>
 
index 0b4eb89..9bf7f7a 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/thread_info.h>
 #include <asm/memory.h>
 #include <asm/page.h>
+#include <asm/cache.h>
 
 OUTPUT_ARCH(unicore32)
 ENTRY(stext)
@@ -29,7 +30,7 @@ SECTIONS
        HEAD_TEXT_SECTION
        INIT_TEXT_SECTION(PAGE_SIZE)
        INIT_DATA_SECTION(16)
-       PERCPU(PAGE_SIZE)
+       PERCPU(L1_CACHE_BYTES, PAGE_SIZE)
        __init_end = .;
 
        _stext = .;
@@ -45,10 +46,10 @@ SECTIONS
 
        _sdata = .;
        RO_DATA_SECTION(PAGE_SIZE)
-       RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE)
+       RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
        _edata = .;
 
-       EXCEPTION_TABLE(32)
+       EXCEPTION_TABLE(L1_CACHE_BYTES)
        NOTES
 
        BSS_SECTION(0, 0, 0)
index 7bf3d58..db2d334 100644 (file)
@@ -338,15 +338,6 @@ void __init uc32_mm_memblock_reserve(void)
         * and can only be in node 0.
         */
        memblock_reserve(__pa(swapper_pg_dir), PTRS_PER_PGD * sizeof(pgd_t));
-
-#ifdef CONFIG_PUV3_UNIGFX
-       /*
-        * These should likewise go elsewhere.  They pre-reserve the
-        * screen/video memory region at the 48M~64M of main system memory.
-        */
-       memblock_reserve(PKUNITY_UNIGFX_MMAP_BASE, PKUNITY_UNIGFX_MMAP_SIZE);
-       memblock_reserve(PKUNITY_UVC_MMAP_BASE, PKUNITY_UVC_MMAP_SIZE);
-#endif
 }
 
 /*
@@ -370,17 +361,6 @@ static void __init devicemaps_init(void)
        for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE)
                pmd_clear(pmd_off_k(addr));
 
-       /*
-        * Create a mapping for UniGFX VRAM
-        */
-#ifdef CONFIG_PUV3_UNIGFX
-       map.pfn = __phys_to_pfn(PKUNITY_UNIGFX_MMAP_BASE);
-       map.virtual = KUSER_UNIGFX_BASE;
-       map.length = PKUNITY_UNIGFX_MMAP_SIZE;
-       map.type = MT_KUSER;
-       create_mapping(&map);
-#endif
-
        /*
         * Create a mapping for the machine vectors at the high-vectors
         * location (0xffff0000).  If we aren't using high-vectors, also
index dbd2dc4..27f2c57 100644 (file)
@@ -13,7 +13,6 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
-#include <linux/vmalloc.h>
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/fb.h>
@@ -531,7 +530,7 @@ static int unifb_set_par(struct fb_info *info)
                return -EINVAL;
        }
 
-       writel(PKUNITY_UNIGFX_MMAP_BASE, UDE_FSA);
+       writel(info->fix.smem_start, UDE_FSA);
        writel(info->var.yres, UDE_LS);
        writel(get_line_length(info->var.xres,
                        info->var.bits_per_pixel) >> 3, UDE_PS);
@@ -680,13 +679,27 @@ static int unifb_probe(struct platform_device *dev)
        struct fb_info *info;
        u32 unifb_regs[UNIFB_REGS_NUM];
        int retval = -ENOMEM;
-       struct resource *iomem, *mapmem;
+       struct resource *iomem;
+       void *videomemory;
+
+       videomemory = (void *)__get_free_pages(GFP_KERNEL | __GFP_COMP,
+                               get_order(UNIFB_MEMSIZE));
+       if (!videomemory)
+               goto err;
+
+       memset(videomemory, 0, UNIFB_MEMSIZE);
+
+       unifb_fix.smem_start = virt_to_phys(videomemory);
+       unifb_fix.smem_len = UNIFB_MEMSIZE;
+
+       iomem = platform_get_resource(dev, IORESOURCE_MEM, 0);
+       unifb_fix.mmio_start = iomem->start;
 
        info = framebuffer_alloc(sizeof(u32)*256, &dev->dev);
        if (!info)
                goto err;
 
-       info->screen_base = (char __iomem *)KUSER_UNIGFX_BASE;
+       info->screen_base = (char __iomem *)videomemory;
        info->fbops = &unifb_ops;
 
        retval = fb_find_mode(&info->var, info, NULL,
@@ -695,13 +708,6 @@ static int unifb_probe(struct platform_device *dev)
        if (!retval || (retval == 4))
                info->var = unifb_default;
 
-       iomem = platform_get_resource(dev, IORESOURCE_MEM, 0);
-       unifb_fix.mmio_start = iomem->start;
-
-       mapmem = platform_get_resource(dev, IORESOURCE_MEM, 1);
-       unifb_fix.smem_start = mapmem->start;
-       unifb_fix.smem_len = UNIFB_MEMSIZE;
-
        info->fix = unifb_fix;
        info->pseudo_palette = info->par;
        info->par = NULL;