Skip to content

feat(app+engine): real SMBIOS data, System Information page, LVGL default, robustness, showcase#42

Merged
MarsDoge merged 16 commits into
mainfrom
feat/lvgl-default
Jun 10, 2026
Merged

feat(app+engine): real SMBIOS data, System Information page, LVGL default, robustness, showcase#42
MarsDoge merged 16 commits into
mainfrom
feat/lvgl-default

Conversation

@MarsDoge

@MarsDoge MarsDoge commented Jun 8, 2026

Copy link
Copy Markdown
Owner

Accumulated batch on feat/lvgl-default (one PR, many focused commits). Beyond the
original LVGL-default flip, this now covers App data, a new page, engine
robustness, a normative standard, and refreshed showcase screenshots.

Engine / build

  • Make LVGL the default backend on the build-verified targets (ovmf-x64, loongarch);
    armvirt/riscv stay modern pending lvgl cross-compile verification.
  • Gate 4 robustness: graceful degradation when the GOP mode is absent or below a
    usable minimum (in-setup falls back to text-console output instead of blanking;
    the front-page app exits to the native shell), plus a minimum-size guard in both
    renderer backends and an LVGL mode-change re-init fix.
  • Render the in-setup form title as a prominent header.

Front-page App

  • Real SMBIOS data (Track C): platform identity (Type 1), CPU model + cores
    (Type 4), memory type/speed (Type 17), baseboard (Type 2), serial/UUID (Type 1),
    BIOS version/date (Type 0) -- replacing hardcoded/placeholder values; humanized
    firmware revision; placeholder-string filtering; aligned packed-SMBIOS access.
  • New dedicated System Information page (PageSystemInfo) -- a read-only detail
    view; rows appended only when SMBIOS reports them.
  • Platform-class adaptive dashboard cards: the server-inventory card hides on
    client/VM platforms; single data-driven applicability predicate; nav/grid/route
    all bound on the visible count.
  • Localization fixes (no mixed zh/en in the health text).

Docs / governance

  • Docs/AppFeatureStandard.md (+ zh): normative App feature/IA standard.
  • Smoke updated to enforce the platform-adaptive card contract; all guards pass.

Showcase

  • Refreshed screenshots for OVMF X64, LoongArch, and ArmVirt AArch64 dashboards +
    the new System Information page. RISC-V capture pending (its edk2 DEBUG firmware
    asserts before GOP).

Validation: smoke (CI gate) passes; OVMF x64 (modern + lvgl), LoongArch, ArmVirt,
and RISC-V firmware build; app builds for X64/AARCH64/LOONGARCH64; dashboards
captured under QEMU on x64/LoongArch/AArch64.

🤖 Generated with Claude Code

MarsDoge and others added 16 commits June 8, 2026 10:45
Complete the LVGL backend graduation (Docs/LvglProductizationPlan.md Gate 1)
beyond CI-gating:

- De-spike the LVGL renderer INF framing: it is no longer "experimental, never
  in a default overlay" but a supported, CI-gated backend (the same
  ModernDisplayEngineDxe with this renderer library swapped in). The genuinely
  experimental libs (ModernUiHiiBridgeLib/PageAdapterLib, the orphan
  LvglDisplayEngineDxe) keep their experimental status.
- bootstrap-edk2.sh now initializes the External/lvgl submodule, so a fresh
  checkout's default lvgl build works.
- Flip the default MODERN_SETUP_DISPLAY_ENGINE to lvgl on the targets whose lvgl
  build is verified here (ovmf-x64 + loongarch; both built and QEMU-checked this
  cycle). armvirt and riscvvirt stay on modern by default until their lvgl
  cross-compilation is verified -- overlay generation passes for them, but the
  AARCH64/RISCV64 lvgl object build is not exercised in this environment, so
  defaulting them to lvgl could ship a broken default.

Verified: bare Scripts/build-ovmf-x64.sh (no env) now builds lvgl (DXEFV ~43%),
and smoke passes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…w optional

Capture the key reframing of the CJK story: we only own the glyphs we control.
The demand-driven subset covers our shell UI fully; HII form content follows its
own available language (English when a driver ships no zh -- the common case),
so there is usually no out-of-subset Chinese to draw. The default product
therefore needs only tier 1 plus a guarantee that any unrenderable glyph
degrades to readable text, never a tofu box. The standard GB2312 L1 subset
becomes a PCD-gated narrow-need optional (default off) for the few products that
must render Chinese-localized third-party HII forms, rather than a ~1.2 MB cost
paid everywhere. Per-language fallback is clean and free; per-glyph swapping is
intentionally not attempted. Updates Gate 2 and the locked CJK decision.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The in-setup form title (e.g. "My First Setup Page", "Boot Manager") was drawn
in plain MutedText, reading as dim body text rather than the page heading. Draw
it brighter -- a blend mostly toward Theme->Text but kept toward MutedText so it
still reads as a heading and keeps the smoke-guarded token -- so each form is
clearly anchored by its title across all backends.

