xref: /openbmc/linux/drivers/cxl/core/port.c (revision ba936421)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2020 Intel Corporation. All rights reserved. */
3 #include <linux/io-64-nonatomic-lo-hi.h>
4 #include <linux/workqueue.h>
5 #include <linux/device.h>
6 #include <linux/module.h>
7 #include <linux/pci.h>
8 #include <linux/slab.h>
9 #include <linux/idr.h>
10 #include <cxlmem.h>
11 #include <cxlpci.h>
12 #include <cxl.h>
13 #include "core.h"
14 
15 /**
16  * DOC: cxl core
17  *
18  * The CXL core provides a set of interfaces that can be consumed by CXL aware
19  * drivers. The interfaces allow for creation, modification, and destruction of
20  * regions, memory devices, ports, and decoders. CXL aware drivers must register
21  * with the CXL core via these interfaces in order to be able to participate in
22  * cross-device interleave coordination. The CXL core also establishes and
23  * maintains the bridge to the nvdimm subsystem.
24  *
25  * CXL core introduces sysfs hierarchy to control the devices that are
26  * instantiated by the core.
27  */
28 
29 static DEFINE_IDA(cxl_port_ida);
30 static DEFINE_XARRAY(cxl_root_buses);
31 
32 static ssize_t devtype_show(struct device *dev, struct device_attribute *attr,
33 			    char *buf)
34 {
35 	return sysfs_emit(buf, "%s\n", dev->type->name);
36 }
37 static DEVICE_ATTR_RO(devtype);
38 
39 static int cxl_device_id(struct device *dev)
40 {
41 	if (dev->type == &cxl_nvdimm_bridge_type)
42 		return CXL_DEVICE_NVDIMM_BRIDGE;
43 	if (dev->type == &cxl_nvdimm_type)
44 		return CXL_DEVICE_NVDIMM;
45 	if (is_cxl_port(dev)) {
46 		if (is_cxl_root(to_cxl_port(dev)))
47 			return CXL_DEVICE_ROOT;
48 		return CXL_DEVICE_PORT;
49 	}
50 	if (is_cxl_memdev(dev))
51 		return CXL_DEVICE_MEMORY_EXPANDER;
52 	return 0;
53 }
54 
55 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
56 			     char *buf)
57 {
58 	return sysfs_emit(buf, CXL_MODALIAS_FMT "\n", cxl_device_id(dev));
59 }
60 static DEVICE_ATTR_RO(modalias);
61 
62 static struct attribute *cxl_base_attributes[] = {
63 	&dev_attr_devtype.attr,
64 	&dev_attr_modalias.attr,
65 	NULL,
66 };
67 
68 struct attribute_group cxl_base_attribute_group = {
69 	.attrs = cxl_base_attributes,
70 };
71 
72 static ssize_t start_show(struct device *dev, struct device_attribute *attr,
73 			  char *buf)
74 {
75 	struct cxl_decoder *cxld = to_cxl_decoder(dev);
76 	u64 start;
77 
78 	if (is_root_decoder(dev))
79 		start = cxld->platform_res.start;
80 	else
81 		start = cxld->decoder_range.start;
82 
83 	return sysfs_emit(buf, "%#llx\n", start);
84 }
85 static DEVICE_ATTR_ADMIN_RO(start);
86 
87 static ssize_t size_show(struct device *dev, struct device_attribute *attr,
88 			char *buf)
89 {
90 	struct cxl_decoder *cxld = to_cxl_decoder(dev);
91 	u64 size;
92 
93 	if (is_root_decoder(dev))
94 		size = resource_size(&cxld->platform_res);
95 	else
96 		size = range_len(&cxld->decoder_range);
97 
98 	return sysfs_emit(buf, "%#llx\n", size);
99 }
100 static DEVICE_ATTR_RO(size);
101 
102 #define CXL_DECODER_FLAG_ATTR(name, flag)                            \
103 static ssize_t name##_show(struct device *dev,                       \
104 			   struct device_attribute *attr, char *buf) \
105 {                                                                    \
106 	struct cxl_decoder *cxld = to_cxl_decoder(dev);              \
107                                                                      \
108 	return sysfs_emit(buf, "%s\n",                               \
109 			  (cxld->flags & (flag)) ? "1" : "0");       \
110 }                                                                    \
111 static DEVICE_ATTR_RO(name)
112 
113 CXL_DECODER_FLAG_ATTR(cap_pmem, CXL_DECODER_F_PMEM);
114 CXL_DECODER_FLAG_ATTR(cap_ram, CXL_DECODER_F_RAM);
115 CXL_DECODER_FLAG_ATTR(cap_type2, CXL_DECODER_F_TYPE2);
116 CXL_DECODER_FLAG_ATTR(cap_type3, CXL_DECODER_F_TYPE3);
117 CXL_DECODER_FLAG_ATTR(locked, CXL_DECODER_F_LOCK);
118 
119 static ssize_t target_type_show(struct device *dev,
120 				struct device_attribute *attr, char *buf)
121 {
122 	struct cxl_decoder *cxld = to_cxl_decoder(dev);
123 
124 	switch (cxld->target_type) {
125 	case CXL_DECODER_ACCELERATOR:
126 		return sysfs_emit(buf, "accelerator\n");
127 	case CXL_DECODER_EXPANDER:
128 		return sysfs_emit(buf, "expander\n");
129 	}
130 	return -ENXIO;
131 }
132 static DEVICE_ATTR_RO(target_type);
133 
134 static ssize_t emit_target_list(struct cxl_decoder *cxld, char *buf)
135 {
136 	ssize_t offset = 0;
137 	int i, rc = 0;
138 
139 	for (i = 0; i < cxld->interleave_ways; i++) {
140 		struct cxl_dport *dport = cxld->target[i];
141 		struct cxl_dport *next = NULL;
142 
143 		if (!dport)
144 			break;
145 
146 		if (i + 1 < cxld->interleave_ways)
147 			next = cxld->target[i + 1];
148 		rc = sysfs_emit_at(buf, offset, "%d%s", dport->port_id,
149 				   next ? "," : "");
150 		if (rc < 0)
151 			return rc;
152 		offset += rc;
153 	}
154 
155 	return offset;
156 }
157 
158 static ssize_t target_list_show(struct device *dev,
159 				struct device_attribute *attr, char *buf)
160 {
161 	struct cxl_decoder *cxld = to_cxl_decoder(dev);
162 	ssize_t offset;
163 	unsigned int seq;
164 	int rc;
165 
166 	do {
167 		seq = read_seqbegin(&cxld->target_lock);
168 		rc = emit_target_list(cxld, buf);
169 	} while (read_seqretry(&cxld->target_lock, seq));
170 
171 	if (rc < 0)
172 		return rc;
173 	offset = rc;
174 
175 	rc = sysfs_emit_at(buf, offset, "\n");
176 	if (rc < 0)
177 		return rc;
178 
179 	return offset + rc;
180 }
181 static DEVICE_ATTR_RO(target_list);
182 
183 static struct attribute *cxl_decoder_base_attrs[] = {
184 	&dev_attr_start.attr,
185 	&dev_attr_size.attr,
186 	&dev_attr_locked.attr,
187 	NULL,
188 };
189 
190 static struct attribute_group cxl_decoder_base_attribute_group = {
191 	.attrs = cxl_decoder_base_attrs,
192 };
193 
194 static struct attribute *cxl_decoder_root_attrs[] = {
195 	&dev_attr_cap_pmem.attr,
196 	&dev_attr_cap_ram.attr,
197 	&dev_attr_cap_type2.attr,
198 	&dev_attr_cap_type3.attr,
199 	&dev_attr_target_list.attr,
200 	NULL,
201 };
202 
203 static struct attribute_group cxl_decoder_root_attribute_group = {
204 	.attrs = cxl_decoder_root_attrs,
205 };
206 
207 static const struct attribute_group *cxl_decoder_root_attribute_groups[] = {
208 	&cxl_decoder_root_attribute_group,
209 	&cxl_decoder_base_attribute_group,
210 	&cxl_base_attribute_group,
211 	NULL,
212 };
213 
214 static struct attribute *cxl_decoder_switch_attrs[] = {
215 	&dev_attr_target_type.attr,
216 	&dev_attr_target_list.attr,
217 	NULL,
218 };
219 
220 static struct attribute_group cxl_decoder_switch_attribute_group = {
221 	.attrs = cxl_decoder_switch_attrs,
222 };
223 
224 static const struct attribute_group *cxl_decoder_switch_attribute_groups[] = {
225 	&cxl_decoder_switch_attribute_group,
226 	&cxl_decoder_base_attribute_group,
227 	&cxl_base_attribute_group,
228 	NULL,
229 };
230 
231 static struct attribute *cxl_decoder_endpoint_attrs[] = {
232 	&dev_attr_target_type.attr,
233 	NULL,
234 };
235 
236 static struct attribute_group cxl_decoder_endpoint_attribute_group = {
237 	.attrs = cxl_decoder_endpoint_attrs,
238 };
239 
240 static const struct attribute_group *cxl_decoder_endpoint_attribute_groups[] = {
241 	&cxl_decoder_base_attribute_group,
242 	&cxl_decoder_endpoint_attribute_group,
243 	&cxl_base_attribute_group,
244 	NULL,
245 };
246 
247 static void cxl_decoder_release(struct device *dev)
248 {
249 	struct cxl_decoder *cxld = to_cxl_decoder(dev);
250 	struct cxl_port *port = to_cxl_port(dev->parent);
251 
252 	ida_free(&port->decoder_ida, cxld->id);
253 	kfree(cxld);
254 	put_device(&port->dev);
255 }
256 
257 static const struct device_type cxl_decoder_endpoint_type = {
258 	.name = "cxl_decoder_endpoint",
259 	.release = cxl_decoder_release,
260 	.groups = cxl_decoder_endpoint_attribute_groups,
261 };
262 
263 static const struct device_type cxl_decoder_switch_type = {
264 	.name = "cxl_decoder_switch",
265 	.release = cxl_decoder_release,
266 	.groups = cxl_decoder_switch_attribute_groups,
267 };
268 
269 static const struct device_type cxl_decoder_root_type = {
270 	.name = "cxl_decoder_root",
271 	.release = cxl_decoder_release,
272 	.groups = cxl_decoder_root_attribute_groups,
273 };
274 
275 static bool is_endpoint_decoder(struct device *dev)
276 {
277 	return dev->type == &cxl_decoder_endpoint_type;
278 }
279 
280 bool is_root_decoder(struct device *dev)
281 {
282 	return dev->type == &cxl_decoder_root_type;
283 }
284 EXPORT_SYMBOL_NS_GPL(is_root_decoder, CXL);
285 
286 bool is_cxl_decoder(struct device *dev)
287 {
288 	return dev->type && dev->type->release == cxl_decoder_release;
289 }
290 EXPORT_SYMBOL_NS_GPL(is_cxl_decoder, CXL);
291 
292 struct cxl_decoder *to_cxl_decoder(struct device *dev)
293 {
294 	if (dev_WARN_ONCE(dev, dev->type->release != cxl_decoder_release,
295 			  "not a cxl_decoder device\n"))
296 		return NULL;
297 	return container_of(dev, struct cxl_decoder, dev);
298 }
299 EXPORT_SYMBOL_NS_GPL(to_cxl_decoder, CXL);
300 
301 static void cxl_ep_release(struct cxl_ep *ep)
302 {
303 	if (!ep)
304 		return;
305 	list_del(&ep->list);
306 	put_device(ep->ep);
307 	kfree(ep);
308 }
309 
310 static void cxl_port_release(struct device *dev)
311 {
312 	struct cxl_port *port = to_cxl_port(dev);
313 	struct cxl_ep *ep, *_e;
314 
315 	cxl_device_lock(dev);
316 	list_for_each_entry_safe(ep, _e, &port->endpoints, list)
317 		cxl_ep_release(ep);
318 	cxl_device_unlock(dev);
319 	ida_free(&cxl_port_ida, port->id);
320 	kfree(port);
321 }
322 
323 static const struct attribute_group *cxl_port_attribute_groups[] = {
324 	&cxl_base_attribute_group,
325 	NULL,
326 };
327 
328 static const struct device_type cxl_port_type = {
329 	.name = "cxl_port",
330 	.release = cxl_port_release,
331 	.groups = cxl_port_attribute_groups,
332 };
333 
334 bool is_cxl_port(struct device *dev)
335 {
336 	return dev->type == &cxl_port_type;
337 }
338 EXPORT_SYMBOL_NS_GPL(is_cxl_port, CXL);
339 
340 struct cxl_port *to_cxl_port(struct device *dev)
341 {
342 	if (dev_WARN_ONCE(dev, dev->type != &cxl_port_type,
343 			  "not a cxl_port device\n"))
344 		return NULL;
345 	return container_of(dev, struct cxl_port, dev);
346 }
347 EXPORT_SYMBOL_NS_GPL(to_cxl_port, CXL);
348 
349 static void unregister_port(void *_port)
350 {
351 	struct cxl_port *port = _port;
352 	struct cxl_port *parent;
353 	struct device *lock_dev;
354 
355 	if (is_cxl_root(port))
356 		parent = NULL;
357 	else
358 		parent = to_cxl_port(port->dev.parent);
359 
360 	/*
361 	 * CXL root port's and the first level of ports are unregistered
362 	 * under the platform firmware device lock, all other ports are
363 	 * unregistered while holding their parent port lock.
364 	 */
365 	if (!parent)
366 		lock_dev = port->uport;
367 	else if (is_cxl_root(parent))
368 		lock_dev = parent->uport;
369 	else
370 		lock_dev = &parent->dev;
371 
372 	device_lock_assert(lock_dev);
373 	port->uport = NULL;
374 	device_unregister(&port->dev);
375 }
376 
377 static void cxl_unlink_uport(void *_port)
378 {
379 	struct cxl_port *port = _port;
380 
381 	sysfs_remove_link(&port->dev.kobj, "uport");
382 }
383 
384 static int devm_cxl_link_uport(struct device *host, struct cxl_port *port)
385 {
386 	int rc;
387 
388 	rc = sysfs_create_link(&port->dev.kobj, &port->uport->kobj, "uport");
389 	if (rc)
390 		return rc;
391 	return devm_add_action_or_reset(host, cxl_unlink_uport, port);
392 }
393 
394 static struct cxl_port *cxl_port_alloc(struct device *uport,
395 				       resource_size_t component_reg_phys,
396 				       struct cxl_port *parent_port)
397 {
398 	struct cxl_port *port;
399 	struct device *dev;
400 	int rc;
401 
402 	port = kzalloc(sizeof(*port), GFP_KERNEL);
403 	if (!port)
404 		return ERR_PTR(-ENOMEM);
405 
406 	rc = ida_alloc(&cxl_port_ida, GFP_KERNEL);
407 	if (rc < 0)
408 		goto err;
409 	port->id = rc;
410 
411 	/*
412 	 * The top-level cxl_port "cxl_root" does not have a cxl_port as
413 	 * its parent and it does not have any corresponding component
414 	 * registers as its decode is described by a fixed platform
415 	 * description.
416 	 */
417 	dev = &port->dev;
418 	if (parent_port)
419 		dev->parent = &parent_port->dev;
420 	else
421 		dev->parent = uport;
422 
423 	port->uport = uport;
424 	port->component_reg_phys = component_reg_phys;
425 	ida_init(&port->decoder_ida);
426 	INIT_LIST_HEAD(&port->dports);
427 	INIT_LIST_HEAD(&port->endpoints);
428 
429 	device_initialize(dev);
430 	device_set_pm_not_required(dev);
431 	dev->bus = &cxl_bus_type;
432 	dev->type = &cxl_port_type;
433 
434 	return port;
435 
436 err:
437 	kfree(port);
438 	return ERR_PTR(rc);
439 }
440 
441 /**
442  * devm_cxl_add_port - register a cxl_port in CXL memory decode hierarchy
443  * @host: host device for devm operations
444  * @uport: "physical" device implementing this upstream port
445  * @component_reg_phys: (optional) for configurable cxl_port instances
446  * @parent_port: next hop up in the CXL memory decode hierarchy
447  */
448 struct cxl_port *devm_cxl_add_port(struct device *host, struct device *uport,
449 				   resource_size_t component_reg_phys,
450 				   struct cxl_port *parent_port)
451 {
452 	struct cxl_port *port;
453 	struct device *dev;
454 	int rc;
455 
456 	port = cxl_port_alloc(uport, component_reg_phys, parent_port);
457 	if (IS_ERR(port))
458 		return port;
459 
460 	if (parent_port)
461 		port->depth = parent_port->depth + 1;
462 	dev = &port->dev;
463 	if (is_cxl_memdev(uport))
464 		rc = dev_set_name(dev, "endpoint%d", port->id);
465 	else if (parent_port)
466 		rc = dev_set_name(dev, "port%d", port->id);
467 	else
468 		rc = dev_set_name(dev, "root%d", port->id);
469 	if (rc)
470 		goto err;
471 
472 	rc = device_add(dev);
473 	if (rc)
474 		goto err;
475 
476 	rc = devm_add_action_or_reset(host, unregister_port, port);
477 	if (rc)
478 		return ERR_PTR(rc);
479 
480 	rc = devm_cxl_link_uport(host, port);
481 	if (rc)
482 		return ERR_PTR(rc);
483 
484 	return port;
485 
486 err:
487 	put_device(dev);
488 	return ERR_PTR(rc);
489 }
490 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_port, CXL);
491 
492 struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port)
493 {
494 	/* There is no pci_bus associated with a CXL platform-root port */
495 	if (is_cxl_root(port))
496 		return NULL;
497 
498 	if (dev_is_pci(port->uport)) {
499 		struct pci_dev *pdev = to_pci_dev(port->uport);
500 
501 		return pdev->subordinate;
502 	}
503 
504 	return xa_load(&cxl_root_buses, (unsigned long)port->uport);
505 }
506 EXPORT_SYMBOL_NS_GPL(cxl_port_to_pci_bus, CXL);
507 
508 static void unregister_pci_bus(void *uport)
509 {
510 	xa_erase(&cxl_root_buses, (unsigned long)uport);
511 }
512 
513 int devm_cxl_register_pci_bus(struct device *host, struct device *uport,
514 			      struct pci_bus *bus)
515 {
516 	int rc;
517 
518 	if (dev_is_pci(uport))
519 		return -EINVAL;
520 
521 	rc = xa_insert(&cxl_root_buses, (unsigned long)uport, bus, GFP_KERNEL);
522 	if (rc)
523 		return rc;
524 	return devm_add_action_or_reset(host, unregister_pci_bus, uport);
525 }
526 EXPORT_SYMBOL_NS_GPL(devm_cxl_register_pci_bus, CXL);
527 
528 static bool dev_is_cxl_root_child(struct device *dev)
529 {
530 	struct cxl_port *port, *parent;
531 
532 	if (!is_cxl_port(dev))
533 		return false;
534 
535 	port = to_cxl_port(dev);
536 	if (is_cxl_root(port))
537 		return false;
538 
539 	parent = to_cxl_port(port->dev.parent);
540 	if (is_cxl_root(parent))
541 		return true;
542 
543 	return false;
544 }
545 
546 /* Find a 2nd level CXL port that has a dport that is an ancestor of @match */
547 static int match_root_child(struct device *dev, const void *match)
548 {
549 	const struct device *iter = NULL;
550 	struct cxl_dport *dport;
551 	struct cxl_port *port;
552 
553 	if (!dev_is_cxl_root_child(dev))
554 		return 0;
555 
556 	port = to_cxl_port(dev);
557 	cxl_device_lock(dev);
558 	list_for_each_entry(dport, &port->dports, list) {
559 		iter = match;
560 		while (iter) {
561 			if (iter == dport->dport)
562 				goto out;
563 			iter = iter->parent;
564 		}
565 	}
566 out:
567 	cxl_device_unlock(dev);
568 
569 	return !!iter;
570 }
571 
572 struct cxl_port *find_cxl_root(struct device *dev)
573 {
574 	struct device *port_dev;
575 	struct cxl_port *root;
576 
577 	port_dev = bus_find_device(&cxl_bus_type, NULL, dev, match_root_child);
578 	if (!port_dev)
579 		return NULL;
580 
581 	root = to_cxl_port(port_dev->parent);
582 	get_device(&root->dev);
583 	put_device(port_dev);
584 	return root;
585 }
586 EXPORT_SYMBOL_NS_GPL(find_cxl_root, CXL);
587 
588 static struct cxl_dport *find_dport(struct cxl_port *port, int id)
589 {
590 	struct cxl_dport *dport;
591 
592 	device_lock_assert(&port->dev);
593 	list_for_each_entry (dport, &port->dports, list)
594 		if (dport->port_id == id)
595 			return dport;
596 	return NULL;
597 }
598 
599 static int add_dport(struct cxl_port *port, struct cxl_dport *new)
600 {
601 	struct cxl_dport *dup;
602 
603 	device_lock_assert(&port->dev);
604 	dup = find_dport(port, new->port_id);
605 	if (dup)
606 		dev_err(&port->dev,
607 			"unable to add dport%d-%s non-unique port id (%s)\n",
608 			new->port_id, dev_name(new->dport),
609 			dev_name(dup->dport));
610 	else
611 		list_add_tail(&new->list, &port->dports);
612 
613 	return dup ? -EEXIST : 0;
614 }
615 
616 /*
617  * Since root-level CXL dports cannot be enumerated by PCI they are not
618  * enumerated by the common port driver that acquires the port lock over
619  * dport add/remove. Instead, root dports are manually added by a
620  * platform driver and cond_cxl_root_lock() is used to take the missing
621  * port lock in that case.
622  */
623 static void cond_cxl_root_lock(struct cxl_port *port)
624 {
625 	if (is_cxl_root(port))
626 		cxl_device_lock(&port->dev);
627 }
628 
629 static void cond_cxl_root_unlock(struct cxl_port *port)
630 {
631 	if (is_cxl_root(port))
632 		cxl_device_unlock(&port->dev);
633 }
634 
635 static void cxl_dport_remove(void *data)
636 {
637 	struct cxl_dport *dport = data;
638 	struct cxl_port *port = dport->port;
639 
640 	put_device(dport->dport);
641 	cond_cxl_root_lock(port);
642 	list_del(&dport->list);
643 	cond_cxl_root_unlock(port);
644 }
645 
646 static void cxl_dport_unlink(void *data)
647 {
648 	struct cxl_dport *dport = data;
649 	struct cxl_port *port = dport->port;
650 	char link_name[CXL_TARGET_STRLEN];
651 
652 	sprintf(link_name, "dport%d", dport->port_id);
653 	sysfs_remove_link(&port->dev.kobj, link_name);
654 }
655 
656 /**
657  * devm_cxl_add_dport - append downstream port data to a cxl_port
658  * @port: the cxl_port that references this dport
659  * @dport_dev: firmware or PCI device representing the dport
660  * @port_id: identifier for this dport in a decoder's target list
661  * @component_reg_phys: optional location of CXL component registers
662  *
663  * Note that dports are appended to the devm release action's of the
664  * either the port's host (for root ports), or the port itself (for
665  * switch ports)
666  */
667 struct cxl_dport *devm_cxl_add_dport(struct cxl_port *port,
668 				     struct device *dport_dev, int port_id,
669 				     resource_size_t component_reg_phys)
670 {
671 	char link_name[CXL_TARGET_STRLEN];
672 	struct cxl_dport *dport;
673 	struct device *host;
674 	int rc;
675 
676 	if (is_cxl_root(port))
677 		host = port->uport;
678 	else
679 		host = &port->dev;
680 
681 	if (!host->driver) {
682 		dev_WARN_ONCE(&port->dev, 1, "dport:%s bad devm context\n",
683 			      dev_name(dport_dev));
684 		return ERR_PTR(-ENXIO);
685 	}
686 
687 	if (snprintf(link_name, CXL_TARGET_STRLEN, "dport%d", port_id) >=
688 	    CXL_TARGET_STRLEN)
689 		return ERR_PTR(-EINVAL);
690 
691 	dport = devm_kzalloc(host, sizeof(*dport), GFP_KERNEL);
692 	if (!dport)
693 		return ERR_PTR(-ENOMEM);
694 
695 	INIT_LIST_HEAD(&dport->list);
696 	dport->dport = dport_dev;
697 	dport->port_id = port_id;
698 	dport->component_reg_phys = component_reg_phys;
699 	dport->port = port;
700 
701 	cond_cxl_root_lock(port);
702 	rc = add_dport(port, dport);
703 	cond_cxl_root_unlock(port);
704 	if (rc)
705 		return ERR_PTR(rc);
706 
707 	get_device(dport_dev);
708 	rc = devm_add_action_or_reset(host, cxl_dport_remove, dport);
709 	if (rc)
710 		return ERR_PTR(rc);
711 
712 	rc = sysfs_create_link(&port->dev.kobj, &dport_dev->kobj, link_name);
713 	if (rc)
714 		return ERR_PTR(rc);
715 
716 	rc = devm_add_action_or_reset(host, cxl_dport_unlink, dport);
717 	if (rc)
718 		return ERR_PTR(rc);
719 
720 	return dport;
721 }
722 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_dport, CXL);
723 
724 static struct cxl_ep *find_ep(struct cxl_port *port, struct device *ep_dev)
725 {
726 	struct cxl_ep *ep;
727 
728 	device_lock_assert(&port->dev);
729 	list_for_each_entry(ep, &port->endpoints, list)
730 		if (ep->ep == ep_dev)
731 			return ep;
732 	return NULL;
733 }
734 
735 static int add_ep(struct cxl_port *port, struct cxl_ep *new)
736 {
737 	struct cxl_ep *dup;
738 
739 	cxl_device_lock(&port->dev);
740 	if (port->dead) {
741 		cxl_device_unlock(&port->dev);
742 		return -ENXIO;
743 	}
744 	dup = find_ep(port, new->ep);
745 	if (!dup)
746 		list_add_tail(&new->list, &port->endpoints);
747 	cxl_device_unlock(&port->dev);
748 
749 	return dup ? -EEXIST : 0;
750 }
751 
752 /**
753  * cxl_add_ep - register an endpoint's interest in a port
754  * @port: a port in the endpoint's topology ancestry
755  * @ep_dev: device representing the endpoint
756  *
757  * Intermediate CXL ports are scanned based on the arrival of endpoints.
758  * When those endpoints depart the port can be destroyed once all
759  * endpoints that care about that port have been removed.
760  */
761 static int cxl_add_ep(struct cxl_port *port, struct device *ep_dev)
762 {
763 	struct cxl_ep *ep;
764 	int rc;
765 
766 	ep = kzalloc(sizeof(*ep), GFP_KERNEL);
767 	if (!ep)
768 		return -ENOMEM;
769 
770 	INIT_LIST_HEAD(&ep->list);
771 	ep->ep = get_device(ep_dev);
772 
773 	rc = add_ep(port, ep);
774 	if (rc)
775 		cxl_ep_release(ep);
776 	return rc;
777 }
778 
779 struct cxl_find_port_ctx {
780 	const struct device *dport_dev;
781 	const struct cxl_port *parent_port;
782 };
783 
784 static int match_port_by_dport(struct device *dev, const void *data)
785 {
786 	const struct cxl_find_port_ctx *ctx = data;
787 	struct cxl_port *port;
788 
789 	if (!is_cxl_port(dev))
790 		return 0;
791 	if (ctx->parent_port && dev->parent != &ctx->parent_port->dev)
792 		return 0;
793 
794 	port = to_cxl_port(dev);
795 	return cxl_find_dport_by_dev(port, ctx->dport_dev) != NULL;
796 }
797 
798 static struct cxl_port *__find_cxl_port(struct cxl_find_port_ctx *ctx)
799 {
800 	struct device *dev;
801 
802 	if (!ctx->dport_dev)
803 		return NULL;
804 
805 	dev = bus_find_device(&cxl_bus_type, NULL, ctx, match_port_by_dport);
806 	if (dev)
807 		return to_cxl_port(dev);
808 	return NULL;
809 }
810 
811 static struct cxl_port *find_cxl_port(struct device *dport_dev)
812 {
813 	struct cxl_find_port_ctx ctx = {
814 		.dport_dev = dport_dev,
815 	};
816 
817 	return __find_cxl_port(&ctx);
818 }
819 
820 static struct cxl_port *find_cxl_port_at(struct cxl_port *parent_port,
821 					 struct device *dport_dev)
822 {
823 	struct cxl_find_port_ctx ctx = {
824 		.dport_dev = dport_dev,
825 		.parent_port = parent_port,
826 	};
827 
828 	return __find_cxl_port(&ctx);
829 }
830 
831 /*
832  * All users of grandparent() are using it to walk PCIe-like swich port
833  * hierarchy. A PCIe switch is comprised of a bridge device representing the
834  * upstream switch port and N bridges representing downstream switch ports. When
835  * bridges stack the grand-parent of a downstream switch port is another
836  * downstream switch port in the immediate ancestor switch.
837  */
838 static struct device *grandparent(struct device *dev)
839 {
840 	if (dev && dev->parent)
841 		return dev->parent->parent;
842 	return NULL;
843 }
844 
845 static void delete_endpoint(void *data)
846 {
847 	struct cxl_memdev *cxlmd = data;
848 	struct cxl_port *endpoint = dev_get_drvdata(&cxlmd->dev);
849 	struct cxl_port *parent_port;
850 	struct device *parent;
851 
852 	parent_port = cxl_mem_find_port(cxlmd);
853 	if (!parent_port)
854 		goto out;
855 	parent = &parent_port->dev;
856 
857 	cxl_device_lock(parent);
858 	if (parent->driver && endpoint->uport) {
859 		devm_release_action(parent, cxl_unlink_uport, endpoint);
860 		devm_release_action(parent, unregister_port, endpoint);
861 	}
862 	cxl_device_unlock(parent);
863 	put_device(parent);
864 out:
865 	put_device(&endpoint->dev);
866 }
867 
868 int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint)
869 {
870 	struct device *dev = &cxlmd->dev;
871 
872 	get_device(&endpoint->dev);
873 	dev_set_drvdata(dev, endpoint);
874 	return devm_add_action_or_reset(dev, delete_endpoint, cxlmd);
875 }
876 EXPORT_SYMBOL_NS_GPL(cxl_endpoint_autoremove, CXL);
877 
878 /*
879  * The natural end of life of a non-root 'cxl_port' is when its parent port goes
880  * through a ->remove() event ("top-down" unregistration). The unnatural trigger
881  * for a port to be unregistered is when all memdevs beneath that port have gone
882  * through ->remove(). This "bottom-up" removal selectively removes individual
883  * child ports manually. This depends on devm_cxl_add_port() to not change is
884  * devm action registration order.
885  */
886 static void delete_switch_port(struct cxl_port *port, struct list_head *dports)
887 {
888 	struct cxl_dport *dport, *_d;
889 
890 	list_for_each_entry_safe(dport, _d, dports, list) {
891 		devm_release_action(&port->dev, cxl_dport_unlink, dport);
892 		devm_release_action(&port->dev, cxl_dport_remove, dport);
893 		devm_kfree(&port->dev, dport);
894 	}
895 	devm_release_action(port->dev.parent, cxl_unlink_uport, port);
896 	devm_release_action(port->dev.parent, unregister_port, port);
897 }
898 
899 static void cxl_detach_ep(void *data)
900 {
901 	struct cxl_memdev *cxlmd = data;
902 	struct device *iter;
903 
904 	for (iter = &cxlmd->dev; iter; iter = grandparent(iter)) {
905 		struct device *dport_dev = grandparent(iter);
906 		struct cxl_port *port, *parent_port;
907 		LIST_HEAD(reap_dports);
908 		struct cxl_ep *ep;
909 
910 		if (!dport_dev)
911 			break;
912 
913 		port = find_cxl_port(dport_dev);
914 		if (!port)
915 			continue;
916 
917 		if (is_cxl_root(port)) {
918 			put_device(&port->dev);
919 			continue;
920 		}
921 
922 		parent_port = to_cxl_port(port->dev.parent);
923 		cxl_device_lock(&parent_port->dev);
924 		if (!parent_port->dev.driver) {
925 			/*
926 			 * The bottom-up race to delete the port lost to a
927 			 * top-down port disable, give up here, because the
928 			 * parent_port ->remove() will have cleaned up all
929 			 * descendants.
930 			 */
931 			cxl_device_unlock(&parent_port->dev);
932 			put_device(&port->dev);
933 			continue;
934 		}
935 
936 		cxl_device_lock(&port->dev);
937 		ep = find_ep(port, &cxlmd->dev);
938 		dev_dbg(&cxlmd->dev, "disconnect %s from %s\n",
939 			ep ? dev_name(ep->ep) : "", dev_name(&port->dev));
940 		cxl_ep_release(ep);
941 		if (ep && !port->dead && list_empty(&port->endpoints) &&
942 		    !is_cxl_root(parent_port)) {
943 			/*
944 			 * This was the last ep attached to a dynamically
945 			 * enumerated port. Block new cxl_add_ep() and garbage
946 			 * collect the port.
947 			 */
948 			port->dead = true;
949 			list_splice_init(&port->dports, &reap_dports);
950 		}
951 		cxl_device_unlock(&port->dev);
952 
953 		if (!list_empty(&reap_dports)) {
954 			dev_dbg(&cxlmd->dev, "delete %s\n",
955 				dev_name(&port->dev));
956 			delete_switch_port(port, &reap_dports);
957 		}
958 		put_device(&port->dev);
959 		cxl_device_unlock(&parent_port->dev);
960 	}
961 }
962 
963 static resource_size_t find_component_registers(struct device *dev)
964 {
965 	struct cxl_register_map map;
966 	struct pci_dev *pdev;
967 
968 	/*
969 	 * Theoretically, CXL component registers can be hosted on a
970 	 * non-PCI device, in practice, only cxl_test hits this case.
971 	 */
972 	if (!dev_is_pci(dev))
973 		return CXL_RESOURCE_NONE;
974 
975 	pdev = to_pci_dev(dev);
976 
977 	cxl_find_regblock(pdev, CXL_REGLOC_RBI_COMPONENT, &map);
978 	return cxl_regmap_to_base(pdev, &map);
979 }
980 
981 static int add_port_attach_ep(struct cxl_memdev *cxlmd,
982 			      struct device *uport_dev,
983 			      struct device *dport_dev)
984 {
985 	struct device *dparent = grandparent(dport_dev);
986 	struct cxl_port *port, *parent_port = NULL;
987 	resource_size_t component_reg_phys;
988 	int rc;
989 
990 	if (!dparent) {
991 		/*
992 		 * The iteration reached the topology root without finding the
993 		 * CXL-root 'cxl_port' on a previous iteration, fail for now to
994 		 * be re-probed after platform driver attaches.
995 		 */
996 		dev_dbg(&cxlmd->dev, "%s is a root dport\n",
997 			dev_name(dport_dev));
998 		return -ENXIO;
999 	}
1000 
1001 	parent_port = find_cxl_port(dparent);
1002 	if (!parent_port) {
1003 		/* iterate to create this parent_port */
1004 		return -EAGAIN;
1005 	}
1006 
1007 	cxl_device_lock(&parent_port->dev);
1008 	if (!parent_port->dev.driver) {
1009 		dev_warn(&cxlmd->dev,
1010 			 "port %s:%s disabled, failed to enumerate CXL.mem\n",
1011 			 dev_name(&parent_port->dev), dev_name(uport_dev));
1012 		port = ERR_PTR(-ENXIO);
1013 		goto out;
1014 	}
1015 
1016 	port = find_cxl_port_at(parent_port, dport_dev);
1017 	if (!port) {
1018 		component_reg_phys = find_component_registers(uport_dev);
1019 		port = devm_cxl_add_port(&parent_port->dev, uport_dev,
1020 					 component_reg_phys, parent_port);
1021 		if (!IS_ERR(port))
1022 			get_device(&port->dev);
1023 	}
1024 out:
1025 	cxl_device_unlock(&parent_port->dev);
1026 
1027 	if (IS_ERR(port))
1028 		rc = PTR_ERR(port);
1029 	else {
1030 		dev_dbg(&cxlmd->dev, "add to new port %s:%s\n",
1031 			dev_name(&port->dev), dev_name(port->uport));
1032 		rc = cxl_add_ep(port, &cxlmd->dev);
1033 		if (rc == -EEXIST) {
1034 			/*
1035 			 * "can't" happen, but this error code means
1036 			 * something to the caller, so translate it.
1037 			 */
1038 			rc = -ENXIO;
1039 		}
1040 		put_device(&port->dev);
1041 	}
1042 
1043 	put_device(&parent_port->dev);
1044 	return rc;
1045 }
1046 
1047 int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd)
1048 {
1049 	struct device *dev = &cxlmd->dev;
1050 	struct device *iter;
1051 	int rc;
1052 
1053 	rc = devm_add_action_or_reset(&cxlmd->dev, cxl_detach_ep, cxlmd);
1054 	if (rc)
1055 		return rc;
1056 
1057 	/*
1058 	 * Scan for and add all cxl_ports in this device's ancestry.
1059 	 * Repeat until no more ports are added. Abort if a port add
1060 	 * attempt fails.
1061 	 */
1062 retry:
1063 	for (iter = dev; iter; iter = grandparent(iter)) {
1064 		struct device *dport_dev = grandparent(iter);
1065 		struct device *uport_dev;
1066 		struct cxl_port *port;
1067 
1068 		if (!dport_dev)
1069 			return 0;
1070 
1071 		uport_dev = dport_dev->parent;
1072 		if (!uport_dev) {
1073 			dev_warn(dev, "at %s no parent for dport: %s\n",
1074 				 dev_name(iter), dev_name(dport_dev));
1075 			return -ENXIO;
1076 		}
1077 
1078 		dev_dbg(dev, "scan: iter: %s dport_dev: %s parent: %s\n",
1079 			dev_name(iter), dev_name(dport_dev),
1080 			dev_name(uport_dev));
1081 		port = find_cxl_port(dport_dev);
1082 		if (port) {
1083 			dev_dbg(&cxlmd->dev,
1084 				"found already registered port %s:%s\n",
1085 				dev_name(&port->dev), dev_name(port->uport));
1086 			rc = cxl_add_ep(port, &cxlmd->dev);
1087 
1088 			/*
1089 			 * If the endpoint already exists in the port's list,
1090 			 * that's ok, it was added on a previous pass.
1091 			 * Otherwise, retry in add_port_attach_ep() after taking
1092 			 * the parent_port lock as the current port may be being
1093 			 * reaped.
1094 			 */
1095 			if (rc && rc != -EEXIST) {
1096 				put_device(&port->dev);
1097 				return rc;
1098 			}
1099 
1100 			/* Any more ports to add between this one and the root? */
1101 			if (!dev_is_cxl_root_child(&port->dev)) {
1102 				put_device(&port->dev);
1103 				continue;
1104 			}
1105 
1106 			put_device(&port->dev);
1107 			return 0;
1108 		}
1109 
1110 		rc = add_port_attach_ep(cxlmd, uport_dev, dport_dev);
1111 		/* port missing, try to add parent */
1112 		if (rc == -EAGAIN)
1113 			continue;
1114 		/* failed to add ep or port */
1115 		if (rc)
1116 			return rc;
1117 		/* port added, new descendants possible, start over */
1118 		goto retry;
1119 	}
1120 
1121 	return 0;
1122 }
1123 EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_ports, CXL);
1124 
1125 struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd)
1126 {
1127 	return find_cxl_port(grandparent(&cxlmd->dev));
1128 }
1129 EXPORT_SYMBOL_NS_GPL(cxl_mem_find_port, CXL);
1130 
1131 struct cxl_dport *cxl_find_dport_by_dev(struct cxl_port *port,
1132 					const struct device *dev)
1133 {
1134 	struct cxl_dport *dport;
1135 
1136 	cxl_device_lock(&port->dev);
1137 	list_for_each_entry(dport, &port->dports, list)
1138 		if (dport->dport == dev) {
1139 			cxl_device_unlock(&port->dev);
1140 			return dport;
1141 		}
1142 
1143 	cxl_device_unlock(&port->dev);
1144 	return NULL;
1145 }
1146 EXPORT_SYMBOL_NS_GPL(cxl_find_dport_by_dev, CXL);
1147 
1148 static int decoder_populate_targets(struct cxl_decoder *cxld,
1149 				    struct cxl_port *port, int *target_map)
1150 {
1151 	int i, rc = 0;
1152 
1153 	if (!target_map)
1154 		return 0;
1155 
1156 	device_lock_assert(&port->dev);
1157 
1158 	if (list_empty(&port->dports))
1159 		return -EINVAL;
1160 
1161 	write_seqlock(&cxld->target_lock);
1162 	for (i = 0; i < cxld->nr_targets; i++) {
1163 		struct cxl_dport *dport = find_dport(port, target_map[i]);
1164 
1165 		if (!dport) {
1166 			rc = -ENXIO;
1167 			break;
1168 		}
1169 		cxld->target[i] = dport;
1170 	}
1171 	write_sequnlock(&cxld->target_lock);
1172 
1173 	return rc;
1174 }
1175 
1176 /**
1177  * cxl_decoder_alloc - Allocate a new CXL decoder
1178  * @port: owning port of this decoder
1179  * @nr_targets: downstream targets accessible by this decoder. All upstream
1180  *		ports and root ports must have at least 1 target. Endpoint
1181  *		devices will have 0 targets. Callers wishing to register an
1182  *		endpoint device should specify 0.
1183  *
1184  * A port should contain one or more decoders. Each of those decoders enable
1185  * some address space for CXL.mem utilization. A decoder is expected to be
1186  * configured by the caller before registering.
1187  *
1188  * Return: A new cxl decoder to be registered by cxl_decoder_add(). The decoder
1189  *	   is initialized to be a "passthrough" decoder.
1190  */
1191 static struct cxl_decoder *cxl_decoder_alloc(struct cxl_port *port,
1192 					     unsigned int nr_targets)
1193 {
1194 	struct cxl_decoder *cxld;
1195 	struct device *dev;
1196 	int rc = 0;
1197 
1198 	if (nr_targets > CXL_DECODER_MAX_INTERLEAVE)
1199 		return ERR_PTR(-EINVAL);
1200 
1201 	cxld = kzalloc(struct_size(cxld, target, nr_targets), GFP_KERNEL);
1202 	if (!cxld)
1203 		return ERR_PTR(-ENOMEM);
1204 
1205 	rc = ida_alloc(&port->decoder_ida, GFP_KERNEL);
1206 	if (rc < 0)
1207 		goto err;
1208 
1209 	/* need parent to stick around to release the id */
1210 	get_device(&port->dev);
1211 	cxld->id = rc;
1212 
1213 	cxld->nr_targets = nr_targets;
1214 	seqlock_init(&cxld->target_lock);
1215 	dev = &cxld->dev;
1216 	device_initialize(dev);
1217 	device_set_pm_not_required(dev);
1218 	dev->parent = &port->dev;
1219 	dev->bus = &cxl_bus_type;
1220 	if (is_cxl_root(port))
1221 		cxld->dev.type = &cxl_decoder_root_type;
1222 	else if (is_cxl_endpoint(port))
1223 		cxld->dev.type = &cxl_decoder_endpoint_type;
1224 	else
1225 		cxld->dev.type = &cxl_decoder_switch_type;
1226 
1227 	/* Pre initialize an "empty" decoder */
1228 	cxld->interleave_ways = 1;
1229 	cxld->interleave_granularity = PAGE_SIZE;
1230 	cxld->target_type = CXL_DECODER_EXPANDER;
1231 	cxld->platform_res = (struct resource)DEFINE_RES_MEM(0, 0);
1232 
1233 	return cxld;
1234 err:
1235 	kfree(cxld);
1236 	return ERR_PTR(rc);
1237 }
1238 
1239 /**
1240  * cxl_root_decoder_alloc - Allocate a root level decoder
1241  * @port: owning CXL root of this decoder
1242  * @nr_targets: static number of downstream targets
1243  *
1244  * Return: A new cxl decoder to be registered by cxl_decoder_add(). A
1245  * 'CXL root' decoder is one that decodes from a top-level / static platform
1246  * firmware description of CXL resources into a CXL standard decode
1247  * topology.
1248  */
1249 struct cxl_decoder *cxl_root_decoder_alloc(struct cxl_port *port,
1250 					   unsigned int nr_targets)
1251 {
1252 	if (!is_cxl_root(port))
1253 		return ERR_PTR(-EINVAL);
1254 
1255 	return cxl_decoder_alloc(port, nr_targets);
1256 }
1257 EXPORT_SYMBOL_NS_GPL(cxl_root_decoder_alloc, CXL);
1258 
1259 /**
1260  * cxl_switch_decoder_alloc - Allocate a switch level decoder
1261  * @port: owning CXL switch port of this decoder
1262  * @nr_targets: max number of dynamically addressable downstream targets
1263  *
1264  * Return: A new cxl decoder to be registered by cxl_decoder_add(). A
1265  * 'switch' decoder is any decoder that can be enumerated by PCIe
1266  * topology and the HDM Decoder Capability. This includes the decoders
1267  * that sit between Switch Upstream Ports / Switch Downstream Ports and
1268  * Host Bridges / Root Ports.
1269  */
1270 struct cxl_decoder *cxl_switch_decoder_alloc(struct cxl_port *port,
1271 					     unsigned int nr_targets)
1272 {
1273 	if (is_cxl_root(port) || is_cxl_endpoint(port))
1274 		return ERR_PTR(-EINVAL);
1275 
1276 	return cxl_decoder_alloc(port, nr_targets);
1277 }
1278 EXPORT_SYMBOL_NS_GPL(cxl_switch_decoder_alloc, CXL);
1279 
1280 /**
1281  * cxl_endpoint_decoder_alloc - Allocate an endpoint decoder
1282  * @port: owning port of this decoder
1283  *
1284  * Return: A new cxl decoder to be registered by cxl_decoder_add()
1285  */
1286 struct cxl_decoder *cxl_endpoint_decoder_alloc(struct cxl_port *port)
1287 {
1288 	if (!is_cxl_endpoint(port))
1289 		return ERR_PTR(-EINVAL);
1290 
1291 	return cxl_decoder_alloc(port, 0);
1292 }
1293 EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_alloc, CXL);
1294 
1295 /**
1296  * cxl_decoder_add_locked - Add a decoder with targets
1297  * @cxld: The cxl decoder allocated by cxl_decoder_alloc()
1298  * @target_map: A list of downstream ports that this decoder can direct memory
1299  *              traffic to. These numbers should correspond with the port number
1300  *              in the PCIe Link Capabilities structure.
1301  *
1302  * Certain types of decoders may not have any targets. The main example of this
1303  * is an endpoint device. A more awkward example is a hostbridge whose root
1304  * ports get hot added (technically possible, though unlikely).
1305  *
1306  * This is the locked variant of cxl_decoder_add().
1307  *
1308  * Context: Process context. Expects the device lock of the port that owns the
1309  *	    @cxld to be held.
1310  *
1311  * Return: Negative error code if the decoder wasn't properly configured; else
1312  *	   returns 0.
1313  */
1314 int cxl_decoder_add_locked(struct cxl_decoder *cxld, int *target_map)
1315 {
1316 	struct cxl_port *port;
1317 	struct device *dev;
1318 	int rc;
1319 
1320 	if (WARN_ON_ONCE(!cxld))
1321 		return -EINVAL;
1322 
1323 	if (WARN_ON_ONCE(IS_ERR(cxld)))
1324 		return PTR_ERR(cxld);
1325 
1326 	if (cxld->interleave_ways < 1)
1327 		return -EINVAL;
1328 
1329 	dev = &cxld->dev;
1330 
1331 	port = to_cxl_port(cxld->dev.parent);
1332 	if (!is_endpoint_decoder(dev)) {
1333 		rc = decoder_populate_targets(cxld, port, target_map);
1334 		if (rc && (cxld->flags & CXL_DECODER_F_ENABLE)) {
1335 			dev_err(&port->dev,
1336 				"Failed to populate active decoder targets\n");
1337 			return rc;
1338 		}
1339 	}
1340 
1341 	rc = dev_set_name(dev, "decoder%d.%d", port->id, cxld->id);
1342 	if (rc)
1343 		return rc;
1344 
1345 	/*
1346 	 * Platform decoder resources should show up with a reasonable name. All
1347 	 * other resources are just sub ranges within the main decoder resource.
1348 	 */
1349 	if (is_root_decoder(dev))
1350 		cxld->platform_res.name = dev_name(dev);
1351 
1352 	return device_add(dev);
1353 }
1354 EXPORT_SYMBOL_NS_GPL(cxl_decoder_add_locked, CXL);
1355 
1356 /**
1357  * cxl_decoder_add - Add a decoder with targets
1358  * @cxld: The cxl decoder allocated by cxl_decoder_alloc()
1359  * @target_map: A list of downstream ports that this decoder can direct memory
1360  *              traffic to. These numbers should correspond with the port number
1361  *              in the PCIe Link Capabilities structure.
1362  *
1363  * This is the unlocked variant of cxl_decoder_add_locked().
1364  * See cxl_decoder_add_locked().
1365  *
1366  * Context: Process context. Takes and releases the device lock of the port that
1367  *	    owns the @cxld.
1368  */
1369 int cxl_decoder_add(struct cxl_decoder *cxld, int *target_map)
1370 {
1371 	struct cxl_port *port;
1372 	int rc;
1373 
1374 	if (WARN_ON_ONCE(!cxld))
1375 		return -EINVAL;
1376 
1377 	if (WARN_ON_ONCE(IS_ERR(cxld)))
1378 		return PTR_ERR(cxld);
1379 
1380 	port = to_cxl_port(cxld->dev.parent);
1381 
1382 	cxl_device_lock(&port->dev);
1383 	rc = cxl_decoder_add_locked(cxld, target_map);
1384 	cxl_device_unlock(&port->dev);
1385 
1386 	return rc;
1387 }
1388 EXPORT_SYMBOL_NS_GPL(cxl_decoder_add, CXL);
1389 
1390 static void cxld_unregister(void *dev)
1391 {
1392 	device_unregister(dev);
1393 }
1394 
1395 int cxl_decoder_autoremove(struct device *host, struct cxl_decoder *cxld)
1396 {
1397 	return devm_add_action_or_reset(host, cxld_unregister, &cxld->dev);
1398 }
1399 EXPORT_SYMBOL_NS_GPL(cxl_decoder_autoremove, CXL);
1400 
1401 /**
1402  * __cxl_driver_register - register a driver for the cxl bus
1403  * @cxl_drv: cxl driver structure to attach
1404  * @owner: owning module/driver
1405  * @modname: KBUILD_MODNAME for parent driver
1406  */
1407 int __cxl_driver_register(struct cxl_driver *cxl_drv, struct module *owner,
1408 			  const char *modname)
1409 {
1410 	if (!cxl_drv->probe) {
1411 		pr_debug("%s ->probe() must be specified\n", modname);
1412 		return -EINVAL;
1413 	}
1414 
1415 	if (!cxl_drv->name) {
1416 		pr_debug("%s ->name must be specified\n", modname);
1417 		return -EINVAL;
1418 	}
1419 
1420 	if (!cxl_drv->id) {
1421 		pr_debug("%s ->id must be specified\n", modname);
1422 		return -EINVAL;
1423 	}
1424 
1425 	cxl_drv->drv.bus = &cxl_bus_type;
1426 	cxl_drv->drv.owner = owner;
1427 	cxl_drv->drv.mod_name = modname;
1428 	cxl_drv->drv.name = cxl_drv->name;
1429 
1430 	return driver_register(&cxl_drv->drv);
1431 }
1432 EXPORT_SYMBOL_NS_GPL(__cxl_driver_register, CXL);
1433 
1434 void cxl_driver_unregister(struct cxl_driver *cxl_drv)
1435 {
1436 	driver_unregister(&cxl_drv->drv);
1437 }
1438 EXPORT_SYMBOL_NS_GPL(cxl_driver_unregister, CXL);
1439 
1440 static int cxl_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
1441 {
1442 	return add_uevent_var(env, "MODALIAS=" CXL_MODALIAS_FMT,
1443 			      cxl_device_id(dev));
1444 }
1445 
1446 static int cxl_bus_match(struct device *dev, struct device_driver *drv)
1447 {
1448 	return cxl_device_id(dev) == to_cxl_drv(drv)->id;
1449 }
1450 
1451 static int cxl_bus_probe(struct device *dev)
1452 {
1453 	int rc;
1454 
1455 	/*
1456 	 * Take the CXL nested lock since the driver core only holds
1457 	 * @dev->mutex and not @dev->lockdep_mutex.
1458 	 */
1459 	cxl_nested_lock(dev);
1460 	rc = to_cxl_drv(dev->driver)->probe(dev);
1461 	cxl_nested_unlock(dev);
1462 
1463 	dev_dbg(dev, "probe: %d\n", rc);
1464 	return rc;
1465 }
1466 
1467 static void cxl_bus_remove(struct device *dev)
1468 {
1469 	struct cxl_driver *cxl_drv = to_cxl_drv(dev->driver);
1470 
1471 	cxl_nested_lock(dev);
1472 	if (cxl_drv->remove)
1473 		cxl_drv->remove(dev);
1474 	cxl_nested_unlock(dev);
1475 }
1476 
1477 static struct workqueue_struct *cxl_bus_wq;
1478 
1479 int cxl_bus_rescan(void)
1480 {
1481 	return bus_rescan_devices(&cxl_bus_type);
1482 }
1483 EXPORT_SYMBOL_NS_GPL(cxl_bus_rescan, CXL);
1484 
1485 bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd)
1486 {
1487 	return queue_work(cxl_bus_wq, &cxlmd->detach_work);
1488 }
1489 EXPORT_SYMBOL_NS_GPL(schedule_cxl_memdev_detach, CXL);
1490 
1491 /* for user tooling to ensure port disable work has completed */
1492 static ssize_t flush_store(struct bus_type *bus, const char *buf, size_t count)
1493 {
1494 	if (sysfs_streq(buf, "1")) {
1495 		flush_workqueue(cxl_bus_wq);
1496 		return count;
1497 	}
1498 
1499 	return -EINVAL;
1500 }
1501 
1502 static BUS_ATTR_WO(flush);
1503 
1504 static struct attribute *cxl_bus_attributes[] = {
1505 	&bus_attr_flush.attr,
1506 	NULL,
1507 };
1508 
1509 static struct attribute_group cxl_bus_attribute_group = {
1510 	.attrs = cxl_bus_attributes,
1511 };
1512 
1513 static const struct attribute_group *cxl_bus_attribute_groups[] = {
1514 	&cxl_bus_attribute_group,
1515 	NULL,
1516 };
1517 
1518 struct bus_type cxl_bus_type = {
1519 	.name = "cxl",
1520 	.uevent = cxl_bus_uevent,
1521 	.match = cxl_bus_match,
1522 	.probe = cxl_bus_probe,
1523 	.remove = cxl_bus_remove,
1524 	.bus_groups = cxl_bus_attribute_groups,
1525 };
1526 EXPORT_SYMBOL_NS_GPL(cxl_bus_type, CXL);
1527 
1528 static __init int cxl_core_init(void)
1529 {
1530 	int rc;
1531 
1532 	cxl_mbox_init();
1533 
1534 	rc = cxl_memdev_init();
1535 	if (rc)
1536 		return rc;
1537 
1538 	cxl_bus_wq = alloc_ordered_workqueue("cxl_port", 0);
1539 	if (!cxl_bus_wq) {
1540 		rc = -ENOMEM;
1541 		goto err_wq;
1542 	}
1543 
1544 	rc = bus_register(&cxl_bus_type);
1545 	if (rc)
1546 		goto err_bus;
1547 
1548 	return 0;
1549 
1550 err_bus:
1551 	destroy_workqueue(cxl_bus_wq);
1552 err_wq:
1553 	cxl_memdev_exit();
1554 	cxl_mbox_exit();
1555 	return rc;
1556 }
1557 
1558 static void cxl_core_exit(void)
1559 {
1560 	bus_unregister(&cxl_bus_type);
1561 	destroy_workqueue(cxl_bus_wq);
1562 	cxl_memdev_exit();
1563 	cxl_mbox_exit();
1564 }
1565 
1566 module_init(cxl_core_init);
1567 module_exit(cxl_core_exit);
1568 MODULE_LICENSE("GPL v2");
1569