Rev 3582 | Rev 3607 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3582 | Rev 3591 | ||
---|---|---|---|
Line 56... | Line 56... | ||
56 | int ofw_translate_failed(ofw_arg_t flag) |
56 | int ofw_translate_failed(ofw_arg_t flag) |
57 | { |
57 | { |
58 | return flag != -1; |
58 | return flag != -1; |
59 | } |
59 | } |
60 | 60 | ||
- | 61 | /** |
|
- | 62 | * Starts all CPUs represented by following siblings of the given node, |
|
- | 63 | * except for the current CPU. |
|
- | 64 | * |
|
- | 65 | * @param child the first child of the OFW tree node whose children represent |
|
- | 66 | * CPUs to be woken up |
|
- | 67 | * @param current_mid MID of the current CPU, the current CPU will |
|
- | 68 | * (of course) not be woken up |
|
- | 69 | * @return number of CPUs which have the same parent node as "child" |
|
- | 70 | */ |
|
61 | static int wake_cpus_in_node(phandle child, uint64_t current_mid) |
71 | static int wake_cpus_in_node(phandle child, uint64_t current_mid) |
62 | { |
72 | { |
63 | int cpus; |
73 | int cpus; |
64 | char type_name[BUF_SIZE]; |
74 | char type_name[BUF_SIZE]; |
65 | 75 | ||
Line 85... | Line 95... | ||
85 | 95 | ||
86 | if (current_mid != mid) { |
96 | if (current_mid != mid) { |
87 | /* |
97 | /* |
88 | * Start secondary processor. |
98 | * Start secondary processor. |
89 | */ |
99 | */ |
90 | printf("Starting CPU: %d.\n", mid); |
- | |
91 | (void) ofw_call("SUNW,start-cpu", 3, 1, |
100 | (void) ofw_call("SUNW,start-cpu", 3, 1, |
92 | NULL, child, KERNEL_VIRTUAL_ADDRESS, |
101 | NULL, child, KERNEL_VIRTUAL_ADDRESS, |
93 | bootinfo.physmem_start | |
102 | bootinfo.physmem_start | |
94 | AP_PROCESSOR); |
103 | AP_PROCESSOR); |
95 | } |
104 | } |
Line 98... | Line 107... | ||
98 | } |
107 | } |
99 | 108 | ||
100 | return cpus; |
109 | return cpus; |
101 | } |
110 | } |
102 | 111 | ||
- | 112 | /** |
|
- | 113 | * Finds out the current CPU's MID and wakes up all AP processors. |
|
- | 114 | */ |
|
103 | int ofw_cpu(void) |
115 | int ofw_cpu(void) |
104 | { |
116 | { |
105 | int cpus; |
117 | int cpus; |
106 | phandle node; |
118 | phandle node; |
107 | phandle subnode; |
119 | phandle subnode; |
108 | phandle ssm; |
120 | phandle cpus_parent; |
109 | phandle cmp; |
121 | phandle cmp; |
110 | char name[BUF_SIZE]; |
122 | char name[BUF_SIZE]; |
111 | 123 | ||
112 | /* get the current CPU MID */ |
124 | /* get the current CPU MID */ |
113 | uint64_t current_mid; |
125 | uint64_t current_mid; |
Line 125... | Line 137... | ||
125 | printf("MID format unknown for this subarchitecture."); |
137 | printf("MID format unknown for this subarchitecture."); |
126 | return 0; |
138 | return 0; |
127 | } |
139 | } |
128 | 140 | ||
129 | /* wake up CPUs */ |
141 | /* wake up CPUs */ |
- | 142 | ||
130 | ssm = ofw_find_device("/ssm@0,0"); |
143 | cpus_parent = ofw_find_device("/ssm@0,0"); |
131 | if (ssm == -1) { |
144 | if (cpus_parent == 0 || cpus_parent == -1) { |
132 | node = ofw_get_child_node(ofw_root); |
145 | cpus_parent = ofw_find_device("/"); |
133 | cpus = wake_cpus_in_node(node, current_mid); |
- | |
134 | } else { |
146 | } |
- | 147 | ||
135 | node = ofw_get_child_node(ssm); |
148 | node = ofw_get_child_node(cpus_parent); |
136 | cpus = wake_cpus_in_node(node, current_mid); |
149 | cpus = wake_cpus_in_node(node, current_mid); |
137 | while (node != 0 && node != -1) { |
150 | while (node != 0 && node != -1) { |
138 | if (ofw_get_property(node, "name", name, |
151 | if (ofw_get_property(node, "name", name, |
139 | sizeof(name)) > 0) { |
152 | sizeof(name)) > 0) { |
140 | if (strcmp(name, "cmp") == 0) { |
153 | if (strcmp(name, "cmp") == 0) { |
141 | printf("nasel jsem dalsi CPU"); |
- | |
142 | subnode = ofw_get_child_node(node); |
154 | subnode = ofw_get_child_node(node); |
143 | cpus += wake_cpus_in_node(subnode, |
155 | cpus += wake_cpus_in_node(subnode, |
144 | current_mid); |
156 | current_mid); |
145 | } |
- | |
146 | } |
157 | } |
- | 158 | } |
|
147 | node = ofw_get_peer_node(node); |
159 | node = ofw_get_peer_node(node); |
148 | } |
- | |
149 | } |
160 | } |
150 | 161 | ||
151 | return cpus; |
162 | return cpus; |
152 | 163 | ||
153 | } |
164 | } |