xref: /openbmc/linux/drivers/cxl/core/region.c (revision 8bc8824d)
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/device.h>
6 #include <linux/module.h>
7 #include <linux/slab.h>
8 #include <linux/uuid.h>
9 #include <linux/idr.h>
10 #include <cxlmem.h>
11 #include <cxl.h>
12 #include "core.h"
13 
14 /**
15  * DOC: cxl core region
16  *
17  * CXL Regions represent mapped memory capacity in system physical address
18  * space. Whereas the CXL Root Decoders identify the bounds of potential CXL
19  * Memory ranges, Regions represent the active mapped capacity by the HDM
20  * Decoder Capability structures throughout the Host Bridges, Switches, and
21  * Endpoints in the topology.
22  *
23  * Region configuration has ordering constraints. UUID may be set at any time
24  * but is only visible for persistent regions.
25  * 1. Interleave granularity
26  * 2. Interleave size
27  * 3. Decoder targets
28  */
29 
30 /*
31  * All changes to the interleave configuration occur with this lock held
32  * for write.
33  */
34 static DECLARE_RWSEM(cxl_region_rwsem);
35 
36 static struct cxl_region *to_cxl_region(struct device *dev);
37 
38 static ssize_t uuid_show(struct device *dev, struct device_attribute *attr,
39 			 char *buf)
40 {
41 	struct cxl_region *cxlr = to_cxl_region(dev);
42 	struct cxl_region_params *p = &cxlr->params;
43 	ssize_t rc;
44 
45 	rc = down_read_interruptible(&cxl_region_rwsem);
46 	if (rc)
47 		return rc;
48 	rc = sysfs_emit(buf, "%pUb\n", &p->uuid);
49 	up_read(&cxl_region_rwsem);
50 
51 	return rc;
52 }
53 
54 static int is_dup(struct device *match, void *data)
55 {
56 	struct cxl_region_params *p;
57 	struct cxl_region *cxlr;
58 	uuid_t *uuid = data;
59 
60 	if (!is_cxl_region(match))
61 		return 0;
62 
63 	lockdep_assert_held(&cxl_region_rwsem);
64 	cxlr = to_cxl_region(match);
65 	p = &cxlr->params;
66 
67 	if (uuid_equal(&p->uuid, uuid)) {
68 		dev_dbg(match, "already has uuid: %pUb\n", uuid);
69 		return -EBUSY;
70 	}
71 
72 	return 0;
73 }
74 
75 static ssize_t uuid_store(struct device *dev, struct device_attribute *attr,
76 			  const char *buf, size_t len)
77 {
78 	struct cxl_region *cxlr = to_cxl_region(dev);
79 	struct cxl_region_params *p = &cxlr->params;
80 	uuid_t temp;
81 	ssize_t rc;
82 
83 	if (len != UUID_STRING_LEN + 1)
84 		return -EINVAL;
85 
86 	rc = uuid_parse(buf, &temp);
87 	if (rc)
88 		return rc;
89 
90 	if (uuid_is_null(&temp))
91 		return -EINVAL;
92 
93 	rc = down_write_killable(&cxl_region_rwsem);
94 	if (rc)
95 		return rc;
96 
97 	if (uuid_equal(&p->uuid, &temp))
98 		goto out;
99 
100 	rc = -EBUSY;
101 	if (p->state >= CXL_CONFIG_ACTIVE)
102 		goto out;
103 
104 	rc = bus_for_each_dev(&cxl_bus_type, NULL, &temp, is_dup);
105 	if (rc < 0)
106 		goto out;
107 
108 	uuid_copy(&p->uuid, &temp);
109 out:
110 	up_write(&cxl_region_rwsem);
111 
112 	if (rc)
113 		return rc;
114 	return len;
115 }
116 static DEVICE_ATTR_RW(uuid);
117 
118 static struct cxl_region_ref *cxl_rr_load(struct cxl_port *port,
119 					  struct cxl_region *cxlr)
120 {
121 	return xa_load(&port->regions, (unsigned long)cxlr);
122 }
123 
124 static int cxl_region_decode_reset(struct cxl_region *cxlr, int count)
125 {
126 	struct cxl_region_params *p = &cxlr->params;
127 	int i;
128 
129 	for (i = count - 1; i >= 0; i--) {
130 		struct cxl_endpoint_decoder *cxled = p->targets[i];
131 		struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
132 		struct cxl_port *iter = cxled_to_port(cxled);
133 		struct cxl_ep *ep;
134 		int rc;
135 
136 		while (!is_cxl_root(to_cxl_port(iter->dev.parent)))
137 			iter = to_cxl_port(iter->dev.parent);
138 
139 		for (ep = cxl_ep_load(iter, cxlmd); iter;
140 		     iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) {
141 			struct cxl_region_ref *cxl_rr;
142 			struct cxl_decoder *cxld;
143 
144 			cxl_rr = cxl_rr_load(iter, cxlr);
145 			cxld = cxl_rr->decoder;
146 			rc = cxld->reset(cxld);
147 			if (rc)
148 				return rc;
149 		}
150 
151 		rc = cxled->cxld.reset(&cxled->cxld);
152 		if (rc)
153 			return rc;
154 	}
155 
156 	return 0;
157 }
158 
159 static int cxl_region_decode_commit(struct cxl_region *cxlr)
160 {
161 	struct cxl_region_params *p = &cxlr->params;
162 	int i, rc = 0;
163 
164 	for (i = 0; i < p->nr_targets; i++) {
165 		struct cxl_endpoint_decoder *cxled = p->targets[i];
166 		struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
167 		struct cxl_region_ref *cxl_rr;
168 		struct cxl_decoder *cxld;
169 		struct cxl_port *iter;
170 		struct cxl_ep *ep;
171 
172 		/* commit bottom up */
173 		for (iter = cxled_to_port(cxled); !is_cxl_root(iter);
174 		     iter = to_cxl_port(iter->dev.parent)) {
175 			cxl_rr = cxl_rr_load(iter, cxlr);
176 			cxld = cxl_rr->decoder;
177 			rc = cxld->commit(cxld);
178 			if (rc)
179 				break;
180 		}
181 
182 		if (rc) {
183 			/* programming @iter failed, teardown */
184 			for (ep = cxl_ep_load(iter, cxlmd); ep && iter;
185 			     iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) {
186 				cxl_rr = cxl_rr_load(iter, cxlr);
187 				cxld = cxl_rr->decoder;
188 				cxld->reset(cxld);
189 			}
190 
191 			cxled->cxld.reset(&cxled->cxld);
192 			goto err;
193 		}
194 	}
195 
196 	return 0;
197 
198 err:
199 	/* undo the targets that were successfully committed */
200 	cxl_region_decode_reset(cxlr, i);
201 	return rc;
202 }
203 
204 static ssize_t commit_store(struct device *dev, struct device_attribute *attr,
205 			    const char *buf, size_t len)
206 {
207 	struct cxl_region *cxlr = to_cxl_region(dev);
208 	struct cxl_region_params *p = &cxlr->params;
209 	bool commit;
210 	ssize_t rc;
211 
212 	rc = kstrtobool(buf, &commit);
213 	if (rc)
214 		return rc;
215 
216 	rc = down_write_killable(&cxl_region_rwsem);
217 	if (rc)
218 		return rc;
219 
220 	/* Already in the requested state? */
221 	if (commit && p->state >= CXL_CONFIG_COMMIT)
222 		goto out;
223 	if (!commit && p->state < CXL_CONFIG_COMMIT)
224 		goto out;
225 
226 	/* Not ready to commit? */
227 	if (commit && p->state < CXL_CONFIG_ACTIVE) {
228 		rc = -ENXIO;
229 		goto out;
230 	}
231 
232 	if (commit)
233 		rc = cxl_region_decode_commit(cxlr);
234 	else {
235 		p->state = CXL_CONFIG_RESET_PENDING;
236 		up_write(&cxl_region_rwsem);
237 		device_release_driver(&cxlr->dev);
238 		down_write(&cxl_region_rwsem);
239 
240 		/*
241 		 * The lock was dropped, so need to revalidate that the reset is
242 		 * still pending.
243 		 */
244 		if (p->state == CXL_CONFIG_RESET_PENDING)
245 			rc = cxl_region_decode_reset(cxlr, p->interleave_ways);
246 	}
247 
248 	if (rc)
249 		goto out;
250 
251 	if (commit)
252 		p->state = CXL_CONFIG_COMMIT;
253 	else if (p->state == CXL_CONFIG_RESET_PENDING)
254 		p->state = CXL_CONFIG_ACTIVE;
255 
256 out:
257 	up_write(&cxl_region_rwsem);
258 
259 	if (rc)
260 		return rc;
261 	return len;
262 }
263 
264 static ssize_t commit_show(struct device *dev, struct device_attribute *attr,
265 			   char *buf)
266 {
267 	struct cxl_region *cxlr = to_cxl_region(dev);
268 	struct cxl_region_params *p = &cxlr->params;
269 	ssize_t rc;
270 
271 	rc = down_read_interruptible(&cxl_region_rwsem);
272 	if (rc)
273 		return rc;
274 	rc = sysfs_emit(buf, "%d\n", p->state >= CXL_CONFIG_COMMIT);
275 	up_read(&cxl_region_rwsem);
276 
277 	return rc;
278 }
279 static DEVICE_ATTR_RW(commit);
280 
281 static umode_t cxl_region_visible(struct kobject *kobj, struct attribute *a,
282 				  int n)
283 {
284 	struct device *dev = kobj_to_dev(kobj);
285 	struct cxl_region *cxlr = to_cxl_region(dev);
286 
287 	if (a == &dev_attr_uuid.attr && cxlr->mode != CXL_DECODER_PMEM)
288 		return 0;
289 	return a->mode;
290 }
291 
292 static ssize_t interleave_ways_show(struct device *dev,
293 				    struct device_attribute *attr, char *buf)
294 {
295 	struct cxl_region *cxlr = to_cxl_region(dev);
296 	struct cxl_region_params *p = &cxlr->params;
297 	ssize_t rc;
298 
299 	rc = down_read_interruptible(&cxl_region_rwsem);
300 	if (rc)
301 		return rc;
302 	rc = sysfs_emit(buf, "%d\n", p->interleave_ways);
303 	up_read(&cxl_region_rwsem);
304 
305 	return rc;
306 }
307 
308 static const struct attribute_group *get_cxl_region_target_group(void);
309 
310 static ssize_t interleave_ways_store(struct device *dev,
311 				     struct device_attribute *attr,
312 				     const char *buf, size_t len)
313 {
314 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev->parent);
315 	struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld;
316 	struct cxl_region *cxlr = to_cxl_region(dev);
317 	struct cxl_region_params *p = &cxlr->params;
318 	unsigned int val, save;
319 	int rc;
320 	u8 iw;
321 
322 	rc = kstrtouint(buf, 0, &val);
323 	if (rc)
324 		return rc;
325 
326 	rc = ways_to_cxl(val, &iw);
327 	if (rc)
328 		return rc;
329 
330 	/*
331 	 * Even for x3, x9, and x12 interleaves the region interleave must be a
332 	 * power of 2 multiple of the host bridge interleave.
333 	 */
334 	if (!is_power_of_2(val / cxld->interleave_ways) ||
335 	    (val % cxld->interleave_ways)) {
336 		dev_dbg(&cxlr->dev, "invalid interleave: %d\n", val);
337 		return -EINVAL;
338 	}
339 
340 	rc = down_write_killable(&cxl_region_rwsem);
341 	if (rc)
342 		return rc;
343 	if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) {
344 		rc = -EBUSY;
345 		goto out;
346 	}
347 
348 	save = p->interleave_ways;
349 	p->interleave_ways = val;
350 	rc = sysfs_update_group(&cxlr->dev.kobj, get_cxl_region_target_group());
351 	if (rc)
352 		p->interleave_ways = save;
353 out:
354 	up_write(&cxl_region_rwsem);
355 	if (rc)
356 		return rc;
357 	return len;
358 }
359 static DEVICE_ATTR_RW(interleave_ways);
360 
361 static ssize_t interleave_granularity_show(struct device *dev,
362 					   struct device_attribute *attr,
363 					   char *buf)
364 {
365 	struct cxl_region *cxlr = to_cxl_region(dev);
366 	struct cxl_region_params *p = &cxlr->params;
367 	ssize_t rc;
368 
369 	rc = down_read_interruptible(&cxl_region_rwsem);
370 	if (rc)
371 		return rc;
372 	rc = sysfs_emit(buf, "%d\n", p->interleave_granularity);
373 	up_read(&cxl_region_rwsem);
374 
375 	return rc;
376 }
377 
378 static ssize_t interleave_granularity_store(struct device *dev,
379 					    struct device_attribute *attr,
380 					    const char *buf, size_t len)
381 {
382 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev->parent);
383 	struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld;
384 	struct cxl_region *cxlr = to_cxl_region(dev);
385 	struct cxl_region_params *p = &cxlr->params;
386 	int rc, val;
387 	u16 ig;
388 
389 	rc = kstrtoint(buf, 0, &val);
390 	if (rc)
391 		return rc;
392 
393 	rc = granularity_to_cxl(val, &ig);
394 	if (rc)
395 		return rc;
396 
397 	/*
398 	 * When the host-bridge is interleaved, disallow region granularity !=
399 	 * root granularity. Regions with a granularity less than the root
400 	 * interleave result in needing multiple endpoints to support a single
401 	 * slot in the interleave (possible to suport in the future). Regions
402 	 * with a granularity greater than the root interleave result in invalid
403 	 * DPA translations (invalid to support).
404 	 */
405 	if (cxld->interleave_ways > 1 && val != cxld->interleave_granularity)
406 		return -EINVAL;
407 
408 	rc = down_write_killable(&cxl_region_rwsem);
409 	if (rc)
410 		return rc;
411 	if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE) {
412 		rc = -EBUSY;
413 		goto out;
414 	}
415 
416 	p->interleave_granularity = val;
417 out:
418 	up_write(&cxl_region_rwsem);
419 	if (rc)
420 		return rc;
421 	return len;
422 }
423 static DEVICE_ATTR_RW(interleave_granularity);
424 
425 static ssize_t resource_show(struct device *dev, struct device_attribute *attr,
426 			     char *buf)
427 {
428 	struct cxl_region *cxlr = to_cxl_region(dev);
429 	struct cxl_region_params *p = &cxlr->params;
430 	u64 resource = -1ULL;
431 	ssize_t rc;
432 
433 	rc = down_read_interruptible(&cxl_region_rwsem);
434 	if (rc)
435 		return rc;
436 	if (p->res)
437 		resource = p->res->start;
438 	rc = sysfs_emit(buf, "%#llx\n", resource);
439 	up_read(&cxl_region_rwsem);
440 
441 	return rc;
442 }
443 static DEVICE_ATTR_RO(resource);
444 
445 static int alloc_hpa(struct cxl_region *cxlr, resource_size_t size)
446 {
447 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent);
448 	struct cxl_region_params *p = &cxlr->params;
449 	struct resource *res;
450 	u32 remainder = 0;
451 
452 	lockdep_assert_held_write(&cxl_region_rwsem);
453 
454 	/* Nothing to do... */
455 	if (p->res && resource_size(p->res) == size)
456 		return 0;
457 
458 	/* To change size the old size must be freed first */
459 	if (p->res)
460 		return -EBUSY;
461 
462 	if (p->state >= CXL_CONFIG_INTERLEAVE_ACTIVE)
463 		return -EBUSY;
464 
465 	/* ways, granularity and uuid (if PMEM) need to be set before HPA */
466 	if (!p->interleave_ways || !p->interleave_granularity ||
467 	    (cxlr->mode == CXL_DECODER_PMEM && uuid_is_null(&p->uuid)))
468 		return -ENXIO;
469 
470 	div_u64_rem(size, SZ_256M * p->interleave_ways, &remainder);
471 	if (remainder)
472 		return -EINVAL;
473 
474 	res = alloc_free_mem_region(cxlrd->res, size, SZ_256M,
475 				    dev_name(&cxlr->dev));
476 	if (IS_ERR(res)) {
477 		dev_dbg(&cxlr->dev, "failed to allocate HPA: %ld\n",
478 			PTR_ERR(res));
479 		return PTR_ERR(res);
480 	}
481 
482 	p->res = res;
483 	p->state = CXL_CONFIG_INTERLEAVE_ACTIVE;
484 
485 	return 0;
486 }
487 
488 static void cxl_region_iomem_release(struct cxl_region *cxlr)
489 {
490 	struct cxl_region_params *p = &cxlr->params;
491 
492 	if (device_is_registered(&cxlr->dev))
493 		lockdep_assert_held_write(&cxl_region_rwsem);
494 	if (p->res) {
495 		remove_resource(p->res);
496 		kfree(p->res);
497 		p->res = NULL;
498 	}
499 }
500 
501 static int free_hpa(struct cxl_region *cxlr)
502 {
503 	struct cxl_region_params *p = &cxlr->params;
504 
505 	lockdep_assert_held_write(&cxl_region_rwsem);
506 
507 	if (!p->res)
508 		return 0;
509 
510 	if (p->state >= CXL_CONFIG_ACTIVE)
511 		return -EBUSY;
512 
513 	cxl_region_iomem_release(cxlr);
514 	p->state = CXL_CONFIG_IDLE;
515 	return 0;
516 }
517 
518 static ssize_t size_store(struct device *dev, struct device_attribute *attr,
519 			  const char *buf, size_t len)
520 {
521 	struct cxl_region *cxlr = to_cxl_region(dev);
522 	u64 val;
523 	int rc;
524 
525 	rc = kstrtou64(buf, 0, &val);
526 	if (rc)
527 		return rc;
528 
529 	rc = down_write_killable(&cxl_region_rwsem);
530 	if (rc)
531 		return rc;
532 
533 	if (val)
534 		rc = alloc_hpa(cxlr, val);
535 	else
536 		rc = free_hpa(cxlr);
537 	up_write(&cxl_region_rwsem);
538 
539 	if (rc)
540 		return rc;
541 
542 	return len;
543 }
544 
545 static ssize_t size_show(struct device *dev, struct device_attribute *attr,
546 			 char *buf)
547 {
548 	struct cxl_region *cxlr = to_cxl_region(dev);
549 	struct cxl_region_params *p = &cxlr->params;
550 	u64 size = 0;
551 	ssize_t rc;
552 
553 	rc = down_read_interruptible(&cxl_region_rwsem);
554 	if (rc)
555 		return rc;
556 	if (p->res)
557 		size = resource_size(p->res);
558 	rc = sysfs_emit(buf, "%#llx\n", size);
559 	up_read(&cxl_region_rwsem);
560 
561 	return rc;
562 }
563 static DEVICE_ATTR_RW(size);
564 
565 static struct attribute *cxl_region_attrs[] = {
566 	&dev_attr_uuid.attr,
567 	&dev_attr_commit.attr,
568 	&dev_attr_interleave_ways.attr,
569 	&dev_attr_interleave_granularity.attr,
570 	&dev_attr_resource.attr,
571 	&dev_attr_size.attr,
572 	NULL,
573 };
574 
575 static const struct attribute_group cxl_region_group = {
576 	.attrs = cxl_region_attrs,
577 	.is_visible = cxl_region_visible,
578 };
579 
580 static size_t show_targetN(struct cxl_region *cxlr, char *buf, int pos)
581 {
582 	struct cxl_region_params *p = &cxlr->params;
583 	struct cxl_endpoint_decoder *cxled;
584 	int rc;
585 
586 	rc = down_read_interruptible(&cxl_region_rwsem);
587 	if (rc)
588 		return rc;
589 
590 	if (pos >= p->interleave_ways) {
591 		dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos,
592 			p->interleave_ways);
593 		rc = -ENXIO;
594 		goto out;
595 	}
596 
597 	cxled = p->targets[pos];
598 	if (!cxled)
599 		rc = sysfs_emit(buf, "\n");
600 	else
601 		rc = sysfs_emit(buf, "%s\n", dev_name(&cxled->cxld.dev));
602 out:
603 	up_read(&cxl_region_rwsem);
604 
605 	return rc;
606 }
607 
608 static int match_free_decoder(struct device *dev, void *data)
609 {
610 	struct cxl_decoder *cxld;
611 	int *id = data;
612 
613 	if (!is_switch_decoder(dev))
614 		return 0;
615 
616 	cxld = to_cxl_decoder(dev);
617 
618 	/* enforce ordered allocation */
619 	if (cxld->id != *id)
620 		return 0;
621 
622 	if (!cxld->region)
623 		return 1;
624 
625 	(*id)++;
626 
627 	return 0;
628 }
629 
630 static struct cxl_decoder *cxl_region_find_decoder(struct cxl_port *port,
631 						   struct cxl_region *cxlr)
632 {
633 	struct device *dev;
634 	int id = 0;
635 
636 	dev = device_find_child(&port->dev, &id, match_free_decoder);
637 	if (!dev)
638 		return NULL;
639 	/*
640 	 * This decoder is pinned registered as long as the endpoint decoder is
641 	 * registered, and endpoint decoder unregistration holds the
642 	 * cxl_region_rwsem over unregister events, so no need to hold on to
643 	 * this extra reference.
644 	 */
645 	put_device(dev);
646 	return to_cxl_decoder(dev);
647 }
648 
649 static struct cxl_region_ref *alloc_region_ref(struct cxl_port *port,
650 					       struct cxl_region *cxlr)
651 {
652 	struct cxl_region_params *p = &cxlr->params;
653 	struct cxl_region_ref *cxl_rr, *iter;
654 	unsigned long index;
655 	int rc;
656 
657 	xa_for_each(&port->regions, index, iter) {
658 		struct cxl_region_params *ip = &iter->region->params;
659 
660 		if (ip->res->start > p->res->start) {
661 			dev_dbg(&cxlr->dev,
662 				"%s: HPA order violation %s:%pr vs %pr\n",
663 				dev_name(&port->dev),
664 				dev_name(&iter->region->dev), ip->res, p->res);
665 			return ERR_PTR(-EBUSY);
666 		}
667 	}
668 
669 	cxl_rr = kzalloc(sizeof(*cxl_rr), GFP_KERNEL);
670 	if (!cxl_rr)
671 		return ERR_PTR(-ENOMEM);
672 	cxl_rr->port = port;
673 	cxl_rr->region = cxlr;
674 	cxl_rr->nr_targets = 1;
675 	xa_init(&cxl_rr->endpoints);
676 
677 	rc = xa_insert(&port->regions, (unsigned long)cxlr, cxl_rr, GFP_KERNEL);
678 	if (rc) {
679 		dev_dbg(&cxlr->dev,
680 			"%s: failed to track region reference: %d\n",
681 			dev_name(&port->dev), rc);
682 		kfree(cxl_rr);
683 		return ERR_PTR(rc);
684 	}
685 
686 	return cxl_rr;
687 }
688 
689 static void free_region_ref(struct cxl_region_ref *cxl_rr)
690 {
691 	struct cxl_port *port = cxl_rr->port;
692 	struct cxl_region *cxlr = cxl_rr->region;
693 	struct cxl_decoder *cxld = cxl_rr->decoder;
694 
695 	dev_WARN_ONCE(&cxlr->dev, cxld->region != cxlr, "region mismatch\n");
696 	if (cxld->region == cxlr) {
697 		cxld->region = NULL;
698 		put_device(&cxlr->dev);
699 	}
700 
701 	xa_erase(&port->regions, (unsigned long)cxlr);
702 	xa_destroy(&cxl_rr->endpoints);
703 	kfree(cxl_rr);
704 }
705 
706 static int cxl_rr_ep_add(struct cxl_region_ref *cxl_rr,
707 			 struct cxl_endpoint_decoder *cxled)
708 {
709 	int rc;
710 	struct cxl_port *port = cxl_rr->port;
711 	struct cxl_region *cxlr = cxl_rr->region;
712 	struct cxl_decoder *cxld = cxl_rr->decoder;
713 	struct cxl_ep *ep = cxl_ep_load(port, cxled_to_memdev(cxled));
714 
715 	if (ep) {
716 		rc = xa_insert(&cxl_rr->endpoints, (unsigned long)cxled, ep,
717 			       GFP_KERNEL);
718 		if (rc)
719 			return rc;
720 	}
721 	cxl_rr->nr_eps++;
722 
723 	if (!cxld->region) {
724 		cxld->region = cxlr;
725 		get_device(&cxlr->dev);
726 	}
727 
728 	return 0;
729 }
730 
731 /**
732  * cxl_port_attach_region() - track a region's interest in a port by endpoint
733  * @port: port to add a new region reference 'struct cxl_region_ref'
734  * @cxlr: region to attach to @port
735  * @cxled: endpoint decoder used to create or further pin a region reference
736  * @pos: interleave position of @cxled in @cxlr
737  *
738  * The attach event is an opportunity to validate CXL decode setup
739  * constraints and record metadata needed for programming HDM decoders,
740  * in particular decoder target lists.
741  *
742  * The steps are:
743  *
744  * - validate that there are no other regions with a higher HPA already
745  *   associated with @port
746  * - establish a region reference if one is not already present
747  *
748  *   - additionally allocate a decoder instance that will host @cxlr on
749  *     @port
750  *
751  * - pin the region reference by the endpoint
752  * - account for how many entries in @port's target list are needed to
753  *   cover all of the added endpoints.
754  */
755 static int cxl_port_attach_region(struct cxl_port *port,
756 				  struct cxl_region *cxlr,
757 				  struct cxl_endpoint_decoder *cxled, int pos)
758 {
759 	struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
760 	struct cxl_ep *ep = cxl_ep_load(port, cxlmd);
761 	struct cxl_region_ref *cxl_rr;
762 	bool nr_targets_inc = false;
763 	struct cxl_decoder *cxld;
764 	unsigned long index;
765 	int rc = -EBUSY;
766 
767 	lockdep_assert_held_write(&cxl_region_rwsem);
768 
769 	cxl_rr = cxl_rr_load(port, cxlr);
770 	if (cxl_rr) {
771 		struct cxl_ep *ep_iter;
772 		int found = 0;
773 
774 		/*
775 		 * Walk the existing endpoints that have been attached to
776 		 * @cxlr at @port and see if they share the same 'next' port
777 		 * in the downstream direction. I.e. endpoints that share common
778 		 * upstream switch.
779 		 */
780 		xa_for_each(&cxl_rr->endpoints, index, ep_iter) {
781 			if (ep_iter == ep)
782 				continue;
783 			if (ep_iter->next == ep->next) {
784 				found++;
785 				break;
786 			}
787 		}
788 
789 		/*
790 		 * New target port, or @port is an endpoint port that always
791 		 * accounts its own local decode as a target.
792 		 */
793 		if (!found || !ep->next) {
794 			cxl_rr->nr_targets++;
795 			nr_targets_inc = true;
796 		}
797 
798 		/*
799 		 * The decoder for @cxlr was allocated when the region was first
800 		 * attached to @port.
801 		 */
802 		cxld = cxl_rr->decoder;
803 	} else {
804 		cxl_rr = alloc_region_ref(port, cxlr);
805 		if (IS_ERR(cxl_rr)) {
806 			dev_dbg(&cxlr->dev,
807 				"%s: failed to allocate region reference\n",
808 				dev_name(&port->dev));
809 			return PTR_ERR(cxl_rr);
810 		}
811 		nr_targets_inc = true;
812 
813 		if (port == cxled_to_port(cxled))
814 			cxld = &cxled->cxld;
815 		else
816 			cxld = cxl_region_find_decoder(port, cxlr);
817 		if (!cxld) {
818 			dev_dbg(&cxlr->dev, "%s: no decoder available\n",
819 				dev_name(&port->dev));
820 			goto out_erase;
821 		}
822 
823 		if (cxld->region) {
824 			dev_dbg(&cxlr->dev, "%s: %s already attached to %s\n",
825 				dev_name(&port->dev), dev_name(&cxld->dev),
826 				dev_name(&cxld->region->dev));
827 			rc = -EBUSY;
828 			goto out_erase;
829 		}
830 
831 		cxl_rr->decoder = cxld;
832 	}
833 
834 	rc = cxl_rr_ep_add(cxl_rr, cxled);
835 	if (rc) {
836 		dev_dbg(&cxlr->dev,
837 			"%s: failed to track endpoint %s:%s reference\n",
838 			dev_name(&port->dev), dev_name(&cxlmd->dev),
839 			dev_name(&cxld->dev));
840 		goto out_erase;
841 	}
842 
843 	dev_dbg(&cxlr->dev,
844 		"%s:%s %s add: %s:%s @ %d next: %s nr_eps: %d nr_targets: %d\n",
845 		dev_name(port->uport), dev_name(&port->dev),
846 		dev_name(&cxld->dev), dev_name(&cxlmd->dev),
847 		dev_name(&cxled->cxld.dev), pos,
848 		ep ? ep->next ? dev_name(ep->next->uport) :
849 				      dev_name(&cxlmd->dev) :
850 			   "none",
851 		cxl_rr->nr_eps, cxl_rr->nr_targets);
852 
853 	return 0;
854 out_erase:
855 	if (nr_targets_inc)
856 		cxl_rr->nr_targets--;
857 	if (cxl_rr->nr_eps == 0)
858 		free_region_ref(cxl_rr);
859 	return rc;
860 }
861 
862 static void cxl_port_detach_region(struct cxl_port *port,
863 				   struct cxl_region *cxlr,
864 				   struct cxl_endpoint_decoder *cxled)
865 {
866 	struct cxl_region_ref *cxl_rr;
867 	struct cxl_ep *ep = NULL;
868 
869 	lockdep_assert_held_write(&cxl_region_rwsem);
870 
871 	cxl_rr = cxl_rr_load(port, cxlr);
872 	if (!cxl_rr)
873 		return;
874 
875 	/*
876 	 * Endpoint ports do not carry cxl_ep references, and they
877 	 * never target more than one endpoint by definition
878 	 */
879 	if (cxl_rr->decoder == &cxled->cxld)
880 		cxl_rr->nr_eps--;
881 	else
882 		ep = xa_erase(&cxl_rr->endpoints, (unsigned long)cxled);
883 	if (ep) {
884 		struct cxl_ep *ep_iter;
885 		unsigned long index;
886 		int found = 0;
887 
888 		cxl_rr->nr_eps--;
889 		xa_for_each(&cxl_rr->endpoints, index, ep_iter) {
890 			if (ep_iter->next == ep->next) {
891 				found++;
892 				break;
893 			}
894 		}
895 		if (!found)
896 			cxl_rr->nr_targets--;
897 	}
898 
899 	if (cxl_rr->nr_eps == 0)
900 		free_region_ref(cxl_rr);
901 }
902 
903 static int check_last_peer(struct cxl_endpoint_decoder *cxled,
904 			   struct cxl_ep *ep, struct cxl_region_ref *cxl_rr,
905 			   int distance)
906 {
907 	struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
908 	struct cxl_region *cxlr = cxl_rr->region;
909 	struct cxl_region_params *p = &cxlr->params;
910 	struct cxl_endpoint_decoder *cxled_peer;
911 	struct cxl_port *port = cxl_rr->port;
912 	struct cxl_memdev *cxlmd_peer;
913 	struct cxl_ep *ep_peer;
914 	int pos = cxled->pos;
915 
916 	/*
917 	 * If this position wants to share a dport with the last endpoint mapped
918 	 * then that endpoint, at index 'position - distance', must also be
919 	 * mapped by this dport.
920 	 */
921 	if (pos < distance) {
922 		dev_dbg(&cxlr->dev, "%s:%s: cannot host %s:%s at %d\n",
923 			dev_name(port->uport), dev_name(&port->dev),
924 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos);
925 		return -ENXIO;
926 	}
927 	cxled_peer = p->targets[pos - distance];
928 	cxlmd_peer = cxled_to_memdev(cxled_peer);
929 	ep_peer = cxl_ep_load(port, cxlmd_peer);
930 	if (ep->dport != ep_peer->dport) {
931 		dev_dbg(&cxlr->dev,
932 			"%s:%s: %s:%s pos %d mismatched peer %s:%s\n",
933 			dev_name(port->uport), dev_name(&port->dev),
934 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos,
935 			dev_name(&cxlmd_peer->dev),
936 			dev_name(&cxled_peer->cxld.dev));
937 		return -ENXIO;
938 	}
939 
940 	return 0;
941 }
942 
943 static int cxl_port_setup_targets(struct cxl_port *port,
944 				  struct cxl_region *cxlr,
945 				  struct cxl_endpoint_decoder *cxled)
946 {
947 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent);
948 	int parent_iw, parent_ig, ig, iw, rc, inc = 0, pos = cxled->pos;
949 	struct cxl_port *parent_port = to_cxl_port(port->dev.parent);
950 	struct cxl_region_ref *cxl_rr = cxl_rr_load(port, cxlr);
951 	struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
952 	struct cxl_ep *ep = cxl_ep_load(port, cxlmd);
953 	struct cxl_region_params *p = &cxlr->params;
954 	struct cxl_decoder *cxld = cxl_rr->decoder;
955 	struct cxl_switch_decoder *cxlsd;
956 	u16 eig, peig;
957 	u8 eiw, peiw;
958 
959 	/*
960 	 * While root level decoders support x3, x6, x12, switch level
961 	 * decoders only support powers of 2 up to x16.
962 	 */
963 	if (!is_power_of_2(cxl_rr->nr_targets)) {
964 		dev_dbg(&cxlr->dev, "%s:%s: invalid target count %d\n",
965 			dev_name(port->uport), dev_name(&port->dev),
966 			cxl_rr->nr_targets);
967 		return -EINVAL;
968 	}
969 
970 	cxlsd = to_cxl_switch_decoder(&cxld->dev);
971 	if (cxl_rr->nr_targets_set) {
972 		int i, distance;
973 
974 		distance = p->nr_targets / cxl_rr->nr_targets;
975 		for (i = 0; i < cxl_rr->nr_targets_set; i++)
976 			if (ep->dport == cxlsd->target[i]) {
977 				rc = check_last_peer(cxled, ep, cxl_rr,
978 						     distance);
979 				if (rc)
980 					return rc;
981 				goto out_target_set;
982 			}
983 		goto add_target;
984 	}
985 
986 	if (is_cxl_root(parent_port)) {
987 		parent_ig = cxlrd->cxlsd.cxld.interleave_granularity;
988 		parent_iw = cxlrd->cxlsd.cxld.interleave_ways;
989 		/*
990 		 * For purposes of address bit routing, use power-of-2 math for
991 		 * switch ports.
992 		 */
993 		if (!is_power_of_2(parent_iw))
994 			parent_iw /= 3;
995 	} else {
996 		struct cxl_region_ref *parent_rr;
997 		struct cxl_decoder *parent_cxld;
998 
999 		parent_rr = cxl_rr_load(parent_port, cxlr);
1000 		parent_cxld = parent_rr->decoder;
1001 		parent_ig = parent_cxld->interleave_granularity;
1002 		parent_iw = parent_cxld->interleave_ways;
1003 	}
1004 
1005 	rc = granularity_to_cxl(parent_ig, &peig);
1006 	if (rc) {
1007 		dev_dbg(&cxlr->dev, "%s:%s: invalid parent granularity: %d\n",
1008 			dev_name(parent_port->uport),
1009 			dev_name(&parent_port->dev), parent_ig);
1010 		return rc;
1011 	}
1012 
1013 	rc = ways_to_cxl(parent_iw, &peiw);
1014 	if (rc) {
1015 		dev_dbg(&cxlr->dev, "%s:%s: invalid parent interleave: %d\n",
1016 			dev_name(parent_port->uport),
1017 			dev_name(&parent_port->dev), parent_iw);
1018 		return rc;
1019 	}
1020 
1021 	iw = cxl_rr->nr_targets;
1022 	rc = ways_to_cxl(iw, &eiw);
1023 	if (rc) {
1024 		dev_dbg(&cxlr->dev, "%s:%s: invalid port interleave: %d\n",
1025 			dev_name(port->uport), dev_name(&port->dev), iw);
1026 		return rc;
1027 	}
1028 
1029 	/*
1030 	 * If @parent_port is masking address bits, pick the next unused address
1031 	 * bit to route @port's targets.
1032 	 */
1033 	if (parent_iw > 1 && cxl_rr->nr_targets > 1) {
1034 		u32 address_bit = max(peig + peiw, eiw + peig);
1035 
1036 		eig = address_bit - eiw + 1;
1037 	} else {
1038 		eiw = peiw;
1039 		eig = peig;
1040 	}
1041 
1042 	rc = cxl_to_granularity(eig, &ig);
1043 	if (rc) {
1044 		dev_dbg(&cxlr->dev, "%s:%s: invalid interleave: %d\n",
1045 			dev_name(port->uport), dev_name(&port->dev),
1046 			256 << eig);
1047 		return rc;
1048 	}
1049 
1050 	cxld->interleave_ways = iw;
1051 	cxld->interleave_granularity = ig;
1052 	cxld->hpa_range = (struct range) {
1053 		.start = p->res->start,
1054 		.end = p->res->end,
1055 	};
1056 	dev_dbg(&cxlr->dev, "%s:%s iw: %d ig: %d\n", dev_name(port->uport),
1057 		dev_name(&port->dev), iw, ig);
1058 add_target:
1059 	if (cxl_rr->nr_targets_set == cxl_rr->nr_targets) {
1060 		dev_dbg(&cxlr->dev,
1061 			"%s:%s: targets full trying to add %s:%s at %d\n",
1062 			dev_name(port->uport), dev_name(&port->dev),
1063 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos);
1064 		return -ENXIO;
1065 	}
1066 	cxlsd->target[cxl_rr->nr_targets_set] = ep->dport;
1067 	inc = 1;
1068 out_target_set:
1069 	cxl_rr->nr_targets_set += inc;
1070 	dev_dbg(&cxlr->dev, "%s:%s target[%d] = %s for %s:%s @ %d\n",
1071 		dev_name(port->uport), dev_name(&port->dev),
1072 		cxl_rr->nr_targets_set - 1, dev_name(ep->dport->dport),
1073 		dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev), pos);
1074 
1075 	return 0;
1076 }
1077 
1078 static void cxl_port_reset_targets(struct cxl_port *port,
1079 				   struct cxl_region *cxlr)
1080 {
1081 	struct cxl_region_ref *cxl_rr = cxl_rr_load(port, cxlr);
1082 	struct cxl_decoder *cxld;
1083 
1084 	/*
1085 	 * After the last endpoint has been detached the entire cxl_rr may now
1086 	 * be gone.
1087 	 */
1088 	if (!cxl_rr)
1089 		return;
1090 	cxl_rr->nr_targets_set = 0;
1091 
1092 	cxld = cxl_rr->decoder;
1093 	cxld->hpa_range = (struct range) {
1094 		.start = 0,
1095 		.end = -1,
1096 	};
1097 }
1098 
1099 static void cxl_region_teardown_targets(struct cxl_region *cxlr)
1100 {
1101 	struct cxl_region_params *p = &cxlr->params;
1102 	struct cxl_endpoint_decoder *cxled;
1103 	struct cxl_memdev *cxlmd;
1104 	struct cxl_port *iter;
1105 	struct cxl_ep *ep;
1106 	int i;
1107 
1108 	for (i = 0; i < p->nr_targets; i++) {
1109 		cxled = p->targets[i];
1110 		cxlmd = cxled_to_memdev(cxled);
1111 
1112 		iter = cxled_to_port(cxled);
1113 		while (!is_cxl_root(to_cxl_port(iter->dev.parent)))
1114 			iter = to_cxl_port(iter->dev.parent);
1115 
1116 		for (ep = cxl_ep_load(iter, cxlmd); iter;
1117 		     iter = ep->next, ep = cxl_ep_load(iter, cxlmd))
1118 			cxl_port_reset_targets(iter, cxlr);
1119 	}
1120 }
1121 
1122 static int cxl_region_setup_targets(struct cxl_region *cxlr)
1123 {
1124 	struct cxl_region_params *p = &cxlr->params;
1125 	struct cxl_endpoint_decoder *cxled;
1126 	struct cxl_memdev *cxlmd;
1127 	struct cxl_port *iter;
1128 	struct cxl_ep *ep;
1129 	int i, rc;
1130 
1131 	for (i = 0; i < p->nr_targets; i++) {
1132 		cxled = p->targets[i];
1133 		cxlmd = cxled_to_memdev(cxled);
1134 
1135 		iter = cxled_to_port(cxled);
1136 		while (!is_cxl_root(to_cxl_port(iter->dev.parent)))
1137 			iter = to_cxl_port(iter->dev.parent);
1138 
1139 		/*
1140 		 * Descend the topology tree programming targets while
1141 		 * looking for conflicts.
1142 		 */
1143 		for (ep = cxl_ep_load(iter, cxlmd); iter;
1144 		     iter = ep->next, ep = cxl_ep_load(iter, cxlmd)) {
1145 			rc = cxl_port_setup_targets(iter, cxlr, cxled);
1146 			if (rc) {
1147 				cxl_region_teardown_targets(cxlr);
1148 				return rc;
1149 			}
1150 		}
1151 	}
1152 
1153 	return 0;
1154 }
1155 
1156 static int cxl_region_attach(struct cxl_region *cxlr,
1157 			     struct cxl_endpoint_decoder *cxled, int pos)
1158 {
1159 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(cxlr->dev.parent);
1160 	struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
1161 	struct cxl_port *ep_port, *root_port, *iter;
1162 	struct cxl_region_params *p = &cxlr->params;
1163 	struct cxl_dport *dport;
1164 	int i, rc = -ENXIO;
1165 
1166 	if (cxled->mode == CXL_DECODER_DEAD) {
1167 		dev_dbg(&cxlr->dev, "%s dead\n", dev_name(&cxled->cxld.dev));
1168 		return -ENODEV;
1169 	}
1170 
1171 	/* all full of members, or interleave config not established? */
1172 	if (p->state > CXL_CONFIG_INTERLEAVE_ACTIVE) {
1173 		dev_dbg(&cxlr->dev, "region already active\n");
1174 		return -EBUSY;
1175 	} else if (p->state < CXL_CONFIG_INTERLEAVE_ACTIVE) {
1176 		dev_dbg(&cxlr->dev, "interleave config missing\n");
1177 		return -ENXIO;
1178 	}
1179 
1180 	if (pos < 0 || pos >= p->interleave_ways) {
1181 		dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos,
1182 			p->interleave_ways);
1183 		return -ENXIO;
1184 	}
1185 
1186 	if (p->targets[pos] == cxled)
1187 		return 0;
1188 
1189 	if (p->targets[pos]) {
1190 		struct cxl_endpoint_decoder *cxled_target = p->targets[pos];
1191 		struct cxl_memdev *cxlmd_target = cxled_to_memdev(cxled_target);
1192 
1193 		dev_dbg(&cxlr->dev, "position %d already assigned to %s:%s\n",
1194 			pos, dev_name(&cxlmd_target->dev),
1195 			dev_name(&cxled_target->cxld.dev));
1196 		return -EBUSY;
1197 	}
1198 
1199 	for (i = 0; i < p->interleave_ways; i++) {
1200 		struct cxl_endpoint_decoder *cxled_target;
1201 		struct cxl_memdev *cxlmd_target;
1202 
1203 		cxled_target = p->targets[pos];
1204 		if (!cxled_target)
1205 			continue;
1206 
1207 		cxlmd_target = cxled_to_memdev(cxled_target);
1208 		if (cxlmd_target == cxlmd) {
1209 			dev_dbg(&cxlr->dev,
1210 				"%s already specified at position %d via: %s\n",
1211 				dev_name(&cxlmd->dev), pos,
1212 				dev_name(&cxled_target->cxld.dev));
1213 			return -EBUSY;
1214 		}
1215 	}
1216 
1217 	ep_port = cxled_to_port(cxled);
1218 	root_port = cxlrd_to_port(cxlrd);
1219 	dport = cxl_find_dport_by_dev(root_port, ep_port->host_bridge);
1220 	if (!dport) {
1221 		dev_dbg(&cxlr->dev, "%s:%s invalid target for %s\n",
1222 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
1223 			dev_name(cxlr->dev.parent));
1224 		return -ENXIO;
1225 	}
1226 
1227 	if (cxlrd->calc_hb(cxlrd, pos) != dport) {
1228 		dev_dbg(&cxlr->dev, "%s:%s invalid target position for %s\n",
1229 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
1230 			dev_name(&cxlrd->cxlsd.cxld.dev));
1231 		return -ENXIO;
1232 	}
1233 
1234 	if (cxled->cxld.target_type != cxlr->type) {
1235 		dev_dbg(&cxlr->dev, "%s:%s type mismatch: %d vs %d\n",
1236 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
1237 			cxled->cxld.target_type, cxlr->type);
1238 		return -ENXIO;
1239 	}
1240 
1241 	if (!cxled->dpa_res) {
1242 		dev_dbg(&cxlr->dev, "%s:%s: missing DPA allocation.\n",
1243 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev));
1244 		return -ENXIO;
1245 	}
1246 
1247 	if (resource_size(cxled->dpa_res) * p->interleave_ways !=
1248 	    resource_size(p->res)) {
1249 		dev_dbg(&cxlr->dev,
1250 			"%s:%s: decoder-size-%#llx * ways-%d != region-size-%#llx\n",
1251 			dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
1252 			(u64)resource_size(cxled->dpa_res), p->interleave_ways,
1253 			(u64)resource_size(p->res));
1254 		return -EINVAL;
1255 	}
1256 
1257 	for (iter = ep_port; !is_cxl_root(iter);
1258 	     iter = to_cxl_port(iter->dev.parent)) {
1259 		rc = cxl_port_attach_region(iter, cxlr, cxled, pos);
1260 		if (rc)
1261 			goto err;
1262 	}
1263 
1264 	p->targets[pos] = cxled;
1265 	cxled->pos = pos;
1266 	p->nr_targets++;
1267 
1268 	if (p->nr_targets == p->interleave_ways) {
1269 		rc = cxl_region_setup_targets(cxlr);
1270 		if (rc)
1271 			goto err_decrement;
1272 		p->state = CXL_CONFIG_ACTIVE;
1273 	}
1274 
1275 	cxled->cxld.interleave_ways = p->interleave_ways;
1276 	cxled->cxld.interleave_granularity = p->interleave_granularity;
1277 	cxled->cxld.hpa_range = (struct range) {
1278 		.start = p->res->start,
1279 		.end = p->res->end,
1280 	};
1281 
1282 	return 0;
1283 
1284 err_decrement:
1285 	p->nr_targets--;
1286 err:
1287 	for (iter = ep_port; !is_cxl_root(iter);
1288 	     iter = to_cxl_port(iter->dev.parent))
1289 		cxl_port_detach_region(iter, cxlr, cxled);
1290 	return rc;
1291 }
1292 
1293 static int cxl_region_detach(struct cxl_endpoint_decoder *cxled)
1294 {
1295 	struct cxl_port *iter, *ep_port = cxled_to_port(cxled);
1296 	struct cxl_region *cxlr = cxled->cxld.region;
1297 	struct cxl_region_params *p;
1298 	int rc = 0;
1299 
1300 	lockdep_assert_held_write(&cxl_region_rwsem);
1301 
1302 	if (!cxlr)
1303 		return 0;
1304 
1305 	p = &cxlr->params;
1306 	get_device(&cxlr->dev);
1307 
1308 	if (p->state > CXL_CONFIG_ACTIVE) {
1309 		/*
1310 		 * TODO: tear down all impacted regions if a device is
1311 		 * removed out of order
1312 		 */
1313 		rc = cxl_region_decode_reset(cxlr, p->interleave_ways);
1314 		if (rc)
1315 			goto out;
1316 		p->state = CXL_CONFIG_ACTIVE;
1317 	}
1318 
1319 	for (iter = ep_port; !is_cxl_root(iter);
1320 	     iter = to_cxl_port(iter->dev.parent))
1321 		cxl_port_detach_region(iter, cxlr, cxled);
1322 
1323 	if (cxled->pos < 0 || cxled->pos >= p->interleave_ways ||
1324 	    p->targets[cxled->pos] != cxled) {
1325 		struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
1326 
1327 		dev_WARN_ONCE(&cxlr->dev, 1, "expected %s:%s at position %d\n",
1328 			      dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
1329 			      cxled->pos);
1330 		goto out;
1331 	}
1332 
1333 	if (p->state == CXL_CONFIG_ACTIVE) {
1334 		p->state = CXL_CONFIG_INTERLEAVE_ACTIVE;
1335 		cxl_region_teardown_targets(cxlr);
1336 	}
1337 	p->targets[cxled->pos] = NULL;
1338 	p->nr_targets--;
1339 	cxled->cxld.hpa_range = (struct range) {
1340 		.start = 0,
1341 		.end = -1,
1342 	};
1343 
1344 	/* notify the region driver that one of its targets has departed */
1345 	up_write(&cxl_region_rwsem);
1346 	device_release_driver(&cxlr->dev);
1347 	down_write(&cxl_region_rwsem);
1348 out:
1349 	put_device(&cxlr->dev);
1350 	return rc;
1351 }
1352 
1353 void cxl_decoder_kill_region(struct cxl_endpoint_decoder *cxled)
1354 {
1355 	down_write(&cxl_region_rwsem);
1356 	cxled->mode = CXL_DECODER_DEAD;
1357 	cxl_region_detach(cxled);
1358 	up_write(&cxl_region_rwsem);
1359 }
1360 
1361 static int attach_target(struct cxl_region *cxlr, const char *decoder, int pos)
1362 {
1363 	struct device *dev;
1364 	int rc;
1365 
1366 	dev = bus_find_device_by_name(&cxl_bus_type, NULL, decoder);
1367 	if (!dev)
1368 		return -ENODEV;
1369 
1370 	if (!is_endpoint_decoder(dev)) {
1371 		put_device(dev);
1372 		return -EINVAL;
1373 	}
1374 
1375 	rc = down_write_killable(&cxl_region_rwsem);
1376 	if (rc)
1377 		goto out;
1378 	down_read(&cxl_dpa_rwsem);
1379 	rc = cxl_region_attach(cxlr, to_cxl_endpoint_decoder(dev), pos);
1380 	up_read(&cxl_dpa_rwsem);
1381 	up_write(&cxl_region_rwsem);
1382 out:
1383 	put_device(dev);
1384 	return rc;
1385 }
1386 
1387 static int detach_target(struct cxl_region *cxlr, int pos)
1388 {
1389 	struct cxl_region_params *p = &cxlr->params;
1390 	int rc;
1391 
1392 	rc = down_write_killable(&cxl_region_rwsem);
1393 	if (rc)
1394 		return rc;
1395 
1396 	if (pos >= p->interleave_ways) {
1397 		dev_dbg(&cxlr->dev, "position %d out of range %d\n", pos,
1398 			p->interleave_ways);
1399 		rc = -ENXIO;
1400 		goto out;
1401 	}
1402 
1403 	if (!p->targets[pos]) {
1404 		rc = 0;
1405 		goto out;
1406 	}
1407 
1408 	rc = cxl_region_detach(p->targets[pos]);
1409 out:
1410 	up_write(&cxl_region_rwsem);
1411 	return rc;
1412 }
1413 
1414 static size_t store_targetN(struct cxl_region *cxlr, const char *buf, int pos,
1415 			    size_t len)
1416 {
1417 	int rc;
1418 
1419 	if (sysfs_streq(buf, "\n"))
1420 		rc = detach_target(cxlr, pos);
1421 	else
1422 		rc = attach_target(cxlr, buf, pos);
1423 
1424 	if (rc < 0)
1425 		return rc;
1426 	return len;
1427 }
1428 
1429 #define TARGET_ATTR_RW(n)                                              \
1430 static ssize_t target##n##_show(                                       \
1431 	struct device *dev, struct device_attribute *attr, char *buf)  \
1432 {                                                                      \
1433 	return show_targetN(to_cxl_region(dev), buf, (n));             \
1434 }                                                                      \
1435 static ssize_t target##n##_store(struct device *dev,                   \
1436 				 struct device_attribute *attr,        \
1437 				 const char *buf, size_t len)          \
1438 {                                                                      \
1439 	return store_targetN(to_cxl_region(dev), buf, (n), len);       \
1440 }                                                                      \
1441 static DEVICE_ATTR_RW(target##n)
1442 
1443 TARGET_ATTR_RW(0);
1444 TARGET_ATTR_RW(1);
1445 TARGET_ATTR_RW(2);
1446 TARGET_ATTR_RW(3);
1447 TARGET_ATTR_RW(4);
1448 TARGET_ATTR_RW(5);
1449 TARGET_ATTR_RW(6);
1450 TARGET_ATTR_RW(7);
1451 TARGET_ATTR_RW(8);
1452 TARGET_ATTR_RW(9);
1453 TARGET_ATTR_RW(10);
1454 TARGET_ATTR_RW(11);
1455 TARGET_ATTR_RW(12);
1456 TARGET_ATTR_RW(13);
1457 TARGET_ATTR_RW(14);
1458 TARGET_ATTR_RW(15);
1459 
1460 static struct attribute *target_attrs[] = {
1461 	&dev_attr_target0.attr,
1462 	&dev_attr_target1.attr,
1463 	&dev_attr_target2.attr,
1464 	&dev_attr_target3.attr,
1465 	&dev_attr_target4.attr,
1466 	&dev_attr_target5.attr,
1467 	&dev_attr_target6.attr,
1468 	&dev_attr_target7.attr,
1469 	&dev_attr_target8.attr,
1470 	&dev_attr_target9.attr,
1471 	&dev_attr_target10.attr,
1472 	&dev_attr_target11.attr,
1473 	&dev_attr_target12.attr,
1474 	&dev_attr_target13.attr,
1475 	&dev_attr_target14.attr,
1476 	&dev_attr_target15.attr,
1477 	NULL,
1478 };
1479 
1480 static umode_t cxl_region_target_visible(struct kobject *kobj,
1481 					 struct attribute *a, int n)
1482 {
1483 	struct device *dev = kobj_to_dev(kobj);
1484 	struct cxl_region *cxlr = to_cxl_region(dev);
1485 	struct cxl_region_params *p = &cxlr->params;
1486 
1487 	if (n < p->interleave_ways)
1488 		return a->mode;
1489 	return 0;
1490 }
1491 
1492 static const struct attribute_group cxl_region_target_group = {
1493 	.attrs = target_attrs,
1494 	.is_visible = cxl_region_target_visible,
1495 };
1496 
1497 static const struct attribute_group *get_cxl_region_target_group(void)
1498 {
1499 	return &cxl_region_target_group;
1500 }
1501 
1502 static const struct attribute_group *region_groups[] = {
1503 	&cxl_base_attribute_group,
1504 	&cxl_region_group,
1505 	&cxl_region_target_group,
1506 	NULL,
1507 };
1508 
1509 static void cxl_region_release(struct device *dev)
1510 {
1511 	struct cxl_region *cxlr = to_cxl_region(dev);
1512 
1513 	memregion_free(cxlr->id);
1514 	kfree(cxlr);
1515 }
1516 
1517 const struct device_type cxl_region_type = {
1518 	.name = "cxl_region",
1519 	.release = cxl_region_release,
1520 	.groups = region_groups
1521 };
1522 
1523 bool is_cxl_region(struct device *dev)
1524 {
1525 	return dev->type == &cxl_region_type;
1526 }
1527 EXPORT_SYMBOL_NS_GPL(is_cxl_region, CXL);
1528 
1529 static struct cxl_region *to_cxl_region(struct device *dev)
1530 {
1531 	if (dev_WARN_ONCE(dev, dev->type != &cxl_region_type,
1532 			  "not a cxl_region device\n"))
1533 		return NULL;
1534 
1535 	return container_of(dev, struct cxl_region, dev);
1536 }
1537 
1538 static void unregister_region(void *dev)
1539 {
1540 	struct cxl_region *cxlr = to_cxl_region(dev);
1541 
1542 	device_del(dev);
1543 	cxl_region_iomem_release(cxlr);
1544 	put_device(dev);
1545 }
1546 
1547 static struct lock_class_key cxl_region_key;
1548 
1549 static struct cxl_region *cxl_region_alloc(struct cxl_root_decoder *cxlrd, int id)
1550 {
1551 	struct cxl_region *cxlr;
1552 	struct device *dev;
1553 
1554 	cxlr = kzalloc(sizeof(*cxlr), GFP_KERNEL);
1555 	if (!cxlr) {
1556 		memregion_free(id);
1557 		return ERR_PTR(-ENOMEM);
1558 	}
1559 
1560 	dev = &cxlr->dev;
1561 	device_initialize(dev);
1562 	lockdep_set_class(&dev->mutex, &cxl_region_key);
1563 	dev->parent = &cxlrd->cxlsd.cxld.dev;
1564 	device_set_pm_not_required(dev);
1565 	dev->bus = &cxl_bus_type;
1566 	dev->type = &cxl_region_type;
1567 	cxlr->id = id;
1568 
1569 	return cxlr;
1570 }
1571 
1572 /**
1573  * devm_cxl_add_region - Adds a region to a decoder
1574  * @cxlrd: root decoder
1575  * @id: memregion id to create, or memregion_free() on failure
1576  * @mode: mode for the endpoint decoders of this region
1577  * @type: select whether this is an expander or accelerator (type-2 or type-3)
1578  *
1579  * This is the second step of region initialization. Regions exist within an
1580  * address space which is mapped by a @cxlrd.
1581  *
1582  * Return: 0 if the region was added to the @cxlrd, else returns negative error
1583  * code. The region will be named "regionZ" where Z is the unique region number.
1584  */
1585 static struct cxl_region *devm_cxl_add_region(struct cxl_root_decoder *cxlrd,
1586 					      int id,
1587 					      enum cxl_decoder_mode mode,
1588 					      enum cxl_decoder_type type)
1589 {
1590 	struct cxl_port *port = to_cxl_port(cxlrd->cxlsd.cxld.dev.parent);
1591 	struct cxl_region *cxlr;
1592 	struct device *dev;
1593 	int rc;
1594 
1595 	cxlr = cxl_region_alloc(cxlrd, id);
1596 	if (IS_ERR(cxlr))
1597 		return cxlr;
1598 	cxlr->mode = mode;
1599 	cxlr->type = type;
1600 
1601 	dev = &cxlr->dev;
1602 	rc = dev_set_name(dev, "region%d", id);
1603 	if (rc)
1604 		goto err;
1605 
1606 	rc = device_add(dev);
1607 	if (rc)
1608 		goto err;
1609 
1610 	rc = devm_add_action_or_reset(port->uport, unregister_region, cxlr);
1611 	if (rc)
1612 		return ERR_PTR(rc);
1613 
1614 	dev_dbg(port->uport, "%s: created %s\n",
1615 		dev_name(&cxlrd->cxlsd.cxld.dev), dev_name(dev));
1616 	return cxlr;
1617 
1618 err:
1619 	put_device(dev);
1620 	return ERR_PTR(rc);
1621 }
1622 
1623 static ssize_t create_pmem_region_show(struct device *dev,
1624 				       struct device_attribute *attr, char *buf)
1625 {
1626 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
1627 
1628 	return sysfs_emit(buf, "region%u\n", atomic_read(&cxlrd->region_id));
1629 }
1630 
1631 static ssize_t create_pmem_region_store(struct device *dev,
1632 					struct device_attribute *attr,
1633 					const char *buf, size_t len)
1634 {
1635 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
1636 	struct cxl_region *cxlr;
1637 	int id, rc;
1638 
1639 	rc = sscanf(buf, "region%d\n", &id);
1640 	if (rc != 1)
1641 		return -EINVAL;
1642 
1643 	rc = memregion_alloc(GFP_KERNEL);
1644 	if (rc < 0)
1645 		return rc;
1646 
1647 	if (atomic_cmpxchg(&cxlrd->region_id, id, rc) != id) {
1648 		memregion_free(rc);
1649 		return -EBUSY;
1650 	}
1651 
1652 	cxlr = devm_cxl_add_region(cxlrd, id, CXL_DECODER_PMEM,
1653 				   CXL_DECODER_EXPANDER);
1654 	if (IS_ERR(cxlr))
1655 		return PTR_ERR(cxlr);
1656 
1657 	return len;
1658 }
1659 DEVICE_ATTR_RW(create_pmem_region);
1660 
1661 static ssize_t region_show(struct device *dev, struct device_attribute *attr,
1662 			   char *buf)
1663 {
1664 	struct cxl_decoder *cxld = to_cxl_decoder(dev);
1665 	ssize_t rc;
1666 
1667 	rc = down_read_interruptible(&cxl_region_rwsem);
1668 	if (rc)
1669 		return rc;
1670 
1671 	if (cxld->region)
1672 		rc = sysfs_emit(buf, "%s\n", dev_name(&cxld->region->dev));
1673 	else
1674 		rc = sysfs_emit(buf, "\n");
1675 	up_read(&cxl_region_rwsem);
1676 
1677 	return rc;
1678 }
1679 DEVICE_ATTR_RO(region);
1680 
1681 static struct cxl_region *
1682 cxl_find_region_by_name(struct cxl_root_decoder *cxlrd, const char *name)
1683 {
1684 	struct cxl_decoder *cxld = &cxlrd->cxlsd.cxld;
1685 	struct device *region_dev;
1686 
1687 	region_dev = device_find_child_by_name(&cxld->dev, name);
1688 	if (!region_dev)
1689 		return ERR_PTR(-ENODEV);
1690 
1691 	return to_cxl_region(region_dev);
1692 }
1693 
1694 static ssize_t delete_region_store(struct device *dev,
1695 				   struct device_attribute *attr,
1696 				   const char *buf, size_t len)
1697 {
1698 	struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
1699 	struct cxl_port *port = to_cxl_port(dev->parent);
1700 	struct cxl_region *cxlr;
1701 
1702 	cxlr = cxl_find_region_by_name(cxlrd, buf);
1703 	if (IS_ERR(cxlr))
1704 		return PTR_ERR(cxlr);
1705 
1706 	devm_release_action(port->uport, unregister_region, cxlr);
1707 	put_device(&cxlr->dev);
1708 
1709 	return len;
1710 }
1711 DEVICE_ATTR_WO(delete_region);
1712 
1713 static void cxl_pmem_region_release(struct device *dev)
1714 {
1715 	struct cxl_pmem_region *cxlr_pmem = to_cxl_pmem_region(dev);
1716 	int i;
1717 
1718 	for (i = 0; i < cxlr_pmem->nr_mappings; i++) {
1719 		struct cxl_memdev *cxlmd = cxlr_pmem->mapping[i].cxlmd;
1720 
1721 		put_device(&cxlmd->dev);
1722 	}
1723 
1724 	kfree(cxlr_pmem);
1725 }
1726 
1727 static const struct attribute_group *cxl_pmem_region_attribute_groups[] = {
1728 	&cxl_base_attribute_group,
1729 	NULL,
1730 };
1731 
1732 const struct device_type cxl_pmem_region_type = {
1733 	.name = "cxl_pmem_region",
1734 	.release = cxl_pmem_region_release,
1735 	.groups = cxl_pmem_region_attribute_groups,
1736 };
1737 
1738 bool is_cxl_pmem_region(struct device *dev)
1739 {
1740 	return dev->type == &cxl_pmem_region_type;
1741 }
1742 EXPORT_SYMBOL_NS_GPL(is_cxl_pmem_region, CXL);
1743 
1744 struct cxl_pmem_region *to_cxl_pmem_region(struct device *dev)
1745 {
1746 	if (dev_WARN_ONCE(dev, !is_cxl_pmem_region(dev),
1747 			  "not a cxl_pmem_region device\n"))
1748 		return NULL;
1749 	return container_of(dev, struct cxl_pmem_region, dev);
1750 }
1751 EXPORT_SYMBOL_NS_GPL(to_cxl_pmem_region, CXL);
1752 
1753 static struct lock_class_key cxl_pmem_region_key;
1754 
1755 static struct cxl_pmem_region *cxl_pmem_region_alloc(struct cxl_region *cxlr)
1756 {
1757 	struct cxl_region_params *p = &cxlr->params;
1758 	struct cxl_pmem_region *cxlr_pmem;
1759 	struct device *dev;
1760 	int i;
1761 
1762 	down_read(&cxl_region_rwsem);
1763 	if (p->state != CXL_CONFIG_COMMIT) {
1764 		cxlr_pmem = ERR_PTR(-ENXIO);
1765 		goto out;
1766 	}
1767 
1768 	cxlr_pmem = kzalloc(struct_size(cxlr_pmem, mapping, p->nr_targets),
1769 			    GFP_KERNEL);
1770 	if (!cxlr_pmem) {
1771 		cxlr_pmem = ERR_PTR(-ENOMEM);
1772 		goto out;
1773 	}
1774 
1775 	cxlr_pmem->hpa_range.start = p->res->start;
1776 	cxlr_pmem->hpa_range.end = p->res->end;
1777 
1778 	/* Snapshot the region configuration underneath the cxl_region_rwsem */
1779 	cxlr_pmem->nr_mappings = p->nr_targets;
1780 	for (i = 0; i < p->nr_targets; i++) {
1781 		struct cxl_endpoint_decoder *cxled = p->targets[i];
1782 		struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
1783 		struct cxl_pmem_region_mapping *m = &cxlr_pmem->mapping[i];
1784 
1785 		m->cxlmd = cxlmd;
1786 		get_device(&cxlmd->dev);
1787 		m->start = cxled->dpa_res->start;
1788 		m->size = resource_size(cxled->dpa_res);
1789 		m->position = i;
1790 	}
1791 
1792 	dev = &cxlr_pmem->dev;
1793 	cxlr_pmem->cxlr = cxlr;
1794 	device_initialize(dev);
1795 	lockdep_set_class(&dev->mutex, &cxl_pmem_region_key);
1796 	device_set_pm_not_required(dev);
1797 	dev->parent = &cxlr->dev;
1798 	dev->bus = &cxl_bus_type;
1799 	dev->type = &cxl_pmem_region_type;
1800 out:
1801 	up_read(&cxl_region_rwsem);
1802 
1803 	return cxlr_pmem;
1804 }
1805 
1806 static void cxlr_pmem_unregister(void *dev)
1807 {
1808 	device_unregister(dev);
1809 }
1810 
1811 /**
1812  * devm_cxl_add_pmem_region() - add a cxl_region-to-nd_region bridge
1813  * @cxlr: parent CXL region for this pmem region bridge device
1814  *
1815  * Return: 0 on success negative error code on failure.
1816  */
1817 static int devm_cxl_add_pmem_region(struct cxl_region *cxlr)
1818 {
1819 	struct cxl_pmem_region *cxlr_pmem;
1820 	struct device *dev;
1821 	int rc;
1822 
1823 	cxlr_pmem = cxl_pmem_region_alloc(cxlr);
1824 	if (IS_ERR(cxlr_pmem))
1825 		return PTR_ERR(cxlr_pmem);
1826 
1827 	dev = &cxlr_pmem->dev;
1828 	rc = dev_set_name(dev, "pmem_region%d", cxlr->id);
1829 	if (rc)
1830 		goto err;
1831 
1832 	rc = device_add(dev);
1833 	if (rc)
1834 		goto err;
1835 
1836 	dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent),
1837 		dev_name(dev));
1838 
1839 	return devm_add_action_or_reset(&cxlr->dev, cxlr_pmem_unregister, dev);
1840 
1841 err:
1842 	put_device(dev);
1843 	return rc;
1844 }
1845 
1846 static int cxl_region_probe(struct device *dev)
1847 {
1848 	struct cxl_region *cxlr = to_cxl_region(dev);
1849 	struct cxl_region_params *p = &cxlr->params;
1850 	int rc;
1851 
1852 	rc = down_read_interruptible(&cxl_region_rwsem);
1853 	if (rc) {
1854 		dev_dbg(&cxlr->dev, "probe interrupted\n");
1855 		return rc;
1856 	}
1857 
1858 	if (p->state < CXL_CONFIG_COMMIT) {
1859 		dev_dbg(&cxlr->dev, "config state: %d\n", p->state);
1860 		rc = -ENXIO;
1861 	}
1862 
1863 	/*
1864 	 * From this point on any path that changes the region's state away from
1865 	 * CXL_CONFIG_COMMIT is also responsible for releasing the driver.
1866 	 */
1867 	up_read(&cxl_region_rwsem);
1868 
1869 	switch (cxlr->mode) {
1870 	case CXL_DECODER_PMEM:
1871 		return devm_cxl_add_pmem_region(cxlr);
1872 	default:
1873 		dev_dbg(&cxlr->dev, "unsupported region mode: %d\n",
1874 			cxlr->mode);
1875 		return -ENXIO;
1876 	}
1877 }
1878 
1879 static struct cxl_driver cxl_region_driver = {
1880 	.name = "cxl_region",
1881 	.probe = cxl_region_probe,
1882 	.id = CXL_DEVICE_REGION,
1883 };
1884 
1885 int cxl_region_init(void)
1886 {
1887 	return cxl_driver_register(&cxl_region_driver);
1888 }
1889 
1890 void cxl_region_exit(void)
1891 {
1892 	cxl_driver_unregister(&cxl_region_driver);
1893 }
1894 
1895 MODULE_IMPORT_NS(CXL);
1896 MODULE_ALIAS_CXL(CXL_DEVICE_REGION);
1897