Changes in boot/arch/sparc64/loader/ofwarch.c [fa024ce:ed5ad30] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/sparc64/loader/ofwarch.c
rfa024ce red5ad30 30 30 /** 31 31 * @file 32 * @brief 32 * @brief Architecture dependent parts of OpenFirmware interface. 33 33 */ 34 34 … … 40 40 #include "main.h" 41 41 #include "asm.h" 42 43 /* these tho variables will be set by the detect_subarchitecture function */44 extern uint8_t subarchitecture;45 extern uint16_t mid_mask;46 42 47 43 void write(const char *str, const int len) … … 65 61 * except for the current CPU. 66 62 * 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". 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 * 73 72 */ 74 static int wake_cpus_in_node(phandle child, uint64_t current_mid) 73 static int wake_cpus_in_node(phandle child, uint64_t current_mid, 74 uintptr_t physmem_start) 75 75 { 76 76 int cpus; 77 char type_name[BUF_SIZE];78 77 79 for (cpus = 0; child != 0 && child != -1;78 for (cpus = 0; (child != 0) && (child != -1); 80 79 child = ofw_get_peer_node(child), cpus++) { 80 char type_name[OFW_TREE_PROPERTY_MAX_VALUELEN]; 81 81 82 if (ofw_get_property(child, "device_type", type_name, 82 sizeof(type_name)) > 0) { 83 OFW_TREE_PROPERTY_MAX_VALUELEN) > 0) { 84 type_name[OFW_TREE_PROPERTY_MAX_VALUELEN - 1] = 0; 83 85 if (strcmp(type_name, "cpu") == 0) { 84 86 uint32_t mid; … … 88 90 * "cpuid" for US-IV 89 91 */ 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) 92 if ((ofw_get_property(child, "upa-portid", &mid, sizeof(mid)) <= 0) 93 && (ofw_get_property(child, "portid", &mid, sizeof(mid)) <= 0) 94 && (ofw_get_property(child, "cpuid", &mid, sizeof(mid)) <= 0)) 97 95 continue; 98 96 99 97 if (current_mid != mid) { 100 98 /* … … 103 101 (void) ofw_call("SUNW,start-cpu", 3, 1, 104 102 NULL, child, KERNEL_VIRTUAL_ADDRESS, 105 bootinfo.physmem_start | 106 AP_PROCESSOR); 103 physmem_start | AP_PROCESSOR); 107 104 } 108 105 } 109 106 } 110 107 } 111 108 112 109 return cpus; 113 110 } … … 116 113 * Finds out the current CPU's MID and wakes up all AP processors. 117 114 */ 118 int ofw_cpu( void)115 int ofw_cpu(uint16_t mid_mask, uintptr_t physmem_start) 119 116 { 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 */ 117 /* Get the current CPU MID */ 128 118 uint64_t current_mid; 129 119 130 asm volatile ("ldxa [%1] %2, %0\n" 131 : "=r" (current_mid) 132 : "r" (0), "i" (ASI_ICBUS_CONFIG)); 120 asm volatile ( 121 "ldxa [%1] %2, %0\n" 122 : "=r" (current_mid) 123 : "r" (0), "i" (ASI_ICBUS_CONFIG) 124 ); 125 133 126 current_mid >>= ICBUS_CONFIG_MID_SHIFT; 134 135 127 current_mid &= mid_mask; 136 137 /* wake up CPUs */138 128 139 cpus_parent = ofw_find_device("/ssm@0,0"); 140 if (cpus_parent == 0 || cpus_parent == -1) { 129 /* Wake up the CPUs */ 130 131 phandle cpus_parent = ofw_find_device("/ssm@0,0"); 132 if ((cpus_parent == 0) || (cpus_parent == -1)) 141 133 cpus_parent = ofw_find_device("/"); 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) { 134 135 phandle node = ofw_get_child_node(cpus_parent); 136 int cpus = wake_cpus_in_node(node, current_mid, physmem_start); 137 while ((node != 0) && (node != -1)) { 138 char name[OFW_TREE_PROPERTY_MAX_VALUELEN]; 139 147 140 if (ofw_get_property(node, "name", name, 148 sizeof(name)) > 0) { 141 OFW_TREE_PROPERTY_MAX_VALUELEN) > 0) { 142 name[OFW_TREE_PROPERTY_MAX_VALUELEN - 1] = 0; 149 143 if (strcmp(name, "cmp") == 0) { 150 subnode = ofw_get_child_node(node);144 phandle subnode = ofw_get_child_node(node); 151 145 cpus += wake_cpus_in_node(subnode, 152 current_mid );146 current_mid, physmem_start); 153 147 } 154 148 } … … 157 151 158 152 return cpus; 159 160 153 } 161 154 162 155 /** Get physical memory starting address. 163 156 * 164 * @param start 165 * 157 * @param start Pointer to variable where the physical memory starting 158 * address will be stored. 166 159 * 167 * @return Non-zero on succes, zero on failure. 160 * @return Non-zero on succes, zero on failure. 161 * 168 162 */ 169 163 int ofw_get_physmem_start(uintptr_t *start) 170 164 { 171 165 uint32_t memreg[4]; 172 173 166 if (ofw_get_property(ofw_memory, "reg", &memreg, sizeof(memreg)) <= 0) 174 167 return 0; 175 168 176 169 *start = (((uint64_t) memreg[0]) << 32) | memreg[1]; 177 170 return 1; 178 171 } 179
Note:
See TracChangeset
for help on using the changeset viewer.