18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 38c2ecf20Sopenharmony_ci#include <linux/memregion.h> 48c2ecf20Sopenharmony_ci#include <linux/module.h> 58c2ecf20Sopenharmony_ci#include <linux/pfn_t.h> 68c2ecf20Sopenharmony_ci#include "../bus.h" 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_cistatic bool region_idle; 98c2ecf20Sopenharmony_cimodule_param_named(region_idle, region_idle, bool, 0644); 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cistatic int dax_hmem_probe(struct platform_device *pdev) 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci struct device *dev = &pdev->dev; 148c2ecf20Sopenharmony_ci struct dax_region *dax_region; 158c2ecf20Sopenharmony_ci struct memregion_info *mri; 168c2ecf20Sopenharmony_ci struct dev_dax_data data; 178c2ecf20Sopenharmony_ci struct dev_dax *dev_dax; 188c2ecf20Sopenharmony_ci struct resource *res; 198c2ecf20Sopenharmony_ci struct range range; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 228c2ecf20Sopenharmony_ci if (!res) 238c2ecf20Sopenharmony_ci return -ENOMEM; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci mri = dev->platform_data; 268c2ecf20Sopenharmony_ci range.start = res->start; 278c2ecf20Sopenharmony_ci range.end = res->end; 288c2ecf20Sopenharmony_ci dax_region = alloc_dax_region(dev, pdev->id, &range, mri->target_node, 298c2ecf20Sopenharmony_ci PMD_SIZE, 0); 308c2ecf20Sopenharmony_ci if (!dax_region) 318c2ecf20Sopenharmony_ci return -ENOMEM; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci data = (struct dev_dax_data) { 348c2ecf20Sopenharmony_ci .dax_region = dax_region, 358c2ecf20Sopenharmony_ci .id = -1, 368c2ecf20Sopenharmony_ci .size = region_idle ? 0 : resource_size(res), 378c2ecf20Sopenharmony_ci }; 388c2ecf20Sopenharmony_ci dev_dax = devm_create_dev_dax(&data); 398c2ecf20Sopenharmony_ci if (IS_ERR(dev_dax)) 408c2ecf20Sopenharmony_ci return PTR_ERR(dev_dax); 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci /* child dev_dax instances now own the lifetime of the dax_region */ 438c2ecf20Sopenharmony_ci dax_region_put(dax_region); 448c2ecf20Sopenharmony_ci return 0; 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_cistatic int dax_hmem_remove(struct platform_device *pdev) 488c2ecf20Sopenharmony_ci{ 498c2ecf20Sopenharmony_ci /* devm handles teardown */ 508c2ecf20Sopenharmony_ci return 0; 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cistatic struct platform_driver dax_hmem_driver = { 548c2ecf20Sopenharmony_ci .probe = dax_hmem_probe, 558c2ecf20Sopenharmony_ci .remove = dax_hmem_remove, 568c2ecf20Sopenharmony_ci .driver = { 578c2ecf20Sopenharmony_ci .name = "hmem", 588c2ecf20Sopenharmony_ci }, 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cimodule_platform_driver(dax_hmem_driver); 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ciMODULE_ALIAS("platform:hmem*"); 648c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 658c2ecf20Sopenharmony_ciMODULE_AUTHOR("Intel Corporation"); 66