2015-05-20 04:54:31 +02:00
|
|
|
/*
|
|
|
|
* Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of version 2 of the GNU General Public License as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* General Public License for more details.
|
|
|
|
*/
|
|
|
|
#ifndef __ND_CORE_H__
|
|
|
|
#define __ND_CORE_H__
|
|
|
|
#include <linux/libnvdimm.h>
|
|
|
|
#include <linux/device.h>
|
|
|
|
|
2015-04-25 09:56:17 +02:00
|
|
|
extern struct list_head nvdimm_bus_list;
|
|
|
|
extern struct mutex nvdimm_bus_list_mutex;
|
2015-06-08 20:27:06 +02:00
|
|
|
extern int nvdimm_major;
|
2015-04-25 09:56:17 +02:00
|
|
|
|
2015-05-20 04:54:31 +02:00
|
|
|
struct nvdimm_bus {
|
|
|
|
struct nvdimm_bus_descriptor *nd_desc;
|
2015-05-31 21:02:11 +02:00
|
|
|
struct module *module;
|
2015-04-27 01:26:48 +02:00
|
|
|
struct list_head list;
|
2015-05-20 04:54:31 +02:00
|
|
|
struct device dev;
|
|
|
|
int id;
|
2015-05-31 21:02:11 +02:00
|
|
|
struct mutex reconfig_mutex;
|
2015-05-20 04:54:31 +02:00
|
|
|
};
|
2015-04-27 01:26:48 +02:00
|
|
|
|
2015-04-25 09:56:17 +02:00
|
|
|
struct nvdimm {
|
|
|
|
unsigned long flags;
|
|
|
|
void *provider_data;
|
2015-06-08 20:27:06 +02:00
|
|
|
unsigned long *dsm_mask;
|
2015-04-25 09:56:17 +02:00
|
|
|
struct device dev;
|
|
|
|
int id;
|
|
|
|
};
|
|
|
|
|
2015-05-31 21:02:11 +02:00
|
|
|
bool is_nvdimm(struct device *dev);
|
|
|
|
bool is_nd_blk(struct device *dev);
|
|
|
|
bool is_nd_pmem(struct device *dev);
|
2015-04-25 09:56:17 +02:00
|
|
|
struct nvdimm_bus *walk_to_nvdimm_bus(struct device *nd_dev);
|
2015-04-27 01:26:48 +02:00
|
|
|
int __init nvdimm_bus_init(void);
|
2015-05-31 20:41:48 +02:00
|
|
|
void nvdimm_bus_exit(void);
|
2015-04-27 01:26:48 +02:00
|
|
|
int nvdimm_bus_create_ndctl(struct nvdimm_bus *nvdimm_bus);
|
|
|
|
void nvdimm_bus_destroy_ndctl(struct nvdimm_bus *nvdimm_bus);
|
2015-05-31 20:41:48 +02:00
|
|
|
void nd_synchronize(void);
|
libnvdimm, nfit: regions (block-data-window, persistent memory, volatile memory)
A "region" device represents the maximum capacity of a BLK range (mmio
block-data-window(s)), or a PMEM range (DAX-capable persistent memory or
volatile memory), without regard for aliasing. Aliasing, in the
dimm-local address space (DPA), is resolved by metadata on a dimm to
designate which exclusive interface will access the aliased DPA ranges.
Support for the per-dimm metadata/label arrvies is in a subsequent
patch.
The name format of "region" devices is "regionN" where, like dimms, N is
a global ida index assigned at discovery time. This id is not reliable
across reboots nor in the presence of hotplug. Look to attributes of
the region or static id-data of the sub-namespace to generate a
persistent name. However, if the platform configuration does not change
it is reasonable to expect the same region id to be assigned at the next
boot.
"region"s have 2 generic attributes "size", and "mapping"s where:
- size: the BLK accessible capacity or the span of the
system physical address range in the case of PMEM.
- mappingN: a tuple describing a dimm's contribution to the region's
capacity in the format (<nmemX>,<dpa>,<size>). For a PMEM-region
there will be at least one mapping per dimm in the interleave set. For
a BLK-region there is only "mapping0" listing the starting DPA of the
BLK-region and the available DPA capacity of that space (matches "size"
above).
The max number of mappings per "region" is hard coded per the
constraints of sysfs attribute groups. That said the number of mappings
per region should never exceed the maximum number of possible dimms in
the system. If the current number turns out to not be enough then the
"mappings" attribute clarifies how many there are supposed to be. "32
should be enough for anybody...".
Cc: Neil Brown <neilb@suse.de>
Cc: <linux-acpi@vger.kernel.org>
Cc: Greg KH <gregkh@linuxfoundation.org>
Cc: Robert Moore <robert.moore@intel.com>
Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Christoph Hellwig <hch@lst.de>
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: Toshi Kani <toshi.kani@hp.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
2015-06-10 02:13:14 +02:00
|
|
|
int nvdimm_bus_register_dimms(struct nvdimm_bus *nvdimm_bus);
|
|
|
|
int nvdimm_bus_register_regions(struct nvdimm_bus *nvdimm_bus);
|
|
|
|
int nd_match_dimm(struct device *dev, void *data);
|
2015-05-20 04:54:31 +02:00
|
|
|
#endif /* __ND_CORE_H__ */
|