ntb_hw_switchtec.c (39200B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Microsemi Switchtec(tm) PCIe Management Driver 4 * Copyright (c) 2017, Microsemi Corporation 5 */ 6 7#include <linux/interrupt.h> 8#include <linux/io-64-nonatomic-lo-hi.h> 9#include <linux/delay.h> 10#include <linux/kthread.h> 11#include <linux/module.h> 12#include <linux/ntb.h> 13#include <linux/pci.h> 14#include <linux/switchtec.h> 15 16MODULE_DESCRIPTION("Microsemi Switchtec(tm) NTB Driver"); 17MODULE_VERSION("0.1"); 18MODULE_LICENSE("GPL"); 19MODULE_AUTHOR("Microsemi Corporation"); 20 21static ulong max_mw_size = SZ_2M; 22module_param(max_mw_size, ulong, 0644); 23MODULE_PARM_DESC(max_mw_size, 24 "Max memory window size reported to the upper layer"); 25 26static bool use_lut_mws; 27module_param(use_lut_mws, bool, 0644); 28MODULE_PARM_DESC(use_lut_mws, 29 "Enable the use of the LUT based memory windows"); 30 31#define SWITCHTEC_NTB_MAGIC 0x45CC0001 32#define MAX_MWS 128 33 34struct shared_mw { 35 u32 magic; 36 u32 link_sta; 37 u32 partition_id; 38 u64 mw_sizes[MAX_MWS]; 39 u32 spad[128]; 40}; 41 42#define MAX_DIRECT_MW ARRAY_SIZE(((struct ntb_ctrl_regs *)(0))->bar_entry) 43#define LUT_SIZE SZ_64K 44 45struct switchtec_ntb { 46 struct ntb_dev ntb; 47 struct switchtec_dev *stdev; 48 49 int self_partition; 50 int peer_partition; 51 52 int doorbell_irq; 53 int message_irq; 54 55 struct ntb_info_regs __iomem *mmio_ntb; 56 struct ntb_ctrl_regs __iomem *mmio_ctrl; 57 struct ntb_dbmsg_regs __iomem *mmio_dbmsg; 58 struct ntb_ctrl_regs __iomem *mmio_self_ctrl; 59 struct ntb_ctrl_regs __iomem *mmio_peer_ctrl; 60 struct ntb_dbmsg_regs __iomem *mmio_self_dbmsg; 61 struct ntb_dbmsg_regs __iomem *mmio_peer_dbmsg; 62 63 void __iomem *mmio_xlink_win; 64 65 struct shared_mw *self_shared; 66 struct shared_mw __iomem *peer_shared; 67 dma_addr_t self_shared_dma; 68 69 u64 db_mask; 70 u64 db_valid_mask; 71 int db_shift; 72 int db_peer_shift; 73 74 /* synchronize rmw access of db_mask and hw reg */ 75 spinlock_t db_mask_lock; 76 77 int nr_direct_mw; 78 int nr_lut_mw; 79 int nr_rsvd_luts; 80 int direct_mw_to_bar[MAX_DIRECT_MW]; 81 82 int peer_nr_direct_mw; 83 int peer_nr_lut_mw; 84 int peer_direct_mw_to_bar[MAX_DIRECT_MW]; 85 86 bool link_is_up; 87 enum ntb_speed link_speed; 88 enum ntb_width link_width; 89 struct work_struct check_link_status_work; 90 bool link_force_down; 91}; 92 93static struct switchtec_ntb *ntb_sndev(struct ntb_dev *ntb) 94{ 95 return container_of(ntb, struct switchtec_ntb, ntb); 96} 97 98static int switchtec_ntb_part_op(struct switchtec_ntb *sndev, 99 struct ntb_ctrl_regs __iomem *ctl, 100 u32 op, int wait_status) 101{ 102 static const char * const op_text[] = { 103 [NTB_CTRL_PART_OP_LOCK] = "lock", 104 [NTB_CTRL_PART_OP_CFG] = "configure", 105 [NTB_CTRL_PART_OP_RESET] = "reset", 106 }; 107 108 int i; 109 u32 ps; 110 int status; 111 112 switch (op) { 113 case NTB_CTRL_PART_OP_LOCK: 114 status = NTB_CTRL_PART_STATUS_LOCKING; 115 break; 116 case NTB_CTRL_PART_OP_CFG: 117 status = NTB_CTRL_PART_STATUS_CONFIGURING; 118 break; 119 case NTB_CTRL_PART_OP_RESET: 120 status = NTB_CTRL_PART_STATUS_RESETTING; 121 break; 122 default: 123 return -EINVAL; 124 } 125 126 iowrite32(op, &ctl->partition_op); 127 128 for (i = 0; i < 1000; i++) { 129 if (msleep_interruptible(50) != 0) { 130 iowrite32(NTB_CTRL_PART_OP_RESET, &ctl->partition_op); 131 return -EINTR; 132 } 133 134 ps = ioread32(&ctl->partition_status) & 0xFFFF; 135 136 if (ps != status) 137 break; 138 } 139 140 if (ps == wait_status) 141 return 0; 142 143 if (ps == status) { 144 dev_err(&sndev->stdev->dev, 145 "Timed out while performing %s (%d). (%08x)\n", 146 op_text[op], op, 147 ioread32(&ctl->partition_status)); 148 149 return -ETIMEDOUT; 150 } 151 152 return -EIO; 153} 154 155static int switchtec_ntb_send_msg(struct switchtec_ntb *sndev, int idx, 156 u32 val) 157{ 158 if (idx < 0 || idx >= ARRAY_SIZE(sndev->mmio_peer_dbmsg->omsg)) 159 return -EINVAL; 160 161 iowrite32(val, &sndev->mmio_peer_dbmsg->omsg[idx].msg); 162 163 return 0; 164} 165 166static int switchtec_ntb_mw_count(struct ntb_dev *ntb, int pidx) 167{ 168 struct switchtec_ntb *sndev = ntb_sndev(ntb); 169 int nr_direct_mw = sndev->peer_nr_direct_mw; 170 int nr_lut_mw = sndev->peer_nr_lut_mw - sndev->nr_rsvd_luts; 171 172 if (pidx != NTB_DEF_PEER_IDX) 173 return -EINVAL; 174 175 if (!use_lut_mws) 176 nr_lut_mw = 0; 177 178 return nr_direct_mw + nr_lut_mw; 179} 180 181static int lut_index(struct switchtec_ntb *sndev, int mw_idx) 182{ 183 return mw_idx - sndev->nr_direct_mw + sndev->nr_rsvd_luts; 184} 185 186static int peer_lut_index(struct switchtec_ntb *sndev, int mw_idx) 187{ 188 return mw_idx - sndev->peer_nr_direct_mw + sndev->nr_rsvd_luts; 189} 190 191static int switchtec_ntb_mw_get_align(struct ntb_dev *ntb, int pidx, 192 int widx, resource_size_t *addr_align, 193 resource_size_t *size_align, 194 resource_size_t *size_max) 195{ 196 struct switchtec_ntb *sndev = ntb_sndev(ntb); 197 int lut; 198 resource_size_t size; 199 200 if (pidx != NTB_DEF_PEER_IDX) 201 return -EINVAL; 202 203 lut = widx >= sndev->peer_nr_direct_mw; 204 size = ioread64(&sndev->peer_shared->mw_sizes[widx]); 205 206 if (size == 0) 207 return -EINVAL; 208 209 if (addr_align) 210 *addr_align = lut ? size : SZ_4K; 211 212 if (size_align) 213 *size_align = lut ? size : SZ_4K; 214 215 if (size_max) 216 *size_max = size; 217 218 return 0; 219} 220 221static void switchtec_ntb_mw_clr_direct(struct switchtec_ntb *sndev, int idx) 222{ 223 struct ntb_ctrl_regs __iomem *ctl = sndev->mmio_peer_ctrl; 224 int bar = sndev->peer_direct_mw_to_bar[idx]; 225 u32 ctl_val; 226 227 ctl_val = ioread32(&ctl->bar_entry[bar].ctl); 228 ctl_val &= ~NTB_CTRL_BAR_DIR_WIN_EN; 229 iowrite32(ctl_val, &ctl->bar_entry[bar].ctl); 230 iowrite32(0, &ctl->bar_entry[bar].win_size); 231 iowrite32(0, &ctl->bar_ext_entry[bar].win_size); 232 iowrite64(sndev->self_partition, &ctl->bar_entry[bar].xlate_addr); 233} 234 235static void switchtec_ntb_mw_clr_lut(struct switchtec_ntb *sndev, int idx) 236{ 237 struct ntb_ctrl_regs __iomem *ctl = sndev->mmio_peer_ctrl; 238 239 iowrite64(0, &ctl->lut_entry[peer_lut_index(sndev, idx)]); 240} 241 242static void switchtec_ntb_mw_set_direct(struct switchtec_ntb *sndev, int idx, 243 dma_addr_t addr, resource_size_t size) 244{ 245 int xlate_pos = ilog2(size); 246 int bar = sndev->peer_direct_mw_to_bar[idx]; 247 struct ntb_ctrl_regs __iomem *ctl = sndev->mmio_peer_ctrl; 248 u32 ctl_val; 249 250 ctl_val = ioread32(&ctl->bar_entry[bar].ctl); 251 ctl_val |= NTB_CTRL_BAR_DIR_WIN_EN; 252 253 iowrite32(ctl_val, &ctl->bar_entry[bar].ctl); 254 iowrite32(xlate_pos | (lower_32_bits(size) & 0xFFFFF000), 255 &ctl->bar_entry[bar].win_size); 256 iowrite32(upper_32_bits(size), &ctl->bar_ext_entry[bar].win_size); 257 iowrite64(sndev->self_partition | addr, 258 &ctl->bar_entry[bar].xlate_addr); 259} 260 261static void switchtec_ntb_mw_set_lut(struct switchtec_ntb *sndev, int idx, 262 dma_addr_t addr, resource_size_t size) 263{ 264 struct ntb_ctrl_regs __iomem *ctl = sndev->mmio_peer_ctrl; 265 266 iowrite64((NTB_CTRL_LUT_EN | (sndev->self_partition << 1) | addr), 267 &ctl->lut_entry[peer_lut_index(sndev, idx)]); 268} 269 270static int switchtec_ntb_mw_set_trans(struct ntb_dev *ntb, int pidx, int widx, 271 dma_addr_t addr, resource_size_t size) 272{ 273 struct switchtec_ntb *sndev = ntb_sndev(ntb); 274 struct ntb_ctrl_regs __iomem *ctl = sndev->mmio_peer_ctrl; 275 int xlate_pos = ilog2(size); 276 int nr_direct_mw = sndev->peer_nr_direct_mw; 277 int rc; 278 279 if (pidx != NTB_DEF_PEER_IDX) 280 return -EINVAL; 281 282 dev_dbg(&sndev->stdev->dev, "MW %d: part %d addr %pad size %pap\n", 283 widx, pidx, &addr, &size); 284 285 if (widx >= switchtec_ntb_mw_count(ntb, pidx)) 286 return -EINVAL; 287 288 if (size != 0 && xlate_pos < 12) 289 return -EINVAL; 290 291 if (!IS_ALIGNED(addr, BIT_ULL(xlate_pos))) { 292 /* 293 * In certain circumstances we can get a buffer that is 294 * not aligned to its size. (Most of the time 295 * dma_alloc_coherent ensures this). This can happen when 296 * using large buffers allocated by the CMA 297 * (see CMA_CONFIG_ALIGNMENT) 298 */ 299 dev_err(&sndev->stdev->dev, 300 "ERROR: Memory window address is not aligned to its size!\n"); 301 return -EINVAL; 302 } 303 304 rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_LOCK, 305 NTB_CTRL_PART_STATUS_LOCKED); 306 if (rc) 307 return rc; 308 309 if (size == 0) { 310 if (widx < nr_direct_mw) 311 switchtec_ntb_mw_clr_direct(sndev, widx); 312 else 313 switchtec_ntb_mw_clr_lut(sndev, widx); 314 } else { 315 if (widx < nr_direct_mw) 316 switchtec_ntb_mw_set_direct(sndev, widx, addr, size); 317 else 318 switchtec_ntb_mw_set_lut(sndev, widx, addr, size); 319 } 320 321 rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_CFG, 322 NTB_CTRL_PART_STATUS_NORMAL); 323 324 if (rc == -EIO) { 325 dev_err(&sndev->stdev->dev, 326 "Hardware reported an error configuring mw %d: %08x\n", 327 widx, ioread32(&ctl->bar_error)); 328 329 if (widx < nr_direct_mw) 330 switchtec_ntb_mw_clr_direct(sndev, widx); 331 else 332 switchtec_ntb_mw_clr_lut(sndev, widx); 333 334 switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_CFG, 335 NTB_CTRL_PART_STATUS_NORMAL); 336 } 337 338 return rc; 339} 340 341static int switchtec_ntb_peer_mw_count(struct ntb_dev *ntb) 342{ 343 struct switchtec_ntb *sndev = ntb_sndev(ntb); 344 int nr_lut_mw = sndev->nr_lut_mw - sndev->nr_rsvd_luts; 345 346 return sndev->nr_direct_mw + (use_lut_mws ? nr_lut_mw : 0); 347} 348 349static int switchtec_ntb_direct_get_addr(struct switchtec_ntb *sndev, 350 int idx, phys_addr_t *base, 351 resource_size_t *size) 352{ 353 int bar = sndev->direct_mw_to_bar[idx]; 354 size_t offset = 0; 355 356 if (bar < 0) 357 return -EINVAL; 358 359 if (idx == 0) { 360 /* 361 * This is the direct BAR shared with the LUTs 362 * which means the actual window will be offset 363 * by the size of all the LUT entries. 364 */ 365 366 offset = LUT_SIZE * sndev->nr_lut_mw; 367 } 368 369 if (base) 370 *base = pci_resource_start(sndev->ntb.pdev, bar) + offset; 371 372 if (size) { 373 *size = pci_resource_len(sndev->ntb.pdev, bar) - offset; 374 if (offset && *size > offset) 375 *size = offset; 376 377 if (*size > max_mw_size) 378 *size = max_mw_size; 379 } 380 381 return 0; 382} 383 384static int switchtec_ntb_lut_get_addr(struct switchtec_ntb *sndev, 385 int idx, phys_addr_t *base, 386 resource_size_t *size) 387{ 388 int bar = sndev->direct_mw_to_bar[0]; 389 int offset; 390 391 offset = LUT_SIZE * lut_index(sndev, idx); 392 393 if (base) 394 *base = pci_resource_start(sndev->ntb.pdev, bar) + offset; 395 396 if (size) 397 *size = LUT_SIZE; 398 399 return 0; 400} 401 402static int switchtec_ntb_peer_mw_get_addr(struct ntb_dev *ntb, int idx, 403 phys_addr_t *base, 404 resource_size_t *size) 405{ 406 struct switchtec_ntb *sndev = ntb_sndev(ntb); 407 408 if (idx < sndev->nr_direct_mw) 409 return switchtec_ntb_direct_get_addr(sndev, idx, base, size); 410 else if (idx < switchtec_ntb_peer_mw_count(ntb)) 411 return switchtec_ntb_lut_get_addr(sndev, idx, base, size); 412 else 413 return -EINVAL; 414} 415 416static void switchtec_ntb_part_link_speed(struct switchtec_ntb *sndev, 417 int partition, 418 enum ntb_speed *speed, 419 enum ntb_width *width) 420{ 421 struct switchtec_dev *stdev = sndev->stdev; 422 struct part_cfg_regs __iomem *part_cfg = 423 &stdev->mmio_part_cfg_all[partition]; 424 425 u32 pff = ioread32(&part_cfg->vep_pff_inst_id) & 0xFF; 426 u32 linksta = ioread32(&stdev->mmio_pff_csr[pff].pci_cap_region[13]); 427 428 if (speed) 429 *speed = (linksta >> 16) & 0xF; 430 431 if (width) 432 *width = (linksta >> 20) & 0x3F; 433} 434 435static void switchtec_ntb_set_link_speed(struct switchtec_ntb *sndev) 436{ 437 enum ntb_speed self_speed, peer_speed; 438 enum ntb_width self_width, peer_width; 439 440 if (!sndev->link_is_up) { 441 sndev->link_speed = NTB_SPEED_NONE; 442 sndev->link_width = NTB_WIDTH_NONE; 443 return; 444 } 445 446 switchtec_ntb_part_link_speed(sndev, sndev->self_partition, 447 &self_speed, &self_width); 448 switchtec_ntb_part_link_speed(sndev, sndev->peer_partition, 449 &peer_speed, &peer_width); 450 451 sndev->link_speed = min(self_speed, peer_speed); 452 sndev->link_width = min(self_width, peer_width); 453} 454 455static int crosslink_is_enabled(struct switchtec_ntb *sndev) 456{ 457 struct ntb_info_regs __iomem *inf = sndev->mmio_ntb; 458 459 return ioread8(&inf->ntp_info[sndev->peer_partition].xlink_enabled); 460} 461 462static void crosslink_init_dbmsgs(struct switchtec_ntb *sndev) 463{ 464 int i; 465 u32 msg_map = 0; 466 467 if (!crosslink_is_enabled(sndev)) 468 return; 469 470 for (i = 0; i < ARRAY_SIZE(sndev->mmio_peer_dbmsg->imsg); i++) { 471 int m = i | sndev->self_partition << 2; 472 473 msg_map |= m << i * 8; 474 } 475 476 iowrite32(msg_map, &sndev->mmio_peer_dbmsg->msg_map); 477 iowrite64(sndev->db_valid_mask << sndev->db_peer_shift, 478 &sndev->mmio_peer_dbmsg->odb_mask); 479} 480 481enum switchtec_msg { 482 LINK_MESSAGE = 0, 483 MSG_LINK_UP = 1, 484 MSG_LINK_DOWN = 2, 485 MSG_CHECK_LINK = 3, 486 MSG_LINK_FORCE_DOWN = 4, 487}; 488 489static int switchtec_ntb_reinit_peer(struct switchtec_ntb *sndev); 490 491static void switchtec_ntb_link_status_update(struct switchtec_ntb *sndev) 492{ 493 int link_sta; 494 int old = sndev->link_is_up; 495 496 link_sta = sndev->self_shared->link_sta; 497 if (link_sta) { 498 u64 peer = ioread64(&sndev->peer_shared->magic); 499 500 if ((peer & 0xFFFFFFFF) == SWITCHTEC_NTB_MAGIC) 501 link_sta = peer >> 32; 502 else 503 link_sta = 0; 504 } 505 506 sndev->link_is_up = link_sta; 507 switchtec_ntb_set_link_speed(sndev); 508 509 if (link_sta != old) { 510 switchtec_ntb_send_msg(sndev, LINK_MESSAGE, MSG_CHECK_LINK); 511 ntb_link_event(&sndev->ntb); 512 dev_info(&sndev->stdev->dev, "ntb link %s\n", 513 link_sta ? "up" : "down"); 514 515 if (link_sta) 516 crosslink_init_dbmsgs(sndev); 517 } 518} 519 520static void check_link_status_work(struct work_struct *work) 521{ 522 struct switchtec_ntb *sndev; 523 524 sndev = container_of(work, struct switchtec_ntb, 525 check_link_status_work); 526 527 if (sndev->link_force_down) { 528 sndev->link_force_down = false; 529 switchtec_ntb_reinit_peer(sndev); 530 531 if (sndev->link_is_up) { 532 sndev->link_is_up = 0; 533 ntb_link_event(&sndev->ntb); 534 dev_info(&sndev->stdev->dev, "ntb link forced down\n"); 535 } 536 537 return; 538 } 539 540 switchtec_ntb_link_status_update(sndev); 541} 542 543static void switchtec_ntb_check_link(struct switchtec_ntb *sndev, 544 enum switchtec_msg msg) 545{ 546 if (msg == MSG_LINK_FORCE_DOWN) 547 sndev->link_force_down = true; 548 549 schedule_work(&sndev->check_link_status_work); 550} 551 552static void switchtec_ntb_link_notification(struct switchtec_dev *stdev) 553{ 554 struct switchtec_ntb *sndev = stdev->sndev; 555 556 switchtec_ntb_check_link(sndev, MSG_CHECK_LINK); 557} 558 559static u64 switchtec_ntb_link_is_up(struct ntb_dev *ntb, 560 enum ntb_speed *speed, 561 enum ntb_width *width) 562{ 563 struct switchtec_ntb *sndev = ntb_sndev(ntb); 564 565 if (speed) 566 *speed = sndev->link_speed; 567 if (width) 568 *width = sndev->link_width; 569 570 return sndev->link_is_up; 571} 572 573static int switchtec_ntb_link_enable(struct ntb_dev *ntb, 574 enum ntb_speed max_speed, 575 enum ntb_width max_width) 576{ 577 struct switchtec_ntb *sndev = ntb_sndev(ntb); 578 579 dev_dbg(&sndev->stdev->dev, "enabling link\n"); 580 581 sndev->self_shared->link_sta = 1; 582 switchtec_ntb_send_msg(sndev, LINK_MESSAGE, MSG_LINK_UP); 583 584 switchtec_ntb_link_status_update(sndev); 585 586 return 0; 587} 588 589static int switchtec_ntb_link_disable(struct ntb_dev *ntb) 590{ 591 struct switchtec_ntb *sndev = ntb_sndev(ntb); 592 593 dev_dbg(&sndev->stdev->dev, "disabling link\n"); 594 595 sndev->self_shared->link_sta = 0; 596 switchtec_ntb_send_msg(sndev, LINK_MESSAGE, MSG_LINK_DOWN); 597 598 switchtec_ntb_link_status_update(sndev); 599 600 return 0; 601} 602 603static u64 switchtec_ntb_db_valid_mask(struct ntb_dev *ntb) 604{ 605 struct switchtec_ntb *sndev = ntb_sndev(ntb); 606 607 return sndev->db_valid_mask; 608} 609 610static int switchtec_ntb_db_vector_count(struct ntb_dev *ntb) 611{ 612 return 1; 613} 614 615static u64 switchtec_ntb_db_vector_mask(struct ntb_dev *ntb, int db_vector) 616{ 617 struct switchtec_ntb *sndev = ntb_sndev(ntb); 618 619 if (db_vector < 0 || db_vector > 1) 620 return 0; 621 622 return sndev->db_valid_mask; 623} 624 625static u64 switchtec_ntb_db_read(struct ntb_dev *ntb) 626{ 627 u64 ret; 628 struct switchtec_ntb *sndev = ntb_sndev(ntb); 629 630 ret = ioread64(&sndev->mmio_self_dbmsg->idb) >> sndev->db_shift; 631 632 return ret & sndev->db_valid_mask; 633} 634 635static int switchtec_ntb_db_clear(struct ntb_dev *ntb, u64 db_bits) 636{ 637 struct switchtec_ntb *sndev = ntb_sndev(ntb); 638 639 iowrite64(db_bits << sndev->db_shift, &sndev->mmio_self_dbmsg->idb); 640 641 return 0; 642} 643 644static int switchtec_ntb_db_set_mask(struct ntb_dev *ntb, u64 db_bits) 645{ 646 unsigned long irqflags; 647 struct switchtec_ntb *sndev = ntb_sndev(ntb); 648 649 if (db_bits & ~sndev->db_valid_mask) 650 return -EINVAL; 651 652 spin_lock_irqsave(&sndev->db_mask_lock, irqflags); 653 654 sndev->db_mask |= db_bits << sndev->db_shift; 655 iowrite64(~sndev->db_mask, &sndev->mmio_self_dbmsg->idb_mask); 656 657 spin_unlock_irqrestore(&sndev->db_mask_lock, irqflags); 658 659 return 0; 660} 661 662static int switchtec_ntb_db_clear_mask(struct ntb_dev *ntb, u64 db_bits) 663{ 664 unsigned long irqflags; 665 struct switchtec_ntb *sndev = ntb_sndev(ntb); 666 667 if (db_bits & ~sndev->db_valid_mask) 668 return -EINVAL; 669 670 spin_lock_irqsave(&sndev->db_mask_lock, irqflags); 671 672 sndev->db_mask &= ~(db_bits << sndev->db_shift); 673 iowrite64(~sndev->db_mask, &sndev->mmio_self_dbmsg->idb_mask); 674 675 spin_unlock_irqrestore(&sndev->db_mask_lock, irqflags); 676 677 return 0; 678} 679 680static u64 switchtec_ntb_db_read_mask(struct ntb_dev *ntb) 681{ 682 struct switchtec_ntb *sndev = ntb_sndev(ntb); 683 684 return (sndev->db_mask >> sndev->db_shift) & sndev->db_valid_mask; 685} 686 687static int switchtec_ntb_peer_db_addr(struct ntb_dev *ntb, 688 phys_addr_t *db_addr, 689 resource_size_t *db_size, 690 u64 *db_data, 691 int db_bit) 692{ 693 struct switchtec_ntb *sndev = ntb_sndev(ntb); 694 unsigned long offset; 695 696 if (unlikely(db_bit >= BITS_PER_LONG_LONG)) 697 return -EINVAL; 698 699 offset = (unsigned long)sndev->mmio_peer_dbmsg->odb - 700 (unsigned long)sndev->stdev->mmio; 701 702 offset += sndev->db_shift / 8; 703 704 if (db_addr) 705 *db_addr = pci_resource_start(ntb->pdev, 0) + offset; 706 if (db_size) 707 *db_size = sizeof(u32); 708 if (db_data) 709 *db_data = BIT_ULL(db_bit) << sndev->db_peer_shift; 710 711 return 0; 712} 713 714static int switchtec_ntb_peer_db_set(struct ntb_dev *ntb, u64 db_bits) 715{ 716 struct switchtec_ntb *sndev = ntb_sndev(ntb); 717 718 iowrite64(db_bits << sndev->db_peer_shift, 719 &sndev->mmio_peer_dbmsg->odb); 720 721 return 0; 722} 723 724static int switchtec_ntb_spad_count(struct ntb_dev *ntb) 725{ 726 struct switchtec_ntb *sndev = ntb_sndev(ntb); 727 728 return ARRAY_SIZE(sndev->self_shared->spad); 729} 730 731static u32 switchtec_ntb_spad_read(struct ntb_dev *ntb, int idx) 732{ 733 struct switchtec_ntb *sndev = ntb_sndev(ntb); 734 735 if (idx < 0 || idx >= ARRAY_SIZE(sndev->self_shared->spad)) 736 return 0; 737 738 if (!sndev->self_shared) 739 return 0; 740 741 return sndev->self_shared->spad[idx]; 742} 743 744static int switchtec_ntb_spad_write(struct ntb_dev *ntb, int idx, u32 val) 745{ 746 struct switchtec_ntb *sndev = ntb_sndev(ntb); 747 748 if (idx < 0 || idx >= ARRAY_SIZE(sndev->self_shared->spad)) 749 return -EINVAL; 750 751 if (!sndev->self_shared) 752 return -EIO; 753 754 sndev->self_shared->spad[idx] = val; 755 756 return 0; 757} 758 759static u32 switchtec_ntb_peer_spad_read(struct ntb_dev *ntb, int pidx, 760 int sidx) 761{ 762 struct switchtec_ntb *sndev = ntb_sndev(ntb); 763 764 if (pidx != NTB_DEF_PEER_IDX) 765 return -EINVAL; 766 767 if (sidx < 0 || sidx >= ARRAY_SIZE(sndev->peer_shared->spad)) 768 return 0; 769 770 if (!sndev->peer_shared) 771 return 0; 772 773 return ioread32(&sndev->peer_shared->spad[sidx]); 774} 775 776static int switchtec_ntb_peer_spad_write(struct ntb_dev *ntb, int pidx, 777 int sidx, u32 val) 778{ 779 struct switchtec_ntb *sndev = ntb_sndev(ntb); 780 781 if (pidx != NTB_DEF_PEER_IDX) 782 return -EINVAL; 783 784 if (sidx < 0 || sidx >= ARRAY_SIZE(sndev->peer_shared->spad)) 785 return -EINVAL; 786 787 if (!sndev->peer_shared) 788 return -EIO; 789 790 iowrite32(val, &sndev->peer_shared->spad[sidx]); 791 792 return 0; 793} 794 795static int switchtec_ntb_peer_spad_addr(struct ntb_dev *ntb, int pidx, 796 int sidx, phys_addr_t *spad_addr) 797{ 798 struct switchtec_ntb *sndev = ntb_sndev(ntb); 799 unsigned long offset; 800 801 if (pidx != NTB_DEF_PEER_IDX) 802 return -EINVAL; 803 804 offset = (unsigned long)&sndev->peer_shared->spad[sidx] - 805 (unsigned long)sndev->stdev->mmio; 806 807 if (spad_addr) 808 *spad_addr = pci_resource_start(ntb->pdev, 0) + offset; 809 810 return 0; 811} 812 813static const struct ntb_dev_ops switchtec_ntb_ops = { 814 .mw_count = switchtec_ntb_mw_count, 815 .mw_get_align = switchtec_ntb_mw_get_align, 816 .mw_set_trans = switchtec_ntb_mw_set_trans, 817 .peer_mw_count = switchtec_ntb_peer_mw_count, 818 .peer_mw_get_addr = switchtec_ntb_peer_mw_get_addr, 819 .link_is_up = switchtec_ntb_link_is_up, 820 .link_enable = switchtec_ntb_link_enable, 821 .link_disable = switchtec_ntb_link_disable, 822 .db_valid_mask = switchtec_ntb_db_valid_mask, 823 .db_vector_count = switchtec_ntb_db_vector_count, 824 .db_vector_mask = switchtec_ntb_db_vector_mask, 825 .db_read = switchtec_ntb_db_read, 826 .db_clear = switchtec_ntb_db_clear, 827 .db_set_mask = switchtec_ntb_db_set_mask, 828 .db_clear_mask = switchtec_ntb_db_clear_mask, 829 .db_read_mask = switchtec_ntb_db_read_mask, 830 .peer_db_addr = switchtec_ntb_peer_db_addr, 831 .peer_db_set = switchtec_ntb_peer_db_set, 832 .spad_count = switchtec_ntb_spad_count, 833 .spad_read = switchtec_ntb_spad_read, 834 .spad_write = switchtec_ntb_spad_write, 835 .peer_spad_read = switchtec_ntb_peer_spad_read, 836 .peer_spad_write = switchtec_ntb_peer_spad_write, 837 .peer_spad_addr = switchtec_ntb_peer_spad_addr, 838}; 839 840static int switchtec_ntb_init_sndev(struct switchtec_ntb *sndev) 841{ 842 u64 tpart_vec; 843 int self; 844 u64 part_map; 845 846 sndev->ntb.pdev = sndev->stdev->pdev; 847 sndev->ntb.topo = NTB_TOPO_SWITCH; 848 sndev->ntb.ops = &switchtec_ntb_ops; 849 850 INIT_WORK(&sndev->check_link_status_work, check_link_status_work); 851 sndev->link_force_down = false; 852 853 sndev->self_partition = sndev->stdev->partition; 854 855 sndev->mmio_ntb = sndev->stdev->mmio_ntb; 856 857 self = sndev->self_partition; 858 tpart_vec = ioread32(&sndev->mmio_ntb->ntp_info[self].target_part_high); 859 tpart_vec <<= 32; 860 tpart_vec |= ioread32(&sndev->mmio_ntb->ntp_info[self].target_part_low); 861 862 part_map = ioread64(&sndev->mmio_ntb->ep_map); 863 tpart_vec &= part_map; 864 part_map &= ~(1 << sndev->self_partition); 865 866 if (!tpart_vec) { 867 if (sndev->stdev->partition_count != 2) { 868 dev_err(&sndev->stdev->dev, 869 "ntb target partition not defined\n"); 870 return -ENODEV; 871 } 872 873 if (!part_map) { 874 dev_err(&sndev->stdev->dev, 875 "peer partition is not NT partition\n"); 876 return -ENODEV; 877 } 878 879 sndev->peer_partition = __ffs64(part_map); 880 } else { 881 if (__ffs64(tpart_vec) != (fls64(tpart_vec) - 1)) { 882 dev_err(&sndev->stdev->dev, 883 "ntb driver only supports 1 pair of 1-1 ntb mapping\n"); 884 return -ENODEV; 885 } 886 887 sndev->peer_partition = __ffs64(tpart_vec); 888 if (!(part_map & (1ULL << sndev->peer_partition))) { 889 dev_err(&sndev->stdev->dev, 890 "ntb target partition is not NT partition\n"); 891 return -ENODEV; 892 } 893 } 894 895 dev_dbg(&sndev->stdev->dev, "Partition ID %d of %d\n", 896 sndev->self_partition, sndev->stdev->partition_count); 897 898 sndev->mmio_ctrl = (void * __iomem)sndev->mmio_ntb + 899 SWITCHTEC_NTB_REG_CTRL_OFFSET; 900 sndev->mmio_dbmsg = (void * __iomem)sndev->mmio_ntb + 901 SWITCHTEC_NTB_REG_DBMSG_OFFSET; 902 903 sndev->mmio_self_ctrl = &sndev->mmio_ctrl[sndev->self_partition]; 904 sndev->mmio_peer_ctrl = &sndev->mmio_ctrl[sndev->peer_partition]; 905 sndev->mmio_self_dbmsg = &sndev->mmio_dbmsg[sndev->self_partition]; 906 sndev->mmio_peer_dbmsg = sndev->mmio_self_dbmsg; 907 908 return 0; 909} 910 911static int config_rsvd_lut_win(struct switchtec_ntb *sndev, 912 struct ntb_ctrl_regs __iomem *ctl, 913 int lut_idx, int partition, u64 addr) 914{ 915 int peer_bar = sndev->peer_direct_mw_to_bar[0]; 916 u32 ctl_val; 917 int rc; 918 919 rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_LOCK, 920 NTB_CTRL_PART_STATUS_LOCKED); 921 if (rc) 922 return rc; 923 924 ctl_val = ioread32(&ctl->bar_entry[peer_bar].ctl); 925 ctl_val &= 0xFF; 926 ctl_val |= NTB_CTRL_BAR_LUT_WIN_EN; 927 ctl_val |= ilog2(LUT_SIZE) << 8; 928 ctl_val |= (sndev->nr_lut_mw - 1) << 14; 929 iowrite32(ctl_val, &ctl->bar_entry[peer_bar].ctl); 930 931 iowrite64((NTB_CTRL_LUT_EN | (partition << 1) | addr), 932 &ctl->lut_entry[lut_idx]); 933 934 rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_CFG, 935 NTB_CTRL_PART_STATUS_NORMAL); 936 if (rc) { 937 u32 bar_error, lut_error; 938 939 bar_error = ioread32(&ctl->bar_error); 940 lut_error = ioread32(&ctl->lut_error); 941 dev_err(&sndev->stdev->dev, 942 "Error setting up reserved lut window: %08x / %08x\n", 943 bar_error, lut_error); 944 return rc; 945 } 946 947 return 0; 948} 949 950static int config_req_id_table(struct switchtec_ntb *sndev, 951 struct ntb_ctrl_regs __iomem *mmio_ctrl, 952 int *req_ids, int count) 953{ 954 int i, rc = 0; 955 u32 error; 956 u32 proxy_id; 957 958 if (ioread16(&mmio_ctrl->req_id_table_size) < count) { 959 dev_err(&sndev->stdev->dev, 960 "Not enough requester IDs available.\n"); 961 return -EFAULT; 962 } 963 964 rc = switchtec_ntb_part_op(sndev, mmio_ctrl, 965 NTB_CTRL_PART_OP_LOCK, 966 NTB_CTRL_PART_STATUS_LOCKED); 967 if (rc) 968 return rc; 969 970 for (i = 0; i < count; i++) { 971 iowrite32(req_ids[i] << 16 | NTB_CTRL_REQ_ID_EN, 972 &mmio_ctrl->req_id_table[i]); 973 974 proxy_id = ioread32(&mmio_ctrl->req_id_table[i]); 975 dev_dbg(&sndev->stdev->dev, 976 "Requester ID %02X:%02X.%X -> BB:%02X.%X\n", 977 req_ids[i] >> 8, (req_ids[i] >> 3) & 0x1F, 978 req_ids[i] & 0x7, (proxy_id >> 4) & 0x1F, 979 (proxy_id >> 1) & 0x7); 980 } 981 982 rc = switchtec_ntb_part_op(sndev, mmio_ctrl, 983 NTB_CTRL_PART_OP_CFG, 984 NTB_CTRL_PART_STATUS_NORMAL); 985 986 if (rc == -EIO) { 987 error = ioread32(&mmio_ctrl->req_id_error); 988 dev_err(&sndev->stdev->dev, 989 "Error setting up the requester ID table: %08x\n", 990 error); 991 } 992 993 return 0; 994} 995 996static int crosslink_setup_mws(struct switchtec_ntb *sndev, int ntb_lut_idx, 997 u64 *mw_addrs, int mw_count) 998{ 999 int rc, i; 1000 struct ntb_ctrl_regs __iomem *ctl = sndev->mmio_self_ctrl; 1001 u64 addr; 1002 size_t size, offset; 1003 int bar; 1004 int xlate_pos; 1005 u32 ctl_val; 1006 1007 rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_LOCK, 1008 NTB_CTRL_PART_STATUS_LOCKED); 1009 if (rc) 1010 return rc; 1011 1012 for (i = 0; i < sndev->nr_lut_mw; i++) { 1013 if (i == ntb_lut_idx) 1014 continue; 1015 1016 addr = mw_addrs[0] + LUT_SIZE * i; 1017 1018 iowrite64((NTB_CTRL_LUT_EN | (sndev->peer_partition << 1) | 1019 addr), 1020 &ctl->lut_entry[i]); 1021 } 1022 1023 sndev->nr_direct_mw = min_t(int, sndev->nr_direct_mw, mw_count); 1024 1025 for (i = 0; i < sndev->nr_direct_mw; i++) { 1026 bar = sndev->direct_mw_to_bar[i]; 1027 offset = (i == 0) ? LUT_SIZE * sndev->nr_lut_mw : 0; 1028 addr = mw_addrs[i] + offset; 1029 size = pci_resource_len(sndev->ntb.pdev, bar) - offset; 1030 xlate_pos = ilog2(size); 1031 1032 if (offset && size > offset) 1033 size = offset; 1034 1035 ctl_val = ioread32(&ctl->bar_entry[bar].ctl); 1036 ctl_val |= NTB_CTRL_BAR_DIR_WIN_EN; 1037 1038 iowrite32(ctl_val, &ctl->bar_entry[bar].ctl); 1039 iowrite32(xlate_pos | (lower_32_bits(size) & 0xFFFFF000), 1040 &ctl->bar_entry[bar].win_size); 1041 iowrite32(upper_32_bits(size), &ctl->bar_ext_entry[bar].win_size); 1042 iowrite64(sndev->peer_partition | addr, 1043 &ctl->bar_entry[bar].xlate_addr); 1044 } 1045 1046 rc = switchtec_ntb_part_op(sndev, ctl, NTB_CTRL_PART_OP_CFG, 1047 NTB_CTRL_PART_STATUS_NORMAL); 1048 if (rc) { 1049 u32 bar_error, lut_error; 1050 1051 bar_error = ioread32(&ctl->bar_error); 1052 lut_error = ioread32(&ctl->lut_error); 1053 dev_err(&sndev->stdev->dev, 1054 "Error setting up cross link windows: %08x / %08x\n", 1055 bar_error, lut_error); 1056 return rc; 1057 } 1058 1059 return 0; 1060} 1061 1062static int crosslink_setup_req_ids(struct switchtec_ntb *sndev, 1063 struct ntb_ctrl_regs __iomem *mmio_ctrl) 1064{ 1065 int req_ids[16]; 1066 int i; 1067 u32 proxy_id; 1068 1069 for (i = 0; i < ARRAY_SIZE(req_ids); i++) { 1070 proxy_id = ioread32(&sndev->mmio_self_ctrl->req_id_table[i]); 1071 1072 if (!(proxy_id & NTB_CTRL_REQ_ID_EN)) 1073 break; 1074 1075 req_ids[i] = ((proxy_id >> 1) & 0xFF); 1076 } 1077 1078 return config_req_id_table(sndev, mmio_ctrl, req_ids, i); 1079} 1080 1081/* 1082 * In crosslink configuration there is a virtual partition in the 1083 * middle of the two switches. The BARs in this partition have to be 1084 * enumerated and assigned addresses. 1085 */ 1086static int crosslink_enum_partition(struct switchtec_ntb *sndev, 1087 u64 *bar_addrs) 1088{ 1089 struct part_cfg_regs __iomem *part_cfg = 1090 &sndev->stdev->mmio_part_cfg_all[sndev->peer_partition]; 1091 u32 pff = ioread32(&part_cfg->vep_pff_inst_id) & 0xFF; 1092 struct pff_csr_regs __iomem *mmio_pff = 1093 &sndev->stdev->mmio_pff_csr[pff]; 1094 const u64 bar_space = 0x1000000000LL; 1095 u64 bar_addr; 1096 int bar_cnt = 0; 1097 int i; 1098 1099 iowrite16(0x6, &mmio_pff->pcicmd); 1100 1101 for (i = 0; i < ARRAY_SIZE(mmio_pff->pci_bar64); i++) { 1102 iowrite64(bar_space * i, &mmio_pff->pci_bar64[i]); 1103 bar_addr = ioread64(&mmio_pff->pci_bar64[i]); 1104 bar_addr &= ~0xf; 1105 1106 dev_dbg(&sndev->stdev->dev, 1107 "Crosslink BAR%d addr: %llx\n", 1108 i*2, bar_addr); 1109 1110 if (bar_addr != bar_space * i) 1111 continue; 1112 1113 bar_addrs[bar_cnt++] = bar_addr; 1114 } 1115 1116 return bar_cnt; 1117} 1118 1119static int switchtec_ntb_init_crosslink(struct switchtec_ntb *sndev) 1120{ 1121 int rc; 1122 int bar = sndev->direct_mw_to_bar[0]; 1123 const int ntb_lut_idx = 1; 1124 u64 bar_addrs[6]; 1125 u64 addr; 1126 int offset; 1127 int bar_cnt; 1128 1129 if (!crosslink_is_enabled(sndev)) 1130 return 0; 1131 1132 dev_info(&sndev->stdev->dev, "Using crosslink configuration\n"); 1133 sndev->ntb.topo = NTB_TOPO_CROSSLINK; 1134 1135 bar_cnt = crosslink_enum_partition(sndev, bar_addrs); 1136 if (bar_cnt < sndev->nr_direct_mw + 1) { 1137 dev_err(&sndev->stdev->dev, 1138 "Error enumerating crosslink partition\n"); 1139 return -EINVAL; 1140 } 1141 1142 addr = (bar_addrs[0] + SWITCHTEC_GAS_NTB_OFFSET + 1143 SWITCHTEC_NTB_REG_DBMSG_OFFSET + 1144 sizeof(struct ntb_dbmsg_regs) * sndev->peer_partition); 1145 1146 offset = addr & (LUT_SIZE - 1); 1147 addr -= offset; 1148 1149 rc = config_rsvd_lut_win(sndev, sndev->mmio_self_ctrl, ntb_lut_idx, 1150 sndev->peer_partition, addr); 1151 if (rc) 1152 return rc; 1153 1154 rc = crosslink_setup_mws(sndev, ntb_lut_idx, &bar_addrs[1], 1155 bar_cnt - 1); 1156 if (rc) 1157 return rc; 1158 1159 rc = crosslink_setup_req_ids(sndev, sndev->mmio_peer_ctrl); 1160 if (rc) 1161 return rc; 1162 1163 sndev->mmio_xlink_win = pci_iomap_range(sndev->stdev->pdev, bar, 1164 LUT_SIZE, LUT_SIZE); 1165 if (!sndev->mmio_xlink_win) { 1166 rc = -ENOMEM; 1167 return rc; 1168 } 1169 1170 sndev->mmio_peer_dbmsg = sndev->mmio_xlink_win + offset; 1171 sndev->nr_rsvd_luts++; 1172 1173 crosslink_init_dbmsgs(sndev); 1174 1175 return 0; 1176} 1177 1178static void switchtec_ntb_deinit_crosslink(struct switchtec_ntb *sndev) 1179{ 1180 if (sndev->mmio_xlink_win) 1181 pci_iounmap(sndev->stdev->pdev, sndev->mmio_xlink_win); 1182} 1183 1184static int map_bars(int *map, struct ntb_ctrl_regs __iomem *ctrl) 1185{ 1186 int i; 1187 int cnt = 0; 1188 1189 for (i = 0; i < ARRAY_SIZE(ctrl->bar_entry); i++) { 1190 u32 r = ioread32(&ctrl->bar_entry[i].ctl); 1191 1192 if (r & NTB_CTRL_BAR_VALID) 1193 map[cnt++] = i; 1194 } 1195 1196 return cnt; 1197} 1198 1199static void switchtec_ntb_init_mw(struct switchtec_ntb *sndev) 1200{ 1201 sndev->nr_direct_mw = map_bars(sndev->direct_mw_to_bar, 1202 sndev->mmio_self_ctrl); 1203 1204 sndev->nr_lut_mw = ioread16(&sndev->mmio_self_ctrl->lut_table_entries); 1205 sndev->nr_lut_mw = rounddown_pow_of_two(sndev->nr_lut_mw); 1206 1207 dev_dbg(&sndev->stdev->dev, "MWs: %d direct, %d lut\n", 1208 sndev->nr_direct_mw, sndev->nr_lut_mw); 1209 1210 sndev->peer_nr_direct_mw = map_bars(sndev->peer_direct_mw_to_bar, 1211 sndev->mmio_peer_ctrl); 1212 1213 sndev->peer_nr_lut_mw = 1214 ioread16(&sndev->mmio_peer_ctrl->lut_table_entries); 1215 sndev->peer_nr_lut_mw = rounddown_pow_of_two(sndev->peer_nr_lut_mw); 1216 1217 dev_dbg(&sndev->stdev->dev, "Peer MWs: %d direct, %d lut\n", 1218 sndev->peer_nr_direct_mw, sndev->peer_nr_lut_mw); 1219 1220} 1221 1222/* 1223 * There are 64 doorbells in the switch hardware but this is 1224 * shared among all partitions. So we must split them in half 1225 * (32 for each partition). However, the message interrupts are 1226 * also shared with the top 4 doorbells so we just limit this to 1227 * 28 doorbells per partition. 1228 * 1229 * In crosslink mode, each side has it's own dbmsg register so 1230 * they can each use all 60 of the available doorbells. 1231 */ 1232static void switchtec_ntb_init_db(struct switchtec_ntb *sndev) 1233{ 1234 sndev->db_mask = 0x0FFFFFFFFFFFFFFFULL; 1235 1236 if (sndev->mmio_peer_dbmsg != sndev->mmio_self_dbmsg) { 1237 sndev->db_shift = 0; 1238 sndev->db_peer_shift = 0; 1239 sndev->db_valid_mask = sndev->db_mask; 1240 } else if (sndev->self_partition < sndev->peer_partition) { 1241 sndev->db_shift = 0; 1242 sndev->db_peer_shift = 32; 1243 sndev->db_valid_mask = 0x0FFFFFFF; 1244 } else { 1245 sndev->db_shift = 32; 1246 sndev->db_peer_shift = 0; 1247 sndev->db_valid_mask = 0x0FFFFFFF; 1248 } 1249 1250 iowrite64(~sndev->db_mask, &sndev->mmio_self_dbmsg->idb_mask); 1251 iowrite64(sndev->db_valid_mask << sndev->db_peer_shift, 1252 &sndev->mmio_peer_dbmsg->odb_mask); 1253 1254 dev_dbg(&sndev->stdev->dev, "dbs: shift %d/%d, mask %016llx\n", 1255 sndev->db_shift, sndev->db_peer_shift, sndev->db_valid_mask); 1256} 1257 1258static void switchtec_ntb_init_msgs(struct switchtec_ntb *sndev) 1259{ 1260 int i; 1261 u32 msg_map = 0; 1262 1263 for (i = 0; i < ARRAY_SIZE(sndev->mmio_self_dbmsg->imsg); i++) { 1264 int m = i | sndev->peer_partition << 2; 1265 1266 msg_map |= m << i * 8; 1267 } 1268 1269 iowrite32(msg_map, &sndev->mmio_self_dbmsg->msg_map); 1270 1271 for (i = 0; i < ARRAY_SIZE(sndev->mmio_self_dbmsg->imsg); i++) 1272 iowrite64(NTB_DBMSG_IMSG_STATUS | NTB_DBMSG_IMSG_MASK, 1273 &sndev->mmio_self_dbmsg->imsg[i]); 1274} 1275 1276static int 1277switchtec_ntb_init_req_id_table(struct switchtec_ntb *sndev) 1278{ 1279 int req_ids[2]; 1280 1281 /* 1282 * Root Complex Requester ID (which is 0:00.0) 1283 */ 1284 req_ids[0] = 0; 1285 1286 /* 1287 * Host Bridge Requester ID (as read from the mmap address) 1288 */ 1289 req_ids[1] = ioread16(&sndev->mmio_ntb->requester_id); 1290 1291 return config_req_id_table(sndev, sndev->mmio_self_ctrl, req_ids, 1292 ARRAY_SIZE(req_ids)); 1293} 1294 1295static void switchtec_ntb_init_shared(struct switchtec_ntb *sndev) 1296{ 1297 int i; 1298 1299 memset(sndev->self_shared, 0, LUT_SIZE); 1300 sndev->self_shared->magic = SWITCHTEC_NTB_MAGIC; 1301 sndev->self_shared->partition_id = sndev->stdev->partition; 1302 1303 for (i = 0; i < sndev->nr_direct_mw; i++) { 1304 int bar = sndev->direct_mw_to_bar[i]; 1305 resource_size_t sz = pci_resource_len(sndev->stdev->pdev, bar); 1306 1307 if (i == 0) 1308 sz = min_t(resource_size_t, sz, 1309 LUT_SIZE * sndev->nr_lut_mw); 1310 1311 sndev->self_shared->mw_sizes[i] = sz; 1312 } 1313 1314 for (i = 0; i < sndev->nr_lut_mw; i++) { 1315 int idx = sndev->nr_direct_mw + i; 1316 1317 sndev->self_shared->mw_sizes[idx] = LUT_SIZE; 1318 } 1319} 1320 1321static int switchtec_ntb_init_shared_mw(struct switchtec_ntb *sndev) 1322{ 1323 int self_bar = sndev->direct_mw_to_bar[0]; 1324 int rc; 1325 1326 sndev->nr_rsvd_luts++; 1327 sndev->self_shared = dma_alloc_coherent(&sndev->stdev->pdev->dev, 1328 LUT_SIZE, 1329 &sndev->self_shared_dma, 1330 GFP_KERNEL); 1331 if (!sndev->self_shared) { 1332 dev_err(&sndev->stdev->dev, 1333 "unable to allocate memory for shared mw\n"); 1334 return -ENOMEM; 1335 } 1336 1337 switchtec_ntb_init_shared(sndev); 1338 1339 rc = config_rsvd_lut_win(sndev, sndev->mmio_peer_ctrl, 0, 1340 sndev->self_partition, 1341 sndev->self_shared_dma); 1342 if (rc) 1343 goto unalloc_and_exit; 1344 1345 sndev->peer_shared = pci_iomap(sndev->stdev->pdev, self_bar, LUT_SIZE); 1346 if (!sndev->peer_shared) { 1347 rc = -ENOMEM; 1348 goto unalloc_and_exit; 1349 } 1350 1351 dev_dbg(&sndev->stdev->dev, "Shared MW Ready\n"); 1352 return 0; 1353 1354unalloc_and_exit: 1355 dma_free_coherent(&sndev->stdev->pdev->dev, LUT_SIZE, 1356 sndev->self_shared, sndev->self_shared_dma); 1357 1358 return rc; 1359} 1360 1361static void switchtec_ntb_deinit_shared_mw(struct switchtec_ntb *sndev) 1362{ 1363 if (sndev->peer_shared) 1364 pci_iounmap(sndev->stdev->pdev, sndev->peer_shared); 1365 1366 if (sndev->self_shared) 1367 dma_free_coherent(&sndev->stdev->pdev->dev, LUT_SIZE, 1368 sndev->self_shared, 1369 sndev->self_shared_dma); 1370 sndev->nr_rsvd_luts--; 1371} 1372 1373static irqreturn_t switchtec_ntb_doorbell_isr(int irq, void *dev) 1374{ 1375 struct switchtec_ntb *sndev = dev; 1376 1377 dev_dbg(&sndev->stdev->dev, "doorbell\n"); 1378 1379 ntb_db_event(&sndev->ntb, 0); 1380 1381 return IRQ_HANDLED; 1382} 1383 1384static irqreturn_t switchtec_ntb_message_isr(int irq, void *dev) 1385{ 1386 int i; 1387 struct switchtec_ntb *sndev = dev; 1388 1389 for (i = 0; i < ARRAY_SIZE(sndev->mmio_self_dbmsg->imsg); i++) { 1390 u64 msg = ioread64(&sndev->mmio_self_dbmsg->imsg[i]); 1391 1392 if (msg & NTB_DBMSG_IMSG_STATUS) { 1393 dev_dbg(&sndev->stdev->dev, "message: %d %08x\n", 1394 i, (u32)msg); 1395 iowrite8(1, &sndev->mmio_self_dbmsg->imsg[i].status); 1396 1397 if (i == LINK_MESSAGE) 1398 switchtec_ntb_check_link(sndev, msg); 1399 } 1400 } 1401 1402 return IRQ_HANDLED; 1403} 1404 1405static int switchtec_ntb_init_db_msg_irq(struct switchtec_ntb *sndev) 1406{ 1407 int i; 1408 int rc; 1409 int doorbell_irq = 0; 1410 int message_irq = 0; 1411 int event_irq; 1412 int idb_vecs = sizeof(sndev->mmio_self_dbmsg->idb_vec_map); 1413 1414 event_irq = ioread32(&sndev->stdev->mmio_part_cfg->vep_vector_number); 1415 1416 while (doorbell_irq == event_irq) 1417 doorbell_irq++; 1418 while (message_irq == doorbell_irq || 1419 message_irq == event_irq) 1420 message_irq++; 1421 1422 dev_dbg(&sndev->stdev->dev, "irqs - event: %d, db: %d, msgs: %d\n", 1423 event_irq, doorbell_irq, message_irq); 1424 1425 for (i = 0; i < idb_vecs - 4; i++) 1426 iowrite8(doorbell_irq, 1427 &sndev->mmio_self_dbmsg->idb_vec_map[i]); 1428 1429 for (; i < idb_vecs; i++) 1430 iowrite8(message_irq, 1431 &sndev->mmio_self_dbmsg->idb_vec_map[i]); 1432 1433 sndev->doorbell_irq = pci_irq_vector(sndev->stdev->pdev, doorbell_irq); 1434 sndev->message_irq = pci_irq_vector(sndev->stdev->pdev, message_irq); 1435 1436 rc = request_irq(sndev->doorbell_irq, 1437 switchtec_ntb_doorbell_isr, 0, 1438 "switchtec_ntb_doorbell", sndev); 1439 if (rc) 1440 return rc; 1441 1442 rc = request_irq(sndev->message_irq, 1443 switchtec_ntb_message_isr, 0, 1444 "switchtec_ntb_message", sndev); 1445 if (rc) { 1446 free_irq(sndev->doorbell_irq, sndev); 1447 return rc; 1448 } 1449 1450 return 0; 1451} 1452 1453static void switchtec_ntb_deinit_db_msg_irq(struct switchtec_ntb *sndev) 1454{ 1455 free_irq(sndev->doorbell_irq, sndev); 1456 free_irq(sndev->message_irq, sndev); 1457} 1458 1459static int switchtec_ntb_reinit_peer(struct switchtec_ntb *sndev) 1460{ 1461 int rc; 1462 1463 if (crosslink_is_enabled(sndev)) 1464 return 0; 1465 1466 dev_info(&sndev->stdev->dev, "reinitialize shared memory window\n"); 1467 rc = config_rsvd_lut_win(sndev, sndev->mmio_peer_ctrl, 0, 1468 sndev->self_partition, 1469 sndev->self_shared_dma); 1470 return rc; 1471} 1472 1473static int switchtec_ntb_add(struct device *dev, 1474 struct class_interface *class_intf) 1475{ 1476 struct switchtec_dev *stdev = to_stdev(dev); 1477 struct switchtec_ntb *sndev; 1478 int rc; 1479 1480 stdev->sndev = NULL; 1481 1482 if (stdev->pdev->class != (PCI_CLASS_BRIDGE_OTHER << 8)) 1483 return -ENODEV; 1484 1485 sndev = kzalloc_node(sizeof(*sndev), GFP_KERNEL, dev_to_node(dev)); 1486 if (!sndev) 1487 return -ENOMEM; 1488 1489 sndev->stdev = stdev; 1490 rc = switchtec_ntb_init_sndev(sndev); 1491 if (rc) 1492 goto free_and_exit; 1493 1494 switchtec_ntb_init_mw(sndev); 1495 1496 rc = switchtec_ntb_init_req_id_table(sndev); 1497 if (rc) 1498 goto free_and_exit; 1499 1500 rc = switchtec_ntb_init_crosslink(sndev); 1501 if (rc) 1502 goto free_and_exit; 1503 1504 switchtec_ntb_init_db(sndev); 1505 switchtec_ntb_init_msgs(sndev); 1506 1507 rc = switchtec_ntb_init_shared_mw(sndev); 1508 if (rc) 1509 goto deinit_crosslink; 1510 1511 rc = switchtec_ntb_init_db_msg_irq(sndev); 1512 if (rc) 1513 goto deinit_shared_and_exit; 1514 1515 /* 1516 * If this host crashed, the other host may think the link is 1517 * still up. Tell them to force it down (it will go back up 1518 * once we register the ntb device). 1519 */ 1520 switchtec_ntb_send_msg(sndev, LINK_MESSAGE, MSG_LINK_FORCE_DOWN); 1521 1522 rc = ntb_register_device(&sndev->ntb); 1523 if (rc) 1524 goto deinit_and_exit; 1525 1526 stdev->sndev = sndev; 1527 stdev->link_notifier = switchtec_ntb_link_notification; 1528 dev_info(dev, "NTB device registered\n"); 1529 1530 return 0; 1531 1532deinit_and_exit: 1533 switchtec_ntb_deinit_db_msg_irq(sndev); 1534deinit_shared_and_exit: 1535 switchtec_ntb_deinit_shared_mw(sndev); 1536deinit_crosslink: 1537 switchtec_ntb_deinit_crosslink(sndev); 1538free_and_exit: 1539 kfree(sndev); 1540 dev_err(dev, "failed to register ntb device: %d\n", rc); 1541 return rc; 1542} 1543 1544static void switchtec_ntb_remove(struct device *dev, 1545 struct class_interface *class_intf) 1546{ 1547 struct switchtec_dev *stdev = to_stdev(dev); 1548 struct switchtec_ntb *sndev = stdev->sndev; 1549 1550 if (!sndev) 1551 return; 1552 1553 stdev->link_notifier = NULL; 1554 stdev->sndev = NULL; 1555 ntb_unregister_device(&sndev->ntb); 1556 switchtec_ntb_deinit_db_msg_irq(sndev); 1557 switchtec_ntb_deinit_shared_mw(sndev); 1558 switchtec_ntb_deinit_crosslink(sndev); 1559 kfree(sndev); 1560 dev_info(dev, "ntb device unregistered\n"); 1561} 1562 1563static struct class_interface switchtec_interface = { 1564 .add_dev = switchtec_ntb_add, 1565 .remove_dev = switchtec_ntb_remove, 1566}; 1567 1568static int __init switchtec_ntb_init(void) 1569{ 1570 switchtec_interface.class = switchtec_class; 1571 return class_interface_register(&switchtec_interface); 1572} 1573module_init(switchtec_ntb_init); 1574 1575static void __exit switchtec_ntb_exit(void) 1576{ 1577 class_interface_unregister(&switchtec_interface); 1578} 1579module_exit(switchtec_ntb_exit);