1848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset/*
2848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * Copyright 2015 Samuel Pitoiset
3848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset *
4848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * Permission is hereby granted, free of charge, to any person obtaining a
5848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * copy of this software and associated documentation files (the "Software"),
6848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * to deal in the Software without restriction, including without limitation
7848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * and/or sell copies of the Software, and to permit persons to whom the
9848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * Software is furnished to do so, subject to the following conditions:
10848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset *
11848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * The above copyright notice and this permission notice shall be included in
12848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * all copies or substantial portions of the Software.
13848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset *
14848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset * OTHER DEALINGS IN THE SOFTWARE.
21848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset */
22848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
23848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset#include "nv50/nv50_context.h"
24848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset#include "nv50/nv50_query_hw_metric.h"
25848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset#include "nv50/nv50_query_hw_sm.h"
26848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
27848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset/* === PERFORMANCE MONITORING METRICS for NV84+ === */
28848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic const char *nv50_hw_metric_names[] =
29848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
30848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   "metric-branch_efficiency",
31848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset};
32848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
33848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstruct nv50_hw_metric_query_cfg {
34848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   uint32_t queries[4];
35848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   uint32_t num_queries;
36848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset};
37848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
38848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset#define _SM(n) NV50_HW_SM_QUERY(NV50_HW_SM_QUERY_ ##n)
39848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset#define _M(n, c) [NV50_HW_METRIC_QUERY_##n] = c
40848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
41848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset/* ==== Compute capability 1.1 (G84+) ==== */
42848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic const struct nv50_hw_metric_query_cfg
43848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetsm11_branch_efficiency =
44848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
45848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   .queries[0]  = _SM(BRANCH),
46848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   .queries[1]  = _SM(DIVERGENT_BRANCH),
47848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   .num_queries = 2,
48848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset};
49848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
50848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic const struct nv50_hw_metric_query_cfg *sm11_hw_metric_queries[] =
51848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
52848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   _M(BRANCH_EFFICIENCY, &sm11_branch_efficiency),
53848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset};
54848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
55848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset#undef _SM
56848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset#undef _M
57848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
58848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic const struct nv50_hw_metric_query_cfg *
59848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetnv50_hw_metric_query_get_cfg(struct nv50_context *nv50,
60848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset                             struct nv50_hw_query *hq)
61848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
62848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   struct nv50_query *q = &hq->base;
63848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   return sm11_hw_metric_queries[q->type - NV50_HW_METRIC_QUERY(0)];
64848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
65848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
66848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic void
67848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetnv50_hw_metric_destroy_query(struct nv50_context *nv50,
68848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset                             struct nv50_hw_query *hq)
69848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
70848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   struct nv50_hw_metric_query *hmq = nv50_hw_metric_query(hq);
71848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   unsigned i;
72848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
73848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   for (i = 0; i < hmq->num_queries; i++)
74aeee7f2a4dc7ceddace91ef5e91790483f4597e0Samuel Pitoiset      if (hmq->queries[i]->funcs->destroy_query)
75aeee7f2a4dc7ceddace91ef5e91790483f4597e0Samuel Pitoiset         hmq->queries[i]->funcs->destroy_query(nv50, hmq->queries[i]);
76848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   FREE(hmq);
77848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
78848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
79848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic boolean
80848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetnv50_hw_metric_begin_query(struct nv50_context *nv50, struct nv50_hw_query *hq)
81848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
82848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   struct nv50_hw_metric_query *hmq = nv50_hw_metric_query(hq);
83848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   boolean ret = false;
84848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   unsigned i;
85848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
86848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   for (i = 0; i < hmq->num_queries; i++) {
87848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      ret = hmq->queries[i]->funcs->begin_query(nv50, hmq->queries[i]);
88848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      if (!ret)
89848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         return ret;
90848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   }
91848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   return ret;
92848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
93848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
94848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic void
95848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetnv50_hw_metric_end_query(struct nv50_context *nv50, struct nv50_hw_query *hq)
96848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
97848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   struct nv50_hw_metric_query *hmq = nv50_hw_metric_query(hq);
98848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   unsigned i;
99848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
100848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   for (i = 0; i < hmq->num_queries; i++)
101848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      hmq->queries[i]->funcs->end_query(nv50, hmq->queries[i]);
102848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
103848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
104848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic uint64_t
105848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetsm11_hw_metric_calc_result(struct nv50_hw_query *hq, uint64_t res64[8])
106848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
107848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   switch (hq->base.type - NV50_HW_METRIC_QUERY(0)) {
108848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   case NV50_HW_METRIC_QUERY_BRANCH_EFFICIENCY:
109848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      /* (branch / (branch + divergent_branch)) * 100 */
110848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      if (res64[0] + res64[1])
111848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         return (res64[0] / (double)(res64[0] + res64[1])) * 100;
112848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      break;
113848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   default:
114848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      debug_printf("invalid metric type: %d\n",
115848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset                   hq->base.type - NV50_HW_METRIC_QUERY(0));
116848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      break;
117848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   }
118848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   return 0;
119848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
120848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
121848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic boolean
122848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetnv50_hw_metric_get_query_result(struct nv50_context *nv50,
123848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset                                struct nv50_hw_query *hq, boolean wait,
124848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset                                union pipe_query_result *result)
125848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
126848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   struct nv50_hw_metric_query *hmq = nv50_hw_metric_query(hq);
127848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   union pipe_query_result results[4] = {};
128848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   uint64_t res64[4] = {};
129848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   boolean ret = false;
130848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   unsigned i;
131848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
132848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   for (i = 0; i < hmq->num_queries; i++) {
133848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      ret = hmq->queries[i]->funcs->get_query_result(nv50, hmq->queries[i],
134848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset                                                     wait, &results[i]);
135848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      if (!ret)
136848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         return ret;
137848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      res64[i] = *(uint64_t *)&results[i];
138848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   }
139848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
140848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   *(uint64_t *)result = sm11_hw_metric_calc_result(hq, res64);
141848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   return ret;
142848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
143848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
144848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstatic const struct nv50_hw_query_funcs hw_metric_query_funcs = {
145848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   .destroy_query = nv50_hw_metric_destroy_query,
146848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   .begin_query = nv50_hw_metric_begin_query,
147848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   .end_query = nv50_hw_metric_end_query,
148848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   .get_query_result = nv50_hw_metric_get_query_result,
149848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset};
150848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
151848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetstruct nv50_hw_query *
152848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetnv50_hw_metric_create_query(struct nv50_context *nv50, unsigned type)
153848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
154848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   const struct nv50_hw_metric_query_cfg *cfg;
155848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   struct nv50_hw_metric_query *hmq;
156848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   struct nv50_hw_query *hq;
157848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   unsigned i;
158848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
159848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   if (type < NV50_HW_METRIC_QUERY(0) || type > NV50_HW_METRIC_QUERY_LAST)
160848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      return NULL;
161848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
162848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   hmq = CALLOC_STRUCT(nv50_hw_metric_query);
163848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   if (!hmq)
164848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      return NULL;
165848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
166848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   hq = &hmq->base;
167848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   hq->funcs = &hw_metric_query_funcs;
168848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   hq->base.type = type;
169848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
170848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   cfg = nv50_hw_metric_query_get_cfg(nv50, hq);
171848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
172848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   for (i = 0; i < cfg->num_queries; i++) {
173848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      hmq->queries[i] = nv50_hw_sm_create_query(nv50, cfg->queries[i]);
174848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      if (!hmq->queries[i]) {
175848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         nv50_hw_metric_destroy_query(nv50, hq);
176848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         return NULL;
177848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      }
178848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      hmq->num_queries++;
179848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   }
180848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
181848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   return hq;
182848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
183848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
184848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetint
185848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoisetnv50_hw_metric_get_driver_query_info(struct nv50_screen *screen, unsigned id,
186848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset                                     struct pipe_driver_query_info *info)
187848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset{
188848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   int count = 0;
189848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
190848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   if (screen->compute)
191848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      if (screen->base.class_3d >= NV84_3D_CLASS)
192848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         count += NV50_HW_METRIC_QUERY_COUNT;
193848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
194848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   if (!info)
195848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      return count;
196848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset
197848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   if (id < count) {
198848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      if (screen->compute) {
199848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         if (screen->base.class_3d >= NV84_3D_CLASS) {
200848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset            info->name = nv50_hw_metric_names[id];
201848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset            info->query_type = NV50_HW_METRIC_QUERY(id);
202aede8ca9a79cafa7d019a16d38e6ee6bfc557100Samuel Pitoiset            info->group_id = NV50_HW_METRIC_QUERY_GROUP;
203848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset            return 1;
204848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset         }
205848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset      }
206848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   }
207848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset   return 0;
208848fa3101d5077b1aecfb0886c69a7d0dd7f75bcSamuel Pitoiset}
209