OSDN Git Service

csky: Separate fixaddr_init from highmem
authorGuo Ren <guoren@linux.alibaba.com>
Sun, 1 Dec 2019 14:34:19 +0000 (22:34 +0800)
committerGuo Ren <guoren@linux.alibaba.com>
Fri, 21 Feb 2020 07:43:24 +0000 (15:43 +0800)
After fixaddr_init is separated from highmem, we could use tcm
without highmem selected. (610 (abiv1) don't support highmem,
but it could use tcm now.)

Signed-off-by: Guo Ren <guoren@linux.alibaba.com>
arch/csky/Kconfig
arch/csky/include/asm/fixmap.h
arch/csky/include/asm/memory.h
arch/csky/include/asm/pgtable.h
arch/csky/kernel/setup.c
arch/csky/mm/highmem.c
arch/csky/mm/init.c

index fc92f08..00ac7bc 100644 (file)
@@ -191,7 +191,6 @@ endchoice
 
 menuconfig HAVE_TCM
        bool "Tightly-Coupled/Sram Memory"
-       depends on HIGHMEM
        select GENERIC_ALLOCATOR
        help
          The implementation are not only used by TCM (Tightly-Coupled Meory)
index 4350578..81f9477 100644 (file)
@@ -27,4 +27,8 @@ enum fixed_addresses {
 
 #include <asm-generic/fixmap.h>
 
+extern void fixrange_init(unsigned long start, unsigned long end,
+       pgd_t *pgd_base);
+extern void __init fixaddr_init(void);
+
 #endif /* __ASM_CSKY_FIXMAP_H */
index cdffbd0..a65c675 100644 (file)
@@ -9,6 +9,9 @@
 #include <linux/sizes.h>
 
 #define FIXADDR_TOP    _AC(0xffffc000, UL)
+#define PKMAP_BASE     _AC(0xff800000, UL)
+#define VMALLOC_START  _AC(0xc0008000, UL)
+#define VMALLOC_END    (PKMAP_BASE - (PAGE_SIZE * 2))
 
 #ifdef CONFIG_HAVE_TCM
 #ifdef CONFIG_HAVE_DTCM
index 4b2a41e..9b7764c 100644 (file)
@@ -5,6 +5,7 @@
 #define __ASM_CSKY_PGTABLE_H
 
 #include <asm/fixmap.h>
+#include <asm/memory.h>
 #include <asm/addrspace.h>
 #include <abi/pgtable-bits.h>
 #include <asm-generic/pgtable-nopmd.h>
 #define USER_PTRS_PER_PGD      (0x80000000UL/PGDIR_SIZE)
 #define FIRST_USER_ADDRESS     0UL
 
-#define PKMAP_BASE             (0xff800000)
-
-#define VMALLOC_START          (0xc0008000)
-#define VMALLOC_END            (PKMAP_BASE - 2*PAGE_SIZE)
-
 /*
  * C-SKY is two-level paging structure:
  */
index 52eaf31..4fc7b16 100644 (file)
@@ -133,6 +133,8 @@ void __init setup_arch(char **cmdline_p)
 
        sparse_init();
 
+       fixaddr_init();
+
 #ifdef CONFIG_HIGHMEM
        kmap_init();
 #endif
index 3317b77..8131291 100644 (file)
@@ -117,85 +117,29 @@ struct page *kmap_atomic_to_page(void *ptr)
        return pte_page(*pte);
 }
 
