The BIOS (UEFI) menu seems quite locked down in terms of what settings are exposed to the user (cf. BIOS Guide).
While this is on par with most devices by other manufacturers, since the Framework Laptop is targeted towards advanced users, it’d be great if the menu forms included more settings to play with, such as for example the ability to set custom or XMP memory timings.
These settings are apparently already included in Framework’s BIOS setup implementation, so it’s simply a question of flipping a switch just to show them to (i.e. not hide them from) the user. Allowing this is unlikely to require significant workload on Framework’s part.
As these perhaps shouldn’t be shown by default so as not to intimidate casual users and avoid unnecessary customer support workload, there are a number ways this could be implemented on an opt-in basis:
- a “secret” key combination to be pressed from within the BIOS setup (one vendor uses
Ctrl-Alt-Shift-F7
for this purpose) - an alternate BIOS file to be flashed instead of the regular one
- a flag to be toggled with H2OUVE (Insyde H2O UEFI Variable Editor, a command-line utility)
To see for yourself what options are already available, just hidden, in the laptop’s BIOS, you can download a dump of the internal forms representation (IFR) within the SetupUtility attached to this post (edit: as a new user I’m apparently not allowed to add attachments) or, if you prefer to start from the source:
- Download: https://downloads.frame.work/bios/Framework_Laptop_BIOS_3.06.exe
- Extract the file
isflash.bin
from within the executable archive. - Download UEFI Tool: https://github.com/LongSoft/UEFITool/releases
- Run, open
isflash.bin
, search for GUID:FE3542FE-C1D3-4EF8-657C-8048606FF670
(SetupUtility), right-click on it, and extract the file as, say,SetupUtility.efi
. - Download Universal IFR Extractor: https://github.com/LongSoft/Universal-IFR-Extractor/releases
- Run, open the extracted file, save as
SetupUtility_IFR.txt
, and see for yourself what’s in it.
Would be great to be able to access this menu and all the other settings, for those who would want it, of course:
Form Sets
--------------------------------------------------------------------------------
Offset: Title:
--------------------------------------------------------------------------------
0xA17C4 Power_Hidden (0x1A6E from string package 0x0)
0xA2A74 Advanced (0x1A8C from string package 0x0)
0xB5CA4 Advanced_Hidden (0x1A6D from string package 0x0)
0xE1954 Security (0x30 from string package 0x4)
0xF1B54 Main_Hidden (0x123 from string package 0x4)
0xF2D94 Boot (0x50 from string package 0x4)
0xF43F4 Boot_Hidden (0x124 from string package 0x4)
0xF5EB4 Security (0x30 from string package 0x4)
0xF7824 Main (0x5 from string package 0x4)
0xF8AB4 Exit (0x94 from string package 0x4)
For example, the memory timing settings:
Form: Memory Overclocking Menu, FormId: 0x101C {01 86 1C 10 49 11}
Suppress If {0A 82}
QuestionId: 0x5B4 equals value 0x4 {12 06 B4 05 04 00}
Text: Statement.Prompt: Memory Profile:, TextTwo: Default Custom XMP1 XMP2 {03 08 4A 11 5F 05 4B 11}
Text: Statement.Prompt: tCK [MHz], TextTwo: 0000000 0000000 0000000 0000000 {03 08 4C 11 5F 05 4D 11}
Text: Statement.Prompt: tCL, TextTwo: 00000 00000 00000 00000 {03 08 4E 11 5F 05 4F 11}
Text: Statement.Prompt: tRCD/tRP, TextTwo: 00000 00000 00000 00000 {03 08 50 11 5F 05 51 11}
Text: Statement.Prompt: tRAS, TextTwo: 00000 00000 00000 00000 {03 08 52 11 5F 05 53 11}
Text: Statement.Prompt: tCWL, TextTwo: 00000 00000 00000 00000 {03 08 54 11 5F 05 55 11}
Text: Statement.Prompt: tFAW, TextTwo: 00000 00000 00000 00000 {03 08 56 11 5F 05 57 11}
Text: Statement.Prompt: tREFI, TextTwo: 00000 00000 00000 00000 {03 08 58 11 5F 05 59 11}
Text: Statement.Prompt: tRFC, TextTwo: 00000 00000 00000 00000 {03 08 5A 11 5F 05 5B 11}
Text: Statement.Prompt: tRRD, TextTwo: 00000 00000 00000 00000 {03 08 5C 11 5F 05 5D 11}
Text: Statement.Prompt: tRTP, TextTwo: 00000 00000 00000 00000 {03 08 5E 11 5F 05 5F 11}
Text: Statement.Prompt: tWR, TextTwo: 00000 00000 00000 00000 {03 08 60 11 5F 05 61 11}
Text: Statement.Prompt: tWTR, TextTwo: 00000 00000 00000 00000 {03 08 62 11 5F 05 63 11}
Text: Statement.Prompt: NMode, TextTwo: 00000 00000 00000 00000 {03 08 64 11 5F 05 65 11}
Text: Statement.Prompt: VDD [mV], TextTwo: 00000 00000 00000 00000 {03 08 66 11 5F 05 67 11}
Subtitle: Statement.Prompt: , Flags: 0x0 {02 87 02 00 00 00 00}
End {29 02}
One Of: Dynamic Memory Timings, VarStoreInfo (VarOffset/VarName): 0x427, VarStore: 0x2, QuestionId: 0xA1, Size: 1, Min: 0x0, Max 0x1, Step: 0x0 {05 91 68 11 69 11 A1 00 02 00 27 04 10 10 00 01 00}
One Of Option: Disabled, Value (8 bit): 0x0 (default) {09 07 04 00 30 00 00}
One Of Option: Enabled, Value (8 bit): 0x1 {09 07 03 00 00 00 01}
End One Of {29 02}
One Of: Memory profile, VarStoreInfo (VarOffset/VarName): 0x13B, VarStore: 0x2, QuestionId: 0x112B, Size: 1, Min: 0x0, Max 0x3, Step: 0x0 {05 91 6A 11 6B 11 2B 11 02 00 3B 01 14 10 00 03 00}
One Of Option: Default profile, Value (8 bit): 0x0 (default) {09 07 6C 11 30 00 00}
One Of Option: Custom profile, Value (8 bit): 0x1 {09 07 6F 11 00 00 01}
Suppress If {0A 82}
QuestionId: 0x5B6 equals value 0x0 {12 06 B6 05 00 00}
One Of Option: XMP profile 1, Value (8 bit): 0x2 {09 07 6D 11 00 00 02}
One Of Option: XMP profile 2, Value (8 bit): 0x3 {09 07 6E 11 00 00 03}
End If {29 02}
End One Of {29 02}