|
@@ -540,6 +540,7 @@ static struct vmem_altmap *__nvdimm_setup_pfn(struct nd_pfn *nd_pfn,
|
|
|
|
|
|
static int nd_pfn_init(struct nd_pfn *nd_pfn)
|
|
static int nd_pfn_init(struct nd_pfn *nd_pfn)
|
|
{
|
|
{
|
|
|
|
+ u32 dax_label_reserve = is_nd_dax(&nd_pfn->dev) ? SZ_128K : 0;
|
|
struct nd_namespace_common *ndns = nd_pfn->ndns;
|
|
struct nd_namespace_common *ndns = nd_pfn->ndns;
|
|
u32 start_pad = 0, end_trunc = 0;
|
|
u32 start_pad = 0, end_trunc = 0;
|
|
resource_size_t start, size;
|
|
resource_size_t start, size;
|
|
@@ -606,10 +607,11 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
|
|
size = resource_size(&nsio->res);
|
|
size = resource_size(&nsio->res);
|
|
npfns = (size - start_pad - end_trunc - SZ_8K) / SZ_4K;
|
|
npfns = (size - start_pad - end_trunc - SZ_8K) / SZ_4K;
|
|
if (nd_pfn->mode == PFN_MODE_PMEM)
|
|
if (nd_pfn->mode == PFN_MODE_PMEM)
|
|
- offset = ALIGN(start + SZ_8K + 64 * npfns, nd_pfn->align)
|
|
|
|
- - start;
|
|
|
|
|
|
+ offset = ALIGN(start + SZ_8K + 64 * npfns + dax_label_reserve,
|
|
|
|
+ nd_pfn->align) - start;
|
|
else if (nd_pfn->mode == PFN_MODE_RAM)
|
|
else if (nd_pfn->mode == PFN_MODE_RAM)
|
|
- offset = ALIGN(start + SZ_8K, nd_pfn->align) - start;
|
|
|
|
|
|
+ offset = ALIGN(start + SZ_8K + dax_label_reserve,
|
|
|
|
+ nd_pfn->align) - start;
|
|
else
|
|
else
|
|
return -ENXIO;
|
|
return -ENXIO;
|
|
|
|
|