-static void __init fixrange_init(unsigned long start, unsigned long end,
-                               pgd_t *pgd_base)
+static void __init kmap_pages_init(void)
 {
-#ifdef CONFIG_HIGHMEM
-       pgd_t *pgd;
-       pud_t *pud;
-       pmd_t *pmd;
-       pte_t *pte;
-       int i, j, k;
        unsigned long vaddr;
-
-       vaddr = start;
-       i = __pgd_offset(vaddr);
-       j = __pud_offset(vaddr);
-       k = __pmd_offset(vaddr);
-       pgd = pgd_base + i;
-
-       for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) {
-               pud = (pud_t *)pgd;
-               for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) {
-                       pmd = (pmd_t *)pud;
-                       for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) {
-                               if (pmd_none(*pmd)) {
-                                       pte = (pte_t *) memblock_alloc_low(PAGE_SIZE, PAGE_SIZE);
-                                       if (!pte)
-                                               panic("%s: Failed to allocate %lu bytes align=%lx\n",
-                                                     __func__, PAGE_SIZE,
-                                                     PAGE_SIZE);
-
-                                       set_pmd(pmd, __pmd(__pa(pte)));
-                                       BUG_ON(pte != pte_offset_kernel(pmd, 0));
-                               }
-                               vaddr += PMD_SIZE;
-                       }
-                       k = 0;
-               }
-               j = 0;
-       }
-#endif
-}
-
-void __init fixaddr_kmap_pages_init(void)
-{
-       unsigned long vaddr;
-       pgd_t *pgd_base;
-#ifdef CONFIG_HIGHMEM
        pgd_t *pgd;
        pmd_t *pmd;
        pud_t *pud;
        pte_t *pte;
-#endif
-       pgd_base = swapper_pg_dir;
-
-       /*
-        * Fixed mappings:
-        */
-       vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
-       fixrange_init(vaddr, 0, pgd_base);
-
-#ifdef CONFIG_HIGHMEM
-       /*
-        * Permanent kmaps:
-        */
+
        vaddr = PKMAP_BASE;
-       fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
+       fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, swapper_pg_dir);
 
        pgd = swapper_pg_dir + __pgd_offset(vaddr);
        pud = (pud_t *)pgd;
        pmd = pmd_offset(pud, vaddr);
        pte = pte_offset_kernel(pmd, vaddr);
        pkmap_page_table = pte;
-#endif
 }
 
 void __init kmap_init(void)
 {
        unsigned long vaddr;
 
-       fixaddr_kmap_pages_init();
+       kmap_pages_init();
 
        vaddr = __fix_to_virt(FIX_KMAP_BEGIN);
 
index d4c2292..322eb7b 100644 (file)
@@ -101,3 +101,50 @@ void __init pre_mmu_init(void)
        /* Setup page mask to 4k */
        write_mmu_pagemask(0);
 }
+
+void __init fixrange_init(unsigned long start, unsigned long end,
+                       pgd_t *pgd_base)
+{
+       pgd_t *pgd;
+       pud_t *pud;
+       pmd_t *pmd;
+       pte_t *pte;
+       int i, j, k;
+       unsigned long vaddr;
+
+       vaddr = start;
+       i = __pgd_offset(vaddr);
+       j = __pud_offset(vaddr);
+       k = __pmd_offset(vaddr);
+       pgd = pgd_base + i;
+
+       for ( ; (i < PTRS_PER_PGD) && (vaddr != end); pgd++, i++) {
+               pud = (pud_t *)pgd;
+               for ( ; (j < PTRS_PER_PUD) && (vaddr != end); pud++, j++) {
+                       pmd = (pmd_t *)pud;
+                       for (; (k < PTRS_PER_PMD) && (vaddr != end); pmd++, k++) {
+                               if (pmd_none(*pmd)) {
+                                       pte = (pte_t *) memblock_alloc_low(PAGE_SIZE, PAGE_SIZE);
+                                       if (!pte)
+                                               panic("%s: Failed to allocate %lu bytes align=%lx\n",
+                                                     __func__, PAGE_SIZE,
+                                                     PAGE_SIZE);
+
+                                       set_pmd(pmd, __pmd(__pa(pte)));
+                                       BUG_ON(pte != pte_offset_kernel(pmd, 0));
+                               }
+                               vaddr += PMD_SIZE;
+                       }
+                       k = 0;
+               }
+               j = 0;
+       }
+}
+
+void __init fixaddr_init(void)
+{
+       unsigned long vaddr;
+
+       vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
+       fixrange_init(vaddr, vaddr + PMD_SIZE, swapper_pg_dir);
+}