History

Merge tag 'csky-for-linus-5.4-rc1' of git://github.com/c-sky/csky-linux

Pull csky updates from Guo Ren: "This round of csky subsystem just some fixups: - Fix mb() synchronization problem - Fix dma_alloc_coherent with PAGE_SO attribute - Fix cache_op failed when cross memory ZONEs - Optimize arch_sync_dma_for_cpu/device with dma_inv_range - Fix ioremap function losing - Fix arch_get_unmapped_area() implementation - Fix defer cache flush for 610 - Support kernel non-aligned access - Fix 610 vipt cache flush mechanism - Fix add zero_fp fixup perf backtrace panic - Move static keyword to the front of declaration - Fix csky_pmu.max_period assignment - Use generic free_initrd_mem() - entry: Remove unneeded need_resched() loop" * tag 'csky-for-linus-5.4-rc1' of git://github.com/c-sky/csky-linux: csky: Move static keyword to the front of declaration csky: entry: Remove unneeded need_resched() loop csky: Fixup csky_pmu.max_period assignment csky: Fixup add zero_fp fixup perf backtrace panic csky: Use generic free_initrd_mem() csky: Fixup 610 vipt cache flush mechanism csky: Support kernel non-aligned access csky: Fixup defer cache flush for 610 csky: Fixup arch_get_unmapped_area() implementation csky: Fixup ioremap function losing csky: Optimize arch_sync_dma_for_cpu/device with dma_inv_range csky/dma: Fixup cache_op failed when cross memory ZONEs csky: Fixup dma_alloc_coherent with PAGE_SO attribute csky: Fixup mb() synchronization problem

Linus Torvalds committed 7 years ago

Commit 80b29b62 parents cef0aa0 9af032a17 files · +291 −212Browse files

Unified · Split

17 files
  1. arch/csky/abiv1/alignment.c +45 −17
  2. arch/csky/abiv1/cacheflush.c +47 −23
  3. arch/csky/abiv1/inc/abi/cacheflush.h +31 −14
  4. arch/csky/abiv1/inc/abi/page.h +3 −2
  5. arch/csky/abiv1/mmap.c +40 −35
  6. arch/csky/include/asm/barrier.h +7 −8
  7. arch/csky/include/asm/cache.h +1 −0
  8. arch/csky/include/asm/io.h +12 −11
  9. arch/csky/include/asm/pgtable.h +10 −0
  10. arch/csky/kernel/entry.S +30 −24
  11. arch/csky/kernel/perf_event.c +2 −2
  12. arch/csky/kernel/process.c +1 −1
  13. arch/csky/mm/cachev1.c +6 −1
  14. arch/csky/mm/cachev2.c +10 −1
  15. arch/csky/mm/dma-mapping.c +28 −48
  16. arch/csky/mm/init.c +0 −16
  17. arch/csky/mm/ioremap.c +18 −9
