162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/* Copyright(c) 2023 Intel Corporation. All rights reserved. */
362306a36Sopenharmony_ci#include <linux/module.h>
462306a36Sopenharmony_ci#include <linux/dax.h>
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "../cxl/cxl.h"
762306a36Sopenharmony_ci#include "bus.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistatic int cxl_dax_region_probe(struct device *dev)
1062306a36Sopenharmony_ci{
1162306a36Sopenharmony_ci	struct cxl_dax_region *cxlr_dax = to_cxl_dax_region(dev);
1262306a36Sopenharmony_ci	int nid = phys_to_target_node(cxlr_dax->hpa_range.start);
1362306a36Sopenharmony_ci	struct cxl_region *cxlr = cxlr_dax->cxlr;
1462306a36Sopenharmony_ci	struct dax_region *dax_region;
1562306a36Sopenharmony_ci	struct dev_dax_data data;
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	if (nid == NUMA_NO_NODE)
1862306a36Sopenharmony_ci		nid = memory_add_physaddr_to_nid(cxlr_dax->hpa_range.start);
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	dax_region = alloc_dax_region(dev, cxlr->id, &cxlr_dax->hpa_range, nid,
2162306a36Sopenharmony_ci				      PMD_SIZE, IORESOURCE_DAX_KMEM);
2262306a36Sopenharmony_ci	if (!dax_region)
2362306a36Sopenharmony_ci		return -ENOMEM;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	data = (struct dev_dax_data) {
2662306a36Sopenharmony_ci		.dax_region = dax_region,
2762306a36Sopenharmony_ci		.id = -1,
2862306a36Sopenharmony_ci		.size = range_len(&cxlr_dax->hpa_range),
2962306a36Sopenharmony_ci	};
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	return PTR_ERR_OR_ZERO(devm_create_dev_dax(&data));
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic struct cxl_driver cxl_dax_region_driver = {
3562306a36Sopenharmony_ci	.name = "cxl_dax_region",
3662306a36Sopenharmony_ci	.probe = cxl_dax_region_probe,
3762306a36Sopenharmony_ci	.id = CXL_DEVICE_DAX_REGION,
3862306a36Sopenharmony_ci	.drv = {
3962306a36Sopenharmony_ci		.suppress_bind_attrs = true,
4062306a36Sopenharmony_ci	},
4162306a36Sopenharmony_ci};
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cimodule_cxl_driver(cxl_dax_region_driver);
4462306a36Sopenharmony_ciMODULE_ALIAS_CXL(CXL_DEVICE_DAX_REGION);
4562306a36Sopenharmony_ciMODULE_LICENSE("GPL");
4662306a36Sopenharmony_ciMODULE_AUTHOR("Intel Corporation");
4762306a36Sopenharmony_ciMODULE_IMPORT_NS(CXL);
48