2 * drivers/video/tegra/host/gk20a/pmu_gk20a.c
4 * GK20A PMU (aka. gPMU outside gk20a context)
6 * Copyright (c) 2011-2015, NVIDIA CORPORATION. All rights reserved.
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms and conditions of the GNU General Public License,
10 * version 2, as published by the Free Software Foundation.
12 * This program is distributed in the hope it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
17 * You should have received a copy of the GNU General Public License along with
18 * this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
22 #include <linux/delay.h> /* for mdelay */
23 #include <linux/firmware.h>
24 #include <linux/clk.h>
25 #include <linux/module.h>
26 #include <linux/debugfs.h>
27 #include <linux/dma-mapping.h>
31 #include "hw_mc_gk20a.h"
32 #include "hw_pwr_gk20a.h"
33 #include "hw_top_gk20a.h"
35 #define GK20A_PMU_UCODE_IMAGE "gpmu_ucode.bin"
37 #define gk20a_dbg_pmu(fmt, arg...) \
38 gk20a_dbg(gpu_dbg_pmu, fmt, ##arg)
40 static void pmu_dump_falcon_stats(struct pmu_gk20a *pmu);
41 static int gk20a_pmu_get_elpg_residency_gating(struct gk20a *g,
42 u32 *ingating_time, u32 *ungating_time, u32 *gating_cnt);
43 static void pmu_setup_hw(struct work_struct *work);
44 static void ap_callback_init_and_enable_ctrl(
45 struct gk20a *g, struct pmu_msg *msg,
46 void *param, u32 seq_desc, u32 status);
47 static int gk20a_pmu_ap_send_command(struct gk20a *g,
48 union pmu_ap_cmd *p_ap_cmd, bool b_block);
50 static u32 pmu_cmdline_size_v0(struct pmu_gk20a *pmu)
52 return sizeof(struct pmu_cmdline_args_v0);
55 static u32 pmu_cmdline_size_v1(struct pmu_gk20a *pmu)
57 return sizeof(struct pmu_cmdline_args_v1);
60 static void set_pmu_cmdline_args_cpufreq_v1(struct pmu_gk20a *pmu, u32 freq)
62 pmu->args_v1.cpu_freq_hz = freq;
65 static void set_pmu_cmdline_args_cpufreq_v0(struct pmu_gk20a *pmu, u32 freq)
67 pmu->args_v0.cpu_freq_hz = freq;
70 static void *get_pmu_cmdline_args_ptr_v1(struct pmu_gk20a *pmu)
72 return (void *)(&pmu->args_v1);
75 static void *get_pmu_cmdline_args_ptr_v0(struct pmu_gk20a *pmu)
77 return (void *)(&pmu->args_v0);
80 static u32 get_pmu_allocation_size_v1(struct pmu_gk20a *pmu)
82 return sizeof(struct pmu_allocation_v1);
85 static u32 get_pmu_allocation_size_v0(struct pmu_gk20a *pmu)
87 return sizeof(struct pmu_allocation_v0);
90 static void set_pmu_allocation_ptr_v1(struct pmu_gk20a *pmu,
91 void **pmu_alloc_ptr, void *assign_ptr)
93 struct pmu_allocation_v1 **pmu_a_ptr =
94 (struct pmu_allocation_v1 **)pmu_alloc_ptr;
95 *pmu_a_ptr = (struct pmu_allocation_v1 *)assign_ptr;
98 static void set_pmu_allocation_ptr_v0(struct pmu_gk20a *pmu,
99 void **pmu_alloc_ptr, void *assign_ptr)
101 struct pmu_allocation_v0 **pmu_a_ptr =
102 (struct pmu_allocation_v0 **)pmu_alloc_ptr;
103 *pmu_a_ptr = (struct pmu_allocation_v0 *)assign_ptr;
106 static void pmu_allocation_set_dmem_size_v1(struct pmu_gk20a *pmu,
107 void *pmu_alloc_ptr, u16 size)
109 struct pmu_allocation_v1 *pmu_a_ptr =
110 (struct pmu_allocation_v1 *)pmu_alloc_ptr;
111 pmu_a_ptr->alloc.dmem.size = size;
114 static void pmu_allocation_set_dmem_size_v0(struct pmu_gk20a *pmu,
115 void *pmu_alloc_ptr, u16 size)
117 struct pmu_allocation_v0 *pmu_a_ptr =
118 (struct pmu_allocation_v0 *)pmu_alloc_ptr;
119 pmu_a_ptr->alloc.dmem.size = size;
122 static u16 pmu_allocation_get_dmem_size_v1(struct pmu_gk20a *pmu,
125 struct pmu_allocation_v1 *pmu_a_ptr =
126 (struct pmu_allocation_v1 *)pmu_alloc_ptr;
127 return pmu_a_ptr->alloc.dmem.size;
130 static u16 pmu_allocation_get_dmem_size_v0(struct pmu_gk20a *pmu,
133 struct pmu_allocation_v0 *pmu_a_ptr =
134 (struct pmu_allocation_v0 *)pmu_alloc_ptr;
135 return pmu_a_ptr->alloc.dmem.size;
138 static u32 pmu_allocation_get_dmem_offset_v1(struct pmu_gk20a *pmu,
141 struct pmu_allocation_v1 *pmu_a_ptr =
142 (struct pmu_allocation_v1 *)pmu_alloc_ptr;
143 return pmu_a_ptr->alloc.dmem.offset;
146 static u32 pmu_allocation_get_dmem_offset_v0(struct pmu_gk20a *pmu,
149 struct pmu_allocation_v0 *pmu_a_ptr =
150 (struct pmu_allocation_v0 *)pmu_alloc_ptr;
151 return pmu_a_ptr->alloc.dmem.offset;
154 static u32 *pmu_allocation_get_dmem_offset_addr_v1(struct pmu_gk20a *pmu,
157 struct pmu_allocation_v1 *pmu_a_ptr =
158 (struct pmu_allocation_v1 *)pmu_alloc_ptr;
159 return &pmu_a_ptr->alloc.dmem.offset;
162 static u32 *pmu_allocation_get_dmem_offset_addr_v0(struct pmu_gk20a *pmu,
165 struct pmu_allocation_v0 *pmu_a_ptr =
166 (struct pmu_allocation_v0 *)pmu_alloc_ptr;
167 return &pmu_a_ptr->alloc.dmem.offset;
170 static void pmu_allocation_set_dmem_offset_v1(struct pmu_gk20a *pmu,
171 void *pmu_alloc_ptr, u32 offset)
173 struct pmu_allocation_v1 *pmu_a_ptr =
174 (struct pmu_allocation_v1 *)pmu_alloc_ptr;
175 pmu_a_ptr->alloc.dmem.offset = offset;
178 static void pmu_allocation_set_dmem_offset_v0(struct pmu_gk20a *pmu,
179 void *pmu_alloc_ptr, u32 offset)
181 struct pmu_allocation_v0 *pmu_a_ptr =
182 (struct pmu_allocation_v0 *)pmu_alloc_ptr;
183 pmu_a_ptr->alloc.dmem.offset = offset;
186 static void *get_pmu_msg_pmu_init_msg_ptr_v1(struct pmu_init_msg *init)
188 return (void *)(&(init->pmu_init_v1));
191 static u16 get_pmu_init_msg_pmu_sw_mg_off_v1(union pmu_init_msg_pmu *init_msg)
193 struct pmu_init_msg_pmu_v1 *init =
194 (struct pmu_init_msg_pmu_v1 *)(&init_msg->v1);
195 return init->sw_managed_area_offset;
198 static u16 get_pmu_init_msg_pmu_sw_mg_size_v1(union pmu_init_msg_pmu *init_msg)
200 struct pmu_init_msg_pmu_v1 *init =
201 (struct pmu_init_msg_pmu_v1 *)(&init_msg->v1);
202 return init->sw_managed_area_size;
205 static void *get_pmu_msg_pmu_init_msg_ptr_v0(struct pmu_init_msg *init)
207 return (void *)(&(init->pmu_init_v0));
210 static u16 get_pmu_init_msg_pmu_sw_mg_off_v0(union pmu_init_msg_pmu *init_msg)
212 struct pmu_init_msg_pmu_v0 *init =
213 (struct pmu_init_msg_pmu_v0 *)(&init_msg->v0);
214 return init->sw_managed_area_offset;
217 static u16 get_pmu_init_msg_pmu_sw_mg_size_v0(union pmu_init_msg_pmu *init_msg)
219 struct pmu_init_msg_pmu_v0 *init =
220 (struct pmu_init_msg_pmu_v0 *)(&init_msg->v0);
221 return init->sw_managed_area_size;
224 static u32 get_pmu_perfmon_cmd_start_size_v1(void)
226 return sizeof(struct pmu_perfmon_cmd_start_v1);
229 static u32 get_pmu_perfmon_cmd_start_size_v0(void)
231 return sizeof(struct pmu_perfmon_cmd_start_v0);
234 static int get_perfmon_cmd_start_offsetofvar_v1(
235 enum pmu_perfmon_cmd_start_fields field)
239 return offsetof(struct pmu_perfmon_cmd_start_v1,
248 static int get_perfmon_cmd_start_offsetofvar_v0(
249 enum pmu_perfmon_cmd_start_fields field)
253 return offsetof(struct pmu_perfmon_cmd_start_v0,
262 static u32 get_pmu_perfmon_cmd_init_size_v1(void)
264 return sizeof(struct pmu_perfmon_cmd_init_v1);
267 static u32 get_pmu_perfmon_cmd_init_size_v0(void)
269 return sizeof(struct pmu_perfmon_cmd_init_v0);
272 static int get_perfmon_cmd_init_offsetofvar_v1(
273 enum pmu_perfmon_cmd_start_fields field)
277 return offsetof(struct pmu_perfmon_cmd_init_v1,
286 static int get_perfmon_cmd_init_offsetofvar_v0(
287 enum pmu_perfmon_cmd_start_fields field)
291 return offsetof(struct pmu_perfmon_cmd_init_v0,
300 static void perfmon_start_set_cmd_type_v1(struct pmu_perfmon_cmd *pc, u8 value)
302 struct pmu_perfmon_cmd_start_v1 *start = &pc->start_v1;
303 start->cmd_type = value;
306 static void perfmon_start_set_cmd_type_v0(struct pmu_perfmon_cmd *pc, u8 value)
308 struct pmu_perfmon_cmd_start_v0 *start = &pc->start_v0;
309 start->cmd_type = value;
312 static void perfmon_start_set_group_id_v1(struct pmu_perfmon_cmd *pc, u8 value)
314 struct pmu_perfmon_cmd_start_v1 *start = &pc->start_v1;
315 start->group_id = value;
318 static void perfmon_start_set_group_id_v0(struct pmu_perfmon_cmd *pc, u8 value)
320 struct pmu_perfmon_cmd_start_v0 *start = &pc->start_v0;
321 start->group_id = value;
324 static void perfmon_start_set_state_id_v1(struct pmu_perfmon_cmd *pc, u8 value)
326 struct pmu_perfmon_cmd_start_v1 *start = &pc->start_v1;
327 start->state_id = value;
330 static void perfmon_start_set_state_id_v0(struct pmu_perfmon_cmd *pc, u8 value)
332 struct pmu_perfmon_cmd_start_v0 *start = &pc->start_v0;
333 start->state_id = value;
336 static void perfmon_start_set_flags_v1(struct pmu_perfmon_cmd *pc, u8 value)
338 struct pmu_perfmon_cmd_start_v1 *start = &pc->start_v1;
339 start->flags = value;
342 static void perfmon_start_set_flags_v0(struct pmu_perfmon_cmd *pc, u8 value)
344 struct pmu_perfmon_cmd_start_v0 *start = &pc->start_v0;
345 start->flags = value;
348 static u8 perfmon_start_get_flags_v1(struct pmu_perfmon_cmd *pc)
350 struct pmu_perfmon_cmd_start_v1 *start = &pc->start_v1;
354 static u8 perfmon_start_get_flags_v0(struct pmu_perfmon_cmd *pc)
356 struct pmu_perfmon_cmd_start_v0 *start = &pc->start_v0;
360 static void perfmon_cmd_init_set_sample_buffer_v1(struct pmu_perfmon_cmd *pc,
363 struct pmu_perfmon_cmd_init_v1 *init = &pc->init_v1;
364 init->sample_buffer = value;
367 static void perfmon_cmd_init_set_sample_buffer_v0(struct pmu_perfmon_cmd *pc,
370 struct pmu_perfmon_cmd_init_v0 *init = &pc->init_v0;
371 init->sample_buffer = value;
374 static void perfmon_cmd_init_set_dec_cnt_v1(struct pmu_perfmon_cmd *pc,
377 struct pmu_perfmon_cmd_init_v1 *init = &pc->init_v1;
378 init->to_decrease_count = value;
381 static void perfmon_cmd_init_set_dec_cnt_v0(struct pmu_perfmon_cmd *pc,
384 struct pmu_perfmon_cmd_init_v0 *init = &pc->init_v0;
385 init->to_decrease_count = value;
388 static void perfmon_cmd_init_set_base_cnt_id_v1(struct pmu_perfmon_cmd *pc,
391 struct pmu_perfmon_cmd_init_v1 *init = &pc->init_v1;
392 init->base_counter_id = value;
395 static void perfmon_cmd_init_set_base_cnt_id_v0(struct pmu_perfmon_cmd *pc,
398 struct pmu_perfmon_cmd_init_v0 *init = &pc->init_v0;
399 init->base_counter_id = value;
402 static void perfmon_cmd_init_set_samp_period_us_v1(struct pmu_perfmon_cmd *pc,
405 struct pmu_perfmon_cmd_init_v1 *init = &pc->init_v1;
406 init->sample_period_us = value;
409 static void perfmon_cmd_init_set_samp_period_us_v0(struct pmu_perfmon_cmd *pc,
412 struct pmu_perfmon_cmd_init_v0 *init = &pc->init_v0;
413 init->sample_period_us = value;
416 static void perfmon_cmd_init_set_num_cnt_v1(struct pmu_perfmon_cmd *pc,
419 struct pmu_perfmon_cmd_init_v1 *init = &pc->init_v1;
420 init->num_counters = value;
423 static void perfmon_cmd_init_set_num_cnt_v0(struct pmu_perfmon_cmd *pc,
426 struct pmu_perfmon_cmd_init_v0 *init = &pc->init_v0;
427 init->num_counters = value;
430 static void perfmon_cmd_init_set_mov_avg_v1(struct pmu_perfmon_cmd *pc,
433 struct pmu_perfmon_cmd_init_v1 *init = &pc->init_v1;
434 init->samples_in_moving_avg = value;
437 static void perfmon_cmd_init_set_mov_avg_v0(struct pmu_perfmon_cmd *pc,
440 struct pmu_perfmon_cmd_init_v0 *init = &pc->init_v0;
441 init->samples_in_moving_avg = value;
444 static void get_pmu_init_msg_pmu_queue_params_v0(struct pmu_queue *queue,
445 u32 id, void *pmu_init_msg)
447 struct pmu_init_msg_pmu_v0 *init =
448 (struct pmu_init_msg_pmu_v0 *)pmu_init_msg;
449 queue->index = init->queue_info[id].index;
450 queue->offset = init->queue_info[id].offset;
451 queue->size = init->queue_info[id].size;
454 static void get_pmu_init_msg_pmu_queue_params_v1(struct pmu_queue *queue,
455 u32 id, void *pmu_init_msg)
457 struct pmu_init_msg_pmu_v1 *init =
458 (struct pmu_init_msg_pmu_v1 *)pmu_init_msg;
459 queue->index = init->queue_info[id].index;
460 queue->offset = init->queue_info[id].offset;
461 queue->size = init->queue_info[id].size;
464 static void *get_pmu_sequence_in_alloc_ptr_v1(struct pmu_sequence *seq)
466 return (void *)(&seq->in_v1);
469 static void *get_pmu_sequence_in_alloc_ptr_v0(struct pmu_sequence *seq)
471 return (void *)(&seq->in_v0);
474 static void *get_pmu_sequence_out_alloc_ptr_v1(struct pmu_sequence *seq)
476 return (void *)(&seq->out_v1);
479 static void *get_pmu_sequence_out_alloc_ptr_v0(struct pmu_sequence *seq)
481 return (void *)(&seq->out_v0);
484 static int gk20a_init_pmu(struct pmu_gk20a *pmu)
486 struct gk20a *g = pmu->g;
487 switch (pmu->desc->app_version) {
489 g->ops.pmu_ver.cmd_id_zbc_table_update = 16;
490 g->ops.pmu_ver.get_pmu_cmdline_args_size =
492 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq =
493 set_pmu_cmdline_args_cpufreq_v1;
494 g->ops.pmu_ver.get_pmu_cmdline_args_ptr =
495 get_pmu_cmdline_args_ptr_v1;
496 g->ops.pmu_ver.get_pmu_allocation_struct_size =
497 get_pmu_allocation_size_v1;
498 g->ops.pmu_ver.set_pmu_allocation_ptr =
499 set_pmu_allocation_ptr_v1;
500 g->ops.pmu_ver.pmu_allocation_set_dmem_size =
501 pmu_allocation_set_dmem_size_v1;
502 g->ops.pmu_ver.pmu_allocation_get_dmem_size =
503 pmu_allocation_get_dmem_size_v1;
504 g->ops.pmu_ver.pmu_allocation_get_dmem_offset =
505 pmu_allocation_get_dmem_offset_v1;
506 g->ops.pmu_ver.pmu_allocation_get_dmem_offset_addr =
507 pmu_allocation_get_dmem_offset_addr_v1;
508 g->ops.pmu_ver.pmu_allocation_set_dmem_offset =
509 pmu_allocation_set_dmem_offset_v1;
510 g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params =
511 get_pmu_init_msg_pmu_queue_params_v1;
512 g->ops.pmu_ver.get_pmu_msg_pmu_init_msg_ptr =
513 get_pmu_msg_pmu_init_msg_ptr_v1;
514 g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_off =
515 get_pmu_init_msg_pmu_sw_mg_off_v1;
516 g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_size =
517 get_pmu_init_msg_pmu_sw_mg_size_v1;
518 g->ops.pmu_ver.get_pmu_perfmon_cmd_start_size =
519 get_pmu_perfmon_cmd_start_size_v1;
520 g->ops.pmu_ver.get_perfmon_cmd_start_offsetofvar =
521 get_perfmon_cmd_start_offsetofvar_v1;
522 g->ops.pmu_ver.perfmon_start_set_cmd_type =
523 perfmon_start_set_cmd_type_v1;
524 g->ops.pmu_ver.perfmon_start_set_group_id =
525 perfmon_start_set_group_id_v1;
526 g->ops.pmu_ver.perfmon_start_set_state_id =
527 perfmon_start_set_state_id_v1;
528 g->ops.pmu_ver.perfmon_start_set_flags =
529 perfmon_start_set_flags_v1;
530 g->ops.pmu_ver.perfmon_start_get_flags =
531 perfmon_start_get_flags_v1;
532 g->ops.pmu_ver.get_pmu_perfmon_cmd_init_size =
533 get_pmu_perfmon_cmd_init_size_v1;
534 g->ops.pmu_ver.get_perfmon_cmd_init_offsetofvar =
535 get_perfmon_cmd_init_offsetofvar_v1;
536 g->ops.pmu_ver.perfmon_cmd_init_set_sample_buffer =
537 perfmon_cmd_init_set_sample_buffer_v1;
538 g->ops.pmu_ver.perfmon_cmd_init_set_dec_cnt =
539 perfmon_cmd_init_set_dec_cnt_v1;
540 g->ops.pmu_ver.perfmon_cmd_init_set_base_cnt_id =
541 perfmon_cmd_init_set_base_cnt_id_v1;
542 g->ops.pmu_ver.perfmon_cmd_init_set_samp_period_us =
543 perfmon_cmd_init_set_samp_period_us_v1;
544 g->ops.pmu_ver.perfmon_cmd_init_set_num_cnt =
545 perfmon_cmd_init_set_num_cnt_v1;
546 g->ops.pmu_ver.perfmon_cmd_init_set_mov_avg =
547 perfmon_cmd_init_set_mov_avg_v1;
548 g->ops.pmu_ver.get_pmu_seq_in_a_ptr =
549 get_pmu_sequence_in_alloc_ptr_v1;
550 g->ops.pmu_ver.get_pmu_seq_out_a_ptr =
551 get_pmu_sequence_out_alloc_ptr_v1;
554 g->ops.pmu_ver.cmd_id_zbc_table_update = 14;
555 g->ops.pmu_ver.get_pmu_cmdline_args_size =
557 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq =
558 set_pmu_cmdline_args_cpufreq_v0;
559 g->ops.pmu_ver.get_pmu_cmdline_args_ptr =
560 get_pmu_cmdline_args_ptr_v0;
561 g->ops.pmu_ver.get_pmu_allocation_struct_size =
562 get_pmu_allocation_size_v0;
563 g->ops.pmu_ver.set_pmu_allocation_ptr =
564 set_pmu_allocation_ptr_v0;
565 g->ops.pmu_ver.pmu_allocation_set_dmem_size =
566 pmu_allocation_set_dmem_size_v0;
567 g->ops.pmu_ver.pmu_allocation_get_dmem_size =
568 pmu_allocation_get_dmem_size_v0;
569 g->ops.pmu_ver.pmu_allocation_get_dmem_offset =
570 pmu_allocation_get_dmem_offset_v0;
571 g->ops.pmu_ver.pmu_allocation_get_dmem_offset_addr =
572 pmu_allocation_get_dmem_offset_addr_v0;
573 g->ops.pmu_ver.pmu_allocation_set_dmem_offset =
574 pmu_allocation_set_dmem_offset_v0;
575 g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params =
576 get_pmu_init_msg_pmu_queue_params_v0;
577 g->ops.pmu_ver.get_pmu_msg_pmu_init_msg_ptr =
578 get_pmu_msg_pmu_init_msg_ptr_v0;
579 g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_off =
580 get_pmu_init_msg_pmu_sw_mg_off_v0;
581 g->ops.pmu_ver.get_pmu_init_msg_pmu_sw_mg_size =
582 get_pmu_init_msg_pmu_sw_mg_size_v0;
583 g->ops.pmu_ver.get_pmu_perfmon_cmd_start_size =
584 get_pmu_perfmon_cmd_start_size_v0;
585 g->ops.pmu_ver.get_perfmon_cmd_start_offsetofvar =
586 get_perfmon_cmd_start_offsetofvar_v0;
587 g->ops.pmu_ver.perfmon_start_set_cmd_type =
588 perfmon_start_set_cmd_type_v0;
589 g->ops.pmu_ver.perfmon_start_set_group_id =
590 perfmon_start_set_group_id_v0;
591 g->ops.pmu_ver.perfmon_start_set_state_id =
592 perfmon_start_set_state_id_v0;
593 g->ops.pmu_ver.perfmon_start_set_flags =
594 perfmon_start_set_flags_v0;
595 g->ops.pmu_ver.perfmon_start_get_flags =
596 perfmon_start_get_flags_v0;
597 g->ops.pmu_ver.get_pmu_perfmon_cmd_init_size =
598 get_pmu_perfmon_cmd_init_size_v0;
599 g->ops.pmu_ver.get_perfmon_cmd_init_offsetofvar =
600 get_perfmon_cmd_init_offsetofvar_v0;
601 g->ops.pmu_ver.perfmon_cmd_init_set_sample_buffer =
602 perfmon_cmd_init_set_sample_buffer_v0;
603 g->ops.pmu_ver.perfmon_cmd_init_set_dec_cnt =
604 perfmon_cmd_init_set_dec_cnt_v0;
605 g->ops.pmu_ver.perfmon_cmd_init_set_base_cnt_id =
606 perfmon_cmd_init_set_base_cnt_id_v0;
607 g->ops.pmu_ver.perfmon_cmd_init_set_samp_period_us =
608 perfmon_cmd_init_set_samp_period_us_v0;
609 g->ops.pmu_ver.perfmon_cmd_init_set_num_cnt =
610 perfmon_cmd_init_set_num_cnt_v0;
611 g->ops.pmu_ver.perfmon_cmd_init_set_mov_avg =
612 perfmon_cmd_init_set_mov_avg_v0;
613 g->ops.pmu_ver.get_pmu_seq_in_a_ptr =
614 get_pmu_sequence_in_alloc_ptr_v0;
615 g->ops.pmu_ver.get_pmu_seq_out_a_ptr =
616 get_pmu_sequence_out_alloc_ptr_v0;
619 gk20a_err(dev_from_gk20a(pmu->g),
620 "PMU code version not supported\n");
627 static void pmu_copy_from_dmem(struct pmu_gk20a *pmu,
628 u32 src, u8 *dst, u32 size, u8 port)
630 struct gk20a *g = pmu->g;
633 u32 *dst_u32 = (u32*)dst;
636 gk20a_err(dev_from_gk20a(g),
642 gk20a_err(dev_from_gk20a(g),
643 "src (0x%08x) not 4-byte aligned", src);
647 mutex_lock(&pmu->pmu_copy_lock);
652 addr_mask = pwr_falcon_dmemc_offs_m() |
653 pwr_falcon_dmemc_blk_m();
657 gk20a_writel(g, pwr_falcon_dmemc_r(port),
658 src | pwr_falcon_dmemc_aincr_f(1));
660 for (i = 0; i < words; i++)
661 dst_u32[i] = gk20a_readl(g, pwr_falcon_dmemd_r(port));
664 data = gk20a_readl(g, pwr_falcon_dmemd_r(port));
665 for (i = 0; i < bytes; i++) {
666 dst[(words << 2) + i] = ((u8 *)&data)[i];
669 mutex_unlock(&pmu->pmu_copy_lock);
673 static void pmu_copy_to_dmem(struct pmu_gk20a *pmu,
674 u32 dst, u8 *src, u32 size, u8 port)
676 struct gk20a *g = pmu->g;
679 u32 *src_u32 = (u32*)src;
682 gk20a_err(dev_from_gk20a(g),
688 gk20a_err(dev_from_gk20a(g),
689 "dst (0x%08x) not 4-byte aligned", dst);
693 mutex_lock(&pmu->pmu_copy_lock);
698 addr_mask = pwr_falcon_dmemc_offs_m() |
699 pwr_falcon_dmemc_blk_m();
703 gk20a_writel(g, pwr_falcon_dmemc_r(port),
704 dst | pwr_falcon_dmemc_aincw_f(1));
706 for (i = 0; i < words; i++)
707 gk20a_writel(g, pwr_falcon_dmemd_r(port), src_u32[i]);
711 for (i = 0; i < bytes; i++)
712 ((u8 *)&data)[i] = src[(words << 2) + i];
713 gk20a_writel(g, pwr_falcon_dmemd_r(port), data);
716 data = gk20a_readl(g, pwr_falcon_dmemc_r(port)) & addr_mask;
717 size = ALIGN(size, 4);
718 if (data != dst + size) {
719 gk20a_err(dev_from_gk20a(g),
720 "copy failed. bytes written %d, expected %d",
723 mutex_unlock(&pmu->pmu_copy_lock);
727 static int pmu_idle(struct pmu_gk20a *pmu)
729 struct gk20a *g = pmu->g;
730 unsigned long end_jiffies = jiffies +
731 msecs_to_jiffies(2000);
734 /* wait for pmu idle */
736 idle_stat = gk20a_readl(g, pwr_falcon_idlestate_r());
738 if (pwr_falcon_idlestate_falcon_busy_v(idle_stat) == 0 &&
739 pwr_falcon_idlestate_ext_busy_v(idle_stat) == 0) {
743 if (time_after_eq(jiffies, end_jiffies)) {
744 gk20a_err(dev_from_gk20a(g),
745 "timeout waiting pmu idle : 0x%08x",
749 usleep_range(100, 200);
752 gk20a_dbg_fn("done");
756 static void pmu_enable_irq(struct pmu_gk20a *pmu, bool enable)
758 struct gk20a *g = pmu->g;
762 gk20a_writel(g, mc_intr_mask_0_r(),
763 gk20a_readl(g, mc_intr_mask_0_r()) &
764 ~mc_intr_mask_0_pmu_enabled_f());
765 gk20a_writel(g, mc_intr_mask_1_r(),
766 gk20a_readl(g, mc_intr_mask_1_r()) &
767 ~mc_intr_mask_1_pmu_enabled_f());
769 gk20a_writel(g, pwr_falcon_irqmclr_r(),
770 pwr_falcon_irqmclr_gptmr_f(1) |
771 pwr_falcon_irqmclr_wdtmr_f(1) |
772 pwr_falcon_irqmclr_mthd_f(1) |
773 pwr_falcon_irqmclr_ctxsw_f(1) |
774 pwr_falcon_irqmclr_halt_f(1) |
775 pwr_falcon_irqmclr_exterr_f(1) |
776 pwr_falcon_irqmclr_swgen0_f(1) |
777 pwr_falcon_irqmclr_swgen1_f(1) |
778 pwr_falcon_irqmclr_ext_f(0xff));
781 /* dest 0=falcon, 1=host; level 0=irq0, 1=irq1 */
782 gk20a_writel(g, pwr_falcon_irqdest_r(),
783 pwr_falcon_irqdest_host_gptmr_f(0) |
784 pwr_falcon_irqdest_host_wdtmr_f(1) |
785 pwr_falcon_irqdest_host_mthd_f(0) |
786 pwr_falcon_irqdest_host_ctxsw_f(0) |
787 pwr_falcon_irqdest_host_halt_f(1) |
788 pwr_falcon_irqdest_host_exterr_f(0) |
789 pwr_falcon_irqdest_host_swgen0_f(1) |
790 pwr_falcon_irqdest_host_swgen1_f(0) |
791 pwr_falcon_irqdest_host_ext_f(0xff) |
792 pwr_falcon_irqdest_target_gptmr_f(1) |
793 pwr_falcon_irqdest_target_wdtmr_f(0) |
794 pwr_falcon_irqdest_target_mthd_f(0) |
795 pwr_falcon_irqdest_target_ctxsw_f(0) |
796 pwr_falcon_irqdest_target_halt_f(0) |
797 pwr_falcon_irqdest_target_exterr_f(0) |
798 pwr_falcon_irqdest_target_swgen0_f(0) |
799 pwr_falcon_irqdest_target_swgen1_f(0) |
800 pwr_falcon_irqdest_target_ext_f(0xff));
802 /* 0=disable, 1=enable */
803 gk20a_writel(g, pwr_falcon_irqmset_r(),
804 pwr_falcon_irqmset_gptmr_f(1) |
805 pwr_falcon_irqmset_wdtmr_f(1) |
806 pwr_falcon_irqmset_mthd_f(0) |
807 pwr_falcon_irqmset_ctxsw_f(0) |
808 pwr_falcon_irqmset_halt_f(1) |
809 pwr_falcon_irqmset_exterr_f(1) |
810 pwr_falcon_irqmset_swgen0_f(1) |
811 pwr_falcon_irqmset_swgen1_f(1));
813 gk20a_writel(g, mc_intr_mask_0_r(),
814 gk20a_readl(g, mc_intr_mask_0_r()) |
815 mc_intr_mask_0_pmu_enabled_f());
818 gk20a_dbg_fn("done");
821 static int pmu_enable_hw(struct pmu_gk20a *pmu, bool enable)
823 struct gk20a *g = pmu->g;
828 int retries = GR_IDLE_CHECK_MAX / GR_IDLE_CHECK_DEFAULT;
829 gk20a_enable(g, mc_enable_pwr_enabled_f());
832 u32 w = gk20a_readl(g, pwr_falcon_dmactl_r()) &
833 (pwr_falcon_dmactl_dmem_scrubbing_m() |
834 pwr_falcon_dmactl_imem_scrubbing_m());
837 gk20a_dbg_fn("done");
840 udelay(GR_IDLE_CHECK_DEFAULT);
841 } while (--retries || !tegra_platform_is_silicon());
843 gk20a_disable(g, mc_enable_pwr_enabled_f());
844 gk20a_err(dev_from_gk20a(g), "Falcon mem scrubbing timeout");
848 gk20a_disable(g, mc_enable_pwr_enabled_f());
853 static int pmu_enable(struct pmu_gk20a *pmu, bool enable)
855 struct gk20a *g = pmu->g;
862 pmc_enable = gk20a_readl(g, mc_enable_r());
863 if (mc_enable_pwr_v(pmc_enable) !=
864 mc_enable_pwr_disabled_v()) {
866 pmu_enable_irq(pmu, false);
867 pmu_enable_hw(pmu, false);
870 err = pmu_enable_hw(pmu, true);
874 /* TBD: post reset */
880 pmu_enable_irq(pmu, true);
883 gk20a_dbg_fn("done");
887 static int pmu_reset(struct pmu_gk20a *pmu)
895 /* TBD: release pmu hw mutex */
897 err = pmu_enable(pmu, false);
901 /* TBD: cancel all sequences */
902 /* TBD: init all sequences and state tables */
903 /* TBD: restore pre-init message handler */
905 err = pmu_enable(pmu, true);
912 static int pmu_bootstrap(struct pmu_gk20a *pmu)
914 struct gk20a *g = pmu->g;
915 struct gk20a_platform *platform = platform_get_drvdata(g->dev);
916 struct mm_gk20a *mm = &g->mm;
917 struct pmu_ucode_desc *desc = pmu->desc;
918 u64 addr_code, addr_data, addr_load;
919 u32 i, blocks, addr_args;
923 gk20a_writel(g, pwr_falcon_itfen_r(),
924 gk20a_readl(g, pwr_falcon_itfen_r()) |
925 pwr_falcon_itfen_ctxen_enable_f());
926 gk20a_writel(g, pwr_pmu_new_instblk_r(),
927 pwr_pmu_new_instblk_ptr_f(
928 mm->pmu.inst_block.cpu_pa >> 12) |
929 pwr_pmu_new_instblk_valid_f(1) |
930 pwr_pmu_new_instblk_target_sys_coh_f());
932 /* TBD: load all other surfaces */
934 g->ops.pmu_ver.set_pmu_cmdline_args_cpu_freq(pmu,
935 clk_get_rate(platform->clk[1]));
937 addr_args = (pwr_falcon_hwcfg_dmem_size_v(
938 gk20a_readl(g, pwr_falcon_hwcfg_r()))
939 << GK20A_PMU_DMEM_BLKSIZE2) -
940 g->ops.pmu_ver.get_pmu_cmdline_args_size(pmu);
942 pmu_copy_to_dmem(pmu, addr_args,
943 (u8 *)(g->ops.pmu_ver.get_pmu_cmdline_args_ptr(pmu)),
944 g->ops.pmu_ver.get_pmu_cmdline_args_size(pmu), 0);
946 gk20a_writel(g, pwr_falcon_dmemc_r(0),
947 pwr_falcon_dmemc_offs_f(0) |
948 pwr_falcon_dmemc_blk_f(0) |
949 pwr_falcon_dmemc_aincw_f(1));
951 addr_code = u64_lo32((pmu->ucode.pmu_va +
952 desc->app_start_offset +
953 desc->app_resident_code_offset) >> 8) ;
954 addr_data = u64_lo32((pmu->ucode.pmu_va +
955 desc->app_start_offset +
956 desc->app_resident_data_offset) >> 8);
957 addr_load = u64_lo32((pmu->ucode.pmu_va +
958 desc->bootloader_start_offset) >> 8);
960 gk20a_writel(g, pwr_falcon_dmemd_r(0), GK20A_PMU_DMAIDX_UCODE);
961 gk20a_writel(g, pwr_falcon_dmemd_r(0), addr_code);
962 gk20a_writel(g, pwr_falcon_dmemd_r(0), desc->app_size);
963 gk20a_writel(g, pwr_falcon_dmemd_r(0), desc->app_resident_code_size);
964 gk20a_writel(g, pwr_falcon_dmemd_r(0), desc->app_imem_entry);
965 gk20a_writel(g, pwr_falcon_dmemd_r(0), addr_data);
966 gk20a_writel(g, pwr_falcon_dmemd_r(0), desc->app_resident_data_size);
967 gk20a_writel(g, pwr_falcon_dmemd_r(0), addr_code);
968 gk20a_writel(g, pwr_falcon_dmemd_r(0), 0x1);
969 gk20a_writel(g, pwr_falcon_dmemd_r(0), addr_args);
971 gk20a_writel(g, pwr_falcon_dmatrfbase_r(),
972 addr_load - (desc->bootloader_imem_offset >> 8));
974 blocks = ((desc->bootloader_size + 0xFF) & ~0xFF) >> 8;
976 for (i = 0; i < blocks; i++) {
977 gk20a_writel(g, pwr_falcon_dmatrfmoffs_r(),
978 desc->bootloader_imem_offset + (i << 8));
979 gk20a_writel(g, pwr_falcon_dmatrffboffs_r(),
980 desc->bootloader_imem_offset + (i << 8));
981 gk20a_writel(g, pwr_falcon_dmatrfcmd_r(),
982 pwr_falcon_dmatrfcmd_imem_f(1) |
983 pwr_falcon_dmatrfcmd_write_f(0) |
984 pwr_falcon_dmatrfcmd_size_f(6) |
985 pwr_falcon_dmatrfcmd_ctxdma_f(GK20A_PMU_DMAIDX_UCODE));
988 gk20a_writel(g, pwr_falcon_bootvec_r(),
989 pwr_falcon_bootvec_vec_f(desc->bootloader_entry_point));
991 gk20a_writel(g, pwr_falcon_cpuctl_r(),
992 pwr_falcon_cpuctl_startcpu_f(1));
994 gk20a_writel(g, pwr_falcon_os_r(), desc->app_version);
999 static void pmu_seq_init(struct pmu_gk20a *pmu)
1004 sizeof(struct pmu_sequence) * PMU_MAX_NUM_SEQUENCES);
1005 memset(pmu->pmu_seq_tbl, 0,
1006 sizeof(pmu->pmu_seq_tbl));
1008 for (i = 0; i < PMU_MAX_NUM_SEQUENCES; i++)
1012 static int pmu_seq_acquire(struct pmu_gk20a *pmu,
1013 struct pmu_sequence **pseq)
1015 struct gk20a *g = pmu->g;
1016 struct pmu_sequence *seq;
1019 mutex_lock(&pmu->pmu_seq_lock);
1020 index = find_first_zero_bit(pmu->pmu_seq_tbl,
1021 sizeof(pmu->pmu_seq_tbl));
1022 if (index >= sizeof(pmu->pmu_seq_tbl)) {
1023 gk20a_err(dev_from_gk20a(g),
1024 "no free sequence available");
1025 mutex_unlock(&pmu->pmu_seq_lock);
1028 set_bit(index, pmu->pmu_seq_tbl);
1029 mutex_unlock(&pmu->pmu_seq_lock);
1031 seq = &pmu->seq[index];
1032 seq->state = PMU_SEQ_STATE_PENDING;
1038 static void pmu_seq_release(struct pmu_gk20a *pmu,
1039 struct pmu_sequence *seq)
1041 struct gk20a *g = pmu->g;
1042 seq->state = PMU_SEQ_STATE_FREE;
1043 seq->desc = PMU_INVALID_SEQ_DESC;
1044 seq->callback = NULL;
1045 seq->cb_params = NULL;
1047 seq->out_payload = NULL;
1048 g->ops.pmu_ver.pmu_allocation_set_dmem_size(pmu,
1049 g->ops.pmu_ver.get_pmu_seq_in_a_ptr(seq), 0);
1050 g->ops.pmu_ver.pmu_allocation_set_dmem_size(pmu,
1051 g->ops.pmu_ver.get_pmu_seq_out_a_ptr(seq), 0);
1053 clear_bit(seq->id, pmu->pmu_seq_tbl);
1056 static int pmu_queue_init(struct pmu_gk20a *pmu,
1057 u32 id, union pmu_init_msg_pmu *init)
1059 struct gk20a *g = pmu->g;
1060 struct pmu_queue *queue = &pmu->queue[id];
1062 g->ops.pmu_ver.get_pmu_init_msg_pmu_queue_params(queue, id, init);
1064 queue->mutex_id = id;
1065 mutex_init(&queue->mutex);
1067 gk20a_dbg_pmu("queue %d: index %d, offset 0x%08x, size 0x%08x",
1068 id, queue->index, queue->offset, queue->size);
1073 static int pmu_queue_head(struct pmu_gk20a *pmu, struct pmu_queue *queue,
1074 u32 *head, bool set)
1076 struct gk20a *g = pmu->g;
1080 if (PMU_IS_COMMAND_QUEUE(queue->id)) {
1082 if (queue->index >= pwr_pmu_queue_head__size_1_v())
1086 *head = pwr_pmu_queue_head_address_v(
1088 pwr_pmu_queue_head_r(queue->index)));
1091 pwr_pmu_queue_head_r(queue->index),
1092 pwr_pmu_queue_head_address_f(*head));
1095 *head = pwr_pmu_msgq_head_val_v(
1096 gk20a_readl(g, pwr_pmu_msgq_head_r()));
1099 pwr_pmu_msgq_head_r(),
1100 pwr_pmu_msgq_head_val_f(*head));
1106 static int pmu_queue_tail(struct pmu_gk20a *pmu, struct pmu_queue *queue,
1107 u32 *tail, bool set)
1109 struct gk20a *g = pmu->g;
1113 if (PMU_IS_COMMAND_QUEUE(queue->id)) {
1115 if (queue->index >= pwr_pmu_queue_tail__size_1_v())
1119 *tail = pwr_pmu_queue_tail_address_v(
1121 pwr_pmu_queue_tail_r(queue->index)));
1124 pwr_pmu_queue_tail_r(queue->index),
1125 pwr_pmu_queue_tail_address_f(*tail));
1128 *tail = pwr_pmu_msgq_tail_val_v(
1129 gk20a_readl(g, pwr_pmu_msgq_tail_r()));
1132 pwr_pmu_msgq_tail_r(),
1133 pwr_pmu_msgq_tail_val_f(*tail));
1139 static inline void pmu_queue_read(struct pmu_gk20a *pmu,
1140 u32 offset, u8 *dst, u32 size)
1142 pmu_copy_from_dmem(pmu, offset, dst, size, 0);
1145 static inline void pmu_queue_write(struct pmu_gk20a *pmu,
1146 u32 offset, u8 *src, u32 size)
1148 pmu_copy_to_dmem(pmu, offset, src, size, 0);
1151 int pmu_mutex_acquire(struct pmu_gk20a *pmu, u32 id, u32 *token)
1153 struct gk20a *g = pmu->g;
1154 struct pmu_mutex *mutex;
1155 u32 data, owner, max_retry;
1157 if (!pmu->initialized)
1161 BUG_ON(!PMU_MUTEX_ID_IS_VALID(id));
1162 BUG_ON(id > pmu->mutex_cnt);
1164 mutex = &pmu->mutex[id];
1166 owner = pwr_pmu_mutex_value_v(
1167 gk20a_readl(g, pwr_pmu_mutex_r(mutex->index)));
1169 if (*token != PMU_INVALID_MUTEX_OWNER_ID && *token == owner) {
1170 BUG_ON(mutex->ref_cnt == 0);
1171 gk20a_dbg_pmu("already acquired by owner : 0x%08x", *token);
1178 data = pwr_pmu_mutex_id_value_v(
1179 gk20a_readl(g, pwr_pmu_mutex_id_r()));
1180 if (data == pwr_pmu_mutex_id_value_init_v() ||
1181 data == pwr_pmu_mutex_id_value_not_avail_v()) {
1182 gk20a_warn(dev_from_gk20a(g),
1183 "fail to generate mutex token: val 0x%08x",
1185 usleep_range(20, 40);
1190 gk20a_writel(g, pwr_pmu_mutex_r(mutex->index),
1191 pwr_pmu_mutex_value_f(owner));
1193 data = pwr_pmu_mutex_value_v(
1194 gk20a_readl(g, pwr_pmu_mutex_r(mutex->index)));
1196 if (owner == data) {
1198 gk20a_dbg_pmu("mutex acquired: id=%d, token=0x%x",
1199 mutex->index, *token);
1203 gk20a_dbg_info("fail to acquire mutex idx=0x%08x",
1206 data = gk20a_readl(g, pwr_pmu_mutex_id_release_r());
1207 data = set_field(data,
1208 pwr_pmu_mutex_id_release_value_m(),
1209 pwr_pmu_mutex_id_release_value_f(owner));
1210 gk20a_writel(g, pwr_pmu_mutex_id_release_r(), data);
1212 usleep_range(20, 40);
1215 } while (max_retry-- > 0);
1220 int pmu_mutex_release(struct pmu_gk20a *pmu, u32 id, u32 *token)
1222 struct gk20a *g = pmu->g;
1223 struct pmu_mutex *mutex;
1226 if (!pmu->initialized)
1230 BUG_ON(!PMU_MUTEX_ID_IS_VALID(id));
1231 BUG_ON(id > pmu->mutex_cnt);
1233 mutex = &pmu->mutex[id];
1235 owner = pwr_pmu_mutex_value_v(
1236 gk20a_readl(g, pwr_pmu_mutex_r(mutex->index)));
1238 if (*token != owner) {
1239 gk20a_err(dev_from_gk20a(g),
1240 "requester 0x%08x NOT match owner 0x%08x",
1245 if (--mutex->ref_cnt == 0) {
1246 gk20a_writel(g, pwr_pmu_mutex_r(mutex->index),
1247 pwr_pmu_mutex_value_initial_lock_f());
1249 data = gk20a_readl(g, pwr_pmu_mutex_id_release_r());
1250 data = set_field(data, pwr_pmu_mutex_id_release_value_m(),
1251 pwr_pmu_mutex_id_release_value_f(owner));
1252 gk20a_writel(g, pwr_pmu_mutex_id_release_r(), data);
1254 gk20a_dbg_pmu("mutex released: id=%d, token=0x%x",
1255 mutex->index, *token);
1261 static int pmu_queue_lock(struct pmu_gk20a *pmu,
1262 struct pmu_queue *queue)
1266 if (PMU_IS_MESSAGE_QUEUE(queue->id))
1269 if (PMU_IS_SW_COMMAND_QUEUE(queue->id)) {
1270 mutex_lock(&queue->mutex);
1274 err = pmu_mutex_acquire(pmu, queue->mutex_id, &queue->mutex_lock);
1278 static int pmu_queue_unlock(struct pmu_gk20a *pmu,
1279 struct pmu_queue *queue)
1283 if (PMU_IS_MESSAGE_QUEUE(queue->id))
1286 if (PMU_IS_SW_COMMAND_QUEUE(queue->id)) {
1287 mutex_unlock(&queue->mutex);
1291 err = pmu_mutex_release(pmu, queue->mutex_id, &queue->mutex_lock);
1295 /* called by pmu_read_message, no lock */
1296 static bool pmu_queue_is_empty(struct pmu_gk20a *pmu,
1297 struct pmu_queue *queue)
1301 pmu_queue_head(pmu, queue, &head, QUEUE_GET);
1302 if (queue->opened && queue->oflag == OFLAG_READ)
1303 tail = queue->position;
1305 pmu_queue_tail(pmu, queue, &tail, QUEUE_GET);
1307 return head == tail;
1310 static bool pmu_queue_has_room(struct pmu_gk20a *pmu,
1311 struct pmu_queue *queue, u32 size, bool *need_rewind)
1313 u32 head, tail, free;
1314 bool rewind = false;
1316 size = ALIGN(size, QUEUE_ALIGNMENT);
1318 pmu_queue_head(pmu, queue, &head, QUEUE_GET);
1319 pmu_queue_tail(pmu, queue, &tail, QUEUE_GET);
1322 free = queue->offset + queue->size - head;
1323 free -= PMU_CMD_HDR_SIZE;
1327 head = queue->offset;
1332 free = tail - head - 1;
1335 *need_rewind = rewind;
1337 return size <= free;
1340 static int pmu_queue_push(struct pmu_gk20a *pmu,
1341 struct pmu_queue *queue, void *data, u32 size)
1345 if (!queue->opened && queue->oflag == OFLAG_WRITE){
1346 gk20a_err(dev_from_gk20a(pmu->g),
1347 "queue not opened for write");
1351 pmu_queue_write(pmu, queue->position, data, size);
1352 queue->position += ALIGN(size, QUEUE_ALIGNMENT);
1356 static int pmu_queue_pop(struct pmu_gk20a *pmu,
1357 struct pmu_queue *queue, void *data, u32 size,
1360 u32 head, tail, used;
1364 if (!queue->opened && queue->oflag == OFLAG_READ){
1365 gk20a_err(dev_from_gk20a(pmu->g),
1366 "queue not opened for read");
1370 pmu_queue_head(pmu, queue, &head, QUEUE_GET);
1371 tail = queue->position;
1379 used = queue->offset + queue->size - tail;
1382 gk20a_warn(dev_from_gk20a(pmu->g),
1383 "queue size smaller than request read");
1387 pmu_queue_read(pmu, tail, data, size);
1388 queue->position += ALIGN(size, QUEUE_ALIGNMENT);
1393 static void pmu_queue_rewind(struct pmu_gk20a *pmu,
1394 struct pmu_queue *queue)
1400 if (!queue->opened) {
1401 gk20a_err(dev_from_gk20a(pmu->g),
1402 "queue not opened");
1406 if (queue->oflag == OFLAG_WRITE) {
1407 cmd.hdr.unit_id = PMU_UNIT_REWIND;
1408 cmd.hdr.size = PMU_CMD_HDR_SIZE;
1409 pmu_queue_push(pmu, queue, &cmd, cmd.hdr.size);
1410 gk20a_dbg_pmu("queue %d rewinded", queue->id);
1413 queue->position = queue->offset;
1417 /* open for read and lock the queue */
1418 static int pmu_queue_open_read(struct pmu_gk20a *pmu,
1419 struct pmu_queue *queue)
1423 err = pmu_queue_lock(pmu, queue);
1430 pmu_queue_tail(pmu, queue, &queue->position, QUEUE_GET);
1431 queue->oflag = OFLAG_READ;
1432 queue->opened = true;
1437 /* open for write and lock the queue
1438 make sure there's enough free space for the write */
1439 static int pmu_queue_open_write(struct pmu_gk20a *pmu,
1440 struct pmu_queue *queue, u32 size)
1442 bool rewind = false;
1445 err = pmu_queue_lock(pmu, queue);
1452 if (!pmu_queue_has_room(pmu, queue, size, &rewind)) {
1453 gk20a_err(dev_from_gk20a(pmu->g), "queue full");
1457 pmu_queue_head(pmu, queue, &queue->position, QUEUE_GET);
1458 queue->oflag = OFLAG_WRITE;
1459 queue->opened = true;
1462 pmu_queue_rewind(pmu, queue);
1467 /* close and unlock the queue */
1468 static int pmu_queue_close(struct pmu_gk20a *pmu,
1469 struct pmu_queue *queue, bool commit)
1475 if (queue->oflag == OFLAG_READ) {
1476 pmu_queue_tail(pmu, queue,
1477 &queue->position, QUEUE_SET);
1480 pmu_queue_head(pmu, queue,
1481 &queue->position, QUEUE_SET);
1485 queue->opened = false;
1487 pmu_queue_unlock(pmu, queue);
1492 void gk20a_remove_pmu_support(struct pmu_gk20a *pmu)
1496 gk20a_allocator_destroy(&pmu->dmem);
1499 int gk20a_init_pmu_reset_enable_hw(struct gk20a *g)
1501 struct pmu_gk20a *pmu = &g->pmu;
1505 pmu_enable_hw(pmu, true);
1510 int gk20a_init_pmu_setup_sw(struct gk20a *g)
1512 struct pmu_gk20a *pmu = &g->pmu;
1513 struct mm_gk20a *mm = &g->mm;
1514 struct vm_gk20a *vm = &mm->pmu.vm;
1515 struct device *d = dev_from_gk20a(g);
1519 struct sg_table *sgt_pmu_ucode;
1520 struct sg_table *sgt_seq_buf;
1521 DEFINE_DMA_ATTRS(attrs);
1526 /* start with elpg disabled until first enable call */
1527 mutex_init(&pmu->elpg_mutex);
1528 pmu->elpg_refcnt = 0;
1530 if (pmu->sw_ready) {
1531 for (i = 0; i < pmu->mutex_cnt; i++) {
1532 pmu->mutex[i].id = i;
1533 pmu->mutex[i].index = i;
1537 gk20a_dbg_fn("skip init");
1541 /* no infoRom script from vbios? */
1543 /* TBD: sysmon subtask */
1545 pmu->mutex_cnt = pwr_pmu_mutex__size_1_v();
1546 pmu->mutex = kzalloc(pmu->mutex_cnt *
1547 sizeof(struct pmu_mutex), GFP_KERNEL);
1553 for (i = 0; i < pmu->mutex_cnt; i++) {
1554 pmu->mutex[i].id = i;
1555 pmu->mutex[i].index = i;
1558 pmu->seq = kzalloc(PMU_MAX_NUM_SEQUENCES *
1559 sizeof(struct pmu_sequence), GFP_KERNEL);
1562 goto err_free_mutex;
1568 g->pmu_fw = gk20a_request_firmware(g, GK20A_PMU_UCODE_IMAGE);
1570 gk20a_err(d, "failed to load pmu ucode!!");
1576 gk20a_dbg_fn("firmware loaded");
1578 pmu->desc = (struct pmu_ucode_desc *)g->pmu_fw->data;
1579 pmu->ucode_image = (u32 *)((u8 *)pmu->desc +
1580 pmu->desc->descriptor_size);
1582 INIT_WORK(&pmu->pg_init, pmu_setup_hw);
1584 gk20a_init_pmu_vm(mm);
1586 dma_set_attr(DMA_ATTR_READ_ONLY, &attrs);
1587 pmu->ucode.cpuva = dma_alloc_attrs(d, GK20A_PMU_UCODE_SIZE_MAX,
1591 if (!pmu->ucode.cpuva) {
1592 gk20a_err(d, "failed to allocate memory\n");
1594 goto err_release_fw;
1597 pmu->ucode.iova = iova;
1598 pmu->seq_buf.cpuva = dma_alloc_coherent(d, GK20A_PMU_SEQ_BUF_SIZE,
1601 if (!pmu->seq_buf.cpuva) {
1602 gk20a_err(d, "failed to allocate memory\n");
1604 goto err_free_pmu_ucode;
1607 pmu->seq_buf.iova = iova;
1609 err = gk20a_get_sgtable(d, &sgt_pmu_ucode,
1612 GK20A_PMU_UCODE_SIZE_MAX);
1614 gk20a_err(d, "failed to allocate sg table\n");
1615 goto err_free_seq_buf;
1618 pmu->ucode.pmu_va = gk20a_gmmu_map(vm, &sgt_pmu_ucode,
1619 GK20A_PMU_UCODE_SIZE_MAX,
1621 gk20a_mem_flag_read_only);
1622 if (!pmu->ucode.pmu_va) {
1623 gk20a_err(d, "failed to map pmu ucode memory!!");
1624 goto err_free_ucode_sgt;
1627 err = gk20a_get_sgtable(d, &sgt_seq_buf,
1630 GK20A_PMU_SEQ_BUF_SIZE);
1632 gk20a_err(d, "failed to allocate sg table\n");
1633 goto err_unmap_ucode;
1636 pmu->seq_buf.pmu_va = gk20a_gmmu_map(vm, &sgt_seq_buf,
1637 GK20A_PMU_SEQ_BUF_SIZE,
1639 gk20a_mem_flag_none);
1640 if (!pmu->seq_buf.pmu_va) {
1641 gk20a_err(d, "failed to map pmu ucode memory!!");
1642 goto err_free_seq_buf_sgt;
1645 ptr = (u8 *)pmu->seq_buf.cpuva;
1647 gk20a_err(d, "failed to map cpu ptr for zbc buffer");
1648 goto err_unmap_seq_buf;
1651 /* TBD: remove this if ZBC save/restore is handled by PMU
1652 * end an empty ZBC sequence for now */
1653 ptr[0] = 0x16; /* opcode EXIT */
1654 ptr[1] = 0; ptr[2] = 1; ptr[3] = 0;
1655 ptr[4] = 0; ptr[5] = 0; ptr[6] = 0; ptr[7] = 0;
1657 pmu->seq_buf.size = GK20A_PMU_SEQ_BUF_SIZE;
1659 ucode_ptr = pmu->ucode.cpuva;
1661 for (i = 0; i < (pmu->desc->app_start_offset +
1662 pmu->desc->app_size) >> 2; i++)
1663 gk20a_mem_wr32(ucode_ptr, i, pmu->ucode_image[i]);
1665 gk20a_free_sgtable(&sgt_pmu_ucode);
1666 gk20a_free_sgtable(&sgt_seq_buf);
1668 pmu->sw_ready = true;
1671 mutex_init(&pmu->isr_mutex);
1672 mutex_init(&pmu->isr_enable_lock);
1673 mutex_init(&pmu->pmu_copy_lock);
1674 mutex_init(&pmu->pmu_seq_lock);
1676 pmu->perfmon_counter.index = 3; /* GR & CE2 */
1677 pmu->perfmon_counter.group_id = PMU_DOMAIN_GROUP_PSTATE;
1679 pmu->remove_support = gk20a_remove_pmu_support;
1680 err = gk20a_init_pmu(pmu);
1682 gk20a_err(d, "failed to set function pointers\n");
1686 gk20a_dbg_fn("done");
1690 gk20a_gmmu_unmap(vm, pmu->seq_buf.pmu_va,
1691 GK20A_PMU_SEQ_BUF_SIZE, gk20a_mem_flag_none);
1692 err_free_seq_buf_sgt:
1693 gk20a_free_sgtable(&sgt_seq_buf);
1695 gk20a_gmmu_unmap(vm, pmu->ucode.pmu_va,
1696 GK20A_PMU_UCODE_SIZE_MAX, gk20a_mem_flag_none);
1698 gk20a_free_sgtable(&sgt_pmu_ucode);
1700 dma_free_coherent(d, GK20A_PMU_SEQ_BUF_SIZE,
1701 pmu->seq_buf.cpuva, pmu->seq_buf.iova);
1702 pmu->seq_buf.cpuva = NULL;
1703 pmu->seq_buf.iova = 0;
1705 dma_free_attrs(d, GK20A_PMU_UCODE_SIZE_MAX,
1706 pmu->ucode.cpuva, pmu->ucode.iova, &attrs);
1707 pmu->ucode.cpuva = NULL;
1708 pmu->ucode.iova = 0;
1710 release_firmware(g->pmu_fw);
1716 gk20a_dbg_fn("fail");
1720 static void pmu_handle_pg_elpg_msg(struct gk20a *g, struct pmu_msg *msg,
1721 void *param, u32 handle, u32 status);
1723 static void pmu_handle_pg_buf_config_msg(struct gk20a *g, struct pmu_msg *msg,
1724 void *param, u32 handle, u32 status)
1726 struct pmu_gk20a *pmu = param;
1727 struct pmu_pg_msg_eng_buf_stat *eng_buf_stat = &msg->msg.pg.eng_buf_stat;
1731 gk20a_dbg_pmu("reply PMU_PG_CMD_ID_ENG_BUF_LOAD PMU_PGENG_GR_BUFFER_IDX_FECS");
1733 gk20a_err(dev_from_gk20a(g), "PGENG cmd aborted");
1734 /* TBD: disable ELPG */
1738 if (eng_buf_stat->status == PMU_PG_MSG_ENG_BUF_FAILED) {
1739 gk20a_err(dev_from_gk20a(g), "failed to load PGENG buffer");
1742 pmu->buf_loaded = (eng_buf_stat->status == PMU_PG_MSG_ENG_BUF_LOADED);
1743 schedule_work(&pmu->pg_init);
1746 int gk20a_init_pmu_setup_hw1(struct gk20a *g)
1748 struct pmu_gk20a *pmu = &g->pmu;
1753 mutex_lock(&pmu->isr_enable_lock);
1755 pmu->isr_enabled = true;
1756 mutex_unlock(&pmu->isr_enable_lock);
1758 /* setup apertures - virtual */
1759 gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_UCODE),
1760 pwr_fbif_transcfg_mem_type_virtual_f());
1761 gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_VIRT),
1762 pwr_fbif_transcfg_mem_type_virtual_f());
1763 /* setup apertures - physical */
1764 gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_PHYS_VID),
1765 pwr_fbif_transcfg_mem_type_physical_f() |
1766 pwr_fbif_transcfg_target_local_fb_f());
1767 gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_PHYS_SYS_COH),
1768 pwr_fbif_transcfg_mem_type_physical_f() |
1769 pwr_fbif_transcfg_target_coherent_sysmem_f());
1770 gk20a_writel(g, pwr_fbif_transcfg_r(GK20A_PMU_DMAIDX_PHYS_SYS_NCOH),
1771 pwr_fbif_transcfg_mem_type_physical_f() |
1772 pwr_fbif_transcfg_target_noncoherent_sysmem_f());
1774 /* TBD: load pmu ucode */
1775 err = pmu_bootstrap(pmu);
1783 static int gk20a_aelpg_init(struct gk20a *g);
1784 static int gk20a_aelpg_init_and_enable(struct gk20a *g, u8 ctrl_id);
1786 static void pmu_setup_hw_load_zbc(struct gk20a *g);
1787 static void pmu_setup_hw_enable_elpg(struct gk20a *g);
1789 static void pmu_setup_hw(struct work_struct *work)
1791 struct pmu_gk20a *pmu = container_of(work, struct pmu_gk20a, pg_init);
1792 struct gk20a *g = pmu->g;
1794 switch (pmu->pmu_state) {
1795 case PMU_STATE_ELPG_BOOTED:
1796 gk20a_dbg_pmu("elpg booted");
1797 gk20a_init_pmu_bind_fecs(g);
1799 case PMU_STATE_LOADING_PG_BUF:
1800 gk20a_dbg_pmu("loaded pg buf");
1801 pmu_setup_hw_load_zbc(g);
1803 case PMU_STATE_LOADING_ZBC:
1804 gk20a_dbg_pmu("loaded zbc");
1805 pmu_setup_hw_enable_elpg(g);
1807 case PMU_STATE_STARTED:
1808 gk20a_dbg_pmu("PMU booted");
1811 gk20a_dbg_pmu("invalid state");
1816 int gk20a_init_pmu_bind_fecs(struct gk20a *g)
1818 struct pmu_gk20a *pmu = &g->pmu;
1819 struct mm_gk20a *mm = &g->mm;
1820 struct vm_gk20a *vm = &mm->pmu.vm;
1821 struct device *d = dev_from_gk20a(g);
1826 struct sg_table *sgt_pg_buf;
1832 gk20a_gr_wait_initialized(g);
1833 err = gr_gk20a_fecs_get_reglist_img_size(g, &size);
1835 gk20a_err(dev_from_gk20a(g),
1836 "fail to query fecs pg buffer size");
1840 if (!pmu->pg_buf.cpuva) {
1841 pmu->pg_buf.cpuva = dma_alloc_coherent(d, size,
1844 if (!pmu->pg_buf.cpuva) {
1845 gk20a_err(d, "failed to allocate memory\n");
1849 pmu->pg_buf.iova = iova;
1850 pmu->pg_buf.size = size;
1852 err = gk20a_get_sgtable(d, &sgt_pg_buf,
1857 gk20a_err(d, "failed to create sg table\n");
1858 goto err_free_pg_buf;
1861 pmu->pg_buf.pmu_va = gk20a_gmmu_map(vm,
1865 gk20a_mem_flag_none);
1866 if (!pmu->pg_buf.pmu_va) {
1867 gk20a_err(d, "failed to map fecs pg buffer");
1869 goto err_free_sgtable;
1872 gk20a_free_sgtable(&sgt_pg_buf);
1875 err = gr_gk20a_fecs_set_reglist_bind_inst(g, mm->pmu.inst_block.cpu_pa);
1877 gk20a_err(dev_from_gk20a(g),
1878 "fail to bind pmu inst to gr");
1882 err = gr_gk20a_fecs_set_reglist_virtual_addr(g, pmu->pg_buf.pmu_va);
1884 gk20a_err(dev_from_gk20a(g),
1885 "fail to set pg buffer pmu va");
1889 memset(&cmd, 0, sizeof(struct pmu_cmd));
1890 cmd.hdr.unit_id = PMU_UNIT_PG;
1891 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_eng_buf_load);
1892 cmd.cmd.pg.eng_buf_load.cmd_type = PMU_PG_CMD_ID_ENG_BUF_LOAD;
1893 cmd.cmd.pg.eng_buf_load.engine_id = ENGINE_GR_GK20A;
1894 cmd.cmd.pg.eng_buf_load.buf_idx = PMU_PGENG_GR_BUFFER_IDX_FECS;
1895 cmd.cmd.pg.eng_buf_load.buf_size = pmu->pg_buf.size;
1896 cmd.cmd.pg.eng_buf_load.dma_base = u64_lo32(pmu->pg_buf.pmu_va >> 8);
1897 cmd.cmd.pg.eng_buf_load.dma_offset = (u8)(pmu->pg_buf.pmu_va & 0xFF);
1898 cmd.cmd.pg.eng_buf_load.dma_idx = PMU_DMAIDX_VIRT;
1900 pmu->buf_loaded = false;
1901 gk20a_dbg_pmu("cmd post PMU_PG_CMD_ID_ENG_BUF_LOAD PMU_PGENG_GR_BUFFER_IDX_FECS");
1902 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_LPQ,
1903 pmu_handle_pg_buf_config_msg, pmu, &desc, ~0);
1904 pmu->pmu_state = PMU_STATE_LOADING_PG_BUF;
1908 gk20a_free_sgtable(&sgt_pg_buf);
1910 dma_free_coherent(d, size,
1911 pmu->pg_buf.cpuva, pmu->pg_buf.iova);
1912 pmu->pg_buf.cpuva = NULL;
1913 pmu->pg_buf.iova = 0;
1917 static void pmu_setup_hw_load_zbc(struct gk20a *g)
1919 struct pmu_gk20a *pmu = &g->pmu;
1923 memset(&cmd, 0, sizeof(struct pmu_cmd));
1924 cmd.hdr.unit_id = PMU_UNIT_PG;
1925 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_eng_buf_load);
1926 cmd.cmd.pg.eng_buf_load.cmd_type = PMU_PG_CMD_ID_ENG_BUF_LOAD;
1927 cmd.cmd.pg.eng_buf_load.engine_id = ENGINE_GR_GK20A;
1928 cmd.cmd.pg.eng_buf_load.buf_idx = PMU_PGENG_GR_BUFFER_IDX_ZBC;
1929 cmd.cmd.pg.eng_buf_load.buf_size = pmu->seq_buf.size;
1930 cmd.cmd.pg.eng_buf_load.dma_base = u64_lo32(pmu->seq_buf.pmu_va >> 8);
1931 cmd.cmd.pg.eng_buf_load.dma_offset = (u8)(pmu->seq_buf.pmu_va & 0xFF);
1932 cmd.cmd.pg.eng_buf_load.dma_idx = PMU_DMAIDX_VIRT;
1934 pmu->buf_loaded = false;
1935 gk20a_dbg_pmu("cmd post PMU_PG_CMD_ID_ENG_BUF_LOAD PMU_PGENG_GR_BUFFER_IDX_ZBC");
1936 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_LPQ,
1937 pmu_handle_pg_buf_config_msg, pmu, &desc, ~0);
1938 pmu->pmu_state = PMU_STATE_LOADING_ZBC;
1941 static void pmu_setup_hw_enable_elpg(struct gk20a *g)
1943 struct pmu_gk20a *pmu = &g->pmu;
1946 * FIXME: To enable ELPG, we increase the PMU ext2priv timeout unit to
1947 * 7. This prevents PMU stalling on Host register accesses. Once the
1948 * cause for this hang is discovered and fixed, this WAR should be
1951 gk20a_writel(g, 0x10a164, 0x109ff);
1953 pmu->initialized = true;
1954 pmu->pmu_state = PMU_STATE_STARTED;
1956 pmu->zbc_ready = true;
1957 /* Save zbc table after PMU is initialized. */
1958 gr_gk20a_pmu_save_zbc(g, 0xf);
1960 if (g->elpg_enabled)
1961 gk20a_pmu_enable_elpg(g);
1966 if (g->aelpg_enabled) {
1967 gk20a_aelpg_init(g);
1968 gk20a_aelpg_init_and_enable(g, PMU_AP_CTRL_ID_GRAPHICS);
1971 wake_up(&g->pmu.boot_wq);
1974 int gk20a_init_pmu_support(struct gk20a *g)
1976 struct pmu_gk20a *pmu = &g->pmu;
1981 if (pmu->initialized)
1986 err = gk20a_init_pmu_reset_enable_hw(g);
1990 if (support_gk20a_pmu()) {
1991 err = gk20a_init_pmu_setup_sw(g);
1995 err = gk20a_init_pmu_setup_hw1(g);
1999 pmu->pmu_state = PMU_STATE_STARTING;
2005 static void pmu_handle_pg_elpg_msg(struct gk20a *g, struct pmu_msg *msg,
2006 void *param, u32 handle, u32 status)
2008 struct pmu_gk20a *pmu = param;
2009 struct pmu_pg_msg_elpg_msg *elpg_msg = &msg->msg.pg.elpg_msg;
2014 gk20a_err(dev_from_gk20a(g), "ELPG cmd aborted");
2015 /* TBD: disable ELPG */
2019 switch (elpg_msg->msg) {
2020 case PMU_PG_ELPG_MSG_INIT_ACK:
2021 gk20a_dbg_pmu("INIT_PG is acknowledged from PMU");
2023 case PMU_PG_ELPG_MSG_ALLOW_ACK:
2024 gk20a_dbg_pmu("ALLOW is acknowledged from PMU");
2025 pmu->elpg_stat = PMU_ELPG_STAT_ON;
2027 case PMU_PG_ELPG_MSG_DISALLOW_ACK:
2028 gk20a_dbg_pmu("DISALLOW is acknowledged from PMU");
2029 pmu->elpg_stat = PMU_ELPG_STAT_OFF;
2030 if (pmu->pmu_state == PMU_STATE_ELPG_BOOTING)
2031 pmu->pmu_state = PMU_STATE_ELPG_BOOTED;
2032 schedule_work(&pmu->pg_init);
2035 gk20a_err(dev_from_gk20a(g),
2036 "unsupported ELPG message : 0x%04x", elpg_msg->msg);
2042 static void pmu_handle_pg_stat_msg(struct gk20a *g, struct pmu_msg *msg,
2043 void *param, u32 handle, u32 status)
2045 struct pmu_gk20a *pmu = param;
2050 gk20a_err(dev_from_gk20a(g), "ELPG cmd aborted");
2051 /* TBD: disable ELPG */
2055 switch (msg->msg.pg.stat.sub_msg_id) {
2056 case PMU_PG_STAT_MSG_RESP_DMEM_OFFSET:
2057 gk20a_dbg_pmu("ALLOC_DMEM_OFFSET is acknowledged from PMU");
2058 pmu->stat_dmem_offset = msg->msg.pg.stat.data;
2065 static int pmu_init_powergating(struct pmu_gk20a *pmu)
2067 struct gk20a *g = pmu->g;
2073 if (tegra_cpu_is_asim()) {
2074 /* TBD: calculate threshold for silicon */
2075 gk20a_writel(g, pwr_pmu_pg_idlefilth_r(ENGINE_GR_GK20A),
2076 PMU_PG_IDLE_THRESHOLD_SIM);
2077 gk20a_writel(g, pwr_pmu_pg_ppuidlefilth_r(ENGINE_GR_GK20A),
2078 PMU_PG_POST_POWERUP_IDLE_THRESHOLD_SIM);
2080 /* TBD: calculate threshold for silicon */
2081 gk20a_writel(g, pwr_pmu_pg_idlefilth_r(ENGINE_GR_GK20A),
2082 PMU_PG_IDLE_THRESHOLD);
2083 gk20a_writel(g, pwr_pmu_pg_ppuidlefilth_r(ENGINE_GR_GK20A),
2084 PMU_PG_POST_POWERUP_IDLE_THRESHOLD);
2088 memset(&cmd, 0, sizeof(struct pmu_cmd));
2089 cmd.hdr.unit_id = PMU_UNIT_PG;
2090 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
2091 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
2092 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A;
2093 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_INIT;
2095 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_INIT");
2096 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
2097 pmu_handle_pg_elpg_msg, pmu, &seq, ~0);
2099 /* alloc dmem for powergating state log */
2100 pmu->stat_dmem_offset = 0;
2101 memset(&cmd, 0, sizeof(struct pmu_cmd));
2102 cmd.hdr.unit_id = PMU_UNIT_PG;
2103 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_stat);
2104 cmd.cmd.pg.stat.cmd_type = PMU_PG_CMD_ID_PG_STAT;
2105 cmd.cmd.pg.stat.engine_id = ENGINE_GR_GK20A;
2106 cmd.cmd.pg.stat.sub_cmd_id = PMU_PG_STAT_CMD_ALLOC_DMEM;
2107 cmd.cmd.pg.stat.data = 0;
2109 gk20a_dbg_pmu("cmd post PMU_PG_STAT_CMD_ALLOC_DMEM");
2110 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_LPQ,
2111 pmu_handle_pg_stat_msg, pmu, &seq, ~0);
2113 /* disallow ELPG initially
2114 PMU ucode requires a disallow cmd before allow cmd */
2115 pmu->elpg_stat = PMU_ELPG_STAT_OFF; /* set for wait_event PMU_ELPG_STAT_OFF */
2116 memset(&cmd, 0, sizeof(struct pmu_cmd));
2117 cmd.hdr.unit_id = PMU_UNIT_PG;
2118 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
2119 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
2120 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A;
2121 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_DISALLOW;
2123 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_DISALLOW");
2124 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
2125 pmu_handle_pg_elpg_msg, pmu, &seq, ~0);
2127 /* start with elpg disabled until first enable call */
2128 pmu->elpg_refcnt = 0;
2130 pmu->pmu_state = PMU_STATE_ELPG_BOOTING;
2135 static int pmu_init_perfmon(struct pmu_gk20a *pmu)
2137 struct gk20a *g = pmu->g;
2138 struct pmu_v *pv = &g->ops.pmu_ver;
2140 struct pmu_payload payload;
2147 pmu->perfmon_ready = 0;
2149 /* use counter #3 for GR && CE2 busy cycles */
2150 gk20a_writel(g, pwr_pmu_idle_mask_r(3),
2151 pwr_pmu_idle_mask_gr_enabled_f() |
2152 pwr_pmu_idle_mask_ce_2_enabled_f());
2154 /* disable idle filtering for counters 3 and 6 */
2155 data = gk20a_readl(g, pwr_pmu_idle_ctrl_r(3));
2156 data = set_field(data, pwr_pmu_idle_ctrl_value_m() |
2157 pwr_pmu_idle_ctrl_filter_m(),
2158 pwr_pmu_idle_ctrl_value_busy_f() |
2159 pwr_pmu_idle_ctrl_filter_disabled_f());
2160 gk20a_writel(g, pwr_pmu_idle_ctrl_r(3), data);
2162 /* use counter #6 for total cycles */
2163 data = gk20a_readl(g, pwr_pmu_idle_ctrl_r(6));
2164 data = set_field(data, pwr_pmu_idle_ctrl_value_m() |
2165 pwr_pmu_idle_ctrl_filter_m(),
2166 pwr_pmu_idle_ctrl_value_always_f() |
2167 pwr_pmu_idle_ctrl_filter_disabled_f());
2168 gk20a_writel(g, pwr_pmu_idle_ctrl_r(6), data);
2171 * We don't want to disturb counters #3 and #6, which are used by
2172 * perfmon, so we add wiring also to counters #1 and #2 for
2173 * exposing raw counter readings.
2175 gk20a_writel(g, pwr_pmu_idle_mask_r(1),
2176 pwr_pmu_idle_mask_gr_enabled_f() |
2177 pwr_pmu_idle_mask_ce_2_enabled_f());
2179 data = gk20a_readl(g, pwr_pmu_idle_ctrl_r(1));
2180 data = set_field(data, pwr_pmu_idle_ctrl_value_m() |
2181 pwr_pmu_idle_ctrl_filter_m(),
2182 pwr_pmu_idle_ctrl_value_busy_f() |
2183 pwr_pmu_idle_ctrl_filter_disabled_f());
2184 gk20a_writel(g, pwr_pmu_idle_ctrl_r(1), data);
2186 data = gk20a_readl(g, pwr_pmu_idle_ctrl_r(2));
2187 data = set_field(data, pwr_pmu_idle_ctrl_value_m() |
2188 pwr_pmu_idle_ctrl_filter_m(),
2189 pwr_pmu_idle_ctrl_value_always_f() |
2190 pwr_pmu_idle_ctrl_filter_disabled_f());
2191 gk20a_writel(g, pwr_pmu_idle_ctrl_r(2), data);
2193 if (!pmu->sample_buffer)
2194 err = pmu->dmem.alloc(&pmu->dmem,
2195 &pmu->sample_buffer, 2 * sizeof(u16));
2197 gk20a_err(dev_from_gk20a(g),
2198 "failed to allocate perfmon sample buffer");
2203 memset(&cmd, 0, sizeof(struct pmu_cmd));
2204 cmd.hdr.unit_id = PMU_UNIT_PERFMON;
2205 cmd.hdr.size = PMU_CMD_HDR_SIZE + pv->get_pmu_perfmon_cmd_init_size();
2206 cmd.cmd.perfmon.cmd_type = PMU_PERFMON_CMD_ID_INIT;
2207 /* buffer to save counter values for pmu perfmon */
2208 pv->perfmon_cmd_init_set_sample_buffer(&cmd.cmd.perfmon,
2209 (u16)pmu->sample_buffer);
2210 /* number of sample periods below lower threshold
2211 before pmu triggers perfmon decrease event
2213 pv->perfmon_cmd_init_set_dec_cnt(&cmd.cmd.perfmon, 15);
2214 /* index of base counter, aka. always ticking counter */
2215 pv->perfmon_cmd_init_set_base_cnt_id(&cmd.cmd.perfmon, 6);
2216 /* microseconds interval between pmu polls perf counters */
2217 pv->perfmon_cmd_init_set_samp_period_us(&cmd.cmd.perfmon, 16700);
2218 /* number of perfmon counters
2219 counter #3 (GR and CE2) for gk20a */
2220 pv->perfmon_cmd_init_set_num_cnt(&cmd.cmd.perfmon, 1);
2221 /* moving average window for sample periods
2222 TBD: = 3000000 / sample_period_us = 17 */
2223 pv->perfmon_cmd_init_set_mov_avg(&cmd.cmd.perfmon, 17);
2225 memset(&payload, 0, sizeof(struct pmu_payload));
2226 payload.in.buf = &pmu->perfmon_counter;
2227 payload.in.size = sizeof(struct pmu_perfmon_counter);
2228 payload.in.offset = pv->get_perfmon_cmd_init_offsetofvar(COUNTER_ALLOC);
2230 gk20a_dbg_pmu("cmd post PMU_PERFMON_CMD_ID_INIT");
2231 gk20a_pmu_cmd_post(g, &cmd, NULL, &payload, PMU_COMMAND_QUEUE_LPQ,
2232 NULL, NULL, &seq, ~0);
2237 static int pmu_process_init_msg(struct pmu_gk20a *pmu,
2238 struct pmu_msg *msg)
2240 struct gk20a *g = pmu->g;
2241 struct pmu_v *pv = &g->ops.pmu_ver;
2242 union pmu_init_msg_pmu *init;
2243 struct pmu_sha1_gid_data gid_data;
2246 tail = pwr_pmu_msgq_tail_val_v(
2247 gk20a_readl(g, pwr_pmu_msgq_tail_r()));
2249 pmu_copy_from_dmem(pmu, tail,
2250 (u8 *)&msg->hdr, PMU_MSG_HDR_SIZE, 0);
2252 if (msg->hdr.unit_id != PMU_UNIT_INIT) {
2253 gk20a_err(dev_from_gk20a(g),
2254 "expecting init msg");
2258 pmu_copy_from_dmem(pmu, tail + PMU_MSG_HDR_SIZE,
2259 (u8 *)&msg->msg, msg->hdr.size - PMU_MSG_HDR_SIZE, 0);
2261 if (msg->msg.init.msg_type != PMU_INIT_MSG_TYPE_PMU_INIT) {
2262 gk20a_err(dev_from_gk20a(g),
2263 "expecting init msg");
2267 tail += ALIGN(msg->hdr.size, PMU_DMEM_ALIGNMENT);
2268 gk20a_writel(g, pwr_pmu_msgq_tail_r(),
2269 pwr_pmu_msgq_tail_val_f(tail));
2271 init = pv->get_pmu_msg_pmu_init_msg_ptr(&(msg->msg.init));
2272 if (!pmu->gid_info.valid) {
2274 pmu_copy_from_dmem(pmu,
2275 pv->get_pmu_init_msg_pmu_sw_mg_off(init),
2277 sizeof(struct pmu_sha1_gid_data), 0);
2279 pmu->gid_info.valid =
2280 (*(u32 *)gid_data.signature == PMU_SHA1_GID_SIGNATURE);
2282 if (pmu->gid_info.valid) {
2284 BUG_ON(sizeof(pmu->gid_info.gid) !=
2285 sizeof(gid_data.gid));
2287 memcpy(pmu->gid_info.gid, gid_data.gid,
2288 sizeof(pmu->gid_info.gid));
2292 for (i = 0; i < PMU_QUEUE_COUNT; i++)
2293 pmu_queue_init(pmu, i, init);
2295 if (!pmu->dmem.alloc)
2296 gk20a_allocator_init(&pmu->dmem, "gk20a_pmu_dmem",
2297 pv->get_pmu_init_msg_pmu_sw_mg_off(init),
2298 pv->get_pmu_init_msg_pmu_sw_mg_size(init),
2299 PMU_DMEM_ALLOC_ALIGNMENT);
2301 pmu->pmu_ready = true;
2306 static bool pmu_read_message(struct pmu_gk20a *pmu, struct pmu_queue *queue,
2307 struct pmu_msg *msg, int *status)
2309 struct gk20a *g = pmu->g;
2310 u32 read_size, bytes_read;
2315 if (pmu_queue_is_empty(pmu, queue))
2318 err = pmu_queue_open_read(pmu, queue);
2320 gk20a_err(dev_from_gk20a(g),
2321 "fail to open queue %d for read", queue->id);
2326 err = pmu_queue_pop(pmu, queue, &msg->hdr,
2327 PMU_MSG_HDR_SIZE, &bytes_read);
2328 if (err || bytes_read != PMU_MSG_HDR_SIZE) {
2329 gk20a_err(dev_from_gk20a(g),
2330 "fail to read msg from queue %d", queue->id);
2331 *status = err | -EINVAL;
2335 if (msg->hdr.unit_id == PMU_UNIT_REWIND) {
2336 pmu_queue_rewind(pmu, queue);
2337 /* read again after rewind */
2338 err = pmu_queue_pop(pmu, queue, &msg->hdr,
2339 PMU_MSG_HDR_SIZE, &bytes_read);
2340 if (err || bytes_read != PMU_MSG_HDR_SIZE) {
2341 gk20a_err(dev_from_gk20a(g),
2342 "fail to read msg from queue %d", queue->id);
2343 *status = err | -EINVAL;
2348 if (!PMU_UNIT_ID_IS_VALID(msg->hdr.unit_id)) {
2349 gk20a_err(dev_from_gk20a(g),
2350 "read invalid unit_id %d from queue %d",
2351 msg->hdr.unit_id, queue->id);
2356 if (msg->hdr.size > PMU_MSG_HDR_SIZE) {
2357 read_size = msg->hdr.size - PMU_MSG_HDR_SIZE;
2358 err = pmu_queue_pop(pmu, queue, &msg->msg,
2359 read_size, &bytes_read);
2360 if (err || bytes_read != read_size) {
2361 gk20a_err(dev_from_gk20a(g),
2362 "fail to read msg from queue %d", queue->id);
2368 err = pmu_queue_close(pmu, queue, true);
2370 gk20a_err(dev_from_gk20a(g),
2371 "fail to close queue %d", queue->id);
2379 err = pmu_queue_close(pmu, queue, false);
2381 gk20a_err(dev_from_gk20a(g),
2382 "fail to close queue %d", queue->id);
2386 static int pmu_response_handle(struct pmu_gk20a *pmu,
2387 struct pmu_msg *msg)
2389 struct gk20a *g = pmu->g;
2390 struct pmu_sequence *seq;
2391 struct pmu_v *pv = &g->ops.pmu_ver;
2396 seq = &pmu->seq[msg->hdr.seq_id];
2397 if (seq->state != PMU_SEQ_STATE_USED &&
2398 seq->state != PMU_SEQ_STATE_CANCELLED) {
2399 gk20a_err(dev_from_gk20a(g),
2400 "msg for an unknown sequence %d", seq->id);
2404 if (msg->hdr.unit_id == PMU_UNIT_RC &&
2405 msg->msg.rc.msg_type == PMU_RC_MSG_TYPE_UNHANDLED_CMD) {
2406 gk20a_err(dev_from_gk20a(g),
2407 "unhandled cmd: seq %d", seq->id);
2409 else if (seq->state != PMU_SEQ_STATE_CANCELLED) {
2411 if (seq->msg->hdr.size >= msg->hdr.size) {
2412 memcpy(seq->msg, msg, msg->hdr.size);
2413 if (pv->pmu_allocation_get_dmem_size(pmu,
2414 pv->get_pmu_seq_out_a_ptr(seq)) != 0) {
2415 pmu_copy_from_dmem(pmu,
2416 pv->pmu_allocation_get_dmem_offset(pmu,
2417 pv->get_pmu_seq_out_a_ptr(seq)),
2419 pv->pmu_allocation_get_dmem_size(pmu,
2420 pv->get_pmu_seq_out_a_ptr(seq)), 0);
2423 gk20a_err(dev_from_gk20a(g),
2424 "sequence %d msg buffer too small",
2429 seq->callback = NULL;
2430 if (pv->pmu_allocation_get_dmem_size(pmu,
2431 pv->get_pmu_seq_in_a_ptr(seq)) != 0)
2432 pmu->dmem.free(&pmu->dmem,
2433 pv->pmu_allocation_get_dmem_offset(pmu,
2434 pv->get_pmu_seq_in_a_ptr(seq)),
2435 pv->pmu_allocation_get_dmem_size(pmu,
2436 pv->get_pmu_seq_in_a_ptr(seq)));
2437 if (pv->pmu_allocation_get_dmem_size(pmu,
2438 pv->get_pmu_seq_out_a_ptr(seq)) != 0)
2439 pmu->dmem.free(&pmu->dmem,
2440 pv->pmu_allocation_get_dmem_offset(pmu,
2441 pv->get_pmu_seq_out_a_ptr(seq)),
2442 pv->pmu_allocation_get_dmem_size(pmu,
2443 pv->get_pmu_seq_out_a_ptr(seq)));
2446 seq->callback(g, msg, seq->cb_params, seq->desc, ret);
2448 pmu_seq_release(pmu, seq);
2450 /* TBD: notify client waiting for available dmem */
2452 gk20a_dbg_fn("done");
2457 static int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout,
2460 static void pmu_handle_zbc_msg(struct gk20a *g, struct pmu_msg *msg,
2461 void *param, u32 handle, u32 status)
2463 struct pmu_gk20a *pmu = param;
2464 gk20a_dbg_pmu("reply ZBC_TABLE_UPDATE");
2465 pmu->zbc_save_done = 1;
2468 void gk20a_pmu_save_zbc(struct gk20a *g, u32 entries)
2470 struct pmu_gk20a *pmu = &g->pmu;
2474 if (!pmu->pmu_ready || !entries || !pmu->zbc_ready)
2477 memset(&cmd, 0, sizeof(struct pmu_cmd));
2478 cmd.hdr.unit_id = PMU_UNIT_PG;
2479 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_zbc_cmd);
2480 cmd.cmd.zbc.cmd_type = g->ops.pmu_ver.cmd_id_zbc_table_update;
2481 cmd.cmd.zbc.entry_mask = ZBC_MASK(entries);
2483 pmu->zbc_save_done = 0;
2485 gk20a_dbg_pmu("cmd post ZBC_TABLE_UPDATE");
2486 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
2487 pmu_handle_zbc_msg, pmu, &seq, ~0);
2488 pmu_wait_message_cond(pmu, gk20a_get_gr_idle_timeout(g),
2489 &pmu->zbc_save_done, 1);
2490 if (!pmu->zbc_save_done)
2491 gk20a_err(dev_from_gk20a(g), "ZBC save timeout");
2494 static int pmu_perfmon_start_sampling(struct pmu_gk20a *pmu)
2496 struct gk20a *g = pmu->g;
2497 struct pmu_v *pv = &g->ops.pmu_ver;
2499 struct pmu_payload payload;
2500 u32 current_rate = 0;
2504 memset(&cmd, 0, sizeof(struct pmu_cmd));
2505 cmd.hdr.unit_id = PMU_UNIT_PERFMON;
2506 cmd.hdr.size = PMU_CMD_HDR_SIZE + pv->get_pmu_perfmon_cmd_start_size();
2507 pv->perfmon_start_set_cmd_type(&cmd.cmd.perfmon,
2508 PMU_PERFMON_CMD_ID_START);
2509 pv->perfmon_start_set_group_id(&cmd.cmd.perfmon,
2510 PMU_DOMAIN_GROUP_PSTATE);
2511 pv->perfmon_start_set_state_id(&cmd.cmd.perfmon,
2512 pmu->perfmon_state_id[PMU_DOMAIN_GROUP_PSTATE]);
2514 current_rate = rate_gpu_to_gpc2clk(gk20a_clk_get_rate(g));
2515 if (current_rate >= gpc_pll_params.max_freq)
2516 pv->perfmon_start_set_flags(&cmd.cmd.perfmon,
2517 PMU_PERFMON_FLAG_ENABLE_DECREASE);
2518 else if (current_rate <= gpc_pll_params.min_freq)
2519 pv->perfmon_start_set_flags(&cmd.cmd.perfmon,
2520 PMU_PERFMON_FLAG_ENABLE_INCREASE);
2522 pv->perfmon_start_set_flags(&cmd.cmd.perfmon,
2523 PMU_PERFMON_FLAG_ENABLE_INCREASE |
2524 PMU_PERFMON_FLAG_ENABLE_DECREASE);
2526 pv->perfmon_start_set_flags(&cmd.cmd.perfmon,
2527 pv->perfmon_start_get_flags(&cmd.cmd.perfmon) |
2528 PMU_PERFMON_FLAG_CLEAR_PREV);
2530 memset(&payload, 0, sizeof(struct pmu_payload));
2532 /* TBD: PMU_PERFMON_PCT_TO_INC * 100 */
2533 pmu->perfmon_counter.upper_threshold = 3000; /* 30% */
2534 /* TBD: PMU_PERFMON_PCT_TO_DEC * 100 */
2535 pmu->perfmon_counter.lower_threshold = 1000; /* 10% */
2536 pmu->perfmon_counter.valid = true;
2538 payload.in.buf = &pmu->perfmon_counter;
2539 payload.in.size = sizeof(pmu->perfmon_counter);
2541 pv->get_perfmon_cmd_start_offsetofvar(COUNTER_ALLOC);
2543 gk20a_dbg_pmu("cmd post PMU_PERFMON_CMD_ID_START");
2544 gk20a_pmu_cmd_post(g, &cmd, NULL, &payload, PMU_COMMAND_QUEUE_LPQ,
2545 NULL, NULL, &seq, ~0);
2550 static int pmu_perfmon_stop_sampling(struct pmu_gk20a *pmu)
2552 struct gk20a *g = pmu->g;
2557 memset(&cmd, 0, sizeof(struct pmu_cmd));
2558 cmd.hdr.unit_id = PMU_UNIT_PERFMON;
2559 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_perfmon_cmd_stop);
2560 cmd.cmd.perfmon.stop.cmd_type = PMU_PERFMON_CMD_ID_STOP;
2562 gk20a_dbg_pmu("cmd post PMU_PERFMON_CMD_ID_STOP");
2563 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_LPQ,
2564 NULL, NULL, &seq, ~0);
2568 static int pmu_handle_perfmon_event(struct pmu_gk20a *pmu,
2569 struct pmu_perfmon_msg *msg)
2571 struct gk20a *g = pmu->g;
2576 switch (msg->msg_type) {
2577 case PMU_PERFMON_MSG_ID_INCREASE_EVENT:
2578 gk20a_dbg_pmu("perfmon increase event: "
2579 "state_id %d, ground_id %d, pct %d",
2580 msg->gen.state_id, msg->gen.group_id, msg->gen.data);
2581 /* increase gk20a clock freq by 20% */
2582 rate = gk20a_clk_get_rate(g);
2583 gk20a_clk_set_rate(g, rate * 6 / 5);
2585 case PMU_PERFMON_MSG_ID_DECREASE_EVENT:
2586 gk20a_dbg_pmu("perfmon decrease event: "
2587 "state_id %d, ground_id %d, pct %d",
2588 msg->gen.state_id, msg->gen.group_id, msg->gen.data);
2589 /* decrease gk20a clock freq by 10% */
2590 rate = gk20a_clk_get_rate(g);
2591 gk20a_clk_set_rate(g, (rate / 10) * 7);
2593 case PMU_PERFMON_MSG_ID_INIT_EVENT:
2594 pmu->perfmon_ready = 1;
2595 gk20a_dbg_pmu("perfmon init event");
2601 /* restart sampling */
2602 if (IS_ENABLED(CONFIG_GK20A_PERFMON))
2603 return pmu_perfmon_start_sampling(pmu);
2608 static int pmu_handle_event(struct pmu_gk20a *pmu, struct pmu_msg *msg)
2614 switch (msg->hdr.unit_id) {
2615 case PMU_UNIT_PERFMON:
2616 err = pmu_handle_perfmon_event(pmu, &msg->msg.perfmon);
2625 static int pmu_process_message(struct pmu_gk20a *pmu)
2630 if (unlikely(!pmu->pmu_ready)) {
2631 pmu_process_init_msg(pmu, &msg);
2632 pmu_init_powergating(pmu);
2633 pmu_init_perfmon(pmu);
2637 while (pmu_read_message(pmu,
2638 &pmu->queue[PMU_MESSAGE_QUEUE], &msg, &status)) {
2640 gk20a_dbg_pmu("read msg hdr: "
2641 "unit_id = 0x%08x, size = 0x%08x, "
2642 "ctrl_flags = 0x%08x, seq_id = 0x%08x",
2643 msg.hdr.unit_id, msg.hdr.size,
2644 msg.hdr.ctrl_flags, msg.hdr.seq_id);
2646 msg.hdr.ctrl_flags &= ~PMU_CMD_FLAGS_PMU_MASK;
2648 if (msg.hdr.ctrl_flags == PMU_CMD_FLAGS_EVENT) {
2649 pmu_handle_event(pmu, &msg);
2651 pmu_response_handle(pmu, &msg);
2658 static int pmu_wait_message_cond(struct pmu_gk20a *pmu, u32 timeout,
2661 struct gk20a *g = pmu->g;
2662 unsigned long end_jiffies = jiffies + msecs_to_jiffies(timeout);
2663 unsigned long delay = GR_IDLE_CHECK_DEFAULT;
2669 if (gk20a_readl(g, pwr_falcon_irqstat_r()))
2672 usleep_range(delay, delay * 2);
2673 delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX);
2674 } while (time_before(jiffies, end_jiffies) ||
2675 !tegra_platform_is_silicon());
2680 static void pmu_dump_elpg_stats(struct pmu_gk20a *pmu)
2682 struct gk20a *g = pmu->g;
2683 struct pmu_pg_stats stats;
2685 pmu_copy_from_dmem(pmu, pmu->stat_dmem_offset,
2686 (u8 *)&stats, sizeof(struct pmu_pg_stats), 0);
2688 gk20a_dbg_pmu("pg_entry_start_timestamp : 0x%016llx",
2689 stats.pg_entry_start_timestamp);
2690 gk20a_dbg_pmu("pg_exit_start_timestamp : 0x%016llx",
2691 stats.pg_exit_start_timestamp);
2692 gk20a_dbg_pmu("pg_ingating_start_timestamp : 0x%016llx",
2693 stats.pg_ingating_start_timestamp);
2694 gk20a_dbg_pmu("pg_ungating_start_timestamp : 0x%016llx",
2695 stats.pg_ungating_start_timestamp);
2696 gk20a_dbg_pmu("pg_avg_entry_time_us : 0x%08x",
2697 stats.pg_avg_entry_time_us);
2698 gk20a_dbg_pmu("pg_avg_exit_time_us : 0x%08x",
2699 stats.pg_avg_exit_time_us);
2700 gk20a_dbg_pmu("pg_ingating_cnt : 0x%08x",
2701 stats.pg_ingating_cnt);
2702 gk20a_dbg_pmu("pg_ingating_time_us : 0x%08x",
2703 stats.pg_ingating_time_us);
2704 gk20a_dbg_pmu("pg_ungating_count : 0x%08x",
2705 stats.pg_ungating_count);
2706 gk20a_dbg_pmu("pg_ungating_time_us 0x%08x: ",
2707 stats.pg_ungating_time_us);
2708 gk20a_dbg_pmu("pg_gating_cnt : 0x%08x",
2709 stats.pg_gating_cnt);
2710 gk20a_dbg_pmu("pg_gating_deny_cnt : 0x%08x",
2711 stats.pg_gating_deny_cnt);
2714 Turn on PG_DEBUG in ucode and locate symbol "ElpgLog" offset
2715 in .nm file, e.g. 0x1000066c. use 0x66c.
2717 pmu_copy_from_dmem(pmu, 0x66c,
2718 (u8 *)val, sizeof(val), 0);
2719 gk20a_dbg_pmu("elpg log begin");
2720 for (i = 0; i < 20; i++)
2721 gk20a_dbg_pmu("0x%08x", val[i]);
2722 gk20a_dbg_pmu("elpg log end");
2725 gk20a_dbg_pmu("pwr_pmu_idle_mask_supp_r(3): 0x%08x",
2726 gk20a_readl(g, pwr_pmu_idle_mask_supp_r(3)));
2727 gk20a_dbg_pmu("pwr_pmu_idle_mask_1_supp_r(3): 0x%08x",
2728 gk20a_readl(g, pwr_pmu_idle_mask_1_supp_r(3)));
2729 gk20a_dbg_pmu("pwr_pmu_idle_ctrl_supp_r(3): 0x%08x",
2730 gk20a_readl(g, pwr_pmu_idle_ctrl_supp_r(3)));
2731 gk20a_dbg_pmu("pwr_pmu_pg_idle_cnt_r(0): 0x%08x",
2732 gk20a_readl(g, pwr_pmu_pg_idle_cnt_r(0)));
2733 gk20a_dbg_pmu("pwr_pmu_pg_intren_r(0): 0x%08x",
2734 gk20a_readl(g, pwr_pmu_pg_intren_r(0)));
2736 gk20a_dbg_pmu("pwr_pmu_idle_count_r(3): 0x%08x",
2737 gk20a_readl(g, pwr_pmu_idle_count_r(3)));
2738 gk20a_dbg_pmu("pwr_pmu_idle_count_r(4): 0x%08x",
2739 gk20a_readl(g, pwr_pmu_idle_count_r(4)));
2740 gk20a_dbg_pmu("pwr_pmu_idle_count_r(7): 0x%08x",
2741 gk20a_readl(g, pwr_pmu_idle_count_r(7)));
2744 TBD: script can't generate those registers correctly
2745 gk20a_dbg_pmu("pwr_pmu_idle_status_r(): 0x%08x",
2746 gk20a_readl(g, pwr_pmu_idle_status_r()));
2747 gk20a_dbg_pmu("pwr_pmu_pg_ctrl_r(): 0x%08x",
2748 gk20a_readl(g, pwr_pmu_pg_ctrl_r()));
2752 static void pmu_dump_falcon_stats(struct pmu_gk20a *pmu)
2754 struct gk20a *g = pmu->g;
2757 gk20a_err(dev_from_gk20a(g), "pwr_falcon_os_r : %d",
2758 gk20a_readl(g, pwr_falcon_os_r()));
2759 gk20a_err(dev_from_gk20a(g), "pwr_falcon_cpuctl_r : 0x%x",
2760 gk20a_readl(g, pwr_falcon_cpuctl_r()));
2761 gk20a_err(dev_from_gk20a(g), "pwr_falcon_idlestate_r : 0x%x",
2762 gk20a_readl(g, pwr_falcon_idlestate_r()));
2763 gk20a_err(dev_from_gk20a(g), "pwr_falcon_mailbox0_r : 0x%x",
2764 gk20a_readl(g, pwr_falcon_mailbox0_r()));
2765 gk20a_err(dev_from_gk20a(g), "pwr_falcon_mailbox1_r : 0x%x",
2766 gk20a_readl(g, pwr_falcon_mailbox1_r()));
2767 gk20a_err(dev_from_gk20a(g), "pwr_falcon_irqstat_r : 0x%x",
2768 gk20a_readl(g, pwr_falcon_irqstat_r()));
2769 gk20a_err(dev_from_gk20a(g), "pwr_falcon_irqmode_r : 0x%x",
2770 gk20a_readl(g, pwr_falcon_irqmode_r()));
2771 gk20a_err(dev_from_gk20a(g), "pwr_falcon_irqmask_r : 0x%x",
2772 gk20a_readl(g, pwr_falcon_irqmask_r()));
2773 gk20a_err(dev_from_gk20a(g), "pwr_falcon_irqdest_r : 0x%x",
2774 gk20a_readl(g, pwr_falcon_irqdest_r()));
2776 for (i = 0; i < pwr_pmu_mailbox__size_1_v(); i++)
2777 gk20a_err(dev_from_gk20a(g), "pwr_pmu_mailbox_r(%d) : 0x%x",
2778 i, gk20a_readl(g, pwr_pmu_mailbox_r(i)));
2780 for (i = 0; i < pwr_pmu_debug__size_1_v(); i++)
2781 gk20a_err(dev_from_gk20a(g), "pwr_pmu_debug_r(%d) : 0x%x",
2782 i, gk20a_readl(g, pwr_pmu_debug_r(i)));
2784 for (i = 0; i < 6/*NV_PPWR_FALCON_ICD_IDX_RSTAT__SIZE_1*/; i++) {
2785 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2786 pwr_pmu_falcon_icd_cmd_opc_rstat_f() |
2787 pwr_pmu_falcon_icd_cmd_idx_f(i));
2788 gk20a_err(dev_from_gk20a(g), "pmu_rstat (%d) : 0x%x",
2789 i, gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2792 i = gk20a_readl(g, pwr_pmu_bar0_error_status_r());
2793 gk20a_err(dev_from_gk20a(g), "pwr_pmu_bar0_error_status_r : 0x%x", i);
2795 gk20a_err(dev_from_gk20a(g), "pwr_pmu_bar0_addr_r : 0x%x",
2796 gk20a_readl(g, pwr_pmu_bar0_addr_r()));
2797 gk20a_err(dev_from_gk20a(g), "pwr_pmu_bar0_data_r : 0x%x",
2798 gk20a_readl(g, pwr_pmu_bar0_data_r()));
2799 gk20a_err(dev_from_gk20a(g), "pwr_pmu_bar0_timeout_r : 0x%x",
2800 gk20a_readl(g, pwr_pmu_bar0_timeout_r()));
2801 gk20a_err(dev_from_gk20a(g), "pwr_pmu_bar0_ctl_r : 0x%x",
2802 gk20a_readl(g, pwr_pmu_bar0_ctl_r()));
2805 i = gk20a_readl(g, pwr_pmu_bar0_fecs_error_r());
2806 gk20a_err(dev_from_gk20a(g), "pwr_pmu_bar0_fecs_error_r : 0x%x", i);
2808 i = gk20a_readl(g, pwr_falcon_exterrstat_r());
2809 gk20a_err(dev_from_gk20a(g), "pwr_falcon_exterrstat_r : 0x%x", i);
2810 if (pwr_falcon_exterrstat_valid_v(i) ==
2811 pwr_falcon_exterrstat_valid_true_v()) {
2812 gk20a_err(dev_from_gk20a(g), "pwr_falcon_exterraddr_r : 0x%x",
2813 gk20a_readl(g, pwr_falcon_exterraddr_r()));
2814 gk20a_err(dev_from_gk20a(g), "pmc_enable : 0x%x",
2815 gk20a_readl(g, mc_enable_r()));
2818 gk20a_err(dev_from_gk20a(g), "pwr_falcon_engctl_r : 0x%x",
2819 gk20a_readl(g, pwr_falcon_engctl_r()));
2820 gk20a_err(dev_from_gk20a(g), "pwr_falcon_curctx_r : 0x%x",
2821 gk20a_readl(g, pwr_falcon_curctx_r()));
2822 gk20a_err(dev_from_gk20a(g), "pwr_falcon_nxtctx_r : 0x%x",
2823 gk20a_readl(g, pwr_falcon_nxtctx_r()));
2825 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2826 pwr_pmu_falcon_icd_cmd_opc_rreg_f() |
2827 pwr_pmu_falcon_icd_cmd_idx_f(PMU_FALCON_REG_IMB));
2828 gk20a_err(dev_from_gk20a(g), "PMU_FALCON_REG_IMB : 0x%x",
2829 gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2831 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2832 pwr_pmu_falcon_icd_cmd_opc_rreg_f() |
2833 pwr_pmu_falcon_icd_cmd_idx_f(PMU_FALCON_REG_DMB));
2834 gk20a_err(dev_from_gk20a(g), "PMU_FALCON_REG_DMB : 0x%x",
2835 gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2837 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2838 pwr_pmu_falcon_icd_cmd_opc_rreg_f() |
2839 pwr_pmu_falcon_icd_cmd_idx_f(PMU_FALCON_REG_CSW));
2840 gk20a_err(dev_from_gk20a(g), "PMU_FALCON_REG_CSW : 0x%x",
2841 gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2843 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2844 pwr_pmu_falcon_icd_cmd_opc_rreg_f() |
2845 pwr_pmu_falcon_icd_cmd_idx_f(PMU_FALCON_REG_CTX));
2846 gk20a_err(dev_from_gk20a(g), "PMU_FALCON_REG_CTX : 0x%x",
2847 gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2849 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2850 pwr_pmu_falcon_icd_cmd_opc_rreg_f() |
2851 pwr_pmu_falcon_icd_cmd_idx_f(PMU_FALCON_REG_EXCI));
2852 gk20a_err(dev_from_gk20a(g), "PMU_FALCON_REG_EXCI : 0x%x",
2853 gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2855 for (i = 0; i < 4; i++) {
2856 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2857 pwr_pmu_falcon_icd_cmd_opc_rreg_f() |
2858 pwr_pmu_falcon_icd_cmd_idx_f(PMU_FALCON_REG_PC));
2859 gk20a_err(dev_from_gk20a(g), "PMU_FALCON_REG_PC : 0x%x",
2860 gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2862 gk20a_writel(g, pwr_pmu_falcon_icd_cmd_r(),
2863 pwr_pmu_falcon_icd_cmd_opc_rreg_f() |
2864 pwr_pmu_falcon_icd_cmd_idx_f(PMU_FALCON_REG_SP));
2865 gk20a_err(dev_from_gk20a(g), "PMU_FALCON_REG_SP : 0x%x",
2866 gk20a_readl(g, pwr_pmu_falcon_icd_rdata_r()));
2868 gk20a_err(dev_from_gk20a(g), "elpg stat: %d\n",
2871 /* PMU may crash due to FECS crash. Dump FECS status */
2872 gk20a_fecs_dump_falcon_stats(g);
2875 void gk20a_pmu_isr(struct gk20a *g)
2877 struct pmu_gk20a *pmu = &g->pmu;
2878 struct pmu_queue *queue;
2880 bool recheck = false;
2884 mutex_lock(&pmu->isr_enable_lock);
2885 if (!pmu->isr_enabled) {
2886 mutex_unlock(&pmu->isr_enable_lock);
2890 mutex_lock(&pmu->isr_mutex);
2892 mask = gk20a_readl(g, pwr_falcon_irqmask_r()) &
2893 gk20a_readl(g, pwr_falcon_irqdest_r());
2895 intr = gk20a_readl(g, pwr_falcon_irqstat_r()) & mask;
2897 gk20a_dbg_pmu("received falcon interrupt: 0x%08x", intr);
2899 if (!intr || pmu->pmu_state == PMU_STATE_OFF) {
2900 gk20a_writel(g, pwr_falcon_irqsclr_r(), intr);
2901 mutex_unlock(&pmu->isr_mutex);
2902 mutex_unlock(&pmu->isr_enable_lock);
2906 if (intr & pwr_falcon_irqstat_halt_true_f()) {
2907 gk20a_err(dev_from_gk20a(g),
2908 "pmu halt intr not implemented");
2909 pmu_dump_falcon_stats(pmu);
2911 if (intr & pwr_falcon_irqstat_exterr_true_f()) {
2912 gk20a_err(dev_from_gk20a(g),
2913 "pmu exterr intr not implemented. Clearing interrupt.");
2914 pmu_dump_falcon_stats(pmu);
2916 gk20a_writel(g, pwr_falcon_exterrstat_r(),
2917 gk20a_readl(g, pwr_falcon_exterrstat_r()) &
2918 ~pwr_falcon_exterrstat_valid_m());
2920 if (intr & pwr_falcon_irqstat_swgen0_true_f()) {
2921 pmu_process_message(pmu);
2925 gk20a_writel(g, pwr_falcon_irqsclr_r(), intr);
2928 queue = &pmu->queue[PMU_MESSAGE_QUEUE];
2929 if (!pmu_queue_is_empty(pmu, queue))
2930 gk20a_writel(g, pwr_falcon_irqsset_r(),
2931 pwr_falcon_irqsset_swgen0_set_f());
2934 mutex_unlock(&pmu->isr_mutex);
2935 mutex_unlock(&pmu->isr_enable_lock);
2938 static bool pmu_validate_cmd(struct pmu_gk20a *pmu, struct pmu_cmd *cmd,
2939 struct pmu_msg *msg, struct pmu_payload *payload,
2942 struct gk20a *g = pmu->g;
2943 struct pmu_queue *queue;
2944 u32 in_size, out_size;
2946 if (!PMU_IS_SW_COMMAND_QUEUE(queue_id))
2949 queue = &pmu->queue[queue_id];
2950 if (cmd->hdr.size < PMU_CMD_HDR_SIZE)
2953 if (cmd->hdr.size > (queue->size >> 1))
2956 if (msg != NULL && msg->hdr.size < PMU_MSG_HDR_SIZE)
2959 if (!PMU_UNIT_ID_IS_VALID(cmd->hdr.unit_id))
2962 if (payload == NULL)
2965 if (payload->in.buf == NULL && payload->out.buf == NULL)
2968 if ((payload->in.buf != NULL && payload->in.size == 0) ||
2969 (payload->out.buf != NULL && payload->out.size == 0))
2972 in_size = PMU_CMD_HDR_SIZE;
2973 if (payload->in.buf) {
2974 in_size += payload->in.offset;
2975 in_size += g->ops.pmu_ver.get_pmu_allocation_struct_size(pmu);
2978 out_size = PMU_CMD_HDR_SIZE;
2979 if (payload->out.buf) {
2980 out_size += payload->out.offset;
2981 out_size += g->ops.pmu_ver.get_pmu_allocation_struct_size(pmu);
2984 if (in_size > cmd->hdr.size || out_size > cmd->hdr.size)
2988 if ((payload->in.offset != 0 && payload->in.buf == NULL) ||
2989 (payload->out.offset != 0 && payload->out.buf == NULL))
2995 gk20a_err(dev_from_gk20a(g), "invalid pmu cmd :\n"
2997 "cmd_size=%d, cmd_unit_id=%d, msg=%p, msg_size=%d,\n"
2998 "payload in=%p, in_size=%d, in_offset=%d,\n"
2999 "payload out=%p, out_size=%d, out_offset=%d",
3000 queue_id, cmd->hdr.size, cmd->hdr.unit_id,
3001 msg, msg?msg->hdr.unit_id:~0,
3002 &payload->in, payload->in.size, payload->in.offset,
3003 &payload->out, payload->out.size, payload->out.offset);
3008 static int pmu_write_cmd(struct pmu_gk20a *pmu, struct pmu_cmd *cmd,
3009 u32 queue_id, unsigned long timeout)
3011 struct gk20a *g = pmu->g;
3012 struct pmu_queue *queue;
3013 unsigned long end_jiffies = jiffies +
3014 msecs_to_jiffies(timeout);
3019 queue = &pmu->queue[queue_id];
3022 err = pmu_queue_open_write(pmu, queue, cmd->hdr.size);
3023 if (err == -EAGAIN && time_before(jiffies, end_jiffies))
3024 usleep_range(1000, 2000);
3032 pmu_queue_push(pmu, queue, cmd, cmd->hdr.size);
3034 err = pmu_queue_close(pmu, queue, true);
3038 gk20a_err(dev_from_gk20a(g),
3039 "fail to write cmd to queue %d", queue_id);
3041 gk20a_dbg_fn("done");
3046 int gk20a_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd,
3047 struct pmu_msg *msg, struct pmu_payload *payload,
3048 u32 queue_id, pmu_callback callback, void* cb_param,
3049 u32 *seq_desc, unsigned long timeout)
3051 struct pmu_gk20a *pmu = &g->pmu;
3052 struct pmu_v *pv = &g->ops.pmu_ver;
3053 struct pmu_sequence *seq;
3054 void *in = NULL, *out = NULL;
3061 BUG_ON(!pmu->pmu_ready);
3063 if (!pmu_validate_cmd(pmu, cmd, msg, payload, queue_id))
3066 err = pmu_seq_acquire(pmu, &seq);
3070 cmd->hdr.seq_id = seq->id;
3072 cmd->hdr.ctrl_flags = 0;
3073 cmd->hdr.ctrl_flags |= PMU_CMD_FLAGS_STATUS;
3074 cmd->hdr.ctrl_flags |= PMU_CMD_FLAGS_INTR;
3076 seq->callback = callback;
3077 seq->cb_params = cb_param;
3079 seq->out_payload = NULL;
3080 seq->desc = pmu->next_seq_desc++;
3083 seq->out_payload = payload->out.buf;
3085 *seq_desc = seq->desc;
3087 if (payload && payload->in.offset != 0) {
3088 pv->set_pmu_allocation_ptr(pmu, &in,
3089 ((u8 *)&cmd->cmd + payload->in.offset));
3091 if (payload->in.buf != payload->out.buf)
3092 pv->pmu_allocation_set_dmem_size(pmu, in,
3093 (u16)payload->in.size);
3095 pv->pmu_allocation_set_dmem_size(pmu, in,
3096 (u16)max(payload->in.size, payload->out.size));
3098 err = pmu->dmem.alloc(&pmu->dmem,
3099 pv->pmu_allocation_get_dmem_offset_addr(pmu, in),
3100 pv->pmu_allocation_get_dmem_size(pmu, in));
3104 pmu_copy_to_dmem(pmu, (pv->pmu_allocation_get_dmem_offset(pmu,
3106 payload->in.buf, payload->in.size, 0);
3107 pv->pmu_allocation_set_dmem_size(pmu,
3108 pv->get_pmu_seq_in_a_ptr(seq),
3109 pv->pmu_allocation_get_dmem_size(pmu, in));
3110 pv->pmu_allocation_set_dmem_offset(pmu,
3111 pv->get_pmu_seq_in_a_ptr(seq),
3112 pv->pmu_allocation_get_dmem_offset(pmu, in));
3115 if (payload && payload->out.offset != 0) {
3116 pv->set_pmu_allocation_ptr(pmu, &out,
3117 ((u8 *)&cmd->cmd + payload->out.offset));
3118 pv->pmu_allocation_set_dmem_size(pmu, out,
3119 (u16)payload->out.size);
3121 if (payload->out.buf != payload->in.buf) {
3122 err = pmu->dmem.alloc(&pmu->dmem,
3123 pv->pmu_allocation_get_dmem_offset_addr(pmu, out),
3124 pv->pmu_allocation_get_dmem_size(pmu, out));
3129 pv->pmu_allocation_set_dmem_offset(pmu, out,
3130 pv->pmu_allocation_get_dmem_offset(pmu, in));
3133 pv->pmu_allocation_set_dmem_size(pmu,
3134 pv->get_pmu_seq_out_a_ptr(seq),
3135 pv->pmu_allocation_get_dmem_size(pmu, out));
3136 pv->pmu_allocation_set_dmem_offset(pmu,
3137 pv->get_pmu_seq_out_a_ptr(seq),
3138 pv->pmu_allocation_get_dmem_offset(pmu, out));
3141 seq->state = PMU_SEQ_STATE_USED;
3142 err = pmu_write_cmd(pmu, cmd, queue_id, timeout);
3144 seq->state = PMU_SEQ_STATE_PENDING;
3146 gk20a_dbg_fn("done");
3151 gk20a_dbg_fn("fail");
3153 pmu->dmem.free(&pmu->dmem,
3154 pv->pmu_allocation_get_dmem_offset(pmu, in),
3155 pv->pmu_allocation_get_dmem_size(pmu, in));
3157 pmu->dmem.free(&pmu->dmem,
3158 pv->pmu_allocation_get_dmem_offset(pmu, out),
3159 pv->pmu_allocation_get_dmem_size(pmu, out));
3161 pmu_seq_release(pmu, seq);
3165 static int gk20a_pmu_enable_elpg_locked(struct gk20a *g)
3167 struct pmu_gk20a *pmu = &g->pmu;
3173 memset(&cmd, 0, sizeof(struct pmu_cmd));
3174 cmd.hdr.unit_id = PMU_UNIT_PG;
3175 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
3176 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
3177 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A;
3178 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_ALLOW;
3180 /* no need to wait ack for ELPG enable but set pending to sync
3181 with follow up ELPG disable */
3182 pmu->elpg_stat = PMU_ELPG_STAT_ON_PENDING;
3184 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_ALLOW");
3185 status = gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
3186 pmu_handle_pg_elpg_msg, pmu, &seq, ~0);
3188 BUG_ON(status != 0);
3190 gk20a_dbg_fn("done");
3194 int gk20a_pmu_enable_elpg(struct gk20a *g)
3196 struct pmu_gk20a *pmu = &g->pmu;
3197 struct gr_gk20a *gr = &g->gr;
3203 mutex_lock(&pmu->elpg_mutex);
3206 if (pmu->elpg_refcnt <= 0)
3209 /* something is not right if we end up in following code path */
3210 if (unlikely(pmu->elpg_refcnt > 1)) {
3211 gk20a_warn(dev_from_gk20a(g),
3212 "%s(): possible elpg refcnt mismatch. elpg refcnt=%d",
3213 __func__, pmu->elpg_refcnt);
3217 /* do NOT enable elpg until golden ctx is created,
3218 which is related with the ctx that ELPG save and restore. */
3219 if (unlikely(!gr->ctx_vars.golden_image_initialized))
3222 /* return if ELPG is already on or on_pending or off_on_pending */
3223 if (pmu->elpg_stat != PMU_ELPG_STAT_OFF)
3226 ret = gk20a_pmu_enable_elpg_locked(g);
3229 mutex_unlock(&pmu->elpg_mutex);
3230 gk20a_dbg_fn("done");
3234 int gk20a_pmu_disable_elpg(struct gk20a *g)
3236 struct pmu_gk20a *pmu = &g->pmu;
3243 mutex_lock(&pmu->elpg_mutex);
3246 if (pmu->elpg_refcnt > 0) {
3247 gk20a_warn(dev_from_gk20a(g),
3248 "%s(): possible elpg refcnt mismatch. elpg refcnt=%d",
3249 __func__, pmu->elpg_refcnt);
3255 /* cancel off_on_pending and return */
3256 if (pmu->elpg_stat == PMU_ELPG_STAT_OFF_ON_PENDING) {
3257 pmu->elpg_stat = PMU_ELPG_STAT_OFF;
3259 goto exit_reschedule;
3261 /* wait if on_pending */
3262 else if (pmu->elpg_stat == PMU_ELPG_STAT_ON_PENDING) {
3264 pmu_wait_message_cond(pmu, gk20a_get_gr_idle_timeout(g),
3265 &pmu->elpg_stat, PMU_ELPG_STAT_ON);
3267 if (pmu->elpg_stat != PMU_ELPG_STAT_ON) {
3268 gk20a_err(dev_from_gk20a(g),
3269 "ELPG_ALLOW_ACK failed, elpg_stat=%d",
3271 pmu_dump_elpg_stats(pmu);
3272 pmu_dump_falcon_stats(pmu);
3277 /* return if ELPG is already off */
3278 else if (pmu->elpg_stat != PMU_ELPG_STAT_ON) {
3280 goto exit_reschedule;
3283 memset(&cmd, 0, sizeof(struct pmu_cmd));
3284 cmd.hdr.unit_id = PMU_UNIT_PG;
3285 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
3286 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
3287 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A;
3288 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_DISALLOW;
3290 pmu->elpg_stat = PMU_ELPG_STAT_OFF_PENDING;
3292 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_DISALLOW");
3293 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
3294 pmu_handle_pg_elpg_msg, pmu, &seq, ~0);
3296 pmu_wait_message_cond(pmu, gk20a_get_gr_idle_timeout(g),
3297 &pmu->elpg_stat, PMU_ELPG_STAT_OFF);
3298 if (pmu->elpg_stat != PMU_ELPG_STAT_OFF) {
3299 gk20a_err(dev_from_gk20a(g),
3300 "ELPG_DISALLOW_ACK failed");
3301 pmu_dump_elpg_stats(pmu);
3302 pmu_dump_falcon_stats(pmu);
3309 mutex_unlock(&pmu->elpg_mutex);
3310 gk20a_dbg_fn("done");
3314 int gk20a_pmu_perfmon_enable(struct gk20a *g, bool enable)
3316 struct pmu_gk20a *pmu = &g->pmu;
3322 err = pmu_perfmon_start_sampling(pmu);
3324 err = pmu_perfmon_stop_sampling(pmu);
3329 int gk20a_pmu_destroy(struct gk20a *g)
3331 struct pmu_gk20a *pmu = &g->pmu;
3332 u32 elpg_ingating_time, elpg_ungating_time, gating_cnt;
3336 if (!support_gk20a_pmu())
3339 /* make sure the pending operations are finished before we continue */
3340 cancel_work_sync(&pmu->pg_init);
3342 gk20a_pmu_get_elpg_residency_gating(g, &elpg_ingating_time,
3343 &elpg_ungating_time, &gating_cnt);
3345 gk20a_pmu_disable_elpg(g);
3346 pmu->initialized = false;
3348 /* update the s/w ELPG residency counters */
3349 g->pg_ingating_time_us += (u64)elpg_ingating_time;
3350 g->pg_ungating_time_us += (u64)elpg_ungating_time;
3351 g->pg_gating_cnt += gating_cnt;
3353 mutex_lock(&pmu->isr_enable_lock);
3354 pmu_enable(pmu, false);
3355 pmu->isr_enabled = false;
3356 mutex_unlock(&pmu->isr_enable_lock);
3358 pmu->pmu_state = PMU_STATE_OFF;
3359 pmu->pmu_ready = false;
3360 pmu->perfmon_ready = false;
3361 pmu->zbc_ready = false;
3363 gk20a_dbg_fn("done");
3367 int gk20a_pmu_load_norm(struct gk20a *g, u32 *load)
3369 struct pmu_gk20a *pmu = &g->pmu;
3372 if (!pmu->perfmon_ready) {
3377 pmu_copy_from_dmem(pmu, pmu->sample_buffer, (u8 *)&_load, 2, 0);
3383 void gk20a_pmu_get_load_counters(struct gk20a *g, u32 *busy_cycles,
3393 *busy_cycles = pwr_pmu_idle_count_value_v(
3394 gk20a_readl(g, pwr_pmu_idle_count_r(1)));
3396 *total_cycles = pwr_pmu_idle_count_value_v(
3397 gk20a_readl(g, pwr_pmu_idle_count_r(2)));
3401 void gk20a_pmu_reset_load_counters(struct gk20a *g)
3403 u32 reg_val = pwr_pmu_idle_count_reset_f(1);
3409 gk20a_writel(g, pwr_pmu_idle_count_r(2), reg_val);
3411 gk20a_writel(g, pwr_pmu_idle_count_r(1), reg_val);
3415 static int gk20a_pmu_get_elpg_residency_gating(struct gk20a *g,
3416 u32 *ingating_time, u32 *ungating_time, u32 *gating_cnt)
3418 struct pmu_gk20a *pmu = &g->pmu;
3419 struct pmu_pg_stats stats;
3421 if (!pmu->initialized) {
3428 pmu_copy_from_dmem(pmu, pmu->stat_dmem_offset,
3429 (u8 *)&stats, sizeof(struct pmu_pg_stats), 0);
3431 *ingating_time = stats.pg_ingating_time_us;
3432 *ungating_time = stats.pg_ungating_time_us;
3433 *gating_cnt = stats.pg_gating_cnt;
3438 /* Send an Adaptive Power (AP) related command to PMU */
3439 static int gk20a_pmu_ap_send_command(struct gk20a *g,
3440 union pmu_ap_cmd *p_ap_cmd, bool b_block)
3442 struct pmu_gk20a *pmu = &g->pmu;
3443 /* FIXME: where is the PG structure defined?? */
3447 pmu_callback p_callback = NULL;
3449 memset(&cmd, 0, sizeof(struct pmu_cmd));
3451 /* Copy common members */
3452 cmd.hdr.unit_id = PMU_UNIT_PG;
3453 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(union pmu_ap_cmd);
3455 cmd.cmd.pg.ap_cmd.cmn.cmd_type = PMU_PG_CMD_ID_AP;
3456 cmd.cmd.pg.ap_cmd.cmn.cmd_id = p_ap_cmd->cmn.cmd_id;
3458 /* Copy other members of command */
3459 switch (p_ap_cmd->cmn.cmd_id) {
3460 case PMU_AP_CMD_ID_INIT:
3461 gk20a_dbg_pmu("cmd post PMU_AP_CMD_ID_INIT");
3462 cmd.cmd.pg.ap_cmd.init.pg_sampling_period_us =
3463 p_ap_cmd->init.pg_sampling_period_us;
3464 p_callback = ap_callback_init_and_enable_ctrl;
3467 case PMU_AP_CMD_ID_INIT_AND_ENABLE_CTRL:
3468 gk20a_dbg_pmu("cmd post PMU_AP_CMD_ID_INIT_AND_ENABLE_CTRL");
3469 cmd.cmd.pg.ap_cmd.init_and_enable_ctrl.ctrl_id =
3470 p_ap_cmd->init_and_enable_ctrl.ctrl_id;
3472 (void *)&(cmd.cmd.pg.ap_cmd.init_and_enable_ctrl.params),
3473 (void *)&(p_ap_cmd->init_and_enable_ctrl.params),
3474 sizeof(struct pmu_ap_ctrl_init_params));
3476 p_callback = ap_callback_init_and_enable_ctrl;
3479 case PMU_AP_CMD_ID_ENABLE_CTRL:
3480 gk20a_dbg_pmu("cmd post PMU_AP_CMD_ID_ENABLE_CTRL");
3481 cmd.cmd.pg.ap_cmd.enable_ctrl.ctrl_id =
3482 p_ap_cmd->enable_ctrl.ctrl_id;
3485 case PMU_AP_CMD_ID_DISABLE_CTRL:
3486 gk20a_dbg_pmu("cmd post PMU_AP_CMD_ID_DISABLE_CTRL");
3487 cmd.cmd.pg.ap_cmd.disable_ctrl.ctrl_id =
3488 p_ap_cmd->disable_ctrl.ctrl_id;
3491 case PMU_AP_CMD_ID_KICK_CTRL:
3492 gk20a_dbg_pmu("cmd post PMU_AP_CMD_ID_KICK_CTRL");
3493 cmd.cmd.pg.ap_cmd.kick_ctrl.ctrl_id =
3494 p_ap_cmd->kick_ctrl.ctrl_id;
3495 cmd.cmd.pg.ap_cmd.kick_ctrl.skip_count =
3496 p_ap_cmd->kick_ctrl.skip_count;
3500 gk20a_dbg_pmu("%s: Invalid Adaptive Power command %d\n",
3501 __func__, p_ap_cmd->cmn.cmd_id);
3505 status = gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
3506 p_callback, pmu, &seq, ~0);
3510 "%s: Unable to submit Adaptive Power Command %d\n",
3511 __func__, p_ap_cmd->cmn.cmd_id);
3515 /* TODO: Implement blocking calls (b_block) */
3521 static void ap_callback_init_and_enable_ctrl(
3522 struct gk20a *g, struct pmu_msg *msg,
3523 void *param, u32 seq_desc, u32 status)
3525 /* Define p_ap (i.e pointer to pmu_ap structure) */
3529 switch (msg->msg.pg.ap_msg.cmn.msg_id) {
3530 case PMU_AP_MSG_ID_INIT_ACK:
3531 gk20a_dbg_pmu("reply PMU_AP_CMD_ID_INIT");
3536 "%s: Invalid Adaptive Power Message: %x\n",
3537 __func__, msg->msg.pg.ap_msg.cmn.msg_id);
3543 static int gk20a_aelpg_init(struct gk20a *g)
3547 /* Remove reliance on app_ctrl field. */
3548 union pmu_ap_cmd ap_cmd;
3550 /* TODO: Check for elpg being ready? */
3551 ap_cmd.init.cmd_id = PMU_AP_CMD_ID_INIT;
3552 ap_cmd.init.pg_sampling_period_us =
3553 APCTRL_SAMPLING_PERIOD_PG_DEFAULT_US;
3555 status = gk20a_pmu_ap_send_command(g, &ap_cmd, false);
3559 static int gk20a_aelpg_init_and_enable(struct gk20a *g, u8 ctrl_id)
3562 union pmu_ap_cmd ap_cmd;
3564 /* TODO: Probably check if ELPG is ready? */
3566 ap_cmd.init_and_enable_ctrl.cmd_id = PMU_AP_CMD_ID_INIT_AND_ENABLE_CTRL;
3567 ap_cmd.init_and_enable_ctrl.ctrl_id = ctrl_id;
3568 ap_cmd.init_and_enable_ctrl.params.min_idle_filter_us =
3569 APCTRL_MINIMUM_IDLE_FILTER_DEFAULT_US;
3570 ap_cmd.init_and_enable_ctrl.params.min_target_saving_us =
3571 APCTRL_MINIMUM_TARGET_SAVING_DEFAULT_US;
3572 ap_cmd.init_and_enable_ctrl.params.power_break_even_us =
3573 APCTRL_POWER_BREAKEVEN_DEFAULT_US;
3574 ap_cmd.init_and_enable_ctrl.params.cycles_per_sample_max =
3575 APCTRL_CYCLES_PER_SAMPLE_MAX_DEFAULT;
3578 case PMU_AP_CTRL_ID_GRAPHICS:
3584 status = gk20a_pmu_ap_send_command(g, &ap_cmd, true);
3589 static int elpg_residency_show(struct seq_file *s, void *data)
3591 struct gk20a *g = s->private;
3592 u32 ingating_time = 0;
3593 u32 ungating_time = 0;
3595 u64 total_ingating, total_ungating, residency, divisor, dividend;
3597 /* Don't unnecessarily power on the device */
3600 gk20a_pmu_get_elpg_residency_gating(g, &ingating_time,
3601 &ungating_time, &gating_cnt);
3604 total_ingating = g->pg_ingating_time_us + (u64)ingating_time;
3605 total_ungating = g->pg_ungating_time_us + (u64)ungating_time;
3606 divisor = total_ingating + total_ungating;
3608 /* We compute the residency on a scale of 1000 */
3609 dividend = total_ingating * 1000;
3612 residency = div64_u64(dividend, divisor);
3616 seq_printf(s, "Time in ELPG: %llu us\n"
3617 "Time out of ELPG: %llu us\n"
3618 "ELPG residency ratio: %llu\n",
3619 total_ingating, total_ungating, residency);
3624 static int elpg_residency_open(struct inode *inode, struct file *file)
3626 return single_open(file, elpg_residency_show, inode->i_private);
3629 static const struct file_operations elpg_residency_fops = {
3630 .open = elpg_residency_open,
3632 .llseek = seq_lseek,
3633 .release = single_release,
3636 static int elpg_transitions_show(struct seq_file *s, void *data)
3638 struct gk20a *g = s->private;
3639 u32 ingating_time, ungating_time, total_gating_cnt;
3644 gk20a_pmu_get_elpg_residency_gating(g, &ingating_time,
3645 &ungating_time, &gating_cnt);
3648 total_gating_cnt = g->pg_gating_cnt + gating_cnt;
3650 seq_printf(s, "%u\n", total_gating_cnt);
3655 static int elpg_transitions_open(struct inode *inode, struct file *file)
3657 return single_open(file, elpg_transitions_show, inode->i_private);
3660 static const struct file_operations elpg_transitions_fops = {
3661 .open = elpg_transitions_open,
3663 .llseek = seq_lseek,
3664 .release = single_release,
3667 int gk20a_pmu_debugfs_init(struct platform_device *dev)
3670 struct gk20a_platform *platform = platform_get_drvdata(dev);
3671 struct gk20a *g = get_gk20a(dev);
3673 d = debugfs_create_file(
3674 "elpg_residency", S_IRUGO|S_IWUSR, platform->debugfs, g,
3675 &elpg_residency_fops);
3679 d = debugfs_create_file(
3680 "elpg_transitions", S_IRUGO, platform->debugfs, g,
3681 &elpg_transitions_fops);
3688 pr_err("%s: Failed to make debugfs node\n", __func__);
3689 debugfs_remove_recursive(platform->debugfs);