]> err.no Git - linux-2.6/blob - arch/x86/kernel/tlb_uv.c
SGI UV: TLB shootdown using broadcast assist unit, cleanups
[linux-2.6] / arch / x86 / kernel / tlb_uv.c
1 /*
2  *      SGI UltraViolet TLB flush routines.
3  *
4  *      (c) 2008 Cliff Wickman <cpw@sgi.com>, SGI.
5  *
6  *      This code is released under the GNU General Public License version 2 or
7  *      later.
8  */
9 #include <linux/mc146818rtc.h>
10 #include <linux/proc_fs.h>
11 #include <linux/kernel.h>
12
13 #include <asm/mmu_context.h>
14 #include <asm/idle.h>
15 #include <asm/genapic.h>
16 #include <asm/uv/uv_hub.h>
17 #include <asm/uv/uv_mmrs.h>
18 #include <asm/uv/uv_bau.h>
19 #include <asm/tsc.h>
20
21 #include <mach_apic.h>
22
23 static struct bau_control **uv_bau_table_bases __read_mostly;
24 static int uv_bau_retry_limit __read_mostly;
25 static int uv_nshift __read_mostly; /* position of pnode (which is nasid>>1) */
26 static unsigned long uv_mmask __read_mostly;
27
28 char *status_table[] = {
29         "IDLE",
30         "ACTIVE",
31         "DESTINATION TIMEOUT",
32         "SOURCE TIMEOUT"
33 };
34
35 DEFINE_PER_CPU(struct ptc_stats, ptcstats);
36 DEFINE_PER_CPU(struct bau_control, bau_control);
37
38 /*
39  * Free a software acknowledge hardware resource by clearing its Pending
40  * bit. This will return a reply to the sender.
41  * If the message has timed out, a reply has already been sent by the
42  * hardware but the resource has not been released. In that case our
43  * clear of the Timeout bit (as well) will free the resource. No reply will
44  * be sent (the hardware will only do one reply per message).
45  */
46 static void uv_reply_to_message(int resource,
47                     struct bau_payload_queue_entry *msg,
48                     struct bau_msg_status *msp)
49 {
50         unsigned long dw;
51
52         dw = (1 << (resource + UV_SW_ACK_NPENDING)) | (1 << resource);
53         msg->replied_to = 1;
54         msg->sw_ack_vector = 0;
55         if (msp)
56                 msp->seen_by.bits = 0;
57         uv_write_local_mmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, dw);
58         return;
59 }
60
61 /*
62  * Do all the things a cpu should do for a TLB shootdown message.
63  * Other cpu's may come here at the same time for this message.
64  */
65 static void uv_bau_process_message(struct bau_payload_queue_entry *msg,
66                        int msg_slot, int sw_ack_slot)
67 {
68         int cpu;
69         unsigned long this_cpu_mask;
70         struct bau_msg_status *msp;
71
72         msp = __get_cpu_var(bau_control).msg_statuses + msg_slot;
73         cpu = uv_blade_processor_id();
74         msg->number_of_cpus =
75             uv_blade_nr_online_cpus(uv_node_to_blade_id(numa_node_id()));
76         this_cpu_mask = (unsigned long)1 << cpu;
77         if (msp->seen_by.bits & this_cpu_mask)
78                 return;
79         atomic_or_long(&msp->seen_by.bits, this_cpu_mask);
80
81         if (msg->replied_to == 1)
82                 return;
83
84         if (msg->address == TLB_FLUSH_ALL) {
85                 local_flush_tlb();
86                 __get_cpu_var(ptcstats).alltlb++;
87         } else {
88                 __flush_tlb_one(msg->address);
89                 __get_cpu_var(ptcstats).onetlb++;
90         }
91
92         __get_cpu_var(ptcstats).requestee++;
93
94         atomic_inc_short(&msg->acknowledge_count);
95         if (msg->number_of_cpus == msg->acknowledge_count)
96                 uv_reply_to_message(sw_ack_slot, msg, msp);
97         return;
98 }
99
100 /*
101  * Examine the payload queue on all the distribution nodes to see
102  * which messages have not been seen, and which cpu(s) have not seen them.
103  *
104  * Returns the number of cpu's that have not responded.
105  */
106 static int uv_examine_destinations(struct bau_target_nodemask *distribution)
107 {
108         int sender;
109         int i;
110         int j;
111         int k;
112         int count = 0;
113         struct bau_control *bau_tablesp;
114         struct bau_payload_queue_entry *msg;
115         struct bau_msg_status *msp;
116
117         sender = smp_processor_id();
118         for (i = 0; i < (sizeof(struct bau_target_nodemask) * BITSPERBYTE);
119              i++) {
120                 if (!bau_node_isset(i, distribution))
121                         continue;
122                 bau_tablesp = uv_bau_table_bases[i];
123                 for (msg = bau_tablesp->va_queue_first, j = 0;
124                      j < DESTINATION_PAYLOAD_QUEUE_SIZE; msg++, j++) {
125                         if ((msg->sending_cpu == sender) &&
126                             (!msg->replied_to)) {
127                                 msp = bau_tablesp->msg_statuses + j;
128                                 printk(KERN_DEBUG
129                                 "blade %d: address:%#lx %d of %d, not cpu(s): ",
130                                        i, msg->address,
131                                        msg->acknowledge_count,
132                                        msg->number_of_cpus);
133                                 for (k = 0; k < msg->number_of_cpus;
134                                      k++) {
135                                         if (!((long)1 << k & msp->
136                                               seen_by.bits)) {
137                                                 count++;
138                                                 printk("%d ", k);
139                                         }
140                                 }
141                                 printk("\n");
142                         }
143                 }
144         }
145         return count;
146 }
147
148 /*
149  * wait for completion of a broadcast message
150  *
151  * return COMPLETE, RETRY or GIVEUP
152  */
153 static int uv_wait_completion(struct bau_activation_descriptor *bau_desc,
154                               unsigned long mmr_offset, int right_shift)
155 {
156         int exams = 0;
157         long destination_timeouts = 0;
158         long source_timeouts = 0;
159         unsigned long descriptor_status;
160
161         while ((descriptor_status = (((unsigned long)
162                 uv_read_local_mmr(mmr_offset) >>
163                         right_shift) & UV_ACT_STATUS_MASK)) !=
164                         DESC_STATUS_IDLE) {
165                 if (descriptor_status == DESC_STATUS_SOURCE_TIMEOUT) {
166                         source_timeouts++;
167                         if (source_timeouts > SOURCE_TIMEOUT_LIMIT)
168                                 source_timeouts = 0;
169                         __get_cpu_var(ptcstats).s_retry++;
170                         return FLUSH_RETRY;
171                 }
172                 /*
173                  * spin here looking for progress at the destinations
174                  */
175                 if (descriptor_status == DESC_STATUS_DESTINATION_TIMEOUT) {
176                         destination_timeouts++;
177                         if (destination_timeouts > DESTINATION_TIMEOUT_LIMIT) {
178                                 /*
179                                  * returns number of cpus not responding
180                                  */
181                                 if (uv_examine_destinations
182                                     (&bau_desc->distribution) == 0) {
183                                         __get_cpu_var(ptcstats).d_retry++;
184                                         return FLUSH_RETRY;
185                                 }
186                                 exams++;
187                                 if (exams >= uv_bau_retry_limit) {
188                                         printk(KERN_DEBUG
189                                                "uv_flush_tlb_others");
190                                         printk("giving up on cpu %d\n",
191                                                smp_processor_id());
192                                         return FLUSH_GIVEUP;
193                                 }
194                                 /*
195                                  * delays can hang the simulator
196                                    udelay(1000);
197                                  */
198                                 destination_timeouts = 0;
199                         }
200                 }
201         }
202         return FLUSH_COMPLETE;
203 }
204
205 /**
206  * uv_flush_send_and_wait
207  *
208  * Send a broadcast and wait for a broadcast message to complete.
209  *
210  * The cpumaskp mask contains the cpus the broadcast was sent to.
211  *
212  * Returns 1 if all remote flushing was done. The mask is zeroed.
213  * Returns 0 if some remote flushing remains to be done. The mask is left
214  * unchanged.
215  */
216 int uv_flush_send_and_wait(int cpu, int this_blade,
217         struct bau_activation_descriptor *bau_desc, cpumask_t *cpumaskp)
218 {
219         int completion_status = 0;
220         int right_shift;
221         int bit;
222         int blade;
223         int tries = 0;
224         unsigned long index;
225         unsigned long mmr_offset;
226         cycles_t time1;
227         cycles_t time2;
228
229         if (cpu < UV_CPUS_PER_ACT_STATUS) {
230                 mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0;
231                 right_shift = cpu * UV_ACT_STATUS_SIZE;
232         } else {
233                 mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1;
234                 right_shift =
235                     ((cpu - UV_CPUS_PER_ACT_STATUS) * UV_ACT_STATUS_SIZE);
236         }
237         time1 = get_cycles();
238         do {
239                 tries++;
240                 index = ((unsigned long)
241                         1 << UVH_LB_BAU_SB_ACTIVATION_CONTROL_PUSH_SHFT) | cpu;
242                 uv_write_local_mmr(UVH_LB_BAU_SB_ACTIVATION_CONTROL, index);
243                 completion_status = uv_wait_completion(bau_desc, mmr_offset,
244                                         right_shift);
245         } while (completion_status == FLUSH_RETRY);
246         time2 = get_cycles();
247         __get_cpu_var(ptcstats).sflush += (time2 - time1);
248         if (tries > 1)
249                 __get_cpu_var(ptcstats).retriesok++;
250
251         if (completion_status == FLUSH_GIVEUP) {
252                 /*
253                  * Cause the caller to do an IPI-style TLB shootdown on
254                  * the cpu's, all of which are still in the mask.
255                  */
256                 __get_cpu_var(ptcstats).ptc_i++;
257                 return 0;
258         }
259
260         /*
261          * Success, so clear the remote cpu's from the mask so we don't
262          * use the IPI method of shootdown on them.
263          */
264         for_each_cpu_mask(bit, *cpumaskp) {
265                 blade = uv_cpu_to_blade_id(bit);
266                 if (blade == this_blade)
267                         continue;
268                 cpu_clear(bit, *cpumaskp);
269         }
270         if (!cpus_empty(*cpumaskp))
271                 return 0;
272         return 1;
273 }
274
275 /**
276  * uv_flush_tlb_others - globally purge translation cache of a virtual
277  * address or all TLB's
278  * @cpumaskp: mask of all cpu's in which the address is to be removed
279  * @mm: mm_struct containing virtual address range
280  * @va: virtual address to be removed (or TLB_FLUSH_ALL for all TLB's on cpu)
281  *
282  * This is the entry point for initiating any UV global TLB shootdown.
283  *
284  * Purges the translation caches of all specified processors of the given
285  * virtual address, or purges all TLB's on specified processors.
286  *
287  * The caller has derived the cpumaskp from the mm_struct and has subtracted
288  * the local cpu from the mask.  This function is called only if there
289  * are bits set in the mask. (e.g. flush_tlb_page())
290  *
291  * The cpumaskp is converted into a nodemask of the nodes containing
292  * the cpus.
293  *
294  * Returns 1 if all remote flushing was done.
295  * Returns 0 if some remote flushing remains to be done.
296  */
297 int uv_flush_tlb_others(cpumask_t *cpumaskp, struct mm_struct *mm,
298         unsigned long va)
299 {
300         int i;
301         int bit;
302         int blade;
303         int cpu;
304         int this_blade;
305         int locals = 0;
306         struct bau_activation_descriptor *bau_desc;
307
308         cpu = uv_blade_processor_id();
309         this_blade = uv_numa_blade_id();
310         bau_desc = __get_cpu_var(bau_control).descriptor_base;
311         bau_desc += UV_ITEMS_PER_DESCRIPTOR * cpu;
312
313         bau_nodes_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE);
314
315         i = 0;
316         for_each_cpu_mask(bit, *cpumaskp) {
317                 blade = uv_cpu_to_blade_id(bit);
318                 if (blade > (UV_DISTRIBUTION_SIZE - 1))
319                         BUG();
320                 if (blade == this_blade) {
321                         locals++;
322                         continue;
323                 }
324                 bau_node_set(blade, &bau_desc->distribution);
325                 i++;
326         }
327         if (i == 0) {
328                 /*
329                  * no off_node flushing; return status for local node
330                  */
331                 if (locals)
332                         return 0;
333                 else
334                         return 1;
335         }
336         __get_cpu_var(ptcstats).requestor++;
337         __get_cpu_var(ptcstats).ntargeted += i;
338
339         bau_desc->payload.address = va;
340         bau_desc->payload.sending_cpu = smp_processor_id();
341
342         return uv_flush_send_and_wait(cpu, this_blade, bau_desc, cpumaskp);
343 }
344
345 /*
346  * The BAU message interrupt comes here. (registered by set_intr_gate)
347  * See entry_64.S
348  *
349  * We received a broadcast assist message.
350  *
351  * Interrupts may have been disabled; this interrupt could represent
352  * the receipt of several messages.
353  *
354  * All cores/threads on this node get this interrupt.
355  * The last one to see it does the s/w ack.
356  * (the resource will not be freed until noninterruptable cpus see this
357  *  interrupt; hardware will timeout the s/w ack and reply ERROR)
358  */
359 void uv_bau_message_interrupt(struct pt_regs *regs)
360 {
361         struct bau_payload_queue_entry *pqp;
362         struct bau_payload_queue_entry *msg;
363         struct pt_regs *old_regs = set_irq_regs(regs);
364         cycles_t time1, time2;
365         int msg_slot;
366         int sw_ack_slot;
367         int fw;
368         int count = 0;
369         unsigned long local_pnode;
370
371         ack_APIC_irq();
372         exit_idle();
373         irq_enter();
374
375         time1 = get_cycles();
376
377         local_pnode = uv_blade_to_pnode(uv_numa_blade_id());
378
379         pqp = __get_cpu_var(bau_control).va_queue_first;
380         msg = __get_cpu_var(bau_control).bau_msg_head;
381         while (msg->sw_ack_vector) {
382                 count++;
383                 fw = msg->sw_ack_vector;
384                 msg_slot = msg - pqp;
385                 sw_ack_slot = ffs(fw) - 1;
386
387                 uv_bau_process_message(msg, msg_slot, sw_ack_slot);
388
389                 msg++;
390                 if (msg > __get_cpu_var(bau_control).va_queue_last)
391                         msg = __get_cpu_var(bau_control).va_queue_first;
392                 __get_cpu_var(bau_control).bau_msg_head = msg;
393         }
394         if (!count)
395                 __get_cpu_var(ptcstats).nomsg++;
396         else if (count > 1)
397                 __get_cpu_var(ptcstats).multmsg++;
398
399         time2 = get_cycles();
400         __get_cpu_var(ptcstats).dflush += (time2 - time1);
401
402         irq_exit();
403         set_irq_regs(old_regs);
404         return;
405 }
406
407 static void uv_enable_timeouts(void)
408 {
409         int i;
410         int blade;
411         int last_blade;
412         int pnode;
413         int cur_cpu = 0;
414         unsigned long apicid;
415
416         last_blade = -1;
417         for_each_online_node(i) {
418                 blade = uv_node_to_blade_id(i);
419                 if (blade == last_blade)
420                         continue;
421                 last_blade = blade;
422                 apicid = per_cpu(x86_cpu_to_apicid, cur_cpu);
423                 pnode = uv_blade_to_pnode(blade);
424                 cur_cpu += uv_blade_nr_possible_cpus(i);
425         }
426         return;
427 }
428
429 static void *uv_ptc_seq_start(struct seq_file *file, loff_t *offset)
430 {
431         if (*offset < num_possible_cpus())
432                 return offset;
433         return NULL;
434 }
435
436 static void *uv_ptc_seq_next(struct seq_file *file, void *data, loff_t *offset)
437 {
438         (*offset)++;
439         if (*offset < num_possible_cpus())
440                 return offset;
441         return NULL;
442 }
443
444 static void uv_ptc_seq_stop(struct seq_file *file, void *data)
445 {
446 }
447
448 /*
449  * Display the statistics thru /proc
450  * data points to the cpu number
451  */
452 static int uv_ptc_seq_show(struct seq_file *file, void *data)
453 {
454         struct ptc_stats *stat;
455         int cpu;
456
457         cpu = *(loff_t *)data;
458
459         if (!cpu) {
460                 seq_printf(file,
461                 "# cpu requestor requestee one all sretry dretry ptc_i ");
462                 seq_printf(file,
463                 "sw_ack sflush dflush sok dnomsg dmult starget\n");
464         }
465         if (cpu < num_possible_cpus() && cpu_online(cpu)) {
466                 stat = &per_cpu(ptcstats, cpu);
467                 seq_printf(file, "cpu %d %ld %ld %ld %ld %ld %ld %ld ",
468                            cpu, stat->requestor,
469                            stat->requestee, stat->onetlb, stat->alltlb,
470                            stat->s_retry, stat->d_retry, stat->ptc_i);
471                 seq_printf(file, "%lx %ld %ld %ld %ld %ld %ld\n",
472                            uv_read_global_mmr64(uv_blade_to_pnode
473                                         (uv_cpu_to_blade_id(cpu)),
474                                         UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE),
475                            stat->sflush, stat->dflush,
476                            stat->retriesok, stat->nomsg,
477                            stat->multmsg, stat->ntargeted);
478         }
479
480         return 0;
481 }
482
483 /*
484  *  0: display meaning of the statistics
485  * >0: retry limit
486  */
487 static ssize_t uv_ptc_proc_write(struct file *file, const char __user *user,
488                   size_t count, loff_t *data)
489 {
490         long newmode;
491         char optstr[64];
492
493         if (copy_from_user(optstr, user, count))
494                 return -EFAULT;
495         optstr[count - 1] = '\0';
496         if (strict_strtoul(optstr, 10, &newmode) < 0) {
497                 printk(KERN_DEBUG "%s is invalid\n", optstr);
498                 return -EINVAL;
499         }
500
501         if (newmode == 0) {
502                 printk(KERN_DEBUG "# cpu:      cpu number\n");
503                 printk(KERN_DEBUG
504                 "requestor:  times this cpu was the flush requestor\n");
505                 printk(KERN_DEBUG
506                 "requestee:  times this cpu was requested to flush its TLBs\n");
507                 printk(KERN_DEBUG
508                 "one:        times requested to flush a single address\n");
509                 printk(KERN_DEBUG
510                 "all:        times requested to flush all TLB's\n");
511                 printk(KERN_DEBUG
512                 "sretry:     number of retries of source-side timeouts\n");
513                 printk(KERN_DEBUG
514                 "dretry:     number of retries of destination-side timeouts\n");
515                 printk(KERN_DEBUG
516                 "ptc_i:      times UV fell through to IPI-style flushes\n");
517                 printk(KERN_DEBUG
518                 "sw_ack:     image of UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE\n");
519                 printk(KERN_DEBUG
520                 "sflush_us:  cycles spent in uv_flush_tlb_others()\n");
521                 printk(KERN_DEBUG
522                 "dflush_us:  cycles spent in handling flush requests\n");
523                 printk(KERN_DEBUG "sok:        successes on retry\n");
524                 printk(KERN_DEBUG "dnomsg:     interrupts with no message\n");
525                 printk(KERN_DEBUG
526                 "dmult:      interrupts with multiple messages\n");
527                 printk(KERN_DEBUG "starget:    nodes targeted\n");
528         } else {
529                 uv_bau_retry_limit = newmode;
530                 printk(KERN_DEBUG "timeout retry limit:%d\n",
531                        uv_bau_retry_limit);
532         }
533
534         return count;
535 }
536
537 static const struct seq_operations uv_ptc_seq_ops = {
538         .start  = uv_ptc_seq_start,
539         .next   = uv_ptc_seq_next,
540         .stop   = uv_ptc_seq_stop,
541         .show   = uv_ptc_seq_show
542 };
543
544 static int uv_ptc_proc_open(struct inode *inode, struct file *file)
545 {
546         return seq_open(file, &uv_ptc_seq_ops);
547 }
548
549 static const struct file_operations proc_uv_ptc_operations = {
550         .open           = uv_ptc_proc_open,
551         .read           = seq_read,
552         .write          = uv_ptc_proc_write,
553         .llseek         = seq_lseek,
554         .release        = seq_release,
555 };
556
557 static int __init uv_ptc_init(void)
558 {
559         struct proc_dir_entry *proc_uv_ptc;
560
561         if (!is_uv_system())
562                 return 0;
563
564         if (!proc_mkdir("sgi_uv", NULL))
565                 return -EINVAL;
566
567         proc_uv_ptc = create_proc_entry(UV_PTC_BASENAME, 0444, NULL);
568         if (!proc_uv_ptc) {
569                 printk(KERN_ERR "unable to create %s proc entry\n",
570                        UV_PTC_BASENAME);
571                 return -EINVAL;
572         }
573         proc_uv_ptc->proc_fops = &proc_uv_ptc_operations;
574         return 0;
575 }
576
577 /*
578  * begin the initialization of the per-blade control structures
579  */
580 static struct bau_control * __init uv_table_bases_init(int blade, int node)
581 {
582         int i;
583         int *ip;
584         struct bau_msg_status *msp;
585         struct bau_control *bau_tablesp;
586
587         bau_tablesp =
588             kmalloc_node(sizeof(struct bau_control), GFP_KERNEL, node);
589         if (!bau_tablesp)
590                 BUG();
591         bau_tablesp->msg_statuses =
592             kmalloc_node(sizeof(struct bau_msg_status) *
593                          DESTINATION_PAYLOAD_QUEUE_SIZE, GFP_KERNEL, node);
594         if (!bau_tablesp->msg_statuses)
595                 BUG();
596         for (i = 0, msp = bau_tablesp->msg_statuses;
597              i < DESTINATION_PAYLOAD_QUEUE_SIZE; i++, msp++) {
598                 bau_cpubits_clear(&msp->seen_by, (int)
599                                   uv_blade_nr_possible_cpus(blade));
600         }
601         bau_tablesp->watching =
602             kmalloc_node(sizeof(int) * DESTINATION_NUM_RESOURCES,
603                          GFP_KERNEL, node);
604         if (!bau_tablesp->watching)
605                 BUG();
606         for (i = 0, ip = bau_tablesp->watching;
607              i < DESTINATION_PAYLOAD_QUEUE_SIZE; i++, ip++) {
608                 *ip = 0;
609         }
610         uv_bau_table_bases[blade] = bau_tablesp;
611         return bau_tablesp;
612 }
613
614 /*
615  * finish the initialization of the per-blade control structures
616  */
617 static void __init uv_table_bases_finish(int blade, int node, int cur_cpu,
618                                   struct bau_control *bau_tablesp,
619                                   struct bau_activation_descriptor *adp)
620 {
621         int i;
622         struct bau_control *bcp;
623
624         for (i = cur_cpu; i < (cur_cpu + uv_blade_nr_possible_cpus(blade));
625              i++) {
626                 bcp = (struct bau_control *)&per_cpu(bau_control, i);
627                 bcp->bau_msg_head = bau_tablesp->va_queue_first;
628                 bcp->va_queue_first = bau_tablesp->va_queue_first;
629                 bcp->va_queue_last = bau_tablesp->va_queue_last;
630                 bcp->watching = bau_tablesp->watching;
631                 bcp->msg_statuses = bau_tablesp->msg_statuses;
632                 bcp->descriptor_base = adp;
633         }
634 }
635
636 /*
637  * initialize the sending side's sending buffers
638  */
639 static struct bau_activation_descriptor * __init
640 uv_activation_descriptor_init(int node, int pnode)
641 {
642         int i;
643         unsigned long pa;
644         unsigned long m;
645         unsigned long n;
646         unsigned long mmr_image;
647         struct bau_activation_descriptor *adp;
648         struct bau_activation_descriptor *ad2;
649
650         adp = (struct bau_activation_descriptor *)
651             kmalloc_node(16384, GFP_KERNEL, node);
652         if (!adp)
653                 BUG();
654         pa = __pa((unsigned long)adp);
655         n = pa >> uv_nshift;
656         m = pa & uv_mmask;
657         mmr_image = uv_read_global_mmr64(pnode, UVH_LB_BAU_SB_DESCRIPTOR_BASE);
658         if (mmr_image)
659                 uv_write_global_mmr64(pnode, (unsigned long)
660                                       UVH_LB_BAU_SB_DESCRIPTOR_BASE,
661                                       (n << UV_DESC_BASE_PNODE_SHIFT | m));
662         for (i = 0, ad2 = adp; i < UV_ACTIVATION_DESCRIPTOR_SIZE; i++, ad2++) {
663                 memset(ad2, 0, sizeof(struct bau_activation_descriptor));
664                 ad2->header.sw_ack_flag = 1;
665                 ad2->header.base_dest_nodeid =
666                     uv_blade_to_pnode(uv_cpu_to_blade_id(0));
667                 ad2->header.command = UV_NET_ENDPOINT_INTD;
668                 ad2->header.int_both = 1;
669                 /*
670                  * all others need to be set to zero:
671                  *   fairness chaining multilevel count replied_to
672                  */
673         }
674         return adp;
675 }
676
677 /*
678  * initialize the destination side's receiving buffers
679  */
680 static struct bau_payload_queue_entry * __init uv_payload_queue_init(int node,
681                                 int pnode, struct bau_control *bau_tablesp)
682 {
683         char *cp;
684         struct bau_payload_queue_entry *pqp;
685
686         pqp = (struct bau_payload_queue_entry *)
687             kmalloc_node((DESTINATION_PAYLOAD_QUEUE_SIZE + 1) *
688                          sizeof(struct bau_payload_queue_entry),
689                          GFP_KERNEL, node);
690         if (!pqp)
691                 BUG();
692         cp = (char *)pqp + 31;
693         pqp = (struct bau_payload_queue_entry *)(((unsigned long)cp >> 5) << 5);
694         bau_tablesp->va_queue_first = pqp;
695         uv_write_global_mmr64(pnode,
696                               UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST,
697                               ((unsigned long)pnode <<
698                                UV_PAYLOADQ_PNODE_SHIFT) |
699                               uv_physnodeaddr(pqp));
700         uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL,
701                               uv_physnodeaddr(pqp));
702         bau_tablesp->va_queue_last =
703             pqp + (DESTINATION_PAYLOAD_QUEUE_SIZE - 1);
704         uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST,
705                               (unsigned long)
706                               uv_physnodeaddr(bau_tablesp->va_queue_last));
707         memset(pqp, 0, sizeof(struct bau_payload_queue_entry) *
708                DESTINATION_PAYLOAD_QUEUE_SIZE);
709         return pqp;
710 }
711
712 /*
713  * Initialization of each UV blade's structures
714  */
715 static int __init uv_init_blade(int blade, int node, int cur_cpu)
716 {
717         int pnode;
718         unsigned long pa;
719         unsigned long apicid;
720         struct bau_activation_descriptor *adp;
721         struct bau_payload_queue_entry *pqp;
722         struct bau_control *bau_tablesp;
723
724         bau_tablesp = uv_table_bases_init(blade, node);
725         pnode = uv_blade_to_pnode(blade);
726         adp = uv_activation_descriptor_init(node, pnode);
727         pqp = uv_payload_queue_init(node, pnode, bau_tablesp);
728         uv_table_bases_finish(blade, node, cur_cpu, bau_tablesp, adp);
729         /*
730          * the below initialization can't be in firmware because the
731          * messaging IRQ will be determined by the OS
732          */
733         apicid = per_cpu(x86_cpu_to_apicid, cur_cpu);
734         pa = uv_read_global_mmr64(pnode, UVH_BAU_DATA_CONFIG);
735         if ((pa & 0xff) != UV_BAU_MESSAGE) {
736                 uv_write_global_mmr64(pnode, UVH_BAU_DATA_CONFIG,
737                                       ((apicid << 32) | UV_BAU_MESSAGE));
738         }
739         return 0;
740 }
741
742 /*
743  * Initialization of BAU-related structures
744  */
745 static int __init uv_bau_init(void)
746 {
747         int blade;
748         int node;
749         int nblades;
750         int last_blade;
751         int cur_cpu = 0;
752
753         if (!is_uv_system())
754                 return 0;
755
756         uv_bau_retry_limit = 1;
757         uv_nshift = uv_hub_info->n_val;
758         uv_mmask = ((unsigned long)1 << uv_hub_info->n_val) - 1;
759         nblades = 0;
760         last_blade = -1;
761         for_each_online_node(node) {
762                 blade = uv_node_to_blade_id(node);
763                 if (blade == last_blade)
764                         continue;
765                 last_blade = blade;
766                 nblades++;
767         }
768         uv_bau_table_bases = (struct bau_control **)
769             kmalloc(nblades * sizeof(struct bau_control *), GFP_KERNEL);
770         if (!uv_bau_table_bases)
771                 BUG();
772         last_blade = -1;
773         for_each_online_node(node) {
774                 blade = uv_node_to_blade_id(node);
775                 if (blade == last_blade)
776                         continue;
777                 last_blade = blade;
778                 uv_init_blade(blade, node, cur_cpu);
779                 cur_cpu += uv_blade_nr_possible_cpus(blade);
780         }
781         set_intr_gate(UV_BAU_MESSAGE, uv_bau_message_intr1);
782         uv_enable_timeouts();
783         return 0;
784 }
785 __initcall(uv_bau_init);
786 __initcall(uv_ptc_init);