Subversion Repositories HelenOS-historic

Rev

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

Rev 1772 Rev 1782
Line 27... Line 27...
27
 */
27
 */
28
 
28
 
29
#include "ofw.h"
29
#include "ofw.h"
30
#include <printf.h>
30
#include <printf.h>
31
#include <asm.h>
31
#include <asm.h>
-
 
32
#include <types.h>
32
 
33
 
33
#define MAX_OFW_ARGS        10
34
#define MAX_OFW_ARGS        10
34
 
35
 
35
/** OpenFirmware command structure
36
/** OpenFirmware command structure
36
 *
37
 *
Line 165... Line 166...
165
}
166
}
166
 
167
 
167
 
168
 
168
void *ofw_translate(const void *virt)
169
void *ofw_translate(const void *virt)
169
{
170
{
170
    ofw_arg_t result[3];
171
    ofw_arg_t result[4];
-
 
172
    int shift;
171
   
173
 
172
    if (ofw_call("call-method", 4, 4, result, "translate", ofw_mmu, virt, 1) != 0) {
174
    if (ofw_call("call-method", 3, 5, result, "translate", ofw_mmu, virt) != 0) {
173
        puts("Error: MMU method translate() failed, halting.\n");
175
        puts("Error: MMU method translate() failed, halting.\n");
174
        halt();
176
        halt();
175
    }
177
    }
-
 
178
 
176
    return (void *) result[2];
179
    if (sizeof(unative_t) == 8)
-
 
180
        shift = 32;
-
 
181
    else
-
 
182
        shift = 0;
-
 
183
       
-
 
184
    return (void *) (((result[2]&0xffffffff)<<shift)|((result[3])&0xffffffff));
177
}
185
}
178
 
186
 
179
 
187
 
180
int ofw_map(const void *phys, const void *virt, const int size, const int mode)
188
int ofw_map(const void *phys, const void *virt, const int size, const int mode)
181
{
189
{
-
 
190
    uintptr_t phys_hi, phys_lo;
-
 
191
 
-
 
192
    if (sizeof(unative_t) == 8) {
-
 
193
        int shift = 32;
-
 
194
        phys_hi = (uintptr_t) phys >> shift;
-
 
195
        phys_lo = (uintptr_t) phys & 0xffffffff;
-
 
196
    } else {
-
 
197
        phys_hi = 0;
-
 
198
        phys_lo = (uintptr_t) phys;
-
 
199
    }
-
 
200
 
182
    return ofw_call("call-method", 6, 1, NULL, "map", ofw_mmu, mode, size, virt, phys);
201
    return ofw_call("call-method", 7, 1, NULL, "map", ofw_mmu, mode, size, virt,
-
 
202
        phys_hi, phys_lo);
183
}
203
}
184
 
204
 
185
 
205
 
186
int ofw_memmap(memmap_t *map)
206
int ofw_memmap(memmap_t *map)
187
{
207
{
Line 236... Line 256...
236
    if (ofw_get_property(device, "linebytes", &screen->scanline, sizeof(screen->scanline)) <= 0)
256
    if (ofw_get_property(device, "linebytes", &screen->scanline, sizeof(screen->scanline)) <= 0)
237
        return false;
257
        return false;
238
   
258
   
239
    return true;
259
    return true;
240
}
260
}
241
 
-