Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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@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>

authored by

Alvaro Karsz and committed by
Michael S. Tsirkin
3616bf37 3f3a1675

+22
+6
drivers/vdpa/solidrun/snet_ctrl.c
··· 15 15 enum snet_ctrl_opcodes { 16 16 SNET_CTRL_OP_DESTROY = 1, 17 17 SNET_CTRL_OP_READ_VQ_STATE, 18 + SNET_CTRL_OP_SUSPEND, 18 19 }; 19 20 20 21 #define SNET_CTRL_TIMEOUT 2000000 ··· 322 321 { 323 322 return snet_ctrl_read_from_dpu(snet, SNET_CTRL_OP_READ_VQ_STATE, idx, state, 324 323 sizeof(*state)); 324 + } 325 + 326 + int snet_suspend_dev(struct snet *snet) 327 + { 328 + return snet_send_ctrl_msg(snet, SNET_CTRL_OP_SUSPEND, 0); 325 329 }
+15
drivers/vdpa/solidrun/snet_main.c
··· 483 483 iowrite8(*buf_ptr++, cfg_ptr + i); 484 484 } 485 485 486 + static int snet_suspend(struct vdpa_device *vdev) 487 + { 488 + struct snet *snet = vdpa_to_snet(vdev); 489 + int ret; 490 + 491 + ret = snet_suspend_dev(snet); 492 + if (ret) 493 + SNET_ERR(snet->pdev, "SNET[%u] suspend failed, err: %d\n", snet->sid, ret); 494 + else 495 + SNET_DBG(snet->pdev, "Suspend SNET[%u] device\n", snet->sid); 496 + 497 + return ret; 498 + } 499 + 486 500 static const struct vdpa_config_ops snet_config_ops = { 487 501 .set_vq_address = snet_set_vq_address, 488 502 .set_vq_num = snet_set_vq_num, ··· 522 508 .set_status = snet_set_status, 523 509 .get_config = snet_get_config, 524 510 .set_config = snet_set_config, 511 + .suspend = snet_suspend, 525 512 }; 526 513 527 514 static int psnet_open_pf_bar(struct pci_dev *pdev, struct psnet *psnet)
+1
drivers/vdpa/solidrun/snet_vdpa.h
··· 203 203 void snet_ctrl_clear(struct snet *snet); 204 204 int snet_destroy_dev(struct snet *snet); 205 205 int snet_read_vq_state(struct snet *snet, u16 idx, struct vdpa_vq_state *state); 206 + int snet_suspend_dev(struct snet *snet); 206 207 207 208 #endif //_SNET_VDPA_H_