• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/x86/include/asm/uv/
1/*
2 * This file is subject to the terms and conditions of the GNU General Public
3 * License.  See the file "COPYING" in the main directory of this archive
4 * for more details.
5 *
6 * SGI UV Broadcast Assist Unit definitions
7 *
8 * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved.
9 */
10
11#ifndef _ASM_X86_UV_UV_BAU_H
12#define _ASM_X86_UV_UV_BAU_H
13
14#include <linux/bitmap.h>
15#define BITSPERBYTE 8
16
17/*
18 * Broadcast Assist Unit messaging structures
19 *
20 * Selective Broadcast activations are induced by software action
21 * specifying a particular 8-descriptor "set" via a 6-bit index written
22 * to an MMR.
23 * Thus there are 64 unique 512-byte sets of SB descriptors - one set for
24 * each 6-bit index value. These descriptor sets are mapped in sequence
25 * starting with set 0 located at the address specified in the
26 * BAU_SB_DESCRIPTOR_BASE register, set 1 is located at BASE + 512,
27 * set 2 is at BASE + 2*512, set 3 at BASE + 3*512, and so on.
28 *
29 * We will use 31 sets, one for sending BAU messages from each of the 32
30 * cpu's on the uvhub.
31 *
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).
34 */
35
36#define UV_ITEMS_PER_DESCRIPTOR		8
37/* the 'throttle' to prevent the hardware stay-busy bug */
38#define MAX_BAU_CONCURRENT		3
39#define UV_CPUS_PER_ACT_STATUS		32
40#define UV_ACT_STATUS_MASK		0x3
41#define UV_ACT_STATUS_SIZE		2
42#define UV_ADP_SIZE			32
43#define UV_DISTRIBUTION_SIZE		256
44#define UV_SW_ACK_NPENDING		8
45#define UV_NET_ENDPOINT_INTD		0x38
46#define UV_DESC_BASE_PNODE_SHIFT	49
47#define UV_PAYLOADQ_PNODE_SHIFT		49
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"
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
69
70/*
71 * bits in UVH_LB_BAU_SB_ACTIVATION_STATUS_0/1
72 */
73#define DESC_STATUS_IDLE		0
74#define DESC_STATUS_ACTIVE		1
75#define DESC_STATUS_DESTINATION_TIMEOUT	2
76#define DESC_STATUS_SOURCE_TIMEOUT	3
77
78/*
79 * delay for 'plugged' timeout retries, in microseconds
80 */
81#define PLUGGED_DELAY			10
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
94
95/*
96 * number of entries in the destination side payload queue
97 */
98#define DEST_Q_SIZE			20
99/*
100 * number of destination side software ack resources
101 */
102#define DEST_NUM_RESOURCES		8
103#define MAX_CPUS_PER_NODE		32
104/*
105 * completion statuses for sending a TLB flush message
106 */
107#define FLUSH_RETRY_PLUGGED		1
108#define FLUSH_RETRY_TIMEOUT		2
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 */
118
119/*
120 * Distribution: 32 bytes (256 bits) (bytes 0-0x1f of descriptor)
121 * If the 'multilevel' flag in the header portion of the descriptor
122 * has been set to 0, then endpoint multi-unicast mode is selected.
123 * The distribution specification (32 bytes) is interpreted as a 256-bit
124 * distribution vector. Adjacent bits correspond to consecutive even numbered
125 * nodeIDs. The result of adding the index of a given bit to the 15-bit
126 * 'base_dest_nodeid' field of the header corresponds to the
127 * destination nodeID associated with that specified bit.
128 */
129struct bau_target_uvhubmask {
130	unsigned long bits[BITS_TO_LONGS(UV_DISTRIBUTION_SIZE)];
131};
132
133/*
134 * mask of cpu's on a uvhub
135 * (during initialization we need to check that unsigned long has
136 *  enough bits for max. cpu's per uvhub)
137 */
138struct bau_local_cpumask {
139	unsigned long bits;
140};
141
142/*
143 * Payload: 16 bytes (128 bits) (bytes 0x20-0x2f of descriptor)
144 * only 12 bytes (96 bits) of the payload area are usable.
145 * An additional 3 bytes (bits 27:4) of the header address are carried
146 * to the next bytes of the destination payload queue.
147 * And an additional 2 bytes of the header Suppl_A field are also
148 * carried to the destination payload queue.
149 * But the first byte of the Suppl_A becomes bits 127:120 (the 16th byte)
150 * of the destination payload queue, which is written by the hardware
151 * with the s/w ack resource bit vector.
152 * [ effective message contents (16 bytes (128 bits) maximum), not counting
153 *   the s/w ack bit vector  ]
154 */
155
156/*
157 * The payload is software-defined for INTD transactions
158 */
159struct bau_msg_payload {
160	unsigned long address;		/* signifies a page or all TLB's
161						of the cpu */
162	/* 64 bits */
163	unsigned short sending_cpu;	/* filled in by sender */
164	/* 16 bits */
165	unsigned short acknowledge_count;/* filled in by destination */
166	/* 16 bits */
167	unsigned int reserved1:32;	/* not usable */
168};
169
170
171/*
172 * Message header:  16 bytes (128 bits) (bytes 0x30-0x3f of descriptor)
173 * see table 4.2.3.0.1 in broacast_assist spec.
174 */
175struct bau_msg_header {
176	unsigned int dest_subnodeid:6;	/* must be 0x10, for the LB */
177	/* bits 5:0 */
178	unsigned int base_dest_nodeid:15; /* nasid (pnode<<1) of */
179	/* bits 20:6 */			  /* first bit in uvhub map */
180	unsigned int command:8;	/* message type */
181	/* bits 28:21 */
182				/* 0x38: SN3net EndPoint Message */
183	unsigned int rsvd_1:3;	/* must be zero */
184	/* bits 31:29 */
185				/* int will align on 32 bits */
186	unsigned int rsvd_2:9;	/* must be zero */
187	/* bits 40:32 */
188				/* Suppl_A is 56-41 */
189	unsigned int sequence:16;/* message sequence number */
190	/* bits 56:41 */	/* becomes bytes 16-17 of msg */
191				/* Address field (96:57) is never used as an
192				   address (these are address bits 42:3) */
193
194	unsigned int rsvd_3:1;	/* must be zero */
195	/* bit 57 */
196				/* address bits 27:4 are payload */
197	/* these next 24  (58-81) bits become bytes 12-14 of msg */
198
199	/* bits 65:58 land in byte 12 */
200	unsigned int replied_to:1;/* sent as 0 by the source to byte 12 */
201	/* bit 58 */
202	unsigned int msg_type:3; /* software type of the message*/
203	/* bits 61:59 */
204	unsigned int canceled:1; /* message canceled, resource to be freed*/
205	/* bit 62 */
206	unsigned int payload_1a:1;/* not currently used */
207	/* bit 63 */
208	unsigned int payload_1b: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 */
221	/* bits 81:80 */
222
223	unsigned int rsvd_4:7;	/* must be zero */
224	/* bits 88:82 */
225	unsigned int sw_ack_flag:1;/* software acknowledge flag */
226	/* bit 89 */
227				/* INTD trasactions at destination are to
228				   wait for software acknowledge */
229	unsigned int rsvd_5:6;	/* must be zero */
230	/* bits 95:90 */
231	unsigned int rsvd_6:5;	/* must be zero */
232	/* bits 100:96 */
233	unsigned int int_both:1;/* if 1, interrupt both sockets on the uvhub */
234	/* bit 101*/
235	unsigned int fairness:3;/* usually zero */
236	/* bits 104:102 */
237	unsigned int multilevel:1;	/* multi-level multicast format */
238	/* bit 105 */
239				/* 0 for TLB: endpoint multi-unicast messages */
240	unsigned int chaining:1;/* next descriptor is part of this activation*/
241	/* bit 106 */
242	unsigned int rsvd_7:21;	/* must be zero */
243	/* bits 127:107 */
244};
245
246/* see msg_type: */
247#define MSG_NOOP 0
248#define MSG_REGULAR 1
249#define MSG_RETRY 2
250
251/*
252 * The activation descriptor:
253 * The format of the message to send, plus all accompanying control
254 * Should be 64 bytes
255 */
256struct bau_desc {
257	struct bau_target_uvhubmask distribution;
258	/*
259	 * message template, consisting of header and payload:
260	 */
261	struct bau_msg_header header;
262	struct bau_msg_payload payload;
263};
264/*
265 *   -payload--    ---------header------
266 *   bytes 0-11    bits 41-56  bits 58-81
267 *       A           B  (2)      C (3)
268 *
269 *            A/B/C are moved to:
270 *       A            C          B
271 *   bytes 0-11  bytes 12-14  bytes 16-17  (byte 15 filled in by hw as vector)
272 *   ------------payload queue-----------
273 */
274
275/*
276 * The payload queue on the destination side is an array of these.
277 * With BAU_MISC_CONTROL set for software acknowledge mode, the messages
278 * are 32 bytes (2 micropackets) (256 bits) in length, but contain only 17
279 * bytes of usable data, including the sw ack vector in byte 15 (bits 127:120)
280 * (12 bytes come from bau_msg_payload, 3 from payload_1, 2 from
281 *  sw_ack_vector and payload_2)
282 * "Enabling Software Acknowledgment mode (see Section 4.3.3 Software
283 *  Acknowledge Processing) also selects 32 byte (17 bytes usable) payload
284 *  operation."
285 */
286struct bau_payload_queue_entry {
287	unsigned long address;		/* signifies a page or all TLB's
288						of the cpu */
289	/* 64 bits, bytes 0-7 */
290
291	unsigned short sending_cpu;	/* cpu that sent the message */
292	/* 16 bits, bytes 8-9 */
293
294	unsigned short acknowledge_count; /* filled in by destination */
295	/* 16 bits, bytes 10-11 */
296
297	/* these next 3 bytes come from bits 58-81 of the message header */
298	unsigned short replied_to:1;    /* sent as 0 by the source */
299	unsigned short msg_type:3;      /* software message type */
300	unsigned short canceled:1;      /* sent as 0 by the source */
301	unsigned short unused1:3;       /* not currently using */
302	/* byte 12 */
303
304	unsigned char unused2a;		/* not currently using */
305	/* byte 13 */
306	unsigned char unused2;		/* not currently using */
307	/* byte 14 */
308
309	unsigned char sw_ack_vector;	/* filled in by the hardware */
310	/* byte 15 (bits 127:120) */
311
312	unsigned short sequence;	/* message sequence number */
313	/* bytes 16-17 */
314	unsigned char unused4[2];	/* not currently using bytes 18-19 */
315	/* bytes 18-19 */
316
317	int number_of_cpus;		/* filled in at destination */
318	/* 32 bits, bytes 20-23 (aligned) */
319
320	unsigned char unused5[8];       /* not using */
321	/* bytes 24-31 */
322};
323
324struct msg_desc {
325	struct bau_payload_queue_entry *msg;
326	int msg_slot;
327	int sw_ack_slot;
328	struct bau_payload_queue_entry *va_queue_first;
329	struct bau_payload_queue_entry *va_queue_last;
330};
331
332struct reset_args {
333	int sender;
334};
335
336/*
337 * This structure is allocated per_cpu for UV TLB shootdown statistics.
338 */
339struct ptc_stats {
340	/* sender statistics */
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 */
378};
379
380/*
381 * one per-cpu; to locate the software tables
382 */
383struct bau_control {
384	struct bau_desc *descriptor_base;
385	struct bau_payload_queue_entry *va_queue_first;
386	struct bau_payload_queue_entry *va_queue_last;
387	struct bau_payload_queue_entry *bau_msg_head;
388	struct bau_control *uvhub_master;
389	struct bau_control *socket_master;
390	struct ptc_stats *statp;
391	unsigned long timeout_interval;
392	unsigned long set_bau_on_time;
393	atomic_t active_descriptor_count;
394	int plugged_tries;
395	int timeout_tries;
396	int ipi_attempts;
397	int conseccompletes;
398	int baudisabled;
399	int set_bau_off;
400	short cpu;
401	short uvhub_cpu;
402	short uvhub;
403	short cpus_in_socket;
404	short cpus_in_uvhub;
405	unsigned short message_number;
406	unsigned short uvhub_quiesce;
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;
424};
425
426static inline int bau_uvhub_isset(int uvhub, struct bau_target_uvhubmask *dstp)
427{
428	return constant_test_bit(uvhub, &dstp->bits[0]);
429}
430static inline void bau_uvhub_set(int uvhub, struct bau_target_uvhubmask *dstp)
431{
432	__set_bit(uvhub, &dstp->bits[0]);
433}
434static inline void bau_uvhubs_clear(struct bau_target_uvhubmask *dstp,
435				    int nbits)
436{
437	bitmap_zero(&dstp->bits[0], nbits);
438}
439static 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}
444
445static inline void bau_cpubits_clear(struct bau_local_cpumask *dstp, int nbits)
446{
447	bitmap_zero(&dstp->bits, nbits);
448}
449
450#define cpubit_isset(cpu, bau_local_cpumask) \
451	test_bit((cpu), (bau_local_cpumask).bits)
452
453extern void uv_bau_message_intr1(void);
454extern void uv_bau_timeout_intr1(void);
455
456struct 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 */
466static 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 */
478static 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
487#endif /* _ASM_X86_UV_UV_BAU_H */
488