1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. 4 */ 5 6 #ifndef MSM_DISP_SNAPSHOT_H_ 7 #define MSM_DISP_SNAPSHOT_H_ 8 9 #include <drm/drm_atomic_helper.h> 10 #include <drm/drm_device.h> 11 #include "../../../drm_crtc_internal.h" 12 #include <drm/drm_print.h> 13 #include <drm/drm_atomic.h> 14 #include <linux/debugfs.h> 15 #include <linux/list.h> 16 #include <linux/delay.h> 17 #include <linux/spinlock.h> 18 #include <linux/ktime.h> 19 #include <linux/debugfs.h> 20 #include <linux/uaccess.h> 21 #include <linux/dma-buf.h> 22 #include <linux/slab.h> 23 #include <linux/list_sort.h> 24 #include <linux/pm.h> 25 #include <linux/pm_runtime.h> 26 #include <linux/kthread.h> 27 #include <linux/devcoredump.h> 28 #include <stdarg.h> 29 #include "msm_kms.h" 30 31 #define MSM_DISP_SNAPSHOT_MAX_BLKS 10 32 33 /* debug option to print the registers in logs */ 34 #define MSM_DISP_SNAPSHOT_DUMP_IN_CONSOLE 0 35 36 /* print debug ranges in groups of 4 u32s */ 37 #define REG_DUMP_ALIGN 16 38 39 /** 40 * struct msm_disp_state - structure to store current dpu state 41 * @dev: device pointer 42 * @drm_dev: drm device pointer 43 * @atomic_state: atomic state duplicated at the time of the error 44 * @timestamp: timestamp at which the coredump was captured 45 */ 46 struct msm_disp_state { 47 struct device *dev; 48 struct drm_device *drm_dev; 49 50 struct list_head blocks; 51 52 struct drm_atomic_state *atomic_state; 53 54 ktime_t timestamp; 55 }; 56 57 /** 58 * struct msm_disp_state_block - structure to store each hardware block state 59 * @name: name of the block 60 * @drm_dev: handle to the linked list head 61 * @size: size of the register space of this hardware block 62 * @state: array holding the register dump of this hardware block 63 * @base_addr: starting address of this hardware block's register space 64 */ 65 struct msm_disp_state_block { 66 char name[SZ_128]; 67 struct list_head node; 68 unsigned int size; 69 u32 *state; 70 void __iomem *base_addr; 71 }; 72 73 /** 74 * msm_disp_snapshot_init - initialize display snapshot 75 * @drm_dev: drm device handle 76 * 77 * Returns: 0 or -ERROR 78 */ 79 int msm_disp_snapshot_init(struct drm_device *drm_dev); 80 81 /** 82 * msm_disp_snapshot_destroy - destroy the display snapshot 83 * @drm_dev: drm device handle 84 * 85 * Returns: none 86 */ 87 void msm_disp_snapshot_destroy(struct drm_device *drm_dev); 88 89 /** 90 * msm_disp_snapshot_state - trigger to dump the display snapshot 91 * @drm_dev: handle to drm device 92 93 * Returns: none 94 */ 95 void msm_disp_snapshot_state(struct drm_device *drm_dev); 96 97 /** 98 * msm_disp_state_print - print out the current dpu state 99 * @disp_state: handle to drm device 100 * @p: handle to drm printer 101 * 102 * Returns: none 103 */ 104 void msm_disp_state_print(struct msm_disp_state *disp_state, struct drm_printer *p); 105 106 /** 107 * msm_disp_snapshot_capture_state - utility to capture atomic state and hw registers 108 * @disp_state: handle to msm_disp_state struct 109 110 * Returns: none 111 */ 112 void msm_disp_snapshot_capture_state(struct msm_disp_state *disp_state); 113 114 /** 115 * msm_disp_state_free - free the memory after the coredump has been read 116 * @data: handle to struct msm_disp_state 117 118 * Returns: none 119 */ 120 void msm_disp_state_free(void *data); 121 122 /** 123 * msm_disp_snapshot_add_block - add a hardware block with its register dump 124 * @disp_state: handle to struct msm_disp_state 125 * @name: name of the hardware block 126 * @len: size of the register space of the hardware block 127 * @base_addr: starting address of the register space of the hardware block 128 * @fmt: format in which the block names need to be printed 129 * 130 * Returns: none 131 */ 132 __printf(4, 5) 133 void msm_disp_snapshot_add_block(struct msm_disp_state *disp_state, u32 len, 134 void __iomem *base_addr, const char *fmt, ...); 135 136 #endif /* MSM_DISP_SNAPSHOT_H_ */ 137