hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/video/rockchip/mpp/mpp_common.h
....@@ -22,8 +22,10 @@
2222 #include <linux/reset.h>
2323 #include <linux/irqreturn.h>
2424 #include <linux/poll.h>
25
+#include <soc/rockchip/pm_domains.h>
2526
26
-#define MHZ (1000 * 1000)
27
+#define MHZ (1000 * 1000)
28
+#define MPP_WORK_TIMEOUT_DELAY (500)
2729
2830 #define MPP_MAX_MSG_NUM (16)
2931 #define MPP_MAX_REG_TRANS_NUM (60)
....@@ -116,6 +118,7 @@
116118 MPP_CMD_TRANS_FD_TO_IOVA = MPP_CMD_CONTROL_BASE + 1,
117119 MPP_CMD_RELEASE_FD = MPP_CMD_CONTROL_BASE + 2,
118120 MPP_CMD_SEND_CODEC_INFO = MPP_CMD_CONTROL_BASE + 3,
121
+ MPP_CMD_SET_ERR_REF_HACK = MPP_CMD_CONTROL_BASE + 4,
119122 MPP_CMD_CONTROL_BUTT,
120123
121124 MPP_CMD_BUTT,
....@@ -199,6 +202,12 @@
199202 struct mpp_grf_info {
200203 u32 offset;
201204 u32 val;
205
+
206
+ /* close mem when module is not working*/
207
+ u32 mem_offset;
208
+ u32 val_mem_on;
209
+ u32 val_mem_off;
210
+
202211 struct regmap *grf;
203212 };
204213
....@@ -255,6 +264,7 @@
255264 u32 reduce_rate_hz;
256265 /* record last used rate */
257266 u32 used_rate_hz;
267
+ u32 real_rate_hz;
258268 };
259269
260270 struct mpp_dev_var {
....@@ -293,6 +303,8 @@
293303 struct kthread_work work;
294304 /* the flag for get/get/reduce freq */
295305 bool auto_freq_en;
306
+ /* the flag for pmu idle request before device reset */
307
+ bool skip_idle;
296308
297309 /*
298310 * The task capacity is the task queue length that hardware can accept.
....@@ -322,6 +334,9 @@
322334 struct mpp_service *srv;
323335
324336 struct list_head queue_link;
337
+
338
+ /* common per-device procfs */
339
+ u32 timing_check;
325340 };
326341
327342 struct mpp_task;
....@@ -338,13 +353,7 @@
338353 struct mutex pending_lock;
339354 /* task pending list in session */
340355 struct list_head pending_list;
341
- /* lock for session task done list */
342
- struct mutex done_lock;
343
- /* task done list in session */
344
- struct list_head done_list;
345356
346
- /* event for session wait thread */
347
- wait_queue_head_t wait;
348357 pid_t pid;
349358 atomic_t task_count;
350359 atomic_t release_request;
....@@ -387,6 +396,18 @@
387396 TASK_STATE_ABORT = 9,
388397 TASK_STATE_ABORT_READY = 10,
389398 TASK_STATE_PROC_DONE = 11,
399
+
400
+ /* timing debug state */
401
+ TASK_TIMING_CREATE = 16,
402
+ TASK_TIMING_CREATE_END = 17,
403
+ TASK_TIMING_PENDING = 18,
404
+ TASK_TIMING_RUN = 19,
405
+ TASK_TIMING_TO_SCHED = 20,
406
+ TASK_TIMING_RUN_END = 21,
407
+ TASK_TIMING_IRQ = 22,
408
+ TASK_TIMING_TO_CANCEL = 23,
409
+ TASK_TIMING_ISR = 24,
410
+ TASK_TIMING_FINISH = 25,
390411 };
391412
392413 /* The context for the a task */
....@@ -413,11 +434,29 @@
413434 struct kref ref;
414435
415436 /* record context running start time */
416
- struct timeval start;
437
+ ktime_t start;
438
+ ktime_t part;
439
+
440
+ /* debug timing */
441
+ ktime_t on_create;
442
+ ktime_t on_create_end;
443
+ ktime_t on_pending;
444
+ ktime_t on_run;
445
+ ktime_t on_sched_timeout;
446
+ ktime_t on_run_end;
447
+ ktime_t on_irq;
448
+ ktime_t on_cancel_timeout;
449
+ ktime_t on_isr;
450
+ ktime_t on_finish;
451
+
417452 /* hardware info for current task */
418453 struct mpp_hw_info *hw_info;
419454 u32 task_index;
420455 u32 *reg;
456
+ /* hw cycles */
457
+ u32 hw_cycles;
458
+ /* event for session wait thread */
459
+ wait_queue_head_t wait;
421460 };
422461
423462 struct mpp_taskqueue {
....@@ -432,7 +471,7 @@
432471 struct list_head session_attach;
433472 /* link to session session_link for detached sessions */
434473 struct list_head session_detach;
435
- u32 detach_count;
474
+ atomic_t detach_count;
436475
437476 /* lock for pending list */
438477 struct mutex pending_lock;
....@@ -454,6 +493,15 @@
454493 * device task capacity which is attached to the taskqueue
455494 */
456495 u32 task_capacity;
496
+
497
+ /*
498
+ * when we need to set grf_mem config to close mem shared by combo modules,
499
+ * use runtime_cnt to make sure every combo module are not working
500
+ */
501
+ /* lock for runtime counting */
502
+ struct mutex ref_lock;
503
+ atomic_t runtime_cnt;
504
+
457505 };
458506
459507 struct mpp_reset_group {
....@@ -490,6 +538,9 @@
490538 struct mutex session_lock;
491539 struct list_head session_list;
492540 u32 session_count;
541
+
542
+ /* global timing record flag */
543
+ u32 timing_en;
493544 };
494545
495546 /*
....@@ -580,6 +631,8 @@
580631 struct mpp_task *task);
581632 int mpp_task_finish(struct mpp_session *session,
582633 struct mpp_task *task);
634
+void mpp_task_run_begin(struct mpp_task *task, u32 timing_en, u32 timeout);
635
+void mpp_task_run_end(struct mpp_task *task, u32 timing_en);
583636 int mpp_task_finalize(struct mpp_session *session,
584637 struct mpp_task *task);
585638 int mpp_task_dump_mem_region(struct mpp_dev *mpp,
....@@ -588,8 +641,12 @@
588641 struct mpp_task *task);
589642 int mpp_task_dump_hw_reg(struct mpp_dev *mpp,
590643 struct mpp_task *task);
644
+void mpp_task_dump_timing(struct mpp_task *task, s64 time_diff);
645
+void mpp_reg_show(struct mpp_dev *mpp, u32 offset);
591646
592
-int mpp_session_deinit(struct mpp_session *session);
647
+void mpp_session_deinit(struct mpp_session *session);
648
+void mpp_session_cleanup_detach(struct mpp_taskqueue *queue,
649
+ struct kthread_work *work);
593650
594651 int mpp_dev_probe(struct mpp_dev *mpp,
595652 struct platform_device *pdev);
....@@ -613,6 +670,8 @@
613670
614671 int mpp_time_record(struct mpp_task *task);
615672 int mpp_time_diff(struct mpp_task *task);
673
+int mpp_time_diff_with_hw_time(struct mpp_task *task, u32 clk_hz);
674
+int mpp_time_part_diff(struct mpp_task *task);
616675
617676 int mpp_write_req(struct mpp_dev *mpp, u32 *regs,
618677 u32 start_idx, u32 end_idx, u32 en_idx);
....@@ -740,10 +799,19 @@
740799 return 0;
741800 }
742801
802
+static inline int mpp_pmu_idle_request(struct mpp_dev *mpp, bool idle)
803
+{
804
+ if (mpp->skip_idle)
805
+ return 0;
806
+
807
+ return rockchip_pmu_idle_request(mpp->dev, idle);
808
+}
809
+
743810 #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
744811 struct proc_dir_entry *
745812 mpp_procfs_create_u32(const char *name, umode_t mode,
746813 struct proc_dir_entry *parent, void *data);
814
+void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp);
747815 #else
748816 static inline struct proc_dir_entry *
749817 mpp_procfs_create_u32(const char *name, umode_t mode,
....@@ -751,6 +819,9 @@
751819 {
752820 return 0;
753821 }
822
+void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp)
823
+{
824
+}
754825 #endif
755826
756827 #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS