@@ -495,6 +495,26 @@ static struct ndctl_region *get_pmem_region_by_range_index(struct ndctl_bus *bus
return NULL;
}
+static struct ndctl_region *get_pmem_region_by_dimm_handle(struct ndctl_bus *bus,
+ unsigned int handle)
+{
+ struct ndctl_region *region;
+
+ ndctl_region_foreach(bus, region) {
+ struct ndctl_mapping *map;
+
+ if (ndctl_region_get_type(region) != ND_DEVICE_REGION_PMEM)
+ continue;
+ ndctl_mapping_foreach(region, map) {
+ struct ndctl_dimm *dimm = ndctl_mapping_get_dimm(map);
+
+ if (ndctl_dimm_get_handle(dimm) == handle)
+ return region;
+ }
+ }
+ return NULL;
+}
+
static struct ndctl_region *get_blk_region_by_dimm_handle(struct ndctl_bus *bus,
unsigned int handle)
{
@@ -532,8 +552,12 @@ static int check_regions(struct ndctl_bus *bus, struct region *regions, int n,
struct ndctl_interleave_set *iset;
char devname[50];
- if (strcmp(regions[i].type, "pmem") == 0)
- region = get_pmem_region_by_range_index(bus, regions[i].range_index);
+ if (strcmp(regions[i].type, "pmem") == 0) {
+ if (ndctl_bus_has_nfit(bus))
+ region = get_pmem_region_by_range_index(bus, regions[i].range_index);
+ else
+ region = get_pmem_region_by_dimm_handle(bus, regions[i].handle);
+ }
else
region = get_blk_region_by_dimm_handle(bus, regions[i].handle);
@@ -2668,6 +2692,10 @@ static int do_test1(struct ndctl_ctx *ctx, struct ndctl_test *test)
if (ndctl_test_attempt(test, KERNEL_VERSION(4, 10, 0)))
dimms1[0].handle = DIMM_HANDLE(1, 0, 0, 0, 0);
+ if (!ndctl_bus_has_nfit(bus))
+ regions1[0].handle = DIMM_HANDLE(1, 0, 0, 0, 0);
+
+
rc = check_dimms(bus, dimms1, ARRAY_SIZE(dimms1), 0, 0, test);
if (rc)
return rc;
When there is no-interleave support, there is no range index. Signed-off-by: Santosh Sivaraj <santosh@fossix.org> --- test/libndctl.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-)