|
@@ -583,6 +583,12 @@ static struct vmem_altmap *__nvdimm_setup_pfn(struct nd_pfn *nd_pfn,
|
|
|
return altmap;
|
|
|
}
|
|
|
|
|
|
+static u64 phys_pmem_align_down(struct nd_pfn *nd_pfn, u64 phys)
|
|
|
+{
|
|
|
+ return min_t(u64, PHYS_SECTION_ALIGN_DOWN(phys),
|
|
|
+ ALIGN_DOWN(phys, nd_pfn->align));
|
|
|
+}
|
|
|
+
|
|
|
static int nd_pfn_init(struct nd_pfn *nd_pfn)
|
|
|
{
|
|
|
u32 dax_label_reserve = is_nd_dax(&nd_pfn->dev) ? SZ_128K : 0;
|
|
@@ -638,13 +644,16 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn)
|
|
|
start = nsio->res.start;
|
|
|
size = PHYS_SECTION_ALIGN_UP(start + size) - start;
|
|
|
if (region_intersects(start, size, IORESOURCE_SYSTEM_RAM,
|
|
|
- IORES_DESC_NONE) == REGION_MIXED) {
|
|
|
+ IORES_DESC_NONE) == REGION_MIXED
|
|
|
+ || !IS_ALIGNED(start + resource_size(&nsio->res),
|
|
|
+ nd_pfn->align)) {
|
|
|
size = resource_size(&nsio->res);
|
|
|
- end_trunc = start + size - PHYS_SECTION_ALIGN_DOWN(start + size);
|
|
|
+ end_trunc = start + size - phys_pmem_align_down(nd_pfn,
|
|
|
+ start + size);
|
|
|
}
|
|
|
|
|
|
if (start_pad + end_trunc)
|
|
|
- dev_info(&nd_pfn->dev, "%s section collision, truncate %d bytes\n",
|
|
|
+ dev_info(&nd_pfn->dev, "%s alignment collision, truncate %d bytes\n",
|
|
|
dev_name(&ndns->dev), start_pad + end_trunc);
|
|
|
|
|
|
/*
|