@@ -70,50 +70,29 @@ r535_chan_ramfc_clear(struct nvkm_chan *chan)
7070#define CHID_PER_USERD 8
7171
7272static int
73- r535_chan_ramfc_write (struct nvkm_chan * chan , u64 offset , u64 length , u32 devm , bool priv )
73+ r535_chan_alloc (struct nvkm_gsp_device * device , u32 handle , u32 nv2080_engine_type , u8 runq ,
74+ bool priv , int chid , u64 inst_addr , u64 userd_addr , u64 mthdbuf_addr ,
75+ struct nvkm_vmm * vmm , u64 gpfifo_offset , u32 gpfifo_length ,
76+ struct nvkm_gsp_object * chan )
7477{
75- struct nvkm_fifo * fifo = chan -> cgrp -> runl -> fifo ;
76- struct nvkm_engn * engn ;
77- struct nvkm_device * device = fifo -> engine .subdev .device ;
78+ struct nvkm_gsp * gsp = device -> object .client -> gsp ;
79+ struct nvkm_fifo * fifo = gsp -> subdev .device -> fifo ;
80+ const int userd_p = chid / CHID_PER_USERD ;
81+ const int userd_i = chid % CHID_PER_USERD ;
7882 NV_CHANNELGPFIFO_ALLOCATION_PARAMETERS * args ;
79- const int userd_p = chan -> id / CHID_PER_USERD ;
80- const int userd_i = chan -> id % CHID_PER_USERD ;
81- u32 eT = ~0 ;
82- int ret ;
8383
84- if (unlikely (device -> gr && !device -> gr -> engine .subdev .oneinit )) {
85- ret = nvkm_subdev_oneinit (& device -> gr -> engine .subdev );
86- if (ret )
87- return ret ;
88- }
89-
90- nvkm_runl_foreach_engn (engn , chan -> cgrp -> runl ) {
91- eT = engn -> id ;
92- break ;
93- }
94-
95- if (WARN_ON (eT == ~0 ))
96- return - EINVAL ;
97-
98- chan -> rm .mthdbuf .ptr = dma_alloc_coherent (fifo -> engine .subdev .device -> dev ,
99- fifo -> rm .mthdbuf_size ,
100- & chan -> rm .mthdbuf .addr , GFP_KERNEL );
101- if (!chan -> rm .mthdbuf .ptr )
102- return - ENOMEM ;
103-
104- args = nvkm_gsp_rm_alloc_get (& chan -> vmm -> rm .device .object , NVKM_RM_CHAN (chan -> id ),
105- fifo -> func -> chan .user .oclass , sizeof (* args ),
106- & chan -> rm .object );
84+ args = nvkm_gsp_rm_alloc_get (& device -> object , handle ,
85+ fifo -> func -> chan .user .oclass , sizeof (* args ), chan );
10786 if (WARN_ON (IS_ERR (args )))
10887 return PTR_ERR (args );
10988
110- args -> gpFifoOffset = offset ;
111- args -> gpFifoEntries = length / 8 ;
89+ args -> gpFifoOffset = gpfifo_offset ;
90+ args -> gpFifoEntries = gpfifo_length / 8 ;
11291
11392 args -> flags = NVDEF (NVOS04 , FLAGS , CHANNEL_TYPE , PHYSICAL );
11493 args -> flags |= NVDEF (NVOS04 , FLAGS , VPR , FALSE);
11594 args -> flags |= NVDEF (NVOS04 , FLAGS , CHANNEL_SKIP_MAP_REFCOUNTING , FALSE);
116- args -> flags |= NVVAL (NVOS04 , FLAGS , GROUP_CHANNEL_RUNQUEUE , chan -> runq );
95+ args -> flags |= NVVAL (NVOS04 , FLAGS , GROUP_CHANNEL_RUNQUEUE , runq );
11796 if (!priv )
11897 args -> flags |= NVDEF (NVOS04 , FLAGS , PRIVILEGED_CHANNEL , FALSE);
11998 else
@@ -136,25 +115,25 @@ r535_chan_ramfc_write(struct nvkm_chan *chan, u64 offset, u64 length, u32 devm,
136115 args -> flags |= NVDEF (NVOS04 , FLAGS , MAP_CHANNEL , FALSE);
137116 args -> flags |= NVDEF (NVOS04 , FLAGS , SKIP_CTXBUFFER_ALLOC , FALSE);
138117
139- args -> hVASpace = chan -> vmm -> rm .object .handle ;
140- args -> engineType = eT ;
118+ args -> hVASpace = vmm -> rm .object .handle ;
119+ args -> engineType = nv2080_engine_type ;
141120
142- args -> instanceMem .base = chan -> inst -> addr ;
143- args -> instanceMem .size = chan -> inst -> size ;
121+ args -> instanceMem .base = inst_addr ;
122+ args -> instanceMem .size = fifo -> func -> chan . func -> inst -> size ;
144123 args -> instanceMem .addressSpace = 2 ;
145124 args -> instanceMem .cacheAttrib = 1 ;
146125
147- args -> userdMem .base = nvkm_memory_addr ( chan -> userd . mem ) + chan -> userd . base ;
126+ args -> userdMem .base = userd_addr ;
148127 args -> userdMem .size = fifo -> func -> chan .func -> userd -> size ;
149128 args -> userdMem .addressSpace = 2 ;
150129 args -> userdMem .cacheAttrib = 1 ;
151130
152- args -> ramfcMem .base = chan -> inst -> addr + 0 ;
131+ args -> ramfcMem .base = inst_addr ;
153132 args -> ramfcMem .size = 0x200 ;
154133 args -> ramfcMem .addressSpace = 2 ;
155134 args -> ramfcMem .cacheAttrib = 1 ;
156135
157- args -> mthdbufMem .base = chan -> rm . mthdbuf . addr ;
136+ args -> mthdbufMem .base = mthdbuf_addr ;
158137 args -> mthdbufMem .size = fifo -> rm .mthdbuf_size ;
159138 args -> mthdbufMem .addressSpace = 1 ;
160139 args -> mthdbufMem .cacheAttrib = 0 ;
@@ -166,7 +145,44 @@ r535_chan_ramfc_write(struct nvkm_chan *chan, u64 offset, u64 length, u32 devm,
166145 args -> internalFlags |= NVDEF (NV_KERNELCHANNEL , ALLOC_INTERNALFLAGS , ERROR_NOTIFIER_TYPE , NONE );
167146 args -> internalFlags |= NVDEF (NV_KERNELCHANNEL , ALLOC_INTERNALFLAGS , ECC_ERROR_NOTIFIER_TYPE , NONE );
168147
169- ret = nvkm_gsp_rm_alloc_wr (& chan -> rm .object , args );
148+ return nvkm_gsp_rm_alloc_wr (chan , args );
149+ }
150+
151+ static int
152+ r535_chan_ramfc_write (struct nvkm_chan * chan , u64 offset , u64 length , u32 devm , bool priv )
153+ {
154+ struct nvkm_fifo * fifo = chan -> cgrp -> runl -> fifo ;
155+ struct nvkm_engn * engn ;
156+ struct nvkm_device * device = fifo -> engine .subdev .device ;
157+ const struct nvkm_rm_api * rmapi = device -> gsp -> rm -> api ;
158+ u32 eT = ~0 ;
159+ int ret ;
160+
161+ if (unlikely (device -> gr && !device -> gr -> engine .subdev .oneinit )) {
162+ ret = nvkm_subdev_oneinit (& device -> gr -> engine .subdev );
163+ if (ret )
164+ return ret ;
165+ }
166+
167+ nvkm_runl_foreach_engn (engn , chan -> cgrp -> runl ) {
168+ eT = engn -> id ;
169+ break ;
170+ }
171+
172+ if (WARN_ON (eT == ~0 ))
173+ return - EINVAL ;
174+
175+ chan -> rm .mthdbuf .ptr = dma_alloc_coherent (fifo -> engine .subdev .device -> dev ,
176+ fifo -> rm .mthdbuf_size ,
177+ & chan -> rm .mthdbuf .addr , GFP_KERNEL );
178+ if (!chan -> rm .mthdbuf .ptr )
179+ return - ENOMEM ;
180+
181+ ret = rmapi -> fifo -> chan .alloc (& chan -> vmm -> rm .device , NVKM_RM_CHAN (chan -> id ),
182+ eT , chan -> runq , priv , chan -> id , chan -> inst -> addr ,
183+ nvkm_memory_addr (chan -> userd .mem ) + chan -> userd .base ,
184+ chan -> rm .mthdbuf .addr , chan -> vmm , offset , length ,
185+ & chan -> rm .object );
170186 if (ret )
171187 return ret ;
172188
@@ -541,4 +557,7 @@ const struct nvkm_rm_api_fifo
541557r535_fifo = {
542558 .xlat_rm_engine_type = r535_fifo_xlat_rm_engine_type ,
543559 .ectx_size = r535_fifo_ectx_size ,
560+ .chan = {
561+ .alloc = r535_chan_alloc ,
562+ },
544563};
0 commit comments