fb890a7d3ee9fa03c55f090509da98545894b2a9
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / arm / mali400 / mali / common / mali_pp.c
1 /*
2  * Copyright (C) 2011-2015 ARM Limited. All rights reserved.
3  * 
4  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
5  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
6  * 
7  * A copy of the licence is included with the program, and can also be obtained from Free Software
8  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
9  */
10
11 #include "mali_pp_job.h"
12 #include "mali_pp.h"
13 #include "mali_hw_core.h"
14 #include "mali_group.h"
15 #include "regs/mali_200_regs.h"
16 #include "mali_kernel_common.h"
17 #include "mali_kernel_core.h"
18 #include "mali_osk_mali.h"
19
20 #if defined(CONFIG_MALI400_PROFILING)
21 #include "mali_osk_profiling.h"
22 #endif
23
24 /* Number of frame registers on Mali-200 */
25 #define MALI_PP_MALI200_NUM_FRAME_REGISTERS ((0x04C/4)+1)
26 /* Number of frame registers on Mali-300 and later */
27 #define MALI_PP_MALI400_NUM_FRAME_REGISTERS ((0x058/4)+1)
28
29 static struct mali_pp_core *mali_global_pp_cores[MALI_MAX_NUMBER_OF_PP_CORES] = { NULL };
30 static u32 mali_global_num_pp_cores = 0;
31
32 /* Interrupt handlers */
33 static void mali_pp_irq_probe_trigger(void *data);
34 static _mali_osk_errcode_t mali_pp_irq_probe_ack(void *data);
35
36 struct mali_pp_core *mali_pp_create(const _mali_osk_resource_t *resource, struct mali_group *group, mali_bool is_virtual, u32 bcast_id)
37 {
38         struct mali_pp_core *core = NULL;
39
40         MALI_DEBUG_PRINT(2, ("Mali PP: Creating Mali PP core: %s\n", resource->description));
41         MALI_DEBUG_PRINT(2, ("Mali PP: Base address of PP core: 0x%x\n", resource->base));
42
43         if (mali_global_num_pp_cores >= MALI_MAX_NUMBER_OF_PP_CORES) {
44                 MALI_PRINT_ERROR(("Mali PP: Too many PP core objects created\n"));
45                 return NULL;
46         }
47
48         core = _mali_osk_calloc(1, sizeof(struct mali_pp_core));
49         if (NULL != core) {
50                 core->core_id = mali_global_num_pp_cores;
51                 core->bcast_id = bcast_id;
52
53                 if (_MALI_OSK_ERR_OK == mali_hw_core_create(&core->hw_core, resource, MALI200_REG_SIZEOF_REGISTER_BANK)) {
54                         _mali_osk_errcode_t ret;
55
56                         if (!is_virtual) {
57                                 ret = mali_pp_reset(core);
58                         } else {
59                                 ret = _MALI_OSK_ERR_OK;
60                         }
61
62                         if (_MALI_OSK_ERR_OK == ret) {
63                                 ret = mali_group_add_pp_core(group, core);
64                                 if (_MALI_OSK_ERR_OK == ret) {
65                                         /* Setup IRQ handlers (which will do IRQ probing if needed) */
66                                         MALI_DEBUG_ASSERT(!is_virtual || -1 != resource->irq);
67
68                                         core->irq = _mali_osk_irq_init(resource->irq,
69                                                                        mali_group_upper_half_pp,
70                                                                        group,
71                                                                        mali_pp_irq_probe_trigger,
72                                                                        mali_pp_irq_probe_ack,
73                                                                        core,
74                                                                        resource->description);
75                                         if (NULL != core->irq) {
76                                                 mali_global_pp_cores[mali_global_num_pp_cores] = core;
77                                                 mali_global_num_pp_cores++;
78
79                                                 return core;
80                                         } else {
81                                                 MALI_PRINT_ERROR(("Mali PP: Failed to setup interrupt handlers for PP core %s\n", core->hw_core.description));
82                                         }
83                                         mali_group_remove_pp_core(group);
84                                 } else {
85                                         MALI_PRINT_ERROR(("Mali PP: Failed to add core %s to group\n", core->hw_core.description));
86                                 }
87                         }
88                         mali_hw_core_delete(&core->hw_core);
89                 }
90
91                 _mali_osk_free(core);
92         } else {
93                 MALI_PRINT_ERROR(("Mali PP: Failed to allocate memory for PP core\n"));
94         }
95
96         return NULL;
97 }
98
99 void mali_pp_delete(struct mali_pp_core *core)
100 {
101         u32 i;
102
103         MALI_DEBUG_ASSERT_POINTER(core);
104
105         _mali_osk_irq_term(core->irq);
106         mali_hw_core_delete(&core->hw_core);
107
108         /* Remove core from global list */
109         for (i = 0; i < mali_global_num_pp_cores; i++) {
110                 if (mali_global_pp_cores[i] == core) {
111                         mali_global_pp_cores[i] = NULL;
112                         mali_global_num_pp_cores--;
113
114                         if (i != mali_global_num_pp_cores) {
115                                 /* We removed a PP core from the middle of the array -- move the last
116                                  * PP core to the current position to close the gap */
117                                 mali_global_pp_cores[i] = mali_global_pp_cores[mali_global_num_pp_cores];
118                                 mali_global_pp_cores[mali_global_num_pp_cores] = NULL;
119                         }
120
121                         break;
122                 }
123         }
124
125         _mali_osk_free(core);
126 }
127
128 void mali_pp_stop_bus(struct mali_pp_core *core)
129 {
130         MALI_DEBUG_ASSERT_POINTER(core);
131         /* Will only send the stop bus command, and not wait for it to complete */
132         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_CTRL_MGMT, MALI200_REG_VAL_CTRL_MGMT_STOP_BUS);
133 }
134
135 _mali_osk_errcode_t mali_pp_stop_bus_wait(struct mali_pp_core *core)
136 {
137         int i;
138
139         MALI_DEBUG_ASSERT_POINTER(core);
140
141         /* Send the stop bus command. */
142         mali_pp_stop_bus(core);
143
144         /* Wait for bus to be stopped */
145         for (i = 0; i < MALI_REG_POLL_COUNT_FAST; i++) {
146                 if (mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_STATUS) & MALI200_REG_VAL_STATUS_BUS_STOPPED)
147                         break;
148         }
149
150         if (MALI_REG_POLL_COUNT_FAST == i) {
151                 MALI_PRINT_ERROR(("Mali PP: Failed to stop bus on %s. Status: 0x%08x\n", core->hw_core.description, mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_STATUS)));
152                 return _MALI_OSK_ERR_FAULT;
153         }
154         return _MALI_OSK_ERR_OK;
155 }
156
157 /* Frame register reset values.
158  * Taken from the Mali400 TRM, 3.6. Pixel processor control register summary */
159 static const u32 mali_frame_registers_reset_values[_MALI_PP_MAX_FRAME_REGISTERS] = {
160         0x0, /* Renderer List Address Register */
161         0x0, /* Renderer State Word Base Address Register */
162         0x0, /* Renderer Vertex Base Register */
163         0x2, /* Feature Enable Register */
164         0x0, /* Z Clear Value Register */
165         0x0, /* Stencil Clear Value Register */
166         0x0, /* ABGR Clear Value 0 Register */
167         0x0, /* ABGR Clear Value 1 Register */
168         0x0, /* ABGR Clear Value 2 Register */
169         0x0, /* ABGR Clear Value 3 Register */
170         0x0, /* Bounding Box Left Right Register */
171         0x0, /* Bounding Box Bottom Register */
172         0x0, /* FS Stack Address Register */
173         0x0, /* FS Stack Size and Initial Value Register */
174         0x0, /* Reserved */
175         0x0, /* Reserved */
176         0x0, /* Origin Offset X Register */
177         0x0, /* Origin Offset Y Register */
178         0x75, /* Subpixel Specifier Register */
179         0x0, /* Tiebreak mode Register */
180         0x0, /* Polygon List Format Register */
181         0x0, /* Scaling Register */
182         0x0 /* Tilebuffer configuration Register */
183 };
184
185 /* WBx register reset values */
186 static const u32 mali_wb_registers_reset_values[_MALI_PP_MAX_WB_REGISTERS] = {
187         0x0, /* WBx Source Select Register */
188         0x0, /* WBx Target Address Register */
189         0x0, /* WBx Target Pixel Format Register */
190         0x0, /* WBx Target AA Format Register */
191         0x0, /* WBx Target Layout */
192         0x0, /* WBx Target Scanline Length */
193         0x0, /* WBx Target Flags Register */
194         0x0, /* WBx MRT Enable Register */
195         0x0, /* WBx MRT Offset Register */
196         0x0, /* WBx Global Test Enable Register */
197         0x0, /* WBx Global Test Reference Value Register */
198         0x0  /* WBx Global Test Compare Function Register */
199 };
200
201 /* Performance Counter 0 Enable Register reset value */
202 static const u32 mali_perf_cnt_enable_reset_value = 0;
203
204 _mali_osk_errcode_t mali_pp_hard_reset(struct mali_pp_core *core)
205 {
206         /* Bus must be stopped before calling this function */
207         const u32 reset_wait_target_register = MALI200_REG_ADDR_MGMT_PERF_CNT_0_LIMIT;
208         const u32 reset_invalid_value = 0xC0FFE000;
209         const u32 reset_check_value = 0xC01A0000;
210         int i;
211
212         MALI_DEBUG_ASSERT_POINTER(core);
213         MALI_DEBUG_PRINT(2, ("Mali PP: Hard reset of core %s\n", core->hw_core.description));
214
215         /* Set register to a bogus value. The register will be used to detect when reset is complete */
216         mali_hw_core_register_write_relaxed(&core->hw_core, reset_wait_target_register, reset_invalid_value);
217         mali_hw_core_register_write_relaxed(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_MASK, MALI200_REG_VAL_IRQ_MASK_NONE);
218
219         /* Force core to reset */
220         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_CTRL_MGMT, MALI200_REG_VAL_CTRL_MGMT_FORCE_RESET);
221
222         /* Wait for reset to be complete */
223         for (i = 0; i < MALI_REG_POLL_COUNT_FAST; i++) {
224                 mali_hw_core_register_write(&core->hw_core, reset_wait_target_register, reset_check_value);
225                 if (reset_check_value == mali_hw_core_register_read(&core->hw_core, reset_wait_target_register)) {
226                         break;
227                 }
228         }
229
230         if (MALI_REG_POLL_COUNT_FAST == i) {
231                 MALI_PRINT_ERROR(("Mali PP: The hard reset loop didn't work, unable to recover\n"));
232         }
233
234         mali_hw_core_register_write(&core->hw_core, reset_wait_target_register, 0x00000000); /* set it back to the default */
235         /* Re-enable interrupts */
236         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_CLEAR, MALI200_REG_VAL_IRQ_MASK_ALL);
237         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_MASK, MALI200_REG_VAL_IRQ_MASK_USED);
238
239         return _MALI_OSK_ERR_OK;
240 }
241
242 void mali_pp_reset_async(struct mali_pp_core *core)
243 {
244         MALI_DEBUG_ASSERT_POINTER(core);
245
246         MALI_DEBUG_PRINT(4, ("Mali PP: Reset of core %s\n", core->hw_core.description));
247
248         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_MASK, 0); /* disable the IRQs */
249         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT, MALI200_REG_VAL_IRQ_MASK_ALL);
250         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_CTRL_MGMT, MALI400PP_REG_VAL_CTRL_MGMT_SOFT_RESET);
251 }
252
253 _mali_osk_errcode_t mali_pp_reset_wait(struct mali_pp_core *core)
254 {
255         int i;
256         u32 rawstat = 0;
257
258         for (i = 0; i < MALI_REG_POLL_COUNT_FAST; i++) {
259                 u32 status =  mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_STATUS);
260                 if (!(status & MALI200_REG_VAL_STATUS_RENDERING_ACTIVE)) {
261                         rawstat = mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT);
262                         if (rawstat == MALI400PP_REG_VAL_IRQ_RESET_COMPLETED) {
263                                 break;
264                         }
265                 }
266         }
267
268         if (i == MALI_REG_POLL_COUNT_FAST) {
269                 MALI_PRINT_ERROR(("Mali PP: Failed to reset core %s, rawstat: 0x%08x\n",
270                                   core->hw_core.description, rawstat));
271                 return _MALI_OSK_ERR_FAULT;
272         }
273
274         /* Re-enable interrupts */
275         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_CLEAR, MALI200_REG_VAL_IRQ_MASK_ALL);
276         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_MASK, MALI200_REG_VAL_IRQ_MASK_USED);
277
278         return _MALI_OSK_ERR_OK;
279 }
280
281 _mali_osk_errcode_t mali_pp_reset(struct mali_pp_core *core)
282 {
283         mali_pp_reset_async(core);
284         return mali_pp_reset_wait(core);
285 }
286
287 void mali_pp_job_start(struct mali_pp_core *core, struct mali_pp_job *job, u32 sub_job, mali_bool restart_virtual)
288 {
289         u32 relative_address;
290         u32 start_index;
291         u32 nr_of_regs;
292         u32 *frame_registers = mali_pp_job_get_frame_registers(job);
293         u32 *wb0_registers = mali_pp_job_get_wb0_registers(job);
294         u32 *wb1_registers = mali_pp_job_get_wb1_registers(job);
295         u32 *wb2_registers = mali_pp_job_get_wb2_registers(job);
296         u32 counter_src0 = mali_pp_job_get_perf_counter_src0(job, sub_job);
297         u32 counter_src1 = mali_pp_job_get_perf_counter_src1(job, sub_job);
298
299         MALI_DEBUG_ASSERT_POINTER(core);
300
301         /* Change gpu secure mode if needed. */
302         if (MALI_TRUE == mali_pp_job_is_protected_job(job) && MALI_FALSE == _mali_osk_gpu_secure_mode_is_enabled()) {
303                 _mali_osk_gpu_secure_mode_enable();
304         } else if (MALI_FALSE == mali_pp_job_is_protected_job(job) && MALI_TRUE == _mali_osk_gpu_secure_mode_is_enabled()) {
305                 _mali_osk_gpu_secure_mode_disable();
306         }
307
308         /* Write frame registers */
309
310         /*
311          * There are two frame registers which are different for each sub job:
312          * 1. The Renderer List Address Register (MALI200_REG_ADDR_FRAME)
313          * 2. The FS Stack Address Register (MALI200_REG_ADDR_STACK)
314          */
315         mali_hw_core_register_write_relaxed_conditional(&core->hw_core, MALI200_REG_ADDR_FRAME, mali_pp_job_get_addr_frame(job, sub_job), mali_frame_registers_reset_values[MALI200_REG_ADDR_FRAME / sizeof(u32)]);
316
317         /* For virtual jobs, the stack address shouldn't be broadcast but written individually */
318         if (!mali_pp_job_is_virtual(job) || restart_virtual) {
319                 mali_hw_core_register_write_relaxed_conditional(&core->hw_core, MALI200_REG_ADDR_STACK, mali_pp_job_get_addr_stack(job, sub_job), mali_frame_registers_reset_values[MALI200_REG_ADDR_STACK / sizeof(u32)]);
320         }
321
322         /* Write registers between MALI200_REG_ADDR_FRAME and MALI200_REG_ADDR_STACK */
323         relative_address = MALI200_REG_ADDR_RSW;
324         start_index = MALI200_REG_ADDR_RSW / sizeof(u32);
325         nr_of_regs = (MALI200_REG_ADDR_STACK - MALI200_REG_ADDR_RSW) / sizeof(u32);
326
327         mali_hw_core_register_write_array_relaxed_conditional(&core->hw_core,
328                         relative_address, &frame_registers[start_index],
329                         nr_of_regs, &mali_frame_registers_reset_values[start_index]);
330
331         /* MALI200_REG_ADDR_STACK_SIZE */
332         relative_address = MALI200_REG_ADDR_STACK_SIZE;
333         start_index = MALI200_REG_ADDR_STACK_SIZE / sizeof(u32);
334
335         mali_hw_core_register_write_relaxed_conditional(&core->hw_core,
336                         relative_address, frame_registers[start_index],
337                         mali_frame_registers_reset_values[start_index]);
338
339         /* Skip 2 reserved registers */
340
341         /* Write remaining registers */
342         relative_address = MALI200_REG_ADDR_ORIGIN_OFFSET_X;
343         start_index = MALI200_REG_ADDR_ORIGIN_OFFSET_X / sizeof(u32);
344         nr_of_regs = MALI_PP_MALI400_NUM_FRAME_REGISTERS - MALI200_REG_ADDR_ORIGIN_OFFSET_X / sizeof(u32);
345
346         mali_hw_core_register_write_array_relaxed_conditional(&core->hw_core,
347                         relative_address, &frame_registers[start_index],
348                         nr_of_regs, &mali_frame_registers_reset_values[start_index]);
349
350         /* Write WBx registers */
351         if (wb0_registers[0]) { /* M200_WB0_REG_SOURCE_SELECT register */
352                 mali_hw_core_register_write_array_relaxed_conditional(&core->hw_core, MALI200_REG_ADDR_WB0, wb0_registers, _MALI_PP_MAX_WB_REGISTERS, mali_wb_registers_reset_values);
353         }
354
355         if (wb1_registers[0]) { /* M200_WB1_REG_SOURCE_SELECT register */
356                 mali_hw_core_register_write_array_relaxed_conditional(&core->hw_core, MALI200_REG_ADDR_WB1, wb1_registers, _MALI_PP_MAX_WB_REGISTERS, mali_wb_registers_reset_values);
357         }
358
359         if (wb2_registers[0]) { /* M200_WB2_REG_SOURCE_SELECT register */
360                 mali_hw_core_register_write_array_relaxed_conditional(&core->hw_core, MALI200_REG_ADDR_WB2, wb2_registers, _MALI_PP_MAX_WB_REGISTERS, mali_wb_registers_reset_values);
361         }
362
363         if (MALI_HW_CORE_NO_COUNTER != counter_src0) {
364                 mali_hw_core_register_write_relaxed(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_SRC, counter_src0);
365                 mali_hw_core_register_write_relaxed_conditional(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_ENABLE, MALI200_REG_VAL_PERF_CNT_ENABLE, mali_perf_cnt_enable_reset_value);
366         }
367         if (MALI_HW_CORE_NO_COUNTER != counter_src1) {
368                 mali_hw_core_register_write_relaxed(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_SRC, counter_src1);
369                 mali_hw_core_register_write_relaxed_conditional(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_ENABLE, MALI200_REG_VAL_PERF_CNT_ENABLE, mali_perf_cnt_enable_reset_value);
370         }
371
372 #ifdef CONFIG_MALI400_HEATMAPS_ENABLED
373         if (job->uargs.perf_counter_flag & _MALI_PERFORMANCE_COUNTER_FLAG_HEATMAP_ENABLE) {
374                 mali_hw_core_register_write_relaxed(&core->hw_core, MALI200_REG_ADDR_MGMT_PERFMON_CONTR, ((job->uargs.tilesx & 0x3FF) << 16) | 1);
375                 mali_hw_core_register_write_relaxed(&core->hw_core,  MALI200_REG_ADDR_MGMT_PERFMON_BASE, job->uargs.heatmap_mem & 0xFFFFFFF8);
376         }
377 #endif /* CONFIG_MALI400_HEATMAPS_ENABLED */
378
379         MALI_DEBUG_PRINT(3, ("Mali PP: Starting job 0x%08X part %u/%u on PP core %s\n", job, sub_job + 1, mali_pp_job_get_sub_job_count(job), core->hw_core.description));
380
381         /* Adding barrier to make sure all rester writes are finished */
382         _mali_osk_write_mem_barrier();
383
384         /* This is the command that starts the core.
385          *
386          * Don't actually run the job if PROFILING_SKIP_PP_JOBS are set, just
387          * force core to assert the completion interrupt.
388          */
389 #if !defined(PROFILING_SKIP_PP_JOBS)
390         mali_hw_core_register_write_relaxed(&core->hw_core, MALI200_REG_ADDR_MGMT_CTRL_MGMT, MALI200_REG_VAL_CTRL_MGMT_START_RENDERING);
391 #else
392         mali_hw_core_register_write_relaxed(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT, MALI200_REG_VAL_IRQ_END_OF_FRAME);
393 #endif
394
395         /* Adding barrier to make sure previous rester writes is finished */
396         _mali_osk_write_mem_barrier();
397 }
398
399 u32 mali_pp_core_get_version(struct mali_pp_core *core)
400 {
401         MALI_DEBUG_ASSERT_POINTER(core);
402         return mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_VERSION);
403 }
404
405 struct mali_pp_core *mali_pp_get_global_pp_core(u32 index)
406 {
407         if (mali_global_num_pp_cores > index) {
408                 return mali_global_pp_cores[index];
409         }
410
411         return NULL;
412 }
413
414 u32 mali_pp_get_glob_num_pp_cores(void)
415 {
416         return mali_global_num_pp_cores;
417 }
418
419 /* ------------- interrupt handling below ------------------ */
420 static void mali_pp_irq_probe_trigger(void *data)
421 {
422         struct mali_pp_core *core = (struct mali_pp_core *)data;
423         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_MASK, MALI200_REG_VAL_IRQ_MASK_USED);
424         mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT, MALI200_REG_VAL_IRQ_BUS_ERROR);
425         _mali_osk_mem_barrier();
426 }
427
428 static _mali_osk_errcode_t mali_pp_irq_probe_ack(void *data)
429 {
430         struct mali_pp_core *core = (struct mali_pp_core *)data;
431         u32 irq_readout;
432
433         irq_readout = mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_STATUS);
434         if (MALI200_REG_VAL_IRQ_BUS_ERROR & irq_readout) {
435                 mali_hw_core_register_write(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_CLEAR, MALI200_REG_VAL_IRQ_BUS_ERROR);
436                 _mali_osk_mem_barrier();
437                 return _MALI_OSK_ERR_OK;
438         }
439
440         return _MALI_OSK_ERR_FAULT;
441 }
442
443
444 #if 0
445 static void mali_pp_print_registers(struct mali_pp_core *core)
446 {
447         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_VERSION = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_VERSION)));
448         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_CURRENT_REND_LIST_ADDR = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_CURRENT_REND_LIST_ADDR)));
449         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_STATUS = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_STATUS)));
450         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_INT_RAWSTAT = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_RAWSTAT)));
451         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_INT_MASK = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_MASK)));
452         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_INT_STATUS = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_INT_STATUS)));
453         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_BUS_ERROR_STATUS = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_BUS_ERROR_STATUS)));
454         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_PERF_CNT_0_ENABLE = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_ENABLE)));
455         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_PERF_CNT_0_SRC = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_SRC)));
456         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_PERF_CNT_0_VALUE = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_VALUE)));
457         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_PERF_CNT_1_ENABLE = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_ENABLE)));
458         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_PERF_CNT_1_SRC = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_SRC)));
459         MALI_DEBUG_PRINT(2, ("Mali PP: Register MALI200_REG_ADDR_MGMT_PERF_CNT_1_VALUE = 0x%08X\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_VALUE)));
460 }
461 #endif
462
463 #if 0
464 void mali_pp_print_state(struct mali_pp_core *core)
465 {
466         MALI_DEBUG_PRINT(2, ("Mali PP: State: 0x%08x\n", mali_hw_core_register_read(&core->hw_core, MALI200_REG_ADDR_MGMT_STATUS)));
467 }
468 #endif
469
470 void mali_pp_update_performance_counters(struct mali_pp_core *parent, struct mali_pp_core *child, struct mali_pp_job *job, u32 subjob)
471 {
472         u32 val0 = 0;
473         u32 val1 = 0;
474         u32 counter_src0 = mali_pp_job_get_perf_counter_src0(job, subjob);
475         u32 counter_src1 = mali_pp_job_get_perf_counter_src1(job, subjob);
476 #if defined(CONFIG_MALI400_PROFILING)
477         int counter_index = COUNTER_FP_0_C0 + (2 * child->core_id);
478 #endif
479
480         if (MALI_HW_CORE_NO_COUNTER != counter_src0) {
481                 val0 = mali_hw_core_register_read(&child->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_0_VALUE);
482                 mali_pp_job_set_perf_counter_value0(job, subjob, val0);
483
484 #if defined(CONFIG_MALI400_PROFILING)
485                 _mali_osk_profiling_report_hw_counter(counter_index, val0);
486                 _mali_osk_profiling_record_global_counters(counter_index, val0);
487 #endif
488         }
489
490         if (MALI_HW_CORE_NO_COUNTER != counter_src1) {
491                 val1 = mali_hw_core_register_read(&child->hw_core, MALI200_REG_ADDR_MGMT_PERF_CNT_1_VALUE);
492                 mali_pp_job_set_perf_counter_value1(job, subjob, val1);
493
494 #if defined(CONFIG_MALI400_PROFILING)
495                 _mali_osk_profiling_report_hw_counter(counter_index + 1, val1);
496                 _mali_osk_profiling_record_global_counters(counter_index + 1, val1);
497 #endif
498         }
499 }
500
501 #if MALI_STATE_TRACKING
502 u32 mali_pp_dump_state(struct mali_pp_core *core, char *buf, u32 size)
503 {
504         int n = 0;
505
506         n += _mali_osk_snprintf(buf + n, size - n, "\tPP #%d: %s\n", core->core_id, core->hw_core.description);
507
508         return n;
509 }
510 #endif