1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * USB4 specific functionality 4 * 5 * Copyright (C) 2019, Intel Corporation 6 * Authors: Mika Westerberg <mika.westerberg@linux.intel.com> 7 * Rajmohan Mani <rajmohan.mani@intel.com> 8 */ 9 10 #include <linux/delay.h> 11 #include <linux/ktime.h> 12 #include <linux/units.h> 13 14 #include "sb_regs.h" 15 #include "tb.h" 16 17 #define USB4_DATA_RETRIES 3 18 #define USB4_DATA_DWORDS 16 19 20 enum usb4_sb_target { 21 USB4_SB_TARGET_ROUTER, 22 USB4_SB_TARGET_PARTNER, 23 USB4_SB_TARGET_RETIMER, 24 }; 25 26 #define USB4_NVM_READ_OFFSET_MASK GENMASK(23, 2) 27 #define USB4_NVM_READ_OFFSET_SHIFT 2 28 #define USB4_NVM_READ_LENGTH_MASK GENMASK(27, 24) 29 #define USB4_NVM_READ_LENGTH_SHIFT 24 30 31 #define USB4_NVM_SET_OFFSET_MASK USB4_NVM_READ_OFFSET_MASK 32 #define USB4_NVM_SET_OFFSET_SHIFT USB4_NVM_READ_OFFSET_SHIFT 33 34 #define USB4_DROM_ADDRESS_MASK GENMASK(14, 2) 35 #define USB4_DROM_ADDRESS_SHIFT 2 36 #define USB4_DROM_SIZE_MASK GENMASK(19, 15) 37 #define USB4_DROM_SIZE_SHIFT 15 38 39 #define USB4_NVM_SECTOR_SIZE_MASK GENMASK(23, 0) 40 41 #define USB4_BA_LENGTH_MASK GENMASK(7, 0) 42 #define USB4_BA_INDEX_MASK GENMASK(15, 0) 43 44 enum usb4_ba_index { 45 USB4_BA_MAX_USB3 = 0x1, 46 USB4_BA_MIN_DP_AUX = 0x2, 47 USB4_BA_MIN_DP_MAIN = 0x3, 48 USB4_BA_MAX_PCIE = 0x4, 49 USB4_BA_MAX_HI = 0x5, 50 }; 51 52 #define USB4_BA_VALUE_MASK GENMASK(31, 16) 53 #define USB4_BA_VALUE_SHIFT 16 54 55 static int usb4_native_switch_op(struct tb_switch *sw, u16 opcode, 56 u32 *metadata, u8 *status, 57 const void *tx_data, size_t tx_dwords, 58 void *rx_data, size_t rx_dwords) 59 { 60 u32 val; 61 int ret; 62 63 if (metadata) { 64 ret = tb_sw_write(sw, metadata, TB_CFG_SWITCH, ROUTER_CS_25, 1); 65 if (ret) 66 return ret; 67 } 68 if (tx_dwords) { 69 ret = tb_sw_write(sw, tx_data, TB_CFG_SWITCH, ROUTER_CS_9, 70 tx_dwords); 71 if (ret) 72 return ret; 73 } 74 75 val = opcode | ROUTER_CS_26_OV; 76 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, ROUTER_CS_26, 1); 77 if (ret) 78 return ret; 79 80 ret = tb_switch_wait_for_bit(sw, ROUTER_CS_26, ROUTER_CS_26_OV, 0, 500); 81 if (ret) 82 return ret; 83 84 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_26, 1); 85 if (ret) 86 return ret; 87 88 if (val & ROUTER_CS_26_ONS) 89 return -EOPNOTSUPP; 90 91 if (status) 92 *status = (val & ROUTER_CS_26_STATUS_MASK) >> 93 ROUTER_CS_26_STATUS_SHIFT; 94 95 if (metadata) { 96 ret = tb_sw_read(sw, metadata, TB_CFG_SWITCH, ROUTER_CS_25, 1); 97 if (ret) 98 return ret; 99 } 100 if (rx_dwords) { 101 ret = tb_sw_read(sw, rx_data, TB_CFG_SWITCH, ROUTER_CS_9, 102 rx_dwords); 103 if (ret) 104 return ret; 105 } 106 107 return 0; 108 } 109 110 static int __usb4_switch_op(struct tb_switch *sw, u16 opcode, u32 *metadata, 111 u8 *status, const void *tx_data, size_t tx_dwords, 112 void *rx_data, size_t rx_dwords) 113 { 114 const struct tb_cm_ops *cm_ops = sw->tb->cm_ops; 115 116 if (tx_dwords > USB4_DATA_DWORDS || rx_dwords > USB4_DATA_DWORDS) 117 return -EINVAL; 118 119 /* 120 * If the connection manager implementation provides USB4 router 121 * operation proxy callback, call it here instead of running the 122 * operation natively. 123 */ 124 if (cm_ops->usb4_switch_op) { 125 int ret; 126 127 ret = cm_ops->usb4_switch_op(sw, opcode, metadata, status, 128 tx_data, tx_dwords, rx_data, 129 rx_dwords); 130 if (ret != -EOPNOTSUPP) 131 return ret; 132 133 /* 134 * If the proxy was not supported then run the native 135 * router operation instead. 136 */ 137 } 138 139 return usb4_native_switch_op(sw, opcode, metadata, status, tx_data, 140 tx_dwords, rx_data, rx_dwords); 141 } 142 143 static inline int usb4_switch_op(struct tb_switch *sw, u16 opcode, 144 u32 *metadata, u8 *status) 145 { 146 return __usb4_switch_op(sw, opcode, metadata, status, NULL, 0, NULL, 0); 147 } 148 149 static inline int usb4_switch_op_data(struct tb_switch *sw, u16 opcode, 150 u32 *metadata, u8 *status, 151 const void *tx_data, size_t tx_dwords, 152 void *rx_data, size_t rx_dwords) 153 { 154 return __usb4_switch_op(sw, opcode, metadata, status, tx_data, 155 tx_dwords, rx_data, rx_dwords); 156 } 157 158 /** 159 * usb4_switch_check_wakes() - Check for wakes and notify PM core about them 160 * @sw: Router whose wakes to check 161 * 162 * Checks wakes occurred during suspend and notify the PM core about them. 163 */ 164 void usb4_switch_check_wakes(struct tb_switch *sw) 165 { 166 bool wakeup_usb4 = false; 167 struct usb4_port *usb4; 168 struct tb_port *port; 169 bool wakeup = false; 170 u32 val; 171 172 if (tb_route(sw)) { 173 if (tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_6, 1)) 174 return; 175 176 tb_sw_dbg(sw, "PCIe wake: %s, USB3 wake: %s\n", 177 (val & ROUTER_CS_6_WOPS) ? "yes" : "no", 178 (val & ROUTER_CS_6_WOUS) ? "yes" : "no"); 179 180 wakeup = val & (ROUTER_CS_6_WOPS | ROUTER_CS_6_WOUS); 181 } 182 183 /* 184 * Check for any downstream ports for USB4 wake, 185 * connection wake and disconnection wake. 186 */ 187 tb_switch_for_each_port(sw, port) { 188 if (!port->cap_usb4) 189 continue; 190 191 if (tb_port_read(port, &val, TB_CFG_PORT, 192 port->cap_usb4 + PORT_CS_18, 1)) 193 break; 194 195 tb_port_dbg(port, "USB4 wake: %s, connection wake: %s, disconnection wake: %s\n", 196 (val & PORT_CS_18_WOU4S) ? "yes" : "no", 197 (val & PORT_CS_18_WOCS) ? "yes" : "no", 198 (val & PORT_CS_18_WODS) ? "yes" : "no"); 199 200 wakeup_usb4 = val & (PORT_CS_18_WOU4S | PORT_CS_18_WOCS | 201 PORT_CS_18_WODS); 202 203 usb4 = port->usb4; 204 if (device_may_wakeup(&usb4->dev) && wakeup_usb4) 205 pm_wakeup_event(&usb4->dev, 0); 206 207 wakeup |= wakeup_usb4; 208 } 209 210 if (wakeup) 211 pm_wakeup_event(&sw->dev, 0); 212 } 213 214 static bool link_is_usb4(struct tb_port *port) 215 { 216 u32 val; 217 218 if (!port->cap_usb4) 219 return false; 220 221 if (tb_port_read(port, &val, TB_CFG_PORT, 222 port->cap_usb4 + PORT_CS_18, 1)) 223 return false; 224 225 return !(val & PORT_CS_18_TCM); 226 } 227 228 /** 229 * usb4_switch_setup() - Additional setup for USB4 device 230 * @sw: USB4 router to setup 231 * 232 * USB4 routers need additional settings in order to enable all the 233 * tunneling. This function enables USB and PCIe tunneling if it can be 234 * enabled (e.g the parent switch also supports them). If USB tunneling 235 * is not available for some reason (like that there is Thunderbolt 3 236 * switch upstream) then the internal xHCI controller is enabled 237 * instead. 238 * 239 * This does not set the configuration valid bit of the router. To do 240 * that call usb4_switch_configuration_valid(). 241 */ 242 int usb4_switch_setup(struct tb_switch *sw) 243 { 244 struct tb_switch *parent = tb_switch_parent(sw); 245 struct tb_port *down; 246 bool tbt3, xhci; 247 u32 val = 0; 248 int ret; 249 250 if (!tb_route(sw)) 251 return 0; 252 253 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_6, 1); 254 if (ret) 255 return ret; 256 257 down = tb_switch_downstream_port(sw); 258 sw->link_usb4 = link_is_usb4(down); 259 tb_sw_dbg(sw, "link: %s\n", sw->link_usb4 ? "USB4" : "TBT"); 260 261 xhci = val & ROUTER_CS_6_HCI; 262 tbt3 = !(val & ROUTER_CS_6_TNS); 263 264 tb_sw_dbg(sw, "TBT3 support: %s, xHCI: %s\n", 265 tbt3 ? "yes" : "no", xhci ? "yes" : "no"); 266 267 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 268 if (ret) 269 return ret; 270 271 if (tb_acpi_may_tunnel_usb3() && sw->link_usb4 && 272 tb_switch_find_port(parent, TB_TYPE_USB3_DOWN)) { 273 val |= ROUTER_CS_5_UTO; 274 xhci = false; 275 } 276 277 /* 278 * Only enable PCIe tunneling if the parent router supports it 279 * and it is not disabled. 280 */ 281 if (tb_acpi_may_tunnel_pcie() && 282 tb_switch_find_port(parent, TB_TYPE_PCIE_DOWN)) { 283 val |= ROUTER_CS_5_PTO; 284 /* 285 * xHCI can be enabled if PCIe tunneling is supported 286 * and the parent does not have any USB3 dowstream 287 * adapters (so we cannot do USB 3.x tunneling). 288 */ 289 if (xhci) 290 val |= ROUTER_CS_5_HCO; 291 } 292 293 /* TBT3 supported by the CM */ 294 val &= ~ROUTER_CS_5_CNS; 295 296 return tb_sw_write(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 297 } 298 299 /** 300 * usb4_switch_configuration_valid() - Set tunneling configuration to be valid 301 * @sw: USB4 router 302 * 303 * Sets configuration valid bit for the router. Must be called before 304 * any tunnels can be set through the router and after 305 * usb4_switch_setup() has been called. Can be called to host and device 306 * routers (does nothing for the latter). 307 * 308 * Returns %0 in success and negative errno otherwise. 309 */ 310 int usb4_switch_configuration_valid(struct tb_switch *sw) 311 { 312 u32 val; 313 int ret; 314 315 if (!tb_route(sw)) 316 return 0; 317 318 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 319 if (ret) 320 return ret; 321 322 val |= ROUTER_CS_5_CV; 323 324 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 325 if (ret) 326 return ret; 327 328 return tb_switch_wait_for_bit(sw, ROUTER_CS_6, ROUTER_CS_6_CR, 329 ROUTER_CS_6_CR, 50); 330 } 331 332 /** 333 * usb4_switch_read_uid() - Read UID from USB4 router 334 * @sw: USB4 router 335 * @uid: UID is stored here 336 * 337 * Reads 64-bit UID from USB4 router config space. 338 */ 339 int usb4_switch_read_uid(struct tb_switch *sw, u64 *uid) 340 { 341 return tb_sw_read(sw, uid, TB_CFG_SWITCH, ROUTER_CS_7, 2); 342 } 343 344 static int usb4_switch_drom_read_block(void *data, 345 unsigned int dwaddress, void *buf, 346 size_t dwords) 347 { 348 struct tb_switch *sw = data; 349 u8 status = 0; 350 u32 metadata; 351 int ret; 352 353 metadata = (dwords << USB4_DROM_SIZE_SHIFT) & USB4_DROM_SIZE_MASK; 354 metadata |= (dwaddress << USB4_DROM_ADDRESS_SHIFT) & 355 USB4_DROM_ADDRESS_MASK; 356 357 ret = usb4_switch_op_data(sw, USB4_SWITCH_OP_DROM_READ, &metadata, 358 &status, NULL, 0, buf, dwords); 359 if (ret) 360 return ret; 361 362 return status ? -EIO : 0; 363 } 364 365 /** 366 * usb4_switch_drom_read() - Read arbitrary bytes from USB4 router DROM 367 * @sw: USB4 router 368 * @address: Byte address inside DROM to start reading 369 * @buf: Buffer where the DROM content is stored 370 * @size: Number of bytes to read from DROM 371 * 372 * Uses USB4 router operations to read router DROM. For devices this 373 * should always work but for hosts it may return %-EOPNOTSUPP in which 374 * case the host router does not have DROM. 375 */ 376 int usb4_switch_drom_read(struct tb_switch *sw, unsigned int address, void *buf, 377 size_t size) 378 { 379 return tb_nvm_read_data(address, buf, size, USB4_DATA_RETRIES, 380 usb4_switch_drom_read_block, sw); 381 } 382 383 /** 384 * usb4_switch_lane_bonding_possible() - Are conditions met for lane bonding 385 * @sw: USB4 router 386 * 387 * Checks whether conditions are met so that lane bonding can be 388 * established with the upstream router. Call only for device routers. 389 */ 390 bool usb4_switch_lane_bonding_possible(struct tb_switch *sw) 391 { 392 struct tb_port *up; 393 int ret; 394 u32 val; 395 396 up = tb_upstream_port(sw); 397 ret = tb_port_read(up, &val, TB_CFG_PORT, up->cap_usb4 + PORT_CS_18, 1); 398 if (ret) 399 return false; 400 401 return !!(val & PORT_CS_18_BE); 402 } 403 404 /** 405 * usb4_switch_set_wake() - Enabled/disable wake 406 * @sw: USB4 router 407 * @flags: Wakeup flags (%0 to disable) 408 * 409 * Enables/disables router to wake up from sleep. 410 */ 411 int usb4_switch_set_wake(struct tb_switch *sw, unsigned int flags) 412 { 413 struct usb4_port *usb4; 414 struct tb_port *port; 415 u64 route = tb_route(sw); 416 u32 val; 417 int ret; 418 419 /* 420 * Enable wakes coming from all USB4 downstream ports (from 421 * child routers). For device routers do this also for the 422 * upstream USB4 port. 423 */ 424 tb_switch_for_each_port(sw, port) { 425 if (!tb_port_is_null(port)) 426 continue; 427 if (!route && tb_is_upstream_port(port)) 428 continue; 429 if (!port->cap_usb4) 430 continue; 431 432 ret = tb_port_read(port, &val, TB_CFG_PORT, 433 port->cap_usb4 + PORT_CS_19, 1); 434 if (ret) 435 return ret; 436 437 val &= ~(PORT_CS_19_WOC | PORT_CS_19_WOD | PORT_CS_19_WOU4); 438 439 if (tb_is_upstream_port(port)) { 440 val |= PORT_CS_19_WOU4; 441 } else { 442 bool configured = val & PORT_CS_19_PC; 443 usb4 = port->usb4; 444 445 if (((flags & TB_WAKE_ON_CONNECT) | 446 device_may_wakeup(&usb4->dev)) && !configured) 447 val |= PORT_CS_19_WOC; 448 if (((flags & TB_WAKE_ON_DISCONNECT) | 449 device_may_wakeup(&usb4->dev)) && configured) 450 val |= PORT_CS_19_WOD; 451 if ((flags & TB_WAKE_ON_USB4) && configured) 452 val |= PORT_CS_19_WOU4; 453 } 454 455 ret = tb_port_write(port, &val, TB_CFG_PORT, 456 port->cap_usb4 + PORT_CS_19, 1); 457 if (ret) 458 return ret; 459 } 460 461 /* 462 * Enable wakes from PCIe, USB 3.x and DP on this router. Only 463 * needed for device routers. 464 */ 465 if (route) { 466 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 467 if (ret) 468 return ret; 469 470 val &= ~(ROUTER_CS_5_WOP | ROUTER_CS_5_WOU | ROUTER_CS_5_WOD); 471 if (flags & TB_WAKE_ON_USB3) 472 val |= ROUTER_CS_5_WOU; 473 if (flags & TB_WAKE_ON_PCIE) 474 val |= ROUTER_CS_5_WOP; 475 if (flags & TB_WAKE_ON_DP) 476 val |= ROUTER_CS_5_WOD; 477 478 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 479 if (ret) 480 return ret; 481 } 482 483 return 0; 484 } 485 486 /** 487 * usb4_switch_set_sleep() - Prepare the router to enter sleep 488 * @sw: USB4 router 489 * 490 * Sets sleep bit for the router. Returns when the router sleep ready 491 * bit has been asserted. 492 */ 493 int usb4_switch_set_sleep(struct tb_switch *sw) 494 { 495 int ret; 496 u32 val; 497 498 /* Set sleep bit and wait for sleep ready to be asserted */ 499 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 500 if (ret) 501 return ret; 502 503 val |= ROUTER_CS_5_SLP; 504 505 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, ROUTER_CS_5, 1); 506 if (ret) 507 return ret; 508 509 return tb_switch_wait_for_bit(sw, ROUTER_CS_6, ROUTER_CS_6_SLPR, 510 ROUTER_CS_6_SLPR, 500); 511 } 512 513 /** 514 * usb4_switch_nvm_sector_size() - Return router NVM sector size 515 * @sw: USB4 router 516 * 517 * If the router supports NVM operations this function returns the NVM 518 * sector size in bytes. If NVM operations are not supported returns 519 * %-EOPNOTSUPP. 520 */ 521 int usb4_switch_nvm_sector_size(struct tb_switch *sw) 522 { 523 u32 metadata; 524 u8 status; 525 int ret; 526 527 ret = usb4_switch_op(sw, USB4_SWITCH_OP_NVM_SECTOR_SIZE, &metadata, 528 &status); 529 if (ret) 530 return ret; 531 532 if (status) 533 return status == 0x2 ? -EOPNOTSUPP : -EIO; 534 535 return metadata & USB4_NVM_SECTOR_SIZE_MASK; 536 } 537 538 static int usb4_switch_nvm_read_block(void *data, 539 unsigned int dwaddress, void *buf, size_t dwords) 540 { 541 struct tb_switch *sw = data; 542 u8 status = 0; 543 u32 metadata; 544 int ret; 545 546 metadata = (dwords << USB4_NVM_READ_LENGTH_SHIFT) & 547 USB4_NVM_READ_LENGTH_MASK; 548 metadata |= (dwaddress << USB4_NVM_READ_OFFSET_SHIFT) & 549 USB4_NVM_READ_OFFSET_MASK; 550 551 ret = usb4_switch_op_data(sw, USB4_SWITCH_OP_NVM_READ, &metadata, 552 &status, NULL, 0, buf, dwords); 553 if (ret) 554 return ret; 555 556 return status ? -EIO : 0; 557 } 558 559 /** 560 * usb4_switch_nvm_read() - Read arbitrary bytes from router NVM 561 * @sw: USB4 router 562 * @address: Starting address in bytes 563 * @buf: Read data is placed here 564 * @size: How many bytes to read 565 * 566 * Reads NVM contents of the router. If NVM is not supported returns 567 * %-EOPNOTSUPP. 568 */ 569 int usb4_switch_nvm_read(struct tb_switch *sw, unsigned int address, void *buf, 570 size_t size) 571 { 572 return tb_nvm_read_data(address, buf, size, USB4_DATA_RETRIES, 573 usb4_switch_nvm_read_block, sw); 574 } 575 576 /** 577 * usb4_switch_nvm_set_offset() - Set NVM write offset 578 * @sw: USB4 router 579 * @address: Start offset 580 * 581 * Explicitly sets NVM write offset. Normally when writing to NVM this 582 * is done automatically by usb4_switch_nvm_write(). 583 * 584 * Returns %0 in success and negative errno if there was a failure. 585 */ 586 int usb4_switch_nvm_set_offset(struct tb_switch *sw, unsigned int address) 587 { 588 u32 metadata, dwaddress; 589 u8 status = 0; 590 int ret; 591 592 dwaddress = address / 4; 593 metadata = (dwaddress << USB4_NVM_SET_OFFSET_SHIFT) & 594 USB4_NVM_SET_OFFSET_MASK; 595 596 ret = usb4_switch_op(sw, USB4_SWITCH_OP_NVM_SET_OFFSET, &metadata, 597 &status); 598 if (ret) 599 return ret; 600 601 return status ? -EIO : 0; 602 } 603 604 static int usb4_switch_nvm_write_next_block(void *data, unsigned int dwaddress, 605 const void *buf, size_t dwords) 606 { 607 struct tb_switch *sw = data; 608 u8 status; 609 int ret; 610 611 ret = usb4_switch_op_data(sw, USB4_SWITCH_OP_NVM_WRITE, NULL, &status, 612 buf, dwords, NULL, 0); 613 if (ret) 614 return ret; 615 616 return status ? -EIO : 0; 617 } 618 619 /** 620 * usb4_switch_nvm_write() - Write to the router NVM 621 * @sw: USB4 router 622 * @address: Start address where to write in bytes 623 * @buf: Pointer to the data to write 624 * @size: Size of @buf in bytes 625 * 626 * Writes @buf to the router NVM using USB4 router operations. If NVM 627 * write is not supported returns %-EOPNOTSUPP. 628 */ 629 int usb4_switch_nvm_write(struct tb_switch *sw, unsigned int address, 630 const void *buf, size_t size) 631 { 632 int ret; 633 634 ret = usb4_switch_nvm_set_offset(sw, address); 635 if (ret) 636 return ret; 637 638 return tb_nvm_write_data(address, buf, size, USB4_DATA_RETRIES, 639 usb4_switch_nvm_write_next_block, sw); 640 } 641 642 /** 643 * usb4_switch_nvm_authenticate() - Authenticate new NVM 644 * @sw: USB4 router 645 * 646 * After the new NVM has been written via usb4_switch_nvm_write(), this 647 * function triggers NVM authentication process. The router gets power 648 * cycled and if the authentication is successful the new NVM starts 649 * running. In case of failure returns negative errno. 650 * 651 * The caller should call usb4_switch_nvm_authenticate_status() to read 652 * the status of the authentication after power cycle. It should be the 653 * first router operation to avoid the status being lost. 654 */ 655 int usb4_switch_nvm_authenticate(struct tb_switch *sw) 656 { 657 int ret; 658 659 ret = usb4_switch_op(sw, USB4_SWITCH_OP_NVM_AUTH, NULL, NULL); 660 switch (ret) { 661 /* 662 * The router is power cycled once NVM_AUTH is started so it is 663 * expected to get any of the following errors back. 664 */ 665 case -EACCES: 666 case -ENOTCONN: 667 case -ETIMEDOUT: 668 return 0; 669 670 default: 671 return ret; 672 } 673 } 674 675 /** 676 * usb4_switch_nvm_authenticate_status() - Read status of last NVM authenticate 677 * @sw: USB4 router 678 * @status: Status code of the operation 679 * 680 * The function checks if there is status available from the last NVM 681 * authenticate router operation. If there is status then %0 is returned 682 * and the status code is placed in @status. Returns negative errno in case 683 * of failure. 684 * 685 * Must be called before any other router operation. 686 */ 687 int usb4_switch_nvm_authenticate_status(struct tb_switch *sw, u32 *status) 688 { 689 const struct tb_cm_ops *cm_ops = sw->tb->cm_ops; 690 u16 opcode; 691 u32 val; 692 int ret; 693 694 if (cm_ops->usb4_switch_nvm_authenticate_status) { 695 ret = cm_ops->usb4_switch_nvm_authenticate_status(sw, status); 696 if (ret != -EOPNOTSUPP) 697 return ret; 698 } 699 700 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, ROUTER_CS_26, 1); 701 if (ret) 702 return ret; 703 704 /* Check that the opcode is correct */ 705 opcode = val & ROUTER_CS_26_OPCODE_MASK; 706 if (opcode == USB4_SWITCH_OP_NVM_AUTH) { 707 if (val & ROUTER_CS_26_OV) 708 return -EBUSY; 709 if (val & ROUTER_CS_26_ONS) 710 return -EOPNOTSUPP; 711 712 *status = (val & ROUTER_CS_26_STATUS_MASK) >> 713 ROUTER_CS_26_STATUS_SHIFT; 714 } else { 715 *status = 0; 716 } 717 718 return 0; 719 } 720 721 /** 722 * usb4_switch_credits_init() - Read buffer allocation parameters 723 * @sw: USB4 router 724 * 725 * Reads @sw buffer allocation parameters and initializes @sw buffer 726 * allocation fields accordingly. Specifically @sw->credits_allocation 727 * is set to %true if these parameters can be used in tunneling. 728 * 729 * Returns %0 on success and negative errno otherwise. 730 */ 731 int usb4_switch_credits_init(struct tb_switch *sw) 732 { 733 int max_usb3, min_dp_aux, min_dp_main, max_pcie, max_dma; 734 int ret, length, i, nports; 735 const struct tb_port *port; 736 u32 data[USB4_DATA_DWORDS]; 737 u32 metadata = 0; 738 u8 status = 0; 739 740 memset(data, 0, sizeof(data)); 741 ret = usb4_switch_op_data(sw, USB4_SWITCH_OP_BUFFER_ALLOC, &metadata, 742 &status, NULL, 0, data, ARRAY_SIZE(data)); 743 if (ret) 744 return ret; 745 if (status) 746 return -EIO; 747 748 length = metadata & USB4_BA_LENGTH_MASK; 749 if (WARN_ON(length > ARRAY_SIZE(data))) 750 return -EMSGSIZE; 751 752 max_usb3 = -1; 753 min_dp_aux = -1; 754 min_dp_main = -1; 755 max_pcie = -1; 756 max_dma = -1; 757 758 tb_sw_dbg(sw, "credit allocation parameters:\n"); 759 760 for (i = 0; i < length; i++) { 761 u16 index, value; 762 763 index = data[i] & USB4_BA_INDEX_MASK; 764 value = (data[i] & USB4_BA_VALUE_MASK) >> USB4_BA_VALUE_SHIFT; 765 766 switch (index) { 767 case USB4_BA_MAX_USB3: 768 tb_sw_dbg(sw, " USB3: %u\n", value); 769 max_usb3 = value; 770 break; 771 case USB4_BA_MIN_DP_AUX: 772 tb_sw_dbg(sw, " DP AUX: %u\n", value); 773 min_dp_aux = value; 774 break; 775 case USB4_BA_MIN_DP_MAIN: 776 tb_sw_dbg(sw, " DP main: %u\n", value); 777 min_dp_main = value; 778 break; 779 case USB4_BA_MAX_PCIE: 780 tb_sw_dbg(sw, " PCIe: %u\n", value); 781 max_pcie = value; 782 break; 783 case USB4_BA_MAX_HI: 784 tb_sw_dbg(sw, " DMA: %u\n", value); 785 max_dma = value; 786 break; 787 default: 788 tb_sw_dbg(sw, " unknown credit allocation index %#x, skipping\n", 789 index); 790 break; 791 } 792 } 793 794 /* 795 * Validate the buffer allocation preferences. If we find 796 * issues, log a warning and fall back using the hard-coded 797 * values. 798 */ 799 800 /* Host router must report baMaxHI */ 801 if (!tb_route(sw) && max_dma < 0) { 802 tb_sw_warn(sw, "host router is missing baMaxHI\n"); 803 goto err_invalid; 804 } 805 806 nports = 0; 807 tb_switch_for_each_port(sw, port) { 808 if (tb_port_is_null(port)) 809 nports++; 810 } 811 812 /* Must have DP buffer allocation (multiple USB4 ports) */ 813 if (nports > 2 && (min_dp_aux < 0 || min_dp_main < 0)) { 814 tb_sw_warn(sw, "multiple USB4 ports require baMinDPaux/baMinDPmain\n"); 815 goto err_invalid; 816 } 817 818 tb_switch_for_each_port(sw, port) { 819 if (tb_port_is_dpout(port) && min_dp_main < 0) { 820 tb_sw_warn(sw, "missing baMinDPmain"); 821 goto err_invalid; 822 } 823 if ((tb_port_is_dpin(port) || tb_port_is_dpout(port)) && 824 min_dp_aux < 0) { 825 tb_sw_warn(sw, "missing baMinDPaux"); 826 goto err_invalid; 827 } 828 if ((tb_port_is_usb3_down(port) || tb_port_is_usb3_up(port)) && 829 max_usb3 < 0) { 830 tb_sw_warn(sw, "missing baMaxUSB3"); 831 goto err_invalid; 832 } 833 if ((tb_port_is_pcie_down(port) || tb_port_is_pcie_up(port)) && 834 max_pcie < 0) { 835 tb_sw_warn(sw, "missing baMaxPCIe"); 836 goto err_invalid; 837 } 838 } 839 840 /* 841 * Buffer allocation passed the validation so we can use it in 842 * path creation. 843 */ 844 sw->credit_allocation = true; 845 if (max_usb3 > 0) 846 sw->max_usb3_credits = max_usb3; 847 if (min_dp_aux > 0) 848 sw->min_dp_aux_credits = min_dp_aux; 849 if (min_dp_main > 0) 850 sw->min_dp_main_credits = min_dp_main; 851 if (max_pcie > 0) 852 sw->max_pcie_credits = max_pcie; 853 if (max_dma > 0) 854 sw->max_dma_credits = max_dma; 855 856 return 0; 857 858 err_invalid: 859 return -EINVAL; 860 } 861 862 /** 863 * usb4_switch_query_dp_resource() - Query availability of DP IN resource 864 * @sw: USB4 router 865 * @in: DP IN adapter 866 * 867 * For DP tunneling this function can be used to query availability of 868 * DP IN resource. Returns true if the resource is available for DP 869 * tunneling, false otherwise. 870 */ 871 bool usb4_switch_query_dp_resource(struct tb_switch *sw, struct tb_port *in) 872 { 873 u32 metadata = in->port; 874 u8 status; 875 int ret; 876 877 ret = usb4_switch_op(sw, USB4_SWITCH_OP_QUERY_DP_RESOURCE, &metadata, 878 &status); 879 /* 880 * If DP resource allocation is not supported assume it is 881 * always available. 882 */ 883 if (ret == -EOPNOTSUPP) 884 return true; 885 if (ret) 886 return false; 887 888 return !status; 889 } 890 891 /** 892 * usb4_switch_alloc_dp_resource() - Allocate DP IN resource 893 * @sw: USB4 router 894 * @in: DP IN adapter 895 * 896 * Allocates DP IN resource for DP tunneling using USB4 router 897 * operations. If the resource was allocated returns %0. Otherwise 898 * returns negative errno, in particular %-EBUSY if the resource is 899 * already allocated. 900 */ 901 int usb4_switch_alloc_dp_resource(struct tb_switch *sw, struct tb_port *in) 902 { 903 u32 metadata = in->port; 904 u8 status; 905 int ret; 906 907 ret = usb4_switch_op(sw, USB4_SWITCH_OP_ALLOC_DP_RESOURCE, &metadata, 908 &status); 909 if (ret == -EOPNOTSUPP) 910 return 0; 911 if (ret) 912 return ret; 913 914 return status ? -EBUSY : 0; 915 } 916 917 /** 918 * usb4_switch_dealloc_dp_resource() - Releases allocated DP IN resource 919 * @sw: USB4 router 920 * @in: DP IN adapter 921 * 922 * Releases the previously allocated DP IN resource. 923 */ 924 int usb4_switch_dealloc_dp_resource(struct tb_switch *sw, struct tb_port *in) 925 { 926 u32 metadata = in->port; 927 u8 status; 928 int ret; 929 930 ret = usb4_switch_op(sw, USB4_SWITCH_OP_DEALLOC_DP_RESOURCE, &metadata, 931 &status); 932 if (ret == -EOPNOTSUPP) 933 return 0; 934 if (ret) 935 return ret; 936 937 return status ? -EIO : 0; 938 } 939 940 static int usb4_port_idx(const struct tb_switch *sw, const struct tb_port *port) 941 { 942 struct tb_port *p; 943 int usb4_idx = 0; 944 945 /* Assume port is primary */ 946 tb_switch_for_each_port(sw, p) { 947 if (!tb_port_is_null(p)) 948 continue; 949 if (tb_is_upstream_port(p)) 950 continue; 951 if (!p->link_nr) { 952 if (p == port) 953 break; 954 usb4_idx++; 955 } 956 } 957 958 return usb4_idx; 959 } 960 961 /** 962 * usb4_switch_map_pcie_down() - Map USB4 port to a PCIe downstream adapter 963 * @sw: USB4 router 964 * @port: USB4 port 965 * 966 * USB4 routers have direct mapping between USB4 ports and PCIe 967 * downstream adapters where the PCIe topology is extended. This 968 * function returns the corresponding downstream PCIe adapter or %NULL 969 * if no such mapping was possible. 970 */ 971 struct tb_port *usb4_switch_map_pcie_down(struct tb_switch *sw, 972 const struct tb_port *port) 973 { 974 int usb4_idx = usb4_port_idx(sw, port); 975 struct tb_port *p; 976 int pcie_idx = 0; 977 978 /* Find PCIe down port matching usb4_port */ 979 tb_switch_for_each_port(sw, p) { 980 if (!tb_port_is_pcie_down(p)) 981 continue; 982 983 if (pcie_idx == usb4_idx) 984 return p; 985 986 pcie_idx++; 987 } 988 989 return NULL; 990 } 991 992 /** 993 * usb4_switch_map_usb3_down() - Map USB4 port to a USB3 downstream adapter 994 * @sw: USB4 router 995 * @port: USB4 port 996 * 997 * USB4 routers have direct mapping between USB4 ports and USB 3.x 998 * downstream adapters where the USB 3.x topology is extended. This 999 * function returns the corresponding downstream USB 3.x adapter or 1000 * %NULL if no such mapping was possible. 1001 */ 1002 struct tb_port *usb4_switch_map_usb3_down(struct tb_switch *sw, 1003 const struct tb_port *port) 1004 { 1005 int usb4_idx = usb4_port_idx(sw, port); 1006 struct tb_port *p; 1007 int usb_idx = 0; 1008 1009 /* Find USB3 down port matching usb4_port */ 1010 tb_switch_for_each_port(sw, p) { 1011 if (!tb_port_is_usb3_down(p)) 1012 continue; 1013 1014 if (usb_idx == usb4_idx) 1015 return p; 1016 1017 usb_idx++; 1018 } 1019 1020 return NULL; 1021 } 1022 1023 /** 1024 * usb4_switch_add_ports() - Add USB4 ports for this router 1025 * @sw: USB4 router 1026 * 1027 * For USB4 router finds all USB4 ports and registers devices for each. 1028 * Can be called to any router. 1029 * 1030 * Return %0 in case of success and negative errno in case of failure. 1031 */ 1032 int usb4_switch_add_ports(struct tb_switch *sw) 1033 { 1034 struct tb_port *port; 1035 1036 if (tb_switch_is_icm(sw) || !tb_switch_is_usb4(sw)) 1037 return 0; 1038 1039 tb_switch_for_each_port(sw, port) { 1040 struct usb4_port *usb4; 1041 1042 if (!tb_port_is_null(port)) 1043 continue; 1044 if (!port->cap_usb4) 1045 continue; 1046 1047 usb4 = usb4_port_device_add(port); 1048 if (IS_ERR(usb4)) { 1049 usb4_switch_remove_ports(sw); 1050 return PTR_ERR(usb4); 1051 } 1052 1053 port->usb4 = usb4; 1054 } 1055 1056 return 0; 1057 } 1058 1059 /** 1060 * usb4_switch_remove_ports() - Removes USB4 ports from this router 1061 * @sw: USB4 router 1062 * 1063 * Unregisters previously registered USB4 ports. 1064 */ 1065 void usb4_switch_remove_ports(struct tb_switch *sw) 1066 { 1067 struct tb_port *port; 1068 1069 tb_switch_for_each_port(sw, port) { 1070 if (port->usb4) { 1071 usb4_port_device_remove(port->usb4); 1072 port->usb4 = NULL; 1073 } 1074 } 1075 } 1076 1077 /** 1078 * usb4_port_unlock() - Unlock USB4 downstream port 1079 * @port: USB4 port to unlock 1080 * 1081 * Unlocks USB4 downstream port so that the connection manager can 1082 * access the router below this port. 1083 */ 1084 int usb4_port_unlock(struct tb_port *port) 1085 { 1086 int ret; 1087 u32 val; 1088 1089 ret = tb_port_read(port, &val, TB_CFG_PORT, ADP_CS_4, 1); 1090 if (ret) 1091 return ret; 1092 1093 val &= ~ADP_CS_4_LCK; 1094 return tb_port_write(port, &val, TB_CFG_PORT, ADP_CS_4, 1); 1095 } 1096 1097 /** 1098 * usb4_port_hotplug_enable() - Enables hotplug for a port 1099 * @port: USB4 port to operate on 1100 * 1101 * Enables hot plug events on a given port. This is only intended 1102 * to be used on lane, DP-IN, and DP-OUT adapters. 1103 */ 1104 int usb4_port_hotplug_enable(struct tb_port *port) 1105 { 1106 int ret; 1107 u32 val; 1108 1109 ret = tb_port_read(port, &val, TB_CFG_PORT, ADP_CS_5, 1); 1110 if (ret) 1111 return ret; 1112 1113 val &= ~ADP_CS_5_DHP; 1114 return tb_port_write(port, &val, TB_CFG_PORT, ADP_CS_5, 1); 1115 } 1116 1117 /** 1118 * usb4_port_reset() - Issue downstream port reset 1119 * @port: USB4 port to reset 1120 * 1121 * Issues downstream port reset to @port. 1122 */ 1123 int usb4_port_reset(struct tb_port *port) 1124 { 1125 int ret; 1126 u32 val; 1127 1128 if (!port->cap_usb4) 1129 return -EINVAL; 1130 1131 ret = tb_port_read(port, &val, TB_CFG_PORT, 1132 port->cap_usb4 + PORT_CS_19, 1); 1133 if (ret) 1134 return ret; 1135 1136 val |= PORT_CS_19_DPR; 1137 1138 ret = tb_port_write(port, &val, TB_CFG_PORT, 1139 port->cap_usb4 + PORT_CS_19, 1); 1140 if (ret) 1141 return ret; 1142 1143 fsleep(10000); 1144 1145 ret = tb_port_read(port, &val, TB_CFG_PORT, 1146 port->cap_usb4 + PORT_CS_19, 1); 1147 if (ret) 1148 return ret; 1149 1150 val &= ~PORT_CS_19_DPR; 1151 1152 return tb_port_write(port, &val, TB_CFG_PORT, 1153 port->cap_usb4 + PORT_CS_19, 1); 1154 } 1155 1156 static int usb4_port_set_configured(struct tb_port *port, bool configured) 1157 { 1158 int ret; 1159 u32 val; 1160 1161 if (!port->cap_usb4) 1162 return -EINVAL; 1163 1164 ret = tb_port_read(port, &val, TB_CFG_PORT, 1165 port->cap_usb4 + PORT_CS_19, 1); 1166 if (ret) 1167 return ret; 1168 1169 if (configured) 1170 val |= PORT_CS_19_PC; 1171 else 1172 val &= ~PORT_CS_19_PC; 1173 1174 return tb_port_write(port, &val, TB_CFG_PORT, 1175 port->cap_usb4 + PORT_CS_19, 1); 1176 } 1177 1178 /** 1179 * usb4_port_configure() - Set USB4 port configured 1180 * @port: USB4 router 1181 * 1182 * Sets the USB4 link to be configured for power management purposes. 1183 */ 1184 int usb4_port_configure(struct tb_port *port) 1185 { 1186 return usb4_port_set_configured(port, true); 1187 } 1188 1189 /** 1190 * usb4_port_unconfigure() - Set USB4 port unconfigured 1191 * @port: USB4 router 1192 * 1193 * Sets the USB4 link to be unconfigured for power management purposes. 1194 */ 1195 void usb4_port_unconfigure(struct tb_port *port) 1196 { 1197 usb4_port_set_configured(port, false); 1198 } 1199 1200 static int usb4_set_xdomain_configured(struct tb_port *port, bool configured) 1201 { 1202 int ret; 1203 u32 val; 1204 1205 if (!port->cap_usb4) 1206 return -EINVAL; 1207 1208 ret = tb_port_read(port, &val, TB_CFG_PORT, 1209 port->cap_usb4 + PORT_CS_19, 1); 1210 if (ret) 1211 return ret; 1212 1213 if (configured) 1214 val |= PORT_CS_19_PID; 1215 else 1216 val &= ~PORT_CS_19_PID; 1217 1218 return tb_port_write(port, &val, TB_CFG_PORT, 1219 port->cap_usb4 + PORT_CS_19, 1); 1220 } 1221 1222 /** 1223 * usb4_port_configure_xdomain() - Configure port for XDomain 1224 * @port: USB4 port connected to another host 1225 * @xd: XDomain that is connected to the port 1226 * 1227 * Marks the USB4 port as being connected to another host and updates 1228 * the link type. Returns %0 in success and negative errno in failure. 1229 */ 1230 int usb4_port_configure_xdomain(struct tb_port *port, struct tb_xdomain *xd) 1231 { 1232 xd->link_usb4 = link_is_usb4(port); 1233 return usb4_set_xdomain_configured(port, true); 1234 } 1235 1236 /** 1237 * usb4_port_unconfigure_xdomain() - Unconfigure port for XDomain 1238 * @port: USB4 port that was connected to another host 1239 * 1240 * Clears USB4 port from being marked as XDomain. 1241 */ 1242 void usb4_port_unconfigure_xdomain(struct tb_port *port) 1243 { 1244 usb4_set_xdomain_configured(port, false); 1245 } 1246 1247 static int usb4_port_wait_for_bit(struct tb_port *port, u32 offset, u32 bit, 1248 u32 value, int timeout_msec) 1249 { 1250 ktime_t timeout = ktime_add_ms(ktime_get(), timeout_msec); 1251 1252 do { 1253 u32 val; 1254 int ret; 1255 1256 ret = tb_port_read(port, &val, TB_CFG_PORT, offset, 1); 1257 if (ret) 1258 return ret; 1259 1260 if ((val & bit) == value) 1261 return 0; 1262 1263 usleep_range(50, 100); 1264 } while (ktime_before(ktime_get(), timeout)); 1265 1266 return -ETIMEDOUT; 1267 } 1268 1269 static int usb4_port_read_data(struct tb_port *port, void *data, size_t dwords) 1270 { 1271 if (dwords > USB4_DATA_DWORDS) 1272 return -EINVAL; 1273 1274 return tb_port_read(port, data, TB_CFG_PORT, port->cap_usb4 + PORT_CS_2, 1275 dwords); 1276 } 1277 1278 static int usb4_port_write_data(struct tb_port *port, const void *data, 1279 size_t dwords) 1280 { 1281 if (dwords > USB4_DATA_DWORDS) 1282 return -EINVAL; 1283 1284 return tb_port_write(port, data, TB_CFG_PORT, port->cap_usb4 + PORT_CS_2, 1285 dwords); 1286 } 1287 1288 static int usb4_port_sb_read(struct tb_port *port, enum usb4_sb_target target, 1289 u8 index, u8 reg, void *buf, u8 size) 1290 { 1291 size_t dwords = DIV_ROUND_UP(size, 4); 1292 int ret; 1293 u32 val; 1294 1295 if (!port->cap_usb4) 1296 return -EINVAL; 1297 1298 val = reg; 1299 val |= size << PORT_CS_1_LENGTH_SHIFT; 1300 val |= (target << PORT_CS_1_TARGET_SHIFT) & PORT_CS_1_TARGET_MASK; 1301 if (target == USB4_SB_TARGET_RETIMER) 1302 val |= (index << PORT_CS_1_RETIMER_INDEX_SHIFT); 1303 val |= PORT_CS_1_PND; 1304 1305 ret = tb_port_write(port, &val, TB_CFG_PORT, 1306 port->cap_usb4 + PORT_CS_1, 1); 1307 if (ret) 1308 return ret; 1309 1310 ret = usb4_port_wait_for_bit(port, port->cap_usb4 + PORT_CS_1, 1311 PORT_CS_1_PND, 0, 500); 1312 if (ret) 1313 return ret; 1314 1315 ret = tb_port_read(port, &val, TB_CFG_PORT, 1316 port->cap_usb4 + PORT_CS_1, 1); 1317 if (ret) 1318 return ret; 1319 1320 if (val & PORT_CS_1_NR) 1321 return -ENODEV; 1322 if (val & PORT_CS_1_RC) 1323 return -EIO; 1324 1325 return buf ? usb4_port_read_data(port, buf, dwords) : 0; 1326 } 1327 1328 static int usb4_port_sb_write(struct tb_port *port, enum usb4_sb_target target, 1329 u8 index, u8 reg, const void *buf, u8 size) 1330 { 1331 size_t dwords = DIV_ROUND_UP(size, 4); 1332 int ret; 1333 u32 val; 1334 1335 if (!port->cap_usb4) 1336 return -EINVAL; 1337 1338 if (buf) { 1339 ret = usb4_port_write_data(port, buf, dwords); 1340 if (ret) 1341 return ret; 1342 } 1343 1344 val = reg; 1345 val |= size << PORT_CS_1_LENGTH_SHIFT; 1346 val |= PORT_CS_1_WNR_WRITE; 1347 val |= (target << PORT_CS_1_TARGET_SHIFT) & PORT_CS_1_TARGET_MASK; 1348 if (target == USB4_SB_TARGET_RETIMER) 1349 val |= (index << PORT_CS_1_RETIMER_INDEX_SHIFT); 1350 val |= PORT_CS_1_PND; 1351 1352 ret = tb_port_write(port, &val, TB_CFG_PORT, 1353 port->cap_usb4 + PORT_CS_1, 1); 1354 if (ret) 1355 return ret; 1356 1357 ret = usb4_port_wait_for_bit(port, port->cap_usb4 + PORT_CS_1, 1358 PORT_CS_1_PND, 0, 500); 1359 if (ret) 1360 return ret; 1361 1362 ret = tb_port_read(port, &val, TB_CFG_PORT, 1363 port->cap_usb4 + PORT_CS_1, 1); 1364 if (ret) 1365 return ret; 1366 1367 if (val & PORT_CS_1_NR) 1368 return -ENODEV; 1369 if (val & PORT_CS_1_RC) 1370 return -EIO; 1371 1372 return 0; 1373 } 1374 1375 static int usb4_port_sb_opcode_err_to_errno(u32 val) 1376 { 1377 switch (val) { 1378 case 0: 1379 return 0; 1380 case USB4_SB_OPCODE_ERR: 1381 return -EAGAIN; 1382 case USB4_SB_OPCODE_ONS: 1383 return -EOPNOTSUPP; 1384 default: 1385 return -EIO; 1386 } 1387 } 1388 1389 static int usb4_port_sb_op(struct tb_port *port, enum usb4_sb_target target, 1390 u8 index, enum usb4_sb_opcode opcode, int timeout_msec) 1391 { 1392 ktime_t timeout; 1393 u32 val; 1394 int ret; 1395 1396 val = opcode; 1397 ret = usb4_port_sb_write(port, target, index, USB4_SB_OPCODE, &val, 1398 sizeof(val)); 1399 if (ret) 1400 return ret; 1401 1402 timeout = ktime_add_ms(ktime_get(), timeout_msec); 1403 1404 do { 1405 /* Check results */ 1406 ret = usb4_port_sb_read(port, target, index, USB4_SB_OPCODE, 1407 &val, sizeof(val)); 1408 if (ret) 1409 return ret; 1410 1411 if (val != opcode) 1412 return usb4_port_sb_opcode_err_to_errno(val); 1413 } while (ktime_before(ktime_get(), timeout)); 1414 1415 return -ETIMEDOUT; 1416 } 1417 1418 static int usb4_port_set_router_offline(struct tb_port *port, bool offline) 1419 { 1420 u32 val = !offline; 1421 int ret; 1422 1423 ret = usb4_port_sb_write(port, USB4_SB_TARGET_ROUTER, 0, 1424 USB4_SB_METADATA, &val, sizeof(val)); 1425 if (ret) 1426 return ret; 1427 1428 val = USB4_SB_OPCODE_ROUTER_OFFLINE; 1429 return usb4_port_sb_write(port, USB4_SB_TARGET_ROUTER, 0, 1430 USB4_SB_OPCODE, &val, sizeof(val)); 1431 } 1432 1433 /** 1434 * usb4_port_router_offline() - Put the USB4 port to offline mode 1435 * @port: USB4 port 1436 * 1437 * This function puts the USB4 port into offline mode. In this mode the 1438 * port does not react on hotplug events anymore. This needs to be 1439 * called before retimer access is done when the USB4 links is not up. 1440 * 1441 * Returns %0 in case of success and negative errno if there was an 1442 * error. 1443 */ 1444 int usb4_port_router_offline(struct tb_port *port) 1445 { 1446 return usb4_port_set_router_offline(port, true); 1447 } 1448 1449 /** 1450 * usb4_port_router_online() - Put the USB4 port back to online 1451 * @port: USB4 port 1452 * 1453 * Makes the USB4 port functional again. 1454 */ 1455 int usb4_port_router_online(struct tb_port *port) 1456 { 1457 return usb4_port_set_router_offline(port, false); 1458 } 1459 1460 /** 1461 * usb4_port_enumerate_retimers() - Send RT broadcast transaction 1462 * @port: USB4 port 1463 * 1464 * This forces the USB4 port to send broadcast RT transaction which 1465 * makes the retimers on the link to assign index to themselves. Returns 1466 * %0 in case of success and negative errno if there was an error. 1467 */ 1468 int usb4_port_enumerate_retimers(struct tb_port *port) 1469 { 1470 u32 val; 1471 1472 val = USB4_SB_OPCODE_ENUMERATE_RETIMERS; 1473 return usb4_port_sb_write(port, USB4_SB_TARGET_ROUTER, 0, 1474 USB4_SB_OPCODE, &val, sizeof(val)); 1475 } 1476 1477 /** 1478 * usb4_port_clx_supported() - Check if CLx is supported by the link 1479 * @port: Port to check for CLx support for 1480 * 1481 * PORT_CS_18_CPS bit reflects if the link supports CLx including 1482 * active cables (if connected on the link). 1483 */ 1484 bool usb4_port_clx_supported(struct tb_port *port) 1485 { 1486 int ret; 1487 u32 val; 1488 1489 ret = tb_port_read(port, &val, TB_CFG_PORT, 1490 port->cap_usb4 + PORT_CS_18, 1); 1491 if (ret) 1492 return false; 1493 1494 return !!(val & PORT_CS_18_CPS); 1495 } 1496 1497 /** 1498 * usb4_port_asym_supported() - If the port supports asymmetric link 1499 * @port: USB4 port 1500 * 1501 * Checks if the port and the cable supports asymmetric link and returns 1502 * %true in that case. 1503 */ 1504 bool usb4_port_asym_supported(struct tb_port *port) 1505 { 1506 u32 val; 1507 1508 if (!port->cap_usb4) 1509 return false; 1510 1511 if (tb_port_read(port, &val, TB_CFG_PORT, port->cap_usb4 + PORT_CS_18, 1)) 1512 return false; 1513 1514 return !!(val & PORT_CS_18_CSA); 1515 } 1516 1517 /** 1518 * usb4_port_asym_set_link_width() - Set link width to asymmetric or symmetric 1519 * @port: USB4 port 1520 * @width: Asymmetric width to configure 1521 * 1522 * Sets USB4 port link width to @width. Can be called for widths where 1523 * usb4_port_asym_width_supported() returned @true. 1524 */ 1525 int usb4_port_asym_set_link_width(struct tb_port *port, enum tb_link_width width) 1526 { 1527 u32 val; 1528 int ret; 1529 1530 if (!port->cap_phy) 1531 return -EINVAL; 1532 1533 ret = tb_port_read(port, &val, TB_CFG_PORT, 1534 port->cap_phy + LANE_ADP_CS_1, 1); 1535 if (ret) 1536 return ret; 1537 1538 val &= ~LANE_ADP_CS_1_TARGET_WIDTH_ASYM_MASK; 1539 switch (width) { 1540 case TB_LINK_WIDTH_DUAL: 1541 val |= FIELD_PREP(LANE_ADP_CS_1_TARGET_WIDTH_ASYM_MASK, 1542 LANE_ADP_CS_1_TARGET_WIDTH_ASYM_DUAL); 1543 break; 1544 case TB_LINK_WIDTH_ASYM_TX: 1545 val |= FIELD_PREP(LANE_ADP_CS_1_TARGET_WIDTH_ASYM_MASK, 1546 LANE_ADP_CS_1_TARGET_WIDTH_ASYM_TX); 1547 break; 1548 case TB_LINK_WIDTH_ASYM_RX: 1549 val |= FIELD_PREP(LANE_ADP_CS_1_TARGET_WIDTH_ASYM_MASK, 1550 LANE_ADP_CS_1_TARGET_WIDTH_ASYM_RX); 1551 break; 1552 default: 1553 return -EINVAL; 1554 } 1555 1556 return tb_port_write(port, &val, TB_CFG_PORT, 1557 port->cap_phy + LANE_ADP_CS_1, 1); 1558 } 1559 1560 /** 1561 * usb4_port_asym_start() - Start symmetry change and wait for completion 1562 * @port: USB4 port 1563 * 1564 * Start symmetry change of the link to asymmetric or symmetric 1565 * (according to what was previously set in tb_port_set_link_width(). 1566 * Wait for completion of the change. 1567 * 1568 * Returns %0 in case of success, %-ETIMEDOUT if case of timeout or 1569 * a negative errno in case of a failure. 1570 */ 1571 int usb4_port_asym_start(struct tb_port *port) 1572 { 1573 int ret; 1574 u32 val; 1575 1576 ret = tb_port_read(port, &val, TB_CFG_PORT, 1577 port->cap_usb4 + PORT_CS_19, 1); 1578 if (ret) 1579 return ret; 1580 1581 val &= ~PORT_CS_19_START_ASYM; 1582 val |= FIELD_PREP(PORT_CS_19_START_ASYM, 1); 1583 1584 ret = tb_port_write(port, &val, TB_CFG_PORT, 1585 port->cap_usb4 + PORT_CS_19, 1); 1586 if (ret) 1587 return ret; 1588 1589 /* 1590 * Wait for PORT_CS_19_START_ASYM to be 0. This means the USB4 1591 * port started the symmetry transition. 1592 */ 1593 ret = usb4_port_wait_for_bit(port, port->cap_usb4 + PORT_CS_19, 1594 PORT_CS_19_START_ASYM, 0, 1000); 1595 if (ret) 1596 return ret; 1597 1598 /* Then wait for the transtion to be completed */ 1599 return usb4_port_wait_for_bit(port, port->cap_usb4 + PORT_CS_18, 1600 PORT_CS_18_TIP, 0, 5000); 1601 } 1602 1603 /** 1604 * usb4_port_margining_caps() - Read USB4 port marginig capabilities 1605 * @port: USB4 port 1606 * @caps: Array with at least two elements to hold the results 1607 * 1608 * Reads the USB4 port lane margining capabilities into @caps. 1609 */ 1610 int usb4_port_margining_caps(struct tb_port *port, u32 *caps) 1611 { 1612 int ret; 1613 1614 ret = usb4_port_sb_op(port, USB4_SB_TARGET_ROUTER, 0, 1615 USB4_SB_OPCODE_READ_LANE_MARGINING_CAP, 500); 1616 if (ret) 1617 return ret; 1618 1619 return usb4_port_sb_read(port, USB4_SB_TARGET_ROUTER, 0, 1620 USB4_SB_DATA, caps, sizeof(*caps) * 2); 1621 } 1622 1623 /** 1624 * usb4_port_hw_margin() - Run hardware lane margining on port 1625 * @port: USB4 port 1626 * @lanes: Which lanes to run (must match the port capabilities). Can be 1627 * %0, %1 or %7. 1628 * @ber_level: BER level contour value 1629 * @timing: Perform timing margining instead of voltage 1630 * @right_high: Use Right/high margin instead of left/low 1631 * @results: Array with at least two elements to hold the results 1632 * 1633 * Runs hardware lane margining on USB4 port and returns the result in 1634 * @results. 1635 */ 1636 int usb4_port_hw_margin(struct tb_port *port, unsigned int lanes, 1637 unsigned int ber_level, bool timing, bool right_high, 1638 u32 *results) 1639 { 1640 u32 val; 1641 int ret; 1642 1643 val = lanes; 1644 if (timing) 1645 val |= USB4_MARGIN_HW_TIME; 1646 if (right_high) 1647 val |= USB4_MARGIN_HW_RH; 1648 if (ber_level) 1649 val |= (ber_level << USB4_MARGIN_HW_BER_SHIFT) & 1650 USB4_MARGIN_HW_BER_MASK; 1651 1652 ret = usb4_port_sb_write(port, USB4_SB_TARGET_ROUTER, 0, 1653 USB4_SB_METADATA, &val, sizeof(val)); 1654 if (ret) 1655 return ret; 1656 1657 ret = usb4_port_sb_op(port, USB4_SB_TARGET_ROUTER, 0, 1658 USB4_SB_OPCODE_RUN_HW_LANE_MARGINING, 2500); 1659 if (ret) 1660 return ret; 1661 1662 return usb4_port_sb_read(port, USB4_SB_TARGET_ROUTER, 0, 1663 USB4_SB_DATA, results, sizeof(*results) * 2); 1664 } 1665 1666 /** 1667 * usb4_port_sw_margin() - Run software lane margining on port 1668 * @port: USB4 port 1669 * @lanes: Which lanes to run (must match the port capabilities). Can be 1670 * %0, %1 or %7. 1671 * @timing: Perform timing margining instead of voltage 1672 * @right_high: Use Right/high margin instead of left/low 1673 * @counter: What to do with the error counter 1674 * 1675 * Runs software lane margining on USB4 port. Read back the error 1676 * counters by calling usb4_port_sw_margin_errors(). Returns %0 in 1677 * success and negative errno otherwise. 1678 */ 1679 int usb4_port_sw_margin(struct tb_port *port, unsigned int lanes, bool timing, 1680 bool right_high, u32 counter) 1681 { 1682 u32 val; 1683 int ret; 1684 1685 val = lanes; 1686 if (timing) 1687 val |= USB4_MARGIN_SW_TIME; 1688 if (right_high) 1689 val |= USB4_MARGIN_SW_RH; 1690 val |= (counter << USB4_MARGIN_SW_COUNTER_SHIFT) & 1691 USB4_MARGIN_SW_COUNTER_MASK; 1692 1693 ret = usb4_port_sb_write(port, USB4_SB_TARGET_ROUTER, 0, 1694 USB4_SB_METADATA, &val, sizeof(val)); 1695 if (ret) 1696 return ret; 1697 1698 return usb4_port_sb_op(port, USB4_SB_TARGET_ROUTER, 0, 1699 USB4_SB_OPCODE_RUN_SW_LANE_MARGINING, 2500); 1700 } 1701 1702 /** 1703 * usb4_port_sw_margin_errors() - Read the software margining error counters 1704 * @port: USB4 port 1705 * @errors: Error metadata is copied here. 1706 * 1707 * This reads back the software margining error counters from the port. 1708 * Returns %0 in success and negative errno otherwise. 1709 */ 1710 int usb4_port_sw_margin_errors(struct tb_port *port, u32 *errors) 1711 { 1712 int ret; 1713 1714 ret = usb4_port_sb_op(port, USB4_SB_TARGET_ROUTER, 0, 1715 USB4_SB_OPCODE_READ_SW_MARGIN_ERR, 150); 1716 if (ret) 1717 return ret; 1718 1719 return usb4_port_sb_read(port, USB4_SB_TARGET_ROUTER, 0, 1720 USB4_SB_METADATA, errors, sizeof(*errors)); 1721 } 1722 1723 static inline int usb4_port_retimer_op(struct tb_port *port, u8 index, 1724 enum usb4_sb_opcode opcode, 1725 int timeout_msec) 1726 { 1727 return usb4_port_sb_op(port, USB4_SB_TARGET_RETIMER, index, opcode, 1728 timeout_msec); 1729 } 1730 1731 /** 1732 * usb4_port_retimer_set_inbound_sbtx() - Enable sideband channel transactions 1733 * @port: USB4 port 1734 * @index: Retimer index 1735 * 1736 * Enables sideband channel transations on SBTX. Can be used when USB4 1737 * link does not go up, for example if there is no device connected. 1738 */ 1739 int usb4_port_retimer_set_inbound_sbtx(struct tb_port *port, u8 index) 1740 { 1741 int ret; 1742 1743 ret = usb4_port_retimer_op(port, index, USB4_SB_OPCODE_SET_INBOUND_SBTX, 1744 500); 1745 1746 if (ret != -ENODEV) 1747 return ret; 1748 1749 /* 1750 * Per the USB4 retimer spec, the retimer is not required to 1751 * send an RT (Retimer Transaction) response for the first 1752 * SET_INBOUND_SBTX command 1753 */ 1754 return usb4_port_retimer_op(port, index, USB4_SB_OPCODE_SET_INBOUND_SBTX, 1755 500); 1756 } 1757 1758 /** 1759 * usb4_port_retimer_unset_inbound_sbtx() - Disable sideband channel transactions 1760 * @port: USB4 port 1761 * @index: Retimer index 1762 * 1763 * Disables sideband channel transations on SBTX. The reverse of 1764 * usb4_port_retimer_set_inbound_sbtx(). 1765 */ 1766 int usb4_port_retimer_unset_inbound_sbtx(struct tb_port *port, u8 index) 1767 { 1768 return usb4_port_retimer_op(port, index, 1769 USB4_SB_OPCODE_UNSET_INBOUND_SBTX, 500); 1770 } 1771 1772 /** 1773 * usb4_port_retimer_read() - Read from retimer sideband registers 1774 * @port: USB4 port 1775 * @index: Retimer index 1776 * @reg: Sideband register to read 1777 * @buf: Data from @reg is stored here 1778 * @size: Number of bytes to read 1779 * 1780 * Function reads retimer sideband registers starting from @reg. The 1781 * retimer is connected to @port at @index. Returns %0 in case of 1782 * success, and read data is copied to @buf. If there is no retimer 1783 * present at given @index returns %-ENODEV. In any other failure 1784 * returns negative errno. 1785 */ 1786 int usb4_port_retimer_read(struct tb_port *port, u8 index, u8 reg, void *buf, 1787 u8 size) 1788 { 1789 return usb4_port_sb_read(port, USB4_SB_TARGET_RETIMER, index, reg, buf, 1790 size); 1791 } 1792 1793 /** 1794 * usb4_port_retimer_write() - Write to retimer sideband registers 1795 * @port: USB4 port 1796 * @index: Retimer index 1797 * @reg: Sideband register to write 1798 * @buf: Data that is written starting from @reg 1799 * @size: Number of bytes to write 1800 * 1801 * Writes retimer sideband registers starting from @reg. The retimer is 1802 * connected to @port at @index. Returns %0 in case of success. If there 1803 * is no retimer present at given @index returns %-ENODEV. In any other 1804 * failure returns negative errno. 1805 */ 1806 int usb4_port_retimer_write(struct tb_port *port, u8 index, u8 reg, 1807 const void *buf, u8 size) 1808 { 1809 return usb4_port_sb_write(port, USB4_SB_TARGET_RETIMER, index, reg, buf, 1810 size); 1811 } 1812 1813 /** 1814 * usb4_port_retimer_is_last() - Is the retimer last on-board retimer 1815 * @port: USB4 port 1816 * @index: Retimer index 1817 * 1818 * If the retimer at @index is last one (connected directly to the 1819 * Type-C port) this function returns %1. If it is not returns %0. If 1820 * the retimer is not present returns %-ENODEV. Otherwise returns 1821 * negative errno. 1822 */ 1823 int usb4_port_retimer_is_last(struct tb_port *port, u8 index) 1824 { 1825 u32 metadata; 1826 int ret; 1827 1828 ret = usb4_port_retimer_op(port, index, USB4_SB_OPCODE_QUERY_LAST_RETIMER, 1829 500); 1830 if (ret) 1831 return ret; 1832 1833 ret = usb4_port_retimer_read(port, index, USB4_SB_METADATA, &metadata, 1834 sizeof(metadata)); 1835 return ret ? ret : metadata & 1; 1836 } 1837 1838 /** 1839 * usb4_port_retimer_nvm_sector_size() - Read retimer NVM sector size 1840 * @port: USB4 port 1841 * @index: Retimer index 1842 * 1843 * Reads NVM sector size (in bytes) of a retimer at @index. This 1844 * operation can be used to determine whether the retimer supports NVM 1845 * upgrade for example. Returns sector size in bytes or negative errno 1846 * in case of error. Specifically returns %-ENODEV if there is no 1847 * retimer at @index. 1848 */ 1849 int usb4_port_retimer_nvm_sector_size(struct tb_port *port, u8 index) 1850 { 1851 u32 metadata; 1852 int ret; 1853 1854 ret = usb4_port_retimer_op(port, index, USB4_SB_OPCODE_GET_NVM_SECTOR_SIZE, 1855 500); 1856 if (ret) 1857 return ret; 1858 1859 ret = usb4_port_retimer_read(port, index, USB4_SB_METADATA, &metadata, 1860 sizeof(metadata)); 1861 return ret ? ret : metadata & USB4_NVM_SECTOR_SIZE_MASK; 1862 } 1863 1864 /** 1865 * usb4_port_retimer_nvm_set_offset() - Set NVM write offset 1866 * @port: USB4 port 1867 * @index: Retimer index 1868 * @address: Start offset 1869 * 1870 * Exlicitly sets NVM write offset. Normally when writing to NVM this is 1871 * done automatically by usb4_port_retimer_nvm_write(). 1872 * 1873 * Returns %0 in success and negative errno if there was a failure. 1874 */ 1875 int usb4_port_retimer_nvm_set_offset(struct tb_port *port, u8 index, 1876 unsigned int address) 1877 { 1878 u32 metadata, dwaddress; 1879 int ret; 1880 1881 dwaddress = address / 4; 1882 metadata = (dwaddress << USB4_NVM_SET_OFFSET_SHIFT) & 1883 USB4_NVM_SET_OFFSET_MASK; 1884 1885 ret = usb4_port_retimer_write(port, index, USB4_SB_METADATA, &metadata, 1886 sizeof(metadata)); 1887 if (ret) 1888 return ret; 1889 1890 return usb4_port_retimer_op(port, index, USB4_SB_OPCODE_NVM_SET_OFFSET, 1891 500); 1892 } 1893 1894 struct retimer_info { 1895 struct tb_port *port; 1896 u8 index; 1897 }; 1898 1899 static int usb4_port_retimer_nvm_write_next_block(void *data, 1900 unsigned int dwaddress, const void *buf, size_t dwords) 1901 1902 { 1903 const struct retimer_info *info = data; 1904 struct tb_port *port = info->port; 1905 u8 index = info->index; 1906 int ret; 1907 1908 ret = usb4_port_retimer_write(port, index, USB4_SB_DATA, 1909 buf, dwords * 4); 1910 if (ret) 1911 return ret; 1912 1913 return usb4_port_retimer_op(port, index, 1914 USB4_SB_OPCODE_NVM_BLOCK_WRITE, 1000); 1915 } 1916 1917 /** 1918 * usb4_port_retimer_nvm_write() - Write to retimer NVM 1919 * @port: USB4 port 1920 * @index: Retimer index 1921 * @address: Byte address where to start the write 1922 * @buf: Data to write 1923 * @size: Size in bytes how much to write 1924 * 1925 * Writes @size bytes from @buf to the retimer NVM. Used for NVM 1926 * upgrade. Returns %0 if the data was written successfully and negative 1927 * errno in case of failure. Specifically returns %-ENODEV if there is 1928 * no retimer at @index. 1929 */ 1930 int usb4_port_retimer_nvm_write(struct tb_port *port, u8 index, unsigned int address, 1931 const void *buf, size_t size) 1932 { 1933 struct retimer_info info = { .port = port, .index = index }; 1934 int ret; 1935 1936 ret = usb4_port_retimer_nvm_set_offset(port, index, address); 1937 if (ret) 1938 return ret; 1939 1940 return tb_nvm_write_data(address, buf, size, USB4_DATA_RETRIES, 1941 usb4_port_retimer_nvm_write_next_block, &info); 1942 } 1943 1944 /** 1945 * usb4_port_retimer_nvm_authenticate() - Start retimer NVM upgrade 1946 * @port: USB4 port 1947 * @index: Retimer index 1948 * 1949 * After the new NVM image has been written via usb4_port_retimer_nvm_write() 1950 * this function can be used to trigger the NVM upgrade process. If 1951 * successful the retimer restarts with the new NVM and may not have the 1952 * index set so one needs to call usb4_port_enumerate_retimers() to 1953 * force index to be assigned. 1954 */ 1955 int usb4_port_retimer_nvm_authenticate(struct tb_port *port, u8 index) 1956 { 1957 u32 val; 1958 1959 /* 1960 * We need to use the raw operation here because once the 1961 * authentication completes the retimer index is not set anymore 1962 * so we do not get back the status now. 1963 */ 1964 val = USB4_SB_OPCODE_NVM_AUTH_WRITE; 1965 return usb4_port_sb_write(port, USB4_SB_TARGET_RETIMER, index, 1966 USB4_SB_OPCODE, &val, sizeof(val)); 1967 } 1968 1969 /** 1970 * usb4_port_retimer_nvm_authenticate_status() - Read status of NVM upgrade 1971 * @port: USB4 port 1972 * @index: Retimer index 1973 * @status: Raw status code read from metadata 1974 * 1975 * This can be called after usb4_port_retimer_nvm_authenticate() and 1976 * usb4_port_enumerate_retimers() to fetch status of the NVM upgrade. 1977 * 1978 * Returns %0 if the authentication status was successfully read. The 1979 * completion metadata (the result) is then stored into @status. If 1980 * reading the status fails, returns negative errno. 1981 */ 1982 int usb4_port_retimer_nvm_authenticate_status(struct tb_port *port, u8 index, 1983 u32 *status) 1984 { 1985 u32 metadata, val; 1986 int ret; 1987 1988 ret = usb4_port_retimer_read(port, index, USB4_SB_OPCODE, &val, 1989 sizeof(val)); 1990 if (ret) 1991 return ret; 1992 1993 ret = usb4_port_sb_opcode_err_to_errno(val); 1994 switch (ret) { 1995 case 0: 1996 *status = 0; 1997 return 0; 1998 1999 case -EAGAIN: 2000 ret = usb4_port_retimer_read(port, index, USB4_SB_METADATA, 2001 &metadata, sizeof(metadata)); 2002 if (ret) 2003 return ret; 2004 2005 *status = metadata & USB4_SB_METADATA_NVM_AUTH_WRITE_MASK; 2006 return 0; 2007 2008 default: 2009 return ret; 2010 } 2011 } 2012 2013 static int usb4_port_retimer_nvm_read_block(void *data, unsigned int dwaddress, 2014 void *buf, size_t dwords) 2015 { 2016 const struct retimer_info *info = data; 2017 struct tb_port *port = info->port; 2018 u8 index = info->index; 2019 u32 metadata; 2020 int ret; 2021 2022 metadata = dwaddress << USB4_NVM_READ_OFFSET_SHIFT; 2023 if (dwords < USB4_DATA_DWORDS) 2024 metadata |= dwords << USB4_NVM_READ_LENGTH_SHIFT; 2025 2026 ret = usb4_port_retimer_write(port, index, USB4_SB_METADATA, &metadata, 2027 sizeof(metadata)); 2028 if (ret) 2029 return ret; 2030 2031 ret = usb4_port_retimer_op(port, index, USB4_SB_OPCODE_NVM_READ, 500); 2032 if (ret) 2033 return ret; 2034 2035 return usb4_port_retimer_read(port, index, USB4_SB_DATA, buf, 2036 dwords * 4); 2037 } 2038 2039 /** 2040 * usb4_port_retimer_nvm_read() - Read contents of retimer NVM 2041 * @port: USB4 port 2042 * @index: Retimer index 2043 * @address: NVM address (in bytes) to start reading 2044 * @buf: Data read from NVM is stored here 2045 * @size: Number of bytes to read 2046 * 2047 * Reads retimer NVM and copies the contents to @buf. Returns %0 if the 2048 * read was successful and negative errno in case of failure. 2049 * Specifically returns %-ENODEV if there is no retimer at @index. 2050 */ 2051 int usb4_port_retimer_nvm_read(struct tb_port *port, u8 index, 2052 unsigned int address, void *buf, size_t size) 2053 { 2054 struct retimer_info info = { .port = port, .index = index }; 2055 2056 return tb_nvm_read_data(address, buf, size, USB4_DATA_RETRIES, 2057 usb4_port_retimer_nvm_read_block, &info); 2058 } 2059 2060 static inline unsigned int 2061 usb4_usb3_port_max_bandwidth(const struct tb_port *port, unsigned int bw) 2062 { 2063 /* Take the possible bandwidth limitation into account */ 2064 if (port->max_bw) 2065 return min(bw, port->max_bw); 2066 return bw; 2067 } 2068 2069 /** 2070 * usb4_usb3_port_max_link_rate() - Maximum support USB3 link rate 2071 * @port: USB3 adapter port 2072 * 2073 * Return maximum supported link rate of a USB3 adapter in Mb/s. 2074 * Negative errno in case of error. 2075 */ 2076 int usb4_usb3_port_max_link_rate(struct tb_port *port) 2077 { 2078 int ret, lr; 2079 u32 val; 2080 2081 if (!tb_port_is_usb3_down(port) && !tb_port_is_usb3_up(port)) 2082 return -EINVAL; 2083 2084 ret = tb_port_read(port, &val, TB_CFG_PORT, 2085 port->cap_adap + ADP_USB3_CS_4, 1); 2086 if (ret) 2087 return ret; 2088 2089 lr = (val & ADP_USB3_CS_4_MSLR_MASK) >> ADP_USB3_CS_4_MSLR_SHIFT; 2090 ret = lr == ADP_USB3_CS_4_MSLR_20G ? 20000 : 10000; 2091 2092 return usb4_usb3_port_max_bandwidth(port, ret); 2093 } 2094 2095 static int usb4_usb3_port_cm_request(struct tb_port *port, bool request) 2096 { 2097 int ret; 2098 u32 val; 2099 2100 if (!tb_port_is_usb3_down(port)) 2101 return -EINVAL; 2102 if (tb_route(port->sw)) 2103 return -EINVAL; 2104 2105 ret = tb_port_read(port, &val, TB_CFG_PORT, 2106 port->cap_adap + ADP_USB3_CS_2, 1); 2107 if (ret) 2108 return ret; 2109 2110 if (request) 2111 val |= ADP_USB3_CS_2_CMR; 2112 else 2113 val &= ~ADP_USB3_CS_2_CMR; 2114 2115 ret = tb_port_write(port, &val, TB_CFG_PORT, 2116 port->cap_adap + ADP_USB3_CS_2, 1); 2117 if (ret) 2118 return ret; 2119 2120 /* 2121 * We can use val here directly as the CMR bit is in the same place 2122 * as HCA. Just mask out others. 2123 */ 2124 val &= ADP_USB3_CS_2_CMR; 2125 return usb4_port_wait_for_bit(port, port->cap_adap + ADP_USB3_CS_1, 2126 ADP_USB3_CS_1_HCA, val, 1500); 2127 } 2128 2129 static inline int usb4_usb3_port_set_cm_request(struct tb_port *port) 2130 { 2131 return usb4_usb3_port_cm_request(port, true); 2132 } 2133 2134 static inline int usb4_usb3_port_clear_cm_request(struct tb_port *port) 2135 { 2136 return usb4_usb3_port_cm_request(port, false); 2137 } 2138 2139 static unsigned int usb3_bw_to_mbps(u32 bw, u8 scale) 2140 { 2141 unsigned long uframes; 2142 2143 uframes = bw * 512UL << scale; 2144 return DIV_ROUND_CLOSEST(uframes * 8000, MEGA); 2145 } 2146 2147 static u32 mbps_to_usb3_bw(unsigned int mbps, u8 scale) 2148 { 2149 unsigned long uframes; 2150 2151 /* 1 uframe is 1/8 ms (125 us) -> 1 / 8000 s */ 2152 uframes = ((unsigned long)mbps * MEGA) / 8000; 2153 return DIV_ROUND_UP(uframes, 512UL << scale); 2154 } 2155 2156 static int usb4_usb3_port_read_allocated_bandwidth(struct tb_port *port, 2157 int *upstream_bw, 2158 int *downstream_bw) 2159 { 2160 u32 val, bw, scale; 2161 int ret; 2162 2163 ret = tb_port_read(port, &val, TB_CFG_PORT, 2164 port->cap_adap + ADP_USB3_CS_2, 1); 2165 if (ret) 2166 return ret; 2167 2168 ret = tb_port_read(port, &scale, TB_CFG_PORT, 2169 port->cap_adap + ADP_USB3_CS_3, 1); 2170 if (ret) 2171 return ret; 2172 2173 scale &= ADP_USB3_CS_3_SCALE_MASK; 2174 2175 bw = val & ADP_USB3_CS_2_AUBW_MASK; 2176 *upstream_bw = usb3_bw_to_mbps(bw, scale); 2177 2178 bw = (val & ADP_USB3_CS_2_ADBW_MASK) >> ADP_USB3_CS_2_ADBW_SHIFT; 2179 *downstream_bw = usb3_bw_to_mbps(bw, scale); 2180 2181 return 0; 2182 } 2183 2184 /** 2185 * usb4_usb3_port_allocated_bandwidth() - Bandwidth allocated for USB3 2186 * @port: USB3 adapter port 2187 * @upstream_bw: Allocated upstream bandwidth is stored here 2188 * @downstream_bw: Allocated downstream bandwidth is stored here 2189 * 2190 * Stores currently allocated USB3 bandwidth into @upstream_bw and 2191 * @downstream_bw in Mb/s. Returns %0 in case of success and negative 2192 * errno in failure. 2193 */ 2194 int usb4_usb3_port_allocated_bandwidth(struct tb_port *port, int *upstream_bw, 2195 int *downstream_bw) 2196 { 2197 int ret; 2198 2199 ret = usb4_usb3_port_set_cm_request(port); 2200 if (ret) 2201 return ret; 2202 2203 ret = usb4_usb3_port_read_allocated_bandwidth(port, upstream_bw, 2204 downstream_bw); 2205 usb4_usb3_port_clear_cm_request(port); 2206 2207 return ret; 2208 } 2209 2210 static int usb4_usb3_port_read_consumed_bandwidth(struct tb_port *port, 2211 int *upstream_bw, 2212 int *downstream_bw) 2213 { 2214 u32 val, bw, scale; 2215 int ret; 2216 2217 ret = tb_port_read(port, &val, TB_CFG_PORT, 2218 port->cap_adap + ADP_USB3_CS_1, 1); 2219 if (ret) 2220 return ret; 2221 2222 ret = tb_port_read(port, &scale, TB_CFG_PORT, 2223 port->cap_adap + ADP_USB3_CS_3, 1); 2224 if (ret) 2225 return ret; 2226 2227 scale &= ADP_USB3_CS_3_SCALE_MASK; 2228 2229 bw = val & ADP_USB3_CS_1_CUBW_MASK; 2230 *upstream_bw = usb3_bw_to_mbps(bw, scale); 2231 2232 bw = (val & ADP_USB3_CS_1_CDBW_MASK) >> ADP_USB3_CS_1_CDBW_SHIFT; 2233 *downstream_bw = usb3_bw_to_mbps(bw, scale); 2234 2235 return 0; 2236 } 2237 2238 static int usb4_usb3_port_write_allocated_bandwidth(struct tb_port *port, 2239 int upstream_bw, 2240 int downstream_bw) 2241 { 2242 u32 val, ubw, dbw, scale; 2243 int ret, max_bw; 2244 2245 /* Figure out suitable scale */ 2246 scale = 0; 2247 max_bw = max(upstream_bw, downstream_bw); 2248 while (scale < 64) { 2249 if (mbps_to_usb3_bw(max_bw, scale) < 4096) 2250 break; 2251 scale++; 2252 } 2253 2254 if (WARN_ON(scale >= 64)) 2255 return -EINVAL; 2256 2257 ret = tb_port_write(port, &scale, TB_CFG_PORT, 2258 port->cap_adap + ADP_USB3_CS_3, 1); 2259 if (ret) 2260 return ret; 2261 2262 ubw = mbps_to_usb3_bw(upstream_bw, scale); 2263 dbw = mbps_to_usb3_bw(downstream_bw, scale); 2264 2265 tb_port_dbg(port, "scaled bandwidth %u/%u, scale %u\n", ubw, dbw, scale); 2266 2267 ret = tb_port_read(port, &val, TB_CFG_PORT, 2268 port->cap_adap + ADP_USB3_CS_2, 1); 2269 if (ret) 2270 return ret; 2271 2272 val &= ~(ADP_USB3_CS_2_AUBW_MASK | ADP_USB3_CS_2_ADBW_MASK); 2273 val |= dbw << ADP_USB3_CS_2_ADBW_SHIFT; 2274 val |= ubw; 2275 2276 return tb_port_write(port, &val, TB_CFG_PORT, 2277 port->cap_adap + ADP_USB3_CS_2, 1); 2278 } 2279 2280 /** 2281 * usb4_usb3_port_allocate_bandwidth() - Allocate bandwidth for USB3 2282 * @port: USB3 adapter port 2283 * @upstream_bw: New upstream bandwidth 2284 * @downstream_bw: New downstream bandwidth 2285 * 2286 * This can be used to set how much bandwidth is allocated for the USB3 2287 * tunneled isochronous traffic. @upstream_bw and @downstream_bw are the 2288 * new values programmed to the USB3 adapter allocation registers. If 2289 * the values are lower than what is currently consumed the allocation 2290 * is set to what is currently consumed instead (consumed bandwidth 2291 * cannot be taken away by CM). The actual new values are returned in 2292 * @upstream_bw and @downstream_bw. 2293 * 2294 * Returns %0 in case of success and negative errno if there was a 2295 * failure. 2296 */ 2297 int usb4_usb3_port_allocate_bandwidth(struct tb_port *port, int *upstream_bw, 2298 int *downstream_bw) 2299 { 2300 int ret, consumed_up, consumed_down, allocate_up, allocate_down; 2301 2302 ret = usb4_usb3_port_set_cm_request(port); 2303 if (ret) 2304 return ret; 2305 2306 ret = usb4_usb3_port_read_consumed_bandwidth(port, &consumed_up, 2307 &consumed_down); 2308 if (ret) 2309 goto err_request; 2310 2311 /* Don't allow it go lower than what is consumed */ 2312 allocate_up = max(*upstream_bw, consumed_up); 2313 allocate_down = max(*downstream_bw, consumed_down); 2314 2315 ret = usb4_usb3_port_write_allocated_bandwidth(port, allocate_up, 2316 allocate_down); 2317 if (ret) 2318 goto err_request; 2319 2320 *upstream_bw = allocate_up; 2321 *downstream_bw = allocate_down; 2322 2323 err_request: 2324 usb4_usb3_port_clear_cm_request(port); 2325 return ret; 2326 } 2327 2328 /** 2329 * usb4_usb3_port_release_bandwidth() - Release allocated USB3 bandwidth 2330 * @port: USB3 adapter port 2331 * @upstream_bw: New allocated upstream bandwidth 2332 * @downstream_bw: New allocated downstream bandwidth 2333 * 2334 * Releases USB3 allocated bandwidth down to what is actually consumed. 2335 * The new bandwidth is returned in @upstream_bw and @downstream_bw. 2336 * 2337 * Returns 0% in success and negative errno in case of failure. 2338 */ 2339 int usb4_usb3_port_release_bandwidth(struct tb_port *port, int *upstream_bw, 2340 int *downstream_bw) 2341 { 2342 int ret, consumed_up, consumed_down; 2343 2344 ret = usb4_usb3_port_set_cm_request(port); 2345 if (ret) 2346 return ret; 2347 2348 ret = usb4_usb3_port_read_consumed_bandwidth(port, &consumed_up, 2349 &consumed_down); 2350 if (ret) 2351 goto err_request; 2352 2353 /* 2354 * Always keep 900 Mb/s to make sure xHCI has at least some 2355 * bandwidth available for isochronous traffic. 2356 */ 2357 if (consumed_up < 900) 2358 consumed_up = 900; 2359 if (consumed_down < 900) 2360 consumed_down = 900; 2361 2362 ret = usb4_usb3_port_write_allocated_bandwidth(port, consumed_up, 2363 consumed_down); 2364 if (ret) 2365 goto err_request; 2366 2367 *upstream_bw = consumed_up; 2368 *downstream_bw = consumed_down; 2369 2370 err_request: 2371 usb4_usb3_port_clear_cm_request(port); 2372 return ret; 2373 } 2374 2375 static bool is_usb4_dpin(const struct tb_port *port) 2376 { 2377 if (!tb_port_is_dpin(port)) 2378 return false; 2379 if (!tb_switch_is_usb4(port->sw)) 2380 return false; 2381 return true; 2382 } 2383 2384 /** 2385 * usb4_dp_port_set_cm_id() - Assign CM ID to the DP IN adapter 2386 * @port: DP IN adapter 2387 * @cm_id: CM ID to assign 2388 * 2389 * Sets CM ID for the @port. Returns %0 on success and negative errno 2390 * otherwise. Speficially returns %-EOPNOTSUPP if the @port does not 2391 * support this. 2392 */ 2393 int usb4_dp_port_set_cm_id(struct tb_port *port, int cm_id) 2394 { 2395 u32 val; 2396 int ret; 2397 2398 if (!is_usb4_dpin(port)) 2399 return -EOPNOTSUPP; 2400 2401 ret = tb_port_read(port, &val, TB_CFG_PORT, 2402 port->cap_adap + ADP_DP_CS_2, 1); 2403 if (ret) 2404 return ret; 2405 2406 val &= ~ADP_DP_CS_2_CM_ID_MASK; 2407 val |= cm_id << ADP_DP_CS_2_CM_ID_SHIFT; 2408 2409 return tb_port_write(port, &val, TB_CFG_PORT, 2410 port->cap_adap + ADP_DP_CS_2, 1); 2411 } 2412 2413 /** 2414 * usb4_dp_port_bandwidth_mode_supported() - Is the bandwidth allocation mode 2415 * supported 2416 * @port: DP IN adapter to check 2417 * 2418 * Can be called to any DP IN adapter. Returns true if the adapter 2419 * supports USB4 bandwidth allocation mode, false otherwise. 2420 */ 2421 bool usb4_dp_port_bandwidth_mode_supported(struct tb_port *port) 2422 { 2423 int ret; 2424 u32 val; 2425 2426 if (!is_usb4_dpin(port)) 2427 return false; 2428 2429 ret = tb_port_read(port, &val, TB_CFG_PORT, 2430 port->cap_adap + DP_LOCAL_CAP, 1); 2431 if (ret) 2432 return false; 2433 2434 return !!(val & DP_COMMON_CAP_BW_MODE); 2435 } 2436 2437 /** 2438 * usb4_dp_port_bandwidth_mode_enabled() - Is the bandwidth allocation mode 2439 * enabled 2440 * @port: DP IN adapter to check 2441 * 2442 * Can be called to any DP IN adapter. Returns true if the bandwidth 2443 * allocation mode has been enabled, false otherwise. 2444 */ 2445 bool usb4_dp_port_bandwidth_mode_enabled(struct tb_port *port) 2446 { 2447 int ret; 2448 u32 val; 2449 2450 if (!is_usb4_dpin(port)) 2451 return false; 2452 2453 ret = tb_port_read(port, &val, TB_CFG_PORT, 2454 port->cap_adap + ADP_DP_CS_8, 1); 2455 if (ret) 2456 return false; 2457 2458 return !!(val & ADP_DP_CS_8_DPME); 2459 } 2460 2461 /** 2462 * usb4_dp_port_set_cm_bandwidth_mode_supported() - Set/clear CM support for 2463 * bandwidth allocation mode 2464 * @port: DP IN adapter 2465 * @supported: Does the CM support bandwidth allocation mode 2466 * 2467 * Can be called to any DP IN adapter. Sets or clears the CM support bit 2468 * of the DP IN adapter. Returns %0 in success and negative errno 2469 * otherwise. Specifically returns %-OPNOTSUPP if the passed in adapter 2470 * does not support this. 2471 */ 2472 int usb4_dp_port_set_cm_bandwidth_mode_supported(struct tb_port *port, 2473 bool supported) 2474 { 2475 u32 val; 2476 int ret; 2477 2478 if (!is_usb4_dpin(port)) 2479 return -EOPNOTSUPP; 2480 2481 ret = tb_port_read(port, &val, TB_CFG_PORT, 2482 port->cap_adap + ADP_DP_CS_2, 1); 2483 if (ret) 2484 return ret; 2485 2486 if (supported) 2487 val |= ADP_DP_CS_2_CMMS; 2488 else 2489 val &= ~ADP_DP_CS_2_CMMS; 2490 2491 return tb_port_write(port, &val, TB_CFG_PORT, 2492 port->cap_adap + ADP_DP_CS_2, 1); 2493 } 2494 2495 /** 2496 * usb4_dp_port_group_id() - Return Group ID assigned for the adapter 2497 * @port: DP IN adapter 2498 * 2499 * Reads bandwidth allocation Group ID from the DP IN adapter and 2500 * returns it. If the adapter does not support setting Group_ID 2501 * %-EOPNOTSUPP is returned. 2502 */ 2503 int usb4_dp_port_group_id(struct tb_port *port) 2504 { 2505 u32 val; 2506 int ret; 2507 2508 if (!is_usb4_dpin(port)) 2509 return -EOPNOTSUPP; 2510 2511 ret = tb_port_read(port, &val, TB_CFG_PORT, 2512 port->cap_adap + ADP_DP_CS_2, 1); 2513 if (ret) 2514 return ret; 2515 2516 return (val & ADP_DP_CS_2_GROUP_ID_MASK) >> ADP_DP_CS_2_GROUP_ID_SHIFT; 2517 } 2518 2519 /** 2520 * usb4_dp_port_set_group_id() - Set adapter Group ID 2521 * @port: DP IN adapter 2522 * @group_id: Group ID for the adapter 2523 * 2524 * Sets bandwidth allocation mode Group ID for the DP IN adapter. 2525 * Returns %0 in case of success and negative errno otherwise. 2526 * Specifically returns %-EOPNOTSUPP if the adapter does not support 2527 * this. 2528 */ 2529 int usb4_dp_port_set_group_id(struct tb_port *port, int group_id) 2530 { 2531 u32 val; 2532 int ret; 2533 2534 if (!is_usb4_dpin(port)) 2535 return -EOPNOTSUPP; 2536 2537 ret = tb_port_read(port, &val, TB_CFG_PORT, 2538 port->cap_adap + ADP_DP_CS_2, 1); 2539 if (ret) 2540 return ret; 2541 2542 val &= ~ADP_DP_CS_2_GROUP_ID_MASK; 2543 val |= group_id << ADP_DP_CS_2_GROUP_ID_SHIFT; 2544 2545 return tb_port_write(port, &val, TB_CFG_PORT, 2546 port->cap_adap + ADP_DP_CS_2, 1); 2547 } 2548 2549 /** 2550 * usb4_dp_port_nrd() - Read non-reduced rate and lanes 2551 * @port: DP IN adapter 2552 * @rate: Non-reduced rate in Mb/s is placed here 2553 * @lanes: Non-reduced lanes are placed here 2554 * 2555 * Reads the non-reduced rate and lanes from the DP IN adapter. Returns 2556 * %0 in success and negative errno otherwise. Specifically returns 2557 * %-EOPNOTSUPP if the adapter does not support this. 2558 */ 2559 int usb4_dp_port_nrd(struct tb_port *port, int *rate, int *lanes) 2560 { 2561 u32 val, tmp; 2562 int ret; 2563 2564 if (!is_usb4_dpin(port)) 2565 return -EOPNOTSUPP; 2566 2567 ret = tb_port_read(port, &val, TB_CFG_PORT, 2568 port->cap_adap + ADP_DP_CS_2, 1); 2569 if (ret) 2570 return ret; 2571 2572 tmp = (val & ADP_DP_CS_2_NRD_MLR_MASK) >> ADP_DP_CS_2_NRD_MLR_SHIFT; 2573 switch (tmp) { 2574 case DP_COMMON_CAP_RATE_RBR: 2575 *rate = 1620; 2576 break; 2577 case DP_COMMON_CAP_RATE_HBR: 2578 *rate = 2700; 2579 break; 2580 case DP_COMMON_CAP_RATE_HBR2: 2581 *rate = 5400; 2582 break; 2583 case DP_COMMON_CAP_RATE_HBR3: 2584 *rate = 8100; 2585 break; 2586 } 2587 2588 tmp = val & ADP_DP_CS_2_NRD_MLC_MASK; 2589 switch (tmp) { 2590 case DP_COMMON_CAP_1_LANE: 2591 *lanes = 1; 2592 break; 2593 case DP_COMMON_CAP_2_LANES: 2594 *lanes = 2; 2595 break; 2596 case DP_COMMON_CAP_4_LANES: 2597 *lanes = 4; 2598 break; 2599 } 2600 2601 return 0; 2602 } 2603 2604 /** 2605 * usb4_dp_port_set_nrd() - Set non-reduced rate and lanes 2606 * @port: DP IN adapter 2607 * @rate: Non-reduced rate in Mb/s 2608 * @lanes: Non-reduced lanes 2609 * 2610 * Before the capabilities reduction this function can be used to set 2611 * the non-reduced values for the DP IN adapter. Returns %0 in success 2612 * and negative errno otherwise. If the adapter does not support this 2613 * %-EOPNOTSUPP is returned. 2614 */ 2615 int usb4_dp_port_set_nrd(struct tb_port *port, int rate, int lanes) 2616 { 2617 u32 val; 2618 int ret; 2619 2620 if (!is_usb4_dpin(port)) 2621 return -EOPNOTSUPP; 2622 2623 ret = tb_port_read(port, &val, TB_CFG_PORT, 2624 port->cap_adap + ADP_DP_CS_2, 1); 2625 if (ret) 2626 return ret; 2627 2628 val &= ~ADP_DP_CS_2_NRD_MLR_MASK; 2629 2630 switch (rate) { 2631 case 1620: 2632 break; 2633 case 2700: 2634 val |= (DP_COMMON_CAP_RATE_HBR << ADP_DP_CS_2_NRD_MLR_SHIFT) 2635 & ADP_DP_CS_2_NRD_MLR_MASK; 2636 break; 2637 case 5400: 2638 val |= (DP_COMMON_CAP_RATE_HBR2 << ADP_DP_CS_2_NRD_MLR_SHIFT) 2639 & ADP_DP_CS_2_NRD_MLR_MASK; 2640 break; 2641 case 8100: 2642 val |= (DP_COMMON_CAP_RATE_HBR3 << ADP_DP_CS_2_NRD_MLR_SHIFT) 2643 & ADP_DP_CS_2_NRD_MLR_MASK; 2644 break; 2645 default: 2646 return -EINVAL; 2647 } 2648 2649 val &= ~ADP_DP_CS_2_NRD_MLC_MASK; 2650 2651 switch (lanes) { 2652 case 1: 2653 break; 2654 case 2: 2655 val |= DP_COMMON_CAP_2_LANES; 2656 break; 2657 case 4: 2658 val |= DP_COMMON_CAP_4_LANES; 2659 break; 2660 default: 2661 return -EINVAL; 2662 } 2663 2664 return tb_port_write(port, &val, TB_CFG_PORT, 2665 port->cap_adap + ADP_DP_CS_2, 1); 2666 } 2667 2668 /** 2669 * usb4_dp_port_granularity() - Return granularity for the bandwidth values 2670 * @port: DP IN adapter 2671 * 2672 * Reads the programmed granularity from @port. If the DP IN adapter does 2673 * not support bandwidth allocation mode returns %-EOPNOTSUPP and negative 2674 * errno in other error cases. 2675 */ 2676 int usb4_dp_port_granularity(struct tb_port *port) 2677 { 2678 u32 val; 2679 int ret; 2680 2681 if (!is_usb4_dpin(port)) 2682 return -EOPNOTSUPP; 2683 2684 ret = tb_port_read(port, &val, TB_CFG_PORT, 2685 port->cap_adap + ADP_DP_CS_2, 1); 2686 if (ret) 2687 return ret; 2688 2689 val &= ADP_DP_CS_2_GR_MASK; 2690 val >>= ADP_DP_CS_2_GR_SHIFT; 2691 2692 switch (val) { 2693 case ADP_DP_CS_2_GR_0_25G: 2694 return 250; 2695 case ADP_DP_CS_2_GR_0_5G: 2696 return 500; 2697 case ADP_DP_CS_2_GR_1G: 2698 return 1000; 2699 } 2700 2701 return -EINVAL; 2702 } 2703 2704 /** 2705 * usb4_dp_port_set_granularity() - Set granularity for the bandwidth values 2706 * @port: DP IN adapter 2707 * @granularity: Granularity in Mb/s. Supported values: 1000, 500 and 250. 2708 * 2709 * Sets the granularity used with the estimated, allocated and requested 2710 * bandwidth. Returns %0 in success and negative errno otherwise. If the 2711 * adapter does not support this %-EOPNOTSUPP is returned. 2712 */ 2713 int usb4_dp_port_set_granularity(struct tb_port *port, int granularity) 2714 { 2715 u32 val; 2716 int ret; 2717 2718 if (!is_usb4_dpin(port)) 2719 return -EOPNOTSUPP; 2720 2721 ret = tb_port_read(port, &val, TB_CFG_PORT, 2722 port->cap_adap + ADP_DP_CS_2, 1); 2723 if (ret) 2724 return ret; 2725 2726 val &= ~ADP_DP_CS_2_GR_MASK; 2727 2728 switch (granularity) { 2729 case 250: 2730 val |= ADP_DP_CS_2_GR_0_25G << ADP_DP_CS_2_GR_SHIFT; 2731 break; 2732 case 500: 2733 val |= ADP_DP_CS_2_GR_0_5G << ADP_DP_CS_2_GR_SHIFT; 2734 break; 2735 case 1000: 2736 val |= ADP_DP_CS_2_GR_1G << ADP_DP_CS_2_GR_SHIFT; 2737 break; 2738 default: 2739 return -EINVAL; 2740 } 2741 2742 return tb_port_write(port, &val, TB_CFG_PORT, 2743 port->cap_adap + ADP_DP_CS_2, 1); 2744 } 2745 2746 /** 2747 * usb4_dp_port_set_estimated_bandwidth() - Set estimated bandwidth 2748 * @port: DP IN adapter 2749 * @bw: Estimated bandwidth in Mb/s. 2750 * 2751 * Sets the estimated bandwidth to @bw. Set the granularity by calling 2752 * usb4_dp_port_set_granularity() before calling this. The @bw is round 2753 * down to the closest granularity multiplier. Returns %0 in success 2754 * and negative errno otherwise. Specifically returns %-EOPNOTSUPP if 2755 * the adapter does not support this. 2756 */ 2757 int usb4_dp_port_set_estimated_bandwidth(struct tb_port *port, int bw) 2758 { 2759 u32 val, granularity; 2760 int ret; 2761 2762 if (!is_usb4_dpin(port)) 2763 return -EOPNOTSUPP; 2764 2765 ret = usb4_dp_port_granularity(port); 2766 if (ret < 0) 2767 return ret; 2768 granularity = ret; 2769 2770 ret = tb_port_read(port, &val, TB_CFG_PORT, 2771 port->cap_adap + ADP_DP_CS_2, 1); 2772 if (ret) 2773 return ret; 2774 2775 val &= ~ADP_DP_CS_2_ESTIMATED_BW_MASK; 2776 val |= (bw / granularity) << ADP_DP_CS_2_ESTIMATED_BW_SHIFT; 2777 2778 return tb_port_write(port, &val, TB_CFG_PORT, 2779 port->cap_adap + ADP_DP_CS_2, 1); 2780 } 2781 2782 /** 2783 * usb4_dp_port_allocated_bandwidth() - Return allocated bandwidth 2784 * @port: DP IN adapter 2785 * 2786 * Reads and returns allocated bandwidth for @port in Mb/s (taking into 2787 * account the programmed granularity). Returns negative errno in case 2788 * of error. 2789 */ 2790 int usb4_dp_port_allocated_bandwidth(struct tb_port *port) 2791 { 2792 u32 val, granularity; 2793 int ret; 2794 2795 if (!is_usb4_dpin(port)) 2796 return -EOPNOTSUPP; 2797 2798 ret = usb4_dp_port_granularity(port); 2799 if (ret < 0) 2800 return ret; 2801 granularity = ret; 2802 2803 ret = tb_port_read(port, &val, TB_CFG_PORT, 2804 port->cap_adap + DP_STATUS, 1); 2805 if (ret) 2806 return ret; 2807 2808 val &= DP_STATUS_ALLOCATED_BW_MASK; 2809 val >>= DP_STATUS_ALLOCATED_BW_SHIFT; 2810 2811 return val * granularity; 2812 } 2813 2814 static int __usb4_dp_port_set_cm_ack(struct tb_port *port, bool ack) 2815 { 2816 u32 val; 2817 int ret; 2818 2819 ret = tb_port_read(port, &val, TB_CFG_PORT, 2820 port->cap_adap + ADP_DP_CS_2, 1); 2821 if (ret) 2822 return ret; 2823 2824 if (ack) 2825 val |= ADP_DP_CS_2_CA; 2826 else 2827 val &= ~ADP_DP_CS_2_CA; 2828 2829 return tb_port_write(port, &val, TB_CFG_PORT, 2830 port->cap_adap + ADP_DP_CS_2, 1); 2831 } 2832 2833 static inline int usb4_dp_port_set_cm_ack(struct tb_port *port) 2834 { 2835 return __usb4_dp_port_set_cm_ack(port, true); 2836 } 2837 2838 static int usb4_dp_port_wait_and_clear_cm_ack(struct tb_port *port, 2839 int timeout_msec) 2840 { 2841 ktime_t end; 2842 u32 val; 2843 int ret; 2844 2845 ret = __usb4_dp_port_set_cm_ack(port, false); 2846 if (ret) 2847 return ret; 2848 2849 end = ktime_add_ms(ktime_get(), timeout_msec); 2850 do { 2851 ret = tb_port_read(port, &val, TB_CFG_PORT, 2852 port->cap_adap + ADP_DP_CS_8, 1); 2853 if (ret) 2854 return ret; 2855 2856 if (!(val & ADP_DP_CS_8_DR)) 2857 break; 2858 2859 usleep_range(50, 100); 2860 } while (ktime_before(ktime_get(), end)); 2861 2862 if (val & ADP_DP_CS_8_DR) { 2863 tb_port_warn(port, "timeout waiting for DPTX request to clear\n"); 2864 return -ETIMEDOUT; 2865 } 2866 2867 ret = tb_port_read(port, &val, TB_CFG_PORT, 2868 port->cap_adap + ADP_DP_CS_2, 1); 2869 if (ret) 2870 return ret; 2871 2872 val &= ~ADP_DP_CS_2_CA; 2873 return tb_port_write(port, &val, TB_CFG_PORT, 2874 port->cap_adap + ADP_DP_CS_2, 1); 2875 } 2876 2877 /** 2878 * usb4_dp_port_allocate_bandwidth() - Set allocated bandwidth 2879 * @port: DP IN adapter 2880 * @bw: New allocated bandwidth in Mb/s 2881 * 2882 * Communicates the new allocated bandwidth with the DPCD (graphics 2883 * driver). Takes into account the programmed granularity. Returns %0 in 2884 * success and negative errno in case of error. 2885 */ 2886 int usb4_dp_port_allocate_bandwidth(struct tb_port *port, int bw) 2887 { 2888 u32 val, granularity; 2889 int ret; 2890 2891 if (!is_usb4_dpin(port)) 2892 return -EOPNOTSUPP; 2893 2894 ret = usb4_dp_port_granularity(port); 2895 if (ret < 0) 2896 return ret; 2897 granularity = ret; 2898 2899 ret = tb_port_read(port, &val, TB_CFG_PORT, 2900 port->cap_adap + DP_STATUS, 1); 2901 if (ret) 2902 return ret; 2903 2904 val &= ~DP_STATUS_ALLOCATED_BW_MASK; 2905 val |= (bw / granularity) << DP_STATUS_ALLOCATED_BW_SHIFT; 2906 2907 ret = tb_port_write(port, &val, TB_CFG_PORT, 2908 port->cap_adap + DP_STATUS, 1); 2909 if (ret) 2910 return ret; 2911 2912 ret = usb4_dp_port_set_cm_ack(port); 2913 if (ret) 2914 return ret; 2915 2916 return usb4_dp_port_wait_and_clear_cm_ack(port, 500); 2917 } 2918 2919 /** 2920 * usb4_dp_port_requested_bandwidth() - Read requested bandwidth 2921 * @port: DP IN adapter 2922 * 2923 * Reads the DPCD (graphics driver) requested bandwidth and returns it 2924 * in Mb/s. Takes the programmed granularity into account. In case of 2925 * error returns negative errno. Specifically returns %-EOPNOTSUPP if 2926 * the adapter does not support bandwidth allocation mode, and %ENODATA 2927 * if there is no active bandwidth request from the graphics driver. 2928 */ 2929 int usb4_dp_port_requested_bandwidth(struct tb_port *port) 2930 { 2931 u32 val, granularity; 2932 int ret; 2933 2934 if (!is_usb4_dpin(port)) 2935 return -EOPNOTSUPP; 2936 2937 ret = usb4_dp_port_granularity(port); 2938 if (ret < 0) 2939 return ret; 2940 granularity = ret; 2941 2942 ret = tb_port_read(port, &val, TB_CFG_PORT, 2943 port->cap_adap + ADP_DP_CS_8, 1); 2944 if (ret) 2945 return ret; 2946 2947 if (!(val & ADP_DP_CS_8_DR)) 2948 return -ENODATA; 2949 2950 return (val & ADP_DP_CS_8_REQUESTED_BW_MASK) * granularity; 2951 } 2952 2953 /** 2954 * usb4_pci_port_set_ext_encapsulation() - Enable/disable extended encapsulation 2955 * @port: PCIe adapter 2956 * @enable: Enable/disable extended encapsulation 2957 * 2958 * Enables or disables extended encapsulation used in PCIe tunneling. Caller 2959 * needs to make sure both adapters support this before enabling. Returns %0 on 2960 * success and negative errno otherwise. 2961 */ 2962 int usb4_pci_port_set_ext_encapsulation(struct tb_port *port, bool enable) 2963 { 2964 u32 val; 2965 int ret; 2966 2967 if (!tb_port_is_pcie_up(port) && !tb_port_is_pcie_down(port)) 2968 return -EINVAL; 2969 2970 ret = tb_port_read(port, &val, TB_CFG_PORT, 2971 port->cap_adap + ADP_PCIE_CS_1, 1); 2972 if (ret) 2973 return ret; 2974 2975 if (enable) 2976 val |= ADP_PCIE_CS_1_EE; 2977 else 2978 val &= ~ADP_PCIE_CS_1_EE; 2979 2980 return tb_port_write(port, &val, TB_CFG_PORT, 2981 port->cap_adap + ADP_PCIE_CS_1, 1); 2982 } 2983