Skip to content

Commit d747cf9

Browse files
Gregory Pricedavejiang
authored andcommitted
cxl/core/region: move dax region device logic into region_dax.c
core/region.c is overloaded with per-region control logic (pmem, dax, sysram, etc). Move the CXL DAX region device infrastructure from region.c into a new region_dax.c file. This will also allow us to add additional dax-driver integration paths that don't further dirty the core region.c logic. No functional changes. Signed-off-by: Gregory Price <gourry@gourry.net> Co-developed-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Alison Schofield <alison.schofield@intel.com> Link: https://patch.msgid.link/20260327020203.876122-3-gourry@gourry.net Signed-off-by: Dave Jiang <dave.jiang@intel.com>
1 parent 8a1ec5f commit d747cf9

5 files changed

Lines changed: 112 additions & 101 deletions

File tree

drivers/cxl/core/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ cxl_core-y += hdm.o
1515
cxl_core-y += pmu.o
1616
cxl_core-y += cdat.o
1717
cxl_core-$(CONFIG_TRACING) += trace.o
18-
cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o
18+
cxl_core-$(CONFIG_CXL_REGION) += region.o region_pmem.o region_dax.o
1919
cxl_core-$(CONFIG_CXL_MCE) += mce.o
2020
cxl_core-$(CONFIG_CXL_FEATURES) += features.o
2121
cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += edac.o

drivers/cxl/core/core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ int cxl_get_poison_by_endpoint(struct cxl_port *port);
5050
struct cxl_region *cxl_dpa_to_region(const struct cxl_memdev *cxlmd, u64 dpa);
5151
u64 cxl_dpa_to_hpa(struct cxl_region *cxlr, const struct cxl_memdev *cxlmd,
5252
u64 dpa);
53+
int devm_cxl_add_dax_region(struct cxl_region *cxlr);
5354
int devm_cxl_add_pmem_region(struct cxl_region *cxlr);
5455

5556
#else

drivers/cxl/core/region.c

Lines changed: 0 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -3410,105 +3410,6 @@ static int region_offset_to_dpa_result(struct cxl_region *cxlr, u64 offset,
34103410
return -ENXIO;
34113411
}
34123412

