@@ -89,6 +89,34 @@ nv50_instobj_slow = {
8989 .wr32 = nv50_instobj_wr32_slow ,
9090};
9191
92+ static void
93+ nv50_instobj_kmap (struct nv50_instobj * iobj , struct nvkm_vmm * vmm )
94+ {
95+ struct nvkm_memory * memory = & iobj -> memory ;
96+ struct nvkm_subdev * subdev = & iobj -> imem -> base .subdev ;
97+ struct nvkm_device * device = subdev -> device ;
98+ u64 size = nvkm_memory_size (memory );
99+ void __iomem * map ;
100+ int ret ;
101+
102+ iobj -> map = ERR_PTR (- ENOMEM );
103+
104+ ret = nvkm_vm_get (vmm , size , 12 , NV_MEM_ACCESS_RW , & iobj -> bar );
105+ if (ret == 0 ) {
106+ map = ioremap (device -> func -> resource_addr (device , 3 ) +
107+ (u32 )iobj -> bar .offset , size );
108+ if (map ) {
109+ nvkm_memory_map (memory , & iobj -> bar , 0 );
110+ iobj -> map = map ;
111+ } else {
112+ nvkm_warn (subdev , "PRAMIN ioremap failed\n" );
113+ nvkm_vm_put (& iobj -> bar );
114+ }
115+ } else {
116+ nvkm_warn (subdev , "PRAMIN exhausted\n" );
117+ }
118+ }
119+
92120static void
93121nv50_instobj_map (struct nvkm_memory * memory , struct nvkm_vma * vma , u64 offset )
94122{
@@ -112,7 +140,7 @@ nv50_instobj_acquire(struct nvkm_memory *memory)
112140 unsigned long flags ;
113141
114142 if (!iobj -> map && (vm = nvkm_bar_bar2_vmm (imem -> base .subdev .device )))
115- nvkm_memory_boot ( memory , vm );
143+ nv50_instobj_kmap ( iobj , vm );
116144 if (!IS_ERR_OR_NULL (iobj -> map ))
117145 return iobj -> map ;
118146
@@ -122,31 +150,10 @@ nv50_instobj_acquire(struct nvkm_memory *memory)
122150}
123151
124152static void
125- nv50_instobj_boot (struct nvkm_memory * memory , struct nvkm_vm * vm )
153+ nv50_instobj_boot (struct nvkm_memory * memory , struct nvkm_vmm * vmm )
126154{
127155 struct nv50_instobj * iobj = nv50_instobj (memory );
128- struct nvkm_subdev * subdev = & iobj -> imem -> base .subdev ;
129- struct nvkm_device * device = subdev -> device ;
130- u64 size = nvkm_memory_size (memory );
131- void __iomem * map ;
132- int ret ;
133-
134- iobj -> map = ERR_PTR (- ENOMEM );
135-
136- ret = nvkm_vm_get (vm , size , 12 , NV_MEM_ACCESS_RW , & iobj -> bar );
137- if (ret == 0 ) {
138- map = ioremap (device -> func -> resource_addr (device , 3 ) +
139- (u32 )iobj -> bar .offset , size );
140- if (map ) {
141- nvkm_memory_map (memory , & iobj -> bar , 0 );
142- iobj -> map = map ;
143- } else {
144- nvkm_warn (subdev , "PRAMIN ioremap failed\n" );
145- nvkm_vm_put (& iobj -> bar );
146- }
147- } else {
148- nvkm_warn (subdev , "PRAMIN exhausted\n" );
149- }
156+ nv50_instobj_kmap (iobj , vmm );
150157}
151158
152159static u64
@@ -173,8 +180,8 @@ nv50_instobj_dtor(struct nvkm_memory *memory)
173180 struct nv50_instobj * iobj = nv50_instobj (memory );
174181 struct nvkm_ram * ram = iobj -> imem -> base .subdev .device -> fb -> ram ;
175182 if (!IS_ERR_OR_NULL (iobj -> map )) {
176- nvkm_vm_put (& iobj -> bar );
177183 iounmap (iobj -> map );
184+ nvkm_vm_put (& iobj -> bar );
178185 }
179186 ram -> func -> put (ram , & iobj -> mem );
180187 return iobj ;
0 commit comments