xref: /linux/drivers/gpu/drm/msm/disp/msm_disp_snapshot.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
198659487SAbhinav Kumar /* SPDX-License-Identifier: GPL-2.0-only */
298659487SAbhinav Kumar /*
398659487SAbhinav Kumar  * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
498659487SAbhinav Kumar  */
598659487SAbhinav Kumar 
698659487SAbhinav Kumar #ifndef MSM_DISP_SNAPSHOT_H_
798659487SAbhinav Kumar #define MSM_DISP_SNAPSHOT_H_
898659487SAbhinav Kumar 
998659487SAbhinav Kumar #include <drm/drm_atomic_helper.h>
1098659487SAbhinav Kumar #include <drm/drm_device.h>
1198659487SAbhinav Kumar #include "../../../drm_crtc_internal.h"
1298659487SAbhinav Kumar #include <drm/drm_print.h>
1398659487SAbhinav Kumar #include <drm/drm_atomic.h>
1498659487SAbhinav Kumar #include <linux/debugfs.h>
1598659487SAbhinav Kumar #include <linux/list.h>
1698659487SAbhinav Kumar #include <linux/delay.h>
1798659487SAbhinav Kumar #include <linux/spinlock.h>
1898659487SAbhinav Kumar #include <linux/ktime.h>
1998659487SAbhinav Kumar #include <linux/uaccess.h>
2098659487SAbhinav Kumar #include <linux/dma-buf.h>
2198659487SAbhinav Kumar #include <linux/slab.h>
2298659487SAbhinav Kumar #include <linux/list_sort.h>
2398659487SAbhinav Kumar #include <linux/pm.h>
2498659487SAbhinav Kumar #include <linux/pm_runtime.h>
2598659487SAbhinav Kumar #include <linux/kthread.h>
2698659487SAbhinav Kumar #include <linux/devcoredump.h>
2798659487SAbhinav Kumar #include "msm_kms.h"
2898659487SAbhinav Kumar 
2998659487SAbhinav Kumar #define MSM_DISP_SNAPSHOT_MAX_BLKS		10
3098659487SAbhinav Kumar 
3198659487SAbhinav Kumar /* debug option to print the registers in logs */
3298659487SAbhinav Kumar #define MSM_DISP_SNAPSHOT_DUMP_IN_CONSOLE 0
3398659487SAbhinav Kumar 
3498659487SAbhinav Kumar /* print debug ranges in groups of 4 u32s */
3598659487SAbhinav Kumar #define REG_DUMP_ALIGN		16
3698659487SAbhinav Kumar 
3798659487SAbhinav Kumar /**
3898659487SAbhinav Kumar  * struct msm_disp_state - structure to store current dpu state
3998659487SAbhinav Kumar  * @dev: device pointer
4098659487SAbhinav Kumar  * @drm_dev: drm device pointer
4198659487SAbhinav Kumar  * @atomic_state: atomic state duplicated at the time of the error
42857548cbSRob Clark  * @time: timestamp at which the coredump was captured
4398659487SAbhinav Kumar  */
4498659487SAbhinav Kumar struct msm_disp_state {
4598659487SAbhinav Kumar 	struct device *dev;
4698659487SAbhinav Kumar 	struct drm_device *drm_dev;
4798659487SAbhinav Kumar 
4898659487SAbhinav Kumar 	struct list_head blocks;
4998659487SAbhinav Kumar 
5098659487SAbhinav Kumar 	struct drm_atomic_state *atomic_state;
5198659487SAbhinav Kumar 
52857548cbSRob Clark 	struct timespec64 time;
5398659487SAbhinav Kumar };
5498659487SAbhinav Kumar 
5598659487SAbhinav Kumar /**
5698659487SAbhinav Kumar  * struct msm_disp_state_block - structure to store each hardware block state
5798659487SAbhinav Kumar  * @name: name of the block
5898659487SAbhinav Kumar  * @drm_dev: handle to the linked list head
5998659487SAbhinav Kumar  * @size: size of the register space of this hardware block
6098659487SAbhinav Kumar  * @state: array holding the register dump of this hardware block
6198659487SAbhinav Kumar  * @base_addr: starting address of this hardware block's register space
6298659487SAbhinav Kumar  */
6398659487SAbhinav Kumar struct msm_disp_state_block {
6498659487SAbhinav Kumar 	char name[SZ_128];
6598659487SAbhinav Kumar 	struct list_head node;
6698659487SAbhinav Kumar 	unsigned int size;
6798659487SAbhinav Kumar 	u32 *state;
6898659487SAbhinav Kumar 	void __iomem *base_addr;
6998659487SAbhinav Kumar };
7098659487SAbhinav Kumar 
7198659487SAbhinav Kumar /**
7298659487SAbhinav Kumar  * msm_disp_snapshot_init - initialize display snapshot
7398659487SAbhinav Kumar  * @drm_dev:	drm device handle
7498659487SAbhinav Kumar  *
7598659487SAbhinav Kumar  * Returns:		0 or -ERROR
7698659487SAbhinav Kumar  */
7798659487SAbhinav Kumar int msm_disp_snapshot_init(struct drm_device *drm_dev);
7898659487SAbhinav Kumar 
7998659487SAbhinav Kumar /**
8098659487SAbhinav Kumar  * msm_disp_snapshot_destroy - destroy the display snapshot
8198659487SAbhinav Kumar  * @drm_dev:    drm device handle
8298659487SAbhinav Kumar  *
8398659487SAbhinav Kumar  * Returns:	none
8498659487SAbhinav Kumar  */
8598659487SAbhinav Kumar void msm_disp_snapshot_destroy(struct drm_device *drm_dev);
8698659487SAbhinav Kumar 
8798659487SAbhinav Kumar /**
88*59871211SRob Clark  * msm_disp_snapshot_state_sync - synchronously snapshot display state
89*59871211SRob Clark  * @kms:  the kms object
90*59871211SRob Clark  *
91*59871211SRob Clark  * Returns state or error
92*59871211SRob Clark  *
93*59871211SRob Clark  * Must be called with &kms->dump_mutex held
94*59871211SRob Clark  */
95*59871211SRob Clark struct msm_disp_state *msm_disp_snapshot_state_sync(struct msm_kms *kms);
96*59871211SRob Clark 
97*59871211SRob Clark /**
9898659487SAbhinav Kumar  * msm_disp_snapshot_state - trigger to dump the display snapshot
9998659487SAbhinav Kumar  * @drm_dev:	handle to drm device
10098659487SAbhinav Kumar 
10198659487SAbhinav Kumar  * Returns:	none
10298659487SAbhinav Kumar  */
10398659487SAbhinav Kumar void msm_disp_snapshot_state(struct drm_device *drm_dev);
10498659487SAbhinav Kumar 
10598659487SAbhinav Kumar /**
10698659487SAbhinav Kumar  * msm_disp_state_print - print out the current dpu state
10798659487SAbhinav Kumar  * @disp_state:	    handle to drm device
10898659487SAbhinav Kumar  * @p:	    handle to drm printer
10998659487SAbhinav Kumar  *
11098659487SAbhinav Kumar  * Returns:	none
11198659487SAbhinav Kumar  */
11298659487SAbhinav Kumar void msm_disp_state_print(struct msm_disp_state *disp_state, struct drm_printer *p);
11398659487SAbhinav Kumar 
11498659487SAbhinav Kumar /**
11598659487SAbhinav Kumar  * msm_disp_snapshot_capture_state - utility to capture atomic state and hw registers
11698659487SAbhinav Kumar  * @disp_state:	    handle to msm_disp_state struct
11798659487SAbhinav Kumar 
11898659487SAbhinav Kumar  * Returns:	none
11998659487SAbhinav Kumar  */
12098659487SAbhinav Kumar void msm_disp_snapshot_capture_state(struct msm_disp_state *disp_state);
12198659487SAbhinav Kumar 
12298659487SAbhinav Kumar /**
12398659487SAbhinav Kumar  * msm_disp_state_free - free the memory after the coredump has been read
1242503003cSDmitry Baryshkov  * @data:	    handle to struct msm_disp_state
12598659487SAbhinav Kumar 
12698659487SAbhinav Kumar  * Returns: none
12798659487SAbhinav Kumar  */
1282503003cSDmitry Baryshkov void msm_disp_state_free(void *data);
12998659487SAbhinav Kumar 
13098659487SAbhinav Kumar /**
13198659487SAbhinav Kumar  * msm_disp_snapshot_add_block - add a hardware block with its register dump
13298659487SAbhinav Kumar  * @disp_state:	    handle to struct msm_disp_state
13398659487SAbhinav Kumar  * @name:           name of the hardware block
13498659487SAbhinav Kumar  * @len:            size of the register space of the hardware block
13598659487SAbhinav Kumar  * @base_addr:      starting address of the register space of the hardware block
13698659487SAbhinav Kumar  * @fmt:            format in which the block names need to be printed
13798659487SAbhinav Kumar  *
13898659487SAbhinav Kumar  * Returns: none
13998659487SAbhinav Kumar  */
14098659487SAbhinav Kumar __printf(4, 5)
14198659487SAbhinav Kumar void msm_disp_snapshot_add_block(struct msm_disp_state *disp_state, u32 len,
14298659487SAbhinav Kumar 		void __iomem *base_addr, const char *fmt, ...);
14398659487SAbhinav Kumar 
14498659487SAbhinav Kumar #endif /* MSM_DISP_SNAPSHOT_H_ */
145