mirror of
https://github.com/suyu-emu/horinux.git
synced 2026-09-21 14:15:21 -07:00
Merge branch 'pmem-api' into libnvdimm-for-next
This commit is contained in:
@@ -397,7 +397,8 @@ prototypes:
|
||||
int (*release) (struct gendisk *, fmode_t);
|
||||
int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
|
||||
int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
|
||||
int (*direct_access) (struct block_device *, sector_t, void **, unsigned long *);
|
||||
int (*direct_access) (struct block_device *, sector_t, void __pmem **,
|
||||
unsigned long *);
|
||||
int (*media_changed) (struct gendisk *);
|
||||
void (*unlock_native_capacity) (struct gendisk *);
|
||||
int (*revalidate_disk) (struct gendisk *);
|
||||
|
||||
@@ -6161,6 +6161,7 @@ Q: https://patchwork.kernel.org/project/linux-nvdimm/list/
|
||||
S: Supported
|
||||
F: drivers/nvdimm/pmem.c
|
||||
F: include/linux/pmem.h
|
||||
F: arch/*/include/asm/pmem.h
|
||||
|
||||
LINUX FOR IBM pSERIES (RS/6000)
|
||||
M: Paul Mackerras <paulus@au.ibm.com>
|
||||
|
||||
@@ -95,7 +95,7 @@ static struct physmap_flash_data cdb89712_bootrom_pdata __initdata = {
|
||||
|
||||
static struct resource cdb89712_bootrom_resources[] __initdata = {
|
||||
DEFINE_RES_NAMED(CS7_PHYS_BASE, SZ_128, "BOOTROM", IORESOURCE_MEM |
|
||||
IORESOURCE_CACHEABLE | IORESOURCE_READONLY),
|
||||
IORESOURCE_READONLY),
|
||||
};
|
||||
|
||||
static struct platform_device cdb89712_bootrom_pdev __initdata = {
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/io.h>
|
||||
#include "pm-rcar.h"
|
||||
|
||||
/* SYSC */
|
||||
|
||||
@@ -435,6 +435,7 @@ static inline void __iomem * ioremap_cache (unsigned long phys_addr, unsigned lo
|
||||
{
|
||||
return ioremap(phys_addr, size);
|
||||
}
|
||||
#define ioremap_cache ioremap_cache
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
/* IBM Summit (EXA) Cyclone counter code*/
|
||||
#define CYCLONE_CBAR_ADDR 0xFEB00CD0
|
||||
|
||||
@@ -102,7 +102,7 @@ static void of_pci_parse_addrs(struct device_node *node, struct pci_dev *dev)
|
||||
res = &dev->resource[(i - PCI_BASE_ADDRESS_0) >> 2];
|
||||
} else if (i == dev->rom_base_reg) {
|
||||
res = &dev->resource[PCI_ROM_RESOURCE];
|
||||
flags |= IORESOURCE_READONLY | IORESOURCE_CACHEABLE;
|
||||
flags |= IORESOURCE_READONLY;
|
||||
} else {
|
||||
printk(KERN_ERR "PCI: bad cfg reg num 0x%x\n", i);
|
||||
continue;
|
||||
|
||||
@@ -141,13 +141,14 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio)
|
||||
*/
|
||||
static long
|
||||
axon_ram_direct_access(struct block_device *device, sector_t sector,
|
||||
void **kaddr, unsigned long *pfn, long size)
|
||||
void __pmem **kaddr, unsigned long *pfn, long size)
|
||||
{
|
||||
struct axon_ram_bank *bank = device->bd_disk->private_data;
|
||||
loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT;
|
||||
void *addr = (void *)(bank->ph_addr + offset);
|
||||
|
||||
*kaddr = (void *)(bank->ph_addr + offset);
|
||||
*pfn = virt_to_phys(*kaddr) >> PAGE_SHIFT;
|
||||
*kaddr = (void __pmem *)addr;
|
||||
*pfn = virt_to_phys(addr) >> PAGE_SHIFT;
|
||||
|
||||
return bank->size - offset;
|
||||
}
|
||||
|
||||
@@ -342,6 +342,7 @@ ioremap_cache(phys_addr_t offset, unsigned long size)
|
||||
{
|
||||
return __ioremap_mode(offset, size, PAGE_KERNEL);
|
||||
}
|
||||
#define ioremap_cache ioremap_cache
|
||||
|
||||
#ifdef CONFIG_HAVE_IOREMAP_PROT
|
||||
static inline void __iomem *
|
||||
|
||||
@@ -231,8 +231,7 @@ static void pci_parse_of_addrs(struct platform_device *op,
|
||||
res = &dev->resource[(i - PCI_BASE_ADDRESS_0) >> 2];
|
||||
} else if (i == dev->rom_base_reg) {
|
||||
res = &dev->resource[PCI_ROM_RESOURCE];
|
||||
flags |= IORESOURCE_READONLY | IORESOURCE_CACHEABLE
|
||||
| IORESOURCE_SIZEALIGN;
|
||||
flags |= IORESOURCE_READONLY | IORESOURCE_SIZEALIGN;
|
||||
} else {
|
||||
printk(KERN_ERR "PCI: bad cfg reg num 0x%x\n", i);
|
||||
continue;
|
||||
|
||||
@@ -28,6 +28,7 @@ config X86
|
||||
select ARCH_HAS_FAST_MULTIPLIER
|
||||
select ARCH_HAS_GCOV_PROFILE_ALL
|
||||
select ARCH_HAS_PMEM_API
|
||||
select ARCH_HAS_MMIO_FLUSH
|
||||
select ARCH_HAS_SG_CHAIN
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select ARCH_MIGHT_HAVE_ACPI_PDC if ACPI
|
||||
|
||||
@@ -89,6 +89,8 @@ int set_pages_rw(struct page *page, int numpages);
|
||||
|
||||
void clflush_cache_range(void *addr, unsigned int size);
|
||||
|
||||
#define mmio_flush_range(addr, size) clflush_cache_range(addr, size)
|
||||
|
||||
#ifdef CONFIG_DEBUG_RODATA
|
||||
void mark_rodata_ro(void);
|
||||
extern const int rodata_test_data;
|
||||
@@ -109,75 +111,4 @@ static inline int rodata_test(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef ARCH_HAS_NOCACHE_UACCESS
|
||||
|
||||
/**
|
||||
* arch_memcpy_to_pmem - copy data to persistent memory
|
||||
* @dst: destination buffer for the copy
|
||||
* @src: source buffer for the copy
|
||||
* @n: length of the copy in bytes
|
||||
*
|
||||
* Copy data to persistent memory media via non-temporal stores so that
|
||||
* a subsequent arch_wmb_pmem() can flush cpu and memory controller
|
||||
* write buffers to guarantee durability.
|
||||
*/
|
||||
static inline void arch_memcpy_to_pmem(void __pmem *dst, const void *src,
|
||||
size_t n)
|
||||
{
|
||||
int unwritten;
|
||||
|
||||
/*
|
||||
* We are copying between two kernel buffers, if
|
||||
* __copy_from_user_inatomic_nocache() returns an error (page
|
||||
* fault) we would have already reported a general protection fault
|
||||
* before the WARN+BUG.
|
||||
*/
|
||||
unwritten = __copy_from_user_inatomic_nocache((void __force *) dst,
|
||||
(void __user *) src, n);
|
||||
if (WARN(unwritten, "%s: fault copying %p <- %p unwritten: %d\n",
|
||||
__func__, dst, src, unwritten))
|
||||
BUG();
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_wmb_pmem - synchronize writes to persistent memory
|
||||
*
|
||||
* After a series of arch_memcpy_to_pmem() operations this drains data
|
||||
* from cpu write buffers and any platform (memory controller) buffers
|
||||
* to ensure that written data is durable on persistent memory media.
|
||||
*/
|
||||
static inline void arch_wmb_pmem(void)
|
||||
{
|
||||
/*
|
||||
* wmb() to 'sfence' all previous writes such that they are
|
||||
* architecturally visible to 'pcommit'. Note, that we've
|
||||
* already arranged for pmem writes to avoid the cache via
|
||||
* arch_memcpy_to_pmem().
|
||||
*/
|
||||
wmb();
|
||||
pcommit_sfence();
|
||||
}
|
||||
|
||||
static inline bool __arch_has_wmb_pmem(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* We require that wmb() be an 'sfence', that is only guaranteed on
|
||||
* 64-bit builds
|
||||
*/
|
||||
return static_cpu_has(X86_FEATURE_PCOMMIT);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
#else /* ARCH_HAS_NOCACHE_UACCESS i.e. ARCH=um */
|
||||
extern void arch_memcpy_to_pmem(void __pmem *dst, const void *src, size_t n);
|
||||
extern void arch_wmb_pmem(void);
|
||||
|
||||
static inline bool __arch_has_wmb_pmem(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_CACHEFLUSH_H */
|
||||
|
||||
@@ -248,12 +248,6 @@ static inline void flush_write_buffers(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void __pmem *arch_memremap_pmem(resource_size_t offset,
|
||||
unsigned long size)
|
||||
{
|
||||
return (void __force __pmem *) ioremap_cache(offset, size);
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
extern void native_io_delay(void);
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
/*
|
||||
* Copyright(c) 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 __ASM_X86_PMEM_H__
|
||||
#define __ASM_X86_PMEM_H__
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/cpufeature.h>
|
||||
#include <asm/special_insns.h>
|
||||
|
||||
#define ARCH_MEMREMAP_PMEM MEMREMAP_WB
|
||||
|
||||
#ifdef CONFIG_ARCH_HAS_PMEM_API
|
||||
/**
|
||||
* arch_memcpy_to_pmem - copy data to persistent memory
|
||||
* @dst: destination buffer for the copy
|
||||
* @src: source buffer for the copy
|
||||
* @n: length of the copy in bytes
|
||||
*
|
||||
* Copy data to persistent memory media via non-temporal stores so that
|
||||
* a subsequent arch_wmb_pmem() can flush cpu and memory controller
|
||||
* write buffers to guarantee durability.
|
||||
*/
|
||||
static inline void arch_memcpy_to_pmem(void __pmem *dst, const void *src,
|
||||
size_t n)
|
||||
{
|
||||
int unwritten;
|
||||
|
||||
/*
|
||||
* We are copying between two kernel buffers, if
|
||||
* __copy_from_user_inatomic_nocache() returns an error (page
|
||||
* fault) we would have already reported a general protection fault
|
||||
* before the WARN+BUG.
|
||||
*/
|
||||
unwritten = __copy_from_user_inatomic_nocache((void __force *) dst,
|
||||
(void __user *) src, n);
|
||||
if (WARN(unwritten, "%s: fault copying %p <- %p unwritten: %d\n",
|
||||
__func__, dst, src, unwritten))
|
||||
BUG();
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_wmb_pmem - synchronize writes to persistent memory
|
||||
*
|
||||
* After a series of arch_memcpy_to_pmem() operations this drains data
|
||||
* from cpu write buffers and any platform (memory controller) buffers
|
||||
* to ensure that written data is durable on persistent memory media.
|
||||
*/
|
||||
static inline void arch_wmb_pmem(void)
|
||||
{
|
||||
/*
|
||||
* wmb() to 'sfence' all previous writes such that they are
|
||||
* architecturally visible to 'pcommit'. Note, that we've
|
||||
* already arranged for pmem writes to avoid the cache via
|
||||
* arch_memcpy_to_pmem().
|
||||
*/
|
||||
wmb();
|
||||
pcommit_sfence();
|
||||
}
|
||||
|
||||
/**
|
||||
* __arch_wb_cache_pmem - write back a cache range with CLWB
|
||||
* @vaddr: virtual start address
|
||||
* @size: number of bytes to write back
|
||||
*
|
||||
* Write back a cache range using the CLWB (cache line write back)
|
||||
* instruction. This function requires explicit ordering with an
|
||||
* arch_wmb_pmem() call. This API is internal to the x86 PMEM implementation.
|
||||
*/
|
||||
static inline void __arch_wb_cache_pmem(void *vaddr, size_t size)
|
||||
{
|
||||
u16 x86_clflush_size = boot_cpu_data.x86_clflush_size;
|
||||
unsigned long clflush_mask = x86_clflush_size - 1;
|
||||
void *vend = vaddr + size;
|
||||
void *p;
|
||||
|
||||
for (p = (void *)((unsigned long)vaddr & ~clflush_mask);
|
||||
p < vend; p += x86_clflush_size)
|
||||
clwb(p);
|
||||
}
|
||||
|
||||
/*
|
||||
* copy_from_iter_nocache() on x86 only uses non-temporal stores for iovec
|
||||
* iterators, so for other types (bvec & kvec) we must do a cache write-back.
|
||||
*/
|
||||
static inline bool __iter_needs_pmem_wb(struct iov_iter *i)
|
||||
{
|
||||
return iter_is_iovec(i) == false;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_copy_from_iter_pmem - copy data from an iterator to PMEM
|
||||
* @addr: PMEM destination address
|
||||
* @bytes: number of bytes to copy
|
||||
* @i: iterator with source data
|
||||
*
|
||||
* Copy data from the iterator 'i' to the PMEM buffer starting at 'addr'.
|
||||
* This function requires explicit ordering with an arch_wmb_pmem() call.
|
||||
*/
|
||||
static inline size_t arch_copy_from_iter_pmem(void __pmem *addr, size_t bytes,
|
||||
struct iov_iter *i)
|
||||
{
|
||||
void *vaddr = (void __force *)addr;
|
||||
size_t len;
|
||||
|
||||
/* TODO: skip the write-back by always using non-temporal stores */
|
||||
len = copy_from_iter_nocache(vaddr, bytes, i);
|
||||
|
||||
if (__iter_needs_pmem_wb(i))
|
||||
__arch_wb_cache_pmem(vaddr, bytes);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/**
|
||||
* arch_clear_pmem - zero a PMEM memory range
|
||||
* @addr: virtual start address
|
||||
* @size: number of bytes to zero
|
||||
*
|
||||
* Write zeros into the memory range starting at 'addr' for 'size' bytes.
|
||||
* This function requires explicit ordering with an arch_wmb_pmem() call.
|
||||
*/
|
||||
static inline void arch_clear_pmem(void __pmem *addr, size_t size)
|
||||
{
|
||||
void *vaddr = (void __force *)addr;
|
||||
|
||||
/* TODO: implement the zeroing via non-temporal writes */
|
||||
if (size == PAGE_SIZE && ((unsigned long)vaddr & ~PAGE_MASK) == 0)
|
||||
clear_page(vaddr);
|
||||
else
|
||||
memset(vaddr, 0, size);
|
||||
|
||||
__arch_wb_cache_pmem(vaddr, size);
|
||||
}
|
||||
|
||||
static inline bool arch_has_wmb_pmem(void)
|
||||
{
|
||||
#ifdef CONFIG_X86_64
|
||||
/*
|
||||
* We require that wmb() be an 'sfence', that is only guaranteed on
|
||||
* 64-bit builds
|
||||
*/
|
||||
return static_cpu_has(X86_FEATURE_PCOMMIT);
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
#endif /* CONFIG_ARCH_HAS_PMEM_API */
|
||||
|
||||
#endif /* __ASM_X86_PMEM_H__ */
|
||||
@@ -57,6 +57,7 @@ static inline void __iomem *ioremap_cache(unsigned long offset,
|
||||
else
|
||||
BUG();
|
||||
}
|
||||
#define ioremap_cache ioremap_cache
|
||||
|
||||
#define ioremap_wc ioremap_nocache
|
||||
#define ioremap_wt ioremap_nocache
|
||||
|
||||
@@ -410,6 +410,7 @@ 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
|
||||
|
||||
+31
-24
@@ -1017,7 +1017,7 @@ static u64 read_blk_stat(struct nfit_blk *nfit_blk, unsigned int bw)
|
||||
if (mmio->num_lines)
|
||||
offset = to_interleave_offset(offset, mmio);
|
||||
|
||||
return readq(mmio->base + offset);
|
||||
return readq(mmio->addr.base + offset);
|
||||
}
|
||||
|
||||
static void write_blk_ctl(struct nfit_blk *nfit_blk, unsigned int bw,
|
||||
@@ -1042,11 +1042,11 @@ static void write_blk_ctl(struct nfit_blk *nfit_blk, unsigned int bw,
|
||||
if (mmio->num_lines)
|
||||
offset = to_interleave_offset(offset, mmio);
|
||||
|
||||
writeq(cmd, mmio->base + offset);
|
||||
writeq(cmd, mmio->addr.base + offset);
|
||||
wmb_blk(nfit_blk);
|
||||
|
||||
if (nfit_blk->dimm_flags & ND_BLK_DCR_LATCH)
|
||||
readq(mmio->base + offset);
|
||||
readq(mmio->addr.base + offset);
|
||||
}
|
||||
|
||||
static int acpi_nfit_blk_single_io(struct nfit_blk *nfit_blk,
|
||||
@@ -1078,11 +1078,16 @@ static int acpi_nfit_blk_single_io(struct nfit_blk *nfit_blk,
|
||||
}
|
||||
|
||||
if (rw)
|
||||
memcpy_to_pmem(mmio->aperture + offset,
|
||||
memcpy_to_pmem(mmio->addr.aperture + offset,
|
||||
iobuf + copied, c);
|
||||
else
|
||||
else {
|
||||
if (nfit_blk->dimm_flags & ND_BLK_READ_FLUSH)
|
||||
mmio_flush_range((void __force *)
|
||||
mmio->addr.aperture + offset, c);
|
||||
|
||||
memcpy_from_pmem(iobuf + copied,
|
||||
mmio->aperture + offset, c);
|
||||
mmio->addr.aperture + offset, c);
|
||||
}
|
||||
|
||||
copied += c;
|
||||
len -= c;
|
||||
@@ -1129,7 +1134,10 @@ static void nfit_spa_mapping_release(struct kref *kref)
|
||||
|
||||
WARN_ON(!mutex_is_locked(&acpi_desc->spa_map_mutex));
|
||||
dev_dbg(acpi_desc->dev, "%s: SPA%d\n", __func__, spa->range_index);
|
||||
iounmap(spa_map->iomem);
|
||||
if (spa_map->type == SPA_MAP_APERTURE)
|
||||
memunmap((void __force *)spa_map->addr.aperture);
|
||||
else
|
||||
iounmap(spa_map->addr.base);
|
||||
release_mem_region(spa->address, spa->length);
|
||||
list_del(&spa_map->list);
|
||||
kfree(spa_map);
|
||||
@@ -1175,7 +1183,7 @@ static void __iomem *__nfit_spa_map(struct acpi_nfit_desc *acpi_desc,
|
||||
spa_map = find_spa_mapping(acpi_desc, spa);
|
||||
if (spa_map) {
|
||||
kref_get(&spa_map->kref);
|
||||
return spa_map->iomem;
|
||||
return spa_map->addr.base;
|
||||
}
|
||||
|
||||
spa_map = kzalloc(sizeof(*spa_map), GFP_KERNEL);
|
||||
@@ -1191,20 +1199,19 @@ static void __iomem *__nfit_spa_map(struct acpi_nfit_desc *acpi_desc,
|
||||
if (!res)
|
||||
goto err_mem;
|
||||
|
||||
if (type == SPA_MAP_APERTURE) {
|
||||
/*
|
||||
* TODO: memremap_pmem() support, but that requires cache
|
||||
* flushing when the aperture is moved.
|
||||
*/
|
||||
spa_map->iomem = ioremap_wc(start, n);
|
||||
} else
|
||||
spa_map->iomem = ioremap_nocache(start, n);
|
||||
spa_map->type = type;
|
||||
if (type == SPA_MAP_APERTURE)
|
||||
spa_map->addr.aperture = (void __pmem *)memremap(start, n,
|
||||
ARCH_MEMREMAP_PMEM);
|
||||
else
|
||||
spa_map->addr.base = ioremap_nocache(start, n);
|
||||
|
||||
if (!spa_map->iomem)
|
||||
|
||||
if (!spa_map->addr.base)
|
||||
goto err_map;
|
||||
|
||||
list_add_tail(&spa_map->list, &acpi_desc->spa_maps);
|
||||
return spa_map->iomem;
|
||||
return spa_map->addr.base;
|
||||
|
||||
err_map:
|
||||
release_mem_region(start, n);
|
||||
@@ -1267,7 +1274,7 @@ static int acpi_nfit_blk_get_flags(struct nvdimm_bus_descriptor *nd_desc,
|
||||
nfit_blk->dimm_flags = flags.flags;
|
||||
else if (rc == -ENOTTY) {
|
||||
/* fall back to a conservative default */
|
||||
nfit_blk->dimm_flags = ND_BLK_DCR_LATCH;
|
||||
nfit_blk->dimm_flags = ND_BLK_DCR_LATCH | ND_BLK_READ_FLUSH;
|
||||
rc = 0;
|
||||
} else
|
||||
rc = -ENXIO;
|
||||
@@ -1307,9 +1314,9 @@ static int acpi_nfit_blk_region_enable(struct nvdimm_bus *nvdimm_bus,
|
||||
/* map block aperture memory */
|
||||
nfit_blk->bdw_offset = nfit_mem->bdw->offset;
|
||||
mmio = &nfit_blk->mmio[BDW];
|
||||
mmio->base = nfit_spa_map(acpi_desc, nfit_mem->spa_bdw,
|
||||
mmio->addr.base = nfit_spa_map(acpi_desc, nfit_mem->spa_bdw,
|
||||
SPA_MAP_APERTURE);
|
||||
if (!mmio->base) {
|
||||
if (!mmio->addr.base) {
|
||||
dev_dbg(dev, "%s: %s failed to map bdw\n", __func__,
|
||||
nvdimm_name(nvdimm));
|
||||
return -ENOMEM;
|
||||
@@ -1330,9 +1337,9 @@ static int acpi_nfit_blk_region_enable(struct nvdimm_bus *nvdimm_bus,
|
||||
nfit_blk->cmd_offset = nfit_mem->dcr->command_offset;
|
||||
nfit_blk->stat_offset = nfit_mem->dcr->status_offset;
|
||||
mmio = &nfit_blk->mmio[DCR];
|
||||
mmio->base = nfit_spa_map(acpi_desc, nfit_mem->spa_dcr,
|
||||
mmio->addr.base = nfit_spa_map(acpi_desc, nfit_mem->spa_dcr,
|
||||
SPA_MAP_CONTROL);
|
||||
if (!mmio->base) {
|
||||
if (!mmio->addr.base) {
|
||||
dev_dbg(dev, "%s: %s failed to map dcr\n", __func__,
|
||||
nvdimm_name(nvdimm));
|
||||
return -ENOMEM;
|
||||
@@ -1399,7 +1406,7 @@ static void acpi_nfit_blk_region_disable(struct nvdimm_bus *nvdimm_bus,
|
||||
for (i = 0; i < 2; i++) {
|
||||
struct nfit_blk_mmio *mmio = &nfit_blk->mmio[i];
|
||||
|
||||
if (mmio->base)
|
||||
if (mmio->addr.base)
|
||||
nfit_spa_unmap(acpi_desc, mmio->spa);
|
||||
}
|
||||
nd_blk_region_set_provider_data(ndbr, NULL);
|
||||
|
||||
+11
-5
@@ -41,6 +41,7 @@ enum nfit_uuids {
|
||||
};
|
||||
|
||||
enum {
|
||||
ND_BLK_READ_FLUSH = 1,
|
||||
ND_BLK_DCR_LATCH = 2,
|
||||
};
|
||||
|
||||
@@ -117,12 +118,16 @@ enum nd_blk_mmio_selector {
|
||||
DCR,
|
||||
};
|
||||
|
||||
struct nd_blk_addr {
|
||||
union {
|
||||
void __iomem *base;
|
||||
void __pmem *aperture;
|
||||
};
|
||||
};
|
||||
|
||||
struct nfit_blk {
|
||||
struct nfit_blk_mmio {
|
||||
union {
|
||||
void __iomem *base;
|
||||
void __pmem *aperture;
|
||||
};
|
||||
struct nd_blk_addr addr;
|
||||
u64 size;
|
||||
u64 base_offset;
|
||||
u32 line_size;
|
||||
@@ -149,7 +154,8 @@ struct nfit_spa_mapping {
|
||||
struct acpi_nfit_system_address *spa;
|
||||
struct list_head list;
|
||||
struct kref kref;
|
||||
void __iomem *iomem;
|
||||
enum spa_map_type type;
|
||||
struct nd_blk_addr addr;
|
||||
};
|
||||
|
||||
static inline struct nfit_spa_mapping *to_spa_map(struct kref *kref)
|
||||
|
||||
+2
-2
@@ -371,7 +371,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector,
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_RAM_DAX
|
||||
static long brd_direct_access(struct block_device *bdev, sector_t sector,
|
||||
void **kaddr, unsigned long *pfn, long size)
|
||||
void __pmem **kaddr, unsigned long *pfn, long size)
|
||||
{
|
||||
struct brd_device *brd = bdev->bd_disk->private_data;
|
||||
struct page *page;
|
||||
@@ -381,7 +381,7 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector,
|
||||
page = brd_insert_page(brd, sector);
|
||||
if (!page)
|
||||
return -ENOSPC;
|
||||
*kaddr = page_address(page);
|
||||
*kaddr = (void __pmem *)page_address(page);
|
||||
*pfn = page_to_pfn(page);
|
||||
|
||||
/*
|
||||
|
||||
@@ -38,7 +38,7 @@ typedef struct icn_cdef {
|
||||
#include <linux/errno.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/major.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user