Skip to main content

fidl_fuchsia_board_dml_config_common/
fidl_fuchsia_board_dml_config_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
11#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
12#[repr(C)]
13pub struct ArmSmmu {
14    pub base_address: u64,
15}
16
17impl fidl::Persistable for ArmSmmu {}
18
19#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
20pub struct StubIommu;
21
22impl fidl::Persistable for StubIommu {}
23
24#[derive(Clone, Debug, Default, PartialEq)]
25pub struct AggregateEntry {
26    pub provider: Option<String>,
27    pub service: Option<String>,
28    pub resources: Option<Vec<ResourceEntry>>,
29    #[doc(hidden)]
30    pub __source_breaking: fidl::marker::SourceBreaking,
31}
32
33impl fidl::Persistable for AggregateEntry {}
34
35#[derive(Clone, Debug, Default, PartialEq)]
36pub struct BoardConfig {
37    pub devices: Option<Vec<Device>>,
38    pub aggregates: Option<Vec<AggregateEntry>>,
39    pub iommus: Option<Vec<Iommu>>,
40    #[doc(hidden)]
41    pub __source_breaking: fidl::marker::SourceBreaking,
42}
43
44impl fidl::Persistable for BoardConfig {}
45
46#[derive(Clone, Debug, Default, PartialEq)]
47pub struct Device {
48    pub name: Option<String>,
49    pub id: Option<u32>,
50    pub url: Option<String>,
51    pub compatible: Option<String>,
52    pub metadata: Option<Vec<StaticMetadata>>,
53    pub interrupt_controller_id: Option<u32>,
54    pub disabled: Option<bool>,
55    pub driver_host: Option<String>,
56    #[doc(hidden)]
57    pub __source_breaking: fidl::marker::SourceBreaking,
58}
59
60impl fidl::Persistable for Device {}
61
62#[derive(Clone, Debug, Default, PartialEq)]
63pub struct Iommu {
64    pub name: Option<String>,
65    pub id: Option<u32>,
66    pub iommu_type: Option<IommuType>,
67    #[doc(hidden)]
68    pub __source_breaking: fidl::marker::SourceBreaking,
69}
70
71impl fidl::Persistable for Iommu {}
72
73#[derive(Clone, Debug, Default, PartialEq)]
74pub struct ResourceEntry {
75    pub node: Option<String>,
76    pub constraint: Option<fidl_fuchsia_driver_metadata_common::Dictionary>,
77    pub name: Option<String>,
78    #[doc(hidden)]
79    pub __source_breaking: fidl::marker::SourceBreaking,
80}
81
82impl fidl::Persistable for ResourceEntry {}
83
84/// Metadata that is statically defined in the board configuration and passed
85/// to the device.
86#[derive(Clone, Debug, Default, PartialEq)]
87pub struct StaticMetadata {
88    pub id: Option<String>,
89    pub data: Option<Vec<u8>>,
90    #[doc(hidden)]
91    pub __source_breaking: fidl::marker::SourceBreaking,
92}
93
94impl fidl::Persistable for StaticMetadata {}
95
96#[derive(Clone, Debug)]
97pub enum IommuType {
98    StubIommu(StubIommu),
99    ArmSmmu(ArmSmmu),
100    #[doc(hidden)]
101    __SourceBreaking {
102        unknown_ordinal: u64,
103    },
104}
105
106/// Pattern that matches an unknown `IommuType` member.
107#[macro_export]
108macro_rules! IommuTypeUnknown {
109    () => {
110        _
111    };
112}
113
114// Custom PartialEq so that unknown variants are not equal to themselves.
115impl PartialEq for IommuType {
116    fn eq(&self, other: &Self) -> bool {
117        match (self, other) {
118            (Self::StubIommu(x), Self::StubIommu(y)) => *x == *y,
119            (Self::ArmSmmu(x), Self::ArmSmmu(y)) => *x == *y,
120            _ => false,
121        }
122    }
123}
124
125impl IommuType {
126    #[inline]
127    pub fn ordinal(&self) -> u64 {
128        match *self {
129            Self::StubIommu(_) => 1,
130            Self::ArmSmmu(_) => 2,
131            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
132        }
133    }
134
135    #[inline]
136    pub fn unknown_variant_for_testing() -> Self {
137        Self::__SourceBreaking { unknown_ordinal: 0 }
138    }
139
140    #[inline]
141    pub fn is_unknown(&self) -> bool {
142        match self {
143            Self::__SourceBreaking { .. } => true,
144            _ => false,
145        }
146    }
147}
148
149impl fidl::Persistable for IommuType {}
150
151mod internal {
152    use super::*;
153
154    impl fidl::encoding::ValueTypeMarker for ArmSmmu {
155        type Borrowed<'a> = &'a Self;
156        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
157            value
158        }
159    }
160
161    unsafe impl fidl::encoding::TypeMarker for ArmSmmu {
162        type Owned = Self;
163
164        #[inline(always)]
165        fn inline_align(_context: fidl::encoding::Context) -> usize {
166            8
167        }
168
169        #[inline(always)]
170        fn inline_size(_context: fidl::encoding::Context) -> usize {
171            8
172        }
173        #[inline(always)]
174        fn encode_is_copy() -> bool {
175            true
176        }
177
178        #[inline(always)]
179        fn decode_is_copy() -> bool {
180            true
181        }
182    }
183
184    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ArmSmmu, D> for &ArmSmmu {
185        #[inline]
186        unsafe fn encode(
187            self,
188            encoder: &mut fidl::encoding::Encoder<'_, D>,
189            offset: usize,
190            _depth: fidl::encoding::Depth,
191        ) -> fidl::Result<()> {
192            encoder.debug_check_bounds::<ArmSmmu>(offset);
193            unsafe {
194                // Copy the object into the buffer.
195                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
196                (buf_ptr as *mut ArmSmmu).write_unaligned((self as *const ArmSmmu).read());
197                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
198                // done second because the memcpy will write garbage to these bytes.
199            }
200            Ok(())
201        }
202    }
203    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u64, D>>
204        fidl::encoding::Encode<ArmSmmu, D> for (T0,)
205    {
206        #[inline]
207        unsafe fn encode(
208            self,
209            encoder: &mut fidl::encoding::Encoder<'_, D>,
210            offset: usize,
211            depth: fidl::encoding::Depth,
212        ) -> fidl::Result<()> {
213            encoder.debug_check_bounds::<ArmSmmu>(offset);
214            // Zero out padding regions. There's no need to apply masks
215            // because the unmasked parts will be overwritten by fields.
216            // Write the fields.
217            self.0.encode(encoder, offset + 0, depth)?;
218            Ok(())
219        }
220    }
221
222    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ArmSmmu {
223        #[inline(always)]
224        fn new_empty() -> Self {
225            Self { base_address: fidl::new_empty!(u64, D) }
226        }
227
228        #[inline]
229        unsafe fn decode(
230            &mut self,
231            decoder: &mut fidl::encoding::Decoder<'_, D>,
232            offset: usize,
233            _depth: fidl::encoding::Depth,
234        ) -> fidl::Result<()> {
235            decoder.debug_check_bounds::<Self>(offset);
236            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
237            // Verify that padding bytes are zero.
238            // Copy from the buffer into the object.
239            unsafe {
240                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
241            }
242            Ok(())
243        }
244    }
245
246    impl fidl::encoding::ValueTypeMarker for StubIommu {
247        type Borrowed<'a> = &'a Self;
248        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
249            value
250        }
251    }
252
253    unsafe impl fidl::encoding::TypeMarker for StubIommu {
254        type Owned = Self;
255
256        #[inline(always)]
257        fn inline_align(_context: fidl::encoding::Context) -> usize {
258            1
259        }
260
261        #[inline(always)]
262        fn inline_size(_context: fidl::encoding::Context) -> usize {
263            1
264        }
265    }
266
267    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<StubIommu, D>
268        for &StubIommu
269    {
270        #[inline]
271        unsafe fn encode(
272            self,
273            encoder: &mut fidl::encoding::Encoder<'_, D>,
274            offset: usize,
275            _depth: fidl::encoding::Depth,
276        ) -> fidl::Result<()> {
277            encoder.debug_check_bounds::<StubIommu>(offset);
278            encoder.write_num(0u8, offset);
279            Ok(())
280        }
281    }
282
283    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for StubIommu {
284        #[inline(always)]
285        fn new_empty() -> Self {
286            Self
287        }
288
289        #[inline]
290        unsafe fn decode(
291            &mut self,
292            decoder: &mut fidl::encoding::Decoder<'_, D>,
293            offset: usize,
294            _depth: fidl::encoding::Depth,
295        ) -> fidl::Result<()> {
296            decoder.debug_check_bounds::<Self>(offset);
297            match decoder.read_num::<u8>(offset) {
298                0 => Ok(()),
299                _ => Err(fidl::Error::Invalid),
300            }
301        }
302    }
303
304    impl AggregateEntry {
305        #[inline(always)]
306        fn max_ordinal_present(&self) -> u64 {
307            if let Some(_) = self.resources {
308                return 3;
309            }
310            if let Some(_) = self.service {
311                return 2;
312            }
313            if let Some(_) = self.provider {
314                return 1;
315            }
316            0
317        }
318    }
319
320    impl fidl::encoding::ValueTypeMarker for AggregateEntry {
321        type Borrowed<'a> = &'a Self;
322        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
323            value
324        }
325    }
326
327    unsafe impl fidl::encoding::TypeMarker for AggregateEntry {
328        type Owned = Self;
329
330        #[inline(always)]
331        fn inline_align(_context: fidl::encoding::Context) -> usize {
332            8
333        }
334
335        #[inline(always)]
336        fn inline_size(_context: fidl::encoding::Context) -> usize {
337            16
338        }
339    }
340
341    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<AggregateEntry, D>
342        for &AggregateEntry
343    {
344        unsafe fn encode(
345            self,
346            encoder: &mut fidl::encoding::Encoder<'_, D>,
347            offset: usize,
348            mut depth: fidl::encoding::Depth,
349        ) -> fidl::Result<()> {
350            encoder.debug_check_bounds::<AggregateEntry>(offset);
351            // Vector header
352            let max_ordinal: u64 = self.max_ordinal_present();
353            encoder.write_num(max_ordinal, offset);
354            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
355            // Calling encoder.out_of_line_offset(0) is not allowed.
356            if max_ordinal == 0 {
357                return Ok(());
358            }
359            depth.increment()?;
360            let envelope_size = 8;
361            let bytes_len = max_ordinal as usize * envelope_size;
362            #[allow(unused_variables)]
363            let offset = encoder.out_of_line_offset(bytes_len);
364            let mut _prev_end_offset: usize = 0;
365            if 1 > max_ordinal {
366                return Ok(());
367            }
368
369            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
370            // are envelope_size bytes.
371            let cur_offset: usize = (1 - 1) * envelope_size;
372
373            // Zero reserved fields.
374            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
375
376            // Safety:
377            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
378            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
379            //   envelope_size bytes, there is always sufficient room.
380            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
381                self.provider.as_ref().map(
382                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
383                ),
384                encoder,
385                offset + cur_offset,
386                depth,
387            )?;
388
389            _prev_end_offset = cur_offset + envelope_size;
390            if 2 > max_ordinal {
391                return Ok(());
392            }
393
394            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
395            // are envelope_size bytes.
396            let cur_offset: usize = (2 - 1) * envelope_size;
397
398            // Zero reserved fields.
399            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
400
401            // Safety:
402            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
403            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
404            //   envelope_size bytes, there is always sufficient room.
405            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
406                self.service.as_ref().map(
407                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
408                ),
409                encoder,
410                offset + cur_offset,
411                depth,
412            )?;
413
414            _prev_end_offset = cur_offset + envelope_size;
415            if 3 > max_ordinal {
416                return Ok(());
417            }
418
419            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
420            // are envelope_size bytes.
421            let cur_offset: usize = (3 - 1) * envelope_size;
422
423            // Zero reserved fields.
424            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
425
426            // Safety:
427            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
428            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
429            //   envelope_size bytes, there is always sufficient room.
430            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<ResourceEntry>, D>(
431            self.resources.as_ref().map(<fidl::encoding::UnboundedVector<ResourceEntry> as fidl::encoding::ValueTypeMarker>::borrow),
432            encoder, offset + cur_offset, depth
433        )?;
434
435            _prev_end_offset = cur_offset + envelope_size;
436
437            Ok(())
438        }
439    }
440
441    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for AggregateEntry {
442        #[inline(always)]
443        fn new_empty() -> Self {
444            Self::default()
445        }
446
447        unsafe fn decode(
448            &mut self,
449            decoder: &mut fidl::encoding::Decoder<'_, D>,
450            offset: usize,
451            mut depth: fidl::encoding::Depth,
452        ) -> fidl::Result<()> {
453            decoder.debug_check_bounds::<Self>(offset);
454            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
455                None => return Err(fidl::Error::NotNullable),
456                Some(len) => len,
457            };
458            // Calling decoder.out_of_line_offset(0) is not allowed.
459            if len == 0 {
460                return Ok(());
461            };
462            depth.increment()?;
463            let envelope_size = 8;
464            let bytes_len = len * envelope_size;
465            let offset = decoder.out_of_line_offset(bytes_len)?;
466            // Decode the envelope for each type.
467            let mut _next_ordinal_to_read = 0;
468            let mut next_offset = offset;
469            let end_offset = offset + bytes_len;
470            _next_ordinal_to_read += 1;
471            if next_offset >= end_offset {
472                return Ok(());
473            }
474
475            // Decode unknown envelopes for gaps in ordinals.
476            while _next_ordinal_to_read < 1 {
477                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
478                _next_ordinal_to_read += 1;
479                next_offset += envelope_size;
480            }
481
482            let next_out_of_line = decoder.next_out_of_line();
483            let handles_before = decoder.remaining_handles();
484            if let Some((inlined, num_bytes, num_handles)) =
485                fidl::encoding::decode_envelope_header(decoder, next_offset)?
486            {
487                let member_inline_size =
488                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
489                        decoder.context,
490                    );
491                if inlined != (member_inline_size <= 4) {
492                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
493                }
494                let inner_offset;
495                let mut inner_depth = depth.clone();
496                if inlined {
497                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
498                    inner_offset = next_offset;
499                } else {
500                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
501                    inner_depth.increment()?;
502                }
503                let val_ref = self
504                    .provider
505                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
506                fidl::decode!(
507                    fidl::encoding::UnboundedString,
508                    D,
509                    val_ref,
510                    decoder,
511                    inner_offset,
512                    inner_depth
513                )?;
514                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
515                {
516                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
517                }
518                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
519                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
520                }
521            }
522
523            next_offset += envelope_size;
524            _next_ordinal_to_read += 1;
525            if next_offset >= end_offset {
526                return Ok(());
527            }
528
529            // Decode unknown envelopes for gaps in ordinals.
530            while _next_ordinal_to_read < 2 {
531                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
532                _next_ordinal_to_read += 1;
533                next_offset += envelope_size;
534            }
535
536            let next_out_of_line = decoder.next_out_of_line();
537            let handles_before = decoder.remaining_handles();
538            if let Some((inlined, num_bytes, num_handles)) =
539                fidl::encoding::decode_envelope_header(decoder, next_offset)?
540            {
541                let member_inline_size =
542                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
543                        decoder.context,
544                    );
545                if inlined != (member_inline_size <= 4) {
546                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
547                }
548                let inner_offset;
549                let mut inner_depth = depth.clone();
550                if inlined {
551                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
552                    inner_offset = next_offset;
553                } else {
554                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
555                    inner_depth.increment()?;
556                }
557                let val_ref = self
558                    .service
559                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
560                fidl::decode!(
561                    fidl::encoding::UnboundedString,
562                    D,
563                    val_ref,
564                    decoder,
565                    inner_offset,
566                    inner_depth
567                )?;
568                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
569                {
570                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
571                }
572                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
573                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
574                }
575            }
576
577            next_offset += envelope_size;
578            _next_ordinal_to_read += 1;
579            if next_offset >= end_offset {
580                return Ok(());
581            }
582
583            // Decode unknown envelopes for gaps in ordinals.
584            while _next_ordinal_to_read < 3 {
585                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
586                _next_ordinal_to_read += 1;
587                next_offset += envelope_size;
588            }
589
590            let next_out_of_line = decoder.next_out_of_line();
591            let handles_before = decoder.remaining_handles();
592            if let Some((inlined, num_bytes, num_handles)) =
593                fidl::encoding::decode_envelope_header(decoder, next_offset)?
594            {
595                let member_inline_size = <fidl::encoding::UnboundedVector<ResourceEntry> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
596                if inlined != (member_inline_size <= 4) {
597                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
598                }
599                let inner_offset;
600                let mut inner_depth = depth.clone();
601                if inlined {
602                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
603                    inner_offset = next_offset;
604                } else {
605                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
606                    inner_depth.increment()?;
607                }
608                let val_ref = self.resources.get_or_insert_with(|| {
609                    fidl::new_empty!(fidl::encoding::UnboundedVector<ResourceEntry>, D)
610                });
611                fidl::decode!(
612                    fidl::encoding::UnboundedVector<ResourceEntry>,
613                    D,
614                    val_ref,
615                    decoder,
616                    inner_offset,
617                    inner_depth
618                )?;
619                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
620                {
621                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
622                }
623                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
624                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
625                }
626            }
627
628            next_offset += envelope_size;
629
630            // Decode the remaining unknown envelopes.
631            while next_offset < end_offset {
632                _next_ordinal_to_read += 1;
633                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
634                next_offset += envelope_size;
635            }
636
637            Ok(())
638        }
639    }
640
641    impl BoardConfig {
642        #[inline(always)]
643        fn max_ordinal_present(&self) -> u64 {
644            if let Some(_) = self.iommus {
645                return 3;
646            }
647            if let Some(_) = self.aggregates {
648                return 2;
649            }
650            if let Some(_) = self.devices {
651                return 1;
652            }
653            0
654        }
655    }
656
657    impl fidl::encoding::ValueTypeMarker for BoardConfig {
658        type Borrowed<'a> = &'a Self;
659        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
660            value
661        }
662    }
663
664    unsafe impl fidl::encoding::TypeMarker for BoardConfig {
665        type Owned = Self;
666
667        #[inline(always)]
668        fn inline_align(_context: fidl::encoding::Context) -> usize {
669            8
670        }
671
672        #[inline(always)]
673        fn inline_size(_context: fidl::encoding::Context) -> usize {
674            16
675        }
676    }
677
678    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<BoardConfig, D>
679        for &BoardConfig
680    {
681        unsafe fn encode(
682            self,
683            encoder: &mut fidl::encoding::Encoder<'_, D>,
684            offset: usize,
685            mut depth: fidl::encoding::Depth,
686        ) -> fidl::Result<()> {
687            encoder.debug_check_bounds::<BoardConfig>(offset);
688            // Vector header
689            let max_ordinal: u64 = self.max_ordinal_present();
690            encoder.write_num(max_ordinal, offset);
691            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
692            // Calling encoder.out_of_line_offset(0) is not allowed.
693            if max_ordinal == 0 {
694                return Ok(());
695            }
696            depth.increment()?;
697            let envelope_size = 8;
698            let bytes_len = max_ordinal as usize * envelope_size;
699            #[allow(unused_variables)]
700            let offset = encoder.out_of_line_offset(bytes_len);
701            let mut _prev_end_offset: usize = 0;
702            if 1 > max_ordinal {
703                return Ok(());
704            }
705
706            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
707            // are envelope_size bytes.
708            let cur_offset: usize = (1 - 1) * envelope_size;
709
710            // Zero reserved fields.
711            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
712
713            // Safety:
714            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
715            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
716            //   envelope_size bytes, there is always sufficient room.
717            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<Device>, D>(
718            self.devices.as_ref().map(<fidl::encoding::UnboundedVector<Device> as fidl::encoding::ValueTypeMarker>::borrow),
719            encoder, offset + cur_offset, depth
720        )?;
721
722            _prev_end_offset = cur_offset + envelope_size;
723            if 2 > max_ordinal {
724                return Ok(());
725            }
726
727            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
728            // are envelope_size bytes.
729            let cur_offset: usize = (2 - 1) * envelope_size;
730
731            // Zero reserved fields.
732            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
733
734            // Safety:
735            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
736            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
737            //   envelope_size bytes, there is always sufficient room.
738            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<AggregateEntry>, D>(
739            self.aggregates.as_ref().map(<fidl::encoding::UnboundedVector<AggregateEntry> as fidl::encoding::ValueTypeMarker>::borrow),
740            encoder, offset + cur_offset, depth
741        )?;
742
743            _prev_end_offset = cur_offset + envelope_size;
744            if 3 > max_ordinal {
745                return Ok(());
746            }
747
748            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
749            // are envelope_size bytes.
750            let cur_offset: usize = (3 - 1) * envelope_size;
751
752            // Zero reserved fields.
753            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
754
755            // Safety:
756            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
757            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
758            //   envelope_size bytes, there is always sufficient room.
759            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<Iommu>, D>(
760            self.iommus.as_ref().map(<fidl::encoding::UnboundedVector<Iommu> as fidl::encoding::ValueTypeMarker>::borrow),
761            encoder, offset + cur_offset, depth
762        )?;
763
764            _prev_end_offset = cur_offset + envelope_size;
765
766            Ok(())
767        }
768    }
769
770    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for BoardConfig {
771        #[inline(always)]
772        fn new_empty() -> Self {
773            Self::default()
774        }
775
776        unsafe fn decode(
777            &mut self,
778            decoder: &mut fidl::encoding::Decoder<'_, D>,
779            offset: usize,
780            mut depth: fidl::encoding::Depth,
781        ) -> fidl::Result<()> {
782            decoder.debug_check_bounds::<Self>(offset);
783            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
784                None => return Err(fidl::Error::NotNullable),
785                Some(len) => len,
786            };
787            // Calling decoder.out_of_line_offset(0) is not allowed.
788            if len == 0 {
789                return Ok(());
790            };
791            depth.increment()?;
792            let envelope_size = 8;
793            let bytes_len = len * envelope_size;
794            let offset = decoder.out_of_line_offset(bytes_len)?;
795            // Decode the envelope for each type.
796            let mut _next_ordinal_to_read = 0;
797            let mut next_offset = offset;
798            let end_offset = offset + bytes_len;
799            _next_ordinal_to_read += 1;
800            if next_offset >= end_offset {
801                return Ok(());
802            }
803
804            // Decode unknown envelopes for gaps in ordinals.
805            while _next_ordinal_to_read < 1 {
806                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
807                _next_ordinal_to_read += 1;
808                next_offset += envelope_size;
809            }
810
811            let next_out_of_line = decoder.next_out_of_line();
812            let handles_before = decoder.remaining_handles();
813            if let Some((inlined, num_bytes, num_handles)) =
814                fidl::encoding::decode_envelope_header(decoder, next_offset)?
815            {
816                let member_inline_size = <fidl::encoding::UnboundedVector<Device> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
817                if inlined != (member_inline_size <= 4) {
818                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
819                }
820                let inner_offset;
821                let mut inner_depth = depth.clone();
822                if inlined {
823                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
824                    inner_offset = next_offset;
825                } else {
826                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
827                    inner_depth.increment()?;
828                }
829                let val_ref = self.devices.get_or_insert_with(|| {
830                    fidl::new_empty!(fidl::encoding::UnboundedVector<Device>, D)
831                });
832                fidl::decode!(
833                    fidl::encoding::UnboundedVector<Device>,
834                    D,
835                    val_ref,
836                    decoder,
837                    inner_offset,
838                    inner_depth
839                )?;
840                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
841                {
842                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
843                }
844                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
845                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
846                }
847            }
848
849            next_offset += envelope_size;
850            _next_ordinal_to_read += 1;
851            if next_offset >= end_offset {
852                return Ok(());
853            }
854
855            // Decode unknown envelopes for gaps in ordinals.
856            while _next_ordinal_to_read < 2 {
857                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
858                _next_ordinal_to_read += 1;
859                next_offset += envelope_size;
860            }
861
862            let next_out_of_line = decoder.next_out_of_line();
863            let handles_before = decoder.remaining_handles();
864            if let Some((inlined, num_bytes, num_handles)) =
865                fidl::encoding::decode_envelope_header(decoder, next_offset)?
866            {
867                let member_inline_size = <fidl::encoding::UnboundedVector<AggregateEntry> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
868                if inlined != (member_inline_size <= 4) {
869                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
870                }
871                let inner_offset;
872                let mut inner_depth = depth.clone();
873                if inlined {
874                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
875                    inner_offset = next_offset;
876                } else {
877                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
878                    inner_depth.increment()?;
879                }
880                let val_ref = self.aggregates.get_or_insert_with(|| {
881                    fidl::new_empty!(fidl::encoding::UnboundedVector<AggregateEntry>, D)
882                });
883                fidl::decode!(
884                    fidl::encoding::UnboundedVector<AggregateEntry>,
885                    D,
886                    val_ref,
887                    decoder,
888                    inner_offset,
889                    inner_depth
890                )?;
891                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
892                {
893                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
894                }
895                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
896                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
897                }
898            }
899
900            next_offset += envelope_size;
901            _next_ordinal_to_read += 1;
902            if next_offset >= end_offset {
903                return Ok(());
904            }
905
906            // Decode unknown envelopes for gaps in ordinals.
907            while _next_ordinal_to_read < 3 {
908                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
909                _next_ordinal_to_read += 1;
910                next_offset += envelope_size;
911            }
912
913            let next_out_of_line = decoder.next_out_of_line();
914            let handles_before = decoder.remaining_handles();
915            if let Some((inlined, num_bytes, num_handles)) =
916                fidl::encoding::decode_envelope_header(decoder, next_offset)?
917            {
918                let member_inline_size = <fidl::encoding::UnboundedVector<Iommu> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
919                if inlined != (member_inline_size <= 4) {
920                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
921                }
922                let inner_offset;
923                let mut inner_depth = depth.clone();
924                if inlined {
925                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
926                    inner_offset = next_offset;
927                } else {
928                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
929                    inner_depth.increment()?;
930                }
931                let val_ref = self.iommus.get_or_insert_with(|| {
932                    fidl::new_empty!(fidl::encoding::UnboundedVector<Iommu>, D)
933                });
934                fidl::decode!(
935                    fidl::encoding::UnboundedVector<Iommu>,
936                    D,
937                    val_ref,
938                    decoder,
939                    inner_offset,
940                    inner_depth
941                )?;
942                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
943                {
944                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
945                }
946                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
947                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
948                }
949            }
950
951            next_offset += envelope_size;
952
953            // Decode the remaining unknown envelopes.
954            while next_offset < end_offset {
955                _next_ordinal_to_read += 1;
956                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
957                next_offset += envelope_size;
958            }
959
960            Ok(())
961        }
962    }
963
964    impl Device {
965        #[inline(always)]
966        fn max_ordinal_present(&self) -> u64 {
967            if let Some(_) = self.driver_host {
968                return 8;
969            }
970            if let Some(_) = self.disabled {
971                return 7;
972            }
973            if let Some(_) = self.interrupt_controller_id {
974                return 6;
975            }
976            if let Some(_) = self.metadata {
977                return 5;
978            }
979            if let Some(_) = self.compatible {
980                return 4;
981            }
982            if let Some(_) = self.url {
983                return 3;
984            }
985            if let Some(_) = self.id {
986                return 2;
987            }
988            if let Some(_) = self.name {
989                return 1;
990            }
991            0
992        }
993    }
994
995    impl fidl::encoding::ValueTypeMarker for Device {
996        type Borrowed<'a> = &'a Self;
997        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
998            value
999        }
1000    }
1001
1002    unsafe impl fidl::encoding::TypeMarker for Device {
1003        type Owned = Self;
1004
1005        #[inline(always)]
1006        fn inline_align(_context: fidl::encoding::Context) -> usize {
1007            8
1008        }
1009
1010        #[inline(always)]
1011        fn inline_size(_context: fidl::encoding::Context) -> usize {
1012            16
1013        }
1014    }
1015
1016    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Device, D> for &Device {
1017        unsafe fn encode(
1018            self,
1019            encoder: &mut fidl::encoding::Encoder<'_, D>,
1020            offset: usize,
1021            mut depth: fidl::encoding::Depth,
1022        ) -> fidl::Result<()> {
1023            encoder.debug_check_bounds::<Device>(offset);
1024            // Vector header
1025            let max_ordinal: u64 = self.max_ordinal_present();
1026            encoder.write_num(max_ordinal, offset);
1027            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1028            // Calling encoder.out_of_line_offset(0) is not allowed.
1029            if max_ordinal == 0 {
1030                return Ok(());
1031            }
1032            depth.increment()?;
1033            let envelope_size = 8;
1034            let bytes_len = max_ordinal as usize * envelope_size;
1035            #[allow(unused_variables)]
1036            let offset = encoder.out_of_line_offset(bytes_len);
1037            let mut _prev_end_offset: usize = 0;
1038            if 1 > max_ordinal {
1039                return Ok(());
1040            }
1041
1042            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1043            // are envelope_size bytes.
1044            let cur_offset: usize = (1 - 1) * envelope_size;
1045
1046            // Zero reserved fields.
1047            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1048
1049            // Safety:
1050            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1051            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1052            //   envelope_size bytes, there is always sufficient room.
1053            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
1054                self.name.as_ref().map(
1055                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
1056                ),
1057                encoder,
1058                offset + cur_offset,
1059                depth,
1060            )?;
1061
1062            _prev_end_offset = cur_offset + envelope_size;
1063            if 2 > max_ordinal {
1064                return Ok(());
1065            }
1066
1067            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1068            // are envelope_size bytes.
1069            let cur_offset: usize = (2 - 1) * envelope_size;
1070
1071            // Zero reserved fields.
1072            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1073
1074            // Safety:
1075            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1076            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1077            //   envelope_size bytes, there is always sufficient room.
1078            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1079                self.id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1080                encoder,
1081                offset + cur_offset,
1082                depth,
1083            )?;
1084
1085            _prev_end_offset = cur_offset + envelope_size;
1086            if 3 > max_ordinal {
1087                return Ok(());
1088            }
1089
1090            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1091            // are envelope_size bytes.
1092            let cur_offset: usize = (3 - 1) * envelope_size;
1093
1094            // Zero reserved fields.
1095            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1096
1097            // Safety:
1098            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1099            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1100            //   envelope_size bytes, there is always sufficient room.
1101            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
1102                self.url.as_ref().map(
1103                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
1104                ),
1105                encoder,
1106                offset + cur_offset,
1107                depth,
1108            )?;
1109
1110            _prev_end_offset = cur_offset + envelope_size;
1111            if 4 > max_ordinal {
1112                return Ok(());
1113            }
1114
1115            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1116            // are envelope_size bytes.
1117            let cur_offset: usize = (4 - 1) * envelope_size;
1118
1119            // Zero reserved fields.
1120            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1121
1122            // Safety:
1123            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1124            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1125            //   envelope_size bytes, there is always sufficient room.
1126            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
1127                self.compatible.as_ref().map(
1128                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
1129                ),
1130                encoder,
1131                offset + cur_offset,
1132                depth,
1133            )?;
1134
1135            _prev_end_offset = cur_offset + envelope_size;
1136            if 5 > max_ordinal {
1137                return Ok(());
1138            }
1139
1140            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1141            // are envelope_size bytes.
1142            let cur_offset: usize = (5 - 1) * envelope_size;
1143
1144            // Zero reserved fields.
1145            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1146
1147            // Safety:
1148            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1149            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1150            //   envelope_size bytes, there is always sufficient room.
1151            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<StaticMetadata>, D>(
1152            self.metadata.as_ref().map(<fidl::encoding::UnboundedVector<StaticMetadata> as fidl::encoding::ValueTypeMarker>::borrow),
1153            encoder, offset + cur_offset, depth
1154        )?;
1155
1156            _prev_end_offset = cur_offset + envelope_size;
1157            if 6 > max_ordinal {
1158                return Ok(());
1159            }
1160
1161            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1162            // are envelope_size bytes.
1163            let cur_offset: usize = (6 - 1) * envelope_size;
1164
1165            // Zero reserved fields.
1166            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1167
1168            // Safety:
1169            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1170            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1171            //   envelope_size bytes, there is always sufficient room.
1172            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1173                self.interrupt_controller_id
1174                    .as_ref()
1175                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1176                encoder,
1177                offset + cur_offset,
1178                depth,
1179            )?;
1180
1181            _prev_end_offset = cur_offset + envelope_size;
1182            if 7 > max_ordinal {
1183                return Ok(());
1184            }
1185
1186            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1187            // are envelope_size bytes.
1188            let cur_offset: usize = (7 - 1) * envelope_size;
1189
1190            // Zero reserved fields.
1191            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1192
1193            // Safety:
1194            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1195            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1196            //   envelope_size bytes, there is always sufficient room.
1197            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1198                self.disabled.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1199                encoder,
1200                offset + cur_offset,
1201                depth,
1202            )?;
1203
1204            _prev_end_offset = cur_offset + envelope_size;
1205            if 8 > max_ordinal {
1206                return Ok(());
1207            }
1208
1209            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1210            // are envelope_size bytes.
1211            let cur_offset: usize = (8 - 1) * envelope_size;
1212
1213            // Zero reserved fields.
1214            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1215
1216            // Safety:
1217            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1218            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1219            //   envelope_size bytes, there is always sufficient room.
1220            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
1221                self.driver_host.as_ref().map(
1222                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
1223                ),
1224                encoder,
1225                offset + cur_offset,
1226                depth,
1227            )?;
1228
1229            _prev_end_offset = cur_offset + envelope_size;
1230
1231            Ok(())
1232        }
1233    }
1234
1235    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Device {
1236        #[inline(always)]
1237        fn new_empty() -> Self {
1238            Self::default()
1239        }
1240
1241        unsafe fn decode(
1242            &mut self,
1243            decoder: &mut fidl::encoding::Decoder<'_, D>,
1244            offset: usize,
1245            mut depth: fidl::encoding::Depth,
1246        ) -> fidl::Result<()> {
1247            decoder.debug_check_bounds::<Self>(offset);
1248            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1249                None => return Err(fidl::Error::NotNullable),
1250                Some(len) => len,
1251            };
1252            // Calling decoder.out_of_line_offset(0) is not allowed.
1253            if len == 0 {
1254                return Ok(());
1255            };
1256            depth.increment()?;
1257            let envelope_size = 8;
1258            let bytes_len = len * envelope_size;
1259            let offset = decoder.out_of_line_offset(bytes_len)?;
1260            // Decode the envelope for each type.
1261            let mut _next_ordinal_to_read = 0;
1262            let mut next_offset = offset;
1263            let end_offset = offset + bytes_len;
1264            _next_ordinal_to_read += 1;
1265            if next_offset >= end_offset {
1266                return Ok(());
1267            }
1268
1269            // Decode unknown envelopes for gaps in ordinals.
1270            while _next_ordinal_to_read < 1 {
1271                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1272                _next_ordinal_to_read += 1;
1273                next_offset += envelope_size;
1274            }
1275
1276            let next_out_of_line = decoder.next_out_of_line();
1277            let handles_before = decoder.remaining_handles();
1278            if let Some((inlined, num_bytes, num_handles)) =
1279                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1280            {
1281                let member_inline_size =
1282                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
1283                        decoder.context,
1284                    );
1285                if inlined != (member_inline_size <= 4) {
1286                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1287                }
1288                let inner_offset;
1289                let mut inner_depth = depth.clone();
1290                if inlined {
1291                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1292                    inner_offset = next_offset;
1293                } else {
1294                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1295                    inner_depth.increment()?;
1296                }
1297                let val_ref = self
1298                    .name
1299                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
1300                fidl::decode!(
1301                    fidl::encoding::UnboundedString,
1302                    D,
1303                    val_ref,
1304                    decoder,
1305                    inner_offset,
1306                    inner_depth
1307                )?;
1308                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1309                {
1310                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1311                }
1312                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1313                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1314                }
1315            }
1316
1317            next_offset += envelope_size;
1318            _next_ordinal_to_read += 1;
1319            if next_offset >= end_offset {
1320                return Ok(());
1321            }
1322
1323            // Decode unknown envelopes for gaps in ordinals.
1324            while _next_ordinal_to_read < 2 {
1325                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1326                _next_ordinal_to_read += 1;
1327                next_offset += envelope_size;
1328            }
1329
1330            let next_out_of_line = decoder.next_out_of_line();
1331            let handles_before = decoder.remaining_handles();
1332            if let Some((inlined, num_bytes, num_handles)) =
1333                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1334            {
1335                let member_inline_size =
1336                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1337                if inlined != (member_inline_size <= 4) {
1338                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1339                }
1340                let inner_offset;
1341                let mut inner_depth = depth.clone();
1342                if inlined {
1343                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1344                    inner_offset = next_offset;
1345                } else {
1346                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1347                    inner_depth.increment()?;
1348                }
1349                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(u32, D));
1350                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1351                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1352                {
1353                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1354                }
1355                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1356                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1357                }
1358            }
1359
1360            next_offset += envelope_size;
1361            _next_ordinal_to_read += 1;
1362            if next_offset >= end_offset {
1363                return Ok(());
1364            }
1365
1366            // Decode unknown envelopes for gaps in ordinals.
1367            while _next_ordinal_to_read < 3 {
1368                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1369                _next_ordinal_to_read += 1;
1370                next_offset += envelope_size;
1371            }
1372
1373            let next_out_of_line = decoder.next_out_of_line();
1374            let handles_before = decoder.remaining_handles();
1375            if let Some((inlined, num_bytes, num_handles)) =
1376                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1377            {
1378                let member_inline_size =
1379                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
1380                        decoder.context,
1381                    );
1382                if inlined != (member_inline_size <= 4) {
1383                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1384                }
1385                let inner_offset;
1386                let mut inner_depth = depth.clone();
1387                if inlined {
1388                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1389                    inner_offset = next_offset;
1390                } else {
1391                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1392                    inner_depth.increment()?;
1393                }
1394                let val_ref = self
1395                    .url
1396                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
1397                fidl::decode!(
1398                    fidl::encoding::UnboundedString,
1399                    D,
1400                    val_ref,
1401                    decoder,
1402                    inner_offset,
1403                    inner_depth
1404                )?;
1405                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1406                {
1407                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1408                }
1409                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1410                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1411                }
1412            }
1413
1414            next_offset += envelope_size;
1415            _next_ordinal_to_read += 1;
1416            if next_offset >= end_offset {
1417                return Ok(());
1418            }
1419
1420            // Decode unknown envelopes for gaps in ordinals.
1421            while _next_ordinal_to_read < 4 {
1422                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1423                _next_ordinal_to_read += 1;
1424                next_offset += envelope_size;
1425            }
1426
1427            let next_out_of_line = decoder.next_out_of_line();
1428            let handles_before = decoder.remaining_handles();
1429            if let Some((inlined, num_bytes, num_handles)) =
1430                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1431            {
1432                let member_inline_size =
1433                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
1434                        decoder.context,
1435                    );
1436                if inlined != (member_inline_size <= 4) {
1437                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1438                }
1439                let inner_offset;
1440                let mut inner_depth = depth.clone();
1441                if inlined {
1442                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1443                    inner_offset = next_offset;
1444                } else {
1445                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1446                    inner_depth.increment()?;
1447                }
1448                let val_ref = self
1449                    .compatible
1450                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
1451                fidl::decode!(
1452                    fidl::encoding::UnboundedString,
1453                    D,
1454                    val_ref,
1455                    decoder,
1456                    inner_offset,
1457                    inner_depth
1458                )?;
1459                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1460                {
1461                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1462                }
1463                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1464                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1465                }
1466            }
1467
1468            next_offset += envelope_size;
1469            _next_ordinal_to_read += 1;
1470            if next_offset >= end_offset {
1471                return Ok(());
1472            }
1473
1474            // Decode unknown envelopes for gaps in ordinals.
1475            while _next_ordinal_to_read < 5 {
1476                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1477                _next_ordinal_to_read += 1;
1478                next_offset += envelope_size;
1479            }
1480
1481            let next_out_of_line = decoder.next_out_of_line();
1482            let handles_before = decoder.remaining_handles();
1483            if let Some((inlined, num_bytes, num_handles)) =
1484                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1485            {
1486                let member_inline_size = <fidl::encoding::UnboundedVector<StaticMetadata> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1487                if inlined != (member_inline_size <= 4) {
1488                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1489                }
1490                let inner_offset;
1491                let mut inner_depth = depth.clone();
1492                if inlined {
1493                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1494                    inner_offset = next_offset;
1495                } else {
1496                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1497                    inner_depth.increment()?;
1498                }
1499                let val_ref = self.metadata.get_or_insert_with(|| {
1500                    fidl::new_empty!(fidl::encoding::UnboundedVector<StaticMetadata>, D)
1501                });
1502                fidl::decode!(
1503                    fidl::encoding::UnboundedVector<StaticMetadata>,
1504                    D,
1505                    val_ref,
1506                    decoder,
1507                    inner_offset,
1508                    inner_depth
1509                )?;
1510                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1511                {
1512                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1513                }
1514                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1515                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1516                }
1517            }
1518
1519            next_offset += envelope_size;
1520            _next_ordinal_to_read += 1;
1521            if next_offset >= end_offset {
1522                return Ok(());
1523            }
1524
1525            // Decode unknown envelopes for gaps in ordinals.
1526            while _next_ordinal_to_read < 6 {
1527                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1528                _next_ordinal_to_read += 1;
1529                next_offset += envelope_size;
1530            }
1531
1532            let next_out_of_line = decoder.next_out_of_line();
1533            let handles_before = decoder.remaining_handles();
1534            if let Some((inlined, num_bytes, num_handles)) =
1535                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1536            {
1537                let member_inline_size =
1538                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1539                if inlined != (member_inline_size <= 4) {
1540                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1541                }
1542                let inner_offset;
1543                let mut inner_depth = depth.clone();
1544                if inlined {
1545                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1546                    inner_offset = next_offset;
1547                } else {
1548                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1549                    inner_depth.increment()?;
1550                }
1551                let val_ref =
1552                    self.interrupt_controller_id.get_or_insert_with(|| fidl::new_empty!(u32, D));
1553                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1554                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1555                {
1556                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1557                }
1558                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1559                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1560                }
1561            }
1562
1563            next_offset += envelope_size;
1564            _next_ordinal_to_read += 1;
1565            if next_offset >= end_offset {
1566                return Ok(());
1567            }
1568
1569            // Decode unknown envelopes for gaps in ordinals.
1570            while _next_ordinal_to_read < 7 {
1571                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1572                _next_ordinal_to_read += 1;
1573                next_offset += envelope_size;
1574            }
1575
1576            let next_out_of_line = decoder.next_out_of_line();
1577            let handles_before = decoder.remaining_handles();
1578            if let Some((inlined, num_bytes, num_handles)) =
1579                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1580            {
1581                let member_inline_size =
1582                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1583                if inlined != (member_inline_size <= 4) {
1584                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1585                }
1586                let inner_offset;
1587                let mut inner_depth = depth.clone();
1588                if inlined {
1589                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1590                    inner_offset = next_offset;
1591                } else {
1592                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1593                    inner_depth.increment()?;
1594                }
1595                let val_ref = self.disabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1596                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1597                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1598                {
1599                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1600                }
1601                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1602                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1603                }
1604            }
1605
1606            next_offset += envelope_size;
1607            _next_ordinal_to_read += 1;
1608            if next_offset >= end_offset {
1609                return Ok(());
1610            }
1611
1612            // Decode unknown envelopes for gaps in ordinals.
1613            while _next_ordinal_to_read < 8 {
1614                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1615                _next_ordinal_to_read += 1;
1616                next_offset += envelope_size;
1617            }
1618
1619            let next_out_of_line = decoder.next_out_of_line();
1620            let handles_before = decoder.remaining_handles();
1621            if let Some((inlined, num_bytes, num_handles)) =
1622                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1623            {
1624                let member_inline_size =
1625                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
1626                        decoder.context,
1627                    );
1628                if inlined != (member_inline_size <= 4) {
1629                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1630                }
1631                let inner_offset;
1632                let mut inner_depth = depth.clone();
1633                if inlined {
1634                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1635                    inner_offset = next_offset;
1636                } else {
1637                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1638                    inner_depth.increment()?;
1639                }
1640                let val_ref = self
1641                    .driver_host
1642                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
1643                fidl::decode!(
1644                    fidl::encoding::UnboundedString,
1645                    D,
1646                    val_ref,
1647                    decoder,
1648                    inner_offset,
1649                    inner_depth
1650                )?;
1651                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1652                {
1653                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1654                }
1655                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1656                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1657                }
1658            }
1659
1660            next_offset += envelope_size;
1661
1662            // Decode the remaining unknown envelopes.
1663            while next_offset < end_offset {
1664                _next_ordinal_to_read += 1;
1665                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1666                next_offset += envelope_size;
1667            }
1668
1669            Ok(())
1670        }
1671    }
1672
1673    impl Iommu {
1674        #[inline(always)]
1675        fn max_ordinal_present(&self) -> u64 {
1676            if let Some(_) = self.iommu_type {
1677                return 3;
1678            }
1679            if let Some(_) = self.id {
1680                return 2;
1681            }
1682            if let Some(_) = self.name {
1683                return 1;
1684            }
1685            0
1686        }
1687    }
1688
1689    impl fidl::encoding::ValueTypeMarker for Iommu {
1690        type Borrowed<'a> = &'a Self;
1691        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1692            value
1693        }
1694    }
1695
1696    unsafe impl fidl::encoding::TypeMarker for Iommu {
1697        type Owned = Self;
1698
1699        #[inline(always)]
1700        fn inline_align(_context: fidl::encoding::Context) -> usize {
1701            8
1702        }
1703
1704        #[inline(always)]
1705        fn inline_size(_context: fidl::encoding::Context) -> usize {
1706            16
1707        }
1708    }
1709
1710    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Iommu, D> for &Iommu {
1711        unsafe fn encode(
1712            self,
1713            encoder: &mut fidl::encoding::Encoder<'_, D>,
1714            offset: usize,
1715            mut depth: fidl::encoding::Depth,
1716        ) -> fidl::Result<()> {
1717            encoder.debug_check_bounds::<Iommu>(offset);
1718            // Vector header
1719            let max_ordinal: u64 = self.max_ordinal_present();
1720            encoder.write_num(max_ordinal, offset);
1721            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1722            // Calling encoder.out_of_line_offset(0) is not allowed.
1723            if max_ordinal == 0 {
1724                return Ok(());
1725            }
1726            depth.increment()?;
1727            let envelope_size = 8;
1728            let bytes_len = max_ordinal as usize * envelope_size;
1729            #[allow(unused_variables)]
1730            let offset = encoder.out_of_line_offset(bytes_len);
1731            let mut _prev_end_offset: usize = 0;
1732            if 1 > max_ordinal {
1733                return Ok(());
1734            }
1735
1736            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1737            // are envelope_size bytes.
1738            let cur_offset: usize = (1 - 1) * envelope_size;
1739
1740            // Zero reserved fields.
1741            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1742
1743            // Safety:
1744            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1745            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1746            //   envelope_size bytes, there is always sufficient room.
1747            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
1748                self.name.as_ref().map(
1749                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
1750                ),
1751                encoder,
1752                offset + cur_offset,
1753                depth,
1754            )?;
1755
1756            _prev_end_offset = cur_offset + envelope_size;
1757            if 2 > max_ordinal {
1758                return Ok(());
1759            }
1760
1761            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1762            // are envelope_size bytes.
1763            let cur_offset: usize = (2 - 1) * envelope_size;
1764
1765            // Zero reserved fields.
1766            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1767
1768            // Safety:
1769            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1770            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1771            //   envelope_size bytes, there is always sufficient room.
1772            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1773                self.id.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1774                encoder,
1775                offset + cur_offset,
1776                depth,
1777            )?;
1778
1779            _prev_end_offset = cur_offset + envelope_size;
1780            if 3 > max_ordinal {
1781                return Ok(());
1782            }
1783
1784            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1785            // are envelope_size bytes.
1786            let cur_offset: usize = (3 - 1) * envelope_size;
1787
1788            // Zero reserved fields.
1789            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1790
1791            // Safety:
1792            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1793            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1794            //   envelope_size bytes, there is always sufficient room.
1795            fidl::encoding::encode_in_envelope_optional::<IommuType, D>(
1796                self.iommu_type
1797                    .as_ref()
1798                    .map(<IommuType as fidl::encoding::ValueTypeMarker>::borrow),
1799                encoder,
1800                offset + cur_offset,
1801                depth,
1802            )?;
1803
1804            _prev_end_offset = cur_offset + envelope_size;
1805
1806            Ok(())
1807        }
1808    }
1809
1810    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Iommu {
1811        #[inline(always)]
1812        fn new_empty() -> Self {
1813            Self::default()
1814        }
1815
1816        unsafe fn decode(
1817            &mut self,
1818            decoder: &mut fidl::encoding::Decoder<'_, D>,
1819            offset: usize,
1820            mut depth: fidl::encoding::Depth,
1821        ) -> fidl::Result<()> {
1822            decoder.debug_check_bounds::<Self>(offset);
1823            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1824                None => return Err(fidl::Error::NotNullable),
1825                Some(len) => len,
1826            };
1827            // Calling decoder.out_of_line_offset(0) is not allowed.
1828            if len == 0 {
1829                return Ok(());
1830            };
1831            depth.increment()?;
1832            let envelope_size = 8;
1833            let bytes_len = len * envelope_size;
1834            let offset = decoder.out_of_line_offset(bytes_len)?;
1835            // Decode the envelope for each type.
1836            let mut _next_ordinal_to_read = 0;
1837            let mut next_offset = offset;
1838            let end_offset = offset + bytes_len;
1839            _next_ordinal_to_read += 1;
1840            if next_offset >= end_offset {
1841                return Ok(());
1842            }
1843
1844            // Decode unknown envelopes for gaps in ordinals.
1845            while _next_ordinal_to_read < 1 {
1846                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1847                _next_ordinal_to_read += 1;
1848                next_offset += envelope_size;
1849            }
1850
1851            let next_out_of_line = decoder.next_out_of_line();
1852            let handles_before = decoder.remaining_handles();
1853            if let Some((inlined, num_bytes, num_handles)) =
1854                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1855            {
1856                let member_inline_size =
1857                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
1858                        decoder.context,
1859                    );
1860                if inlined != (member_inline_size <= 4) {
1861                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1862                }
1863                let inner_offset;
1864                let mut inner_depth = depth.clone();
1865                if inlined {
1866                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1867                    inner_offset = next_offset;
1868                } else {
1869                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1870                    inner_depth.increment()?;
1871                }
1872                let val_ref = self
1873                    .name
1874                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
1875                fidl::decode!(
1876                    fidl::encoding::UnboundedString,
1877                    D,
1878                    val_ref,
1879                    decoder,
1880                    inner_offset,
1881                    inner_depth
1882                )?;
1883                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1884                {
1885                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1886                }
1887                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1888                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1889                }
1890            }
1891
1892            next_offset += envelope_size;
1893            _next_ordinal_to_read += 1;
1894            if next_offset >= end_offset {
1895                return Ok(());
1896            }
1897
1898            // Decode unknown envelopes for gaps in ordinals.
1899            while _next_ordinal_to_read < 2 {
1900                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1901                _next_ordinal_to_read += 1;
1902                next_offset += envelope_size;
1903            }
1904
1905            let next_out_of_line = decoder.next_out_of_line();
1906            let handles_before = decoder.remaining_handles();
1907            if let Some((inlined, num_bytes, num_handles)) =
1908                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1909            {
1910                let member_inline_size =
1911                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1912                if inlined != (member_inline_size <= 4) {
1913                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1914                }
1915                let inner_offset;
1916                let mut inner_depth = depth.clone();
1917                if inlined {
1918                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1919                    inner_offset = next_offset;
1920                } else {
1921                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1922                    inner_depth.increment()?;
1923                }
1924                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(u32, D));
1925                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1926                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1927                {
1928                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1929                }
1930                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1931                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1932                }
1933            }
1934
1935            next_offset += envelope_size;
1936            _next_ordinal_to_read += 1;
1937            if next_offset >= end_offset {
1938                return Ok(());
1939            }
1940
1941            // Decode unknown envelopes for gaps in ordinals.
1942            while _next_ordinal_to_read < 3 {
1943                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1944                _next_ordinal_to_read += 1;
1945                next_offset += envelope_size;
1946            }
1947
1948            let next_out_of_line = decoder.next_out_of_line();
1949            let handles_before = decoder.remaining_handles();
1950            if let Some((inlined, num_bytes, num_handles)) =
1951                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1952            {
1953                let member_inline_size =
1954                    <IommuType as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1955                if inlined != (member_inline_size <= 4) {
1956                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1957                }
1958                let inner_offset;
1959                let mut inner_depth = depth.clone();
1960                if inlined {
1961                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1962                    inner_offset = next_offset;
1963                } else {
1964                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1965                    inner_depth.increment()?;
1966                }
1967                let val_ref = self.iommu_type.get_or_insert_with(|| fidl::new_empty!(IommuType, D));
1968                fidl::decode!(IommuType, D, val_ref, decoder, inner_offset, inner_depth)?;
1969                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1970                {
1971                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1972                }
1973                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1974                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1975                }
1976            }
1977
1978            next_offset += envelope_size;
1979
1980            // Decode the remaining unknown envelopes.
1981            while next_offset < end_offset {
1982                _next_ordinal_to_read += 1;
1983                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1984                next_offset += envelope_size;
1985            }
1986
1987            Ok(())
1988        }
1989    }
1990
1991    impl ResourceEntry {
1992        #[inline(always)]
1993        fn max_ordinal_present(&self) -> u64 {
1994            if let Some(_) = self.name {
1995                return 3;
1996            }
1997            if let Some(_) = self.constraint {
1998                return 2;
1999            }
2000            if let Some(_) = self.node {
2001                return 1;
2002            }
2003            0
2004        }
2005    }
2006
2007    impl fidl::encoding::ValueTypeMarker for ResourceEntry {
2008        type Borrowed<'a> = &'a Self;
2009        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2010            value
2011        }
2012    }
2013
2014    unsafe impl fidl::encoding::TypeMarker for ResourceEntry {
2015        type Owned = Self;
2016
2017        #[inline(always)]
2018        fn inline_align(_context: fidl::encoding::Context) -> usize {
2019            8
2020        }
2021
2022        #[inline(always)]
2023        fn inline_size(_context: fidl::encoding::Context) -> usize {
2024            16
2025        }
2026    }
2027
2028    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ResourceEntry, D>
2029        for &ResourceEntry
2030    {
2031        unsafe fn encode(
2032            self,
2033            encoder: &mut fidl::encoding::Encoder<'_, D>,
2034            offset: usize,
2035            mut depth: fidl::encoding::Depth,
2036        ) -> fidl::Result<()> {
2037            encoder.debug_check_bounds::<ResourceEntry>(offset);
2038            // Vector header
2039            let max_ordinal: u64 = self.max_ordinal_present();
2040            encoder.write_num(max_ordinal, offset);
2041            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2042            // Calling encoder.out_of_line_offset(0) is not allowed.
2043            if max_ordinal == 0 {
2044                return Ok(());
2045            }
2046            depth.increment()?;
2047            let envelope_size = 8;
2048            let bytes_len = max_ordinal as usize * envelope_size;
2049            #[allow(unused_variables)]
2050            let offset = encoder.out_of_line_offset(bytes_len);
2051            let mut _prev_end_offset: usize = 0;
2052            if 1 > max_ordinal {
2053                return Ok(());
2054            }
2055
2056            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2057            // are envelope_size bytes.
2058            let cur_offset: usize = (1 - 1) * envelope_size;
2059
2060            // Zero reserved fields.
2061            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2062
2063            // Safety:
2064            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2065            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2066            //   envelope_size bytes, there is always sufficient room.
2067            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
2068                self.node.as_ref().map(
2069                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
2070                ),
2071                encoder,
2072                offset + cur_offset,
2073                depth,
2074            )?;
2075
2076            _prev_end_offset = cur_offset + envelope_size;
2077            if 2 > max_ordinal {
2078                return Ok(());
2079            }
2080
2081            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2082            // are envelope_size bytes.
2083            let cur_offset: usize = (2 - 1) * envelope_size;
2084
2085            // Zero reserved fields.
2086            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2087
2088            // Safety:
2089            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2090            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2091            //   envelope_size bytes, there is always sufficient room.
2092            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_driver_metadata_common::Dictionary, D>(
2093            self.constraint.as_ref().map(<fidl_fuchsia_driver_metadata_common::Dictionary as fidl::encoding::ValueTypeMarker>::borrow),
2094            encoder, offset + cur_offset, depth
2095        )?;
2096
2097            _prev_end_offset = cur_offset + envelope_size;
2098            if 3 > max_ordinal {
2099                return Ok(());
2100            }
2101
2102            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2103            // are envelope_size bytes.
2104            let cur_offset: usize = (3 - 1) * envelope_size;
2105
2106            // Zero reserved fields.
2107            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2108
2109            // Safety:
2110            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2111            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2112            //   envelope_size bytes, there is always sufficient room.
2113            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
2114                self.name.as_ref().map(
2115                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
2116                ),
2117                encoder,
2118                offset + cur_offset,
2119                depth,
2120            )?;
2121
2122            _prev_end_offset = cur_offset + envelope_size;
2123
2124            Ok(())
2125        }
2126    }
2127
2128    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ResourceEntry {
2129        #[inline(always)]
2130        fn new_empty() -> Self {
2131            Self::default()
2132        }
2133
2134        unsafe fn decode(
2135            &mut self,
2136            decoder: &mut fidl::encoding::Decoder<'_, D>,
2137            offset: usize,
2138            mut depth: fidl::encoding::Depth,
2139        ) -> fidl::Result<()> {
2140            decoder.debug_check_bounds::<Self>(offset);
2141            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2142                None => return Err(fidl::Error::NotNullable),
2143                Some(len) => len,
2144            };
2145            // Calling decoder.out_of_line_offset(0) is not allowed.
2146            if len == 0 {
2147                return Ok(());
2148            };
2149            depth.increment()?;
2150            let envelope_size = 8;
2151            let bytes_len = len * envelope_size;
2152            let offset = decoder.out_of_line_offset(bytes_len)?;
2153            // Decode the envelope for each type.
2154            let mut _next_ordinal_to_read = 0;
2155            let mut next_offset = offset;
2156            let end_offset = offset + bytes_len;
2157            _next_ordinal_to_read += 1;
2158            if next_offset >= end_offset {
2159                return Ok(());
2160            }
2161
2162            // Decode unknown envelopes for gaps in ordinals.
2163            while _next_ordinal_to_read < 1 {
2164                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2165                _next_ordinal_to_read += 1;
2166                next_offset += envelope_size;
2167            }
2168
2169            let next_out_of_line = decoder.next_out_of_line();
2170            let handles_before = decoder.remaining_handles();
2171            if let Some((inlined, num_bytes, num_handles)) =
2172                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2173            {
2174                let member_inline_size =
2175                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
2176                        decoder.context,
2177                    );
2178                if inlined != (member_inline_size <= 4) {
2179                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2180                }
2181                let inner_offset;
2182                let mut inner_depth = depth.clone();
2183                if inlined {
2184                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2185                    inner_offset = next_offset;
2186                } else {
2187                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2188                    inner_depth.increment()?;
2189                }
2190                let val_ref = self
2191                    .node
2192                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
2193                fidl::decode!(
2194                    fidl::encoding::UnboundedString,
2195                    D,
2196                    val_ref,
2197                    decoder,
2198                    inner_offset,
2199                    inner_depth
2200                )?;
2201                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2202                {
2203                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2204                }
2205                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2206                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2207                }
2208            }
2209
2210            next_offset += envelope_size;
2211            _next_ordinal_to_read += 1;
2212            if next_offset >= end_offset {
2213                return Ok(());
2214            }
2215
2216            // Decode unknown envelopes for gaps in ordinals.
2217            while _next_ordinal_to_read < 2 {
2218                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2219                _next_ordinal_to_read += 1;
2220                next_offset += envelope_size;
2221            }
2222
2223            let next_out_of_line = decoder.next_out_of_line();
2224            let handles_before = decoder.remaining_handles();
2225            if let Some((inlined, num_bytes, num_handles)) =
2226                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2227            {
2228                let member_inline_size = <fidl_fuchsia_driver_metadata_common::Dictionary as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2229                if inlined != (member_inline_size <= 4) {
2230                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2231                }
2232                let inner_offset;
2233                let mut inner_depth = depth.clone();
2234                if inlined {
2235                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2236                    inner_offset = next_offset;
2237                } else {
2238                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2239                    inner_depth.increment()?;
2240                }
2241                let val_ref = self.constraint.get_or_insert_with(|| {
2242                    fidl::new_empty!(fidl_fuchsia_driver_metadata_common::Dictionary, D)
2243                });
2244                fidl::decode!(
2245                    fidl_fuchsia_driver_metadata_common::Dictionary,
2246                    D,
2247                    val_ref,
2248                    decoder,
2249                    inner_offset,
2250                    inner_depth
2251                )?;
2252                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2253                {
2254                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2255                }
2256                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2257                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2258                }
2259            }
2260
2261            next_offset += envelope_size;
2262            _next_ordinal_to_read += 1;
2263            if next_offset >= end_offset {
2264                return Ok(());
2265            }
2266
2267            // Decode unknown envelopes for gaps in ordinals.
2268            while _next_ordinal_to_read < 3 {
2269                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2270                _next_ordinal_to_read += 1;
2271                next_offset += envelope_size;
2272            }
2273
2274            let next_out_of_line = decoder.next_out_of_line();
2275            let handles_before = decoder.remaining_handles();
2276            if let Some((inlined, num_bytes, num_handles)) =
2277                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2278            {
2279                let member_inline_size =
2280                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
2281                        decoder.context,
2282                    );
2283                if inlined != (member_inline_size <= 4) {
2284                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2285                }
2286                let inner_offset;
2287                let mut inner_depth = depth.clone();
2288                if inlined {
2289                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2290                    inner_offset = next_offset;
2291                } else {
2292                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2293                    inner_depth.increment()?;
2294                }
2295                let val_ref = self
2296                    .name
2297                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
2298                fidl::decode!(
2299                    fidl::encoding::UnboundedString,
2300                    D,
2301                    val_ref,
2302                    decoder,
2303                    inner_offset,
2304                    inner_depth
2305                )?;
2306                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2307                {
2308                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2309                }
2310                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2311                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2312                }
2313            }
2314
2315            next_offset += envelope_size;
2316
2317            // Decode the remaining unknown envelopes.
2318            while next_offset < end_offset {
2319                _next_ordinal_to_read += 1;
2320                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2321                next_offset += envelope_size;
2322            }
2323
2324            Ok(())
2325        }
2326    }
2327
2328    impl StaticMetadata {
2329        #[inline(always)]
2330        fn max_ordinal_present(&self) -> u64 {
2331            if let Some(_) = self.data {
2332                return 2;
2333            }
2334            if let Some(_) = self.id {
2335                return 1;
2336            }
2337            0
2338        }
2339    }
2340
2341    impl fidl::encoding::ValueTypeMarker for StaticMetadata {
2342        type Borrowed<'a> = &'a Self;
2343        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2344            value
2345        }
2346    }
2347
2348    unsafe impl fidl::encoding::TypeMarker for StaticMetadata {
2349        type Owned = Self;
2350
2351        #[inline(always)]
2352        fn inline_align(_context: fidl::encoding::Context) -> usize {
2353            8
2354        }
2355
2356        #[inline(always)]
2357        fn inline_size(_context: fidl::encoding::Context) -> usize {
2358            16
2359        }
2360    }
2361
2362    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<StaticMetadata, D>
2363        for &StaticMetadata
2364    {
2365        unsafe fn encode(
2366            self,
2367            encoder: &mut fidl::encoding::Encoder<'_, D>,
2368            offset: usize,
2369            mut depth: fidl::encoding::Depth,
2370        ) -> fidl::Result<()> {
2371            encoder.debug_check_bounds::<StaticMetadata>(offset);
2372            // Vector header
2373            let max_ordinal: u64 = self.max_ordinal_present();
2374            encoder.write_num(max_ordinal, offset);
2375            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2376            // Calling encoder.out_of_line_offset(0) is not allowed.
2377            if max_ordinal == 0 {
2378                return Ok(());
2379            }
2380            depth.increment()?;
2381            let envelope_size = 8;
2382            let bytes_len = max_ordinal as usize * envelope_size;
2383            #[allow(unused_variables)]
2384            let offset = encoder.out_of_line_offset(bytes_len);
2385            let mut _prev_end_offset: usize = 0;
2386            if 1 > max_ordinal {
2387                return Ok(());
2388            }
2389
2390            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2391            // are envelope_size bytes.
2392            let cur_offset: usize = (1 - 1) * envelope_size;
2393
2394            // Zero reserved fields.
2395            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2396
2397            // Safety:
2398            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2399            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2400            //   envelope_size bytes, there is always sufficient room.
2401            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedString, D>(
2402                self.id.as_ref().map(
2403                    <fidl::encoding::UnboundedString as fidl::encoding::ValueTypeMarker>::borrow,
2404                ),
2405                encoder,
2406                offset + cur_offset,
2407                depth,
2408            )?;
2409
2410            _prev_end_offset = cur_offset + envelope_size;
2411            if 2 > max_ordinal {
2412                return Ok(());
2413            }
2414
2415            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2416            // are envelope_size bytes.
2417            let cur_offset: usize = (2 - 1) * envelope_size;
2418
2419            // Zero reserved fields.
2420            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2421
2422            // Safety:
2423            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2424            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2425            //   envelope_size bytes, there is always sufficient room.
2426            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<u8>, D>(
2427            self.data.as_ref().map(<fidl::encoding::UnboundedVector<u8> as fidl::encoding::ValueTypeMarker>::borrow),
2428            encoder, offset + cur_offset, depth
2429        )?;
2430
2431            _prev_end_offset = cur_offset + envelope_size;
2432
2433            Ok(())
2434        }
2435    }
2436
2437    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for StaticMetadata {
2438        #[inline(always)]
2439        fn new_empty() -> Self {
2440            Self::default()
2441        }
2442
2443        unsafe fn decode(
2444            &mut self,
2445            decoder: &mut fidl::encoding::Decoder<'_, D>,
2446            offset: usize,
2447            mut depth: fidl::encoding::Depth,
2448        ) -> fidl::Result<()> {
2449            decoder.debug_check_bounds::<Self>(offset);
2450            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2451                None => return Err(fidl::Error::NotNullable),
2452                Some(len) => len,
2453            };
2454            // Calling decoder.out_of_line_offset(0) is not allowed.
2455            if len == 0 {
2456                return Ok(());
2457            };
2458            depth.increment()?;
2459            let envelope_size = 8;
2460            let bytes_len = len * envelope_size;
2461            let offset = decoder.out_of_line_offset(bytes_len)?;
2462            // Decode the envelope for each type.
2463            let mut _next_ordinal_to_read = 0;
2464            let mut next_offset = offset;
2465            let end_offset = offset + bytes_len;
2466            _next_ordinal_to_read += 1;
2467            if next_offset >= end_offset {
2468                return Ok(());
2469            }
2470
2471            // Decode unknown envelopes for gaps in ordinals.
2472            while _next_ordinal_to_read < 1 {
2473                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2474                _next_ordinal_to_read += 1;
2475                next_offset += envelope_size;
2476            }
2477
2478            let next_out_of_line = decoder.next_out_of_line();
2479            let handles_before = decoder.remaining_handles();
2480            if let Some((inlined, num_bytes, num_handles)) =
2481                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2482            {
2483                let member_inline_size =
2484                    <fidl::encoding::UnboundedString as fidl::encoding::TypeMarker>::inline_size(
2485                        decoder.context,
2486                    );
2487                if inlined != (member_inline_size <= 4) {
2488                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2489                }
2490                let inner_offset;
2491                let mut inner_depth = depth.clone();
2492                if inlined {
2493                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2494                    inner_offset = next_offset;
2495                } else {
2496                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2497                    inner_depth.increment()?;
2498                }
2499                let val_ref = self
2500                    .id
2501                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::UnboundedString, D));
2502                fidl::decode!(
2503                    fidl::encoding::UnboundedString,
2504                    D,
2505                    val_ref,
2506                    decoder,
2507                    inner_offset,
2508                    inner_depth
2509                )?;
2510                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2511                {
2512                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2513                }
2514                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2515                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2516                }
2517            }
2518
2519            next_offset += envelope_size;
2520            _next_ordinal_to_read += 1;
2521            if next_offset >= end_offset {
2522                return Ok(());
2523            }
2524
2525            // Decode unknown envelopes for gaps in ordinals.
2526            while _next_ordinal_to_read < 2 {
2527                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2528                _next_ordinal_to_read += 1;
2529                next_offset += envelope_size;
2530            }
2531
2532            let next_out_of_line = decoder.next_out_of_line();
2533            let handles_before = decoder.remaining_handles();
2534            if let Some((inlined, num_bytes, num_handles)) =
2535                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2536            {
2537                let member_inline_size = <fidl::encoding::UnboundedVector<u8> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2538                if inlined != (member_inline_size <= 4) {
2539                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2540                }
2541                let inner_offset;
2542                let mut inner_depth = depth.clone();
2543                if inlined {
2544                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2545                    inner_offset = next_offset;
2546                } else {
2547                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2548                    inner_depth.increment()?;
2549                }
2550                let val_ref = self.data.get_or_insert_with(|| {
2551                    fidl::new_empty!(fidl::encoding::UnboundedVector<u8>, D)
2552                });
2553                fidl::decode!(
2554                    fidl::encoding::UnboundedVector<u8>,
2555                    D,
2556                    val_ref,
2557                    decoder,
2558                    inner_offset,
2559                    inner_depth
2560                )?;
2561                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2562                {
2563                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2564                }
2565                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2566                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2567                }
2568            }
2569
2570            next_offset += envelope_size;
2571
2572            // Decode the remaining unknown envelopes.
2573            while next_offset < end_offset {
2574                _next_ordinal_to_read += 1;
2575                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2576                next_offset += envelope_size;
2577            }
2578
2579            Ok(())
2580        }
2581    }
2582
2583    impl fidl::encoding::ValueTypeMarker for IommuType {
2584        type Borrowed<'a> = &'a Self;
2585        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2586            value
2587        }
2588    }
2589
2590    unsafe impl fidl::encoding::TypeMarker for IommuType {
2591        type Owned = Self;
2592
2593        #[inline(always)]
2594        fn inline_align(_context: fidl::encoding::Context) -> usize {
2595            8
2596        }
2597
2598        #[inline(always)]
2599        fn inline_size(_context: fidl::encoding::Context) -> usize {
2600            16
2601        }
2602    }
2603
2604    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<IommuType, D>
2605        for &IommuType
2606    {
2607        #[inline]
2608        unsafe fn encode(
2609            self,
2610            encoder: &mut fidl::encoding::Encoder<'_, D>,
2611            offset: usize,
2612            _depth: fidl::encoding::Depth,
2613        ) -> fidl::Result<()> {
2614            encoder.debug_check_bounds::<IommuType>(offset);
2615            encoder.write_num::<u64>(self.ordinal(), offset);
2616            match self {
2617                IommuType::StubIommu(ref val) => {
2618                    fidl::encoding::encode_in_envelope::<StubIommu, D>(
2619                        <StubIommu as fidl::encoding::ValueTypeMarker>::borrow(val),
2620                        encoder,
2621                        offset + 8,
2622                        _depth,
2623                    )
2624                }
2625                IommuType::ArmSmmu(ref val) => fidl::encoding::encode_in_envelope::<ArmSmmu, D>(
2626                    <ArmSmmu as fidl::encoding::ValueTypeMarker>::borrow(val),
2627                    encoder,
2628                    offset + 8,
2629                    _depth,
2630                ),
2631                IommuType::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
2632            }
2633        }
2634    }
2635
2636    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for IommuType {
2637        #[inline(always)]
2638        fn new_empty() -> Self {
2639            Self::__SourceBreaking { unknown_ordinal: 0 }
2640        }
2641
2642        #[inline]
2643        unsafe fn decode(
2644            &mut self,
2645            decoder: &mut fidl::encoding::Decoder<'_, D>,
2646            offset: usize,
2647            mut depth: fidl::encoding::Depth,
2648        ) -> fidl::Result<()> {
2649            decoder.debug_check_bounds::<Self>(offset);
2650            #[allow(unused_variables)]
2651            let next_out_of_line = decoder.next_out_of_line();
2652            let handles_before = decoder.remaining_handles();
2653            let (ordinal, inlined, num_bytes, num_handles) =
2654                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
2655
2656            let member_inline_size = match ordinal {
2657                1 => <StubIommu as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2658                2 => <ArmSmmu as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2659                0 => return Err(fidl::Error::UnknownUnionTag),
2660                _ => num_bytes as usize,
2661            };
2662
2663            if inlined != (member_inline_size <= 4) {
2664                return Err(fidl::Error::InvalidInlineBitInEnvelope);
2665            }
2666            let _inner_offset;
2667            if inlined {
2668                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
2669                _inner_offset = offset + 8;
2670            } else {
2671                depth.increment()?;
2672                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2673            }
2674            match ordinal {
2675                1 => {
2676                    #[allow(irrefutable_let_patterns)]
2677                    if let IommuType::StubIommu(_) = self {
2678                        // Do nothing, read the value into the object
2679                    } else {
2680                        // Initialize `self` to the right variant
2681                        *self = IommuType::StubIommu(fidl::new_empty!(StubIommu, D));
2682                    }
2683                    #[allow(irrefutable_let_patterns)]
2684                    if let IommuType::StubIommu(ref mut val) = self {
2685                        fidl::decode!(StubIommu, D, val, decoder, _inner_offset, depth)?;
2686                    } else {
2687                        unreachable!()
2688                    }
2689                }
2690                2 => {
2691                    #[allow(irrefutable_let_patterns)]
2692                    if let IommuType::ArmSmmu(_) = self {
2693                        // Do nothing, read the value into the object
2694                    } else {
2695                        // Initialize `self` to the right variant
2696                        *self = IommuType::ArmSmmu(fidl::new_empty!(ArmSmmu, D));
2697                    }
2698                    #[allow(irrefutable_let_patterns)]
2699                    if let IommuType::ArmSmmu(ref mut val) = self {
2700                        fidl::decode!(ArmSmmu, D, val, decoder, _inner_offset, depth)?;
2701                    } else {
2702                        unreachable!()
2703                    }
2704                }
2705                #[allow(deprecated)]
2706                ordinal => {
2707                    for _ in 0..num_handles {
2708                        decoder.drop_next_handle()?;
2709                    }
2710                    *self = IommuType::__SourceBreaking { unknown_ordinal: ordinal };
2711                }
2712            }
2713            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
2714                return Err(fidl::Error::InvalidNumBytesInEnvelope);
2715            }
2716            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2717                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2718            }
2719            Ok(())
2720        }
2721    }
2722}