On Wed, 2025-05-07 at 22:52 +0900, Alexandre Courbot wrote: > +impl FwSecBiosImage { > + fn setup_falcon_data( > + &mut self, > + pdev: &pci::Device, > + pci_at_image: &PciAtBiosImage, > + first_fwsec_image: &FwSecBiosImage, > + ) -> Result<()> { > + let mut offset = pci_at_image.falcon_data_ptr(pdev)? as usize; > + > + // The falcon data pointer assumes that the PciAt and FWSEC images > + // are contiguous in memory. However, testing shows the EFI image > sits in > + // between them. So calculate the offset from the end of the PciAt > image > + // rather than the start of it. Compensate. > + offset -= pci_at_image.base.data.len(); > + > + // The offset is now from the start of the first Fwsec image, however > + // the offset points to a location in the second Fwsec image. Since > + // the fwsec images are contiguous, subtract the length of the first > Fwsec > + // image from the offset to get the offset to the start of the second > + // Fwsec image. > + offset -= first_fwsec_image.base.data.len(); > + > + self.falcon_data_offset = Some(offset); > + > + // The PmuLookupTable starts at the offset of the falcon data pointer > + self.pmu_lookup_table = > Some(PmuLookupTable::new(&self.base.data[offset..])?); > + > + match self > + .pmu_lookup_table > + .as_ref() > + .ok_or(EINVAL)? > + .find_entry_by_type(FALCON_UCODE_ENTRY_APPID_FWSEC_PROD) > + { > + Ok(entry) => { > + let mut ucode_offset = entry.data as usize; > + ucode_offset -= pci_at_image.base.data.len(); > + ucode_offset -= first_fwsec_image.base.data.len(); > + self.falcon_ucode_offset = Some(ucode_offset); > + if cfg!(debug_assertions) { > + // Print the v3_desc header for debugging > + let v3_desc = self.fwsec_header(pdev.as_ref())?; > + pr_info!("PmuLookupTableEntry v3_desc: {:#?}\n", > v3_desc); > + } > + } > + Err(e) => { > + dev_err!( > + pdev.as_ref(), > + "PmuLookupTableEntry not found, error: {:?}\n", > + e > + );
Shouldn't you return an error here? If not, then maybe this should probably be dev_warn.