diff options
Diffstat (limited to 'arch/x86/include/asm/uv/uv_bau.h')
-rw-r--r-- | arch/x86/include/asm/uv/uv_bau.h | 304 |
1 files changed, 230 insertions, 74 deletions
diff --git a/arch/x86/include/asm/uv/uv_bau.h b/arch/x86/include/asm/uv/uv_bau.h index b414d2b401f6..42d412fd8b02 100644 --- a/arch/x86/include/asm/uv/uv_bau.h +++ b/arch/x86/include/asm/uv/uv_bau.h | |||
@@ -27,13 +27,15 @@ | |||
27 | * set 2 is at BASE + 2*512, set 3 at BASE + 3*512, and so on. | 27 | * set 2 is at BASE + 2*512, set 3 at BASE + 3*512, and so on. |
28 | * | 28 | * |
29 | * We will use 31 sets, one for sending BAU messages from each of the 32 | 29 | * We will use 31 sets, one for sending BAU messages from each of the 32 |
30 | * cpu's on the node. | 30 | * cpu's on the uvhub. |
31 | * | 31 | * |
32 | * TLB shootdown will use the first of the 8 descriptors of each set. | 32 | * TLB shootdown will use the first of the 8 descriptors of each set. |
33 | * Each of the descriptors is 64 bytes in size (8*64 = 512 bytes in a set). | 33 | * Each of the descriptors is 64 bytes in size (8*64 = 512 bytes in a set). |
34 | */ | 34 | */ |
35 | 35 | ||
36 | #define UV_ITEMS_PER_DESCRIPTOR 8 | 36 | #define UV_ITEMS_PER_DESCRIPTOR 8 |
37 | /* the 'throttle' to prevent the hardware stay-busy bug */ | ||
38 | #define MAX_BAU_CONCURRENT 3 | ||
37 | #define UV_CPUS_PER_ACT_STATUS 32 | 39 | #define UV_CPUS_PER_ACT_STATUS 32 |
38 | #define UV_ACT_STATUS_MASK 0x3 | 40 | #define UV_ACT_STATUS_MASK 0x3 |
39 | #define UV_ACT_STATUS_SIZE 2 | 41 | #define UV_ACT_STATUS_SIZE 2 |
@@ -44,7 +46,26 @@ | |||
44 | #define UV_DESC_BASE_PNODE_SHIFT 49 | 46 | #define UV_DESC_BASE_PNODE_SHIFT 49 |
45 | #define UV_PAYLOADQ_PNODE_SHIFT 49 | 47 | #define UV_PAYLOADQ_PNODE_SHIFT 49 |
46 | #define UV_PTC_BASENAME "sgi_uv/ptc_statistics" | 48 | #define UV_PTC_BASENAME "sgi_uv/ptc_statistics" |
49 | #define UV_BAU_BASENAME "sgi_uv/bau_tunables" | ||
50 | #define UV_BAU_TUNABLES_DIR "sgi_uv" | ||
51 | #define UV_BAU_TUNABLES_FILE "bau_tunables" | ||
52 | #define WHITESPACE " \t\n" | ||
47 | #define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask)) | 53 | #define uv_physnodeaddr(x) ((__pa((unsigned long)(x)) & uv_mmask)) |
54 | #define UV_ENABLE_INTD_SOFT_ACK_MODE_SHIFT 15 | ||
55 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD_SHIFT 16 | ||
56 | #define UV_INTD_SOFT_ACK_TIMEOUT_PERIOD 0x0000000009UL | ||
57 | /* [19:16] SOFT_ACK timeout period 19: 1 is urgency 7 17:16 1 is multiplier */ | ||
58 | #define BAU_MISC_CONTROL_MULT_MASK 3 | ||
59 | |||
60 | #define UVH_AGING_PRESCALE_SEL 0x000000b000UL | ||
61 | /* [30:28] URGENCY_7 an index into a table of times */ | ||
62 | #define BAU_URGENCY_7_SHIFT 28 | ||
63 | #define BAU_URGENCY_7_MASK 7 | ||
64 | |||
65 | #define UVH_TRANSACTION_TIMEOUT 0x000000b200UL | ||
66 | /* [45:40] BAU - BAU transaction timeout select - a multiplier */ | ||
67 | #define BAU_TRANS_SHIFT 40 | ||
68 | #define BAU_TRANS_MASK 0x3f | ||
48 | 69 | ||
49 | /* | 70 | /* |
50 | * bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1 | 71 | * bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1 |
@@ -55,15 +76,26 @@ | |||
55 | #define DESC_STATUS_SOURCE_TIMEOUT 3 | 76 | #define DESC_STATUS_SOURCE_TIMEOUT 3 |
56 | 77 | ||
57 | /* | 78 | /* |
58 | * source side thresholds at which message retries print a warning | 79 | * delay for 'plugged' timeout retries, in microseconds |
59 | */ | 80 | */ |
60 | #define SOURCE_TIMEOUT_LIMIT 20 | 81 | #define PLUGGED_DELAY 10 |
61 | #define DESTINATION_TIMEOUT_LIMIT 20 | 82 | |
83 | /* | ||
84 | * threshholds at which to use IPI to free resources | ||
85 | */ | ||
86 | /* after this # consecutive 'plugged' timeouts, use IPI to release resources */ | ||
87 | #define PLUGSB4RESET 100 | ||
88 | /* after this many consecutive timeouts, use IPI to release resources */ | ||
89 | #define TIMEOUTSB4RESET 1 | ||
90 | /* at this number uses of IPI to release resources, giveup the request */ | ||
91 | #define IPI_RESET_LIMIT 1 | ||
92 | /* after this # consecutive successes, bump up the throttle if it was lowered */ | ||
93 | #define COMPLETE_THRESHOLD 5 | ||
62 | 94 | ||
63 | /* | 95 | /* |
64 | * number of entries in the destination side payload queue | 96 | * number of entries in the destination side payload queue |
65 | */ | 97 | */ |
66 | #define DEST_Q_SIZE 17 | 98 | #define DEST_Q_SIZE 20 |
67 | /* | 99 | /* |
68 | * number of destination side software ack resources | 100 | * number of destination side software ack resources |
69 | */ | 101 | */ |
@@ -72,9 +104,17 @@ | |||
72 | /* | 104 | /* |
73 | * completion statuses for sending a TLB flush message | 105 | * completion statuses for sending a TLB flush message |
74 | */ | 106 | */ |
75 | #define FLUSH_RETRY 1 | 107 | #define FLUSH_RETRY_PLUGGED 1 |
76 | #define FLUSH_GIVEUP 2 | 108 | #define FLUSH_RETRY_TIMEOUT 2 |
77 | #define FLUSH_COMPLETE 3 | 109 | #define FLUSH_GIVEUP 3 |
110 | #define FLUSH_COMPLETE 4 | ||
111 | |||
112 | /* | ||
113 | * tuning the action when the numalink network is extremely delayed | ||
114 | */ | ||
115 | #define CONGESTED_RESPONSE_US 1000 /* 'long' response time, in microseconds */ | ||
116 | #define CONGESTED_REPS 10 /* long delays averaged over this many broadcasts */ | ||
117 | #define CONGESTED_PERIOD 30 /* time for the bau to be disabled, in seconds */ | ||
78 | 118 | ||
79 | /* | 119 | /* |
80 | * Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor) | 120 | * Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor) |
@@ -86,14 +126,14 @@ | |||
86 | * 'base_dest_nodeid' field of the header corresponds to the | 126 | * 'base_dest_nodeid' field of the header corresponds to the |
87 | * destination nodeID associated with that specified bit. | 127 | * destination nodeID associated with that specified bit. |
88 | */ | 128 | */ |
89 | struct bau_target_nodemask { | 129 | struct bau_target_uvhubmask { |
90 | unsigned long bits[BITS_TO_LONGS(256)]; | 130 | unsigned long bits[BITS_TO_LONGS(UV_DISTRIBUTION_SIZE)]; |
91 | }; | 131 | }; |
92 | 132 | ||
93 | /* | 133 | /* |
94 | * mask of cpu's on a node | 134 | * mask of cpu's on a uvhub |
95 | * (during initialization we need to check that unsigned long has | 135 | * (during initialization we need to check that unsigned long has |
96 | * enough bits for max. cpu's per node) | 136 | * enough bits for max. cpu's per uvhub) |
97 | */ | 137 | */ |
98 | struct bau_local_cpumask { | 138 | struct bau_local_cpumask { |
99 | unsigned long bits; | 139 | unsigned long bits; |
@@ -135,8 +175,8 @@ struct bau_msg_payload { | |||
135 | struct bau_msg_header { | 175 | struct bau_msg_header { |
136 | unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ | 176 | unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */ |
137 | /* bits 5:0 */ | 177 | /* bits 5:0 */ |
138 | unsigned int base_dest_nodeid:15; /* nasid>>1 (pnode) of */ | 178 | unsigned int base_dest_nodeid:15; /* nasid (pnode<<1) of */ |
139 | /* bits 20:6 */ /* first bit in node_map */ | 179 | /* bits 20:6 */ /* first bit in uvhub map */ |
140 | unsigned int command:8; /* message type */ | 180 | unsigned int command:8; /* message type */ |
141 | /* bits 28:21 */ | 181 | /* bits 28:21 */ |
142 | /* 0x38: SN3net EndPoint Message */ | 182 | /* 0x38: SN3net EndPoint Message */ |
@@ -146,26 +186,38 @@ struct bau_msg_header { | |||
146 | unsigned int rsvd_2:9; /* must be zero */ | 186 | unsigned int rsvd_2:9; /* must be zero */ |
147 | /* bits 40:32 */ | 187 | /* bits 40:32 */ |
148 | /* Suppl_A is 56-41 */ | 188 | /* Suppl_A is 56-41 */ |
149 | unsigned int payload_2a:8;/* becomes byte 16 of msg */ | 189 | unsigned int sequence:16;/* message sequence number */ |
150 | /* bits 48:41 */ /* not currently using */ | 190 | /* bits 56:41 */ /* becomes bytes 16-17 of msg */ |
151 | unsigned int payload_2b:8;/* becomes byte 17 of msg */ | ||
152 | /* bits 56:49 */ /* not currently using */ | ||
153 | /* Address field (96:57) is never used as an | 191 | /* Address field (96:57) is never used as an |
154 | address (these are address bits 42:3) */ | 192 | address (these are address bits 42:3) */ |
193 | |||
155 | unsigned int rsvd_3:1; /* must be zero */ | 194 | unsigned int rsvd_3:1; /* must be zero */ |
156 | /* bit 57 */ | 195 | /* bit 57 */ |
157 | /* address bits 27:4 are payload */ | 196 | /* address bits 27:4 are payload */ |
158 | /* these 24 bits become bytes 12-14 of msg */ | 197 | /* these next 24 (58-81) bits become bytes 12-14 of msg */ |
198 | |||
199 | /* bits 65:58 land in byte 12 */ | ||
159 | unsigned int replied_to:1;/* sent as 0 by the source to byte 12 */ | 200 | unsigned int replied_to:1;/* sent as 0 by the source to byte 12 */ |
160 | /* bit 58 */ | 201 | /* bit 58 */ |
161 | 202 | unsigned int msg_type:3; /* software type of the message*/ | |
162 | unsigned int payload_1a:5;/* not currently used */ | 203 | /* bits 61:59 */ |
163 | /* bits 63:59 */ | 204 | unsigned int canceled:1; /* message canceled, resource to be freed*/ |
164 | unsigned int payload_1b:8;/* not currently used */ | 205 | /* bit 62 */ |
165 | /* bits 71:64 */ | 206 | unsigned int payload_1a:1;/* not currently used */ |
166 | unsigned int payload_1c:8;/* not currently used */ | 207 | /* bit 63 */ |
167 | /* bits 79:72 */ | 208 | unsigned int payload_1b:2;/* not currently used */ |
168 | unsigned int payload_1d:2;/* not currently used */ | 209 | /* bits 65:64 */ |
210 | |||
211 | /* bits 73:66 land in byte 13 */ | ||
212 | unsigned int payload_1ca:6;/* not currently used */ | ||
213 | /* bits 71:66 */ | ||
214 | unsigned int payload_1c:2;/* not currently used */ | ||
215 | /* bits 73:72 */ | ||
216 | |||
217 | /* bits 81:74 land in byte 14 */ | ||
218 | unsigned int payload_1d:6;/* not currently used */ | ||
219 | /* bits 79:74 */ | ||
220 | unsigned int payload_1e:2;/* not currently used */ | ||
169 | /* bits 81:80 */ | 221 | /* bits 81:80 */ |
170 | 222 | ||
171 | unsigned int rsvd_4:7; /* must be zero */ | 223 | unsigned int rsvd_4:7; /* must be zero */ |
@@ -178,7 +230,7 @@ struct bau_msg_header { | |||
178 | /* bits 95:90 */ | 230 | /* bits 95:90 */ |
179 | unsigned int rsvd_6:5; /* must be zero */ | 231 | unsigned int rsvd_6:5; /* must be zero */ |
180 | /* bits 100:96 */ | 232 | /* bits 100:96 */ |
181 | unsigned int int_both:1;/* if 1, interrupt both sockets on the blade */ | 233 | unsigned int int_both:1;/* if 1, interrupt both sockets on the uvhub */ |
182 | /* bit 101*/ | 234 | /* bit 101*/ |
183 | unsigned int fairness:3;/* usually zero */ | 235 | unsigned int fairness:3;/* usually zero */ |
184 | /* bits 104:102 */ | 236 | /* bits 104:102 */ |
@@ -191,13 +243,18 @@ struct bau_msg_header { | |||
191 | /* bits 127:107 */ | 243 | /* bits 127:107 */ |
192 | }; | 244 | }; |
193 | 245 | ||
246 | /* see msg_type: */ | ||
247 | #define MSG_NOOP 0 | ||
248 | #define MSG_REGULAR 1 | ||
249 | #define MSG_RETRY 2 | ||
250 | |||
194 | /* | 251 | /* |
195 | * The activation descriptor: | 252 | * The activation descriptor: |
196 | * The format of the message to send, plus all accompanying control | 253 | * The format of the message to send, plus all accompanying control |
197 | * Should be 64 bytes | 254 | * Should be 64 bytes |
198 | */ | 255 | */ |
199 | struct bau_desc { | 256 | struct bau_desc { |
200 | struct bau_target_nodemask distribution; | 257 | struct bau_target_uvhubmask distribution; |
201 | /* | 258 | /* |
202 | * message template, consisting of header and payload: | 259 | * message template, consisting of header and payload: |
203 | */ | 260 | */ |
@@ -237,19 +294,25 @@ struct bau_payload_queue_entry { | |||
237 | unsigned short acknowledge_count; /* filled in by destination */ | 294 | unsigned short acknowledge_count; /* filled in by destination */ |
238 | /* 16 bits, bytes 10-11 */ | 295 | /* 16 bits, bytes 10-11 */ |
239 | 296 | ||
240 | unsigned short replied_to:1; /* sent as 0 by the source */ | 297 | /* these next 3 bytes come from bits 58-81 of the message header */ |
241 | /* 1 bit */ | 298 | unsigned short replied_to:1; /* sent as 0 by the source */ |
242 | unsigned short unused1:7; /* not currently using */ | 299 | unsigned short msg_type:3; /* software message type */ |
243 | /* 7 bits: byte 12) */ | 300 | unsigned short canceled:1; /* sent as 0 by the source */ |
301 | unsigned short unused1:3; /* not currently using */ | ||
302 | /* byte 12 */ | ||
244 | 303 | ||
245 | unsigned char unused2[2]; /* not currently using */ | 304 | unsigned char unused2a; /* not currently using */ |
246 | /* bytes 13-14 */ | 305 | /* byte 13 */ |
306 | unsigned char unused2; /* not currently using */ | ||
307 | /* byte 14 */ | ||
247 | 308 | ||
248 | unsigned char sw_ack_vector; /* filled in by the hardware */ | 309 | unsigned char sw_ack_vector; /* filled in by the hardware */ |
249 | /* byte 15 (bits 127:120) */ | 310 | /* byte 15 (bits 127:120) */ |
250 | 311 | ||
251 | unsigned char unused4[3]; /* not currently using bytes 17-19 */ | 312 | unsigned short sequence; /* message sequence number */ |
252 | /* bytes 17-19 */ | 313 | /* bytes 16-17 */ |
314 | unsigned char unused4[2]; /* not currently using bytes 18-19 */ | ||
315 | /* bytes 18-19 */ | ||
253 | 316 | ||
254 | int number_of_cpus; /* filled in at destination */ | 317 | int number_of_cpus; /* filled in at destination */ |
255 | /* 32 bits, bytes 20-23 (aligned) */ | 318 | /* 32 bits, bytes 20-23 (aligned) */ |
@@ -258,64 +321,126 @@ struct bau_payload_queue_entry { | |||
258 | /* bytes 24-31 */ | 321 | /* bytes 24-31 */ |
259 | }; | 322 | }; |
260 | 323 | ||
261 | /* | 324 | struct msg_desc { |
262 | * one for every slot in the destination payload queue | 325 | struct bau_payload_queue_entry *msg; |
263 | */ | 326 | int msg_slot; |
264 | struct bau_msg_status { | 327 | int sw_ack_slot; |
265 | struct bau_local_cpumask seen_by; /* map of cpu's */ | 328 | struct bau_payload_queue_entry *va_queue_first; |
329 | struct bau_payload_queue_entry *va_queue_last; | ||
330 | }; | ||
331 | |||
332 | struct reset_args { | ||
333 | int sender; | ||
266 | }; | 334 | }; |
267 | 335 | ||
268 | /* | 336 | /* |
269 | * one for every slot in the destination software ack resources | 337 | * This structure is allocated per_cpu for UV TLB shootdown statistics. |
270 | */ | 338 | */ |
271 | struct bau_sw_ack_status { | 339 | struct ptc_stats { |
272 | struct bau_payload_queue_entry *msg; /* associated message */ | 340 | /* sender statistics */ |
273 | int watcher; /* cpu monitoring, or -1 */ | 341 | unsigned long s_giveup; /* number of fall backs to IPI-style flushes */ |
342 | unsigned long s_requestor; /* number of shootdown requests */ | ||
343 | unsigned long s_stimeout; /* source side timeouts */ | ||
344 | unsigned long s_dtimeout; /* destination side timeouts */ | ||
345 | unsigned long s_time; /* time spent in sending side */ | ||
346 | unsigned long s_retriesok; /* successful retries */ | ||
347 | unsigned long s_ntargcpu; /* total number of cpu's targeted */ | ||
348 | unsigned long s_ntargself; /* times the sending cpu was targeted */ | ||
349 | unsigned long s_ntarglocals; /* targets of cpus on the local blade */ | ||
350 | unsigned long s_ntargremotes; /* targets of cpus on remote blades */ | ||
351 | unsigned long s_ntarglocaluvhub; /* targets of the local hub */ | ||
352 | unsigned long s_ntargremoteuvhub; /* remotes hubs targeted */ | ||
353 | unsigned long s_ntarguvhub; /* total number of uvhubs targeted */ | ||
354 | unsigned long s_ntarguvhub16; /* number of times target hubs >= 16*/ | ||
355 | unsigned long s_ntarguvhub8; /* number of times target hubs >= 8 */ | ||
356 | unsigned long s_ntarguvhub4; /* number of times target hubs >= 4 */ | ||
357 | unsigned long s_ntarguvhub2; /* number of times target hubs >= 2 */ | ||
358 | unsigned long s_ntarguvhub1; /* number of times target hubs == 1 */ | ||
359 | unsigned long s_resets_plug; /* ipi-style resets from plug state */ | ||
360 | unsigned long s_resets_timeout; /* ipi-style resets from timeouts */ | ||
361 | unsigned long s_busy; /* status stayed busy past s/w timer */ | ||
362 | unsigned long s_throttles; /* waits in throttle */ | ||
363 | unsigned long s_retry_messages; /* retry broadcasts */ | ||
364 | unsigned long s_bau_reenabled; /* for bau enable/disable */ | ||
365 | unsigned long s_bau_disabled; /* for bau enable/disable */ | ||
366 | /* destination statistics */ | ||
367 | unsigned long d_alltlb; /* times all tlb's on this cpu were flushed */ | ||
368 | unsigned long d_onetlb; /* times just one tlb on this cpu was flushed */ | ||
369 | unsigned long d_multmsg; /* interrupts with multiple messages */ | ||
370 | unsigned long d_nomsg; /* interrupts with no message */ | ||
371 | unsigned long d_time; /* time spent on destination side */ | ||
372 | unsigned long d_requestee; /* number of messages processed */ | ||
373 | unsigned long d_retries; /* number of retry messages processed */ | ||
374 | unsigned long d_canceled; /* number of messages canceled by retries */ | ||
375 | unsigned long d_nocanceled; /* retries that found nothing to cancel */ | ||
376 | unsigned long d_resets; /* number of ipi-style requests processed */ | ||
377 | unsigned long d_rcanceled; /* number of messages canceled by resets */ | ||
274 | }; | 378 | }; |
275 | 379 | ||
276 | /* | 380 | /* |
277 | * one on every node and per-cpu; to locate the software tables | 381 | * one per-cpu; to locate the software tables |
278 | */ | 382 | */ |
279 | struct bau_control { | 383 | struct bau_control { |
280 | struct bau_desc *descriptor_base; | 384 | struct bau_desc *descriptor_base; |
281 | struct bau_payload_queue_entry *bau_msg_head; | ||
282 | struct bau_payload_queue_entry *va_queue_first; | 385 | struct bau_payload_queue_entry *va_queue_first; |
283 | struct bau_payload_queue_entry *va_queue_last; | 386 | struct bau_payload_queue_entry *va_queue_last; |
284 | struct bau_msg_status *msg_statuses; | 387 | struct bau_payload_queue_entry *bau_msg_head; |
285 | int *watching; /* pointer to array */ | 388 | struct bau_control *uvhub_master; |
286 | }; | 389 | struct bau_control *socket_master; |
287 | 390 | struct ptc_stats *statp; | |
288 | /* | 391 | unsigned long timeout_interval; |
289 | * This structure is allocated per_cpu for UV TLB shootdown statistics. | 392 | unsigned long set_bau_on_time; |
290 | */ | 393 | atomic_t active_descriptor_count; |
291 | struct ptc_stats { | 394 | int plugged_tries; |
292 | unsigned long ptc_i; /* number of IPI-style flushes */ | 395 | int timeout_tries; |
293 | unsigned long requestor; /* number of nodes this cpu sent to */ | 396 | int ipi_attempts; |
294 | unsigned long requestee; /* times cpu was remotely requested */ | 397 | int conseccompletes; |
295 | unsigned long alltlb; /* times all tlb's on this cpu were flushed */ | 398 | int baudisabled; |
296 | unsigned long onetlb; /* times just one tlb on this cpu was flushed */ | 399 | int set_bau_off; |
297 | unsigned long s_retry; /* retries on source side timeouts */ | 400 | short cpu; |
298 | unsigned long d_retry; /* retries on destination side timeouts */ | 401 | short uvhub_cpu; |
299 | unsigned long sflush; /* cycles spent in uv_flush_tlb_others */ | 402 | short uvhub; |
300 | unsigned long dflush; /* cycles spent on destination side */ | 403 | short cpus_in_socket; |
301 | unsigned long retriesok; /* successes on retries */ | 404 | short cpus_in_uvhub; |
302 | unsigned long nomsg; /* interrupts with no message */ | 405 | unsigned short message_number; |
303 | unsigned long multmsg; /* interrupts with multiple messages */ | 406 | unsigned short uvhub_quiesce; |
304 | unsigned long ntargeted;/* nodes targeted */ | 407 | short socket_acknowledge_count[DEST_Q_SIZE]; |
408 | cycles_t send_message; | ||
409 | spinlock_t uvhub_lock; | ||
410 | spinlock_t queue_lock; | ||
411 | /* tunables */ | ||
412 | int max_bau_concurrent; | ||
413 | int max_bau_concurrent_constant; | ||
414 | int plugged_delay; | ||
415 | int plugsb4reset; | ||
416 | int timeoutsb4reset; | ||
417 | int ipi_reset_limit; | ||
418 | int complete_threshold; | ||
419 | int congested_response_us; | ||
420 | int congested_reps; | ||
421 | int congested_period; | ||
422 | cycles_t period_time; | ||
423 | long period_requests; | ||
305 | }; | 424 | }; |
306 | 425 | ||
307 | static inline int bau_node_isset(int node, struct bau_target_nodemask *dstp) | 426 | static inline int bau_uvhub_isset(int uvhub, struct bau_target_uvhubmask *dstp) |
308 | { | 427 | { |
309 | return constant_test_bit(node, &dstp->bits[0]); | 428 | return constant_test_bit(uvhub, &dstp->bits[0]); |
310 | } | 429 | } |
311 | static inline void bau_node_set(int node, struct bau_target_nodemask *dstp) | 430 | static inline void bau_uvhub_set(int uvhub, struct bau_target_uvhubmask *dstp) |
312 | { | 431 | { |
313 | __set_bit(node, &dstp->bits[0]); | 432 | __set_bit(uvhub, &dstp->bits[0]); |
314 | } | 433 | } |
315 | static inline void bau_nodes_clear(struct bau_target_nodemask *dstp, int nbits) | 434 | static inline void bau_uvhubs_clear(struct bau_target_uvhubmask *dstp, |
435 | int nbits) | ||
316 | { | 436 | { |
317 | bitmap_zero(&dstp->bits[0], nbits); | 437 | bitmap_zero(&dstp->bits[0], nbits); |
318 | } | 438 | } |
439 | static inline int bau_uvhub_weight(struct bau_target_uvhubmask *dstp) | ||
440 | { | ||
441 | return bitmap_weight((unsigned long *)&dstp->bits[0], | ||
442 | UV_DISTRIBUTION_SIZE); | ||
443 | } | ||
319 | 444 | ||
320 | static inline void bau_cpubits_clear(struct bau_local_cpumask *dstp, int nbits) | 445 | static inline void bau_cpubits_clear(struct bau_local_cpumask *dstp, int nbits) |
321 | { | 446 | { |
@@ -328,4 +453,35 @@ static inline void bau_cpubits_clear(struct bau_local_cpumask *dstp, int nbits) | |||
328 | extern void uv_bau_message_intr1(void); | 453 | extern void uv_bau_message_intr1(void); |
329 | extern void uv_bau_timeout_intr1(void); | 454 | extern void uv_bau_timeout_intr1(void); |
330 | 455 | ||
456 | struct atomic_short { | ||
457 | short counter; | ||
458 | }; | ||
459 | |||
460 | /** | ||
461 | * atomic_read_short - read a short atomic variable | ||
462 | * @v: pointer of type atomic_short | ||
463 | * | ||
464 | * Atomically reads the value of @v. | ||
465 | */ | ||
466 | static inline int atomic_read_short(const struct atomic_short *v) | ||
467 | { | ||
468 | return v->counter; | ||
469 | } | ||
470 | |||
471 | /** | ||
472 | * atomic_add_short_return - add and return a short int | ||
473 | * @i: short value to add | ||
474 | * @v: pointer of type atomic_short | ||
475 | * | ||
476 | * Atomically adds @i to @v and returns @i + @v | ||
477 | */ | ||
478 | static inline int atomic_add_short_return(short i, struct atomic_short *v) | ||
479 | { | ||
480 | short __i = i; | ||
481 | asm volatile(LOCK_PREFIX "xaddw %0, %1" | ||
482 | : "+r" (i), "+m" (v->counter) | ||
483 | : : "memory"); | ||
484 | return i + __i; | ||
485 | } | ||
486 | |||
331 | #endif /* _ASM_X86_UV_UV_BAU_H */ | 487 | #endif /* _ASM_X86_UV_UV_BAU_H */ |