vdpa/snet: support the suspend vDPA callback
authorAlvaro Karsz <alvaro.karsz@solid-run.com>
Thu, 13 Apr 2023 07:33:37 +0000 (10:33 +0300)
committerMichael S. Tsirkin <mst@redhat.com>
Fri, 21 Apr 2023 07:02:34 +0000 (03:02 -0400)
When suspend is called, the driver sends a suspend command to the DPU
through the control mechanism.

Signed-off-by: Alvaro Karsz <alvaro.karsz@solid-run.com>
Message-Id: <20230413073337.31367-3-alvaro.karsz@solid-run.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
drivers/vdpa/solidrun/snet_ctrl.c
drivers/vdpa/solidrun/snet_main.c
drivers/vdpa/solidrun/snet_vdpa.h

index 10cde50..3858738 100644 (file)
@@ -15,6 +15,7 @@
 enum snet_ctrl_opcodes {
        SNET_CTRL_OP_DESTROY = 1,
        SNET_CTRL_OP_READ_VQ_STATE,
+       SNET_CTRL_OP_SUSPEND,
 };
 
 #define SNET_CTRL_TIMEOUT              2000000
@@ -322,3 +323,8 @@ int snet_read_vq_state(struct snet *snet, u16 idx, struct vdpa_vq_state *state)
        return snet_ctrl_read_from_dpu(snet, SNET_CTRL_OP_READ_VQ_STATE, idx, state,
                                       sizeof(*state));
 }
+
+int snet_suspend_dev(struct snet *snet)
+{
+       return snet_send_ctrl_msg(snet, SNET_CTRL_OP_SUSPEND, 0);
+}
index 86769f4..7359599 100644 (file)
@@ -483,6 +483,20 @@ static void snet_set_config(struct vdpa_device *vdev, unsigned int offset,
                iowrite8(*buf_ptr++, cfg_ptr + i);
 }
 
+static int snet_suspend(struct vdpa_device *vdev)
+{
+       struct snet *snet = vdpa_to_snet(vdev);
+       int ret;
+
+       ret = snet_suspend_dev(snet);
+       if (ret)
+               SNET_ERR(snet->pdev, "SNET[%u] suspend failed, err: %d\n", snet->sid, ret);
+       else
+               SNET_DBG(snet->pdev, "Suspend SNET[%u] device\n", snet->sid);
+
+       return ret;
+}
+
 static const struct vdpa_config_ops snet_config_ops = {
        .set_vq_address         = snet_set_vq_address,
        .set_vq_num             = snet_set_vq_num,
@@ -508,6 +522,7 @@ static const struct vdpa_config_ops snet_config_ops = {
        .set_status             = snet_set_status,
        .get_config             = snet_get_config,
        .set_config             = snet_set_config,
+       .suspend                = snet_suspend,
 };
 
 static int psnet_open_pf_bar(struct pci_dev *pdev, struct psnet *psnet)
index 09ff676..3c78d4e 100644 (file)
@@ -203,5 +203,6 @@ void psnet_create_hwmon(struct pci_dev *pdev);
 void snet_ctrl_clear(struct snet *snet);
 int snet_destroy_dev(struct snet *snet);
 int snet_read_vq_state(struct snet *snet, u16 idx, struct vdpa_vq_state *state);
+int snet_suspend_dev(struct snet *snet);
 
 #endif //_SNET_VDPA_H_