blob: 09fbd33764e8dd4be49235fa9168d9dfe45327fe [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"
19
20struct etnaviv_pm_domain;
21
22struct etnaviv_pm_signal {
23 char name[64];
24 u32 data;
25
26 u32 (*sample)(struct etnaviv_gpu *gpu,
27 const struct etnaviv_pm_domain *domain,
28 const struct etnaviv_pm_signal *signal);
29};
30
31struct etnaviv_pm_domain {
32 char name[64];
33 u8 nr_signals;
34 const struct etnaviv_pm_signal *signal;
35};
36
37struct etnaviv_pm_domain_meta {
38 const struct etnaviv_pm_domain *domains;
39 u32 nr_domains;
40};
41
42static const struct etnaviv_pm_domain doms_3d[] = {
43};
44
45static const struct etnaviv_pm_domain doms_2d[] = {
46};
47
48static const struct etnaviv_pm_domain doms_vg[] = {
49};
50
51static const struct etnaviv_pm_domain_meta doms_meta[] = {
52 {
53 .nr_domains = ARRAY_SIZE(doms_3d),
54 .domains = &doms_3d[0]
55 },
56 {
57 .nr_domains = ARRAY_SIZE(doms_2d),
58 .domains = &doms_2d[0]
59 },
60 {
61 .nr_domains = ARRAY_SIZE(doms_vg),
62 .domains = &doms_vg[0]
63 }
64};
65
66int etnaviv_pm_query_dom(struct etnaviv_gpu *gpu,
67 struct drm_etnaviv_pm_domain *domain)
68{
69 const struct etnaviv_pm_domain_meta *meta = &doms_meta[domain->pipe];
70 const struct etnaviv_pm_domain *dom;
71
72 if (domain->iter >= meta->nr_domains)
73 return -EINVAL;
74
75 dom = meta->domains + domain->iter;
76
77 domain->id = domain->iter;
78 domain->nr_signals = dom->nr_signals;
79 strncpy(domain->name, dom->name, sizeof(domain->name));
80
81 domain->iter++;
82 if (domain->iter == meta->nr_domains)
83 domain->iter = 0xff;
84
85 return 0;
86}
87
88int etnaviv_pm_query_sig(struct etnaviv_gpu *gpu,
89 struct drm_etnaviv_pm_signal *signal)
90{
91 const struct etnaviv_pm_domain_meta *meta = &doms_meta[signal->pipe];
92 const struct etnaviv_pm_domain *dom;
93 const struct etnaviv_pm_signal *sig;
94
95 if (signal->domain >= meta->nr_domains)
96 return -EINVAL;
97
98 dom = meta->domains + signal->domain;
99
100 if (signal->iter > dom->nr_signals)
101 return -EINVAL;
102
103 sig = &dom->signal[signal->iter];
104
105 signal->id = signal->iter;
106 strncpy(signal->name, sig->name, sizeof(signal->name));
107
108 signal->iter++;
109 if (signal->iter == dom->nr_signals)
110 signal->iter = 0xffff;
111
112 return 0;
113}
Christian Gmeiner46df52c2017-09-24 15:15:25 +0200114
115int etnaviv_pm_req_validate(const struct drm_etnaviv_gem_submit_pmr *r,
116 u32 exec_state)
117{
118 const struct etnaviv_pm_domain_meta *meta = &doms_meta[exec_state];
119 const struct etnaviv_pm_domain *dom;
120
121 if (r->domain >= meta->nr_domains)
122 return -EINVAL;
123
124 dom = meta->domains + r->domain;
125
126 if (r->signal > dom->nr_signals)
127 return -EINVAL;
128
129 return 0;
130}