An accent underline below the title was tried and dropped: it lands in the
content band the native FormBrowser repaints after the chrome, which wipes it
(the same chrome-vs-content draw-order constraint as the OEM watermark).

Display-only. Verified by an OVMF X64 lvgl screendump and smoke.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… rows

The system-status card drew every field at a fixed row position, so a provider
that returns a placeholder ("外形规格 N/A") left a labelled blank row mid-card.
DrawDashboardInfoRow now skips placeholder/empty values ("N/A" / "Limited data")
and returns the next row Y; the system-status card uses that as a running Y so
skipped rows collapse and the card reads clean with no orphaned N/A line. The
monitor card keeps its fixed layout (its values are not placeholders).

Display-only app polish; no provider/IFR/storage change. Verified by an OVMF X64
REPLACE_UIAPP lvgl screendump (the 外形规格 N/A row is gone, rows flow up) and
smoke.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…text

Polish pass on the front-page App and its provider summaries:

- Render gST->FirmwareRevision as human-readable major.minor with the raw hex
  retained: "1.00 (0x00010000)" instead of a bare "0x00010000". Applied in both
  ModernUiPlatformDataLib and ModernUiFirmwareDataLib so the dashboard System
  Information card and the Firmware/Platform pages all read consistently. The
  96-char text buffers comfortably hold the longer form.

- Fix two language leaks in the Simplified Chinese dashboard: the provider-health
  "Degraded" state was returning the English literal inside the zh branch (showing
  "就绪 / Degraded / 未就绪"); it now reads 退化. The all-providers-ready hint was a
  terse "OK"; it now reads 已就绪. Both words use glyphs already in the embedded
  Noto Sans CJK SC subset, so smoke's built-in-glyph coverage guard still passes
  and no font regeneration is needed.

Verified: AARCH64 ModernSetupApp build, smoke validation (all overlay dry runs +
glyph-subset guard) PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add Docs/AppFeatureStandard.md (+ zh-CN mirror) as the prescriptive contract for
the ModernSetup front-page App, distinct from the reference IbvAndPlatformSetupSurvey
and ProductizationFeatureMatrix. It pins:

- the ownership boundary (read-only summaries + native FormBrowser entry only);
- five platform classes (Client-Desktop, Client-Mobile, Server, Embedded,
  Unknown) derived from SMBIOS form factor + management providers, with Unknown
  behaving as the inclusive client superset;
- the canonical SETUP_PAGE category set and its ordering rule;
- the three-zone dashboard structure (System Information / Platform Health /
  quick-category grid);
- the standardized 8-entry quick-card catalog with routes/groups/status, plus a
  per-platform-class applicability matrix -- the Server inventory card is
  server-class-only unless a management/PCIe provider reports live data;
- conformance rules that make the visible card count class-variable (smoke
  asserts catalog/route length + valid routes, not a fixed visible count) and
  require a single data-driven applicability predicate over scattered ifs.

This is the design contract for the upcoming dashboard reorg; it documents known
gaps (no Security quick card yet; reserved Battery/Recovery slots) without
changing code. Indexed in Docs/README.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Implement the per-platform standardization from Docs/AppFeatureStandard.md. The
quick-card catalog stays fixed at 8 (Continue, Boot, Devices, Provider status,
Firmware, Power, Performance, Server inventory), but the trailing server-inventory
card is now class-scoped: it is hidden on client/unknown platforms unless the
chassis form factor is "Server" or a management provider (IPMI / Redfish / SMBIOS
management interface) reports live data.

- Add a single data-driven applicability predicate
  ModernSetupDashboardQuickCardApplicable() and a visible-count helper
  ModernSetupDashboardVisibleQuickCardCount() (Actions.c, declared in
  Internal.h). MODERN_SETUP_DASHBOARD_SERVER_CARD names the trailing slot; the
  invariant that only trailing cards may be hidden keeps visible index == catalog
  index, so no mid-array remapping is needed.
- Grid layout, the dashboard drawing loop, the dashboard-page selectable count,
  and all four App.c keyboard-nav bounds now derive from the visible count, so a
  hidden card reflows the grid and is skipped by navigation. Route resolution
  rejects an inapplicable card, so a hidden card is never Enter-activatable.
