mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
nvme-pci: allow use of cmb on v1.4 controllers
[ Upstream commit 20d3bb92e8
]
Since NVMe v1.4 the Controller Memory Buffer must be explicitly enabled
by the host.
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
[hch: avoid a local variable and add a comment]
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
82ae0714c3
commit
3e554aa3d0
2 changed files with 20 additions and 0 deletions
|
@ -23,6 +23,7 @@
|
||||||
#include <linux/t10-pi.h>
|
#include <linux/t10-pi.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/io-64-nonatomic-lo-hi.h>
|
#include <linux/io-64-nonatomic-lo-hi.h>
|
||||||
|
#include <linux/io-64-nonatomic-hi-lo.h>
|
||||||
#include <linux/sed-opal.h>
|
#include <linux/sed-opal.h>
|
||||||
#include <linux/pci-p2pdma.h>
|
#include <linux/pci-p2pdma.h>
|
||||||
|
|
||||||
|
@ -1825,6 +1826,9 @@ static void nvme_map_cmb(struct nvme_dev *dev)
|
||||||
if (dev->cmb_size)
|
if (dev->cmb_size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (NVME_CAP_CMBS(dev->ctrl.cap))
|
||||||
|
writel(NVME_CMBMSC_CRE, dev->bar + NVME_REG_CMBMSC);
|
||||||
|
|
||||||
dev->cmbsz = readl(dev->bar + NVME_REG_CMBSZ);
|
dev->cmbsz = readl(dev->bar + NVME_REG_CMBSZ);
|
||||||
if (!dev->cmbsz)
|
if (!dev->cmbsz)
|
||||||
return;
|
return;
|
||||||
|
@ -1838,6 +1842,16 @@ static void nvme_map_cmb(struct nvme_dev *dev)
|
||||||
if (offset > bar_size)
|
if (offset > bar_size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Tell the controller about the host side address mapping the CMB,
|
||||||
|
* and enable CMB decoding for the NVMe 1.4+ scheme:
|
||||||
|
*/
|
||||||
|
if (NVME_CAP_CMBS(dev->ctrl.cap)) {
|
||||||
|
hi_lo_writeq(NVME_CMBMSC_CRE | NVME_CMBMSC_CMSE |
|
||||||
|
(pci_bus_address(pdev, bar) + offset),
|
||||||
|
dev->bar + NVME_REG_CMBMSC);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Controllers may support a CMB size larger than their BAR,
|
* Controllers may support a CMB size larger than their BAR,
|
||||||
* for example, due to being behind a bridge. Reduce the CMB to
|
* for example, due to being behind a bridge. Reduce the CMB to
|
||||||
|
|
|
@ -116,6 +116,9 @@ enum {
|
||||||
NVME_REG_BPMBL = 0x0048, /* Boot Partition Memory Buffer
|
NVME_REG_BPMBL = 0x0048, /* Boot Partition Memory Buffer
|
||||||
* Location
|
* Location
|
||||||
*/
|
*/
|
||||||
|
NVME_REG_CMBMSC = 0x0050, /* Controller Memory Buffer Memory
|
||||||
|
* Space Control
|
||||||
|
*/
|
||||||
NVME_REG_PMRCAP = 0x0e00, /* Persistent Memory Capabilities */
|
NVME_REG_PMRCAP = 0x0e00, /* Persistent Memory Capabilities */
|
||||||
NVME_REG_PMRCTL = 0x0e04, /* Persistent Memory Region Control */
|
NVME_REG_PMRCTL = 0x0e04, /* Persistent Memory Region Control */
|
||||||
NVME_REG_PMRSTS = 0x0e08, /* Persistent Memory Region Status */
|
NVME_REG_PMRSTS = 0x0e08, /* Persistent Memory Region Status */
|
||||||
|
@ -135,6 +138,7 @@ enum {
|
||||||
#define NVME_CAP_CSS(cap) (((cap) >> 37) & 0xff)
|
#define NVME_CAP_CSS(cap) (((cap) >> 37) & 0xff)
|
||||||
#define NVME_CAP_MPSMIN(cap) (((cap) >> 48) & 0xf)
|
#define NVME_CAP_MPSMIN(cap) (((cap) >> 48) & 0xf)
|
||||||
#define NVME_CAP_MPSMAX(cap) (((cap) >> 52) & 0xf)
|
#define NVME_CAP_MPSMAX(cap) (((cap) >> 52) & 0xf)
|
||||||
|
#define NVME_CAP_CMBS(cap) (((cap) >> 57) & 0x1)
|
||||||
|
|
||||||
#define NVME_CMB_BIR(cmbloc) ((cmbloc) & 0x7)
|
#define NVME_CMB_BIR(cmbloc) ((cmbloc) & 0x7)
|
||||||
#define NVME_CMB_OFST(cmbloc) (((cmbloc) >> 12) & 0xfffff)
|
#define NVME_CMB_OFST(cmbloc) (((cmbloc) >> 12) & 0xfffff)
|
||||||
|
@ -192,6 +196,8 @@ enum {
|
||||||
NVME_CSTS_SHST_OCCUR = 1 << 2,
|
NVME_CSTS_SHST_OCCUR = 1 << 2,
|
||||||
NVME_CSTS_SHST_CMPLT = 2 << 2,
|
NVME_CSTS_SHST_CMPLT = 2 << 2,
|
||||||
NVME_CSTS_SHST_MASK = 3 << 2,
|
NVME_CSTS_SHST_MASK = 3 << 2,
|
||||||
|
NVME_CMBMSC_CRE = 1 << 0,
|
||||||
|
NVME_CMBMSC_CMSE = 1 << 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nvme_id_power_state {
|
struct nvme_id_power_state {
|
||||||
|
|
Loading…
Reference in a new issue