Alvaro Karsz
2023-Apr-10 10:02 UTC
[PATCH v3 2/2] vdpa/snet: support the suspend vDPA callback
When suspend is called, the driver sends a suspend command to the DPU
through the control mechanism.
Signed-off-by: Alvaro Karsz <alvaro.karsz at solid-run.com>
---
drivers/vdpa/solidrun/snet_ctrl.c | 6 ++++++
drivers/vdpa/solidrun/snet_main.c | 15 +++++++++++++++
drivers/vdpa/solidrun/snet_vdpa.h | 1 +
3 files changed, 22 insertions(+)
diff --git a/drivers/vdpa/solidrun/snet_ctrl.c
b/drivers/vdpa/solidrun/snet_ctrl.c
index f7b3b2887d6..c0449671baf 100644
--- a/drivers/vdpa/solidrun/snet_ctrl.c
+++ b/drivers/vdpa/solidrun/snet_ctrl.c
@@ -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
@@ -321,3 +322,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);
+}
diff --git a/drivers/vdpa/solidrun/snet_main.c
b/drivers/vdpa/solidrun/snet_main.c
index 5647a75b457..5216b27e112 100644
--- a/drivers/vdpa/solidrun/snet_main.c
+++ b/drivers/vdpa/solidrun/snet_main.c
@@ -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)
diff --git a/drivers/vdpa/solidrun/snet_vdpa.h
b/drivers/vdpa/solidrun/snet_vdpa.h
index 46133db3063..e33528f28bd 100644
--- a/drivers/vdpa/solidrun/snet_vdpa.h
+++ b/drivers/vdpa/solidrun/snet_vdpa.h
@@ -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_
--
2.34.1
Jason Wang
2023-Apr-11 05:21 UTC
[PATCH v3 2/2] vdpa/snet: support the suspend vDPA callback
? 2023/4/10 18:02, Alvaro Karsz ??:> When suspend is called, the driver sends a suspend command to the DPU > through the control mechanism. > > Signed-off-by: Alvaro Karsz <alvaro.karsz at solid-run.com>While at this, how about implement resume as well? Thanks> --- > drivers/vdpa/solidrun/snet_ctrl.c | 6 ++++++ > drivers/vdpa/solidrun/snet_main.c | 15 +++++++++++++++ > drivers/vdpa/solidrun/snet_vdpa.h | 1 + > 3 files changed, 22 insertions(+) > > diff --git a/drivers/vdpa/solidrun/snet_ctrl.c b/drivers/vdpa/solidrun/snet_ctrl.c > index f7b3b2887d6..c0449671baf 100644 > --- a/drivers/vdpa/solidrun/snet_ctrl.c > +++ b/drivers/vdpa/solidrun/snet_ctrl.c > @@ -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 > @@ -321,3 +322,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); > +} > diff --git a/drivers/vdpa/solidrun/snet_main.c b/drivers/vdpa/solidrun/snet_main.c > index 5647a75b457..5216b27e112 100644 > --- a/drivers/vdpa/solidrun/snet_main.c > +++ b/drivers/vdpa/solidrun/snet_main.c > @@ -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) > diff --git a/drivers/vdpa/solidrun/snet_vdpa.h b/drivers/vdpa/solidrun/snet_vdpa.h > index 46133db3063..e33528f28bd 100644 > --- a/drivers/vdpa/solidrun/snet_vdpa.h > +++ b/drivers/vdpa/solidrun/snet_vdpa.h > @@ -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_