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