blob: ba60cb9192c7bcf6f8124ca7ab37f331f5da81df [file] [log] [blame]
Christian Gmeiner9e2c2e22017-09-24 15:15:21 +02001/*
2 * Copyright (C) 2017 Etnaviv Project
3 * Copyright (C) 2017 Zodiac Inflight Innovations
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "etnaviv_gpu.h"
Christian Gmeiner249300c2017-09-24 15:15:27 +020019#include "etnaviv_perfmon.h"
Christian Gmeiner9e2c2e22017-09-24 15:15:21 +020020
21struct etnaviv_pm_domain;
22
23struct etnaviv_pm_signal {
24 char name[64];
25 u32 data;
26
27 u32 (*sample)(struct etnaviv_gpu *gpu,
28 const struct etnaviv_pm_domain *domain,
29 const struct etnaviv_pm_signal *signal);
30};
31
32struct etnaviv_pm_domain {
33 char name[64];
34 u8 nr_signals;
35 const struct etnaviv_pm_signal *signal;
36};
37
38struct etnaviv_pm_domain_meta {
39 const struct etnaviv_pm_domain *domains;
40 u32 nr_domains;
41};
42
43static const struct etnaviv_pm_domain doms_3d[] = {
44};
45
46static const struct etnaviv_pm_domain doms_2d[] = {
47};
48
49static const struct etnaviv_pm_domain doms_vg[] = {
50};
51
52static const struct etnaviv_pm_domain_meta doms_meta[] = {
53 {
54 .nr_domains = ARRAY_SIZE(doms_3d),
55 .domains = &doms_3d[0]
56 },
57 {
58 .nr_domains = ARRAY_SIZE(doms_2d),
59 .domains = &doms_2d[0]
60 },
61 {
62 .nr_domains = ARRAY_SIZE(doms_vg),
63 .domains = &doms_vg[0]
64 }
65};
66
67int etnaviv_pm_query_dom(struct etnaviv_gpu *gpu,
68 struct drm_etnaviv_pm_domain *domain)
69{
70 const struct etnaviv_pm_domain_meta *meta = &doms_meta[domain->pipe];
71 const struct etnaviv_pm_domain *dom;
72
73 if (domain->iter >= meta->nr_domains)
74 return -EINVAL;
75
76 dom = meta->domains + domain->iter;
77
78 domain->id = domain->iter;
79 domain->nr_signals = dom->nr_signals;
80 strncpy(domain->name, dom->name, sizeof(domain->name));
81
82 domain->iter++;
83 if (domain->iter == meta->nr_domains)
84 domain->iter = 0xff;
85
86 return 0;
87}
88
89int etnaviv_pm_query_sig(struct etnaviv_gpu *gpu,
90 struct drm_etnaviv_pm_signal *signal)
91{
92 const struct etnaviv_pm_domain_meta *meta = &doms_meta[signal->pipe];
93 const struct etnaviv_pm_domain *dom;
94 const struct etnaviv_pm_signal *sig;
95
96 if (signal->domain >= meta->nr_domains)
97 return -EINVAL;
98
99 dom = meta->domains + signal->domain;
100
101 if (signal->iter > dom->nr_signals)
102 return -EINVAL;
103
104 sig = &dom->signal[signal->iter];
105
106 signal->id = signal->iter;
107 strncpy(signal->name, sig->name, sizeof(signal->name));
108
109 signal->iter++;
110 if (signal->iter == dom->nr_signals)
111 signal->iter = 0xffff;
112
113 return 0;
114}
Christian Gmeiner46df52c2017-09-24 15:15:25 +0200115
116int etnaviv_pm_req_validate(const struct drm_etnaviv_gem_submit_pmr *r,
117 u32 exec_state)
118{
119 const struct etnaviv_pm_domain_meta *meta = &doms_meta[exec_state];
120 const struct etnaviv_pm_domain *dom;
121
122 if (r->domain >= meta->nr_domains)
123 return -EINVAL;
124
125 dom = meta->domains + r->domain;
126
127 if (r->signal > dom->nr_signals)
128 return -EINVAL;
129
130 return 0;
131}
Christian Gmeiner249300c2017-09-24 15:15:27 +0200132
133void etnaviv_perfmon_process(struct etnaviv_gpu *gpu,
134 const struct etnaviv_perfmon_request *pmr)
135{
136 const struct etnaviv_pm_domain_meta *meta = &doms_meta[gpu->exec_state];
137 const struct etnaviv_pm_domain *dom;
138 const struct etnaviv_pm_signal *sig;
139 u32 *bo = pmr->bo_vma;
140 u32 val;
141
142 dom = meta->domains + pmr->domain;
143 sig = &dom->signal[pmr->signal];
144 val = sig->sample(gpu, dom, sig);
145
146 *(bo + pmr->offset) = val;
147}