cxl/port: Fix missing target list lock
[platform/kernel/linux-starfive.git] / drivers / cxl / core / port.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2020 Intel Corporation. All rights reserved. */
3 #include <linux/platform_device.h>
4 #include <linux/memregion.h>
5 #include <linux/workqueue.h>
6 #include <linux/debugfs.h>
7 #include <linux/device.h>
8 #include <linux/module.h>
9 #include <linux/pci.h>
10 #include <linux/slab.h>
11 #include <linux/idr.h>
12 #include <cxlmem.h>
13 #include <cxlpci.h>
14 #include <cxl.h>
15 #include "core.h"
16
17 /**
18  * DOC: cxl core
19  *
20  * The CXL core provides a set of interfaces that can be consumed by CXL aware
21  * drivers. The interfaces allow for creation, modification, and destruction of
22  * regions, memory devices, ports, and decoders. CXL aware drivers must register
23  * with the CXL core via these interfaces in order to be able to participate in
24  * cross-device interleave coordination. The CXL core also establishes and
25  * maintains the bridge to the nvdimm subsystem.
26  *
27  * CXL core introduces sysfs hierarchy to control the devices that are
28  * instantiated by the core.
29  */
30
31 /*
32  * All changes to the interleave configuration occur with this lock held
33  * for write.
34  */
35 DECLARE_RWSEM(cxl_region_rwsem);
36
37 static DEFINE_IDA(cxl_port_ida);
38 static DEFINE_XARRAY(cxl_root_buses);
39
40 int cxl_num_decoders_committed(struct cxl_port *port)
41 {
42         lockdep_assert_held(&cxl_region_rwsem);
43
44         return port->commit_end + 1;
45 }
46
47 static ssize_t devtype_show(struct device *dev, struct device_attribute *attr,
48                             char *buf)
49 {
50         return sysfs_emit(buf, "%s\n", dev->type->name);
51 }
52 static DEVICE_ATTR_RO(devtype);
53
54 static int cxl_device_id(const struct device *dev)
55 {
56         if (dev->type == &cxl_nvdimm_bridge_type)
57                 return CXL_DEVICE_NVDIMM_BRIDGE;
58         if (dev->type == &cxl_nvdimm_type)
59                 return CXL_DEVICE_NVDIMM;
60         if (dev->type == CXL_PMEM_REGION_TYPE())
61                 return CXL_DEVICE_PMEM_REGION;
62         if (dev->type == CXL_DAX_REGION_TYPE())
63                 return CXL_DEVICE_DAX_REGION;
64         if (is_cxl_port(dev)) {
65                 if (is_cxl_root(to_cxl_port(dev)))
66                         return CXL_DEVICE_ROOT;
67                 return CXL_DEVICE_PORT;
68         }
69         if (is_cxl_memdev(dev))
70                 return CXL_DEVICE_MEMORY_EXPANDER;
71         if (dev->type == CXL_REGION_TYPE())
72                 return CXL_DEVICE_REGION;
73         if (dev->type == &cxl_pmu_type)
74                 return CXL_DEVICE_PMU;
75         return 0;
76 }
77
78 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
79                              char *buf)
80 {
81         return sysfs_emit(buf, CXL_MODALIAS_FMT "\n", cxl_device_id(dev));
82 }
83 static DEVICE_ATTR_RO(modalias);
84
85 static struct attribute *cxl_base_attributes[] = {
86         &dev_attr_devtype.attr,
87         &dev_attr_modalias.attr,
88         NULL,
89 };
90
91 struct attribute_group cxl_base_attribute_group = {
92         .attrs = cxl_base_attributes,
93 };
94
95 static ssize_t start_show(struct device *dev, struct device_attribute *attr,
96                           char *buf)
97 {
98         struct cxl_decoder *cxld = to_cxl_decoder(dev);
99
100         return sysfs_emit(buf, "%#llx\n", cxld->hpa_range.start);
101 }
102 static DEVICE_ATTR_ADMIN_RO(start);
103
104 static ssize_t size_show(struct device *dev, struct device_attribute *attr,
105                         char *buf)
106 {
107         struct cxl_decoder *cxld = to_cxl_decoder(dev);
108
109         return sysfs_emit(buf, "%#llx\n", range_len(&cxld->hpa_range));
110 }
111 static DEVICE_ATTR_RO(size);
112
113 #define CXL_DECODER_FLAG_ATTR(name, flag)                            \
114 static ssize_t name##_show(struct device *dev,                       \
115                            struct device_attribute *attr, char *buf) \
116 {                                                                    \
117         struct cxl_decoder *cxld = to_cxl_decoder(dev);              \
118                                                                      \
119         return sysfs_emit(buf, "%s\n",                               \
120                           (cxld->flags & (flag)) ? "1" : "0");       \
121 }                                                                    \
122 static DEVICE_ATTR_RO(name)
123
124 CXL_DECODER_FLAG_ATTR(cap_pmem, CXL_DECODER_F_PMEM);
125 CXL_DECODER_FLAG_ATTR(cap_ram, CXL_DECODER_F_RAM);
126 CXL_DECODER_FLAG_ATTR(cap_type2, CXL_DECODER_F_TYPE2);
127 CXL_DECODER_FLAG_ATTR(cap_type3, CXL_DECODER_F_TYPE3);
128 CXL_DECODER_FLAG_ATTR(locked, CXL_DECODER_F_LOCK);
129
130 static ssize_t target_type_show(struct device *dev,
131                                 struct device_attribute *attr, char *buf)
132 {
133         struct cxl_decoder *cxld = to_cxl_decoder(dev);
134
135         switch (cxld->target_type) {
136         case CXL_DECODER_DEVMEM:
137                 return sysfs_emit(buf, "accelerator\n");
138         case CXL_DECODER_HOSTONLYMEM:
139                 return sysfs_emit(buf, "expander\n");
140         }
141         return -ENXIO;
142 }
143 static DEVICE_ATTR_RO(target_type);
144
145 static ssize_t emit_target_list(struct cxl_switch_decoder *cxlsd, char *buf)
146 {
147         struct cxl_decoder *cxld = &cxlsd->cxld;
148         ssize_t offset = 0;
149         int i, rc = 0;
150
151         for (i = 0; i < cxld->interleave_ways; i++) {
152                 struct cxl_dport *dport = cxlsd->target[i];
153                 struct cxl_dport *next = NULL;
154
155                 if (!dport)
156                         break;
157
158                 if (i + 1 < cxld->interleave_ways)
159                         next = cxlsd->target[i + 1];
160                 rc = sysfs_emit_at(buf, offset, "%d%s", dport->port_id,
161                                    next ? "," : "");
162                 if (rc < 0)
163                         return rc;
164                 offset += rc;
165         }
166
167         return offset;
168 }
169
170 static ssize_t target_list_show(struct device *dev,
171                                 struct device_attribute *attr, char *buf)
172 {
173         struct cxl_switch_decoder *cxlsd = to_cxl_switch_decoder(dev);
174         ssize_t offset;
175         int rc;
176
177         guard(rwsem_read)(&cxl_region_rwsem);
178         rc = emit_target_list(cxlsd, buf);
179         if (rc < 0)
180                 return rc;
181         offset = rc;
182
183         rc = sysfs_emit_at(buf, offset, "\n");
184         if (rc < 0)
185                 return rc;
186
187         return offset + rc;
188 }
189 static DEVICE_ATTR_RO(target_list);
190
191 static ssize_t mode_show(struct device *dev, struct device_attribute *attr,
192                          char *buf)
193 {
194         struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev);
195
196         return sysfs_emit(buf, "%s\n", cxl_decoder_mode_name(cxled->mode));
197 }
198
199 static ssize_t mode_store(struct device *dev, struct device_attribute *attr,
200                           const char *buf, size_t len)
201 {
202         struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev);
203         enum cxl_decoder_mode mode;
204         ssize_t rc;
205
206         if (sysfs_streq(buf, "pmem"))
207                 mode = CXL_DECODER_PMEM;
208         else if (sysfs_streq(buf, "ram"))
209                 mode = CXL_DECODER_RAM;
210         else
211                 return -EINVAL;
212
213         rc = cxl_dpa_set_mode(cxled, mode);
214         if (rc)
215                 return rc;
216
217         return len;
218 }
219 static DEVICE_ATTR_RW(mode);
220
221 static ssize_t dpa_resource_show(struct device *dev, struct device_attribute *attr,
222                             char *buf)
223 {
224         struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev);
225
226         guard(rwsem_read)(&cxl_dpa_rwsem);
227         return sysfs_emit(buf, "%#llx\n", (u64)cxl_dpa_resource_start(cxled));
228 }
229 static DEVICE_ATTR_RO(dpa_resource);
230
231 static ssize_t dpa_size_show(struct device *dev, struct device_attribute *attr,
232                              char *buf)
233 {
234         struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev);
235         resource_size_t size = cxl_dpa_size(cxled);
236
237         return sysfs_emit(buf, "%pa\n", &size);
238 }
239
240 static ssize_t dpa_size_store(struct device *dev, struct device_attribute *attr,
241                               const char *buf, size_t len)
242 {
243         struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev);
244         unsigned long long size;
245         ssize_t rc;
246
247         rc = kstrtoull(buf, 0, &size);
248         if (rc)
249                 return rc;
250
251         if (!IS_ALIGNED(size, SZ_256M))
252                 return -EINVAL;
253
254         rc = cxl_dpa_free(cxled);
255         if (rc)
256                 return rc;
257
258         if (size == 0)
259                 return len;
260
261         rc = cxl_dpa_alloc(cxled, size);
262         if (rc)
263                 return rc;
264
265         return len;
266 }
267 static DEVICE_ATTR_RW(dpa_size);
268
269 static ssize_t interleave_granularity_show(struct device *dev,
270                                            struct device_attribute *attr,
271                                            char *buf)
272 {
273         struct cxl_decoder *cxld = to_cxl_decoder(dev);
274
275         return sysfs_emit(buf, "%d\n", cxld->interleave_granularity);
276 }
277
278 static DEVICE_ATTR_RO(interleave_granularity);
279
280 static ssize_t interleave_ways_show(struct device *dev,
281                                     struct device_attribute *attr, char *buf)
282 {
283         struct cxl_decoder *cxld = to_cxl_decoder(dev);
284
285         return sysfs_emit(buf, "%d\n", cxld->interleave_ways);
286 }
287
288 static DEVICE_ATTR_RO(interleave_ways);
289
290 static struct attribute *cxl_decoder_base_attrs[] = {
291         &dev_attr_start.attr,
292         &dev_attr_size.attr,
293         &dev_attr_locked.attr,
294         &dev_attr_interleave_granularity.attr,
295         &dev_attr_interleave_ways.attr,
296         NULL,
297 };
298
299 static struct attribute_group cxl_decoder_base_attribute_group = {
300         .attrs = cxl_decoder_base_attrs,
301 };
302
303 static struct attribute *cxl_decoder_root_attrs[] = {
304         &dev_attr_cap_pmem.attr,
305         &dev_attr_cap_ram.attr,
306         &dev_attr_cap_type2.attr,
307         &dev_attr_cap_type3.attr,
308         &dev_attr_target_list.attr,
309         SET_CXL_REGION_ATTR(create_pmem_region)
310         SET_CXL_REGION_ATTR(create_ram_region)
311         SET_CXL_REGION_ATTR(delete_region)
312         NULL,
313 };
314
315 static bool can_create_pmem(struct cxl_root_decoder *cxlrd)
316 {
317         unsigned long flags = CXL_DECODER_F_TYPE3 | CXL_DECODER_F_PMEM;
318
319         return (cxlrd->cxlsd.cxld.flags & flags) == flags;
320 }
321
322 static bool can_create_ram(struct cxl_root_decoder *cxlrd)
323 {
324         unsigned long flags = CXL_DECODER_F_TYPE3 | CXL_DECODER_F_RAM;
325
326         return (cxlrd->cxlsd.cxld.flags & flags) == flags;
327 }
328
329 static umode_t cxl_root_decoder_visible(struct kobject *kobj, struct attribute *a, int n)
330 {
331         struct device *dev = kobj_to_dev(kobj);
332         struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
333
334         if (a == CXL_REGION_ATTR(create_pmem_region) && !can_create_pmem(cxlrd))
335                 return 0;
336
337         if (a == CXL_REGION_ATTR(create_ram_region) && !can_create_ram(cxlrd))
338                 return 0;
339
340         if (a == CXL_REGION_ATTR(delete_region) &&
341             !(can_create_pmem(cxlrd) || can_create_ram(cxlrd)))
342                 return 0;
343
344         return a->mode;
345 }
346
347 static struct attribute_group cxl_decoder_root_attribute_group = {
348         .attrs = cxl_decoder_root_attrs,
349         .is_visible = cxl_root_decoder_visible,
350 };
351
352 static const struct attribute_group *cxl_decoder_root_attribute_groups[] = {
353         &cxl_decoder_root_attribute_group,
354         &cxl_decoder_base_attribute_group,
355         &cxl_base_attribute_group,
356         NULL,
357 };
358
359 static struct attribute *cxl_decoder_switch_attrs[] = {
360         &dev_attr_target_type.attr,
361         &dev_attr_target_list.attr,
362         SET_CXL_REGION_ATTR(region)
363         NULL,
364 };
365
366 static struct attribute_group cxl_decoder_switch_attribute_group = {
367         .attrs = cxl_decoder_switch_attrs,
368 };
369
370 static const struct attribute_group *cxl_decoder_switch_attribute_groups[] = {
371         &cxl_decoder_switch_attribute_group,
372         &cxl_decoder_base_attribute_group,
373         &cxl_base_attribute_group,
374         NULL,
375 };
376
377 static struct attribute *cxl_decoder_endpoint_attrs[] = {
378         &dev_attr_target_type.attr,
379         &dev_attr_mode.attr,
380         &dev_attr_dpa_size.attr,
381         &dev_attr_dpa_resource.attr,
382         SET_CXL_REGION_ATTR(region)
383         NULL,
384 };
385
386 static struct attribute_group cxl_decoder_endpoint_attribute_group = {
387         .attrs = cxl_decoder_endpoint_attrs,
388 };
389
390 static const struct attribute_group *cxl_decoder_endpoint_attribute_groups[] = {
391         &cxl_decoder_base_attribute_group,
392         &cxl_decoder_endpoint_attribute_group,
393         &cxl_base_attribute_group,
394         NULL,
395 };
396
397 static void __cxl_decoder_release(struct cxl_decoder *cxld)
398 {
399         struct cxl_port *port = to_cxl_port(cxld->dev.parent);
400
401         ida_free(&port->decoder_ida, cxld->id);
402         put_device(&port->dev);
403 }
404
405 static void cxl_endpoint_decoder_release(struct device *dev)
406 {
407         struct cxl_endpoint_decoder *cxled = to_cxl_endpoint_decoder(dev);
408
409         __cxl_decoder_release(&cxled->cxld);
410         kfree(cxled);
411 }
412
413 static void cxl_switch_decoder_release(struct device *dev)
414 {
415         struct cxl_switch_decoder *cxlsd = to_cxl_switch_decoder(dev);
416
417         __cxl_decoder_release(&cxlsd->cxld);
418         kfree(cxlsd);
419 }
420
421 struct cxl_root_decoder *to_cxl_root_decoder(struct device *dev)
422 {
423         if (dev_WARN_ONCE(dev, !is_root_decoder(dev),
424                           "not a cxl_root_decoder device\n"))
425                 return NULL;
426         return container_of(dev, struct cxl_root_decoder, cxlsd.cxld.dev);
427 }
428 EXPORT_SYMBOL_NS_GPL(to_cxl_root_decoder, CXL);
429
430 static void cxl_root_decoder_release(struct device *dev)
431 {
432         struct cxl_root_decoder *cxlrd = to_cxl_root_decoder(dev);
433
434         if (atomic_read(&cxlrd->region_id) >= 0)
435                 memregion_free(atomic_read(&cxlrd->region_id));
436         __cxl_decoder_release(&cxlrd->cxlsd.cxld);
437         kfree(cxlrd);
438 }
439
440 static const struct device_type cxl_decoder_endpoint_type = {
441         .name = "cxl_decoder_endpoint",
442         .release = cxl_endpoint_decoder_release,
443         .groups = cxl_decoder_endpoint_attribute_groups,
444 };
445
446 static const struct device_type cxl_decoder_switch_type = {
447         .name = "cxl_decoder_switch",
448         .release = cxl_switch_decoder_release,
449         .groups = cxl_decoder_switch_attribute_groups,
450 };
451
452 static const struct device_type cxl_decoder_root_type = {
453         .name = "cxl_decoder_root",
454         .release = cxl_root_decoder_release,
455         .groups = cxl_decoder_root_attribute_groups,
456 };
457
458 bool is_endpoint_decoder(struct device *dev)
459 {
460         return dev->type == &cxl_decoder_endpoint_type;
461 }
462 EXPORT_SYMBOL_NS_GPL(is_endpoint_decoder, CXL);
463
464 bool is_root_decoder(struct device *dev)
465 {
466         return dev->type == &cxl_decoder_root_type;
467 }
468 EXPORT_SYMBOL_NS_GPL(is_root_decoder, CXL);
469
470 bool is_switch_decoder(struct device *dev)
471 {
472         return is_root_decoder(dev) || dev->type == &cxl_decoder_switch_type;
473 }
474 EXPORT_SYMBOL_NS_GPL(is_switch_decoder, CXL);
475
476 struct cxl_decoder *to_cxl_decoder(struct device *dev)
477 {
478         if (dev_WARN_ONCE(dev,
479                           !is_switch_decoder(dev) && !is_endpoint_decoder(dev),
480                           "not a cxl_decoder device\n"))
481                 return NULL;
482         return container_of(dev, struct cxl_decoder, dev);
483 }
484 EXPORT_SYMBOL_NS_GPL(to_cxl_decoder, CXL);
485
486 struct cxl_endpoint_decoder *to_cxl_endpoint_decoder(struct device *dev)
487 {
488         if (dev_WARN_ONCE(dev, !is_endpoint_decoder(dev),
489                           "not a cxl_endpoint_decoder device\n"))
490                 return NULL;
491         return container_of(dev, struct cxl_endpoint_decoder, cxld.dev);
492 }
493 EXPORT_SYMBOL_NS_GPL(to_cxl_endpoint_decoder, CXL);
494
495 struct cxl_switch_decoder *to_cxl_switch_decoder(struct device *dev)
496 {
497         if (dev_WARN_ONCE(dev, !is_switch_decoder(dev),
498                           "not a cxl_switch_decoder device\n"))
499                 return NULL;
500         return container_of(dev, struct cxl_switch_decoder, cxld.dev);
501 }
502 EXPORT_SYMBOL_NS_GPL(to_cxl_switch_decoder, CXL);
503
504 static void cxl_ep_release(struct cxl_ep *ep)
505 {
506         put_device(ep->ep);
507         kfree(ep);
508 }
509
510 static void cxl_ep_remove(struct cxl_port *port, struct cxl_ep *ep)
511 {
512         if (!ep)
513                 return;
514         xa_erase(&port->endpoints, (unsigned long) ep->ep);
515         cxl_ep_release(ep);
516 }
517
518 static void cxl_port_release(struct device *dev)
519 {
520         struct cxl_port *port = to_cxl_port(dev);
521         unsigned long index;
522         struct cxl_ep *ep;
523
524         xa_for_each(&port->endpoints, index, ep)
525                 cxl_ep_remove(port, ep);
526         xa_destroy(&port->endpoints);
527         xa_destroy(&port->dports);
528         xa_destroy(&port->regions);
529         ida_free(&cxl_port_ida, port->id);
530         kfree(port);
531 }
532
533 static const struct attribute_group *cxl_port_attribute_groups[] = {
534         &cxl_base_attribute_group,
535         NULL,
536 };
537
538 static const struct device_type cxl_port_type = {
539         .name = "cxl_port",
540         .release = cxl_port_release,
541         .groups = cxl_port_attribute_groups,
542 };
543
544 bool is_cxl_port(const struct device *dev)
545 {
546         return dev->type == &cxl_port_type;
547 }
548 EXPORT_SYMBOL_NS_GPL(is_cxl_port, CXL);
549
550 struct cxl_port *to_cxl_port(const struct device *dev)
551 {
552         if (dev_WARN_ONCE(dev, dev->type != &cxl_port_type,
553                           "not a cxl_port device\n"))
554                 return NULL;
555         return container_of(dev, struct cxl_port, dev);
556 }
557 EXPORT_SYMBOL_NS_GPL(to_cxl_port, CXL);
558
559 static void unregister_port(void *_port)
560 {
561         struct cxl_port *port = _port;
562         struct cxl_port *parent;
563         struct device *lock_dev;
564
565         if (is_cxl_root(port))
566                 parent = NULL;
567         else
568                 parent = to_cxl_port(port->dev.parent);
569
570         /*
571          * CXL root port's and the first level of ports are unregistered
572          * under the platform firmware device lock, all other ports are
573          * unregistered while holding their parent port lock.
574          */
575         if (!parent)
576                 lock_dev = port->uport_dev;
577         else if (is_cxl_root(parent))
578                 lock_dev = parent->uport_dev;
579         else
580                 lock_dev = &parent->dev;
581
582         device_lock_assert(lock_dev);
583         port->dead = true;
584         device_unregister(&port->dev);
585 }
586
587 static void cxl_unlink_uport(void *_port)
588 {
589         struct cxl_port *port = _port;
590
591         sysfs_remove_link(&port->dev.kobj, "uport");
592 }
593
594 static int devm_cxl_link_uport(struct device *host, struct cxl_port *port)
595 {
596         int rc;
597
598         rc = sysfs_create_link(&port->dev.kobj, &port->uport_dev->kobj,
599                                "uport");
600         if (rc)
601                 return rc;
602         return devm_add_action_or_reset(host, cxl_unlink_uport, port);
603 }
604
605 static void cxl_unlink_parent_dport(void *_port)
606 {
607         struct cxl_port *port = _port;
608
609         sysfs_remove_link(&port->dev.kobj, "parent_dport");
610 }
611
612 static int devm_cxl_link_parent_dport(struct device *host,
613                                       struct cxl_port *port,
614                                       struct cxl_dport *parent_dport)
615 {
616         int rc;
617
618         if (!parent_dport)
619                 return 0;
620
621         rc = sysfs_create_link(&port->dev.kobj, &parent_dport->dport_dev->kobj,
622                                "parent_dport");
623         if (rc)
624                 return rc;
625         return devm_add_action_or_reset(host, cxl_unlink_parent_dport, port);
626 }
627
628 static struct lock_class_key cxl_port_key;
629
630 static struct cxl_port *cxl_port_alloc(struct device *uport_dev,
631                                        resource_size_t component_reg_phys,
632                                        struct cxl_dport *parent_dport)
633 {
634         struct cxl_port *port;
635         struct device *dev;
636         int rc;
637
638         port = kzalloc(sizeof(*port), GFP_KERNEL);
639         if (!port)
640                 return ERR_PTR(-ENOMEM);
641
642         rc = ida_alloc(&cxl_port_ida, GFP_KERNEL);
643         if (rc < 0)
644                 goto err;
645         port->id = rc;
646         port->uport_dev = uport_dev;
647
648         /*
649          * The top-level cxl_port "cxl_root" does not have a cxl_port as
650          * its parent and it does not have any corresponding component
651          * registers as its decode is described by a fixed platform
652          * description.
653          */
654         dev = &port->dev;
655         if (parent_dport) {
656                 struct cxl_port *parent_port = parent_dport->port;
657                 struct cxl_port *iter;
658
659                 dev->parent = &parent_port->dev;
660                 port->depth = parent_port->depth + 1;
661                 port->parent_dport = parent_dport;
662
663                 /*
664                  * walk to the host bridge, or the first ancestor that knows
665                  * the host bridge
666                  */
667                 iter = port;
668                 while (!iter->host_bridge &&
669                        !is_cxl_root(to_cxl_port(iter->dev.parent)))
670                         iter = to_cxl_port(iter->dev.parent);
671                 if (iter->host_bridge)
672                         port->host_bridge = iter->host_bridge;
673                 else if (parent_dport->rch)
674                         port->host_bridge = parent_dport->dport_dev;
675                 else
676                         port->host_bridge = iter->uport_dev;
677                 dev_dbg(uport_dev, "host-bridge: %s\n",
678                         dev_name(port->host_bridge));
679         } else
680                 dev->parent = uport_dev;
681
682         port->component_reg_phys = component_reg_phys;
683         ida_init(&port->decoder_ida);
684         port->hdm_end = -1;
685         port->commit_end = -1;
686         xa_init(&port->dports);
687         xa_init(&port->endpoints);
688         xa_init(&port->regions);
689
690         device_initialize(dev);
691         lockdep_set_class_and_subclass(&dev->mutex, &cxl_port_key, port->depth);
692         device_set_pm_not_required(dev);
693         dev->bus = &cxl_bus_type;
694         dev->type = &cxl_port_type;
695
696         return port;
697
698 err:
699         kfree(port);
700         return ERR_PTR(rc);
701 }
702
703 static int cxl_setup_comp_regs(struct device *host, struct cxl_register_map *map,
704                                resource_size_t component_reg_phys)
705 {
706         if (component_reg_phys == CXL_RESOURCE_NONE)
707                 return 0;
708
709         *map = (struct cxl_register_map) {
710                 .host = host,
711                 .reg_type = CXL_REGLOC_RBI_COMPONENT,
712                 .resource = component_reg_phys,
713                 .max_size = CXL_COMPONENT_REG_BLOCK_SIZE,
714         };
715
716         return cxl_setup_regs(map);
717 }
718
719 static int cxl_port_setup_regs(struct cxl_port *port,
720                         resource_size_t component_reg_phys)
721 {
722         if (dev_is_platform(port->uport_dev))
723                 return 0;
724         return cxl_setup_comp_regs(&port->dev, &port->comp_map,
725                                    component_reg_phys);
726 }
727
728 static int cxl_dport_setup_regs(struct device *host, struct cxl_dport *dport,
729                                 resource_size_t component_reg_phys)
730 {
731         int rc;
732
733         if (dev_is_platform(dport->dport_dev))
734                 return 0;
735
736         /*
737          * use @dport->dport_dev for the context for error messages during
738          * register probing, and fixup @host after the fact, since @host may be
739          * NULL.
740          */
741         rc = cxl_setup_comp_regs(dport->dport_dev, &dport->comp_map,
742                                  component_reg_phys);
743         dport->comp_map.host = host;
744         return rc;
745 }
746
747 static struct cxl_port *__devm_cxl_add_port(struct device *host,
748                                             struct device *uport_dev,
749                                             resource_size_t component_reg_phys,
750                                             struct cxl_dport *parent_dport)
751 {
752         struct cxl_port *port;
753         struct device *dev;
754         int rc;
755
756         port = cxl_port_alloc(uport_dev, component_reg_phys, parent_dport);
757         if (IS_ERR(port))
758                 return port;
759
760         dev = &port->dev;
761         if (is_cxl_memdev(uport_dev))
762                 rc = dev_set_name(dev, "endpoint%d", port->id);
763         else if (parent_dport)
764                 rc = dev_set_name(dev, "port%d", port->id);
765         else
766                 rc = dev_set_name(dev, "root%d", port->id);
767         if (rc)
768                 goto err;
769
770         rc = cxl_port_setup_regs(port, component_reg_phys);
771         if (rc)
772                 goto err;
773
774         rc = device_add(dev);
775         if (rc)
776                 goto err;
777
778         rc = devm_add_action_or_reset(host, unregister_port, port);
779         if (rc)
780                 return ERR_PTR(rc);
781
782         rc = devm_cxl_link_uport(host, port);
783         if (rc)
784                 return ERR_PTR(rc);
785
786         rc = devm_cxl_link_parent_dport(host, port, parent_dport);
787         if (rc)
788                 return ERR_PTR(rc);
789
790         return port;
791
792 err:
793         put_device(dev);
794         return ERR_PTR(rc);
795 }
796
797 /**
798  * devm_cxl_add_port - register a cxl_port in CXL memory decode hierarchy
799  * @host: host device for devm operations
800  * @uport_dev: "physical" device implementing this upstream port
801  * @component_reg_phys: (optional) for configurable cxl_port instances
802  * @parent_dport: next hop up in the CXL memory decode hierarchy
803  */
804 struct cxl_port *devm_cxl_add_port(struct device *host,
805                                    struct device *uport_dev,
806                                    resource_size_t component_reg_phys,
807                                    struct cxl_dport *parent_dport)
808 {
809         struct cxl_port *port, *parent_port;
810
811         port = __devm_cxl_add_port(host, uport_dev, component_reg_phys,
812                                    parent_dport);
813
814         parent_port = parent_dport ? parent_dport->port : NULL;
815         if (IS_ERR(port)) {
816                 dev_dbg(uport_dev, "Failed to add%s%s%s: %ld\n",
817                         parent_port ? " port to " : "",
818                         parent_port ? dev_name(&parent_port->dev) : "",
819                         parent_port ? "" : " root port",
820                         PTR_ERR(port));
821         } else {
822                 dev_dbg(uport_dev, "%s added%s%s%s\n",
823                         dev_name(&port->dev),
824                         parent_port ? " to " : "",
825                         parent_port ? dev_name(&parent_port->dev) : "",
826                         parent_port ? "" : " (root port)");
827         }
828
829         return port;
830 }
831 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_port, CXL);
832
833 struct pci_bus *cxl_port_to_pci_bus(struct cxl_port *port)
834 {
835         /* There is no pci_bus associated with a CXL platform-root port */
836         if (is_cxl_root(port))
837                 return NULL;
838
839         if (dev_is_pci(port->uport_dev)) {
840                 struct pci_dev *pdev = to_pci_dev(port->uport_dev);
841
842                 return pdev->subordinate;
843         }
844
845         return xa_load(&cxl_root_buses, (unsigned long)port->uport_dev);
846 }
847 EXPORT_SYMBOL_NS_GPL(cxl_port_to_pci_bus, CXL);
848
849 static void unregister_pci_bus(void *uport_dev)
850 {
851         xa_erase(&cxl_root_buses, (unsigned long)uport_dev);
852 }
853
854 int devm_cxl_register_pci_bus(struct device *host, struct device *uport_dev,
855                               struct pci_bus *bus)
856 {
857         int rc;
858
859         if (dev_is_pci(uport_dev))
860                 return -EINVAL;
861
862         rc = xa_insert(&cxl_root_buses, (unsigned long)uport_dev, bus,
863                        GFP_KERNEL);
864         if (rc)
865                 return rc;
866         return devm_add_action_or_reset(host, unregister_pci_bus, uport_dev);
867 }
868 EXPORT_SYMBOL_NS_GPL(devm_cxl_register_pci_bus, CXL);
869
870 static bool dev_is_cxl_root_child(struct device *dev)
871 {
872         struct cxl_port *port, *parent;
873
874         if (!is_cxl_port(dev))
875                 return false;
876
877         port = to_cxl_port(dev);
878         if (is_cxl_root(port))
879                 return false;
880
881         parent = to_cxl_port(port->dev.parent);
882         if (is_cxl_root(parent))
883                 return true;
884
885         return false;
886 }
887
888 struct cxl_port *find_cxl_root(struct cxl_port *port)
889 {
890         struct cxl_port *iter = port;
891
892         while (iter && !is_cxl_root(iter))
893                 iter = to_cxl_port(iter->dev.parent);
894
895         if (!iter)
896                 return NULL;
897         get_device(&iter->dev);
898         return iter;
899 }
900 EXPORT_SYMBOL_NS_GPL(find_cxl_root, CXL);
901
902 static struct cxl_dport *find_dport(struct cxl_port *port, int id)
903 {
904         struct cxl_dport *dport;
905         unsigned long index;
906
907         device_lock_assert(&port->dev);
908         xa_for_each(&port->dports, index, dport)
909                 if (dport->port_id == id)
910                         return dport;
911         return NULL;
912 }
913
914 static int add_dport(struct cxl_port *port, struct cxl_dport *dport)
915 {
916         struct cxl_dport *dup;
917         int rc;
918
919         device_lock_assert(&port->dev);
920         dup = find_dport(port, dport->port_id);
921         if (dup) {
922                 dev_err(&port->dev,
923                         "unable to add dport%d-%s non-unique port id (%s)\n",
924                         dport->port_id, dev_name(dport->dport_dev),
925                         dev_name(dup->dport_dev));
926                 return -EBUSY;
927         }
928
929         rc = xa_insert(&port->dports, (unsigned long)dport->dport_dev, dport,
930                        GFP_KERNEL);
931         if (rc)
932                 return rc;
933
934         port->nr_dports++;
935         return 0;
936 }
937
938 /*
939  * Since root-level CXL dports cannot be enumerated by PCI they are not
940  * enumerated by the common port driver that acquires the port lock over
941  * dport add/remove. Instead, root dports are manually added by a
942  * platform driver and cond_cxl_root_lock() is used to take the missing
943  * port lock in that case.
944  */
945 static void cond_cxl_root_lock(struct cxl_port *port)
946 {
947         if (is_cxl_root(port))
948                 device_lock(&port->dev);
949 }
950
951 static void cond_cxl_root_unlock(struct cxl_port *port)
952 {
953         if (is_cxl_root(port))
954                 device_unlock(&port->dev);
955 }
956
957 static void cxl_dport_remove(void *data)
958 {
959         struct cxl_dport *dport = data;
960         struct cxl_port *port = dport->port;
961
962         xa_erase(&port->dports, (unsigned long) dport->dport_dev);
963         put_device(dport->dport_dev);
964 }
965
966 static void cxl_dport_unlink(void *data)
967 {
968         struct cxl_dport *dport = data;
969         struct cxl_port *port = dport->port;
970         char link_name[CXL_TARGET_STRLEN];
971
972         sprintf(link_name, "dport%d", dport->port_id);
973         sysfs_remove_link(&port->dev.kobj, link_name);
974 }
975
976 static struct cxl_dport *
977 __devm_cxl_add_dport(struct cxl_port *port, struct device *dport_dev,
978                      int port_id, resource_size_t component_reg_phys,
979                      resource_size_t rcrb)
980 {
981         char link_name[CXL_TARGET_STRLEN];
982         struct cxl_dport *dport;
983         struct device *host;
984         int rc;
985
986         if (is_cxl_root(port))
987                 host = port->uport_dev;
988         else
989                 host = &port->dev;
990
991         if (!host->driver) {
992                 dev_WARN_ONCE(&port->dev, 1, "dport:%s bad devm context\n",
993                               dev_name(dport_dev));
994                 return ERR_PTR(-ENXIO);
995         }
996
997         if (snprintf(link_name, CXL_TARGET_STRLEN, "dport%d", port_id) >=
998             CXL_TARGET_STRLEN)
999                 return ERR_PTR(-EINVAL);
1000
1001         dport = devm_kzalloc(host, sizeof(*dport), GFP_KERNEL);
1002         if (!dport)
1003                 return ERR_PTR(-ENOMEM);
1004
1005         dport->dport_dev = dport_dev;
1006         dport->port_id = port_id;
1007         dport->port = port;
1008
1009         if (rcrb == CXL_RESOURCE_NONE) {
1010                 rc = cxl_dport_setup_regs(&port->dev, dport,
1011                                           component_reg_phys);
1012                 if (rc)
1013                         return ERR_PTR(rc);
1014         } else {
1015                 dport->rcrb.base = rcrb;
1016                 component_reg_phys = __rcrb_to_component(dport_dev, &dport->rcrb,
1017                                                          CXL_RCRB_DOWNSTREAM);
1018                 if (component_reg_phys == CXL_RESOURCE_NONE) {
1019                         dev_warn(dport_dev, "Invalid Component Registers in RCRB");
1020                         return ERR_PTR(-ENXIO);
1021                 }
1022
1023                 /*
1024                  * RCH @dport is not ready to map until associated with its
1025                  * memdev
1026                  */
1027                 rc = cxl_dport_setup_regs(NULL, dport, component_reg_phys);
1028                 if (rc)
1029                         return ERR_PTR(rc);
1030
1031                 dport->rch = true;
1032         }
1033
1034         if (component_reg_phys != CXL_RESOURCE_NONE)
1035                 dev_dbg(dport_dev, "Component Registers found for dport: %pa\n",
1036                         &component_reg_phys);
1037
1038         cond_cxl_root_lock(port);
1039         rc = add_dport(port, dport);
1040         cond_cxl_root_unlock(port);
1041         if (rc)
1042                 return ERR_PTR(rc);
1043
1044         get_device(dport_dev);
1045         rc = devm_add_action_or_reset(host, cxl_dport_remove, dport);
1046         if (rc)
1047                 return ERR_PTR(rc);
1048
1049         rc = sysfs_create_link(&port->dev.kobj, &dport_dev->kobj, link_name);
1050         if (rc)
1051                 return ERR_PTR(rc);
1052
1053         rc = devm_add_action_or_reset(host, cxl_dport_unlink, dport);
1054         if (rc)
1055                 return ERR_PTR(rc);
1056
1057         return dport;
1058 }
1059
1060 /**
1061  * devm_cxl_add_dport - append VH downstream port data to a cxl_port
1062  * @port: the cxl_port that references this dport
1063  * @dport_dev: firmware or PCI device representing the dport
1064  * @port_id: identifier for this dport in a decoder's target list
1065  * @component_reg_phys: optional location of CXL component registers
1066  *
1067  * Note that dports are appended to the devm release action's of the
1068  * either the port's host (for root ports), or the port itself (for
1069  * switch ports)
1070  */
1071 struct cxl_dport *devm_cxl_add_dport(struct cxl_port *port,
1072                                      struct device *dport_dev, int port_id,
1073                                      resource_size_t component_reg_phys)
1074 {
1075         struct cxl_dport *dport;
1076
1077         dport = __devm_cxl_add_dport(port, dport_dev, port_id,
1078                                      component_reg_phys, CXL_RESOURCE_NONE);
1079         if (IS_ERR(dport)) {
1080                 dev_dbg(dport_dev, "failed to add dport to %s: %ld\n",
1081                         dev_name(&port->dev), PTR_ERR(dport));
1082         } else {
1083                 dev_dbg(dport_dev, "dport added to %s\n",
1084                         dev_name(&port->dev));
1085         }
1086
1087         return dport;
1088 }
1089 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_dport, CXL);
1090
1091 /**
1092  * devm_cxl_add_rch_dport - append RCH downstream port data to a cxl_port
1093  * @port: the cxl_port that references this dport
1094  * @dport_dev: firmware or PCI device representing the dport
1095  * @port_id: identifier for this dport in a decoder's target list
1096  * @rcrb: mandatory location of a Root Complex Register Block
1097  *
1098  * See CXL 3.0 9.11.8 CXL Devices Attached to an RCH
1099  */
1100 struct cxl_dport *devm_cxl_add_rch_dport(struct cxl_port *port,
1101                                          struct device *dport_dev, int port_id,
1102                                          resource_size_t rcrb)
1103 {
1104         struct cxl_dport *dport;
1105
1106         if (rcrb == CXL_RESOURCE_NONE) {
1107                 dev_dbg(&port->dev, "failed to add RCH dport, missing RCRB\n");
1108                 return ERR_PTR(-EINVAL);
1109         }
1110
1111         dport = __devm_cxl_add_dport(port, dport_dev, port_id,
1112                                      CXL_RESOURCE_NONE, rcrb);
1113         if (IS_ERR(dport)) {
1114                 dev_dbg(dport_dev, "failed to add RCH dport to %s: %ld\n",
1115                         dev_name(&port->dev), PTR_ERR(dport));
1116         } else {
1117                 dev_dbg(dport_dev, "RCH dport added to %s\n",
1118                         dev_name(&port->dev));
1119         }
1120
1121         return dport;
1122 }
1123 EXPORT_SYMBOL_NS_GPL(devm_cxl_add_rch_dport, CXL);
1124
1125 static int add_ep(struct cxl_ep *new)
1126 {
1127         struct cxl_port *port = new->dport->port;
1128         int rc;
1129
1130         device_lock(&port->dev);
1131         if (port->dead) {
1132                 device_unlock(&port->dev);
1133                 return -ENXIO;
1134         }
1135         rc = xa_insert(&port->endpoints, (unsigned long)new->ep, new,
1136                        GFP_KERNEL);
1137         device_unlock(&port->dev);
1138
1139         return rc;
1140 }
1141
1142 /**
1143  * cxl_add_ep - register an endpoint's interest in a port
1144  * @dport: the dport that routes to @ep_dev
1145  * @ep_dev: device representing the endpoint
1146  *
1147  * Intermediate CXL ports are scanned based on the arrival of endpoints.
1148  * When those endpoints depart the port can be destroyed once all
1149  * endpoints that care about that port have been removed.
1150  */
1151 static int cxl_add_ep(struct cxl_dport *dport, struct device *ep_dev)
1152 {
1153         struct cxl_ep *ep;
1154         int rc;
1155
1156         ep = kzalloc(sizeof(*ep), GFP_KERNEL);
1157         if (!ep)
1158                 return -ENOMEM;
1159
1160         ep->ep = get_device(ep_dev);
1161         ep->dport = dport;
1162
1163         rc = add_ep(ep);
1164         if (rc)
1165                 cxl_ep_release(ep);
1166         return rc;
1167 }
1168
1169 struct cxl_find_port_ctx {
1170         const struct device *dport_dev;
1171         const struct cxl_port *parent_port;
1172         struct cxl_dport **dport;
1173 };
1174
1175 static int match_port_by_dport(struct device *dev, const void *data)
1176 {
1177         const struct cxl_find_port_ctx *ctx = data;
1178         struct cxl_dport *dport;
1179         struct cxl_port *port;
1180
1181         if (!is_cxl_port(dev))
1182                 return 0;
1183         if (ctx->parent_port && dev->parent != &ctx->parent_port->dev)
1184                 return 0;
1185
1186         port = to_cxl_port(dev);
1187         dport = cxl_find_dport_by_dev(port, ctx->dport_dev);
1188         if (ctx->dport)
1189                 *ctx->dport = dport;
1190         return dport != NULL;
1191 }
1192
1193 static struct cxl_port *__find_cxl_port(struct cxl_find_port_ctx *ctx)
1194 {
1195         struct device *dev;
1196
1197         if (!ctx->dport_dev)
1198                 return NULL;
1199
1200         dev = bus_find_device(&cxl_bus_type, NULL, ctx, match_port_by_dport);
1201         if (dev)
1202                 return to_cxl_port(dev);
1203         return NULL;
1204 }
1205
1206 static struct cxl_port *find_cxl_port(struct device *dport_dev,
1207                                       struct cxl_dport **dport)
1208 {
1209         struct cxl_find_port_ctx ctx = {
1210                 .dport_dev = dport_dev,
1211                 .dport = dport,
1212         };
1213         struct cxl_port *port;
1214
1215         port = __find_cxl_port(&ctx);
1216         return port;
1217 }
1218
1219 static struct cxl_port *find_cxl_port_at(struct cxl_port *parent_port,
1220                                          struct device *dport_dev,
1221                                          struct cxl_dport **dport)
1222 {
1223         struct cxl_find_port_ctx ctx = {
1224                 .dport_dev = dport_dev,
1225                 .parent_port = parent_port,
1226                 .dport = dport,
1227         };
1228         struct cxl_port *port;
1229
1230         port = __find_cxl_port(&ctx);
1231         return port;
1232 }
1233
1234 /*
1235  * All users of grandparent() are using it to walk PCIe-like switch port
1236  * hierarchy. A PCIe switch is comprised of a bridge device representing the
1237  * upstream switch port and N bridges representing downstream switch ports. When
1238  * bridges stack the grand-parent of a downstream switch port is another
1239  * downstream switch port in the immediate ancestor switch.
1240  */
1241 static struct device *grandparent(struct device *dev)
1242 {
1243         if (dev && dev->parent)
1244                 return dev->parent->parent;
1245         return NULL;
1246 }
1247
1248 static struct device *endpoint_host(struct cxl_port *endpoint)
1249 {
1250         struct cxl_port *port = to_cxl_port(endpoint->dev.parent);
1251
1252         if (is_cxl_root(port))
1253                 return port->uport_dev;
1254         return &port->dev;
1255 }
1256
1257 static void delete_endpoint(void *data)
1258 {
1259         struct cxl_memdev *cxlmd = data;
1260         struct cxl_port *endpoint = cxlmd->endpoint;
1261         struct device *host = endpoint_host(endpoint);
1262
1263         device_lock(host);
1264         if (host->driver && !endpoint->dead) {
1265                 devm_release_action(host, cxl_unlink_parent_dport, endpoint);
1266                 devm_release_action(host, cxl_unlink_uport, endpoint);
1267                 devm_release_action(host, unregister_port, endpoint);
1268         }
1269         cxlmd->endpoint = NULL;
1270         device_unlock(host);
1271         put_device(&endpoint->dev);
1272         put_device(host);
1273 }
1274
1275 int cxl_endpoint_autoremove(struct cxl_memdev *cxlmd, struct cxl_port *endpoint)
1276 {
1277         struct device *host = endpoint_host(endpoint);
1278         struct device *dev = &cxlmd->dev;
1279
1280         get_device(host);
1281         get_device(&endpoint->dev);
1282         cxlmd->endpoint = endpoint;
1283         cxlmd->depth = endpoint->depth;
1284         return devm_add_action_or_reset(dev, delete_endpoint, cxlmd);
1285 }
1286 EXPORT_SYMBOL_NS_GPL(cxl_endpoint_autoremove, CXL);
1287
1288 /*
1289  * The natural end of life of a non-root 'cxl_port' is when its parent port goes
1290  * through a ->remove() event ("top-down" unregistration). The unnatural trigger
1291  * for a port to be unregistered is when all memdevs beneath that port have gone
1292  * through ->remove(). This "bottom-up" removal selectively removes individual
1293  * child ports manually. This depends on devm_cxl_add_port() to not change is
1294  * devm action registration order, and for dports to have already been
1295  * destroyed by reap_dports().
1296  */
1297 static void delete_switch_port(struct cxl_port *port)
1298 {
1299         devm_release_action(port->dev.parent, cxl_unlink_parent_dport, port);
1300         devm_release_action(port->dev.parent, cxl_unlink_uport, port);
1301         devm_release_action(port->dev.parent, unregister_port, port);
1302 }
1303
1304 static void reap_dports(struct cxl_port *port)
1305 {
1306         struct cxl_dport *dport;
1307         unsigned long index;
1308
1309         device_lock_assert(&port->dev);
1310
1311         xa_for_each(&port->dports, index, dport) {
1312                 devm_release_action(&port->dev, cxl_dport_unlink, dport);
1313                 devm_release_action(&port->dev, cxl_dport_remove, dport);
1314                 devm_kfree(&port->dev, dport);
1315         }
1316 }
1317
1318 struct detach_ctx {
1319         struct cxl_memdev *cxlmd;
1320         int depth;
1321 };
1322
1323 static int port_has_memdev(struct device *dev, const void *data)
1324 {
1325         const struct detach_ctx *ctx = data;
1326         struct cxl_port *port;
1327
1328         if (!is_cxl_port(dev))
1329                 return 0;
1330
1331         port = to_cxl_port(dev);
1332         if (port->depth != ctx->depth)
1333                 return 0;
1334
1335         return !!cxl_ep_load(port, ctx->cxlmd);
1336 }
1337
1338 static void cxl_detach_ep(void *data)
1339 {
1340         struct cxl_memdev *cxlmd = data;
1341
1342         for (int i = cxlmd->depth - 1; i >= 1; i--) {
1343                 struct cxl_port *port, *parent_port;
1344                 struct detach_ctx ctx = {
1345                         .cxlmd = cxlmd,
1346                         .depth = i,
1347                 };
1348                 struct device *dev;
1349                 struct cxl_ep *ep;
1350                 bool died = false;
1351
1352                 dev = bus_find_device(&cxl_bus_type, NULL, &ctx,
1353                                       port_has_memdev);
1354                 if (!dev)
1355                         continue;
1356                 port = to_cxl_port(dev);
1357
1358                 parent_port = to_cxl_port(port->dev.parent);
1359                 device_lock(&parent_port->dev);
1360                 device_lock(&port->dev);
1361                 ep = cxl_ep_load(port, cxlmd);
1362                 dev_dbg(&cxlmd->dev, "disconnect %s from %s\n",
1363                         ep ? dev_name(ep->ep) : "", dev_name(&port->dev));
1364                 cxl_ep_remove(port, ep);
1365                 if (ep && !port->dead && xa_empty(&port->endpoints) &&
1366                     !is_cxl_root(parent_port) && parent_port->dev.driver) {
1367                         /*
1368                          * This was the last ep attached to a dynamically
1369                          * enumerated port. Block new cxl_add_ep() and garbage
1370                          * collect the port.
1371                          */
1372                         died = true;
1373                         port->dead = true;
1374                         reap_dports(port);
1375                 }
1376                 device_unlock(&port->dev);
1377
1378                 if (died) {
1379                         dev_dbg(&cxlmd->dev, "delete %s\n",
1380                                 dev_name(&port->dev));
1381                         delete_switch_port(port);
1382                 }
1383                 put_device(&port->dev);
1384                 device_unlock(&parent_port->dev);
1385         }
1386 }
1387
1388 static resource_size_t find_component_registers(struct device *dev)
1389 {
1390         struct cxl_register_map map;
1391         struct pci_dev *pdev;
1392
1393         /*
1394          * Theoretically, CXL component registers can be hosted on a
1395          * non-PCI device, in practice, only cxl_test hits this case.
1396          */
1397         if (!dev_is_pci(dev))
1398                 return CXL_RESOURCE_NONE;
1399
1400         pdev = to_pci_dev(dev);
1401
1402         cxl_find_regblock(pdev, CXL_REGLOC_RBI_COMPONENT, &map);
1403         return map.resource;
1404 }
1405
1406 static int add_port_attach_ep(struct cxl_memdev *cxlmd,
1407                               struct device *uport_dev,
1408                               struct device *dport_dev)
1409 {
1410         struct device *dparent = grandparent(dport_dev);
1411         struct cxl_port *port, *parent_port = NULL;
1412         struct cxl_dport *dport, *parent_dport;
1413         resource_size_t component_reg_phys;
1414         int rc;
1415
1416         if (!dparent) {
1417                 /*
1418                  * The iteration reached the topology root without finding the
1419                  * CXL-root 'cxl_port' on a previous iteration, fail for now to
1420                  * be re-probed after platform driver attaches.
1421                  */
1422                 dev_dbg(&cxlmd->dev, "%s is a root dport\n",
1423                         dev_name(dport_dev));
1424                 return -ENXIO;
1425         }
1426
1427         parent_port = find_cxl_port(dparent, &parent_dport);
1428         if (!parent_port) {
1429                 /* iterate to create this parent_port */
1430                 return -EAGAIN;
1431         }
1432
1433         device_lock(&parent_port->dev);
1434         if (!parent_port->dev.driver) {
1435                 dev_warn(&cxlmd->dev,
1436                          "port %s:%s disabled, failed to enumerate CXL.mem\n",
1437                          dev_name(&parent_port->dev), dev_name(uport_dev));
1438                 port = ERR_PTR(-ENXIO);
1439                 goto out;
1440         }
1441
1442         port = find_cxl_port_at(parent_port, dport_dev, &dport);
1443         if (!port) {
1444                 component_reg_phys = find_component_registers(uport_dev);
1445                 port = devm_cxl_add_port(&parent_port->dev, uport_dev,
1446                                          component_reg_phys, parent_dport);
1447                 /* retry find to pick up the new dport information */
1448                 if (!IS_ERR(port))
1449                         port = find_cxl_port_at(parent_port, dport_dev, &dport);
1450         }
1451 out:
1452         device_unlock(&parent_port->dev);
1453
1454         if (IS_ERR(port))
1455                 rc = PTR_ERR(port);
1456         else {
1457                 dev_dbg(&cxlmd->dev, "add to new port %s:%s\n",
1458                         dev_name(&port->dev), dev_name(port->uport_dev));
1459                 rc = cxl_add_ep(dport, &cxlmd->dev);
1460                 if (rc == -EBUSY) {
1461                         /*
1462                          * "can't" happen, but this error code means
1463                          * something to the caller, so translate it.
1464                          */
1465                         rc = -ENXIO;
1466                 }
1467                 put_device(&port->dev);
1468         }
1469
1470         put_device(&parent_port->dev);
1471         return rc;
1472 }
1473
1474 int devm_cxl_enumerate_ports(struct cxl_memdev *cxlmd)
1475 {
1476         struct device *dev = &cxlmd->dev;
1477         struct device *iter;
1478         int rc;
1479
1480         /*
1481          * Skip intermediate port enumeration in the RCH case, there
1482          * are no ports in between a host bridge and an endpoint.
1483          */
1484         if (cxlmd->cxlds->rcd)
1485                 return 0;
1486
1487         rc = devm_add_action_or_reset(&cxlmd->dev, cxl_detach_ep, cxlmd);
1488         if (rc)
1489                 return rc;
1490
1491         /*
1492          * Scan for and add all cxl_ports in this device's ancestry.
1493          * Repeat until no more ports are added. Abort if a port add
1494          * attempt fails.
1495          */
1496 retry:
1497         for (iter = dev; iter; iter = grandparent(iter)) {
1498                 struct device *dport_dev = grandparent(iter);
1499                 struct device *uport_dev;
1500                 struct cxl_dport *dport;
1501                 struct cxl_port *port;
1502
1503                 if (!dport_dev)
1504                         return 0;
1505
1506                 uport_dev = dport_dev->parent;
1507                 if (!uport_dev) {
1508                         dev_warn(dev, "at %s no parent for dport: %s\n",
1509                                  dev_name(iter), dev_name(dport_dev));
1510                         return -ENXIO;
1511                 }
1512
1513                 dev_dbg(dev, "scan: iter: %s dport_dev: %s parent: %s\n",
1514                         dev_name(iter), dev_name(dport_dev),
1515                         dev_name(uport_dev));
1516                 port = find_cxl_port(dport_dev, &dport);
1517                 if (port) {
1518                         dev_dbg(&cxlmd->dev,
1519                                 "found already registered port %s:%s\n",
1520                                 dev_name(&port->dev),
1521                                 dev_name(port->uport_dev));
1522                         rc = cxl_add_ep(dport, &cxlmd->dev);
1523
1524                         /*
1525                          * If the endpoint already exists in the port's list,
1526                          * that's ok, it was added on a previous pass.
1527                          * Otherwise, retry in add_port_attach_ep() after taking
1528                          * the parent_port lock as the current port may be being
1529                          * reaped.
1530                          */
1531                         if (rc && rc != -EBUSY) {
1532                                 put_device(&port->dev);
1533                                 return rc;
1534                         }
1535
1536                         /* Any more ports to add between this one and the root? */
1537                         if (!dev_is_cxl_root_child(&port->dev)) {
1538                                 put_device(&port->dev);
1539                                 continue;
1540                         }
1541
1542                         put_device(&port->dev);
1543                         return 0;
1544                 }
1545
1546                 rc = add_port_attach_ep(cxlmd, uport_dev, dport_dev);
1547                 /* port missing, try to add parent */
1548                 if (rc == -EAGAIN)
1549                         continue;
1550                 /* failed to add ep or port */
1551                 if (rc)
1552                         return rc;
1553                 /* port added, new descendants possible, start over */
1554                 goto retry;
1555         }
1556
1557         return 0;
1558 }
1559 EXPORT_SYMBOL_NS_GPL(devm_cxl_enumerate_ports, CXL);
1560
1561 struct cxl_port *cxl_pci_find_port(struct pci_dev *pdev,
1562                                    struct cxl_dport **dport)
1563 {
1564         return find_cxl_port(pdev->dev.parent, dport);
1565 }
1566 EXPORT_SYMBOL_NS_GPL(cxl_pci_find_port, CXL);
1567
1568 struct cxl_port *cxl_mem_find_port(struct cxl_memdev *cxlmd,
1569                                    struct cxl_dport **dport)
1570 {
1571         return find_cxl_port(grandparent(&cxlmd->dev), dport);
1572 }
1573 EXPORT_SYMBOL_NS_GPL(cxl_mem_find_port, CXL);
1574
1575 static int decoder_populate_targets(struct cxl_switch_decoder *cxlsd,
1576                                     struct cxl_port *port, int *target_map)
1577 {
1578         int i;
1579
1580         if (!target_map)
1581                 return 0;
1582
1583         device_lock_assert(&port->dev);
1584
1585         if (xa_empty(&port->dports))
1586                 return -EINVAL;
1587
1588         guard(rwsem_write)(&cxl_region_rwsem);
1589         for (i = 0; i < cxlsd->cxld.interleave_ways; i++) {
1590                 struct cxl_dport *dport = find_dport(port, target_map[i]);
1591
1592                 if (!dport)
1593                         return -ENXIO;
1594                 cxlsd->target[i] = dport;
1595         }
1596
1597         return 0;
1598 }
1599
1600 struct cxl_dport *cxl_hb_modulo(struct cxl_root_decoder *cxlrd, int pos)
1601 {
1602         struct cxl_switch_decoder *cxlsd = &cxlrd->cxlsd;
1603         struct cxl_decoder *cxld = &cxlsd->cxld;
1604         int iw;
1605
1606         iw = cxld->interleave_ways;
1607         if (dev_WARN_ONCE(&cxld->dev, iw != cxlsd->nr_targets,
1608                           "misconfigured root decoder\n"))
1609                 return NULL;
1610
1611         return cxlrd->cxlsd.target[pos % iw];
1612 }
1613 EXPORT_SYMBOL_NS_GPL(cxl_hb_modulo, CXL);
1614
1615 static struct lock_class_key cxl_decoder_key;
1616
1617 /**
1618  * cxl_decoder_init - Common decoder setup / initialization
1619  * @port: owning port of this decoder
1620  * @cxld: common decoder properties to initialize
1621  *
1622  * A port may contain one or more decoders. Each of those decoders
1623  * enable some address space for CXL.mem utilization. A decoder is
1624  * expected to be configured by the caller before registering via
1625  * cxl_decoder_add()
1626  */
1627 static int cxl_decoder_init(struct cxl_port *port, struct cxl_decoder *cxld)
1628 {
1629         struct device *dev;
1630         int rc;
1631
1632         rc = ida_alloc(&port->decoder_ida, GFP_KERNEL);
1633         if (rc < 0)
1634                 return rc;
1635
1636         /* need parent to stick around to release the id */
1637         get_device(&port->dev);
1638         cxld->id = rc;
1639
1640         dev = &cxld->dev;
1641         device_initialize(dev);
1642         lockdep_set_class(&dev->mutex, &cxl_decoder_key);
1643         device_set_pm_not_required(dev);
1644         dev->parent = &port->dev;
1645         dev->bus = &cxl_bus_type;
1646
1647         /* Pre initialize an "empty" decoder */
1648         cxld->interleave_ways = 1;
1649         cxld->interleave_granularity = PAGE_SIZE;
1650         cxld->target_type = CXL_DECODER_HOSTONLYMEM;
1651         cxld->hpa_range = (struct range) {
1652                 .start = 0,
1653                 .end = -1,
1654         };
1655
1656         return 0;
1657 }
1658
1659 static int cxl_switch_decoder_init(struct cxl_port *port,
1660                                    struct cxl_switch_decoder *cxlsd,
1661                                    int nr_targets)
1662 {
1663         if (nr_targets > CXL_DECODER_MAX_INTERLEAVE)
1664                 return -EINVAL;
1665
1666         cxlsd->nr_targets = nr_targets;
1667         return cxl_decoder_init(port, &cxlsd->cxld);
1668 }
1669
1670 /**
1671  * cxl_root_decoder_alloc - Allocate a root level decoder
1672  * @port: owning CXL root of this decoder
1673  * @nr_targets: static number of downstream targets
1674  * @calc_hb: which host bridge covers the n'th position by granularity
1675  *
1676  * Return: A new cxl decoder to be registered by cxl_decoder_add(). A
1677  * 'CXL root' decoder is one that decodes from a top-level / static platform
1678  * firmware description of CXL resources into a CXL standard decode
1679  * topology.
1680  */
1681 struct cxl_root_decoder *cxl_root_decoder_alloc(struct cxl_port *port,
1682                                                 unsigned int nr_targets,
1683                                                 cxl_calc_hb_fn calc_hb)
1684 {
1685         struct cxl_root_decoder *cxlrd;
1686         struct cxl_switch_decoder *cxlsd;
1687         struct cxl_decoder *cxld;
1688         int rc;
1689
1690         if (!is_cxl_root(port))
1691                 return ERR_PTR(-EINVAL);
1692
1693         cxlrd = kzalloc(struct_size(cxlrd, cxlsd.target, nr_targets),
1694                         GFP_KERNEL);
1695         if (!cxlrd)
1696                 return ERR_PTR(-ENOMEM);
1697
1698         cxlsd = &cxlrd->cxlsd;
1699         rc = cxl_switch_decoder_init(port, cxlsd, nr_targets);
1700         if (rc) {
1701                 kfree(cxlrd);
1702                 return ERR_PTR(rc);
1703         }
1704
1705         cxlrd->calc_hb = calc_hb;
1706         mutex_init(&cxlrd->range_lock);
1707
1708         cxld = &cxlsd->cxld;
1709         cxld->dev.type = &cxl_decoder_root_type;
1710         /*
1711          * cxl_root_decoder_release() special cases negative ids to
1712          * detect memregion_alloc() failures.
1713          */
1714         atomic_set(&cxlrd->region_id, -1);
1715         rc = memregion_alloc(GFP_KERNEL);
1716         if (rc < 0) {
1717                 put_device(&cxld->dev);
1718                 return ERR_PTR(rc);
1719         }
1720
1721         atomic_set(&cxlrd->region_id, rc);
1722         return cxlrd;
1723 }
1724 EXPORT_SYMBOL_NS_GPL(cxl_root_decoder_alloc, CXL);
1725
1726 /**
1727  * cxl_switch_decoder_alloc - Allocate a switch level decoder
1728  * @port: owning CXL switch port of this decoder
1729  * @nr_targets: max number of dynamically addressable downstream targets
1730  *
1731  * Return: A new cxl decoder to be registered by cxl_decoder_add(). A
1732  * 'switch' decoder is any decoder that can be enumerated by PCIe
1733  * topology and the HDM Decoder Capability. This includes the decoders
1734  * that sit between Switch Upstream Ports / Switch Downstream Ports and
1735  * Host Bridges / Root Ports.
1736  */
1737 struct cxl_switch_decoder *cxl_switch_decoder_alloc(struct cxl_port *port,
1738                                                     unsigned int nr_targets)
1739 {
1740         struct cxl_switch_decoder *cxlsd;
1741         struct cxl_decoder *cxld;
1742         int rc;
1743
1744         if (is_cxl_root(port) || is_cxl_endpoint(port))
1745                 return ERR_PTR(-EINVAL);
1746
1747         cxlsd = kzalloc(struct_size(cxlsd, target, nr_targets), GFP_KERNEL);
1748         if (!cxlsd)
1749                 return ERR_PTR(-ENOMEM);
1750
1751         rc = cxl_switch_decoder_init(port, cxlsd, nr_targets);
1752         if (rc) {
1753                 kfree(cxlsd);
1754                 return ERR_PTR(rc);
1755         }
1756
1757         cxld = &cxlsd->cxld;
1758         cxld->dev.type = &cxl_decoder_switch_type;
1759         return cxlsd;
1760 }
1761 EXPORT_SYMBOL_NS_GPL(cxl_switch_decoder_alloc, CXL);
1762
1763 /**
1764  * cxl_endpoint_decoder_alloc - Allocate an endpoint decoder
1765  * @port: owning port of this decoder
1766  *
1767  * Return: A new cxl decoder to be registered by cxl_decoder_add()
1768  */
1769 struct cxl_endpoint_decoder *cxl_endpoint_decoder_alloc(struct cxl_port *port)
1770 {
1771         struct cxl_endpoint_decoder *cxled;
1772         struct cxl_decoder *cxld;
1773         int rc;
1774
1775         if (!is_cxl_endpoint(port))
1776                 return ERR_PTR(-EINVAL);
1777
1778         cxled = kzalloc(sizeof(*cxled), GFP_KERNEL);
1779         if (!cxled)
1780                 return ERR_PTR(-ENOMEM);
1781
1782         cxled->pos = -1;
1783         cxld = &cxled->cxld;
1784         rc = cxl_decoder_init(port, cxld);
1785         if (rc)  {
1786                 kfree(cxled);
1787                 return ERR_PTR(rc);
1788         }
1789
1790         cxld->dev.type = &cxl_decoder_endpoint_type;
1791         return cxled;
1792 }
1793 EXPORT_SYMBOL_NS_GPL(cxl_endpoint_decoder_alloc, CXL);
1794
1795 /**
1796  * cxl_decoder_add_locked - Add a decoder with targets
1797  * @cxld: The cxl decoder allocated by cxl_<type>_decoder_alloc()
1798  * @target_map: A list of downstream ports that this decoder can direct memory
1799  *              traffic to. These numbers should correspond with the port number
1800  *              in the PCIe Link Capabilities structure.
1801  *
1802  * Certain types of decoders may not have any targets. The main example of this
1803  * is an endpoint device. A more awkward example is a hostbridge whose root
1804  * ports get hot added (technically possible, though unlikely).
1805  *
1806  * This is the locked variant of cxl_decoder_add().
1807  *
1808  * Context: Process context. Expects the device lock of the port that owns the
1809  *          @cxld to be held.
1810  *
1811  * Return: Negative error code if the decoder wasn't properly configured; else
1812  *         returns 0.
1813  */
1814 int cxl_decoder_add_locked(struct cxl_decoder *cxld, int *target_map)
1815 {
1816         struct cxl_port *port;
1817         struct device *dev;
1818         int rc;
1819
1820         if (WARN_ON_ONCE(!cxld))
1821                 return -EINVAL;
1822
1823         if (WARN_ON_ONCE(IS_ERR(cxld)))
1824                 return PTR_ERR(cxld);
1825
1826         if (cxld->interleave_ways < 1)
1827                 return -EINVAL;
1828
1829         dev = &cxld->dev;
1830
1831         port = to_cxl_port(cxld->dev.parent);
1832         if (!is_endpoint_decoder(dev)) {
1833                 struct cxl_switch_decoder *cxlsd = to_cxl_switch_decoder(dev);
1834
1835                 rc = decoder_populate_targets(cxlsd, port, target_map);
1836                 if (rc && (cxld->flags & CXL_DECODER_F_ENABLE)) {
1837                         dev_err(&port->dev,
1838                                 "Failed to populate active decoder targets\n");
1839                         return rc;
1840                 }
1841         }
1842
1843         rc = dev_set_name(dev, "decoder%d.%d", port->id, cxld->id);
1844         if (rc)
1845                 return rc;
1846
1847         return device_add(dev);
1848 }
1849 EXPORT_SYMBOL_NS_GPL(cxl_decoder_add_locked, CXL);
1850
1851 /**
1852  * cxl_decoder_add - Add a decoder with targets
1853  * @cxld: The cxl decoder allocated by cxl_<type>_decoder_alloc()
1854  * @target_map: A list of downstream ports that this decoder can direct memory
1855  *              traffic to. These numbers should correspond with the port number
1856  *              in the PCIe Link Capabilities structure.
1857  *
1858  * This is the unlocked variant of cxl_decoder_add_locked().
1859  * See cxl_decoder_add_locked().
1860  *
1861  * Context: Process context. Takes and releases the device lock of the port that
1862  *          owns the @cxld.
1863  */
1864 int cxl_decoder_add(struct cxl_decoder *cxld, int *target_map)
1865 {
1866         struct cxl_port *port;
1867         int rc;
1868
1869         if (WARN_ON_ONCE(!cxld))
1870                 return -EINVAL;
1871
1872         if (WARN_ON_ONCE(IS_ERR(cxld)))
1873                 return PTR_ERR(cxld);
1874
1875         port = to_cxl_port(cxld->dev.parent);
1876
1877         device_lock(&port->dev);
1878         rc = cxl_decoder_add_locked(cxld, target_map);
1879         device_unlock(&port->dev);
1880
1881         return rc;
1882 }
1883 EXPORT_SYMBOL_NS_GPL(cxl_decoder_add, CXL);
1884
1885 static void cxld_unregister(void *dev)
1886 {
1887         struct cxl_endpoint_decoder *cxled;
1888
1889         if (is_endpoint_decoder(dev)) {
1890                 cxled = to_cxl_endpoint_decoder(dev);
1891                 cxl_decoder_kill_region(cxled);
1892         }
1893
1894         device_unregister(dev);
1895 }
1896
1897 int cxl_decoder_autoremove(struct device *host, struct cxl_decoder *cxld)
1898 {
1899         return devm_add_action_or_reset(host, cxld_unregister, &cxld->dev);
1900 }
1901 EXPORT_SYMBOL_NS_GPL(cxl_decoder_autoremove, CXL);
1902
1903 /**
1904  * __cxl_driver_register - register a driver for the cxl bus
1905  * @cxl_drv: cxl driver structure to attach
1906  * @owner: owning module/driver
1907  * @modname: KBUILD_MODNAME for parent driver
1908  */
1909 int __cxl_driver_register(struct cxl_driver *cxl_drv, struct module *owner,
1910                           const char *modname)
1911 {
1912         if (!cxl_drv->probe) {
1913                 pr_debug("%s ->probe() must be specified\n", modname);
1914                 return -EINVAL;
1915         }
1916
1917         if (!cxl_drv->name) {
1918                 pr_debug("%s ->name must be specified\n", modname);
1919                 return -EINVAL;
1920         }
1921
1922         if (!cxl_drv->id) {
1923                 pr_debug("%s ->id must be specified\n", modname);
1924                 return -EINVAL;
1925         }
1926
1927         cxl_drv->drv.bus = &cxl_bus_type;
1928         cxl_drv->drv.owner = owner;
1929         cxl_drv->drv.mod_name = modname;
1930         cxl_drv->drv.name = cxl_drv->name;
1931
1932         return driver_register(&cxl_drv->drv);
1933 }
1934 EXPORT_SYMBOL_NS_GPL(__cxl_driver_register, CXL);
1935
1936 void cxl_driver_unregister(struct cxl_driver *cxl_drv)
1937 {
1938         driver_unregister(&cxl_drv->drv);
1939 }
1940 EXPORT_SYMBOL_NS_GPL(cxl_driver_unregister, CXL);
1941
1942 static int cxl_bus_uevent(const struct device *dev, struct kobj_uevent_env *env)
1943 {
1944         return add_uevent_var(env, "MODALIAS=" CXL_MODALIAS_FMT,
1945                               cxl_device_id(dev));
1946 }
1947
1948 static int cxl_bus_match(struct device *dev, struct device_driver *drv)
1949 {
1950         return cxl_device_id(dev) == to_cxl_drv(drv)->id;
1951 }
1952
1953 static int cxl_bus_probe(struct device *dev)
1954 {
1955         int rc;
1956
1957         rc = to_cxl_drv(dev->driver)->probe(dev);
1958         dev_dbg(dev, "probe: %d\n", rc);
1959         return rc;
1960 }
1961
1962 static void cxl_bus_remove(struct device *dev)
1963 {
1964         struct cxl_driver *cxl_drv = to_cxl_drv(dev->driver);
1965
1966         if (cxl_drv->remove)
1967                 cxl_drv->remove(dev);
1968 }
1969
1970 static struct workqueue_struct *cxl_bus_wq;
1971
1972 static void cxl_bus_rescan_queue(struct work_struct *w)
1973 {
1974         int rc = bus_rescan_devices(&cxl_bus_type);
1975
1976         pr_debug("CXL bus rescan result: %d\n", rc);
1977 }
1978
1979 void cxl_bus_rescan(void)
1980 {
1981         static DECLARE_WORK(rescan_work, cxl_bus_rescan_queue);
1982
1983         queue_work(cxl_bus_wq, &rescan_work);
1984 }
1985 EXPORT_SYMBOL_NS_GPL(cxl_bus_rescan, CXL);
1986
1987 void cxl_bus_drain(void)
1988 {
1989         drain_workqueue(cxl_bus_wq);
1990 }
1991 EXPORT_SYMBOL_NS_GPL(cxl_bus_drain, CXL);
1992
1993 bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd)
1994 {
1995         return queue_work(cxl_bus_wq, &cxlmd->detach_work);
1996 }
1997 EXPORT_SYMBOL_NS_GPL(schedule_cxl_memdev_detach, CXL);
1998
1999 /* for user tooling to ensure port disable work has completed */
2000 static ssize_t flush_store(const struct bus_type *bus, const char *buf, size_t count)
2001 {
2002         if (sysfs_streq(buf, "1")) {
2003                 flush_workqueue(cxl_bus_wq);
2004                 return count;
2005         }
2006
2007         return -EINVAL;
2008 }
2009
2010 static BUS_ATTR_WO(flush);
2011
2012 static struct attribute *cxl_bus_attributes[] = {
2013         &bus_attr_flush.attr,
2014         NULL,
2015 };
2016
2017 static struct attribute_group cxl_bus_attribute_group = {
2018         .attrs = cxl_bus_attributes,
2019 };
2020
2021 static const struct attribute_group *cxl_bus_attribute_groups[] = {
2022         &cxl_bus_attribute_group,
2023         NULL,
2024 };
2025
2026 struct bus_type cxl_bus_type = {
2027         .name = "cxl",
2028         .uevent = cxl_bus_uevent,
2029         .match = cxl_bus_match,
2030         .probe = cxl_bus_probe,
2031         .remove = cxl_bus_remove,
2032         .bus_groups = cxl_bus_attribute_groups,
2033 };
2034 EXPORT_SYMBOL_NS_GPL(cxl_bus_type, CXL);
2035
2036 static struct dentry *cxl_debugfs;
2037
2038 struct dentry *cxl_debugfs_create_dir(const char *dir)
2039 {
2040         return debugfs_create_dir(dir, cxl_debugfs);
2041 }
2042 EXPORT_SYMBOL_NS_GPL(cxl_debugfs_create_dir, CXL);
2043
2044 static __init int cxl_core_init(void)
2045 {
2046         int rc;
2047
2048         cxl_debugfs = debugfs_create_dir("cxl", NULL);
2049
2050         cxl_mbox_init();
2051
2052         rc = cxl_memdev_init();
2053         if (rc)
2054                 return rc;
2055
2056         cxl_bus_wq = alloc_ordered_workqueue("cxl_port", 0);
2057         if (!cxl_bus_wq) {
2058                 rc = -ENOMEM;
2059                 goto err_wq;
2060         }
2061
2062         rc = bus_register(&cxl_bus_type);
2063         if (rc)
2064                 goto err_bus;
2065
2066         rc = cxl_region_init();
2067         if (rc)
2068                 goto err_region;
2069
2070         return 0;
2071
2072 err_region:
2073         bus_unregister(&cxl_bus_type);
2074 err_bus:
2075         destroy_workqueue(cxl_bus_wq);
2076 err_wq:
2077         cxl_memdev_exit();
2078         return rc;
2079 }
2080
2081 static void cxl_core_exit(void)
2082 {
2083         cxl_region_exit();
2084         bus_unregister(&cxl_bus_type);
2085         destroy_workqueue(cxl_bus_wq);
2086         cxl_memdev_exit();
2087         debugfs_remove_recursive(cxl_debugfs);
2088 }
2089
2090 subsys_initcall(cxl_core_init);
2091 module_exit(cxl_core_exit);
2092 MODULE_LICENSE("GPL v2");