mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 01:03:55 -06:00
hw/rdma: Make distinction between device init and start modes
There are certain operations that are well considered as part of device configuration while others are needed only when "start" command is triggered by the guest driver. An example of device initialization step is msix_init and example of "device start" stage is the creation of a CQ completion handler thread. Driver expects such distinction - implement it. Signed-off-by: Yuval Shaia <yuval.shaia@oracle.com> Reviewed-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com> Message-Id: <20180805153518.2983-2-yuval.shaia@oracle.com> Signed-off-by: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
This commit is contained in:
parent
0abaa41d93
commit
751522275a
4 changed files with 157 additions and 77 deletions
|
@ -286,8 +286,78 @@ static void init_ports(PVRDMADev *dev, Error **errp)
|
|||
}
|
||||
}
|
||||
|
||||
static void uninit_msix(PCIDevice *pdev, int used_vectors)
|
||||
{
|
||||
PVRDMADev *dev = PVRDMA_DEV(pdev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < used_vectors; i++) {
|
||||
msix_vector_unuse(pdev, i);
|
||||
}
|
||||
|
||||
msix_uninit(pdev, &dev->msix, &dev->msix);
|
||||
}
|
||||
|
||||
static int init_msix(PCIDevice *pdev, Error **errp)
|
||||
{
|
||||
PVRDMADev *dev = PVRDMA_DEV(pdev);
|
||||
int i;
|
||||
int rc;
|
||||
|
||||
rc = msix_init(pdev, RDMA_MAX_INTRS, &dev->msix, RDMA_MSIX_BAR_IDX,
|
||||
RDMA_MSIX_TABLE, &dev->msix, RDMA_MSIX_BAR_IDX,
|
||||
RDMA_MSIX_PBA, 0, NULL);
|
||||
|
||||
if (rc < 0) {
|
||||
error_setg(errp, "Failed to initialize MSI-X");
|
||||
return rc;
|
||||
}
|
||||
|
||||
for (i = 0; i < RDMA_MAX_INTRS; i++) {
|
||||
rc = msix_vector_use(PCI_DEVICE(dev), i);
|
||||
if (rc < 0) {
|
||||
error_setg(errp, "Fail mark MSI-X vector %d", i);
|
||||
uninit_msix(pdev, i);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pvrdma_fini(PCIDevice *pdev)
|
||||
{
|
||||
PVRDMADev *dev = PVRDMA_DEV(pdev);
|
||||
|
||||
pr_dbg("Closing device %s %x.%x\n", pdev->name, PCI_SLOT(pdev->devfn),
|
||||
PCI_FUNC(pdev->devfn));
|
||||
|
||||
pvrdma_qp_ops_fini();
|
||||
|
||||
rdma_rm_fini(&dev->rdma_dev_res);
|
||||
|
||||
rdma_backend_fini(&dev->backend_dev);
|
||||
|
||||
free_dsr(dev);
|
||||
|
||||
if (msix_enabled(pdev)) {
|
||||
uninit_msix(pdev, RDMA_MAX_INTRS);
|
||||
}
|
||||
}
|
||||
|
||||
static void pvrdma_stop(PVRDMADev *dev)
|
||||
{
|
||||
rdma_backend_stop(&dev->backend_dev);
|
||||
}
|
||||
|
||||
static void pvrdma_start(PVRDMADev *dev)
|
||||
{
|
||||
rdma_backend_start(&dev->backend_dev);
|
||||
}
|
||||
|
||||
static void activate_device(PVRDMADev *dev)
|
||||
{
|
||||
pvrdma_start(dev);
|
||||
set_reg_val(dev, PVRDMA_REG_ERR, 0);
|
||||
pr_dbg("Device activated\n");
|
||||
}
|
||||
|
@ -300,7 +370,10 @@ static int unquiesce_device(PVRDMADev *dev)
|
|||
|
||||
static int reset_device(PVRDMADev *dev)
|
||||
{
|
||||
pvrdma_stop(dev);
|
||||
|
||||
pr_dbg("Device reset complete\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -469,45 +542,6 @@ static void init_regs(PCIDevice *pdev)
|
|||
set_reg_val(dev, PVRDMA_REG_ERR, 0xFFFF);
|
||||
}
|
||||
|
||||
static void uninit_msix(PCIDevice *pdev, int used_vectors)
|
||||
{
|
||||
PVRDMADev *dev = PVRDMA_DEV(pdev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < used_vectors; i++) {
|
||||
msix_vector_unuse(pdev, i);
|
||||
}
|
||||
|
||||
msix_uninit(pdev, &dev->msix, &dev->msix);
|
||||
}
|
||||
|
||||
static int init_msix(PCIDevice *pdev, Error **errp)
|
||||
{
|
||||
PVRDMADev *dev = PVRDMA_DEV(pdev);
|
||||
int i;
|
||||
int rc;
|
||||
|
||||
rc = msix_init(pdev, RDMA_MAX_INTRS, &dev->msix, RDMA_MSIX_BAR_IDX,
|
||||
RDMA_MSIX_TABLE, &dev->msix, RDMA_MSIX_BAR_IDX,
|
||||
RDMA_MSIX_PBA, 0, NULL);
|
||||
|
||||
if (rc < 0) {
|
||||
error_setg(errp, "Failed to initialize MSI-X");
|
||||
return rc;
|
||||
}
|
||||
|
||||
for (i = 0; i < RDMA_MAX_INTRS; i++) {
|
||||
rc = msix_vector_use(PCI_DEVICE(dev), i);
|
||||
if (rc < 0) {
|
||||
error_setg(errp, "Fail mark MSI-X vercor %d", i);
|
||||
uninit_msix(pdev, i);
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void init_dev_caps(PVRDMADev *dev)
|
||||
{
|
||||
size_t pg_tbl_bytes = TARGET_PAGE_SIZE *
|
||||
|
@ -602,22 +636,7 @@ out:
|
|||
|
||||
static void pvrdma_exit(PCIDevice *pdev)
|
||||
{
|
||||
PVRDMADev *dev = PVRDMA_DEV(pdev);
|
||||
|
||||
pr_dbg("Closing device %s %x.%x\n", pdev->name, PCI_SLOT(pdev->devfn),
|
||||
PCI_FUNC(pdev->devfn));
|
||||
|
||||
pvrdma_qp_ops_fini();
|
||||
|
||||
rdma_rm_fini(&dev->rdma_dev_res);
|
||||
|
||||
rdma_backend_fini(&dev->backend_dev);
|
||||
|
||||
free_dsr(dev);
|
||||
|
||||
if (msix_enabled(pdev)) {
|
||||
uninit_msix(pdev, RDMA_MAX_INTRS);
|
||||
}
|
||||
pvrdma_fini(pdev);
|
||||
}
|
||||
|
||||
static void pvrdma_class_init(ObjectClass *klass, void *data)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue