1*61046927SAndroid Build Coastguard Worker // Copyright © 2024 Collabora, Ltd.
2*61046927SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
3*61046927SAndroid Build Coastguard Worker
4*61046927SAndroid Build Coastguard Worker extern crate nvidia_headers;
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker use compiler::bindings::*;
7*61046927SAndroid Build Coastguard Worker use nak_bindings::*;
8*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::{cla0c0, clc0c0, clc3c0, clc6c0};
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard Worker use bitview::*;
11*61046927SAndroid Build Coastguard Worker use paste::paste;
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Worker type QMDBitView<'a> = BitMutView<'a, [u32]>;
14*61046927SAndroid Build Coastguard Worker
15*61046927SAndroid Build Coastguard Worker trait QMD {
16*61046927SAndroid Build Coastguard Worker const GLOBAL_SIZE_LAYOUT: nak_qmd_dispatch_size_layout;
17*61046927SAndroid Build Coastguard Worker
new() -> Self18*61046927SAndroid Build Coastguard Worker fn new() -> Self;
set_barrier_count(&mut self, barrier_count: u8)19*61046927SAndroid Build Coastguard Worker fn set_barrier_count(&mut self, barrier_count: u8);
set_cbuf(&mut self, idx: u8, addr: u64, size: u32)20*61046927SAndroid Build Coastguard Worker fn set_cbuf(&mut self, idx: u8, addr: u64, size: u32);
set_global_size(&mut self, width: u32, height: u32, depth: u32)21*61046927SAndroid Build Coastguard Worker fn set_global_size(&mut self, width: u32, height: u32, depth: u32);
set_local_size(&mut self, width: u16, height: u16, depth: u16)22*61046927SAndroid Build Coastguard Worker fn set_local_size(&mut self, width: u16, height: u16, depth: u16);
set_prog_addr(&mut self, addr: u64)23*61046927SAndroid Build Coastguard Worker fn set_prog_addr(&mut self, addr: u64);
set_register_count(&mut self, register_count: u8)24*61046927SAndroid Build Coastguard Worker fn set_register_count(&mut self, register_count: u8);
set_crs_size(&mut self, crs_size: u32)25*61046927SAndroid Build Coastguard Worker fn set_crs_size(&mut self, crs_size: u32);
set_slm_size(&mut self, slm_size: u32)26*61046927SAndroid Build Coastguard Worker fn set_slm_size(&mut self, slm_size: u32);
set_smem_size(&mut self, smem_size: u32, smem_max: u32)27*61046927SAndroid Build Coastguard Worker fn set_smem_size(&mut self, smem_size: u32, smem_max: u32);
28*61046927SAndroid Build Coastguard Worker }
29*61046927SAndroid Build Coastguard Worker
30*61046927SAndroid Build Coastguard Worker macro_rules! set_enum {
31*61046927SAndroid Build Coastguard Worker ($bv:expr, $cls:ident, $strct:ident, $field:ident, $enum:ident) => {
32*61046927SAndroid Build Coastguard Worker $bv.set_field(
33*61046927SAndroid Build Coastguard Worker paste! {$cls::[<$strct _ $field>]},
34*61046927SAndroid Build Coastguard Worker paste! {$cls::[<$strct _ $field _ $enum>]},
35*61046927SAndroid Build Coastguard Worker )
36*61046927SAndroid Build Coastguard Worker };
37*61046927SAndroid Build Coastguard Worker }
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker macro_rules! set_field {
40*61046927SAndroid Build Coastguard Worker ($bv:expr, $cls:ident, $strct:ident, $field:ident, $val:expr) => {
41*61046927SAndroid Build Coastguard Worker $bv.set_field(paste! {$cls::[<$strct _ $field>]}, $val)
42*61046927SAndroid Build Coastguard Worker };
43*61046927SAndroid Build Coastguard Worker }
44*61046927SAndroid Build Coastguard Worker
45*61046927SAndroid Build Coastguard Worker macro_rules! set_array {
46*61046927SAndroid Build Coastguard Worker ($bv:expr, $cls:ident, $strct:ident, $f:ident, $i:expr, $x:expr) => {
47*61046927SAndroid Build Coastguard Worker $bv.set_field(paste! {$cls::[<$strct _ $f>]}($i), $x)
48*61046927SAndroid Build Coastguard Worker };
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker macro_rules! qmd_init {
52*61046927SAndroid Build Coastguard Worker ($bv: expr, $c:ident, $s:ident, $mjv:expr, $mnv:expr) => {
53*61046927SAndroid Build Coastguard Worker set_field!($bv, $c, $s, QMD_MAJOR_VERSION, $mjv);
54*61046927SAndroid Build Coastguard Worker set_field!($bv, $c, $s, QMD_VERSION, $mnv);
55*61046927SAndroid Build Coastguard Worker
56*61046927SAndroid Build Coastguard Worker set_enum!($bv, $c, $s, API_VISIBLE_CALL_LIMIT, NO_CHECK);
57*61046927SAndroid Build Coastguard Worker set_enum!($bv, $c, $s, SAMPLER_INDEX, INDEPENDENTLY);
58*61046927SAndroid Build Coastguard Worker };
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker macro_rules! qmd_impl_common {
62*61046927SAndroid Build Coastguard Worker ($c:ident, $s:ident) => {
63*61046927SAndroid Build Coastguard Worker fn set_barrier_count(&mut self, barrier_count: u8) {
64*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
65*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, BARRIER_COUNT, barrier_count);
66*61046927SAndroid Build Coastguard Worker }
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker const GLOBAL_SIZE_LAYOUT: nak_qmd_dispatch_size_layout = {
69*61046927SAndroid Build Coastguard Worker let w = paste! {$c::[<$s _CTA_RASTER_WIDTH>]};
70*61046927SAndroid Build Coastguard Worker let h = paste! {$c::[<$s _CTA_RASTER_HEIGHT>]};
71*61046927SAndroid Build Coastguard Worker let d = paste! {$c::[<$s _CTA_RASTER_DEPTH>]};
72*61046927SAndroid Build Coastguard Worker nak_qmd_dispatch_size_layout {
73*61046927SAndroid Build Coastguard Worker x_start: w.start as u16,
74*61046927SAndroid Build Coastguard Worker x_end: w.end as u16,
75*61046927SAndroid Build Coastguard Worker y_start: h.start as u16,
76*61046927SAndroid Build Coastguard Worker y_end: h.end as u16,
77*61046927SAndroid Build Coastguard Worker z_start: d.start as u16,
78*61046927SAndroid Build Coastguard Worker z_end: d.end as u16,
79*61046927SAndroid Build Coastguard Worker }
80*61046927SAndroid Build Coastguard Worker };
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker fn set_global_size(&mut self, width: u32, height: u32, depth: u32) {
83*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
84*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, CTA_RASTER_WIDTH, width);
85*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, CTA_RASTER_HEIGHT, height);
86*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, CTA_RASTER_DEPTH, depth);
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Worker fn set_local_size(&mut self, width: u16, height: u16, depth: u16) {
90*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
91*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, CTA_THREAD_DIMENSION0, width);
92*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, CTA_THREAD_DIMENSION1, height);
93*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, CTA_THREAD_DIMENSION2, depth);
94*61046927SAndroid Build Coastguard Worker }
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker fn set_slm_size(&mut self, slm_size: u32) {
97*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
98*61046927SAndroid Build Coastguard Worker let slm_size = slm_size.next_multiple_of(0x10);
99*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, SHADER_LOCAL_MEMORY_HIGH_SIZE, 0);
100*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, SHADER_LOCAL_MEMORY_LOW_SIZE, slm_size);
101*61046927SAndroid Build Coastguard Worker }
102*61046927SAndroid Build Coastguard Worker };
103*61046927SAndroid Build Coastguard Worker }
104*61046927SAndroid Build Coastguard Worker
105*61046927SAndroid Build Coastguard Worker macro_rules! qmd_impl_set_crs_size {
106*61046927SAndroid Build Coastguard Worker ($c:ident, $s:ident) => {
107*61046927SAndroid Build Coastguard Worker fn set_crs_size(&mut self, crs_size: u32) {
108*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
109*61046927SAndroid Build Coastguard Worker let crs_size = crs_size.next_multiple_of(0x200);
110*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, SHADER_LOCAL_MEMORY_CRS_SIZE, crs_size);
111*61046927SAndroid Build Coastguard Worker }
112*61046927SAndroid Build Coastguard Worker };
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker const SIZE_SHIFT: u8 = 0;
116*61046927SAndroid Build Coastguard Worker const SIZE_SHIFTED4_SHIFT: u8 = 4;
117*61046927SAndroid Build Coastguard Worker
118*61046927SAndroid Build Coastguard Worker macro_rules! qmd_impl_set_cbuf {
119*61046927SAndroid Build Coastguard Worker ($c:ident, $s:ident, $size_field:ident) => {
120*61046927SAndroid Build Coastguard Worker fn set_cbuf(&mut self, idx: u8, addr: u64, size: u32) {
121*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
122*61046927SAndroid Build Coastguard Worker let idx = idx.into();
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker let addr_lo = addr as u32;
125*61046927SAndroid Build Coastguard Worker let addr_hi = (addr >> 32) as u32;
126*61046927SAndroid Build Coastguard Worker set_array!(bv, $c, $s, CONSTANT_BUFFER_ADDR_LOWER, idx, addr_lo);
127*61046927SAndroid Build Coastguard Worker set_array!(bv, $c, $s, CONSTANT_BUFFER_ADDR_UPPER, idx, addr_hi);
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker paste! {
130*61046927SAndroid Build Coastguard Worker let shift = [<$size_field _SHIFT>];
131*61046927SAndroid Build Coastguard Worker let range = $c::[<$s _CONSTANT_BUFFER_ $size_field>](idx);
132*61046927SAndroid Build Coastguard Worker assert!(((size >> shift) << shift) == size);
133*61046927SAndroid Build Coastguard Worker bv.set_field(range, size >> shift);
134*61046927SAndroid Build Coastguard Worker }
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker set_array!(bv, $c, $s, CONSTANT_BUFFER_VALID, idx, true);
137*61046927SAndroid Build Coastguard Worker }
138*61046927SAndroid Build Coastguard Worker };
139*61046927SAndroid Build Coastguard Worker }
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker macro_rules! qmd_impl_set_prog_addr_32 {
142*61046927SAndroid Build Coastguard Worker ($c:ident, $s:ident) => {
143*61046927SAndroid Build Coastguard Worker fn set_prog_addr(&mut self, addr: u64) {
144*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
145*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, PROGRAM_OFFSET, addr);
146*61046927SAndroid Build Coastguard Worker }
147*61046927SAndroid Build Coastguard Worker };
148*61046927SAndroid Build Coastguard Worker }
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker macro_rules! qmd_impl_set_prog_addr_64 {
151*61046927SAndroid Build Coastguard Worker ($c:ident, $s:ident) => {
152*61046927SAndroid Build Coastguard Worker fn set_prog_addr(&mut self, addr: u64) {
153*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
154*61046927SAndroid Build Coastguard Worker
155*61046927SAndroid Build Coastguard Worker let addr_lo = addr as u32;
156*61046927SAndroid Build Coastguard Worker let addr_hi = (addr >> 32) as u32;
157*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, PROGRAM_ADDRESS_LOWER, addr_lo);
158*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, PROGRAM_ADDRESS_UPPER, addr_hi);
159*61046927SAndroid Build Coastguard Worker }
160*61046927SAndroid Build Coastguard Worker };
161*61046927SAndroid Build Coastguard Worker }
162*61046927SAndroid Build Coastguard Worker
163*61046927SAndroid Build Coastguard Worker macro_rules! qmd_impl_set_register_count {
164*61046927SAndroid Build Coastguard Worker ($c:ident, $s:ident, $field:ident) => {
165*61046927SAndroid Build Coastguard Worker fn set_register_count(&mut self, register_count: u8) {
166*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
167*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, $field, register_count);
168*61046927SAndroid Build Coastguard Worker }
169*61046927SAndroid Build Coastguard Worker };
170*61046927SAndroid Build Coastguard Worker }
171*61046927SAndroid Build Coastguard Worker
172*61046927SAndroid Build Coastguard Worker mod qmd_0_6 {
173*61046927SAndroid Build Coastguard Worker use crate::qmd::*;
174*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::cla0c0::qmd as cla0c0;
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker #[repr(transparent)]
177*61046927SAndroid Build Coastguard Worker pub struct Qmd0_6 {
178*61046927SAndroid Build Coastguard Worker qmd: [u32; 64],
179*61046927SAndroid Build Coastguard Worker }
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker impl QMD for Qmd0_6 {
new() -> Self182*61046927SAndroid Build Coastguard Worker fn new() -> Self {
183*61046927SAndroid Build Coastguard Worker let mut qmd = [0; 64];
184*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut qmd);
185*61046927SAndroid Build Coastguard Worker qmd_init!(bv, cla0c0, QMDV00_06, 0, 6);
186*61046927SAndroid Build Coastguard Worker set_field!(bv, cla0c0, QMDV00_06, SASS_VERSION, 0x30);
187*61046927SAndroid Build Coastguard Worker Self { qmd }
188*61046927SAndroid Build Coastguard Worker }
189*61046927SAndroid Build Coastguard Worker
190*61046927SAndroid Build Coastguard Worker qmd_impl_common!(cla0c0, QMDV00_06);
191*61046927SAndroid Build Coastguard Worker qmd_impl_set_crs_size!(cla0c0, QMDV00_06);
192*61046927SAndroid Build Coastguard Worker qmd_impl_set_cbuf!(cla0c0, QMDV00_06, SIZE);
193*61046927SAndroid Build Coastguard Worker qmd_impl_set_prog_addr_32!(cla0c0, QMDV00_06);
194*61046927SAndroid Build Coastguard Worker qmd_impl_set_register_count!(cla0c0, QMDV00_06, REGISTER_COUNT);
195*61046927SAndroid Build Coastguard Worker
set_smem_size(&mut self, smem_size: u32, _smem_max: u32)196*61046927SAndroid Build Coastguard Worker fn set_smem_size(&mut self, smem_size: u32, _smem_max: u32) {
197*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker let smem_size = smem_size.next_multiple_of(0x100);
200*61046927SAndroid Build Coastguard Worker set_field!(bv, cla0c0, QMDV00_06, SHARED_MEMORY_SIZE, smem_size);
201*61046927SAndroid Build Coastguard Worker
202*61046927SAndroid Build Coastguard Worker let l1_config = if smem_size <= (16 << 10) {
203*61046927SAndroid Build Coastguard Worker cla0c0::QMDV00_06_L1_CONFIGURATION_DIRECTLY_ADDRESSABLE_MEMORY_SIZE_16KB
204*61046927SAndroid Build Coastguard Worker } else if smem_size <= (32 << 10) {
205*61046927SAndroid Build Coastguard Worker cla0c0::QMDV00_06_L1_CONFIGURATION_DIRECTLY_ADDRESSABLE_MEMORY_SIZE_32KB
206*61046927SAndroid Build Coastguard Worker } else if smem_size <= (48 << 10) {
207*61046927SAndroid Build Coastguard Worker cla0c0::QMDV00_06_L1_CONFIGURATION_DIRECTLY_ADDRESSABLE_MEMORY_SIZE_48KB
208*61046927SAndroid Build Coastguard Worker } else {
209*61046927SAndroid Build Coastguard Worker panic!("Iclalid shared memory size");
210*61046927SAndroid Build Coastguard Worker };
211*61046927SAndroid Build Coastguard Worker set_field!(bv, cla0c0, QMDV00_06, L1_CONFIGURATION, l1_config);
212*61046927SAndroid Build Coastguard Worker }
213*61046927SAndroid Build Coastguard Worker }
214*61046927SAndroid Build Coastguard Worker }
215*61046927SAndroid Build Coastguard Worker use qmd_0_6::Qmd0_6;
216*61046927SAndroid Build Coastguard Worker
217*61046927SAndroid Build Coastguard Worker mod qmd_2_1 {
218*61046927SAndroid Build Coastguard Worker use crate::qmd::*;
219*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clc0c0::qmd as clc0c0;
220*61046927SAndroid Build Coastguard Worker
221*61046927SAndroid Build Coastguard Worker #[repr(transparent)]
222*61046927SAndroid Build Coastguard Worker pub struct Qmd2_1 {
223*61046927SAndroid Build Coastguard Worker qmd: [u32; 64],
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker impl QMD for Qmd2_1 {
new() -> Self227*61046927SAndroid Build Coastguard Worker fn new() -> Self {
228*61046927SAndroid Build Coastguard Worker let mut qmd = [0; 64];
229*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut qmd);
230*61046927SAndroid Build Coastguard Worker qmd_init!(bv, clc0c0, QMDV02_01, 2, 1);
231*61046927SAndroid Build Coastguard Worker set_field!(bv, clc0c0, QMDV02_01, SM_GLOBAL_CACHING_ENABLE, true);
232*61046927SAndroid Build Coastguard Worker Self { qmd }
233*61046927SAndroid Build Coastguard Worker }
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker qmd_impl_common!(clc0c0, QMDV02_01);
236*61046927SAndroid Build Coastguard Worker qmd_impl_set_crs_size!(clc0c0, QMDV02_01);
237*61046927SAndroid Build Coastguard Worker qmd_impl_set_cbuf!(clc0c0, QMDV02_01, SIZE_SHIFTED4);
238*61046927SAndroid Build Coastguard Worker qmd_impl_set_prog_addr_32!(clc0c0, QMDV02_01);
239*61046927SAndroid Build Coastguard Worker qmd_impl_set_register_count!(clc0c0, QMDV02_01, REGISTER_COUNT);
240*61046927SAndroid Build Coastguard Worker
set_smem_size(&mut self, smem_size: u32, _smem_max: u32)241*61046927SAndroid Build Coastguard Worker fn set_smem_size(&mut self, smem_size: u32, _smem_max: u32) {
242*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
243*61046927SAndroid Build Coastguard Worker
244*61046927SAndroid Build Coastguard Worker let smem_size = smem_size.next_multiple_of(0x100);
245*61046927SAndroid Build Coastguard Worker set_field!(bv, clc0c0, QMDV02_01, SHARED_MEMORY_SIZE, smem_size);
246*61046927SAndroid Build Coastguard Worker }
247*61046927SAndroid Build Coastguard Worker }
248*61046927SAndroid Build Coastguard Worker }
249*61046927SAndroid Build Coastguard Worker use qmd_2_1::Qmd2_1;
250*61046927SAndroid Build Coastguard Worker
gv100_sm_config_smem_size(size: u32) -> u32251*61046927SAndroid Build Coastguard Worker fn gv100_sm_config_smem_size(size: u32) -> u32 {
252*61046927SAndroid Build Coastguard Worker let size = if size > 64 * 1024 {
253*61046927SAndroid Build Coastguard Worker 96 * 1024
254*61046927SAndroid Build Coastguard Worker } else if size > 32 * 1024 {
255*61046927SAndroid Build Coastguard Worker 64 * 1024
256*61046927SAndroid Build Coastguard Worker } else if size > 16 * 1024 {
257*61046927SAndroid Build Coastguard Worker 32 * 1024
258*61046927SAndroid Build Coastguard Worker } else if size > 8 * 1024 {
259*61046927SAndroid Build Coastguard Worker 16 * 1024
260*61046927SAndroid Build Coastguard Worker } else {
261*61046927SAndroid Build Coastguard Worker 8 * 1024
262*61046927SAndroid Build Coastguard Worker };
263*61046927SAndroid Build Coastguard Worker
264*61046927SAndroid Build Coastguard Worker size / 4096 + 1
265*61046927SAndroid Build Coastguard Worker }
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Worker macro_rules! qmd_impl_set_smem_size_bounded {
268*61046927SAndroid Build Coastguard Worker ($c:ident, $s:ident) => {
269*61046927SAndroid Build Coastguard Worker fn set_smem_size(&mut self, smem_size: u32, smem_max: u32) {
270*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut self.qmd);
271*61046927SAndroid Build Coastguard Worker
272*61046927SAndroid Build Coastguard Worker let smem_size = smem_size.next_multiple_of(0x100);
273*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, SHARED_MEMORY_SIZE, smem_size);
274*61046927SAndroid Build Coastguard Worker
275*61046927SAndroid Build Coastguard Worker let max = gv100_sm_config_smem_size(smem_max);
276*61046927SAndroid Build Coastguard Worker let min = gv100_sm_config_smem_size(smem_size.into());
277*61046927SAndroid Build Coastguard Worker let target = gv100_sm_config_smem_size(smem_size.into());
278*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, MIN_SM_CONFIG_SHARED_MEM_SIZE, min);
279*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, MAX_SM_CONFIG_SHARED_MEM_SIZE, max);
280*61046927SAndroid Build Coastguard Worker set_field!(bv, $c, $s, TARGET_SM_CONFIG_SHARED_MEM_SIZE, target);
281*61046927SAndroid Build Coastguard Worker }
282*61046927SAndroid Build Coastguard Worker };
283*61046927SAndroid Build Coastguard Worker }
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker mod qmd_2_2 {
286*61046927SAndroid Build Coastguard Worker use crate::qmd::*;
287*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clc3c0::qmd as clc3c0;
288*61046927SAndroid Build Coastguard Worker
289*61046927SAndroid Build Coastguard Worker #[repr(transparent)]
290*61046927SAndroid Build Coastguard Worker pub struct Qmd2_2 {
291*61046927SAndroid Build Coastguard Worker qmd: [u32; 64],
292*61046927SAndroid Build Coastguard Worker }
293*61046927SAndroid Build Coastguard Worker
294*61046927SAndroid Build Coastguard Worker impl QMD for Qmd2_2 {
new() -> Self295*61046927SAndroid Build Coastguard Worker fn new() -> Self {
296*61046927SAndroid Build Coastguard Worker let mut qmd = [0; 64];
297*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut qmd);
298*61046927SAndroid Build Coastguard Worker qmd_init!(bv, clc3c0, QMDV02_02, 2, 2);
299*61046927SAndroid Build Coastguard Worker set_field!(bv, clc3c0, QMDV02_02, SM_GLOBAL_CACHING_ENABLE, true);
300*61046927SAndroid Build Coastguard Worker Self { qmd }
301*61046927SAndroid Build Coastguard Worker }
302*61046927SAndroid Build Coastguard Worker
303*61046927SAndroid Build Coastguard Worker qmd_impl_common!(clc3c0, QMDV02_02);
304*61046927SAndroid Build Coastguard Worker qmd_impl_set_crs_size!(clc3c0, QMDV02_02);
305*61046927SAndroid Build Coastguard Worker qmd_impl_set_cbuf!(clc3c0, QMDV02_02, SIZE_SHIFTED4);
306*61046927SAndroid Build Coastguard Worker qmd_impl_set_prog_addr_64!(clc3c0, QMDV02_02);
307*61046927SAndroid Build Coastguard Worker qmd_impl_set_register_count!(clc3c0, QMDV02_02, REGISTER_COUNT_V);
308*61046927SAndroid Build Coastguard Worker qmd_impl_set_smem_size_bounded!(clc3c0, QMDV02_02);
309*61046927SAndroid Build Coastguard Worker }
310*61046927SAndroid Build Coastguard Worker }
311*61046927SAndroid Build Coastguard Worker use qmd_2_2::Qmd2_2;
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker mod qmd_3_0 {
314*61046927SAndroid Build Coastguard Worker use crate::qmd::*;
315*61046927SAndroid Build Coastguard Worker use nvidia_headers::classes::clc6c0::qmd as clc6c0;
316*61046927SAndroid Build Coastguard Worker
317*61046927SAndroid Build Coastguard Worker #[repr(transparent)]
318*61046927SAndroid Build Coastguard Worker pub struct Qmd3_0 {
319*61046927SAndroid Build Coastguard Worker qmd: [u32; 64],
320*61046927SAndroid Build Coastguard Worker }
321*61046927SAndroid Build Coastguard Worker
322*61046927SAndroid Build Coastguard Worker impl QMD for Qmd3_0 {
new() -> Self323*61046927SAndroid Build Coastguard Worker fn new() -> Self {
324*61046927SAndroid Build Coastguard Worker let mut qmd = [0; 64];
325*61046927SAndroid Build Coastguard Worker let mut bv = QMDBitView::new(&mut qmd);
326*61046927SAndroid Build Coastguard Worker qmd_init!(bv, clc6c0, QMDV03_00, 3, 0);
327*61046927SAndroid Build Coastguard Worker set_field!(bv, clc6c0, QMDV03_00, SM_GLOBAL_CACHING_ENABLE, true);
328*61046927SAndroid Build Coastguard Worker Self { qmd }
329*61046927SAndroid Build Coastguard Worker }
330*61046927SAndroid Build Coastguard Worker
331*61046927SAndroid Build Coastguard Worker qmd_impl_common!(clc6c0, QMDV03_00);
332*61046927SAndroid Build Coastguard Worker
set_crs_size(&mut self, crs_size: u32)333*61046927SAndroid Build Coastguard Worker fn set_crs_size(&mut self, crs_size: u32) {
334*61046927SAndroid Build Coastguard Worker assert!(crs_size == 0);
335*61046927SAndroid Build Coastguard Worker }
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker qmd_impl_set_cbuf!(clc6c0, QMDV03_00, SIZE_SHIFTED4);
338*61046927SAndroid Build Coastguard Worker qmd_impl_set_prog_addr_64!(clc6c0, QMDV03_00);
339*61046927SAndroid Build Coastguard Worker qmd_impl_set_register_count!(clc6c0, QMDV03_00, REGISTER_COUNT_V);
340*61046927SAndroid Build Coastguard Worker qmd_impl_set_smem_size_bounded!(clc6c0, QMDV03_00);
341*61046927SAndroid Build Coastguard Worker }
342*61046927SAndroid Build Coastguard Worker }
343*61046927SAndroid Build Coastguard Worker use qmd_3_0::Qmd3_0;
344*61046927SAndroid Build Coastguard Worker
fill_qmd<Q: QMD>(info: &nak_shader_info, qmd_info: &nak_qmd_info) -> Q345*61046927SAndroid Build Coastguard Worker fn fill_qmd<Q: QMD>(info: &nak_shader_info, qmd_info: &nak_qmd_info) -> Q {
346*61046927SAndroid Build Coastguard Worker let cs_info = unsafe {
347*61046927SAndroid Build Coastguard Worker assert!(info.stage == MESA_SHADER_COMPUTE);
348*61046927SAndroid Build Coastguard Worker &info.__bindgen_anon_1.cs
349*61046927SAndroid Build Coastguard Worker };
350*61046927SAndroid Build Coastguard Worker
351*61046927SAndroid Build Coastguard Worker let mut qmd = Q::new();
352*61046927SAndroid Build Coastguard Worker
353*61046927SAndroid Build Coastguard Worker qmd.set_barrier_count(info.num_control_barriers);
354*61046927SAndroid Build Coastguard Worker qmd.set_global_size(
355*61046927SAndroid Build Coastguard Worker qmd_info.global_size[0],
356*61046927SAndroid Build Coastguard Worker qmd_info.global_size[1],
357*61046927SAndroid Build Coastguard Worker qmd_info.global_size[2],
358*61046927SAndroid Build Coastguard Worker );
359*61046927SAndroid Build Coastguard Worker qmd.set_local_size(
360*61046927SAndroid Build Coastguard Worker cs_info.local_size[0],
361*61046927SAndroid Build Coastguard Worker cs_info.local_size[1],
362*61046927SAndroid Build Coastguard Worker cs_info.local_size[2],
363*61046927SAndroid Build Coastguard Worker );
364*61046927SAndroid Build Coastguard Worker qmd.set_prog_addr(qmd_info.addr);
365*61046927SAndroid Build Coastguard Worker qmd.set_register_count(info.num_gprs);
366*61046927SAndroid Build Coastguard Worker qmd.set_crs_size(info.crs_size);
367*61046927SAndroid Build Coastguard Worker qmd.set_slm_size(info.slm_size);
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker assert!(qmd_info.smem_size >= cs_info.smem_size);
370*61046927SAndroid Build Coastguard Worker assert!(qmd_info.smem_size <= qmd_info.smem_max);
371*61046927SAndroid Build Coastguard Worker qmd.set_smem_size(qmd_info.smem_size.into(), qmd_info.smem_max.into());
372*61046927SAndroid Build Coastguard Worker
373*61046927SAndroid Build Coastguard Worker for i in 0..qmd_info.num_cbufs {
374*61046927SAndroid Build Coastguard Worker let cb = &qmd_info.cbufs[usize::try_from(i).unwrap()];
375*61046927SAndroid Build Coastguard Worker if cb.size > 0 {
376*61046927SAndroid Build Coastguard Worker qmd.set_cbuf(cb.index.try_into().unwrap(), cb.addr, cb.size);
377*61046927SAndroid Build Coastguard Worker }
378*61046927SAndroid Build Coastguard Worker }
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker qmd
381*61046927SAndroid Build Coastguard Worker }
382*61046927SAndroid Build Coastguard Worker
383*61046927SAndroid Build Coastguard Worker #[no_mangle]
nak_fill_qmd( dev: *const nv_device_info, info: *const nak_shader_info, qmd_info: *const nak_qmd_info, qmd_out: *mut ::std::os::raw::c_void, qmd_size: usize, )384*61046927SAndroid Build Coastguard Worker pub extern "C" fn nak_fill_qmd(
385*61046927SAndroid Build Coastguard Worker dev: *const nv_device_info,
386*61046927SAndroid Build Coastguard Worker info: *const nak_shader_info,
387*61046927SAndroid Build Coastguard Worker qmd_info: *const nak_qmd_info,
388*61046927SAndroid Build Coastguard Worker qmd_out: *mut ::std::os::raw::c_void,
389*61046927SAndroid Build Coastguard Worker qmd_size: usize,
390*61046927SAndroid Build Coastguard Worker ) {
391*61046927SAndroid Build Coastguard Worker assert!(!dev.is_null());
392*61046927SAndroid Build Coastguard Worker let dev = unsafe { &*dev };
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Worker assert!(!info.is_null());
395*61046927SAndroid Build Coastguard Worker let info = unsafe { &*info };
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker assert!(!qmd_info.is_null());
398*61046927SAndroid Build Coastguard Worker let qmd_info = unsafe { &*qmd_info };
399*61046927SAndroid Build Coastguard Worker
400*61046927SAndroid Build Coastguard Worker unsafe {
401*61046927SAndroid Build Coastguard Worker if dev.cls_compute >= clc6c0::AMPERE_COMPUTE_A {
402*61046927SAndroid Build Coastguard Worker let qmd_out = qmd_out as *mut Qmd3_0;
403*61046927SAndroid Build Coastguard Worker assert!(qmd_size == std::mem::size_of_val(&*qmd_out));
404*61046927SAndroid Build Coastguard Worker qmd_out.write(fill_qmd(info, qmd_info));
405*61046927SAndroid Build Coastguard Worker } else if dev.cls_compute >= clc3c0::VOLTA_COMPUTE_A {
406*61046927SAndroid Build Coastguard Worker let qmd_out = qmd_out as *mut Qmd2_2;
407*61046927SAndroid Build Coastguard Worker assert!(qmd_size == std::mem::size_of_val(&*qmd_out));
408*61046927SAndroid Build Coastguard Worker qmd_out.write(fill_qmd(info, qmd_info));
409*61046927SAndroid Build Coastguard Worker } else if dev.cls_compute >= clc0c0::PASCAL_COMPUTE_A {
410*61046927SAndroid Build Coastguard Worker let qmd_out = qmd_out as *mut Qmd2_1;
411*61046927SAndroid Build Coastguard Worker assert!(qmd_size == std::mem::size_of_val(&*qmd_out));
412*61046927SAndroid Build Coastguard Worker qmd_out.write(fill_qmd(info, qmd_info));
413*61046927SAndroid Build Coastguard Worker } else if dev.cls_compute >= cla0c0::KEPLER_COMPUTE_A {
414*61046927SAndroid Build Coastguard Worker let qmd_out = qmd_out as *mut Qmd0_6;
415*61046927SAndroid Build Coastguard Worker assert!(qmd_size == std::mem::size_of_val(&*qmd_out));
416*61046927SAndroid Build Coastguard Worker qmd_out.write(fill_qmd(info, qmd_info));
417*61046927SAndroid Build Coastguard Worker } else {
418*61046927SAndroid Build Coastguard Worker panic!("Unknown shader model");
419*61046927SAndroid Build Coastguard Worker }
420*61046927SAndroid Build Coastguard Worker }
421*61046927SAndroid Build Coastguard Worker }
422*61046927SAndroid Build Coastguard Worker
423*61046927SAndroid Build Coastguard Worker #[no_mangle]
nak_get_qmd_dispatch_size_layout( dev: &nv_device_info, ) -> nak_qmd_dispatch_size_layout424*61046927SAndroid Build Coastguard Worker pub extern "C" fn nak_get_qmd_dispatch_size_layout(
425*61046927SAndroid Build Coastguard Worker dev: &nv_device_info,
426*61046927SAndroid Build Coastguard Worker ) -> nak_qmd_dispatch_size_layout {
427*61046927SAndroid Build Coastguard Worker if dev.cls_compute >= clc6c0::AMPERE_COMPUTE_A {
428*61046927SAndroid Build Coastguard Worker Qmd3_0::GLOBAL_SIZE_LAYOUT.try_into().unwrap()
429*61046927SAndroid Build Coastguard Worker } else if dev.cls_compute >= clc3c0::VOLTA_COMPUTE_A {
430*61046927SAndroid Build Coastguard Worker Qmd2_2::GLOBAL_SIZE_LAYOUT.try_into().unwrap()
431*61046927SAndroid Build Coastguard Worker } else if dev.cls_compute >= clc0c0::PASCAL_COMPUTE_A {
432*61046927SAndroid Build Coastguard Worker Qmd2_1::GLOBAL_SIZE_LAYOUT.try_into().unwrap()
433*61046927SAndroid Build Coastguard Worker } else if dev.cls_compute >= cla0c0::KEPLER_COMPUTE_A {
434*61046927SAndroid Build Coastguard Worker Qmd0_6::GLOBAL_SIZE_LAYOUT.try_into().unwrap()
435*61046927SAndroid Build Coastguard Worker } else {
436*61046927SAndroid Build Coastguard Worker panic!("Unsupported shader model");
437*61046927SAndroid Build Coastguard Worker }
438*61046927SAndroid Build Coastguard Worker }
439