Skip to content

Commit 9cd69c8

Browse files
committed
esrt: Decode LastAttemptStatus
This will help us figure out what's going on when a BIOS update fails. Different updates return different values. Signed-off-by: Daniel Schaefer <[email protected]>
1 parent bba3daa commit 9cd69c8

File tree

1 file changed

+124
-9
lines changed

1 file changed

+124
-9
lines changed

framework_lib/src/esrt/mod.rs

Lines changed: 124 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,8 @@ impl ResourceType {
270270
}
271271

272272
#[derive(Debug)]
273-
pub enum UpdateStatus {
273+
#[repr(u32)]
274+
pub enum BiosUpdateErr {
274275
Success = 0x00,
275276
Unsuccessful = 0x01,
276277
InsufficientResources = 0x02,
@@ -279,9 +280,9 @@ pub enum UpdateStatus {
279280
AuthError = 0x05,
280281
PowerEventAc = 0x06,
281282
PowerEventBattery = 0x07,
282-
Reserved = 0xFF, // TODO: I added this, since there's no unknown type, is there?
283+
Unknown(u32),
283284
}
284-
impl UpdateStatus {
285+
impl BiosUpdateErr {
285286
fn from_int(i: u32) -> Self {
286287
match i {
287288
0 => Self::Success,
@@ -292,7 +293,123 @@ impl UpdateStatus {
292293
5 => Self::AuthError,
293294
6 => Self::PowerEventAc,
294295
7 => Self::PowerEventBattery,
295-
_ => Self::Reserved,
296+
i => Self::Unknown(i),
297+
}
298+
}
299+
}
300+
301+
#[derive(Debug)]
302+
#[repr(u32)]
303+
pub enum IntelRetimerUpdateErr {
304+
Success = 0x0000,
305+
ImageTableNotProvided = 0x1900,
306+
ImageParameterIsNull = 0x1901,
307+
SignatureIsNotDetected = 0x1902,
308+
RetimerCountHeaderIsZero = 0x1903,
309+
OverOneRetimerCount = 0x1904,
310+
PayloadSizeTooSmall = 0x1905,
311+
PayloadIsOutOfBounds = 0x1906,
312+
ImageNotProvided = 0x1907,
313+
ProgressCallbackError = 0x1908,
314+
TcssRetimerProtocolNotFound = 0x1909,
315+
DriveTbtModeFailed = 0x190A,
316+
Usb2hcProtocolNotFound = 0x190B,
317+
PayloadIsOutOfBounds2 = 0x190C,
318+
UnsupportFirmwareType = 0x190D,
319+
InitializationFailed = 0x190E,
320+
RestoreOriginalModeFailed = 0x190F,
321+
UpdateFailed = 0x1910,
322+
DeviceHandleNotFound = 0x1911,
323+
TooFewRetimerInstances = 0x1912,
324+
SendOfflineModeFailed = 0x1913,
325+
DtbtImageTableNotProvided = 0x1980,
326+
DtbtImageParameterIsNull = 0x1981,
327+
DtbtSignatureIsNotDetected = 0x1982,
328+
DtbtRetimerCountHeaderIsZero = 0x1983,
329+
DtbtOverOneRetimerCount = 0x1984,
330+
DtbtPayloadSizeTooSmall = 0x1985,
331+
DtbtPayloadIsOutOfBounds = 0x1986,
332+
DtbtImageNotProvided = 0x1987,
333+
DtbtProgressCallbackError = 0x1988,
334+
DtbtUsb2hcProtocolNotFound = 0x1989,
335+
DtbtPayloadIsOutOfBounds2 = 0x198A,
336+
DtbtUnsupportFirmwareType = 0x198B,
337+
DtbtInitializationFailed = 0x198C,
338+
DtbtUpdateFailed = 0x198D,
339+
Unknown(u32),
340+
}
341+
impl IntelRetimerUpdateErr {
342+
fn from_int(i: u32) -> Self {
343+
match i {
344+
0 => Self::Success,
345+
i => Self::Unknown(i),
346+
}
347+
}
348+
}
349+
#[derive(Debug)]
350+
pub enum CsmeUpdateErr {
351+
Success,
352+
Unknown(u32),
353+
}
354+
impl CsmeUpdateErr {
355+
fn from_int(i: u32) -> Self {
356+
match i {
357+
0 => Self::Success,
358+
i => Self::Unknown(i),
359+
}
360+
}
361+
}
362+
363+
#[derive(Debug)]
364+
pub enum UpdateStatus {
365+
Success,
366+
/// Framework specific
367+
Bios(BiosUpdateErr),
368+
/// Intel specific
369+
IntelRetimer(IntelRetimerUpdateErr),
370+
/// Intel specific
371+
Csme(CsmeUpdateErr),
372+
/// See EDK2 FmpDevicePkg/Include/LastAttemptStatus.h
373+
FmpDxeErr(u32),
374+
/// See EDK2 FmpDevicePkg/Include/LastAttemptStatus.h
375+
FmpDependencyLib(u32),
376+
Unknown(u32),
377+
}
378+
impl UpdateStatus {
379+
fn from_int(i: u32, guid: FrameworkGuidKind) -> Self {
380+
match (i, guid) {
381+
(0, _) => Self::Success,
382+
(0x1000..=0x107F, _) => Self::FmpDxeErr(i),
383+
(0x10A0..=0x10BF, _) => Self::FmpDependencyLib(i),
384+
(
385+
i,
386+
FrameworkGuidKind::TglBios
387+
| FrameworkGuidKind::AdlBios
388+
| FrameworkGuidKind::RplBios
389+
| FrameworkGuidKind::MtlBios
390+
| FrameworkGuidKind::Fw12RplBios
391+
| FrameworkGuidKind::Amd16Ai300Bios
392+
| FrameworkGuidKind::Amd13Ai300Bios
393+
| FrameworkGuidKind::DesktopAmdAi300Bios,
394+
) => UpdateStatus::Bios(BiosUpdateErr::from_int(i)),
395+
(
396+
i,
397+
FrameworkGuidKind::TglRetimer01
398+
| FrameworkGuidKind::TglRetimer23
399+
| FrameworkGuidKind::AdlRetimer01
400+
| FrameworkGuidKind::AdlRetimer23
401+
| FrameworkGuidKind::RplRetimer01
402+
| FrameworkGuidKind::RplRetimer23
403+
| FrameworkGuidKind::MtlRetimer01
404+
| FrameworkGuidKind::MtlRetimer23,
405+
) => UpdateStatus::IntelRetimer(IntelRetimerUpdateErr::from_int(i)),
406+
(
407+
i,
408+
FrameworkGuidKind::RplCsme
409+
| FrameworkGuidKind::RplUCsme
410+
| FrameworkGuidKind::MtlCsme,
411+
) => UpdateStatus::Csme(CsmeUpdateErr::from_int(i)),
412+
_ => Self::Unknown(i),
296413
}
297414
}
298415
}
@@ -316,12 +433,10 @@ pub fn print_esrt(esrt: &Esrt) {
316433
println!(" ResourceVersion: {}", esrt.resource_version);
317434

318435
for (i, entry) in esrt.entries.iter().enumerate() {
436+
let guid = match_guid_kind(&entry.fw_class);
319437
println!("ESRT Entry {}", i);
320438
println!(" GUID: {}", entry.fw_class);
321-
println!(
322-
" GUID: {:?}",
323-
match_guid_kind(&entry.fw_class)
324-
);
439+
println!(" GUID: {:?}", guid);
325440
println!(
326441
" Type: {:?}",
327442
ResourceType::from_int(entry.fw_type)
@@ -341,7 +456,7 @@ pub fn print_esrt(esrt: &Esrt) {
341456
);
342457
println!(
343458
" Last Attempt Status: {:?}",
344-
UpdateStatus::from_int(entry.last_attempt_status)
459+
UpdateStatus::from_int(entry.last_attempt_status, guid)
345460
);
346461
}
347462
}

0 commit comments

Comments
 (0)