Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • boot/arch/sparc64/loader/ofwarch.c

    re731b0d rfa024ce  
    3030/**
    3131 * @file
    32  * @brief Architecture dependent parts of OpenFirmware interface.
     32 * @brief       Architecture dependent parts of OpenFirmware interface.
    3333 */
    3434
     
    4040#include "main.h"
    4141#include "asm.h"
     42
     43/* these tho variables will be set by the detect_subarchitecture function */
     44extern uint8_t subarchitecture;
     45extern uint16_t mid_mask;
    4246
    4347void write(const char *str, const int len)
     
    6165 * except for the current CPU.
    6266 *
    63  * @param child         The first child of the OFW tree node whose children
    64  *                      represent CPUs to be woken up.
    65  * @param current_mid   MID of the current CPU, the current CPU will
    66  *                      (of course) not be woken up.
    67  * @param physmem_start Starting address of the physical memory.
    68  *
    69  * @return Number of CPUs which have the same parent node as
    70  *         "child".
    71  *
     67 * @param child         The first child of the OFW tree node whose children
     68 *                      represent CPUs to be woken up.
     69 * @param current_mid   MID of the current CPU, the current CPU will
     70 *                      (of course) not be woken up.
     71 * @return              Number of CPUs which have the same parent node as
     72 *                      "child".
    7273 */
    73 static int wake_cpus_in_node(phandle child, uint64_t current_mid,
    74     uintptr_t physmem_start)
     74static int wake_cpus_in_node(phandle child, uint64_t current_mid)
    7575{
    7676        int cpus;
     77        char type_name[BUF_SIZE];
    7778       
    78         for (cpus = 0; (child != 0) && (child != -1);
     79        for (cpus = 0; child != 0 && child != -1;
    7980            child = ofw_get_peer_node(child), cpus++) {
    80                 char type_name[BUF_SIZE];
    81                
    8281                if (ofw_get_property(child, "device_type", type_name,
    8382                    sizeof(type_name)) > 0) {
     
    8988                                 * "cpuid" for US-IV
    9089                                 */
    91                                 if ((ofw_get_property(child, "upa-portid", &mid, sizeof(mid)) <= 0)
    92                                     && (ofw_get_property(child, "portid", &mid, sizeof(mid)) <= 0)
    93                                     && (ofw_get_property(child, "cpuid", &mid, sizeof(mid)) <= 0))
     90                                if (ofw_get_property(
     91                                    child, "upa-portid",
     92                                    &mid, sizeof(mid)) <= 0
     93                                    && ofw_get_property(child, "portid",
     94                                    &mid, sizeof(mid)) <= 0
     95                                    && ofw_get_property(child, "cpuid",
     96                                    &mid, sizeof(mid)) <= 0)
    9497                                        continue;
    95                                
     98                                       
    9699                                if (current_mid != mid) {
    97100                                        /*
     
    100103                                        (void) ofw_call("SUNW,start-cpu", 3, 1,
    101104                                            NULL, child, KERNEL_VIRTUAL_ADDRESS,
    102                                             physmem_start | AP_PROCESSOR);
     105                                            bootinfo.physmem_start |
     106                                            AP_PROCESSOR);
    103107                                }
    104108                        }
    105109                }
    106110        }
    107        
     111
    108112        return cpus;
    109113}
     
    112116 * Finds out the current CPU's MID and wakes up all AP processors.
    113117 */
    114 int ofw_cpu(uint16_t mid_mask, uintptr_t physmem_start)
     118int ofw_cpu(void)
    115119{
    116         /* Get the current CPU MID */
     120        int cpus;
     121        phandle node;
     122        phandle subnode;
     123        phandle cpus_parent;
     124        phandle cmp;
     125        char name[BUF_SIZE];
     126
     127        /* get the current CPU MID */
    117128        uint64_t current_mid;
    118129       
    119         asm volatile (
    120                 "ldxa [%1] %2, %0\n"
    121                 : "=r" (current_mid)
    122                 : "r" (0), "i" (ASI_ICBUS_CONFIG)
    123         );
     130        asm volatile ("ldxa [%1] %2, %0\n"
     131            : "=r" (current_mid)
     132            : "r" (0), "i" (ASI_ICBUS_CONFIG));
     133        current_mid >>= ICBUS_CONFIG_MID_SHIFT;
     134
     135        current_mid &= mid_mask;
     136
     137        /* wake up CPUs */
    124138       
    125         current_mid >>= ICBUS_CONFIG_MID_SHIFT;
    126         current_mid &= mid_mask;
    127        
    128         /* Wake up the CPUs */
    129        
    130         phandle cpus_parent = ofw_find_device("/ssm@0,0");
    131         if ((cpus_parent == 0) || (cpus_parent == -1))
     139        cpus_parent = ofw_find_device("/ssm@0,0");
     140        if (cpus_parent == 0 || cpus_parent == -1) {
    132141                cpus_parent = ofw_find_device("/");
    133        
    134         phandle node = ofw_get_child_node(cpus_parent);
    135         int cpus = wake_cpus_in_node(node, current_mid, physmem_start);
    136         while ((node != 0) && (node != -1)) {
    137                 char name[BUF_SIZE];
    138                
     142        }
     143
     144        node = ofw_get_child_node(cpus_parent);
     145        cpus = wake_cpus_in_node(node, current_mid);
     146        while (node != 0 && node != -1) {
    139147                if (ofw_get_property(node, "name", name,
    140                     sizeof(name)) > 0) {
     148                        sizeof(name)) > 0) {
    141149                        if (strcmp(name, "cmp") == 0) {
    142                                 phandle subnode = ofw_get_child_node(node);
     150                                subnode = ofw_get_child_node(node);
    143151                                cpus += wake_cpus_in_node(subnode,
    144                                         current_mid, physmem_start);
     152                                        current_mid);
    145153                        }
    146154                }
     
    149157       
    150158        return cpus;
     159       
    151160}
    152161
    153162/** Get physical memory starting address.
    154163 *
    155  * @param start Pointer to variable where the physical memory starting
    156  *              address will be stored.
     164 * @param start         Pointer to variable where the physical memory starting
     165 *                      address will be stored.
    157166 *
    158  * @return Non-zero on succes, zero on failure.
    159  *
     167 * @return              Non-zero on succes, zero on failure.
    160168 */
    161169int ofw_get_physmem_start(uintptr_t *start)
    162170{
    163171        uint32_t memreg[4];
     172
    164173        if (ofw_get_property(ofw_memory, "reg", &memreg, sizeof(memreg)) <= 0)
    165174                return 0;
    166        
     175
    167176        *start = (((uint64_t) memreg[0]) << 32) | memreg[1];
    168177        return 1;
    169178}
     179
Note: See TracChangeset for help on using the changeset viewer.