// SPDX-License-Identifier: GPL-2.0-only/* * Copyright(c) 2013-2015 Intel Corporation. All rights reserved. */#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt#include<linux/libnvdimm.h>#include<linux/sched/mm.h>#include<linux/vmalloc.h>#include<linux/uaccess.h>#include<linux/module.h>#include<linux/blkdev.h>#include<linux/fcntl.h>#include<linux/async.h>#include<linux/genhd.h>#include<linux/ndctl.h>#include<linux/sched.h>#include<linux/slab.h>#include<linux/cpu.h>#include<linux/fs.h>#include<linux/io.h>#include<linux/mm.h>#include<linux/nd.h>#include"nd-core.h"#include"nd.h"#include"pfn.h"intnvdimm_major;staticintnvdimm_bus_major;structclass*nd_class;staticDEFINE_IDA(nd_ida);staticintto_nd_device_type(structdevice*dev){if(is_nvdimm(dev))returnND_DEVICE_DIMM;elseif(is_memory(dev))returnND_DEVICE_REGION_PMEM;elseif(is_nd_blk(dev))returnND_DEVICE_REGION_BLK;elseif(is_nd_dax(dev))returnND_DEVICE_DAX_PMEM;elseif(is_nd_region(dev->parent))returnnd_region_to_nstype(to_nd_region(dev->parent));return0;}staticintnvdimm_bus_uevent(structdevice*dev,structkobj_uevent_env*env){returnadd_uevent_var(env,"MODALIAS="ND_DEVICE_MODALIAS_FMT,to_nd_device_type(dev));}staticstructmodule*to_bus_provider(structdevice*dev){/* pin bus providers while regions are enabled */if(is_nd_region(dev)){structnvdimm_bus*nvdimm_bus=walk_to_nvdimm_bus(dev);returnnvdimm_bus->nd_desc->module;}returnNULL;}staticvoidnvdimm_bus_probe_start(structnvdimm_bus*nvdimm_bus){nvdimm_bus_lock(&nvdimm_bus->dev);nvdimm_bus->probe_active++;nvdimm_bus_unlock(&nvdimm_bus->dev);}staticvoidnvdimm_bus_probe_end(structnvdimm_bus*nvdimm_bus){nvdimm_bus_lock(&nvdimm_bus->dev);if(--nvdimm_bus->probe_active==0)wake_up(&nvdimm_bus->wait);nvdimm_bus_unlock(&nvdimm_bus->dev);}staticintnvdimm_bus_probe(structdevice*dev){structnd_device_driver*nd_drv=to_nd_device_driver(dev->driver);structmodule*provider=to_bus_provider(dev);struct