-
- bau_tablesp =
- kmalloc_node(sizeof(struct bau_control), GFP_KERNEL, i);
- if (!bau_tablesp)
- BUG();
-
- bau_tablesp->msg_statuses =
- kmalloc_node(sizeof(struct bau_msg_status) *
- DESTINATION_PAYLOAD_QUEUE_SIZE, GFP_KERNEL, i);
- if (!bau_tablesp->msg_statuses)
- BUG();
- for (j = 0, msp = bau_tablesp->msg_statuses;
- j < DESTINATION_PAYLOAD_QUEUE_SIZE; j++, msp++) {
- bau_cpubits_clear(&msp->seen_by, (int)
- uv_blade_nr_possible_cpus(blade));
- }
-
- bau_tablesp->watching =
- kmalloc_node(sizeof(int) * DESTINATION_NUM_RESOURCES,
- GFP_KERNEL, i);
- if (!bau_tablesp->watching)
- BUG();
- for (j = 0, ip = bau_tablesp->watching;
- j < DESTINATION_PAYLOAD_QUEUE_SIZE; j++, ip++) {
- *ip = 0;
- }
-
- uv_bau_table_bases[i] = bau_tablesp;
-
- pnode = uv_blade_to_pnode(blade);
-
- if (sizeof(struct bau_activation_descriptor) != 64)
- BUG();
-
- adp = (struct bau_activation_descriptor *)
- kmalloc_node(16384, GFP_KERNEL, i);
- if (!adp)
- BUG();
- if ((unsigned long)adp & 0xfff)
- BUG();
- pa = __pa((unsigned long)adp);
- n = pa >> uv_nshift;
- m = pa & uv_mmask;
-
- mmr_image = uv_read_global_mmr64(pnode,
- UVH_LB_BAU_SB_DESCRIPTOR_BASE);
- if (mmr_image)
- uv_write_global_mmr64(pnode, (unsigned long)
- UVH_LB_BAU_SB_DESCRIPTOR_BASE,
- (n << UV_DESC_BASE_PNODE_SHIFT |
- m));
- for (j = 0, ad2 = adp; j < UV_ACTIVATION_DESCRIPTOR_SIZE;
- j++, ad2++) {
- memset(ad2, 0,
- sizeof(struct bau_activation_descriptor));
- ad2->header.sw_ack_flag = 1;
- ad2->header.base_dest_nodeid =
- uv_blade_to_pnode(uv_cpu_to_blade_id(0));
- ad2->header.command = UV_NET_ENDPOINT_INTD;
- ad2->header.int_both = 1;
- /* all others need to be set to zero:
- fairness chaining multilevel count replied_to */
- }
-
- pqp = (struct bau_payload_queue_entry *)
- kmalloc_node((DESTINATION_PAYLOAD_QUEUE_SIZE + 1) *
- sizeof(struct bau_payload_queue_entry),
- GFP_KERNEL, i);
- if (!pqp)
- BUG();
- if (sizeof(struct bau_payload_queue_entry) != 32)
- BUG();
- if ((unsigned long)(&((struct bau_payload_queue_entry *)0)->
- sw_ack_vector) != 15)
- BUG();
-
- cp = (char *)pqp + 31;
- pqp = (struct bau_payload_queue_entry *)
- (((unsigned long)cp >> 5) << 5);
- bau_tablesp->va_queue_first = pqp;
- uv_write_global_mmr64(pnode,
- UVH_LB_BAU_INTD_PAYLOAD_QUEUE_FIRST,
- ((unsigned long)pnode <<
- UV_PAYLOADQ_PNODE_SHIFT) |
- uv_physnodeaddr(pqp));
- uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_TAIL,
- uv_physnodeaddr(pqp));
- bau_tablesp->va_queue_last =
- pqp + (DESTINATION_PAYLOAD_QUEUE_SIZE - 1);
- uv_write_global_mmr64(pnode, UVH_LB_BAU_INTD_PAYLOAD_QUEUE_LAST,
- (unsigned long)
- uv_physnodeaddr(bau_tablesp->
- va_queue_last));
- memset(pqp, 0, sizeof(struct bau_payload_queue_entry) *
- DESTINATION_PAYLOAD_QUEUE_SIZE);
-
- /* this initialization can't be in firmware because the
- messaging IRQ will be determined by the OS */
- apicid = per_cpu(x86_cpu_to_apicid, cur_cpu);
- pa = uv_read_global_mmr64(pnode, UVH_BAU_DATA_CONFIG);
- if ((pa & 0xff) != UV_BAU_MESSAGE) {
- uv_write_global_mmr64(pnode, UVH_BAU_DATA_CONFIG,
- ((apicid << 32) |
- UV_BAU_MESSAGE));
- }
-
- for (j = cur_cpu; j < (cur_cpu + uv_blade_nr_possible_cpus(i));
- j++) {
- bcp = (struct bau_control *)&per_cpu(bau_control, j);
- bcp->bau_msg_head = bau_tablesp->va_queue_first;
- bcp->va_queue_first = bau_tablesp->va_queue_first;
-
- bcp->va_queue_last = bau_tablesp->va_queue_last;
- bcp->watching = bau_tablesp->watching;
- bcp->msg_statuses = bau_tablesp->msg_statuses;
- bcp->descriptor_base = adp;
- }
- cur_cpu += uv_blade_nr_possible_cpus(i);