1b8e80941Smrg/*
2b8e80941Smrg * Copyright © 2018 Intel Corporation
3b8e80941Smrg *
4b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5b8e80941Smrg * copy of this software and associated documentation files (the "Software"),
6b8e80941Smrg * to deal in the Software without restriction, including without limitation
7b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the
9b8e80941Smrg * Software is furnished to do so, subject to the following conditions:
10b8e80941Smrg *
11b8e80941Smrg * The above copyright notice and this permission notice (including the next
12b8e80941Smrg * paragraph) shall be included in all copies or substantial portions of the
13b8e80941Smrg * Software.
14b8e80941Smrg *
15b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16b8e80941Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19b8e80941Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20b8e80941Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21b8e80941Smrg * IN THE SOFTWARE.
22b8e80941Smrg */
23b8e80941Smrg
24b8e80941Smrg#include "gen_perf.h"
25b8e80941Smrg#include "gen_perf_mdapi.h"
26b8e80941Smrg
27b8e80941Smrg#include "dev/gen_device_info.h"
28b8e80941Smrg
29b8e80941Smrgint
30b8e80941Smrggen_perf_query_result_write_mdapi(void *data, uint32_t data_size,
31b8e80941Smrg                                  const struct gen_device_info *devinfo,
32b8e80941Smrg                                  const struct gen_perf_query_result *result,
33b8e80941Smrg                                  uint64_t freq_start, uint64_t freq_end)
34b8e80941Smrg{
35b8e80941Smrg   switch (devinfo->gen) {
36b8e80941Smrg   case 7: {
37b8e80941Smrg      struct gen7_mdapi_metrics *mdapi_data = (struct gen7_mdapi_metrics *) data;
38b8e80941Smrg
39b8e80941Smrg      if (data_size < sizeof(*mdapi_data))
40b8e80941Smrg         return 0;
41b8e80941Smrg
42b8e80941Smrg      assert(devinfo->is_haswell);
43b8e80941Smrg
44b8e80941Smrg      for (int i = 0; i < ARRAY_SIZE(mdapi_data->ACounters); i++)
45b8e80941Smrg         mdapi_data->ACounters[i] = result->accumulator[1 + i];
46b8e80941Smrg
47b8e80941Smrg      for (int i = 0; i < ARRAY_SIZE(mdapi_data->NOACounters); i++) {
48b8e80941Smrg         mdapi_data->NOACounters[i] =
49b8e80941Smrg            result->accumulator[1 + ARRAY_SIZE(mdapi_data->ACounters) + i];
50b8e80941Smrg      }
51b8e80941Smrg
52b8e80941Smrg      mdapi_data->ReportsCount = result->reports_accumulated;
53b8e80941Smrg      mdapi_data->TotalTime =
54b8e80941Smrg         gen_device_info_timebase_scale(devinfo, result->accumulator[0]);
55b8e80941Smrg      mdapi_data->CoreFrequency = freq_end;
56b8e80941Smrg      mdapi_data->CoreFrequencyChanged = freq_end != freq_start;
57b8e80941Smrg      return sizeof(*mdapi_data);
58b8e80941Smrg   }
59b8e80941Smrg   case 8: {
60b8e80941Smrg      struct gen8_mdapi_metrics *mdapi_data = (struct gen8_mdapi_metrics *) data;
61b8e80941Smrg
62b8e80941Smrg      if (data_size < sizeof(*mdapi_data))
63b8e80941Smrg         return 0;
64b8e80941Smrg
65b8e80941Smrg      for (int i = 0; i < ARRAY_SIZE(mdapi_data->OaCntr); i++)
66b8e80941Smrg         mdapi_data->OaCntr[i] = result->accumulator[2 + i];
67b8e80941Smrg      for (int i = 0; i < ARRAY_SIZE(mdapi_data->NoaCntr); i++) {
68b8e80941Smrg         mdapi_data->NoaCntr[i] =
69b8e80941Smrg            result->accumulator[2 + ARRAY_SIZE(mdapi_data->OaCntr) + i];
70b8e80941Smrg      }
71b8e80941Smrg
72b8e80941Smrg      mdapi_data->ReportId = result->hw_id;
73b8e80941Smrg      mdapi_data->ReportsCount = result->reports_accumulated;
74b8e80941Smrg      mdapi_data->TotalTime =
75b8e80941Smrg         gen_device_info_timebase_scale(devinfo, result->accumulator[0]);
76b8e80941Smrg      mdapi_data->GPUTicks = result->accumulator[1];
77b8e80941Smrg      mdapi_data->CoreFrequency = freq_end;
78b8e80941Smrg      mdapi_data->CoreFrequencyChanged = freq_end != freq_start;
79b8e80941Smrg      mdapi_data->SliceFrequency =
80b8e80941Smrg         (result->slice_frequency[0] + result->slice_frequency[1]) / 2ULL;
81b8e80941Smrg      mdapi_data->UnsliceFrequency =
82b8e80941Smrg         (result->unslice_frequency[0] + result->unslice_frequency[1]) / 2ULL;
83b8e80941Smrg      return sizeof(*mdapi_data);
84b8e80941Smrg   }
85b8e80941Smrg   case 9:
86b8e80941Smrg   case 10:
87b8e80941Smrg   case 11: {
88b8e80941Smrg      struct gen9_mdapi_metrics *mdapi_data = (struct gen9_mdapi_metrics *) data;
89b8e80941Smrg
90b8e80941Smrg      if (data_size < sizeof(*mdapi_data))
91b8e80941Smrg         return 0;
92b8e80941Smrg
93b8e80941Smrg      for (int i = 0; i < ARRAY_SIZE(mdapi_data->OaCntr); i++)
94b8e80941Smrg         mdapi_data->OaCntr[i] = result->accumulator[2 + i];
95b8e80941Smrg      for (int i = 0; i < ARRAY_SIZE(mdapi_data->NoaCntr); i++) {
96b8e80941Smrg         mdapi_data->NoaCntr[i] =
97b8e80941Smrg            result->accumulator[2 + ARRAY_SIZE(mdapi_data->OaCntr) + i];
98b8e80941Smrg      }
99b8e80941Smrg
100b8e80941Smrg      mdapi_data->ReportId = result->hw_id;
101b8e80941Smrg      mdapi_data->ReportsCount = result->reports_accumulated;
102b8e80941Smrg      mdapi_data->TotalTime =
103b8e80941Smrg         gen_device_info_timebase_scale(devinfo, result->accumulator[0]);
104b8e80941Smrg      mdapi_data->GPUTicks = result->accumulator[1];
105b8e80941Smrg      mdapi_data->CoreFrequency = freq_end;
106b8e80941Smrg      mdapi_data->CoreFrequencyChanged = freq_end != freq_start;
107b8e80941Smrg      mdapi_data->SliceFrequency =
108b8e80941Smrg         (result->slice_frequency[0] + result->slice_frequency[1]) / 2ULL;
109b8e80941Smrg      mdapi_data->UnsliceFrequency =
110b8e80941Smrg         (result->unslice_frequency[0] + result->unslice_frequency[1]) / 2ULL;
111b8e80941Smrg      return sizeof(*mdapi_data);
112b8e80941Smrg   }
113b8e80941Smrg   default:
114b8e80941Smrg      unreachable("unexpected gen");
115b8e80941Smrg   }
116b8e80941Smrg}
117