Commit 3230ca9dc656a2354b679e2e62ee7740485563a9
Exists in
master
and in
7 other branches
Merge branch 'unicore32' of git://git.kernel.org/pub/scm/linux/kernel/git/epip/linux-2.6-unicore32
* '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
Showing 11 changed files Side-by-side Diff
- arch/unicore32/Makefile
- arch/unicore32/include/asm/futex.h
- 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
arch/unicore32/Makefile
... | ... | @@ -48,7 +48,7 @@ |
48 | 48 | ASM_GENERIC_HEADERS += cputime.h current.h |
49 | 49 | ASM_GENERIC_HEADERS += device.h div64.h |
50 | 50 | ASM_GENERIC_HEADERS += emergency-restart.h errno.h |
51 | -ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h | |
51 | +ASM_GENERIC_HEADERS += fb.h fcntl.h ftrace.h futex.h | |
52 | 52 | ASM_GENERIC_HEADERS += hardirq.h hw_irq.h |
53 | 53 | ASM_GENERIC_HEADERS += ioctl.h ioctls.h ipcbuf.h irq_regs.h |
54 | 54 | ASM_GENERIC_HEADERS += kdebug.h kmap_types.h |
arch/unicore32/include/asm/futex.h
1 | -/* | |
2 | - * linux/arch/unicore32/include/asm/futex.h | |
3 | - * | |
4 | - * Code specific to PKUnity SoC and UniCore ISA | |
5 | - * | |
6 | - * Copyright (C) 2001-2010 GUAN Xue-tao | |
7 | - * | |
8 | - * This program is free software; you can redistribute it and/or modify | |
9 | - * it under the terms of the GNU General Public License version 2 as | |
10 | - * published by the Free Software Foundation. | |
11 | - */ | |
12 | - | |
13 | -#ifndef __UNICORE_FUTEX_H__ | |
14 | -#define __UNICORE_FUTEX_H__ | |
15 | - | |
16 | -#ifdef __KERNEL__ | |
17 | - | |
18 | -#include <linux/futex.h> | |
19 | -#include <linux/preempt.h> | |
20 | -#include <linux/uaccess.h> | |
21 | -#include <linux/errno.h> | |
22 | - | |
23 | -#define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ | |
24 | - __asm__ __volatile__( \ | |
25 | - "1: ldw.u %1, [%2]\n" \ | |
26 | - " " insn "\n" \ | |
27 | - "2: stw.u %0, [%2]\n" \ | |
28 | - " mov %0, #0\n" \ | |
29 | - "3:\n" \ | |
30 | - " .pushsection __ex_table,\"a\"\n" \ | |
31 | - " .align 3\n" \ | |
32 | - " .long 1b, 4f, 2b, 4f\n" \ | |
33 | - " .popsection\n" \ | |
34 | - " .pushsection .fixup,\"ax\"\n" \ | |
35 | - "4: mov %0, %4\n" \ | |
36 | - " b 3b\n" \ | |
37 | - " .popsection" \ | |
38 | - : "=&r" (ret), "=&r" (oldval) \ | |
39 | - : "r" (uaddr), "r" (oparg), "Ir" (-EFAULT) \ | |
40 | - : "cc", "memory") | |
41 | - | |
42 | -static inline int | |
43 | -futex_atomic_op_inuser(int encoded_op, int __user *uaddr) | |
44 | -{ | |
45 | - int op = (encoded_op >> 28) & 7; | |
46 | - int cmp = (encoded_op >> 24) & 15; | |
47 | - int oparg = (encoded_op << 8) >> 20; | |
48 | - int cmparg = (encoded_op << 20) >> 20; | |
49 | - int oldval = 0, ret; | |
50 | - | |
51 | - if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) | |
52 | - oparg = 1 << oparg; | |
53 | - | |
54 | - if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | |
55 | - return -EFAULT; | |
56 | - | |
57 | - pagefault_disable(); /* implies preempt_disable() */ | |
58 | - | |
59 | - switch (op) { | |
60 | - case FUTEX_OP_SET: | |
61 | - __futex_atomic_op("mov %0, %3", ret, oldval, uaddr, oparg); | |
62 | - break; | |
63 | - case FUTEX_OP_ADD: | |
64 | - __futex_atomic_op("add %0, %1, %3", ret, oldval, uaddr, oparg); | |
65 | - break; | |
66 | - case FUTEX_OP_OR: | |
67 | - __futex_atomic_op("or %0, %1, %3", ret, oldval, uaddr, oparg); | |
68 | - break; | |
69 | - case FUTEX_OP_ANDN: | |
70 | - __futex_atomic_op("and %0, %1, %3", | |
71 | - ret, oldval, uaddr, ~oparg); | |
72 | - break; | |
73 | - case FUTEX_OP_XOR: | |
74 | - __futex_atomic_op("xor %0, %1, %3", ret, oldval, uaddr, oparg); | |
75 | - break; | |
76 | - default: | |
77 | - ret = -ENOSYS; | |
78 | - } | |
79 | - | |
80 | - pagefault_enable(); /* subsumes preempt_enable() */ | |
81 | - | |
82 | - if (!ret) { | |
83 | - switch (cmp) { | |
84 | - case FUTEX_OP_CMP_EQ: | |
85 | - ret = (oldval == cmparg); | |
86 | - break; | |
87 | - case FUTEX_OP_CMP_NE: | |
88 | - ret = (oldval != cmparg); | |
89 | - break; | |
90 | - case FUTEX_OP_CMP_LT: | |
91 | - ret = (oldval < cmparg); | |
92 | - break; | |
93 | - case FUTEX_OP_CMP_GE: | |
94 | - ret = (oldval >= cmparg); | |
95 | - break; | |
96 | - case FUTEX_OP_CMP_LE: | |
97 | - ret = (oldval <= cmparg); | |
98 | - break; | |
99 | - case FUTEX_OP_CMP_GT: | |
100 | - ret = (oldval > cmparg); | |
101 | - break; | |
102 | - default: | |
103 | - ret = -ENOSYS; | |
104 | - } | |
105 | - } | |
106 | - return ret; | |
107 | -} | |
108 | - | |
109 | -static inline int | |
110 | -futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval) | |
111 | -{ | |
112 | - int val; | |
113 | - | |
114 | - if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) | |
115 | - return -EFAULT; | |
116 | - | |
117 | - pagefault_disable(); /* implies preempt_disable() */ | |
118 | - | |
119 | - __asm__ __volatile__("@futex_atomic_cmpxchg_inatomic\n" | |
120 | - "1: ldw.u %0, [%3]\n" | |
121 | - " cmpxor.a %0, %1\n" | |
122 | - " bne 3f\n" | |
123 | - "2: stw.u %2, [%3]\n" | |
124 | - "3:\n" | |
125 | - " .pushsection __ex_table,\"a\"\n" | |
126 | - " .align 3\n" | |
127 | - " .long 1b, 4f, 2b, 4f\n" | |
128 | - " .popsection\n" | |
129 | - " .pushsection .fixup,\"ax\"\n" | |
130 | - "4: mov %0, %4\n" | |
131 | - " b 3b\n" | |
132 | - " .popsection" | |
133 | - : "=&r" (val) | |
134 | - : "r" (oldval), "r" (newval), "r" (uaddr), "Ir" (-EFAULT) | |
135 | - : "cc", "memory"); | |
136 | - | |
137 | - pagefault_enable(); /* subsumes preempt_enable() */ | |
138 | - | |
139 | - return val; | |
140 | -} | |
141 | - | |
142 | -#endif /* __KERNEL__ */ | |
143 | -#endif /* __UNICORE_FUTEX_H__ */ |
arch/unicore32/include/mach/PKUnity.h
... | ... | @@ -24,16 +24,6 @@ |
24 | 24 | #define PKUNITY_MMIO_BASE 0x80000000 /* 0x80000000 - 0xFFFFFFFF 2GB */ |
25 | 25 | |
26 | 26 | /* |
27 | - * PKUNITY Memory Map Addresses: 0x0D000000 - 0x0EFFFFFF (32MB) | |
28 | - * 0x0D000000 - 0x0DFFFFFF 16MB: for UVC | |
29 | - * 0x0E000000 - 0x0EFFFFFF 16MB: for UNIGFX | |
30 | - */ | |
31 | -#define PKUNITY_UVC_MMAP_BASE 0x0D000000 | |
32 | -#define PKUNITY_UVC_MMAP_SIZE 0x01000000 /* 16MB */ | |
33 | -#define PKUNITY_UNIGFX_MMAP_BASE 0x0E000000 | |
34 | -#define PKUNITY_UNIGFX_MMAP_SIZE 0x01000000 /* 16MB */ | |
35 | - | |
36 | -/* | |
37 | 27 | * PKUNITY System Bus Addresses (PCI): 0x80000000 - 0xBFFFFFFF (1GB) |
38 | 28 | * 0x80000000 - 0x8000000B 12B PCI Configuration regs |
39 | 29 | * 0x80010000 - 0x80010250 592B PCI Bridge Base |
arch/unicore32/include/mach/memory.h
... | ... | @@ -50,7 +50,6 @@ |
50 | 50 | |
51 | 51 | /* kuser area */ |
52 | 52 | #define KUSER_VECPAGE_BASE (KUSER_BASE + UL(0x3fff0000)) |
53 | -#define KUSER_UNIGFX_BASE (PAGE_OFFSET + PKUNITY_UNIGFX_MMAP_BASE) | |
54 | 53 | /* kuser_vecpage (0xbfff0000) is ro, and vectors page (0xffff0000) is rw */ |
55 | 54 | #define kuser_vecpage_to_vectors(x) ((x) - (KUSER_VECPAGE_BASE) \ |
56 | 55 | + (VECTORS_BASE)) |
arch/unicore32/kernel/puv3-core.c
... | ... | @@ -99,11 +99,6 @@ |
99 | 99 | .end = io_v2p(PKUNITY_UNIGFX_BASE) + 0xfff, |
100 | 100 | .flags = IORESOURCE_MEM, |
101 | 101 | }, |
102 | - [1] = { | |
103 | - .start = PKUNITY_UNIGFX_MMAP_BASE, | |
104 | - .end = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE, | |
105 | - .flags = IORESOURCE_MEM, | |
106 | - }, | |
107 | 102 | }; |
108 | 103 | |
109 | 104 | static struct resource puv3_rtc_resources[] = { |
arch/unicore32/kernel/rtc.c
... | ... | @@ -88,11 +88,6 @@ |
88 | 88 | return 0; |
89 | 89 | } |
90 | 90 | |
91 | -static int puv3_rtc_setfreq(struct device *dev, int freq) | |
92 | -{ | |
93 | - return 0; | |
94 | -} | |
95 | - | |
96 | 91 | /* Time read/write */ |
97 | 92 | |
98 | 93 | static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm) |
... | ... | @@ -214,8 +209,6 @@ |
214 | 209 | .set_time = puv3_rtc_settime, |
215 | 210 | .read_alarm = puv3_rtc_getalarm, |
216 | 211 | .set_alarm = puv3_rtc_setalarm, |
217 | - .irq_set_freq = puv3_rtc_setfreq, | |
218 | - .irq_set_state = puv3_rtc_setpie, | |
219 | 212 | .proc = puv3_rtc_proc, |
220 | 213 | }; |
221 | 214 | |
... | ... | @@ -293,8 +286,6 @@ |
293 | 286 | } |
294 | 287 | |
295 | 288 | puv3_rtc_enable(pdev, 1); |
296 | - | |
297 | - puv3_rtc_setfreq(&pdev->dev, 1); | |
298 | 289 | |
299 | 290 | /* register RTC and exit */ |
300 | 291 |
arch/unicore32/kernel/setup.c
... | ... | @@ -64,12 +64,6 @@ |
64 | 64 | */ |
65 | 65 | static struct resource mem_res[] = { |
66 | 66 | { |
67 | - .name = "Video RAM", | |
68 | - .start = 0, | |
69 | - .end = 0, | |
70 | - .flags = IORESOURCE_MEM | |
71 | - }, | |
72 | - { | |
73 | 67 | .name = "Kernel text", |
74 | 68 | .start = 0, |
75 | 69 | .end = 0, |
... | ... | @@ -83,9 +77,8 @@ |
83 | 77 | } |
84 | 78 | }; |
85 | 79 | |
86 | -#define video_ram mem_res[0] | |
87 | -#define kernel_code mem_res[1] | |
88 | -#define kernel_data mem_res[2] | |
80 | +#define kernel_code mem_res[0] | |
81 | +#define kernel_data mem_res[1] | |
89 | 82 | |
90 | 83 | /* |
91 | 84 | * These functions re-use the assembly code in head.S, which |
... | ... | @@ -224,10 +217,6 @@ |
224 | 217 | kernel_data.end <= res->end) |
225 | 218 | request_resource(res, &kernel_data); |
226 | 219 | } |
227 | - | |
228 | - video_ram.start = PKUNITY_UNIGFX_MMAP_BASE; | |
229 | - video_ram.end = PKUNITY_UNIGFX_MMAP_BASE + PKUNITY_UNIGFX_MMAP_SIZE; | |
230 | - request_resource(&iomem_resource, &video_ram); | |
231 | 220 | } |
232 | 221 | |
233 | 222 | static void (*init_machine)(void) __initdata; |
arch/unicore32/kernel/traps.c
arch/unicore32/kernel/vmlinux.lds.S
... | ... | @@ -14,6 +14,7 @@ |
14 | 14 | #include <asm/thread_info.h> |
15 | 15 | #include <asm/memory.h> |
16 | 16 | #include <asm/page.h> |
17 | +#include <asm/cache.h> | |
17 | 18 | |
18 | 19 | OUTPUT_ARCH(unicore32) |
19 | 20 | ENTRY(stext) |
... | ... | @@ -29,7 +30,7 @@ |
29 | 30 | HEAD_TEXT_SECTION |
30 | 31 | INIT_TEXT_SECTION(PAGE_SIZE) |
31 | 32 | INIT_DATA_SECTION(16) |
32 | - PERCPU(PAGE_SIZE) | |
33 | + PERCPU(L1_CACHE_BYTES, PAGE_SIZE) | |
33 | 34 | __init_end = .; |
34 | 35 | |
35 | 36 | _stext = .; |
36 | 37 | |
... | ... | @@ -45,10 +46,10 @@ |
45 | 46 | |
46 | 47 | _sdata = .; |
47 | 48 | RO_DATA_SECTION(PAGE_SIZE) |
48 | - RW_DATA_SECTION(32, PAGE_SIZE, THREAD_SIZE) | |
49 | + RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) | |
49 | 50 | _edata = .; |
50 | 51 | |
51 | - EXCEPTION_TABLE(32) | |
52 | + EXCEPTION_TABLE(L1_CACHE_BYTES) | |
52 | 53 | NOTES |
53 | 54 | |
54 | 55 | BSS_SECTION(0, 0, 0) |
arch/unicore32/mm/mmu.c
... | ... | @@ -338,15 +338,6 @@ |
338 | 338 | * and can only be in node 0. |
339 | 339 | */ |
340 | 340 | memblock_reserve(__pa(swapper_pg_dir), PTRS_PER_PGD * sizeof(pgd_t)); |
341 | - | |
342 | -#ifdef CONFIG_PUV3_UNIGFX | |
343 | - /* | |
344 | - * These should likewise go elsewhere. They pre-reserve the | |
345 | - * screen/video memory region at the 48M~64M of main system memory. | |
346 | - */ | |
347 | - memblock_reserve(PKUNITY_UNIGFX_MMAP_BASE, PKUNITY_UNIGFX_MMAP_SIZE); | |
348 | - memblock_reserve(PKUNITY_UVC_MMAP_BASE, PKUNITY_UVC_MMAP_SIZE); | |
349 | -#endif | |
350 | 341 | } |
351 | 342 | |
352 | 343 | /* |
... | ... | @@ -369,17 +360,6 @@ |
369 | 360 | |
370 | 361 | for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE) |
371 | 362 | pmd_clear(pmd_off_k(addr)); |
372 | - | |
373 | - /* | |
374 | - * Create a mapping for UniGFX VRAM | |
375 | - */ | |
376 | -#ifdef CONFIG_PUV3_UNIGFX | |
377 | - map.pfn = __phys_to_pfn(PKUNITY_UNIGFX_MMAP_BASE); | |
378 | - map.virtual = KUSER_UNIGFX_BASE; | |
379 | - map.length = PKUNITY_UNIGFX_MMAP_SIZE; | |
380 | - map.type = MT_KUSER; | |
381 | - create_mapping(&map); | |
382 | -#endif | |
383 | 363 | |
384 | 364 | /* |
385 | 365 | * Create a mapping for the machine vectors at the high-vectors |
drivers/video/fb-puv3.c
... | ... | @@ -13,7 +13,6 @@ |
13 | 13 | #include <linux/module.h> |
14 | 14 | #include <linux/kernel.h> |
15 | 15 | #include <linux/errno.h> |
16 | -#include <linux/vmalloc.h> | |
17 | 16 | #include <linux/platform_device.h> |
18 | 17 | #include <linux/clk.h> |
19 | 18 | #include <linux/fb.h> |
... | ... | @@ -531,7 +530,7 @@ |
531 | 530 | return -EINVAL; |
532 | 531 | } |
533 | 532 | |
534 | - writel(PKUNITY_UNIGFX_MMAP_BASE, UDE_FSA); | |
533 | + writel(info->fix.smem_start, UDE_FSA); | |
535 | 534 | writel(info->var.yres, UDE_LS); |
536 | 535 | writel(get_line_length(info->var.xres, |
537 | 536 | info->var.bits_per_pixel) >> 3, UDE_PS); |
538 | 537 | |
539 | 538 | |
... | ... | @@ -680,13 +679,27 @@ |
680 | 679 | struct fb_info *info; |
681 | 680 | u32 unifb_regs[UNIFB_REGS_NUM]; |
682 | 681 | int retval = -ENOMEM; |
683 | - struct resource *iomem, *mapmem; | |
682 | + struct resource *iomem; | |
683 | + void *videomemory; | |
684 | 684 | |
685 | + videomemory = (void *)__get_free_pages(GFP_KERNEL | __GFP_COMP, | |
686 | + get_order(UNIFB_MEMSIZE)); | |
687 | + if (!videomemory) | |
688 | + goto err; | |
689 | + | |
690 | + memset(videomemory, 0, UNIFB_MEMSIZE); | |
691 | + | |
692 | + unifb_fix.smem_start = virt_to_phys(videomemory); | |
693 | + unifb_fix.smem_len = UNIFB_MEMSIZE; | |
694 | + | |
695 | + iomem = platform_get_resource(dev, IORESOURCE_MEM, 0); | |
696 | + unifb_fix.mmio_start = iomem->start; | |
697 | + | |
685 | 698 | info = framebuffer_alloc(sizeof(u32)*256, &dev->dev); |
686 | 699 | if (!info) |
687 | 700 | goto err; |
688 | 701 | |
689 | - info->screen_base = (char __iomem *)KUSER_UNIGFX_BASE; | |
702 | + info->screen_base = (char __iomem *)videomemory; | |
690 | 703 | info->fbops = &unifb_ops; |
691 | 704 | |
692 | 705 | retval = fb_find_mode(&info->var, info, NULL, |
... | ... | @@ -694,13 +707,6 @@ |
694 | 707 | |
695 | 708 | if (!retval || (retval == 4)) |
696 | 709 | info->var = unifb_default; |
697 | - | |
698 | - iomem = platform_get_resource(dev, IORESOURCE_MEM, 0); | |
699 | - unifb_fix.mmio_start = iomem->start; | |
700 | - | |
701 | - mapmem = platform_get_resource(dev, IORESOURCE_MEM, 1); | |
702 | - unifb_fix.smem_start = mapmem->start; | |
703 | - unifb_fix.smem_len = UNIFB_MEMSIZE; | |
704 | 710 | |
705 | 711 | info->fix = unifb_fix; |
706 | 712 | info->pseudo_palette = info->par; |