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