- Smoke keeps asserting the fixed catalog (>= 8) but now also requires the
  data-driven helpers in Actions/Dashboard/App, instead of pinning a fixed
  visible count.

On OVMF/LoongArch VMs (no BMC, non-server chassis) the grid reflows to seven
cards; a managed/server platform shows all eight. Verified: AARCH64 app build
(-Werror clean) and smoke (all overlay dry runs + dashboard guards) PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
LVGL productization Gate 4 (resolution & robustness). Three related fixes so the
modern engine never blanks the screen on an unusable graphics mode:

- Text-console fallback: ModernUiCustomizedDisplayLib PrintInternal previously
  emitted nothing when the renderer was unavailable -- neither GOP graphics nor
  console text -- so an in-setup form rendered blank (the modern engine had
  replaced the native text DisplayEngine). It now falls back to OutputString
  (padded to the field width) so the form stays readable.
- Minimum-usable-size guard: both the GOP and LVGL ModernUiRendererInit now
  return EFI_NOT_FOUND when the active mode is below MODERN_UI_MIN_RENDER_WIDTH x
  MODERN_UI_MIN_RENDER_HEIGHT (640x480), so callers degrade to text (in-setup) or
  exit to the native shell (front-page app) instead of painting broken chrome.
  Normal targets (>= 800x600) are unaffected.
- LVGL mode-change re-init: update lv_display_set_resolution to match the
  reallocated canvas, and create the canvas object once then rebind its buffer
  rather than re-creating it each re-init (which orphaned the previous canvas and
  left it pointing at the just-freed buffer). Fixes the first post-mode-change
  frame and a per-mode-change object leak.

Verified: OVMF X64 builds clean for both modern (GOP) and lvgl backends, smoke
PASS. QEMU sub-640x480 / live mode-switch capture not run (OVMF defaults are
>= 800x600; the guard is defensive) -- logic-reviewed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sync LvglProductizationPlan.md Gate 4 with the robustness fixes: GOP-absent /
degenerate-mode fallback and mode-change re-init are now done; the resolution
matrix (per-resolution OVMF build + capture) remains the open Gate 4 item.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Replace the hardcoded "UEFI platform" placeholder with the real platform/product
identity read from SMBIOS Type 1 (System Information): "<Manufacturer>
<Product Name>" (e.g. "QEMU Standard PC (Q35 + ICH9, 2009)" on OVMF).

- Add a small read-only SMBIOS string-set reader (GetSmbiosString) plus a Type 1
  identity reader (GetSmbiosSystemName) to ModernUiPlatformDataLib, mirroring the
  existing Type 3 form-factor reader.
- Filter well-known meaningless OEM placeholder strings ("To Be Filled By
  O.E.M.", "Not Specified", "System Product Name", ...) so the generic fallback
  reads better than vendor junk.
- Fall back to "UEFI platform" only when SMBIOS Type 1 is absent or reports no
  usable identity. Cross-architecture, read-only, no policy.
- Declare BaseLib in the INF (now uses AsciiStrCmp directly).

Verified: AARCH64 app build (-Werror clean), smoke PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a real "CPU" row to the dashboard System Information panel, read from SMBIOS
Type 4 (Processor Information): "<Processor Version> (<cores>C/<threads>T)", e.g.
"QEMU Virtual CPU version 2.5+ (4C/8T)".

- GetSmbiosProcessor reader in ModernUiPlatformDataLib reuses the Type 1 string
  helper + placeholder filter; honors the SMBIOS 0xFF CoreCount2/ThreadCount2
  escape for >255 core/thread counts, and degrades cleanly (version-only,
  cores-only, or empty) by what the record reports.
- MODERN_UI_PLATFORM_SUMMARY gains an appended `Processor` field (additive,
  end-of-struct per Docs/API_COMPATIBILITY.md); the app snapshot seeds it with the
  localized Unknown text so it shows "Unknown" when Type 4 is absent.
- Dashboard draws the CPU row (ASCII "CPU" label -- the zh glyphs for a
  translated label are outside the embedded subset) right after Platform.

Verified: AARCH64 app build (-Werror clean), smoke PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Enhance the dashboard Memory row from a bare total ("8192 MB") to include real
module detail from SMBIOS Type 17 (Memory Device): "8192 MB (DDR4-3200,
2 DIMMs)".

- GetSmbiosMemoryDetail walks all Type 17 records, counts populated modules
  (Size != 0/0xFFFF), and takes type + speed from the first populated module;
  MemoryTypeToString maps the MemoryType enum to DDR3/DDR4/DDR5/LPDDR4/... The
  configured clock speed is preferred over the rated speed; type prefix and speed
  are each omitted when unreported.
