diff options
Diffstat (limited to 'drivers/gpu/nvgpu/common/falcon')
-rw-r--r-- | drivers/gpu/nvgpu/common/falcon/falcon.c | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/common/falcon/falcon.c b/drivers/gpu/nvgpu/common/falcon/falcon.c index c9ab69fe..116cb78c 100644 --- a/drivers/gpu/nvgpu/common/falcon/falcon.c +++ b/drivers/gpu/nvgpu/common/falcon/falcon.c | |||
@@ -180,6 +180,21 @@ int nvgpu_flcn_copy_to_dmem(struct nvgpu_falcon *flcn, | |||
180 | return flcn_ops->copy_to_dmem(flcn, dst, src, size, port); | 180 | return flcn_ops->copy_to_dmem(flcn, dst, src, size, port); |
181 | } | 181 | } |
182 | 182 | ||
183 | int nvgpu_flcn_copy_from_imem(struct nvgpu_falcon *flcn, | ||
184 | u32 src, u8 *dst, u32 size, u8 port) | ||
185 | { | ||
186 | struct nvgpu_falcon_ops *flcn_ops = &flcn->flcn_ops; | ||
187 | int status = -EINVAL; | ||
188 | |||
189 | if (flcn_ops->copy_from_imem) | ||
190 | status = flcn_ops->copy_from_imem(flcn, src, dst, size, port); | ||
191 | else | ||
192 | nvgpu_warn(flcn->g, "Invalid op on falcon 0x%x ", | ||
193 | flcn->flcn_id); | ||
194 | |||
195 | return status; | ||
196 | } | ||
197 | |||
183 | int nvgpu_flcn_copy_to_imem(struct nvgpu_falcon *flcn, | 198 | int nvgpu_flcn_copy_to_imem(struct nvgpu_falcon *flcn, |
184 | u32 dst, u8 *src, u32 size, u8 port, bool sec, u32 tag) | 199 | u32 dst, u8 *src, u32 size, u8 port, bool sec, u32 tag) |
185 | { | 200 | { |
@@ -196,6 +211,58 @@ int nvgpu_flcn_copy_to_imem(struct nvgpu_falcon *flcn, | |||
196 | return status; | 211 | return status; |
197 | } | 212 | } |
198 | 213 | ||
214 | static void nvgpu_flcn_print_mem(struct nvgpu_falcon *flcn, u32 src, | ||
215 | u32 size, u32 mem_type) | ||
216 | { | ||
217 | u32 buff[64] = {0}; | ||
218 | u32 total_block_read = 0; | ||
219 | u32 byte_read_count = 0; | ||
220 | u32 i = 0; | ||
221 | u32 status = 0; | ||
222 | |||
223 | nvgpu_info(flcn->g, " offset 0x%x size %d bytes", src, size); | ||
224 | |||
225 | total_block_read = size >> 8; | ||
226 | do { | ||
227 | byte_read_count = total_block_read ? sizeof(buff) : size; | ||
228 | |||
229 | if (!byte_read_count) | ||
230 | break; | ||
231 | |||
232 | if (mem_type == MEM_DMEM) | ||
233 | status = nvgpu_flcn_copy_from_dmem(flcn, src, | ||
234 | (u8 *)buff, byte_read_count, 0); | ||
235 | else | ||
236 | status = nvgpu_flcn_copy_from_imem(flcn, src, | ||
237 | (u8 *)buff, byte_read_count, 0); | ||
238 | |||
239 | if (status) { | ||
240 | nvgpu_err(flcn->g, "MEM print failed"); | ||
241 | break; | ||
242 | } | ||
243 | |||
244 | for (i = 0; i < (byte_read_count >> 2); i += 4) | ||
245 | nvgpu_info(flcn->g, "%#06x: %#010x %#010x %#010x %#010x", | ||
246 | src + (i << 2), buff[i], buff[i+1], | ||
247 | buff[i+2], buff[i+3]); | ||
248 | |||
249 | src += byte_read_count; | ||
250 | size -= byte_read_count; | ||
251 | } while (total_block_read--); | ||
252 | } | ||
253 | |||
254 | void nvgpu_flcn_print_dmem(struct nvgpu_falcon *flcn, u32 src, u32 size) | ||
255 | { | ||
256 | nvgpu_info(flcn->g, " PRINT DMEM "); | ||
257 | nvgpu_flcn_print_mem(flcn, src, size, MEM_DMEM); | ||
258 | } | ||
259 | |||
260 | void nvgpu_flcn_print_imem(struct nvgpu_falcon *flcn, u32 src, u32 size) | ||
261 | { | ||
262 | nvgpu_info(flcn->g, " PRINT IMEM "); | ||
263 | nvgpu_flcn_print_mem(flcn, src, size, MEM_IMEM); | ||
264 | } | ||
265 | |||
199 | int nvgpu_flcn_bootstrap(struct nvgpu_falcon *flcn, u32 boot_vector) | 266 | int nvgpu_flcn_bootstrap(struct nvgpu_falcon *flcn, u32 boot_vector) |
200 | { | 267 | { |
201 | struct nvgpu_falcon_ops *flcn_ops = &flcn->flcn_ops; | 268 | struct nvgpu_falcon_ops *flcn_ops = &flcn->flcn_ops; |