summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/common/mm/nvgpu_mem.c
diff options
context:
space:
mode:
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}