- MODERN_UI_PLATFORM_SUMMARY gains an appended (additive) MemoryDetail field; the
  total size still comes from the UEFI memory map. Empty when Type 17 is absent,
  in which case the row shows the bare total.

Verified: AARCH64 app build (-Werror clean), smoke PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Add a read-only "System Information" page (PageSystemInfo) as the second nav tab,
a deeper companion to the dashboard System Information panel. It shows the real
SMBIOS-sourced identity in grouped rows: platform (Type 1), CPU (Type 4), memory
type/speed (Type 17), architecture, form factor, boot mode, and firmware
vendor/revision -- all from the cached provider snapshot, no IFR parsing, no
writes.

- SETUP_PAGE gains PageSystemInfo (inserted after PageDashboard); mPages and both
  compact tab-label arrays are kept ordinally aligned with the enum (mPages[Page]
  indexing). Tab label "System"/"系统", title "System Information"/"系统规格"
  (glyph-subset-safe zh).
- Add ModernUiStringPageSystemInfo/...Hint (EN + Simplified Chinese) appended to
  the string enum and both string tables.
- DrawSystemInfo reuses DrawProviderSummaryPage; registered in the page dispatch
  and the smoke NOINLINE-helper contract. Read-only page => default selectable
  count 0 (focus stays on nav), like the other summary pages.
- Update the normative page set in Docs/AppFeatureStandard.md (+ zh mirror).

Verified: AARCH64 app build (-Werror clean), smoke PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…BIOS

Make the System Information page a genuine detail view (not a dashboard mirror) by
adding the deeper SMBIOS identity that does not fit the dashboard:

- Baseboard "<Manufacturer> <Product>" (SMBIOS Type 2).
- Serial number and UUID (SMBIOS Type 1); the UUID renders in canonical GUID form
  and is suppressed for the all-zero ("not present") and all-FF ("not settable")
  sentinels.
- BIOS version and release-date strings (SMBIOS Type 0), complementing the numeric
  gST->FirmwareRevision.

MODERN_UI_PLATFORM_SUMMARY gains appended (additive) Serial/Uuid/Baseboard/
BiosVersion/BiosDate fields; three new read-only SMBIOS readers reuse the existing
string-set extractor and placeholder filter. DrawSystemInfo builds its row list
dynamically (cap 13): the 7 core rows always show, the 5 identity rows are
appended only when SMBIOS reports a usable value, so thin-SMBIOS platforms collapse
cleanly instead of stacking empty rows. zh labels for baseboard/serial/BIOS-date
stay English (glyphs outside the embedded subset; graceful fallback).

Verified: AARCH64 app build (-Werror clean), smoke PASS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
GetSmbiosSystemDetail read Type1->Uuid directly with %g. SMBIOS records are
byte-packed, so the GUID field can be unaligned; doing a structured (multi-byte)
read of it is undefined on strict-alignment targets. Copy the 16 bytes to an
aligned local GUID (byte-wise CopyMem) before the all-zero/all-FF sentinel scan
and the %g format. Defensive correctness for AArch64/RISC-V; no behavior change
on x86/LoongArch.

(Note: an AArch64 dashboard crash seen during multi-arch capture was a stale
incremental build -- a stale object file compiled against the pre-Track-C
MODERN_UI_PLATFORM_SUMMARY size after the struct gained fields -- not this code.
A clean build of the same source renders correctly on all of OVMF x64, LoongArch,
and ArmVirt.)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Re-capture the GitHub showcase to the current app and add two new shots:

- modern-ovmf-x64-dashboard-graphite-gold.png (hero) and modern-loongarch-dashboard.png
  re-captured -- now show the System nav tab, real SMBIOS platform/CPU/memory
  data, humanized firmware revision, and the platform-adaptive quick cards
  (server card hidden on client/VM -> 7 cards).
- modern-ovmf-x64-systeminfo.png (new) -- the dedicated System Information page.
- modern-aarch64-dashboard.png (new) -- ArmVirt AArch64 dashboard.

README gallery updated; the stale v0.4 ArmVirt app shots are dropped from the
gallery in favor of the AArch64 dashboard. All captures are 1280x800, app boots
from an ESP under QEMU. RISC-V capture pending (its edk2 DEBUG firmware asserts
in HardwareErrorSourceTableDxe before GOP).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@MarsDoge MarsDoge changed the title feat(build): make LVGL the default backend on build-verified targets feat(app+engine): real SMBIOS data, System Information page, LVGL default, robustness, showcase Jun 10, 2026
@MarsDoge MarsDoge merged commit 3da98ea into main Jun 10, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant