Changes in boot/arch/sparc64/loader/ofwarch.c [e731b0d:fa024ce] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
boot/arch/sparc64/loader/ofwarch.c
re731b0d rfa024ce 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; 42 46 43 47 void write(const char *str, const int len) … … 61 65 * except for the current CPU. 62 66 * 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". 72 73 */ 73 static int wake_cpus_in_node(phandle child, uint64_t current_mid, 74 uintptr_t physmem_start) 74 static int wake_cpus_in_node(phandle child, uint64_t current_mid) 75 75 { 76 76 int cpus; 77 char type_name[BUF_SIZE]; 77 78 78 for (cpus = 0; (child != 0) && (child != -1);79 for (cpus = 0; child != 0 && child != -1; 79 80 child = ofw_get_peer_node(child), cpus++) { 80 char type_name[BUF_SIZE];81 82 81 if (ofw_get_property(child, "device_type", type_name, 83 82 sizeof(type_name)) > 0) { … … 89 88 * "cpuid" for US-IV 90 89 */ 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) 94 97 continue; 95 98 96 99 if (current_mid != mid) { 97 100 /* … … 100 103 (void) ofw_call("SUNW,start-cpu", 3, 1, 101 104 NULL, child, KERNEL_VIRTUAL_ADDRESS, 102 physmem_start | AP_PROCESSOR); 105 bootinfo.physmem_start | 106 AP_PROCESSOR); 103 107 } 104 108 } 105 109 } 106 110 } 107 111 108 112 return cpus; 109 113 } … … 112 116 * Finds out the current CPU's MID and wakes up all AP processors. 113 117 */ 114 int ofw_cpu( uint16_t mid_mask, uintptr_t physmem_start)118 int ofw_cpu(void) 115 119 { 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 */ 117 128 uint64_t current_mid; 118 129 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 */ 124 138 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) { 132 141 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) { 139 147 if (ofw_get_property(node, "name", name, 140 148 sizeof(name)) > 0) { 141 149 if (strcmp(name, "cmp") == 0) { 142 phandlesubnode = ofw_get_child_node(node);150 subnode = ofw_get_child_node(node); 143 151 cpus += wake_cpus_in_node(subnode, 144 current_mid , physmem_start);152 current_mid); 145 153 } 146 154 } … … 149 157 150 158 return cpus; 159 151 160 } 152 161 153 162 /** Get physical memory starting address. 154 163 * 155 * @param start 156 * 164 * @param start Pointer to variable where the physical memory starting 165 * address will be stored. 157 166 * 158 * @return Non-zero on succes, zero on failure. 159 * 167 * @return Non-zero on succes, zero on failure. 160 168 */ 161 169 int ofw_get_physmem_start(uintptr_t *start) 162 170 { 163 171 uint32_t memreg[4]; 172 164 173 if (ofw_get_property(ofw_memory, "reg", &memreg, sizeof(memreg)) <= 0) 165 174 return 0; 166 175 167 176 *start = (((uint64_t) memreg[0]) << 32) | memreg[1]; 168 177 return 1; 169 178 } 179
Note:
See TracChangeset
for help on using the changeset viewer.