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