If you are unsure what to do, do not enable this option.
  
- config ACPI_NFIT
-       tristate "ACPI NVDIMM Firmware Interface Table (NFIT)"
-       depends on PHYS_ADDR_T_64BIT
-       depends on BLK_DEV
-       depends on ARCH_HAS_MMIO_FLUSH
-       select LIBNVDIMM
-       help
-         Infrastructure to probe ACPI 6 compliant platforms for
-         NVDIMMs (NFIT) and register a libnvdimm device tree.  In
-         addition to storage devices this also enables libnvdimm to pass
-         ACPI._DSM messages for platform/dimm configuration.
- 
-         To compile this driver as a module, choose M here:
-         the module will be called nfit.
- 
- config ACPI_NFIT_DEBUG
-       bool "NFIT DSM debug"
-       depends on ACPI_NFIT
-       depends on DYNAMIC_DEBUG
-       default n
-       help
-         Enabling this option causes the nfit driver to dump the
-         input and output buffers of _DSM operations on the ACPI0012
-         device and its children.  This can be very verbose, so leave
-         it disabled unless you are debugging a hardware / firmware
-         issue.
+ source "drivers/acpi/nfit/Kconfig"
  
  source "drivers/acpi/apei/Kconfig"
 +source "drivers/acpi/dptf/Kconfig"
  
  config ACPI_EXTLOG
        tristate "Extended Error Log support"
 
        return fn(ti, lc->dev, lc->start, ti->len, data);
  }
  
-                                void __pmem **kaddr, pfn_t *pfn, long size)
 +static long linear_direct_access(struct dm_target *ti, sector_t sector,
++                               void **kaddr, pfn_t *pfn, long size)
 +{
 +      struct linear_c *lc = ti->private;
 +      struct block_device *bdev = lc->dev->bdev;
 +      struct blk_dax_ctl dax = {
 +              .sector = linear_map_sector(ti, sector),
 +              .size = size,
 +      };
 +      long ret;
 +
 +      ret = bdev_direct_access(bdev, &dax);
 +      *kaddr = dax.addr;
 +      *pfn = dax.pfn;
 +
 +      return ret;
 +}
 +
  static struct target_type linear_target = {
        .name   = "linear",
 -      .version = {1, 2, 1},
 +      .version = {1, 3, 0},
        .module = THIS_MODULE,
        .ctr    = linear_ctr,
        .dtr    = linear_dtr,
 
        return do_origin(o->dev, bio);
  }
  
