3838#include <nvrm/535.54.03/common/sdk/nvidia/inc/class/cl2080_notification.h>
3939#include <nvrm/535.54.03/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080ce.h>
4040#include <nvrm/535.54.03/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080fifo.h>
41+ #include <nvrm/535.54.03/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080gpu.h>
42+ #include <nvrm/535.54.03/common/sdk/nvidia/inc/ctrl/ctrl2080/ctrl2080internal.h>
4143#include <nvrm/535.54.03/common/sdk/nvidia/inc/ctrl/ctrla06f/ctrla06fgpfifo.h>
4244#include <nvrm/535.54.03/nvidia/generated/g_kernel_channel_nvoc.h>
4345#include <nvrm/535.54.03/nvidia/generated/g_kernel_fifo_nvoc.h>
@@ -378,6 +380,58 @@ r535_gr = {
378380 .ctor2 = r535_gr_ctor ,
379381};
380382
383+ static int
384+ r535_flcn_bind (struct nvkm_engn * engn , struct nvkm_vctx * vctx , struct nvkm_chan * chan )
385+ {
386+ struct nvkm_gsp_client * client = & chan -> vmm -> rm .client ;
387+ NV2080_CTRL_GPU_PROMOTE_CTX_PARAMS * ctrl ;
388+
389+ ctrl = nvkm_gsp_rm_ctrl_get (& chan -> vmm -> rm .device .subdevice ,
390+ NV2080_CTRL_CMD_GPU_PROMOTE_CTX , sizeof (* ctrl ));
391+ if (IS_ERR (ctrl ))
392+ return PTR_ERR (ctrl );
393+
394+ ctrl -> hClient = client -> object .handle ;
395+ ctrl -> hObject = chan -> rm .object .handle ;
396+ ctrl -> hChanClient = client -> object .handle ;
397+ ctrl -> virtAddress = vctx -> vma -> addr ;
398+ ctrl -> size = vctx -> inst -> size ;
399+ ctrl -> engineType = engn -> id ;
400+ ctrl -> ChID = chan -> id ;
401+
402+ return nvkm_gsp_rm_ctrl_wr (& chan -> vmm -> rm .device .subdevice , ctrl );
403+ }
404+
405+ static int
406+ r535_flcn_ctor (struct nvkm_engn * engn , struct nvkm_vctx * vctx , struct nvkm_chan * chan )
407+ {
408+ int ret ;
409+
410+ if (WARN_ON (!engn -> rm .size ))
411+ return - EINVAL ;
412+
413+ ret = nvkm_gpuobj_new (engn -> engine -> subdev .device , engn -> rm .size , 0 , true, NULL ,
414+ & vctx -> inst );
415+ if (ret )
416+ return ret ;
417+
418+ ret = nvkm_vmm_get (vctx -> vmm , 12 , vctx -> inst -> size , & vctx -> vma );
419+ if (ret )
420+ return ret ;
421+
422+ ret = nvkm_memory_map (vctx -> inst , 0 , vctx -> vmm , vctx -> vma , NULL , 0 );
423+ if (ret )
424+ return ret ;
425+
426+ return r535_flcn_bind (engn , vctx , chan );
427+ }
428+
429+ static const struct nvkm_engn_func
430+ r535_flcn = {
431+ .nonstall = r535_engn_nonstall ,
432+ .ctor2 = r535_flcn_ctor ,
433+ };
434+
381435static void
382436r535_runl_allow (struct nvkm_runl * runl , u32 engm )
383437{
@@ -447,6 +501,36 @@ r535_fifo_engn_type(RM_ENGINE_TYPE rm, enum nvkm_subdev_type *ptype)
447501 }
448502}
449503
504+ static int
505+ r535_fifo_ectx_size (struct nvkm_fifo * fifo )
506+ {
507+ NV2080_CTRL_INTERNAL_GET_CONSTRUCTED_FALCON_INFO_PARAMS * ctrl ;
508+ struct nvkm_gsp * gsp = fifo -> engine .subdev .device -> gsp ;
509+ struct nvkm_runl * runl ;
510+ struct nvkm_engn * engn ;
511+
512+ ctrl = nvkm_gsp_rm_ctrl_rd (& gsp -> internal .device .subdevice ,
513+ NV2080_CTRL_CMD_INTERNAL_GET_CONSTRUCTED_FALCON_INFO ,
514+ sizeof (* ctrl ));
515+ if (WARN_ON (IS_ERR (ctrl )))
516+ return PTR_ERR (ctrl );
517+
518+ for (int i = 0 ; i < ctrl -> numConstructedFalcons ; i ++ ) {
519+ nvkm_runl_foreach (runl , fifo ) {
520+ nvkm_runl_foreach_engn (engn , runl ) {
521+ if (engn -> rm .desc == ctrl -> constructedFalconsTable [i ].engDesc ) {
522+ engn -> rm .size =
523+ ctrl -> constructedFalconsTable [i ].ctxBufferSize ;
524+ break ;
525+ }
526+ }
527+ }
528+ }
529+
530+ nvkm_gsp_rm_ctrl_done (& gsp -> internal .device .subdevice , ctrl );
531+ return 0 ;
532+ }
533+
450534static int
451535r535_fifo_runl_ctor (struct nvkm_fifo * fifo )
452536{
@@ -511,6 +595,9 @@ r535_fifo_runl_ctor(struct nvkm_fifo *fifo)
511595 case NVKM_ENGINE_GR :
512596 engn = nvkm_runl_add (runl , nv2080 , & r535_gr , type , inst );
513597 break ;
598+ case NVKM_ENGINE_NVDEC :
599+ engn = nvkm_runl_add (runl , nv2080 , & r535_flcn , type , inst );
600+ break ;
514601 case NVKM_ENGINE_SW :
515602 continue ;
516603 default :
@@ -522,6 +609,8 @@ r535_fifo_runl_ctor(struct nvkm_fifo *fifo)
522609 nvkm_runl_del (runl );
523610 continue ;
524611 }
612+
613+ engn -> rm .desc = ctrl -> entries [i ].engineData [ENGINE_INFO_TYPE_ENG_DESC ];
525614 }
526615
527616 nvkm_gsp_rm_ctrl_done (& gsp -> internal .device .subdevice , ctrl );
@@ -540,7 +629,7 @@ r535_fifo_runl_ctor(struct nvkm_fifo *fifo)
540629 nvkm_gsp_rm_ctrl_done (& gsp -> internal .device .subdevice , ctrl );
541630 }
542631
543- return 0 ;
632+ return r535_fifo_ectx_size ( fifo ) ;
544633}
545634
546635static void
0 commit comments