Skip to main content

fidl_fuchsia_hardware_spi_businfo_common/
fidl_fuchsia_hardware_spi_businfo_common.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11pub const MAX_SPI_CHANNEL: u32 = 32;
12
13#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
14pub enum SpiClockPhase {
15    ClockPhaseFirst,
16    ClockPhaseSecond,
17    #[doc(hidden)]
18    __SourceBreaking {
19        unknown_ordinal: u32,
20    },
21}
22
23/// Pattern that matches an unknown `SpiClockPhase` member.
24#[macro_export]
25macro_rules! SpiClockPhaseUnknown {
26    () => {
27        _
28    };
29}
30
31impl SpiClockPhase {
32    #[inline]
33    pub fn from_primitive(prim: u32) -> Option<Self> {
34        match prim {
35            0 => Some(Self::ClockPhaseFirst),
36            1 => Some(Self::ClockPhaseSecond),
37            _ => None,
38        }
39    }
40
41    #[inline]
42    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
43        match prim {
44            0 => Self::ClockPhaseFirst,
45            1 => Self::ClockPhaseSecond,
46            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
47        }
48    }
49
50    #[inline]
51    pub fn unknown() -> Self {
52        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
53    }
54
55    #[inline]
56    pub const fn into_primitive(self) -> u32 {
57        match self {
58            Self::ClockPhaseFirst => 0,
59            Self::ClockPhaseSecond => 1,
60            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
61        }
62    }
63
64    #[inline]
65    pub fn is_unknown(&self) -> bool {
66        match self {
67            Self::__SourceBreaking { unknown_ordinal: _ } => true,
68            _ => false,
69        }
70    }
71}
72
73/// Passed to the spi driver in platform device metadata.
74#[derive(Clone, Debug, Default, PartialEq)]
75pub struct SpiBusMetadata {
76    pub channels: Option<Vec<SpiChannel>>,
77    /// ID of the bus that these devices are on. Set as a bind property on the
78    /// nodes added by the SPI core driver.
79    pub bus_id: Option<u32>,
80    #[doc(hidden)]
81    pub __source_breaking: fidl::marker::SourceBreaking,
82}
83
84impl fidl::Persistable for SpiBusMetadata {}
85impl fidl::Serializable for SpiBusMetadata {
86    const SERIALIZABLE_NAME: &'static str = "fuchsia.hardware.spi.businfo.SpiBusMetadata";
87}
88
89/// Represents a single device on a SPI bus.
90#[derive(Clone, Debug, Default, PartialEq)]
91pub struct SpiChannel {
92    /// Chip select number for the device.
93    pub cs: Option<u32>,
94    /// Vendor ID. Used when binding via platform bus device IDs.
95    pub vid: Option<u32>,
96    /// Product ID. Used when binding via platform bus device IDs.
97    pub pid: Option<u32>,
98    /// Device ID. Used when binding via platform bus device IDs.
99    pub did: Option<u32>,
100    /// Chip select polarity: true == high, false == low.
101    pub cs_polarity_high: Option<bool>,
102    /// Size in bits of a single word on the SPI bus.
103    pub word_length_bits: Option<u8>,
104    /// Are we in charge of the bus?
105    pub is_bus_controller: Option<bool>,
106    /// Clock polarity. true == high, false == low.
107    pub clock_polarity_high: Option<bool>,
108    ///  Clock phase.
109    pub clock_phase: Option<SpiClockPhase>,
110    /// Maximum bus frequency in Hz.
111    pub max_frequency_hz: Option<u32>,
112    #[doc(hidden)]
113    pub __source_breaking: fidl::marker::SourceBreaking,
114}
115
116impl fidl::Persistable for SpiChannel {}
117
118mod internal {
119    use super::*;
120    unsafe impl fidl::encoding::TypeMarker for SpiClockPhase {
121        type Owned = Self;
122
123        #[inline(always)]
124        fn inline_align(_context: fidl::encoding::Context) -> usize {
125            std::mem::align_of::<u32>()
126        }
127
128        #[inline(always)]
129        fn inline_size(_context: fidl::encoding::Context) -> usize {
130            std::mem::size_of::<u32>()
131        }
132
133        #[inline(always)]
134        fn encode_is_copy() -> bool {
135            false
136        }
137
138        #[inline(always)]
139        fn decode_is_copy() -> bool {
140            false
141        }
142    }
143
144    impl fidl::encoding::ValueTypeMarker for SpiClockPhase {
145        type Borrowed<'a> = Self;
146        #[inline(always)]
147        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
148            *value
149        }
150    }
151
152    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for SpiClockPhase {
153        #[inline]
154        unsafe fn encode(
155            self,
156            encoder: &mut fidl::encoding::Encoder<'_, D>,
157            offset: usize,
158            _depth: fidl::encoding::Depth,
159        ) -> fidl::Result<()> {
160            encoder.debug_check_bounds::<Self>(offset);
161            encoder.write_num(self.into_primitive(), offset);
162            Ok(())
163        }
164    }
165
166    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SpiClockPhase {
167        #[inline(always)]
168        fn new_empty() -> Self {
169            Self::unknown()
170        }
171
172        #[inline]
173        unsafe fn decode(
174            &mut self,
175            decoder: &mut fidl::encoding::Decoder<'_, D>,
176            offset: usize,
177            _depth: fidl::encoding::Depth,
178        ) -> fidl::Result<()> {
179            decoder.debug_check_bounds::<Self>(offset);
180            let prim = decoder.read_num::<u32>(offset);
181
182            *self = Self::from_primitive_allow_unknown(prim);
183            Ok(())
184        }
185    }
186
187    impl SpiBusMetadata {
188        #[inline(always)]
189        fn max_ordinal_present(&self) -> u64 {
190            if let Some(_) = self.bus_id {
191                return 2;
192            }
193            if let Some(_) = self.channels {
194                return 1;
195            }
196            0
197        }
198    }
199
200    impl fidl::encoding::ValueTypeMarker for SpiBusMetadata {
201        type Borrowed<'a> = &'a Self;
202        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
203            value
204        }
205    }
206
207    unsafe impl fidl::encoding::TypeMarker for SpiBusMetadata {
208        type Owned = Self;
209
210        #[inline(always)]
211        fn inline_align(_context: fidl::encoding::Context) -> usize {
212            8
213        }
214
215        #[inline(always)]
216        fn inline_size(_context: fidl::encoding::Context) -> usize {
217            16
218        }
219    }
220
221    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SpiBusMetadata, D>
222        for &SpiBusMetadata
223    {
224        unsafe fn encode(
225            self,
226            encoder: &mut fidl::encoding::Encoder<'_, D>,
227            offset: usize,
228            mut depth: fidl::encoding::Depth,
229        ) -> fidl::Result<()> {
230            encoder.debug_check_bounds::<SpiBusMetadata>(offset);
231            // Vector header
232            let max_ordinal: u64 = self.max_ordinal_present();
233            encoder.write_num(max_ordinal, offset);
234            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
235            // Calling encoder.out_of_line_offset(0) is not allowed.
236            if max_ordinal == 0 {
237                return Ok(());
238            }
239            depth.increment()?;
240            let envelope_size = 8;
241            let bytes_len = max_ordinal as usize * envelope_size;
242            #[allow(unused_variables)]
243            let offset = encoder.out_of_line_offset(bytes_len);
244            let mut _prev_end_offset: usize = 0;
245            if 1 > max_ordinal {
246                return Ok(());
247            }
248
249            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
250            // are envelope_size bytes.
251            let cur_offset: usize = (1 - 1) * envelope_size;
252
253            // Zero reserved fields.
254            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
255
256            // Safety:
257            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
258            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
259            //   envelope_size bytes, there is always sufficient room.
260            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<SpiChannel, 32>, D>(
261            self.channels.as_ref().map(<fidl::encoding::Vector<SpiChannel, 32> as fidl::encoding::ValueTypeMarker>::borrow),
262            encoder, offset + cur_offset, depth
263        )?;
264
265            _prev_end_offset = cur_offset + envelope_size;
266            if 2 > max_ordinal {
267                return Ok(());
268            }
269
270            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
271            // are envelope_size bytes.
272            let cur_offset: usize = (2 - 1) * envelope_size;
273
274            // Zero reserved fields.
275            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
276
277            // Safety:
278            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
279            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
280            //   envelope_size bytes, there is always sufficient room.
281            fidl::encoding::encode_in_envelope_optional::<u32, D>(
282                self.bus_id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
283                encoder,
284                offset + cur_offset,
285                depth,
286            )?;
287
288            _prev_end_offset = cur_offset + envelope_size;
289
290            Ok(())
291        }
292    }
293
294    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SpiBusMetadata {
295        #[inline(always)]
296        fn new_empty() -> Self {
297            Self::default()
298        }
299
300        unsafe fn decode(
301            &mut self,
302            decoder: &mut fidl::encoding::Decoder<'_, D>,
303            offset: usize,
304            mut depth: fidl::encoding::Depth,
305        ) -> fidl::Result<()> {
306            decoder.debug_check_bounds::<Self>(offset);
307            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
308                None => return Err(fidl::Error::NotNullable),
309                Some(len) => len,
310            };
311            // Calling decoder.out_of_line_offset(0) is not allowed.
312            if len == 0 {
313                return Ok(());
314            };
315            depth.increment()?;
316            let envelope_size = 8;
317            let bytes_len = len * envelope_size;
318            let offset = decoder.out_of_line_offset(bytes_len)?;
319            // Decode the envelope for each type.
320            let mut _next_ordinal_to_read = 0;
321            let mut next_offset = offset;
322            let end_offset = offset + bytes_len;
323            _next_ordinal_to_read += 1;
324            if next_offset >= end_offset {
325                return Ok(());
326            }
327
328            // Decode unknown envelopes for gaps in ordinals.
329            while _next_ordinal_to_read < 1 {
330                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
331                _next_ordinal_to_read += 1;
332                next_offset += envelope_size;
333            }
334
335            let next_out_of_line = decoder.next_out_of_line();
336            let handles_before = decoder.remaining_handles();
337            if let Some((inlined, num_bytes, num_handles)) =
338                fidl::encoding::decode_envelope_header(decoder, next_offset)?
339            {
340                let member_inline_size = <fidl::encoding::Vector<SpiChannel, 32> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
341                if inlined != (member_inline_size <= 4) {
342                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
343                }
344                let inner_offset;
345                let mut inner_depth = depth.clone();
346                if inlined {
347                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
348                    inner_offset = next_offset;
349                } else {
350                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
351                    inner_depth.increment()?;
352                }
353                let val_ref = self.channels.get_or_insert_with(
354                    || fidl::new_empty!(fidl::encoding::Vector<SpiChannel, 32>, D),
355                );
356                fidl::decode!(fidl::encoding::Vector<SpiChannel, 32>, D, val_ref, decoder, inner_offset, inner_depth)?;
357                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
358                {
359                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
360                }
361                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
362                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
363                }
364            }
365
366            next_offset += envelope_size;
367            _next_ordinal_to_read += 1;
368            if next_offset >= end_offset {
369                return Ok(());
370            }
371
372            // Decode unknown envelopes for gaps in ordinals.
373            while _next_ordinal_to_read < 2 {
374                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
375                _next_ordinal_to_read += 1;
376                next_offset += envelope_size;
377            }
378
379            let next_out_of_line = decoder.next_out_of_line();
380            let handles_before = decoder.remaining_handles();
381            if let Some((inlined, num_bytes, num_handles)) =
382                fidl::encoding::decode_envelope_header(decoder, next_offset)?
383            {
384                let member_inline_size =
385                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
386                if inlined != (member_inline_size <= 4) {
387                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
388                }
389                let inner_offset;
390                let mut inner_depth = depth.clone();
391                if inlined {
392                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
393                    inner_offset = next_offset;
394                } else {
395                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
396                    inner_depth.increment()?;
397                }
398                let val_ref = self.bus_id.get_or_insert_with(|| fidl::new_empty!(u32, D));
399                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
400                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
401                {
402                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
403                }
404                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
405                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
406                }
407            }
408
409            next_offset += envelope_size;
410
411            // Decode the remaining unknown envelopes.
412            while next_offset < end_offset {
413                _next_ordinal_to_read += 1;
414                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
415                next_offset += envelope_size;
416            }
417
418            Ok(())
419        }
420    }
421
422    impl SpiChannel {
423        #[inline(always)]
424        fn max_ordinal_present(&self) -> u64 {
425            if let Some(_) = self.max_frequency_hz {
426                return 10;
427            }
428            if let Some(_) = self.clock_phase {
429                return 9;
430            }
431            if let Some(_) = self.clock_polarity_high {
432                return 8;
433            }
434            if let Some(_) = self.is_bus_controller {
435                return 7;
436            }
437            if let Some(_) = self.word_length_bits {
438                return 6;
439            }
440            if let Some(_) = self.cs_polarity_high {
441                return 5;
442            }
443            if let Some(_) = self.did {
444                return 4;
445            }
446            if let Some(_) = self.pid {
447                return 3;
448            }
449            if let Some(_) = self.vid {
450                return 2;
451            }
452            if let Some(_) = self.cs {
453                return 1;
454            }
455            0
456        }
457    }
458
459    impl fidl::encoding::ValueTypeMarker for SpiChannel {
460        type Borrowed<'a> = &'a Self;
461        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
462            value
463        }
464    }
465
466    unsafe impl fidl::encoding::TypeMarker for SpiChannel {
467        type Owned = Self;
468
469        #[inline(always)]
470        fn inline_align(_context: fidl::encoding::Context) -> usize {
471            8
472        }
473
474        #[inline(always)]
475        fn inline_size(_context: fidl::encoding::Context) -> usize {
476            16
477        }
478    }
479
480    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SpiChannel, D>
481        for &SpiChannel
482    {
483        unsafe fn encode(
484            self,
485            encoder: &mut fidl::encoding::Encoder<'_, D>,
486            offset: usize,
487            mut depth: fidl::encoding::Depth,
488        ) -> fidl::Result<()> {
489            encoder.debug_check_bounds::<SpiChannel>(offset);
490            // Vector header
491            let max_ordinal: u64 = self.max_ordinal_present();
492            encoder.write_num(max_ordinal, offset);
493            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
494            // Calling encoder.out_of_line_offset(0) is not allowed.
495            if max_ordinal == 0 {
496                return Ok(());
497            }
498            depth.increment()?;
499            let envelope_size = 8;
500            let bytes_len = max_ordinal as usize * envelope_size;
501            #[allow(unused_variables)]
502            let offset = encoder.out_of_line_offset(bytes_len);
503            let mut _prev_end_offset: usize = 0;
504            if 1 > max_ordinal {
505                return Ok(());
506            }
507
508            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
509            // are envelope_size bytes.
510            let cur_offset: usize = (1 - 1) * envelope_size;
511
512            // Zero reserved fields.
513            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
514
515            // Safety:
516            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
517            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
518            //   envelope_size bytes, there is always sufficient room.
519            fidl::encoding::encode_in_envelope_optional::<u32, D>(
520                self.cs.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
521                encoder,
522                offset + cur_offset,
523                depth,
524            )?;
525
526            _prev_end_offset = cur_offset + envelope_size;
527            if 2 > max_ordinal {
528                return Ok(());
529            }
530
531            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
532            // are envelope_size bytes.
533            let cur_offset: usize = (2 - 1) * envelope_size;
534
535            // Zero reserved fields.
536            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
537
538            // Safety:
539            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
540            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
541            //   envelope_size bytes, there is always sufficient room.
542            fidl::encoding::encode_in_envelope_optional::<u32, D>(
543                self.vid.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
544                encoder,
545                offset + cur_offset,
546                depth,
547            )?;
548
549            _prev_end_offset = cur_offset + envelope_size;
550            if 3 > max_ordinal {
551                return Ok(());
552            }
553
554            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
555            // are envelope_size bytes.
556            let cur_offset: usize = (3 - 1) * envelope_size;
557
558            // Zero reserved fields.
559            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
560
561            // Safety:
562            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
563            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
564            //   envelope_size bytes, there is always sufficient room.
565            fidl::encoding::encode_in_envelope_optional::<u32, D>(
566                self.pid.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
567                encoder,
568                offset + cur_offset,
569                depth,
570            )?;
571
572            _prev_end_offset = cur_offset + envelope_size;
573            if 4 > max_ordinal {
574                return Ok(());
575            }
576
577            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
578            // are envelope_size bytes.
579            let cur_offset: usize = (4 - 1) * envelope_size;
580
581            // Zero reserved fields.
582            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
583
584            // Safety:
585            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
586            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
587            //   envelope_size bytes, there is always sufficient room.
588            fidl::encoding::encode_in_envelope_optional::<u32, D>(
589                self.did.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
590                encoder,
591                offset + cur_offset,
592                depth,
593            )?;
594
595            _prev_end_offset = cur_offset + envelope_size;
596            if 5 > max_ordinal {
597                return Ok(());
598            }
599
600            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
601            // are envelope_size bytes.
602            let cur_offset: usize = (5 - 1) * envelope_size;
603
604            // Zero reserved fields.
605            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
606
607            // Safety:
608            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
609            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
610            //   envelope_size bytes, there is always sufficient room.
611            fidl::encoding::encode_in_envelope_optional::<bool, D>(
612                self.cs_polarity_high
613                    .as_ref()
614                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
615                encoder,
616                offset + cur_offset,
617                depth,
618            )?;
619
620            _prev_end_offset = cur_offset + envelope_size;
621            if 6 > max_ordinal {
622                return Ok(());
623            }
624
625            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
626            // are envelope_size bytes.
627            let cur_offset: usize = (6 - 1) * envelope_size;
628
629            // Zero reserved fields.
630            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
631
632            // Safety:
633            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
634            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
635            //   envelope_size bytes, there is always sufficient room.
636            fidl::encoding::encode_in_envelope_optional::<u8, D>(
637                self.word_length_bits.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
638                encoder,
639                offset + cur_offset,
640                depth,
641            )?;
642
643            _prev_end_offset = cur_offset + envelope_size;
644            if 7 > max_ordinal {
645                return Ok(());
646            }
647
648            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
649            // are envelope_size bytes.
650            let cur_offset: usize = (7 - 1) * envelope_size;
651
652            // Zero reserved fields.
653            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
654
655            // Safety:
656            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
657            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
658            //   envelope_size bytes, there is always sufficient room.
659            fidl::encoding::encode_in_envelope_optional::<bool, D>(
660                self.is_bus_controller
661                    .as_ref()
662                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
663                encoder,
664                offset + cur_offset,
665                depth,
666            )?;
667
668            _prev_end_offset = cur_offset + envelope_size;
669            if 8 > max_ordinal {
670                return Ok(());
671            }
672
673            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
674            // are envelope_size bytes.
675            let cur_offset: usize = (8 - 1) * envelope_size;
676
677            // Zero reserved fields.
678            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
679
680            // Safety:
681            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
682            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
683            //   envelope_size bytes, there is always sufficient room.
684            fidl::encoding::encode_in_envelope_optional::<bool, D>(
685                self.clock_polarity_high
686                    .as_ref()
687                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
688                encoder,
689                offset + cur_offset,
690                depth,
691            )?;
692
693            _prev_end_offset = cur_offset + envelope_size;
694            if 9 > max_ordinal {
695                return Ok(());
696            }
697
698            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
699            // are envelope_size bytes.
700            let cur_offset: usize = (9 - 1) * envelope_size;
701
702            // Zero reserved fields.
703            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
704
705            // Safety:
706            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
707            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
708            //   envelope_size bytes, there is always sufficient room.
709            fidl::encoding::encode_in_envelope_optional::<SpiClockPhase, D>(
710                self.clock_phase
711                    .as_ref()
712                    .map(<SpiClockPhase as fidl::encoding::ValueTypeMarker>::borrow),
713                encoder,
714                offset + cur_offset,
715                depth,
716            )?;
717
718            _prev_end_offset = cur_offset + envelope_size;
719            if 10 > max_ordinal {
720                return Ok(());
721            }
722
723            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
724            // are envelope_size bytes.
725            let cur_offset: usize = (10 - 1) * envelope_size;
726
727            // Zero reserved fields.
728            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
729
730            // Safety:
731            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
732            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
733            //   envelope_size bytes, there is always sufficient room.
734            fidl::encoding::encode_in_envelope_optional::<u32, D>(
735                self.max_frequency_hz
736                    .as_ref()
737                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
738                encoder,
739                offset + cur_offset,
740                depth,
741            )?;
742
743            _prev_end_offset = cur_offset + envelope_size;
744
745            Ok(())
746        }
747    }
748
749    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SpiChannel {
750        #[inline(always)]
751        fn new_empty() -> Self {
752            Self::default()
753        }
754
755        unsafe fn decode(
756            &mut self,
757            decoder: &mut fidl::encoding::Decoder<'_, D>,
758            offset: usize,
759            mut depth: fidl::encoding::Depth,
760        ) -> fidl::Result<()> {
761            decoder.debug_check_bounds::<Self>(offset);
762            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
763                None => return Err(fidl::Error::NotNullable),
764                Some(len) => len,
765            };
766            // Calling decoder.out_of_line_offset(0) is not allowed.
767            if len == 0 {
768                return Ok(());
769            };
770            depth.increment()?;
771            let envelope_size = 8;
772            let bytes_len = len * envelope_size;
773            let offset = decoder.out_of_line_offset(bytes_len)?;
774            // Decode the envelope for each type.
775            let mut _next_ordinal_to_read = 0;
776            let mut next_offset = offset;
777            let end_offset = offset + bytes_len;
778            _next_ordinal_to_read += 1;
779            if next_offset >= end_offset {
780                return Ok(());
781            }
782
783            // Decode unknown envelopes for gaps in ordinals.
784            while _next_ordinal_to_read < 1 {
785                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
786                _next_ordinal_to_read += 1;
787                next_offset += envelope_size;
788            }
789
790            let next_out_of_line = decoder.next_out_of_line();
791            let handles_before = decoder.remaining_handles();
792            if let Some((inlined, num_bytes, num_handles)) =
793                fidl::encoding::decode_envelope_header(decoder, next_offset)?
794            {
795                let member_inline_size =
796                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
797                if inlined != (member_inline_size <= 4) {
798                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
799                }
800                let inner_offset;
801                let mut inner_depth = depth.clone();
802                if inlined {
803                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
804                    inner_offset = next_offset;
805                } else {
806                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
807                    inner_depth.increment()?;
808                }
809                let val_ref = self.cs.get_or_insert_with(|| fidl::new_empty!(u32, D));
810                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
811                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
812                {
813                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
814                }
815                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
816                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
817                }
818            }
819
820            next_offset += envelope_size;
821            _next_ordinal_to_read += 1;
822            if next_offset >= end_offset {
823                return Ok(());
824            }
825
826            // Decode unknown envelopes for gaps in ordinals.
827            while _next_ordinal_to_read < 2 {
828                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
829                _next_ordinal_to_read += 1;
830                next_offset += envelope_size;
831            }
832
833            let next_out_of_line = decoder.next_out_of_line();
834            let handles_before = decoder.remaining_handles();
835            if let Some((inlined, num_bytes, num_handles)) =
836                fidl::encoding::decode_envelope_header(decoder, next_offset)?
837            {
838                let member_inline_size =
839                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
840                if inlined != (member_inline_size <= 4) {
841                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
842                }
843                let inner_offset;
844                let mut inner_depth = depth.clone();
845                if inlined {
846                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
847                    inner_offset = next_offset;
848                } else {
849                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
850                    inner_depth.increment()?;
851                }
852                let val_ref = self.vid.get_or_insert_with(|| fidl::new_empty!(u32, D));
853                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
854                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
855                {
856                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
857                }
858                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
859                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
860                }
861            }
862
863            next_offset += envelope_size;
864            _next_ordinal_to_read += 1;
865            if next_offset >= end_offset {
866                return Ok(());
867            }
868
869            // Decode unknown envelopes for gaps in ordinals.
870            while _next_ordinal_to_read < 3 {
871                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
872                _next_ordinal_to_read += 1;
873                next_offset += envelope_size;
874            }
875
876            let next_out_of_line = decoder.next_out_of_line();
877            let handles_before = decoder.remaining_handles();
878            if let Some((inlined, num_bytes, num_handles)) =
879                fidl::encoding::decode_envelope_header(decoder, next_offset)?
880            {
881                let member_inline_size =
882                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
883                if inlined != (member_inline_size <= 4) {
884                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
885                }
886                let inner_offset;
887                let mut inner_depth = depth.clone();
888                if inlined {
889                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
890                    inner_offset = next_offset;
891                } else {
892                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
893                    inner_depth.increment()?;
894                }
895                let val_ref = self.pid.get_or_insert_with(|| fidl::new_empty!(u32, D));
896                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
897                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
898                {
899                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
900                }
901                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
902                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
903                }
904            }
905
906            next_offset += envelope_size;
907            _next_ordinal_to_read += 1;
908            if next_offset >= end_offset {
909                return Ok(());
910            }
911
912            // Decode unknown envelopes for gaps in ordinals.
913            while _next_ordinal_to_read < 4 {
914                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
915                _next_ordinal_to_read += 1;
916                next_offset += envelope_size;
917            }
918
919            let next_out_of_line = decoder.next_out_of_line();
920            let handles_before = decoder.remaining_handles();
921            if let Some((inlined, num_bytes, num_handles)) =
922                fidl::encoding::decode_envelope_header(decoder, next_offset)?
923            {
924                let member_inline_size =
925                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
926                if inlined != (member_inline_size <= 4) {
927                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
928                }
929                let inner_offset;
930                let mut inner_depth = depth.clone();
931                if inlined {
932                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
933                    inner_offset = next_offset;
934                } else {
935                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
936                    inner_depth.increment()?;
937                }
938                let val_ref = self.did.get_or_insert_with(|| fidl::new_empty!(u32, D));
939                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
940                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
941                {
942                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
943                }
944                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
945                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
946                }
947            }
948
949            next_offset += envelope_size;
950            _next_ordinal_to_read += 1;
951            if next_offset >= end_offset {
952                return Ok(());
953            }
954
955            // Decode unknown envelopes for gaps in ordinals.
956            while _next_ordinal_to_read < 5 {
957                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
958                _next_ordinal_to_read += 1;
959                next_offset += envelope_size;
960            }
961
962            let next_out_of_line = decoder.next_out_of_line();
963            let handles_before = decoder.remaining_handles();
964            if let Some((inlined, num_bytes, num_handles)) =
965                fidl::encoding::decode_envelope_header(decoder, next_offset)?
966            {
967                let member_inline_size =
968                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
969                if inlined != (member_inline_size <= 4) {
970                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
971                }
972                let inner_offset;
973                let mut inner_depth = depth.clone();
974                if inlined {
975                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
976                    inner_offset = next_offset;
977                } else {
978                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
979                    inner_depth.increment()?;
980                }
981                let val_ref =
982                    self.cs_polarity_high.get_or_insert_with(|| fidl::new_empty!(bool, D));
983                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
984                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
985                {
986                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
987                }
988                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
989                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
990                }
991            }
992
993            next_offset += envelope_size;
994            _next_ordinal_to_read += 1;
995            if next_offset >= end_offset {
996                return Ok(());
997            }
998
999            // Decode unknown envelopes for gaps in ordinals.
1000            while _next_ordinal_to_read < 6 {
1001                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1002                _next_ordinal_to_read += 1;
1003                next_offset += envelope_size;
1004            }
1005
1006            let next_out_of_line = decoder.next_out_of_line();
1007            let handles_before = decoder.remaining_handles();
1008            if let Some((inlined, num_bytes, num_handles)) =
1009                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1010            {
1011                let member_inline_size =
1012                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1013                if inlined != (member_inline_size <= 4) {
1014                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1015                }
1016                let inner_offset;
1017                let mut inner_depth = depth.clone();
1018                if inlined {
1019                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1020                    inner_offset = next_offset;
1021                } else {
1022                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1023                    inner_depth.increment()?;
1024                }
1025                let val_ref = self.word_length_bits.get_or_insert_with(|| fidl::new_empty!(u8, D));
1026                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
1027                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1028                {
1029                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1030                }
1031                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1032                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1033                }
1034            }
1035
1036            next_offset += envelope_size;
1037            _next_ordinal_to_read += 1;
1038            if next_offset >= end_offset {
1039                return Ok(());
1040            }
1041
1042            // Decode unknown envelopes for gaps in ordinals.
1043            while _next_ordinal_to_read < 7 {
1044                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1045                _next_ordinal_to_read += 1;
1046                next_offset += envelope_size;
1047            }
1048
1049            let next_out_of_line = decoder.next_out_of_line();
1050            let handles_before = decoder.remaining_handles();
1051            if let Some((inlined, num_bytes, num_handles)) =
1052                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1053            {
1054                let member_inline_size =
1055                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1056                if inlined != (member_inline_size <= 4) {
1057                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1058                }
1059                let inner_offset;
1060                let mut inner_depth = depth.clone();
1061                if inlined {
1062                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1063                    inner_offset = next_offset;
1064                } else {
1065                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1066                    inner_depth.increment()?;
1067                }
1068                let val_ref =
1069                    self.is_bus_controller.get_or_insert_with(|| fidl::new_empty!(bool, D));
1070                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1071                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1072                {
1073                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1074                }
1075                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1076                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1077                }
1078            }
1079
1080            next_offset += envelope_size;
1081            _next_ordinal_to_read += 1;
1082            if next_offset >= end_offset {
1083                return Ok(());
1084            }
1085
1086            // Decode unknown envelopes for gaps in ordinals.
1087            while _next_ordinal_to_read < 8 {
1088                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1089                _next_ordinal_to_read += 1;
1090                next_offset += envelope_size;
1091            }
1092
1093            let next_out_of_line = decoder.next_out_of_line();
1094            let handles_before = decoder.remaining_handles();
1095            if let Some((inlined, num_bytes, num_handles)) =
1096                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1097            {
1098                let member_inline_size =
1099                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1100                if inlined != (member_inline_size <= 4) {
1101                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1102                }
1103                let inner_offset;
1104                let mut inner_depth = depth.clone();
1105                if inlined {
1106                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1107                    inner_offset = next_offset;
1108                } else {
1109                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1110                    inner_depth.increment()?;
1111                }
1112                let val_ref =
1113                    self.clock_polarity_high.get_or_insert_with(|| fidl::new_empty!(bool, D));
1114                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1115                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1116                {
1117                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1118                }
1119                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1120                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1121                }
1122            }
1123
1124            next_offset += envelope_size;
1125            _next_ordinal_to_read += 1;
1126            if next_offset >= end_offset {
1127                return Ok(());
1128            }
1129
1130            // Decode unknown envelopes for gaps in ordinals.
1131            while _next_ordinal_to_read < 9 {
1132                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1133                _next_ordinal_to_read += 1;
1134                next_offset += envelope_size;
1135            }
1136
1137            let next_out_of_line = decoder.next_out_of_line();
1138            let handles_before = decoder.remaining_handles();
1139            if let Some((inlined, num_bytes, num_handles)) =
1140                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1141            {
1142                let member_inline_size =
1143                    <SpiClockPhase as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1144                if inlined != (member_inline_size <= 4) {
1145                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1146                }
1147                let inner_offset;
1148                let mut inner_depth = depth.clone();
1149                if inlined {
1150                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1151                    inner_offset = next_offset;
1152                } else {
1153                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1154                    inner_depth.increment()?;
1155                }
1156                let val_ref =
1157                    self.clock_phase.get_or_insert_with(|| fidl::new_empty!(SpiClockPhase, D));
1158                fidl::decode!(SpiClockPhase, D, val_ref, decoder, inner_offset, inner_depth)?;
1159                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1160                {
1161                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1162                }
1163                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1164                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1165                }
1166            }
1167
1168            next_offset += envelope_size;
1169            _next_ordinal_to_read += 1;
1170            if next_offset >= end_offset {
1171                return Ok(());
1172            }
1173
1174            // Decode unknown envelopes for gaps in ordinals.
1175            while _next_ordinal_to_read < 10 {
1176                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1177                _next_ordinal_to_read += 1;
1178                next_offset += envelope_size;
1179            }
1180
1181            let next_out_of_line = decoder.next_out_of_line();
1182            let handles_before = decoder.remaining_handles();
1183            if let Some((inlined, num_bytes, num_handles)) =
1184                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1185            {
1186                let member_inline_size =
1187                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1188                if inlined != (member_inline_size <= 4) {
1189                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1190                }
1191                let inner_offset;
1192                let mut inner_depth = depth.clone();
1193                if inlined {
1194                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1195                    inner_offset = next_offset;
1196                } else {
1197                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1198                    inner_depth.increment()?;
1199                }
1200                let val_ref = self.max_frequency_hz.get_or_insert_with(|| fidl::new_empty!(u32, D));
1201                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1202                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1203                {
1204                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1205                }
1206                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1207                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1208                }
1209            }
1210
1211            next_offset += envelope_size;
1212
1213            // Decode the remaining unknown envelopes.
1214            while next_offset < end_offset {
1215                _next_ordinal_to_read += 1;
1216                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1217                next_offset += envelope_size;
1218            }
1219
1220            Ok(())
1221        }
1222    }
1223}