-               void __pmem **kaddr, pfn_t *pfn, long size)
 +static long origin_direct_access(struct dm_target *ti, sector_t sector,
++              void **kaddr, pfn_t *pfn, long size)
 +{
 +      DMWARN("device does not support dax.");
 +      return -EIO;
 +}
 +
  /*
   * Set the target "max_io_len" field to the minimum of all the snapshots'
   * chunk sizes.
 
        return DM_MAPIO_REMAPPED;
  }
  
-                                void __pmem **kaddr, pfn_t *pfn, long size)
 +static long stripe_direct_access(struct dm_target *ti, sector_t sector,
++                               void **kaddr, pfn_t *pfn, long size)
 +{
 +      struct stripe_c *sc = ti->private;
 +      uint32_t stripe;
 +      struct block_device *bdev;
 +      struct blk_dax_ctl dax = {
 +              .size = size,
 +      };
 +      long ret;
 +
 +      stripe_map_sector(sc, sector, &stripe, &dax.sector);
 +
 +      dax.sector += sc->stripe[stripe].physical_start;
 +      bdev = sc->stripe[stripe].dev->bdev;
 +
 +      ret = bdev_direct_access(bdev, &dax);
 +      *kaddr = dax.addr;
 +      *pfn = dax.pfn;
 +
 +      return ret;
 +}
 +
  /*
   * Stripe status:
   *
 
  {
  }
  
-                                void __pmem **kaddr, pfn_t *pfn, long size)
 +static long io_err_direct_access(struct dm_target *ti, sector_t sector,
++                               void **kaddr, pfn_t *pfn, long size)
 +{
 +      return -EIO;
 +}
 +
  static struct target_type error_target = {
        .name = "error",
 -      .version = {1, 4, 0},
 +      .version = {1, 5, 0},
        .features = DM_TARGET_WILDCARD,
        .ctr  = io_err_ctr,
        .dtr  = io_err_dtr,
 
  }
  EXPORT_SYMBOL_GPL(dm_set_target_max_io_len);
  
 -/*
 - * A target may call dm_accept_partial_bio only from the map routine.  It is
 - * allowed for all bio types except REQ_FLUSH.
 - *
 - * dm_accept_partial_bio informs the dm that the target only wants to process
 - * additional n_sectors sectors of the bio and the rest of the data should be
 - * sent in a next bio.
 - *
 - * A diagram that explains the arithmetics:
 +static long dm_blk_direct_access(struct block_device *bdev, sector_t sector,
-                                void __pmem **kaddr, pfn_t *pfn, long size)
++                               void **kaddr, pfn_t *pfn, long size)
 +{
 +      struct mapped_device *md = bdev->bd_disk->private_data;
 +      struct dm_table *map;
 +      struct dm_target *ti;
 +      int srcu_idx;
 +      long len, ret = -EIO;
 +
 +      map = dm_get_live_table(md, &srcu_idx);
 +      if (!map)
 +              goto out;
 +
 +      ti = dm_table_find_target(map, sector);
 +      if (!dm_target_is_valid(ti))
 +              goto out;
 +
 +      len = max_io_len(sector, ti) << SECTOR_SHIFT;
 +      size = min(len, size);
 +
 +      if (ti->type->direct_access)
 +              ret = ti->type->direct_access(ti, sector, kaddr, pfn, size);
 +out:
 +      dm_put_live_table(md, srcu_idx);
 +      return min(ret, size);
 +}
 +
 +/*
 + * A target may call dm_accept_partial_bio only from the map routine.  It is
 + * allowed for all bio types except REQ_PREFLUSH.
 + *
 + * dm_accept_partial_bio informs the dm that the target only wants to process
 + * additional n_sectors sectors of the bio and the rest of the data should be
 + * sent in a next bio.
 + *
 + * A diagram that explains the arithmetics:
   * +--------------------+---------------+-------+
   * |         1          |       2       |   3   |
   * +--------------------+---------------+-------+
 
        disk = alloc_disk(0);
        if (!disk)
                return -ENOMEM;
-       if (devm_add_action(dev, nd_blk_release_disk, disk)) {
-               put_disk(disk);
-               return -ENOMEM;
-       }
  
 -      disk->driverfs_dev      = dev;
        disk->first_minor       = 0;
        disk->fops              = &nd_blk_fops;
        disk->queue             = q;
        disk->flags             = GENHD_FL_EXT_DEVT;
        nvdimm_namespace_disk_name(&nsblk->common, disk->disk_name);
        set_capacity(disk, 0);
 -      add_disk(disk);
 +      device_add_disk(dev, disk);
  
+       if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk))
+               return -ENOMEM;
+ 
        if (nsblk_meta_size(nsblk)) {
                int rc = nd_integrity_init(disk, nsblk_meta_size(nsblk));
  
 
                        / 512);
        if (devm_init_badblocks(dev, &pmem->bb))
                return -ENOMEM;
-       nvdimm_badblocks_populate(to_nd_region(dev->parent), &pmem->bb, res);
+       nvdimm_badblocks_populate(nd_region, &pmem->bb, res);
        disk->bb = &pmem->bb;
 -      add_disk(disk);
 +      device_add_disk(dev, disk);
+ 
+       if (devm_add_action_or_reset(dev, pmem_release_disk, disk))
+               return -ENOMEM;
+ 
        revalidate_disk(disk);
  
        return 0;
 
   */
  typedef int (*dm_busy_fn) (struct dm_target *ti);
  
-                                    void __pmem **kaddr, pfn_t *pfn, long size);
 +/*
 + * Returns:
 + *  < 0 : error
 + * >= 0 : the number of bytes accessible at the address
 + */
 +typedef long (*dm_direct_access_fn) (struct dm_target *ti, sector_t sector,
++                                   void **kaddr, pfn_t *pfn, long size);
 +
  void dm_error(const char *message);
  
  struct dm_dev {