On Wed, 2020-04-15 at 15:01 +0200, Klaus Jensen wrote: > From: Klaus Jensen <k.jen...@samsung.com> > > Signed-off-by: Klaus Jensen <k.jen...@samsung.com> > Reviewed-by: Philippe Mathieu-Daudé <phi...@redhat.com> > --- > hw/block/nvme.c | 49 +++++++++++++++++++++++++++---------------------- > 1 file changed, 27 insertions(+), 22 deletions(-) > > diff --git a/hw/block/nvme.c b/hw/block/nvme.c > index 906ae595025a..4c28d75e0fc8 100644 > --- a/hw/block/nvme.c > +++ b/hw/block/nvme.c > @@ -46,6 +46,7 @@ > > #define NVME_REG_SIZE 0x1000 > #define NVME_DB_SIZE 4 > +#define NVME_CMB_BIR 2 > > #define NVME_GUEST_ERR(trace, fmt, ...) \ > do { \ > @@ -1379,6 +1380,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; > @@ -1393,6 +1416,10 @@ static void nvme_init_pci(NvmeCtrl *n, PCIDevice > *pci_dev) > pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY | > PCI_BASE_ADDRESS_MEM_TYPE_64, &n->iomem); > msix_init_exclusive_bar(pci_dev, n->params.max_ioqpairs + 1, 4, NULL); > + > + if (n->params.cmb_size_mb) { > + nvme_init_cmb(n, pci_dev); > + } > } > > static void nvme_realize(PCIDevice *pci_dev, Error **errp) > @@ -1454,28 +1481,6 @@ static void nvme_realize(PCIDevice *pci_dev, Error > **errp) > n->bar.vs = 0x00010200; > 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); > - > - } > - > for (i = 0; i < n->num_namespaces; i++) { > nvme_init_namespace(n, &n->namespaces[i], &err); > if (err) {
Reviewed-by: Maxim Levitsky <mlevi...@redhat.com> Best regards, Maxim Levitsky