arch/csky/abiv1/alignment.c+45−17
@@ -5,8 +5,10 @@ · 4 unmodified lines
55 #include <linux/uaccess.h>
66 #include <linux/ptrace.h>
77
8−static int align_enable = 1;
9−static int align_count;
8+static int align_kern_enable = 1;
9+static int align_usr_enable = 1;
10+static int align_kern_count = 0;
11+static int align_usr_count = 0;
1012
1113 static inline uint32_t get_ptreg(struct pt_regs *regs, uint32_t rx)
1214 {
@@ -32,9 +34,6 @@ static int ldb_asm(uint32_t addr, uint32_t *valp) · 19 unmodified lines
3234 uint32_t val;
3335 int err;
3436
35− if (!access_ok((void *)addr, 1))
36− return 1;
37−
3837 asm volatile (
3938 "movi %0, 0\n"
4039 "1:\n"
@@ -67,9 +66,6 @@ static int stb_asm(uint32_t addr, uint32_t val) · 26 unmodified lines
6766 {
6867 int err;
6968
70− if (!access_ok((void *)addr, 1))
71− return 1;
72−
7369 asm volatile (
7470 "movi %0, 0\n"
7571 "1:\n"
@@ -203,8 +199,6 @@ static int stw_c(struct pt_regs *regs, uint32_t rz, uint32_t addr) · 127 unmodified lines
203199 if (stb_asm(addr, byte3))
204200 return 1;
205201
206− align_count++;
207−
208202 return 0;
209203 }
210204
@@ -226,7 +220,14 @@ void csky_alignment(struct pt_regs *regs) · 15 unmodified lines
226220 uint32_t addr = 0;
227221
228222 if (!user_mode(regs))
223+ goto kernel_area;
224+
225+ if (!align_usr_enable) {
226+ pr_err("%s user disabled.\n", __func__);
229227 goto bad_area;
228+ }
229+
230+ align_usr_count++;
230231
231232 ret = get_user(tmp, (uint16_t *)instruction_pointer(regs));
232233 if (ret) {
@@ -234,6 +235,19 @@ void csky_alignment(struct pt_regs *regs) · 1 unmodified line
234235 goto bad_area;
235236 }
236237
238+ goto good_area;
239+
240+kernel_area:
241+ if (!align_kern_enable) {
242+ pr_err("%s kernel disabled.\n", __func__);
243+ goto bad_area;
244+ }
245+
246+ align_kern_count++;
247+
248+ tmp = *(uint16_t *)instruction_pointer(regs);
249+
250+good_area:
237251 opcode = (uint32_t)tmp;
238252
239253 rx = opcode & 0xf;
@@ -286,18 +300,32 @@ bad_area: · 46 unmodified lines
286300 force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)addr);
287301 }
288302
289−static struct ctl_table alignment_tbl[4] = {
303+static struct ctl_table alignment_tbl[5] = {
304+ {
305+ .procname = "kernel_enable",
306+ .data = &align_kern_enable,
307+ .maxlen = sizeof(align_kern_enable),
308+ .mode = 0666,
309+ .proc_handler = &proc_dointvec
310+ },
311+ {
312+ .procname = "user_enable",
313+ .data = &align_usr_enable,
314+ .maxlen = sizeof(align_usr_enable),
315+ .mode = 0666,
316+ .proc_handler = &proc_dointvec
317+ },
290318 {
291− .procname = "enable",
292− .data = &align_enable,
293− .maxlen = sizeof(align_enable),
319+ .procname = "kernel_count",
320+ .data = &align_kern_count,
321+ .maxlen = sizeof(align_kern_count),
294322 .mode = 0666,
295323 .proc_handler = &proc_dointvec
296324 },
297325 {
298− .procname = "count",
299− .data = &align_count,
300− .maxlen = sizeof(align_count),
326+ .procname = "user_count",
327+ .data = &align_usr_count,
328+ .maxlen = sizeof(align_usr_count),
301329 .mode = 0666,
302330 .proc_handler = &proc_dointvec
303331 },
arch/csky/abiv1/cacheflush.c+47−23
@@ -11,42 +11,66 @@ · 10 unmodified lines
1111 #include <asm/cacheflush.h>
1212 #include <asm/cachectl.h>
1313
14+#define PG_dcache_clean PG_arch_1
15+
1416 void flush_dcache_page(struct page *page)
1517 {
16− struct address_space *mapping = page_mapping(page);
17− unsigned long addr;
18+ struct address_space *mapping;
1819
19− if (mapping && !mapping_mapped(mapping)) {
20− set_bit(PG_arch_1, &(page)->flags);
20+ if (page == ZERO_PAGE(0))
2121 return;
22− }
2322
24− /*
25− * We could delay the flush for the !page_mapping case too. But that
26− * case is for exec env/arg pages and those are %99 certainly going to
27− * get faulted into the tlb (and thus flushed) anyways.
28− */
29− addr = (unsigned long) page_address(page);
30− dcache_wb_range(addr, addr + PAGE_SIZE);
23+ mapping = page_mapping_file(page);
24+
25+ if (mapping && !page_mapcount(page))
26+ clear_bit(PG_dcache_clean, &page->flags);
27+ else {
28+ dcache_wbinv_all();
29+ if (mapping)
30+ icache_inv_all();
31+ set_bit(PG_dcache_clean, &page->flags);
32+ }
3133 }
34+EXPORT_SYMBOL(flush_dcache_page);
3235
33−void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
34− pte_t *pte)
36+void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr,
37+ pte_t *ptep)
3538 {
36− unsigned long addr;
39+ unsigned long pfn = pte_pfn(*ptep);
3740 struct page *page;
38− unsigned long pfn;
3941
40− pfn = pte_pfn(*pte);
41− if (unlikely(!pfn_valid(pfn)))
42+ if (!pfn_valid(pfn))
4243 return;
4344
4445 page = pfn_to_page(pfn);
45− addr = (unsigned long) page_address(page);
46+ if (page == ZERO_PAGE(0))
47+ return;
48+
49+ if (!test_and_set_bit(PG_dcache_clean, &page->flags))
50+ dcache_wbinv_all();
4651
47− if (vma->vm_flags & VM_EXEC ||
48− pages_do_alias(addr, address & PAGE_MASK))
49− cache_wbinv_all();
52+ if (page_mapping_file(page)) {
53+ if (vma->vm_flags & VM_EXEC)
54+ icache_inv_all();
55+ }
56+}
57+
58+void flush_kernel_dcache_page(struct page *page)
59+{
60+ struct address_space *mapping;
61+
62+ mapping = page_mapping_file(page);
63+
64+ if (!mapping || mapping_mapped(mapping))
65+ dcache_wbinv_all();
66+}
67+EXPORT_SYMBOL(flush_kernel_dcache_page);
68+
69+void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
70+ unsigned long end)
71+{
72+ dcache_wbinv_all();
5073
51− clear_bit(PG_arch_1, &(page)->flags);
74+ if (vma->vm_flags & VM_EXEC)
75+ icache_inv_all();
5276 }
arch/csky/abiv1/inc/abi/cacheflush.h+31−14
@@ -4,46 +4,63 @@ · 3 unmodified lines
44 #ifndef __ABI_CSKY_CACHEFLUSH_H
55 #define __ABI_CSKY_CACHEFLUSH_H
66
7−#include <linux/compiler.h>
7+#include <linux/mm.h>
88 #include <asm/string.h>
99 #include <asm/cache.h>
1010
1111 #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
1212 extern void flush_dcache_page(struct page *);
1313
14−#define flush_cache_mm(mm) cache_wbinv_all()
14+#define flush_cache_mm(mm) dcache_wbinv_all()
1515 #define flush_cache_page(vma, page, pfn) cache_wbinv_all()
1616 #define flush_cache_dup_mm(mm) cache_wbinv_all()
1717
18+#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
19+extern void flush_kernel_dcache_page(struct page *);
20+
21+#define flush_dcache_mmap_lock(mapping) xa_lock_irq(&mapping->i_pages)
22+#define flush_dcache_mmap_unlock(mapping) xa_unlock_irq(&mapping->i_pages)
23+
24+static inline void flush_kernel_vmap_range(void *addr, int size)
25+{
26+ dcache_wbinv_all();
27+}
28+static inline void invalidate_kernel_vmap_range(void *addr, int size)
29+{
30+ dcache_wbinv_all();
31+}
32+
33+#define ARCH_HAS_FLUSH_ANON_PAGE
34+static inline void flush_anon_page(struct vm_area_struct *vma,
35+ struct page *page, unsigned long vmaddr)
36+{
37+ if (PageAnon(page))
38+ cache_wbinv_all();
39+}
40+
1841 /*
1942 * if (current_mm != vma->mm) cache_wbinv_range(start, end) will be broken.
2043 * Use cache_wbinv_all() here and need to be improved in future.
2144 */
22−#define flush_cache_range(vma, start, end) cache_wbinv_all()
23−#define flush_cache_vmap(start, end) cache_wbinv_range(start, end)
24−#define flush_cache_vunmap(start, end) cache_wbinv_range(start, end)
45+extern void flush_cache_range(struct vm_area_struct *vma, unsigned long start, unsigned long end);
46+#define flush_cache_vmap(start, end) cache_wbinv_all()
47+#define flush_cache_vunmap(start, end) cache_wbinv_all()
2548
26−#define flush_icache_page(vma, page) cache_wbinv_all()
49+#define flush_icache_page(vma, page) do {} while (0);
2750 #define flush_icache_range(start, end) cache_wbinv_range(start, end)
2851
29−#define flush_icache_user_range(vma, pg, adr, len) \
30− cache_wbinv_range(adr, adr + len)
52+#define flush_icache_user_range(vma,page,addr,len) \
53+ flush_dcache_page(page)
3154
3255 #define copy_from_user_page(vma, page, vaddr, dst, src, len) \
3356 do { \
34− cache_wbinv_all(); \
3557 memcpy(dst, src, len); \
36− cache_wbinv_all(); \
3758 } while (0)
3859
3960 #define copy_to_user_page(vma, page, vaddr, dst, src, len) \
4061 do { \
41− cache_wbinv_all(); \
4262 memcpy(dst, src, len); \
4363 cache_wbinv_all(); \
4464 } while (0)
4565
46−#define flush_dcache_mmap_lock(mapping) do {} while (0)
47−#define flush_dcache_mmap_unlock(mapping) do {} while (0)
48−
4966 #endif /* __ABI_CSKY_CACHEFLUSH_H */
arch/csky/abiv1/inc/abi/page.h+3−2
@@ -1,13 +1,14 @@
11 /* SPDX-License-Identifier: GPL-2.0 */
22 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
33
4−extern unsigned long shm_align_mask;
4+#include <asm/shmparam.h>
5+
56 extern void flush_dcache_page(struct page *page);
67
78 static inline unsigned long pages_do_alias(unsigned long addr1,
89 unsigned long addr2)
910 {
10− return (addr1 ^ addr2) & shm_align_mask;
11+ return (addr1 ^ addr2) & (SHMLBA-1);
1112 }
1213
1314 static inline void clear_user_page(void *addr, unsigned long vaddr,
arch/csky/abiv1/mmap.c+40−35
@@ -9,58 +9,63 @@ · 8 unmodified lines
99 #include <linux/random.h>
1010 #include <linux/io.h>
1111
12−unsigned long shm_align_mask = (0x4000 >> 1) - 1; /* Sane caches */
12+#define COLOUR_ALIGN(addr,pgoff) \
13+ ((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \
14+ (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1)))
1315
14−#define COLOUR_ALIGN(addr, pgoff) \
15− ((((addr) + shm_align_mask) & ~shm_align_mask) + \
16− (((pgoff) << PAGE_SHIFT) & shm_align_mask))
17−
18−unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
16+/*
17+ * We need to ensure that shared mappings are correctly aligned to
18+ * avoid aliasing issues with VIPT caches. We need to ensure that
19+ * a specific page of an object is always mapped at a multiple of
20+ * SHMLBA bytes.
21+ *
22+ * We unconditionally provide this function for all cases.
23+ */
24+unsigned long
25+arch_get_unmapped_area(struct file *filp, unsigned long addr,
1926 unsigned long len, unsigned long pgoff, unsigned long flags)
2027 {
21− struct vm_area_struct *vmm;
22− int do_color_align;
28+ struct mm_struct *mm = current->mm;
29+ struct vm_area_struct *vma;
30+ int do_align = 0;
31+ struct vm_unmapped_area_info info;
32+
33+ /*
34+ * We only need to do colour alignment if either the I or D
35+ * caches alias.
36+ */
37+ do_align = filp || (flags & MAP_SHARED);
2338
39+ /*
40+ * We enforce the MAP_FIXED case.
41+ */
2442 if (flags & MAP_FIXED) {
25− /*
26− * We do not accept a shared mapping if it would violate
27− * cache aliasing constraints.
28− */
29− if ((flags & MAP_SHARED) &&
30− ((addr - (pgoff << PAGE_SHIFT)) & shm_align_mask))
43+ if (flags & MAP_SHARED &&
44+ (addr - (pgoff << PAGE_SHIFT)) & (SHMLBA - 1))
3145 return -EINVAL;
3246 return addr;
3347 }
3448
3549 if (len > TASK_SIZE)
3650 return -ENOMEM;
37− do_color_align = 0;
38− if (filp || (flags & MAP_SHARED))
39− do_color_align = 1;
51+
4052 if (addr) {
41− if (do_color_align)
53+ if (do_align)
4254 addr = COLOUR_ALIGN(addr, pgoff);
4355 else
4456 addr = PAGE_ALIGN(addr);
45− vmm = find_vma(current->mm, addr);
57+
58+ vma = find_vma(mm, addr);
4659 if (TASK_SIZE - len >= addr &&
47− (!vmm || addr + len <= vmm->vm_start))
60+ (!vma || addr + len <= vm_start_gap(vma)))
4861 return addr;
4962 }
50− addr = TASK_UNMAPPED_BASE;
51− if (do_color_align)
52− addr = COLOUR_ALIGN(addr, pgoff);
53− else
54− addr = PAGE_ALIGN(addr);
5563
56− for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
57− /* At this point: (!vmm || addr < vmm->vm_end). */
58− if (TASK_SIZE - len < addr)
59− return -ENOMEM;
60− if (!vmm || addr + len <= vmm->vm_start)
61− return addr;
62− addr = vmm->vm_end;
63− if (do_color_align)
64− addr = COLOUR_ALIGN(addr, pgoff);
65− }
64+ info.flags = 0;
65+ info.length = len;
66+ info.low_limit = mm->mmap_base;
67+ info.high_limit = TASK_SIZE;
68+ info.align_mask = do_align ? (PAGE_MASK & (SHMLBA - 1)) : 0;
69+ info.align_offset = pgoff << PAGE_SHIFT;
70+ return vm_unmapped_area(&info);
6671 }
arch/csky/include/asm/barrier.h+7−8
@@ -9,11 +9,12 @@ · 8 unmodified lines
99 #define nop() asm volatile ("nop\n":::"memory")
1010
1111 /*
12− * sync: completion barrier
13− * sync.s: completion barrier and shareable to other cores
14− * sync.i: completion barrier with flush cpu pipeline
15− * sync.is: completion barrier with flush cpu pipeline and shareable to
16− * other cores
12+ * sync: completion barrier, all sync.xx instructions
13+ * guarantee the last response recieved by bus transaction
14+ * made by ld/st instructions before sync.s
15+ * sync.s: inherit from sync, but also shareable to other cores
16+ * sync.i: inherit from sync, but also flush cpu pipeline
17+ * sync.is: the same with sync.i + sync.s
1718 *
1819 * bar.brwarw: ordering barrier for all load/store instructions before it
1920 * bar.brwarws: ordering barrier for all load/store instructions before it
@@ -27,9 +28,7 @@ · 7 unmodified lines
2728 */
2829
2930 #ifdef CONFIG_CPU_HAS_CACHEV2
30−#define mb() asm volatile ("bar.brwarw\n":::"memory")
31−#define rmb() asm volatile ("bar.brar\n":::"memory")
32−#define wmb() asm volatile ("bar.bwaw\n":::"memory")
31+#define mb() asm volatile ("sync.s\n":::"memory")
3332
3433 #ifdef CONFIG_SMP
3534 #define __smp_mb() asm volatile ("bar.brwarws\n":::"memory")
arch/csky/include/asm/cache.h+1−0
@@ -24,6 +24,7 @@ void cache_wbinv_range(unsigned long start, unsigned long end); · 23 unmodified lines
2424 void cache_wbinv_all(void);
2525
2626 void dma_wbinv_range(unsigned long start, unsigned long end);
27+void dma_inv_range(unsigned long start, unsigned long end);
2728 void dma_wb_range(unsigned long start, unsigned long end);
2829
2930 #endif
arch/csky/include/asm/io.h+12−11
@@ -4,17 +4,10 @@ · 3 unmodified lines
44 #ifndef __ASM_CSKY_IO_H
55 #define __ASM_CSKY_IO_H
66
7−#include <abi/pgtable-bits.h>
7+#include <asm/pgtable.h>
88 #include <linux/types.h>
99 #include <linux/version.h>
1010
11−extern void __iomem *ioremap(phys_addr_t offset, size_t size);
12−
13−extern void iounmap(void *addr);
14−
15−extern int remap_area_pages(unsigned long address, phys_addr_t phys_addr,
16− size_t size, unsigned long flags);
17−
1811 /*
1912 * I/O memory access primitives. Reads are ordered relative to any
2013 * following Normal memory access. Writes are ordered relative to any prior
@@ -40,9 +33,17 @@ extern int remap_area_pages(unsigned long address, phys_addr_t phys_addr, · 19 unmodified lines
4033 #define writel(v,c) ({ wmb(); writel_relaxed((v),(c)); mb(); })
4134 #endif
4235
43−#define ioremap_nocache(phy, sz) ioremap(phy, sz)
44−#define ioremap_wc ioremap_nocache
45−#define ioremap_wt ioremap_nocache
36+/*
37+ * I/O memory mapping functions.
38+ */
39+extern void __iomem *ioremap_cache(phys_addr_t addr, size_t size);
40+extern void __iomem *__ioremap(phys_addr_t addr, size_t size, pgprot_t prot);
41+extern void iounmap(void *addr);
42+
43+#define ioremap(addr, size) __ioremap((addr), (size), pgprot_noncached(PAGE_KERNEL))
44+#define ioremap_wc(addr, size) __ioremap((addr), (size), pgprot_writecombine(PAGE_KERNEL))
45+#define ioremap_nocache(addr, size) ioremap((addr), (size))
46+#define ioremap_cache ioremap_cache
4647
4748 #include <asm-generic/io.h>
4849
arch/csky/include/asm/pgtable.h+10−0
@@ -258,6 +258,16 @@ static inline pgprot_t pgprot_noncached(pgprot_t _prot) · 257 unmodified lines
258258 {
259259 unsigned long prot = pgprot_val(_prot);
260260
261+ prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED | _PAGE_SO;
262+
263+ return __pgprot(prot);
264+}
265+
266+#define pgprot_writecombine pgprot_writecombine
267+static inline pgprot_t pgprot_writecombine(pgprot_t _prot)
268+{
269+ unsigned long prot = pgprot_val(_prot);
270+
261271 prot = (prot & ~_CACHE_MASK) | _CACHE_UNCACHED;
262272
263273 return __pgprot(prot);
arch/csky/kernel/entry.S+30−24
@@ -17,6 +17,12 @@ · 16 unmodified lines
1717 #define PTE_INDX_SHIFT 10
1818 #define _PGDIR_SHIFT 22
1919
20+.macro zero_fp
21+#ifdef CONFIG_STACKTRACE
22+ movi r8, 0
23+#endif
24+.endm
25+
2026 .macro tlbop_begin name, val0, val1, val2
2127 ENTRY(csky_\name)
2228 mtcr a3, ss2
@@ -96,6 +102,7 @@ ENTRY(csky_\name) · 73 unmodified lines
96102 SAVE_ALL 0
97103 .endm
98104 .macro tlbop_end is_write
105+ zero_fp
99106 RD_MEH a2
100107 psrset ee, ie
101108 mov a0, sp
@@ -120,6 +127,7 @@ tlbop_end 1 · 18 unmodified lines
120127
121128 ENTRY(csky_systemcall)
122129 SAVE_ALL TRAP0_SIZE
130+ zero_fp
123131
124132 psrset ee, ie
125133
@@ -136,9 +144,9 @@ ENTRY(csky_systemcall) · 10 unmodified lines
136144 mov r9, sp
137145 bmaski r10, THREAD_SHIFT
138146 andn r9, r10
139− ldw r8, (r9, TINFO_FLAGS)
140− ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
141− cmpnei r8, 0
147+ ldw r12, (r9, TINFO_FLAGS)
148+ ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
149+ cmpnei r12, 0
142150 bt csky_syscall_trace
143151 #if defined(__CSKYABIV2__)
144152 subi sp, 8
@@ -180,7 +188,7 @@ csky_syscall_trace: · 35 unmodified lines
180188
181189 ENTRY(ret_from_kernel_thread)
182190 jbsr schedule_tail
183− mov a0, r8
191+ mov a0, r10
184192 jsr r9
185193 jbsr ret_from_exception
186194
@@ -189,9 +197,9 @@ ENTRY(ret_from_fork) · 2 unmodified lines
189197 mov r9, sp
190198 bmaski r10, THREAD_SHIFT
191199 andn r9, r10
192− ldw r8, (r9, TINFO_FLAGS)
193− ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
194− cmpnei r8, 0
200+ ldw r12, (r9, TINFO_FLAGS)
201+ ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
202+ cmpnei r12, 0
195203 bf ret_from_exception
196204 mov a0, sp /* sp = pt_regs pointer */
197205 jbsr syscall_trace_exit
@@ -209,9 +217,9 @@ ret_from_exception: · 11 unmodified lines
209217 bmaski r10, THREAD_SHIFT
210218 andn r9, r10
211219
212− ldw r8, (r9, TINFO_FLAGS)
213− andi r8, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
214− cmpnei r8, 0
220+ ldw r12, (r9, TINFO_FLAGS)
221+ andi r12, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
222+ cmpnei r12, 0
215223 bt exit_work
216224 1:
217225 RESTORE_ALL
@@ -220,11 +228,11 @@ exit_work: · 2 unmodified lines
220228 lrw syscallid, ret_from_exception
221229 mov lr, syscallid
222230
223− btsti r8, TIF_NEED_RESCHED
231+ btsti r12, TIF_NEED_RESCHED
224232 bt work_resched
225233
226234 mov a0, sp
227− mov a1, r8
235+ mov a1, r12
228236 jmpi do_notify_resume
229237
230238 work_resched:
@@ -232,6 +240,7 @@ work_resched: · 1 unmodified line
232240
233241 ENTRY(csky_trap)
234242 SAVE_ALL 0
243+ zero_fp
235244 psrset ee
236245 mov a0, sp /* Push Stack pointer arg */
237246 jbsr trap_c /* Call C-level trap handler */
@@ -265,6 +274,7 @@ ENTRY(csky_get_tls) · 27 unmodified lines
265274
266275 ENTRY(csky_irq)
267276 SAVE_ALL 0
277+ zero_fp
268278 psrset ee
269279
270280 #ifdef CONFIG_PREEMPT
@@ -276,27 +286,23 @@ ENTRY(csky_irq) · 5 unmodified lines
276286 * Get task_struct->stack.preempt_count for current,
277287 * and increase 1.
278288 */
279− ldw r8, (r9, TINFO_PREEMPT)
280− addi r8, 1
281− stw r8, (r9, TINFO_PREEMPT)
289+ ldw r12, (r9, TINFO_PREEMPT)
290+ addi r12, 1
291+ stw r12, (r9, TINFO_PREEMPT)
282292 #endif
283293
284294 mov a0, sp
285295 jbsr csky_do_IRQ
286296
287297 #ifdef CONFIG_PREEMPT
288− subi r8, 1
289− stw r8, (r9, TINFO_PREEMPT)
290− cmpnei r8, 0
298+ subi r12, 1
299+ stw r12, (r9, TINFO_PREEMPT)
300+ cmpnei r12, 0
291301 bt 2f
292− ldw r8, (r9, TINFO_FLAGS)
293− btsti r8, TIF_NEED_RESCHED
302+ ldw r12, (r9, TINFO_FLAGS)
303+ btsti r12, TIF_NEED_RESCHED
294304 bf 2f
295−1:
296305 jbsr preempt_schedule_irq /* irq en/disable is done inside */
297− ldw r7, (r9, TINFO_FLAGS) /* get new tasks TI_FLAGS */
298− btsti r7, TIF_NEED_RESCHED
299− bt 1b /* go again */
300306 #endif
301307 2:
302308 jmpi ret_from_exception
arch/csky/kernel/perf_event.c+2−2
@@ -1306,7 +1306,7 @@ int csky_pmu_device_probe(struct platform_device *pdev, · 1305 unmodified lines
13061306 &csky_pmu.count_width)) {
13071307 csky_pmu.count_width = DEFAULT_COUNT_WIDTH;
13081308 }
1309− csky_pmu.max_period = BIT(csky_pmu.count_width) - 1;
1309+ csky_pmu.max_period = BIT_ULL(csky_pmu.count_width) - 1;
13101310
13111311 csky_pmu.plat_device = pdev;
13121312
@@ -1337,7 +1337,7 @@ int csky_pmu_device_probe(struct platform_device *pdev, · 24 unmodified lines
13371337 return ret;
13381338 }
13391339
1340−const static struct of_device_id csky_pmu_of_device_ids[] = {
1340+static const struct of_device_id csky_pmu_of_device_ids[] = {
13411341 {.compatible = "csky,csky-pmu"},
13421342 {},
13431343 };
arch/csky/kernel/process.c+1−1
@@ -55,7 +55,7 @@ int copy_thread(unsigned long clone_flags, · 54 unmodified lines
5555 if (unlikely(p->flags & PF_KTHREAD)) {
5656 memset(childregs, 0, sizeof(struct pt_regs));
5757 childstack->r15 = (unsigned long) ret_from_kernel_thread;
58− childstack->r8 = kthread_arg;
58+ childstack->r10 = kthread_arg;
5959 childstack->r9 = usp;
6060 childregs->sr = mfcr("psr");
6161 } else {
arch/csky/mm/cachev1.c+6−1
@@ -120,7 +120,12 @@ void dma_wbinv_range(unsigned long start, unsigned long end) · 119 unmodified lines
120120 cache_op_range(start, end, DATA_CACHE|CACHE_CLR|CACHE_INV, 1);
121121 }
122122
123+void dma_inv_range(unsigned long start, unsigned long end)
124+{
125+ cache_op_range(start, end, DATA_CACHE|CACHE_CLR|CACHE_INV, 1);
126+}
127+
123128 void dma_wb_range(unsigned long start, unsigned long end)
124129 {
125− cache_op_range(start, end, DATA_CACHE|CACHE_INV, 1);
130+ cache_op_range(start, end, DATA_CACHE|CACHE_CLR|CACHE_INV, 1);
126131 }
arch/csky/mm/cachev2.c+10−1
@@ -69,11 +69,20 @@ void dma_wbinv_range(unsigned long start, unsigned long end) · 68 unmodified lines
6969 sync_is();
7070 }
7171
72+void dma_inv_range(unsigned long start, unsigned long end)
73+{
74+ unsigned long i = start & ~(L1_CACHE_BYTES - 1);
75+
76+ for (; i < end; i += L1_CACHE_BYTES)
77+ asm volatile("dcache.iva %0\n"::"r"(i):"memory");
78+ sync_is();
79+}
80+
7281 void dma_wb_range(unsigned long start, unsigned long end)
7382 {
7483 unsigned long i = start & ~(L1_CACHE_BYTES - 1);
7584
7685 for (; i < end; i += L1_CACHE_BYTES)
77− asm volatile("dcache.civa %0\n"::"r"(i):"memory");
86+ asm volatile("dcache.cva %0\n"::"r"(i):"memory");
7887 sync_is();
7988 }
arch/csky/mm/dma-mapping.c+28−48
@@ -14,69 +14,50 @@ · 13 unmodified lines
1414 #include <linux/version.h>
1515 #include <asm/cache.h>
1616
17−void arch_dma_prep_coherent(struct page *page, size_t size)
18−{
19− if (PageHighMem(page)) {
20− unsigned int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
21−
22− do {
23− void *ptr = kmap_atomic(page);
24− size_t _size = (size < PAGE_SIZE) ? size : PAGE_SIZE;
25−
26− memset(ptr, 0, _size);
27− dma_wbinv_range((unsigned long)ptr,
28− (unsigned long)ptr + _size);
29−
30− kunmap_atomic(ptr);
31−
32− page++;
33− size -= PAGE_SIZE;
34− count--;
35− } while (count);
36− } else {
37− void *ptr = page_address(page);
38−
39− memset(ptr, 0, size);
40− dma_wbinv_range((unsigned long)ptr, (unsigned long)ptr + size);
41− }
42−}
43−
4417 static inline void cache_op(phys_addr_t paddr, size_t size,
4518 void (*fn)(unsigned long start, unsigned long end))
4619 {
47− struct page *page = pfn_to_page(paddr >> PAGE_SHIFT);
48− unsigned int offset = paddr & ~PAGE_MASK;
49− size_t left = size;
50− unsigned long start;
20+ struct page *page = phys_to_page(paddr);
21+ void *start = __va(page_to_phys(page));
22+ unsigned long offset = offset_in_page(paddr);
23+ size_t left = size;
5124
5225 do {
5326 size_t len = left;
5427
28+ if (offset + len > PAGE_SIZE)
29+ len = PAGE_SIZE - offset;
30+
5531 if (PageHighMem(page)) {
56− void *addr;
32+ start = kmap_atomic(page);
5733
58− if (offset + len > PAGE_SIZE) {
59− if (offset >= PAGE_SIZE) {
60− page += offset >> PAGE_SHIFT;
61− offset &= ~PAGE_MASK;
62− }
63− len = PAGE_SIZE - offset;
64− }
34+ fn((unsigned long)start + offset,
35+ (unsigned long)start + offset + len);
6536
66− addr = kmap_atomic(page);
67− start = (unsigned long)(addr + offset);
68− fn(start, start + len);
69− kunmap_atomic(addr);
37+ kunmap_atomic(start);
7038 } else {
71− start = (unsigned long)phys_to_virt(paddr);
72− fn(start, start + size);
39+ fn((unsigned long)start + offset,
40+ (unsigned long)start + offset + len);
7341 }
7442 offset = 0;
43+
7544 page++;
45+ start += PAGE_SIZE;
7646 left -= len;
7747 } while (left);
7848 }
7949
50+static void dma_wbinv_set_zero_range(unsigned long start, unsigned long end)
51+{
52+ memset((void *)start, 0, end - start);
53+ dma_wbinv_range(start, end);
54+}
55+
56+void arch_dma_prep_coherent(struct page *page, size_t size)
57+{
58+ cache_op(page_to_phys(page), size, dma_wbinv_set_zero_range);
59+}
60+
8061 void arch_sync_dma_for_device(struct device *dev, phys_addr_t paddr,
8162 size_t size, enum dma_data_direction dir)
8263 {
@@ -98,11 +79,10 @@ void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr, · 15 unmodified lines
9879 {
9980 switch (dir) {
10081 case DMA_TO_DEVICE:
101− cache_op(paddr, size, dma_wb_range);
102− break;
82+ return;
10383 case DMA_FROM_DEVICE:
10484 case DMA_BIDIRECTIONAL:
105− cache_op(paddr, size, dma_wbinv_range);
85+ cache_op(paddr, size, dma_inv_range);
10686 break;
10787 default:
10888 BUG();
arch/csky/mm/init.c+0−16
@@ -60,22 +60,6 @@ void __init mem_init(void) · 59 unmodified lines
6060 mem_init_print_info(NULL);
6161 }
6262
63−#ifdef CONFIG_BLK_DEV_INITRD
64−void free_initrd_mem(unsigned long start, unsigned long end)
65−{
66− if (start < end)
67− pr_info("Freeing initrd memory: %ldk freed\n",
68− (end - start) >> 10);
69−
70− for (; start < end; start += PAGE_SIZE) {
71− ClearPageReserved(virt_to_page(start));
72− init_page_count(virt_to_page(start));
73− free_page(start);
74− totalram_pages_inc();
75− }
76−}
77−#endif
78−
7963 extern char __init_begin[], __init_end[];
8064
8165 void free_initmem(void)
arch/csky/mm/ioremap.c+18−9
@@ -8,12 +8,12 @@ · 7 unmodified lines
88
99 #include <asm/pgtable.h>
1010
11−void __iomem *ioremap(phys_addr_t addr, size_t size)
11+static void __iomem *__ioremap_caller(phys_addr_t addr, size_t size,
12+ pgprot_t prot, void *caller)
1213 {
1314 phys_addr_t last_addr;
1415 unsigned long offset, vaddr;
1516 struct vm_struct *area;
16− pgprot_t prot;
1717
1818 last_addr = addr + size - 1;
1919 if (!size || last_addr < addr)
@@ -23,15 +23,12 @@ void __iomem *ioremap(phys_addr_t addr, size_t size) · 3 unmodified lines
2323 addr &= PAGE_MASK;
2424 size = PAGE_ALIGN(size + offset);
2525
26− area = get_vm_area_caller(size, VM_ALLOC, __builtin_return_address(0));
26+ area = get_vm_area_caller(size, VM_IOREMAP, caller);
2727 if (!area)
2828 return NULL;
2929
3030 vaddr = (unsigned long)area->addr;
3131
32− prot = __pgprot(_PAGE_PRESENT | __READABLE | __WRITEABLE |
33− _PAGE_GLOBAL | _CACHE_UNCACHED | _PAGE_SO);
34−
3532 if (ioremap_page_range(vaddr, vaddr + size, addr, prot)) {
3633 free_vm_area(area);
3734 return NULL;
@@ -39,7 +36,20 @@ void __iomem *ioremap(phys_addr_t addr, size_t size) · 1 unmodified line
3936
4037 return (void __iomem *)(vaddr + offset);
4138 }
42−EXPORT_SYMBOL(ioremap);
39+
40+void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot)
41+{
42+ return __ioremap_caller(phys_addr, size, prot,
43+ __builtin_return_address(0));
44+}
45+EXPORT_SYMBOL(__ioremap);
46+
47+void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size)
48+{
49+ return __ioremap_caller(phys_addr, size, PAGE_KERNEL,
50+ __builtin_return_address(0));
51+}
52+EXPORT_SYMBOL(ioremap_cache);
4353
4454 void iounmap(void __iomem *addr)
4555 {
@@ -51,10 +61,9 @@ pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, · 5 unmodified lines
5161 unsigned long size, pgprot_t vma_prot)
5262 {
5363 if (!pfn_valid(pfn)) {
54− vma_prot.pgprot |= _PAGE_SO;
5564 return pgprot_noncached(vma_prot);
5665 } else if (file->f_flags & O_SYNC) {
57− return pgprot_noncached(vma_prot);
66+ return pgprot_writecombine(vma_prot);
5867 }
5968
6069 return vma_prot;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t