mad.c (140770B)
1// SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause 2/* 3 * Copyright(c) 2015-2018 Intel Corporation. 4 */ 5 6#include <linux/net.h> 7#include <rdma/opa_addr.h> 8#define OPA_NUM_PKEY_BLOCKS_PER_SMP (OPA_SMP_DR_DATA_SIZE \ 9 / (OPA_PARTITION_TABLE_BLK_SIZE * sizeof(u16))) 10 11#include "hfi.h" 12#include "mad.h" 13#include "trace.h" 14#include "qp.h" 15#include "vnic.h" 16 17/* the reset value from the FM is supposed to be 0xffff, handle both */ 18#define OPA_LINK_WIDTH_RESET_OLD 0x0fff 19#define OPA_LINK_WIDTH_RESET 0xffff 20 21struct trap_node { 22 struct list_head list; 23 struct opa_mad_notice_attr data; 24 __be64 tid; 25 int len; 26 u32 retry; 27 u8 in_use; 28 u8 repress; 29}; 30 31static int smp_length_check(u32 data_size, u32 request_len) 32{ 33 if (unlikely(request_len < data_size)) 34 return -EINVAL; 35 36 return 0; 37} 38 39static int reply(struct ib_mad_hdr *smp) 40{ 41 /* 42 * The verbs framework will handle the directed/LID route 43 * packet changes. 44 */ 45 smp->method = IB_MGMT_METHOD_GET_RESP; 46 if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) 47 smp->status |= IB_SMP_DIRECTION; 48 return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; 49} 50 51static inline void clear_opa_smp_data(struct opa_smp *smp) 52{ 53 void *data = opa_get_smp_data(smp); 54 size_t size = opa_get_smp_data_size(smp); 55 56 memset(data, 0, size); 57} 58 59static u16 hfi1_lookup_pkey_value(struct hfi1_ibport *ibp, int pkey_idx) 60{ 61 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 62 63 if (pkey_idx < ARRAY_SIZE(ppd->pkeys)) 64 return ppd->pkeys[pkey_idx]; 65 66 return 0; 67} 68 69void hfi1_event_pkey_change(struct hfi1_devdata *dd, u32 port) 70{ 71 struct ib_event event; 72 73 event.event = IB_EVENT_PKEY_CHANGE; 74 event.device = &dd->verbs_dev.rdi.ibdev; 75 event.element.port_num = port; 76 ib_dispatch_event(&event); 77} 78 79/* 80 * If the port is down, clean up all pending traps. We need to be careful 81 * with the given trap, because it may be queued. 82 */ 83static void cleanup_traps(struct hfi1_ibport *ibp, struct trap_node *trap) 84{ 85 struct trap_node *node, *q; 86 unsigned long flags; 87 struct list_head trap_list; 88 int i; 89 90 for (i = 0; i < RVT_MAX_TRAP_LISTS; i++) { 91 spin_lock_irqsave(&ibp->rvp.lock, flags); 92 list_replace_init(&ibp->rvp.trap_lists[i].list, &trap_list); 93 ibp->rvp.trap_lists[i].list_len = 0; 94 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 95 96 /* 97 * Remove all items from the list, freeing all the non-given 98 * traps. 99 */ 100 list_for_each_entry_safe(node, q, &trap_list, list) { 101 list_del(&node->list); 102 if (node != trap) 103 kfree(node); 104 } 105 } 106 107 /* 108 * If this wasn't on one of the lists it would not be freed. If it 109 * was on the list, it is now safe to free. 110 */ 111 kfree(trap); 112} 113 114static struct trap_node *check_and_add_trap(struct hfi1_ibport *ibp, 115 struct trap_node *trap) 116{ 117 struct trap_node *node; 118 struct trap_list *trap_list; 119 unsigned long flags; 120 unsigned long timeout; 121 int found = 0; 122 unsigned int queue_id; 123 static int trap_count; 124 125 queue_id = trap->data.generic_type & 0x0F; 126 if (queue_id >= RVT_MAX_TRAP_LISTS) { 127 trap_count++; 128 pr_err_ratelimited("hfi1: Invalid trap 0x%0x dropped. Total dropped: %d\n", 129 trap->data.generic_type, trap_count); 130 kfree(trap); 131 return NULL; 132 } 133 134 /* 135 * Since the retry (handle timeout) does not remove a trap request 136 * from the list, all we have to do is compare the node. 137 */ 138 spin_lock_irqsave(&ibp->rvp.lock, flags); 139 trap_list = &ibp->rvp.trap_lists[queue_id]; 140 141 list_for_each_entry(node, &trap_list->list, list) { 142 if (node == trap) { 143 node->retry++; 144 found = 1; 145 break; 146 } 147 } 148 149 /* If it is not on the list, add it, limited to RVT-MAX_TRAP_LEN. */ 150 if (!found) { 151 if (trap_list->list_len < RVT_MAX_TRAP_LEN) { 152 trap_list->list_len++; 153 list_add_tail(&trap->list, &trap_list->list); 154 } else { 155 pr_warn_ratelimited("hfi1: Maximum trap limit reached for 0x%0x traps\n", 156 trap->data.generic_type); 157 kfree(trap); 158 } 159 } 160 161 /* 162 * Next check to see if there is a timer pending. If not, set it up 163 * and get the first trap from the list. 164 */ 165 node = NULL; 166 if (!timer_pending(&ibp->rvp.trap_timer)) { 167 /* 168 * o14-2 169 * If the time out is set we have to wait until it expires 170 * before the trap can be sent. 171 * This should be > RVT_TRAP_TIMEOUT 172 */ 173 timeout = (RVT_TRAP_TIMEOUT * 174 (1UL << ibp->rvp.subnet_timeout)) / 1000; 175 mod_timer(&ibp->rvp.trap_timer, 176 jiffies + usecs_to_jiffies(timeout)); 177 node = list_first_entry(&trap_list->list, struct trap_node, 178 list); 179 node->in_use = 1; 180 } 181 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 182 183 return node; 184} 185 186static void subn_handle_opa_trap_repress(struct hfi1_ibport *ibp, 187 struct opa_smp *smp) 188{ 189 struct trap_list *trap_list; 190 struct trap_node *trap; 191 unsigned long flags; 192 int i; 193 194 if (smp->attr_id != IB_SMP_ATTR_NOTICE) 195 return; 196 197 spin_lock_irqsave(&ibp->rvp.lock, flags); 198 for (i = 0; i < RVT_MAX_TRAP_LISTS; i++) { 199 trap_list = &ibp->rvp.trap_lists[i]; 200 trap = list_first_entry_or_null(&trap_list->list, 201 struct trap_node, list); 202 if (trap && trap->tid == smp->tid) { 203 if (trap->in_use) { 204 trap->repress = 1; 205 } else { 206 trap_list->list_len--; 207 list_del(&trap->list); 208 kfree(trap); 209 } 210 break; 211 } 212 } 213 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 214} 215 216static void hfi1_update_sm_ah_attr(struct hfi1_ibport *ibp, 217 struct rdma_ah_attr *attr, u32 dlid) 218{ 219 rdma_ah_set_dlid(attr, dlid); 220 rdma_ah_set_port_num(attr, ppd_from_ibp(ibp)->port); 221 if (dlid >= be16_to_cpu(IB_MULTICAST_LID_BASE)) { 222 struct ib_global_route *grh = rdma_ah_retrieve_grh(attr); 223 224 rdma_ah_set_ah_flags(attr, IB_AH_GRH); 225 grh->sgid_index = 0; 226 grh->hop_limit = 1; 227 grh->dgid.global.subnet_prefix = 228 ibp->rvp.gid_prefix; 229 grh->dgid.global.interface_id = OPA_MAKE_ID(dlid); 230 } 231} 232 233static int hfi1_modify_qp0_ah(struct hfi1_ibport *ibp, 234 struct rvt_ah *ah, u32 dlid) 235{ 236 struct rdma_ah_attr attr; 237 struct rvt_qp *qp0; 238 int ret = -EINVAL; 239 240 memset(&attr, 0, sizeof(attr)); 241 attr.type = ah->ibah.type; 242 hfi1_update_sm_ah_attr(ibp, &attr, dlid); 243 rcu_read_lock(); 244 qp0 = rcu_dereference(ibp->rvp.qp[0]); 245 if (qp0) 246 ret = rdma_modify_ah(&ah->ibah, &attr); 247 rcu_read_unlock(); 248 return ret; 249} 250 251static struct ib_ah *hfi1_create_qp0_ah(struct hfi1_ibport *ibp, u32 dlid) 252{ 253 struct rdma_ah_attr attr; 254 struct ib_ah *ah = ERR_PTR(-EINVAL); 255 struct rvt_qp *qp0; 256 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 257 struct hfi1_devdata *dd = dd_from_ppd(ppd); 258 u32 port_num = ppd->port; 259 260 memset(&attr, 0, sizeof(attr)); 261 attr.type = rdma_ah_find_type(&dd->verbs_dev.rdi.ibdev, port_num); 262 hfi1_update_sm_ah_attr(ibp, &attr, dlid); 263 rcu_read_lock(); 264 qp0 = rcu_dereference(ibp->rvp.qp[0]); 265 if (qp0) 266 ah = rdma_create_ah(qp0->ibqp.pd, &attr, 0); 267 rcu_read_unlock(); 268 return ah; 269} 270 271static void send_trap(struct hfi1_ibport *ibp, struct trap_node *trap) 272{ 273 struct ib_mad_send_buf *send_buf; 274 struct ib_mad_agent *agent; 275 struct opa_smp *smp; 276 unsigned long flags; 277 int pkey_idx; 278 u32 qpn = ppd_from_ibp(ibp)->sm_trap_qp; 279 280 agent = ibp->rvp.send_agent; 281 if (!agent) { 282 cleanup_traps(ibp, trap); 283 return; 284 } 285 286 /* o14-3.2.1 */ 287 if (driver_lstate(ppd_from_ibp(ibp)) != IB_PORT_ACTIVE) { 288 cleanup_traps(ibp, trap); 289 return; 290 } 291 292 /* Add the trap to the list if necessary and see if we can send it */ 293 trap = check_and_add_trap(ibp, trap); 294 if (!trap) 295 return; 296 297 pkey_idx = hfi1_lookup_pkey_idx(ibp, LIM_MGMT_P_KEY); 298 if (pkey_idx < 0) { 299 pr_warn("%s: failed to find limited mgmt pkey, defaulting 0x%x\n", 300 __func__, hfi1_get_pkey(ibp, 1)); 301 pkey_idx = 1; 302 } 303 304 send_buf = ib_create_send_mad(agent, qpn, pkey_idx, 0, 305 IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA, 306 GFP_ATOMIC, IB_MGMT_BASE_VERSION); 307 if (IS_ERR(send_buf)) 308 return; 309 310 smp = send_buf->mad; 311 smp->base_version = OPA_MGMT_BASE_VERSION; 312 smp->mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED; 313 smp->class_version = OPA_SM_CLASS_VERSION; 314 smp->method = IB_MGMT_METHOD_TRAP; 315 316 /* Only update the transaction ID for new traps (o13-5). */ 317 if (trap->tid == 0) { 318 ibp->rvp.tid++; 319 /* make sure that tid != 0 */ 320 if (ibp->rvp.tid == 0) 321 ibp->rvp.tid++; 322 trap->tid = cpu_to_be64(ibp->rvp.tid); 323 } 324 smp->tid = trap->tid; 325 326 smp->attr_id = IB_SMP_ATTR_NOTICE; 327 /* o14-1: smp->mkey = 0; */ 328 329 memcpy(smp->route.lid.data, &trap->data, trap->len); 330 331 spin_lock_irqsave(&ibp->rvp.lock, flags); 332 if (!ibp->rvp.sm_ah) { 333 if (ibp->rvp.sm_lid != be16_to_cpu(IB_LID_PERMISSIVE)) { 334 struct ib_ah *ah; 335 336 ah = hfi1_create_qp0_ah(ibp, ibp->rvp.sm_lid); 337 if (IS_ERR(ah)) { 338 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 339 return; 340 } 341 send_buf->ah = ah; 342 ibp->rvp.sm_ah = ibah_to_rvtah(ah); 343 } else { 344 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 345 return; 346 } 347 } else { 348 send_buf->ah = &ibp->rvp.sm_ah->ibah; 349 } 350 351 /* 352 * If the trap was repressed while things were getting set up, don't 353 * bother sending it. This could happen for a retry. 354 */ 355 if (trap->repress) { 356 list_del(&trap->list); 357 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 358 kfree(trap); 359 ib_free_send_mad(send_buf); 360 return; 361 } 362 363 trap->in_use = 0; 364 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 365 366 if (ib_post_send_mad(send_buf, NULL)) 367 ib_free_send_mad(send_buf); 368} 369 370void hfi1_handle_trap_timer(struct timer_list *t) 371{ 372 struct hfi1_ibport *ibp = from_timer(ibp, t, rvp.trap_timer); 373 struct trap_node *trap = NULL; 374 unsigned long flags; 375 int i; 376 377 /* Find the trap with the highest priority */ 378 spin_lock_irqsave(&ibp->rvp.lock, flags); 379 for (i = 0; !trap && i < RVT_MAX_TRAP_LISTS; i++) { 380 trap = list_first_entry_or_null(&ibp->rvp.trap_lists[i].list, 381 struct trap_node, list); 382 } 383 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 384 385 if (trap) 386 send_trap(ibp, trap); 387} 388 389static struct trap_node *create_trap_node(u8 type, __be16 trap_num, u32 lid) 390{ 391 struct trap_node *trap; 392 393 trap = kzalloc(sizeof(*trap), GFP_ATOMIC); 394 if (!trap) 395 return NULL; 396 397 INIT_LIST_HEAD(&trap->list); 398 trap->data.generic_type = type; 399 trap->data.prod_type_lsb = IB_NOTICE_PROD_CA; 400 trap->data.trap_num = trap_num; 401 trap->data.issuer_lid = cpu_to_be32(lid); 402 403 return trap; 404} 405 406/* 407 * Send a bad P_Key trap (ch. 14.3.8). 408 */ 409void hfi1_bad_pkey(struct hfi1_ibport *ibp, u32 key, u32 sl, 410 u32 qp1, u32 qp2, u32 lid1, u32 lid2) 411{ 412 struct trap_node *trap; 413 u32 lid = ppd_from_ibp(ibp)->lid; 414 415 ibp->rvp.n_pkt_drops++; 416 ibp->rvp.pkey_violations++; 417 418 trap = create_trap_node(IB_NOTICE_TYPE_SECURITY, OPA_TRAP_BAD_P_KEY, 419 lid); 420 if (!trap) 421 return; 422 423 /* Send violation trap */ 424 trap->data.ntc_257_258.lid1 = cpu_to_be32(lid1); 425 trap->data.ntc_257_258.lid2 = cpu_to_be32(lid2); 426 trap->data.ntc_257_258.key = cpu_to_be32(key); 427 trap->data.ntc_257_258.sl = sl << 3; 428 trap->data.ntc_257_258.qp1 = cpu_to_be32(qp1); 429 trap->data.ntc_257_258.qp2 = cpu_to_be32(qp2); 430 431 trap->len = sizeof(trap->data); 432 send_trap(ibp, trap); 433} 434 435/* 436 * Send a bad M_Key trap (ch. 14.3.9). 437 */ 438static void bad_mkey(struct hfi1_ibport *ibp, struct ib_mad_hdr *mad, 439 __be64 mkey, __be32 dr_slid, u8 return_path[], u8 hop_cnt) 440{ 441 struct trap_node *trap; 442 u32 lid = ppd_from_ibp(ibp)->lid; 443 444 trap = create_trap_node(IB_NOTICE_TYPE_SECURITY, OPA_TRAP_BAD_M_KEY, 445 lid); 446 if (!trap) 447 return; 448 449 /* Send violation trap */ 450 trap->data.ntc_256.lid = trap->data.issuer_lid; 451 trap->data.ntc_256.method = mad->method; 452 trap->data.ntc_256.attr_id = mad->attr_id; 453 trap->data.ntc_256.attr_mod = mad->attr_mod; 454 trap->data.ntc_256.mkey = mkey; 455 if (mad->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { 456 trap->data.ntc_256.dr_slid = dr_slid; 457 trap->data.ntc_256.dr_trunc_hop = IB_NOTICE_TRAP_DR_NOTICE; 458 if (hop_cnt > ARRAY_SIZE(trap->data.ntc_256.dr_rtn_path)) { 459 trap->data.ntc_256.dr_trunc_hop |= 460 IB_NOTICE_TRAP_DR_TRUNC; 461 hop_cnt = ARRAY_SIZE(trap->data.ntc_256.dr_rtn_path); 462 } 463 trap->data.ntc_256.dr_trunc_hop |= hop_cnt; 464 memcpy(trap->data.ntc_256.dr_rtn_path, return_path, 465 hop_cnt); 466 } 467 468 trap->len = sizeof(trap->data); 469 470 send_trap(ibp, trap); 471} 472 473/* 474 * Send a Port Capability Mask Changed trap (ch. 14.3.11). 475 */ 476void hfi1_cap_mask_chg(struct rvt_dev_info *rdi, u32 port_num) 477{ 478 struct trap_node *trap; 479 struct hfi1_ibdev *verbs_dev = dev_from_rdi(rdi); 480 struct hfi1_devdata *dd = dd_from_dev(verbs_dev); 481 struct hfi1_ibport *ibp = &dd->pport[port_num - 1].ibport_data; 482 u32 lid = ppd_from_ibp(ibp)->lid; 483 484 trap = create_trap_node(IB_NOTICE_TYPE_INFO, 485 OPA_TRAP_CHANGE_CAPABILITY, 486 lid); 487 if (!trap) 488 return; 489 490 trap->data.ntc_144.lid = trap->data.issuer_lid; 491 trap->data.ntc_144.new_cap_mask = cpu_to_be32(ibp->rvp.port_cap_flags); 492 trap->data.ntc_144.cap_mask3 = cpu_to_be16(ibp->rvp.port_cap3_flags); 493 494 trap->len = sizeof(trap->data); 495 send_trap(ibp, trap); 496} 497 498/* 499 * Send a System Image GUID Changed trap (ch. 14.3.12). 500 */ 501void hfi1_sys_guid_chg(struct hfi1_ibport *ibp) 502{ 503 struct trap_node *trap; 504 u32 lid = ppd_from_ibp(ibp)->lid; 505 506 trap = create_trap_node(IB_NOTICE_TYPE_INFO, OPA_TRAP_CHANGE_SYSGUID, 507 lid); 508 if (!trap) 509 return; 510 511 trap->data.ntc_145.new_sys_guid = ib_hfi1_sys_image_guid; 512 trap->data.ntc_145.lid = trap->data.issuer_lid; 513 514 trap->len = sizeof(trap->data); 515 send_trap(ibp, trap); 516} 517 518/* 519 * Send a Node Description Changed trap (ch. 14.3.13). 520 */ 521void hfi1_node_desc_chg(struct hfi1_ibport *ibp) 522{ 523 struct trap_node *trap; 524 u32 lid = ppd_from_ibp(ibp)->lid; 525 526 trap = create_trap_node(IB_NOTICE_TYPE_INFO, 527 OPA_TRAP_CHANGE_CAPABILITY, 528 lid); 529 if (!trap) 530 return; 531 532 trap->data.ntc_144.lid = trap->data.issuer_lid; 533 trap->data.ntc_144.change_flags = 534 cpu_to_be16(OPA_NOTICE_TRAP_NODE_DESC_CHG); 535 536 trap->len = sizeof(trap->data); 537 send_trap(ibp, trap); 538} 539 540static int __subn_get_opa_nodedesc(struct opa_smp *smp, u32 am, 541 u8 *data, struct ib_device *ibdev, 542 u32 port, u32 *resp_len, u32 max_len) 543{ 544 struct opa_node_description *nd; 545 546 if (am || smp_length_check(sizeof(*nd), max_len)) { 547 smp->status |= IB_SMP_INVALID_FIELD; 548 return reply((struct ib_mad_hdr *)smp); 549 } 550 551 nd = (struct opa_node_description *)data; 552 553 memcpy(nd->data, ibdev->node_desc, sizeof(nd->data)); 554 555 if (resp_len) 556 *resp_len += sizeof(*nd); 557 558 return reply((struct ib_mad_hdr *)smp); 559} 560 561static int __subn_get_opa_nodeinfo(struct opa_smp *smp, u32 am, u8 *data, 562 struct ib_device *ibdev, u32 port, 563 u32 *resp_len, u32 max_len) 564{ 565 struct opa_node_info *ni; 566 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 567 u32 pidx = port - 1; /* IB number port from 1, hw from 0 */ 568 569 ni = (struct opa_node_info *)data; 570 571 /* GUID 0 is illegal */ 572 if (am || pidx >= dd->num_pports || ibdev->node_guid == 0 || 573 smp_length_check(sizeof(*ni), max_len) || 574 get_sguid(to_iport(ibdev, port), HFI1_PORT_GUID_INDEX) == 0) { 575 smp->status |= IB_SMP_INVALID_FIELD; 576 return reply((struct ib_mad_hdr *)smp); 577 } 578 579 ni->port_guid = get_sguid(to_iport(ibdev, port), HFI1_PORT_GUID_INDEX); 580 ni->base_version = OPA_MGMT_BASE_VERSION; 581 ni->class_version = OPA_SM_CLASS_VERSION; 582 ni->node_type = 1; /* channel adapter */ 583 ni->num_ports = ibdev->phys_port_cnt; 584 /* This is already in network order */ 585 ni->system_image_guid = ib_hfi1_sys_image_guid; 586 ni->node_guid = ibdev->node_guid; 587 ni->partition_cap = cpu_to_be16(hfi1_get_npkeys(dd)); 588 ni->device_id = cpu_to_be16(dd->pcidev->device); 589 ni->revision = cpu_to_be32(dd->minrev); 590 ni->local_port_num = port; 591 ni->vendor_id[0] = dd->oui1; 592 ni->vendor_id[1] = dd->oui2; 593 ni->vendor_id[2] = dd->oui3; 594 595 if (resp_len) 596 *resp_len += sizeof(*ni); 597 598 return reply((struct ib_mad_hdr *)smp); 599} 600 601static int subn_get_nodeinfo(struct ib_smp *smp, struct ib_device *ibdev, 602 u32 port) 603{ 604 struct ib_node_info *nip = (struct ib_node_info *)&smp->data; 605 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 606 u32 pidx = port - 1; /* IB number port from 1, hw from 0 */ 607 608 /* GUID 0 is illegal */ 609 if (smp->attr_mod || pidx >= dd->num_pports || 610 ibdev->node_guid == 0 || 611 get_sguid(to_iport(ibdev, port), HFI1_PORT_GUID_INDEX) == 0) { 612 smp->status |= IB_SMP_INVALID_FIELD; 613 return reply((struct ib_mad_hdr *)smp); 614 } 615 616 nip->port_guid = get_sguid(to_iport(ibdev, port), HFI1_PORT_GUID_INDEX); 617 nip->base_version = OPA_MGMT_BASE_VERSION; 618 nip->class_version = OPA_SM_CLASS_VERSION; 619 nip->node_type = 1; /* channel adapter */ 620 nip->num_ports = ibdev->phys_port_cnt; 621 /* This is already in network order */ 622 nip->sys_guid = ib_hfi1_sys_image_guid; 623 nip->node_guid = ibdev->node_guid; 624 nip->partition_cap = cpu_to_be16(hfi1_get_npkeys(dd)); 625 nip->device_id = cpu_to_be16(dd->pcidev->device); 626 nip->revision = cpu_to_be32(dd->minrev); 627 nip->local_port_num = port; 628 nip->vendor_id[0] = dd->oui1; 629 nip->vendor_id[1] = dd->oui2; 630 nip->vendor_id[2] = dd->oui3; 631 632 return reply((struct ib_mad_hdr *)smp); 633} 634 635static void set_link_width_enabled(struct hfi1_pportdata *ppd, u32 w) 636{ 637 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_LWID_ENB, w); 638} 639 640static void set_link_width_downgrade_enabled(struct hfi1_pportdata *ppd, u32 w) 641{ 642 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_LWID_DG_ENB, w); 643} 644 645static void set_link_speed_enabled(struct hfi1_pportdata *ppd, u32 s) 646{ 647 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_SPD_ENB, s); 648} 649 650static int check_mkey(struct hfi1_ibport *ibp, struct ib_mad_hdr *mad, 651 int mad_flags, __be64 mkey, __be32 dr_slid, 652 u8 return_path[], u8 hop_cnt) 653{ 654 int valid_mkey = 0; 655 int ret = 0; 656 657 /* Is the mkey in the process of expiring? */ 658 if (ibp->rvp.mkey_lease_timeout && 659 time_after_eq(jiffies, ibp->rvp.mkey_lease_timeout)) { 660 /* Clear timeout and mkey protection field. */ 661 ibp->rvp.mkey_lease_timeout = 0; 662 ibp->rvp.mkeyprot = 0; 663 } 664 665 if ((mad_flags & IB_MAD_IGNORE_MKEY) || ibp->rvp.mkey == 0 || 666 ibp->rvp.mkey == mkey) 667 valid_mkey = 1; 668 669 /* Unset lease timeout on any valid Get/Set/TrapRepress */ 670 if (valid_mkey && ibp->rvp.mkey_lease_timeout && 671 (mad->method == IB_MGMT_METHOD_GET || 672 mad->method == IB_MGMT_METHOD_SET || 673 mad->method == IB_MGMT_METHOD_TRAP_REPRESS)) 674 ibp->rvp.mkey_lease_timeout = 0; 675 676 if (!valid_mkey) { 677 switch (mad->method) { 678 case IB_MGMT_METHOD_GET: 679 /* Bad mkey not a violation below level 2 */ 680 if (ibp->rvp.mkeyprot < 2) 681 break; 682 fallthrough; 683 case IB_MGMT_METHOD_SET: 684 case IB_MGMT_METHOD_TRAP_REPRESS: 685 if (ibp->rvp.mkey_violations != 0xFFFF) 686 ++ibp->rvp.mkey_violations; 687 if (!ibp->rvp.mkey_lease_timeout && 688 ibp->rvp.mkey_lease_period) 689 ibp->rvp.mkey_lease_timeout = jiffies + 690 ibp->rvp.mkey_lease_period * HZ; 691 /* Generate a trap notice. */ 692 bad_mkey(ibp, mad, mkey, dr_slid, return_path, 693 hop_cnt); 694 ret = 1; 695 } 696 } 697 698 return ret; 699} 700 701/* 702 * The SMA caches reads from LCB registers in case the LCB is unavailable. 703 * (The LCB is unavailable in certain link states, for example.) 704 */ 705struct lcb_datum { 706 u32 off; 707 u64 val; 708}; 709 710static struct lcb_datum lcb_cache[] = { 711 { DC_LCB_STS_ROUND_TRIP_LTP_CNT, 0 }, 712}; 713 714static int write_lcb_cache(u32 off, u64 val) 715{ 716 int i; 717 718 for (i = 0; i < ARRAY_SIZE(lcb_cache); i++) { 719 if (lcb_cache[i].off == off) { 720 lcb_cache[i].val = val; 721 return 0; 722 } 723 } 724 725 pr_warn("%s bad offset 0x%x\n", __func__, off); 726 return -1; 727} 728 729static int read_lcb_cache(u32 off, u64 *val) 730{ 731 int i; 732 733 for (i = 0; i < ARRAY_SIZE(lcb_cache); i++) { 734 if (lcb_cache[i].off == off) { 735 *val = lcb_cache[i].val; 736 return 0; 737 } 738 } 739 740 pr_warn("%s bad offset 0x%x\n", __func__, off); 741 return -1; 742} 743 744void read_ltp_rtt(struct hfi1_devdata *dd) 745{ 746 u64 reg; 747 748 if (read_lcb_csr(dd, DC_LCB_STS_ROUND_TRIP_LTP_CNT, ®)) 749 dd_dev_err(dd, "%s: unable to read LTP RTT\n", __func__); 750 else 751 write_lcb_cache(DC_LCB_STS_ROUND_TRIP_LTP_CNT, reg); 752} 753 754static int __subn_get_opa_portinfo(struct opa_smp *smp, u32 am, u8 *data, 755 struct ib_device *ibdev, u32 port, 756 u32 *resp_len, u32 max_len) 757{ 758 int i; 759 struct hfi1_devdata *dd; 760 struct hfi1_pportdata *ppd; 761 struct hfi1_ibport *ibp; 762 struct opa_port_info *pi = (struct opa_port_info *)data; 763 u8 mtu; 764 u8 credit_rate; 765 u8 is_beaconing_active; 766 u32 state; 767 u32 num_ports = OPA_AM_NPORT(am); 768 u32 start_of_sm_config = OPA_AM_START_SM_CFG(am); 769 u32 buffer_units; 770 u64 tmp = 0; 771 772 if (num_ports != 1 || smp_length_check(sizeof(*pi), max_len)) { 773 smp->status |= IB_SMP_INVALID_FIELD; 774 return reply((struct ib_mad_hdr *)smp); 775 } 776 777 dd = dd_from_ibdev(ibdev); 778 /* IB numbers ports from 1, hw from 0 */ 779 ppd = dd->pport + (port - 1); 780 ibp = &ppd->ibport_data; 781 782 if (ppd->vls_supported / 2 > ARRAY_SIZE(pi->neigh_mtu.pvlx_to_mtu) || 783 ppd->vls_supported > ARRAY_SIZE(dd->vld)) { 784 smp->status |= IB_SMP_INVALID_FIELD; 785 return reply((struct ib_mad_hdr *)smp); 786 } 787 788 pi->lid = cpu_to_be32(ppd->lid); 789 790 /* Only return the mkey if the protection field allows it. */ 791 if (!(smp->method == IB_MGMT_METHOD_GET && 792 ibp->rvp.mkey != smp->mkey && 793 ibp->rvp.mkeyprot == 1)) 794 pi->mkey = ibp->rvp.mkey; 795 796 pi->subnet_prefix = ibp->rvp.gid_prefix; 797 pi->sm_lid = cpu_to_be32(ibp->rvp.sm_lid); 798 pi->ib_cap_mask = cpu_to_be32(ibp->rvp.port_cap_flags); 799 pi->mkey_lease_period = cpu_to_be16(ibp->rvp.mkey_lease_period); 800 pi->sm_trap_qp = cpu_to_be32(ppd->sm_trap_qp); 801 pi->sa_qp = cpu_to_be32(ppd->sa_qp); 802 803 pi->link_width.enabled = cpu_to_be16(ppd->link_width_enabled); 804 pi->link_width.supported = cpu_to_be16(ppd->link_width_supported); 805 pi->link_width.active = cpu_to_be16(ppd->link_width_active); 806 807 pi->link_width_downgrade.supported = 808 cpu_to_be16(ppd->link_width_downgrade_supported); 809 pi->link_width_downgrade.enabled = 810 cpu_to_be16(ppd->link_width_downgrade_enabled); 811 pi->link_width_downgrade.tx_active = 812 cpu_to_be16(ppd->link_width_downgrade_tx_active); 813 pi->link_width_downgrade.rx_active = 814 cpu_to_be16(ppd->link_width_downgrade_rx_active); 815 816 pi->link_speed.supported = cpu_to_be16(ppd->link_speed_supported); 817 pi->link_speed.active = cpu_to_be16(ppd->link_speed_active); 818 pi->link_speed.enabled = cpu_to_be16(ppd->link_speed_enabled); 819 820 state = driver_lstate(ppd); 821 822 if (start_of_sm_config && (state == IB_PORT_INIT)) 823 ppd->is_sm_config_started = 1; 824 825 pi->port_phys_conf = (ppd->port_type & 0xf); 826 827 pi->port_states.ledenable_offlinereason = ppd->neighbor_normal << 4; 828 pi->port_states.ledenable_offlinereason |= 829 ppd->is_sm_config_started << 5; 830 /* 831 * This pairs with the memory barrier in hfi1_start_led_override to 832 * ensure that we read the correct state of LED beaconing represented 833 * by led_override_timer_active 834 */ 835 smp_rmb(); 836 is_beaconing_active = !!atomic_read(&ppd->led_override_timer_active); 837 pi->port_states.ledenable_offlinereason |= is_beaconing_active << 6; 838 pi->port_states.ledenable_offlinereason |= 839 ppd->offline_disabled_reason; 840 841 pi->port_states.portphysstate_portstate = 842 (driver_pstate(ppd) << 4) | state; 843 844 pi->mkeyprotect_lmc = (ibp->rvp.mkeyprot << 6) | ppd->lmc; 845 846 memset(pi->neigh_mtu.pvlx_to_mtu, 0, sizeof(pi->neigh_mtu.pvlx_to_mtu)); 847 for (i = 0; i < ppd->vls_supported; i++) { 848 mtu = mtu_to_enum(dd->vld[i].mtu, HFI1_DEFAULT_ACTIVE_MTU); 849 if ((i % 2) == 0) 850 pi->neigh_mtu.pvlx_to_mtu[i / 2] |= (mtu << 4); 851 else 852 pi->neigh_mtu.pvlx_to_mtu[i / 2] |= mtu; 853 } 854 /* don't forget VL 15 */ 855 mtu = mtu_to_enum(dd->vld[15].mtu, 2048); 856 pi->neigh_mtu.pvlx_to_mtu[15 / 2] |= mtu; 857 pi->smsl = ibp->rvp.sm_sl & OPA_PI_MASK_SMSL; 858 pi->operational_vls = hfi1_get_ib_cfg(ppd, HFI1_IB_CFG_OP_VLS); 859 pi->partenforce_filterraw |= 860 (ppd->linkinit_reason & OPA_PI_MASK_LINKINIT_REASON); 861 if (ppd->part_enforce & HFI1_PART_ENFORCE_IN) 862 pi->partenforce_filterraw |= OPA_PI_MASK_PARTITION_ENFORCE_IN; 863 if (ppd->part_enforce & HFI1_PART_ENFORCE_OUT) 864 pi->partenforce_filterraw |= OPA_PI_MASK_PARTITION_ENFORCE_OUT; 865 pi->mkey_violations = cpu_to_be16(ibp->rvp.mkey_violations); 866 /* P_KeyViolations are counted by hardware. */ 867 pi->pkey_violations = cpu_to_be16(ibp->rvp.pkey_violations); 868 pi->qkey_violations = cpu_to_be16(ibp->rvp.qkey_violations); 869 870 pi->vl.cap = ppd->vls_supported; 871 pi->vl.high_limit = cpu_to_be16(ibp->rvp.vl_high_limit); 872 pi->vl.arb_high_cap = (u8)hfi1_get_ib_cfg(ppd, HFI1_IB_CFG_VL_HIGH_CAP); 873 pi->vl.arb_low_cap = (u8)hfi1_get_ib_cfg(ppd, HFI1_IB_CFG_VL_LOW_CAP); 874 875 pi->clientrereg_subnettimeout = ibp->rvp.subnet_timeout; 876 877 pi->port_link_mode = cpu_to_be16(OPA_PORT_LINK_MODE_OPA << 10 | 878 OPA_PORT_LINK_MODE_OPA << 5 | 879 OPA_PORT_LINK_MODE_OPA); 880 881 pi->port_ltp_crc_mode = cpu_to_be16(ppd->port_ltp_crc_mode); 882 883 pi->port_mode = cpu_to_be16( 884 ppd->is_active_optimize_enabled ? 885 OPA_PI_MASK_PORT_ACTIVE_OPTOMIZE : 0); 886 887 pi->port_packet_format.supported = 888 cpu_to_be16(OPA_PORT_PACKET_FORMAT_9B | 889 OPA_PORT_PACKET_FORMAT_16B); 890 pi->port_packet_format.enabled = 891 cpu_to_be16(OPA_PORT_PACKET_FORMAT_9B | 892 OPA_PORT_PACKET_FORMAT_16B); 893 894 /* flit_control.interleave is (OPA V1, version .76): 895 * bits use 896 * ---- --- 897 * 2 res 898 * 2 DistanceSupported 899 * 2 DistanceEnabled 900 * 5 MaxNextLevelTxEnabled 901 * 5 MaxNestLevelRxSupported 902 * 903 * HFI supports only "distance mode 1" (see OPA V1, version .76, 904 * section 9.6.2), so set DistanceSupported, DistanceEnabled 905 * to 0x1. 906 */ 907 pi->flit_control.interleave = cpu_to_be16(0x1400); 908 909 pi->link_down_reason = ppd->local_link_down_reason.sma; 910 pi->neigh_link_down_reason = ppd->neigh_link_down_reason.sma; 911 pi->port_error_action = cpu_to_be32(ppd->port_error_action); 912 pi->mtucap = mtu_to_enum(hfi1_max_mtu, IB_MTU_4096); 913 914 /* 32.768 usec. response time (guessing) */ 915 pi->resptimevalue = 3; 916 917 pi->local_port_num = port; 918 919 /* buffer info for FM */ 920 pi->overall_buffer_space = cpu_to_be16(dd->link_credits); 921 922 pi->neigh_node_guid = cpu_to_be64(ppd->neighbor_guid); 923 pi->neigh_port_num = ppd->neighbor_port_number; 924 pi->port_neigh_mode = 925 (ppd->neighbor_type & OPA_PI_MASK_NEIGH_NODE_TYPE) | 926 (ppd->mgmt_allowed ? OPA_PI_MASK_NEIGH_MGMT_ALLOWED : 0) | 927 (ppd->neighbor_fm_security ? 928 OPA_PI_MASK_NEIGH_FW_AUTH_BYPASS : 0); 929 930 /* HFIs shall always return VL15 credits to their 931 * neighbor in a timely manner, without any credit return pacing. 932 */ 933 credit_rate = 0; 934 buffer_units = (dd->vau) & OPA_PI_MASK_BUF_UNIT_BUF_ALLOC; 935 buffer_units |= (dd->vcu << 3) & OPA_PI_MASK_BUF_UNIT_CREDIT_ACK; 936 buffer_units |= (credit_rate << 6) & 937 OPA_PI_MASK_BUF_UNIT_VL15_CREDIT_RATE; 938 buffer_units |= (dd->vl15_init << 11) & OPA_PI_MASK_BUF_UNIT_VL15_INIT; 939 pi->buffer_units = cpu_to_be32(buffer_units); 940 941 pi->opa_cap_mask = cpu_to_be16(ibp->rvp.port_cap3_flags); 942 pi->collectivemask_multicastmask = ((OPA_COLLECTIVE_NR & 0x7) 943 << 3 | (OPA_MCAST_NR & 0x7)); 944 945 /* HFI supports a replay buffer 128 LTPs in size */ 946 pi->replay_depth.buffer = 0x80; 947 /* read the cached value of DC_LCB_STS_ROUND_TRIP_LTP_CNT */ 948 read_lcb_cache(DC_LCB_STS_ROUND_TRIP_LTP_CNT, &tmp); 949 950 /* 951 * this counter is 16 bits wide, but the replay_depth.wire 952 * variable is only 8 bits 953 */ 954 if (tmp > 0xff) 955 tmp = 0xff; 956 pi->replay_depth.wire = tmp; 957 958 if (resp_len) 959 *resp_len += sizeof(struct opa_port_info); 960 961 return reply((struct ib_mad_hdr *)smp); 962} 963 964/** 965 * get_pkeys - return the PKEY table 966 * @dd: the hfi1_ib device 967 * @port: the IB port number 968 * @pkeys: the pkey table is placed here 969 */ 970static int get_pkeys(struct hfi1_devdata *dd, u32 port, u16 *pkeys) 971{ 972 struct hfi1_pportdata *ppd = dd->pport + port - 1; 973 974 memcpy(pkeys, ppd->pkeys, sizeof(ppd->pkeys)); 975 976 return 0; 977} 978 979static int __subn_get_opa_pkeytable(struct opa_smp *smp, u32 am, u8 *data, 980 struct ib_device *ibdev, u32 port, 981 u32 *resp_len, u32 max_len) 982{ 983 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 984 u32 n_blocks_req = OPA_AM_NBLK(am); 985 u32 start_block = am & 0x7ff; 986 __be16 *p; 987 u16 *q; 988 int i; 989 u16 n_blocks_avail; 990 unsigned npkeys = hfi1_get_npkeys(dd); 991 size_t size; 992 993 if (n_blocks_req == 0) { 994 pr_warn("OPA Get PKey AM Invalid : P = %d; B = 0x%x; N = 0x%x\n", 995 port, start_block, n_blocks_req); 996 smp->status |= IB_SMP_INVALID_FIELD; 997 return reply((struct ib_mad_hdr *)smp); 998 } 999 1000 n_blocks_avail = (u16)(npkeys / OPA_PARTITION_TABLE_BLK_SIZE) + 1; 1001 1002 size = (n_blocks_req * OPA_PARTITION_TABLE_BLK_SIZE) * sizeof(u16); 1003 1004 if (smp_length_check(size, max_len)) { 1005 smp->status |= IB_SMP_INVALID_FIELD; 1006 return reply((struct ib_mad_hdr *)smp); 1007 } 1008 1009 if (start_block + n_blocks_req > n_blocks_avail || 1010 n_blocks_req > OPA_NUM_PKEY_BLOCKS_PER_SMP) { 1011 pr_warn("OPA Get PKey AM Invalid : s 0x%x; req 0x%x; " 1012 "avail 0x%x; blk/smp 0x%lx\n", 1013 start_block, n_blocks_req, n_blocks_avail, 1014 OPA_NUM_PKEY_BLOCKS_PER_SMP); 1015 smp->status |= IB_SMP_INVALID_FIELD; 1016 return reply((struct ib_mad_hdr *)smp); 1017 } 1018 1019 p = (__be16 *)data; 1020 q = (u16 *)data; 1021 /* get the real pkeys if we are requesting the first block */ 1022 if (start_block == 0) { 1023 get_pkeys(dd, port, q); 1024 for (i = 0; i < npkeys; i++) 1025 p[i] = cpu_to_be16(q[i]); 1026 if (resp_len) 1027 *resp_len += size; 1028 } else { 1029 smp->status |= IB_SMP_INVALID_FIELD; 1030 } 1031 return reply((struct ib_mad_hdr *)smp); 1032} 1033 1034enum { 1035 HFI_TRANSITION_DISALLOWED, 1036 HFI_TRANSITION_IGNORED, 1037 HFI_TRANSITION_ALLOWED, 1038 HFI_TRANSITION_UNDEFINED, 1039}; 1040 1041/* 1042 * Use shortened names to improve readability of 1043 * {logical,physical}_state_transitions 1044 */ 1045enum { 1046 __D = HFI_TRANSITION_DISALLOWED, 1047 __I = HFI_TRANSITION_IGNORED, 1048 __A = HFI_TRANSITION_ALLOWED, 1049 __U = HFI_TRANSITION_UNDEFINED, 1050}; 1051 1052/* 1053 * IB_PORTPHYSSTATE_POLLING (2) through OPA_PORTPHYSSTATE_MAX (11) are 1054 * represented in physical_state_transitions. 1055 */ 1056#define __N_PHYSTATES (OPA_PORTPHYSSTATE_MAX - IB_PORTPHYSSTATE_POLLING + 1) 1057 1058/* 1059 * Within physical_state_transitions, rows represent "old" states, 1060 * columns "new" states, and physical_state_transitions.allowed[old][new] 1061 * indicates if the transition from old state to new state is legal (see 1062 * OPAg1v1, Table 6-4). 1063 */ 1064static const struct { 1065 u8 allowed[__N_PHYSTATES][__N_PHYSTATES]; 1066} physical_state_transitions = { 1067 { 1068 /* 2 3 4 5 6 7 8 9 10 11 */ 1069 /* 2 */ { __A, __A, __D, __D, __D, __D, __D, __D, __D, __D }, 1070 /* 3 */ { __A, __I, __D, __D, __D, __D, __D, __D, __D, __A }, 1071 /* 4 */ { __U, __U, __U, __U, __U, __U, __U, __U, __U, __U }, 1072 /* 5 */ { __A, __A, __D, __I, __D, __D, __D, __D, __D, __D }, 1073 /* 6 */ { __U, __U, __U, __U, __U, __U, __U, __U, __U, __U }, 1074 /* 7 */ { __D, __A, __D, __D, __D, __I, __D, __D, __D, __D }, 1075 /* 8 */ { __U, __U, __U, __U, __U, __U, __U, __U, __U, __U }, 1076 /* 9 */ { __I, __A, __D, __D, __D, __D, __D, __I, __D, __D }, 1077 /*10 */ { __U, __U, __U, __U, __U, __U, __U, __U, __U, __U }, 1078 /*11 */ { __D, __A, __D, __D, __D, __D, __D, __D, __D, __I }, 1079 } 1080}; 1081 1082/* 1083 * IB_PORT_DOWN (1) through IB_PORT_ACTIVE_DEFER (5) are represented 1084 * logical_state_transitions 1085 */ 1086 1087#define __N_LOGICAL_STATES (IB_PORT_ACTIVE_DEFER - IB_PORT_DOWN + 1) 1088 1089/* 1090 * Within logical_state_transitions rows represent "old" states, 1091 * columns "new" states, and logical_state_transitions.allowed[old][new] 1092 * indicates if the transition from old state to new state is legal (see 1093 * OPAg1v1, Table 9-12). 1094 */ 1095static const struct { 1096 u8 allowed[__N_LOGICAL_STATES][__N_LOGICAL_STATES]; 1097} logical_state_transitions = { 1098 { 1099 /* 1 2 3 4 5 */ 1100 /* 1 */ { __I, __D, __D, __D, __U}, 1101 /* 2 */ { __D, __I, __A, __D, __U}, 1102 /* 3 */ { __D, __D, __I, __A, __U}, 1103 /* 4 */ { __D, __D, __I, __I, __U}, 1104 /* 5 */ { __U, __U, __U, __U, __U}, 1105 } 1106}; 1107 1108static int logical_transition_allowed(int old, int new) 1109{ 1110 if (old < IB_PORT_NOP || old > IB_PORT_ACTIVE_DEFER || 1111 new < IB_PORT_NOP || new > IB_PORT_ACTIVE_DEFER) { 1112 pr_warn("invalid logical state(s) (old %d new %d)\n", 1113 old, new); 1114 return HFI_TRANSITION_UNDEFINED; 1115 } 1116 1117 if (new == IB_PORT_NOP) 1118 return HFI_TRANSITION_ALLOWED; /* always allowed */ 1119 1120 /* adjust states for indexing into logical_state_transitions */ 1121 old -= IB_PORT_DOWN; 1122 new -= IB_PORT_DOWN; 1123 1124 if (old < 0 || new < 0) 1125 return HFI_TRANSITION_UNDEFINED; 1126 return logical_state_transitions.allowed[old][new]; 1127} 1128 1129static int physical_transition_allowed(int old, int new) 1130{ 1131 if (old < IB_PORTPHYSSTATE_NOP || old > OPA_PORTPHYSSTATE_MAX || 1132 new < IB_PORTPHYSSTATE_NOP || new > OPA_PORTPHYSSTATE_MAX) { 1133 pr_warn("invalid physical state(s) (old %d new %d)\n", 1134 old, new); 1135 return HFI_TRANSITION_UNDEFINED; 1136 } 1137 1138 if (new == IB_PORTPHYSSTATE_NOP) 1139 return HFI_TRANSITION_ALLOWED; /* always allowed */ 1140 1141 /* adjust states for indexing into physical_state_transitions */ 1142 old -= IB_PORTPHYSSTATE_POLLING; 1143 new -= IB_PORTPHYSSTATE_POLLING; 1144 1145 if (old < 0 || new < 0) 1146 return HFI_TRANSITION_UNDEFINED; 1147 return physical_state_transitions.allowed[old][new]; 1148} 1149 1150static int port_states_transition_allowed(struct hfi1_pportdata *ppd, 1151 u32 logical_new, u32 physical_new) 1152{ 1153 u32 physical_old = driver_pstate(ppd); 1154 u32 logical_old = driver_lstate(ppd); 1155 int ret, logical_allowed, physical_allowed; 1156 1157 ret = logical_transition_allowed(logical_old, logical_new); 1158 logical_allowed = ret; 1159 1160 if (ret == HFI_TRANSITION_DISALLOWED || 1161 ret == HFI_TRANSITION_UNDEFINED) { 1162 pr_warn("invalid logical state transition %s -> %s\n", 1163 opa_lstate_name(logical_old), 1164 opa_lstate_name(logical_new)); 1165 return ret; 1166 } 1167 1168 ret = physical_transition_allowed(physical_old, physical_new); 1169 physical_allowed = ret; 1170 1171 if (ret == HFI_TRANSITION_DISALLOWED || 1172 ret == HFI_TRANSITION_UNDEFINED) { 1173 pr_warn("invalid physical state transition %s -> %s\n", 1174 opa_pstate_name(physical_old), 1175 opa_pstate_name(physical_new)); 1176 return ret; 1177 } 1178 1179 if (logical_allowed == HFI_TRANSITION_IGNORED && 1180 physical_allowed == HFI_TRANSITION_IGNORED) 1181 return HFI_TRANSITION_IGNORED; 1182 1183 /* 1184 * A change request of Physical Port State from 1185 * 'Offline' to 'Polling' should be ignored. 1186 */ 1187 if ((physical_old == OPA_PORTPHYSSTATE_OFFLINE) && 1188 (physical_new == IB_PORTPHYSSTATE_POLLING)) 1189 return HFI_TRANSITION_IGNORED; 1190 1191 /* 1192 * Either physical_allowed or logical_allowed is 1193 * HFI_TRANSITION_ALLOWED. 1194 */ 1195 return HFI_TRANSITION_ALLOWED; 1196} 1197 1198static int set_port_states(struct hfi1_pportdata *ppd, struct opa_smp *smp, 1199 u32 logical_state, u32 phys_state, int local_mad) 1200{ 1201 struct hfi1_devdata *dd = ppd->dd; 1202 u32 link_state; 1203 int ret; 1204 1205 ret = port_states_transition_allowed(ppd, logical_state, phys_state); 1206 if (ret == HFI_TRANSITION_DISALLOWED || 1207 ret == HFI_TRANSITION_UNDEFINED) { 1208 /* error message emitted above */ 1209 smp->status |= IB_SMP_INVALID_FIELD; 1210 return 0; 1211 } 1212 1213 if (ret == HFI_TRANSITION_IGNORED) 1214 return 0; 1215 1216 if ((phys_state != IB_PORTPHYSSTATE_NOP) && 1217 !(logical_state == IB_PORT_DOWN || 1218 logical_state == IB_PORT_NOP)){ 1219 pr_warn("SubnSet(OPA_PortInfo) port state invalid: logical_state 0x%x physical_state 0x%x\n", 1220 logical_state, phys_state); 1221 smp->status |= IB_SMP_INVALID_FIELD; 1222 } 1223 1224 /* 1225 * Logical state changes are summarized in OPAv1g1 spec., 1226 * Table 9-12; physical state changes are summarized in 1227 * OPAv1g1 spec., Table 6.4. 1228 */ 1229 switch (logical_state) { 1230 case IB_PORT_NOP: 1231 if (phys_state == IB_PORTPHYSSTATE_NOP) 1232 break; 1233 fallthrough; 1234 case IB_PORT_DOWN: 1235 if (phys_state == IB_PORTPHYSSTATE_NOP) { 1236 link_state = HLS_DN_DOWNDEF; 1237 } else if (phys_state == IB_PORTPHYSSTATE_POLLING) { 1238 link_state = HLS_DN_POLL; 1239 set_link_down_reason(ppd, OPA_LINKDOWN_REASON_FM_BOUNCE, 1240 0, OPA_LINKDOWN_REASON_FM_BOUNCE); 1241 } else if (phys_state == IB_PORTPHYSSTATE_DISABLED) { 1242 link_state = HLS_DN_DISABLE; 1243 } else { 1244 pr_warn("SubnSet(OPA_PortInfo) invalid physical state 0x%x\n", 1245 phys_state); 1246 smp->status |= IB_SMP_INVALID_FIELD; 1247 break; 1248 } 1249 1250 if ((link_state == HLS_DN_POLL || 1251 link_state == HLS_DN_DOWNDEF)) { 1252 /* 1253 * Going to poll. No matter what the current state, 1254 * always move offline first, then tune and start the 1255 * link. This correctly handles a FM link bounce and 1256 * a link enable. Going offline is a no-op if already 1257 * offline. 1258 */ 1259 set_link_state(ppd, HLS_DN_OFFLINE); 1260 start_link(ppd); 1261 } else { 1262 set_link_state(ppd, link_state); 1263 } 1264 if (link_state == HLS_DN_DISABLE && 1265 (ppd->offline_disabled_reason > 1266 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_SMA_DISABLED) || 1267 ppd->offline_disabled_reason == 1268 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE))) 1269 ppd->offline_disabled_reason = 1270 HFI1_ODR_MASK(OPA_LINKDOWN_REASON_SMA_DISABLED); 1271 /* 1272 * Don't send a reply if the response would be sent 1273 * through the disabled port. 1274 */ 1275 if (link_state == HLS_DN_DISABLE && !local_mad) 1276 return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED; 1277 break; 1278 case IB_PORT_ARMED: 1279 ret = set_link_state(ppd, HLS_UP_ARMED); 1280 if (!ret) 1281 send_idle_sma(dd, SMA_IDLE_ARM); 1282 break; 1283 case IB_PORT_ACTIVE: 1284 if (ppd->neighbor_normal) { 1285 ret = set_link_state(ppd, HLS_UP_ACTIVE); 1286 if (ret == 0) 1287 send_idle_sma(dd, SMA_IDLE_ACTIVE); 1288 } else { 1289 pr_warn("SubnSet(OPA_PortInfo) Cannot move to Active with NeighborNormal 0\n"); 1290 smp->status |= IB_SMP_INVALID_FIELD; 1291 } 1292 break; 1293 default: 1294 pr_warn("SubnSet(OPA_PortInfo) invalid logical state 0x%x\n", 1295 logical_state); 1296 smp->status |= IB_SMP_INVALID_FIELD; 1297 } 1298 1299 return 0; 1300} 1301 1302/* 1303 * subn_set_opa_portinfo - set port information 1304 * @smp: the incoming SM packet 1305 * @ibdev: the infiniband device 1306 * @port: the port on the device 1307 * 1308 */ 1309static int __subn_set_opa_portinfo(struct opa_smp *smp, u32 am, u8 *data, 1310 struct ib_device *ibdev, u32 port, 1311 u32 *resp_len, u32 max_len, int local_mad) 1312{ 1313 struct opa_port_info *pi = (struct opa_port_info *)data; 1314 struct ib_event event; 1315 struct hfi1_devdata *dd; 1316 struct hfi1_pportdata *ppd; 1317 struct hfi1_ibport *ibp; 1318 u8 clientrereg; 1319 unsigned long flags; 1320 u32 smlid; 1321 u32 lid; 1322 u8 ls_old, ls_new, ps_new; 1323 u8 vls; 1324 u8 msl; 1325 u8 crc_enabled; 1326 u16 lse, lwe, mtu; 1327 u32 num_ports = OPA_AM_NPORT(am); 1328 u32 start_of_sm_config = OPA_AM_START_SM_CFG(am); 1329 int ret, i, invalid = 0, call_set_mtu = 0; 1330 int call_link_downgrade_policy = 0; 1331 1332 if (num_ports != 1 || 1333 smp_length_check(sizeof(*pi), max_len)) { 1334 smp->status |= IB_SMP_INVALID_FIELD; 1335 return reply((struct ib_mad_hdr *)smp); 1336 } 1337 1338 lid = be32_to_cpu(pi->lid); 1339 if (lid & 0xFF000000) { 1340 pr_warn("OPA_PortInfo lid out of range: %X\n", lid); 1341 smp->status |= IB_SMP_INVALID_FIELD; 1342 goto get_only; 1343 } 1344 1345 1346 smlid = be32_to_cpu(pi->sm_lid); 1347 if (smlid & 0xFF000000) { 1348 pr_warn("OPA_PortInfo SM lid out of range: %X\n", smlid); 1349 smp->status |= IB_SMP_INVALID_FIELD; 1350 goto get_only; 1351 } 1352 1353 clientrereg = (pi->clientrereg_subnettimeout & 1354 OPA_PI_MASK_CLIENT_REREGISTER); 1355 1356 dd = dd_from_ibdev(ibdev); 1357 /* IB numbers ports from 1, hw from 0 */ 1358 ppd = dd->pport + (port - 1); 1359 ibp = &ppd->ibport_data; 1360 event.device = ibdev; 1361 event.element.port_num = port; 1362 1363 ls_old = driver_lstate(ppd); 1364 1365 ibp->rvp.mkey = pi->mkey; 1366 if (ibp->rvp.gid_prefix != pi->subnet_prefix) { 1367 ibp->rvp.gid_prefix = pi->subnet_prefix; 1368 event.event = IB_EVENT_GID_CHANGE; 1369 ib_dispatch_event(&event); 1370 } 1371 ibp->rvp.mkey_lease_period = be16_to_cpu(pi->mkey_lease_period); 1372 1373 /* Must be a valid unicast LID address. */ 1374 if ((lid == 0 && ls_old > IB_PORT_INIT) || 1375 (hfi1_is_16B_mcast(lid))) { 1376 smp->status |= IB_SMP_INVALID_FIELD; 1377 pr_warn("SubnSet(OPA_PortInfo) lid invalid 0x%x\n", 1378 lid); 1379 } else if (ppd->lid != lid || 1380 ppd->lmc != (pi->mkeyprotect_lmc & OPA_PI_MASK_LMC)) { 1381 if (ppd->lid != lid) 1382 hfi1_set_uevent_bits(ppd, _HFI1_EVENT_LID_CHANGE_BIT); 1383 if (ppd->lmc != (pi->mkeyprotect_lmc & OPA_PI_MASK_LMC)) 1384 hfi1_set_uevent_bits(ppd, _HFI1_EVENT_LMC_CHANGE_BIT); 1385 hfi1_set_lid(ppd, lid, pi->mkeyprotect_lmc & OPA_PI_MASK_LMC); 1386 event.event = IB_EVENT_LID_CHANGE; 1387 ib_dispatch_event(&event); 1388 1389 if (HFI1_PORT_GUID_INDEX + 1 < HFI1_GUIDS_PER_PORT) { 1390 /* Manufacture GID from LID to support extended 1391 * addresses 1392 */ 1393 ppd->guids[HFI1_PORT_GUID_INDEX + 1] = 1394 be64_to_cpu(OPA_MAKE_ID(lid)); 1395 event.event = IB_EVENT_GID_CHANGE; 1396 ib_dispatch_event(&event); 1397 } 1398 } 1399 1400 msl = pi->smsl & OPA_PI_MASK_SMSL; 1401 if (pi->partenforce_filterraw & OPA_PI_MASK_LINKINIT_REASON) 1402 ppd->linkinit_reason = 1403 (pi->partenforce_filterraw & 1404 OPA_PI_MASK_LINKINIT_REASON); 1405 1406 /* Must be a valid unicast LID address. */ 1407 if ((smlid == 0 && ls_old > IB_PORT_INIT) || 1408 (hfi1_is_16B_mcast(smlid))) { 1409 smp->status |= IB_SMP_INVALID_FIELD; 1410 pr_warn("SubnSet(OPA_PortInfo) smlid invalid 0x%x\n", smlid); 1411 } else if (smlid != ibp->rvp.sm_lid || msl != ibp->rvp.sm_sl) { 1412 pr_warn("SubnSet(OPA_PortInfo) smlid 0x%x\n", smlid); 1413 spin_lock_irqsave(&ibp->rvp.lock, flags); 1414 if (ibp->rvp.sm_ah) { 1415 if (smlid != ibp->rvp.sm_lid) 1416 hfi1_modify_qp0_ah(ibp, ibp->rvp.sm_ah, smlid); 1417 if (msl != ibp->rvp.sm_sl) 1418 rdma_ah_set_sl(&ibp->rvp.sm_ah->attr, msl); 1419 } 1420 spin_unlock_irqrestore(&ibp->rvp.lock, flags); 1421 if (smlid != ibp->rvp.sm_lid) 1422 ibp->rvp.sm_lid = smlid; 1423 if (msl != ibp->rvp.sm_sl) 1424 ibp->rvp.sm_sl = msl; 1425 event.event = IB_EVENT_SM_CHANGE; 1426 ib_dispatch_event(&event); 1427 } 1428 1429 if (pi->link_down_reason == 0) { 1430 ppd->local_link_down_reason.sma = 0; 1431 ppd->local_link_down_reason.latest = 0; 1432 } 1433 1434 if (pi->neigh_link_down_reason == 0) { 1435 ppd->neigh_link_down_reason.sma = 0; 1436 ppd->neigh_link_down_reason.latest = 0; 1437 } 1438 1439 ppd->sm_trap_qp = be32_to_cpu(pi->sm_trap_qp); 1440 ppd->sa_qp = be32_to_cpu(pi->sa_qp); 1441 1442 ppd->port_error_action = be32_to_cpu(pi->port_error_action); 1443 lwe = be16_to_cpu(pi->link_width.enabled); 1444 if (lwe) { 1445 if (lwe == OPA_LINK_WIDTH_RESET || 1446 lwe == OPA_LINK_WIDTH_RESET_OLD) 1447 set_link_width_enabled(ppd, ppd->link_width_supported); 1448 else if ((lwe & ~ppd->link_width_supported) == 0) 1449 set_link_width_enabled(ppd, lwe); 1450 else 1451 smp->status |= IB_SMP_INVALID_FIELD; 1452 } 1453 lwe = be16_to_cpu(pi->link_width_downgrade.enabled); 1454 /* LWD.E is always applied - 0 means "disabled" */ 1455 if (lwe == OPA_LINK_WIDTH_RESET || 1456 lwe == OPA_LINK_WIDTH_RESET_OLD) { 1457 set_link_width_downgrade_enabled(ppd, 1458 ppd-> 1459 link_width_downgrade_supported 1460 ); 1461 } else if ((lwe & ~ppd->link_width_downgrade_supported) == 0) { 1462 /* only set and apply if something changed */ 1463 if (lwe != ppd->link_width_downgrade_enabled) { 1464 set_link_width_downgrade_enabled(ppd, lwe); 1465 call_link_downgrade_policy = 1; 1466 } 1467 } else { 1468 smp->status |= IB_SMP_INVALID_FIELD; 1469 } 1470 lse = be16_to_cpu(pi->link_speed.enabled); 1471 if (lse) { 1472 if (lse & be16_to_cpu(pi->link_speed.supported)) 1473 set_link_speed_enabled(ppd, lse); 1474 else 1475 smp->status |= IB_SMP_INVALID_FIELD; 1476 } 1477 1478 ibp->rvp.mkeyprot = 1479 (pi->mkeyprotect_lmc & OPA_PI_MASK_MKEY_PROT_BIT) >> 6; 1480 ibp->rvp.vl_high_limit = be16_to_cpu(pi->vl.high_limit) & 0xFF; 1481 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_VL_HIGH_LIMIT, 1482 ibp->rvp.vl_high_limit); 1483 1484 if (ppd->vls_supported / 2 > ARRAY_SIZE(pi->neigh_mtu.pvlx_to_mtu) || 1485 ppd->vls_supported > ARRAY_SIZE(dd->vld)) { 1486 smp->status |= IB_SMP_INVALID_FIELD; 1487 return reply((struct ib_mad_hdr *)smp); 1488 } 1489 for (i = 0; i < ppd->vls_supported; i++) { 1490 if ((i % 2) == 0) 1491 mtu = enum_to_mtu((pi->neigh_mtu.pvlx_to_mtu[i / 2] >> 1492 4) & 0xF); 1493 else 1494 mtu = enum_to_mtu(pi->neigh_mtu.pvlx_to_mtu[i / 2] & 1495 0xF); 1496 if (mtu == 0xffff) { 1497 pr_warn("SubnSet(OPA_PortInfo) mtu invalid %d (0x%x)\n", 1498 mtu, 1499 (pi->neigh_mtu.pvlx_to_mtu[0] >> 4) & 0xF); 1500 smp->status |= IB_SMP_INVALID_FIELD; 1501 mtu = hfi1_max_mtu; /* use a valid MTU */ 1502 } 1503 if (dd->vld[i].mtu != mtu) { 1504 dd_dev_info(dd, 1505 "MTU change on vl %d from %d to %d\n", 1506 i, dd->vld[i].mtu, mtu); 1507 dd->vld[i].mtu = mtu; 1508 call_set_mtu++; 1509 } 1510 } 1511 /* As per OPAV1 spec: VL15 must support and be configured 1512 * for operation with a 2048 or larger MTU. 1513 */ 1514 mtu = enum_to_mtu(pi->neigh_mtu.pvlx_to_mtu[15 / 2] & 0xF); 1515 if (mtu < 2048 || mtu == 0xffff) 1516 mtu = 2048; 1517 if (dd->vld[15].mtu != mtu) { 1518 dd_dev_info(dd, 1519 "MTU change on vl 15 from %d to %d\n", 1520 dd->vld[15].mtu, mtu); 1521 dd->vld[15].mtu = mtu; 1522 call_set_mtu++; 1523 } 1524 if (call_set_mtu) 1525 set_mtu(ppd); 1526 1527 /* Set operational VLs */ 1528 vls = pi->operational_vls & OPA_PI_MASK_OPERATIONAL_VL; 1529 if (vls) { 1530 if (vls > ppd->vls_supported) { 1531 pr_warn("SubnSet(OPA_PortInfo) VL's supported invalid %d\n", 1532 pi->operational_vls); 1533 smp->status |= IB_SMP_INVALID_FIELD; 1534 } else { 1535 if (hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_OP_VLS, 1536 vls) == -EINVAL) 1537 smp->status |= IB_SMP_INVALID_FIELD; 1538 } 1539 } 1540 1541 if (pi->mkey_violations == 0) 1542 ibp->rvp.mkey_violations = 0; 1543 1544 if (pi->pkey_violations == 0) 1545 ibp->rvp.pkey_violations = 0; 1546 1547 if (pi->qkey_violations == 0) 1548 ibp->rvp.qkey_violations = 0; 1549 1550 ibp->rvp.subnet_timeout = 1551 pi->clientrereg_subnettimeout & OPA_PI_MASK_SUBNET_TIMEOUT; 1552 1553 crc_enabled = be16_to_cpu(pi->port_ltp_crc_mode); 1554 crc_enabled >>= 4; 1555 crc_enabled &= 0xf; 1556 1557 if (crc_enabled != 0) 1558 ppd->port_crc_mode_enabled = port_ltp_to_cap(crc_enabled); 1559 1560 ppd->is_active_optimize_enabled = 1561 !!(be16_to_cpu(pi->port_mode) 1562 & OPA_PI_MASK_PORT_ACTIVE_OPTOMIZE); 1563 1564 ls_new = pi->port_states.portphysstate_portstate & 1565 OPA_PI_MASK_PORT_STATE; 1566 ps_new = (pi->port_states.portphysstate_portstate & 1567 OPA_PI_MASK_PORT_PHYSICAL_STATE) >> 4; 1568 1569 if (ls_old == IB_PORT_INIT) { 1570 if (start_of_sm_config) { 1571 if (ls_new == ls_old || (ls_new == IB_PORT_ARMED)) 1572 ppd->is_sm_config_started = 1; 1573 } else if (ls_new == IB_PORT_ARMED) { 1574 if (ppd->is_sm_config_started == 0) { 1575 invalid = 1; 1576 smp->status |= IB_SMP_INVALID_FIELD; 1577 } 1578 } 1579 } 1580 1581 /* Handle CLIENT_REREGISTER event b/c SM asked us for it */ 1582 if (clientrereg) { 1583 event.event = IB_EVENT_CLIENT_REREGISTER; 1584 ib_dispatch_event(&event); 1585 } 1586 1587 /* 1588 * Do the port state change now that the other link parameters 1589 * have been set. 1590 * Changing the port physical state only makes sense if the link 1591 * is down or is being set to down. 1592 */ 1593 1594 if (!invalid) { 1595 ret = set_port_states(ppd, smp, ls_new, ps_new, local_mad); 1596 if (ret) 1597 return ret; 1598 } 1599 1600 ret = __subn_get_opa_portinfo(smp, am, data, ibdev, port, resp_len, 1601 max_len); 1602 1603 /* restore re-reg bit per o14-12.2.1 */ 1604 pi->clientrereg_subnettimeout |= clientrereg; 1605 1606 /* 1607 * Apply the new link downgrade policy. This may result in a link 1608 * bounce. Do this after everything else so things are settled. 1609 * Possible problem: if setting the port state above fails, then 1610 * the policy change is not applied. 1611 */ 1612 if (call_link_downgrade_policy) 1613 apply_link_downgrade_policy(ppd, 0); 1614 1615 return ret; 1616 1617get_only: 1618 return __subn_get_opa_portinfo(smp, am, data, ibdev, port, resp_len, 1619 max_len); 1620} 1621 1622/** 1623 * set_pkeys - set the PKEY table for ctxt 0 1624 * @dd: the hfi1_ib device 1625 * @port: the IB port number 1626 * @pkeys: the PKEY table 1627 */ 1628static int set_pkeys(struct hfi1_devdata *dd, u32 port, u16 *pkeys) 1629{ 1630 struct hfi1_pportdata *ppd; 1631 int i; 1632 int changed = 0; 1633 int update_includes_mgmt_partition = 0; 1634 1635 /* 1636 * IB port one/two always maps to context zero/one, 1637 * always a kernel context, no locking needed 1638 * If we get here with ppd setup, no need to check 1639 * that rcd is valid. 1640 */ 1641 ppd = dd->pport + (port - 1); 1642 /* 1643 * If the update does not include the management pkey, don't do it. 1644 */ 1645 for (i = 0; i < ARRAY_SIZE(ppd->pkeys); i++) { 1646 if (pkeys[i] == LIM_MGMT_P_KEY) { 1647 update_includes_mgmt_partition = 1; 1648 break; 1649 } 1650 } 1651 1652 if (!update_includes_mgmt_partition) 1653 return 1; 1654 1655 for (i = 0; i < ARRAY_SIZE(ppd->pkeys); i++) { 1656 u16 key = pkeys[i]; 1657 u16 okey = ppd->pkeys[i]; 1658 1659 if (key == okey) 1660 continue; 1661 /* 1662 * The SM gives us the complete PKey table. We have 1663 * to ensure that we put the PKeys in the matching 1664 * slots. 1665 */ 1666 ppd->pkeys[i] = key; 1667 changed = 1; 1668 } 1669 1670 if (changed) { 1671 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); 1672 hfi1_event_pkey_change(dd, port); 1673 } 1674 1675 return 0; 1676} 1677 1678static int __subn_set_opa_pkeytable(struct opa_smp *smp, u32 am, u8 *data, 1679 struct ib_device *ibdev, u32 port, 1680 u32 *resp_len, u32 max_len) 1681{ 1682 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 1683 u32 n_blocks_sent = OPA_AM_NBLK(am); 1684 u32 start_block = am & 0x7ff; 1685 u16 *p = (u16 *)data; 1686 __be16 *q = (__be16 *)data; 1687 int i; 1688 u16 n_blocks_avail; 1689 unsigned npkeys = hfi1_get_npkeys(dd); 1690 u32 size = 0; 1691 1692 if (n_blocks_sent == 0) { 1693 pr_warn("OPA Get PKey AM Invalid : P = %u; B = 0x%x; N = 0x%x\n", 1694 port, start_block, n_blocks_sent); 1695 smp->status |= IB_SMP_INVALID_FIELD; 1696 return reply((struct ib_mad_hdr *)smp); 1697 } 1698 1699 n_blocks_avail = (u16)(npkeys / OPA_PARTITION_TABLE_BLK_SIZE) + 1; 1700 1701 size = sizeof(u16) * (n_blocks_sent * OPA_PARTITION_TABLE_BLK_SIZE); 1702 1703 if (smp_length_check(size, max_len)) { 1704 smp->status |= IB_SMP_INVALID_FIELD; 1705 return reply((struct ib_mad_hdr *)smp); 1706 } 1707 1708 if (start_block + n_blocks_sent > n_blocks_avail || 1709 n_blocks_sent > OPA_NUM_PKEY_BLOCKS_PER_SMP) { 1710 pr_warn("OPA Set PKey AM Invalid : s 0x%x; req 0x%x; avail 0x%x; blk/smp 0x%lx\n", 1711 start_block, n_blocks_sent, n_blocks_avail, 1712 OPA_NUM_PKEY_BLOCKS_PER_SMP); 1713 smp->status |= IB_SMP_INVALID_FIELD; 1714 return reply((struct ib_mad_hdr *)smp); 1715 } 1716 1717 for (i = 0; i < n_blocks_sent * OPA_PARTITION_TABLE_BLK_SIZE; i++) 1718 p[i] = be16_to_cpu(q[i]); 1719 1720 if (start_block == 0 && set_pkeys(dd, port, p) != 0) { 1721 smp->status |= IB_SMP_INVALID_FIELD; 1722 return reply((struct ib_mad_hdr *)smp); 1723 } 1724 1725 return __subn_get_opa_pkeytable(smp, am, data, ibdev, port, resp_len, 1726 max_len); 1727} 1728 1729#define ILLEGAL_VL 12 1730/* 1731 * filter_sc2vlt changes mappings to VL15 to ILLEGAL_VL (except 1732 * for SC15, which must map to VL15). If we don't remap things this 1733 * way it is possible for VL15 counters to increment when we try to 1734 * send on a SC which is mapped to an invalid VL. 1735 * When getting the table convert ILLEGAL_VL back to VL15. 1736 */ 1737static void filter_sc2vlt(void *data, bool set) 1738{ 1739 int i; 1740 u8 *pd = data; 1741 1742 for (i = 0; i < OPA_MAX_SCS; i++) { 1743 if (i == 15) 1744 continue; 1745 1746 if (set) { 1747 if ((pd[i] & 0x1f) == 0xf) 1748 pd[i] = ILLEGAL_VL; 1749 } else { 1750 if ((pd[i] & 0x1f) == ILLEGAL_VL) 1751 pd[i] = 0xf; 1752 } 1753 } 1754} 1755 1756static int set_sc2vlt_tables(struct hfi1_devdata *dd, void *data) 1757{ 1758 u64 *val = data; 1759 1760 filter_sc2vlt(data, true); 1761 1762 write_csr(dd, SEND_SC2VLT0, *val++); 1763 write_csr(dd, SEND_SC2VLT1, *val++); 1764 write_csr(dd, SEND_SC2VLT2, *val++); 1765 write_csr(dd, SEND_SC2VLT3, *val++); 1766 write_seqlock_irq(&dd->sc2vl_lock); 1767 memcpy(dd->sc2vl, data, sizeof(dd->sc2vl)); 1768 write_sequnlock_irq(&dd->sc2vl_lock); 1769 return 0; 1770} 1771 1772static int get_sc2vlt_tables(struct hfi1_devdata *dd, void *data) 1773{ 1774 u64 *val = (u64 *)data; 1775 1776 *val++ = read_csr(dd, SEND_SC2VLT0); 1777 *val++ = read_csr(dd, SEND_SC2VLT1); 1778 *val++ = read_csr(dd, SEND_SC2VLT2); 1779 *val++ = read_csr(dd, SEND_SC2VLT3); 1780 1781 filter_sc2vlt((u64 *)data, false); 1782 return 0; 1783} 1784 1785static int __subn_get_opa_sl_to_sc(struct opa_smp *smp, u32 am, u8 *data, 1786 struct ib_device *ibdev, u32 port, 1787 u32 *resp_len, u32 max_len) 1788{ 1789 struct hfi1_ibport *ibp = to_iport(ibdev, port); 1790 u8 *p = data; 1791 size_t size = ARRAY_SIZE(ibp->sl_to_sc); /* == 32 */ 1792 unsigned i; 1793 1794 if (am || smp_length_check(size, max_len)) { 1795 smp->status |= IB_SMP_INVALID_FIELD; 1796 return reply((struct ib_mad_hdr *)smp); 1797 } 1798 1799 for (i = 0; i < ARRAY_SIZE(ibp->sl_to_sc); i++) 1800 *p++ = ibp->sl_to_sc[i]; 1801 1802 if (resp_len) 1803 *resp_len += size; 1804 1805 return reply((struct ib_mad_hdr *)smp); 1806} 1807 1808static int __subn_set_opa_sl_to_sc(struct opa_smp *smp, u32 am, u8 *data, 1809 struct ib_device *ibdev, u32 port, 1810 u32 *resp_len, u32 max_len) 1811{ 1812 struct hfi1_ibport *ibp = to_iport(ibdev, port); 1813 u8 *p = data; 1814 size_t size = ARRAY_SIZE(ibp->sl_to_sc); 1815 int i; 1816 u8 sc; 1817 1818 if (am || smp_length_check(size, max_len)) { 1819 smp->status |= IB_SMP_INVALID_FIELD; 1820 return reply((struct ib_mad_hdr *)smp); 1821 } 1822 1823 for (i = 0; i < ARRAY_SIZE(ibp->sl_to_sc); i++) { 1824 sc = *p++; 1825 if (ibp->sl_to_sc[i] != sc) { 1826 ibp->sl_to_sc[i] = sc; 1827 1828 /* Put all stale qps into error state */ 1829 hfi1_error_port_qps(ibp, i); 1830 } 1831 } 1832 1833 return __subn_get_opa_sl_to_sc(smp, am, data, ibdev, port, resp_len, 1834 max_len); 1835} 1836 1837static int __subn_get_opa_sc_to_sl(struct opa_smp *smp, u32 am, u8 *data, 1838 struct ib_device *ibdev, u32 port, 1839 u32 *resp_len, u32 max_len) 1840{ 1841 struct hfi1_ibport *ibp = to_iport(ibdev, port); 1842 u8 *p = data; 1843 size_t size = ARRAY_SIZE(ibp->sc_to_sl); /* == 32 */ 1844 unsigned i; 1845 1846 if (am || smp_length_check(size, max_len)) { 1847 smp->status |= IB_SMP_INVALID_FIELD; 1848 return reply((struct ib_mad_hdr *)smp); 1849 } 1850 1851 for (i = 0; i < ARRAY_SIZE(ibp->sc_to_sl); i++) 1852 *p++ = ibp->sc_to_sl[i]; 1853 1854 if (resp_len) 1855 *resp_len += size; 1856 1857 return reply((struct ib_mad_hdr *)smp); 1858} 1859 1860static int __subn_set_opa_sc_to_sl(struct opa_smp *smp, u32 am, u8 *data, 1861 struct ib_device *ibdev, u32 port, 1862 u32 *resp_len, u32 max_len) 1863{ 1864 struct hfi1_ibport *ibp = to_iport(ibdev, port); 1865 size_t size = ARRAY_SIZE(ibp->sc_to_sl); 1866 u8 *p = data; 1867 int i; 1868 1869 if (am || smp_length_check(size, max_len)) { 1870 smp->status |= IB_SMP_INVALID_FIELD; 1871 return reply((struct ib_mad_hdr *)smp); 1872 } 1873 1874 for (i = 0; i < ARRAY_SIZE(ibp->sc_to_sl); i++) 1875 ibp->sc_to_sl[i] = *p++; 1876 1877 return __subn_get_opa_sc_to_sl(smp, am, data, ibdev, port, resp_len, 1878 max_len); 1879} 1880 1881static int __subn_get_opa_sc_to_vlt(struct opa_smp *smp, u32 am, u8 *data, 1882 struct ib_device *ibdev, u32 port, 1883 u32 *resp_len, u32 max_len) 1884{ 1885 u32 n_blocks = OPA_AM_NBLK(am); 1886 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 1887 void *vp = (void *)data; 1888 size_t size = 4 * sizeof(u64); 1889 1890 if (n_blocks != 1 || smp_length_check(size, max_len)) { 1891 smp->status |= IB_SMP_INVALID_FIELD; 1892 return reply((struct ib_mad_hdr *)smp); 1893 } 1894 1895 get_sc2vlt_tables(dd, vp); 1896 1897 if (resp_len) 1898 *resp_len += size; 1899 1900 return reply((struct ib_mad_hdr *)smp); 1901} 1902 1903static int __subn_set_opa_sc_to_vlt(struct opa_smp *smp, u32 am, u8 *data, 1904 struct ib_device *ibdev, u32 port, 1905 u32 *resp_len, u32 max_len) 1906{ 1907 u32 n_blocks = OPA_AM_NBLK(am); 1908 int async_update = OPA_AM_ASYNC(am); 1909 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 1910 void *vp = (void *)data; 1911 struct hfi1_pportdata *ppd; 1912 int lstate; 1913 /* 1914 * set_sc2vlt_tables writes the information contained in *data 1915 * to four 64-bit registers SendSC2VLt[0-3]. We need to make 1916 * sure *max_len is not greater than the total size of the four 1917 * SendSC2VLt[0-3] registers. 1918 */ 1919 size_t size = 4 * sizeof(u64); 1920 1921 if (n_blocks != 1 || async_update || smp_length_check(size, max_len)) { 1922 smp->status |= IB_SMP_INVALID_FIELD; 1923 return reply((struct ib_mad_hdr *)smp); 1924 } 1925 1926 /* IB numbers ports from 1, hw from 0 */ 1927 ppd = dd->pport + (port - 1); 1928 lstate = driver_lstate(ppd); 1929 /* 1930 * it's known that async_update is 0 by this point, but include 1931 * the explicit check for clarity 1932 */ 1933 if (!async_update && 1934 (lstate == IB_PORT_ARMED || lstate == IB_PORT_ACTIVE)) { 1935 smp->status |= IB_SMP_INVALID_FIELD; 1936 return reply((struct ib_mad_hdr *)smp); 1937 } 1938 1939 set_sc2vlt_tables(dd, vp); 1940 1941 return __subn_get_opa_sc_to_vlt(smp, am, data, ibdev, port, resp_len, 1942 max_len); 1943} 1944 1945static int __subn_get_opa_sc_to_vlnt(struct opa_smp *smp, u32 am, u8 *data, 1946 struct ib_device *ibdev, u32 port, 1947 u32 *resp_len, u32 max_len) 1948{ 1949 u32 n_blocks = OPA_AM_NPORT(am); 1950 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 1951 struct hfi1_pportdata *ppd; 1952 void *vp = (void *)data; 1953 int size = sizeof(struct sc2vlnt); 1954 1955 if (n_blocks != 1 || smp_length_check(size, max_len)) { 1956 smp->status |= IB_SMP_INVALID_FIELD; 1957 return reply((struct ib_mad_hdr *)smp); 1958 } 1959 1960 ppd = dd->pport + (port - 1); 1961 1962 fm_get_table(ppd, FM_TBL_SC2VLNT, vp); 1963 1964 if (resp_len) 1965 *resp_len += size; 1966 1967 return reply((struct ib_mad_hdr *)smp); 1968} 1969 1970static int __subn_set_opa_sc_to_vlnt(struct opa_smp *smp, u32 am, u8 *data, 1971 struct ib_device *ibdev, u32 port, 1972 u32 *resp_len, u32 max_len) 1973{ 1974 u32 n_blocks = OPA_AM_NPORT(am); 1975 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 1976 struct hfi1_pportdata *ppd; 1977 void *vp = (void *)data; 1978 int lstate; 1979 int size = sizeof(struct sc2vlnt); 1980 1981 if (n_blocks != 1 || smp_length_check(size, max_len)) { 1982 smp->status |= IB_SMP_INVALID_FIELD; 1983 return reply((struct ib_mad_hdr *)smp); 1984 } 1985 1986 /* IB numbers ports from 1, hw from 0 */ 1987 ppd = dd->pport + (port - 1); 1988 lstate = driver_lstate(ppd); 1989 if (lstate == IB_PORT_ARMED || lstate == IB_PORT_ACTIVE) { 1990 smp->status |= IB_SMP_INVALID_FIELD; 1991 return reply((struct ib_mad_hdr *)smp); 1992 } 1993 1994 ppd = dd->pport + (port - 1); 1995 1996 fm_set_table(ppd, FM_TBL_SC2VLNT, vp); 1997 1998 return __subn_get_opa_sc_to_vlnt(smp, am, data, ibdev, port, 1999 resp_len, max_len); 2000} 2001 2002static int __subn_get_opa_psi(struct opa_smp *smp, u32 am, u8 *data, 2003 struct ib_device *ibdev, u32 port, 2004 u32 *resp_len, u32 max_len) 2005{ 2006 u32 nports = OPA_AM_NPORT(am); 2007 u32 start_of_sm_config = OPA_AM_START_SM_CFG(am); 2008 u32 lstate; 2009 struct hfi1_ibport *ibp; 2010 struct hfi1_pportdata *ppd; 2011 struct opa_port_state_info *psi = (struct opa_port_state_info *)data; 2012 2013 if (nports != 1 || smp_length_check(sizeof(*psi), max_len)) { 2014 smp->status |= IB_SMP_INVALID_FIELD; 2015 return reply((struct ib_mad_hdr *)smp); 2016 } 2017 2018 ibp = to_iport(ibdev, port); 2019 ppd = ppd_from_ibp(ibp); 2020 2021 lstate = driver_lstate(ppd); 2022 2023 if (start_of_sm_config && (lstate == IB_PORT_INIT)) 2024 ppd->is_sm_config_started = 1; 2025 2026 psi->port_states.ledenable_offlinereason = ppd->neighbor_normal << 4; 2027 psi->port_states.ledenable_offlinereason |= 2028 ppd->is_sm_config_started << 5; 2029 psi->port_states.ledenable_offlinereason |= 2030 ppd->offline_disabled_reason; 2031 2032 psi->port_states.portphysstate_portstate = 2033 (driver_pstate(ppd) << 4) | (lstate & 0xf); 2034 psi->link_width_downgrade_tx_active = 2035 cpu_to_be16(ppd->link_width_downgrade_tx_active); 2036 psi->link_width_downgrade_rx_active = 2037 cpu_to_be16(ppd->link_width_downgrade_rx_active); 2038 if (resp_len) 2039 *resp_len += sizeof(struct opa_port_state_info); 2040 2041 return reply((struct ib_mad_hdr *)smp); 2042} 2043 2044static int __subn_set_opa_psi(struct opa_smp *smp, u32 am, u8 *data, 2045 struct ib_device *ibdev, u32 port, 2046 u32 *resp_len, u32 max_len, int local_mad) 2047{ 2048 u32 nports = OPA_AM_NPORT(am); 2049 u32 start_of_sm_config = OPA_AM_START_SM_CFG(am); 2050 u32 ls_old; 2051 u8 ls_new, ps_new; 2052 struct hfi1_ibport *ibp; 2053 struct hfi1_pportdata *ppd; 2054 struct opa_port_state_info *psi = (struct opa_port_state_info *)data; 2055 int ret, invalid = 0; 2056 2057 if (nports != 1 || smp_length_check(sizeof(*psi), max_len)) { 2058 smp->status |= IB_SMP_INVALID_FIELD; 2059 return reply((struct ib_mad_hdr *)smp); 2060 } 2061 2062 ibp = to_iport(ibdev, port); 2063 ppd = ppd_from_ibp(ibp); 2064 2065 ls_old = driver_lstate(ppd); 2066 2067 ls_new = port_states_to_logical_state(&psi->port_states); 2068 ps_new = port_states_to_phys_state(&psi->port_states); 2069 2070 if (ls_old == IB_PORT_INIT) { 2071 if (start_of_sm_config) { 2072 if (ls_new == ls_old || (ls_new == IB_PORT_ARMED)) 2073 ppd->is_sm_config_started = 1; 2074 } else if (ls_new == IB_PORT_ARMED) { 2075 if (ppd->is_sm_config_started == 0) { 2076 invalid = 1; 2077 smp->status |= IB_SMP_INVALID_FIELD; 2078 } 2079 } 2080 } 2081 2082 if (!invalid) { 2083 ret = set_port_states(ppd, smp, ls_new, ps_new, local_mad); 2084 if (ret) 2085 return ret; 2086 } 2087 2088 return __subn_get_opa_psi(smp, am, data, ibdev, port, resp_len, 2089 max_len); 2090} 2091 2092static int __subn_get_opa_cable_info(struct opa_smp *smp, u32 am, u8 *data, 2093 struct ib_device *ibdev, u32 port, 2094 u32 *resp_len, u32 max_len) 2095{ 2096 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2097 u32 addr = OPA_AM_CI_ADDR(am); 2098 u32 len = OPA_AM_CI_LEN(am) + 1; 2099 int ret; 2100 2101 if (dd->pport->port_type != PORT_TYPE_QSFP || 2102 smp_length_check(len, max_len)) { 2103 smp->status |= IB_SMP_INVALID_FIELD; 2104 return reply((struct ib_mad_hdr *)smp); 2105 } 2106 2107#define __CI_PAGE_SIZE BIT(7) /* 128 bytes */ 2108#define __CI_PAGE_MASK ~(__CI_PAGE_SIZE - 1) 2109#define __CI_PAGE_NUM(a) ((a) & __CI_PAGE_MASK) 2110 2111 /* 2112 * check that addr is within spec, and 2113 * addr and (addr + len - 1) are on the same "page" 2114 */ 2115 if (addr >= 4096 || 2116 (__CI_PAGE_NUM(addr) != __CI_PAGE_NUM(addr + len - 1))) { 2117 smp->status |= IB_SMP_INVALID_FIELD; 2118 return reply((struct ib_mad_hdr *)smp); 2119 } 2120 2121 ret = get_cable_info(dd, port, addr, len, data); 2122 2123 if (ret == -ENODEV) { 2124 smp->status |= IB_SMP_UNSUP_METH_ATTR; 2125 return reply((struct ib_mad_hdr *)smp); 2126 } 2127 2128 /* The address range for the CableInfo SMA query is wider than the 2129 * memory available on the QSFP cable. We want to return a valid 2130 * response, albeit zeroed out, for address ranges beyond available 2131 * memory but that are within the CableInfo query spec 2132 */ 2133 if (ret < 0 && ret != -ERANGE) { 2134 smp->status |= IB_SMP_INVALID_FIELD; 2135 return reply((struct ib_mad_hdr *)smp); 2136 } 2137 2138 if (resp_len) 2139 *resp_len += len; 2140 2141 return reply((struct ib_mad_hdr *)smp); 2142} 2143 2144static int __subn_get_opa_bct(struct opa_smp *smp, u32 am, u8 *data, 2145 struct ib_device *ibdev, u32 port, u32 *resp_len, 2146 u32 max_len) 2147{ 2148 u32 num_ports = OPA_AM_NPORT(am); 2149 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2150 struct hfi1_pportdata *ppd; 2151 struct buffer_control *p = (struct buffer_control *)data; 2152 int size = sizeof(struct buffer_control); 2153 2154 if (num_ports != 1 || smp_length_check(size, max_len)) { 2155 smp->status |= IB_SMP_INVALID_FIELD; 2156 return reply((struct ib_mad_hdr *)smp); 2157 } 2158 2159 ppd = dd->pport + (port - 1); 2160 fm_get_table(ppd, FM_TBL_BUFFER_CONTROL, p); 2161 trace_bct_get(dd, p); 2162 if (resp_len) 2163 *resp_len += size; 2164 2165 return reply((struct ib_mad_hdr *)smp); 2166} 2167 2168static int __subn_set_opa_bct(struct opa_smp *smp, u32 am, u8 *data, 2169 struct ib_device *ibdev, u32 port, u32 *resp_len, 2170 u32 max_len) 2171{ 2172 u32 num_ports = OPA_AM_NPORT(am); 2173 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2174 struct hfi1_pportdata *ppd; 2175 struct buffer_control *p = (struct buffer_control *)data; 2176 2177 if (num_ports != 1 || smp_length_check(sizeof(*p), max_len)) { 2178 smp->status |= IB_SMP_INVALID_FIELD; 2179 return reply((struct ib_mad_hdr *)smp); 2180 } 2181 ppd = dd->pport + (port - 1); 2182 trace_bct_set(dd, p); 2183 if (fm_set_table(ppd, FM_TBL_BUFFER_CONTROL, p) < 0) { 2184 smp->status |= IB_SMP_INVALID_FIELD; 2185 return reply((struct ib_mad_hdr *)smp); 2186 } 2187 2188 return __subn_get_opa_bct(smp, am, data, ibdev, port, resp_len, 2189 max_len); 2190} 2191 2192static int __subn_get_opa_vl_arb(struct opa_smp *smp, u32 am, u8 *data, 2193 struct ib_device *ibdev, u32 port, 2194 u32 *resp_len, u32 max_len) 2195{ 2196 struct hfi1_pportdata *ppd = ppd_from_ibp(to_iport(ibdev, port)); 2197 u32 num_ports = OPA_AM_NPORT(am); 2198 u8 section = (am & 0x00ff0000) >> 16; 2199 u8 *p = data; 2200 int size = 256; 2201 2202 if (num_ports != 1 || smp_length_check(size, max_len)) { 2203 smp->status |= IB_SMP_INVALID_FIELD; 2204 return reply((struct ib_mad_hdr *)smp); 2205 } 2206 2207 switch (section) { 2208 case OPA_VLARB_LOW_ELEMENTS: 2209 fm_get_table(ppd, FM_TBL_VL_LOW_ARB, p); 2210 break; 2211 case OPA_VLARB_HIGH_ELEMENTS: 2212 fm_get_table(ppd, FM_TBL_VL_HIGH_ARB, p); 2213 break; 2214 case OPA_VLARB_PREEMPT_ELEMENTS: 2215 fm_get_table(ppd, FM_TBL_VL_PREEMPT_ELEMS, p); 2216 break; 2217 case OPA_VLARB_PREEMPT_MATRIX: 2218 fm_get_table(ppd, FM_TBL_VL_PREEMPT_MATRIX, p); 2219 break; 2220 default: 2221 pr_warn("OPA SubnGet(VL Arb) AM Invalid : 0x%x\n", 2222 be32_to_cpu(smp->attr_mod)); 2223 smp->status |= IB_SMP_INVALID_FIELD; 2224 size = 0; 2225 break; 2226 } 2227 2228 if (size > 0 && resp_len) 2229 *resp_len += size; 2230 2231 return reply((struct ib_mad_hdr *)smp); 2232} 2233 2234static int __subn_set_opa_vl_arb(struct opa_smp *smp, u32 am, u8 *data, 2235 struct ib_device *ibdev, u32 port, 2236 u32 *resp_len, u32 max_len) 2237{ 2238 struct hfi1_pportdata *ppd = ppd_from_ibp(to_iport(ibdev, port)); 2239 u32 num_ports = OPA_AM_NPORT(am); 2240 u8 section = (am & 0x00ff0000) >> 16; 2241 u8 *p = data; 2242 int size = 256; 2243 2244 if (num_ports != 1 || smp_length_check(size, max_len)) { 2245 smp->status |= IB_SMP_INVALID_FIELD; 2246 return reply((struct ib_mad_hdr *)smp); 2247 } 2248 2249 switch (section) { 2250 case OPA_VLARB_LOW_ELEMENTS: 2251 (void)fm_set_table(ppd, FM_TBL_VL_LOW_ARB, p); 2252 break; 2253 case OPA_VLARB_HIGH_ELEMENTS: 2254 (void)fm_set_table(ppd, FM_TBL_VL_HIGH_ARB, p); 2255 break; 2256 /* 2257 * neither OPA_VLARB_PREEMPT_ELEMENTS, or OPA_VLARB_PREEMPT_MATRIX 2258 * can be changed from the default values 2259 */ 2260 case OPA_VLARB_PREEMPT_ELEMENTS: 2261 case OPA_VLARB_PREEMPT_MATRIX: 2262 smp->status |= IB_SMP_UNSUP_METH_ATTR; 2263 break; 2264 default: 2265 pr_warn("OPA SubnSet(VL Arb) AM Invalid : 0x%x\n", 2266 be32_to_cpu(smp->attr_mod)); 2267 smp->status |= IB_SMP_INVALID_FIELD; 2268 break; 2269 } 2270 2271 return __subn_get_opa_vl_arb(smp, am, data, ibdev, port, resp_len, 2272 max_len); 2273} 2274 2275struct opa_pma_mad { 2276 struct ib_mad_hdr mad_hdr; 2277 u8 data[2024]; 2278} __packed; 2279 2280struct opa_port_status_req { 2281 __u8 port_num; 2282 __u8 reserved[3]; 2283 __be32 vl_select_mask; 2284}; 2285 2286#define VL_MASK_ALL 0x00000000000080ffUL 2287 2288struct opa_port_status_rsp { 2289 __u8 port_num; 2290 __u8 reserved[3]; 2291 __be32 vl_select_mask; 2292 2293 /* Data counters */ 2294 __be64 port_xmit_data; 2295 __be64 port_rcv_data; 2296 __be64 port_xmit_pkts; 2297 __be64 port_rcv_pkts; 2298 __be64 port_multicast_xmit_pkts; 2299 __be64 port_multicast_rcv_pkts; 2300 __be64 port_xmit_wait; 2301 __be64 sw_port_congestion; 2302 __be64 port_rcv_fecn; 2303 __be64 port_rcv_becn; 2304 __be64 port_xmit_time_cong; 2305 __be64 port_xmit_wasted_bw; 2306 __be64 port_xmit_wait_data; 2307 __be64 port_rcv_bubble; 2308 __be64 port_mark_fecn; 2309 /* Error counters */ 2310 __be64 port_rcv_constraint_errors; 2311 __be64 port_rcv_switch_relay_errors; 2312 __be64 port_xmit_discards; 2313 __be64 port_xmit_constraint_errors; 2314 __be64 port_rcv_remote_physical_errors; 2315 __be64 local_link_integrity_errors; 2316 __be64 port_rcv_errors; 2317 __be64 excessive_buffer_overruns; 2318 __be64 fm_config_errors; 2319 __be32 link_error_recovery; 2320 __be32 link_downed; 2321 u8 uncorrectable_errors; 2322 2323 u8 link_quality_indicator; /* 5res, 3bit */ 2324 u8 res2[6]; 2325 struct _vls_pctrs { 2326 /* per-VL Data counters */ 2327 __be64 port_vl_xmit_data; 2328 __be64 port_vl_rcv_data; 2329 __be64 port_vl_xmit_pkts; 2330 __be64 port_vl_rcv_pkts; 2331 __be64 port_vl_xmit_wait; 2332 __be64 sw_port_vl_congestion; 2333 __be64 port_vl_rcv_fecn; 2334 __be64 port_vl_rcv_becn; 2335 __be64 port_xmit_time_cong; 2336 __be64 port_vl_xmit_wasted_bw; 2337 __be64 port_vl_xmit_wait_data; 2338 __be64 port_vl_rcv_bubble; 2339 __be64 port_vl_mark_fecn; 2340 __be64 port_vl_xmit_discards; 2341 } vls[]; /* real array size defined by # bits set in vl_select_mask */ 2342}; 2343 2344enum counter_selects { 2345 CS_PORT_XMIT_DATA = (1 << 31), 2346 CS_PORT_RCV_DATA = (1 << 30), 2347 CS_PORT_XMIT_PKTS = (1 << 29), 2348 CS_PORT_RCV_PKTS = (1 << 28), 2349 CS_PORT_MCAST_XMIT_PKTS = (1 << 27), 2350 CS_PORT_MCAST_RCV_PKTS = (1 << 26), 2351 CS_PORT_XMIT_WAIT = (1 << 25), 2352 CS_SW_PORT_CONGESTION = (1 << 24), 2353 CS_PORT_RCV_FECN = (1 << 23), 2354 CS_PORT_RCV_BECN = (1 << 22), 2355 CS_PORT_XMIT_TIME_CONG = (1 << 21), 2356 CS_PORT_XMIT_WASTED_BW = (1 << 20), 2357 CS_PORT_XMIT_WAIT_DATA = (1 << 19), 2358 CS_PORT_RCV_BUBBLE = (1 << 18), 2359 CS_PORT_MARK_FECN = (1 << 17), 2360 CS_PORT_RCV_CONSTRAINT_ERRORS = (1 << 16), 2361 CS_PORT_RCV_SWITCH_RELAY_ERRORS = (1 << 15), 2362 CS_PORT_XMIT_DISCARDS = (1 << 14), 2363 CS_PORT_XMIT_CONSTRAINT_ERRORS = (1 << 13), 2364 CS_PORT_RCV_REMOTE_PHYSICAL_ERRORS = (1 << 12), 2365 CS_LOCAL_LINK_INTEGRITY_ERRORS = (1 << 11), 2366 CS_PORT_RCV_ERRORS = (1 << 10), 2367 CS_EXCESSIVE_BUFFER_OVERRUNS = (1 << 9), 2368 CS_FM_CONFIG_ERRORS = (1 << 8), 2369 CS_LINK_ERROR_RECOVERY = (1 << 7), 2370 CS_LINK_DOWNED = (1 << 6), 2371 CS_UNCORRECTABLE_ERRORS = (1 << 5), 2372}; 2373 2374struct opa_clear_port_status { 2375 __be64 port_select_mask[4]; 2376 __be32 counter_select_mask; 2377}; 2378 2379struct opa_aggregate { 2380 __be16 attr_id; 2381 __be16 err_reqlength; /* 1 bit, 8 res, 7 bit */ 2382 __be32 attr_mod; 2383 u8 data[]; 2384}; 2385 2386#define MSK_LLI 0x000000f0 2387#define MSK_LLI_SFT 4 2388#define MSK_LER 0x0000000f 2389#define MSK_LER_SFT 0 2390#define ADD_LLI 8 2391#define ADD_LER 2 2392 2393/* Request contains first three fields, response contains those plus the rest */ 2394struct opa_port_data_counters_msg { 2395 __be64 port_select_mask[4]; 2396 __be32 vl_select_mask; 2397 __be32 resolution; 2398 2399 /* Response fields follow */ 2400 struct _port_dctrs { 2401 u8 port_number; 2402 u8 reserved2[3]; 2403 __be32 link_quality_indicator; /* 29res, 3bit */ 2404 2405 /* Data counters */ 2406 __be64 port_xmit_data; 2407 __be64 port_rcv_data; 2408 __be64 port_xmit_pkts; 2409 __be64 port_rcv_pkts; 2410 __be64 port_multicast_xmit_pkts; 2411 __be64 port_multicast_rcv_pkts; 2412 __be64 port_xmit_wait; 2413 __be64 sw_port_congestion; 2414 __be64 port_rcv_fecn; 2415 __be64 port_rcv_becn; 2416 __be64 port_xmit_time_cong; 2417 __be64 port_xmit_wasted_bw; 2418 __be64 port_xmit_wait_data; 2419 __be64 port_rcv_bubble; 2420 __be64 port_mark_fecn; 2421 2422 __be64 port_error_counter_summary; 2423 /* Sum of error counts/port */ 2424 2425 struct _vls_dctrs { 2426 /* per-VL Data counters */ 2427 __be64 port_vl_xmit_data; 2428 __be64 port_vl_rcv_data; 2429 __be64 port_vl_xmit_pkts; 2430 __be64 port_vl_rcv_pkts; 2431 __be64 port_vl_xmit_wait; 2432 __be64 sw_port_vl_congestion; 2433 __be64 port_vl_rcv_fecn; 2434 __be64 port_vl_rcv_becn; 2435 __be64 port_xmit_time_cong; 2436 __be64 port_vl_xmit_wasted_bw; 2437 __be64 port_vl_xmit_wait_data; 2438 __be64 port_vl_rcv_bubble; 2439 __be64 port_vl_mark_fecn; 2440 } vls[0]; 2441 /* array size defined by #bits set in vl_select_mask*/ 2442 } port[1]; /* array size defined by #ports in attribute modifier */ 2443}; 2444 2445struct opa_port_error_counters64_msg { 2446 /* 2447 * Request contains first two fields, response contains the 2448 * whole magilla 2449 */ 2450 __be64 port_select_mask[4]; 2451 __be32 vl_select_mask; 2452 2453 /* Response-only fields follow */ 2454 __be32 reserved1; 2455 struct _port_ectrs { 2456 u8 port_number; 2457 u8 reserved2[7]; 2458 __be64 port_rcv_constraint_errors; 2459 __be64 port_rcv_switch_relay_errors; 2460 __be64 port_xmit_discards; 2461 __be64 port_xmit_constraint_errors; 2462 __be64 port_rcv_remote_physical_errors; 2463 __be64 local_link_integrity_errors; 2464 __be64 port_rcv_errors; 2465 __be64 excessive_buffer_overruns; 2466 __be64 fm_config_errors; 2467 __be32 link_error_recovery; 2468 __be32 link_downed; 2469 u8 uncorrectable_errors; 2470 u8 reserved3[7]; 2471 struct _vls_ectrs { 2472 __be64 port_vl_xmit_discards; 2473 } vls[0]; 2474 /* array size defined by #bits set in vl_select_mask */ 2475 } port[1]; /* array size defined by #ports in attribute modifier */ 2476}; 2477 2478struct opa_port_error_info_msg { 2479 __be64 port_select_mask[4]; 2480 __be32 error_info_select_mask; 2481 __be32 reserved1; 2482 struct _port_ei { 2483 u8 port_number; 2484 u8 reserved2[7]; 2485 2486 /* PortRcvErrorInfo */ 2487 struct { 2488 u8 status_and_code; 2489 union { 2490 u8 raw[17]; 2491 struct { 2492 /* EI1to12 format */ 2493 u8 packet_flit1[8]; 2494 u8 packet_flit2[8]; 2495 u8 remaining_flit_bits12; 2496 } ei1to12; 2497 struct { 2498 u8 packet_bytes[8]; 2499 u8 remaining_flit_bits; 2500 } ei13; 2501 } ei; 2502 u8 reserved3[6]; 2503 } __packed port_rcv_ei; 2504 2505 /* ExcessiveBufferOverrunInfo */ 2506 struct { 2507 u8 status_and_sc; 2508 u8 reserved4[7]; 2509 } __packed excessive_buffer_overrun_ei; 2510 2511 /* PortXmitConstraintErrorInfo */ 2512 struct { 2513 u8 status; 2514 u8 reserved5; 2515 __be16 pkey; 2516 __be32 slid; 2517 } __packed port_xmit_constraint_ei; 2518 2519 /* PortRcvConstraintErrorInfo */ 2520 struct { 2521 u8 status; 2522 u8 reserved6; 2523 __be16 pkey; 2524 __be32 slid; 2525 } __packed port_rcv_constraint_ei; 2526 2527 /* PortRcvSwitchRelayErrorInfo */ 2528 struct { 2529 u8 status_and_code; 2530 u8 reserved7[3]; 2531 __u32 error_info; 2532 } __packed port_rcv_switch_relay_ei; 2533 2534 /* UncorrectableErrorInfo */ 2535 struct { 2536 u8 status_and_code; 2537 u8 reserved8; 2538 } __packed uncorrectable_ei; 2539 2540 /* FMConfigErrorInfo */ 2541 struct { 2542 u8 status_and_code; 2543 u8 error_info; 2544 } __packed fm_config_ei; 2545 __u32 reserved9; 2546 } port[1]; /* actual array size defined by #ports in attr modifier */ 2547}; 2548 2549/* opa_port_error_info_msg error_info_select_mask bit definitions */ 2550enum error_info_selects { 2551 ES_PORT_RCV_ERROR_INFO = (1 << 31), 2552 ES_EXCESSIVE_BUFFER_OVERRUN_INFO = (1 << 30), 2553 ES_PORT_XMIT_CONSTRAINT_ERROR_INFO = (1 << 29), 2554 ES_PORT_RCV_CONSTRAINT_ERROR_INFO = (1 << 28), 2555 ES_PORT_RCV_SWITCH_RELAY_ERROR_INFO = (1 << 27), 2556 ES_UNCORRECTABLE_ERROR_INFO = (1 << 26), 2557 ES_FM_CONFIG_ERROR_INFO = (1 << 25) 2558}; 2559 2560static int pma_get_opa_classportinfo(struct opa_pma_mad *pmp, 2561 struct ib_device *ibdev, u32 *resp_len) 2562{ 2563 struct opa_class_port_info *p = 2564 (struct opa_class_port_info *)pmp->data; 2565 2566 memset(pmp->data, 0, sizeof(pmp->data)); 2567 2568 if (pmp->mad_hdr.attr_mod != 0) 2569 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 2570 2571 p->base_version = OPA_MGMT_BASE_VERSION; 2572 p->class_version = OPA_SM_CLASS_VERSION; 2573 /* 2574 * Expected response time is 4.096 usec. * 2^18 == 1.073741824 sec. 2575 */ 2576 p->cap_mask2_resp_time = cpu_to_be32(18); 2577 2578 if (resp_len) 2579 *resp_len += sizeof(*p); 2580 2581 return reply((struct ib_mad_hdr *)pmp); 2582} 2583 2584static void a0_portstatus(struct hfi1_pportdata *ppd, 2585 struct opa_port_status_rsp *rsp) 2586{ 2587 if (!is_bx(ppd->dd)) { 2588 unsigned long vl; 2589 u64 sum_vl_xmit_wait = 0; 2590 unsigned long vl_all_mask = VL_MASK_ALL; 2591 2592 for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) { 2593 u64 tmp = sum_vl_xmit_wait + 2594 read_port_cntr(ppd, C_TX_WAIT_VL, 2595 idx_from_vl(vl)); 2596 if (tmp < sum_vl_xmit_wait) { 2597 /* we wrapped */ 2598 sum_vl_xmit_wait = (u64)~0; 2599 break; 2600 } 2601 sum_vl_xmit_wait = tmp; 2602 } 2603 if (be64_to_cpu(rsp->port_xmit_wait) > sum_vl_xmit_wait) 2604 rsp->port_xmit_wait = cpu_to_be64(sum_vl_xmit_wait); 2605 } 2606} 2607 2608/** 2609 * tx_link_width - convert link width bitmask to integer 2610 * value representing actual link width. 2611 * @link_width: width of active link 2612 * @return: return index of the bit set in link_width var 2613 * 2614 * The function convert and return the index of bit set 2615 * that indicate the current link width. 2616 */ 2617u16 tx_link_width(u16 link_width) 2618{ 2619 int n = LINK_WIDTH_DEFAULT; 2620 u16 tx_width = n; 2621 2622 while (link_width && n) { 2623 if (link_width & (1 << (n - 1))) { 2624 tx_width = n; 2625 break; 2626 } 2627 n--; 2628 } 2629 2630 return tx_width; 2631} 2632 2633/** 2634 * get_xmit_wait_counters - Convert HFI 's SendWaitCnt/SendWaitVlCnt 2635 * counter in unit of TXE cycle times to flit times. 2636 * @ppd: info of physical Hfi port 2637 * @link_width: width of active link 2638 * @link_speed: speed of active link 2639 * @vl: represent VL0-VL7, VL15 for PortVLXmitWait counters request 2640 * and if vl value is C_VL_COUNT, it represent SendWaitCnt 2641 * counter request 2642 * @return: return SendWaitCnt/SendWaitVlCnt counter value per vl. 2643 * 2644 * Convert SendWaitCnt/SendWaitVlCnt counter from TXE cycle times to 2645 * flit times. Call this function to samples these counters. This 2646 * function will calculate for previous state transition and update 2647 * current state at end of function using ppd->prev_link_width and 2648 * ppd->port_vl_xmit_wait_last to port_vl_xmit_wait_curr and link_width. 2649 */ 2650u64 get_xmit_wait_counters(struct hfi1_pportdata *ppd, 2651 u16 link_width, u16 link_speed, int vl) 2652{ 2653 u64 port_vl_xmit_wait_curr; 2654 u64 delta_vl_xmit_wait; 2655 u64 xmit_wait_val; 2656 2657 if (vl > C_VL_COUNT) 2658 return 0; 2659 if (vl < C_VL_COUNT) 2660 port_vl_xmit_wait_curr = 2661 read_port_cntr(ppd, C_TX_WAIT_VL, vl); 2662 else 2663 port_vl_xmit_wait_curr = 2664 read_port_cntr(ppd, C_TX_WAIT, CNTR_INVALID_VL); 2665 2666 xmit_wait_val = 2667 port_vl_xmit_wait_curr - 2668 ppd->port_vl_xmit_wait_last[vl]; 2669 delta_vl_xmit_wait = 2670 convert_xmit_counter(xmit_wait_val, 2671 ppd->prev_link_width, 2672 link_speed); 2673 2674 ppd->vl_xmit_flit_cnt[vl] += delta_vl_xmit_wait; 2675 ppd->port_vl_xmit_wait_last[vl] = port_vl_xmit_wait_curr; 2676 ppd->prev_link_width = link_width; 2677 2678 return ppd->vl_xmit_flit_cnt[vl]; 2679} 2680 2681static int pma_get_opa_portstatus(struct opa_pma_mad *pmp, 2682 struct ib_device *ibdev, 2683 u32 port, u32 *resp_len) 2684{ 2685 struct opa_port_status_req *req = 2686 (struct opa_port_status_req *)pmp->data; 2687 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2688 struct opa_port_status_rsp *rsp; 2689 unsigned long vl_select_mask = be32_to_cpu(req->vl_select_mask); 2690 unsigned long vl; 2691 size_t response_data_size; 2692 u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; 2693 u32 port_num = req->port_num; 2694 u8 num_vls = hweight64(vl_select_mask); 2695 struct _vls_pctrs *vlinfo; 2696 struct hfi1_ibport *ibp = to_iport(ibdev, port); 2697 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 2698 int vfi; 2699 u64 tmp, tmp2; 2700 u16 link_width; 2701 u16 link_speed; 2702 2703 response_data_size = struct_size(rsp, vls, num_vls); 2704 if (response_data_size > sizeof(pmp->data)) { 2705 pmp->mad_hdr.status |= OPA_PM_STATUS_REQUEST_TOO_LARGE; 2706 return reply((struct ib_mad_hdr *)pmp); 2707 } 2708 2709 if (nports != 1 || (port_num && port_num != port) || 2710 num_vls > OPA_MAX_VLS || (vl_select_mask & ~VL_MASK_ALL)) { 2711 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 2712 return reply((struct ib_mad_hdr *)pmp); 2713 } 2714 2715 memset(pmp->data, 0, sizeof(pmp->data)); 2716 2717 rsp = (struct opa_port_status_rsp *)pmp->data; 2718 if (port_num) 2719 rsp->port_num = port_num; 2720 else 2721 rsp->port_num = port; 2722 2723 rsp->port_rcv_constraint_errors = 2724 cpu_to_be64(read_port_cntr(ppd, C_SW_RCV_CSTR_ERR, 2725 CNTR_INVALID_VL)); 2726 2727 hfi1_read_link_quality(dd, &rsp->link_quality_indicator); 2728 2729 rsp->vl_select_mask = cpu_to_be32((u32)vl_select_mask); 2730 rsp->port_xmit_data = cpu_to_be64(read_dev_cntr(dd, C_DC_XMIT_FLITS, 2731 CNTR_INVALID_VL)); 2732 rsp->port_rcv_data = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FLITS, 2733 CNTR_INVALID_VL)); 2734 rsp->port_xmit_pkts = cpu_to_be64(read_dev_cntr(dd, C_DC_XMIT_PKTS, 2735 CNTR_INVALID_VL)); 2736 rsp->port_rcv_pkts = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_PKTS, 2737 CNTR_INVALID_VL)); 2738 rsp->port_multicast_xmit_pkts = 2739 cpu_to_be64(read_dev_cntr(dd, C_DC_MC_XMIT_PKTS, 2740 CNTR_INVALID_VL)); 2741 rsp->port_multicast_rcv_pkts = 2742 cpu_to_be64(read_dev_cntr(dd, C_DC_MC_RCV_PKTS, 2743 CNTR_INVALID_VL)); 2744 /* 2745 * Convert PortXmitWait counter from TXE cycle times 2746 * to flit times. 2747 */ 2748 link_width = 2749 tx_link_width(ppd->link_width_downgrade_tx_active); 2750 link_speed = get_link_speed(ppd->link_speed_active); 2751 rsp->port_xmit_wait = 2752 cpu_to_be64(get_xmit_wait_counters(ppd, link_width, 2753 link_speed, C_VL_COUNT)); 2754 rsp->port_rcv_fecn = 2755 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FCN, CNTR_INVALID_VL)); 2756 rsp->port_rcv_becn = 2757 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_BCN, CNTR_INVALID_VL)); 2758 rsp->port_xmit_discards = 2759 cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD, 2760 CNTR_INVALID_VL)); 2761 rsp->port_xmit_constraint_errors = 2762 cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_CSTR_ERR, 2763 CNTR_INVALID_VL)); 2764 rsp->port_rcv_remote_physical_errors = 2765 cpu_to_be64(read_dev_cntr(dd, C_DC_RMT_PHY_ERR, 2766 CNTR_INVALID_VL)); 2767 rsp->local_link_integrity_errors = 2768 cpu_to_be64(read_dev_cntr(dd, C_DC_RX_REPLAY, 2769 CNTR_INVALID_VL)); 2770 tmp = read_dev_cntr(dd, C_DC_SEQ_CRC_CNT, CNTR_INVALID_VL); 2771 tmp2 = tmp + read_dev_cntr(dd, C_DC_REINIT_FROM_PEER_CNT, 2772 CNTR_INVALID_VL); 2773 if (tmp2 > (u32)UINT_MAX || tmp2 < tmp) { 2774 /* overflow/wrapped */ 2775 rsp->link_error_recovery = cpu_to_be32(~0); 2776 } else { 2777 rsp->link_error_recovery = cpu_to_be32(tmp2); 2778 } 2779 rsp->port_rcv_errors = 2780 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_ERR, CNTR_INVALID_VL)); 2781 rsp->excessive_buffer_overruns = 2782 cpu_to_be64(read_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL)); 2783 rsp->fm_config_errors = 2784 cpu_to_be64(read_dev_cntr(dd, C_DC_FM_CFG_ERR, 2785 CNTR_INVALID_VL)); 2786 rsp->link_downed = cpu_to_be32(read_port_cntr(ppd, C_SW_LINK_DOWN, 2787 CNTR_INVALID_VL)); 2788 2789 /* rsp->uncorrectable_errors is 8 bits wide, and it pegs at 0xff */ 2790 tmp = read_dev_cntr(dd, C_DC_UNC_ERR, CNTR_INVALID_VL); 2791 rsp->uncorrectable_errors = tmp < 0x100 ? (tmp & 0xff) : 0xff; 2792 2793 vlinfo = &rsp->vls[0]; 2794 vfi = 0; 2795 /* The vl_select_mask has been checked above, and we know 2796 * that it contains only entries which represent valid VLs. 2797 * So in the for_each_set_bit() loop below, we don't need 2798 * any additional checks for vl. 2799 */ 2800 for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 2801 memset(vlinfo, 0, sizeof(*vlinfo)); 2802 2803 tmp = read_dev_cntr(dd, C_DC_RX_FLIT_VL, idx_from_vl(vl)); 2804 rsp->vls[vfi].port_vl_rcv_data = cpu_to_be64(tmp); 2805 2806 rsp->vls[vfi].port_vl_rcv_pkts = 2807 cpu_to_be64(read_dev_cntr(dd, C_DC_RX_PKT_VL, 2808 idx_from_vl(vl))); 2809 2810 rsp->vls[vfi].port_vl_xmit_data = 2811 cpu_to_be64(read_port_cntr(ppd, C_TX_FLIT_VL, 2812 idx_from_vl(vl))); 2813 2814 rsp->vls[vfi].port_vl_xmit_pkts = 2815 cpu_to_be64(read_port_cntr(ppd, C_TX_PKT_VL, 2816 idx_from_vl(vl))); 2817 /* 2818 * Convert PortVlXmitWait counter from TXE cycle 2819 * times to flit times. 2820 */ 2821 rsp->vls[vfi].port_vl_xmit_wait = 2822 cpu_to_be64(get_xmit_wait_counters(ppd, link_width, 2823 link_speed, 2824 idx_from_vl(vl))); 2825 2826 rsp->vls[vfi].port_vl_rcv_fecn = 2827 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FCN_VL, 2828 idx_from_vl(vl))); 2829 2830 rsp->vls[vfi].port_vl_rcv_becn = 2831 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_BCN_VL, 2832 idx_from_vl(vl))); 2833 2834 rsp->vls[vfi].port_vl_xmit_discards = 2835 cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD_VL, 2836 idx_from_vl(vl))); 2837 vlinfo++; 2838 vfi++; 2839 } 2840 2841 a0_portstatus(ppd, rsp); 2842 2843 if (resp_len) 2844 *resp_len += response_data_size; 2845 2846 return reply((struct ib_mad_hdr *)pmp); 2847} 2848 2849static u64 get_error_counter_summary(struct ib_device *ibdev, u32 port, 2850 u8 res_lli, u8 res_ler) 2851{ 2852 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2853 struct hfi1_ibport *ibp = to_iport(ibdev, port); 2854 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 2855 u64 error_counter_summary = 0, tmp; 2856 2857 error_counter_summary += read_port_cntr(ppd, C_SW_RCV_CSTR_ERR, 2858 CNTR_INVALID_VL); 2859 /* port_rcv_switch_relay_errors is 0 for HFIs */ 2860 error_counter_summary += read_port_cntr(ppd, C_SW_XMIT_DSCD, 2861 CNTR_INVALID_VL); 2862 error_counter_summary += read_port_cntr(ppd, C_SW_XMIT_CSTR_ERR, 2863 CNTR_INVALID_VL); 2864 error_counter_summary += read_dev_cntr(dd, C_DC_RMT_PHY_ERR, 2865 CNTR_INVALID_VL); 2866 /* local link integrity must be right-shifted by the lli resolution */ 2867 error_counter_summary += (read_dev_cntr(dd, C_DC_RX_REPLAY, 2868 CNTR_INVALID_VL) >> res_lli); 2869 /* link error recovery must b right-shifted by the ler resolution */ 2870 tmp = read_dev_cntr(dd, C_DC_SEQ_CRC_CNT, CNTR_INVALID_VL); 2871 tmp += read_dev_cntr(dd, C_DC_REINIT_FROM_PEER_CNT, CNTR_INVALID_VL); 2872 error_counter_summary += (tmp >> res_ler); 2873 error_counter_summary += read_dev_cntr(dd, C_DC_RCV_ERR, 2874 CNTR_INVALID_VL); 2875 error_counter_summary += read_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL); 2876 error_counter_summary += read_dev_cntr(dd, C_DC_FM_CFG_ERR, 2877 CNTR_INVALID_VL); 2878 /* ppd->link_downed is a 32-bit value */ 2879 error_counter_summary += read_port_cntr(ppd, C_SW_LINK_DOWN, 2880 CNTR_INVALID_VL); 2881 tmp = read_dev_cntr(dd, C_DC_UNC_ERR, CNTR_INVALID_VL); 2882 /* this is an 8-bit quantity */ 2883 error_counter_summary += tmp < 0x100 ? (tmp & 0xff) : 0xff; 2884 2885 return error_counter_summary; 2886} 2887 2888static void a0_datacounters(struct hfi1_pportdata *ppd, struct _port_dctrs *rsp) 2889{ 2890 if (!is_bx(ppd->dd)) { 2891 unsigned long vl; 2892 u64 sum_vl_xmit_wait = 0; 2893 unsigned long vl_all_mask = VL_MASK_ALL; 2894 2895 for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) { 2896 u64 tmp = sum_vl_xmit_wait + 2897 read_port_cntr(ppd, C_TX_WAIT_VL, 2898 idx_from_vl(vl)); 2899 if (tmp < sum_vl_xmit_wait) { 2900 /* we wrapped */ 2901 sum_vl_xmit_wait = (u64)~0; 2902 break; 2903 } 2904 sum_vl_xmit_wait = tmp; 2905 } 2906 if (be64_to_cpu(rsp->port_xmit_wait) > sum_vl_xmit_wait) 2907 rsp->port_xmit_wait = cpu_to_be64(sum_vl_xmit_wait); 2908 } 2909} 2910 2911static void pma_get_opa_port_dctrs(struct ib_device *ibdev, 2912 struct _port_dctrs *rsp) 2913{ 2914 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2915 2916 rsp->port_xmit_data = cpu_to_be64(read_dev_cntr(dd, C_DC_XMIT_FLITS, 2917 CNTR_INVALID_VL)); 2918 rsp->port_rcv_data = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FLITS, 2919 CNTR_INVALID_VL)); 2920 rsp->port_xmit_pkts = cpu_to_be64(read_dev_cntr(dd, C_DC_XMIT_PKTS, 2921 CNTR_INVALID_VL)); 2922 rsp->port_rcv_pkts = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_PKTS, 2923 CNTR_INVALID_VL)); 2924 rsp->port_multicast_xmit_pkts = 2925 cpu_to_be64(read_dev_cntr(dd, C_DC_MC_XMIT_PKTS, 2926 CNTR_INVALID_VL)); 2927 rsp->port_multicast_rcv_pkts = 2928 cpu_to_be64(read_dev_cntr(dd, C_DC_MC_RCV_PKTS, 2929 CNTR_INVALID_VL)); 2930} 2931 2932static int pma_get_opa_datacounters(struct opa_pma_mad *pmp, 2933 struct ib_device *ibdev, 2934 u32 port, u32 *resp_len) 2935{ 2936 struct opa_port_data_counters_msg *req = 2937 (struct opa_port_data_counters_msg *)pmp->data; 2938 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2939 struct hfi1_ibport *ibp = to_iport(ibdev, port); 2940 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 2941 struct _port_dctrs *rsp; 2942 struct _vls_dctrs *vlinfo; 2943 size_t response_data_size; 2944 u32 num_ports; 2945 u8 lq, num_vls; 2946 u8 res_lli, res_ler; 2947 u64 port_mask; 2948 u32 port_num; 2949 unsigned long vl; 2950 unsigned long vl_select_mask; 2951 int vfi; 2952 u16 link_width; 2953 u16 link_speed; 2954 2955 num_ports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; 2956 num_vls = hweight32(be32_to_cpu(req->vl_select_mask)); 2957 vl_select_mask = be32_to_cpu(req->vl_select_mask); 2958 res_lli = (u8)(be32_to_cpu(req->resolution) & MSK_LLI) >> MSK_LLI_SFT; 2959 res_lli = res_lli ? res_lli + ADD_LLI : 0; 2960 res_ler = (u8)(be32_to_cpu(req->resolution) & MSK_LER) >> MSK_LER_SFT; 2961 res_ler = res_ler ? res_ler + ADD_LER : 0; 2962 2963 if (num_ports != 1 || (vl_select_mask & ~VL_MASK_ALL)) { 2964 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 2965 return reply((struct ib_mad_hdr *)pmp); 2966 } 2967 2968 /* Sanity check */ 2969 response_data_size = struct_size(req, port[0].vls, num_vls); 2970 2971 if (response_data_size > sizeof(pmp->data)) { 2972 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 2973 return reply((struct ib_mad_hdr *)pmp); 2974 } 2975 2976 /* 2977 * The bit set in the mask needs to be consistent with the 2978 * port the request came in on. 2979 */ 2980 port_mask = be64_to_cpu(req->port_select_mask[3]); 2981 port_num = find_first_bit((unsigned long *)&port_mask, 2982 sizeof(port_mask) * 8); 2983 2984 if (port_num != port) { 2985 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 2986 return reply((struct ib_mad_hdr *)pmp); 2987 } 2988 2989 rsp = &req->port[0]; 2990 memset(rsp, 0, sizeof(*rsp)); 2991 2992 rsp->port_number = port; 2993 /* 2994 * Note that link_quality_indicator is a 32 bit quantity in 2995 * 'datacounters' queries (as opposed to 'portinfo' queries, 2996 * where it's a byte). 2997 */ 2998 hfi1_read_link_quality(dd, &lq); 2999 rsp->link_quality_indicator = cpu_to_be32((u32)lq); 3000 pma_get_opa_port_dctrs(ibdev, rsp); 3001 3002 /* 3003 * Convert PortXmitWait counter from TXE 3004 * cycle times to flit times. 3005 */ 3006 link_width = 3007 tx_link_width(ppd->link_width_downgrade_tx_active); 3008 link_speed = get_link_speed(ppd->link_speed_active); 3009 rsp->port_xmit_wait = 3010 cpu_to_be64(get_xmit_wait_counters(ppd, link_width, 3011 link_speed, C_VL_COUNT)); 3012 rsp->port_rcv_fecn = 3013 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FCN, CNTR_INVALID_VL)); 3014 rsp->port_rcv_becn = 3015 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_BCN, CNTR_INVALID_VL)); 3016 rsp->port_error_counter_summary = 3017 cpu_to_be64(get_error_counter_summary(ibdev, port, 3018 res_lli, res_ler)); 3019 3020 vlinfo = &rsp->vls[0]; 3021 vfi = 0; 3022 /* The vl_select_mask has been checked above, and we know 3023 * that it contains only entries which represent valid VLs. 3024 * So in the for_each_set_bit() loop below, we don't need 3025 * any additional checks for vl. 3026 */ 3027 for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 3028 memset(vlinfo, 0, sizeof(*vlinfo)); 3029 3030 rsp->vls[vfi].port_vl_xmit_data = 3031 cpu_to_be64(read_port_cntr(ppd, C_TX_FLIT_VL, 3032 idx_from_vl(vl))); 3033 3034 rsp->vls[vfi].port_vl_rcv_data = 3035 cpu_to_be64(read_dev_cntr(dd, C_DC_RX_FLIT_VL, 3036 idx_from_vl(vl))); 3037 3038 rsp->vls[vfi].port_vl_xmit_pkts = 3039 cpu_to_be64(read_port_cntr(ppd, C_TX_PKT_VL, 3040 idx_from_vl(vl))); 3041 3042 rsp->vls[vfi].port_vl_rcv_pkts = 3043 cpu_to_be64(read_dev_cntr(dd, C_DC_RX_PKT_VL, 3044 idx_from_vl(vl))); 3045 3046 /* 3047 * Convert PortVlXmitWait counter from TXE 3048 * cycle times to flit times. 3049 */ 3050 rsp->vls[vfi].port_vl_xmit_wait = 3051 cpu_to_be64(get_xmit_wait_counters(ppd, link_width, 3052 link_speed, 3053 idx_from_vl(vl))); 3054 3055 rsp->vls[vfi].port_vl_rcv_fecn = 3056 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FCN_VL, 3057 idx_from_vl(vl))); 3058 rsp->vls[vfi].port_vl_rcv_becn = 3059 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_BCN_VL, 3060 idx_from_vl(vl))); 3061 3062 /* rsp->port_vl_xmit_time_cong is 0 for HFIs */ 3063 /* rsp->port_vl_xmit_wasted_bw ??? */ 3064 /* port_vl_xmit_wait_data - TXE (table 13-9 HFI spec) ??? 3065 * does this differ from rsp->vls[vfi].port_vl_xmit_wait 3066 */ 3067 /*rsp->vls[vfi].port_vl_mark_fecn = 3068 * cpu_to_be64(read_csr(dd, DCC_PRF_PORT_VL_MARK_FECN_CNT 3069 * + offset)); 3070 */ 3071 vlinfo++; 3072 vfi++; 3073 } 3074 3075 a0_datacounters(ppd, rsp); 3076 3077 if (resp_len) 3078 *resp_len += response_data_size; 3079 3080 return reply((struct ib_mad_hdr *)pmp); 3081} 3082 3083static int pma_get_ib_portcounters_ext(struct ib_pma_mad *pmp, 3084 struct ib_device *ibdev, u32 port) 3085{ 3086 struct ib_pma_portcounters_ext *p = (struct ib_pma_portcounters_ext *) 3087 pmp->data; 3088 struct _port_dctrs rsp; 3089 3090 if (pmp->mad_hdr.attr_mod != 0 || p->port_select != port) { 3091 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3092 goto bail; 3093 } 3094 3095 memset(&rsp, 0, sizeof(rsp)); 3096 pma_get_opa_port_dctrs(ibdev, &rsp); 3097 3098 p->port_xmit_data = rsp.port_xmit_data; 3099 p->port_rcv_data = rsp.port_rcv_data; 3100 p->port_xmit_packets = rsp.port_xmit_pkts; 3101 p->port_rcv_packets = rsp.port_rcv_pkts; 3102 p->port_unicast_xmit_packets = 0; 3103 p->port_unicast_rcv_packets = 0; 3104 p->port_multicast_xmit_packets = rsp.port_multicast_xmit_pkts; 3105 p->port_multicast_rcv_packets = rsp.port_multicast_rcv_pkts; 3106 3107bail: 3108 return reply((struct ib_mad_hdr *)pmp); 3109} 3110 3111static void pma_get_opa_port_ectrs(struct ib_device *ibdev, 3112 struct _port_ectrs *rsp, u32 port) 3113{ 3114 u64 tmp, tmp2; 3115 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 3116 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3117 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3118 3119 tmp = read_dev_cntr(dd, C_DC_SEQ_CRC_CNT, CNTR_INVALID_VL); 3120 tmp2 = tmp + read_dev_cntr(dd, C_DC_REINIT_FROM_PEER_CNT, 3121 CNTR_INVALID_VL); 3122 if (tmp2 > (u32)UINT_MAX || tmp2 < tmp) { 3123 /* overflow/wrapped */ 3124 rsp->link_error_recovery = cpu_to_be32(~0); 3125 } else { 3126 rsp->link_error_recovery = cpu_to_be32(tmp2); 3127 } 3128 3129 rsp->link_downed = cpu_to_be32(read_port_cntr(ppd, C_SW_LINK_DOWN, 3130 CNTR_INVALID_VL)); 3131 rsp->port_rcv_errors = 3132 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_ERR, CNTR_INVALID_VL)); 3133 rsp->port_rcv_remote_physical_errors = 3134 cpu_to_be64(read_dev_cntr(dd, C_DC_RMT_PHY_ERR, 3135 CNTR_INVALID_VL)); 3136 rsp->port_rcv_switch_relay_errors = 0; 3137 rsp->port_xmit_discards = 3138 cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD, 3139 CNTR_INVALID_VL)); 3140 rsp->port_xmit_constraint_errors = 3141 cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_CSTR_ERR, 3142 CNTR_INVALID_VL)); 3143 rsp->port_rcv_constraint_errors = 3144 cpu_to_be64(read_port_cntr(ppd, C_SW_RCV_CSTR_ERR, 3145 CNTR_INVALID_VL)); 3146 rsp->local_link_integrity_errors = 3147 cpu_to_be64(read_dev_cntr(dd, C_DC_RX_REPLAY, 3148 CNTR_INVALID_VL)); 3149 rsp->excessive_buffer_overruns = 3150 cpu_to_be64(read_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL)); 3151} 3152 3153static int pma_get_opa_porterrors(struct opa_pma_mad *pmp, 3154 struct ib_device *ibdev, 3155 u32 port, u32 *resp_len) 3156{ 3157 size_t response_data_size; 3158 struct _port_ectrs *rsp; 3159 u32 port_num; 3160 struct opa_port_error_counters64_msg *req; 3161 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 3162 u32 num_ports; 3163 u8 num_pslm; 3164 u8 num_vls; 3165 struct hfi1_ibport *ibp; 3166 struct hfi1_pportdata *ppd; 3167 struct _vls_ectrs *vlinfo; 3168 unsigned long vl; 3169 u64 port_mask, tmp; 3170 unsigned long vl_select_mask; 3171 int vfi; 3172 3173 req = (struct opa_port_error_counters64_msg *)pmp->data; 3174 3175 num_ports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; 3176 3177 num_pslm = hweight64(be64_to_cpu(req->port_select_mask[3])); 3178 num_vls = hweight32(be32_to_cpu(req->vl_select_mask)); 3179 3180 if (num_ports != 1 || num_ports != num_pslm) { 3181 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3182 return reply((struct ib_mad_hdr *)pmp); 3183 } 3184 3185 response_data_size = struct_size(req, port[0].vls, num_vls); 3186 3187 if (response_data_size > sizeof(pmp->data)) { 3188 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3189 return reply((struct ib_mad_hdr *)pmp); 3190 } 3191 /* 3192 * The bit set in the mask needs to be consistent with the 3193 * port the request came in on. 3194 */ 3195 port_mask = be64_to_cpu(req->port_select_mask[3]); 3196 port_num = find_first_bit((unsigned long *)&port_mask, 3197 sizeof(port_mask) * 8); 3198 3199 if (port_num != port) { 3200 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3201 return reply((struct ib_mad_hdr *)pmp); 3202 } 3203 3204 rsp = &req->port[0]; 3205 3206 ibp = to_iport(ibdev, port_num); 3207 ppd = ppd_from_ibp(ibp); 3208 3209 memset(rsp, 0, sizeof(*rsp)); 3210 rsp->port_number = port_num; 3211 3212 pma_get_opa_port_ectrs(ibdev, rsp, port_num); 3213 3214 rsp->port_rcv_remote_physical_errors = 3215 cpu_to_be64(read_dev_cntr(dd, C_DC_RMT_PHY_ERR, 3216 CNTR_INVALID_VL)); 3217 rsp->fm_config_errors = 3218 cpu_to_be64(read_dev_cntr(dd, C_DC_FM_CFG_ERR, 3219 CNTR_INVALID_VL)); 3220 tmp = read_dev_cntr(dd, C_DC_UNC_ERR, CNTR_INVALID_VL); 3221 3222 rsp->uncorrectable_errors = tmp < 0x100 ? (tmp & 0xff) : 0xff; 3223 rsp->port_rcv_errors = 3224 cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_ERR, CNTR_INVALID_VL)); 3225 vlinfo = &rsp->vls[0]; 3226 vfi = 0; 3227 vl_select_mask = be32_to_cpu(req->vl_select_mask); 3228 for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 3229 memset(vlinfo, 0, sizeof(*vlinfo)); 3230 rsp->vls[vfi].port_vl_xmit_discards = 3231 cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD_VL, 3232 idx_from_vl(vl))); 3233 vlinfo += 1; 3234 vfi++; 3235 } 3236 3237 if (resp_len) 3238 *resp_len += response_data_size; 3239 3240 return reply((struct ib_mad_hdr *)pmp); 3241} 3242 3243static int pma_get_ib_portcounters(struct ib_pma_mad *pmp, 3244 struct ib_device *ibdev, u32 port) 3245{ 3246 struct ib_pma_portcounters *p = (struct ib_pma_portcounters *) 3247 pmp->data; 3248 struct _port_ectrs rsp; 3249 u64 temp_link_overrun_errors; 3250 u64 temp_64; 3251 u32 temp_32; 3252 3253 memset(&rsp, 0, sizeof(rsp)); 3254 pma_get_opa_port_ectrs(ibdev, &rsp, port); 3255 3256 if (pmp->mad_hdr.attr_mod != 0 || p->port_select != port) { 3257 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3258 goto bail; 3259 } 3260 3261 p->symbol_error_counter = 0; /* N/A for OPA */ 3262 3263 temp_32 = be32_to_cpu(rsp.link_error_recovery); 3264 if (temp_32 > 0xFFUL) 3265 p->link_error_recovery_counter = 0xFF; 3266 else 3267 p->link_error_recovery_counter = (u8)temp_32; 3268 3269 temp_32 = be32_to_cpu(rsp.link_downed); 3270 if (temp_32 > 0xFFUL) 3271 p->link_downed_counter = 0xFF; 3272 else 3273 p->link_downed_counter = (u8)temp_32; 3274 3275 temp_64 = be64_to_cpu(rsp.port_rcv_errors); 3276 if (temp_64 > 0xFFFFUL) 3277 p->port_rcv_errors = cpu_to_be16(0xFFFF); 3278 else 3279 p->port_rcv_errors = cpu_to_be16((u16)temp_64); 3280 3281 temp_64 = be64_to_cpu(rsp.port_rcv_remote_physical_errors); 3282 if (temp_64 > 0xFFFFUL) 3283 p->port_rcv_remphys_errors = cpu_to_be16(0xFFFF); 3284 else 3285 p->port_rcv_remphys_errors = cpu_to_be16((u16)temp_64); 3286 3287 temp_64 = be64_to_cpu(rsp.port_rcv_switch_relay_errors); 3288 p->port_rcv_switch_relay_errors = cpu_to_be16((u16)temp_64); 3289 3290 temp_64 = be64_to_cpu(rsp.port_xmit_discards); 3291 if (temp_64 > 0xFFFFUL) 3292 p->port_xmit_discards = cpu_to_be16(0xFFFF); 3293 else 3294 p->port_xmit_discards = cpu_to_be16((u16)temp_64); 3295 3296 temp_64 = be64_to_cpu(rsp.port_xmit_constraint_errors); 3297 if (temp_64 > 0xFFUL) 3298 p->port_xmit_constraint_errors = 0xFF; 3299 else 3300 p->port_xmit_constraint_errors = (u8)temp_64; 3301 3302 temp_64 = be64_to_cpu(rsp.port_rcv_constraint_errors); 3303 if (temp_64 > 0xFFUL) 3304 p->port_rcv_constraint_errors = 0xFFUL; 3305 else 3306 p->port_rcv_constraint_errors = (u8)temp_64; 3307 3308 /* LocalLink: 7:4, BufferOverrun: 3:0 */ 3309 temp_64 = be64_to_cpu(rsp.local_link_integrity_errors); 3310 if (temp_64 > 0xFUL) 3311 temp_64 = 0xFUL; 3312 3313 temp_link_overrun_errors = temp_64 << 4; 3314 3315 temp_64 = be64_to_cpu(rsp.excessive_buffer_overruns); 3316 if (temp_64 > 0xFUL) 3317 temp_64 = 0xFUL; 3318 temp_link_overrun_errors |= temp_64; 3319 3320 p->link_overrun_errors = (u8)temp_link_overrun_errors; 3321 3322 p->vl15_dropped = 0; /* N/A for OPA */ 3323 3324bail: 3325 return reply((struct ib_mad_hdr *)pmp); 3326} 3327 3328static int pma_get_opa_errorinfo(struct opa_pma_mad *pmp, 3329 struct ib_device *ibdev, 3330 u32 port, u32 *resp_len) 3331{ 3332 size_t response_data_size; 3333 struct _port_ei *rsp; 3334 struct opa_port_error_info_msg *req; 3335 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 3336 u64 port_mask; 3337 u32 num_ports; 3338 u32 port_num; 3339 u8 num_pslm; 3340 u64 reg; 3341 3342 req = (struct opa_port_error_info_msg *)pmp->data; 3343 rsp = &req->port[0]; 3344 3345 num_ports = OPA_AM_NPORT(be32_to_cpu(pmp->mad_hdr.attr_mod)); 3346 num_pslm = hweight64(be64_to_cpu(req->port_select_mask[3])); 3347 3348 memset(rsp, 0, sizeof(*rsp)); 3349 3350 if (num_ports != 1 || num_ports != num_pslm) { 3351 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3352 return reply((struct ib_mad_hdr *)pmp); 3353 } 3354 3355 /* Sanity check */ 3356 response_data_size = sizeof(struct opa_port_error_info_msg); 3357 3358 if (response_data_size > sizeof(pmp->data)) { 3359 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3360 return reply((struct ib_mad_hdr *)pmp); 3361 } 3362 3363 /* 3364 * The bit set in the mask needs to be consistent with the port 3365 * the request came in on. 3366 */ 3367 port_mask = be64_to_cpu(req->port_select_mask[3]); 3368 port_num = find_first_bit((unsigned long *)&port_mask, 3369 sizeof(port_mask) * 8); 3370 3371 if (port_num != port) { 3372 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3373 return reply((struct ib_mad_hdr *)pmp); 3374 } 3375 rsp->port_number = port; 3376 3377 /* PortRcvErrorInfo */ 3378 rsp->port_rcv_ei.status_and_code = 3379 dd->err_info_rcvport.status_and_code; 3380 memcpy(&rsp->port_rcv_ei.ei.ei1to12.packet_flit1, 3381 &dd->err_info_rcvport.packet_flit1, sizeof(u64)); 3382 memcpy(&rsp->port_rcv_ei.ei.ei1to12.packet_flit2, 3383 &dd->err_info_rcvport.packet_flit2, sizeof(u64)); 3384 3385 /* ExcessiverBufferOverrunInfo */ 3386 reg = read_csr(dd, RCV_ERR_INFO); 3387 if (reg & RCV_ERR_INFO_RCV_EXCESS_BUFFER_OVERRUN_SMASK) { 3388 /* 3389 * if the RcvExcessBufferOverrun bit is set, save SC of 3390 * first pkt that encountered an excess buffer overrun 3391 */ 3392 u8 tmp = (u8)reg; 3393 3394 tmp &= RCV_ERR_INFO_RCV_EXCESS_BUFFER_OVERRUN_SC_SMASK; 3395 tmp <<= 2; 3396 rsp->excessive_buffer_overrun_ei.status_and_sc = tmp; 3397 /* set the status bit */ 3398 rsp->excessive_buffer_overrun_ei.status_and_sc |= 0x80; 3399 } 3400 3401 rsp->port_xmit_constraint_ei.status = 3402 dd->err_info_xmit_constraint.status; 3403 rsp->port_xmit_constraint_ei.pkey = 3404 cpu_to_be16(dd->err_info_xmit_constraint.pkey); 3405 rsp->port_xmit_constraint_ei.slid = 3406 cpu_to_be32(dd->err_info_xmit_constraint.slid); 3407 3408 rsp->port_rcv_constraint_ei.status = 3409 dd->err_info_rcv_constraint.status; 3410 rsp->port_rcv_constraint_ei.pkey = 3411 cpu_to_be16(dd->err_info_rcv_constraint.pkey); 3412 rsp->port_rcv_constraint_ei.slid = 3413 cpu_to_be32(dd->err_info_rcv_constraint.slid); 3414 3415 /* UncorrectableErrorInfo */ 3416 rsp->uncorrectable_ei.status_and_code = dd->err_info_uncorrectable; 3417 3418 /* FMConfigErrorInfo */ 3419 rsp->fm_config_ei.status_and_code = dd->err_info_fmconfig; 3420 3421 if (resp_len) 3422 *resp_len += response_data_size; 3423 3424 return reply((struct ib_mad_hdr *)pmp); 3425} 3426 3427static int pma_set_opa_portstatus(struct opa_pma_mad *pmp, 3428 struct ib_device *ibdev, 3429 u32 port, u32 *resp_len) 3430{ 3431 struct opa_clear_port_status *req = 3432 (struct opa_clear_port_status *)pmp->data; 3433 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 3434 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3435 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3436 u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; 3437 u64 portn = be64_to_cpu(req->port_select_mask[3]); 3438 u32 counter_select = be32_to_cpu(req->counter_select_mask); 3439 unsigned long vl_select_mask = VL_MASK_ALL; /* clear all per-vl cnts */ 3440 unsigned long vl; 3441 3442 if ((nports != 1) || (portn != 1 << port)) { 3443 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3444 return reply((struct ib_mad_hdr *)pmp); 3445 } 3446 /* 3447 * only counters returned by pma_get_opa_portstatus() are 3448 * handled, so when pma_get_opa_portstatus() gets a fix, 3449 * the corresponding change should be made here as well. 3450 */ 3451 3452 if (counter_select & CS_PORT_XMIT_DATA) 3453 write_dev_cntr(dd, C_DC_XMIT_FLITS, CNTR_INVALID_VL, 0); 3454 3455 if (counter_select & CS_PORT_RCV_DATA) 3456 write_dev_cntr(dd, C_DC_RCV_FLITS, CNTR_INVALID_VL, 0); 3457 3458 if (counter_select & CS_PORT_XMIT_PKTS) 3459 write_dev_cntr(dd, C_DC_XMIT_PKTS, CNTR_INVALID_VL, 0); 3460 3461 if (counter_select & CS_PORT_RCV_PKTS) 3462 write_dev_cntr(dd, C_DC_RCV_PKTS, CNTR_INVALID_VL, 0); 3463 3464 if (counter_select & CS_PORT_MCAST_XMIT_PKTS) 3465 write_dev_cntr(dd, C_DC_MC_XMIT_PKTS, CNTR_INVALID_VL, 0); 3466 3467 if (counter_select & CS_PORT_MCAST_RCV_PKTS) 3468 write_dev_cntr(dd, C_DC_MC_RCV_PKTS, CNTR_INVALID_VL, 0); 3469 3470 if (counter_select & CS_PORT_XMIT_WAIT) { 3471 write_port_cntr(ppd, C_TX_WAIT, CNTR_INVALID_VL, 0); 3472 ppd->port_vl_xmit_wait_last[C_VL_COUNT] = 0; 3473 ppd->vl_xmit_flit_cnt[C_VL_COUNT] = 0; 3474 } 3475 /* ignore cs_sw_portCongestion for HFIs */ 3476 3477 if (counter_select & CS_PORT_RCV_FECN) 3478 write_dev_cntr(dd, C_DC_RCV_FCN, CNTR_INVALID_VL, 0); 3479 3480 if (counter_select & CS_PORT_RCV_BECN) 3481 write_dev_cntr(dd, C_DC_RCV_BCN, CNTR_INVALID_VL, 0); 3482 3483 /* ignore cs_port_xmit_time_cong for HFIs */ 3484 /* ignore cs_port_xmit_wasted_bw for now */ 3485 /* ignore cs_port_xmit_wait_data for now */ 3486 if (counter_select & CS_PORT_RCV_BUBBLE) 3487 write_dev_cntr(dd, C_DC_RCV_BBL, CNTR_INVALID_VL, 0); 3488 3489 /* Only applicable for switch */ 3490 /* if (counter_select & CS_PORT_MARK_FECN) 3491 * write_csr(dd, DCC_PRF_PORT_MARK_FECN_CNT, 0); 3492 */ 3493 3494 if (counter_select & CS_PORT_RCV_CONSTRAINT_ERRORS) 3495 write_port_cntr(ppd, C_SW_RCV_CSTR_ERR, CNTR_INVALID_VL, 0); 3496 3497 /* ignore cs_port_rcv_switch_relay_errors for HFIs */ 3498 if (counter_select & CS_PORT_XMIT_DISCARDS) 3499 write_port_cntr(ppd, C_SW_XMIT_DSCD, CNTR_INVALID_VL, 0); 3500 3501 if (counter_select & CS_PORT_XMIT_CONSTRAINT_ERRORS) 3502 write_port_cntr(ppd, C_SW_XMIT_CSTR_ERR, CNTR_INVALID_VL, 0); 3503 3504 if (counter_select & CS_PORT_RCV_REMOTE_PHYSICAL_ERRORS) 3505 write_dev_cntr(dd, C_DC_RMT_PHY_ERR, CNTR_INVALID_VL, 0); 3506 3507 if (counter_select & CS_LOCAL_LINK_INTEGRITY_ERRORS) 3508 write_dev_cntr(dd, C_DC_RX_REPLAY, CNTR_INVALID_VL, 0); 3509 3510 if (counter_select & CS_LINK_ERROR_RECOVERY) { 3511 write_dev_cntr(dd, C_DC_SEQ_CRC_CNT, CNTR_INVALID_VL, 0); 3512 write_dev_cntr(dd, C_DC_REINIT_FROM_PEER_CNT, 3513 CNTR_INVALID_VL, 0); 3514 } 3515 3516 if (counter_select & CS_PORT_RCV_ERRORS) 3517 write_dev_cntr(dd, C_DC_RCV_ERR, CNTR_INVALID_VL, 0); 3518 3519 if (counter_select & CS_EXCESSIVE_BUFFER_OVERRUNS) { 3520 write_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL, 0); 3521 dd->rcv_ovfl_cnt = 0; 3522 } 3523 3524 if (counter_select & CS_FM_CONFIG_ERRORS) 3525 write_dev_cntr(dd, C_DC_FM_CFG_ERR, CNTR_INVALID_VL, 0); 3526 3527 if (counter_select & CS_LINK_DOWNED) 3528 write_port_cntr(ppd, C_SW_LINK_DOWN, CNTR_INVALID_VL, 0); 3529 3530 if (counter_select & CS_UNCORRECTABLE_ERRORS) 3531 write_dev_cntr(dd, C_DC_UNC_ERR, CNTR_INVALID_VL, 0); 3532 3533 for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 3534 if (counter_select & CS_PORT_XMIT_DATA) 3535 write_port_cntr(ppd, C_TX_FLIT_VL, idx_from_vl(vl), 0); 3536 3537 if (counter_select & CS_PORT_RCV_DATA) 3538 write_dev_cntr(dd, C_DC_RX_FLIT_VL, idx_from_vl(vl), 0); 3539 3540 if (counter_select & CS_PORT_XMIT_PKTS) 3541 write_port_cntr(ppd, C_TX_PKT_VL, idx_from_vl(vl), 0); 3542 3543 if (counter_select & CS_PORT_RCV_PKTS) 3544 write_dev_cntr(dd, C_DC_RX_PKT_VL, idx_from_vl(vl), 0); 3545 3546 if (counter_select & CS_PORT_XMIT_WAIT) { 3547 write_port_cntr(ppd, C_TX_WAIT_VL, idx_from_vl(vl), 0); 3548 ppd->port_vl_xmit_wait_last[idx_from_vl(vl)] = 0; 3549 ppd->vl_xmit_flit_cnt[idx_from_vl(vl)] = 0; 3550 } 3551 3552 /* sw_port_vl_congestion is 0 for HFIs */ 3553 if (counter_select & CS_PORT_RCV_FECN) 3554 write_dev_cntr(dd, C_DC_RCV_FCN_VL, idx_from_vl(vl), 0); 3555 3556 if (counter_select & CS_PORT_RCV_BECN) 3557 write_dev_cntr(dd, C_DC_RCV_BCN_VL, idx_from_vl(vl), 0); 3558 3559 /* port_vl_xmit_time_cong is 0 for HFIs */ 3560 /* port_vl_xmit_wasted_bw ??? */ 3561 /* port_vl_xmit_wait_data - TXE (table 13-9 HFI spec) ??? */ 3562 if (counter_select & CS_PORT_RCV_BUBBLE) 3563 write_dev_cntr(dd, C_DC_RCV_BBL_VL, idx_from_vl(vl), 0); 3564 3565 /* if (counter_select & CS_PORT_MARK_FECN) 3566 * write_csr(dd, DCC_PRF_PORT_VL_MARK_FECN_CNT + offset, 0); 3567 */ 3568 if (counter_select & C_SW_XMIT_DSCD_VL) 3569 write_port_cntr(ppd, C_SW_XMIT_DSCD_VL, 3570 idx_from_vl(vl), 0); 3571 } 3572 3573 if (resp_len) 3574 *resp_len += sizeof(*req); 3575 3576 return reply((struct ib_mad_hdr *)pmp); 3577} 3578 3579static int pma_set_opa_errorinfo(struct opa_pma_mad *pmp, 3580 struct ib_device *ibdev, 3581 u32 port, u32 *resp_len) 3582{ 3583 struct _port_ei *rsp; 3584 struct opa_port_error_info_msg *req; 3585 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 3586 u64 port_mask; 3587 u32 num_ports; 3588 u32 port_num; 3589 u8 num_pslm; 3590 u32 error_info_select; 3591 3592 req = (struct opa_port_error_info_msg *)pmp->data; 3593 rsp = &req->port[0]; 3594 3595 num_ports = OPA_AM_NPORT(be32_to_cpu(pmp->mad_hdr.attr_mod)); 3596 num_pslm = hweight64(be64_to_cpu(req->port_select_mask[3])); 3597 3598 memset(rsp, 0, sizeof(*rsp)); 3599 3600 if (num_ports != 1 || num_ports != num_pslm) { 3601 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3602 return reply((struct ib_mad_hdr *)pmp); 3603 } 3604 3605 /* 3606 * The bit set in the mask needs to be consistent with the port 3607 * the request came in on. 3608 */ 3609 port_mask = be64_to_cpu(req->port_select_mask[3]); 3610 port_num = find_first_bit((unsigned long *)&port_mask, 3611 sizeof(port_mask) * 8); 3612 3613 if (port_num != port) { 3614 pmp->mad_hdr.status |= IB_SMP_INVALID_FIELD; 3615 return reply((struct ib_mad_hdr *)pmp); 3616 } 3617 3618 error_info_select = be32_to_cpu(req->error_info_select_mask); 3619 3620 /* PortRcvErrorInfo */ 3621 if (error_info_select & ES_PORT_RCV_ERROR_INFO) 3622 /* turn off status bit */ 3623 dd->err_info_rcvport.status_and_code &= ~OPA_EI_STATUS_SMASK; 3624 3625 /* ExcessiverBufferOverrunInfo */ 3626 if (error_info_select & ES_EXCESSIVE_BUFFER_OVERRUN_INFO) 3627 /* 3628 * status bit is essentially kept in the h/w - bit 5 of 3629 * RCV_ERR_INFO 3630 */ 3631 write_csr(dd, RCV_ERR_INFO, 3632 RCV_ERR_INFO_RCV_EXCESS_BUFFER_OVERRUN_SMASK); 3633 3634 if (error_info_select & ES_PORT_XMIT_CONSTRAINT_ERROR_INFO) 3635 dd->err_info_xmit_constraint.status &= ~OPA_EI_STATUS_SMASK; 3636 3637 if (error_info_select & ES_PORT_RCV_CONSTRAINT_ERROR_INFO) 3638 dd->err_info_rcv_constraint.status &= ~OPA_EI_STATUS_SMASK; 3639 3640 /* UncorrectableErrorInfo */ 3641 if (error_info_select & ES_UNCORRECTABLE_ERROR_INFO) 3642 /* turn off status bit */ 3643 dd->err_info_uncorrectable &= ~OPA_EI_STATUS_SMASK; 3644 3645 /* FMConfigErrorInfo */ 3646 if (error_info_select & ES_FM_CONFIG_ERROR_INFO) 3647 /* turn off status bit */ 3648 dd->err_info_fmconfig &= ~OPA_EI_STATUS_SMASK; 3649 3650 if (resp_len) 3651 *resp_len += sizeof(*req); 3652 3653 return reply((struct ib_mad_hdr *)pmp); 3654} 3655 3656struct opa_congestion_info_attr { 3657 __be16 congestion_info; 3658 u8 control_table_cap; /* Multiple of 64 entry unit CCTs */ 3659 u8 congestion_log_length; 3660} __packed; 3661 3662static int __subn_get_opa_cong_info(struct opa_smp *smp, u32 am, u8 *data, 3663 struct ib_device *ibdev, u32 port, 3664 u32 *resp_len, u32 max_len) 3665{ 3666 struct opa_congestion_info_attr *p = 3667 (struct opa_congestion_info_attr *)data; 3668 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3669 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3670 3671 if (smp_length_check(sizeof(*p), max_len)) { 3672 smp->status |= IB_SMP_INVALID_FIELD; 3673 return reply((struct ib_mad_hdr *)smp); 3674 } 3675 3676 p->congestion_info = 0; 3677 p->control_table_cap = ppd->cc_max_table_entries; 3678 p->congestion_log_length = OPA_CONG_LOG_ELEMS; 3679 3680 if (resp_len) 3681 *resp_len += sizeof(*p); 3682 3683 return reply((struct ib_mad_hdr *)smp); 3684} 3685 3686static int __subn_get_opa_cong_setting(struct opa_smp *smp, u32 am, 3687 u8 *data, struct ib_device *ibdev, 3688 u32 port, u32 *resp_len, u32 max_len) 3689{ 3690 int i; 3691 struct opa_congestion_setting_attr *p = 3692 (struct opa_congestion_setting_attr *)data; 3693 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3694 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3695 struct opa_congestion_setting_entry_shadow *entries; 3696 struct cc_state *cc_state; 3697 3698 if (smp_length_check(sizeof(*p), max_len)) { 3699 smp->status |= IB_SMP_INVALID_FIELD; 3700 return reply((struct ib_mad_hdr *)smp); 3701 } 3702 3703 rcu_read_lock(); 3704 3705 cc_state = get_cc_state(ppd); 3706 3707 if (!cc_state) { 3708 rcu_read_unlock(); 3709 return reply((struct ib_mad_hdr *)smp); 3710 } 3711 3712 entries = cc_state->cong_setting.entries; 3713 p->port_control = cpu_to_be16(cc_state->cong_setting.port_control); 3714 p->control_map = cpu_to_be32(cc_state->cong_setting.control_map); 3715 for (i = 0; i < OPA_MAX_SLS; i++) { 3716 p->entries[i].ccti_increase = entries[i].ccti_increase; 3717 p->entries[i].ccti_timer = cpu_to_be16(entries[i].ccti_timer); 3718 p->entries[i].trigger_threshold = 3719 entries[i].trigger_threshold; 3720 p->entries[i].ccti_min = entries[i].ccti_min; 3721 } 3722 3723 rcu_read_unlock(); 3724 3725 if (resp_len) 3726 *resp_len += sizeof(*p); 3727 3728 return reply((struct ib_mad_hdr *)smp); 3729} 3730 3731/* 3732 * Apply congestion control information stored in the ppd to the 3733 * active structure. 3734 */ 3735static void apply_cc_state(struct hfi1_pportdata *ppd) 3736{ 3737 struct cc_state *old_cc_state, *new_cc_state; 3738 3739 new_cc_state = kzalloc(sizeof(*new_cc_state), GFP_KERNEL); 3740 if (!new_cc_state) 3741 return; 3742 3743 /* 3744 * Hold the lock for updating *and* to prevent ppd information 3745 * from changing during the update. 3746 */ 3747 spin_lock(&ppd->cc_state_lock); 3748 3749 old_cc_state = get_cc_state_protected(ppd); 3750 if (!old_cc_state) { 3751 /* never active, or shutting down */ 3752 spin_unlock(&ppd->cc_state_lock); 3753 kfree(new_cc_state); 3754 return; 3755 } 3756 3757 *new_cc_state = *old_cc_state; 3758 3759 if (ppd->total_cct_entry) 3760 new_cc_state->cct.ccti_limit = ppd->total_cct_entry - 1; 3761 else 3762 new_cc_state->cct.ccti_limit = 0; 3763 3764 memcpy(new_cc_state->cct.entries, ppd->ccti_entries, 3765 ppd->total_cct_entry * sizeof(struct ib_cc_table_entry)); 3766 3767 new_cc_state->cong_setting.port_control = IB_CC_CCS_PC_SL_BASED; 3768 new_cc_state->cong_setting.control_map = ppd->cc_sl_control_map; 3769 memcpy(new_cc_state->cong_setting.entries, ppd->congestion_entries, 3770 OPA_MAX_SLS * sizeof(struct opa_congestion_setting_entry)); 3771 3772 rcu_assign_pointer(ppd->cc_state, new_cc_state); 3773 3774 spin_unlock(&ppd->cc_state_lock); 3775 3776 kfree_rcu(old_cc_state, rcu); 3777} 3778 3779static int __subn_set_opa_cong_setting(struct opa_smp *smp, u32 am, u8 *data, 3780 struct ib_device *ibdev, u32 port, 3781 u32 *resp_len, u32 max_len) 3782{ 3783 struct opa_congestion_setting_attr *p = 3784 (struct opa_congestion_setting_attr *)data; 3785 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3786 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3787 struct opa_congestion_setting_entry_shadow *entries; 3788 int i; 3789 3790 if (smp_length_check(sizeof(*p), max_len)) { 3791 smp->status |= IB_SMP_INVALID_FIELD; 3792 return reply((struct ib_mad_hdr *)smp); 3793 } 3794 3795 /* 3796 * Save details from packet into the ppd. Hold the cc_state_lock so 3797 * our information is consistent with anyone trying to apply the state. 3798 */ 3799 spin_lock(&ppd->cc_state_lock); 3800 ppd->cc_sl_control_map = be32_to_cpu(p->control_map); 3801 3802 entries = ppd->congestion_entries; 3803 for (i = 0; i < OPA_MAX_SLS; i++) { 3804 entries[i].ccti_increase = p->entries[i].ccti_increase; 3805 entries[i].ccti_timer = be16_to_cpu(p->entries[i].ccti_timer); 3806 entries[i].trigger_threshold = 3807 p->entries[i].trigger_threshold; 3808 entries[i].ccti_min = p->entries[i].ccti_min; 3809 } 3810 spin_unlock(&ppd->cc_state_lock); 3811 3812 /* now apply the information */ 3813 apply_cc_state(ppd); 3814 3815 return __subn_get_opa_cong_setting(smp, am, data, ibdev, port, 3816 resp_len, max_len); 3817} 3818 3819static int __subn_get_opa_hfi1_cong_log(struct opa_smp *smp, u32 am, 3820 u8 *data, struct ib_device *ibdev, 3821 u32 port, u32 *resp_len, u32 max_len) 3822{ 3823 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3824 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3825 struct opa_hfi1_cong_log *cong_log = (struct opa_hfi1_cong_log *)data; 3826 u64 ts; 3827 int i; 3828 3829 if (am || smp_length_check(sizeof(*cong_log), max_len)) { 3830 smp->status |= IB_SMP_INVALID_FIELD; 3831 return reply((struct ib_mad_hdr *)smp); 3832 } 3833 3834 spin_lock_irq(&ppd->cc_log_lock); 3835 3836 cong_log->log_type = OPA_CC_LOG_TYPE_HFI; 3837 cong_log->congestion_flags = 0; 3838 cong_log->threshold_event_counter = 3839 cpu_to_be16(ppd->threshold_event_counter); 3840 memcpy(cong_log->threshold_cong_event_map, 3841 ppd->threshold_cong_event_map, 3842 sizeof(cong_log->threshold_cong_event_map)); 3843 /* keep timestamp in units of 1.024 usec */ 3844 ts = ktime_get_ns() / 1024; 3845 cong_log->current_time_stamp = cpu_to_be32(ts); 3846 for (i = 0; i < OPA_CONG_LOG_ELEMS; i++) { 3847 struct opa_hfi1_cong_log_event_internal *cce = 3848 &ppd->cc_events[ppd->cc_mad_idx++]; 3849 if (ppd->cc_mad_idx == OPA_CONG_LOG_ELEMS) 3850 ppd->cc_mad_idx = 0; 3851 /* 3852 * Entries which are older than twice the time 3853 * required to wrap the counter are supposed to 3854 * be zeroed (CA10-49 IBTA, release 1.2.1, V1). 3855 */ 3856 if ((ts - cce->timestamp) / 2 > U32_MAX) 3857 continue; 3858 memcpy(cong_log->events[i].local_qp_cn_entry, &cce->lqpn, 3); 3859 memcpy(cong_log->events[i].remote_qp_number_cn_entry, 3860 &cce->rqpn, 3); 3861 cong_log->events[i].sl_svc_type_cn_entry = 3862 ((cce->sl & 0x1f) << 3) | (cce->svc_type & 0x7); 3863 cong_log->events[i].remote_lid_cn_entry = 3864 cpu_to_be32(cce->rlid); 3865 cong_log->events[i].timestamp_cn_entry = 3866 cpu_to_be32(cce->timestamp); 3867 } 3868 3869 /* 3870 * Reset threshold_cong_event_map, and threshold_event_counter 3871 * to 0 when log is read. 3872 */ 3873 memset(ppd->threshold_cong_event_map, 0x0, 3874 sizeof(ppd->threshold_cong_event_map)); 3875 ppd->threshold_event_counter = 0; 3876 3877 spin_unlock_irq(&ppd->cc_log_lock); 3878 3879 if (resp_len) 3880 *resp_len += sizeof(struct opa_hfi1_cong_log); 3881 3882 return reply((struct ib_mad_hdr *)smp); 3883} 3884 3885static int __subn_get_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data, 3886 struct ib_device *ibdev, u32 port, 3887 u32 *resp_len, u32 max_len) 3888{ 3889 struct ib_cc_table_attr *cc_table_attr = 3890 (struct ib_cc_table_attr *)data; 3891 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3892 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3893 u32 start_block = OPA_AM_START_BLK(am); 3894 u32 n_blocks = OPA_AM_NBLK(am); 3895 struct ib_cc_table_entry_shadow *entries; 3896 int i, j; 3897 u32 sentry, eentry; 3898 struct cc_state *cc_state; 3899 u32 size = sizeof(u16) * (IB_CCT_ENTRIES * n_blocks + 1); 3900 3901 /* sanity check n_blocks, start_block */ 3902 if (n_blocks == 0 || smp_length_check(size, max_len) || 3903 start_block + n_blocks > ppd->cc_max_table_entries) { 3904 smp->status |= IB_SMP_INVALID_FIELD; 3905 return reply((struct ib_mad_hdr *)smp); 3906 } 3907 3908 rcu_read_lock(); 3909 3910 cc_state = get_cc_state(ppd); 3911 3912 if (!cc_state) { 3913 rcu_read_unlock(); 3914 return reply((struct ib_mad_hdr *)smp); 3915 } 3916 3917 sentry = start_block * IB_CCT_ENTRIES; 3918 eentry = sentry + (IB_CCT_ENTRIES * n_blocks); 3919 3920 cc_table_attr->ccti_limit = cpu_to_be16(cc_state->cct.ccti_limit); 3921 3922 entries = cc_state->cct.entries; 3923 3924 /* return n_blocks, though the last block may not be full */ 3925 for (j = 0, i = sentry; i < eentry; j++, i++) 3926 cc_table_attr->ccti_entries[j].entry = 3927 cpu_to_be16(entries[i].entry); 3928 3929 rcu_read_unlock(); 3930 3931 if (resp_len) 3932 *resp_len += size; 3933 3934 return reply((struct ib_mad_hdr *)smp); 3935} 3936 3937static int __subn_set_opa_cc_table(struct opa_smp *smp, u32 am, u8 *data, 3938 struct ib_device *ibdev, u32 port, 3939 u32 *resp_len, u32 max_len) 3940{ 3941 struct ib_cc_table_attr *p = (struct ib_cc_table_attr *)data; 3942 struct hfi1_ibport *ibp = to_iport(ibdev, port); 3943 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 3944 u32 start_block = OPA_AM_START_BLK(am); 3945 u32 n_blocks = OPA_AM_NBLK(am); 3946 struct ib_cc_table_entry_shadow *entries; 3947 int i, j; 3948 u32 sentry, eentry; 3949 u16 ccti_limit; 3950 u32 size = sizeof(u16) * (IB_CCT_ENTRIES * n_blocks + 1); 3951 3952 /* sanity check n_blocks, start_block */ 3953 if (n_blocks == 0 || smp_length_check(size, max_len) || 3954 start_block + n_blocks > ppd->cc_max_table_entries) { 3955 smp->status |= IB_SMP_INVALID_FIELD; 3956 return reply((struct ib_mad_hdr *)smp); 3957 } 3958 3959 sentry = start_block * IB_CCT_ENTRIES; 3960 eentry = sentry + ((n_blocks - 1) * IB_CCT_ENTRIES) + 3961 (be16_to_cpu(p->ccti_limit)) % IB_CCT_ENTRIES + 1; 3962 3963 /* sanity check ccti_limit */ 3964 ccti_limit = be16_to_cpu(p->ccti_limit); 3965 if (ccti_limit + 1 > eentry) { 3966 smp->status |= IB_SMP_INVALID_FIELD; 3967 return reply((struct ib_mad_hdr *)smp); 3968 } 3969 3970 /* 3971 * Save details from packet into the ppd. Hold the cc_state_lock so 3972 * our information is consistent with anyone trying to apply the state. 3973 */ 3974 spin_lock(&ppd->cc_state_lock); 3975 ppd->total_cct_entry = ccti_limit + 1; 3976 entries = ppd->ccti_entries; 3977 for (j = 0, i = sentry; i < eentry; j++, i++) 3978 entries[i].entry = be16_to_cpu(p->ccti_entries[j].entry); 3979 spin_unlock(&ppd->cc_state_lock); 3980 3981 /* now apply the information */ 3982 apply_cc_state(ppd); 3983 3984 return __subn_get_opa_cc_table(smp, am, data, ibdev, port, resp_len, 3985 max_len); 3986} 3987 3988struct opa_led_info { 3989 __be32 rsvd_led_mask; 3990 __be32 rsvd; 3991}; 3992 3993#define OPA_LED_SHIFT 31 3994#define OPA_LED_MASK BIT(OPA_LED_SHIFT) 3995 3996static int __subn_get_opa_led_info(struct opa_smp *smp, u32 am, u8 *data, 3997 struct ib_device *ibdev, u32 port, 3998 u32 *resp_len, u32 max_len) 3999{ 4000 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 4001 struct hfi1_pportdata *ppd = dd->pport; 4002 struct opa_led_info *p = (struct opa_led_info *)data; 4003 u32 nport = OPA_AM_NPORT(am); 4004 u32 is_beaconing_active; 4005 4006 if (nport != 1 || smp_length_check(sizeof(*p), max_len)) { 4007 smp->status |= IB_SMP_INVALID_FIELD; 4008 return reply((struct ib_mad_hdr *)smp); 4009 } 4010 4011 /* 4012 * This pairs with the memory barrier in hfi1_start_led_override to 4013 * ensure that we read the correct state of LED beaconing represented 4014 * by led_override_timer_active 4015 */ 4016 smp_rmb(); 4017 is_beaconing_active = !!atomic_read(&ppd->led_override_timer_active); 4018 p->rsvd_led_mask = cpu_to_be32(is_beaconing_active << OPA_LED_SHIFT); 4019 4020 if (resp_len) 4021 *resp_len += sizeof(struct opa_led_info); 4022 4023 return reply((struct ib_mad_hdr *)smp); 4024} 4025 4026static int __subn_set_opa_led_info(struct opa_smp *smp, u32 am, u8 *data, 4027 struct ib_device *ibdev, u32 port, 4028 u32 *resp_len, u32 max_len) 4029{ 4030 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 4031 struct opa_led_info *p = (struct opa_led_info *)data; 4032 u32 nport = OPA_AM_NPORT(am); 4033 int on = !!(be32_to_cpu(p->rsvd_led_mask) & OPA_LED_MASK); 4034 4035 if (nport != 1 || smp_length_check(sizeof(*p), max_len)) { 4036 smp->status |= IB_SMP_INVALID_FIELD; 4037 return reply((struct ib_mad_hdr *)smp); 4038 } 4039 4040 if (on) 4041 hfi1_start_led_override(dd->pport, 2000, 1500); 4042 else 4043 shutdown_led_override(dd->pport); 4044 4045 return __subn_get_opa_led_info(smp, am, data, ibdev, port, resp_len, 4046 max_len); 4047} 4048 4049static int subn_get_opa_sma(__be16 attr_id, struct opa_smp *smp, u32 am, 4050 u8 *data, struct ib_device *ibdev, u32 port, 4051 u32 *resp_len, u32 max_len) 4052{ 4053 int ret; 4054 struct hfi1_ibport *ibp = to_iport(ibdev, port); 4055 4056 switch (attr_id) { 4057 case IB_SMP_ATTR_NODE_DESC: 4058 ret = __subn_get_opa_nodedesc(smp, am, data, ibdev, port, 4059 resp_len, max_len); 4060 break; 4061 case IB_SMP_ATTR_NODE_INFO: 4062 ret = __subn_get_opa_nodeinfo(smp, am, data, ibdev, port, 4063 resp_len, max_len); 4064 break; 4065 case IB_SMP_ATTR_PORT_INFO: 4066 ret = __subn_get_opa_portinfo(smp, am, data, ibdev, port, 4067 resp_len, max_len); 4068 break; 4069 case IB_SMP_ATTR_PKEY_TABLE: 4070 ret = __subn_get_opa_pkeytable(smp, am, data, ibdev, port, 4071 resp_len, max_len); 4072 break; 4073 case OPA_ATTRIB_ID_SL_TO_SC_MAP: 4074 ret = __subn_get_opa_sl_to_sc(smp, am, data, ibdev, port, 4075 resp_len, max_len); 4076 break; 4077 case OPA_ATTRIB_ID_SC_TO_SL_MAP: 4078 ret = __subn_get_opa_sc_to_sl(smp, am, data, ibdev, port, 4079 resp_len, max_len); 4080 break; 4081 case OPA_ATTRIB_ID_SC_TO_VLT_MAP: 4082 ret = __subn_get_opa_sc_to_vlt(smp, am, data, ibdev, port, 4083 resp_len, max_len); 4084 break; 4085 case OPA_ATTRIB_ID_SC_TO_VLNT_MAP: 4086 ret = __subn_get_opa_sc_to_vlnt(smp, am, data, ibdev, port, 4087 resp_len, max_len); 4088 break; 4089 case OPA_ATTRIB_ID_PORT_STATE_INFO: 4090 ret = __subn_get_opa_psi(smp, am, data, ibdev, port, 4091 resp_len, max_len); 4092 break; 4093 case OPA_ATTRIB_ID_BUFFER_CONTROL_TABLE: 4094 ret = __subn_get_opa_bct(smp, am, data, ibdev, port, 4095 resp_len, max_len); 4096 break; 4097 case OPA_ATTRIB_ID_CABLE_INFO: 4098 ret = __subn_get_opa_cable_info(smp, am, data, ibdev, port, 4099 resp_len, max_len); 4100 break; 4101 case IB_SMP_ATTR_VL_ARB_TABLE: 4102 ret = __subn_get_opa_vl_arb(smp, am, data, ibdev, port, 4103 resp_len, max_len); 4104 break; 4105 case OPA_ATTRIB_ID_CONGESTION_INFO: 4106 ret = __subn_get_opa_cong_info(smp, am, data, ibdev, port, 4107 resp_len, max_len); 4108 break; 4109 case OPA_ATTRIB_ID_HFI_CONGESTION_SETTING: 4110 ret = __subn_get_opa_cong_setting(smp, am, data, ibdev, 4111 port, resp_len, max_len); 4112 break; 4113 case OPA_ATTRIB_ID_HFI_CONGESTION_LOG: 4114 ret = __subn_get_opa_hfi1_cong_log(smp, am, data, ibdev, 4115 port, resp_len, max_len); 4116 break; 4117 case OPA_ATTRIB_ID_CONGESTION_CONTROL_TABLE: 4118 ret = __subn_get_opa_cc_table(smp, am, data, ibdev, port, 4119 resp_len, max_len); 4120 break; 4121 case IB_SMP_ATTR_LED_INFO: 4122 ret = __subn_get_opa_led_info(smp, am, data, ibdev, port, 4123 resp_len, max_len); 4124 break; 4125 case IB_SMP_ATTR_SM_INFO: 4126 if (ibp->rvp.port_cap_flags & IB_PORT_SM_DISABLED) 4127 return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED; 4128 if (ibp->rvp.port_cap_flags & IB_PORT_SM) 4129 return IB_MAD_RESULT_SUCCESS; 4130 fallthrough; 4131 default: 4132 smp->status |= IB_SMP_UNSUP_METH_ATTR; 4133 ret = reply((struct ib_mad_hdr *)smp); 4134 break; 4135 } 4136 return ret; 4137} 4138 4139static int subn_set_opa_sma(__be16 attr_id, struct opa_smp *smp, u32 am, 4140 u8 *data, struct ib_device *ibdev, u32 port, 4141 u32 *resp_len, u32 max_len, int local_mad) 4142{ 4143 int ret; 4144 struct hfi1_ibport *ibp = to_iport(ibdev, port); 4145 4146 switch (attr_id) { 4147 case IB_SMP_ATTR_PORT_INFO: 4148 ret = __subn_set_opa_portinfo(smp, am, data, ibdev, port, 4149 resp_len, max_len, local_mad); 4150 break; 4151 case IB_SMP_ATTR_PKEY_TABLE: 4152 ret = __subn_set_opa_pkeytable(smp, am, data, ibdev, port, 4153 resp_len, max_len); 4154 break; 4155 case OPA_ATTRIB_ID_SL_TO_SC_MAP: 4156 ret = __subn_set_opa_sl_to_sc(smp, am, data, ibdev, port, 4157 resp_len, max_len); 4158 break; 4159 case OPA_ATTRIB_ID_SC_TO_SL_MAP: 4160 ret = __subn_set_opa_sc_to_sl(smp, am, data, ibdev, port, 4161 resp_len, max_len); 4162 break; 4163 case OPA_ATTRIB_ID_SC_TO_VLT_MAP: 4164 ret = __subn_set_opa_sc_to_vlt(smp, am, data, ibdev, port, 4165 resp_len, max_len); 4166 break; 4167 case OPA_ATTRIB_ID_SC_TO_VLNT_MAP: 4168 ret = __subn_set_opa_sc_to_vlnt(smp, am, data, ibdev, port, 4169 resp_len, max_len); 4170 break; 4171 case OPA_ATTRIB_ID_PORT_STATE_INFO: 4172 ret = __subn_set_opa_psi(smp, am, data, ibdev, port, 4173 resp_len, max_len, local_mad); 4174 break; 4175 case OPA_ATTRIB_ID_BUFFER_CONTROL_TABLE: 4176 ret = __subn_set_opa_bct(smp, am, data, ibdev, port, 4177 resp_len, max_len); 4178 break; 4179 case IB_SMP_ATTR_VL_ARB_TABLE: 4180 ret = __subn_set_opa_vl_arb(smp, am, data, ibdev, port, 4181 resp_len, max_len); 4182 break; 4183 case OPA_ATTRIB_ID_HFI_CONGESTION_SETTING: 4184 ret = __subn_set_opa_cong_setting(smp, am, data, ibdev, 4185 port, resp_len, max_len); 4186 break; 4187 case OPA_ATTRIB_ID_CONGESTION_CONTROL_TABLE: 4188 ret = __subn_set_opa_cc_table(smp, am, data, ibdev, port, 4189 resp_len, max_len); 4190 break; 4191 case IB_SMP_ATTR_LED_INFO: 4192 ret = __subn_set_opa_led_info(smp, am, data, ibdev, port, 4193 resp_len, max_len); 4194 break; 4195 case IB_SMP_ATTR_SM_INFO: 4196 if (ibp->rvp.port_cap_flags & IB_PORT_SM_DISABLED) 4197 return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_CONSUMED; 4198 if (ibp->rvp.port_cap_flags & IB_PORT_SM) 4199 return IB_MAD_RESULT_SUCCESS; 4200 fallthrough; 4201 default: 4202 smp->status |= IB_SMP_UNSUP_METH_ATTR; 4203 ret = reply((struct ib_mad_hdr *)smp); 4204 break; 4205 } 4206 return ret; 4207} 4208 4209static inline void set_aggr_error(struct opa_aggregate *ag) 4210{ 4211 ag->err_reqlength |= cpu_to_be16(0x8000); 4212} 4213 4214static int subn_get_opa_aggregate(struct opa_smp *smp, 4215 struct ib_device *ibdev, u32 port, 4216 u32 *resp_len) 4217{ 4218 int i; 4219 u32 num_attr = be32_to_cpu(smp->attr_mod) & 0x000000ff; 4220 u8 *next_smp = opa_get_smp_data(smp); 4221 4222 if (num_attr < 1 || num_attr > 117) { 4223 smp->status |= IB_SMP_INVALID_FIELD; 4224 return reply((struct ib_mad_hdr *)smp); 4225 } 4226 4227 for (i = 0; i < num_attr; i++) { 4228 struct opa_aggregate *agg; 4229 size_t agg_data_len; 4230 size_t agg_size; 4231 u32 am; 4232 4233 agg = (struct opa_aggregate *)next_smp; 4234 agg_data_len = (be16_to_cpu(agg->err_reqlength) & 0x007f) * 8; 4235 agg_size = sizeof(*agg) + agg_data_len; 4236 am = be32_to_cpu(agg->attr_mod); 4237 4238 *resp_len += agg_size; 4239 4240 if (next_smp + agg_size > ((u8 *)smp) + sizeof(*smp)) { 4241 smp->status |= IB_SMP_INVALID_FIELD; 4242 return reply((struct ib_mad_hdr *)smp); 4243 } 4244 4245 /* zero the payload for this segment */ 4246 memset(next_smp + sizeof(*agg), 0, agg_data_len); 4247 4248 (void)subn_get_opa_sma(agg->attr_id, smp, am, agg->data, 4249 ibdev, port, NULL, (u32)agg_data_len); 4250 4251 if (smp->status & IB_SMP_INVALID_FIELD) 4252 break; 4253 if (smp->status & ~IB_SMP_DIRECTION) { 4254 set_aggr_error(agg); 4255 return reply((struct ib_mad_hdr *)smp); 4256 } 4257 next_smp += agg_size; 4258 } 4259 4260 return reply((struct ib_mad_hdr *)smp); 4261} 4262 4263static int subn_set_opa_aggregate(struct opa_smp *smp, 4264 struct ib_device *ibdev, u32 port, 4265 u32 *resp_len, int local_mad) 4266{ 4267 int i; 4268 u32 num_attr = be32_to_cpu(smp->attr_mod) & 0x000000ff; 4269 u8 *next_smp = opa_get_smp_data(smp); 4270 4271 if (num_attr < 1 || num_attr > 117) { 4272 smp->status |= IB_SMP_INVALID_FIELD; 4273 return reply((struct ib_mad_hdr *)smp); 4274 } 4275 4276 for (i = 0; i < num_attr; i++) { 4277 struct opa_aggregate *agg; 4278 size_t agg_data_len; 4279 size_t agg_size; 4280 u32 am; 4281 4282 agg = (struct opa_aggregate *)next_smp; 4283 agg_data_len = (be16_to_cpu(agg->err_reqlength) & 0x007f) * 8; 4284 agg_size = sizeof(*agg) + agg_data_len; 4285 am = be32_to_cpu(agg->attr_mod); 4286 4287 *resp_len += agg_size; 4288 4289 if (next_smp + agg_size > ((u8 *)smp) + sizeof(*smp)) { 4290 smp->status |= IB_SMP_INVALID_FIELD; 4291 return reply((struct ib_mad_hdr *)smp); 4292 } 4293 4294 (void)subn_set_opa_sma(agg->attr_id, smp, am, agg->data, 4295 ibdev, port, NULL, (u32)agg_data_len, 4296 local_mad); 4297 4298 if (smp->status & IB_SMP_INVALID_FIELD) 4299 break; 4300 if (smp->status & ~IB_SMP_DIRECTION) { 4301 set_aggr_error(agg); 4302 return reply((struct ib_mad_hdr *)smp); 4303 } 4304 next_smp += agg_size; 4305 } 4306 4307 return reply((struct ib_mad_hdr *)smp); 4308} 4309 4310/* 4311 * OPAv1 specifies that, on the transition to link up, these counters 4312 * are cleared: 4313 * PortRcvErrors [*] 4314 * LinkErrorRecovery 4315 * LocalLinkIntegrityErrors 4316 * ExcessiveBufferOverruns [*] 4317 * 4318 * [*] Error info associated with these counters is retained, but the 4319 * error info status is reset to 0. 4320 */ 4321void clear_linkup_counters(struct hfi1_devdata *dd) 4322{ 4323 /* PortRcvErrors */ 4324 write_dev_cntr(dd, C_DC_RCV_ERR, CNTR_INVALID_VL, 0); 4325 dd->err_info_rcvport.status_and_code &= ~OPA_EI_STATUS_SMASK; 4326 /* LinkErrorRecovery */ 4327 write_dev_cntr(dd, C_DC_SEQ_CRC_CNT, CNTR_INVALID_VL, 0); 4328 write_dev_cntr(dd, C_DC_REINIT_FROM_PEER_CNT, CNTR_INVALID_VL, 0); 4329 /* LocalLinkIntegrityErrors */ 4330 write_dev_cntr(dd, C_DC_RX_REPLAY, CNTR_INVALID_VL, 0); 4331 /* ExcessiveBufferOverruns */ 4332 write_dev_cntr(dd, C_RCV_OVF, CNTR_INVALID_VL, 0); 4333 dd->rcv_ovfl_cnt = 0; 4334 dd->err_info_xmit_constraint.status &= ~OPA_EI_STATUS_SMASK; 4335} 4336 4337static int is_full_mgmt_pkey_in_table(struct hfi1_ibport *ibp) 4338{ 4339 unsigned int i; 4340 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 4341 4342 for (i = 0; i < ARRAY_SIZE(ppd->pkeys); ++i) 4343 if (ppd->pkeys[i] == FULL_MGMT_P_KEY) 4344 return 1; 4345 4346 return 0; 4347} 4348 4349/* 4350 * is_local_mad() returns 1 if 'mad' is sent from, and destined to the 4351 * local node, 0 otherwise. 4352 */ 4353static int is_local_mad(struct hfi1_ibport *ibp, const struct opa_mad *mad, 4354 const struct ib_wc *in_wc) 4355{ 4356 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 4357 const struct opa_smp *smp = (const struct opa_smp *)mad; 4358 4359 if (smp->mgmt_class == IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) { 4360 return (smp->hop_cnt == 0 && 4361 smp->route.dr.dr_slid == OPA_LID_PERMISSIVE && 4362 smp->route.dr.dr_dlid == OPA_LID_PERMISSIVE); 4363 } 4364 4365 return (in_wc->slid == ppd->lid); 4366} 4367 4368/* 4369 * opa_local_smp_check() should only be called on MADs for which 4370 * is_local_mad() returns true. It applies the SMP checks that are 4371 * specific to SMPs which are sent from, and destined to this node. 4372 * opa_local_smp_check() returns 0 if the SMP passes its checks, 1 4373 * otherwise. 4374 * 4375 * SMPs which arrive from other nodes are instead checked by 4376 * opa_smp_check(). 4377 */ 4378static int opa_local_smp_check(struct hfi1_ibport *ibp, 4379 const struct ib_wc *in_wc) 4380{ 4381 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); 4382 u16 pkey; 4383 4384 if (in_wc->pkey_index >= ARRAY_SIZE(ppd->pkeys)) 4385 return 1; 4386 4387 pkey = ppd->pkeys[in_wc->pkey_index]; 4388 /* 4389 * We need to do the "node-local" checks specified in OPAv1, 4390 * rev 0.90, section 9.10.26, which are: 4391 * - pkey is 0x7fff, or 0xffff 4392 * - Source QPN == 0 || Destination QPN == 0 4393 * - the MAD header's management class is either 4394 * IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE or 4395 * IB_MGMT_CLASS_SUBN_LID_ROUTED 4396 * - SLID != 0 4397 * 4398 * However, we know (and so don't need to check again) that, 4399 * for local SMPs, the MAD stack passes MADs with: 4400 * - Source QPN of 0 4401 * - MAD mgmt_class is IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 4402 * - SLID is either: OPA_LID_PERMISSIVE (0xFFFFFFFF), or 4403 * our own port's lid 4404 * 4405 */ 4406 if (pkey == LIM_MGMT_P_KEY || pkey == FULL_MGMT_P_KEY) 4407 return 0; 4408 ingress_pkey_table_fail(ppd, pkey, in_wc->slid); 4409 return 1; 4410} 4411 4412/** 4413 * hfi1_pkey_validation_pma - It validates PKEYs for incoming PMA MAD packets. 4414 * @ibp: IB port data 4415 * @in_mad: MAD packet with header and data 4416 * @in_wc: Work completion data such as source LID, port number, etc. 4417 * 4418 * These are all the possible logic rules for validating a pkey: 4419 * 4420 * a) If pkey neither FULL_MGMT_P_KEY nor LIM_MGMT_P_KEY, 4421 * and NOT self-originated packet: 4422 * Drop MAD packet as it should always be part of the 4423 * management partition unless it's a self-originated packet. 4424 * 4425 * b) If pkey_index -> FULL_MGMT_P_KEY, and LIM_MGMT_P_KEY in pkey table: 4426 * The packet is coming from a management node and the receiving node 4427 * is also a management node, so it is safe for the packet to go through. 4428 * 4429 * c) If pkey_index -> FULL_MGMT_P_KEY, and LIM_MGMT_P_KEY is NOT in pkey table: 4430 * Drop the packet as LIM_MGMT_P_KEY should always be in the pkey table. 4431 * It could be an FM misconfiguration. 4432 * 4433 * d) If pkey_index -> LIM_MGMT_P_KEY and FULL_MGMT_P_KEY is NOT in pkey table: 4434 * It is safe for the packet to go through since a non-management node is 4435 * talking to another non-management node. 4436 * 4437 * e) If pkey_index -> LIM_MGMT_P_KEY and FULL_MGMT_P_KEY in pkey table: 4438 * Drop the packet because a non-management node is talking to a 4439 * management node, and it could be an attack. 4440 * 4441 * For the implementation, these rules can be simplied to only checking 4442 * for (a) and (e). There's no need to check for rule (b) as 4443 * the packet doesn't need to be dropped. Rule (c) is not possible in 4444 * the driver as LIM_MGMT_P_KEY is always in the pkey table. 4445 * 4446 * Return: 4447 * 0 - pkey is okay, -EINVAL it's a bad pkey 4448 */ 4449static int hfi1_pkey_validation_pma(struct hfi1_ibport *ibp, 4450 const struct opa_mad *in_mad, 4451 const struct ib_wc *in_wc) 4452{ 4453 u16 pkey_value = hfi1_lookup_pkey_value(ibp, in_wc->pkey_index); 4454 4455 /* Rule (a) from above */ 4456 if (!is_local_mad(ibp, in_mad, in_wc) && 4457 pkey_value != LIM_MGMT_P_KEY && 4458 pkey_value != FULL_MGMT_P_KEY) 4459 return -EINVAL; 4460 4461 /* Rule (e) from above */ 4462 if (pkey_value == LIM_MGMT_P_KEY && 4463 is_full_mgmt_pkey_in_table(ibp)) 4464 return -EINVAL; 4465 4466 return 0; 4467} 4468 4469static int process_subn_opa(struct ib_device *ibdev, int mad_flags, 4470 u32 port, const struct opa_mad *in_mad, 4471 struct opa_mad *out_mad, 4472 u32 *resp_len, int local_mad) 4473{ 4474 struct opa_smp *smp = (struct opa_smp *)out_mad; 4475 struct hfi1_ibport *ibp = to_iport(ibdev, port); 4476 u8 *data; 4477 u32 am, data_size; 4478 __be16 attr_id; 4479 int ret; 4480 4481 *out_mad = *in_mad; 4482 data = opa_get_smp_data(smp); 4483 data_size = (u32)opa_get_smp_data_size(smp); 4484 4485 am = be32_to_cpu(smp->attr_mod); 4486 attr_id = smp->attr_id; 4487 if (smp->class_version != OPA_SM_CLASS_VERSION) { 4488 smp->status |= IB_SMP_UNSUP_VERSION; 4489 ret = reply((struct ib_mad_hdr *)smp); 4490 return ret; 4491 } 4492 ret = check_mkey(ibp, (struct ib_mad_hdr *)smp, mad_flags, smp->mkey, 4493 smp->route.dr.dr_slid, smp->route.dr.return_path, 4494 smp->hop_cnt); 4495 if (ret) { 4496 u32 port_num = be32_to_cpu(smp->attr_mod); 4497 4498 /* 4499 * If this is a get/set portinfo, we already check the 4500 * M_Key if the MAD is for another port and the M_Key 4501 * is OK on the receiving port. This check is needed 4502 * to increment the error counters when the M_Key 4503 * fails to match on *both* ports. 4504 */ 4505 if (attr_id == IB_SMP_ATTR_PORT_INFO && 4506 (smp->method == IB_MGMT_METHOD_GET || 4507 smp->method == IB_MGMT_METHOD_SET) && 4508 port_num && port_num <= ibdev->phys_port_cnt && 4509 port != port_num) 4510 (void)check_mkey(to_iport(ibdev, port_num), 4511 (struct ib_mad_hdr *)smp, 0, 4512 smp->mkey, smp->route.dr.dr_slid, 4513 smp->route.dr.return_path, 4514 smp->hop_cnt); 4515 ret = IB_MAD_RESULT_FAILURE; 4516 return ret; 4517 } 4518 4519 *resp_len = opa_get_smp_header_size(smp); 4520 4521 switch (smp->method) { 4522 case IB_MGMT_METHOD_GET: 4523 switch (attr_id) { 4524 default: 4525 clear_opa_smp_data(smp); 4526 ret = subn_get_opa_sma(attr_id, smp, am, data, 4527 ibdev, port, resp_len, 4528 data_size); 4529 break; 4530 case OPA_ATTRIB_ID_AGGREGATE: 4531 ret = subn_get_opa_aggregate(smp, ibdev, port, 4532 resp_len); 4533 break; 4534 } 4535 break; 4536 case IB_MGMT_METHOD_SET: 4537 switch (attr_id) { 4538 default: 4539 ret = subn_set_opa_sma(attr_id, smp, am, data, 4540 ibdev, port, resp_len, 4541 data_size, local_mad); 4542 break; 4543 case OPA_ATTRIB_ID_AGGREGATE: 4544 ret = subn_set_opa_aggregate(smp, ibdev, port, 4545 resp_len, local_mad); 4546 break; 4547 } 4548 break; 4549 case IB_MGMT_METHOD_TRAP: 4550 case IB_MGMT_METHOD_REPORT: 4551 case IB_MGMT_METHOD_REPORT_RESP: 4552 case IB_MGMT_METHOD_GET_RESP: 4553 /* 4554 * The ib_mad module will call us to process responses 4555 * before checking for other consumers. 4556 * Just tell the caller to process it normally. 4557 */ 4558 ret = IB_MAD_RESULT_SUCCESS; 4559 break; 4560 case IB_MGMT_METHOD_TRAP_REPRESS: 4561 subn_handle_opa_trap_repress(ibp, smp); 4562 /* Always successful */ 4563 ret = IB_MAD_RESULT_SUCCESS; 4564 break; 4565 default: 4566 smp->status |= IB_SMP_UNSUP_METHOD; 4567 ret = reply((struct ib_mad_hdr *)smp); 4568 break; 4569 } 4570 4571 return ret; 4572} 4573 4574static int process_subn(struct ib_device *ibdev, int mad_flags, 4575 u32 port, const struct ib_mad *in_mad, 4576 struct ib_mad *out_mad) 4577{ 4578 struct ib_smp *smp = (struct ib_smp *)out_mad; 4579 struct hfi1_ibport *ibp = to_iport(ibdev, port); 4580 int ret; 4581 4582 *out_mad = *in_mad; 4583 if (smp->class_version != 1) { 4584 smp->status |= IB_SMP_UNSUP_VERSION; 4585 ret = reply((struct ib_mad_hdr *)smp); 4586 return ret; 4587 } 4588 4589 ret = check_mkey(ibp, (struct ib_mad_hdr *)smp, mad_flags, 4590 smp->mkey, (__force __be32)smp->dr_slid, 4591 smp->return_path, smp->hop_cnt); 4592 if (ret) { 4593 u32 port_num = be32_to_cpu(smp->attr_mod); 4594 4595 /* 4596 * If this is a get/set portinfo, we already check the 4597 * M_Key if the MAD is for another port and the M_Key 4598 * is OK on the receiving port. This check is needed 4599 * to increment the error counters when the M_Key 4600 * fails to match on *both* ports. 4601 */ 4602 if (in_mad->mad_hdr.attr_id == IB_SMP_ATTR_PORT_INFO && 4603 (smp->method == IB_MGMT_METHOD_GET || 4604 smp->method == IB_MGMT_METHOD_SET) && 4605 port_num && port_num <= ibdev->phys_port_cnt && 4606 port != port_num) 4607 (void)check_mkey(to_iport(ibdev, port_num), 4608 (struct ib_mad_hdr *)smp, 0, 4609 smp->mkey, 4610 (__force __be32)smp->dr_slid, 4611 smp->return_path, smp->hop_cnt); 4612 ret = IB_MAD_RESULT_FAILURE; 4613 return ret; 4614 } 4615 4616 switch (smp->method) { 4617 case IB_MGMT_METHOD_GET: 4618 switch (smp->attr_id) { 4619 case IB_SMP_ATTR_NODE_INFO: 4620 ret = subn_get_nodeinfo(smp, ibdev, port); 4621 break; 4622 default: 4623 smp->status |= IB_SMP_UNSUP_METH_ATTR; 4624 ret = reply((struct ib_mad_hdr *)smp); 4625 break; 4626 } 4627 break; 4628 } 4629 4630 return ret; 4631} 4632 4633static int process_perf(struct ib_device *ibdev, u32 port, 4634 const struct ib_mad *in_mad, 4635 struct ib_mad *out_mad) 4636{ 4637 struct ib_pma_mad *pmp = (struct ib_pma_mad *)out_mad; 4638 struct ib_class_port_info *cpi = (struct ib_class_port_info *) 4639 &pmp->data; 4640 int ret = IB_MAD_RESULT_FAILURE; 4641 4642 *out_mad = *in_mad; 4643 if (pmp->mad_hdr.class_version != 1) { 4644 pmp->mad_hdr.status |= IB_SMP_UNSUP_VERSION; 4645 ret = reply((struct ib_mad_hdr *)pmp); 4646 return ret; 4647 } 4648 4649 switch (pmp->mad_hdr.method) { 4650 case IB_MGMT_METHOD_GET: 4651 switch (pmp->mad_hdr.attr_id) { 4652 case IB_PMA_PORT_COUNTERS: 4653 ret = pma_get_ib_portcounters(pmp, ibdev, port); 4654 break; 4655 case IB_PMA_PORT_COUNTERS_EXT: 4656 ret = pma_get_ib_portcounters_ext(pmp, ibdev, port); 4657 break; 4658 case IB_PMA_CLASS_PORT_INFO: 4659 cpi->capability_mask = IB_PMA_CLASS_CAP_EXT_WIDTH; 4660 ret = reply((struct ib_mad_hdr *)pmp); 4661 break; 4662 default: 4663 pmp->mad_hdr.status |= IB_SMP_UNSUP_METH_ATTR; 4664 ret = reply((struct ib_mad_hdr *)pmp); 4665 break; 4666 } 4667 break; 4668 4669 case IB_MGMT_METHOD_SET: 4670 if (pmp->mad_hdr.attr_id) { 4671 pmp->mad_hdr.status |= IB_SMP_UNSUP_METH_ATTR; 4672 ret = reply((struct ib_mad_hdr *)pmp); 4673 } 4674 break; 4675 4676 case IB_MGMT_METHOD_TRAP: 4677 case IB_MGMT_METHOD_GET_RESP: 4678 /* 4679 * The ib_mad module will call us to process responses 4680 * before checking for other consumers. 4681 * Just tell the caller to process it normally. 4682 */ 4683 ret = IB_MAD_RESULT_SUCCESS; 4684 break; 4685 4686 default: 4687 pmp->mad_hdr.status |= IB_SMP_UNSUP_METHOD; 4688 ret = reply((struct ib_mad_hdr *)pmp); 4689 break; 4690 } 4691 4692 return ret; 4693} 4694 4695static int process_perf_opa(struct ib_device *ibdev, u32 port, 4696 const struct opa_mad *in_mad, 4697 struct opa_mad *out_mad, u32 *resp_len) 4698{ 4699 struct opa_pma_mad *pmp = (struct opa_pma_mad *)out_mad; 4700 int ret; 4701 4702 *out_mad = *in_mad; 4703 4704 if (pmp->mad_hdr.class_version != OPA_SM_CLASS_VERSION) { 4705 pmp->mad_hdr.status |= IB_SMP_UNSUP_VERSION; 4706 return reply((struct ib_mad_hdr *)pmp); 4707 } 4708 4709 *resp_len = sizeof(pmp->mad_hdr); 4710 4711 switch (pmp->mad_hdr.method) { 4712 case IB_MGMT_METHOD_GET: 4713 switch (pmp->mad_hdr.attr_id) { 4714 case IB_PMA_CLASS_PORT_INFO: 4715 ret = pma_get_opa_classportinfo(pmp, ibdev, resp_len); 4716 break; 4717 case OPA_PM_ATTRIB_ID_PORT_STATUS: 4718 ret = pma_get_opa_portstatus(pmp, ibdev, port, 4719 resp_len); 4720 break; 4721 case OPA_PM_ATTRIB_ID_DATA_PORT_COUNTERS: 4722 ret = pma_get_opa_datacounters(pmp, ibdev, port, 4723 resp_len); 4724 break; 4725 case OPA_PM_ATTRIB_ID_ERROR_PORT_COUNTERS: 4726 ret = pma_get_opa_porterrors(pmp, ibdev, port, 4727 resp_len); 4728 break; 4729 case OPA_PM_ATTRIB_ID_ERROR_INFO: 4730 ret = pma_get_opa_errorinfo(pmp, ibdev, port, 4731 resp_len); 4732 break; 4733 default: 4734 pmp->mad_hdr.status |= IB_SMP_UNSUP_METH_ATTR; 4735 ret = reply((struct ib_mad_hdr *)pmp); 4736 break; 4737 } 4738 break; 4739 4740 case IB_MGMT_METHOD_SET: 4741 switch (pmp->mad_hdr.attr_id) { 4742 case OPA_PM_ATTRIB_ID_CLEAR_PORT_STATUS: 4743 ret = pma_set_opa_portstatus(pmp, ibdev, port, 4744 resp_len); 4745 break; 4746 case OPA_PM_ATTRIB_ID_ERROR_INFO: 4747 ret = pma_set_opa_errorinfo(pmp, ibdev, port, 4748 resp_len); 4749 break; 4750 default: 4751 pmp->mad_hdr.status |= IB_SMP_UNSUP_METH_ATTR; 4752 ret = reply((struct ib_mad_hdr *)pmp); 4753 break; 4754 } 4755 break; 4756 4757 case IB_MGMT_METHOD_TRAP: 4758 case IB_MGMT_METHOD_GET_RESP: 4759 /* 4760 * The ib_mad module will call us to process responses 4761 * before checking for other consumers. 4762 * Just tell the caller to process it normally. 4763 */ 4764 ret = IB_MAD_RESULT_SUCCESS; 4765 break; 4766 4767 default: 4768 pmp->mad_hdr.status |= IB_SMP_UNSUP_METHOD; 4769 ret = reply((struct ib_mad_hdr *)pmp); 4770 break; 4771 } 4772 4773 return ret; 4774} 4775 4776static int hfi1_process_opa_mad(struct ib_device *ibdev, int mad_flags, 4777 u32 port, const struct ib_wc *in_wc, 4778 const struct ib_grh *in_grh, 4779 const struct opa_mad *in_mad, 4780 struct opa_mad *out_mad, size_t *out_mad_size, 4781 u16 *out_mad_pkey_index) 4782{ 4783 int ret; 4784 int pkey_idx; 4785 int local_mad = 0; 4786 u32 resp_len = in_wc->byte_len - sizeof(*in_grh); 4787 struct hfi1_ibport *ibp = to_iport(ibdev, port); 4788 4789 pkey_idx = hfi1_lookup_pkey_idx(ibp, LIM_MGMT_P_KEY); 4790 if (pkey_idx < 0) { 4791 pr_warn("failed to find limited mgmt pkey, defaulting 0x%x\n", 4792 hfi1_get_pkey(ibp, 1)); 4793 pkey_idx = 1; 4794 } 4795 *out_mad_pkey_index = (u16)pkey_idx; 4796 4797 switch (in_mad->mad_hdr.mgmt_class) { 4798 case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: 4799 case IB_MGMT_CLASS_SUBN_LID_ROUTED: 4800 local_mad = is_local_mad(ibp, in_mad, in_wc); 4801 if (local_mad) { 4802 ret = opa_local_smp_check(ibp, in_wc); 4803 if (ret) 4804 return IB_MAD_RESULT_FAILURE; 4805 } 4806 ret = process_subn_opa(ibdev, mad_flags, port, in_mad, 4807 out_mad, &resp_len, local_mad); 4808 goto bail; 4809 case IB_MGMT_CLASS_PERF_MGMT: 4810 ret = hfi1_pkey_validation_pma(ibp, in_mad, in_wc); 4811 if (ret) 4812 return IB_MAD_RESULT_FAILURE; 4813 4814 ret = process_perf_opa(ibdev, port, in_mad, out_mad, &resp_len); 4815 goto bail; 4816 4817 default: 4818 ret = IB_MAD_RESULT_SUCCESS; 4819 } 4820 4821bail: 4822 if (ret & IB_MAD_RESULT_REPLY) 4823 *out_mad_size = round_up(resp_len, 8); 4824 else if (ret & IB_MAD_RESULT_SUCCESS) 4825 *out_mad_size = in_wc->byte_len - sizeof(struct ib_grh); 4826 4827 return ret; 4828} 4829 4830static int hfi1_process_ib_mad(struct ib_device *ibdev, int mad_flags, u32 port, 4831 const struct ib_wc *in_wc, 4832 const struct ib_grh *in_grh, 4833 const struct ib_mad *in_mad, 4834 struct ib_mad *out_mad) 4835{ 4836 int ret; 4837 4838 switch (in_mad->mad_hdr.mgmt_class) { 4839 case IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE: 4840 case IB_MGMT_CLASS_SUBN_LID_ROUTED: 4841 ret = process_subn(ibdev, mad_flags, port, in_mad, out_mad); 4842 break; 4843 case IB_MGMT_CLASS_PERF_MGMT: 4844 ret = process_perf(ibdev, port, in_mad, out_mad); 4845 break; 4846 default: 4847 ret = IB_MAD_RESULT_SUCCESS; 4848 break; 4849 } 4850 4851 return ret; 4852} 4853 4854/** 4855 * hfi1_process_mad - process an incoming MAD packet 4856 * @ibdev: the infiniband device this packet came in on 4857 * @mad_flags: MAD flags 4858 * @port: the port number this packet came in on 4859 * @in_wc: the work completion entry for this packet 4860 * @in_grh: the global route header for this packet 4861 * @in_mad: the incoming MAD 4862 * @out_mad: any outgoing MAD reply 4863 * @out_mad_size: size of the outgoing MAD reply 4864 * @out_mad_pkey_index: used to apss back the packet key index 4865 * 4866 * Returns IB_MAD_RESULT_SUCCESS if this is a MAD that we are not 4867 * interested in processing. 4868 * 4869 * Note that the verbs framework has already done the MAD sanity checks, 4870 * and hop count/pointer updating for IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 4871 * MADs. 4872 * 4873 * This is called by the ib_mad module. 4874 */ 4875int hfi1_process_mad(struct ib_device *ibdev, int mad_flags, u32 port, 4876 const struct ib_wc *in_wc, const struct ib_grh *in_grh, 4877 const struct ib_mad *in_mad, struct ib_mad *out_mad, 4878 size_t *out_mad_size, u16 *out_mad_pkey_index) 4879{ 4880 switch (in_mad->mad_hdr.base_version) { 4881 case OPA_MGMT_BASE_VERSION: 4882 return hfi1_process_opa_mad(ibdev, mad_flags, port, 4883 in_wc, in_grh, 4884 (struct opa_mad *)in_mad, 4885 (struct opa_mad *)out_mad, 4886 out_mad_size, 4887 out_mad_pkey_index); 4888 case IB_MGMT_BASE_VERSION: 4889 return hfi1_process_ib_mad(ibdev, mad_flags, port, in_wc, 4890 in_grh, in_mad, out_mad); 4891 default: 4892 break; 4893 } 4894 4895 return IB_MAD_RESULT_FAILURE; 4896}