summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/msm/disp/msm_disp_snapshot.h
blob: b5f452bd7ada5c2fde55a4e4455cfbb35e31de2a (plain)
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_ */