1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Copyright(c) 2020 Intel Corporation. All rights reserved. */ 3 #include <linux/platform_device.h> 4 #include <linux/memregion.h> 5 #include <linux/workqueue.h> 6 #include <linux/debugfs.h> 7 #include <linux/device.h> 8 #include <linux/module.h> 9 #include <linux/pci.h> 10 #include <linux/slab.h> 11 #include <linux/idr.h> 12 #include <linux/node.h> 13 #include <cxl/einj.h> 14 #include <cxl/pci.h> 15 #include <cxlmem.h> 16 #include <cxlpci.h> 17 #include <cxl.h> 18 #include "core.h" 19 20 /** 21 * DOC: cxl core 22 * 23 * The CXL core provides a set of interfaces that can be consumed by CXL aware 24 * drivers. The interfaces allow for creation, modification, and destruction of 25 * regions, memory devices, ports, and decoders. CXL aware drivers must register 26 * with the CXL core via these interfaces in order to be able to participate in 27 * cross-device interleave coordination. The CXL core also establishes and 28 * maintains the bridge to the nvdimm subsystem. 29 * 30 * CXL core introduces sysfs hierarchy to control the devices that are 31 * instantiated by the core. 32 */ 33 34 static DEFINE_IDA(cxl_port_ida); 35 static DEFINE_XARRAY(cxl_root_buses); 36 37 /* 38 * The terminal device in PCI is NULL and @platform_bus 39 * for platform devices (for cxl_test) 40 */ 41 static bool is_cxl_host_bridge(struct device *dev) 42 { 43 return (!dev || dev == &platform_bus); 44 } 45 46 int cxl_num_decoders_committed(struct cxl_port *port) 47 { 48 lockdep_assert_held(&cxl_rwsem.region); 49 50 return port->commit_end + 1; 51 } 52 53 static ssize_t devtype_show(struct device *dev, struct device_attribute *attr, 54 char *buf) 55 { 56 return sysfs_emit(buf, "%s\n", dev->type->name); 57 } 58 static DEVICE_ATTR_RO(devtype); 59 60 static int cxl_device_id(const struct device *dev) 61 { 62 if (dev->type == &cxl_nvdimm_bridge_type) 63 return CXL_DEVICE_NVDIMM_BRIDGE; 64 if (dev->type == &cxl_nvdimm_type) 65 return CXL_DEVICE_NVDIMM; 66 if (dev->type == CXL_PMEM_REGION_TYPE()) 67 return CXL_DEVICE_PMEM_REGION; 68 if (dev->type == CXL_DAX_REGION_TYPE()) 69 return CXL_DEVICE_DAX_REGION; 70 if (is_cxl_port(dev)) { 71 if (is_cxl_root(to_cxl_port(dev))) 72 return CXL_DEVICE_ROOT; 73 return CXL_DEVICE_PORT; 74 } 75 if (is_cxl_memdev(dev)) 76 return CXL_DEVICE_MEMORY_EXPANDER; 77 if (dev->type == CXL_REGION_TYPE()) 78 return CXL_DEVICE_REGION; 79 if (dev->type == &cxl_pmu_type) 80 return CXL_DEVICE_PMU; 81 return 0; 82 } 83 84 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, 85 char *buf) 86 { 87 return sysfs_emit(buf, CXL_MODALIAS_FMT "\n", cxl_device_id(dev)); 88 } 89 static DEVICE_ATTR_RO(modalias); 90 91 static struct attribute *cxl_base_attributes[] = { 92 &dev_attr_devtype.attr, 93 &dev_attr_modalias.attr, 94 NULL, 95 }; 96 97 struct attribute_group cxl_base_attribute_group = { 98 .attrs = cxl_base_attributes, 99 }; 100 101 static ssize_t start_show(struct device *dev, struct device_attribute *attr, 102 char *buf) 103 { 104 struct cxl_decoder *cxld = to_cxl_decoder(dev); 105 106 return sysfs_emit(buf, "%#llx\n", cxld->hpa_range.start); 107 } 108 static DEVICE_ATTR_ADMIN_RO(start); 109 110 static ssize_t size_show(struct device *dev, struct device_attribute *attr, 111 char *buf) 112 { 113 struct cxl_decoder *cxld = to_cxl_decoder(dev); 114 115 return sysfs_emit(buf, "%#llx\n", range_len(&cxld->hpa_range)); 116 } 117 static DEVICE_ATTR_RO(size); 118 119 #define CXL_DECODER_FLAG_ATTR(name, flag) \ 120 static ssize_t name##_show(struct device *dev, \ 121 struct device_attribute *attr, char *buf) \ 122 { \ 123 struct cxl_decoder *cxld = to_cxl_decoder(dev); \ 124 \ 125 return sysfs_emit(buf, "%s\n", \ 126 (cxld->flags & (flag)) ? "1" : "0"); \ 127 } \ 128 static DEVICE_ATTR_RO(name) 129 130 CXL_DECODER_FLAG_ATTR(cap_pmem, CXL_DECODER_F_PMEM); 131 CXL_DECODER_FLAG_ATTR(cap_ram, CXL_DECODER_F_RAM); 132 CXL_DECODER_FLAG_ATTR(cap_type2, CXL_DECODER_F_TYPE2); 133 CXL_DECODER_FLAG_ATTR(cap_type3, CXL_DECODER_F_TYPE3); 134 CXL_DECODER_FLAG_ATTR(locked, CXL_DECODER_F_LOCK); 135 136 static ssize_t target_type_show(struct device *dev, 137 struct device_attribute *attr, char *buf) 138 { 139 struct cxl_decoder *cxld = to_cxl_decoder(dev); 140 141 switch (cxld->target_type) { 142 case CXL_DECODER_DEVMEM: 143 return sysfs_emit(buf, "accelerator\n"); 144 case CXL_DECODER_HOSTONLYMEM: 145 return sysfs_emit(buf, "expander\n"); 146 } 147 return -ENXIO; 148 } 149 static DEVICE_ATTR_RO(target_type); 150 151 static ssize_t emit_target_list(struct cxl_switch_decoder *cxlsd, char *buf) 152 { 153 struct cxl_decoder *cxld = &cxlsd->cxld; 154 ssize_t offset = 0; 155 int i, rc = 0; 156 157 for (i = 0; i < cxld->interleave_ways; i++) { 158 struct cxl_dport *dport = cxlsd->target[i]; 159 struct cxl_dport *next = NULL; 160 161 if (!dport) 162 break; 163 164 if (i + 1 < cxld->interleave_ways) 165 next = cxlsd->target[i + 1]; 166 rc = sysfs_emit_at(buf, offset, "%d%s", dport->port_id, 167 next ? "," : ""); 168 if (rc < 0) 169 return rc; 170 offset += rc; 171 } 172 173 return offset; 174 } 175 176 static ssize_t target_list_show(struct device *dev, 177 struct device_attribute *attr, char *buf) 178 { 179 struct cxl_switch_decoder *cxlsd = to_cxl_switch_decoder(dev); 180 ssize_t offset; 181 int rc; 182 183 guard(rwsem_read)(&cxl_rwsem.region); 184 rc = emit_target_list(cxlsd, buf); 185 if (rc < 0) 186 return rc; 187 offset = rc; 188 189 rc = sysfs_emit_at(buf, offset, "\n"); 190 if (rc < 0) 191 return rc; 192 193 return offset + rc; 194 } 195 static DEVICE_ATTR_RO(target_list); 196 197 static ssize_t mode_show(struct device *dev, struct device_attribute *attr, 198 char *buf) 199 { 200 struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev); 201 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 202 struct cxl_dev_state *cxlds = cxlmd->cxlds; 203 /* without @cxl_rwsem.dpa, make sure @part is not reloaded */ 204 int part = READ_ONCE(cxled->part); 205 const char *desc; 206 207 if (part < 0) 208 desc = "none"; 209 else 210 desc = cxlds->part[part].res.name; 211 212 return sysfs_emit(buf, "%s\n", desc); 213 } 214 215 static ssize_t mode_store(struct device *dev, struct device_attribute *attr, 216 const char *buf, size_t len) 217 { 218 struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev); 219 enum cxl_partition_mode mode; 220 ssize_t rc; 221 222 if (sysfs_streq(buf, "pmem")) 223 mode = CXL_PARTMODE_PMEM; 224 else if (sysfs_streq(buf, "ram")) 225 mode = CXL_PARTMODE_RAM; 226 else 227 return -EINVAL; 228 229 rc = cxl_dpa_set_part(cxled, mode); 230 if (rc) 231 return rc; 232 233 return len; 234 } 235 static DEVICE_ATTR_RW(mode); 236 237 static ssize_t dpa_resource_show(struct device *dev, struct device_attribute *attr, 238 char *buf) 239 { 240 struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev); 241 242 guard(rwsem_read)(&cxl_rwsem.dpa); 243 return sysfs_emit(buf, "%#llx\n", (u64)cxl_dpa_resource_start(cxled)); 244 } 245 static DEVICE_ATTR_RO(dpa_resource); 246 247 static ssize_t dpa_size_show(struct device *dev, struct device_attribute *attr, 248 char *buf) 249 { 250 struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev); 251 resource_size_t size = cxl_dpa_size(cxled); 252 253 return sysfs_emit(buf, "%pa\n", &size); 254 } 255 256 static ssize_t dpa_size_store(struct device *dev, struct device_attribute *attr, 257 const char *buf, size_t len) 258 { 259 struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev); 260 unsigned long long size; 261 ssize_t rc; 262 263 rc = kstrtoull(buf, 0, &size); 264 if (rc) 265 return rc; 266 267 if (!IS_ALIGNED(size, SZ_256M)) 268 return -EINVAL; 269 270 rc = cxl_dpa_free(cxled); 271 if (rc) 272 return rc; 273 274 if (size == 0) 275 return len; 276 277 rc = cxl_dpa_alloc(cxled, size); 278 if (rc) 279 return rc; 280 281 return len; 282 } 283 static DEVICE_ATTR_RW(dpa_size); 284 285 static ssize_t interleave_granularity_show(struct device *dev, 286 struct device_attribute *attr, 287 char *buf) 288 { 289 struct cxl_decoder *cxld = to_cxl_decoder(dev); 290 291 return sysfs_emit(buf, "%d\n", cxld->interleave_granularity); 292 } 293 294 static DEVICE_ATTR_RO(interleave_granularity); 295 296 static ssize_t interleave_ways_show(struct device *dev, 297 struct device_attribute *attr, char *buf) 298 { 299 struct cxl_decoder *cxld = to_cxl_decoder(dev); 300 301 return sysfs_emit(buf, "%d\n", cxld->interleave_ways); 302 } 303 304 static DEVICE_ATTR_RO(interleave_ways); 305 306 static ssize_t qos_class_show(struct device *dev, 307 struct device_attribute *attr, char *buf) 308 { 309 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev); 310 311 return sysfs_emit(buf, "%d\n", cxlrd->qos_class); 312 } 313 static DEVICE_ATTR_RO(qos_class); 314 315 static struct attribute *cxl_decoder_base_attrs[] = { 316 &dev_attr_start.attr, 317 &dev_attr_size.attr, 318 &dev_attr_locked.attr, 319 &dev_attr_interleave_granularity.attr, 320 &dev_attr_interleave_ways.attr, 321 NULL, 322 }; 323 324 static struct attribute_group cxl_decoder_base_attribute_group = { 325 .attrs = cxl_decoder_base_attrs, 326 }; 327 328 static struct attribute *cxl_decoder_root_attrs[] = { 329 &dev_attr_cap_pmem.attr, 330 &dev_attr_cap_ram.attr, 331 &dev_attr_cap_type2.attr, 332 &dev_attr_cap_type3.attr, 333 &dev_attr_target_list.attr, 334 &dev_attr_qos_class.attr, 335 SET_CXL_REGION_ATTR(create_pmem_region) 336 SET_CXL_REGION_ATTR(create_ram_region) 337 SET_CXL_REGION_ATTR(delete_region) 338 NULL, 339 }; 340 341 static bool can_create_pmem(struct cxl_root_decoder *cxlrd) 342 { 343 unsigned long flags = CXL_DECODER_F_TYPE3 | CXL_DECODER_F_PMEM; 344 345 return (cxlrd->cxlsd.cxld.flags & flags) == flags; 346 } 347 348 static bool can_create_ram(struct cxl_root_decoder *cxlrd) 349 { 350 unsigned long flags = CXL_DECODER_F_TYPE3 | CXL_DECODER_F_RAM; 351 352 return (cxlrd->cxlsd.cxld.flags & flags) == flags; 353 } 354 355 static umode_t cxl_root_decoder_visible(struct kobject *kobj, struct attribute *a, int n) 356 { 357 struct device *dev = kobj_to_dev(kobj); 358 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev); 359 360 if (a == CXL_REGION_ATTR(create_pmem_region) && !can_create_pmem(cxlrd)) 361 return 0; 362 363 if (a == CXL_REGION_ATTR(create_ram_region) && !can_create_ram(cxlrd)) 364 return 0; 365 366 if (a == CXL_REGION_ATTR(delete_region) && 367 !(can_create_pmem(cxlrd) || can_create_ram(cxlrd))) 368 return 0; 369 370 return a->mode; 371 } 372 373 static struct attribute_group cxl_decoder_root_attribute_group = { 374 .attrs = cxl_decoder_root_attrs, 375 .is_visible = cxl_root_decoder_visible, 376 }; 377 378 static const struct attribute_group *cxl_decoder_root_attribute_groups[] = { 379 &cxl_decoder_root_attribute_group, 380 &cxl_decoder_base_attribute_group, 381 &cxl_base_attribute_group, 382 NULL, 383 }; 384 385 static struct attribute *cxl_decoder_switch_attrs[] = { 386 &dev_attr_target_type.attr, 387 &dev_attr_target_list.attr, 388 SET_CXL_REGION_ATTR(region) 389 NULL, 390 }; 391 392 static struct attribute_group cxl_decoder_switch_attribute_group = { 393 .attrs = cxl_decoder_switch_attrs, 394 }; 395 396 static const struct attribute_group *cxl_decoder_switch_attribute_groups[] = { 397 &cxl_decoder_switch_attribute_group, 398 &cxl_decoder_base_attribute_group, 399 &cxl_base_attribute_group, 400 NULL, 401 }; 402 403 static struct attribute *cxl_decoder_endpoint_attrs[] = { 404 &dev_attr_target_type.attr, 405 &dev_attr_mode.attr, 406 &dev_attr_dpa_size.attr, 407 &dev_attr_dpa_resource.attr, 408 SET_CXL_REGION_ATTR(region) 409 NULL, 410 }; 411 412 static struct attribute_group cxl_decoder_endpoint_attribute_group = { 413 .attrs = cxl_decoder_endpoint_attrs, 414 }; 415 416 static const struct attribute_group *cxl_decoder_endpoint_attribute_groups[] = { 417 &cxl_decoder_base_attribute_group, 418 &cxl_decoder_endpoint_attribute_group, 419 &cxl_base_attribute_group, 420 NULL, 421 }; 422 423 static void __cxl_decoder_release(struct cxl_decoder *cxld) 424 { 425 struct cxl_port *port = to_cxl_port(cxld->dev.parent); 426 427 ida_free(&port->decoder_ida, cxld->id); 428 put_device(&port->dev); 429 } 430 431 static void cxl_endpoint_decoder_release(struct device *dev) 432 { 433 struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev); 434 435 __cxl_decoder_release(&cxled->cxld); 436 kfree(cxled); 437 } 438 439 static void cxl_switch_decoder_release(struct device *dev) 440 { 441 struct cxl_switch_decoder *cxlsd = to_cxl_switch_decoder(dev); 442 443 __cxl_decoder_release(&cxlsd->cxld); 444 kfree(cxlsd); 445 } 446 447 struct cxl_root_decoder *to_cxl_root_decoder(struct device *dev) 448 { 449 if (dev_WARN_ONCE(dev, !is_root_decoder(dev), 450 "not a cxl_root_decoder device\n")) 451 return NULL; 452 return container_of(dev, struct cxl_root_decoder, cxlsd.cxld.dev); 453 } 454 EXPORT_SYMBOL_NS_GPL(to_cxl_root_decoder, "CXL"); 455 456 static void cxl_root_decoder_release(struct device *dev) 457 { 458 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev); 459 460 if (atomic_read(&cxlrd->region_id) >= 0) 461 memregion_free(atomic_read(&cxlrd->region_id)); 462 mutex_destroy(&cxlrd->regions_lock); 463 xa_destroy(&cxlrd->regions); 464 __cxl_decoder_release(&cxlrd->cxlsd.cxld); 465 kfree(cxlrd); 466 } 467 468 static const struct device_type cxl_decoder_endpoint_type = { 469 .name = "cxl_decoder_endpoint", 470 .release = cxl_endpoint_decoder_release, 471 .groups = cxl_decoder_endpoint_attribute_groups, 472 }; 473 474 static const struct device_type cxl_decoder_switch_type = { 475 .name = "cxl_decoder_switch", 476 .release = cxl_switch_decoder_release, 477 .groups = cxl_decoder_switch_attribute_groups, 478 }; 479 480 static const struct device_type cxl_decoder_root_type = { 481 .name = "cxl_decoder_root", 482 .release = cxl_root_decoder_release, 483 .groups = cxl_decoder_root_attribute_groups, 484 }; 485 486 bool is_endpoint_decoder(struct device *dev) 487 { 488 return dev->type == &cxl_decoder_endpoint_type; 489 } 490 EXPORT_SYMBOL_NS_GPL(is_endpoint_decoder, "CXL"); 491 492 bool is_root_decoder(struct device *dev) 493 { 494 return dev->type == &cxl_decoder_root_type; 495 } 496 EXPORT_SYMBOL_NS_GPL(is_root_decoder, "CXL"); 497 498 bool is_switch_decoder(struct device *dev) 499 { 500 return is_root_decoder(dev) || dev->type == &cxl_decoder_switch_type; 501 } 502 EXPORT_SYMBOL_NS_GPL(is_switch_decoder, "CXL"); 503 504 struct cxl_decoder *to_cxl_decoder(struct device *dev) 505 { 506 if (dev_WARN_ONCE(dev, 507 !is_switch_decoder(dev) && !is_endpoint_decoder(dev), 508 "not a cxl_decoder device\n")) 509 return NULL; 510 return container_of(dev, struct cxl_decoder, dev); 511 } 512 EXPORT_SYMBOL_NS_GPL(to_cxl_decoder, "CXL"); 513 514 struct cxl_endpoint_decoder *to_cxl_endpoint_decoder(struct device *dev) 515 { 516 if (dev_WARN_ONCE(dev, !is_endpoint_decoder(dev), 517 "not a cxl_endpoint_decoder device\n")) 518 return NULL; 519 return container_of(dev, struct cxl_endpoint_decoder, cxld.dev); 520 } 521 EXPORT_SYMBOL_NS_GPL(to_cxl_endpoint_decoder, "CXL"); 522 523 struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev) 524 { 525 if (dev_WARN_ONCE(dev, !is_switch_decoder(dev), 526 "not a cxl_switch_decoder device\n")) 527 return NULL; 528 return container_of(dev, struct cxl_switch_decoder, cxld.dev); 529 } 530 EXPORT_SYMBOL_NS_GPL(to_cxl_switch_decoder, "CXL"); 531 532 static void cxl_ep_release(struct cxl_ep *ep) 533 { 534 put_device(ep->ep); 535 kfree(ep); 536 } 537 538 static void cxl_ep_remove(struct cxl_port *port, struct cxl_ep *ep) 539 { 540 if (!ep) 541 return; 542 xa_erase(&port->endpoints, (unsigned long) ep->ep); 543 cxl_ep_release(ep); 544 } 545 546 static void cxl_port_release(struct device *dev) 547 { 548 struct cxl_port *port = to_cxl_port(dev); 549 unsigned long index; 550 struct cxl_ep *ep; 551 552 xa_for_each(&port->endpoints, index, ep) 553 cxl_ep_remove(port, ep); 554 xa_destroy(&port->endpoints); 555 xa_destroy(&port->dports); 556 xa_destroy(&port->regions); 557 ida_free(&cxl_port_ida, port->id); 558 559 if (is_cxl_root(port)) { 560 kfree(to_cxl_root(port)); 561 } else { 562 put_device(dev->parent); 563 kfree(port); 564 } 565 } 566 567 static ssize_t decoders_committed_show(struct device *dev, 568 struct device_attribute *attr, char *buf) 569 { 570 struct cxl_port *port = to_cxl_port(dev); 571 572 guard(rwsem_read)(&cxl_rwsem.region); 573 return sysfs_emit(buf, "%d\n", cxl_num_decoders_committed(port)); 574 } 575 576 static DEVICE_ATTR_RO(decoders_committed); 577 578 static struct attribute *cxl_port_attrs[] = { 579 &dev_attr_decoders_committed.attr, 580 NULL, 581 }; 582 583 static struct attribute_group cxl_port_attribute_group = { 584 .attrs = cxl_port_attrs, 585 }; 586 587 static const struct attribute_group *cxl_port_attribute_groups[] = { 588 &cxl_base_attribute_group, 589 &cxl_port_attribute_group, 590 NULL, 591 }; 592 593 static const struct device_type cxl_port_type = { 594 .name = "cxl_port", 595 .release = cxl_port_release, 596 .groups = cxl_port_attribute_groups, 597 }; 598 599 bool is_cxl_port(const struct device *dev) 600 { 601 return dev->type == &cxl_port_type; 602 } 603 EXPORT_SYMBOL_NS_GPL(is_cxl_port, "CXL"); 604 605 struct cxl_port *to_cxl_port(const struct device *dev) 606 { 607 if (dev_WARN_ONCE(dev, dev->type != &cxl_port_type, 608 "not a cxl_port device\n")) 609 return NULL; 610 return container_of(dev, struct cxl_port, dev); 611 } 612 EXPORT_SYMBOL_NS_GPL(to_cxl_port, "CXL"); 613 614 struct cxl_port *parent_port_of(struct cxl_port *port) 615 { 616 if (!port || !port->parent_dport) 617 return NULL; 618 return port->parent_dport->port; 619 } 620 621 static void unregister_port(void *_port) 622 { 623 struct cxl_port *port = _port; 624 625 device_lock_assert(port_to_host(port)); 626 port->dead = true; 627 device_unregister(&port->dev); 628 } 629 630 static void cxl_unlink_uport(void *_port) 631 { 632 struct cxl_port *port = _port; 633 634 sysfs_remove_link(&port->dev.kobj, "uport"); 635 } 636 637 static int devm_cxl_link_uport(struct device *host, struct cxl_port *port) 638 { 639 int rc; 640 641 rc = sysfs_create_link(&port->dev.kobj, &port->uport_dev->kobj, 642 "uport"); 643 if (rc) 644 return rc; 645 return devm_add_action_or_reset(host, cxl_unlink_uport, port); 646 } 647 648 static void cxl_unlink_parent_dport(void *_port) 649 { 650 struct cxl_port *port = _port; 651 652 sysfs_remove_link(&port->dev.kobj, "parent_dport"); 653 } 654 655 static int devm_cxl_link_parent_dport(struct device *host, 656 struct cxl_port *port, 657 struct cxl_dport *parent_dport) 658 { 659 int rc; 660 661 if (!parent_dport) 662 return 0; 663 664 rc = sysfs_create_link(&port->dev.kobj, &parent_dport->dport_dev->kobj, 665 "parent_dport"); 666 if (rc) 667 return rc; 668 return devm_add_action_or_reset(host, cxl_unlink_parent_dport, port); 669 } 670 671 static struct lock_class_key cxl_port_key; 672 673 static struct cxl_port *cxl_port_alloc(struct device *uport_dev, 674 struct cxl_dport *parent_dport) 675 { 676 struct cxl_root *cxl_root __free(kfree) = NULL; 677 struct cxl_port *port, *_port __free(kfree) = NULL; 678 struct device *dev; 679 int rc; 680 681 /* No parent_dport, root cxl_port */ 682 if (!parent_dport) { 683 cxl_root = kzalloc_obj(*cxl_root); 684 if (!cxl_root) 685 return ERR_PTR(-ENOMEM); 686 } else { 687 _port = kzalloc_obj(*port); 688 if (!_port) 689 return ERR_PTR(-ENOMEM); 690 } 691 692 rc = ida_alloc(&cxl_port_ida, GFP_KERNEL); 693 if (rc < 0) 694 return ERR_PTR(rc); 695 696 if (cxl_root) 697 port = &no_free_ptr(cxl_root)->port; 698 else 699 port = no_free_ptr(_port); 700 701 port->id = rc; 702 port->uport_dev = uport_dev; 703 704 /* 705 * The top-level cxl_port "cxl_root" does not have a cxl_port as 706 * its parent and it does not have any corresponding component 707 * registers as its decode is described by a fixed platform 708 * description. 709 */ 710 dev = &port->dev; 711 if (parent_dport) { 712 struct cxl_port *parent_port = parent_dport->port; 713 struct cxl_port *iter; 714 715 dev->parent = &parent_port->dev; 716 get_device(dev->parent); 717 port->depth = parent_port->depth + 1; 718 port->parent_dport = parent_dport; 719 720 /* 721 * walk to the host bridge, or the first ancestor that knows 722 * the host bridge 723 */ 724 iter = port; 725 while (!iter->host_bridge && 726 !is_cxl_root(to_cxl_port(iter->dev.parent))) 727 iter = to_cxl_port(iter->dev.parent); 728 if (iter->host_bridge) 729 port->host_bridge = iter->host_bridge; 730 else if (parent_dport->rch) 731 port->host_bridge = parent_dport->dport_dev; 732 else 733 port->host_bridge = iter->uport_dev; 734 dev_dbg(uport_dev, "host-bridge: %s\n", 735 dev_name(port->host_bridge)); 736 } else 737 dev->parent = uport_dev; 738 739 ida_init(&port->decoder_ida); 740 port->hdm_end = -1; 741 port->commit_end = -1; 742 xa_init(&port->dports); 743 xa_init(&port->endpoints); 744 xa_init(&port->regions); 745 port->component_reg_phys = CXL_RESOURCE_NONE; 746 747 device_initialize(dev); 748 lockdep_set_class_and_subclass(&dev->mutex, &cxl_port_key, port->depth); 749 device_set_pm_not_required(dev); 750 dev->bus = &cxl_bus_type; 751 dev->type = &cxl_port_type; 752 753 return port; 754 } 755 756 static int cxl_setup_comp_regs(struct device *host, struct cxl_register_map *map, 757 resource_size_t component_reg_phys) 758 { 759 *map = (struct cxl_register_map) { 760 .host = host, 761 .reg_type = CXL_REGLOC_RBI_EMPTY, 762 .resource = component_reg_phys, 763 }; 764 765 if (component_reg_phys == CXL_RESOURCE_NONE) 766 return 0; 767 768 map->reg_type = CXL_REGLOC_RBI_COMPONENT; 769 map->max_size = CXL_COMPONENT_REG_BLOCK_SIZE; 770 771 return cxl_setup_regs(map); 772 } 773 774 int cxl_port_setup_regs(struct cxl_port *port, 775 resource_size_t component_reg_phys) 776 { 777 if (dev_is_platform(port->uport_dev)) 778 return 0; 779 return cxl_setup_comp_regs(&port->dev, &port->reg_map, 780 component_reg_phys); 781 } 782 EXPORT_SYMBOL_NS_GPL(cxl_port_setup_regs, "CXL"); 783 784 static int cxl_dport_setup_regs(struct device *host, struct cxl_dport *dport, 785 resource_size_t component_reg_phys) 786 { 787 int rc; 788 789 if (dev_is_platform(dport->dport_dev)) 790 return 0; 791 792 /* 793 * use @dport->dport_dev for the context for error messages during 794 * register probing, and fixup @host after the fact, since @host may be 795 * NULL. 796 */ 797 rc = cxl_setup_comp_regs(dport->dport_dev, &dport->reg_map, 798 component_reg_phys); 799 dport->reg_map.host = host; 800 return rc; 801 } 802 803 DEFINE_SHOW_ATTRIBUTE(einj_cxl_available_error_type); 804 805 static int cxl_einj_inject(void *data, u64 type) 806 { 807 struct cxl_dport *dport = data; 808 809 if (dport->rch) 810 return einj_cxl_inject_rch_error(dport->rcrb.base, type); 811 812 return einj_cxl_inject_error(to_pci_dev(dport->dport_dev), type); 813 } 814 DEFINE_DEBUGFS_ATTRIBUTE(cxl_einj_inject_fops, NULL, cxl_einj_inject, 815 "0x%llx\n"); 816 817 static void cxl_debugfs_create_dport_dir(struct cxl_dport *dport) 818 { 819 struct cxl_port *parent = parent_port_of(dport->port); 820 struct dentry *dir; 821 822 if (!einj_cxl_is_initialized()) 823 return; 824 825 /* 826 * Protocol error injection is only available for CXL 2.0+ root ports 827 * and CXL 1.1 downstream ports 828 */ 829 if (!dport->rch && 830 !(dev_is_pci(dport->dport_dev) && parent && is_cxl_root(parent))) 831 return; 832 833 dir = cxl_debugfs_create_dir(dev_name(dport->dport_dev)); 834 835 debugfs_create_file("einj_inject", 0200, dir, dport, 836 &cxl_einj_inject_fops); 837 } 838 839 static int cxl_port_add(struct cxl_port *port, 840 resource_size_t component_reg_phys, 841 struct cxl_dport *parent_dport) 842 { 843 struct device *dev __free(put_device) = &port->dev; 844 int rc; 845 846 if (is_cxl_memdev(port->uport_dev)) { 847 struct cxl_memdev *cxlmd = to_cxl_memdev(port->uport_dev); 848 struct cxl_dev_state *cxlds = cxlmd->cxlds; 849 850 rc = dev_set_name(dev, "endpoint%d", port->id); 851 if (rc) 852 return rc; 853 854 /* 855 * The endpoint driver already enumerated the component and RAS 856 * registers. Reuse that enumeration while prepping them to be 857 * mapped by the cxl_port driver. 858 */ 859 port->reg_map = cxlds->reg_map; 860 port->reg_map.host = &port->dev; 861 cxlmd->endpoint = port; 862 } else if (parent_dport) { 863 rc = dev_set_name(dev, "port%d", port->id); 864 if (rc) 865 return rc; 866 867 port->component_reg_phys = component_reg_phys; 868 } else { 869 rc = dev_set_name(dev, "root%d", port->id); 870 if (rc) 871 return rc; 872 } 873 874 rc = device_add(dev); 875 if (rc) 876 return rc; 877 878 /* Inhibit the cleanup function invoked */ 879 dev = NULL; 880 return 0; 881 } 882 883 static struct cxl_port *__devm_cxl_add_port(struct device *host, 884 struct device *uport_dev, 885 resource_size_t component_reg_phys, 886 struct cxl_dport *parent_dport) 887 { 888 struct cxl_port *port; 889 int rc; 890 891 port = cxl_port_alloc(uport_dev, parent_dport); 892 if (IS_ERR(port)) 893 return port; 894 895 rc = cxl_port_add(port, component_reg_phys, parent_dport); 896 if (rc) 897 return ERR_PTR(rc); 898 899 rc = devm_add_action_or_reset(host, unregister_port, port); 900 if (rc) 901 return ERR_PTR(rc); 902 903 rc = devm_cxl_link_uport(host, port); 904 if (rc) 905 return ERR_PTR(rc); 906 907 rc = devm_cxl_link_parent_dport(host, port, parent_dport); 908 if (rc) 909 return ERR_PTR(rc); 910 911 if (parent_dport && dev_is_pci(uport_dev)) 912 port->pci_latency = cxl_pci_get_latency(to_pci_dev(uport_dev)); 913 914 return port; 915 } 916 917 /** 918 * devm_cxl_add_port - register a cxl_port in CXL memory decode hierarchy 919 * @host: host device for devm operations 920 * @uport_dev: "physical" device implementing this upstream port 921 * @component_reg_phys: (optional) for configurable cxl_port instances 922 * @parent_dport: next hop up in the CXL memory decode hierarchy 923 */ 924 struct cxl_port *devm_cxl_add_port(struct device *host, 925 struct device *uport_dev, 926 resource_size_t component_reg_phys, 927 struct cxl_dport *parent_dport) 928 { 929 struct cxl_port *port, *parent_port; 930 931 port = __devm_cxl_add_port(host, uport_dev, component_reg_phys, 932 parent_dport); 933 934 parent_port = parent_dport ? parent_dport->port : NULL; 935 if (IS_ERR(port)) { 936 dev_dbg(uport_dev, "Failed to add%s%s%s: %ld\n", 937 parent_port ? " port to " : "", 938 parent_port ? dev_name(&parent_port->dev) : "", 939 parent_port ? "" : " root port", 940 PTR_ERR(port)); 941 } else { 942 dev_dbg(uport_dev, "%s added%s%s%s\n", 943 dev_name(&port->dev), 944 parent_port ? " to " : "", 945 parent_port ? dev_name(&parent_port->dev) : "", 946 parent_port ? "" : " (root port)"); 947 } 948 949 return port; 950 } 951 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_port, "CXL"); 952 953 struct cxl_root *devm_cxl_add_root(struct device *host) 954 { 955 struct cxl_port *port; 956 957 port = devm_cxl_add_port(host, host, CXL_RESOURCE_NONE, NULL); 958 if (IS_ERR(port)) 959 return ERR_CAST(port); 960 961 return to_cxl_root(port); 962 } 963 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_root, "CXL"); 964 965 struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port) 966 { 967 /* There is no pci_bus associated with a CXL platform-root port */ 968 if (is_cxl_root(port)) 969 return NULL; 970 971 if (dev_is_pci(port->uport_dev)) { 972 struct pci_dev *pdev = to_pci_dev(port->uport_dev); 973 974 return pdev->subordinate; 975 } 976 977 return xa_load(&cxl_root_buses, (unsigned long)port->uport_dev); 978 } 979 EXPORT_SYMBOL_NS_GPL(cxl_port_to_pci_bus, "CXL"); 980 981 static void unregister_pci_bus(void *uport_dev) 982 { 983 xa_erase(&cxl_root_buses, (unsigned long)uport_dev); 984 } 985 986 int devm_cxl_register_pci_bus(struct device *host, struct device *uport_dev, 987 struct pci_bus *bus) 988 { 989 int rc; 990 991 if (dev_is_pci(uport_dev)) 992 return -EINVAL; 993 994 rc = xa_insert(&cxl_root_buses, (unsigned long)uport_dev, bus, 995 GFP_KERNEL); 996 if (rc) 997 return rc; 998 return devm_add_action_or_reset(host, unregister_pci_bus, uport_dev); 999 } 1000 EXPORT_SYMBOL_NS_GPL(devm_cxl_register_pci_bus, "CXL"); 1001 1002 static bool dev_is_cxl_root_child(struct device *dev) 1003 { 1004 struct cxl_port *port, *parent; 1005 1006 if (!is_cxl_port(dev)) 1007 return false; 1008 1009 port = to_cxl_port(dev); 1010 if (is_cxl_root(port)) 1011 return false; 1012 1013 parent = to_cxl_port(port->dev.parent); 1014 if (is_cxl_root(parent)) 1015 return true; 1016 1017 return false; 1018 } 1019 1020 struct cxl_root *find_cxl_root(struct cxl_port *port) 1021 { 1022 struct cxl_port *iter = port; 1023 1024 while (iter && !is_cxl_root(iter)) 1025 iter = to_cxl_port(iter->dev.parent); 1026 1027 if (!iter) 1028 return NULL; 1029 get_device(&iter->dev); 1030 return to_cxl_root(iter); 1031 } 1032 EXPORT_SYMBOL_NS_GPL(find_cxl_root, "CXL"); 1033 1034 static struct cxl_dport *find_dport(struct cxl_port *port, int id) 1035 { 1036 struct cxl_dport *dport; 1037 unsigned long index; 1038 1039 device_lock_assert(&port->dev); 1040 xa_for_each(&port->dports, index, dport) 1041 if (dport->port_id == id) 1042 return dport; 1043 return NULL; 1044 } 1045 1046 static int add_dport(struct cxl_port *port, struct cxl_dport *dport) 1047 { 1048 struct cxl_dport *dup; 1049 int rc; 1050 1051 device_lock_assert(&port->dev); 1052 dup = find_dport(port, dport->port_id); 1053 if (dup) { 1054 dev_err(&port->dev, 1055 "unable to add dport%d-%s non-unique port id (%s)\n", 1056 dport->port_id, dev_name(dport->dport_dev), 1057 dev_name(dup->dport_dev)); 1058 return -EBUSY; 1059 } 1060 1061 /* Arrange for dport_dev to be valid through remove_dport() */ 1062 struct device *dev __free(put_device) = get_device(dport->dport_dev); 1063 1064 rc = xa_insert(&port->dports, (unsigned long)dport->dport_dev, dport, 1065 GFP_KERNEL); 1066 if (rc) 1067 return rc; 1068 1069 retain_and_null_ptr(dev); 1070 port->nr_dports++; 1071 return 0; 1072 } 1073 1074 /* 1075 * Since root-level CXL dports cannot be enumerated by PCI they are not 1076 * enumerated by the common port driver that acquires the port lock over 1077 * dport add/remove. Instead, root dports are manually added by a 1078 * platform driver and cond_cxl_root_lock() is used to take the missing 1079 * port lock in that case. 1080 */ 1081 static void cond_cxl_root_lock(struct cxl_port *port) 1082 { 1083 if (is_cxl_root(port)) 1084 device_lock(&port->dev); 1085 } 1086 1087 static void cond_cxl_root_unlock(struct cxl_port *port) 1088 { 1089 if (is_cxl_root(port)) 1090 device_unlock(&port->dev); 1091 } 1092 1093 static void cxl_dport_remove(void *data) 1094 { 1095 struct cxl_dport *dport = data; 1096 struct cxl_port *port = dport->port; 1097 1098 port->nr_dports--; 1099 xa_erase(&port->dports, (unsigned long) dport->dport_dev); 1100 put_device(dport->dport_dev); 1101 } 1102 1103 static void cxl_dport_unlink(void *data) 1104 { 1105 struct cxl_dport *dport = data; 1106 struct cxl_port *port = dport->port; 1107 char link_name[CXL_TARGET_STRLEN]; 1108 1109 sprintf(link_name, "dport%d", dport->port_id); 1110 sysfs_remove_link(&port->dev.kobj, link_name); 1111 } 1112 1113 static void free_dport(void *dport) 1114 { 1115 kfree(dport); 1116 } 1117 1118 /* 1119 * Upon return either a group is established with one action (free_dport()), or 1120 * no group established and @dport is freed. 1121 */ 1122 static void *cxl_dport_open_dr_group_or_free(struct cxl_dport *dport) 1123 { 1124 int rc; 1125 struct device *host = dport_to_host(dport); 1126 void *group = devres_open_group(host, dport, GFP_KERNEL); 1127 1128 if (!group) { 1129 kfree(dport); 1130 return NULL; 1131 } 1132 1133 rc = devm_add_action_or_reset(host, free_dport, dport); 1134 if (rc) { 1135 devres_release_group(host, group); 1136 return NULL; 1137 } 1138 1139 return group; 1140 } 1141 1142 static void cxl_dport_close_dr_group(struct cxl_dport *dport, void *group) 1143 { 1144 devres_close_group(dport_to_host(dport), group); 1145 } 1146 1147 static void del_dport(struct cxl_dport *dport) 1148 { 1149 devres_release_group(dport_to_host(dport), dport); 1150 } 1151 1152 /* The dport group id is the dport */ 1153 DEFINE_FREE(cxl_dport_release_dr_group, void *, if (_T) del_dport(_T)) 1154 1155 static struct cxl_dport * 1156 __devm_cxl_add_dport(struct cxl_port *port, struct device *dport_dev, 1157 int port_id, resource_size_t component_reg_phys, 1158 resource_size_t rcrb) 1159 { 1160 char link_name[CXL_TARGET_STRLEN]; 1161 struct cxl_dport *dport; 1162 struct device *host; 1163 int rc; 1164 1165 if (is_cxl_root(port)) 1166 host = port->uport_dev; 1167 else 1168 host = &port->dev; 1169 1170 if (!host->driver) { 1171 dev_WARN_ONCE(&port->dev, 1, "dport:%s bad devm context\n", 1172 dev_name(dport_dev)); 1173 return ERR_PTR(-ENXIO); 1174 } 1175 1176 if (snprintf(link_name, CXL_TARGET_STRLEN, "dport%d", port_id) >= 1177 CXL_TARGET_STRLEN) 1178 return ERR_PTR(-EINVAL); 1179 1180 dport = kzalloc_obj(*dport); 1181 if (!dport) 1182 return ERR_PTR(-ENOMEM); 1183 1184 /* Just enough init to manage the devres group */ 1185 dport->dport_dev = dport_dev; 1186 dport->port_id = port_id; 1187 dport->port = port; 1188 1189 void *dport_dr_group __free(cxl_dport_release_dr_group) = 1190 cxl_dport_open_dr_group_or_free(dport); 1191 if (!dport_dr_group) 1192 return ERR_PTR(-ENOMEM); 1193 1194 if (rcrb == CXL_RESOURCE_NONE) { 1195 rc = cxl_dport_setup_regs(&port->dev, dport, 1196 component_reg_phys); 1197 if (rc) 1198 return ERR_PTR(rc); 1199 } else { 1200 dport->rcrb.base = rcrb; 1201 component_reg_phys = __rcrb_to_component(dport_dev, &dport->rcrb, 1202 CXL_RCRB_DOWNSTREAM); 1203 if (component_reg_phys == CXL_RESOURCE_NONE) { 1204 dev_warn(dport_dev, "Invalid Component Registers in RCRB"); 1205 return ERR_PTR(-ENXIO); 1206 } 1207 1208 /* 1209 * RCH @dport is not ready to map until associated with its 1210 * memdev 1211 */ 1212 rc = cxl_dport_setup_regs(NULL, dport, component_reg_phys); 1213 if (rc) 1214 return ERR_PTR(rc); 1215 1216 dport->rch = true; 1217 } 1218 1219 if (component_reg_phys != CXL_RESOURCE_NONE) 1220 dev_dbg(dport_dev, "Component Registers found for dport: %pa\n", 1221 &component_reg_phys); 1222 1223 cond_cxl_root_lock(port); 1224 rc = add_dport(port, dport); 1225 cond_cxl_root_unlock(port); 1226 if (rc) 1227 return ERR_PTR(rc); 1228 1229 rc = devm_add_action_or_reset(host, cxl_dport_remove, dport); 1230 if (rc) 1231 return ERR_PTR(rc); 1232 1233 rc = sysfs_create_link(&port->dev.kobj, &dport_dev->kobj, link_name); 1234 if (rc) 1235 return ERR_PTR(rc); 1236 1237 rc = devm_add_action_or_reset(host, cxl_dport_unlink, dport); 1238 if (rc) 1239 return ERR_PTR(rc); 1240 1241 if (dev_is_pci(dport_dev)) 1242 dport->link_latency = cxl_pci_get_latency(to_pci_dev(dport_dev)); 1243 1244 cxl_debugfs_create_dport_dir(dport); 1245 1246 if (!dport->rch) 1247 devm_cxl_dport_ras_setup(dport); 1248 1249 /* keep the group, and mark the end of devm actions */ 1250 cxl_dport_close_dr_group(dport, no_free_ptr(dport_dr_group)); 1251 1252 return dport; 1253 } 1254 1255 /** 1256 * devm_cxl_add_dport - append VH downstream port data to a cxl_port 1257 * @port: the cxl_port that references this dport 1258 * @dport_dev: firmware or PCI device representing the dport 1259 * @port_id: identifier for this dport in a decoder's target list 1260 * @component_reg_phys: optional location of CXL component registers 1261 * 1262 * Note that dports are appended to the devm release action's of the 1263 * either the port's host (for root ports), or the port itself (for 1264 * switch ports) 1265 */ 1266 struct cxl_dport *devm_cxl_add_dport(struct cxl_port *port, 1267 struct device *dport_dev, int port_id, 1268 resource_size_t component_reg_phys) 1269 { 1270 struct cxl_dport *dport; 1271 1272 dport = __devm_cxl_add_dport(port, dport_dev, port_id, 1273 component_reg_phys, CXL_RESOURCE_NONE); 1274 if (IS_ERR(dport)) { 1275 dev_dbg(dport_dev, "failed to add dport to %s: %ld\n", 1276 dev_name(&port->dev), PTR_ERR(dport)); 1277 } else { 1278 dev_dbg(dport_dev, "dport added to %s\n", 1279 dev_name(&port->dev)); 1280 } 1281 1282 return dport; 1283 } 1284 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_dport, "CXL"); 1285 1286 /** 1287 * devm_cxl_add_rch_dport - append RCH downstream port data to a cxl_port 1288 * @port: the cxl_port that references this dport 1289 * @dport_dev: firmware or PCI device representing the dport 1290 * @port_id: identifier for this dport in a decoder's target list 1291 * @rcrb: mandatory location of a Root Complex Register Block 1292 * 1293 * See CXL 3.0 9.11.8 CXL Devices Attached to an RCH 1294 */ 1295 struct cxl_dport *devm_cxl_add_rch_dport(struct cxl_port *port, 1296 struct device *dport_dev, int port_id, 1297 resource_size_t rcrb) 1298 { 1299 struct cxl_dport *dport; 1300 1301 if (rcrb == CXL_RESOURCE_NONE) { 1302 dev_dbg(&port->dev, "failed to add RCH dport, missing RCRB\n"); 1303 return ERR_PTR(-EINVAL); 1304 } 1305 1306 dport = __devm_cxl_add_dport(port, dport_dev, port_id, 1307 CXL_RESOURCE_NONE, rcrb); 1308 if (IS_ERR(dport)) { 1309 dev_dbg(dport_dev, "failed to add RCH dport to %s: %ld\n", 1310 dev_name(&port->dev), PTR_ERR(dport)); 1311 } else { 1312 dev_dbg(dport_dev, "RCH dport added to %s\n", 1313 dev_name(&port->dev)); 1314 } 1315 1316 return dport; 1317 } 1318 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_rch_dport, "CXL"); 1319 1320 static int add_ep(struct cxl_ep *new) 1321 { 1322 struct cxl_port *port = new->dport->port; 1323 1324 guard(device)(&port->dev); 1325 if (port->dead) 1326 return -ENXIO; 1327 1328 return xa_insert(&port->endpoints, (unsigned long)new->ep, 1329 new, GFP_KERNEL); 1330 } 1331 1332 /** 1333 * cxl_add_ep - register an endpoint's interest in a port 1334 * @dport: the dport that routes to @ep_dev 1335 * @ep_dev: device representing the endpoint 1336 * 1337 * Intermediate CXL ports are scanned based on the arrival of endpoints. 1338 * When those endpoints depart the port can be destroyed once all 1339 * endpoints that care about that port have been removed. 1340 */ 1341 static int cxl_add_ep(struct cxl_dport *dport, struct device *ep_dev) 1342 { 1343 struct cxl_ep *ep; 1344 int rc; 1345 1346 ep = kzalloc_obj(*ep); 1347 if (!ep) 1348 return -ENOMEM; 1349 1350 ep->ep = get_device(ep_dev); 1351 ep->dport = dport; 1352 1353 rc = add_ep(ep); 1354 if (rc) 1355 cxl_ep_release(ep); 1356 return rc; 1357 } 1358 1359 struct cxl_find_port_ctx { 1360 const struct device *dport_dev; 1361 const struct cxl_port *parent_port; 1362 struct cxl_dport **dport; 1363 }; 1364 1365 static int match_port_by_dport(struct device *dev, const void *data) 1366 { 1367 const struct cxl_find_port_ctx *ctx = data; 1368 struct cxl_dport *dport; 1369 struct cxl_port *port; 1370 1371 if (!is_cxl_port(dev)) 1372 return 0; 1373 if (ctx->parent_port && dev->parent != &ctx->parent_port->dev) 1374 return 0; 1375 1376 port = to_cxl_port(dev); 1377 dport = cxl_find_dport_by_dev(port, ctx->dport_dev); 1378 if (ctx->dport) 1379 *ctx->dport = dport; 1380 return dport != NULL; 1381 } 1382 1383 static struct cxl_port *__find_cxl_port(struct cxl_find_port_ctx *ctx) 1384 { 1385 struct device *dev; 1386 1387 if (!ctx->dport_dev) 1388 return NULL; 1389 1390 dev = bus_find_device(&cxl_bus_type, NULL, ctx, match_port_by_dport); 1391 if (dev) 1392 return to_cxl_port(dev); 1393 return NULL; 1394 } 1395 1396 static struct cxl_port *find_cxl_port(struct device *dport_dev, 1397 struct cxl_dport **dport) 1398 { 1399 struct cxl_find_port_ctx ctx = { 1400 .dport_dev = dport_dev, 1401 .dport = dport, 1402 }; 1403 struct cxl_port *port; 1404 1405 port = __find_cxl_port(&ctx); 1406 return port; 1407 } 1408 1409 /* 1410 * All users of grandparent() are using it to walk PCIe-like switch port 1411 * hierarchy. A PCIe switch is comprised of a bridge device representing the 1412 * upstream switch port and N bridges representing downstream switch ports. When 1413 * bridges stack the grand-parent of a downstream switch port is another 1414 * downstream switch port in the immediate ancestor switch. 1415 */ 1416 static struct device *grandparent(struct device *dev) 1417 { 1418 if (dev && dev->parent) 1419 return dev->parent->parent; 1420 return NULL; 1421 } 1422 1423 static void delete_endpoint(void *data) 1424 { 1425 struct cxl_memdev *cxlmd = data; 1426 struct cxl_port *endpoint = cxlmd->endpoint; 1427 struct device *host = port_to_host(endpoint); 1428 1429 scoped_guard(device, host) { 1430 if (host->driver && !endpoint->dead) { 1431 devm_release_action(host, cxl_unlink_parent_dport, endpoint); 1432 devm_release_action(host, cxl_unlink_uport, endpoint); 1433 devm_release_action(host, unregister_port, endpoint); 1434 } 1435 cxlmd->endpoint = NULL; 1436 } 1437 put_device(&endpoint->dev); 1438 put_device(host); 1439 } 1440 1441 int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint) 1442 { 1443 struct device *host = port_to_host(endpoint); 1444 struct device *dev = &cxlmd->dev; 1445 1446 get_device(host); 1447 get_device(&endpoint->dev); 1448 cxlmd->depth = endpoint->depth; 1449 return devm_add_action_or_reset(dev, delete_endpoint, cxlmd); 1450 } 1451 EXPORT_SYMBOL_NS_GPL(cxl_endpoint_autoremove, "CXL"); 1452 1453 /* 1454 * The natural end of life of a non-root 'cxl_port' is when its parent port goes 1455 * through a ->remove() event ("top-down" unregistration). The unnatural trigger 1456 * for a port to be unregistered is when all memdevs beneath that port have gone 1457 * through ->remove(). This "bottom-up" removal selectively removes individual 1458 * child ports manually. This depends on devm_cxl_add_port() to not change is 1459 * devm action registration order, and for dports to have already been 1460 * destroyed by del_dports(). 1461 */ 1462 static void delete_switch_port(struct cxl_port *port) 1463 { 1464 devm_release_action(port->dev.parent, cxl_unlink_parent_dport, port); 1465 devm_release_action(port->dev.parent, cxl_unlink_uport, port); 1466 devm_release_action(port->dev.parent, unregister_port, port); 1467 } 1468 1469 static void del_dports(struct cxl_port *port) 1470 { 1471 struct cxl_dport *dport; 1472 unsigned long index; 1473 1474 device_lock_assert(&port->dev); 1475 1476 xa_for_each(&port->dports, index, dport) 1477 del_dport(dport); 1478 } 1479 1480 struct detach_ctx { 1481 struct cxl_memdev *cxlmd; 1482 int depth; 1483 }; 1484 1485 static int port_has_memdev(struct device *dev, const void *data) 1486 { 1487 const struct detach_ctx *ctx = data; 1488 struct cxl_port *port; 1489 1490 if (!is_cxl_port(dev)) 1491 return 0; 1492 1493 port = to_cxl_port(dev); 1494 if (port->depth != ctx->depth) 1495 return 0; 1496 1497 return !!cxl_ep_load(port, ctx->cxlmd); 1498 } 1499 1500 static void cxl_detach_ep(void *data) 1501 { 1502 struct cxl_memdev *cxlmd = data; 1503 1504 for (int i = cxlmd->depth - 1; i >= 1; i--) { 1505 struct cxl_port *port, *parent_port; 1506 struct detach_ctx ctx = { 1507 .cxlmd = cxlmd, 1508 .depth = i, 1509 }; 1510 struct cxl_ep *ep; 1511 bool died = false; 1512 1513 struct device *dev __free(put_device) = 1514 bus_find_device(&cxl_bus_type, NULL, &ctx, port_has_memdev); 1515 if (!dev) 1516 continue; 1517 port = to_cxl_port(dev); 1518 1519 parent_port = to_cxl_port(port->dev.parent); 1520 device_lock(&parent_port->dev); 1521 device_lock(&port->dev); 1522 ep = cxl_ep_load(port, cxlmd); 1523 dev_dbg(&cxlmd->dev, "disconnect %s from %s\n", 1524 ep ? dev_name(ep->ep) : "", dev_name(&port->dev)); 1525 cxl_ep_remove(port, ep); 1526 if (ep && !port->dead && xa_empty(&port->endpoints) && 1527 !is_cxl_root(parent_port) && parent_port->dev.driver) { 1528 /* 1529 * This was the last ep attached to a dynamically 1530 * enumerated port. Block new cxl_add_ep() and garbage 1531 * collect the port. 1532 */ 1533 died = true; 1534 port->dead = true; 1535 del_dports(port); 1536 } 1537 device_unlock(&port->dev); 1538 1539 if (died) { 1540 dev_dbg(&cxlmd->dev, "delete %s\n", 1541 dev_name(&port->dev)); 1542 delete_switch_port(port); 1543 } 1544 device_unlock(&parent_port->dev); 1545 } 1546 } 1547 1548 static resource_size_t find_component_registers(struct device *dev) 1549 { 1550 struct cxl_register_map map; 1551 struct pci_dev *pdev; 1552 1553 /* 1554 * Theoretically, CXL component registers can be hosted on a 1555 * non-PCI device, in practice, only cxl_test hits this case. 1556 */ 1557 if (!dev_is_pci(dev)) 1558 return CXL_RESOURCE_NONE; 1559 1560 pdev = to_pci_dev(dev); 1561 1562 cxl_find_regblock(pdev, CXL_REGLOC_RBI_COMPONENT, &map); 1563 return map.resource; 1564 } 1565 1566 static int match_port_by_uport(struct device *dev, const void *data) 1567 { 1568 const struct device *uport_dev = data; 1569 struct cxl_port *port; 1570 1571 if (!is_cxl_port(dev)) 1572 return 0; 1573 1574 port = to_cxl_port(dev); 1575 /* Endpoint ports are hosted by memdevs */ 1576 if (is_cxl_memdev(port->uport_dev)) 1577 return uport_dev == port->uport_dev->parent; 1578 return uport_dev == port->uport_dev; 1579 } 1580 1581 /** 1582 * find_cxl_port_by_uport - Find a CXL port device companion 1583 * @uport_dev: Device that acts as a switch or endpoint in the CXL hierarchy 1584 * 1585 * In the case of endpoint ports recall that port->uport_dev points to a 'struct 1586 * cxl_memdev' device. So, the @uport_dev argument is the parent device of the 1587 * 'struct cxl_memdev' in that case. 1588 * 1589 * Function takes a device reference on the port device. Caller should do a 1590 * put_device() when done. 1591 */ 1592 static struct cxl_port *find_cxl_port_by_uport(struct device *uport_dev) 1593 { 1594 struct device *dev; 1595 1596 dev = bus_find_device(&cxl_bus_type, NULL, uport_dev, match_port_by_uport); 1597 if (dev) 1598 return to_cxl_port(dev); 1599 return NULL; 1600 } 1601 1602 static int update_decoder_targets(struct device *dev, void *data) 1603 { 1604 struct cxl_dport *dport = data; 1605 struct cxl_switch_decoder *cxlsd; 1606 struct cxl_decoder *cxld; 1607 int i; 1608 1609 if (!is_switch_decoder(dev)) 1610 return 0; 1611 1612 cxlsd = to_cxl_switch_decoder(dev); 1613 cxld = &cxlsd->cxld; 1614 guard(rwsem_write)(&cxl_rwsem.region); 1615 1616 for (i = 0; i < cxld->interleave_ways; i++) { 1617 if (cxld->target_map[i] == dport->port_id) { 1618 cxlsd->target[i] = dport; 1619 dev_dbg(dev, "dport%d found in target list, index %d\n", 1620 dport->port_id, i); 1621 return 0; 1622 } 1623 } 1624 1625 return 0; 1626 } 1627 1628 void cxl_port_update_decoder_targets(struct cxl_port *port, 1629 struct cxl_dport *dport) 1630 { 1631 device_for_each_child(&port->dev, dport, update_decoder_targets); 1632 } 1633 EXPORT_SYMBOL_NS_GPL(cxl_port_update_decoder_targets, "CXL"); 1634 1635 static bool dport_exists(struct cxl_port *port, struct device *dport_dev) 1636 { 1637 struct cxl_dport *dport = cxl_find_dport_by_dev(port, dport_dev); 1638 1639 if (dport) { 1640 dev_dbg(&port->dev, "dport%d:%s already exists\n", 1641 dport->port_id, dev_name(dport_dev)); 1642 return true; 1643 } 1644 1645 return false; 1646 } 1647 1648 static struct cxl_dport *probe_dport(struct cxl_port *port, 1649 struct device *dport_dev) 1650 { 1651 struct cxl_driver *drv; 1652 1653 device_lock_assert(&port->dev); 1654 if (!port->dev.driver) 1655 return ERR_PTR(-ENXIO); 1656 1657 if (dport_exists(port, dport_dev)) 1658 return ERR_PTR(-EBUSY); 1659 1660 drv = container_of(port->dev.driver, struct cxl_driver, drv); 1661 if (!drv->add_dport) 1662 return ERR_PTR(-ENXIO); 1663 1664 /* see cxl_port_add_dport() */ 1665 return drv->add_dport(port, dport_dev); 1666 } 1667 1668 static struct cxl_dport *devm_cxl_create_port(struct device *ep_dev, 1669 struct cxl_port *parent_port, 1670 struct cxl_dport *parent_dport, 1671 struct device *uport_dev, 1672 struct device *dport_dev) 1673 { 1674 resource_size_t component_reg_phys; 1675 1676 device_lock_assert(&parent_port->dev); 1677 if (!parent_port->dev.driver) { 1678 dev_warn(ep_dev, 1679 "port %s:%s:%s disabled, failed to enumerate CXL.mem\n", 1680 dev_name(&parent_port->dev), dev_name(uport_dev), 1681 dev_name(dport_dev)); 1682 } 1683 1684 struct cxl_port *port __free(put_cxl_port) = 1685 find_cxl_port_by_uport(uport_dev); 1686 if (!port) { 1687 component_reg_phys = find_component_registers(uport_dev); 1688 port = devm_cxl_add_port(&parent_port->dev, uport_dev, 1689 component_reg_phys, parent_dport); 1690 if (IS_ERR(port)) 1691 return ERR_CAST(port); 1692 1693 /* 1694 * retry to make sure a port is found. a port device 1695 * reference is taken. 1696 */ 1697 port = find_cxl_port_by_uport(uport_dev); 1698 if (!port) 1699 return ERR_PTR(-ENODEV); 1700 1701 dev_dbg(ep_dev, "created port %s:%s\n", 1702 dev_name(&port->dev), dev_name(port->uport_dev)); 1703 } else { 1704 /* 1705 * Port was created before right before this function is 1706 * called. Signal the caller to deal with it. 1707 */ 1708 return ERR_PTR(-EAGAIN); 1709 } 1710 1711 guard(device)(&port->dev); 1712 return probe_dport(port, dport_dev); 1713 } 1714 1715 static int add_port_attach_ep(struct cxl_memdev *cxlmd, 1716 struct device *uport_dev, 1717 struct device *dport_dev) 1718 { 1719 struct device *dparent = grandparent(dport_dev); 1720 struct cxl_dport *dport, *parent_dport; 1721 int rc; 1722 1723 if (is_cxl_host_bridge(dparent)) { 1724 /* 1725 * The iteration reached the topology root without finding the 1726 * CXL-root 'cxl_port' on a previous iteration, fail for now to 1727 * be re-probed after platform driver attaches. 1728 */ 1729 dev_dbg(&cxlmd->dev, "%s is a root dport\n", 1730 dev_name(dport_dev)); 1731 return -ENXIO; 1732 } 1733 1734 struct cxl_port *parent_port __free(put_cxl_port) = 1735 find_cxl_port_by_uport(dparent->parent); 1736 if (!parent_port) { 1737 /* iterate to create this parent_port */ 1738 return -EAGAIN; 1739 } 1740 1741 scoped_guard(device, &parent_port->dev) { 1742 parent_dport = cxl_find_dport_by_dev(parent_port, dparent); 1743 if (!parent_dport) { 1744 parent_dport = probe_dport(parent_port, dparent); 1745 if (IS_ERR(parent_dport)) 1746 return PTR_ERR(parent_dport); 1747 } 1748 1749 dport = devm_cxl_create_port(&cxlmd->dev, parent_port, 1750 parent_dport, uport_dev, 1751 dport_dev); 1752 if (IS_ERR(dport)) { 1753 /* Port already exists, restart iteration */ 1754 if (PTR_ERR(dport) == -EAGAIN) 1755 return 0; 1756 return PTR_ERR(dport); 1757 } 1758 } 1759 1760 rc = cxl_add_ep(dport, &cxlmd->dev); 1761 if (rc == -EBUSY) { 1762 /* 1763 * "can't" happen, but this error code means 1764 * something to the caller, so translate it. 1765 */ 1766 rc = -ENXIO; 1767 } 1768 1769 return rc; 1770 } 1771 1772 static struct cxl_dport *find_or_add_dport(struct cxl_port *port, 1773 struct device *dport_dev) 1774 { 1775 struct cxl_dport *dport; 1776 1777 /* 1778 * The port is already visible in CXL hierarchy, but it may still 1779 * be in the process of binding to the CXL port driver at this point. 1780 * 1781 * port creation and driver binding are protected by the port's host 1782 * lock, so acquire the host lock here to ensure the port has completed 1783 * driver binding before proceeding with dport addition. 1784 */ 1785 guard(device)(port_to_host(port)); 1786 guard(device)(&port->dev); 1787 dport = cxl_find_dport_by_dev(port, dport_dev); 1788 if (!dport) { 1789 dport = probe_dport(port, dport_dev); 1790 if (IS_ERR(dport)) 1791 return dport; 1792 1793 /* New dport added, restart iteration */ 1794 return ERR_PTR(-EAGAIN); 1795 } 1796 1797 return dport; 1798 } 1799 1800 int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd) 1801 { 1802 struct device *dev = &cxlmd->dev; 1803 struct device *iter; 1804 int rc; 1805 1806 /* 1807 * Skip intermediate port enumeration in the RCH case, there 1808 * are no ports in between a host bridge and an endpoint. 1809 */ 1810 if (cxlmd->cxlds->rcd) 1811 return 0; 1812 1813 rc = devm_add_action_or_reset(&cxlmd->dev, cxl_detach_ep, cxlmd); 1814 if (rc) 1815 return rc; 1816 1817 /* 1818 * Scan for and add all cxl_ports in this device's ancestry. 1819 * Repeat until no more ports are added. Abort if a port add 1820 * attempt fails. 1821 */ 1822 retry: 1823 for (iter = dev; iter; iter = grandparent(iter)) { 1824 struct device *dport_dev = grandparent(iter); 1825 struct device *uport_dev; 1826 struct cxl_dport *dport; 1827 1828 if (is_cxl_host_bridge(dport_dev)) 1829 return 0; 1830 1831 uport_dev = dport_dev->parent; 1832 if (!uport_dev) { 1833 dev_warn(dev, "at %s no parent for dport: %s\n", 1834 dev_name(iter), dev_name(dport_dev)); 1835 return -ENXIO; 1836 } 1837 1838 dev_dbg(dev, "scan: iter: %s dport_dev: %s parent: %s\n", 1839 dev_name(iter), dev_name(dport_dev), 1840 dev_name(uport_dev)); 1841 struct cxl_port *port __free(put_cxl_port) = 1842 find_cxl_port_by_uport(uport_dev); 1843 if (port) { 1844 dev_dbg(&cxlmd->dev, 1845 "found already registered port %s:%s\n", 1846 dev_name(&port->dev), 1847 dev_name(port->uport_dev)); 1848 1849 /* 1850 * RP port enumerated by cxl_acpi without dport will 1851 * have the dport added here. 1852 */ 1853 dport = find_or_add_dport(port, dport_dev); 1854 if (IS_ERR(dport)) { 1855 if (PTR_ERR(dport) == -EAGAIN) 1856 goto retry; 1857 return PTR_ERR(dport); 1858 } 1859 1860 rc = cxl_add_ep(dport, &cxlmd->dev); 1861 1862 /* 1863 * If the endpoint already exists in the port's list, 1864 * that's ok, it was added on a previous pass. 1865 * Otherwise, retry in add_port_attach_ep() after taking 1866 * the parent_port lock as the current port may be being 1867 * reaped. 1868 */ 1869 if (rc && rc != -EBUSY) 1870 return rc; 1871 1872 cxl_gpf_port_setup(dport); 1873 1874 /* Any more ports to add between this one and the root? */ 1875 if (!dev_is_cxl_root_child(&port->dev)) 1876 continue; 1877 1878 return 0; 1879 } 1880 1881 rc = add_port_attach_ep(cxlmd, uport_dev, dport_dev); 1882 /* port missing, try to add parent */ 1883 if (rc == -EAGAIN) 1884 continue; 1885 /* failed to add ep or port */ 1886 if (rc) 1887 return rc; 1888 /* port added, new descendants possible, start over */ 1889 goto retry; 1890 } 1891 1892 return 0; 1893 } 1894 EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_ports, "CXL"); 1895 1896 struct cxl_port *cxl_pci_find_port(struct pci_dev *pdev, 1897 struct cxl_dport **dport) 1898 { 1899 return find_cxl_port(pdev->dev.parent, dport); 1900 } 1901 EXPORT_SYMBOL_NS_GPL(cxl_pci_find_port, "CXL"); 1902 1903 struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd, 1904 struct cxl_dport **dport) 1905 { 1906 return find_cxl_port(grandparent(&cxlmd->dev), dport); 1907 } 1908 EXPORT_SYMBOL_NS_GPL(cxl_mem_find_port, "CXL"); 1909 1910 static int decoder_populate_targets(struct cxl_switch_decoder *cxlsd, 1911 struct cxl_port *port) 1912 { 1913 struct cxl_decoder *cxld = &cxlsd->cxld; 1914 int i; 1915 1916 device_lock_assert(&port->dev); 1917 1918 if (xa_empty(&port->dports)) 1919 return 0; 1920 1921 guard(rwsem_write)(&cxl_rwsem.region); 1922 for (i = 0; i < cxlsd->cxld.interleave_ways; i++) { 1923 struct cxl_dport *dport = find_dport(port, cxld->target_map[i]); 1924 1925 if (!dport) { 1926 /* dport may be activated later */ 1927 continue; 1928 } 1929 cxlsd->target[i] = dport; 1930 } 1931 1932 return 0; 1933 } 1934 1935 static struct lock_class_key cxl_decoder_key; 1936 1937 /** 1938 * cxl_decoder_init - Common decoder setup / initialization 1939 * @port: owning port of this decoder 1940 * @cxld: common decoder properties to initialize 1941 * 1942 * A port may contain one or more decoders. Each of those decoders 1943 * enable some address space for CXL.mem utilization. A decoder is 1944 * expected to be configured by the caller before registering via 1945 * cxl_decoder_add() 1946 */ 1947 static int cxl_decoder_init(struct cxl_port *port, struct cxl_decoder *cxld) 1948 { 1949 struct device *dev; 1950 int rc; 1951 1952 rc = ida_alloc(&port->decoder_ida, GFP_KERNEL); 1953 if (rc < 0) 1954 return rc; 1955 1956 /* need parent to stick around to release the id */ 1957 get_device(&port->dev); 1958 cxld->id = rc; 1959 1960 dev = &cxld->dev; 1961 device_initialize(dev); 1962 lockdep_set_class(&dev->mutex, &cxl_decoder_key); 1963 device_set_pm_not_required(dev); 1964 dev->parent = &port->dev; 1965 dev->bus = &cxl_bus_type; 1966 1967 /* Pre initialize an "empty" decoder */ 1968 cxld->interleave_ways = 1; 1969 cxld->interleave_granularity = PAGE_SIZE; 1970 cxld->target_type = CXL_DECODER_HOSTONLYMEM; 1971 cxld->hpa_range = (struct range) { 1972 .start = 0, 1973 .end = -1, 1974 }; 1975 1976 return 0; 1977 } 1978 1979 static int cxl_switch_decoder_init(struct cxl_port *port, 1980 struct cxl_switch_decoder *cxlsd, 1981 int nr_targets) 1982 { 1983 if (nr_targets > CXL_DECODER_MAX_INTERLEAVE) 1984 return -EINVAL; 1985 1986 cxlsd->nr_targets = nr_targets; 1987 return cxl_decoder_init(port, &cxlsd->cxld); 1988 } 1989 1990 /** 1991 * cxl_root_decoder_alloc - Allocate a root level decoder 1992 * @port: owning CXL root of this decoder 1993 * @nr_targets: static number of downstream targets 1994 * 1995 * Return: A new cxl decoder to be registered by cxl_decoder_add(). A 1996 * 'CXL root' decoder is one that decodes from a top-level / static platform 1997 * firmware description of CXL resources into a CXL standard decode 1998 * topology. 1999 */ 2000 struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port, 2001 unsigned int nr_targets) 2002 { 2003 struct cxl_root_decoder *cxlrd; 2004 struct cxl_switch_decoder *cxlsd; 2005 struct cxl_decoder *cxld; 2006 int rc; 2007 2008 if (!is_cxl_root(port)) 2009 return ERR_PTR(-EINVAL); 2010 2011 cxlrd = kzalloc_flex(*cxlrd, cxlsd.target, nr_targets); 2012 if (!cxlrd) 2013 return ERR_PTR(-ENOMEM); 2014 2015 cxlsd = &cxlrd->cxlsd; 2016 rc = cxl_switch_decoder_init(port, cxlsd, nr_targets); 2017 if (rc) { 2018 kfree(cxlrd); 2019 return ERR_PTR(rc); 2020 } 2021 2022 mutex_init(&cxlrd->regions_lock); 2023 xa_init(&cxlrd->regions); 2024 2025 cxld = &cxlsd->cxld; 2026 cxld->dev.type = &cxl_decoder_root_type; 2027 /* 2028 * cxl_root_decoder_release() special cases negative ids to 2029 * detect memregion_alloc() failures. 2030 */ 2031 atomic_set(&cxlrd->region_id, -1); 2032 rc = memregion_alloc(GFP_KERNEL); 2033 if (rc < 0) { 2034 put_device(&cxld->dev); 2035 return ERR_PTR(rc); 2036 } 2037 2038 atomic_set(&cxlrd->region_id, rc); 2039 cxlrd->qos_class = CXL_QOS_CLASS_INVALID; 2040 return cxlrd; 2041 } 2042 EXPORT_SYMBOL_NS_GPL(cxl_root_decoder_alloc, "CXL"); 2043 2044 /** 2045 * cxl_switch_decoder_alloc - Allocate a switch level decoder 2046 * @port: owning CXL switch port of this decoder 2047 * @nr_targets: max number of dynamically addressable downstream targets 2048 * 2049 * Return: A new cxl decoder to be registered by cxl_decoder_add(). A 2050 * 'switch' decoder is any decoder that can be enumerated by PCIe 2051 * topology and the HDM Decoder Capability. This includes the decoders 2052 * that sit between Switch Upstream Ports / Switch Downstream Ports and 2053 * Host Bridges / Root Ports. 2054 */ 2055 struct cxl_switch_decoder *cxl_switch_decoder_alloc(struct cxl_port *port, 2056 unsigned int nr_targets) 2057 { 2058 struct cxl_switch_decoder *cxlsd; 2059 struct cxl_decoder *cxld; 2060 int rc; 2061 2062 if (is_cxl_root(port) || is_cxl_endpoint(port)) 2063 return ERR_PTR(-EINVAL); 2064 2065 cxlsd = kzalloc_flex(*cxlsd, target, nr_targets); 2066 if (!cxlsd) 2067 return ERR_PTR(-ENOMEM); 2068 2069 rc = cxl_switch_decoder_init(port, cxlsd, nr_targets); 2070 if (rc) { 2071 kfree(cxlsd); 2072 return ERR_PTR(rc); 2073 } 2074 2075 cxld = &cxlsd->cxld; 2076 cxld->dev.type = &cxl_decoder_switch_type; 2077 return cxlsd; 2078 } 2079 EXPORT_SYMBOL_NS_GPL(cxl_switch_decoder_alloc, "CXL"); 2080 2081 /** 2082 * cxl_endpoint_decoder_alloc - Allocate an endpoint decoder 2083 * @port: owning port of this decoder 2084 * 2085 * Return: A new cxl decoder to be registered by cxl_decoder_add() 2086 */ 2087 struct cxl_endpoint_decoder *cxl_endpoint_decoder_alloc(struct cxl_port *port) 2088 { 2089 struct cxl_endpoint_decoder *cxled; 2090 struct cxl_decoder *cxld; 2091 int rc; 2092 2093 if (!is_cxl_endpoint(port)) 2094 return ERR_PTR(-EINVAL); 2095 2096 cxled = kzalloc_obj(*cxled); 2097 if (!cxled) 2098 return ERR_PTR(-ENOMEM); 2099 2100 cxled->pos = -1; 2101 cxled->part = -1; 2102 cxld = &cxled->cxld; 2103 rc = cxl_decoder_init(port, cxld); 2104 if (rc) { 2105 kfree(cxled); 2106 return ERR_PTR(rc); 2107 } 2108 2109 cxld->dev.type = &cxl_decoder_endpoint_type; 2110 return cxled; 2111 } 2112 EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_alloc, "CXL"); 2113 2114 /** 2115 * cxl_decoder_add_locked - Add a decoder with targets 2116 * @cxld: The cxl decoder allocated by cxl_<type>_decoder_alloc() 2117 * 2118 * Certain types of decoders may not have any targets. The main example of this 2119 * is an endpoint device. A more awkward example is a hostbridge whose root 2120 * ports get hot added (technically possible, though unlikely). 2121 * 2122 * This is the locked variant of cxl_decoder_add(). 2123 * 2124 * Context: Process context. Expects the device lock of the port that owns the 2125 * @cxld to be held. 2126 * 2127 * Return: Negative error code if the decoder wasn't properly configured; else 2128 * returns 0. 2129 */ 2130 int cxl_decoder_add_locked(struct cxl_decoder *cxld) 2131 { 2132 struct cxl_port *port; 2133 struct device *dev; 2134 int rc; 2135 2136 if (WARN_ON_ONCE(!cxld)) 2137 return -EINVAL; 2138 2139 if (WARN_ON_ONCE(IS_ERR(cxld))) 2140 return PTR_ERR(cxld); 2141 2142 if (cxld->interleave_ways < 1) 2143 return -EINVAL; 2144 2145 dev = &cxld->dev; 2146 2147 port = to_cxl_port(cxld->dev.parent); 2148 if (!is_endpoint_decoder(dev)) { 2149 struct cxl_switch_decoder *cxlsd = to_cxl_switch_decoder(dev); 2150 2151 rc = decoder_populate_targets(cxlsd, port); 2152 if (rc && (cxld->flags & CXL_DECODER_F_ENABLE)) { 2153 dev_err(&port->dev, 2154 "Failed to populate active decoder targets\n"); 2155 return rc; 2156 } 2157 } 2158 2159 rc = dev_set_name(dev, "decoder%d.%d", port->id, cxld->id); 2160 if (rc) 2161 return rc; 2162 2163 return device_add(dev); 2164 } 2165 EXPORT_SYMBOL_NS_GPL(cxl_decoder_add_locked, "CXL"); 2166 2167 /** 2168 * cxl_decoder_add - Add a decoder with targets 2169 * @cxld: The cxl decoder allocated by cxl_<type>_decoder_alloc() 2170 * 2171 * This is the unlocked variant of cxl_decoder_add_locked(). 2172 * See cxl_decoder_add_locked(). 2173 * 2174 * Context: Process context. Takes and releases the device lock of the port that 2175 * owns the @cxld. 2176 */ 2177 int cxl_decoder_add(struct cxl_decoder *cxld) 2178 { 2179 struct cxl_port *port; 2180 2181 if (WARN_ON_ONCE(!cxld)) 2182 return -EINVAL; 2183 2184 if (WARN_ON_ONCE(IS_ERR(cxld))) 2185 return PTR_ERR(cxld); 2186 2187 port = to_cxl_port(cxld->dev.parent); 2188 2189 guard(device)(&port->dev); 2190 return cxl_decoder_add_locked(cxld); 2191 } 2192 EXPORT_SYMBOL_NS_GPL(cxl_decoder_add, "CXL"); 2193 2194 static void cxld_unregister(void *dev) 2195 { 2196 if (is_endpoint_decoder(dev)) 2197 cxl_decoder_detach(NULL, to_cxl_endpoint_decoder(dev), -1, 2198 DETACH_INVALIDATE); 2199 if (is_root_decoder(dev)) 2200 kill_regions(to_cxl_root_decoder(dev)); 2201 2202 device_unregister(dev); 2203 } 2204 2205 int cxl_decoder_autoremove(struct device *host, struct cxl_decoder *cxld) 2206 { 2207 return devm_add_action_or_reset(host, cxld_unregister, &cxld->dev); 2208 } 2209 EXPORT_SYMBOL_NS_GPL(cxl_decoder_autoremove, "CXL"); 2210 2211 /** 2212 * __cxl_driver_register - register a driver for the cxl bus 2213 * @cxl_drv: cxl driver structure to attach 2214 * @owner: owning module/driver 2215 * @modname: KBUILD_MODNAME for parent driver 2216 */ 2217 int __cxl_driver_register(struct cxl_driver *cxl_drv, struct module *owner, 2218 const char *modname) 2219 { 2220 if (!cxl_drv->probe) { 2221 pr_debug("%s ->probe() must be specified\n", modname); 2222 return -EINVAL; 2223 } 2224 2225 if (!cxl_drv->name) { 2226 pr_debug("%s ->name must be specified\n", modname); 2227 return -EINVAL; 2228 } 2229 2230 if (!cxl_drv->id) { 2231 pr_debug("%s ->id must be specified\n", modname); 2232 return -EINVAL; 2233 } 2234 2235 cxl_drv->drv.bus = &cxl_bus_type; 2236 cxl_drv->drv.owner = owner; 2237 cxl_drv->drv.mod_name = modname; 2238 cxl_drv->drv.name = cxl_drv->name; 2239 2240 return driver_register(&cxl_drv->drv); 2241 } 2242 EXPORT_SYMBOL_NS_GPL(__cxl_driver_register, "CXL"); 2243 2244 void cxl_driver_unregister(struct cxl_driver *cxl_drv) 2245 { 2246 driver_unregister(&cxl_drv->drv); 2247 } 2248 EXPORT_SYMBOL_NS_GPL(cxl_driver_unregister, "CXL"); 2249 2250 static int cxl_bus_uevent(const struct device *dev, struct kobj_uevent_env *env) 2251 { 2252 return add_uevent_var(env, "MODALIAS=" CXL_MODALIAS_FMT, 2253 cxl_device_id(dev)); 2254 } 2255 2256 static int cxl_bus_match(struct device *dev, const struct device_driver *drv) 2257 { 2258 return cxl_device_id(dev) == to_cxl_drv(drv)->id; 2259 } 2260 2261 static int cxl_bus_probe(struct device *dev) 2262 { 2263 int rc; 2264 2265 rc = to_cxl_drv(dev->driver)->probe(dev); 2266 dev_dbg(dev, "probe: %d\n", rc); 2267 return rc; 2268 } 2269 2270 static void cxl_bus_remove(struct device *dev) 2271 { 2272 struct cxl_driver *cxl_drv = to_cxl_drv(dev->driver); 2273 2274 if (cxl_drv->remove) 2275 cxl_drv->remove(dev); 2276 } 2277 2278 static struct workqueue_struct *cxl_bus_wq; 2279 2280 static int cxl_rescan_attach(struct device *dev, void *data) 2281 { 2282 int rc = device_attach(dev); 2283 2284 dev_vdbg(dev, "rescan: %s\n", rc ? "attach" : "detached"); 2285 2286 return 0; 2287 } 2288 2289 static void cxl_bus_rescan_queue(struct work_struct *w) 2290 { 2291 bus_for_each_dev(&cxl_bus_type, NULL, NULL, cxl_rescan_attach); 2292 } 2293 2294 void cxl_bus_rescan(void) 2295 { 2296 static DECLARE_WORK(rescan_work, cxl_bus_rescan_queue); 2297 2298 queue_work(cxl_bus_wq, &rescan_work); 2299 } 2300 EXPORT_SYMBOL_NS_GPL(cxl_bus_rescan, "CXL"); 2301 2302 void cxl_bus_drain(void) 2303 { 2304 drain_workqueue(cxl_bus_wq); 2305 } 2306 EXPORT_SYMBOL_NS_GPL(cxl_bus_drain, "CXL"); 2307 2308 bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd) 2309 { 2310 return queue_work(cxl_bus_wq, &cxlmd->detach_work); 2311 } 2312 EXPORT_SYMBOL_NS_GPL(schedule_cxl_memdev_detach, "CXL"); 2313 2314 static void add_latency(struct access_coordinate *c, long latency) 2315 { 2316 for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) { 2317 c[i].write_latency += latency; 2318 c[i].read_latency += latency; 2319 } 2320 } 2321 2322 static bool coordinates_valid(struct access_coordinate *c) 2323 { 2324 for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) { 2325 if (c[i].read_bandwidth && c[i].write_bandwidth && 2326 c[i].read_latency && c[i].write_latency) 2327 continue; 2328 return false; 2329 } 2330 2331 return true; 2332 } 2333 2334 static void set_min_bandwidth(struct access_coordinate *c, unsigned int bw) 2335 { 2336 for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) { 2337 c[i].write_bandwidth = min(c[i].write_bandwidth, bw); 2338 c[i].read_bandwidth = min(c[i].read_bandwidth, bw); 2339 } 2340 } 2341 2342 static void set_access_coordinates(struct access_coordinate *out, 2343 struct access_coordinate *in) 2344 { 2345 for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) 2346 out[i] = in[i]; 2347 } 2348 2349 static bool parent_port_is_cxl_root(struct cxl_port *port) 2350 { 2351 return is_cxl_root(to_cxl_port(port->dev.parent)); 2352 } 2353 2354 /** 2355 * cxl_endpoint_get_perf_coordinates - Retrieve performance numbers stored in dports 2356 * of CXL path 2357 * @port: endpoint cxl_port 2358 * @coord: output performance data 2359 * 2360 * Return: errno on failure, 0 on success. 2361 */ 2362 int cxl_endpoint_get_perf_coordinates(struct cxl_port *port, 2363 struct access_coordinate *coord) 2364 { 2365 struct cxl_memdev *cxlmd = to_cxl_memdev(port->uport_dev); 2366 struct access_coordinate c[] = { 2367 { 2368 .read_bandwidth = UINT_MAX, 2369 .write_bandwidth = UINT_MAX, 2370 }, 2371 { 2372 .read_bandwidth = UINT_MAX, 2373 .write_bandwidth = UINT_MAX, 2374 }, 2375 }; 2376 struct cxl_port *iter = port; 2377 struct cxl_dport *dport; 2378 struct pci_dev *pdev; 2379 struct device *dev; 2380 unsigned int bw; 2381 bool is_cxl_root; 2382 2383 if (!is_cxl_endpoint(port)) 2384 return -EINVAL; 2385 2386 /* 2387 * Skip calculation for RCD. Expectation is HMAT already covers RCD case 2388 * since RCH does not support hotplug. 2389 */ 2390 if (cxlmd->cxlds->rcd) 2391 return 0; 2392 2393 /* 2394 * Exit the loop when the parent port of the current iter port is cxl 2395 * root. The iterative loop starts at the endpoint and gathers the 2396 * latency of the CXL link from the current device/port to the connected 2397 * downstream port each iteration. 2398 */ 2399 do { 2400 dport = iter->parent_dport; 2401 iter = to_cxl_port(iter->dev.parent); 2402 is_cxl_root = parent_port_is_cxl_root(iter); 2403 2404 /* 2405 * There's no valid access_coordinate for a root port since RPs do not 2406 * have CDAT and therefore needs to be skipped. 2407 */ 2408 if (!is_cxl_root) { 2409 if (!coordinates_valid(dport->coord)) 2410 return -EINVAL; 2411 cxl_coordinates_combine(c, c, dport->coord); 2412 } 2413 add_latency(c, dport->link_latency); 2414 } while (!is_cxl_root); 2415 2416 dport = iter->parent_dport; 2417 /* Retrieve HB coords */ 2418 if (!coordinates_valid(dport->coord)) 2419 return -EINVAL; 2420 cxl_coordinates_combine(c, c, dport->coord); 2421 2422 dev = port->uport_dev->parent; 2423 if (!dev_is_pci(dev)) 2424 return -ENODEV; 2425 2426 /* Get the calculated PCI paths bandwidth */ 2427 pdev = to_pci_dev(dev); 2428 bw = pcie_bandwidth_available(pdev, NULL, NULL, NULL); 2429 if (bw == 0) 2430 return -ENXIO; 2431 bw /= BITS_PER_BYTE; 2432 2433 set_min_bandwidth(c, bw); 2434 set_access_coordinates(coord, c); 2435 2436 return 0; 2437 } 2438 EXPORT_SYMBOL_NS_GPL(cxl_endpoint_get_perf_coordinates, "CXL"); 2439 2440 int cxl_port_get_switch_dport_bandwidth(struct cxl_port *port, 2441 struct access_coordinate *c) 2442 { 2443 struct cxl_dport *dport = port->parent_dport; 2444 2445 /* Check this port is connected to a switch DSP and not an RP */ 2446 if (parent_port_is_cxl_root(to_cxl_port(port->dev.parent))) 2447 return -ENODEV; 2448 2449 if (!coordinates_valid(dport->coord)) 2450 return -EINVAL; 2451 2452 for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) { 2453 c[i].read_bandwidth = dport->coord[i].read_bandwidth; 2454 c[i].write_bandwidth = dport->coord[i].write_bandwidth; 2455 } 2456 2457 return 0; 2458 } 2459 2460 /* for user tooling to ensure port disable work has completed */ 2461 static ssize_t flush_store(const struct bus_type *bus, const char *buf, size_t count) 2462 { 2463 if (sysfs_streq(buf, "1")) { 2464 flush_workqueue(cxl_bus_wq); 2465 return count; 2466 } 2467 2468 return -EINVAL; 2469 } 2470 2471 static BUS_ATTR_WO(flush); 2472 2473 static struct attribute *cxl_bus_attributes[] = { 2474 &bus_attr_flush.attr, 2475 NULL, 2476 }; 2477 2478 static struct attribute_group cxl_bus_attribute_group = { 2479 .attrs = cxl_bus_attributes, 2480 }; 2481 2482 static const struct attribute_group *cxl_bus_attribute_groups[] = { 2483 &cxl_bus_attribute_group, 2484 NULL, 2485 }; 2486 2487 const struct bus_type cxl_bus_type = { 2488 .name = "cxl", 2489 .uevent = cxl_bus_uevent, 2490 .match = cxl_bus_match, 2491 .probe = cxl_bus_probe, 2492 .remove = cxl_bus_remove, 2493 .bus_groups = cxl_bus_attribute_groups, 2494 }; 2495 EXPORT_SYMBOL_NS_GPL(cxl_bus_type, "CXL"); 2496 2497 static struct dentry *cxl_debugfs; 2498 2499 struct dentry *cxl_debugfs_create_dir(const char *dir) 2500 { 2501 return debugfs_create_dir(dir, cxl_debugfs); 2502 } 2503 EXPORT_SYMBOL_NS_GPL(cxl_debugfs_create_dir, "CXL"); 2504 2505 static __init int cxl_core_init(void) 2506 { 2507 int rc; 2508 2509 cxl_debugfs = debugfs_create_dir("cxl", NULL); 2510 2511 if (einj_cxl_is_initialized()) 2512 debugfs_create_file("einj_types", 0400, cxl_debugfs, NULL, 2513 &einj_cxl_available_error_type_fops); 2514 2515 cxl_mbox_init(); 2516 2517 rc = cxl_memdev_init(); 2518 if (rc) 2519 return rc; 2520 2521 cxl_bus_wq = alloc_ordered_workqueue("cxl_port", 0); 2522 if (!cxl_bus_wq) { 2523 rc = -ENOMEM; 2524 goto err_wq; 2525 } 2526 2527 rc = bus_register(&cxl_bus_type); 2528 if (rc) 2529 goto err_bus; 2530 2531 rc = cxl_region_init(); 2532 if (rc) 2533 goto err_region; 2534 2535 rc = cxl_ras_init(); 2536 if (rc) 2537 goto err_ras; 2538 2539 return 0; 2540 2541 err_ras: 2542 cxl_region_exit(); 2543 err_region: 2544 bus_unregister(&cxl_bus_type); 2545 err_bus: 2546 destroy_workqueue(cxl_bus_wq); 2547 err_wq: 2548 cxl_memdev_exit(); 2549 return rc; 2550 } 2551 2552 static void cxl_core_exit(void) 2553 { 2554 cxl_ras_exit(); 2555 cxl_region_exit(); 2556 bus_unregister(&cxl_bus_type); 2557 destroy_workqueue(cxl_bus_wq); 2558 cxl_memdev_exit(); 2559 debugfs_remove_recursive(cxl_debugfs); 2560 } 2561 2562 subsys_initcall(cxl_core_init); 2563 module_exit(cxl_core_exit); 2564 MODULE_DESCRIPTION("CXL: Core Compute Express Link support"); 2565 MODULE_LICENSE("GPL v2"); 2566 MODULE_IMPORT_NS("CXL"); 2567