mirror of https://gitee.com/openkylin/qemu.git
hw/block/nvme: factor out cmb setup
Signed-off-by: Klaus Jensen <k.jensen@samsung.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> Reviewed-by: Keith Busch <kbusch@kernel.org> Message-Id: <20200609190333.59390-17-its@irrelevant.dk> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
c3f5526d22
commit
51ec094d40
|
@ -56,6 +56,7 @@
|
|||
|
||||
#define NVME_REG_SIZE 0x1000
|
||||
#define NVME_DB_SIZE 4
|
||||
#define NVME_CMB_BIR 2
|
||||
|
||||
#define NVME_GUEST_ERR(trace, fmt, ...) \
|
||||
do { \
|
||||
|
@ -1438,6 +1439,28 @@ static void nvme_init_namespace(NvmeCtrl *n, NvmeNamespace *ns, Error **errp)
|
|||
id_ns->nuse = id_ns->ncap;
|
||||
}
|
||||
|
||||
static void nvme_init_cmb(NvmeCtrl *n, PCIDevice *pci_dev)
|
||||
{
|
||||
NVME_CMBLOC_SET_BIR(n->bar.cmbloc, NVME_CMB_BIR);
|
||||
NVME_CMBLOC_SET_OFST(n->bar.cmbloc, 0);
|
||||
|
||||
NVME_CMBSZ_SET_SQS(n->bar.cmbsz, 1);
|
||||
NVME_CMBSZ_SET_CQS(n->bar.cmbsz, 0);
|
||||
NVME_CMBSZ_SET_LISTS(n->bar.cmbsz, 0);
|
||||
NVME_CMBSZ_SET_RDS(n->bar.cmbsz, 1);
|
||||
NVME_CMBSZ_SET_WDS(n->bar.cmbsz, 1);
|
||||
NVME_CMBSZ_SET_SZU(n->bar.cmbsz, 2); /* MBs */
|
||||
NVME_CMBSZ_SET_SZ(n->bar.cmbsz, n->params.cmb_size_mb);
|
||||
|
||||
n->cmbuf = g_malloc0(NVME_CMBSZ_GETSIZE(n->bar.cmbsz));
|
||||
memory_region_init_io(&n->ctrl_mem, OBJECT(n), &nvme_cmb_ops, n,
|
||||
"nvme-cmb", NVME_CMBSZ_GETSIZE(n->bar.cmbsz));
|
||||
pci_register_bar(pci_dev, NVME_CMBLOC_BIR(n->bar.cmbloc),
|
||||
PCI_BASE_ADDRESS_SPACE_MEMORY |
|
||||
PCI_BASE_ADDRESS_MEM_TYPE_64 |
|
||||
PCI_BASE_ADDRESS_MEM_PREFETCH, &n->ctrl_mem);
|
||||
}
|
||||
|
||||
static void nvme_init_pci(NvmeCtrl *n, PCIDevice *pci_dev)
|
||||
{
|
||||
uint8_t *pci_conf = pci_dev->config;
|
||||
|
@ -1514,25 +1537,7 @@ static void nvme_realize(PCIDevice *pci_dev, Error **errp)
|
|||
n->bar.intmc = n->bar.intms = 0;
|
||||
|
||||
if (n->params.cmb_size_mb) {
|
||||
|
||||
NVME_CMBLOC_SET_BIR(n->bar.cmbloc, 2);
|
||||
NVME_CMBLOC_SET_OFST(n->bar.cmbloc, 0);
|
||||
|
||||
NVME_CMBSZ_SET_SQS(n->bar.cmbsz, 1);
|
||||
NVME_CMBSZ_SET_CQS(n->bar.cmbsz, 0);
|
||||
NVME_CMBSZ_SET_LISTS(n->bar.cmbsz, 0);
|
||||
NVME_CMBSZ_SET_RDS(n->bar.cmbsz, 1);
|
||||
NVME_CMBSZ_SET_WDS(n->bar.cmbsz, 1);
|
||||
NVME_CMBSZ_SET_SZU(n->bar.cmbsz, 2); /* MBs */
|
||||
NVME_CMBSZ_SET_SZ(n->bar.cmbsz, n->params.cmb_size_mb);
|
||||
|
||||
n->cmbuf = g_malloc0(NVME_CMBSZ_GETSIZE(n->bar.cmbsz));
|
||||
memory_region_init_io(&n->ctrl_mem, OBJECT(n), &nvme_cmb_ops, n,
|
||||
"nvme-cmb", NVME_CMBSZ_GETSIZE(n->bar.cmbsz));
|
||||
pci_register_bar(pci_dev, NVME_CMBLOC_BIR(n->bar.cmbloc),
|
||||
PCI_BASE_ADDRESS_SPACE_MEMORY | PCI_BASE_ADDRESS_MEM_TYPE_64 |
|
||||
PCI_BASE_ADDRESS_MEM_PREFETCH, &n->ctrl_mem);
|
||||
|
||||
nvme_init_cmb(n, pci_dev);
|
||||
} else if (n->pmrdev) {
|
||||
/* Controller Capabilities register */
|
||||
NVME_CAP_SET_PMRS(n->bar.cap, 1);
|
||||
|
|
Loading…
Reference in New Issue