Changeset 6323989 in mainline for arch/ppc32/loader/ofw.c


Ignore:
Timestamp:
2006-03-14T09:11:07Z (19 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
2d69ee6
Parents:
eebd172
Message:

ofw code cleanup
get memory map from ofw

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ppc32/loader/ofw.c

    reebd172 r6323989  
    3030#include "printf.h"
    3131
     32#define MAX_OFW_ARGS    10
     33
     34typedef unsigned int ofw_arg_t;
     35typedef unsigned int ihandle;
     36typedef unsigned int phandle;
     37
     38/** OpenFirmware command structure
     39 *
     40 */
     41typedef struct {
     42        const char *service;          /**< Command name */
     43        unsigned int nargs;           /**< Number of in arguments */
     44        unsigned int nret;            /**< Number of out arguments */
     45        ofw_arg_t args[MAX_OFW_ARGS]; /**< List of arguments */
     46} ofw_args_t;
     47
     48typedef void (*ofw_entry)(ofw_args_t *);
     49
     50
    3251ofw_entry ofw;
    3352
     
    3756
    3857
    39 void init(void)
    40 {
    41         ofw_chosen = ofw_find_device("/chosen");
    42         if (ofw_chosen == -1)
    43                 halt();
    44        
    45         if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)     
    46                 ofw_stdout = 0;
    47        
    48         ofw_mmu = ofw_open("/mmu");
    49         if (ofw_mmu == -1) {
    50                 puts("Unable to open /mmu node\n");
    51                 halt();
    52         }
    53 }
    54 
    55 void halt(void)
    56 {
    57         ofw_call("exit", 0, 0);
    58 }
    59 
    60 
    61 int ofw_call(const char *service, const int nargs, const int nret, ...)
     58static int ofw_call(const char *service, const int nargs, const int nret, ...)
    6259{
    6360        va_list list;
     
    8380
    8481
    85 ihandle ofw_open(const char *name)
     82static phandle ofw_find_device(const char *name)
     83{
     84        return ofw_call("finddevice", 1, 1, name);
     85}
     86
     87
     88static int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
     89{
     90        return ofw_call("getprop", 4, 1, device, name, buf, buflen);
     91}
     92
     93static ihandle ofw_open(const char *name)
    8694{
    8795        return ofw_call("open", 1, 1, name);
     96}
     97
     98
     99void init(void)
     100{
     101        ofw_chosen = ofw_find_device("/chosen");
     102        if (ofw_chosen == -1)
     103                halt();
     104       
     105        if (ofw_get_property(ofw_chosen, "stdout",  &ofw_stdout, sizeof(ofw_stdout)) <= 0)     
     106                ofw_stdout = 0;
     107       
     108        ofw_mmu = ofw_open("/mmu");
     109        if (ofw_mmu == -1) {
     110                puts("Unable to open /mmu node\n");
     111                halt();
     112        }
     113}
     114
     115
     116void halt(void)
     117{
     118        ofw_call("exit", 0, 0);
    88119}
    89120
     
    95126       
    96127        ofw_call("write", 3, 1, ofw_stdout, str, len);
    97 }
    98 
    99 
    100 phandle ofw_find_device(const char *name)
    101 {
    102         return ofw_call("finddevice", 1, 1, name);
    103 }
    104 
    105 
    106 int ofw_get_property(const phandle device, const char *name, const void *buf, const int buflen)
    107 {
    108         return ofw_call("getprop", 4, 1, device, name, buf, buflen);
    109128}
    110129
     
    120139        return ofw_call("call-method", 6, 1, "map", ofw_mmu, mode, size, virt, phys);
    121140}
     141
     142
     143int ofw_memmap(memmap_t *map)
     144{
     145        int i;
     146        int ret;
     147
     148        phandle handle = ofw_find_device("/memory");
     149        if (handle == -1)
     150                return false;
     151       
     152        ret = ofw_get_property(handle, "reg", &map->zones, sizeof(map->zones));
     153        if (ret == -1)
     154                return false;
     155       
     156        map->total = 0;
     157        map->count = 0;
     158        for (i = 0; i < MEMMAP_MAX_RECORDS; i++) {
     159                if (map->zones[i].size == 0)
     160                        break;
     161                map->count++;
     162                map->total += map->zones[i].size;
     163        }
     164}
Note: See TracChangeset for help on using the changeset viewer.