xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/rga3/rga_debugger.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) Rockchip Electronics Co., Ltd.
4  *
5  * Author:
6  *	Cerf Yu <cerf.yu@rock-chips.com>
7  *	Huang Lee <Putin.li@rock-chips.com>
8  */
9 
10 #define pr_fmt(fmt) "rga_debugger: " fmt
11 
12 #include <linux/slab.h>
13 #include <linux/delay.h>
14 #include <linux/syscalls.h>
15 #include <linux/debugfs.h>
16 #include <linux/proc_fs.h>
17 #include <linux/seq_file.h>
18 
19 #include "rga.h"
20 #include "rga_debugger.h"
21 #include "rga_drv.h"
22 #include "rga_mm.h"
23 #include "rga_common.h"
24 
25 #define RGA_DEBUGGER_ROOT_NAME "rkrga"
26 
27 #define STR_ENABLE(en) (en ? "EN" : "DIS")
28 
29 int RGA_DEBUG_REG;
30 int RGA_DEBUG_MSG;
31 int RGA_DEBUG_TIME;
32 int RGA_DEBUG_INT_FLAG;
33 int RGA_DEBUG_MM;
34 int RGA_DEBUG_CHECK_MODE;
35 int RGA_DEBUG_NONUSE;
36 int RGA_DEBUG_DEBUG_MODE;
37 int RGA_DEBUG_DUMP_IMAGE;
38 
39 #ifdef CONFIG_NO_GKI
40 static char g_dump_path[100] = "/data";
41 #endif
42 
rga_debug_show(struct seq_file * m,void * data)43 static int rga_debug_show(struct seq_file *m, void *data)
44 {
45 	seq_printf(m, "REG [%s]\n"
46 		 "MSG [%s]\n"
47 		 "TIME [%s]\n"
48 		 "INT [%s]\n"
49 		 "MM [%s]\n"
50 		 "CHECK [%s]\n"
51 		 "STOP [%s]\n",
52 		 STR_ENABLE(RGA_DEBUG_REG),
53 		 STR_ENABLE(RGA_DEBUG_MSG),
54 		 STR_ENABLE(RGA_DEBUG_TIME),
55 		 STR_ENABLE(RGA_DEBUG_INT_FLAG),
56 		 STR_ENABLE(RGA_DEBUG_MM),
57 		 STR_ENABLE(RGA_DEBUG_CHECK_MODE),
58 		 STR_ENABLE(RGA_DEBUG_NONUSE));
59 
60 	seq_puts(m, "\nhelp:\n");
61 	seq_puts(m, " 'echo reg > debug' to enable/disable register log printing.\n");
62 	seq_puts(m, " 'echo msg > debug' to enable/disable message log printing.\n");
63 	seq_puts(m, " 'echo time > debug' to enable/disable time log printing.\n");
64 	seq_puts(m, " 'echo int > debug' to enable/disable interruppt log printing.\n");
65 	seq_puts(m, " 'echo mm > debug' to enable/disable memory manager log printing.\n");
66 	seq_puts(m, " 'echo check > debug' to enable/disable check mode.\n");
67 	seq_puts(m, " 'echo stop > debug' to enable/disable stop using hardware\n");
68 
69 	return 0;
70 }
71 
rga_debug_write(struct file * file,const char __user * ubuf,size_t len,loff_t * offp)72 static ssize_t rga_debug_write(struct file *file, const char __user *ubuf,
73 				 size_t len, loff_t *offp)
74 {
75 	char buf[14];
76 
77 	if (len > sizeof(buf) - 1)
78 		return -EINVAL;
79 	if (copy_from_user(buf, ubuf, len))
80 		return -EFAULT;
81 	buf[len - 1] = '\0';
82 
83 	if (strncmp(buf, "reg", 4) == 0) {
84 		if (RGA_DEBUG_REG) {
85 			RGA_DEBUG_REG = 0;
86 			pr_info("close rga reg!\n");
87 		} else {
88 			RGA_DEBUG_REG = 1;
89 			pr_info("open rga reg!\n");
90 		}
91 	} else if (strncmp(buf, "msg", 3) == 0) {
92 		if (RGA_DEBUG_MSG) {
93 			RGA_DEBUG_MSG = 0;
94 			pr_info("close rga test MSG!\n");
95 		} else {
96 			RGA_DEBUG_MSG = 1;
97 			pr_info("open rga test MSG!\n");
98 		}
99 	} else if (strncmp(buf, "time", 4) == 0) {
100 		if (RGA_DEBUG_TIME) {
101 			RGA_DEBUG_TIME = 0;
102 			pr_info("close rga test time!\n");
103 		} else {
104 			RGA_DEBUG_TIME = 1;
105 			pr_info("open rga test time!\n");
106 		}
107 	} else if (strncmp(buf, "int", 3) == 0) {
108 		if (RGA_DEBUG_INT_FLAG) {
109 			RGA_DEBUG_INT_FLAG = 0;
110 			pr_info("close inturrupt MSG!\n");
111 		} else {
112 			RGA_DEBUG_INT_FLAG = 1;
113 			pr_info("open inturrupt MSG!\n");
114 		}
115 	} else if (strncmp(buf, "mm", 2) == 0) {
116 		if (RGA_DEBUG_MM) {
117 			RGA_DEBUG_MM = 0;
118 			pr_info("close rga mm log!\n");
119 		} else {
120 			RGA_DEBUG_MM = 1;
121 			pr_info("open rga mm log!\n");
122 		}
123 	} else if (strncmp(buf, "check", 5) == 0) {
124 		if (RGA_DEBUG_CHECK_MODE) {
125 			RGA_DEBUG_CHECK_MODE = 0;
126 			pr_info("close rga check flag!\n");
127 		} else {
128 			RGA_DEBUG_CHECK_MODE = 1;
129 			pr_info("open rga check flag!\n");
130 		}
131 	} else if (strncmp(buf, "stop", 4) == 0) {
132 		if (RGA_DEBUG_NONUSE) {
133 			RGA_DEBUG_NONUSE = 0;
134 			pr_info("using rga hardware!\n");
135 		} else {
136 			RGA_DEBUG_NONUSE = 1;
137 			pr_info("stop using rga hardware!\n");
138 		}
139 	} else if (strncmp(buf, "debug", 3) == 0) {
140 		if (RGA_DEBUG_DEBUG_MODE) {
141 			RGA_DEBUG_REG = 0;
142 			RGA_DEBUG_MSG = 0;
143 			RGA_DEBUG_TIME = 0;
144 			RGA_DEBUG_INT_FLAG = 0;
145 
146 			RGA_DEBUG_DEBUG_MODE = 0;
147 			pr_info("close debug mode!\n");
148 		} else {
149 			RGA_DEBUG_REG = 1;
150 			RGA_DEBUG_MSG = 1;
151 			RGA_DEBUG_TIME = 1;
152 			RGA_DEBUG_INT_FLAG = 1;
153 
154 			RGA_DEBUG_DEBUG_MODE = 1;
155 			pr_info("open debug mode!\n");
156 		}
157 	} else if (strncmp(buf, "slt", 3) == 0) {
158 		pr_err("Null");
159 	}
160 
161 	return len;
162 }
163 
rga_version_show(struct seq_file * m,void * data)164 static int rga_version_show(struct seq_file *m, void *data)
165 {
166 	seq_printf(m, "%s: v%s\n", DRIVER_DESC, DRIVER_VERSION);
167 
168 	return 0;
169 }
170 
rga_load_show(struct seq_file * m,void * data)171 static int rga_load_show(struct seq_file *m, void *data)
172 {
173 	struct rga_scheduler_t *scheduler = NULL;
174 	struct rga_session_manager *session_manager = NULL;
175 	struct rga_session *session = NULL;
176 	unsigned long flags;
177 	int id = 0;
178 	int i;
179 	int load;
180 	u32 busy_time_total;
181 
182 	session_manager = rga_drvdata->session_manager;
183 
184 	seq_printf(m, "num of scheduler = %d\n", rga_drvdata->num_of_scheduler);
185 	seq_printf(m, "================= load ==================\n");
186 
187 	for (i = 0; i < rga_drvdata->num_of_scheduler; i++) {
188 		scheduler = rga_drvdata->scheduler[i];
189 
190 		seq_printf(m, "scheduler[%d]: %s\n",
191 			i, dev_driver_string(scheduler->dev));
192 
193 		spin_lock_irqsave(&scheduler->irq_lock, flags);
194 
195 		busy_time_total = scheduler->timer.busy_time_record;
196 
197 		spin_unlock_irqrestore(&scheduler->irq_lock, flags);
198 
199 		load = (busy_time_total * 100 / RGA_LOAD_INTERVAL_US);
200 		if (load > 100)
201 			load = 100;
202 
203 		seq_printf(m, "\t load = %d%%\n", load);
204 		seq_printf(m, "-----------------------------------\n");
205 	}
206 
207 	mutex_lock(&session_manager->lock);
208 
209 	idr_for_each_entry(&session_manager->ctx_id_idr, session, id)
210 		seq_printf(m, "\t process %d: pid = %d, name: %s\n", id,
211 			session->tgid, session->pname);
212 
213 	mutex_unlock(&session_manager->lock);
214 
215 	return 0;
216 }
217 
rga_scheduler_show(struct seq_file * m,void * data)218 static int rga_scheduler_show(struct seq_file *m, void *data)
219 {
220 	struct rga_scheduler_t *scheduler = NULL;
221 	int i;
222 
223 	seq_printf(m, "num of scheduler = %d\n", rga_drvdata->num_of_scheduler);
224 	seq_printf(m, "===================================\n");
225 
226 	for (i = 0; i < rga_drvdata->num_of_scheduler; i++) {
227 		scheduler = rga_drvdata->scheduler[i];
228 
229 		seq_printf(m, "scheduler[%d]: %s\n",
230 			i, dev_driver_string(scheduler->dev));
231 		seq_printf(m, "-----------------------------------\n");
232 		seq_printf(m, "pd_ref = %d\n", scheduler->pd_refcount);
233 	}
234 
235 	return 0;
236 }
237 
rga_mm_session_show(struct seq_file * m,void * data)238 static int rga_mm_session_show(struct seq_file *m, void *data)
239 {
240 	int id;
241 	struct rga_mm *mm_session = NULL;
242 	struct rga_internal_buffer *dump_buffer;
243 
244 	mm_session = rga_drvdata->mm;
245 
246 	mutex_lock(&mm_session->lock);
247 
248 	seq_puts(m, "rga_mm dump:\n");
249 	seq_printf(m, "buffer count = %d\n", mm_session->buffer_count);
250 	seq_puts(m, "===============================================================\n");
251 
252 	idr_for_each_entry(&mm_session->memory_idr, dump_buffer, id) {
253 		seq_printf(m, "handle = %d refcount = %d mm_flag = 0x%x	tgid = %d\n",
254 			   dump_buffer->handle, kref_read(&dump_buffer->refcount),
255 			   dump_buffer->mm_flag, dump_buffer->session->tgid);
256 
257 		switch (dump_buffer->type) {
258 		case RGA_DMA_BUFFER:
259 		case RGA_DMA_BUFFER_PTR:
260 			if (rga_mm_is_invalid_dma_buffer(dump_buffer->dma_buffer))
261 				break;
262 
263 			seq_puts(m, "dma_buffer:\n");
264 			seq_printf(m, "\t dma_buf = %p, iova = 0x%lxsgt = 0x%p, size = %ld, map_core = 0x%x\n",
265 				   dump_buffer->dma_buffer->dma_buf,
266 				   (unsigned long)dump_buffer->dma_buffer->iova,
267 				   dump_buffer->dma_buffer->sgt,
268 				   dump_buffer->dma_buffer->size,
269 				   dump_buffer->dma_buffer->scheduler->core);
270 
271 			if (dump_buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS)
272 				seq_printf(m, "\t is contiguous, pa = 0x%lx\n",
273 					   (unsigned long)dump_buffer->phys_addr);
274 
275 			break;
276 		case RGA_VIRTUAL_ADDRESS:
277 			if (dump_buffer->virt_addr == NULL)
278 				break;
279 			seq_puts(m, "virtual address:\n");
280 			seq_printf(m, "\t va = 0x%lx, pages = 0x%p, size = %ld\n",
281 				   (unsigned long)dump_buffer->virt_addr->addr,
282 				   dump_buffer->virt_addr->pages,
283 				   dump_buffer->virt_addr->size);
284 
285 			if (rga_mm_is_invalid_dma_buffer(dump_buffer->dma_buffer))
286 				break;
287 
288 			seq_printf(m, "\t iova = 0x%lx, offset = 0x%lx, sgt = 0x%p, size = %ld, map_core = 0x%x\n",
289 				   (unsigned long)dump_buffer->dma_buffer->iova,
290 				   (unsigned long)dump_buffer->dma_buffer->offset,
291 				   dump_buffer->dma_buffer->sgt,
292 				   dump_buffer->dma_buffer->size,
293 				   dump_buffer->dma_buffer->scheduler->core);
294 
295 			if (dump_buffer->mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS)
296 				seq_printf(m, "\t is contiguous, pa = 0x%lx\n",
297 					   (unsigned long)dump_buffer->phys_addr);
298 
299 			break;
300 		case RGA_PHYSICAL_ADDRESS:
301 			seq_puts(m, "physical address:\n");
302 			seq_printf(m, "\t pa = 0x%lx\n", (unsigned long)dump_buffer->phys_addr);
303 			break;
304 		default:
305 			seq_puts(m, "Illegal external buffer!\n");
306 			break;
307 		}
308 
309 		seq_puts(m, "---------------------------------------------------------------\n");
310 	}
311 	mutex_unlock(&mm_session->lock);
312 
313 	return 0;
314 }
315 
rga_request_manager_show(struct seq_file * m,void * data)316 static int rga_request_manager_show(struct seq_file *m, void *data)
317 {
318 	int id, i;
319 	struct rga_pending_request_manager *request_manager;
320 	struct rga_request *request;
321 	struct rga_req *task_list;
322 	unsigned long flags;
323 	int task_count = 0;
324 	int finished_task_count = 0, failed_task_count = 0;
325 
326 	request_manager = rga_drvdata->pend_request_manager;
327 
328 	seq_puts(m, "rga internal request dump:\n");
329 	seq_printf(m, "request count = %d\n", request_manager->request_count);
330 	seq_puts(m, "===============================================================\n");
331 
332 	mutex_lock(&request_manager->lock);
333 
334 	idr_for_each_entry(&request_manager->request_idr, request, id) {
335 		seq_printf(m, "------------------ request: %d ------------------\n", request->id);
336 
337 		spin_lock_irqsave(&request->lock, flags);
338 
339 		task_count = request->task_count;
340 		finished_task_count = request->finished_task_count;
341 		failed_task_count = request->failed_task_count;
342 		task_list = request->task_list;
343 
344 		spin_unlock_irqrestore(&request->lock, flags);
345 
346 		if (task_list == NULL) {
347 			seq_puts(m, "\t can not find task list from id\n");
348 			continue;
349 		}
350 
351 		seq_printf(m, "\t set cmd num: %d, finish job: %d, failed job: %d, flags = 0x%x, ref = %d\n",
352 			   task_count, finished_task_count, failed_task_count,
353 			   request->flags, kref_read(&request->refcount));
354 
355 		seq_puts(m, "\t cmd dump:\n\n");
356 
357 		for (i = 0; i < request->task_count; i++)
358 			rga_request_task_debug_info(m, &(task_list[i]));
359 	}
360 
361 	mutex_unlock(&request_manager->lock);
362 
363 	return 0;
364 }
365 
366 #ifdef CONFIG_NO_GKI
rga_dump_path_show(struct seq_file * m,void * data)367 static int rga_dump_path_show(struct seq_file *m, void *data)
368 {
369 	seq_printf(m, "dump path: %s\n", g_dump_path);
370 
371 	return 0;
372 }
373 
rga_dump_path_write(struct file * file,const char __user * ubuf,size_t len,loff_t * offp)374 static ssize_t rga_dump_path_write(struct file *file, const char __user *ubuf,
375 				    size_t len, loff_t *offp)
376 {
377 	char buf[100];
378 
379 	if (len > sizeof(buf) - 1)
380 		return -EINVAL;
381 	if (copy_from_user(buf, ubuf, len))
382 		return -EFAULT;
383 	buf[len - 1] = '\0';
384 
385 	snprintf(g_dump_path, sizeof(buf), "%s", buf);
386 	pr_info("dump path change to: %s\n", g_dump_path);
387 
388 	return len;
389 }
390 
rga_dump_image_show(struct seq_file * m,void * data)391 static int rga_dump_image_show(struct seq_file *m, void *data)
392 {
393 	seq_printf(m, "dump image count: %d\n", RGA_DEBUG_DUMP_IMAGE);
394 
395 	return 0;
396 }
397 
rga_dump_image_write(struct file * file,const char __user * ubuf,size_t len,loff_t * offp)398 static ssize_t rga_dump_image_write(struct file *file, const char __user *ubuf,
399 				    size_t len, loff_t *offp)
400 {
401 	int ret;
402 	int dump_count = 0;
403 	char buf[14];
404 
405 	if (len > sizeof(buf) - 1)
406 		return -EINVAL;
407 	if (copy_from_user(buf, ubuf, len))
408 		return -EFAULT;
409 	buf[len - 1] = '\0';
410 
411 	ret = kstrtoint(buf, 10, &dump_count);
412 	if (ret) {
413 		pr_err("Failed to parse str[%s]\n", buf);
414 		return -EFAULT;
415 	}
416 
417 	if (dump_count <= 0) {
418 		pr_err("dump_image count is invalid [%d]!\n", dump_count);
419 		return -EINVAL;
420 	}
421 
422 	RGA_DEBUG_DUMP_IMAGE = dump_count;
423 	pr_info("dump image %d\n", RGA_DEBUG_DUMP_IMAGE);
424 
425 	return len;
426 }
427 #endif /* #ifdef CONFIG_NO_GKI */
428 
rga_hardware_show(struct seq_file * m,void * data)429 static int rga_hardware_show(struct seq_file *m, void *data)
430 {
431 	struct rga_scheduler_t *scheduler = NULL;
432 	const struct rga_hw_data *hw_data = NULL;
433 	int i;
434 
435 	seq_puts(m, "===================================\n");
436 
437 	for (i = 0; i < rga_drvdata->num_of_scheduler; i++) {
438 		scheduler = rga_drvdata->scheduler[i];
439 		hw_data = scheduler->data;
440 
441 		seq_printf(m, "%s, core %d: version: %s\n",
442 			   dev_driver_string(scheduler->dev),
443 			   scheduler->core, scheduler->version.str);
444 		seq_printf(m, "input range: %dx%d ~ %dx%d\n",
445 			   hw_data->input_range.min.width, hw_data->input_range.min.height,
446 			   hw_data->input_range.max.width, hw_data->input_range.max.height);
447 		seq_printf(m, "output range: %dx%d ~ %dx%d\n",
448 			   hw_data->output_range.min.width, hw_data->output_range.min.height,
449 			   hw_data->output_range.max.width, hw_data->output_range.max.height);
450 		seq_printf(m, "scale limit: 1/%d ~ %d\n",
451 			   (1 << hw_data->max_downscale_factor),
452 			   (1 << hw_data->max_upscale_factor));
453 		seq_printf(m, "byte_stride_align: %d\n", hw_data->byte_stride_align);
454 		seq_printf(m, "max_byte_stride: %d\n", hw_data->max_byte_stride);
455 		seq_printf(m, "csc: RGB2YUV 0x%x YUV2RGB 0x%x\n",
456 			   hw_data->csc_r2y_mode, hw_data->csc_y2r_mode);
457 		seq_printf(m, "feature: 0x%x\n", hw_data->feature);
458 		seq_printf(m, "mmu: %s\n", rga_get_mmu_type_str(hw_data->mmu));
459 		seq_puts(m, "-----------------------------------\n");
460 	}
461 
462 	return 0;
463 }
464 
465 static struct rga_debugger_list rga_debugger_root_list[] = {
466 	{"debug", rga_debug_show, rga_debug_write, NULL},
467 	{"driver_version", rga_version_show, NULL, NULL},
468 	{"load", rga_load_show, NULL, NULL},
469 	{"scheduler_status", rga_scheduler_show, NULL, NULL},
470 	{"mm_session", rga_mm_session_show, NULL, NULL},
471 	{"request_manager", rga_request_manager_show, NULL, NULL},
472 #ifdef CONFIG_NO_GKI
473 	{"dump_path", rga_dump_path_show, rga_dump_path_write, NULL},
474 	{"dump_image", rga_dump_image_show, rga_dump_image_write, NULL},
475 #endif
476 	{"hardware", rga_hardware_show, NULL, NULL},
477 };
478 
rga_debugger_write(struct file * file,const char __user * ubuf,size_t len,loff_t * offp)479 static ssize_t rga_debugger_write(struct file *file, const char __user *ubuf,
480 				 size_t len, loff_t *offp)
481 {
482 	struct seq_file *priv = file->private_data;
483 	struct rga_debugger_node *node = priv->private;
484 
485 	if (node->info_ent->write)
486 		return node->info_ent->write(file, ubuf, len, offp);
487 	else
488 		return len;
489 }
490 
491 #ifdef CONFIG_ROCKCHIP_RGA_DEBUG_FS
rga_debugfs_open(struct inode * inode,struct file * file)492 static int rga_debugfs_open(struct inode *inode, struct file *file)
493 {
494 	struct rga_debugger_node *node = inode->i_private;
495 
496 	return single_open(file, node->info_ent->show, node);
497 }
498 
499 static const struct file_operations rga_debugfs_fops = {
500 	.owner = THIS_MODULE,
501 	.open = rga_debugfs_open,
502 	.read = seq_read,
503 	.llseek = seq_lseek,
504 	.release = single_release,
505 	.write = rga_debugger_write,
506 };
507 
rga_debugfs_remove_files(struct rga_debugger * debugger)508 static int rga_debugfs_remove_files(struct rga_debugger *debugger)
509 {
510 	struct rga_debugger_node *pos, *q;
511 	struct list_head *entry_list;
512 
513 	mutex_lock(&debugger->debugfs_lock);
514 
515 	/* Delete debugfs entry list */
516 	entry_list = &debugger->debugfs_entry_list;
517 	list_for_each_entry_safe(pos, q, entry_list, list) {
518 		if (pos->dent == NULL)
519 			continue;
520 		list_del(&pos->list);
521 		kfree(pos);
522 		pos = NULL;
523 	}
524 
525 	/* Delete all debugfs node in this directory */
526 	debugfs_remove_recursive(debugger->debugfs_dir);
527 	debugger->debugfs_dir = NULL;
528 
529 	mutex_unlock(&debugger->debugfs_lock);
530 
531 	return 0;
532 }
533 
rga_debugfs_create_files(const struct rga_debugger_list * files,int count,struct dentry * root,struct rga_debugger * debugger)534 static int rga_debugfs_create_files(const struct rga_debugger_list *files,
535 					int count, struct dentry *root,
536 					struct rga_debugger *debugger)
537 {
538 	int i;
539 	struct dentry *ent;
540 	struct rga_debugger_node *tmp;
541 
542 	for (i = 0; i < count; i++) {
543 		tmp = kmalloc(sizeof(struct rga_debugger_node), GFP_KERNEL);
544 		if (tmp == NULL) {
545 			pr_err("Cannot alloc node path /sys/kernel/debug/%pd/%s\n",
546 				 root, files[i].name);
547 			goto MALLOC_FAIL;
548 		}
549 
550 		tmp->info_ent = &files[i];
551 		tmp->debugger = debugger;
552 
553 		ent = debugfs_create_file(files[i].name, S_IFREG | S_IRUGO,
554 					 root, tmp, &rga_debugfs_fops);
555 		if (!ent) {
556 			pr_err("Cannot create /sys/kernel/debug/%pd/%s\n", root,
557 				 files[i].name);
558 			goto CREATE_FAIL;
559 		}
560 
561 		tmp->dent = ent;
562 
563 		mutex_lock(&debugger->debugfs_lock);
564 		list_add_tail(&tmp->list, &debugger->debugfs_entry_list);
565 		mutex_unlock(&debugger->debugfs_lock);
566 	}
567 
568 	return 0;
569 
570 CREATE_FAIL:
571 	kfree(tmp);
572 MALLOC_FAIL:
573 	rga_debugfs_remove_files(debugger);
574 
575 	return -1;
576 }
577 
rga_debugfs_remove(void)578 int rga_debugfs_remove(void)
579 {
580 	struct rga_debugger *debugger;
581 
582 	debugger = rga_drvdata->debugger;
583 
584 	rga_debugfs_remove_files(debugger);
585 
586 	return 0;
587 }
588 
rga_debugfs_init(void)589 int rga_debugfs_init(void)
590 {
591 	int ret;
592 	struct rga_debugger *debugger;
593 
594 	debugger = rga_drvdata->debugger;
595 
596 	debugger->debugfs_dir =
597 		debugfs_create_dir(RGA_DEBUGGER_ROOT_NAME, NULL);
598 	if (IS_ERR_OR_NULL(debugger->debugfs_dir)) {
599 		pr_err("failed on mkdir /sys/kernel/debug/%s\n",
600 			 RGA_DEBUGGER_ROOT_NAME);
601 		debugger->debugfs_dir = NULL;
602 		return -EIO;
603 	}
604 
605 	ret = rga_debugfs_create_files(rga_debugger_root_list, ARRAY_SIZE(rga_debugger_root_list),
606 					 debugger->debugfs_dir, debugger);
607 	if (ret) {
608 		pr_err("Could not install rga_debugger_root_list debugfs\n");
609 		goto CREATE_FAIL;
610 	}
611 
612 	return 0;
613 
614 CREATE_FAIL:
615 	rga_debugfs_remove();
616 
617 	return ret;
618 }
619 #endif /* #ifdef CONFIG_ROCKCHIP_RGA_DEBUG_FS */
620 
621 #ifdef CONFIG_ROCKCHIP_RGA_PROC_FS
rga_procfs_open(struct inode * inode,struct file * file)622 static int rga_procfs_open(struct inode *inode, struct file *file)
623 {
624 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
625 	struct rga_debugger_node *node = pde_data(inode);
626 #else
627 	struct rga_debugger_node *node = PDE_DATA(inode);
628 #endif
629 
630 	return single_open(file, node->info_ent->show, node);
631 }
632 
633 static const struct proc_ops rga_procfs_fops = {
634 	.proc_open = rga_procfs_open,
635 	.proc_read = seq_read,
636 	.proc_lseek = seq_lseek,
637 	.proc_release = single_release,
638 	.proc_write = rga_debugger_write,
639 };
640 
rga_procfs_remove_files(struct rga_debugger * debugger)641 static int rga_procfs_remove_files(struct rga_debugger *debugger)
642 {
643 	struct rga_debugger_node *pos, *q;
644 	struct list_head *entry_list;
645 
646 	mutex_lock(&debugger->procfs_lock);
647 
648 	/* Delete procfs entry list */
649 	entry_list = &debugger->procfs_entry_list;
650 	list_for_each_entry_safe(pos, q, entry_list, list) {
651 		if (pos->pent == NULL)
652 			continue;
653 		list_del(&pos->list);
654 		kfree(pos);
655 		pos = NULL;
656 	}
657 
658 	/* Delete all procfs node in this directory */
659 	proc_remove(debugger->procfs_dir);
660 	debugger->procfs_dir = NULL;
661 
662 	mutex_unlock(&debugger->procfs_lock);
663 
664 	return 0;
665 }
666 
rga_procfs_create_files(const struct rga_debugger_list * files,int count,struct proc_dir_entry * root,struct rga_debugger * debugger)667 static int rga_procfs_create_files(const struct rga_debugger_list *files,
668 				 int count, struct proc_dir_entry *root,
669 				 struct rga_debugger *debugger)
670 {
671 	int i;
672 	struct proc_dir_entry *ent;
673 	struct rga_debugger_node *tmp;
674 
675 	for (i = 0; i < count; i++) {
676 		tmp = kmalloc(sizeof(struct rga_debugger_node), GFP_KERNEL);
677 		if (tmp == NULL) {
678 			pr_err("Cannot alloc node path for /proc/%s/%s\n",
679 				 RGA_DEBUGGER_ROOT_NAME, files[i].name);
680 			goto MALLOC_FAIL;
681 		}
682 
683 		tmp->info_ent = &files[i];
684 		tmp->debugger = debugger;
685 
686 		ent = proc_create_data(files[i].name, S_IFREG | S_IRUGO,
687 					 root, &rga_procfs_fops, tmp);
688 		if (!ent) {
689 			pr_err("Cannot create /proc/%s/%s\n",
690 				 RGA_DEBUGGER_ROOT_NAME, files[i].name);
691 			goto CREATE_FAIL;
692 		}
693 
694 		tmp->pent = ent;
695 
696 		mutex_lock(&debugger->procfs_lock);
697 		list_add_tail(&tmp->list, &debugger->procfs_entry_list);
698 		mutex_unlock(&debugger->procfs_lock);
699 	}
700 
701 	return 0;
702 
703 CREATE_FAIL:
704 	kfree(tmp);
705 MALLOC_FAIL:
706 	rga_procfs_remove_files(debugger);
707 	return -1;
708 }
709 
rga_procfs_remove(void)710 int rga_procfs_remove(void)
711 {
712 	struct rga_debugger *debugger;
713 
714 	debugger = rga_drvdata->debugger;
715 
716 	rga_procfs_remove_files(debugger);
717 
718 	return 0;
719 }
720 
rga_procfs_init(void)721 int rga_procfs_init(void)
722 {
723 	int ret;
724 	struct rga_debugger *debugger;
725 
726 	debugger = rga_drvdata->debugger;
727 
728 	debugger->procfs_dir = proc_mkdir(RGA_DEBUGGER_ROOT_NAME, NULL);
729 	if (IS_ERR_OR_NULL(debugger->procfs_dir)) {
730 		pr_err("failed on mkdir /proc/%s\n", RGA_DEBUGGER_ROOT_NAME);
731 		debugger->procfs_dir = NULL;
732 		return -EIO;
733 	}
734 
735 	ret = rga_procfs_create_files(rga_debugger_root_list, ARRAY_SIZE(rga_debugger_root_list),
736 					 debugger->procfs_dir, debugger);
737 	if (ret) {
738 		pr_err("Could not install rga_debugger_root_list procfs\n");
739 		goto CREATE_FAIL;
740 	}
741 
742 	return 0;
743 
744 CREATE_FAIL:
745 	rga_procfs_remove();
746 
747 	return ret;
748 }
749 #endif /* #ifdef CONFIG_ROCKCHIP_RGA_PROC_FS */
750 
rga_request_task_debug_info(struct seq_file * m,struct rga_req * req)751 void rga_request_task_debug_info(struct seq_file *m, struct rga_req *req)
752 {
753 	seq_printf(m, "\t\t rotate_mode = %d\n", req->rotate_mode);
754 	seq_printf(m, "\t\t src: y = %lx uv = %lx v = %lx aw = %d ah = %d vw = %d vh = %d\n",
755 		 (unsigned long)req->src.yrgb_addr, (unsigned long)req->src.uv_addr,
756 		 (unsigned long)req->src.v_addr, req->src.act_w, req->src.act_h,
757 		 req->src.vir_w, req->src.vir_h);
758 	seq_printf(m, "\t\t src: xoff = %d, yoff = %d, format = 0x%x, rd_mode = %d\n",
759 		req->src.x_offset, req->src.y_offset, req->src.format, req->src.rd_mode);
760 
761 	if (req->pat.yrgb_addr != 0 || req->pat.uv_addr != 0
762 		|| req->pat.v_addr != 0) {
763 		seq_printf(m, "\t\t pat: y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d\n",
764 			 (unsigned long)req->pat.yrgb_addr, (unsigned long)req->pat.uv_addr,
765 			 (unsigned long)req->pat.v_addr, req->pat.act_w, req->pat.act_h,
766 			 req->pat.vir_w, req->pat.vir_h);
767 		seq_printf(m, "\t\t xoff = %d yoff = %d, format = 0x%x, rd_mode = %d\n",
768 			req->pat.x_offset, req->pat.y_offset, req->pat.format, req->pat.rd_mode);
769 	}
770 
771 	seq_printf(m, "\t\t dst: y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d\n",
772 		 (unsigned long)req->dst.yrgb_addr, (unsigned long)req->dst.uv_addr,
773 		 (unsigned long)req->dst.v_addr, req->dst.act_w, req->dst.act_h,
774 		 req->dst.vir_w, req->dst.vir_h);
775 	seq_printf(m, "\t\t dst: xoff = %d, yoff = %d, format = 0x%x, rd_mode = %d\n",
776 		req->dst.x_offset, req->dst.y_offset, req->dst.format, req->dst.rd_mode);
777 
778 	seq_printf(m, "\t\t mmu: mmu_flag=%x en=%x\n",
779 		req->mmu_info.mmu_flag, req->mmu_info.mmu_en);
780 	seq_printf(m, "\t\t alpha: rop_mode = %x\n", req->alpha_rop_mode);
781 	seq_printf(m, "\t\t yuv2rgb mode is %x\n", req->yuv2rgb_mode);
782 	seq_printf(m, "\t\t set core = %d, priority = %d, in_fence_fd = %d\n",
783 		req->core, req->priority, req->in_fence_fd);
784 }
785 
rga_cmd_print_debug_info(struct rga_req * req)786 void rga_cmd_print_debug_info(struct rga_req *req)
787 {
788 	pr_info("render_mode = %d, bitblit_mode=%d, rotate_mode = %d\n",
789 		req->render_mode, req->bsfilter_flag,
790 		req->rotate_mode);
791 
792 	pr_info("src: y = %lx uv = %lx v = %lx aw = %d ah = %d vw = %d vh = %d\n",
793 		 (unsigned long)req->src.yrgb_addr,
794 		 (unsigned long)req->src.uv_addr,
795 		 (unsigned long)req->src.v_addr,
796 		 req->src.act_w, req->src.act_h,
797 		 req->src.vir_w, req->src.vir_h);
798 	pr_info("src: xoff = %d, yoff = %d, format = 0x%x, rd_mode = %d\n",
799 		req->src.x_offset, req->src.y_offset,
800 		 req->src.format, req->src.rd_mode);
801 
802 	if (req->pat.yrgb_addr != 0 || req->pat.uv_addr != 0
803 		|| req->pat.v_addr != 0) {
804 		pr_info("pat: y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d\n",
805 			 (unsigned long)req->pat.yrgb_addr,
806 			 (unsigned long)req->pat.uv_addr,
807 			 (unsigned long)req->pat.v_addr,
808 			 req->pat.act_w, req->pat.act_h,
809 			 req->pat.vir_w, req->pat.vir_h);
810 		pr_info("pat: xoff = %d yoff = %d, format = 0x%x, rd_mode = %d\n",
811 			req->pat.x_offset, req->pat.y_offset,
812 			req->pat.format, req->pat.rd_mode);
813 	}
814 
815 	pr_info("dst: y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d\n",
816 		 (unsigned long)req->dst.yrgb_addr,
817 		 (unsigned long)req->dst.uv_addr,
818 		 (unsigned long)req->dst.v_addr,
819 		 req->dst.act_w, req->dst.act_h,
820 		 req->dst.vir_w, req->dst.vir_h);
821 	pr_info("dst: xoff = %d, yoff = %d, format = 0x%x, rd_mode = %d\n",
822 		req->dst.x_offset, req->dst.y_offset,
823 		req->dst.format, req->dst.rd_mode);
824 
825 	pr_info("mmu: mmu_flag=%x en=%x\n",
826 		req->mmu_info.mmu_flag, req->mmu_info.mmu_en);
827 	pr_info("alpha: rop_mode = %x\n", req->alpha_rop_mode);
828 	pr_info("yuv2rgb mode is %x\n", req->yuv2rgb_mode);
829 	pr_info("set core = %d, priority = %d, in_fence_fd = %d\n",
830 		req->core, req->priority, req->in_fence_fd);
831 }
832 
833 #ifdef CONFIG_NO_GKI
rga_dump_image_to_file(struct rga_internal_buffer * dump_buffer,const char * channel_name,int plane_id,int core)834 static int rga_dump_image_to_file(struct rga_internal_buffer *dump_buffer,
835 				  const char *channel_name,
836 				  int plane_id,
837 				  int core)
838 {
839 	char file_name[100];
840 	struct file *file;
841 	size_t size = 0;
842 	loff_t pos = 0;
843 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
844 	int ret;
845 	struct iosys_map map;
846 #endif
847 	void *kvaddr = NULL;
848 	void *kvaddr_origin = NULL;
849 
850 	switch (dump_buffer->type) {
851 	case RGA_DMA_BUFFER:
852 	case RGA_DMA_BUFFER_PTR:
853 		if (IS_ERR_OR_NULL(dump_buffer->dma_buffer->dma_buf)) {
854 			pr_err("Failed to dump dma_buf 0x%px\n",
855 			       dump_buffer->dma_buffer->dma_buf);
856 			return -EINVAL;
857 		}
858 
859 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
860 		ret = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf, &map);
861 		kvaddr = ret ? NULL : map.vaddr;
862 #else
863 		kvaddr = dma_buf_vmap(dump_buffer->dma_buffer->dma_buf);
864 #endif
865 		if (!kvaddr) {
866 			pr_err("can't vmap the dma buffer!\n");
867 			return -EINVAL;
868 		}
869 
870 		kvaddr_origin = kvaddr;
871 		kvaddr += dump_buffer->dma_buffer->offset;
872 		break;
873 	case RGA_VIRTUAL_ADDRESS:
874 		kvaddr = vmap(dump_buffer->virt_addr->pages, dump_buffer->virt_addr->page_count,
875 			      VM_MAP, pgprot_writecombine(PAGE_KERNEL));
876 		if (!kvaddr) {
877 			pr_err("dump_vaddr vmap error!, 0x%lx\n",
878 			       (unsigned long)dump_buffer->virt_addr->addr);
879 			return -EFAULT;
880 		}
881 
882 		kvaddr_origin = kvaddr;
883 		kvaddr += dump_buffer->virt_addr->offset;
884 		break;
885 	case RGA_PHYSICAL_ADDRESS:
886 		kvaddr = phys_to_virt(dump_buffer->phys_addr);
887 		break;
888 	default:
889 		pr_err("unsupported memory type[%x]\n", dump_buffer->type);
890 		return -EINVAL;
891 	}
892 
893 	size = dump_buffer->size;
894 
895 	if (kvaddr == NULL) {
896 		pr_err("dump addr is NULL!\n");
897 		return -EFAULT;
898 	}
899 
900 	if (size <= 0) {
901 		pr_err("dump buffer size[%lx] is invalid!\n", (unsigned long)size);
902 		return -EFAULT;
903 	}
904 
905 	if (dump_buffer->memory_parm.width == 0 &&
906 	    dump_buffer->memory_parm.height == 0)
907 		snprintf(file_name, 100, "%s/%d_core%d_%s_plane%d_%s_size%zu_%s.bin",
908 			 g_dump_path,
909 			 RGA_DEBUG_DUMP_IMAGE, core, channel_name, plane_id,
910 			 rga_get_memory_type_str(dump_buffer->type),
911 			 size,
912 			 rga_get_format_name(dump_buffer->memory_parm.format));
913 	else
914 		snprintf(file_name, 100, "%s/%d_core%d_%s_plane%d_%s_w%d_h%d_%s.bin",
915 			 g_dump_path,
916 			 RGA_DEBUG_DUMP_IMAGE, core, channel_name, plane_id,
917 			 rga_get_memory_type_str(dump_buffer->type),
918 			 dump_buffer->memory_parm.width,
919 			 dump_buffer->memory_parm.height,
920 			 rga_get_format_name(dump_buffer->memory_parm.format));
921 
922 	file = filp_open(file_name, O_RDWR | O_CREAT | O_TRUNC, 0600);
923 	if (!IS_ERR(file)) {
924 		kernel_write(file, kvaddr, size, &pos);
925 		pr_info("dump image to: %s\n", file_name);
926 		fput(file);
927 	} else {
928 		pr_info("open %s failed\n", file_name);
929 	}
930 
931 	switch (dump_buffer->type) {
932 	case RGA_DMA_BUFFER:
933 	case RGA_DMA_BUFFER_PTR:
934 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0)
935 		dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, &map);
936 #else
937 		dma_buf_vunmap(dump_buffer->dma_buffer->dma_buf, kvaddr_origin);
938 #endif
939 		break;
940 	case RGA_VIRTUAL_ADDRESS:
941 		vunmap(kvaddr_origin);
942 		break;
943 	}
944 
945 	return 0;
946 }
947 
rga_dump_channel_image(struct rga_job_buffer * job_buffer,const char * channel_name,int core)948 static inline void rga_dump_channel_image(struct rga_job_buffer *job_buffer,
949 					  const char *channel_name,
950 					  int core)
951 {
952 	if (job_buffer->y_addr)
953 		rga_dump_image_to_file(job_buffer->y_addr, channel_name, 0, core);
954 	if (job_buffer->uv_addr)
955 		rga_dump_image_to_file(job_buffer->uv_addr, channel_name, 1, core);
956 	if (job_buffer->v_addr)
957 		rga_dump_image_to_file(job_buffer->v_addr, channel_name, 2, core);
958 }
959 
rga_dump_job_image(struct rga_job * dump_job)960 void rga_dump_job_image(struct rga_job *dump_job)
961 {
962 	rga_dump_channel_image(&dump_job->src_buffer, "src", dump_job->core);
963 	rga_dump_channel_image(&dump_job->src1_buffer, "src1", dump_job->core);
964 	rga_dump_channel_image(&dump_job->dst_buffer, "dst", dump_job->core);
965 	rga_dump_channel_image(&dump_job->els_buffer, "els", dump_job->core);
966 
967 	if (RGA_DEBUG_DUMP_IMAGE > 0)
968 		RGA_DEBUG_DUMP_IMAGE--;
969 }
970 #endif /* #ifdef CONFIG_NO_GKI */
971