xref: /aosp_15_r20/external/mesa3d/src/amd/vulkan/radv_spm.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Valve Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  */
6*61046927SAndroid Build Coastguard Worker 
7*61046927SAndroid Build Coastguard Worker #include <inttypes.h>
8*61046927SAndroid Build Coastguard Worker 
9*61046927SAndroid Build Coastguard Worker #include "radv_buffer.h"
10*61046927SAndroid Build Coastguard Worker #include "radv_cs.h"
11*61046927SAndroid Build Coastguard Worker #include "radv_spm.h"
12*61046927SAndroid Build Coastguard Worker #include "sid.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #define SPM_RING_BASE_ALIGN 32
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker static bool
radv_spm_init_bo(struct radv_device * device)17*61046927SAndroid Build Coastguard Worker radv_spm_init_bo(struct radv_device *device)
18*61046927SAndroid Build Coastguard Worker {
19*61046927SAndroid Build Coastguard Worker    struct radeon_winsys *ws = device->ws;
20*61046927SAndroid Build Coastguard Worker    uint64_t size = 32 * 1024 * 1024; /* Default to 1MB. */
21*61046927SAndroid Build Coastguard Worker    uint16_t sample_interval = 4096;  /* Default to 4096 clk. */
22*61046927SAndroid Build Coastguard Worker    VkResult result;
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker    device->spm.buffer_size = size;
25*61046927SAndroid Build Coastguard Worker    device->spm.sample_interval = sample_interval;
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker    struct radeon_winsys_bo *bo = NULL;
28*61046927SAndroid Build Coastguard Worker    result = radv_bo_create(device, NULL, size, 4096, RADEON_DOMAIN_VRAM,
29*61046927SAndroid Build Coastguard Worker                            RADEON_FLAG_CPU_ACCESS | RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_ZERO_VRAM,
30*61046927SAndroid Build Coastguard Worker                            RADV_BO_PRIORITY_SCRATCH, 0, true, &bo);
31*61046927SAndroid Build Coastguard Worker    device->spm.bo = bo;
32*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
33*61046927SAndroid Build Coastguard Worker       return false;
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker    result = ws->buffer_make_resident(ws, device->spm.bo, true);
36*61046927SAndroid Build Coastguard Worker    if (result != VK_SUCCESS)
37*61046927SAndroid Build Coastguard Worker       return false;
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker    device->spm.ptr = radv_buffer_map(ws, device->spm.bo);
40*61046927SAndroid Build Coastguard Worker    if (!device->spm.ptr)
41*61046927SAndroid Build Coastguard Worker       return false;
42*61046927SAndroid Build Coastguard Worker 
43*61046927SAndroid Build Coastguard Worker    return true;
44*61046927SAndroid Build Coastguard Worker }
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker static void
radv_emit_spm_counters(struct radv_device * device,struct radeon_cmdbuf * cs,enum radv_queue_family qf)47*61046927SAndroid Build Coastguard Worker radv_emit_spm_counters(struct radv_device *device, struct radeon_cmdbuf *cs, enum radv_queue_family qf)
48*61046927SAndroid Build Coastguard Worker {
49*61046927SAndroid Build Coastguard Worker    const struct radv_physical_device *pdev = radv_device_physical(device);
50*61046927SAndroid Build Coastguard Worker    const enum amd_gfx_level gfx_level = pdev->info.gfx_level;
51*61046927SAndroid Build Coastguard Worker    struct ac_spm *spm = &device->spm;
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    if (gfx_level >= GFX11) {
54*61046927SAndroid Build Coastguard Worker       for (uint32_t instance = 0; instance < ARRAY_SIZE(spm->sq_wgp); instance++) {
55*61046927SAndroid Build Coastguard Worker          uint32_t num_counters = spm->sq_wgp[instance].num_counters;
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker          if (!num_counters)
58*61046927SAndroid Build Coastguard Worker             continue;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker          radeon_check_space(device->ws, cs, 3 + num_counters * 3);
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker          radeon_set_uconfig_reg(cs, R_030800_GRBM_GFX_INDEX, spm->sq_wgp[instance].grbm_gfx_index);
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker          for (uint32_t b = 0; b < num_counters; b++) {
65*61046927SAndroid Build Coastguard Worker             const struct ac_spm_counter_select *cntr_sel = &spm->sq_wgp[instance].counters[b];
66*61046927SAndroid Build Coastguard Worker             uint32_t reg_base = R_036700_SQ_PERFCOUNTER0_SELECT;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker             radeon_set_uconfig_perfctr_reg_seq(gfx_level, qf, cs, reg_base + b * 4, 1);
69*61046927SAndroid Build Coastguard Worker             radeon_emit(cs, cntr_sel->sel0);
70*61046927SAndroid Build Coastguard Worker          }
71*61046927SAndroid Build Coastguard Worker       }
72*61046927SAndroid Build Coastguard Worker    }
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker    for (uint32_t instance = 0; instance < ARRAY_SIZE(spm->sqg); instance++) {
75*61046927SAndroid Build Coastguard Worker       uint32_t num_counters = spm->sqg[instance].num_counters;
76*61046927SAndroid Build Coastguard Worker 
77*61046927SAndroid Build Coastguard Worker       if (!num_counters)
78*61046927SAndroid Build Coastguard Worker          continue;
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker       radeon_check_space(device->ws, cs, 3 + num_counters * 3);
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker       radeon_set_uconfig_reg(
83*61046927SAndroid Build Coastguard Worker          cs, R_030800_GRBM_GFX_INDEX,
84*61046927SAndroid Build Coastguard Worker          S_030800_SH_BROADCAST_WRITES(1) | S_030800_INSTANCE_BROADCAST_WRITES(1) | S_030800_SE_INDEX(instance));
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker       for (uint32_t b = 0; b < num_counters; b++) {
87*61046927SAndroid Build Coastguard Worker          const struct ac_spm_counter_select *cntr_sel = &spm->sqg[instance].counters[b];
88*61046927SAndroid Build Coastguard Worker          uint32_t reg_base = R_036700_SQ_PERFCOUNTER0_SELECT;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker          radeon_set_uconfig_perfctr_reg_seq(gfx_level, qf, cs, reg_base + b * 4, 1);
91*61046927SAndroid Build Coastguard Worker          radeon_emit(cs, cntr_sel->sel0 | S_036700_SQC_BANK_MASK(0xf)); /* SQC_BANK_MASK only gfx10 */
92*61046927SAndroid Build Coastguard Worker       }
93*61046927SAndroid Build Coastguard Worker    }
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    for (uint32_t b = 0; b < spm->num_block_sel; b++) {
96*61046927SAndroid Build Coastguard Worker       struct ac_spm_block_select *block_sel = &spm->block_sel[b];
97*61046927SAndroid Build Coastguard Worker       struct ac_pc_block_base *regs = block_sel->b->b->b;
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker       for (unsigned i = 0; i < block_sel->num_instances; i++) {
100*61046927SAndroid Build Coastguard Worker          struct ac_spm_block_instance *block_instance = &block_sel->instances[i];
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker          radeon_check_space(device->ws, cs, 3 + (AC_SPM_MAX_COUNTER_PER_BLOCK * 6));
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker          radeon_set_uconfig_reg(cs, R_030800_GRBM_GFX_INDEX, block_instance->grbm_gfx_index);
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker          for (unsigned c = 0; c < block_instance->num_counters; c++) {
107*61046927SAndroid Build Coastguard Worker             const struct ac_spm_counter_select *cntr_sel = &block_instance->counters[c];
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker             if (!cntr_sel->active)
110*61046927SAndroid Build Coastguard Worker                continue;
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker             radeon_set_uconfig_perfctr_reg_seq(gfx_level, qf, cs, regs->select0[c], 1);
113*61046927SAndroid Build Coastguard Worker             radeon_emit(cs, cntr_sel->sel0);
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker             radeon_set_uconfig_perfctr_reg_seq(gfx_level, qf, cs, regs->select1[c], 1);
116*61046927SAndroid Build Coastguard Worker             radeon_emit(cs, cntr_sel->sel1);
117*61046927SAndroid Build Coastguard Worker          }
118*61046927SAndroid Build Coastguard Worker       }
119*61046927SAndroid Build Coastguard Worker    }
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker    /* Restore global broadcasting. */
122*61046927SAndroid Build Coastguard Worker    radeon_set_uconfig_reg(
123*61046927SAndroid Build Coastguard Worker       cs, R_030800_GRBM_GFX_INDEX,
124*61046927SAndroid Build Coastguard Worker       S_030800_SE_BROADCAST_WRITES(1) | S_030800_SH_BROADCAST_WRITES(1) | S_030800_INSTANCE_BROADCAST_WRITES(1));
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker void
radv_emit_spm_setup(struct radv_device * device,struct radeon_cmdbuf * cs,enum radv_queue_family qf)128*61046927SAndroid Build Coastguard Worker radv_emit_spm_setup(struct radv_device *device, struct radeon_cmdbuf *cs, enum radv_queue_family qf)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    const struct radv_physical_device *pdev = radv_device_physical(device);
131*61046927SAndroid Build Coastguard Worker    const enum amd_gfx_level gfx_level = pdev->info.gfx_level;
132*61046927SAndroid Build Coastguard Worker    struct ac_spm *spm = &device->spm;
133*61046927SAndroid Build Coastguard Worker    uint64_t va = radv_buffer_get_va(spm->bo);
134*61046927SAndroid Build Coastguard Worker    uint64_t ring_size = spm->buffer_size;
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker    /* It's required that the ring VA and the size are correctly aligned. */
137*61046927SAndroid Build Coastguard Worker    assert(!(va & (SPM_RING_BASE_ALIGN - 1)));
138*61046927SAndroid Build Coastguard Worker    assert(!(ring_size & (SPM_RING_BASE_ALIGN - 1)));
139*61046927SAndroid Build Coastguard Worker    assert(spm->sample_interval >= 32);
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    radeon_check_space(device->ws, cs, 27);
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker    /* Configure the SPM ring buffer. */
144*61046927SAndroid Build Coastguard Worker    radeon_set_uconfig_reg(cs, R_037200_RLC_SPM_PERFMON_CNTL,
145*61046927SAndroid Build Coastguard Worker                           S_037200_PERFMON_RING_MODE(0) | /* no stall and no interrupt on overflow */
146*61046927SAndroid Build Coastguard Worker                              S_037200_PERFMON_SAMPLE_INTERVAL(spm->sample_interval)); /* in sclk */
147*61046927SAndroid Build Coastguard Worker    radeon_set_uconfig_reg(cs, R_037204_RLC_SPM_PERFMON_RING_BASE_LO, va);
148*61046927SAndroid Build Coastguard Worker    radeon_set_uconfig_reg(cs, R_037208_RLC_SPM_PERFMON_RING_BASE_HI, S_037208_RING_BASE_HI(va >> 32));
149*61046927SAndroid Build Coastguard Worker    radeon_set_uconfig_reg(cs, R_03720C_RLC_SPM_PERFMON_RING_SIZE, ring_size);
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker    /* Configure the muxsel. */
152*61046927SAndroid Build Coastguard Worker    uint32_t total_muxsel_lines = 0;
153*61046927SAndroid Build Coastguard Worker    for (unsigned s = 0; s < AC_SPM_SEGMENT_TYPE_COUNT; s++) {
154*61046927SAndroid Build Coastguard Worker       total_muxsel_lines += spm->num_muxsel_lines[s];
155*61046927SAndroid Build Coastguard Worker    }
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker    radeon_set_uconfig_reg(cs, R_03726C_RLC_SPM_ACCUM_MODE, 0);
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker    if (pdev->info.gfx_level >= GFX11) {
160*61046927SAndroid Build Coastguard Worker       radeon_set_uconfig_reg(cs, R_03721C_RLC_SPM_PERFMON_SEGMENT_SIZE,
161*61046927SAndroid Build Coastguard Worker                              S_03721C_TOTAL_NUM_SEGMENT(total_muxsel_lines) |
162*61046927SAndroid Build Coastguard Worker                                 S_03721C_GLOBAL_NUM_SEGMENT(spm->num_muxsel_lines[AC_SPM_SEGMENT_TYPE_GLOBAL]) |
163*61046927SAndroid Build Coastguard Worker                                 S_03721C_SE_NUM_SEGMENT(spm->max_se_muxsel_lines));
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker       radeon_set_uconfig_reg(cs, R_037210_RLC_SPM_RING_WRPTR, 0);
166*61046927SAndroid Build Coastguard Worker    } else {
167*61046927SAndroid Build Coastguard Worker       radeon_set_uconfig_reg(cs, R_037210_RLC_SPM_PERFMON_SEGMENT_SIZE, 0);
168*61046927SAndroid Build Coastguard Worker       radeon_set_uconfig_reg(cs, R_03727C_RLC_SPM_PERFMON_SE3TO0_SEGMENT_SIZE,
169*61046927SAndroid Build Coastguard Worker                              S_03727C_SE0_NUM_LINE(spm->num_muxsel_lines[AC_SPM_SEGMENT_TYPE_SE0]) |
170*61046927SAndroid Build Coastguard Worker                                 S_03727C_SE1_NUM_LINE(spm->num_muxsel_lines[AC_SPM_SEGMENT_TYPE_SE1]) |
171*61046927SAndroid Build Coastguard Worker                                 S_03727C_SE2_NUM_LINE(spm->num_muxsel_lines[AC_SPM_SEGMENT_TYPE_SE2]) |
172*61046927SAndroid Build Coastguard Worker                                 S_03727C_SE3_NUM_LINE(spm->num_muxsel_lines[AC_SPM_SEGMENT_TYPE_SE3]));
173*61046927SAndroid Build Coastguard Worker       radeon_set_uconfig_reg(cs, R_037280_RLC_SPM_PERFMON_GLB_SEGMENT_SIZE,
174*61046927SAndroid Build Coastguard Worker                              S_037280_PERFMON_SEGMENT_SIZE(total_muxsel_lines) |
175*61046927SAndroid Build Coastguard Worker                                 S_037280_GLOBAL_NUM_LINE(spm->num_muxsel_lines[AC_SPM_SEGMENT_TYPE_GLOBAL]));
176*61046927SAndroid Build Coastguard Worker    }
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker    /* Upload each muxsel ram to the RLC. */
179*61046927SAndroid Build Coastguard Worker    for (unsigned s = 0; s < AC_SPM_SEGMENT_TYPE_COUNT; s++) {
180*61046927SAndroid Build Coastguard Worker       unsigned rlc_muxsel_addr, rlc_muxsel_data;
181*61046927SAndroid Build Coastguard Worker       unsigned grbm_gfx_index = S_030800_SH_BROADCAST_WRITES(1) | S_030800_INSTANCE_BROADCAST_WRITES(1);
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker       if (!spm->num_muxsel_lines[s])
184*61046927SAndroid Build Coastguard Worker          continue;
185*61046927SAndroid Build Coastguard Worker 
186*61046927SAndroid Build Coastguard Worker       if (s == AC_SPM_SEGMENT_TYPE_GLOBAL) {
187*61046927SAndroid Build Coastguard Worker          grbm_gfx_index |= S_030800_SE_BROADCAST_WRITES(1);
188*61046927SAndroid Build Coastguard Worker 
189*61046927SAndroid Build Coastguard Worker          rlc_muxsel_addr =
190*61046927SAndroid Build Coastguard Worker             gfx_level >= GFX11 ? R_037220_RLC_SPM_GLOBAL_MUXSEL_ADDR : R_037224_RLC_SPM_GLOBAL_MUXSEL_ADDR;
191*61046927SAndroid Build Coastguard Worker          rlc_muxsel_data =
192*61046927SAndroid Build Coastguard Worker             gfx_level >= GFX11 ? R_037224_RLC_SPM_GLOBAL_MUXSEL_DATA : R_037228_RLC_SPM_GLOBAL_MUXSEL_DATA;
193*61046927SAndroid Build Coastguard Worker       } else {
194*61046927SAndroid Build Coastguard Worker          grbm_gfx_index |= S_030800_SE_INDEX(s);
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker          rlc_muxsel_addr = gfx_level >= GFX11 ? R_037228_RLC_SPM_SE_MUXSEL_ADDR : R_03721C_RLC_SPM_SE_MUXSEL_ADDR;
197*61046927SAndroid Build Coastguard Worker          rlc_muxsel_data = gfx_level >= GFX11 ? R_03722C_RLC_SPM_SE_MUXSEL_DATA : R_037220_RLC_SPM_SE_MUXSEL_DATA;
198*61046927SAndroid Build Coastguard Worker       }
199*61046927SAndroid Build Coastguard Worker 
200*61046927SAndroid Build Coastguard Worker       radeon_check_space(device->ws, cs, 3 + spm->num_muxsel_lines[s] * (7 + AC_SPM_MUXSEL_LINE_SIZE));
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker       radeon_set_uconfig_reg(cs, R_030800_GRBM_GFX_INDEX, grbm_gfx_index);
203*61046927SAndroid Build Coastguard Worker 
204*61046927SAndroid Build Coastguard Worker       for (unsigned l = 0; l < spm->num_muxsel_lines[s]; l++) {
205*61046927SAndroid Build Coastguard Worker          uint32_t *data = (uint32_t *)spm->muxsel_lines[s][l].muxsel;
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker          /* Select MUXSEL_ADDR to point to the next muxsel. */
208*61046927SAndroid Build Coastguard Worker          radeon_set_uconfig_perfctr_reg(gfx_level, qf, cs, rlc_muxsel_addr, l * AC_SPM_MUXSEL_LINE_SIZE);
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker          /* Write the muxsel line configuration with MUXSEL_DATA. */
211*61046927SAndroid Build Coastguard Worker          radeon_emit(cs, PKT3(PKT3_WRITE_DATA, 2 + AC_SPM_MUXSEL_LINE_SIZE, 0));
212*61046927SAndroid Build Coastguard Worker          radeon_emit(cs, S_370_DST_SEL(V_370_MEM_MAPPED_REGISTER) | S_370_WR_CONFIRM(1) | S_370_ENGINE_SEL(V_370_ME) |
213*61046927SAndroid Build Coastguard Worker                             S_370_WR_ONE_ADDR(1));
214*61046927SAndroid Build Coastguard Worker          radeon_emit(cs, rlc_muxsel_data >> 2);
215*61046927SAndroid Build Coastguard Worker          radeon_emit(cs, 0);
216*61046927SAndroid Build Coastguard Worker          radeon_emit_array(cs, data, AC_SPM_MUXSEL_LINE_SIZE);
217*61046927SAndroid Build Coastguard Worker       }
218*61046927SAndroid Build Coastguard Worker    }
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker    /* Select SPM counters. */
221*61046927SAndroid Build Coastguard Worker    radv_emit_spm_counters(device, cs, qf);
222*61046927SAndroid Build Coastguard Worker }
223*61046927SAndroid Build Coastguard Worker 
224*61046927SAndroid Build Coastguard Worker bool
radv_spm_init(struct radv_device * device)225*61046927SAndroid Build Coastguard Worker radv_spm_init(struct radv_device *device)
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker    struct radv_physical_device *pdev = radv_device_physical(device);
228*61046927SAndroid Build Coastguard Worker    const struct radeon_info *gpu_info = &pdev->info;
229*61046927SAndroid Build Coastguard Worker    struct ac_perfcounters *pc = &pdev->ac_perfcounters;
230*61046927SAndroid Build Coastguard Worker 
231*61046927SAndroid Build Coastguard Worker    /* We failed to initialize the performance counters. */
232*61046927SAndroid Build Coastguard Worker    if (!pc->blocks)
233*61046927SAndroid Build Coastguard Worker       return false;
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker    if (!ac_init_spm(gpu_info, pc, &device->spm))
236*61046927SAndroid Build Coastguard Worker       return false;
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker    if (!radv_spm_init_bo(device))
239*61046927SAndroid Build Coastguard Worker       return false;
240*61046927SAndroid Build Coastguard Worker 
241*61046927SAndroid Build Coastguard Worker    return true;
242*61046927SAndroid Build Coastguard Worker }
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker void
radv_spm_finish(struct radv_device * device)245*61046927SAndroid Build Coastguard Worker radv_spm_finish(struct radv_device *device)
246*61046927SAndroid Build Coastguard Worker {
247*61046927SAndroid Build Coastguard Worker    struct radeon_winsys *ws = device->ws;
248*61046927SAndroid Build Coastguard Worker 
249*61046927SAndroid Build Coastguard Worker    if (device->spm.bo) {
250*61046927SAndroid Build Coastguard Worker       ws->buffer_make_resident(ws, device->spm.bo, false);
251*61046927SAndroid Build Coastguard Worker       radv_bo_destroy(device, NULL, device->spm.bo);
252*61046927SAndroid Build Coastguard Worker    }
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker    ac_destroy_spm(&device->spm);
255*61046927SAndroid Build Coastguard Worker }
256