Lines Matching defs:snet
33 static struct snet *vdpa_to_snet(struct vdpa_device *vdpa)
35 return container_of(vdpa, struct snet, vdpa);
40 struct snet *snet = data;
42 if (likely(snet->cb.callback))
43 return snet->cb.callback(snet->cb.private);
58 static void snet_free_irqs(struct snet *snet)
60 struct psnet *psnet = snet->psnet;
66 pdev = snet->pdev->physfn;
68 pdev = snet->pdev;
71 if (snet->cfg_irq != -1) {
72 devm_free_irq(&pdev->dev, snet->cfg_irq, snet);
73 snet->cfg_irq = -1;
76 for (i = 0; i < snet->cfg->vq_num; i++) {
77 if (snet->vqs[i] && snet->vqs[i]->irq != -1) {
78 devm_free_irq(&pdev->dev, snet->vqs[i]->irq, snet->vqs[i]);
79 snet->vqs[i]->irq = -1;
89 struct snet *snet = vdpa_to_snet(vdev);
91 snet->vqs[idx]->desc_area = desc_area;
92 snet->vqs[idx]->driver_area = driver_area;
93 snet->vqs[idx]->device_area = device_area;
100 struct snet *snet = vdpa_to_snet(vdev);
102 snet->vqs[idx]->num = num;
107 struct snet *snet = vdpa_to_snet(vdev);
109 if (unlikely(!snet->vqs[idx]->ready))
112 iowrite32(SNET_KICK_VAL, snet->vqs[idx]->kick_ptr);
117 struct snet *snet = vdpa_to_snet(vdev);
121 if (unlikely(!snet->vqs[idx]->ready))
124 iowrite32((data & 0xFFFF0000) | SNET_KICK_VAL, snet->vqs[idx]->kick_ptr);
129 struct snet *snet = vdpa_to_snet(vdev);
131 snet->vqs[idx]->cb.callback = cb->callback;
132 snet->vqs[idx]->cb.private = cb->private;
137 struct snet *snet = vdpa_to_snet(vdev);
139 snet->vqs[idx]->ready = ready;
144 struct snet *snet = vdpa_to_snet(vdev);
146 return snet->vqs[idx]->ready;
149 static bool snet_vq_state_is_initial(struct snet *snet, const struct vdpa_vq_state *state)
151 if (SNET_HAS_FEATURE(snet, VIRTIO_F_RING_PACKED)) {
169 struct snet *snet = vdpa_to_snet(vdev);
172 if (SNET_CFG_VER(snet, 2)) {
173 memcpy(&snet->vqs[idx]->vq_state, state, sizeof(*state));
180 if (snet_vq_state_is_initial(snet, state))
188 struct snet *snet = vdpa_to_snet(vdev);
190 return snet_read_vq_state(snet, idx, state);
195 struct snet *snet = vdpa_to_snet(vdev);
197 return snet->vqs[idx]->irq;
205 static int snet_reset_dev(struct snet *snet)
207 struct pci_dev *pdev = snet->pdev;
212 if (!snet->status)
216 if (snet->status & VIRTIO_CONFIG_S_DRIVER_OK)
217 ret = snet_destroy_dev(snet);
220 for (i = 0; i < snet->cfg->vq_num; i++) {
221 if (!snet->vqs[i])
223 snet->vqs[i]->cb.callback = NULL;
224 snet->vqs[i]->cb.private = NULL;
225 snet->vqs[i]->desc_area = 0;
226 snet->vqs[i]->device_area = 0;
227 snet->vqs[i]->driver_area = 0;
228 snet->vqs[i]->ready = false;
232 snet->cb.callback = NULL;
233 snet->cb.private = NULL;
235 snet_free_irqs(snet);
237 snet->status = 0;
238 snet->dpu_ready = false;
241 SNET_WARN(pdev, "Incomplete reset to SNET[%u] device, err: %d\n", snet->sid, ret);
243 SNET_DBG(pdev, "Reset SNET[%u] device\n", snet->sid);
250 struct snet *snet = vdpa_to_snet(vdev);
252 return snet_reset_dev(snet);
257 struct snet *snet = vdpa_to_snet(vdev);
259 return (size_t)snet->cfg->cfg_size;
264 struct snet *snet = vdpa_to_snet(vdev);
266 return snet->cfg->features;
271 struct snet *snet = vdpa_to_snet(vdev);
273 snet->negotiated_features = snet->cfg->features & features;
279 struct snet *snet = vdpa_to_snet(vdev);
281 return snet->negotiated_features;
286 struct snet *snet = vdpa_to_snet(vdev);
288 return (u16)snet->cfg->vq_size;
293 struct snet *snet = vdpa_to_snet(vdev);
295 snet->cb.callback = cb->callback;
296 snet->cb.private = cb->private;
301 struct snet *snet = vdpa_to_snet(vdev);
303 return snet->cfg->virtio_id;
313 struct snet *snet = vdpa_to_snet(vdev);
315 return snet->status;
318 static int snet_write_conf(struct snet *snet)
324 if (snet->dpu_ready)
345 off = snet->psnet->cfg.host_cfg_off;
349 snet_write32(snet, off, snet->psnet->negotiated_cfg_ver);
351 snet_write32(snet, off, snet->sid);
353 snet_write32(snet, off, snet->cfg->vq_num);
355 snet_write32(snet, off, snet->cfg_irq_idx);
357 snet_write64(snet, off, snet->negotiated_features);
362 for (i = 0 ; i < snet->cfg->vq_num ; i++) {
363 tmp = (i << 16) | (snet->vqs[i]->num & 0xFFFF);
364 snet_write32(snet, off, tmp);
366 snet_write32(snet, off, snet->vqs[i]->irq_idx);
368 snet_write64(snet, off, snet->vqs[i]->desc_area);
370 snet_write64(snet, off, snet->vqs[i]->device_area);
372 snet_write64(snet, off, snet->vqs[i]->driver_area);
375 if (SNET_CFG_VER(snet, 2))
376 snet_write32(snet, off, *(u32 *)&snet->vqs[i]->vq_state);
384 snet_write32(snet, snet->psnet->cfg.host_cfg_off, SNET_SIGNATURE);
387 ret = readx_poll_timeout(ioread32, snet->bar + snet->psnet->cfg.host_cfg_off,
390 SNET_ERR(snet->pdev, "Timeout waiting for the DPU to read the config\n");
395 snet->dpu_ready = true;
400 static int snet_request_irqs(struct pci_dev *pdev, struct snet *snet)
405 irq = pci_irq_vector(pdev, snet->cfg_irq_idx);
407 snet->cfg_irq_name, snet);
412 snet->cfg_irq = irq;
415 for (i = 0; i < snet->cfg->vq_num; i++) {
416 irq = pci_irq_vector(pdev, snet->vqs[i]->irq_idx);
418 snet->vqs[i]->irq_name, snet->vqs[i]);
423 snet->vqs[i]->irq = irq;
430 struct snet *snet = vdpa_to_snet(vdev);
431 struct psnet *psnet = snet->psnet;
432 struct pci_dev *pdev = snet->pdev;
436 if (status == snet->status)
440 !(snet->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
443 ret = snet_request_irqs(pf_irqs ? pdev->physfn : pdev, snet);
448 if (snet_write_conf(snet)) {
449 SNET_INFO(pdev, "Create SNET[%u] device\n", snet->sid);
451 snet_free_irqs(snet);
457 snet->status = status;
461 snet->status |= VIRTIO_CONFIG_S_FAILED;
467 struct snet *snet = vdpa_to_snet(vdev);
468 void __iomem *cfg_ptr = snet->cfg->virtio_cfg + offset;
473 if (offset + len > snet->cfg->cfg_size)
484 struct snet *snet = vdpa_to_snet(vdev);
485 void __iomem *cfg_ptr = snet->cfg->virtio_cfg + offset;
490 if (offset + len > snet->cfg->cfg_size)
500 struct snet *snet = vdpa_to_snet(vdev);
503 ret = snet_suspend_dev(snet);
505 SNET_ERR(snet->pdev, "SNET[%u] suspend failed, err: %d\n", snet->sid, ret);
507 SNET_DBG(snet->pdev, "Suspend SNET[%u] device\n", snet->sid);
514 struct snet *snet = vdpa_to_snet(vdev);
517 ret = snet_resume_dev(snet);
519 SNET_ERR(snet->pdev, "SNET[%u] resume failed, err: %d\n", snet->sid, ret);
521 SNET_DBG(snet->pdev, "Resume SNET[%u] device\n", snet->sid);
591 static int snet_open_vf_bar(struct pci_dev *pdev, struct snet *snet)
596 snprintf(name, sizeof(name), "snet[%s]-bar", pci_name(pdev));
598 ret = pcim_iomap_regions(pdev, BIT(snet->psnet->cfg.vf_bar), name);
604 snet->bar = pcim_iomap_table(pdev)[snet->psnet->cfg.vf_bar];
799 static void snet_free_vqs(struct snet *snet)
803 if (!snet->vqs)
806 for (i = 0 ; i < snet->cfg->vq_num ; i++) {
807 if (!snet->vqs[i])
810 kfree(snet->vqs[i]);
812 kfree(snet->vqs);
815 static int snet_build_vqs(struct snet *snet)
819 snet->vqs = kcalloc(snet->cfg->vq_num, sizeof(void *), GFP_KERNEL);
820 if (!snet->vqs)
824 for (i = 0; i < snet->cfg->vq_num; i++) {
825 snet->vqs[i] = kzalloc(sizeof(*snet->vqs[i]), GFP_KERNEL);
826 if (!snet->vqs[i]) {
827 snet_free_vqs(snet);
831 snet->vqs[i]->irq = -1;
833 snet->vqs[i]->sid = i;
835 snet->vqs[i]->kick_ptr = snet->bar + snet->psnet->cfg.kick_off +
836 snet->vqs[i]->sid * 4;
838 iowrite32(0, snet->vqs[i]->kick_ptr);
854 static void snet_reserve_irq_idx(struct pci_dev *pdev, struct snet *snet)
856 struct psnet *psnet = snet->psnet;
860 snet->cfg_irq_idx = psnet_get_next_irq_num(psnet);
861 snprintf(snet->cfg_irq_name, SNET_NAME_SIZE, "snet[%s]-cfg[%d]",
862 pci_name(pdev), snet->cfg_irq_idx);
864 for (i = 0; i < snet->cfg->vq_num; i++) {
866 snet->vqs[i]->irq_idx = psnet_get_next_irq_num(psnet);
868 snprintf(snet->vqs[i]->irq_name, SNET_NAME_SIZE, "snet[%s]-vq[%d]",
869 pci_name(pdev), snet->vqs[i]->irq_idx);
965 struct snet *snet;
1006 snet = vdpa_alloc_device(struct snet, vdpa, &pdev->dev, &snet_config_ops, 1, 1, NULL,
1008 if (!snet) {
1015 mutex_init(&snet->ctrl_lock);
1016 spin_lock_init(&snet->ctrl_spinlock);
1019 snet->pdev = pdev;
1020 snet->psnet = psnet;
1021 snet->cfg = dev_cfg;
1022 snet->dpu_ready = false;
1023 snet->sid = vfid;
1025 snet->cfg_irq = -1;
1027 ret = snet_open_vf_bar(pdev, snet);
1032 snet->cfg->virtio_cfg = snet->bar + snet->psnet->cfg.virtio_cfg_off;
1035 snet_ctrl_clear(snet);
1038 pci_set_drvdata(pdev, snet);
1040 ret = snet_build_vqs(snet);
1048 snet_reserve_irq_idx(pf_irqs ? pdev_pf : pdev, snet);
1051 snet->vdpa.dma_dev = &pdev->dev;
1054 ret = vdpa_register_device(&snet->vdpa, snet->cfg->vq_num);
1063 snet_free_vqs(snet);
1065 put_device(&snet->vdpa.dev);
1095 struct snet *snet = pci_get_drvdata(pdev);
1096 struct psnet *psnet = snet->psnet;
1098 vdpa_unregister_device(&snet->vdpa);
1099 snet_free_vqs(snet);
1122 .name = "snet-vdpa-driver",