source: mainline/kernel/arch/sparc64/src/mm/page.c@ 61e90dd

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 61e90dd was 06e1e95, checked in by Jakub Jermar <jakub@…>, 19 years ago

C99 compliant header guards (hopefully) everywhere in the kernel.
Formatting and indentation changes.
Small improvements in sparc64.

  • Property mode set to 100644
File size: 3.6 KB
Line 
1/*
2 * Copyright (C) 2005 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup sparc64mm
30 * @{
31 */
32/** @file
33 */
34
35#include <arch/mm/page.h>
36#include <arch/mm/tlb.h>
37#include <genarch/mm/page_ht.h>
38#include <mm/frame.h>
39#include <arch/mm/frame.h>
40#include <bitops.h>
41#include <debug.h>
42#include <align.h>
43
44void page_arch_init(void)
45{
46 page_mapping_operations = &ht_mapping_operations;
47}
48
49/** Map memory-mapped device into virtual memory.
50 *
51 * So far, only DTLB is used to map devices into memory.
52 * Chances are that there will be only a limited amount of
53 * devices that the kernel itself needs to lock in DTLB.
54 *
55 * @param physaddr Physical address of the page where the
56 * device is located. Must be at least
57 * page-aligned.
58 * @param size Size of the device's registers. Must not
59 * exceed 4M and must include extra space
60 * caused by the alignment.
61 *
62 * @return Virtual address of the page where the device is
63 * mapped.
64 */
65uintptr_t hw_map(uintptr_t physaddr, size_t size)
66{
67 unsigned int order;
68 int i;
69
70 struct {
71 int pagesize;
72 size_t increment;
73 count_t count;
74 } sizemap[] = {
75 { PAGESIZE_8K, 0, 1 }, /* 8K */
76 { PAGESIZE_8K, PAGE_SIZE, 2 }, /* 16K */
77 { PAGESIZE_8K, PAGE_SIZE, 4 }, /* 32K */
78 { PAGESIZE_64K, 0, 1}, /* 64K */
79 { PAGESIZE_64K, 8*PAGE_SIZE, 2 }, /* 128K */
80 { PAGESIZE_64K, 8*PAGE_SIZE, 4 }, /* 256K */
81 { PAGESIZE_512K, 0, 1 }, /* 512K */
82 { PAGESIZE_512K, 64*PAGE_SIZE, 2 }, /* 1M */
83 { PAGESIZE_512K, 64*PAGE_SIZE, 4 }, /* 2M */
84 { PAGESIZE_4M, 0, 1 } /* 4M */
85 };
86
87 ASSERT(ALIGN_UP(physaddr, PAGE_SIZE) == physaddr);
88 ASSERT(size <= 4*1024*1024);
89
90 if (size <= FRAME_SIZE)
91 order = 0;
92 else
93 order = (fnzb64(size - 1) + 1) - FRAME_WIDTH;
94
95 /*
96 * Use virtual addresses that are beyond the limit of physical memory.
97 * Thus, the physical address space will not be wasted by holes created
98 * by frame_alloc().
99 */
100 ASSERT(last_frame);
101 uintptr_t virtaddr = ALIGN_UP(last_frame, 1<<(order + FRAME_WIDTH));
102 last_frame = ALIGN_UP(virtaddr + size, 1<<(order + FRAME_WIDTH));
103
104 for (i = 0; i < sizemap[order].count; i++)
105 dtlb_insert_mapping(virtaddr + i*sizemap[order].increment,
106 physaddr + i*sizemap[order].increment,
107 sizemap[order].pagesize, true, false);
108
109 return virtaddr;
110}
111
112/** @}
113 */
Note: See TracBrowser for help on using the repository browser.