1/*
2 * Copyright © 2021 Advanced Micro Devices, Inc.
3 * All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sub license, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
15 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16 * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
17 * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20 * USE OR OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
24 * of the Software.
25 */
26
27#ifndef AC_SURFACE_TEST_COMMON_H
28#define AC_SURFACE_TEST_COMMON_H
29
30#include "ac_gpu_info.h"
31#include "amdgfxregs.h"
32
33typedef void (*gpu_init_func)(struct radeon_info *info);
34
35static void init_vega10(struct radeon_info *info)
36{
37   info->family = CHIP_VEGA10;
38   info->gfx_level = GFX9;
39   info->family_id = AMDGPU_FAMILY_AI;
40   info->chip_external_rev = 0x01;
41   info->use_display_dcc_unaligned = false;
42   info->use_display_dcc_with_retile_blit = false;
43   info->has_graphics = true;
44   info->tcc_cache_line_size = 64;
45   info->max_render_backends = 16;
46
47   info->gb_addr_config = 0x2a114042;
48}
49
50static void init_vega20(struct radeon_info *info)
51{
52   info->family = CHIP_VEGA20;
53   info->gfx_level = GFX9;
54   info->family_id = AMDGPU_FAMILY_AI;
55   info->chip_external_rev = 0x30;
56   info->use_display_dcc_unaligned = false;
57   info->use_display_dcc_with_retile_blit = false;
58   info->has_graphics = true;
59   info->tcc_cache_line_size = 64;
60   info->max_render_backends = 16;
61
62   info->gb_addr_config = 0x2a114042;
63}
64
65
66static void init_raven(struct radeon_info *info)
67{
68   info->family = CHIP_RAVEN;
69   info->gfx_level = GFX9;
70   info->family_id = AMDGPU_FAMILY_RV;
71   info->chip_external_rev = 0x01;
72   info->use_display_dcc_unaligned = false;
73   info->use_display_dcc_with_retile_blit = true;
74   info->has_graphics = true;
75   info->tcc_cache_line_size = 64;
76   info->max_render_backends = 2;
77
78   info->gb_addr_config = 0x24000042;
79}
80
81static void init_raven2(struct radeon_info *info)
82{
83   info->family = CHIP_RAVEN2;
84   info->gfx_level = GFX9;
85   info->family_id = AMDGPU_FAMILY_RV;
86   info->chip_external_rev = 0x82;
87   info->use_display_dcc_unaligned = true;
88   info->use_display_dcc_with_retile_blit = false;
89   info->has_graphics = true;
90   info->tcc_cache_line_size = 64;
91   info->max_render_backends = 1;
92
93   info->gb_addr_config = 0x26013041;
94}
95
96static void init_navi10(struct radeon_info *info)
97{
98   info->family = CHIP_NAVI10;
99   info->gfx_level = GFX10;
100   info->family_id = AMDGPU_FAMILY_NV;
101   info->chip_external_rev = 3;
102   info->use_display_dcc_unaligned = false;
103   info->use_display_dcc_with_retile_blit = false;
104   info->has_graphics = true;
105   info->tcc_cache_line_size = 128;
106
107   info->gb_addr_config = 0x00100044;
108}
109
110static void init_navi14(struct radeon_info *info)
111{
112   info->family = CHIP_NAVI14;
113   info->gfx_level = GFX10;
114   info->family_id = AMDGPU_FAMILY_NV;
115   info->chip_external_rev = 0x15;
116   info->use_display_dcc_unaligned = false;
117   info->use_display_dcc_with_retile_blit = false;
118   info->has_graphics = true;
119   info->tcc_cache_line_size = 128;
120
121   info->gb_addr_config = 0x00000043;
122}
123
124static void init_gfx103(struct radeon_info *info)
125{
126   info->family = CHIP_NAVI21; /* This doesn't affect tests. */
127   info->gfx_level = GFX10_3;
128   info->family_id = AMDGPU_FAMILY_NV;
129   info->chip_external_rev = 0x28;
130   info->use_display_dcc_unaligned = false;
131   info->use_display_dcc_with_retile_blit = true;
132   info->has_graphics = true;
133   info->tcc_cache_line_size = 128;
134   info->has_rbplus = true;
135   info->rbplus_allowed = true;
136
137   info->gb_addr_config = 0x00000040; /* Other fields are set by test cases. */
138}
139
140static void init_gfx11(struct radeon_info *info)
141{
142   info->family = CHIP_UNKNOWN;
143   info->gfx_level = GFX11;
144   info->family_id = 0x00;
145   info->chip_external_rev = 0x01;
146   info->use_display_dcc_unaligned = false;
147   info->use_display_dcc_with_retile_blit = true;
148   info->has_graphics = true;
149   info->tcc_cache_line_size = 128;
150   info->has_rbplus = true;
151   info->rbplus_allowed = true;
152
153   info->gb_addr_config = 0x00000040; /* Other fields are set by test cases. */
154}
155
156struct testcase {
157   const char *name;
158   gpu_init_func init;
159   int banks_or_pkrs;
160   int pipes;
161   int se;
162   int rb_per_se;
163};
164
165static struct testcase testcases[] = {
166   {"vega10", init_vega10, 4, 2, 2, 2},
167   {"vega10_diff_bank", init_vega10, 3, 2, 2, 2},
168   {"vega10_diff_rb", init_vega10, 4, 2, 2, 0},
169   {"vega10_diff_pipe", init_vega10, 4, 0, 2, 2},
170   {"vega10_diff_se", init_vega10, 4, 2, 1, 2},
171   {"vega20", init_vega20, 4, 2, 2, 2},
172   {"raven", init_raven, 0, 2, 0, 1},
173   {"raven2", init_raven2, 3, 1, 0, 1},
174   /* Just test a bunch of different numbers. (packers, pipes) */
175   {"navi10", init_navi10, 0, 4},
176   {"navi10_diff_pipe", init_navi10, 0, 3},
177   {"navi10_diff_pkr", init_navi10, 1, 4},
178   {"navi14", init_navi14, 1, 3},
179   {"gfx103_16pipe", init_gfx103, 4, 4},
180   {"gfx103_16pipe_8pkr", init_gfx103, 3, 4},
181   {"gfx103_8pipe", init_gfx103, 3, 3},
182   {"gfx103_4pipe", init_gfx103, 2, 2},
183   {"gfx103_4pipe_2pkr", init_gfx103, 1, 2},
184};
185
186static struct radeon_info get_radeon_info(struct testcase *testcase)
187{
188   struct radeon_info info = {
189      .drm_major = 3,
190      .drm_minor = 30,
191   };
192
193   testcase->init(&info);
194
195   switch(info.gfx_level) {
196   case GFX9:
197      info.gb_addr_config = (info.gb_addr_config &
198                             C_0098F8_NUM_PIPES &
199                             C_0098F8_NUM_BANKS &
200                             C_0098F8_NUM_SHADER_ENGINES_GFX9 &
201                             C_0098F8_NUM_RB_PER_SE) |
202                             S_0098F8_NUM_PIPES(testcase->pipes) |
203                             S_0098F8_NUM_BANKS(testcase->banks_or_pkrs) |
204                             S_0098F8_NUM_SHADER_ENGINES_GFX9(testcase->se) |
205                             S_0098F8_NUM_RB_PER_SE(testcase->rb_per_se);
206      break;
207   case GFX10:
208   case GFX10_3:
209   case GFX11:
210      info.gb_addr_config = (info.gb_addr_config &
211                             C_0098F8_NUM_PIPES &
212                             C_0098F8_NUM_PKRS) |
213                             S_0098F8_NUM_PIPES(testcase->pipes) |
214                             S_0098F8_NUM_PKRS(testcase->banks_or_pkrs);
215      /* 1 packer implies 1 RB except gfx10 where the field is ignored. */
216      info.max_render_backends = info.gfx_level == GFX10 || testcase->banks_or_pkrs ? 2 : 1;
217      break;
218   default:
219      unreachable("Unhandled generation");
220   }
221
222   return info;
223}
224
225#endif
226