1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Copyright(c) 2022 Intel Corporation. All rights reserved. */ 3 #include <linux/memregion.h> 4 #include <linux/genalloc.h> 5 #include <linux/debugfs.h> 6 #include <linux/device.h> 7 #include <linux/module.h> 8 #include <linux/memory.h> 9 #include <linux/slab.h> 10 #include <linux/uuid.h> 11 #include <linux/sort.h> 12 #include <linux/idr.h> 13 #include <linux/memory-tiers.h> 14 #include <linux/string_choices.h> 15 #include <cxlmem.h> 16 #include <cxl.h> 17 #include "core.h" 18 #include "mce.h" 19 20 /** 21 * DOC: cxl core region 22 * 23 * CXL Regions represent mapped memory capacity in system physical address 24 * space. Whereas the CXL Root Decoders identify the bounds of potential CXL 25 * Memory ranges, Regions represent the active mapped capacity by the HDM 26 * Decoder Capability structures throughout the Host Bridges, Switches, and 27 * Endpoints in the topology. 28 * 29 * Region configuration has ordering constraints. UUID may be set at any time 30 * but is only visible for persistent regions. 31 * 1. Interleave granularity 32 * 2. Interleave size 33 * 3. Decoder targets 34 */ 35 36 /* 37 * nodemask that sets per node when the access_coordinates for the node has 38 * been updated by the CXL memory hotplug notifier. 39 */ 40 static nodemask_t nodemask_region_seen = NODE_MASK_NONE; 41 42 static struct cxl_region *to_cxl_region(struct device *dev); 43 44 #define __ACCESS_ATTR_RO(_level, _name) { \ 45 .attr = { .name = __stringify(_name), .mode = 0444 }, \ 46 .show = _name##_access##_level##_show, \ 47 } 48 49 #define ACCESS_DEVICE_ATTR_RO(level, name) \ 50 struct device_attribute dev_attr_access##level##_##name = __ACCESS_ATTR_RO(level, name) 51 52 #define ACCESS_ATTR_RO(level, attrib) \ 53 static ssize_t attrib##_access##level##_show(struct device *dev, \ 54 struct device_attribute *attr, \ 55 char *buf) \ 56 { \ 57 struct cxl_region *cxlr = to_cxl_region(dev); \ 58 \ 59 if (cxlr->coord[level].attrib == 0) \ 60 return -ENOENT; \ 61 \ 62 return sysfs_emit(buf, "%u\n", cxlr->coord[level].attrib); \ 63 } \ 64 static ACCESS_DEVICE_ATTR_RO(level, attrib) 65 66 ACCESS_ATTR_RO(0, read_bandwidth); 67 ACCESS_ATTR_RO(0, read_latency); 68 ACCESS_ATTR_RO(0, write_bandwidth); 69 ACCESS_ATTR_RO(0, write_latency); 70 71 #define ACCESS_ATTR_DECLARE(level, attrib) \ 72 (&dev_attr_access##level##_##attrib.attr) 73 74 static struct attribute *access0_coordinate_attrs[] = { 75 ACCESS_ATTR_DECLARE(0, read_bandwidth), 76 ACCESS_ATTR_DECLARE(0, write_bandwidth), 77 ACCESS_ATTR_DECLARE(0, read_latency), 78 ACCESS_ATTR_DECLARE(0, write_latency), 79 NULL 80 }; 81 82 ACCESS_ATTR_RO(1, read_bandwidth); 83 ACCESS_ATTR_RO(1, read_latency); 84 ACCESS_ATTR_RO(1, write_bandwidth); 85 ACCESS_ATTR_RO(1, write_latency); 86 87 static struct attribute *access1_coordinate_attrs[] = { 88 ACCESS_ATTR_DECLARE(1, read_bandwidth), 89 ACCESS_ATTR_DECLARE(1, write_bandwidth), 90 ACCESS_ATTR_DECLARE(1, read_latency), 91 ACCESS_ATTR_DECLARE(1, write_latency), 92 NULL 93 }; 94 95 #define ACCESS_VISIBLE(level) \ 96 static umode_t cxl_region_access##level##_coordinate_visible( \ 97 struct kobject *kobj, struct attribute *a, int n) \ 98 { \ 99 struct device *dev = kobj_to_dev(kobj); \ 100 struct cxl_region *cxlr = to_cxl_region(dev); \ 101 \ 102 if (a == &dev_attr_access##level##_read_latency.attr && \ 103 cxlr->coord[level].read_latency == 0) \ 104 return 0; \ 105 \ 106 if (a == &dev_attr_access##level##_write_latency.attr && \ 107 cxlr->coord[level].write_latency == 0) \ 108 return 0; \ 109 \ 110 if (a == &dev_attr_access##level##_read_bandwidth.attr && \ 111 cxlr->coord[level].read_bandwidth == 0) \ 112 return 0; \ 113 \ 114 if (a == &dev_attr_access##level##_write_bandwidth.attr && \ 115 cxlr->coord[level].write_bandwidth == 0) \ 116 return 0; \ 117 \ 118 return a->mode; \ 119 } 120 121 ACCESS_VISIBLE(0); 122 ACCESS_VISIBLE(1); 123 124 static const struct attribute_group cxl_region_access0_coordinate_group = { 125 .name = "access0", 126 .attrs = access0_coordinate_attrs, 127 .is_visible = cxl_region_access0_coordinate_visible, 128 }; 129 130 static const struct attribute_group *get_cxl_region_access0_group(void) 131 { 132 return &cxl_region_access0_coordinate_group; 133 } 134 135 static const struct attribute_group cxl_region_access1_coordinate_group = { 136 .name = "access1", 137 .attrs = access1_coordinate_attrs, 138 .is_visible = cxl_region_access1_coordinate_visible, 139 }; 140 141 static const struct attribute_group *get_cxl_region_access1_group(void) 142 { 143 return &cxl_region_access1_coordinate_group; 144 } 145 146 static ssize_t uuid_show(struct device *dev, struct device_attribute *attr, 147 char *buf) 148 { 149 struct cxl_region *cxlr = to_cxl_region(dev); 150 struct cxl_region_params *p = &cxlr->params; 151 ssize_t rc; 152 153 ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); 154 if ((rc = ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) 155 return rc; 156 if (cxlr->mode != CXL_PARTMODE_PMEM) 157 return sysfs_emit(buf, "\n"); 158 return sysfs_emit(buf, "%pUb\n", &p->uuid); 159 } 160 161 static int is_dup(struct device *match, void *data) 162 { 163 struct cxl_region_params *p; 164 struct cxl_region *cxlr; 165 uuid_t *uuid = data; 166 167 if (!is_cxl_region(match)) 168 return 0; 169 170 lockdep_assert_held(&cxl_rwsem.region); 171 cxlr = to_cxl_region(match); 172 p = &cxlr->params; 173 174 if (uuid_equal(&p->uuid, uuid)) { 175 dev_dbg(match, "already has uuid: %pUb\n", uuid); 176 return -EBUSY; 177 } 178 179 return 0; 180 } 181 182 static ssize_t uuid_store(struct device *dev, struct device_attribute *attr, 183 const char *buf, size_t len) 184 { 185 struct cxl_region *cxlr = to_cxl_region(dev); 186 struct cxl_region_params *p = &cxlr->params; 187 uuid_t temp; 188 ssize_t rc; 189 190 if (len != UUID_STRING_LEN + 1) 191 return -EINVAL; 192 193 rc = uuid_parse(buf, &temp); 194 if (rc) 195 return rc; 196 197 if (uuid_is_null(&temp)) 198 return -EINVAL; 199 200 ACQUIRE(rwsem_write_kill, region_rwsem)(&cxl_rwsem.region); 201 if ((rc = ACQUIRE_ERR(rwsem_write_kill, ®ion_rwsem))) 202 return rc; 203 204 if (uuid_equal(&p->uuid, &temp)) 205 return len; 206 207 if (p->state >= CXL_CONFIG_ACTIVE) 208 return -EBUSY; 209 210 rc = bus_for_each_dev(&cxl_bus_type, NULL, &temp, is_dup); 211 if (rc < 0) 212 return rc; 213 214 uuid_copy(&p->uuid, &temp); 215 216 return len; 217 } 218 static DEVICE_ATTR_RW(uuid); 219 220 static struct cxl_region_ref *cxl_rr_load(struct cxl_port *port, 221 struct cxl_region *cxlr) 222 { 223 return xa_load(&port->regions, (unsigned long)cxlr); 224 } 225 226 static int cxl_region_invalidate_memregion(struct cxl_region *cxlr) 227 { 228 if (!cpu_cache_has_invalidate_memregion()) { 229 if (IS_ENABLED(CONFIG_CXL_REGION_INVALIDATION_TEST)) { 230 dev_info_once( 231 &cxlr->dev, 232 "Bypassing cpu_cache_invalidate_memregion() for testing!\n"); 233 return 0; 234 } 235 dev_WARN(&cxlr->dev, 236 "Failed to synchronize CPU cache state\n"); 237 return -ENXIO; 238 } 239 240 if (!cxlr->params.res) 241 return -ENXIO; 242 cpu_cache_invalidate_memregion(cxlr->params.res->start, 243 resource_size(cxlr->params.res)); 244 return 0; 245 } 246 247 static void cxl_region_decode_reset(struct cxl_region *cxlr, int count) 248 { 249 struct cxl_region_params *p = &cxlr->params; 250 int i; 251 252 if (test_bit(CXL_REGION_F_LOCK, &cxlr->flags)) 253 return; 254 255 /* 256 * Before region teardown attempt to flush, evict any data cached for 257 * this region, or scream loudly about missing arch / platform support 258 * for CXL teardown. 259 */ 260 cxl_region_invalidate_memregion(cxlr); 261 262 for (i = count - 1; i >= 0; i--) { 263 struct cxl_endpoint_decoder *cxled = p->targets[i]; 264 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 265 struct cxl_port *iter = cxled_to_port(cxled); 266 struct cxl_dev_state *cxlds = cxlmd->cxlds; 267 struct cxl_ep *ep; 268 269 if (cxlds->rcd) 270 goto endpoint_reset; 271 272 while (!is_cxl_root(to_cxl_port(iter->dev.parent))) 273 iter = to_cxl_port(iter->dev.parent); 274 275 for (ep = cxl_ep_load(iter, cxlmd); iter; 276 iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) { 277 struct cxl_region_ref *cxl_rr; 278 struct cxl_decoder *cxld; 279 280 cxl_rr = cxl_rr_load(iter, cxlr); 281 cxld = cxl_rr->decoder; 282 if (cxld->reset) 283 cxld->reset(cxld); 284 set_bit(CXL_REGION_F_NEEDS_RESET, &cxlr->flags); 285 } 286 287 endpoint_reset: 288 cxled->cxld.reset(&cxled->cxld); 289 set_bit(CXL_REGION_F_NEEDS_RESET, &cxlr->flags); 290 } 291 292 /* all decoders associated with this region have been torn down */ 293 clear_bit(CXL_REGION_F_NEEDS_RESET, &cxlr->flags); 294 } 295 296 static int commit_decoder(struct cxl_decoder *cxld) 297 { 298 struct cxl_switch_decoder *cxlsd = NULL; 299 300 if (cxld->commit) 301 return cxld->commit(cxld); 302 303 if (is_switch_decoder(&cxld->dev)) 304 cxlsd = to_cxl_switch_decoder(&cxld->dev); 305 306 if (dev_WARN_ONCE(&cxld->dev, !cxlsd || cxlsd->nr_targets > 1, 307 "->commit() is required\n")) 308 return -ENXIO; 309 return 0; 310 } 311 312 static int cxl_region_decode_commit(struct cxl_region *cxlr) 313 { 314 struct cxl_region_params *p = &cxlr->params; 315 int i, rc = 0; 316 317 for (i = 0; i < p->nr_targets; i++) { 318 struct cxl_endpoint_decoder *cxled = p->targets[i]; 319 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 320 struct cxl_region_ref *cxl_rr; 321 struct cxl_decoder *cxld; 322 struct cxl_port *iter; 323 struct cxl_ep *ep; 324 325 /* commit bottom up */ 326 for (iter = cxled_to_port(cxled); !is_cxl_root(iter); 327 iter = to_cxl_port(iter->dev.parent)) { 328 cxl_rr = cxl_rr_load(iter, cxlr); 329 cxld = cxl_rr->decoder; 330 rc = commit_decoder(cxld); 331 if (rc) 332 break; 333 } 334 335 if (rc) { 336 /* programming @iter failed, teardown */ 337 for (ep = cxl_ep_load(iter, cxlmd); ep && iter; 338 iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) { 339 cxl_rr = cxl_rr_load(iter, cxlr); 340 cxld = cxl_rr->decoder; 341 if (cxld->reset) 342 cxld->reset(cxld); 343 } 344 345 cxled->cxld.reset(&cxled->cxld); 346 goto err; 347 } 348 } 349 350 return 0; 351 352 err: 353 /* undo the targets that were successfully committed */ 354 cxl_region_decode_reset(cxlr, i); 355 return rc; 356 } 357 358 static int queue_reset(struct cxl_region *cxlr) 359 { 360 struct cxl_region_params *p = &cxlr->params; 361 int rc; 362 363 ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); 364 if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem))) 365 return rc; 366 367 /* Already in the requested state? */ 368 if (p->state < CXL_CONFIG_COMMIT) 369 return 0; 370 371 p->state = CXL_CONFIG_RESET_PENDING; 372 373 return 0; 374 } 375 376 static int __commit(struct cxl_region *cxlr) 377 { 378 struct cxl_region_params *p = &cxlr->params; 379 int rc; 380 381 ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); 382 if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem))) 383 return rc; 384 385 /* Already in the requested state? */ 386 if (p->state >= CXL_CONFIG_COMMIT) 387 return 0; 388 389 /* Not ready to commit? */ 390 if (p->state < CXL_CONFIG_ACTIVE) 391 return -ENXIO; 392 393 /* 394 * Invalidate caches before region setup to drop any speculative 395 * consumption of this address space 396 */ 397 rc = cxl_region_invalidate_memregion(cxlr); 398 if (rc) 399 return rc; 400 401 rc = cxl_region_decode_commit(cxlr); 402 if (rc) 403 return rc; 404 405 p->state = CXL_CONFIG_COMMIT; 406 407 return 0; 408 } 409 410 static ssize_t commit_store(struct device *dev, struct device_attribute *attr, 411 const char *buf, size_t len) 412 { 413 struct cxl_region *cxlr = to_cxl_region(dev); 414 struct cxl_region_params *p = &cxlr->params; 415 bool commit; 416 ssize_t rc; 417 418 rc = kstrtobool(buf, &commit); 419 if (rc) 420 return rc; 421 422 if (commit) { 423 rc = __commit(cxlr); 424 if (rc) 425 return rc; 426 return len; 427 } 428 429 if (test_bit(CXL_REGION_F_LOCK, &cxlr->flags)) 430 return -EPERM; 431 432 rc = queue_reset(cxlr); 433 if (rc) 434 return rc; 435 436 /* 437 * Unmap the region and depend the reset-pending state to ensure 438 * it does not go active again until post reset 439 */ 440 device_release_driver(&cxlr->dev); 441 442 /* 443 * With the reset pending take cxl_rwsem.region unconditionally 444 * to ensure the reset gets handled before returning. 445 */ 446 guard(rwsem_write)(&cxl_rwsem.region); 447 448 /* 449 * Revalidate that the reset is still pending in case another 450 * thread already handled this reset. 451 */ 452 if (p->state == CXL_CONFIG_RESET_PENDING) { 453 cxl_region_decode_reset(cxlr, p->interleave_ways); 454 p->state = CXL_CONFIG_ACTIVE; 455 } 456 457 return len; 458 } 459 460 static ssize_t commit_show(struct device *dev, struct device_attribute *attr, 461 char *buf) 462 { 463 struct cxl_region *cxlr = to_cxl_region(dev); 464 struct cxl_region_params *p = &cxlr->params; 465 ssize_t rc; 466 467 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 468 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 469 return rc; 470 return sysfs_emit(buf, "%d\n", p->state >= CXL_CONFIG_COMMIT); 471 } 472 static DEVICE_ATTR_RW(commit); 473 474 static ssize_t interleave_ways_show(struct device *dev, 475 struct device_attribute *attr, char *buf) 476 { 477 struct cxl_region *cxlr = to_cxl_region(dev); 478 struct cxl_region_params *p = &cxlr->params; 479 int rc; 480 481 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 482 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 483 return rc; 484 return sysfs_emit(buf, "%d\n", p->interleave_ways); 485 } 486 487 static const struct attribute_group *get_cxl_region_target_group(void); 488 489 static int set_interleave_ways(struct cxl_region *cxlr, int val) 490 { 491 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 492 struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld; 493 struct cxl_region_params *p = &cxlr->params; 494 int save, rc; 495 u8 iw; 496 497 rc = ways_to_eiw(val, &iw); 498 if (rc) 499 return rc; 500 501 /* 502 * Even for x3, x6, and x12 interleaves the region interleave must be a 503 * power of 2 multiple of the host bridge interleave. 504 */ 505 if (!is_power_of_2(val / cxld->interleave_ways) || 506 (val % cxld->interleave_ways)) { 507 dev_dbg(&cxlr->dev, "invalid interleave: %d\n", val); 508 return -EINVAL; 509 } 510 511 lockdep_assert_held_write(&cxl_rwsem.region); 512 513 if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) 514 return -EBUSY; 515 516 save = p->interleave_ways; 517 p->interleave_ways = val; 518 rc = sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_target_group()); 519 if (rc) 520 p->interleave_ways = save; 521 522 return rc; 523 } 524 525 static ssize_t interleave_ways_store(struct device *dev, 526 struct device_attribute *attr, 527 const char *buf, size_t len) 528 { 529 struct cxl_region *cxlr = to_cxl_region(dev); 530 int val; 531 int rc; 532 533 rc = kstrtoint(buf, 0, &val); 534 if (rc) 535 return rc; 536 537 ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); 538 if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem))) 539 return rc; 540 541 rc = set_interleave_ways(cxlr, val); 542 if (rc) 543 return rc; 544 545 return len; 546 } 547 static DEVICE_ATTR_RW(interleave_ways); 548 549 static ssize_t interleave_granularity_show(struct device *dev, 550 struct device_attribute *attr, 551 char *buf) 552 { 553 struct cxl_region *cxlr = to_cxl_region(dev); 554 struct cxl_region_params *p = &cxlr->params; 555 int rc; 556 557 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 558 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 559 return rc; 560 return sysfs_emit(buf, "%d\n", p->interleave_granularity); 561 } 562 563 static int set_interleave_granularity(struct cxl_region *cxlr, int val) 564 { 565 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 566 struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld; 567 struct cxl_region_params *p = &cxlr->params; 568 int rc; 569 u16 ig; 570 571 rc = granularity_to_eig(val, &ig); 572 if (rc) 573 return rc; 574 575 /* 576 * When the host-bridge is interleaved, disallow region granularity != 577 * root granularity. Regions with a granularity less than the root 578 * interleave result in needing multiple endpoints to support a single 579 * slot in the interleave (possible to support in the future). Regions 580 * with a granularity greater than the root interleave result in invalid 581 * DPA translations (invalid to support). 582 */ 583 if (cxld->interleave_ways > 1 && val != cxld->interleave_granularity) 584 return -EINVAL; 585 586 lockdep_assert_held_write(&cxl_rwsem.region); 587 588 if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) 589 return -EBUSY; 590 591 p->interleave_granularity = val; 592 return 0; 593 } 594 595 static ssize_t interleave_granularity_store(struct device *dev, 596 struct device_attribute *attr, 597 const char *buf, size_t len) 598 { 599 struct cxl_region *cxlr = to_cxl_region(dev); 600 int rc, val; 601 602 rc = kstrtoint(buf, 0, &val); 603 if (rc) 604 return rc; 605 606 ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); 607 if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem))) 608 return rc; 609 610 rc = set_interleave_granularity(cxlr, val); 611 if (rc) 612 return rc; 613 614 return len; 615 } 616 static DEVICE_ATTR_RW(interleave_granularity); 617 618 static ssize_t resource_show(struct device *dev, struct device_attribute *attr, 619 char *buf) 620 { 621 struct cxl_region *cxlr = to_cxl_region(dev); 622 struct cxl_region_params *p = &cxlr->params; 623 u64 resource = -1ULL; 624 int rc; 625 626 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 627 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 628 return rc; 629 630 if (p->res) 631 resource = p->res->start; 632 return sysfs_emit(buf, "%#llx\n", resource); 633 } 634 static DEVICE_ATTR_RO(resource); 635 636 static ssize_t mode_show(struct device *dev, struct device_attribute *attr, 637 char *buf) 638 { 639 struct cxl_region *cxlr = to_cxl_region(dev); 640 const char *desc; 641 642 if (cxlr->mode == CXL_PARTMODE_RAM) 643 desc = "ram"; 644 else if (cxlr->mode == CXL_PARTMODE_PMEM) 645 desc = "pmem"; 646 else 647 desc = ""; 648 649 return sysfs_emit(buf, "%s\n", desc); 650 } 651 static DEVICE_ATTR_RO(mode); 652 653 static int alloc_hpa(struct cxl_region *cxlr, resource_size_t size) 654 { 655 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 656 struct cxl_region_params *p = &cxlr->params; 657 struct resource *res; 658 u64 remainder = 0; 659 660 lockdep_assert_held_write(&cxl_rwsem.region); 661 662 /* Nothing to do... */ 663 if (p->res && resource_size(p->res) == size) 664 return 0; 665 666 /* To change size the old size must be freed first */ 667 if (p->res) 668 return -EBUSY; 669 670 if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) 671 return -EBUSY; 672 673 /* ways, granularity and uuid (if PMEM) need to be set before HPA */ 674 if (!p->interleave_ways || !p->interleave_granularity || 675 (cxlr->mode == CXL_PARTMODE_PMEM && uuid_is_null(&p->uuid))) 676 return -ENXIO; 677 678 div64_u64_rem(size, (u64)SZ_256M * p->interleave_ways, &remainder); 679 if (remainder) 680 return -EINVAL; 681 682 res = alloc_free_mem_region(cxlrd->res, size, SZ_256M, 683 dev_name(&cxlr->dev)); 684 if (IS_ERR(res)) { 685 dev_dbg(&cxlr->dev, 686 "HPA allocation error (%pe) for size:%pap in %s %pr\n", 687 res, &size, cxlrd->res->name, cxlrd->res); 688 return PTR_ERR(res); 689 } 690 691 cxlr->hpa_range = DEFINE_RANGE(res->start, res->end); 692 693 p->res = res; 694 p->state = CXL_CONFIG_INTERLEAVE_ACTIVE; 695 696 return 0; 697 } 698 699 static void cxl_region_iomem_release(struct cxl_region *cxlr) 700 { 701 struct cxl_region_params *p = &cxlr->params; 702 703 if (device_is_registered(&cxlr->dev)) 704 lockdep_assert_held_write(&cxl_rwsem.region); 705 if (p->res) { 706 /* 707 * Autodiscovered regions may not have been able to insert their 708 * resource. 709 */ 710 if (p->res->parent) 711 remove_resource(p->res); 712 kfree(p->res); 713 p->res = NULL; 714 } 715 } 716 717 static int free_hpa(struct cxl_region *cxlr) 718 { 719 struct cxl_region_params *p = &cxlr->params; 720 721 lockdep_assert_held_write(&cxl_rwsem.region); 722 723 if (!p->res) 724 return 0; 725 726 if (p->state >= CXL_CONFIG_ACTIVE) 727 return -EBUSY; 728 729 cxlr->hpa_range = DEFINE_RANGE(0, -1); 730 731 cxl_region_iomem_release(cxlr); 732 p->state = CXL_CONFIG_IDLE; 733 return 0; 734 } 735 736 static ssize_t size_store(struct device *dev, struct device_attribute *attr, 737 const char *buf, size_t len) 738 { 739 struct cxl_region *cxlr = to_cxl_region(dev); 740 u64 val; 741 int rc; 742 743 rc = kstrtou64(buf, 0, &val); 744 if (rc) 745 return rc; 746 747 ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); 748 if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem))) 749 return rc; 750 751 if (val) 752 rc = alloc_hpa(cxlr, val); 753 else 754 rc = free_hpa(cxlr); 755 756 if (rc) 757 return rc; 758 759 return len; 760 } 761 762 static ssize_t size_show(struct device *dev, struct device_attribute *attr, 763 char *buf) 764 { 765 struct cxl_region *cxlr = to_cxl_region(dev); 766 struct cxl_region_params *p = &cxlr->params; 767 u64 size = 0; 768 ssize_t rc; 769 770 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 771 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 772 return rc; 773 if (p->res) 774 size = resource_size(p->res); 775 return sysfs_emit(buf, "%#llx\n", size); 776 } 777 static DEVICE_ATTR_RW(size); 778 779 static ssize_t extended_linear_cache_size_show(struct device *dev, 780 struct device_attribute *attr, 781 char *buf) 782 { 783 struct cxl_region *cxlr = to_cxl_region(dev); 784 struct cxl_region_params *p = &cxlr->params; 785 ssize_t rc; 786 787 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 788 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 789 return rc; 790 return sysfs_emit(buf, "%pap\n", &p->cache_size); 791 } 792 static DEVICE_ATTR_RO(extended_linear_cache_size); 793 794 static ssize_t locked_show(struct device *dev, 795 struct device_attribute *attr, 796 char *buf) 797 { 798 struct cxl_region *cxlr = to_cxl_region(dev); 799 int rc; 800 801 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 802 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 803 return rc; 804 805 rc = test_bit(CXL_REGION_F_LOCK, &cxlr->flags); 806 return sysfs_emit(buf, "%d\n", rc); 807 } 808 static DEVICE_ATTR_RO(locked); 809 810 static struct attribute *cxl_region_attrs[] = { 811 &dev_attr_uuid.attr, 812 &dev_attr_commit.attr, 813 &dev_attr_interleave_ways.attr, 814 &dev_attr_interleave_granularity.attr, 815 &dev_attr_resource.attr, 816 &dev_attr_size.attr, 817 &dev_attr_mode.attr, 818 &dev_attr_extended_linear_cache_size.attr, 819 &dev_attr_locked.attr, 820 NULL, 821 }; 822 823 static umode_t cxl_region_visible(struct kobject *kobj, struct attribute *a, 824 int n) 825 { 826 struct device *dev = kobj_to_dev(kobj); 827 struct cxl_region *cxlr = to_cxl_region(dev); 828 829 /* 830 * Support tooling that expects to find a 'uuid' attribute for all 831 * regions regardless of mode. 832 */ 833 if (a == &dev_attr_uuid.attr && cxlr->mode != CXL_PARTMODE_PMEM) 834 return 0444; 835 836 /* 837 * Don't display extended linear cache attribute if there is no 838 * extended linear cache. 839 */ 840 if (a == &dev_attr_extended_linear_cache_size.attr && 841 cxlr->params.cache_size == 0) 842 return 0; 843 844 return a->mode; 845 } 846 847 static const struct attribute_group cxl_region_group = { 848 .attrs = cxl_region_attrs, 849 .is_visible = cxl_region_visible, 850 }; 851 852 static size_t show_targetN(struct cxl_region *cxlr, char *buf, int pos) 853 { 854 struct cxl_region_params *p = &cxlr->params; 855 struct cxl_endpoint_decoder *cxled; 856 int rc; 857 858 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 859 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 860 return rc; 861 862 if (pos >= p->interleave_ways) { 863 dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos, 864 p->interleave_ways); 865 return -ENXIO; 866 } 867 868 cxled = p->targets[pos]; 869 if (!cxled) 870 return sysfs_emit(buf, "\n"); 871 return sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev)); 872 } 873 874 static int check_commit_order(struct device *dev, void *data) 875 { 876 struct cxl_decoder *cxld = to_cxl_decoder(dev); 877 878 /* 879 * if port->commit_end is not the only free decoder, then out of 880 * order shutdown has occurred, block further allocations until 881 * that is resolved 882 */ 883 if (((cxld->flags & CXL_DECODER_F_ENABLE) == 0)) 884 return -EBUSY; 885 return 0; 886 } 887 888 static int match_free_decoder(struct device *dev, const void *data) 889 { 890 struct cxl_port *port = to_cxl_port(dev->parent); 891 struct cxl_decoder *cxld; 892 int rc; 893 894 if (!is_switch_decoder(dev)) 895 return 0; 896 897 cxld = to_cxl_decoder(dev); 898 899 if (cxld->id != port->commit_end + 1) 900 return 0; 901 902 if (cxld->region) { 903 dev_dbg(dev->parent, 904 "next decoder to commit (%s) is already reserved (%s)\n", 905 dev_name(dev), dev_name(&cxld->region->dev)); 906 return 0; 907 } 908 909 rc = device_for_each_child_reverse_from(dev->parent, dev, NULL, 910 check_commit_order); 911 if (rc) { 912 dev_dbg(dev->parent, 913 "unable to allocate %s due to out of order shutdown\n", 914 dev_name(dev)); 915 return 0; 916 } 917 return 1; 918 } 919 920 static bool spa_maps_hpa(const struct cxl_region_params *p, 921 const struct range *range) 922 { 923 if (!p->res) 924 return false; 925 926 /* 927 * The extended linear cache region is constructed by a 1:1 ratio 928 * where the SPA maps equal amounts of DRAM and CXL HPA capacity with 929 * CXL decoders at the high end of the SPA range. 930 */ 931 return p->res->start + p->cache_size == range->start && 932 p->res->end == range->end; 933 } 934 935 static int match_auto_decoder(struct device *dev, const void *data) 936 { 937 const struct cxl_region_params *p = data; 938 struct cxl_decoder *cxld; 939 struct range *r; 940 941 if (!is_switch_decoder(dev)) 942 return 0; 943 944 cxld = to_cxl_decoder(dev); 945 r = &cxld->hpa_range; 946 947 if (spa_maps_hpa(p, r)) 948 return 1; 949 950 return 0; 951 } 952 953 /** 954 * cxl_port_pick_region_decoder() - assign or lookup a decoder for a region 955 * @port: a port in the ancestry of the endpoint implied by @cxled 956 * @cxled: endpoint decoder to be, or currently, mapped by @port 957 * @cxlr: region to establish, or validate, decode @port 958 * 959 * In the region creation path cxl_port_pick_region_decoder() is an 960 * allocator to find a free port. In the region assembly path, it is 961 * recalling the decoder that platform firmware picked for validation 962 * purposes. 963 * 964 * The result is recorded in a 'struct cxl_region_ref' in @port. 965 */ 966 static struct cxl_decoder * 967 cxl_port_pick_region_decoder(struct cxl_port *port, 968 struct cxl_endpoint_decoder *cxled, 969 struct cxl_region *cxlr) 970 { 971 struct device *dev; 972 973 if (port == cxled_to_port(cxled)) 974 return &cxled->cxld; 975 976 if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags)) 977 dev = device_find_child(&port->dev, &cxlr->params, 978 match_auto_decoder); 979 else 980 dev = device_find_child(&port->dev, NULL, match_free_decoder); 981 if (!dev) 982 return NULL; 983 /* 984 * This decoder is pinned registered as long as the endpoint decoder is 985 * registered, and endpoint decoder unregistration holds the 986 * cxl_rwsem.region over unregister events, so no need to hold on to 987 * this extra reference. 988 */ 989 put_device(dev); 990 return to_cxl_decoder(dev); 991 } 992 993 static bool auto_order_ok(struct cxl_port *port, struct cxl_region *cxlr_iter, 994 struct cxl_decoder *cxld) 995 { 996 struct cxl_region_ref *rr = cxl_rr_load(port, cxlr_iter); 997 struct cxl_decoder *cxld_iter = rr->decoder; 998 999 /* 1000 * Allow the out of order assembly of auto-discovered regions. 1001 * Per CXL Spec 3.1 8.2.4.20.12 software must commit decoders 1002 * in HPA order. Confirm that the decoder with the lesser HPA 1003 * starting address has the lesser id. 1004 */ 1005 dev_dbg(&cxld->dev, "check for HPA violation %s:%d < %s:%d\n", 1006 dev_name(&cxld->dev), cxld->id, 1007 dev_name(&cxld_iter->dev), cxld_iter->id); 1008 1009 if (cxld_iter->id > cxld->id) 1010 return true; 1011 1012 return false; 1013 } 1014 1015 static struct cxl_region_ref * 1016 alloc_region_ref(struct cxl_port *port, struct cxl_region *cxlr, 1017 struct cxl_endpoint_decoder *cxled, 1018 struct cxl_decoder *cxld) 1019 { 1020 struct cxl_region_params *p = &cxlr->params; 1021 struct cxl_region_ref *cxl_rr, *iter; 1022 unsigned long index; 1023 int rc; 1024 1025 xa_for_each(&port->regions, index, iter) { 1026 struct cxl_region_params *ip = &iter->region->params; 1027 1028 if (!ip->res || ip->res->start < p->res->start) 1029 continue; 1030 1031 if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags)) { 1032 if (auto_order_ok(port, iter->region, cxld)) 1033 continue; 1034 } 1035 dev_dbg(&cxlr->dev, "%s: HPA order violation %s:%pr vs %pr\n", 1036 dev_name(&port->dev), 1037 dev_name(&iter->region->dev), ip->res, p->res); 1038 1039 return ERR_PTR(-EBUSY); 1040 } 1041 1042 cxl_rr = kzalloc_obj(*cxl_rr); 1043 if (!cxl_rr) 1044 return ERR_PTR(-ENOMEM); 1045 cxl_rr->port = port; 1046 cxl_rr->region = cxlr; 1047 cxl_rr->nr_targets = 1; 1048 xa_init(&cxl_rr->endpoints); 1049 1050 rc = xa_insert(&port->regions, (unsigned long)cxlr, cxl_rr, GFP_KERNEL); 1051 if (rc) { 1052 dev_dbg(&cxlr->dev, 1053 "%s: failed to track region reference: %d\n", 1054 dev_name(&port->dev), rc); 1055 kfree(cxl_rr); 1056 return ERR_PTR(rc); 1057 } 1058 1059 return cxl_rr; 1060 } 1061 1062 static void cxl_rr_free_decoder(struct cxl_region_ref *cxl_rr) 1063 { 1064 struct cxl_region *cxlr = cxl_rr->region; 1065 struct cxl_decoder *cxld = cxl_rr->decoder; 1066 1067 if (!cxld) 1068 return; 1069 1070 dev_WARN_ONCE(&cxlr->dev, cxld->region != cxlr, "region mismatch\n"); 1071 if (cxld->region == cxlr) { 1072 cxld->region = NULL; 1073 put_device(&cxlr->dev); 1074 } 1075 } 1076 1077 static void free_region_ref(struct cxl_region_ref *cxl_rr) 1078 { 1079 struct cxl_port *port = cxl_rr->port; 1080 struct cxl_region *cxlr = cxl_rr->region; 1081 1082 cxl_rr_free_decoder(cxl_rr); 1083 xa_erase(&port->regions, (unsigned long)cxlr); 1084 xa_destroy(&cxl_rr->endpoints); 1085 kfree(cxl_rr); 1086 } 1087 1088 static int cxl_rr_ep_add(struct cxl_region_ref *cxl_rr, 1089 struct cxl_endpoint_decoder *cxled) 1090 { 1091 int rc; 1092 struct cxl_port *port = cxl_rr->port; 1093 struct cxl_region *cxlr = cxl_rr->region; 1094 struct cxl_decoder *cxld = cxl_rr->decoder; 1095 struct cxl_ep *ep = cxl_ep_load(port, cxled_to_memdev(cxled)); 1096 1097 if (ep) { 1098 rc = xa_insert(&cxl_rr->endpoints, (unsigned long)cxled, ep, 1099 GFP_KERNEL); 1100 if (rc) 1101 return rc; 1102 } 1103 cxl_rr->nr_eps++; 1104 1105 if (!cxld->region) { 1106 cxld->region = cxlr; 1107 1108 /* 1109 * Now that cxld->region is set the intermediate staging state 1110 * can be cleared. 1111 */ 1112 if (cxld == &cxled->cxld && 1113 cxled->state == CXL_DECODER_STATE_AUTO_STAGED) 1114 cxled->state = CXL_DECODER_STATE_AUTO; 1115 get_device(&cxlr->dev); 1116 } 1117 1118 return 0; 1119 } 1120 1121 static int cxl_rr_assign_decoder(struct cxl_port *port, struct cxl_region *cxlr, 1122 struct cxl_endpoint_decoder *cxled, 1123 struct cxl_region_ref *cxl_rr, 1124 struct cxl_decoder *cxld) 1125 { 1126 if (cxld->region) { 1127 dev_dbg(&cxlr->dev, "%s: %s already attached to %s\n", 1128 dev_name(&port->dev), dev_name(&cxld->dev), 1129 dev_name(&cxld->region->dev)); 1130 return -EBUSY; 1131 } 1132 1133 /* 1134 * Endpoints should already match the region type, but backstop that 1135 * assumption with an assertion. Switch-decoders change mapping-type 1136 * based on what is mapped when they are assigned to a region. 1137 */ 1138 dev_WARN_ONCE(&cxlr->dev, 1139 port == cxled_to_port(cxled) && 1140 cxld->target_type != cxlr->type, 1141 "%s:%s mismatch decoder type %d -> %d\n", 1142 dev_name(&cxled_to_memdev(cxled)->dev), 1143 dev_name(&cxld->dev), cxld->target_type, cxlr->type); 1144 cxld->target_type = cxlr->type; 1145 cxl_rr->decoder = cxld; 1146 return 0; 1147 } 1148 1149 static void cxl_region_setup_flags(struct cxl_region *cxlr, 1150 struct cxl_decoder *cxld) 1151 { 1152 if (is_endpoint_decoder(&cxld->dev)) { 1153 struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(&cxld->dev); 1154 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 1155 1156 /* 1157 * When a region's memdevs specify an @attach method the attach 1158 * provider is responsible for dispositioning the region for 1159 * both probe and userspace management 1160 */ 1161 if (cxlmd->attach) 1162 set_bit(CXL_REGION_F_LOCK, &cxlr->flags); 1163 } 1164 1165 if (cxld->flags & CXL_DECODER_F_LOCK) { 1166 set_bit(CXL_REGION_F_LOCK, &cxlr->flags); 1167 clear_bit(CXL_REGION_F_NEEDS_RESET, &cxlr->flags); 1168 } 1169 1170 if (cxld->flags & CXL_DECODER_F_NORMALIZED_ADDRESSING) 1171 set_bit(CXL_REGION_F_NORMALIZED_ADDRESSING, &cxlr->flags); 1172 } 1173 1174 /** 1175 * cxl_port_attach_region() - track a region's interest in a port by endpoint 1176 * @port: port to add a new region reference 'struct cxl_region_ref' 1177 * @cxlr: region to attach to @port 1178 * @cxled: endpoint decoder used to create or further pin a region reference 1179 * @pos: interleave position of @cxled in @cxlr 1180 * 1181 * The attach event is an opportunity to validate CXL decode setup 1182 * constraints and record metadata needed for programming HDM decoders, 1183 * in particular decoder target lists. 1184 * 1185 * The steps are: 1186 * 1187 * - validate that there are no other regions with a higher HPA already 1188 * associated with @port 1189 * - establish a region reference if one is not already present 1190 * 1191 * - additionally allocate a decoder instance that will host @cxlr on 1192 * @port 1193 * 1194 * - pin the region reference by the endpoint 1195 * - account for how many entries in @port's target list are needed to 1196 * cover all of the added endpoints. 1197 */ 1198 static int cxl_port_attach_region(struct cxl_port *port, 1199 struct cxl_region *cxlr, 1200 struct cxl_endpoint_decoder *cxled, int pos) 1201 { 1202 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 1203 struct cxl_ep *ep = cxl_ep_load(port, cxlmd); 1204 struct cxl_region_ref *cxl_rr; 1205 bool nr_targets_inc = false; 1206 struct cxl_decoder *cxld; 1207 unsigned long index; 1208 int rc = -EBUSY; 1209 1210 lockdep_assert_held_write(&cxl_rwsem.region); 1211 1212 cxl_rr = cxl_rr_load(port, cxlr); 1213 if (cxl_rr) { 1214 struct cxl_ep *ep_iter; 1215 int found = 0; 1216 1217 /* 1218 * Walk the existing endpoints that have been attached to 1219 * @cxlr at @port and see if they share the same 'next' port 1220 * in the downstream direction. I.e. endpoints that share common 1221 * upstream switch. 1222 */ 1223 xa_for_each(&cxl_rr->endpoints, index, ep_iter) { 1224 if (ep_iter == ep) 1225 continue; 1226 if (ep_iter->next == ep->next) { 1227 found++; 1228 break; 1229 } 1230 } 1231 1232 /* 1233 * New target port, or @port is an endpoint port that always 1234 * accounts its own local decode as a target. 1235 */ 1236 if (!found || !ep->next) { 1237 cxl_rr->nr_targets++; 1238 nr_targets_inc = true; 1239 } 1240 } else { 1241 cxld = cxl_port_pick_region_decoder(port, cxled, cxlr); 1242 if (!cxld) { 1243 dev_dbg(&cxlr->dev, "%s: no decoder available\n", 1244 dev_name(&port->dev)); 1245 return -EBUSY; 1246 } 1247 1248 cxl_rr = alloc_region_ref(port, cxlr, cxled, cxld); 1249 if (IS_ERR(cxl_rr)) { 1250 dev_dbg(&cxlr->dev, 1251 "%s: failed to allocate region reference\n", 1252 dev_name(&port->dev)); 1253 return PTR_ERR(cxl_rr); 1254 } 1255 nr_targets_inc = true; 1256 1257 rc = cxl_rr_assign_decoder(port, cxlr, cxled, cxl_rr, cxld); 1258 if (rc) 1259 goto out_erase; 1260 } 1261 cxld = cxl_rr->decoder; 1262 1263 /* 1264 * the number of targets should not exceed the target_count 1265 * of the decoder 1266 */ 1267 if (is_switch_decoder(&cxld->dev)) { 1268 struct cxl_switch_decoder *cxlsd; 1269 1270 cxlsd = to_cxl_switch_decoder(&cxld->dev); 1271 if (cxl_rr->nr_targets > cxlsd->nr_targets) { 1272 dev_dbg(&cxlr->dev, 1273 "%s:%s %s add: %s:%s @ %d overflows targets: %d\n", 1274 dev_name(port->uport_dev), dev_name(&port->dev), 1275 dev_name(&cxld->dev), dev_name(&cxlmd->dev), 1276 dev_name(&cxled->cxld.dev), pos, 1277 cxlsd->nr_targets); 1278 rc = -ENXIO; 1279 goto out_erase; 1280 } 1281 } 1282 1283 cxl_region_setup_flags(cxlr, cxld); 1284 1285 rc = cxl_rr_ep_add(cxl_rr, cxled); 1286 if (rc) { 1287 dev_dbg(&cxlr->dev, 1288 "%s: failed to track endpoint %s:%s reference\n", 1289 dev_name(&port->dev), dev_name(&cxlmd->dev), 1290 dev_name(&cxld->dev)); 1291 goto out_erase; 1292 } 1293 1294 dev_dbg(&cxlr->dev, 1295 "%s:%s %s add: %s:%s @ %d next: %s nr_eps: %d nr_targets: %d\n", 1296 dev_name(port->uport_dev), dev_name(&port->dev), 1297 dev_name(&cxld->dev), dev_name(&cxlmd->dev), 1298 dev_name(&cxled->cxld.dev), pos, 1299 ep ? ep->next ? dev_name(ep->next->uport_dev) : 1300 dev_name(&cxlmd->dev) : 1301 "none", 1302 cxl_rr->nr_eps, cxl_rr->nr_targets); 1303 1304 return 0; 1305 out_erase: 1306 if (nr_targets_inc) 1307 cxl_rr->nr_targets--; 1308 if (cxl_rr->nr_eps == 0) 1309 free_region_ref(cxl_rr); 1310 return rc; 1311 } 1312 1313 static void cxl_port_detach_region(struct cxl_port *port, 1314 struct cxl_region *cxlr, 1315 struct cxl_endpoint_decoder *cxled) 1316 { 1317 struct cxl_region_ref *cxl_rr; 1318 struct cxl_ep *ep = NULL; 1319 1320 lockdep_assert_held_write(&cxl_rwsem.region); 1321 1322 cxl_rr = cxl_rr_load(port, cxlr); 1323 if (!cxl_rr) 1324 return; 1325 1326 /* 1327 * Endpoint ports do not carry cxl_ep references, and they 1328 * never target more than one endpoint by definition 1329 */ 1330 if (cxl_rr->decoder == &cxled->cxld) 1331 cxl_rr->nr_eps--; 1332 else 1333 ep = xa_erase(&cxl_rr->endpoints, (unsigned long)cxled); 1334 if (ep) { 1335 struct cxl_ep *ep_iter; 1336 unsigned long index; 1337 int found = 0; 1338 1339 cxl_rr->nr_eps--; 1340 xa_for_each(&cxl_rr->endpoints, index, ep_iter) { 1341 if (ep_iter->next == ep->next) { 1342 found++; 1343 break; 1344 } 1345 } 1346 if (!found) 1347 cxl_rr->nr_targets--; 1348 } 1349 1350 if (cxl_rr->nr_eps == 0) 1351 free_region_ref(cxl_rr); 1352 } 1353 1354 static int check_last_peer(struct cxl_endpoint_decoder *cxled, 1355 struct cxl_ep *ep, struct cxl_region_ref *cxl_rr, 1356 int distance) 1357 { 1358 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 1359 struct cxl_region *cxlr = cxl_rr->region; 1360 struct cxl_region_params *p = &cxlr->params; 1361 struct cxl_endpoint_decoder *cxled_peer; 1362 struct cxl_port *port = cxl_rr->port; 1363 struct cxl_memdev *cxlmd_peer; 1364 struct cxl_ep *ep_peer; 1365 int pos = cxled->pos; 1366 1367 /* 1368 * If this position wants to share a dport with the last endpoint mapped 1369 * then that endpoint, at index 'position - distance', must also be 1370 * mapped by this dport. 1371 */ 1372 if (pos < distance) { 1373 dev_dbg(&cxlr->dev, "%s:%s: cannot host %s:%s at %d\n", 1374 dev_name(port->uport_dev), dev_name(&port->dev), 1375 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos); 1376 return -ENXIO; 1377 } 1378 cxled_peer = p->targets[pos - distance]; 1379 cxlmd_peer = cxled_to_memdev(cxled_peer); 1380 ep_peer = cxl_ep_load(port, cxlmd_peer); 1381 if (ep->dport != ep_peer->dport) { 1382 dev_dbg(&cxlr->dev, 1383 "%s:%s: %s:%s pos %d mismatched peer %s:%s\n", 1384 dev_name(port->uport_dev), dev_name(&port->dev), 1385 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos, 1386 dev_name(&cxlmd_peer->dev), 1387 dev_name(&cxled_peer->cxld.dev)); 1388 return -ENXIO; 1389 } 1390 1391 return 0; 1392 } 1393 1394 static int check_interleave_cap(struct cxl_decoder *cxld, int iw, int ig) 1395 { 1396 struct cxl_port *port = to_cxl_port(cxld->dev.parent); 1397 struct cxl_hdm *cxlhdm = dev_get_drvdata(&port->dev); 1398 unsigned int interleave_mask; 1399 u8 eiw; 1400 u16 eig; 1401 int high_pos, low_pos; 1402 1403 if (!test_bit(iw, &cxlhdm->iw_cap_mask)) 1404 return -ENXIO; 1405 /* 1406 * Per CXL specification r3.1(8.2.4.20.13 Decoder Protection), 1407 * if eiw < 8: 1408 * DPAOFFSET[51: eig + 8] = HPAOFFSET[51: eig + 8 + eiw] 1409 * DPAOFFSET[eig + 7: 0] = HPAOFFSET[eig + 7: 0] 1410 * 1411 * when the eiw is 0, all the bits of HPAOFFSET[51: 0] are used, the 1412 * interleave bits are none. 1413 * 1414 * if eiw >= 8: 1415 * DPAOFFSET[51: eig + 8] = HPAOFFSET[51: eig + eiw] / 3 1416 * DPAOFFSET[eig + 7: 0] = HPAOFFSET[eig + 7: 0] 1417 * 1418 * when the eiw is 8, all the bits of HPAOFFSET[51: 0] are used, the 1419 * interleave bits are none. 1420 */ 1421 ways_to_eiw(iw, &eiw); 1422 if (eiw == 0 || eiw == 8) 1423 return 0; 1424 1425 granularity_to_eig(ig, &eig); 1426 if (eiw > 8) 1427 high_pos = eiw + eig - 1; 1428 else 1429 high_pos = eiw + eig + 7; 1430 low_pos = eig + 8; 1431 interleave_mask = GENMASK(high_pos, low_pos); 1432 if (interleave_mask & ~cxlhdm->interleave_mask) 1433 return -ENXIO; 1434 1435 return 0; 1436 } 1437 1438 static int cxl_port_setup_targets(struct cxl_port *port, 1439 struct cxl_region *cxlr, 1440 struct cxl_endpoint_decoder *cxled) 1441 { 1442 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 1443 int parent_iw, parent_ig, ig, iw, rc, pos = cxled->pos; 1444 struct cxl_port *parent_port = to_cxl_port(port->dev.parent); 1445 struct cxl_region_ref *cxl_rr = cxl_rr_load(port, cxlr); 1446 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 1447 struct cxl_ep *ep = cxl_ep_load(port, cxlmd); 1448 struct cxl_region_params *p = &cxlr->params; 1449 struct cxl_decoder *cxld = cxl_rr->decoder; 1450 struct cxl_switch_decoder *cxlsd; 1451 struct cxl_port *iter = port; 1452 u16 eig, peig; 1453 u8 eiw, peiw; 1454 1455 /* 1456 * While root level decoders support x3, x6, x12, switch level 1457 * decoders only support powers of 2 up to x16. 1458 */ 1459 if (!is_power_of_2(cxl_rr->nr_targets)) { 1460 dev_dbg(&cxlr->dev, "%s:%s: invalid target count %d\n", 1461 dev_name(port->uport_dev), dev_name(&port->dev), 1462 cxl_rr->nr_targets); 1463 return -EINVAL; 1464 } 1465 1466 cxlsd = to_cxl_switch_decoder(&cxld->dev); 1467 if (cxl_rr->nr_targets_set) { 1468 int i, distance = 1; 1469 struct cxl_region_ref *cxl_rr_iter; 1470 1471 /* 1472 * The "distance" between peer downstream ports represents which 1473 * endpoint positions in the region interleave a given port can 1474 * host. 1475 * 1476 * For example, at the root of a hierarchy the distance is 1477 * always 1 as every index targets a different host-bridge. At 1478 * each subsequent switch level those ports map every Nth region 1479 * position where N is the width of the switch == distance. 1480 */ 1481 do { 1482 cxl_rr_iter = cxl_rr_load(iter, cxlr); 1483 distance *= cxl_rr_iter->nr_targets; 1484 iter = to_cxl_port(iter->dev.parent); 1485 } while (!is_cxl_root(iter)); 1486 distance *= cxlrd->cxlsd.cxld.interleave_ways; 1487 1488 for (i = 0; i < cxl_rr->nr_targets_set; i++) 1489 if (ep->dport == cxlsd->target[i]) { 1490 rc = check_last_peer(cxled, ep, cxl_rr, 1491 distance); 1492 if (rc) 1493 return rc; 1494 goto out_target_set; 1495 } 1496 goto add_target; 1497 } 1498 1499 if (is_cxl_root(parent_port)) { 1500 /* 1501 * Root decoder IG is always set to value in CFMWS which 1502 * may be different than this region's IG. We can use the 1503 * region's IG here since interleave_granularity_store() 1504 * does not allow interleaved host-bridges with 1505 * root IG != region IG. 1506 */ 1507 parent_ig = p->interleave_granularity; 1508 parent_iw = cxlrd->cxlsd.cxld.interleave_ways; 1509 /* 1510 * For purposes of address bit routing, use power-of-2 math for 1511 * switch ports. 1512 */ 1513 if (!is_power_of_2(parent_iw)) 1514 parent_iw /= 3; 1515 } else { 1516 struct cxl_region_ref *parent_rr; 1517 struct cxl_decoder *parent_cxld; 1518 1519 parent_rr = cxl_rr_load(parent_port, cxlr); 1520 parent_cxld = parent_rr->decoder; 1521 parent_ig = parent_cxld->interleave_granularity; 1522 parent_iw = parent_cxld->interleave_ways; 1523 } 1524 1525 rc = granularity_to_eig(parent_ig, &peig); 1526 if (rc) { 1527 dev_dbg(&cxlr->dev, "%s:%s: invalid parent granularity: %d\n", 1528 dev_name(parent_port->uport_dev), 1529 dev_name(&parent_port->dev), parent_ig); 1530 return rc; 1531 } 1532 1533 rc = ways_to_eiw(parent_iw, &peiw); 1534 if (rc) { 1535 dev_dbg(&cxlr->dev, "%s:%s: invalid parent interleave: %d\n", 1536 dev_name(parent_port->uport_dev), 1537 dev_name(&parent_port->dev), parent_iw); 1538 return rc; 1539 } 1540 1541 iw = cxl_rr->nr_targets; 1542 rc = ways_to_eiw(iw, &eiw); 1543 if (rc) { 1544 dev_dbg(&cxlr->dev, "%s:%s: invalid port interleave: %d\n", 1545 dev_name(port->uport_dev), dev_name(&port->dev), iw); 1546 return rc; 1547 } 1548 1549 /* 1550 * Interleave granularity is a multiple of @parent_port granularity. 1551 * Multiplier is the parent port interleave ways. 1552 */ 1553 rc = granularity_to_eig(parent_ig * parent_iw, &eig); 1554 if (rc) { 1555 dev_dbg(&cxlr->dev, 1556 "%s: invalid granularity calculation (%d * %d)\n", 1557 dev_name(&parent_port->dev), parent_ig, parent_iw); 1558 return rc; 1559 } 1560 1561 rc = eig_to_granularity(eig, &ig); 1562 if (rc) { 1563 dev_dbg(&cxlr->dev, "%s:%s: invalid interleave: %d\n", 1564 dev_name(port->uport_dev), dev_name(&port->dev), 1565 256 << eig); 1566 return rc; 1567 } 1568 1569 if (iw > 8 || iw > cxlsd->nr_targets) { 1570 dev_dbg(&cxlr->dev, 1571 "%s:%s:%s: ways: %d overflows targets: %d\n", 1572 dev_name(port->uport_dev), dev_name(&port->dev), 1573 dev_name(&cxld->dev), iw, cxlsd->nr_targets); 1574 return -ENXIO; 1575 } 1576 1577 if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags)) { 1578 if (cxld->interleave_ways != iw || 1579 (iw > 1 && cxld->interleave_granularity != ig) || 1580 !spa_maps_hpa(p, &cxld->hpa_range) || 1581 ((cxld->flags & CXL_DECODER_F_ENABLE) == 0)) { 1582 dev_err(&cxlr->dev, 1583 "%s:%s %s expected iw: %d ig: %d %pr\n", 1584 dev_name(port->uport_dev), dev_name(&port->dev), 1585 __func__, iw, ig, p->res); 1586 dev_err(&cxlr->dev, 1587 "%s:%s %s got iw: %d ig: %d state: %s %#llx:%#llx\n", 1588 dev_name(port->uport_dev), dev_name(&port->dev), 1589 __func__, cxld->interleave_ways, 1590 cxld->interleave_granularity, 1591 str_enabled_disabled(cxld->flags & CXL_DECODER_F_ENABLE), 1592 cxld->hpa_range.start, cxld->hpa_range.end); 1593 return -ENXIO; 1594 } 1595 } else { 1596 rc = check_interleave_cap(cxld, iw, ig); 1597 if (rc) { 1598 dev_dbg(&cxlr->dev, 1599 "%s:%s iw: %d ig: %d is not supported\n", 1600 dev_name(port->uport_dev), 1601 dev_name(&port->dev), iw, ig); 1602 return rc; 1603 } 1604 1605 cxld->interleave_ways = iw; 1606 cxld->interleave_granularity = ig; 1607 cxld->hpa_range = (struct range) { 1608 .start = p->res->start, 1609 .end = p->res->end, 1610 }; 1611 } 1612 dev_dbg(&cxlr->dev, "%s:%s iw: %d ig: %d\n", dev_name(port->uport_dev), 1613 dev_name(&port->dev), iw, ig); 1614 add_target: 1615 if (cxl_rr->nr_targets_set == cxl_rr->nr_targets) { 1616 dev_dbg(&cxlr->dev, 1617 "%s:%s: targets full trying to add %s:%s at %d\n", 1618 dev_name(port->uport_dev), dev_name(&port->dev), 1619 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos); 1620 return -ENXIO; 1621 } 1622 if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags)) { 1623 if (cxlsd->target[cxl_rr->nr_targets_set] != ep->dport) { 1624 dev_dbg(&cxlr->dev, "%s:%s: %s expected %s at %d\n", 1625 dev_name(port->uport_dev), dev_name(&port->dev), 1626 dev_name(&cxlsd->cxld.dev), 1627 dev_name(ep->dport->dport_dev), 1628 cxl_rr->nr_targets_set); 1629 return -ENXIO; 1630 } 1631 } else { 1632 cxlsd->target[cxl_rr->nr_targets_set] = ep->dport; 1633 cxlsd->cxld.target_map[cxl_rr->nr_targets_set] = ep->dport->port_id; 1634 } 1635 cxl_rr->nr_targets_set++; 1636 out_target_set: 1637 dev_dbg(&cxlr->dev, "%s:%s target[%d] = %s for %s:%s @ %d\n", 1638 dev_name(port->uport_dev), dev_name(&port->dev), 1639 cxl_rr->nr_targets_set - 1, dev_name(ep->dport->dport_dev), 1640 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos); 1641 1642 return 0; 1643 } 1644 1645 static void cxl_port_reset_targets(struct cxl_port *port, 1646 struct cxl_region *cxlr) 1647 { 1648 struct cxl_region_ref *cxl_rr = cxl_rr_load(port, cxlr); 1649 struct cxl_decoder *cxld; 1650 1651 /* 1652 * After the last endpoint has been detached the entire cxl_rr may now 1653 * be gone. 1654 */ 1655 if (!cxl_rr) 1656 return; 1657 cxl_rr->nr_targets_set = 0; 1658 1659 cxld = cxl_rr->decoder; 1660 cxld->hpa_range = (struct range) { 1661 .start = 0, 1662 .end = -1, 1663 }; 1664 } 1665 1666 static void cxl_region_teardown_targets(struct cxl_region *cxlr) 1667 { 1668 struct cxl_region_params *p = &cxlr->params; 1669 struct cxl_endpoint_decoder *cxled; 1670 struct cxl_dev_state *cxlds; 1671 struct cxl_memdev *cxlmd; 1672 struct cxl_port *iter; 1673 struct cxl_ep *ep; 1674 int i; 1675 1676 /* 1677 * In the auto-discovery case skip automatic teardown since the 1678 * address space is already active 1679 */ 1680 if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags)) 1681 return; 1682 1683 for (i = 0; i < p->nr_targets; i++) { 1684 cxled = p->targets[i]; 1685 cxlmd = cxled_to_memdev(cxled); 1686 cxlds = cxlmd->cxlds; 1687 1688 if (cxlds->rcd) 1689 continue; 1690 1691 iter = cxled_to_port(cxled); 1692 while (!is_cxl_root(to_cxl_port(iter->dev.parent))) 1693 iter = to_cxl_port(iter->dev.parent); 1694 1695 for (ep = cxl_ep_load(iter, cxlmd); iter; 1696 iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) 1697 cxl_port_reset_targets(iter, cxlr); 1698 } 1699 } 1700 1701 static int cxl_region_setup_targets(struct cxl_region *cxlr) 1702 { 1703 struct cxl_region_params *p = &cxlr->params; 1704 struct cxl_endpoint_decoder *cxled; 1705 struct cxl_dev_state *cxlds; 1706 int i, rc, rch = 0, vh = 0; 1707 struct cxl_memdev *cxlmd; 1708 struct cxl_port *iter; 1709 struct cxl_ep *ep; 1710 1711 for (i = 0; i < p->nr_targets; i++) { 1712 cxled = p->targets[i]; 1713 cxlmd = cxled_to_memdev(cxled); 1714 cxlds = cxlmd->cxlds; 1715 1716 /* validate that all targets agree on topology */ 1717 if (!cxlds->rcd) { 1718 vh++; 1719 } else { 1720 rch++; 1721 continue; 1722 } 1723 1724 iter = cxled_to_port(cxled); 1725 while (!is_cxl_root(to_cxl_port(iter->dev.parent))) 1726 iter = to_cxl_port(iter->dev.parent); 1727 1728 /* 1729 * Descend the topology tree programming / validating 1730 * targets while looking for conflicts. 1731 */ 1732 for (ep = cxl_ep_load(iter, cxlmd); iter; 1733 iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) { 1734 rc = cxl_port_setup_targets(iter, cxlr, cxled); 1735 if (rc) { 1736 cxl_region_teardown_targets(cxlr); 1737 return rc; 1738 } 1739 } 1740 } 1741 1742 if (rch && vh) { 1743 dev_err(&cxlr->dev, "mismatched CXL topologies detected\n"); 1744 cxl_region_teardown_targets(cxlr); 1745 return -ENXIO; 1746 } 1747 1748 return 0; 1749 } 1750 1751 static int cxl_region_validate_position(struct cxl_region *cxlr, 1752 struct cxl_endpoint_decoder *cxled, 1753 int pos) 1754 { 1755 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 1756 struct cxl_region_params *p = &cxlr->params; 1757 int i; 1758 1759 if (pos < 0 || pos >= p->interleave_ways) { 1760 dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos, 1761 p->interleave_ways); 1762 return -ENXIO; 1763 } 1764 1765 if (p->targets[pos] == cxled) 1766 return 0; 1767 1768 if (p->targets[pos]) { 1769 struct cxl_endpoint_decoder *cxled_target = p->targets[pos]; 1770 struct cxl_memdev *cxlmd_target = cxled_to_memdev(cxled_target); 1771 1772 dev_dbg(&cxlr->dev, "position %d already assigned to %s:%s\n", 1773 pos, dev_name(&cxlmd_target->dev), 1774 dev_name(&cxled_target->cxld.dev)); 1775 return -EBUSY; 1776 } 1777 1778 for (i = 0; i < p->interleave_ways; i++) { 1779 struct cxl_endpoint_decoder *cxled_target; 1780 struct cxl_memdev *cxlmd_target; 1781 1782 cxled_target = p->targets[i]; 1783 if (!cxled_target) 1784 continue; 1785 1786 cxlmd_target = cxled_to_memdev(cxled_target); 1787 if (cxlmd_target == cxlmd) { 1788 dev_dbg(&cxlr->dev, 1789 "%s already specified at position %d via: %s\n", 1790 dev_name(&cxlmd->dev), pos, 1791 dev_name(&cxled_target->cxld.dev)); 1792 return -EBUSY; 1793 } 1794 } 1795 1796 return 0; 1797 } 1798 1799 static int cxl_region_attach_position(struct cxl_region *cxlr, 1800 struct cxl_endpoint_decoder *cxled, 1801 const struct cxl_dport *dport, int pos) 1802 { 1803 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 1804 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 1805 struct cxl_switch_decoder *cxlsd = &cxlrd->cxlsd; 1806 struct cxl_decoder *cxld = &cxlsd->cxld; 1807 int iw = cxld->interleave_ways; 1808 struct cxl_port *iter; 1809 int rc; 1810 1811 if (dport != cxlrd->cxlsd.target[pos % iw]) { 1812 dev_dbg(&cxlr->dev, "%s:%s invalid target position for %s\n", 1813 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 1814 dev_name(&cxlrd->cxlsd.cxld.dev)); 1815 return -ENXIO; 1816 } 1817 1818 for (iter = cxled_to_port(cxled); !is_cxl_root(iter); 1819 iter = to_cxl_port(iter->dev.parent)) { 1820 rc = cxl_port_attach_region(iter, cxlr, cxled, pos); 1821 if (rc) 1822 goto err; 1823 } 1824 1825 return 0; 1826 1827 err: 1828 for (iter = cxled_to_port(cxled); !is_cxl_root(iter); 1829 iter = to_cxl_port(iter->dev.parent)) 1830 cxl_port_detach_region(iter, cxlr, cxled); 1831 return rc; 1832 } 1833 1834 static int cxl_region_attach_auto(struct cxl_region *cxlr, 1835 struct cxl_endpoint_decoder *cxled, int pos) 1836 { 1837 struct cxl_region_params *p = &cxlr->params; 1838 1839 if (cxled->state != CXL_DECODER_STATE_AUTO) { 1840 dev_err(&cxlr->dev, 1841 "%s: unable to add decoder to autodetected region\n", 1842 dev_name(&cxled->cxld.dev)); 1843 return -EINVAL; 1844 } 1845 1846 if (pos >= 0) { 1847 dev_dbg(&cxlr->dev, "%s: expected auto position, not %d\n", 1848 dev_name(&cxled->cxld.dev), pos); 1849 return -EINVAL; 1850 } 1851 1852 if (p->nr_targets >= p->interleave_ways) { 1853 dev_err(&cxlr->dev, "%s: no more target slots available\n", 1854 dev_name(&cxled->cxld.dev)); 1855 return -ENXIO; 1856 } 1857 1858 /* 1859 * Temporarily record the endpoint decoder into the target array. Yes, 1860 * this means that userspace can view devices in the wrong position 1861 * before the region activates, and must be careful to understand when 1862 * it might be racing region autodiscovery. 1863 * 1864 * The endpoint decoder will be recorded into the first free slot of 1865 * the target array. 1866 */ 1867 for (pos = 0; pos < p->interleave_ways; pos++) { 1868 if (!p->targets[pos]) 1869 break; 1870 } 1871 1872 if (pos == p->interleave_ways) { 1873 dev_err(&cxlr->dev, "%s: unable to find a free target slot\n", 1874 dev_name(&cxled->cxld.dev)); 1875 return -ENXIO; 1876 } 1877 1878 p->targets[pos] = cxled; 1879 cxled->pos = pos; 1880 cxled->state = CXL_DECODER_STATE_AUTO_STAGED; 1881 p->nr_targets++; 1882 1883 return 0; 1884 } 1885 1886 static int cmp_interleave_pos(const void *a, const void *b) 1887 { 1888 struct cxl_endpoint_decoder *cxled_a = *(typeof(cxled_a) *)a; 1889 struct cxl_endpoint_decoder *cxled_b = *(typeof(cxled_b) *)b; 1890 1891 return cxled_a->pos - cxled_b->pos; 1892 } 1893 1894 static int match_switch_decoder_by_range(struct device *dev, 1895 const void *data) 1896 { 1897 struct cxl_switch_decoder *cxlsd; 1898 const struct range *r1, *r2 = data; 1899 1900 1901 if (!is_switch_decoder(dev)) 1902 return 0; 1903 1904 cxlsd = to_cxl_switch_decoder(dev); 1905 r1 = &cxlsd->cxld.hpa_range; 1906 1907 if (is_root_decoder(dev)) 1908 return range_contains(r1, r2); 1909 return (r1->start == r2->start && r1->end == r2->end); 1910 } 1911 1912 static int find_pos_and_ways(struct cxl_port *port, struct range *range, 1913 int *pos, int *ways) 1914 { 1915 struct cxl_switch_decoder *cxlsd; 1916 struct cxl_port *parent; 1917 int rc = -ENXIO; 1918 1919 parent = parent_port_of(port); 1920 if (!parent) 1921 return rc; 1922 1923 struct device *dev __free(put_device) = 1924 device_find_child(&parent->dev, range, match_switch_decoder_by_range); 1925 if (!dev) { 1926 dev_err(port->uport_dev, 1927 "failed to find decoder mapping %#llx-%#llx\n", 1928 range->start, range->end); 1929 return rc; 1930 } 1931 cxlsd = to_cxl_switch_decoder(dev); 1932 *ways = cxlsd->cxld.interleave_ways; 1933 1934 for (int i = 0; i < *ways; i++) { 1935 if (cxlsd->target[i] == port->parent_dport) { 1936 *pos = i; 1937 rc = 0; 1938 break; 1939 } 1940 } 1941 if (rc) 1942 dev_err(port->uport_dev, 1943 "failed to find %s:%s in target list of %s\n", 1944 dev_name(&port->dev), 1945 dev_name(port->parent_dport->dport_dev), dev_name(dev)); 1946 1947 return rc; 1948 } 1949 1950 /** 1951 * cxl_calc_interleave_pos() - calculate an endpoint position in a region 1952 * @cxled: endpoint decoder member of given region 1953 * @hpa_range: translated HPA range of the endpoint 1954 * 1955 * The endpoint position is calculated by traversing the topology from 1956 * the endpoint to the root decoder and iteratively applying this 1957 * calculation: 1958 * 1959 * position = position * parent_ways + parent_pos; 1960 * 1961 * ...where @position is inferred from switch and root decoder target lists. 1962 * 1963 * Return: position >= 0 on success 1964 * -ENXIO on failure 1965 */ 1966 static int cxl_calc_interleave_pos(struct cxl_endpoint_decoder *cxled, 1967 struct range *hpa_range) 1968 { 1969 struct cxl_port *iter, *port = cxled_to_port(cxled); 1970 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 1971 int parent_ways = 0, parent_pos = 0, pos = 0; 1972 int rc; 1973 1974 /* 1975 * Example: the expected interleave order of the 4-way region shown 1976 * below is: mem0, mem2, mem1, mem3 1977 * 1978 * root_port 1979 * / \ 1980 * host_bridge_0 host_bridge_1 1981 * | | | | 1982 * mem0 mem1 mem2 mem3 1983 * 1984 * In the example the calculator will iterate twice. The first iteration 1985 * uses the mem position in the host-bridge and the ways of the host- 1986 * bridge to generate the first, or local, position. The second 1987 * iteration uses the host-bridge position in the root_port and the ways 1988 * of the root_port to refine the position. 1989 * 1990 * A trace of the calculation per endpoint looks like this: 1991 * mem0: pos = 0 * 2 + 0 mem2: pos = 0 * 2 + 0 1992 * pos = 0 * 2 + 0 pos = 0 * 2 + 1 1993 * pos: 0 pos: 1 1994 * 1995 * mem1: pos = 0 * 2 + 1 mem3: pos = 0 * 2 + 1 1996 * pos = 1 * 2 + 0 pos = 1 * 2 + 1 1997 * pos: 2 pos = 3 1998 * 1999 * Note that while this example is simple, the method applies to more 2000 * complex topologies, including those with switches. 2001 */ 2002 2003 /* Iterate from endpoint to root_port refining the position */ 2004 for (iter = port; iter; iter = parent_port_of(iter)) { 2005 if (is_cxl_root(iter)) 2006 break; 2007 2008 rc = find_pos_and_ways(iter, hpa_range, &parent_pos, 2009 &parent_ways); 2010 if (rc) 2011 return rc; 2012 2013 pos = pos * parent_ways + parent_pos; 2014 } 2015 2016 dev_dbg(&cxlmd->dev, 2017 "decoder:%s parent:%s port:%s range:%#llx-%#llx pos:%d\n", 2018 dev_name(&cxled->cxld.dev), dev_name(cxlmd->dev.parent), 2019 dev_name(&port->dev), hpa_range->start, hpa_range->end, pos); 2020 2021 return pos; 2022 } 2023 2024 static int cxl_region_sort_targets(struct cxl_region *cxlr) 2025 { 2026 struct cxl_region_params *p = &cxlr->params; 2027 int i, rc = 0; 2028 2029 for (i = 0; i < p->nr_targets; i++) { 2030 struct cxl_endpoint_decoder *cxled = p->targets[i]; 2031 2032 cxled->pos = cxl_calc_interleave_pos(cxled, &cxlr->hpa_range); 2033 /* 2034 * Record that sorting failed, but still continue to calc 2035 * cxled->pos so that cxl_calc_interleave_pos() emits its 2036 * dev_dbg() for every member. which is useful for auto 2037 * discovery debug. 2038 */ 2039 if (cxled->pos < 0) 2040 rc = -ENXIO; 2041 } 2042 /* Keep the cxlr target list in interleave position order */ 2043 sort(p->targets, p->nr_targets, sizeof(p->targets[0]), 2044 cmp_interleave_pos, NULL); 2045 2046 dev_dbg(&cxlr->dev, "region sort %s\n", rc ? "failed" : "successful"); 2047 return rc; 2048 } 2049 2050 static int cxl_region_attach(struct cxl_region *cxlr, 2051 struct cxl_endpoint_decoder *cxled, int pos) 2052 { 2053 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 2054 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 2055 struct cxl_dev_state *cxlds = cxlmd->cxlds; 2056 struct cxl_region_params *p = &cxlr->params; 2057 struct cxl_port *ep_port, *root_port; 2058 struct cxl_dport *dport; 2059 int rc = -ENXIO; 2060 2061 rc = check_interleave_cap(&cxled->cxld, p->interleave_ways, 2062 p->interleave_granularity); 2063 if (rc) { 2064 dev_dbg(&cxlr->dev, "%s iw: %d ig: %d is not supported\n", 2065 dev_name(&cxled->cxld.dev), p->interleave_ways, 2066 p->interleave_granularity); 2067 return rc; 2068 } 2069 2070 if (cxled->part < 0) { 2071 dev_dbg(&cxlr->dev, "%s dead\n", dev_name(&cxled->cxld.dev)); 2072 return -ENODEV; 2073 } 2074 2075 if (cxlds->part[cxled->part].mode != cxlr->mode) { 2076 dev_dbg(&cxlr->dev, "%s region mode: %d mismatch\n", 2077 dev_name(&cxled->cxld.dev), cxlr->mode); 2078 return -EINVAL; 2079 } 2080 2081 /* all full of members, or interleave config not established? */ 2082 if (p->state > CXL_CONFIG_INTERLEAVE_ACTIVE) { 2083 dev_dbg(&cxlr->dev, "region already active\n"); 2084 return -EBUSY; 2085 } 2086 2087 if (p->state < CXL_CONFIG_INTERLEAVE_ACTIVE) { 2088 dev_dbg(&cxlr->dev, "interleave config missing\n"); 2089 return -ENXIO; 2090 } 2091 2092 if (p->nr_targets >= p->interleave_ways) { 2093 dev_dbg(&cxlr->dev, "region already has %d endpoints\n", 2094 p->nr_targets); 2095 return -EINVAL; 2096 } 2097 2098 ep_port = cxled_to_port(cxled); 2099 root_port = cxlrd_to_port(cxlrd); 2100 dport = cxl_find_dport_by_dev(root_port, ep_port->host_bridge); 2101 if (!dport) { 2102 dev_dbg(&cxlr->dev, "%s:%s invalid target for %s\n", 2103 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 2104 dev_name(cxlr->dev.parent)); 2105 return -ENXIO; 2106 } 2107 2108 if (cxled->cxld.target_type != cxlr->type) { 2109 dev_dbg(&cxlr->dev, "%s:%s type mismatch: %d vs %d\n", 2110 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 2111 cxled->cxld.target_type, cxlr->type); 2112 return -ENXIO; 2113 } 2114 2115 if (!cxled->dpa_res) { 2116 dev_dbg(&cxlr->dev, "%s:%s: missing DPA allocation.\n", 2117 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev)); 2118 return -ENXIO; 2119 } 2120 2121 if (resource_size(cxled->dpa_res) * p->interleave_ways + p->cache_size != 2122 resource_size(p->res)) { 2123 dev_dbg(&cxlr->dev, 2124 "%s:%s-size-%#llx * ways-%d + cache-%#llx != region-size-%#llx\n", 2125 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 2126 (u64)resource_size(cxled->dpa_res), p->interleave_ways, 2127 (u64)p->cache_size, (u64)resource_size(p->res)); 2128 return -EINVAL; 2129 } 2130 2131 cxl_region_perf_data_calculate(cxlr, cxled); 2132 2133 if (test_bit(CXL_REGION_F_AUTO, &cxlr->flags)) { 2134 int i; 2135 2136 rc = cxl_region_attach_auto(cxlr, cxled, pos); 2137 if (rc) 2138 return rc; 2139 2140 /* await more targets to arrive... */ 2141 if (p->nr_targets < p->interleave_ways) 2142 return 0; 2143 2144 /* 2145 * All targets are here, which implies all PCI enumeration that 2146 * affects this region has been completed. Walk the topology to 2147 * sort the devices into their relative region decode position. 2148 */ 2149 rc = cxl_region_sort_targets(cxlr); 2150 if (rc) 2151 return rc; 2152 2153 for (i = 0; i < p->nr_targets; i++) { 2154 cxled = p->targets[i]; 2155 ep_port = cxled_to_port(cxled); 2156 dport = cxl_find_dport_by_dev(root_port, 2157 ep_port->host_bridge); 2158 rc = cxl_region_attach_position(cxlr, cxled, dport, i); 2159 if (rc) 2160 return rc; 2161 } 2162 2163 rc = cxl_region_setup_targets(cxlr); 2164 if (rc) 2165 return rc; 2166 2167 /* 2168 * If target setup succeeds in the autodiscovery case 2169 * then the region is already committed. 2170 */ 2171 p->state = CXL_CONFIG_COMMIT; 2172 cxl_region_shared_upstream_bandwidth_update(cxlr); 2173 2174 return 0; 2175 } 2176 2177 rc = cxl_region_validate_position(cxlr, cxled, pos); 2178 if (rc) 2179 return rc; 2180 2181 rc = cxl_region_attach_position(cxlr, cxled, dport, pos); 2182 if (rc) 2183 return rc; 2184 2185 p->targets[pos] = cxled; 2186 cxled->pos = pos; 2187 p->nr_targets++; 2188 2189 if (p->nr_targets == p->interleave_ways) { 2190 rc = cxl_region_setup_targets(cxlr); 2191 if (rc) 2192 return rc; 2193 p->state = CXL_CONFIG_ACTIVE; 2194 cxl_region_shared_upstream_bandwidth_update(cxlr); 2195 } 2196 2197 cxled->cxld.interleave_ways = p->interleave_ways; 2198 cxled->cxld.interleave_granularity = p->interleave_granularity; 2199 cxled->cxld.hpa_range = (struct range) { 2200 .start = p->res->start, 2201 .end = p->res->end, 2202 }; 2203 2204 if (p->nr_targets != p->interleave_ways) 2205 return 0; 2206 2207 /* 2208 * Test the auto-discovery position calculator function 2209 * against this successfully created user-defined region. 2210 * A fail message here means that this interleave config 2211 * will fail when presented as CXL_REGION_F_AUTO. 2212 */ 2213 for (int i = 0; i < p->nr_targets; i++) { 2214 struct cxl_endpoint_decoder *target = p->targets[i]; 2215 int test_pos; 2216 2217 test_pos = cxl_calc_interleave_pos(target, &cxlr->hpa_range); 2218 dev_dbg(&target->cxld.dev, 2219 "Test cxl_calc_interleave_pos(): %s test_pos:%d target->pos:%d\n", 2220 (test_pos == target->pos) ? "success" : "fail", 2221 test_pos, target->pos); 2222 } 2223 2224 return 0; 2225 } 2226 2227 static int cxl_region_remove_target(struct device *dev, void *data) 2228 { 2229 struct cxl_endpoint_decoder *cxled = data; 2230 struct cxl_region_params *p; 2231 struct cxl_region *cxlr; 2232 int i; 2233 2234 if (!is_cxl_region(dev)) 2235 return 0; 2236 2237 cxlr = to_cxl_region(dev); 2238 p = &cxlr->params; 2239 for (i = 0; i < p->interleave_ways; i++) { 2240 if (p->targets[i] == cxled) { 2241 p->nr_targets--; 2242 cxled->state = CXL_DECODER_STATE_AUTO; 2243 cxled->pos = -1; 2244 p->targets[i] = NULL; 2245 2246 return 1; 2247 } 2248 } 2249 2250 return 0; 2251 } 2252 2253 /* 2254 * When an auto-region fails to assemble the decoder may be listed as a target, 2255 * but not fully attached. 2256 */ 2257 static void cxl_cancel_auto_attach(struct cxl_endpoint_decoder *cxled) 2258 { 2259 if (cxled->state != CXL_DECODER_STATE_AUTO_STAGED) 2260 return; 2261 2262 bus_for_each_dev(&cxl_bus_type, NULL, cxled, cxl_region_remove_target); 2263 } 2264 2265 static struct cxl_region * 2266 __cxl_decoder_detach(struct cxl_region *cxlr, 2267 struct cxl_endpoint_decoder *cxled, int pos, 2268 enum cxl_detach_mode mode) 2269 { 2270 struct cxl_region_params *p; 2271 2272 lockdep_assert_held_write(&cxl_rwsem.region); 2273 2274 if (!cxled) { 2275 p = &cxlr->params; 2276 2277 if (pos >= p->interleave_ways) { 2278 dev_dbg(&cxlr->dev, "position %d out of range %d\n", 2279 pos, p->interleave_ways); 2280 return NULL; 2281 } 2282 2283 if (!p->targets[pos]) 2284 return NULL; 2285 cxled = p->targets[pos]; 2286 } else { 2287 cxlr = cxled->cxld.region; 2288 if (!cxlr) { 2289 cxl_cancel_auto_attach(cxled); 2290 return NULL; 2291 } 2292 p = &cxlr->params; 2293 } 2294 2295 if (mode == DETACH_INVALIDATE) 2296 cxled->part = -1; 2297 2298 if (p->state > CXL_CONFIG_ACTIVE) { 2299 cxl_region_decode_reset(cxlr, p->interleave_ways); 2300 p->state = CXL_CONFIG_ACTIVE; 2301 } 2302 2303 for (struct cxl_port *iter = cxled_to_port(cxled); !is_cxl_root(iter); 2304 iter = to_cxl_port(iter->dev.parent)) 2305 cxl_port_detach_region(iter, cxlr, cxled); 2306 2307 if (cxled->pos < 0 || cxled->pos >= p->interleave_ways || 2308 p->targets[cxled->pos] != cxled) { 2309 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 2310 2311 dev_WARN_ONCE(&cxlr->dev, 1, "expected %s:%s at position %d\n", 2312 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 2313 cxled->pos); 2314 return NULL; 2315 } 2316 2317 if (p->state == CXL_CONFIG_ACTIVE) { 2318 p->state = CXL_CONFIG_INTERLEAVE_ACTIVE; 2319 cxl_region_teardown_targets(cxlr); 2320 } 2321 p->targets[cxled->pos] = NULL; 2322 p->nr_targets--; 2323 cxled->cxld.hpa_range = (struct range) { 2324 .start = 0, 2325 .end = -1, 2326 }; 2327 2328 get_device(&cxlr->dev); 2329 return cxlr; 2330 } 2331 2332 /* 2333 * Cleanup a decoder's interest in a region. There are 2 cases to 2334 * handle, removing an unknown @cxled from a known position in a region 2335 * (detach_target()) or removing a known @cxled from an unknown @cxlr 2336 * (cxld_unregister()) 2337 * 2338 * When the detachment finds a region release the region driver. 2339 */ 2340 int cxl_decoder_detach(struct cxl_region *cxlr, 2341 struct cxl_endpoint_decoder *cxled, int pos, 2342 enum cxl_detach_mode mode) 2343 { 2344 struct cxl_region *detach; 2345 2346 /* when the decoder is being destroyed lock unconditionally */ 2347 if (mode == DETACH_INVALIDATE) { 2348 guard(rwsem_write)(&cxl_rwsem.region); 2349 detach = __cxl_decoder_detach(cxlr, cxled, pos, mode); 2350 } else { 2351 int rc; 2352 2353 ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); 2354 if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem))) 2355 return rc; 2356 detach = __cxl_decoder_detach(cxlr, cxled, pos, mode); 2357 } 2358 2359 if (detach) { 2360 device_release_driver(&detach->dev); 2361 put_device(&detach->dev); 2362 } 2363 return 0; 2364 } 2365 2366 static int __attach_target(struct cxl_region *cxlr, 2367 struct cxl_endpoint_decoder *cxled, int pos, 2368 unsigned int state) 2369 { 2370 int rc; 2371 2372 if (state == TASK_INTERRUPTIBLE) { 2373 ACQUIRE(rwsem_write_kill, rwsem)(&cxl_rwsem.region); 2374 if ((rc = ACQUIRE_ERR(rwsem_write_kill, &rwsem))) 2375 return rc; 2376 guard(rwsem_read)(&cxl_rwsem.dpa); 2377 return cxl_region_attach(cxlr, cxled, pos); 2378 } 2379 guard(rwsem_write)(&cxl_rwsem.region); 2380 guard(rwsem_read)(&cxl_rwsem.dpa); 2381 return cxl_region_attach(cxlr, cxled, pos); 2382 } 2383 2384 static int attach_target(struct cxl_region *cxlr, 2385 struct cxl_endpoint_decoder *cxled, int pos, 2386 unsigned int state) 2387 { 2388 int rc = __attach_target(cxlr, cxled, pos, state); 2389 2390 if (rc == 0) 2391 return 0; 2392 2393 dev_warn(cxled->cxld.dev.parent, "failed to attach %s to %s: %d\n", 2394 dev_name(&cxled->cxld.dev), dev_name(&cxlr->dev), rc); 2395 return rc; 2396 } 2397 2398 static int detach_target(struct cxl_region *cxlr, int pos) 2399 { 2400 return cxl_decoder_detach(cxlr, NULL, pos, DETACH_ONLY); 2401 } 2402 2403 static size_t store_targetN(struct cxl_region *cxlr, const char *buf, int pos, 2404 size_t len) 2405 { 2406 int rc; 2407 2408 if (sysfs_streq(buf, "\n")) 2409 rc = detach_target(cxlr, pos); 2410 else { 2411 struct device *dev; 2412 2413 dev = bus_find_device_by_name(&cxl_bus_type, NULL, buf); 2414 if (!dev) 2415 return -ENODEV; 2416 2417 if (!is_endpoint_decoder(dev)) { 2418 rc = -EINVAL; 2419 goto out; 2420 } 2421 2422 rc = attach_target(cxlr, to_cxl_endpoint_decoder(dev), pos, 2423 TASK_INTERRUPTIBLE); 2424 out: 2425 put_device(dev); 2426 } 2427 2428 if (rc < 0) 2429 return rc; 2430 return len; 2431 } 2432 2433 #define TARGET_ATTR_RW(n) \ 2434 static ssize_t target##n##_show( \ 2435 struct device *dev, struct device_attribute *attr, char *buf) \ 2436 { \ 2437 return show_targetN(to_cxl_region(dev), buf, (n)); \ 2438 } \ 2439 static ssize_t target##n##_store(struct device *dev, \ 2440 struct device_attribute *attr, \ 2441 const char *buf, size_t len) \ 2442 { \ 2443 return store_targetN(to_cxl_region(dev), buf, (n), len); \ 2444 } \ 2445 static DEVICE_ATTR_RW(target##n) 2446 2447 TARGET_ATTR_RW(0); 2448 TARGET_ATTR_RW(1); 2449 TARGET_ATTR_RW(2); 2450 TARGET_ATTR_RW(3); 2451 TARGET_ATTR_RW(4); 2452 TARGET_ATTR_RW(5); 2453 TARGET_ATTR_RW(6); 2454 TARGET_ATTR_RW(7); 2455 TARGET_ATTR_RW(8); 2456 TARGET_ATTR_RW(9); 2457 TARGET_ATTR_RW(10); 2458 TARGET_ATTR_RW(11); 2459 TARGET_ATTR_RW(12); 2460 TARGET_ATTR_RW(13); 2461 TARGET_ATTR_RW(14); 2462 TARGET_ATTR_RW(15); 2463 2464 static struct attribute *target_attrs[] = { 2465 &dev_attr_target0.attr, 2466 &dev_attr_target1.attr, 2467 &dev_attr_target2.attr, 2468 &dev_attr_target3.attr, 2469 &dev_attr_target4.attr, 2470 &dev_attr_target5.attr, 2471 &dev_attr_target6.attr, 2472 &dev_attr_target7.attr, 2473 &dev_attr_target8.attr, 2474 &dev_attr_target9.attr, 2475 &dev_attr_target10.attr, 2476 &dev_attr_target11.attr, 2477 &dev_attr_target12.attr, 2478 &dev_attr_target13.attr, 2479 &dev_attr_target14.attr, 2480 &dev_attr_target15.attr, 2481 NULL, 2482 }; 2483 2484 static umode_t cxl_region_target_visible(struct kobject *kobj, 2485 struct attribute *a, int n) 2486 { 2487 struct device *dev = kobj_to_dev(kobj); 2488 struct cxl_region *cxlr = to_cxl_region(dev); 2489 struct cxl_region_params *p = &cxlr->params; 2490 2491 if (n < p->interleave_ways) 2492 return a->mode; 2493 return 0; 2494 } 2495 2496 static const struct attribute_group cxl_region_target_group = { 2497 .attrs = target_attrs, 2498 .is_visible = cxl_region_target_visible, 2499 }; 2500 2501 static const struct attribute_group *get_cxl_region_target_group(void) 2502 { 2503 return &cxl_region_target_group; 2504 } 2505 2506 static const struct attribute_group *region_groups[] = { 2507 &cxl_base_attribute_group, 2508 &cxl_region_group, 2509 &cxl_region_target_group, 2510 &cxl_region_access0_coordinate_group, 2511 &cxl_region_access1_coordinate_group, 2512 NULL, 2513 }; 2514 2515 static void cxl_region_release(struct device *dev) 2516 { 2517 struct cxl_region *cxlr = to_cxl_region(dev); 2518 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 2519 int id = atomic_read(&cxlrd->region_id); 2520 2521 /* 2522 * Try to reuse the recently idled id rather than the cached 2523 * next id to prevent the region id space from increasing 2524 * unnecessarily. 2525 */ 2526 if (cxlr->id < id) 2527 if (atomic_try_cmpxchg(&cxlrd->region_id, &id, cxlr->id)) { 2528 memregion_free(id); 2529 goto out; 2530 } 2531 2532 memregion_free(cxlr->id); 2533 out: 2534 put_device(dev->parent); 2535 kfree(cxlr); 2536 } 2537 2538 const struct device_type cxl_region_type = { 2539 .name = "cxl_region", 2540 .release = cxl_region_release, 2541 .groups = region_groups 2542 }; 2543 2544 bool is_cxl_region(struct device *dev) 2545 { 2546 return dev->type == &cxl_region_type; 2547 } 2548 EXPORT_SYMBOL_NS_GPL(is_cxl_region, "CXL"); 2549 2550 static struct cxl_region *to_cxl_region(struct device *dev) 2551 { 2552 if (dev_WARN_ONCE(dev, dev->type != &cxl_region_type, 2553 "not a cxl_region device\n")) 2554 return NULL; 2555 2556 return container_of(dev, struct cxl_region, dev); 2557 } 2558 2559 static void unregister_region(struct cxl_region *cxlr) 2560 { 2561 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent); 2562 struct cxl_region_params *p = &cxlr->params; 2563 int i; 2564 2565 xa_erase(&cxlrd->regions, cxlr->id); 2566 device_del(&cxlr->dev); 2567 2568 /* 2569 * Now that region sysfs is shutdown, the parameter block is now 2570 * read-only, so no need to hold the region rwsem to access the 2571 * region parameters. 2572 */ 2573 for (i = 0; i < p->interleave_ways; i++) 2574 detach_target(cxlr, i); 2575 2576 cxlr->hpa_range = DEFINE_RANGE(0, -1); 2577 2578 cxl_region_iomem_release(cxlr); 2579 put_device(&cxlr->dev); 2580 } 2581 2582 static void endpoint_unregister_region(void *_cxlr) 2583 { 2584 struct cxl_region *cxlr = _cxlr; 2585 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent); 2586 2587 guard(mutex)(&cxlrd->regions_lock); 2588 if (xa_load(&cxlrd->regions, cxlr->id)) 2589 unregister_region(cxlr); 2590 put_device(&cxlr->dev); 2591 } 2592 2593 static struct lock_class_key cxl_region_key; 2594 2595 static struct cxl_region *cxl_region_alloc(struct cxl_root_decoder *cxlrd, int id) 2596 { 2597 struct cxl_region *cxlr; 2598 struct device *dev; 2599 2600 cxlr = kzalloc_obj(*cxlr); 2601 if (!cxlr) { 2602 memregion_free(id); 2603 return ERR_PTR(-ENOMEM); 2604 } 2605 2606 dev = &cxlr->dev; 2607 device_initialize(dev); 2608 lockdep_set_class(&dev->mutex, &cxl_region_key); 2609 dev->parent = &cxlrd->cxlsd.cxld.dev; 2610 /* 2611 * Keep root decoder pinned through cxl_region_release to fixup 2612 * region id allocations 2613 */ 2614 get_device(dev->parent); 2615 cxlr->cxlrd = cxlrd; 2616 cxlr->id = id; 2617 2618 device_set_pm_not_required(dev); 2619 dev->bus = &cxl_bus_type; 2620 dev->type = &cxl_region_type; 2621 cxl_region_setup_flags(cxlr, &cxlrd->cxlsd.cxld); 2622 2623 return cxlr; 2624 } 2625 2626 static bool cxl_region_update_coordinates(struct cxl_region *cxlr, int nid) 2627 { 2628 int cset = 0; 2629 int rc; 2630 2631 for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) { 2632 if (cxlr->coord[i].read_bandwidth) { 2633 node_update_perf_attrs(nid, &cxlr->coord[i], i); 2634 cset++; 2635 } 2636 } 2637 2638 if (!cset) 2639 return false; 2640 2641 rc = sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_access0_group()); 2642 if (rc) 2643 dev_dbg(&cxlr->dev, "Failed to update access0 group\n"); 2644 2645 rc = sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_access1_group()); 2646 if (rc) 2647 dev_dbg(&cxlr->dev, "Failed to update access1 group\n"); 2648 2649 return true; 2650 } 2651 2652 static int cxl_region_perf_attrs_callback(struct notifier_block *nb, 2653 unsigned long action, void *arg) 2654 { 2655 struct cxl_region *cxlr = container_of(nb, struct cxl_region, 2656 node_notifier); 2657 struct node_notify *nn = arg; 2658 int nid = nn->nid; 2659 int region_nid; 2660 2661 if (action != NODE_ADDED_FIRST_MEMORY) 2662 return NOTIFY_DONE; 2663 2664 /* 2665 * No need to hold cxl_rwsem.region; region parameters are stable 2666 * within the cxl_region driver. 2667 */ 2668 region_nid = phys_to_target_node(cxlr->params.res->start); 2669 if (nid != region_nid) 2670 return NOTIFY_DONE; 2671 2672 /* No action needed if node bit already set */ 2673 if (node_test_and_set(nid, nodemask_region_seen)) 2674 return NOTIFY_DONE; 2675 2676 if (!cxl_region_update_coordinates(cxlr, nid)) 2677 return NOTIFY_DONE; 2678 2679 return NOTIFY_OK; 2680 } 2681 2682 static int cxl_region_calculate_adistance(struct notifier_block *nb, 2683 unsigned long nid, void *data) 2684 { 2685 struct cxl_region *cxlr = container_of(nb, struct cxl_region, 2686 adist_notifier); 2687 struct access_coordinate *perf; 2688 int *adist = data; 2689 int region_nid; 2690 2691 /* 2692 * No need to hold cxl_rwsem.region; region parameters are stable 2693 * within the cxl_region driver. 2694 */ 2695 region_nid = phys_to_target_node(cxlr->params.res->start); 2696 if (nid != region_nid) 2697 return NOTIFY_OK; 2698 2699 perf = &cxlr->coord[ACCESS_COORDINATE_CPU]; 2700 2701 if (mt_perf_to_adistance(perf, adist)) 2702 return NOTIFY_OK; 2703 2704 return NOTIFY_STOP; 2705 } 2706 2707 /* unwind all remaining regions */ 2708 void kill_regions(struct cxl_root_decoder *cxlrd) 2709 { 2710 unsigned long index; 2711 struct cxl_region *cxlr; 2712 2713 guard(mutex)(&cxlrd->regions_lock); 2714 /* no more region creation */ 2715 cxlrd->dead = true; 2716 xa_for_each(&cxlrd->regions, index, cxlr) 2717 unregister_region(cxlr); 2718 } 2719 2720 /** 2721 * devm_cxl_add_region - Adds a region to a decoder 2722 * @cxlrd: root decoder 2723 * @id: memregion id to create, or memregion_free() on failure 2724 * @mode: mode for the endpoint decoders of this region 2725 * @type: select whether this is an expander or accelerator (type-2 or type-3) 2726 * 2727 * This is the second step of region initialization. Regions exist within an 2728 * address space which is mapped by a @cxlrd. 2729 * 2730 * Return: 0 if the region was added to the @cxlrd, else returns negative error 2731 * code. The region will be named "regionZ" where Z is the unique region number. 2732 */ 2733 static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd, 2734 int id, 2735 enum cxl_partition_mode mode, 2736 enum cxl_decoder_type type) 2737 { 2738 struct cxl_port *port = to_cxl_port(cxlrd->cxlsd.cxld.dev.parent); 2739 struct cxl_region *cxlr; 2740 struct device *dev; 2741 int rc; 2742 2743 cxlr = cxl_region_alloc(cxlrd, id); 2744 if (IS_ERR(cxlr)) 2745 return cxlr; 2746 cxlr->mode = mode; 2747 cxlr->type = type; 2748 2749 dev = &cxlr->dev; 2750 rc = dev_set_name(dev, "region%d", id); 2751 if (rc) 2752 goto err; 2753 2754 rc = device_add(dev); 2755 if (rc) 2756 goto err; 2757 2758 rc = xa_insert(&cxlrd->regions, cxlr->id, cxlr, GFP_KERNEL); 2759 if (rc) { 2760 unregister_region(cxlr); 2761 return ERR_PTR(rc); 2762 } 2763 2764 dev_dbg(port->uport_dev, "%s: created %s\n", 2765 dev_name(&cxlrd->cxlsd.cxld.dev), dev_name(dev)); 2766 return cxlr; 2767 err: 2768 put_device(dev); 2769 return ERR_PTR(rc); 2770 } 2771 2772 static ssize_t __create_region_show(struct cxl_root_decoder *cxlrd, char *buf) 2773 { 2774 return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id)); 2775 } 2776 2777 static ssize_t create_pmem_region_show(struct device *dev, 2778 struct device_attribute *attr, char *buf) 2779 { 2780 return __create_region_show(to_cxl_root_decoder(dev), buf); 2781 } 2782 2783 static ssize_t create_ram_region_show(struct device *dev, 2784 struct device_attribute *attr, char *buf) 2785 { 2786 return __create_region_show(to_cxl_root_decoder(dev), buf); 2787 } 2788 2789 static struct cxl_region *__create_region(struct cxl_root_decoder *cxlrd, 2790 enum cxl_partition_mode mode, int id, 2791 enum cxl_decoder_type target_type) 2792 { 2793 int rc; 2794 2795 if (cxlrd->dead) 2796 return ERR_PTR(-ENXIO); 2797 2798 switch (mode) { 2799 case CXL_PARTMODE_RAM: 2800 case CXL_PARTMODE_PMEM: 2801 break; 2802 default: 2803 dev_err(&cxlrd->cxlsd.cxld.dev, "unsupported mode %d\n", mode); 2804 return ERR_PTR(-EINVAL); 2805 } 2806 2807 rc = memregion_alloc(GFP_KERNEL); 2808 if (rc < 0) 2809 return ERR_PTR(rc); 2810 2811 if (atomic_cmpxchg(&cxlrd->region_id, id, rc) != id) { 2812 memregion_free(rc); 2813 return ERR_PTR(-EBUSY); 2814 } 2815 2816 return devm_cxl_add_region(cxlrd, id, mode, target_type); 2817 } 2818 2819 static ssize_t create_region_store(struct device *dev, const char *buf, 2820 size_t len, enum cxl_partition_mode mode) 2821 { 2822 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev); 2823 struct cxl_region *cxlr; 2824 int rc, id; 2825 2826 rc = sscanf(buf, "region%d\n", &id); 2827 if (rc != 1) 2828 return -EINVAL; 2829 2830 ACQUIRE(mutex_intr, regions_lock)(&cxlrd->regions_lock); 2831 if ((rc = ACQUIRE_ERR(mutex_intr, ®ions_lock))) 2832 return rc; 2833 2834 cxlr = __create_region(cxlrd, mode, id, CXL_DECODER_HOSTONLYMEM); 2835 if (IS_ERR(cxlr)) 2836 return PTR_ERR(cxlr); 2837 2838 return len; 2839 } 2840 2841 static ssize_t create_pmem_region_store(struct device *dev, 2842 struct device_attribute *attr, 2843 const char *buf, size_t len) 2844 { 2845 return create_region_store(dev, buf, len, CXL_PARTMODE_PMEM); 2846 } 2847 DEVICE_ATTR_RW(create_pmem_region); 2848 2849 static ssize_t create_ram_region_store(struct device *dev, 2850 struct device_attribute *attr, 2851 const char *buf, size_t len) 2852 { 2853 return create_region_store(dev, buf, len, CXL_PARTMODE_RAM); 2854 } 2855 DEVICE_ATTR_RW(create_ram_region); 2856 2857 static ssize_t region_show(struct device *dev, struct device_attribute *attr, 2858 char *buf) 2859 { 2860 struct cxl_decoder *cxld = to_cxl_decoder(dev); 2861 ssize_t rc; 2862 2863 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 2864 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) 2865 return rc; 2866 2867 if (cxld->region) 2868 return sysfs_emit(buf, "%s\n", dev_name(&cxld->region->dev)); 2869 return sysfs_emit(buf, "\n"); 2870 } 2871 DEVICE_ATTR_RO(region); 2872 2873 static ssize_t delete_region_store(struct device *dev, 2874 struct device_attribute *attr, 2875 const char *buf, size_t len) 2876 { 2877 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev); 2878 struct cxl_region *cxlr; 2879 int rc, id; 2880 2881 ACQUIRE(mutex_intr, regions_lock)(&cxlrd->regions_lock); 2882 if ((rc = ACQUIRE_ERR(mutex_intr, ®ions_lock))) 2883 return rc; 2884 2885 rc = sscanf(buf, "region%d\n", &id); 2886 if (rc != 1) 2887 return -EINVAL; 2888 2889 cxlr = xa_load(&cxlrd->regions, id); 2890 if (!cxlr || !sysfs_streq(buf, dev_name(&cxlr->dev))) 2891 return -ENODEV; 2892 2893 unregister_region(cxlr); 2894 2895 return len; 2896 } 2897 DEVICE_ATTR_WO(delete_region); 2898 2899 struct cxl_poison_context { 2900 struct cxl_port *port; 2901 int part; 2902 u64 offset; 2903 }; 2904 2905 static int cxl_get_poison_unmapped(struct cxl_memdev *cxlmd, 2906 struct cxl_poison_context *ctx) 2907 { 2908 struct cxl_dev_state *cxlds = cxlmd->cxlds; 2909 const struct resource *res; 2910 struct resource *p, *last; 2911 u64 offset, length; 2912 int rc = 0; 2913 2914 if (ctx->part < 0) 2915 return 0; 2916 2917 /* 2918 * Collect poison for the remaining unmapped resources after 2919 * poison is collected by committed endpoints decoders. 2920 */ 2921 for (int i = ctx->part; i < cxlds->nr_partitions; i++) { 2922 res = &cxlds->part[i].res; 2923 for (p = res->child, last = NULL; p; p = p->sibling) 2924 last = p; 2925 if (last) 2926 offset = last->end + 1; 2927 else 2928 offset = res->start; 2929 length = res->end - offset + 1; 2930 if (!length) 2931 break; 2932 rc = cxl_mem_get_poison(cxlmd, offset, length, NULL); 2933 if (rc == -EFAULT && cxlds->part[i].mode == CXL_PARTMODE_RAM) 2934 continue; 2935 if (rc) 2936 break; 2937 } 2938 2939 return rc; 2940 } 2941 2942 static int poison_by_decoder(struct device *dev, void *arg) 2943 { 2944 struct cxl_poison_context *ctx = arg; 2945 struct cxl_endpoint_decoder *cxled; 2946 enum cxl_partition_mode mode; 2947 struct cxl_dev_state *cxlds; 2948 struct cxl_memdev *cxlmd; 2949 u64 offset, length; 2950 int rc = 0; 2951 2952 if (!is_endpoint_decoder(dev)) 2953 return rc; 2954 2955 cxled = to_cxl_endpoint_decoder(dev); 2956 if (!cxled->dpa_res) 2957 return rc; 2958 2959 cxlmd = cxled_to_memdev(cxled); 2960 cxlds = cxlmd->cxlds; 2961 mode = cxlds->part[cxled->part].mode; 2962 2963 if (cxled->skip) { 2964 offset = cxled->dpa_res->start - cxled->skip; 2965 length = cxled->skip; 2966 rc = cxl_mem_get_poison(cxlmd, offset, length, NULL); 2967 if (rc == -EFAULT && mode == CXL_PARTMODE_RAM) 2968 rc = 0; 2969 if (rc) 2970 return rc; 2971 } 2972 2973 offset = cxled->dpa_res->start; 2974 length = cxled->dpa_res->end - offset + 1; 2975 rc = cxl_mem_get_poison(cxlmd, offset, length, cxled->cxld.region); 2976 if (rc == -EFAULT && mode == CXL_PARTMODE_RAM) 2977 rc = 0; 2978 if (rc) 2979 return rc; 2980 2981 /* Iterate until commit_end is reached */ 2982 if (cxled->cxld.id == ctx->port->commit_end) { 2983 ctx->offset = cxled->dpa_res->end + 1; 2984 ctx->part = cxled->part; 2985 return 1; 2986 } 2987 2988 return 0; 2989 } 2990 2991 int cxl_get_poison_by_endpoint(struct cxl_port *port) 2992 { 2993 struct cxl_poison_context ctx; 2994 int rc = 0; 2995 2996 ctx = (struct cxl_poison_context) { 2997 .port = port, 2998 .part = -1, 2999 }; 3000 3001 rc = device_for_each_child(&port->dev, &ctx, poison_by_decoder); 3002 if (rc == 1) 3003 rc = cxl_get_poison_unmapped(to_cxl_memdev(port->uport_dev), 3004 &ctx); 3005 3006 return rc; 3007 } 3008 3009 struct cxl_dpa_to_region_context { 3010 struct cxl_region *cxlr; 3011 u64 dpa; 3012 }; 3013 3014 static int __cxl_dpa_to_region(struct device *dev, void *arg) 3015 { 3016 struct cxl_dpa_to_region_context *ctx = arg; 3017 struct cxl_endpoint_decoder *cxled; 3018 struct cxl_region *cxlr; 3019 u64 dpa = ctx->dpa; 3020 3021 if (!is_endpoint_decoder(dev)) 3022 return 0; 3023 3024 cxled = to_cxl_endpoint_decoder(dev); 3025 if (!cxled || !cxled->dpa_res || !resource_size(cxled->dpa_res)) 3026 return 0; 3027 3028 if (!cxl_resource_contains_addr(cxled->dpa_res, dpa)) 3029 return 0; 3030 3031 /* 3032 * Stop the region search (return 1) when an endpoint mapping is 3033 * found. The region may not be fully constructed so offering 3034 * the cxlr in the context structure is not guaranteed. 3035 */ 3036 cxlr = cxled->cxld.region; 3037 if (cxlr) 3038 dev_dbg(dev, "dpa:0x%llx mapped in region:%s\n", dpa, 3039 dev_name(&cxlr->dev)); 3040 else 3041 dev_dbg(dev, "dpa:0x%llx mapped in endpoint:%s\n", dpa, 3042 dev_name(dev)); 3043 3044 ctx->cxlr = cxlr; 3045 3046 return 1; 3047 } 3048 3049 struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa) 3050 { 3051 struct cxl_dpa_to_region_context ctx; 3052 struct cxl_port *port = cxlmd->endpoint; 3053 3054 if (!cxlmd->dev.driver) 3055 return NULL; 3056 3057 ctx = (struct cxl_dpa_to_region_context) { 3058 .dpa = dpa, 3059 }; 3060 if (cxl_num_decoders_committed(port)) 3061 device_for_each_child(&port->dev, &ctx, __cxl_dpa_to_region); 3062 3063 return ctx.cxlr; 3064 } 3065 3066 static bool cxl_is_hpa_in_chunk(u64 hpa, struct cxl_region *cxlr, int pos) 3067 { 3068 struct cxl_region_params *p = &cxlr->params; 3069 int gran = p->interleave_granularity; 3070 int ways = p->interleave_ways; 3071 u64 offset; 3072 3073 /* Is the hpa in an expected chunk for its pos(-ition) */ 3074 offset = hpa - p->res->start; 3075 offset = do_div(offset, gran * ways); 3076 if ((offset >= pos * gran) && (offset < (pos + 1) * gran)) 3077 return true; 3078 3079 dev_dbg(&cxlr->dev, 3080 "Addr trans fail: hpa 0x%llx not in expected chunk\n", hpa); 3081 3082 return false; 3083 } 3084 3085 #define CXL_POS_ZERO 0 3086 /** 3087 * cxl_validate_translation_params 3088 * @eiw: encoded interleave ways 3089 * @eig: encoded interleave granularity 3090 * @pos: position in interleave 3091 * 3092 * Callers pass CXL_POS_ZERO when no position parameter needs validating. 3093 * 3094 * Returns: 0 on success, -EINVAL on first invalid parameter 3095 */ 3096 int cxl_validate_translation_params(u8 eiw, u16 eig, int pos) 3097 { 3098 int ways, gran; 3099 3100 if (eiw_to_ways(eiw, &ways)) { 3101 pr_debug("%s: invalid eiw=%u\n", __func__, eiw); 3102 return -EINVAL; 3103 } 3104 if (eig_to_granularity(eig, &gran)) { 3105 pr_debug("%s: invalid eig=%u\n", __func__, eig); 3106 return -EINVAL; 3107 } 3108 if (pos < 0 || pos >= ways) { 3109 pr_debug("%s: invalid pos=%d for ways=%d\n", __func__, pos, 3110 ways); 3111 return -EINVAL; 3112 } 3113 3114 return 0; 3115 } 3116 EXPORT_SYMBOL_FOR_MODULES(cxl_validate_translation_params, "cxl_translate"); 3117 3118 u64 cxl_calculate_dpa_offset(u64 hpa_offset, u8 eiw, u16 eig) 3119 { 3120 u64 dpa_offset, bits_lower, bits_upper, temp; 3121 int ret; 3122 3123 ret = cxl_validate_translation_params(eiw, eig, CXL_POS_ZERO); 3124 if (ret) 3125 return ULLONG_MAX; 3126 3127 /* 3128 * DPA offset: CXL Spec 3.2 Section 8.2.4.20.13 3129 * Lower bits [IG+7:0] pass through unchanged 3130 * (eiw < 8) 3131 * Per spec: DPAOffset[51:IG+8] = (HPAOffset[51:IG+IW+8] >> IW) 3132 * Clear the position bits to isolate upper section, then 3133 * reverse the left shift by eiw that occurred during DPA->HPA 3134 * (eiw >= 8) 3135 * Per spec: DPAOffset[51:IG+8] = HPAOffset[51:IG+IW] / 3 3136 * Extract upper bits from the correct bit range and divide by 3 3137 * to recover the original DPA upper bits 3138 */ 3139 bits_lower = hpa_offset & GENMASK_ULL(eig + 7, 0); 3140 if (eiw < 8) { 3141 temp = hpa_offset &= ~GENMASK_ULL(eig + eiw + 8 - 1, 0); 3142 dpa_offset = temp >> eiw; 3143 } else { 3144 bits_upper = div64_u64(hpa_offset >> (eig + eiw), 3); 3145 dpa_offset = bits_upper << (eig + 8); 3146 } 3147 dpa_offset |= bits_lower; 3148 3149 return dpa_offset; 3150 } 3151 EXPORT_SYMBOL_FOR_MODULES(cxl_calculate_dpa_offset, "cxl_translate"); 3152 3153 int cxl_calculate_position(u64 hpa_offset, u8 eiw, u16 eig) 3154 { 3155 int ways = 0; 3156 u64 shifted, rem; 3157 int pos, ret; 3158 3159 ret = cxl_validate_translation_params(eiw, eig, CXL_POS_ZERO); 3160 if (ret) 3161 return ret; 3162 3163 if (!eiw) 3164 /* position is 0 if no interleaving */ 3165 return 0; 3166 3167 /* 3168 * Interleave position: CXL Spec 3.2 Section 8.2.4.20.13 3169 * eiw < 8 3170 * Position is in the IW bits at HPA_OFFSET[IG+8+IW-1:IG+8]. 3171 * Per spec "remove IW bits starting with bit position IG+8" 3172 * eiw >= 8 3173 * Position is not explicitly stored in HPA_OFFSET bits. It is 3174 * derived from the modulo operation of the upper bits using 3175 * the total number of interleave ways. 3176 */ 3177 if (eiw < 8) { 3178 pos = (hpa_offset >> (eig + 8)) & GENMASK(eiw - 1, 0); 3179 } else { 3180 shifted = hpa_offset >> (eig + 8); 3181 eiw_to_ways(eiw, &ways); 3182 div64_u64_rem(shifted, ways, &rem); 3183 pos = rem; 3184 } 3185 3186 return pos; 3187 } 3188 EXPORT_SYMBOL_FOR_MODULES(cxl_calculate_position, "cxl_translate"); 3189 3190 u64 cxl_calculate_hpa_offset(u64 dpa_offset, int pos, u8 eiw, u16 eig) 3191 { 3192 u64 mask_upper, hpa_offset, bits_upper; 3193 int ret; 3194 3195 ret = cxl_validate_translation_params(eiw, eig, pos); 3196 if (ret) 3197 return ULLONG_MAX; 3198 3199 /* 3200 * The device position in the region interleave set was removed 3201 * from the offset at HPA->DPA translation. To reconstruct the 3202 * HPA, place the 'pos' in the offset. 3203 * 3204 * The placement of 'pos' in the HPA is determined by interleave 3205 * ways and granularity and is defined in the CXL Spec 3.0 Section 3206 * 8.2.4.19.13 Implementation Note: Device Decode Logic 3207 */ 3208 3209 mask_upper = GENMASK_ULL(51, eig + 8); 3210 3211 if (eiw < 8) { 3212 hpa_offset = (dpa_offset & mask_upper) << eiw; 3213 hpa_offset |= pos << (eig + 8); 3214 } else { 3215 bits_upper = (dpa_offset & mask_upper) >> (eig + 8); 3216 bits_upper = bits_upper * 3; 3217 hpa_offset = ((bits_upper << (eiw - 8)) + pos) << (eig + 8); 3218 } 3219 3220 /* The lower bits remain unchanged */ 3221 hpa_offset |= dpa_offset & GENMASK_ULL(eig + 7, 0); 3222 3223 return hpa_offset; 3224 } 3225 EXPORT_SYMBOL_FOR_MODULES(cxl_calculate_hpa_offset, "cxl_translate"); 3226 3227 static int decode_pos(int region_ways, int hb_ways, int pos, int *pos_port, 3228 int *pos_hb) 3229 { 3230 int devices_per_hb; 3231 3232 /* 3233 * Decode for 3-6-12 way interleaves as defined in the CXL 3234 * Spec 4.0 9.13.1.1 Legal Interleaving Configurations. 3235 * Region creation should prevent invalid combinations but 3236 * sanity check here to avoid a silent bad decode. 3237 */ 3238 switch (hb_ways) { 3239 case 3: 3240 if (region_ways != 3 && region_ways != 6 && region_ways != 12) 3241 return -EINVAL; 3242 break; 3243 case 6: 3244 if (region_ways != 6 && region_ways != 12) 3245 return -EINVAL; 3246 break; 3247 case 12: 3248 if (region_ways != 12) 3249 return -EINVAL; 3250 break; 3251 default: 3252 return -EINVAL; 3253 } 3254 /* 3255 * Each host bridge contributes an equal number of endpoints 3256 * that are laid out contiguously per host bridge. Modulo 3257 * selects the port within a host bridge and division selects 3258 * the host bridge position. 3259 */ 3260 devices_per_hb = region_ways / hb_ways; 3261 *pos_port = pos % devices_per_hb; 3262 *pos_hb = pos / devices_per_hb; 3263 3264 return 0; 3265 } 3266 3267 /* 3268 * restore_parent() reconstruct the address in parent 3269 * 3270 * This math, specifically the bitmask creation 'mask = gran - 1' relies 3271 * on the CXL Spec requirement that interleave granularity is always a 3272 * power of two. 3273 * 3274 * [mask] isolate the offset with the granularity 3275 * [addr & ~mask] remove the offset leaving the aligned portion 3276 * [* ways] distribute across all interleave ways 3277 * [+ (pos * gran)] add the positional offset 3278 * [+ (addr & mask)] restore the masked offset 3279 */ 3280 static u64 restore_parent(u64 addr, u64 pos, u64 gran, u64 ways) 3281 { 3282 u64 mask = gran - 1; 3283 3284 return ((addr & ~mask) * ways) + (pos * gran) + (addr & mask); 3285 } 3286 3287 /* 3288 * unaligned_dpa_to_hpa() translates a DPA to HPA when the region resource 3289 * start address is not aligned at Host Bridge Interleave Ways * 256MB. 3290 * 3291 * Unaligned start addresses only occur with MOD3 interleaves. All power- 3292 * of-two interleaves are guaranteed aligned. 3293 */ 3294 static u64 unaligned_dpa_to_hpa(struct cxl_decoder *cxld, 3295 struct cxl_region_params *p, int pos, u64 dpa) 3296 { 3297 int ways_port = p->interleave_ways / cxld->interleave_ways; 3298 int gran_port = p->interleave_granularity; 3299 int gran_hb = cxld->interleave_granularity; 3300 int ways_hb = cxld->interleave_ways; 3301 int pos_port, pos_hb, gran_shift; 3302 u64 hpa_port = 0; 3303 3304 /* Decode an endpoint 'pos' into port and host-bridge components */ 3305 if (decode_pos(p->interleave_ways, ways_hb, pos, &pos_port, &pos_hb)) { 3306 dev_dbg(&cxld->dev, "not supported for region ways:%d\n", 3307 p->interleave_ways); 3308 return ULLONG_MAX; 3309 } 3310 3311 /* Restore the port parent address if needed */ 3312 if (gran_hb != gran_port) 3313 hpa_port = restore_parent(dpa, pos_port, gran_port, ways_port); 3314 else 3315 hpa_port = dpa; 3316 3317 /* 3318 * Complete the HPA reconstruction by restoring the address as if 3319 * each HB position is a candidate. Test against expected pos_hb 3320 * to confirm match. 3321 */ 3322 gran_shift = ilog2(gran_hb); 3323 for (int position = 0; position < ways_hb; position++) { 3324 u64 shifted, hpa; 3325 3326 hpa = restore_parent(hpa_port, position, gran_hb, ways_hb); 3327 hpa += p->res->start; 3328 3329 shifted = hpa >> gran_shift; 3330 if (do_div(shifted, ways_hb) == pos_hb) 3331 return hpa; 3332 } 3333 3334 dev_dbg(&cxld->dev, "fail dpa:%#llx region:%pr pos:%d\n", dpa, p->res, 3335 pos); 3336 dev_dbg(&cxld->dev, " port-w/g/p:%d/%d/%d hb-w/g/p:%d/%d/%d\n", 3337 ways_port, gran_port, pos_port, ways_hb, gran_hb, pos_hb); 3338 3339 return ULLONG_MAX; 3340 } 3341 3342 static bool region_is_unaligned_mod3(struct cxl_region *cxlr) 3343 { 3344 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent); 3345 struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld; 3346 struct cxl_region_params *p = &cxlr->params; 3347 int hbiw = cxld->interleave_ways; 3348 u64 rem; 3349 3350 if (is_power_of_2(hbiw)) 3351 return false; 3352 3353 div64_u64_rem(p->res->start, (u64)hbiw * SZ_256M, &rem); 3354 3355 return (rem != 0); 3356 } 3357 3358 u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd, 3359 u64 dpa) 3360 { 3361 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 3362 struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld; 3363 struct cxl_region_params *p = &cxlr->params; 3364 struct cxl_endpoint_decoder *cxled = NULL; 3365 u64 base, dpa_offset, hpa_offset, hpa; 3366 bool unaligned = false; 3367 u16 eig = 0; 3368 u8 eiw = 0; 3369 int pos; 3370 3371 /* 3372 * Conversion between SPA and DPA is not supported in 3373 * Normalized Address mode. 3374 */ 3375 if (test_bit(CXL_REGION_F_NORMALIZED_ADDRESSING, &cxlr->flags)) 3376 return ULLONG_MAX; 3377 3378 for (int i = 0; i < p->nr_targets; i++) { 3379 if (cxlmd == cxled_to_memdev(p->targets[i])) { 3380 cxled = p->targets[i]; 3381 break; 3382 } 3383 } 3384 if (!cxled) 3385 return ULLONG_MAX; 3386 3387 base = cxl_dpa_resource_start(cxled); 3388 if (base == RESOURCE_SIZE_MAX) 3389 return ULLONG_MAX; 3390 3391 dpa_offset = dpa - base; 3392 3393 /* Unaligned calc for MOD3 interleaves not hbiw * 256MB aligned */ 3394 unaligned = region_is_unaligned_mod3(cxlr); 3395 if (unaligned) { 3396 hpa = unaligned_dpa_to_hpa(cxld, p, cxled->pos, dpa_offset); 3397 if (hpa == ULLONG_MAX) 3398 return ULLONG_MAX; 3399 3400 goto skip_aligned; 3401 } 3402 /* 3403 * Aligned calc for all power-of-2 interleaves and for MOD3 3404 * interleaves that are aligned at hbiw * 256MB 3405 */ 3406 pos = cxled->pos; 3407 ways_to_eiw(p->interleave_ways, &eiw); 3408 granularity_to_eig(p->interleave_granularity, &eig); 3409 3410 hpa_offset = cxl_calculate_hpa_offset(dpa_offset, pos, eiw, eig); 3411 if (hpa_offset == ULLONG_MAX) 3412 return ULLONG_MAX; 3413 3414 /* Apply the hpa_offset to the region base address */ 3415 hpa = hpa_offset + p->res->start; 3416 3417 skip_aligned: 3418 hpa += p->cache_size; 3419 3420 /* Root decoder translation overrides typical modulo decode */ 3421 if (cxlrd->ops.hpa_to_spa) 3422 hpa = cxlrd->ops.hpa_to_spa(cxlrd, hpa); 3423 3424 if (hpa == ULLONG_MAX) 3425 return ULLONG_MAX; 3426 3427 if (!cxl_resource_contains_addr(p->res, hpa)) { 3428 dev_dbg(&cxlr->dev, 3429 "Addr trans fail: hpa 0x%llx not in region\n", hpa); 3430 return ULLONG_MAX; 3431 } 3432 /* Chunk check applies to aligned modulo decodes only */ 3433 if (!unaligned && !cxlrd->ops.hpa_to_spa && 3434 !cxl_is_hpa_in_chunk(hpa, cxlr, pos)) 3435 return ULLONG_MAX; 3436 3437 return hpa; 3438 } 3439 3440 struct dpa_result { 3441 struct cxl_memdev *cxlmd; 3442 u64 dpa; 3443 }; 3444 3445 static int unaligned_region_offset_to_dpa_result(struct cxl_region *cxlr, 3446 u64 offset, 3447 struct dpa_result *result) 3448 { 3449 struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent); 3450 struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld; 3451 struct cxl_region_params *p = &cxlr->params; 3452 u64 interleave_width, interleave_index; 3453 u64 gran, gran_offset, dpa_offset; 3454 u64 hpa = p->res->start + offset; 3455 u64 tmp = offset; 3456 3457 /* 3458 * Unaligned addresses are not algebraically invertible. Calculate 3459 * a dpa_offset independent of the target device and then enumerate 3460 * and test that dpa_offset against each candidate endpoint decoder. 3461 */ 3462 gran = cxld->interleave_granularity; 3463 interleave_width = gran * cxld->interleave_ways; 3464 interleave_index = div64_u64(offset, interleave_width); 3465 gran_offset = do_div(tmp, gran); 3466 3467 dpa_offset = interleave_index * gran + gran_offset; 3468 3469 for (int i = 0; i < p->nr_targets; i++) { 3470 struct cxl_endpoint_decoder *cxled = p->targets[i]; 3471 int pos = cxled->pos; 3472 u64 test_hpa; 3473 3474 test_hpa = unaligned_dpa_to_hpa(cxld, p, pos, dpa_offset); 3475 if (test_hpa == hpa) { 3476 result->cxlmd = cxled_to_memdev(cxled); 3477 result->dpa = 3478 cxl_dpa_resource_start(cxled) + dpa_offset; 3479 return 0; 3480 } 3481 } 3482 dev_err(&cxlr->dev, 3483 "failed to resolve HPA %#llx in unaligned MOD3 region\n", hpa); 3484 3485 return -ENXIO; 3486 } 3487 3488 static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset, 3489 struct dpa_result *result) 3490 { 3491 struct cxl_region_params *p = &cxlr->params; 3492 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 3493 struct cxl_endpoint_decoder *cxled; 3494 u64 hpa_offset = offset; 3495 u64 dpa, dpa_offset; 3496 u16 eig = 0; 3497 u8 eiw = 0; 3498 int pos; 3499 3500 lockdep_assert_held(&cxl_rwsem.region); 3501 lockdep_assert_held(&cxl_rwsem.dpa); 3502 3503 /* Input validation ensures valid ways and gran */ 3504 granularity_to_eig(p->interleave_granularity, &eig); 3505 ways_to_eiw(p->interleave_ways, &eiw); 3506 3507 /* 3508 * If the root decoder has SPA to CXL HPA callback, use it. Otherwise 3509 * CXL HPA is assumed to equal SPA. 3510 */ 3511 if (cxlrd->ops.spa_to_hpa) { 3512 hpa_offset = cxlrd->ops.spa_to_hpa(cxlrd, p->res->start + offset); 3513 if (hpa_offset == ULLONG_MAX) { 3514 dev_dbg(&cxlr->dev, "HPA not found for %pr offset %#llx\n", 3515 p->res, offset); 3516 return -ENXIO; 3517 } 3518 hpa_offset -= p->res->start; 3519 } 3520 3521 if (region_is_unaligned_mod3(cxlr)) 3522 return unaligned_region_offset_to_dpa_result(cxlr, offset, 3523 result); 3524 3525 pos = cxl_calculate_position(hpa_offset, eiw, eig); 3526 if (pos < 0 || pos >= p->nr_targets) { 3527 dev_dbg(&cxlr->dev, "Invalid position %d for %d targets\n", 3528 pos, p->nr_targets); 3529 return -ENXIO; 3530 } 3531 3532 dpa_offset = cxl_calculate_dpa_offset(hpa_offset, eiw, eig); 3533 3534 /* Look-up and return the result: a memdev and a DPA */ 3535 for (int i = 0; i < p->nr_targets; i++) { 3536 cxled = p->targets[i]; 3537 if (cxled->pos != pos) 3538 continue; 3539 3540 dpa = cxl_dpa_resource_start(cxled); 3541 if (dpa != RESOURCE_SIZE_MAX) 3542 dpa += dpa_offset; 3543 3544 result->cxlmd = cxled_to_memdev(cxled); 3545 result->dpa = dpa; 3546 3547 return 0; 3548 } 3549 dev_err(&cxlr->dev, "No device found for position %d\n", pos); 3550 3551 return -ENXIO; 3552 } 3553 3554 static int match_root_decoder(struct device *dev, const void *data) 3555 { 3556 const struct range *r1, *r2 = data; 3557 struct cxl_root_decoder *cxlrd; 3558 3559 if (!is_root_decoder(dev)) 3560 return 0; 3561 3562 cxlrd = to_cxl_root_decoder(dev); 3563 r1 = &cxlrd->cxlsd.cxld.hpa_range; 3564 3565 return range_contains(r1, r2); 3566 } 3567 3568 static int cxl_root_setup_translation(struct cxl_root *cxl_root, 3569 struct cxl_region_context *ctx) 3570 { 3571 if (!cxl_root->ops.translation_setup_root) 3572 return 0; 3573 3574 return cxl_root->ops.translation_setup_root(cxl_root, ctx); 3575 } 3576 3577 /* 3578 * Note, when finished with the device, drop the reference with 3579 * put_device() or use the put_cxl_root_decoder helper. 3580 */ 3581 static struct cxl_root_decoder * 3582 get_cxl_root_decoder(struct cxl_endpoint_decoder *cxled, 3583 struct cxl_region_context *ctx) 3584 { 3585 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 3586 struct cxl_port *port = cxled_to_port(cxled); 3587 struct cxl_root *cxl_root __free(put_cxl_root) = find_cxl_root(port); 3588 struct device *cxlrd_dev; 3589 int rc; 3590 3591 /* 3592 * Adjust the endpoint's HPA range and interleaving 3593 * configuration to the root decoder’s memory space before 3594 * setting up the root decoder. 3595 */ 3596 rc = cxl_root_setup_translation(cxl_root, ctx); 3597 if (rc) { 3598 dev_err(cxlmd->dev.parent, 3599 "%s:%s Failed to setup translation for address range %#llx:%#llx\n", 3600 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 3601 ctx->hpa_range.start, ctx->hpa_range.end); 3602 return ERR_PTR(rc); 3603 } 3604 3605 cxlrd_dev = device_find_child(&cxl_root->port.dev, &ctx->hpa_range, 3606 match_root_decoder); 3607 if (!cxlrd_dev) { 3608 dev_err(cxlmd->dev.parent, 3609 "%s:%s no CXL window for range %#llx:%#llx\n", 3610 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 3611 ctx->hpa_range.start, ctx->hpa_range.end); 3612 return ERR_PTR(-ENXIO); 3613 } 3614 3615 return to_cxl_root_decoder(cxlrd_dev); 3616 } 3617 3618 static int match_region_by_range(struct device *dev, const void *data) 3619 { 3620 struct cxl_region_params *p; 3621 struct cxl_region *cxlr; 3622 const struct range *r = data; 3623 3624 if (!is_cxl_region(dev)) 3625 return 0; 3626 3627 cxlr = to_cxl_region(dev); 3628 p = &cxlr->params; 3629 3630 guard(rwsem_read)(&cxl_rwsem.region); 3631 return spa_maps_hpa(p, r); 3632 } 3633 3634 static int cxl_extended_linear_cache_resize(struct cxl_region *cxlr, 3635 struct resource *res) 3636 { 3637 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 3638 struct cxl_region_params *p = &cxlr->params; 3639 resource_size_t size = resource_size(res); 3640 resource_size_t cache_size, start; 3641 3642 cache_size = cxlrd->cache_size; 3643 if (!cache_size) 3644 return 0; 3645 3646 if (size != cache_size) { 3647 dev_warn(&cxlr->dev, 3648 "Extended Linear Cache size %pa != CXL size %pa. No Support!", 3649 &cache_size, &size); 3650 return -ENXIO; 3651 } 3652 3653 /* 3654 * Move the start of the range to where the cache range starts. The 3655 * implementation assumes that the cache range is in front of the 3656 * CXL range. This is not dictated by the HMAT spec but is how the 3657 * current known implementation is configured. 3658 * 3659 * The cache range is expected to be within the CFMWS. The adjusted 3660 * res->start should not be less than cxlrd->res->start. 3661 */ 3662 start = res->start - cache_size; 3663 if (start < cxlrd->res->start) 3664 return -ENXIO; 3665 3666 res->start = start; 3667 p->cache_size = cache_size; 3668 3669 return 0; 3670 } 3671 3672 static int __construct_region(struct cxl_region *cxlr, 3673 struct cxl_region_context *ctx) 3674 { 3675 struct cxl_endpoint_decoder *cxled = ctx->cxled; 3676 struct cxl_root_decoder *cxlrd = cxlr->cxlrd; 3677 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 3678 struct range *hpa_range = &ctx->hpa_range; 3679 struct cxl_region_params *p; 3680 struct resource *res; 3681 int rc; 3682 3683 guard(rwsem_write)(&cxl_rwsem.region); 3684 p = &cxlr->params; 3685 if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) { 3686 dev_err(cxlmd->dev.parent, 3687 "%s:%s: %s autodiscovery interrupted\n", 3688 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 3689 __func__); 3690 return -EBUSY; 3691 } 3692 3693 set_bit(CXL_REGION_F_AUTO, &cxlr->flags); 3694 cxlr->hpa_range = *hpa_range; 3695 3696 res = kmalloc_obj(*res); 3697 if (!res) 3698 return -ENOMEM; 3699 3700 *res = DEFINE_RES_MEM_NAMED(hpa_range->start, range_len(hpa_range), 3701 dev_name(&cxlr->dev)); 3702 3703 rc = cxl_extended_linear_cache_resize(cxlr, res); 3704 if (rc && rc != -EOPNOTSUPP) { 3705 /* 3706 * Failing to support extended linear cache region resize does not 3707 * prevent the region from functioning. Only causes cxl list showing 3708 * incorrect region size. 3709 */ 3710 dev_warn(cxlmd->dev.parent, 3711 "Extended linear cache calculation failed rc:%d\n", rc); 3712 } 3713 3714 rc = sysfs_update_group(&cxlr->dev.kobj, &cxl_region_group); 3715 if (rc) { 3716 kfree(res); 3717 return rc; 3718 } 3719 3720 rc = insert_resource(cxlrd->res, res); 3721 if (rc) { 3722 /* 3723 * Platform-firmware may not have split resources like "System 3724 * RAM" on CXL window boundaries see cxl_region_iomem_release() 3725 */ 3726 dev_warn(cxlmd->dev.parent, 3727 "%s:%s: %s %s cannot insert resource\n", 3728 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 3729 __func__, dev_name(&cxlr->dev)); 3730 } 3731 3732 p->res = res; 3733 p->interleave_ways = ctx->interleave_ways; 3734 p->interleave_granularity = ctx->interleave_granularity; 3735 p->state = CXL_CONFIG_INTERLEAVE_ACTIVE; 3736 3737 rc = sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_target_group()); 3738 if (rc) 3739 return rc; 3740 3741 dev_dbg(cxlmd->dev.parent, "%s:%s: %s %s res: %pr iw: %d ig: %d\n", 3742 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), __func__, 3743 dev_name(&cxlr->dev), p->res, p->interleave_ways, 3744 p->interleave_granularity); 3745 3746 /* ...to match put_device() in cxl_add_to_region() */ 3747 get_device(&cxlr->dev); 3748 3749 return 0; 3750 } 3751 3752 /* Establish an empty region covering the given HPA range */ 3753 static struct cxl_region *construct_region(struct cxl_root_decoder *cxlrd, 3754 struct cxl_region_context *ctx) 3755 { 3756 struct cxl_endpoint_decoder *cxled = ctx->cxled; 3757 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 3758 struct cxl_dev_state *cxlds = cxlmd->cxlds; 3759 int rc, part = READ_ONCE(cxled->part); 3760 struct cxl_region *cxlr; 3761 3762 if (part < 0) 3763 return ERR_PTR(-EBUSY); 3764 3765 do { 3766 cxlr = __create_region(cxlrd, cxlds->part[part].mode, 3767 atomic_read(&cxlrd->region_id), 3768 cxled->cxld.target_type); 3769 } while (IS_ERR(cxlr) && PTR_ERR(cxlr) == -EBUSY); 3770 3771 if (IS_ERR(cxlr)) { 3772 dev_err(cxlmd->dev.parent, 3773 "%s:%s: %s failed assign region: %pe\n", 3774 dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), 3775 __func__, cxlr); 3776 return cxlr; 3777 } 3778 3779 rc = __construct_region(cxlr, ctx); 3780 if (rc) { 3781 unregister_region(cxlr); 3782 return ERR_PTR(rc); 3783 } 3784 3785 return cxlr; 3786 } 3787 3788 static struct cxl_region * 3789 cxl_find_region_by_range(struct cxl_root_decoder *cxlrd, 3790 struct range *hpa_range) 3791 { 3792 struct device *region_dev; 3793 3794 region_dev = device_find_child(&cxlrd->cxlsd.cxld.dev, hpa_range, 3795 match_region_by_range); 3796 if (!region_dev) 3797 return NULL; 3798 3799 return to_cxl_region(region_dev); 3800 } 3801 3802 int cxl_add_to_region(struct cxl_endpoint_decoder *cxled) 3803 { 3804 struct cxl_region_context ctx; 3805 struct cxl_region_params *p; 3806 bool attach = false; 3807 int rc; 3808 3809 ctx = (struct cxl_region_context) { 3810 .cxled = cxled, 3811 .hpa_range = cxled->cxld.hpa_range, 3812 .interleave_ways = cxled->cxld.interleave_ways, 3813 .interleave_granularity = cxled->cxld.interleave_granularity, 3814 }; 3815 3816 struct cxl_root_decoder *cxlrd __free(put_cxl_root_decoder) = 3817 get_cxl_root_decoder(cxled, &ctx); 3818 3819 if (IS_ERR(cxlrd)) 3820 return PTR_ERR(cxlrd); 3821 3822 /* 3823 * Ensure that, if multiple threads race to construct_region() 3824 * for the HPA range, one does the construction and the others 3825 * add to that. 3826 */ 3827 guard(mutex)(&cxlrd->regions_lock); 3828 struct cxl_region *cxlr __free(put_cxl_region) = 3829 cxl_find_region_by_range(cxlrd, &ctx.hpa_range); 3830 if (!cxlr) 3831 cxlr = construct_region(cxlrd, &ctx); 3832 3833 rc = PTR_ERR_OR_ZERO(cxlr); 3834 if (rc) 3835 return rc; 3836 3837 attach_target(cxlr, cxled, -1, TASK_UNINTERRUPTIBLE); 3838 3839 scoped_guard(rwsem_read, &cxl_rwsem.region) { 3840 p = &cxlr->params; 3841 attach = p->state == CXL_CONFIG_COMMIT; 3842 } 3843 3844 if (attach) { 3845 /* 3846 * If device_attach() fails the range may still be active via 3847 * the platform-firmware memory map, otherwise the driver for 3848 * regions is local to this file, so driver matching can't fail. 3849 */ 3850 if (device_attach(&cxlr->dev) < 0) 3851 dev_err(&cxlr->dev, "failed to enable, range: %pr\n", 3852 p->res); 3853 } 3854 3855 return rc; 3856 } 3857 EXPORT_SYMBOL_NS_GPL(cxl_add_to_region, "CXL"); 3858 3859 static int is_system_ram(struct resource *res, void *arg) 3860 { 3861 struct cxl_region *cxlr = arg; 3862 struct cxl_region_params *p = &cxlr->params; 3863 3864 dev_dbg(&cxlr->dev, "%pr has System RAM: %pr\n", p->res, res); 3865 return 1; 3866 } 3867 3868 static void shutdown_notifiers(void *_cxlr) 3869 { 3870 struct cxl_region *cxlr = _cxlr; 3871 3872 unregister_node_notifier(&cxlr->node_notifier); 3873 unregister_mt_adistance_algorithm(&cxlr->adist_notifier); 3874 } 3875 3876 static void remove_debugfs(void *dentry) 3877 { 3878 debugfs_remove_recursive(dentry); 3879 } 3880 3881 static int validate_region_offset(struct cxl_region *cxlr, u64 offset) 3882 { 3883 struct cxl_region_params *p = &cxlr->params; 3884 resource_size_t region_size; 3885 u64 hpa; 3886 3887 if (offset < p->cache_size) { 3888 dev_err(&cxlr->dev, 3889 "Offset %#llx is within extended linear cache %pa\n", 3890 offset, &p->cache_size); 3891 return -EINVAL; 3892 } 3893 3894 region_size = resource_size(p->res); 3895 if (offset >= region_size) { 3896 dev_err(&cxlr->dev, "Offset %#llx exceeds region size %pa\n", 3897 offset, ®ion_size); 3898 return -EINVAL; 3899 } 3900 3901 hpa = p->res->start + offset; 3902 if (hpa < p->res->start || hpa > p->res->end) { 3903 dev_err(&cxlr->dev, "HPA %#llx not in region %pr\n", hpa, 3904 p->res); 3905 return -EINVAL; 3906 } 3907 3908 return 0; 3909 } 3910 3911 static int cxl_region_debugfs_poison_inject(void *data, u64 offset) 3912 { 3913 struct dpa_result result = { .dpa = ULLONG_MAX, .cxlmd = NULL }; 3914 struct cxl_region *cxlr = data; 3915 int rc; 3916 3917 ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); 3918 if ((rc = ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) 3919 return rc; 3920 3921 ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa); 3922 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem))) 3923 return rc; 3924 3925 if (validate_region_offset(cxlr, offset)) 3926 return -EINVAL; 3927 3928 offset -= cxlr->params.cache_size; 3929 rc = region_offset_to_dpa_result(cxlr, offset, &result); 3930 if (rc || !result.cxlmd || result.dpa == ULLONG_MAX) { 3931 dev_dbg(&cxlr->dev, 3932 "Failed to resolve DPA for region offset %#llx rc %d\n", 3933 offset, rc); 3934 3935 return rc ? rc : -EINVAL; 3936 } 3937 3938 return cxl_inject_poison_locked(result.cxlmd, result.dpa); 3939 } 3940 3941 DEFINE_DEBUGFS_ATTRIBUTE(cxl_poison_inject_fops, NULL, 3942 cxl_region_debugfs_poison_inject, "%llx\n"); 3943 3944 static int cxl_region_debugfs_poison_clear(void *data, u64 offset) 3945 { 3946 struct dpa_result result = { .dpa = ULLONG_MAX, .cxlmd = NULL }; 3947 struct cxl_region *cxlr = data; 3948 int rc; 3949 3950 ACQUIRE(rwsem_read_intr, region_rwsem)(&cxl_rwsem.region); 3951 if ((rc = ACQUIRE_ERR(rwsem_read_intr, ®ion_rwsem))) 3952 return rc; 3953 3954 ACQUIRE(rwsem_read_intr, dpa_rwsem)(&cxl_rwsem.dpa); 3955 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &dpa_rwsem))) 3956 return rc; 3957 3958 if (validate_region_offset(cxlr, offset)) 3959 return -EINVAL; 3960 3961 offset -= cxlr->params.cache_size; 3962 rc = region_offset_to_dpa_result(cxlr, offset, &result); 3963 if (rc || !result.cxlmd || result.dpa == ULLONG_MAX) { 3964 dev_dbg(&cxlr->dev, 3965 "Failed to resolve DPA for region offset %#llx rc %d\n", 3966 offset, rc); 3967 3968 return rc ? rc : -EINVAL; 3969 } 3970 3971 return cxl_clear_poison_locked(result.cxlmd, result.dpa); 3972 } 3973 3974 DEFINE_DEBUGFS_ATTRIBUTE(cxl_poison_clear_fops, NULL, 3975 cxl_region_debugfs_poison_clear, "%llx\n"); 3976 3977 static int cxl_region_setup_poison(struct cxl_region *cxlr) 3978 { 3979 struct device *dev = &cxlr->dev; 3980 struct cxl_region_params *p = &cxlr->params; 3981 struct dentry *dentry; 3982 3983 /* 3984 * Do not enable poison injection in Normalized Address mode. 3985 * Conversion between SPA and DPA is required for this, but it is 3986 * not supported in this mode. 3987 */ 3988 if (test_bit(CXL_REGION_F_NORMALIZED_ADDRESSING, &cxlr->flags)) 3989 return 0; 3990 3991 /* Create poison attributes if all memdevs support the capabilities */ 3992 for (int i = 0; i < p->nr_targets; i++) { 3993 struct cxl_endpoint_decoder *cxled = p->targets[i]; 3994 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 3995 3996 if (!cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_INJECT) || 3997 !cxl_memdev_has_poison_cmd(cxlmd, CXL_POISON_ENABLED_CLEAR)) 3998 return 0; 3999 } 4000 4001 dentry = cxl_debugfs_create_dir(dev_name(dev)); 4002 debugfs_create_file("inject_poison", 0200, dentry, cxlr, 4003 &cxl_poison_inject_fops); 4004 debugfs_create_file("clear_poison", 0200, dentry, cxlr, 4005 &cxl_poison_clear_fops); 4006 4007 return devm_add_action_or_reset(dev, remove_debugfs, dentry); 4008 } 4009 4010 static int region_contains_resource(struct device *dev, const void *data) 4011 { 4012 const struct resource *res = data; 4013 struct cxl_region *cxlr; 4014 struct cxl_region_params *p; 4015 4016 if (!is_cxl_region(dev)) 4017 return 0; 4018 4019 cxlr = to_cxl_region(dev); 4020 p = &cxlr->params; 4021 4022 if (p->state != CXL_CONFIG_COMMIT) 4023 return 0; 4024 4025 if (!p->res) 4026 return 0; 4027 4028 return resource_contains(p->res, res) ? 1 : 0; 4029 } 4030 4031 bool cxl_region_contains_resource(const struct resource *res) 4032 { 4033 guard(rwsem_read)(&cxl_rwsem.region); 4034 struct device *dev __free(put_device) = bus_find_device( 4035 &cxl_bus_type, NULL, res, region_contains_resource); 4036 return !!dev; 4037 } 4038 EXPORT_SYMBOL_FOR_MODULES(cxl_region_contains_resource, "dax_hmem"); 4039 4040 static int cxl_region_can_probe(struct cxl_region *cxlr) 4041 { 4042 struct cxl_region_params *p = &cxlr->params; 4043 int rc; 4044 4045 ACQUIRE(rwsem_read_intr, rwsem)(&cxl_rwsem.region); 4046 if ((rc = ACQUIRE_ERR(rwsem_read_intr, &rwsem))) { 4047 dev_dbg(&cxlr->dev, "probe interrupted\n"); 4048 return rc; 4049 } 4050 4051 if (p->state < CXL_CONFIG_COMMIT) { 4052 dev_dbg(&cxlr->dev, "config state: %d\n", p->state); 4053 return -ENXIO; 4054 } 4055 4056 if (test_bit(CXL_REGION_F_NEEDS_RESET, &cxlr->flags)) { 4057 dev_err(&cxlr->dev, 4058 "failed to activate, re-commit region and retry\n"); 4059 return -ENXIO; 4060 } 4061 4062 return 0; 4063 } 4064 4065 static int first_mapped_decoder(struct device *dev, const void *data) 4066 { 4067 struct cxl_endpoint_decoder *cxled; 4068 4069 if (!is_endpoint_decoder(dev)) 4070 return 0; 4071 4072 cxled = to_cxl_endpoint_decoder(dev); 4073 if (cxled->cxld.region) 4074 return 1; 4075 4076 return 0; 4077 } 4078 4079 /* 4080 * Runs in cxl_mem_probe context after successful endpoint probe, assumes the 4081 * simple case of single mapped decoder per memdev. 4082 */ 4083 int cxl_memdev_attach_region(struct cxl_memdev *cxlmd) 4084 { 4085 struct cxl_attach_region *attach = 4086 container_of(cxlmd->attach, typeof(*attach), attach); 4087 struct cxl_port *endpoint = cxlmd->endpoint; 4088 struct cxl_endpoint_decoder *cxled; 4089 struct cxl_region *cxlr; 4090 int rc; 4091 4092 /* hold endpoint lock to setup autoremove of the region */ 4093 guard(device)(&endpoint->dev); 4094 if (!endpoint->dev.driver) 4095 return -ENXIO; 4096 guard(rwsem_read)(&cxl_rwsem.region); 4097 guard(rwsem_read)(&cxl_rwsem.dpa); 4098 4099 /* 4100 * TODO auto-instantiate a region, for now assume this will find an 4101 * auto-region 4102 */ 4103 struct device *dev __free(put_device) = 4104 device_find_child(&endpoint->dev, NULL, first_mapped_decoder); 4105 4106 if (!dev) { 4107 dev_dbg(cxlmd->cxlds->dev, "no region found for memdev %s\n", 4108 dev_name(&cxlmd->dev)); 4109 return -ENXIO; 4110 } 4111 4112 cxled = to_cxl_endpoint_decoder(dev); 4113 cxlr = cxled->cxld.region; 4114 4115 if (cxlr->params.state < CXL_CONFIG_COMMIT) { 4116 dev_dbg(cxlmd->cxlds->dev, 4117 "region %s not committed for memdev %s\n", 4118 dev_name(&cxlr->dev), dev_name(&cxlmd->dev)); 4119 return -ENXIO; 4120 } 4121 4122 if (cxlr->params.nr_targets > 1) { 4123 dev_dbg(cxlmd->cxlds->dev, 4124 "Only attach to local non-interleaved region\n"); 4125 return -ENXIO; 4126 } 4127 4128 /* Only teardown regions that pass validation, ignore the rest */ 4129 get_device(&cxlr->dev); 4130 rc = devm_add_action_or_reset(&endpoint->dev, 4131 endpoint_unregister_region, cxlr); 4132 if (rc) 4133 return rc; 4134 4135 attach->hpa_range = (struct range) { 4136 .start = cxlr->params.res->start, 4137 .end = cxlr->params.res->end, 4138 }; 4139 return 0; 4140 } 4141 EXPORT_SYMBOL_FOR_MODULES(cxl_memdev_attach_region, "cxl_mem"); 4142 4143 /* 4144 * The presence of an attach method indicates that the region is designated for 4145 * a purpose outside of CXL core memory expansion defaults. 4146 */ 4147 static bool cxl_region_has_memdev_attach(struct cxl_region *cxlr) 4148 { 4149 struct cxl_region_params *p = &cxlr->params; 4150 4151 for (int i = 0; i < p->nr_targets; i++) { 4152 struct cxl_endpoint_decoder *cxled = p->targets[i]; 4153 struct cxl_memdev *cxlmd = cxled_to_memdev(cxled); 4154 4155 if (cxlmd->attach) 4156 return true; 4157 } 4158 4159 return false; 4160 } 4161 4162 static int cxl_region_probe(struct device *dev) 4163 { 4164 struct cxl_region *cxlr = to_cxl_region(dev); 4165 struct cxl_region_params *p = &cxlr->params; 4166 int rc; 4167 4168 rc = cxl_region_can_probe(cxlr); 4169 if (rc) 4170 return rc; 4171 4172 /* 4173 * From this point on any path that changes the region's state away from 4174 * CXL_CONFIG_COMMIT is also responsible for releasing the driver. 4175 */ 4176 4177 cxlr->node_notifier.notifier_call = cxl_region_perf_attrs_callback; 4178 cxlr->node_notifier.priority = CXL_CALLBACK_PRI; 4179 register_node_notifier(&cxlr->node_notifier); 4180 4181 cxlr->adist_notifier.notifier_call = cxl_region_calculate_adistance; 4182 cxlr->adist_notifier.priority = 100; 4183 register_mt_adistance_algorithm(&cxlr->adist_notifier); 4184 4185 rc = devm_add_action_or_reset(&cxlr->dev, shutdown_notifiers, cxlr); 4186 if (rc) 4187 return rc; 4188 4189 /* 4190 * Regions fronted by an extended linear cache need the MCE notifier to 4191 * offline the aliased page on a memory error. 4192 */ 4193 if (p->cache_size) { 4194 rc = devm_cxl_register_mce_notifier(&cxlr->dev, 4195 &cxlr->mce_notifier); 4196 if (rc == -EOPNOTSUPP) 4197 dev_warn(&cxlr->dev, 4198 "CONFIG_CXL_MCE disabled, MCE notifier not registered\n"); 4199 else if (rc) 4200 return rc; 4201 } 4202 4203 rc = cxl_region_setup_poison(cxlr); 4204 if (rc) 4205 return rc; 4206 4207 if (cxl_region_has_memdev_attach(cxlr)) 4208 return 0; 4209 4210 switch (cxlr->mode) { 4211 case CXL_PARTMODE_PMEM: 4212 rc = devm_cxl_region_edac_register(cxlr); 4213 if (rc) 4214 dev_dbg(&cxlr->dev, "CXL EDAC registration for region_id=%d failed\n", 4215 cxlr->id); 4216 4217 return devm_cxl_add_pmem_region(cxlr); 4218 case CXL_PARTMODE_RAM: 4219 rc = devm_cxl_region_edac_register(cxlr); 4220 if (rc) 4221 dev_dbg(&cxlr->dev, "CXL EDAC registration for region_id=%d failed\n", 4222 cxlr->id); 4223 4224 /* 4225 * The region can not be manged by CXL if any portion of 4226 * it is already online as 'System RAM' 4227 */ 4228 if (walk_iomem_res_desc(IORES_DESC_NONE, 4229 IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, 4230 p->res->start, p->res->end, cxlr, 4231 is_system_ram) > 0) 4232 return 0; 4233 return devm_cxl_add_dax_region(cxlr); 4234 default: 4235 dev_dbg(&cxlr->dev, "unsupported region mode: %d\n", 4236 cxlr->mode); 4237 return -ENXIO; 4238 } 4239 } 4240 4241 static struct cxl_driver cxl_region_driver = { 4242 .name = "cxl_region", 4243 .probe = cxl_region_probe, 4244 .id = CXL_DEVICE_REGION, 4245 }; 4246 4247 int cxl_region_init(void) 4248 { 4249 return cxl_driver_register(&cxl_region_driver); 4250 } 4251 4252 void cxl_region_exit(void) 4253 { 4254 cxl_driver_unregister(&cxl_region_driver); 4255 } 4256 4257 MODULE_IMPORT_NS("CXL"); 4258 MODULE_IMPORT_NS("DEVMEM"); 4259 MODULE_ALIAS_CXL(CXL_DEVICE_REGION); 4260