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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
/* Copyright (c) 2010-2011,2013-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#ifndef __KGSL_CFFDUMP_H
#define __KGSL_CFFDUMP_H
#include <linux/types.h>
#include "kgsl_device.h"
extern unsigned int kgsl_cff_dump_enable;
static inline bool kgsl_cffdump_flags_no_memzero(void) { return true; }
struct kgsl_device_private;
#ifdef CONFIG_QCOM_KGSL_CFF_DUMP
#define CFF_OP_WRITE_MEM 0x0000000b
void kgsl_cffdump_init(void);
void kgsl_cffdump_destroy(void);
void kgsl_cffdump_open(struct kgsl_device *device);
void kgsl_cffdump_close(struct kgsl_device *device);
void kgsl_cffdump_memcpy(struct kgsl_device *device, uint64_t gpuaddr,
unsigned int *ptr, uint64_t sizebytes);
void kgsl_cffdump_syncmem(struct kgsl_device *, struct kgsl_mem_entry *,
uint64_t offset, uint64_t sizebytes, bool clean_cache);
void kgsl_cffdump_memset(struct kgsl_device *device, uint64_t addr,
unsigned char value, size_t sizebytes);
void kgsl_cffdump_regwrite(struct kgsl_device *device, uint addr,
uint value);
void kgsl_cffdump_regpoll(struct kgsl_device *device, uint addr,
uint value, uint mask);
bool kgsl_cffdump_parse_ibs(struct kgsl_device_private *dev_priv,
const struct kgsl_memdesc *memdesc, uint64_t gpuaddr,
uint64_t sizedwords, bool check_only);
void kgsl_cffdump_user_event(struct kgsl_device *device,
unsigned int cff_opcode, unsigned int op1,
unsigned int op2, unsigned int op3,
unsigned int op4, unsigned int op5);
void kgsl_cffdump_memory_base(struct kgsl_device *device, unsigned int base,
unsigned int range, unsigned int gmemsize);
void kgsl_cffdump_hang(struct kgsl_device *device);
void kgsl_cffdump_debugfs_create(struct kgsl_device *device);
int kgsl_cff_dump_enable_set(void *data, u64 val);
int kgsl_cff_dump_enable_get(void *data, u64 *val);
int kgsl_cffdump_capture_ib_desc(struct kgsl_device *device,
struct kgsl_context *context,
struct kgsl_drawobj_cmd *cmdobj);
void kgsl_cffdump_printline(int id, uint opcode, uint op1, uint op2,
uint op3, uint op4, uint op5);
static inline void kgsl_cffdump_write(struct kgsl_device *device,
uint64_t gpuaddr, unsigned int value)
{
if (!device || !device->cff_dump_enable)
return;
kgsl_cffdump_printline(-1, CFF_OP_WRITE_MEM, gpuaddr, value, 0, 0, 0);
}
#else
static inline void kgsl_cffdump_init(void)
{
return;
}
static inline void kgsl_cffdump_destroy(void)
{
return;
}
static inline void kgsl_cffdump_open(struct kgsl_device *device)
{
return;
}
static inline void kgsl_cffdump_close(struct kgsl_device *device)
{
return;
}
static inline void kgsl_cffdump_write(struct kgsl_device *device,
uint64_t gpuaddr, unsigned int value)
{
return;
}
static inline void kgsl_cffdump_memcpy(struct kgsl_device *device,
uint64_t gupaddr, unsigned int *ptr, uint64_t sizebytes)
{
return;
}
static inline void kgsl_cffdump_syncmem(struct kgsl_device *device,
struct kgsl_mem_entry *entry, uint64_t offset,
uint64_t sizebytes, bool clean_cache)
{
return;
}
static inline void kgsl_cffdump_memset(struct kgsl_device *device,
uint64_t addr, unsigned char ch, size_t sizebytes)
{
return;
}
static inline void kgsl_cffdump_regwrite(struct kgsl_device *device, uint addr,
uint value)
{
return;
}
static inline void kgsl_cffdump_regpoll(struct kgsl_device *device, uint addr,
uint value, uint mask)
{
return;
}
static inline bool kgsl_cffdump_parse_ibs(struct kgsl_device_private *dev_priv,
const struct kgsl_memdesc *memdesc, uint64_t gpuaddr,
uint64_t sizedwords, bool check_only)
{
return false;
}
static inline void kgsl_cffdump_memory_base(struct kgsl_device *device,
unsigned int base, unsigned int range, unsigned int gmemsize)
{
return;
}
static inline void kgsl_cffdump_hang(struct kgsl_device *device)
{
return;
}
static inline void kgsl_cffdump_debugfs_create(struct kgsl_device *device)
{
return;
}
static inline void kgsl_cffdump_user_event(struct kgsl_device *device,
unsigned int cff_opcode, unsigned int op1,
unsigned int op2, unsigned int op3,
unsigned int op4, unsigned int op5)
{
return;
}
static inline int kgsl_cffdump_capture_ib_desc(struct kgsl_device *device,
struct kgsl_context *context,
struct kgsl_drawobj_cmd *cmdobj)
{
return 0;
}
static inline int kgsl_cff_dump_enable_set(void *data, u64 val)
{
return -ENODEV;
}
static inline int kgsl_cff_dump_enable_get(void *data, u64 *val)
{
return -ENODEV;
}
#endif /* CONFIG_QCOM_KGSL_CFF_DUMP */
#endif /* __KGSL_CFFDUMP_H */
|