[PATCH 0/4] ACPI fixes

From: Simon Glass <sjg@chromium.org> This series collects a few fix-ups for the recent BGRT series and tweaks the ACPI tables to use U-Boot as the 'creator' of the tables. It also adds a new logo for U-Boot (with text below). Simon Glass (4): tools: Add the logo with text under it acpi: Use the logo with text underneath acpi: Check ACPI revision before accessing XSDT acpi: Use the U-Boot ACPI ID and version arch/x86/lib/acpi_nhlt.c | 2 +- arch/x86/lib/acpi_table.c | 2 +- include/acpi/acpi_table.h | 5 +-- lib/acpi/acpi.c | 8 +++-- lib/acpi/acpi_table.c | 2 +- lib/acpi/bgrt_image.bmp | Bin 43926 -> 56574 bytes test/dm/acpi.c | 58 +++++++++++++++++++------------ tools/logos/u_boot_logo_text.svg | Bin 0 -> 10733 bytes 8 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 tools/logos/u_boot_logo_text.svg -- 2.43.0 base-commit: 5659b7adcb906a50d740ca68d3fc458172b9682c branch: bgr

From: Simon Glass <sjg@chromium.org> This is obtained from[1] and is the official logo of the project when text is needed. Add it into the source tree. [1] https://commons.wikimedia.org/wiki/File:U-Boot_Logo.svg Signed-off-by: Simon Glass <sjg@chromium.org> --- tools/logos/u_boot_logo_text.svg | Bin 0 -> 10733 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tools/logos/u_boot_logo_text.svg diff --git a/tools/logos/u_boot_logo_text.svg b/tools/logos/u_boot_logo_text.svg new file mode 100644 index 0000000000000000000000000000000000000000..1527e79a3a9b1ae118ed41e417f368d5b454a9e9 GIT binary patch literal 10733 zcmd5?ZI9bF68@fFp>u#D#aS{*Q55O*ZZB<6v_N|}BrWdl(?Kg~y}HPjD{0^I>+cy# zlw^B%vrTeIHb`O($>GD9XI@0_>bu)b>0Re_Q&ij284uXZ%eQHj72Eac?DyY(^!3bZ z+GLw0Wwp&uXWMG_-PyC%Uwq$t^N&~m@_#APeB0#y&sn~0i;E(!m);LQ_}~BAfAi9p z0rPzS>{&PehiZ3M7wgN`dy#(Y3C8u@`zbHBb&+0rZ_>-F^fIZl)?3})?dob9tjpco zzpXd7L6)EOYMSfyGtcvYdD|?r^mKOFw!7tGvAe3vpsLr4EM4Sfz5$kI!2`aSjnmU{ zdRpg6TU_U9wb@kL#;)8p&nJ`X>|#)Ub8{2igmw})#w?gv2;pOf-`s86<ksI`3XJzH z6^yY3#>P#aHf!0y89V$PraM8<R9AJHU*Oz%u+7`WtKVKN+@Q~btj)&Fmc{mMlO{X3 zu(uf<%LzLRB%8e1C28I)oZPOzDYEtw+|bHCUgqS()0vRcK3^C4&G*&q>5O^I!z9lQ z6xrzv2NvC|kz(8m+!o7$d@L{`klu?ZOO!Tg$iq3Y#Q2Q+Tz+d;x#KOfD%}F_>Fmls zud4PxWwovXXWl_~e!Hvc*1ssqyqn!tRoN_Pa<iDO+-*C@9Im|0b}+o;fiUpj0rFn^ z-NBqQaBkHWZJ87KJdf;PA44`f``!N@aJ^rEV70JPJAIS4NtU$9xWY+7KBE~>3C1m7 zzxuIz!gHD~|5?><yCpP(CM4(86`a$rvFoyQ365-%_N>?>>zqjVS47YX!Quu69V^J% zyIqf*mUn9Fyd&Gdo@vBo>87AXi#KgimOs-bGjHK=0x2mad+eWnkdC|KNM)B$2H8UZ z?u+4mZL>JP^P6OW^s_huV%Jsmh_18b%QbSwR5*owUzYl&Y)_68)i>+*#2R*Rtu-P3 zSuJq5gI(;*BS2&>a3MeYHM#QyZ(17$+D^9e-ZoYvF~GqlM)di3G~a|2ec(UUa!ze$ zpj}?W%gw0x0b<;z9SQPvj+~xdr7h~rzE1%9BXz$jnzk;^ukO`d=YL!kpzntQ|9jPf zkw=g}R_)97VaOkAj=V0eZG9thG@l&$8<gq%Wm&wPTE&vFCtpXL)nbycRtuNUXmFL~ z7rjF$Int9bJ<ipT;wfWiR9!mP?T}W|s;uhM+4BqgV=IE^omX|1*KSDJpS__9MGXlG zC9D@$=l{*qwyny%PPQqE2xtAsx<;|PPkvQo`F#UJ!610UMo!({Xmgol)eQ<~zt=E$ zQ*1HdyE<#c(ei$VE4`dW?kHrx!B8UZRX3N_4ISllc9E1#ez@Vgs@ecYzy%Kl3lE1= z6mxlmA%y{z3PSsHxTFV2UBClFSpCq@Cb=y(#k(AEhhz2K$}+vGYh-4>Ozv`c{-UgI zUZa3&;Ok1v%65dPvTjA0oag1~>=#<#9qC)w)zxlOWpKJx>Cj?t`|K99U`9h_6SbQ@ zmPp7i*gVqTx^kQrb?QpIhaUN^gidrC<?=aWQYv*q4}Q;yB|kxus@~?yE&AyGbLaA< zvrE@1?2`6UhfxpA^T-><`3R3N<YW{!!Jw<QD_ZO_-C&Wl+HS%3s`g<`WQMC6NXJe0 zpkG|1sn#C=9R~c><6O<T_FkfIn+xg((Ghw^&3&;ap=rJl-Zd6@iD%}<PQ}XteH<U@ z)4RbCL}xmm<e~EE569ookG_)AZ|vzc&coT9yTki<z~4PtFT&|R{_rq@%bduod07^_ zX6WAbJey_4M9~L$_944tYnRG8mcp%rvxufXSHZ~RnzG6;USmAM=)l}Z!s+9YhtWRL z{#Ay0GXkndShf~?Hc-AxH@yMHz5yS^RU@2Tn14DalU5lTGgzaqNZ}}P6=*0?co~QN zrhX>Ji_x$DN2p4TNvwxDkvOPk!a-n-M-!9hKN|%jX^^U%(<rHjBN8H^7;`+5I{#du zVR1c<Og)I~v3&DrB|(X#pZC>4m+JTI2Ga~?gx$gkx}y|>#%>7a&jt1{sQ2MUPlfwo zf%62z+Av4wH(1fd&Ir`S&X})ZSw1E!m|gPEYuN!Ug$`$I64ewvQcMI?YGOGR5Kl<( zBr<$_y^+&ONMOc9MPS2tijB@Qnw|<Hr^7r6>Z3vSlulCuDmsWEpq>JDWQ7IGp9=Pq z*wvqy@+n|P(h}IceE(QN_%v9}XevwF;XSkO<G(f@9Hy@K;vLWTMX2zn@qS@895&3+ zgv?)KUN~;?-;4N*GvXkd@%JKrgcJSUg6Ac5k>C!(-Yj%i_(RH^+!WxBy)JHF@IZ!K z3B30*{OO*g3FkbLffTWb=6)CkCX}J*zt*4^5!c68xb3i?aZ`X>`|{+1Bscb3mpxH~ zE0d*UyW5kp*yes$vzPd)0xx;A<RaM=<=wKu?S<dqPVnNS&2L*jDU0=XiEr)Nygn)O z7XSJ5wGY1WTavOHT&L{`x>eisvZ|MxBFoC$zC=FZnq#n$y@{G!-MFh|cX>nSr#b78 zqYZYWc%hx%XH1OLU8T6|lfW1mMX?%Rmz+LY&SUPb#YpUV*k|M6ojeY-(sW@V!ay4( zWAD;~TLdmJ@M<0hF_${>{_xmb21>_~$MGMF^;`vU6l>l;$8!;|2y!n9q|{6d&tVYD z*o5Jn(U8zFi*fDIPwte(p_Rle9MnPLHn;{%hr?lGiqPo*_jWwA=%Rp@3lFL_<HF2! zpm49JNdTCJ02<D?@_Z~4_zF{v5&%<iC;^cMl~xu|Ki#c|qC<(>W4xXr)4uP@$@Mfe z_sF;Io&gRU8xor7BE#OTJyw_>Cq(CW%>v1zNWkwBAB|=be&-|&nKCeLXl*MX1xcLv z6P~j_&Y$D37_$_aq&tgZfzVRxIS)+$_@FDe!9de6GQh8p3ychjCSky(VIfkI2R28M z!AGA5w8ntQu!j)bN`wZlMhU(|lfuM^0-_UgRt&QY^D!zyDXj?B8&%@F|HED0c^lHg zIpS4tva|+24G4XS_=saABSH!mM@GolA{7zz3sTEsDJVuHXCaeTVnQ2~P7(%mnJqe` zf*~jf)?}1XkkX+IGa5-4O05cDo$O;pgw;nfU_xpb3Y5U^WKt6t<N^@`D3ZAnv832h zfhPP0$(|AgzQ!hNM~9CQZqEhyhRe}FQ4S$AB2*{@$T7ku6(`|X9BCYga40OJOcj_| zDAKQE9Vs|7P$C+EKr00gB_<Y1gn73>jRF}MK;u9_hoi;tDxCt_RlvfCj}pooTxi2R zKMrK9A{h;mE;hm_;z&GSJT}Hx*)cYR4nSlrVMi3(nBj5~KEr7TcERlt(S+kvu&T0j zQHrCMkVGnG$UnVA1u(6qIG`FqzQYhmfjGjDA*1$l<**tXNM;K{rwyCqdQE6c?T7)M z&9=0;7*_*h2WQZSf<T*VqBd%kRxz^u-e`m<97LctROpB@J|K+ySWzE_A>tZLwmeoL z4oLwQV_6tR5@+m2K@O@9Q7_P-UN6vSazJ%_B@%=&uJMUS-PC@>3F2WbXtbvu^dGVW z>Q9VpByco3BkgVrSkFxoDTN~rY(=^10r)^bTqbNCligSk$p&zDp2I!jFHhd_)qf-} z%)%&%KR{mUC<gZGBl?2#hx~=;K>|zaX!aRA20%|?KB_z>G01Hhw?|{-MPi|iD@Rq5 zJx1kze2>idCheHcZpX(7jb9)dD2<>y<n%~PN8K2$(*vv?h8(RUHLiEW9yXaUJ0f58 zwBsm{hulU>c))E)1{jCj9>*MJnA9EYXqT^m-S@QKT%wQQvA_$FKs}1Pt_!^iXNGz) z90Ro$W#<|Z9UE#sP;MqtbP!Z!sWXQaY#n8`TL(+S-htGrpb18WjFH+XH{i=JEy0Lh zK>f6eP#a>~@=<TVX`exgVj%;LI*tY!E{w1fx(3@eM7ASB296Y75j1rY$l$1)qXg5H zw7ohtJOuYAv^%(LN7<&6fky6VI0Mtn#MBWXJUTOcXiZ%$*6!CY><9b2qTl&Cd-gwP Cl(60a literal 0 HcmV?d00001 -- 2.43.0

