@@ -40,6 +40,7 @@ static int mana_ib_gd_create_mr(struct mana_ib_dev *dev, struct mana_ib_mr *mr,
4040
4141 mana_gd_init_req_hdr (& req .hdr , GDMA_CREATE_MR , sizeof (req ),
4242 sizeof (resp ));
43+ req .hdr .req .msg_version = GDMA_MESSAGE_V2 ;
4344 req .pd_handle = mr_params -> pd_handle ;
4445 req .mr_type = mr_params -> mr_type ;
4546
@@ -55,6 +56,12 @@ static int mana_ib_gd_create_mr(struct mana_ib_dev *dev, struct mana_ib_mr *mr,
5556 req .zbva .dma_region_handle = mr_params -> zbva .dma_region_handle ;
5657 req .zbva .access_flags = mr_params -> zbva .access_flags ;
5758 break ;
59+ case GDMA_MR_TYPE_DM :
60+ req .da_ext .length = mr_params -> da .length ;
61+ req .da .dm_handle = mr_params -> da .dm_handle ;
62+ req .da .offset = mr_params -> da .offset ;
63+ req .da .access_flags = mr_params -> da .access_flags ;
64+ break ;
5865 default :
5966 ibdev_dbg (& dev -> ib_dev ,
6067 "invalid param (GDMA_MR_TYPE) passed, type %d\n" ,
@@ -317,3 +324,126 @@ int mana_ib_dereg_mr(struct ib_mr *ibmr, struct ib_udata *udata)
317324
318325 return 0 ;
319326}
327+
328+ static int mana_ib_gd_alloc_dm (struct mana_ib_dev * mdev , struct mana_ib_dm * dm ,
329+ struct ib_dm_alloc_attr * attr )
330+ {
331+ struct gdma_context * gc = mdev_to_gc (mdev );
332+ struct gdma_alloc_dm_resp resp = {};
333+ struct gdma_alloc_dm_req req = {};
334+ int err ;
335+
336+ mana_gd_init_req_hdr (& req .hdr , GDMA_ALLOC_DM , sizeof (req ), sizeof (resp ));
337+ req .length = attr -> length ;
338+ req .alignment = attr -> alignment ;
339+ req .flags = attr -> flags ;
340+
341+ err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
342+ if (err || resp .hdr .status ) {
343+ if (!err )
344+ err = - EPROTO ;
345+
346+ return err ;
347+ }
348+
349+ dm -> dm_handle = resp .dm_handle ;
350+
351+ return 0 ;
352+ }
353+
354+ struct ib_dm * mana_ib_alloc_dm (struct ib_device * ibdev ,
355+ struct ib_ucontext * context ,
356+ struct ib_dm_alloc_attr * attr ,
357+ struct uverbs_attr_bundle * attrs )
358+ {
359+ struct mana_ib_dev * dev = container_of (ibdev , struct mana_ib_dev , ib_dev );
360+ struct mana_ib_dm * dm ;
361+ int err ;
362+
363+ dm = kzalloc (sizeof (* dm ), GFP_KERNEL );
364+ if (!dm )
365+ return ERR_PTR (- ENOMEM );
366+
367+ err = mana_ib_gd_alloc_dm (dev , dm , attr );
368+ if (err )
369+ goto err_free ;
370+
371+ return & dm -> ibdm ;
372+
373+ err_free :
374+ kfree (dm );
375+ return ERR_PTR (err );
376+ }
377+
378+ static int mana_ib_gd_destroy_dm (struct mana_ib_dev * mdev , struct mana_ib_dm * dm )
379+ {
380+ struct gdma_context * gc = mdev_to_gc (mdev );
381+ struct gdma_destroy_dm_resp resp = {};
382+ struct gdma_destroy_dm_req req = {};
383+ int err ;
384+
385+ mana_gd_init_req_hdr (& req .hdr , GDMA_DESTROY_DM , sizeof (req ), sizeof (resp ));
386+ req .dm_handle = dm -> dm_handle ;
387+
388+ err = mana_gd_send_request (gc , sizeof (req ), & req , sizeof (resp ), & resp );
389+ if (err || resp .hdr .status ) {
390+ if (!err )
391+ err = - EPROTO ;
392+
393+ return err ;
394+ }
395+
396+ return 0 ;
397+ }
398+
399+ int mana_ib_dealloc_dm (struct ib_dm * ibdm , struct uverbs_attr_bundle * attrs )
400+ {
401+ struct mana_ib_dev * dev = container_of (ibdm -> device , struct mana_ib_dev , ib_dev );
402+ struct mana_ib_dm * dm = container_of (ibdm , struct mana_ib_dm , ibdm );
403+ int err ;
404+
405+ err = mana_ib_gd_destroy_dm (dev , dm );
406+ if (err )
407+ return err ;
408+
409+ kfree (dm );
410+ return 0 ;
411+ }
412+
413+ struct ib_mr * mana_ib_reg_dm_mr (struct ib_pd * ibpd , struct ib_dm * ibdm ,
414+ struct ib_dm_mr_attr * attr ,
415+ struct uverbs_attr_bundle * attrs )
416+ {
417+ struct mana_ib_dev * dev = container_of (ibpd -> device , struct mana_ib_dev , ib_dev );
418+ struct mana_ib_dm * mana_dm = container_of (ibdm , struct mana_ib_dm , ibdm );
419+ struct mana_ib_pd * pd = container_of (ibpd , struct mana_ib_pd , ibpd );
420+ struct gdma_create_mr_params mr_params = {};
421+ struct mana_ib_mr * mr ;
422+ int err ;
423+
424+ attr -> access_flags &= ~IB_ACCESS_OPTIONAL ;
425+ if (attr -> access_flags & ~VALID_MR_FLAGS )
426+ return ERR_PTR (- EOPNOTSUPP );
427+
428+ mr = kzalloc (sizeof (* mr ), GFP_KERNEL );
429+ if (!mr )
430+ return ERR_PTR (- ENOMEM );
431+
432+ mr_params .pd_handle = pd -> pd_handle ;
433+ mr_params .mr_type = GDMA_MR_TYPE_DM ;
434+ mr_params .da .dm_handle = mana_dm -> dm_handle ;
435+ mr_params .da .offset = attr -> offset ;
436+ mr_params .da .length = attr -> length ;
437+ mr_params .da .access_flags =
438+ mana_ib_verbs_to_gdma_access_flags (attr -> access_flags );
439+
440+ err = mana_ib_gd_create_mr (dev , mr , & mr_params );
441+ if (err )
442+ goto err_free ;
443+
444+ return & mr -> ibmr ;
445+
446+ err_free :
447+ kfree (mr );
448+ return ERR_PTR (err );
449+ }
0 commit comments