@@ -32,7 +32,7 @@ struct vp_vring {
3232
3333struct vp_vdpa {
3434 struct vdpa_device vdpa ;
35- struct virtio_pci_modern_device mdev ;
35+ struct virtio_pci_modern_device * mdev ;
3636 struct vp_vring * vring ;
3737 struct vdpa_callback config_cb ;
3838 char msix_name [VP_VDPA_NAME_SIZE ];
@@ -41,6 +41,12 @@ struct vp_vdpa {
4141 int vectors ;
4242};
4343
44+ struct vp_vdpa_mgmtdev {
45+ struct vdpa_mgmt_dev mgtdev ;
46+ struct virtio_pci_modern_device * mdev ;
47+ struct vp_vdpa * vp_vdpa ;
48+ };
49+
4450static struct vp_vdpa * vdpa_to_vp (struct vdpa_device * vdpa )
4551{
4652 return container_of (vdpa , struct vp_vdpa , vdpa );
@@ -50,7 +56,12 @@ static struct virtio_pci_modern_device *vdpa_to_mdev(struct vdpa_device *vdpa)
5056{
5157 struct vp_vdpa * vp_vdpa = vdpa_to_vp (vdpa );
5258
53- return & vp_vdpa -> mdev ;
59+ return vp_vdpa -> mdev ;
60+ }
61+
62+ static struct virtio_pci_modern_device * vp_vdpa_to_mdev (struct vp_vdpa * vp_vdpa )
63+ {
64+ return vp_vdpa -> mdev ;
5465}
5566
5667static u64 vp_vdpa_get_device_features (struct vdpa_device * vdpa )
@@ -96,7 +107,7 @@ static int vp_vdpa_get_vq_irq(struct vdpa_device *vdpa, u16 idx)
96107
97108static void vp_vdpa_free_irq (struct vp_vdpa * vp_vdpa )
98109{
99- struct virtio_pci_modern_device * mdev = & vp_vdpa -> mdev ;
110+ struct virtio_pci_modern_device * mdev = vp_vdpa_to_mdev ( vp_vdpa ) ;
100111 struct pci_dev * pdev = mdev -> pci_dev ;
101112 int i ;
102113
@@ -143,7 +154,7 @@ static irqreturn_t vp_vdpa_config_handler(int irq, void *arg)
143154
144155static int vp_vdpa_request_irq (struct vp_vdpa * vp_vdpa )
145156{
146- struct virtio_pci_modern_device * mdev = & vp_vdpa -> mdev ;
157+ struct virtio_pci_modern_device * mdev = vp_vdpa_to_mdev ( vp_vdpa ) ;
147158 struct pci_dev * pdev = mdev -> pci_dev ;
148159 int i , ret , irq ;
149160 int queues = vp_vdpa -> queues ;
@@ -198,7 +209,7 @@ static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
198209static void vp_vdpa_set_status (struct vdpa_device * vdpa , u8 status )
199210{
200211 struct vp_vdpa * vp_vdpa = vdpa_to_vp (vdpa );
201- struct virtio_pci_modern_device * mdev = & vp_vdpa -> mdev ;
212+ struct virtio_pci_modern_device * mdev = vp_vdpa_to_mdev ( vp_vdpa ) ;
202213 u8 s = vp_vdpa_get_status (vdpa );
203214
204215 if (status & VIRTIO_CONFIG_S_DRIVER_OK &&
@@ -212,7 +223,7 @@ static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
212223static int vp_vdpa_reset (struct vdpa_device * vdpa )
213224{
214225 struct vp_vdpa * vp_vdpa = vdpa_to_vp (vdpa );
215- struct virtio_pci_modern_device * mdev = & vp_vdpa -> mdev ;
226+ struct virtio_pci_modern_device * mdev = vp_vdpa_to_mdev ( vp_vdpa ) ;
216227 u8 s = vp_vdpa_get_status (vdpa );
217228
218229 vp_modern_set_status (mdev , 0 );
@@ -372,7 +383,7 @@ static void vp_vdpa_get_config(struct vdpa_device *vdpa,
372383 void * buf , unsigned int len )
373384{
374385 struct vp_vdpa * vp_vdpa = vdpa_to_vp (vdpa );
375- struct virtio_pci_modern_device * mdev = & vp_vdpa -> mdev ;
386+ struct virtio_pci_modern_device * mdev = vp_vdpa_to_mdev ( vp_vdpa ) ;
376387 u8 old , new ;
377388 u8 * p ;
378389 int i ;
@@ -392,7 +403,7 @@ static void vp_vdpa_set_config(struct vdpa_device *vdpa,
392403 unsigned int len )
393404{
394405 struct vp_vdpa * vp_vdpa = vdpa_to_vp (vdpa );
395- struct virtio_pci_modern_device * mdev = & vp_vdpa -> mdev ;
406+ struct virtio_pci_modern_device * mdev = vp_vdpa_to_mdev ( vp_vdpa ) ;
396407 const u8 * p = buf ;
397408 int i ;
398409
@@ -412,7 +423,7 @@ static struct vdpa_notification_area
412423vp_vdpa_get_vq_notification (struct vdpa_device * vdpa , u16 qid )
413424{
414425 struct vp_vdpa * vp_vdpa = vdpa_to_vp (vdpa );
415- struct virtio_pci_modern_device * mdev = & vp_vdpa -> mdev ;
426+ struct virtio_pci_modern_device * mdev = vp_vdpa_to_mdev ( vp_vdpa ) ;
416427 struct vdpa_notification_area notify ;
417428
418429 notify .addr = vp_vdpa -> vring [qid ].notify_pa ;
@@ -454,38 +465,31 @@ static void vp_vdpa_free_irq_vectors(void *data)
454465 pci_free_irq_vectors (data );
455466}
456467
457- static int vp_vdpa_probe (struct pci_dev * pdev , const struct pci_device_id * id )
468+ static int vp_vdpa_dev_add (struct vdpa_mgmt_dev * v_mdev , const char * name ,
469+ const struct vdpa_dev_set_config * add_config )
458470{
459- struct virtio_pci_modern_device * mdev ;
471+ struct vp_vdpa_mgmtdev * vp_vdpa_mgtdev =
472+ container_of (v_mdev , struct vp_vdpa_mgmtdev , mgtdev );
473+
474+ struct virtio_pci_modern_device * mdev = vp_vdpa_mgtdev -> mdev ;
475+ struct pci_dev * pdev = mdev -> pci_dev ;
460476 struct device * dev = & pdev -> dev ;
461- struct vp_vdpa * vp_vdpa ;
477+ struct vp_vdpa * vp_vdpa = NULL ;
462478 int ret , i ;
463479
464- ret = pcim_enable_device (pdev );
465- if (ret )
466- return ret ;
467-
468480 vp_vdpa = vdpa_alloc_device (struct vp_vdpa , vdpa ,
469- dev , & vp_vdpa_ops , 1 , 1 , NULL , false);
481+ dev , & vp_vdpa_ops , 1 , 1 , name , false);
482+
470483 if (IS_ERR (vp_vdpa )) {
471484 dev_err (dev , "vp_vdpa: Failed to allocate vDPA structure\n" );
472485 return PTR_ERR (vp_vdpa );
473486 }
474487
475- mdev = & vp_vdpa -> mdev ;
476- mdev -> pci_dev = pdev ;
477-
478- ret = vp_modern_probe (mdev );
479- if (ret ) {
480- dev_err (& pdev -> dev , "Failed to probe modern PCI device\n" );
481- goto err ;
482- }
483-
484- pci_set_master (pdev );
485- pci_set_drvdata (pdev , vp_vdpa );
488+ vp_vdpa_mgtdev -> vp_vdpa = vp_vdpa ;
486489
487490 vp_vdpa -> vdpa .dma_dev = & pdev -> dev ;
488491 vp_vdpa -> queues = vp_modern_get_num_queues (mdev );
492+ vp_vdpa -> mdev = mdev ;
489493
490494 ret = devm_add_action_or_reset (dev , vp_vdpa_free_irq_vectors , pdev );
491495 if (ret ) {
@@ -516,7 +520,8 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
516520 }
517521 vp_vdpa -> config_irq = VIRTIO_MSI_NO_VECTOR ;
518522
519- ret = vdpa_register_device (& vp_vdpa -> vdpa , vp_vdpa -> queues );
523+ vp_vdpa -> vdpa .mdev = & vp_vdpa_mgtdev -> mgtdev ;
524+ ret = _vdpa_register_device (& vp_vdpa -> vdpa , vp_vdpa -> queues );
520525 if (ret ) {
521526 dev_err (& pdev -> dev , "Failed to register to vdpa bus\n" );
522527 goto err ;
@@ -529,12 +534,104 @@ static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
529534 return ret ;
530535}
531536
537+ static void vp_vdpa_dev_del (struct vdpa_mgmt_dev * v_mdev ,
538+ struct vdpa_device * dev )
539+ {
540+ struct vp_vdpa_mgmtdev * vp_vdpa_mgtdev =
541+ container_of (v_mdev , struct vp_vdpa_mgmtdev , mgtdev );
542+
543+ struct vp_vdpa * vp_vdpa = vp_vdpa_mgtdev -> vp_vdpa ;
544+
545+ _vdpa_unregister_device (& vp_vdpa -> vdpa );
546+ vp_vdpa_mgtdev -> vp_vdpa = NULL ;
547+ }
548+
549+ static const struct vdpa_mgmtdev_ops vp_vdpa_mdev_ops = {
550+ .dev_add = vp_vdpa_dev_add ,
551+ .dev_del = vp_vdpa_dev_del ,
552+ };
553+
554+ static int vp_vdpa_probe (struct pci_dev * pdev , const struct pci_device_id * id )
555+ {
556+ struct vp_vdpa_mgmtdev * vp_vdpa_mgtdev = NULL ;
557+ struct vdpa_mgmt_dev * mgtdev ;
558+ struct device * dev = & pdev -> dev ;
559+ struct virtio_pci_modern_device * mdev = NULL ;
560+ struct virtio_device_id * mdev_id = NULL ;
561+ int err ;
562+
563+ vp_vdpa_mgtdev = kzalloc (sizeof (* vp_vdpa_mgtdev ), GFP_KERNEL );
564+ if (!vp_vdpa_mgtdev )
565+ return - ENOMEM ;
566+
567+ mgtdev = & vp_vdpa_mgtdev -> mgtdev ;
568+ mgtdev -> ops = & vp_vdpa_mdev_ops ;
569+ mgtdev -> device = dev ;
570+
571+ mdev = kzalloc (sizeof (struct virtio_pci_modern_device ), GFP_KERNEL );
572+ if (!mdev ) {
573+ err = - ENOMEM ;
574+ goto mdev_err ;
575+ }
576+
577+ mdev_id = kzalloc (sizeof (struct virtio_device_id ), GFP_KERNEL );
578+ if (!mdev_id ) {
579+ err = - ENOMEM ;
580+ goto mdev_id_err ;
581+ }
582+
583+ vp_vdpa_mgtdev -> mdev = mdev ;
584+ mdev -> pci_dev = pdev ;
585+
586+ err = pcim_enable_device (pdev );
587+ if (err ) {
588+ goto probe_err ;
589+ }
590+
591+ err = vp_modern_probe (mdev );
592+ if (err ) {
593+ dev_err (& pdev -> dev , "Failed to probe modern PCI device\n" );
594+ goto probe_err ;
595+ }
596+
597+ mdev_id -> device = mdev -> id .device ;
598+ mdev_id -> vendor = mdev -> id .vendor ;
599+ mgtdev -> id_table = mdev_id ;
600+ mgtdev -> max_supported_vqs = vp_modern_get_num_queues (mdev );
601+ mgtdev -> supported_features = vp_modern_get_features (mdev );
602+ pci_set_master (pdev );
603+ pci_set_drvdata (pdev , vp_vdpa_mgtdev );
604+
605+ err = vdpa_mgmtdev_register (mgtdev );
606+ if (err ) {
607+ dev_err (& pdev -> dev , "Failed to register vdpa mgmtdev device\n" );
608+ goto register_err ;
609+ }
610+
611+ return 0 ;
612+
613+ register_err :
614+ vp_modern_remove (vp_vdpa_mgtdev -> mdev );
615+ probe_err :
616+ kfree (mdev_id );
617+ mdev_id_err :
618+ kfree (mdev );
619+ mdev_err :
620+ kfree (vp_vdpa_mgtdev );
621+ return err ;
622+ }
623+
532624static void vp_vdpa_remove (struct pci_dev * pdev )
533625{
534- struct vp_vdpa * vp_vdpa = pci_get_drvdata (pdev );
626+ struct vp_vdpa_mgmtdev * vp_vdpa_mgtdev = pci_get_drvdata (pdev );
627+ struct virtio_pci_modern_device * mdev = NULL ;
535628
536- vp_modern_remove (& vp_vdpa -> mdev );
537- vdpa_unregister_device (& vp_vdpa -> vdpa );
629+ mdev = vp_vdpa_mgtdev -> mdev ;
630+ vp_modern_remove (mdev );
631+ vdpa_mgmtdev_unregister (& vp_vdpa_mgtdev -> mgtdev );
632+ kfree (& vp_vdpa_mgtdev -> mgtdev .id_table );
633+ kfree (mdev );
634+ kfree (vp_vdpa_mgtdev );
538635}
539636
540637static struct pci_driver vp_vdpa_driver = {
0 commit comments