summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2018-06-15 12:25:01 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-07-02 13:19:19 -0400
commit6ea52c59b0262556edb01835eaf91b3bfcdcdd71 (patch)
tree15fcd2bf17b28cea51384a7f8b0b2044f449ecae /drivers/gpu/nvgpu/common/mm/nvgpu_mem.c
parentcf2ac655fdaeba5779ce9d73cbe567218a7c5a58 (diff)
gpu: nvgpu: Implement common nvgpu_mem_rd* functions
nvgpu_mem_rd*() functions were implemented per OS. They also used nvgpu_pramin_access_batched() and implemented a big portion of logic for using PRAMIN in OS specific code. Make the implementation for the functions generic. Move all PRAMIN logic to PRAMIN and simplify the interface provided by PRAMIN. Change-Id: I1acb9e8d7d424325dc73314d5738cb2c9ebf7692 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1753708 Reviewed-by: Konsta Holtta <kholtta@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/common/mm/nvgpu_mem.c')
-rw-r--r--drivers/gpu/nvgpu/common/mm/nvgpu_mem.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c b/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c
index 855d455d..9f3b6cfa 100644
--- a/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c
+++ b/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c
@@ -177,3 +177,112 @@ u64 nvgpu_sgt_alignment(struct gk20a *g, struct nvgpu_sgt *sgt)
177 177
178 return align; 178 return align;
179} 179}
180
181u32 nvgpu_mem_rd32(struct gk20a *g, struct nvgpu_mem *mem, u32 w)
182{
183 u32 data = 0;
184
185 if (mem->aperture == APERTURE_SYSMEM) {
186 u32 *ptr = mem->cpu_va;
187
188 WARN_ON(!ptr);
189 data = ptr[w];
190 } else if (mem->aperture == APERTURE_VIDMEM) {
191 nvgpu_pramin_rd_n(g, mem, w * sizeof(u32), sizeof(u32), &data);
192 } else {
193 WARN_ON("Accessing unallocated nvgpu_mem");
194 }
195
196 return data;
197}
198
199u32 nvgpu_mem_rd(struct gk20a *g, struct nvgpu_mem *mem, u32 offset)
200{
201 WARN_ON(offset & 3);
202 return nvgpu_mem_rd32(g, mem, offset / sizeof(u32));
203}
204
205void nvgpu_mem_rd_n(struct gk20a *g, struct nvgpu_mem *mem,
206 u32 offset, void *dest, u32 size)
207{
208 WARN_ON(offset & 3);
209 WARN_ON(size & 3);
210
211 if (mem->aperture == APERTURE_SYSMEM) {
212 u8 *src = (u8 *)mem->cpu_va + offset;
213
214 WARN_ON(!mem->cpu_va);
215 memcpy(dest, src, size);
216 } else if (mem->aperture == APERTURE_VIDMEM) {
217 nvgpu_pramin_rd_n(g, mem, offset, size, dest);
218 } else {
219 WARN_ON("Accessing unallocated nvgpu_mem");
220 }
221}
222
223void nvgpu_mem_wr32(struct gk20a *g, struct nvgpu_mem *mem, u32 w, u32 data)
224{
225 if (mem->aperture == APERTURE_SYSMEM) {
226 u32 *ptr = mem->cpu_va;
227
228 WARN_ON(!ptr);
229 ptr[w] = data;
230 } else if (mem->aperture == APERTURE_VIDMEM) {
231 nvgpu_pramin_wr_n(g, mem, w * sizeof(u32), sizeof(u32), &data);
232 if (!mem->skip_wmb)
233 nvgpu_wmb();
234 } else {
235 WARN_ON("Accessing unallocated nvgpu_mem");
236 }
237}
238
239void nvgpu_mem_wr(struct gk20a *g, struct nvgpu_mem *mem, u32 offset, u32 data)
240{
241 WARN_ON(offset & 3);
242 nvgpu_mem_wr32(g, mem, offset / sizeof(u32), data);
243}
244
245void nvgpu_mem_wr_n(struct gk20a *g, struct nvgpu_mem *mem, u32 offset,
246 void *src, u32 size)
247{
248 WARN_ON(offset & 3);
249 WARN_ON(size & 3);
250
251 if (mem->aperture == APERTURE_SYSMEM) {
252 u8 *dest = (u8 *)mem->cpu_va + offset;
253
254 WARN_ON(!mem->cpu_va);
255 memcpy(dest, src, size);
256 } else if (mem->aperture == APERTURE_VIDMEM) {
257 nvgpu_pramin_wr_n(g, mem, offset, size, src);
258 if (!mem->skip_wmb)
259 nvgpu_wmb();
260 } else {
261 WARN_ON("Accessing unallocated nvgpu_mem");
262 }
263}
264
265void nvgpu_memset(struct gk20a *g, struct nvgpu_mem *mem, u32 offset,
266 u32 c, u32 size)
267{
268 WARN_ON(offset & 3);
269 WARN_ON(size & 3);
270 WARN_ON(c & ~0xff);
271
272 c &= 0xff;
273
274 if (mem->aperture == APERTURE_SYSMEM) {
275 u8 *dest = (u8 *)mem->cpu_va + offset;
276
277 WARN_ON(!mem->cpu_va);
278 memset(dest, c, size);
279 } else if (mem->aperture == APERTURE_VIDMEM) {
280 u32 repeat_value = c | (c << 8) | (c << 16) | (c << 24);
281
282 nvgpu_pramin_memset(g, mem, offset, size, repeat_value);
283 if (!mem->skip_wmb)
284 nvgpu_wmb();
285 } else {
286 WARN_ON("Accessing unallocated nvgpu_mem");
287 }
288}