Skip to main content

fidl_fuchsia_power_powercap_common/
fidl_fuchsia_power_powercap_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/// Maximum number of domains returned by `ClientStateWatcher.Watch`.
12pub const MAX_DOMAINS: u32 = 32;
13
14/// Maximum length of a powercap zone or constraint name.
15pub const MAX_NAME_LEN: u32 = 64;
16
17/// Maximum number of powercap zone nodes in a `GetPowercapTree` response.
18pub const MAX_NODES: u32 = 64;
19
20/// Maximum length of a powercap zone sysfs directory name under `/sys/class/powercap`.
21pub const MAX_PATH_LEN: u32 = 128;
22
23/// Maximum number of discrete power levels in a zone's power table.
24pub const MAX_POWER_LEVELS: u32 = 64;
25
26/// Errors associated with `fuchsia.power.powercap` protocols.
27#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
28pub enum PowercapError {
29    /// The component encountered an unexpected error while servicing the request.
30    Internal,
31    /// The arguments provided to the method were invalid (e.g., unknown node_id,
32    /// or unsupported operation on the target node).
33    InvalidArguments,
34    #[doc(hidden)]
35    __SourceBreaking { unknown_ordinal: u32 },
36}
37
38/// Pattern that matches an unknown `PowercapError` member.
39#[macro_export]
40macro_rules! PowercapErrorUnknown {
41    () => {
42        _
43    };
44}
45
46impl PowercapError {
47    #[inline]
48    pub fn from_primitive(prim: u32) -> Option<Self> {
49        match prim {
50            1 => Some(Self::Internal),
51            2 => Some(Self::InvalidArguments),
52            _ => None,
53        }
54    }
55
56    #[inline]
57    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
58        match prim {
59            1 => Self::Internal,
60            2 => Self::InvalidArguments,
61            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
62        }
63    }
64
65    #[inline]
66    pub fn unknown() -> Self {
67        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
68    }
69
70    #[inline]
71    pub const fn into_primitive(self) -> u32 {
72        match self {
73            Self::Internal => 1,
74            Self::InvalidArguments => 2,
75            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
76        }
77    }
78
79    #[inline]
80    pub fn is_unknown(&self) -> bool {
81        match self {
82            Self::__SourceBreaking { unknown_ordinal: _ } => true,
83            _ => false,
84        }
85    }
86}
87
88#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
89#[repr(C)]
90pub struct ClientGetPowerLimitBypassRequest {
91    pub node_id: u64,
92}
93
94impl fidl::Persistable for ClientGetPowerLimitBypassRequest {}
95
96#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
97#[repr(C)]
98pub struct ClientGetPowerLimitRequest {
99    pub node_id: u64,
100}
101
102impl fidl::Persistable for ClientGetPowerLimitRequest {}
103
104#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
105#[repr(C)]
106pub struct ClientSetPowerLimitBypassRequest {
107    pub node_id: u64,
108    pub bypass_time_ms: u64,
109}
110
111impl fidl::Persistable for ClientSetPowerLimitBypassRequest {}
112
113#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
114#[repr(C)]
115pub struct ClientSetPowerLimitRequest {
116    pub node_id: u64,
117    pub power_limit_uw: u64,
118}
119
120impl fidl::Persistable for ClientSetPowerLimitRequest {}
121
122#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
123pub struct ClientStateWatcherWatchResponse {
124    pub domain_opps: Vec<u64>,
125}
126
127impl fidl::Persistable for ClientStateWatcherWatchResponse {}
128
129#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
130#[repr(C)]
131pub struct ClientGetPowerLimitBypassResponse {
132    pub remaining_bypass_ms: u64,
133}
134
135impl fidl::Persistable for ClientGetPowerLimitBypassResponse {}
136
137#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
138#[repr(C)]
139pub struct ClientGetPowerLimitResponse {
140    pub power_limit_uw: u64,
141}
142
143impl fidl::Persistable for ClientGetPowerLimitResponse {}
144
145#[derive(Clone, Debug, PartialEq)]
146pub struct ClientGetPowercapTreeResponse {
147    pub nodes: Vec<PowercapNodeInfo>,
148}
149
150impl fidl::Persistable for ClientGetPowercapTreeResponse {}
151
152/// Describes the static topology and attributes of a single powercap zone node.
153///
154/// `node_id`, `zone_path`, and `name` must always be present on every node;
155/// entries omitting any of these fields are ignored by clients.
156#[derive(Clone, Debug, Default, PartialEq)]
157pub struct PowercapNodeInfo {
158    /// Unique identifier for this node within the powercap tree. Required.
159    pub node_id: Option<u64>,
160    /// The `node_id` of the parent zone. Omitted for root zones (e.g., `gpc:0`).
161    pub parent_node_id: Option<u64>,
162    /// The canonical sysfs directory name under `/sys/class/powercap` (e.g.,
163    /// `"gpc:0"`, `"gpc:0:0"`, `"gpc:0:0:0"`). Required.
164    pub zone_path: Option<String>,
165    /// The logical zone name exposed via the `name` sysfs attribute (e.g.,
166    /// `"gpc"`, `"TestZone"`, `"BIG"`, `"MID"`, `"LITTLE"`, `"GPU"`). Required.
167    pub name: Option<String>,
168    /// The constraint name exposed via `constraint_0_name` (e.g., `"TestConstraint"`).
169    /// Omitted if the zone does not expose constraint metadata.
170    pub constraint_name: Option<String>,
171    /// Maximum power limit in microwatts (`constraint_0_max_power_uw`).
172    /// Omitted if the zone does not expose a maximum power limit attribute.
173    pub max_power_uw: Option<u64>,
174    /// Minimum power limit in microwatts (`constraint_0_min_power_uw`).
175    /// Omitted if the zone does not expose a minimum power limit attribute.
176    pub min_power_uw: Option<u64>,
177    /// Discrete supported power levels in microwatts (`power_levels_uw`),
178    /// ordered from highest to lowest. Omitted for aggregator zones without
179    /// discrete power tables.
180    pub power_levels_uw: Option<Vec<u64>>,
181    /// Whether this zone exposes `power_limit_bypass_msec` for transient boost
182    /// overrides (e.g., PowerHAL `CPU_LOAD_SPIKE` / `LAUNCH` hints). Omitted
183    /// (or `false`) if the zone does not support bypass overrides.
184    pub supports_bypass: Option<bool>,
185    #[doc(hidden)]
186    pub __source_breaking: fidl::marker::SourceBreaking,
187}
188
189impl fidl::Persistable for PowercapNodeInfo {}
190
191pub mod client_ordinals {
192    pub const GET_POWERCAP_TREE: u64 = 0x629216680eaef016;
193    pub const GET_POWER_LIMIT: u64 = 0x652faeb2501c31fd;
194    pub const SET_POWER_LIMIT: u64 = 0x29acfe0139bd122e;
195    pub const GET_POWER_LIMIT_BYPASS: u64 = 0x35000ed7dfc72791;
196    pub const SET_POWER_LIMIT_BYPASS: u64 = 0x1e81290b489d0d91;
197}
198
199pub mod client_state_watcher_ordinals {
200    pub const WATCH: u64 = 0x2066699d14b6ee1d;
201}
202
203mod internal {
204    use super::*;
205    unsafe impl fidl::encoding::TypeMarker for PowercapError {
206        type Owned = Self;
207
208        #[inline(always)]
209        fn inline_align(_context: fidl::encoding::Context) -> usize {
210            std::mem::align_of::<u32>()
211        }
212
213        #[inline(always)]
214        fn inline_size(_context: fidl::encoding::Context) -> usize {
215            std::mem::size_of::<u32>()
216        }
217
218        #[inline(always)]
219        fn encode_is_copy() -> bool {
220            false
221        }
222
223        #[inline(always)]
224        fn decode_is_copy() -> bool {
225            false
226        }
227    }
228
229    impl fidl::encoding::ValueTypeMarker for PowercapError {
230        type Borrowed<'a> = Self;
231        #[inline(always)]
232        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
233            *value
234        }
235    }
236
237    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for PowercapError {
238        #[inline]
239        unsafe fn encode(
240            self,
241            encoder: &mut fidl::encoding::Encoder<'_, D>,
242            offset: usize,
243            _depth: fidl::encoding::Depth,
244        ) -> fidl::Result<()> {
245            encoder.debug_check_bounds::<Self>(offset);
246            encoder.write_num(self.into_primitive(), offset);
247            Ok(())
248        }
249    }
250
251    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PowercapError {
252        #[inline(always)]
253        fn new_empty() -> Self {
254            Self::unknown()
255        }
256
257        #[inline]
258        unsafe fn decode(
259            &mut self,
260            decoder: &mut fidl::encoding::Decoder<'_, D>,
261            offset: usize,
262            _depth: fidl::encoding::Depth,
263        ) -> fidl::Result<()> {
264            decoder.debug_check_bounds::<Self>(offset);
265            let prim = decoder.read_num::<u32>(offset);
266
267            *self = Self::from_primitive_allow_unknown(prim);
268            Ok(())
269        }
270    }
271
272    impl fidl::encoding::ValueTypeMarker for ClientGetPowerLimitBypassRequest {
273        type Borrowed<'a> = &'a Self;
274        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
275            value
276        }
277    }
278
279    unsafe impl fidl::encoding::TypeMarker for ClientGetPowerLimitBypassRequest {
280        type Owned = Self;
281
282        #[inline(always)]
283        fn inline_align(_context: fidl::encoding::Context) -> usize {
284            8
285        }
286
287        #[inline(always)]
288        fn inline_size(_context: fidl::encoding::Context) -> usize {
289            8
290        }
291        #[inline(always)]
292        fn encode_is_copy() -> bool {
293            true
294        }
295
296        #[inline(always)]
297        fn decode_is_copy() -> bool {
298            true
299        }
300    }
301
302    unsafe impl<D: fidl::encoding::ResourceDialect>
303        fidl::encoding::Encode<ClientGetPowerLimitBypassRequest, D>
304        for &ClientGetPowerLimitBypassRequest
305    {
306        #[inline]
307        unsafe fn encode(
308            self,
309            encoder: &mut fidl::encoding::Encoder<'_, D>,
310            offset: usize,
311            _depth: fidl::encoding::Depth,
312        ) -> fidl::Result<()> {
313            encoder.debug_check_bounds::<ClientGetPowerLimitBypassRequest>(offset);
314            unsafe {
315                // Copy the object into the buffer.
316                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
317                (buf_ptr as *mut ClientGetPowerLimitBypassRequest)
318                    .write_unaligned((self as *const ClientGetPowerLimitBypassRequest).read());
319                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
320                // done second because the memcpy will write garbage to these bytes.
321            }
322            Ok(())
323        }
324    }
325    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u64, D>>
326        fidl::encoding::Encode<ClientGetPowerLimitBypassRequest, D> for (T0,)
327    {
328        #[inline]
329        unsafe fn encode(
330            self,
331            encoder: &mut fidl::encoding::Encoder<'_, D>,
332            offset: usize,
333            depth: fidl::encoding::Depth,
334        ) -> fidl::Result<()> {
335            encoder.debug_check_bounds::<ClientGetPowerLimitBypassRequest>(offset);
336            // Zero out padding regions. There's no need to apply masks
337            // because the unmasked parts will be overwritten by fields.
338            // Write the fields.
339            self.0.encode(encoder, offset + 0, depth)?;
340            Ok(())
341        }
342    }
343
344    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
345        for ClientGetPowerLimitBypassRequest
346    {
347        #[inline(always)]
348        fn new_empty() -> Self {
349            Self { node_id: fidl::new_empty!(u64, D) }
350        }
351
352        #[inline]
353        unsafe fn decode(
354            &mut self,
355            decoder: &mut fidl::encoding::Decoder<'_, D>,
356            offset: usize,
357            _depth: fidl::encoding::Depth,
358        ) -> fidl::Result<()> {
359            decoder.debug_check_bounds::<Self>(offset);
360            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
361            // Verify that padding bytes are zero.
362            // Copy from the buffer into the object.
363            unsafe {
364                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
365            }
366            Ok(())
367        }
368    }
369
370    impl fidl::encoding::ValueTypeMarker for ClientGetPowerLimitRequest {
371        type Borrowed<'a> = &'a Self;
372        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
373            value
374        }
375    }
376
377    unsafe impl fidl::encoding::TypeMarker for ClientGetPowerLimitRequest {
378        type Owned = Self;
379
380        #[inline(always)]
381        fn inline_align(_context: fidl::encoding::Context) -> usize {
382            8
383        }
384
385        #[inline(always)]
386        fn inline_size(_context: fidl::encoding::Context) -> usize {
387            8
388        }
389        #[inline(always)]
390        fn encode_is_copy() -> bool {
391            true
392        }
393
394        #[inline(always)]
395        fn decode_is_copy() -> bool {
396            true
397        }
398    }
399
400    unsafe impl<D: fidl::encoding::ResourceDialect>
401        fidl::encoding::Encode<ClientGetPowerLimitRequest, D> for &ClientGetPowerLimitRequest
402    {
403        #[inline]
404        unsafe fn encode(
405            self,
406            encoder: &mut fidl::encoding::Encoder<'_, D>,
407            offset: usize,
408            _depth: fidl::encoding::Depth,
409        ) -> fidl::Result<()> {
410            encoder.debug_check_bounds::<ClientGetPowerLimitRequest>(offset);
411            unsafe {
412                // Copy the object into the buffer.
413                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
414                (buf_ptr as *mut ClientGetPowerLimitRequest)
415                    .write_unaligned((self as *const ClientGetPowerLimitRequest).read());
416                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
417                // done second because the memcpy will write garbage to these bytes.
418            }
419            Ok(())
420        }
421    }
422    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u64, D>>
423        fidl::encoding::Encode<ClientGetPowerLimitRequest, D> for (T0,)
424    {
425        #[inline]
426        unsafe fn encode(
427            self,
428            encoder: &mut fidl::encoding::Encoder<'_, D>,
429            offset: usize,
430            depth: fidl::encoding::Depth,
431        ) -> fidl::Result<()> {
432            encoder.debug_check_bounds::<ClientGetPowerLimitRequest>(offset);
433            // Zero out padding regions. There's no need to apply masks
434            // because the unmasked parts will be overwritten by fields.
435            // Write the fields.
436            self.0.encode(encoder, offset + 0, depth)?;
437            Ok(())
438        }
439    }
440
441    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
442        for ClientGetPowerLimitRequest
443    {
444        #[inline(always)]
445        fn new_empty() -> Self {
446            Self { node_id: fidl::new_empty!(u64, D) }
447        }
448
449        #[inline]
450        unsafe fn decode(
451            &mut self,
452            decoder: &mut fidl::encoding::Decoder<'_, D>,
453            offset: usize,
454            _depth: fidl::encoding::Depth,
455        ) -> fidl::Result<()> {
456            decoder.debug_check_bounds::<Self>(offset);
457            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
458            // Verify that padding bytes are zero.
459            // Copy from the buffer into the object.
460            unsafe {
461                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
462            }
463            Ok(())
464        }
465    }
466
467    impl fidl::encoding::ValueTypeMarker for ClientSetPowerLimitBypassRequest {
468        type Borrowed<'a> = &'a Self;
469        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
470            value
471        }
472    }
473
474    unsafe impl fidl::encoding::TypeMarker for ClientSetPowerLimitBypassRequest {
475        type Owned = Self;
476
477        #[inline(always)]
478        fn inline_align(_context: fidl::encoding::Context) -> usize {
479            8
480        }
481
482        #[inline(always)]
483        fn inline_size(_context: fidl::encoding::Context) -> usize {
484            16
485        }
486        #[inline(always)]
487        fn encode_is_copy() -> bool {
488            true
489        }
490
491        #[inline(always)]
492        fn decode_is_copy() -> bool {
493            true
494        }
495    }
496
497    unsafe impl<D: fidl::encoding::ResourceDialect>
498        fidl::encoding::Encode<ClientSetPowerLimitBypassRequest, D>
499        for &ClientSetPowerLimitBypassRequest
500    {
501        #[inline]
502        unsafe fn encode(
503            self,
504            encoder: &mut fidl::encoding::Encoder<'_, D>,
505            offset: usize,
506            _depth: fidl::encoding::Depth,
507        ) -> fidl::Result<()> {
508            encoder.debug_check_bounds::<ClientSetPowerLimitBypassRequest>(offset);
509            unsafe {
510                // Copy the object into the buffer.
511                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
512                (buf_ptr as *mut ClientSetPowerLimitBypassRequest)
513                    .write_unaligned((self as *const ClientSetPowerLimitBypassRequest).read());
514                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
515                // done second because the memcpy will write garbage to these bytes.
516            }
517            Ok(())
518        }
519    }
520    unsafe impl<
521        D: fidl::encoding::ResourceDialect,
522        T0: fidl::encoding::Encode<u64, D>,
523        T1: fidl::encoding::Encode<u64, D>,
524    > fidl::encoding::Encode<ClientSetPowerLimitBypassRequest, D> for (T0, T1)
525    {
526        #[inline]
527        unsafe fn encode(
528            self,
529            encoder: &mut fidl::encoding::Encoder<'_, D>,
530            offset: usize,
531            depth: fidl::encoding::Depth,
532        ) -> fidl::Result<()> {
533            encoder.debug_check_bounds::<ClientSetPowerLimitBypassRequest>(offset);
534            // Zero out padding regions. There's no need to apply masks
535            // because the unmasked parts will be overwritten by fields.
536            // Write the fields.
537            self.0.encode(encoder, offset + 0, depth)?;
538            self.1.encode(encoder, offset + 8, depth)?;
539            Ok(())
540        }
541    }
542
543    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
544        for ClientSetPowerLimitBypassRequest
545    {
546        #[inline(always)]
547        fn new_empty() -> Self {
548            Self { node_id: fidl::new_empty!(u64, D), bypass_time_ms: fidl::new_empty!(u64, D) }
549        }
550
551        #[inline]
552        unsafe fn decode(
553            &mut self,
554            decoder: &mut fidl::encoding::Decoder<'_, D>,
555            offset: usize,
556            _depth: fidl::encoding::Depth,
557        ) -> fidl::Result<()> {
558            decoder.debug_check_bounds::<Self>(offset);
559            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
560            // Verify that padding bytes are zero.
561            // Copy from the buffer into the object.
562            unsafe {
563                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 16);
564            }
565            Ok(())
566        }
567    }
568
569    impl fidl::encoding::ValueTypeMarker for ClientSetPowerLimitRequest {
570        type Borrowed<'a> = &'a Self;
571        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
572            value
573        }
574    }
575
576    unsafe impl fidl::encoding::TypeMarker for ClientSetPowerLimitRequest {
577        type Owned = Self;
578
579        #[inline(always)]
580        fn inline_align(_context: fidl::encoding::Context) -> usize {
581            8
582        }
583
584        #[inline(always)]
585        fn inline_size(_context: fidl::encoding::Context) -> usize {
586            16
587        }
588        #[inline(always)]
589        fn encode_is_copy() -> bool {
590            true
591        }
592
593        #[inline(always)]
594        fn decode_is_copy() -> bool {
595            true
596        }
597    }
598
599    unsafe impl<D: fidl::encoding::ResourceDialect>
600        fidl::encoding::Encode<ClientSetPowerLimitRequest, D> for &ClientSetPowerLimitRequest
601    {
602        #[inline]
603        unsafe fn encode(
604            self,
605            encoder: &mut fidl::encoding::Encoder<'_, D>,
606            offset: usize,
607            _depth: fidl::encoding::Depth,
608        ) -> fidl::Result<()> {
609            encoder.debug_check_bounds::<ClientSetPowerLimitRequest>(offset);
610            unsafe {
611                // Copy the object into the buffer.
612                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
613                (buf_ptr as *mut ClientSetPowerLimitRequest)
614                    .write_unaligned((self as *const ClientSetPowerLimitRequest).read());
615                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
616                // done second because the memcpy will write garbage to these bytes.
617            }
618            Ok(())
619        }
620    }
621    unsafe impl<
622        D: fidl::encoding::ResourceDialect,
623        T0: fidl::encoding::Encode<u64, D>,
624        T1: fidl::encoding::Encode<u64, D>,
625    > fidl::encoding::Encode<ClientSetPowerLimitRequest, D> for (T0, T1)
626    {
627        #[inline]
628        unsafe fn encode(
629            self,
630            encoder: &mut fidl::encoding::Encoder<'_, D>,
631            offset: usize,
632            depth: fidl::encoding::Depth,
633        ) -> fidl::Result<()> {
634            encoder.debug_check_bounds::<ClientSetPowerLimitRequest>(offset);
635            // Zero out padding regions. There's no need to apply masks
636            // because the unmasked parts will be overwritten by fields.
637            // Write the fields.
638            self.0.encode(encoder, offset + 0, depth)?;
639            self.1.encode(encoder, offset + 8, depth)?;
640            Ok(())
641        }
642    }
643
644    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
645        for ClientSetPowerLimitRequest
646    {
647        #[inline(always)]
648        fn new_empty() -> Self {
649            Self { node_id: fidl::new_empty!(u64, D), power_limit_uw: fidl::new_empty!(u64, D) }
650        }
651
652        #[inline]
653        unsafe fn decode(
654            &mut self,
655            decoder: &mut fidl::encoding::Decoder<'_, D>,
656            offset: usize,
657            _depth: fidl::encoding::Depth,
658        ) -> fidl::Result<()> {
659            decoder.debug_check_bounds::<Self>(offset);
660            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
661            // Verify that padding bytes are zero.
662            // Copy from the buffer into the object.
663            unsafe {
664                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 16);
665            }
666            Ok(())
667        }
668    }
669
670    impl fidl::encoding::ValueTypeMarker for ClientStateWatcherWatchResponse {
671        type Borrowed<'a> = &'a Self;
672        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
673            value
674        }
675    }
676
677    unsafe impl fidl::encoding::TypeMarker for ClientStateWatcherWatchResponse {
678        type Owned = Self;
679
680        #[inline(always)]
681        fn inline_align(_context: fidl::encoding::Context) -> usize {
682            8
683        }
684
685        #[inline(always)]
686        fn inline_size(_context: fidl::encoding::Context) -> usize {
687            16
688        }
689    }
690
691    unsafe impl<D: fidl::encoding::ResourceDialect>
692        fidl::encoding::Encode<ClientStateWatcherWatchResponse, D>
693        for &ClientStateWatcherWatchResponse
694    {
695        #[inline]
696        unsafe fn encode(
697            self,
698            encoder: &mut fidl::encoding::Encoder<'_, D>,
699            offset: usize,
700            _depth: fidl::encoding::Depth,
701        ) -> fidl::Result<()> {
702            encoder.debug_check_bounds::<ClientStateWatcherWatchResponse>(offset);
703            // Delegate to tuple encoding.
704            fidl::encoding::Encode::<ClientStateWatcherWatchResponse, D>::encode(
705                (<fidl::encoding::Vector<u64, 32> as fidl::encoding::ValueTypeMarker>::borrow(
706                    &self.domain_opps,
707                ),),
708                encoder,
709                offset,
710                _depth,
711            )
712        }
713    }
714    unsafe impl<
715        D: fidl::encoding::ResourceDialect,
716        T0: fidl::encoding::Encode<fidl::encoding::Vector<u64, 32>, D>,
717    > fidl::encoding::Encode<ClientStateWatcherWatchResponse, D> for (T0,)
718    {
719        #[inline]
720        unsafe fn encode(
721            self,
722            encoder: &mut fidl::encoding::Encoder<'_, D>,
723            offset: usize,
724            depth: fidl::encoding::Depth,
725        ) -> fidl::Result<()> {
726            encoder.debug_check_bounds::<ClientStateWatcherWatchResponse>(offset);
727            // Zero out padding regions. There's no need to apply masks
728            // because the unmasked parts will be overwritten by fields.
729            // Write the fields.
730            self.0.encode(encoder, offset + 0, depth)?;
731            Ok(())
732        }
733    }
734
735    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
736        for ClientStateWatcherWatchResponse
737    {
738        #[inline(always)]
739        fn new_empty() -> Self {
740            Self { domain_opps: fidl::new_empty!(fidl::encoding::Vector<u64, 32>, D) }
741        }
742
743        #[inline]
744        unsafe fn decode(
745            &mut self,
746            decoder: &mut fidl::encoding::Decoder<'_, D>,
747            offset: usize,
748            _depth: fidl::encoding::Depth,
749        ) -> fidl::Result<()> {
750            decoder.debug_check_bounds::<Self>(offset);
751            // Verify that padding bytes are zero.
752            fidl::decode!(fidl::encoding::Vector<u64, 32>, D, &mut self.domain_opps, decoder, offset + 0, _depth)?;
753            Ok(())
754        }
755    }
756
757    impl fidl::encoding::ValueTypeMarker for ClientGetPowerLimitBypassResponse {
758        type Borrowed<'a> = &'a Self;
759        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
760            value
761        }
762    }
763
764    unsafe impl fidl::encoding::TypeMarker for ClientGetPowerLimitBypassResponse {
765        type Owned = Self;
766
767        #[inline(always)]
768        fn inline_align(_context: fidl::encoding::Context) -> usize {
769            8
770        }
771
772        #[inline(always)]
773        fn inline_size(_context: fidl::encoding::Context) -> usize {
774            8
775        }
776        #[inline(always)]
777        fn encode_is_copy() -> bool {
778            true
779        }
780
781        #[inline(always)]
782        fn decode_is_copy() -> bool {
783            true
784        }
785    }
786
787    unsafe impl<D: fidl::encoding::ResourceDialect>
788        fidl::encoding::Encode<ClientGetPowerLimitBypassResponse, D>
789        for &ClientGetPowerLimitBypassResponse
790    {
791        #[inline]
792        unsafe fn encode(
793            self,
794            encoder: &mut fidl::encoding::Encoder<'_, D>,
795            offset: usize,
796            _depth: fidl::encoding::Depth,
797        ) -> fidl::Result<()> {
798            encoder.debug_check_bounds::<ClientGetPowerLimitBypassResponse>(offset);
799            unsafe {
800                // Copy the object into the buffer.
801                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
802                (buf_ptr as *mut ClientGetPowerLimitBypassResponse)
803                    .write_unaligned((self as *const ClientGetPowerLimitBypassResponse).read());
804                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
805                // done second because the memcpy will write garbage to these bytes.
806            }
807            Ok(())
808        }
809    }
810    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u64, D>>
811        fidl::encoding::Encode<ClientGetPowerLimitBypassResponse, D> for (T0,)
812    {
813        #[inline]
814        unsafe fn encode(
815            self,
816            encoder: &mut fidl::encoding::Encoder<'_, D>,
817            offset: usize,
818            depth: fidl::encoding::Depth,
819        ) -> fidl::Result<()> {
820            encoder.debug_check_bounds::<ClientGetPowerLimitBypassResponse>(offset);
821            // Zero out padding regions. There's no need to apply masks
822            // because the unmasked parts will be overwritten by fields.
823            // Write the fields.
824            self.0.encode(encoder, offset + 0, depth)?;
825            Ok(())
826        }
827    }
828
829    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
830        for ClientGetPowerLimitBypassResponse
831    {
832        #[inline(always)]
833        fn new_empty() -> Self {
834            Self { remaining_bypass_ms: fidl::new_empty!(u64, D) }
835        }
836
837        #[inline]
838        unsafe fn decode(
839            &mut self,
840            decoder: &mut fidl::encoding::Decoder<'_, D>,
841            offset: usize,
842            _depth: fidl::encoding::Depth,
843        ) -> fidl::Result<()> {
844            decoder.debug_check_bounds::<Self>(offset);
845            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
846            // Verify that padding bytes are zero.
847            // Copy from the buffer into the object.
848            unsafe {
849                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
850            }
851            Ok(())
852        }
853    }
854
855    impl fidl::encoding::ValueTypeMarker for ClientGetPowerLimitResponse {
856        type Borrowed<'a> = &'a Self;
857        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
858            value
859        }
860    }
861
862    unsafe impl fidl::encoding::TypeMarker for ClientGetPowerLimitResponse {
863        type Owned = Self;
864
865        #[inline(always)]
866        fn inline_align(_context: fidl::encoding::Context) -> usize {
867            8
868        }
869
870        #[inline(always)]
871        fn inline_size(_context: fidl::encoding::Context) -> usize {
872            8
873        }
874        #[inline(always)]
875        fn encode_is_copy() -> bool {
876            true
877        }
878
879        #[inline(always)]
880        fn decode_is_copy() -> bool {
881            true
882        }
883    }
884
885    unsafe impl<D: fidl::encoding::ResourceDialect>
886        fidl::encoding::Encode<ClientGetPowerLimitResponse, D> for &ClientGetPowerLimitResponse
887    {
888        #[inline]
889        unsafe fn encode(
890            self,
891            encoder: &mut fidl::encoding::Encoder<'_, D>,
892            offset: usize,
893            _depth: fidl::encoding::Depth,
894        ) -> fidl::Result<()> {
895            encoder.debug_check_bounds::<ClientGetPowerLimitResponse>(offset);
896            unsafe {
897                // Copy the object into the buffer.
898                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
899                (buf_ptr as *mut ClientGetPowerLimitResponse)
900                    .write_unaligned((self as *const ClientGetPowerLimitResponse).read());
901                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
902                // done second because the memcpy will write garbage to these bytes.
903            }
904            Ok(())
905        }
906    }
907    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u64, D>>
908        fidl::encoding::Encode<ClientGetPowerLimitResponse, D> for (T0,)
909    {
910        #[inline]
911        unsafe fn encode(
912            self,
913            encoder: &mut fidl::encoding::Encoder<'_, D>,
914            offset: usize,
915            depth: fidl::encoding::Depth,
916        ) -> fidl::Result<()> {
917            encoder.debug_check_bounds::<ClientGetPowerLimitResponse>(offset);
918            // Zero out padding regions. There's no need to apply masks
919            // because the unmasked parts will be overwritten by fields.
920            // Write the fields.
921            self.0.encode(encoder, offset + 0, depth)?;
922            Ok(())
923        }
924    }
925
926    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
927        for ClientGetPowerLimitResponse
928    {
929        #[inline(always)]
930        fn new_empty() -> Self {
931            Self { power_limit_uw: fidl::new_empty!(u64, D) }
932        }
933
934        #[inline]
935        unsafe fn decode(
936            &mut self,
937            decoder: &mut fidl::encoding::Decoder<'_, D>,
938            offset: usize,
939            _depth: fidl::encoding::Depth,
940        ) -> fidl::Result<()> {
941            decoder.debug_check_bounds::<Self>(offset);
942            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
943            // Verify that padding bytes are zero.
944            // Copy from the buffer into the object.
945            unsafe {
946                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
947            }
948            Ok(())
949        }
950    }
951
952    impl fidl::encoding::ValueTypeMarker for ClientGetPowercapTreeResponse {
953        type Borrowed<'a> = &'a Self;
954        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
955            value
956        }
957    }
958
959    unsafe impl fidl::encoding::TypeMarker for ClientGetPowercapTreeResponse {
960        type Owned = Self;
961
962        #[inline(always)]
963        fn inline_align(_context: fidl::encoding::Context) -> usize {
964            8
965        }
966
967        #[inline(always)]
968        fn inline_size(_context: fidl::encoding::Context) -> usize {
969            16
970        }
971    }
972
973    unsafe impl<D: fidl::encoding::ResourceDialect>
974        fidl::encoding::Encode<ClientGetPowercapTreeResponse, D>
975        for &ClientGetPowercapTreeResponse
976    {
977        #[inline]
978        unsafe fn encode(
979            self,
980            encoder: &mut fidl::encoding::Encoder<'_, D>,
981            offset: usize,
982            _depth: fidl::encoding::Depth,
983        ) -> fidl::Result<()> {
984            encoder.debug_check_bounds::<ClientGetPowercapTreeResponse>(offset);
985            // Delegate to tuple encoding.
986            fidl::encoding::Encode::<ClientGetPowercapTreeResponse, D>::encode(
987                (
988                    <fidl::encoding::Vector<PowercapNodeInfo, 64> as fidl::encoding::ValueTypeMarker>::borrow(&self.nodes),
989                ),
990                encoder, offset, _depth
991            )
992        }
993    }
994    unsafe impl<
995        D: fidl::encoding::ResourceDialect,
996        T0: fidl::encoding::Encode<fidl::encoding::Vector<PowercapNodeInfo, 64>, D>,
997    > fidl::encoding::Encode<ClientGetPowercapTreeResponse, D> for (T0,)
998    {
999        #[inline]
1000        unsafe fn encode(
1001            self,
1002            encoder: &mut fidl::encoding::Encoder<'_, D>,
1003            offset: usize,
1004            depth: fidl::encoding::Depth,
1005        ) -> fidl::Result<()> {
1006            encoder.debug_check_bounds::<ClientGetPowercapTreeResponse>(offset);
1007            // Zero out padding regions. There's no need to apply masks
1008            // because the unmasked parts will be overwritten by fields.
1009            // Write the fields.
1010            self.0.encode(encoder, offset + 0, depth)?;
1011            Ok(())
1012        }
1013    }
1014
1015    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1016        for ClientGetPowercapTreeResponse
1017    {
1018        #[inline(always)]
1019        fn new_empty() -> Self {
1020            Self { nodes: fidl::new_empty!(fidl::encoding::Vector<PowercapNodeInfo, 64>, D) }
1021        }
1022
1023        #[inline]
1024        unsafe fn decode(
1025            &mut self,
1026            decoder: &mut fidl::encoding::Decoder<'_, D>,
1027            offset: usize,
1028            _depth: fidl::encoding::Depth,
1029        ) -> fidl::Result<()> {
1030            decoder.debug_check_bounds::<Self>(offset);
1031            // Verify that padding bytes are zero.
1032            fidl::decode!(fidl::encoding::Vector<PowercapNodeInfo, 64>, D, &mut self.nodes, decoder, offset + 0, _depth)?;
1033            Ok(())
1034        }
1035    }
1036
1037    impl PowercapNodeInfo {
1038        #[inline(always)]
1039        fn max_ordinal_present(&self) -> u64 {
1040            if let Some(_) = self.supports_bypass {
1041                return 9;
1042            }
1043            if let Some(_) = self.power_levels_uw {
1044                return 8;
1045            }
1046            if let Some(_) = self.min_power_uw {
1047                return 7;
1048            }
1049            if let Some(_) = self.max_power_uw {
1050                return 6;
1051            }
1052            if let Some(_) = self.constraint_name {
1053                return 5;
1054            }
1055            if let Some(_) = self.name {
1056                return 4;
1057            }
1058            if let Some(_) = self.zone_path {
1059                return 3;
1060            }
1061            if let Some(_) = self.parent_node_id {
1062                return 2;
1063            }
1064            if let Some(_) = self.node_id {
1065                return 1;
1066            }
1067            0
1068        }
1069    }
1070
1071    impl fidl::encoding::ValueTypeMarker for PowercapNodeInfo {
1072        type Borrowed<'a> = &'a Self;
1073        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1074            value
1075        }
1076    }
1077
1078    unsafe impl fidl::encoding::TypeMarker for PowercapNodeInfo {
1079        type Owned = Self;
1080
1081        #[inline(always)]
1082        fn inline_align(_context: fidl::encoding::Context) -> usize {
1083            8
1084        }
1085
1086        #[inline(always)]
1087        fn inline_size(_context: fidl::encoding::Context) -> usize {
1088            16
1089        }
1090    }
1091
1092    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PowercapNodeInfo, D>
1093        for &PowercapNodeInfo
1094    {
1095        unsafe fn encode(
1096            self,
1097            encoder: &mut fidl::encoding::Encoder<'_, D>,
1098            offset: usize,
1099            mut depth: fidl::encoding::Depth,
1100        ) -> fidl::Result<()> {
1101            encoder.debug_check_bounds::<PowercapNodeInfo>(offset);
1102            // Vector header
1103            let max_ordinal: u64 = self.max_ordinal_present();
1104            encoder.write_num(max_ordinal, offset);
1105            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1106            // Calling encoder.out_of_line_offset(0) is not allowed.
1107            if max_ordinal == 0 {
1108                return Ok(());
1109            }
1110            depth.increment()?;
1111            let envelope_size = 8;
1112            let bytes_len = max_ordinal as usize * envelope_size;
1113            #[allow(unused_variables)]
1114            let offset = encoder.out_of_line_offset(bytes_len);
1115            let mut _prev_end_offset: usize = 0;
1116            if 1 > max_ordinal {
1117                return Ok(());
1118            }
1119
1120            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1121            // are envelope_size bytes.
1122            let cur_offset: usize = (1 - 1) * envelope_size;
1123
1124            // Zero reserved fields.
1125            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1126
1127            // Safety:
1128            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1129            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1130            //   envelope_size bytes, there is always sufficient room.
1131            fidl::encoding::encode_in_envelope_optional::<u64, D>(
1132                self.node_id.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1133                encoder,
1134                offset + cur_offset,
1135                depth,
1136            )?;
1137
1138            _prev_end_offset = cur_offset + envelope_size;
1139            if 2 > max_ordinal {
1140                return Ok(());
1141            }
1142
1143            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1144            // are envelope_size bytes.
1145            let cur_offset: usize = (2 - 1) * envelope_size;
1146
1147            // Zero reserved fields.
1148            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1149
1150            // Safety:
1151            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1152            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1153            //   envelope_size bytes, there is always sufficient room.
1154            fidl::encoding::encode_in_envelope_optional::<u64, D>(
1155                self.parent_node_id.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1156                encoder,
1157                offset + cur_offset,
1158                depth,
1159            )?;
1160
1161            _prev_end_offset = cur_offset + envelope_size;
1162            if 3 > max_ordinal {
1163                return Ok(());
1164            }
1165
1166            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1167            // are envelope_size bytes.
1168            let cur_offset: usize = (3 - 1) * envelope_size;
1169
1170            // Zero reserved fields.
1171            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1172
1173            // Safety:
1174            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1175            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1176            //   envelope_size bytes, there is always sufficient room.
1177            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<128>, D>(
1178                self.zone_path.as_ref().map(
1179                    <fidl::encoding::BoundedString<128> as fidl::encoding::ValueTypeMarker>::borrow,
1180                ),
1181                encoder,
1182                offset + cur_offset,
1183                depth,
1184            )?;
1185
1186            _prev_end_offset = cur_offset + envelope_size;
1187            if 4 > max_ordinal {
1188                return Ok(());
1189            }
1190
1191            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1192            // are envelope_size bytes.
1193            let cur_offset: usize = (4 - 1) * envelope_size;
1194
1195            // Zero reserved fields.
1196            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1197
1198            // Safety:
1199            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1200            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1201            //   envelope_size bytes, there is always sufficient room.
1202            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<64>, D>(
1203                self.name.as_ref().map(
1204                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
1205                ),
1206                encoder,
1207                offset + cur_offset,
1208                depth,
1209            )?;
1210
1211            _prev_end_offset = cur_offset + envelope_size;
1212            if 5 > max_ordinal {
1213                return Ok(());
1214            }
1215
1216            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1217            // are envelope_size bytes.
1218            let cur_offset: usize = (5 - 1) * envelope_size;
1219
1220            // Zero reserved fields.
1221            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1222
1223            // Safety:
1224            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1225            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1226            //   envelope_size bytes, there is always sufficient room.
1227            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<64>, D>(
1228                self.constraint_name.as_ref().map(
1229                    <fidl::encoding::BoundedString<64> as fidl::encoding::ValueTypeMarker>::borrow,
1230                ),
1231                encoder,
1232                offset + cur_offset,
1233                depth,
1234            )?;
1235
1236            _prev_end_offset = cur_offset + envelope_size;
1237            if 6 > max_ordinal {
1238                return Ok(());
1239            }
1240
1241            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1242            // are envelope_size bytes.
1243            let cur_offset: usize = (6 - 1) * envelope_size;
1244
1245            // Zero reserved fields.
1246            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1247
1248            // Safety:
1249            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1250            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1251            //   envelope_size bytes, there is always sufficient room.
1252            fidl::encoding::encode_in_envelope_optional::<u64, D>(
1253                self.max_power_uw.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1254                encoder,
1255                offset + cur_offset,
1256                depth,
1257            )?;
1258
1259            _prev_end_offset = cur_offset + envelope_size;
1260            if 7 > max_ordinal {
1261                return Ok(());
1262            }
1263
1264            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1265            // are envelope_size bytes.
1266            let cur_offset: usize = (7 - 1) * envelope_size;
1267
1268            // Zero reserved fields.
1269            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1270
1271            // Safety:
1272            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1273            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1274            //   envelope_size bytes, there is always sufficient room.
1275            fidl::encoding::encode_in_envelope_optional::<u64, D>(
1276                self.min_power_uw.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1277                encoder,
1278                offset + cur_offset,
1279                depth,
1280            )?;
1281
1282            _prev_end_offset = cur_offset + envelope_size;
1283            if 8 > max_ordinal {
1284                return Ok(());
1285            }
1286
1287            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1288            // are envelope_size bytes.
1289            let cur_offset: usize = (8 - 1) * envelope_size;
1290
1291            // Zero reserved fields.
1292            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1293
1294            // Safety:
1295            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1296            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1297            //   envelope_size bytes, there is always sufficient room.
1298            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<u64, 64>, D>(
1299                self.power_levels_uw.as_ref().map(
1300                    <fidl::encoding::Vector<u64, 64> as fidl::encoding::ValueTypeMarker>::borrow,
1301                ),
1302                encoder,
1303                offset + cur_offset,
1304                depth,
1305            )?;
1306
1307            _prev_end_offset = cur_offset + envelope_size;
1308            if 9 > max_ordinal {
1309                return Ok(());
1310            }
1311
1312            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1313            // are envelope_size bytes.
1314            let cur_offset: usize = (9 - 1) * envelope_size;
1315
1316            // Zero reserved fields.
1317            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1318
1319            // Safety:
1320            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1321            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1322            //   envelope_size bytes, there is always sufficient room.
1323            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1324                self.supports_bypass
1325                    .as_ref()
1326                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1327                encoder,
1328                offset + cur_offset,
1329                depth,
1330            )?;
1331
1332            _prev_end_offset = cur_offset + envelope_size;
1333
1334            Ok(())
1335        }
1336    }
1337
1338    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PowercapNodeInfo {
1339        #[inline(always)]
1340        fn new_empty() -> Self {
1341            Self::default()
1342        }
1343
1344        unsafe fn decode(
1345            &mut self,
1346            decoder: &mut fidl::encoding::Decoder<'_, D>,
1347            offset: usize,
1348            mut depth: fidl::encoding::Depth,
1349        ) -> fidl::Result<()> {
1350            decoder.debug_check_bounds::<Self>(offset);
1351            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1352                None => return Err(fidl::Error::NotNullable),
1353                Some(len) => len,
1354            };
1355            // Calling decoder.out_of_line_offset(0) is not allowed.
1356            if len == 0 {
1357                return Ok(());
1358            };
1359            depth.increment()?;
1360            let envelope_size = 8;
1361            let bytes_len = len * envelope_size;
1362            let offset = decoder.out_of_line_offset(bytes_len)?;
1363            // Decode the envelope for each type.
1364            let mut _next_ordinal_to_read = 0;
1365            let mut next_offset = offset;
1366            let end_offset = offset + bytes_len;
1367            _next_ordinal_to_read += 1;
1368            if next_offset >= end_offset {
1369                return Ok(());
1370            }
1371
1372            // Decode unknown envelopes for gaps in ordinals.
1373            while _next_ordinal_to_read < 1 {
1374                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1375                _next_ordinal_to_read += 1;
1376                next_offset += envelope_size;
1377            }
1378
1379            let next_out_of_line = decoder.next_out_of_line();
1380            let handles_before = decoder.remaining_handles();
1381            if let Some((inlined, num_bytes, num_handles)) =
1382                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1383            {
1384                let member_inline_size =
1385                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1386                if inlined != (member_inline_size <= 4) {
1387                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1388                }
1389                let inner_offset;
1390                let mut inner_depth = depth.clone();
1391                if inlined {
1392                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1393                    inner_offset = next_offset;
1394                } else {
1395                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1396                    inner_depth.increment()?;
1397                }
1398                let val_ref = self.node_id.get_or_insert_with(|| fidl::new_empty!(u64, D));
1399                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1400                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1401                {
1402                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1403                }
1404                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1405                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1406                }
1407            }
1408
1409            next_offset += envelope_size;
1410            _next_ordinal_to_read += 1;
1411            if next_offset >= end_offset {
1412                return Ok(());
1413            }
1414
1415            // Decode unknown envelopes for gaps in ordinals.
1416            while _next_ordinal_to_read < 2 {
1417                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1418                _next_ordinal_to_read += 1;
1419                next_offset += envelope_size;
1420            }
1421
1422            let next_out_of_line = decoder.next_out_of_line();
1423            let handles_before = decoder.remaining_handles();
1424            if let Some((inlined, num_bytes, num_handles)) =
1425                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1426            {
1427                let member_inline_size =
1428                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1429                if inlined != (member_inline_size <= 4) {
1430                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1431                }
1432                let inner_offset;
1433                let mut inner_depth = depth.clone();
1434                if inlined {
1435                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1436                    inner_offset = next_offset;
1437                } else {
1438                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1439                    inner_depth.increment()?;
1440                }
1441                let val_ref = self.parent_node_id.get_or_insert_with(|| fidl::new_empty!(u64, D));
1442                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1443                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1444                {
1445                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1446                }
1447                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1448                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1449                }
1450            }
1451
1452            next_offset += envelope_size;
1453            _next_ordinal_to_read += 1;
1454            if next_offset >= end_offset {
1455                return Ok(());
1456            }
1457
1458            // Decode unknown envelopes for gaps in ordinals.
1459            while _next_ordinal_to_read < 3 {
1460                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1461                _next_ordinal_to_read += 1;
1462                next_offset += envelope_size;
1463            }
1464
1465            let next_out_of_line = decoder.next_out_of_line();
1466            let handles_before = decoder.remaining_handles();
1467            if let Some((inlined, num_bytes, num_handles)) =
1468                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1469            {
1470                let member_inline_size =
1471                    <fidl::encoding::BoundedString<128> as fidl::encoding::TypeMarker>::inline_size(
1472                        decoder.context,
1473                    );
1474                if inlined != (member_inline_size <= 4) {
1475                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1476                }
1477                let inner_offset;
1478                let mut inner_depth = depth.clone();
1479                if inlined {
1480                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1481                    inner_offset = next_offset;
1482                } else {
1483                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1484                    inner_depth.increment()?;
1485                }
1486                let val_ref = self
1487                    .zone_path
1488                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<128>, D));
1489                fidl::decode!(
1490                    fidl::encoding::BoundedString<128>,
1491                    D,
1492                    val_ref,
1493                    decoder,
1494                    inner_offset,
1495                    inner_depth
1496                )?;
1497                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1498                {
1499                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1500                }
1501                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1502                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1503                }
1504            }
1505
1506            next_offset += envelope_size;
1507            _next_ordinal_to_read += 1;
1508            if next_offset >= end_offset {
1509                return Ok(());
1510            }
1511
1512            // Decode unknown envelopes for gaps in ordinals.
1513            while _next_ordinal_to_read < 4 {
1514                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1515                _next_ordinal_to_read += 1;
1516                next_offset += envelope_size;
1517            }
1518
1519            let next_out_of_line = decoder.next_out_of_line();
1520            let handles_before = decoder.remaining_handles();
1521            if let Some((inlined, num_bytes, num_handles)) =
1522                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1523            {
1524                let member_inline_size =
1525                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
1526                        decoder.context,
1527                    );
1528                if inlined != (member_inline_size <= 4) {
1529                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1530                }
1531                let inner_offset;
1532                let mut inner_depth = depth.clone();
1533                if inlined {
1534                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1535                    inner_offset = next_offset;
1536                } else {
1537                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1538                    inner_depth.increment()?;
1539                }
1540                let val_ref = self
1541                    .name
1542                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<64>, D));
1543                fidl::decode!(
1544                    fidl::encoding::BoundedString<64>,
1545                    D,
1546                    val_ref,
1547                    decoder,
1548                    inner_offset,
1549                    inner_depth
1550                )?;
1551                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1552                {
1553                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1554                }
1555                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1556                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1557                }
1558            }
1559
1560            next_offset += envelope_size;
1561            _next_ordinal_to_read += 1;
1562            if next_offset >= end_offset {
1563                return Ok(());
1564            }
1565
1566            // Decode unknown envelopes for gaps in ordinals.
1567            while _next_ordinal_to_read < 5 {
1568                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1569                _next_ordinal_to_read += 1;
1570                next_offset += envelope_size;
1571            }
1572
1573            let next_out_of_line = decoder.next_out_of_line();
1574            let handles_before = decoder.remaining_handles();
1575            if let Some((inlined, num_bytes, num_handles)) =
1576                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1577            {
1578                let member_inline_size =
1579                    <fidl::encoding::BoundedString<64> as fidl::encoding::TypeMarker>::inline_size(
1580                        decoder.context,
1581                    );
1582                if inlined != (member_inline_size <= 4) {
1583                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1584                }
1585                let inner_offset;
1586                let mut inner_depth = depth.clone();
1587                if inlined {
1588                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1589                    inner_offset = next_offset;
1590                } else {
1591                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1592                    inner_depth.increment()?;
1593                }
1594                let val_ref = self
1595                    .constraint_name
1596                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<64>, D));
1597                fidl::decode!(
1598                    fidl::encoding::BoundedString<64>,
1599                    D,
1600                    val_ref,
1601                    decoder,
1602                    inner_offset,
1603                    inner_depth
1604                )?;
1605                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1606                {
1607                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1608                }
1609                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1610                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1611                }
1612            }
1613
1614            next_offset += envelope_size;
1615            _next_ordinal_to_read += 1;
1616            if next_offset >= end_offset {
1617                return Ok(());
1618            }
1619
1620            // Decode unknown envelopes for gaps in ordinals.
1621            while _next_ordinal_to_read < 6 {
1622                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1623                _next_ordinal_to_read += 1;
1624                next_offset += envelope_size;
1625            }
1626
1627            let next_out_of_line = decoder.next_out_of_line();
1628            let handles_before = decoder.remaining_handles();
1629            if let Some((inlined, num_bytes, num_handles)) =
1630                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1631            {
1632                let member_inline_size =
1633                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1634                if inlined != (member_inline_size <= 4) {
1635                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1636                }
1637                let inner_offset;
1638                let mut inner_depth = depth.clone();
1639                if inlined {
1640                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1641                    inner_offset = next_offset;
1642                } else {
1643                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1644                    inner_depth.increment()?;
1645                }
1646                let val_ref = self.max_power_uw.get_or_insert_with(|| fidl::new_empty!(u64, D));
1647                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1648                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1649                {
1650                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1651                }
1652                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1653                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1654                }
1655            }
1656
1657            next_offset += envelope_size;
1658            _next_ordinal_to_read += 1;
1659            if next_offset >= end_offset {
1660                return Ok(());
1661            }
1662
1663            // Decode unknown envelopes for gaps in ordinals.
1664            while _next_ordinal_to_read < 7 {
1665                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1666                _next_ordinal_to_read += 1;
1667                next_offset += envelope_size;
1668            }
1669
1670            let next_out_of_line = decoder.next_out_of_line();
1671            let handles_before = decoder.remaining_handles();
1672            if let Some((inlined, num_bytes, num_handles)) =
1673                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1674            {
1675                let member_inline_size =
1676                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1677                if inlined != (member_inline_size <= 4) {
1678                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1679                }
1680                let inner_offset;
1681                let mut inner_depth = depth.clone();
1682                if inlined {
1683                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1684                    inner_offset = next_offset;
1685                } else {
1686                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1687                    inner_depth.increment()?;
1688                }
1689                let val_ref = self.min_power_uw.get_or_insert_with(|| fidl::new_empty!(u64, D));
1690                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1691                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1692                {
1693                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1694                }
1695                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1696                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1697                }
1698            }
1699
1700            next_offset += envelope_size;
1701            _next_ordinal_to_read += 1;
1702            if next_offset >= end_offset {
1703                return Ok(());
1704            }
1705
1706            // Decode unknown envelopes for gaps in ordinals.
1707            while _next_ordinal_to_read < 8 {
1708                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1709                _next_ordinal_to_read += 1;
1710                next_offset += envelope_size;
1711            }
1712
1713            let next_out_of_line = decoder.next_out_of_line();
1714            let handles_before = decoder.remaining_handles();
1715            if let Some((inlined, num_bytes, num_handles)) =
1716                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1717            {
1718                let member_inline_size =
1719                    <fidl::encoding::Vector<u64, 64> as fidl::encoding::TypeMarker>::inline_size(
1720                        decoder.context,
1721                    );
1722                if inlined != (member_inline_size <= 4) {
1723                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1724                }
1725                let inner_offset;
1726                let mut inner_depth = depth.clone();
1727                if inlined {
1728                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1729                    inner_offset = next_offset;
1730                } else {
1731                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1732                    inner_depth.increment()?;
1733                }
1734                let val_ref = self
1735                    .power_levels_uw
1736                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u64, 64>, D));
1737                fidl::decode!(fidl::encoding::Vector<u64, 64>, D, val_ref, decoder, inner_offset, inner_depth)?;
1738                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1739                {
1740                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1741                }
1742                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1743                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1744                }
1745            }
1746
1747            next_offset += envelope_size;
1748            _next_ordinal_to_read += 1;
1749            if next_offset >= end_offset {
1750                return Ok(());
1751            }
1752
1753            // Decode unknown envelopes for gaps in ordinals.
1754            while _next_ordinal_to_read < 9 {
1755                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1756                _next_ordinal_to_read += 1;
1757                next_offset += envelope_size;
1758            }
1759
1760            let next_out_of_line = decoder.next_out_of_line();
1761            let handles_before = decoder.remaining_handles();
1762            if let Some((inlined, num_bytes, num_handles)) =
1763                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1764            {
1765                let member_inline_size =
1766                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1767                if inlined != (member_inline_size <= 4) {
1768                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1769                }
1770                let inner_offset;
1771                let mut inner_depth = depth.clone();
1772                if inlined {
1773                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1774                    inner_offset = next_offset;
1775                } else {
1776                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1777                    inner_depth.increment()?;
1778                }
1779                let val_ref = self.supports_bypass.get_or_insert_with(|| fidl::new_empty!(bool, D));
1780                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1781                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1782                {
1783                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1784                }
1785                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1786                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1787                }
1788            }
1789
1790            next_offset += envelope_size;
1791
1792            // Decode the remaining unknown envelopes.
1793            while next_offset < end_offset {
1794                _next_ordinal_to_read += 1;
1795                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1796                next_offset += envelope_size;
1797            }
1798
1799            Ok(())
1800        }
1801    }
1802}