feat(app+engine): real SMBIOS data, System Information page, LVGL default, robustness, showcase#42
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Accumulated batch on
feat/lvgl-default(one PR, many focused commits). Beyond theoriginal LVGL-default flip, this now covers App data, a new page, engine
robustness, a normative standard, and refreshed showcase screenshots.
Engine / build
armvirt/riscv stay
modernpending lvgl cross-compile verification.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.
Front-page App
(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.
PageSystemInfo) -- a read-only detailview; rows appended only when SMBIOS reports them.
client/VM platforms; single data-driven applicability predicate; nav/grid/route
all bound on the visible count.
Docs / governance
Docs/AppFeatureStandard.md(+ zh): normative App feature/IA standard.Showcase
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