3413-
static void cxl_dax_region_release(struct device *dev)
3414-
{
3415-
struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
3416-
3417-
kfree(cxlr_dax);
3418-
}
3419-
3420-
static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
3421-
&cxl_base_attribute_group,
3422-
NULL,
3423-
};
3424-
3425-
const struct device_type cxl_dax_region_type = {
3426-
.name = "cxl_dax_region",
3427-
.release = cxl_dax_region_release,
3428-
.groups = cxl_dax_region_attribute_groups,
3429-
};
3430-
3431-
static bool is_cxl_dax_region(struct device *dev)
3432-
{
3433-
return dev->type == &cxl_dax_region_type;
3434-
}
3435-
3436-
struct cxl_dax_region *to_cxl_dax_region(struct device *dev)
3437-
{
3438-
if (dev_WARN_ONCE(dev, !is_cxl_dax_region(dev),
3439-
"not a cxl_dax_region device\n"))
3440-
return NULL;
3441-
return container_of(dev, struct cxl_dax_region, dev);
3442-
}
3443-
EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, "CXL");
3444-
3445-
static struct lock_class_key cxl_dax_region_key;
3446-
3447-
static struct cxl_dax_region *cxl_dax_region_alloc(struct cxl_region *cxlr)
3448-
{
3449-
struct cxl_region_params *p = &cxlr->params;
3450-
struct cxl_dax_region *cxlr_dax;
3451-
struct device *dev;
3452-
3453-
guard(rwsem_read)(&cxl_rwsem.region);
3454-
if (p->state != CXL_CONFIG_COMMIT)
3455-
return ERR_PTR(-ENXIO);
3456-
3457-
cxlr_dax = kzalloc_obj(*cxlr_dax);
3458-
if (!cxlr_dax)
3459-
return ERR_PTR(-ENOMEM);
3460-
3461-
cxlr_dax->hpa_range.start = p->res->start;
3462-
cxlr_dax->hpa_range.end = p->res->end;
3463-
3464-
dev = &cxlr_dax->dev;
3465-
cxlr_dax->cxlr = cxlr;
3466-
device_initialize(dev);
3467-
lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
3468-
device_set_pm_not_required(dev);
3469-
dev->parent = &cxlr->dev;
3470-
dev->bus = &cxl_bus_type;
3471-
dev->type = &cxl_dax_region_type;
3472-
3473-
return cxlr_dax;
3474-
}
3475-
3476-
static void cxlr_dax_unregister(void *_cxlr_dax)
3477-
{
3478-
struct cxl_dax_region *cxlr_dax = _cxlr_dax;
3479-
3480-
device_unregister(&cxlr_dax->dev);
3481-
}
3482-
3483-
static int devm_cxl_add_dax_region(struct cxl_region *cxlr)
3484-
{
3485-
struct cxl_dax_region *cxlr_dax;
3486-
struct device *dev;
3487-
int rc;
3488-
3489-
cxlr_dax = cxl_dax_region_alloc(cxlr);
3490-
if (IS_ERR(cxlr_dax))
3491-
return PTR_ERR(cxlr_dax);
3492-
3493-
dev = &cxlr_dax->dev;
3494-
rc = dev_set_name(dev, "dax_region%d", cxlr->id);
3495-
if (rc)
3496-
goto err;
3497-
3498-
rc = device_add(dev);
3499-
if (rc)
3500-
goto err;
3501-
3502-
dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent),
3503-
dev_name(dev));
3504-
3505-
return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister,
3506-
cxlr_dax);
3507-
err:
3508-
put_device(dev);
3509-
return rc;
3510-
}
3511-
35123413
static int match_root_decoder(struct device *dev, const void *data)
35133414
{
35143415
const struct range *r1, *r2 = data;

drivers/cxl/core/region_dax.c

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// SPDX-License-Identifier: GPL-2.0-only
2+
/*
3+
* Copyright(c) 2022 Intel Corporation. All rights reserved.
4+
* Copyright(c) 2026 Meta Technologies Inc. All rights reserved.
5+
*/
6+
#include <linux/device.h>
7+
#include <linux/slab.h>
8+
#include <cxlmem.h>
9+
#include <cxl.h>
10+
#include "core.h"
11+
12+
static void cxl_dax_region_release(struct device *dev)
13+
{
14+
struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
15+
16+
kfree(cxlr_dax);
17+
}
18+
19+
static const struct attribute_group *cxl_dax_region_attribute_groups[] = {
20+
&cxl_base_attribute_group,
21+
NULL
22+
};
23+
24+
const struct device_type cxl_dax_region_type = {
25+
.name = "cxl_dax_region",
26+
.release = cxl_dax_region_release,
27+
.groups = cxl_dax_region_attribute_groups,
28+
};
29+
30+
static bool is_cxl_dax_region(struct device *dev)
31+
{
32+
return dev->type == &cxl_dax_region_type;
33+
}
34+
35+
struct cxl_dax_region *to_cxl_dax_region(struct device *dev)
36+
{
37+
if (dev_WARN_ONCE(dev, !is_cxl_dax_region(dev),
38+
"not a cxl_dax_region device\n"))
39+
return NULL;
40+
return container_of(dev, struct cxl_dax_region, dev);
41+
}
42+
EXPORT_SYMBOL_NS_GPL(to_cxl_dax_region, "CXL");
43+
44+
static struct lock_class_key cxl_dax_region_key;
45+
46+
static struct cxl_dax_region *cxl_dax_region_alloc(struct cxl_region *cxlr)
47+
{
48+
struct cxl_region_params *p = &cxlr->params;
49+
struct cxl_dax_region *cxlr_dax;
50+
struct device *dev;
51+
52+
guard(rwsem_read)(&cxl_rwsem.region);
53+
if (p->state != CXL_CONFIG_COMMIT)
54+
return ERR_PTR(-ENXIO);
55+
56+
cxlr_dax = kzalloc_obj(*cxlr_dax);
57+
if (!cxlr_dax)
58+
return ERR_PTR(-ENOMEM);
59+
60+
cxlr_dax->hpa_range.start = p->res->start;
61+
cxlr_dax->hpa_range.end = p->res->end;
62+
63+
dev = &cxlr_dax->dev;
64+
cxlr_dax->cxlr = cxlr;
65+
device_initialize(dev);
66+
lockdep_set_class(&dev->mutex, &cxl_dax_region_key);
67+
device_set_pm_not_required(dev);
68+
dev->parent = &cxlr->dev;
69+
dev->bus = &cxl_bus_type;
70+
dev->type = &cxl_dax_region_type;
71+
72+
return cxlr_dax;
73+
}
74+
75+
static void cxlr_dax_unregister(void *_cxlr_dax)
76+
{
77+
struct cxl_dax_region *cxlr_dax = _cxlr_dax;
78+
79+
device_unregister(&cxlr_dax->dev);
80+
}
81+
82+
int devm_cxl_add_dax_region(struct cxl_region *cxlr)
83+
{
84+
struct cxl_dax_region *cxlr_dax;
85+
struct device *dev;
86+
int rc;
87+
88+
cxlr_dax = cxl_dax_region_alloc(cxlr);
89+
if (IS_ERR(cxlr_dax))
90+
return PTR_ERR(cxlr_dax);
91+
92+
dev = &cxlr_dax->dev;
93+
rc = dev_set_name(dev, "dax_region%d", cxlr->id);
94+
if (rc)
95+
goto err;
96+
97+
rc = device_add(dev);
98+
if (rc)
99+
goto err;
100+
101+
dev_dbg(&cxlr->dev, "%s: register %s\n", dev_name(dev->parent),
102+
dev_name(dev));
103+
104+
return devm_add_action_or_reset(&cxlr->dev, cxlr_dax_unregister,
105+
cxlr_dax);
106+
err:
107+
put_device(dev);
108+
return rc;
109+
}

tools/testing/cxl/Kbuild

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ cxl_core-y += $(CXL_CORE_SRC)/hdm.o
5959
cxl_core-y += $(CXL_CORE_SRC)/pmu.o
6060
cxl_core-y += $(CXL_CORE_SRC)/cdat.o
6161
cxl_core-$(CONFIG_TRACING) += $(CXL_CORE_SRC)/trace.o
62-
cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o
62+
cxl_core-$(CONFIG_CXL_REGION) += $(CXL_CORE_SRC)/region.o $(CXL_CORE_SRC)/region_pmem.o $(CXL_CORE_SRC)/region_dax.o
6363
cxl_core-$(CONFIG_CXL_MCE) += $(CXL_CORE_SRC)/mce.o
6464
cxl_core-$(CONFIG_CXL_FEATURES) += $(CXL_CORE_SRC)/features.o
6565
cxl_core-$(CONFIG_CXL_EDAC_MEM_FEATURES) += $(CXL_CORE_SRC)/edac.o

0 commit comments

Comments
 (0)