From: Simon Glass <sjg@chromium.org> Rather than using the round logo used on stickers and coins, use the one with text underneath, to be consistent. Signed-off-by: Simon Glass <sjg@chromium.org> --- lib/acpi/bgrt_image.bmp | Bin 43926 -> 56574 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/acpi/bgrt_image.bmp b/lib/acpi/bgrt_image.bmp index b4c95a641014552f19b7479c1ddfb5b83c0ac489..792b2bbee70542de966574d021dc475a80425616 100644 GIT binary patch literal 56574 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 literal 43926 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 U&jW8eIqiNC6=>WP()8o^e~AeE00000 -- 2.43.0

From: Simon Glass <sjg@chromium.org> This field is only present in revisions after zero, so add the missing check. This avoids a buffer overrun with a revision 1.0 ACPI table. Signed-off-by: Simon Glass <sjg@chromium.org> Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de> --- lib/acpi/acpi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c index b13cba1a608..698d17a02e8 100644 --- a/lib/acpi/acpi.c +++ b/lib/acpi/acpi.c @@ -81,7 +81,7 @@ static int setup_search(struct acpi_rsdt **rsdtp, struct acpi_xsdt **xsdtp) return -ENOENT; if (!acpi_valid_rsdp(rsdp)) return -EINVAL; - if (rsdp->xsdt_address) { + if (rsdp->revision > 1 && rsdp->xsdt_address) { xsdt = nomap_sysmem(rsdp->xsdt_address, 0); len = xsdt->header.length - sizeof(xsdt->header); count = len / sizeof(u64); -- 2.43.0

From: Simon Glass <sjg@chromium.org> The ACPI spec is a little confusing as to what should go in the 'creator_id' field: Vendor ID of utility that created the table. For tables containing Definition Blocks, this is the ID for the ASL Compiler. Even though some of the tables are compiled by the Intel ASL compiler (generally DSDT), U-Boot generates many of the tables itself. So it should be listed as the creator. Rename the constant and use "UBOO", as per the UEFI forum. For the version, use (year << 16) | (patchlevel << 8) which seems to be a common approach. This mostly fixes https://concept.u-boot.org/u-boot/u-boot/-/issues/16 but the question of the logo remains. Signed-off-by: Simon Glass <sjg@chromium.org> Link: https://uefi.org/ACPI_ID_List?acpi_search=u-boot --- arch/x86/lib/acpi_nhlt.c | 2 +- arch/x86/lib/acpi_table.c | 2 +- include/acpi/acpi_table.h | 5 +--- lib/acpi/acpi.c | 6 ++-- lib/acpi/acpi_table.c | 2 +- test/dm/acpi.c | 58 ++++++++++++++++++++++++--------------- 6 files changed, 44 insertions(+), 31 deletions(-) diff --git a/arch/x86/lib/acpi_nhlt.c b/arch/x86/lib/acpi_nhlt.c index 8aae5fa5af7..00b313b0703 100644 --- a/arch/x86/lib/acpi_nhlt.c +++ b/arch/x86/lib/acpi_nhlt.c @@ -408,7 +408,7 @@ int nhlt_serialise_oem_overrides(struct acpi_ctx *ctx, struct nhlt *nhlt, memcpy(header->oem_table_id, oem_table_id, oem_table_id_len); } header->oem_revision = oem_revision; - memcpy(header->creator_id, ASLC_ID, 4); + memcpy(header->creator_id, ACPI_CREATOR, 4); cur.buf = (void *)(header + 1); cur.start = (void *)header; diff --git a/arch/x86/lib/acpi_table.c b/arch/x86/lib/acpi_table.c index b13292c4150..8663f97457e 100644 --- a/arch/x86/lib/acpi_table.c +++ b/arch/x86/lib/acpi_table.c @@ -224,7 +224,7 @@ static int acpi_write_tpm2(struct acpi_ctx *ctx, /* Fill out header fields. */ acpi_fill_header(header, "TPM2"); - memcpy(header->creator_id, ASLC_ID, 4); + memcpy(header->creator_id, ACPI_CREATOR, 4); header->length = sizeof(struct acpi_tpm2); header->revision = acpi_get_table_revision(ACPITAB_TPM2); diff --git a/include/acpi/acpi_table.h b/include/acpi/acpi_table.h index 850cb8db816..f2bd758599f 100644 --- a/include/acpi/acpi_table.h +++ b/include/acpi/acpi_table.h @@ -18,10 +18,7 @@ #define RSDP_SIG "RSD PTR " /* RSDP pointer signature */ #define OEM_ID "U-BOOT" /* U-Boot */ #define OEM_TABLE_ID "U-BOOTBL" /* U-Boot Table */ -#define ASLC_ID "INTL" /* Intel ASL Compiler */ - -/* TODO(sjg@chromium.org): Figure out how to get compiler revision */ -#define ASL_REVISION 0 +#define ACPI_CREATOR "UBOO" /* U-Boot */ #define ACPI_RSDP_REV_ACPI_1_0 0 #define ACPI_RSDP_REV_ACPI_2_0 2 diff --git a/lib/acpi/acpi.c b/lib/acpi/acpi.c index 698d17a02e8..3e0360ab9fe 100644 --- a/lib/acpi/acpi.c +++ b/lib/acpi/acpi.c @@ -10,6 +10,7 @@ #include <errno.h> #include <mapmem.h> #include <tables_csum.h> +#include <version.h> #include <version_string.h> #include <acpi/acpi_table.h> #include <asm/global_data.h> @@ -174,8 +175,9 @@ void acpi_fill_header(struct acpi_table_header *header, char *signature) memcpy(header->oem_id, OEM_ID, 6); memcpy(header->oem_table_id, OEM_TABLE_ID, 8); header->oem_revision = OEM_REVISION; - memcpy(header->creator_id, ASLC_ID, 4); - header->creator_revision = ASL_REVISION; + memcpy(header->creator_id, ACPI_CREATOR, 4); + header->creator_revision = (U_BOOT_VERSION_NUM << 16) | + (U_BOOT_VERSION_NUM_PATCH << 8); } void acpi_align(struct acpi_ctx *ctx) diff --git a/lib/acpi/acpi_table.c b/lib/acpi/acpi_table.c index f2dadd792bd..2589efbb5f2 100644 --- a/lib/acpi/acpi_table.c +++ b/lib/acpi/acpi_table.c @@ -126,7 +126,7 @@ int acpi_write_fadt(struct acpi_ctx *ctx, const struct acpi_writer *entry) header->revision = acpi_get_table_revision(ACPITAB_FADT); memcpy(header->oem_id, OEM_ID, 6); memcpy(header->oem_table_id, OEM_TABLE_ID, 8); - memcpy(header->creator_id, ASLC_ID, 4); + memcpy(header->creator_id, ACPI_CREATOR, 4); header->creator_revision = 1; fadt->minor_revision = 2; diff --git a/test/dm/acpi.c b/test/dm/acpi.c index a274671de02..d1be6707693 100644 --- a/test/dm/acpi.c +++ b/test/dm/acpi.c @@ -13,6 +13,7 @@ #include <malloc.h> #include <mapmem.h> #include <tables_csum.h> +#include <version.h> #include <version_string.h> #include <acpi/acpigen.h> #include <acpi/acpi_device.h> @@ -25,6 +26,9 @@ #define BUF_SIZE 4096 +#define CREATOR_REVISION ((U_BOOT_VERSION_NUM << 16) | \ + (U_BOOT_VERSION_NUM_PATCH << 8)) + #define OEM_REVISION ((((version_num / 1000) % 10) << 28) | \ (((version_num / 100) % 10) << 24) | \ (((version_num / 10) % 10) << 20) | \ @@ -263,8 +267,8 @@ static int dm_test_acpi_fill_header(struct unit_test_state *uts) ut_asserteq_mem(OEM_TABLE_ID, hdr.oem_table_id, sizeof(hdr.oem_table_id)); ut_asserteq(OEM_REVISION, hdr.oem_revision); - ut_asserteq_mem(ASLC_ID, hdr.creator_id, sizeof(hdr.creator_id)); - ut_asserteq(ASL_REVISION, hdr.creator_revision); + ut_asserteq_mem(ACPI_CREATOR, hdr.creator_id, sizeof(hdr.creator_id)); + ut_asserteq(CREATOR_REVISION, hdr.creator_revision); return 0; } @@ -417,22 +421,27 @@ static int dm_test_acpi_cmd_list(struct unit_test_state *uts) ut_assert_nextline("RSDP %16lx %5zx v02 U-BOOT", addr, sizeof(struct acpi_rsdp)); addr = ALIGN(addr + sizeof(struct acpi_rsdp), 16); - ut_assert_nextline("RSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0", + ut_assert_nextline("RSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x", addr, sizeof(struct acpi_table_header) + - 3 * sizeof(u32), OEM_REVISION); + 3 * sizeof(u32), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_rsdt), 16); - ut_assert_nextline("XSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0", + ut_assert_nextline("XSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x", addr, sizeof(struct acpi_table_header) + - 3 * sizeof(u64), OEM_REVISION); + 3 * sizeof(u64), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_xsdt), 64); - ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0", - addr, sizeof(struct acpi_dmar), OEM_REVISION); + ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x", + addr, sizeof(struct acpi_dmar), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_dmar), 16); - ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0", - addr, sizeof(struct acpi_dmar), OEM_REVISION); + ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x", + addr, sizeof(struct acpi_dmar), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_dmar), 16); - ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0", - addr, sizeof(struct acpi_dmar), OEM_REVISION); + ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x", + addr, sizeof(struct acpi_dmar), OEM_REVISION, + CREATOR_REVISION); ut_assert_console_end(); unmap_sysmem(buf); free(buf); @@ -461,22 +470,27 @@ static int dm_test_acpi_cmd_list_chksum(struct unit_test_state *uts) ut_assert_nextline("RSDP %16lx %5zx v02 U-BOOT OK OK", addr, sizeof(struct acpi_rsdp)); addr = ALIGN(addr + sizeof(struct acpi_rsdp), 16); - ut_assert_nextline("RSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0 OK", + ut_assert_nextline("RSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x OK", addr, sizeof(struct acpi_table_header) + - 3 * sizeof(u32), OEM_REVISION); + 3 * sizeof(u32), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_rsdt), 16); - ut_assert_nextline("XSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0 OK", + ut_assert_nextline("XSDT %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x OK", addr, sizeof(struct acpi_table_header) + - 3 * sizeof(u64), OEM_REVISION); + 3 * sizeof(u64), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_xsdt), 64); - ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0 OK", - addr, sizeof(struct acpi_dmar), OEM_REVISION); + ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x OK", + addr, sizeof(struct acpi_dmar), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_dmar), 16); - ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0 OK", - addr, sizeof(struct acpi_dmar), OEM_REVISION); + ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x OK", + addr, sizeof(struct acpi_dmar), OEM_REVISION, + CREATOR_REVISION); addr = ALIGN(addr + sizeof(struct acpi_dmar), 16); - ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x INTL 0 OK", - addr, sizeof(struct acpi_dmar), OEM_REVISION); + ut_assert_nextline("DMAR %16lx %5zx v01 U-BOOT U-BOOTBL %x UBOO %x OK", + addr, sizeof(struct acpi_dmar), OEM_REVISION, + CREATOR_REVISION); ut_assert_console_end(); ut_assert_console_end(); unmap_sysmem(buf); -- 2.43.0
participants (1)
-
Simon Glass