page.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Page management definitions for the Hexagon architecture
  4. *
  5. * Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
  6. */
  7. #ifndef _ASM_PAGE_H
  8. #define _ASM_PAGE_H
  9. #include <linux/const.h>
  10. /* This is probably not the most graceful way to handle this. */
  11. #ifdef CONFIG_PAGE_SIZE_4KB
  12. #define PAGE_SHIFT 12
  13. #define HEXAGON_L1_PTE_SIZE __HVM_PDE_S_4KB
  14. #endif
  15. #ifdef CONFIG_PAGE_SIZE_16KB
  16. #define PAGE_SHIFT 14
  17. #define HEXAGON_L1_PTE_SIZE __HVM_PDE_S_16KB
  18. #endif
  19. #ifdef CONFIG_PAGE_SIZE_64KB
  20. #define PAGE_SHIFT 16
  21. #define HEXAGON_L1_PTE_SIZE __HVM_PDE_S_64KB
  22. #endif
  23. #ifdef CONFIG_PAGE_SIZE_256KB
  24. #define PAGE_SHIFT 18
  25. #define HEXAGON_L1_PTE_SIZE __HVM_PDE_S_256KB
  26. #endif
  27. #ifdef CONFIG_PAGE_SIZE_1MB
  28. #define PAGE_SHIFT 20
  29. #define HEXAGON_L1_PTE_SIZE __HVM_PDE_S_1MB
  30. #endif
  31. /*
  32. * These should be defined in hugetlb.h, but apparently not.
  33. * "Huge" for us should be 4MB or 16MB, which are both represented
  34. * in L1 PTE's. Right now, it's set up for 4MB.
  35. */
  36. #ifdef CONFIG_HUGETLB_PAGE
  37. #define HPAGE_SHIFT 22
  38. #define HPAGE_SIZE (1UL << HPAGE_SHIFT)
  39. #define HPAGE_MASK (~(HPAGE_SIZE-1))
  40. #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT-PAGE_SHIFT)
  41. #define HVM_HUGEPAGE_SIZE 0x5
  42. #endif
  43. #define PAGE_SIZE (1UL << PAGE_SHIFT)
  44. #define PAGE_MASK (~((1 << PAGE_SHIFT) - 1))
  45. #ifdef __KERNEL__
  46. #ifndef __ASSEMBLY__
  47. /*
  48. * This is for PFN_DOWN, which mm.h needs. Seems the right place to pull it in.
  49. */
  50. #include <linux/pfn.h>
  51. /*
  52. * We implement a two-level architecture-specific page table structure.
  53. * Null intermediate page table level (pmd, pud) definitions will come from
  54. * asm-generic/pagetable-nopmd.h and asm-generic/pagetable-nopud.h
  55. */
  56. typedef struct { unsigned long pte; } pte_t;
  57. typedef struct { unsigned long pgd; } pgd_t;
  58. typedef struct { unsigned long pgprot; } pgprot_t;
  59. typedef struct page *pgtable_t;
  60. #define pte_val(x) ((x).pte)
  61. #define pgd_val(x) ((x).pgd)
  62. #define pgprot_val(x) ((x).pgprot)
  63. #define __pte(x) ((pte_t) { (x) })
  64. #define __pgd(x) ((pgd_t) { (x) })
  65. #define __pgprot(x) ((pgprot_t) { (x) })
  66. /*
  67. * We need a __pa and a __va routine for kernel space.
  68. * MIPS says they're only used during mem_init.
  69. * also, check if we need a PHYS_OFFSET.
  70. */
  71. #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + PHYS_OFFSET)
  72. #define __va(x) ((void *)((unsigned long)(x) - PHYS_OFFSET + PAGE_OFFSET))
  73. /* The "page frame" descriptor is defined in linux/mm.h */
  74. struct page;
  75. /* Returns page frame descriptor for virtual address. */
  76. #define virt_to_page(kaddr) pfn_to_page(PFN_DOWN(__pa(kaddr)))
  77. /* Default vm area behavior is non-executable. */
  78. #define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_NON_EXEC
  79. #define pfn_valid(pfn) ((pfn) < max_mapnr)
  80. #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
  81. /* Need to not use a define for linesize; may move this to another file. */
  82. static inline void clear_page(void *page)
  83. {
  84. /* This can only be done on pages with L1 WB cache */
  85. asm volatile(
  86. " loop0(1f,%1);\n"
  87. "1: { dczeroa(%0);\n"
  88. " %0 = add(%0,#32); }:endloop0\n"
  89. : "+r" (page)
  90. : "r" (PAGE_SIZE/32)
  91. : "lc0", "sa0", "memory"
  92. );
  93. }
  94. #define copy_page(to, from) memcpy((to), (from), PAGE_SIZE)
  95. /*
  96. * Under assumption that kernel always "sees" user map...
  97. */
  98. #define clear_user_page(page, vaddr, pg) clear_page(page)
  99. #define copy_user_page(to, from, vaddr, pg) copy_page(to, from)
  100. /*
  101. * page_to_phys - convert page to physical address
  102. * @page - pointer to page entry in mem_map
  103. */
  104. #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
  105. #define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
  106. #define pfn_to_virt(pfn) __va((pfn) << PAGE_SHIFT)
  107. #define page_to_virt(page) __va(page_to_phys(page))
  108. /*
  109. * For port to Hexagon Virtual Machine, MAYBE we check for attempts
  110. * to reference reserved HVM space, but in any case, the VM will be
  111. * protected.
  112. */
  113. #define kern_addr_valid(addr) (1)
  114. #include <asm/mem-layout.h>
  115. #include <asm-generic/memory_model.h>
  116. /* XXX Todo: implement assembly-optimized version of getorder. */
  117. #include <asm-generic/getorder.h>
  118. #endif /* ifdef __ASSEMBLY__ */
  119. #endif /* ifdef __KERNEL__ */
  120. #endif