diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2012-03-29 13:58:43 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2012-05-25 12:48:24 -0400 |
commit | d5d14ed6f2db7287a5088e1350cf422bf72140b3 (patch) | |
tree | 19f0bc20bb6f1995a1e4f75dc58e388c047f7d23 /arch/tile/lib | |
parent | 47d632f9f8f3ed62b21f725e98b726d65769b6d7 (diff) |
arch/tile: Allow tilegx to build with either 16K or 64K page size
This change introduces new flags for the hv_install_context()
API that passes a page table pointer to the hypervisor. Clients
can explicitly request 4K, 16K, or 64K small pages when they
install a new context. In practice, the page size is fixed at
kernel compile time and the same size is always requested every
time a new page table is installed.
The <hv/hypervisor.h> header changes so that it provides more abstract
macros for managing "page" things like PFNs and page tables. For
example there is now a HV_DEFAULT_PAGE_SIZE_SMALL instead of the old
HV_PAGE_SIZE_SMALL. The various PFN routines have been eliminated and
only PA- or PTFN-based ones remain (since PTFNs are always expressed
in fixed 2KB "page" size). The page-table management macros are
renamed with a leading underscore and take page-size arguments with
the presumption that clients will use those macros in some single
place to provide the "real" macros they will use themselves.
I happened to notice the old hv_set_caching() API was totally broken
(it assumed 4KB pages) so I changed it so it would nominally work
correctly with other page sizes.
Tag modules with the page size so you can't load a module built with
a conflicting page size. (And add a test for SMP while we're at it.)
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Diffstat (limited to 'arch/tile/lib')
-rw-r--r-- | arch/tile/lib/memcpy_tile64.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/arch/tile/lib/memcpy_tile64.c b/arch/tile/lib/memcpy_tile64.c index b2fe15e01075..3bc4b4e40d93 100644 --- a/arch/tile/lib/memcpy_tile64.c +++ b/arch/tile/lib/memcpy_tile64.c | |||
@@ -160,7 +160,7 @@ retry_source: | |||
160 | break; | 160 | break; |
161 | if (get_remote_cache_cpu(src_pte) == smp_processor_id()) | 161 | if (get_remote_cache_cpu(src_pte) == smp_processor_id()) |
162 | break; | 162 | break; |
163 | src_page = pfn_to_page(hv_pte_get_pfn(src_pte)); | 163 | src_page = pfn_to_page(pte_pfn(src_pte)); |
164 | get_page(src_page); | 164 | get_page(src_page); |
165 | if (pte_val(src_pte) != pte_val(*src_ptep)) { | 165 | if (pte_val(src_pte) != pte_val(*src_ptep)) { |
166 | put_page(src_page); | 166 | put_page(src_page); |
@@ -168,7 +168,7 @@ retry_source: | |||
168 | } | 168 | } |
169 | if (pte_huge(src_pte)) { | 169 | if (pte_huge(src_pte)) { |
170 | /* Adjust the PTE to correspond to a small page */ | 170 | /* Adjust the PTE to correspond to a small page */ |
171 | int pfn = hv_pte_get_pfn(src_pte); | 171 | int pfn = pte_pfn(src_pte); |
172 | pfn += (((unsigned long)source & (HPAGE_SIZE-1)) | 172 | pfn += (((unsigned long)source & (HPAGE_SIZE-1)) |
173 | >> PAGE_SHIFT); | 173 | >> PAGE_SHIFT); |
174 | src_pte = pfn_pte(pfn, src_pte); | 174 | src_pte = pfn_pte(pfn, src_pte); |
@@ -188,7 +188,7 @@ retry_dest: | |||
188 | put_page(src_page); | 188 | put_page(src_page); |
189 | break; | 189 | break; |
190 | } | 190 | } |
191 | dst_page = pfn_to_page(hv_pte_get_pfn(dst_pte)); | 191 | dst_page = pfn_to_page(pte_pfn(dst_pte)); |
192 | if (dst_page == src_page) { | 192 | if (dst_page == src_page) { |
193 | /* | 193 | /* |
194 | * Source and dest are on the same page; this | 194 | * Source and dest are on the same page; this |
@@ -206,7 +206,7 @@ retry_dest: | |||
206 | } | 206 | } |
207 | if (pte_huge(dst_pte)) { | 207 | if (pte_huge(dst_pte)) { |
208 | /* Adjust the PTE to correspond to a small page */ | 208 | /* Adjust the PTE to correspond to a small page */ |
209 | int pfn = hv_pte_get_pfn(dst_pte); | 209 | int pfn = pte_pfn(dst_pte); |
210 | pfn += (((unsigned long)dest & (HPAGE_SIZE-1)) | 210 | pfn += (((unsigned long)dest & (HPAGE_SIZE-1)) |
211 | >> PAGE_SHIFT); | 211 | >> PAGE_SHIFT); |
212 | dst_pte = pfn_pte(pfn, dst_pte); | 212 | dst_pte = pfn_pte(pfn, dst_pte); |