Subversion Repositories HelenOS

Rev

Rev 2015 | Rev 2071 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2015 Rev 2048
Line 43... Line 43...
43
#include <config.h>
43
#include <config.h>
44
 
44
 
45
#ifdef CONFIG_SMP
45
#ifdef CONFIG_SMP
46
/** Entries locked in DTLB of BSP.
46
/** Entries locked in DTLB of BSP.
47
 *
47
 *
48
 * Application processors need to have the same locked entries
48
 * Application processors need to have the same locked entries in their DTLBs as
49
 * in their DTLBs as the bootstrap processor.
49
 * the bootstrap processor.
50
 */
50
 */
51
static struct {
51
static struct {
52
    uintptr_t virt_page;
52
    uintptr_t virt_page;
53
    uintptr_t phys_page;
53
    uintptr_t phys_page;
54
    int pagesize_code;
54
    int pagesize_code;
Line 82... Line 82...
82
    }
82
    }
83
}
83
}
84
 
84
 
85
/** Map memory-mapped device into virtual memory.
85
/** Map memory-mapped device into virtual memory.
86
 *
86
 *
87
 * So far, only DTLB is used to map devices into memory.
87
 * So far, only DTLB is used to map devices into memory. Chances are that there
88
 * Chances are that there will be only a limited amount of
88
 * will be only a limited amount of devices that the kernel itself needs to
89
 * devices that the kernel itself needs to lock in DTLB.
89
 * lock in DTLB.
90
 *
90
 *
91
 * @param physaddr Physical address of the page where the
91
 * @param physaddr Physical address of the page where the device is located.
92
 *         device is located. Must be at least
-
 
93
 *         page-aligned.
92
 *  Must be at least page-aligned.
94
 * @param size Size of the device's registers. Must not
93
 * @param size Size of the device's registers. Must not exceed 4M and must
95
 *         exceed 4M and must include extra space
-
 
96
 *         caused by the alignment.
94
 *  include extra space caused by the alignment.
97
 *
95
 *
98
 * @return Virtual address of the page where the device is
96
 * @return Virtual address of the page where the device is mapped.
99
 *     mapped.
-
 
100
 */
97
 */
101
uintptr_t hw_map(uintptr_t physaddr, size_t size)
98
uintptr_t hw_map(uintptr_t physaddr, size_t size)
102
{
99
{
103
    unsigned int order;
100
    unsigned int order;
104
    int i;
101
    int i;
Line 112... Line 109...
112
    } sizemap[] = {
109
    } sizemap[] = {
113
        { PAGESIZE_8K, 0, 1 },          /* 8K */
110
        { PAGESIZE_8K, 0, 1 },          /* 8K */
114
        { PAGESIZE_8K, PAGE_SIZE, 2 },      /* 16K */
111
        { PAGESIZE_8K, PAGE_SIZE, 2 },      /* 16K */
115
        { PAGESIZE_8K, PAGE_SIZE, 4 },      /* 32K */
112
        { PAGESIZE_8K, PAGE_SIZE, 4 },      /* 32K */
116
        { PAGESIZE_64K, 0, 1},          /* 64K */
113
        { PAGESIZE_64K, 0, 1},          /* 64K */
117
        { PAGESIZE_64K, 8*PAGE_SIZE, 2 },   /* 128K */
114
        { PAGESIZE_64K, 8 * PAGE_SIZE, 2 }, /* 128K */
118
        { PAGESIZE_64K, 8*PAGE_SIZE, 4 },   /* 256K */
115
        { PAGESIZE_64K, 8 * PAGE_SIZE, 4 }, /* 256K */
119
        { PAGESIZE_512K, 0, 1 },        /* 512K */
116
        { PAGESIZE_512K, 0, 1 },        /* 512K */
120
        { PAGESIZE_512K, 64*PAGE_SIZE, 2 }, /* 1M */
117
        { PAGESIZE_512K, 64 * PAGE_SIZE, 2 },   /* 1M */
121
        { PAGESIZE_512K, 64*PAGE_SIZE, 4 }, /* 2M */
118
        { PAGESIZE_512K, 64 * PAGE_SIZE, 4 },   /* 2M */
122
        { PAGESIZE_4M, 0, 1 },          /* 4M */
119
        { PAGESIZE_4M, 0, 1 },          /* 4M */
123
        { PAGESIZE_4M, 512*PAGE_SIZE, 2 }   /* 8M */
120
        { PAGESIZE_4M, 512 * PAGE_SIZE, 2 } /* 8M */
124
    };
121
    };
125
   
122
   
126
    ASSERT(ALIGN_UP(physaddr, PAGE_SIZE) == physaddr);
123
    ASSERT(ALIGN_UP(physaddr, PAGE_SIZE) == physaddr);
127
    ASSERT(size <= 8*1024*1024);
124
    ASSERT(size <= 8 * 1024 * 1024);
128
   
125
   
129
    if (size <= FRAME_SIZE)
126
    if (size <= FRAME_SIZE)
130
        order = 0;
127
        order = 0;
131
    else
128
    else
132
        order = (fnzb64(size - 1) + 1) - FRAME_WIDTH;
129
        order = (fnzb64(size - 1) + 1) - FRAME_WIDTH;
Line 142... Line 139...
142
   
139
   
143
    for (i = 0; i < sizemap[order].count; i++) {
140
    for (i = 0; i < sizemap[order].count; i++) {
144
        /*
141
        /*
145
         * First, insert the mapping into DTLB.
142
         * First, insert the mapping into DTLB.
146
         */
143
         */
147
        dtlb_insert_mapping(virtaddr + i*sizemap[order].increment,
144
        dtlb_insert_mapping(virtaddr + i * sizemap[order].increment,
148
                    physaddr + i*sizemap[order].increment,
145
            physaddr + i * sizemap[order].increment,
149
                    sizemap[order].pagesize_code, true, false);
146
            sizemap[order].pagesize_code, true, false);
150
   
147
   
151
#ifdef CONFIG_SMP   
148
#ifdef CONFIG_SMP   
152
        /*
149
        /*
153
         * Second, save the information about the mapping for APs.
150
         * Second, save the information about the mapping for APs.
154
         */
151
         */
155
        bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].virt_page =
152
        bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].virt_page =
156
            virtaddr + i*sizemap[order].increment;
153
            virtaddr + i * sizemap[order].increment;
157
        bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].phys_page =
154
        bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].phys_page =
158
            physaddr + i*sizemap[order].increment;
155
            physaddr + i * sizemap[order].increment;
159
        bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].pagesize_code =
156
        bsp_locked_dtlb_entry[bsp_locked_dtlb_entries].pagesize_code =
160
            sizemap[order].pagesize_code;
157
            sizemap[order].pagesize_code;
161
        bsp_locked_dtlb_entries++;
158
        bsp_locked_dtlb_entries++;
162
#endif
159
#endif
163
    }
160
    }