From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (NAM12-DM6-obe.outbound.protection.outlook.com [40.107.243.78]) by mx.groups.io with SMTP id smtpd.web10.23765.1678465445372597276 for ; Fri, 10 Mar 2023 08:24:05 -0800 Authentication-Results: mx.groups.io; dkim=fail reason="body hash did not verify" header.i=@nvidia.com header.s=selector2 header.b=onqdsclv; spf=permerror, err=parse error for token &{10 18 %{i}._ip.%{h}._ehlo.%{d}._spf.vali.email}: invalid domain name (domain: nvidia.com, ip: 40.107.243.78, mailfrom: gmahadevan@nvidia.com) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=P9KhPgB4xiOfkXTlHhy017lEK/hZdLmHQ/cqIYGt0/jUs1Razwy/nfOcKqy/aoX/Q+7oST9rtT9vyRt4UtLEc+PJFE2/34cAdXOlV+o7Bq+BkIwmiKQ7NXewVPuiPjvuCBBMueFH5Unp0GAy2KH8umykmtyzfoHP60KwxA2LSgGMBrQKh6MZ6Awb+6/cHf0APEeLebekJ5PgJORO0z60wrKnlveS057p6fM0pBawtvegS3KGBODdnpjoUZYR9WNPCSr3dM/f+1TQ5kHt62RZf2oN+G/jRryumBEstet671rDJXo4CXsDbh9LzYZawDQjTcAO5D1BXkdu4HizUnxq9g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=FkmcmE1eiA/LI2MeuWNE1xnENJe9WdoBImi/wRScwUQ=; b=kjjrKbbOVUYKzBZU/xwMxgUK6a+X7UGZx9B84zHAickZAwkumKMn2vCRJoX7S3pDKkHwtruL46o5H0v6aitLNOyjD9ZsavLc3IIVRzBOBQr9SFk+NeNTG3toQxmFazV1BUgsf1XVDi8dVrootIfSh1NaKXanTS7mwGoOcZj71NLe/lQMcDeBVblUV/5pnpANA+pZQvx/bo0y1Nbbw9nEHQTX4STRHgvyoTKvQLq/fn3kJQnGkZgbqxg5E770NNGnKH6Klie3fGMPQ1Uvz5tszl96XhVaVJHq9hZcvuFRUBIefxvsnYY5dhTGvgiN90+I9k61YnyW/2d74yMVotWCCg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nvidia.com; dmarc=pass action=none header.from=nvidia.com; dkim=pass header.d=nvidia.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FkmcmE1eiA/LI2MeuWNE1xnENJe9WdoBImi/wRScwUQ=; b=onqdsclvZfwb8BXcTkHSbLNVMNNMaAy9AXEwyAuQF7HDzIaOJWcErJndkRHviNl0Zagmg/mVtAsBsPStl0r84eTLZ8IeKWp5e2xlCZaj00j5mspzv2RG+UHOBdIBqZ87pzzlig89jEhoGPZ5CUshIG4pssMV2gjjHZXjmD2TPYTfMXOE4o9h1fx2lNXxf4Kb+LR4jWOfgH1H9A0GsFbH/u/C2+G2O0BIBxMQbbfuRLroVtVOxjCNUwLnIahZerMqqSO9QIoimCptU0u31FfK9uIB6wJ1p4zw2fClOKabiJJPHIr7IAc+v1soe4FKj8VU3d0LfWwH4Jq1Lg2K9pGMuw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nvidia.com; Received: from CY5PR12MB6297.namprd12.prod.outlook.com (2603:10b6:930:22::19) by SJ0PR12MB5407.namprd12.prod.outlook.com (2603:10b6:a03:3ac::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6178.19; Fri, 10 Mar 2023 16:24:02 +0000 Received: from CY5PR12MB6297.namprd12.prod.outlook.com ([fe80::cb1a:2484:aef1:bc76]) by CY5PR12MB6297.namprd12.prod.outlook.com ([fe80::cb1a:2484:aef1:bc76%4]) with mapi id 15.20.6178.019; Fri, 10 Mar 2023 16:24:01 +0000 Message-ID: <59d00c3a-0ed8-f73a-68e0-70eb304a7d25@nvidia.com> Date: Fri, 10 Mar 2023 09:23:57 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: Re: [PATCH v2 2/4] DynamicTablesPkg: Add SMBIOS table dispatcher To: Sami Mujawar , "devel@edk2.groups.io" CC: Alexei Fedorov , Pierre Gondois , "abner.chang@amd.com" , "Jeff Brasen (jbrasen@nvidia.com)" , "ashishsingha@nvidia.com" , "nramirez@nvidia.com" , "wwatson@nvidia.com" , Matteo Carlini , Akanksha Jain , Ben Adderson , Samer El-Haj-Mahmoud , Jose Marinho , nd References: <20230308081626.33124-1-sami.mujawar@arm.com> <20230308081626.33124-3-sami.mujawar@arm.com> <1bf32de1-2aa2-c680-4760-bffa0da59adc@nvidia.com> <8FC92511-1E75-4C4B-91C7-9D252728C69E@arm.com> From: "Girish Mahadevan" In-Reply-To: <8FC92511-1E75-4C4B-91C7-9D252728C69E@arm.com> X-ClientProxiedBy: BL1PR13CA0231.namprd13.prod.outlook.com (2603:10b6:208:2bf::26) To CY5PR12MB6297.namprd12.prod.outlook.com (2603:10b6:930:22::19) Return-Path: gmahadevan@nvidia.com MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CY5PR12MB6297:EE_|SJ0PR12MB5407:EE_ X-MS-Office365-Filtering-Correlation-Id: 9fb68372-94c2-4846-1c0f-08db2183db7f X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: yxWQKzPkNjXTQoshiayBxZb+NDHY2rA0CFoLC+TOVZfKkZAQ9OfSJv9ylNLKhq0RHkrWkTHGJ38NCbYWAeavLg01581I/GeBWTn4s1BrJWSgoNPO2lTyUOfLEjH217izEax35103TxpGjvkrtB077zrWsAuhm/sAlCU435S+EfvTJslTrwnfWpvV4NOtHQOI/ZLFMCDxcxwTL3EX0KZRJUUyyfSim/BEZQwjVp/Nng3mjFfIglP/xZ9WaRfFv9TSZ8YkzMVwKovl1vRMR2rRpqO+A7dvzXXZSmJMRryXkTKnu+4M/d8jH0q3eLkJ/Qscr2PjE3iM1RvAxu3p9S1OUtvgyB8weqYrwtLkxtYOJMVN4XSZjdDTD9e1djsoH+e5XKWjkBPrTOsx3Wyv32GsyGnbsgB6hSI0+3VjhcC3SzasttYUlwT/mVozyA4ucJwhU2RDwV/YeTIvIIdunpchnfNl6B4FEmkK41TKD/jpOJgwlDVw/DGRHo/TqrSqHDDM+QFqFguzJLB3559prMCUo1CqkIwQvbCV0iZK6OIVcz2F5qUL99w1k4SW5mBWXYEsKVJEsyUJC2ziTX830hdfaGAOyeJf0faBRy0vCq4dmmiIuekrtlojGCIc8OtJfL8gbdASEnlE4hWdDDFNlrHq4bh0MHveDx2omdr4CSe3mZG4/AqT7gjBKCUaRMfebMMztdwxC9bGkmO7lySuCbr0Kw4N3klwBOPDYDXA6hgKsDw= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:CY5PR12MB6297.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230025)(4636009)(136003)(346002)(376002)(396003)(366004)(39860400002)(451199018)(31686004)(6666004)(83380400001)(36756003)(110136005)(45080400002)(54906003)(316002)(38100700002)(6486002)(2616005)(6512007)(6506007)(186003)(53546011)(26005)(966005)(7416002)(2906002)(478600001)(5660300002)(66476007)(66556008)(8676002)(4326008)(30864003)(66946007)(41300700001)(8936002)(31696002)(86362001)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?r6t7huWVQhRYfSNuKvOWzJMqXSp1urlx0/yFk7wxMAu2CBmM96YPdrUAprpp?= =?us-ascii?Q?x8TD4urDgeVgUkaJph/8q1fsCN4wolHTH84FY/3ykvz3tLci++ssA0bWSoI4?= =?us-ascii?Q?vf47kNiuTnCUu7LNNkBLO3z/phprL4Qum+Z/l/NdC7QHID8vPgWRaAd+6s28?= =?us-ascii?Q?rgNKAiaJNc0l8h+l7UN1mhLn5s9MyNtSt9msbzffRjSpPUsKKrEnwuaE59JE?= =?us-ascii?Q?hbT2BUQ2aTPofksFq4zoSFsA4/MsJCfRfz9oPIGykFPCOUnudtwCJZrPst6H?= =?us-ascii?Q?mC8CjEtTd8dxfANU59YVme8l+5MKzFqNRz+usynnRvqgp0myxh1VBUdxQE2+?= =?us-ascii?Q?mWST2uc7aqTld2nqo3fvZ5amqBwXBsdUdMKT5FNoTYQB4GSCcnUvm93o1aAS?= =?us-ascii?Q?yd6PcWOOIqVmqW/EiF5suHrvOi+PKz/UOOae/AXw20Hx3dUh3mNja2tRgqq3?= =?us-ascii?Q?ciWiOSBdjo4WbopjqbdYuvEq6cCqTj0g+f86jPlA+OpiiH8b+Vcx9RAe2ops?= =?us-ascii?Q?bCeNrmPxBuodI6Dnn5MBlZAxhVIja7S26F/omPD+/XIwHg+ccw+noNEGtuLD?= =?us-ascii?Q?oO/2G+XZXu8TEB23I5Xdlk/GhVCOgItrzsLExJG+qVMJd8OQJMUPuDYomnmP?= =?us-ascii?Q?gmFKBq3I1D/65UkbooKvgz/bYtz59aw2Xb54/OpEU4L5TBoaZibjldwOJZ7p?= =?us-ascii?Q?H/GhFEVcQ9Bq8wAttyxfqcNH43yVlpCVeNtsv3Di1+Yaa55E8IQ9gN7A4bt+?= =?us-ascii?Q?7l2thqAGfHY20WjR2VERuuuMBcToL6NRIeyDtGPEeh85pJ22CatWH0uiJc7X?= =?us-ascii?Q?rEWWh1I4XBK1gi4iV3oXJLzmlx/1/BRXglCYT8an2DQJvjCdEazj3YfEm6wA?= =?us-ascii?Q?m9w8WT5cwZ1QsWEAR7DYeritVeuyTQHPeiYzkvXcIUVIsl3puKapB6Bq4KRG?= =?us-ascii?Q?QFX5gYwEyZFTfvQ+kKMAIXR25bL6T9lsW4A/ONqdE9e7PwTv/CfDnIexUyIu?= =?us-ascii?Q?nKn+sqc5JpUCKZU7BKdxqFIHWq8g+d9WSTHBNPI7PPX+Z6X6RkDndGHVFaBC?= =?us-ascii?Q?g9Ziq3/pyOeNMR4K+N30ggAGtAqSni4o0WdwiPZRXBMxwmslgKOLkOfWZwWk?= =?us-ascii?Q?8wqTVoohRWyiCN4GSXUP/zi0MLawkK8UTgC7fCUmGiGPpMVebp6dPJFbQ2II?= =?us-ascii?Q?B2OIp7AP95jzKdW/PIgIjzLJ84b7DQ0WN7iM6bNrMvztieC1ZzyUDb+Tz7fa?= =?us-ascii?Q?bENgs42n8u3pJL+8yUcJsKFxv8tZJaD4u3qb43JnBk4nrk8FBL+kCkORp0H0?= =?us-ascii?Q?wcNpkbMcaEPtruqdIivGI+EXCEq8AjyGEFl1jUSo8Nrf+4B8MtIErfHjrOs2?= =?us-ascii?Q?9aZZy5gfjS/SGpMbNjnigEfHWNXrE9mR1RvkZySHFUGXJ9ODgPt8idt8JEgj?= =?us-ascii?Q?hkwWiYFv7711nn/Hd+/XXQNS78VFLh3A3SPEx42AvwK1cB+wWIqzce3I0IdP?= =?us-ascii?Q?cwdsv+eJgQbaPHCcZY6QPZJyvR7H8WusNUAvfhIJRJ4HGP6vk5g72FE7VPGa?= =?us-ascii?Q?vV/RavHNZgg6fP2HxycBGjy6oIaY7q4Ejxu35AUOTrT90Yt7pzE46pdxw0RL?= =?us-ascii?Q?GQ=3D=3D?= X-OriginatorOrg: Nvidia.com X-MS-Exchange-CrossTenant-Network-Message-Id: 9fb68372-94c2-4846-1c0f-08db2183db7f X-MS-Exchange-CrossTenant-AuthSource: CY5PR12MB6297.namprd12.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Mar 2023 16:24:01.3154 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 43083d15-7273-40c1-b7db-39efd9ccc17a X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: F21BMzZzRbgom2xXNyuN/3vWxgaG/oai6Jnjn8r7lSVDnWPSHxb127KBnmHfg2f/+XzkZ4iMFNwdjTHsT3YNbA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SJ0PR12MB5407 Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi Sami Response inline.[GM] Best Regards Girish On 3/9/2023 3:41 AM, Sami Mujawar wrote: > External email: Use caution opening links or attachments >=20 >=20 > Hi Girish, >=20 > Thank you for your feedback. >=20 > Please find my response inline marked [SAMI]. >=20 > Regards, >=20 > Sami Mujawar >=20 > =EF=BB=BFOn 08/03/2023, 17:41, "Girish Mahadevan" > wrote: >=20 >=20 > Hi Sami >=20 >=20 > Thanks for v2, I will apply these to my tree and test it out. > One small comment before I review/test the patch train inline (prefixed > by [GM]) >=20 >=20 > Best Regards > Girish >=20 >=20 > On 3/8/2023 1:16 AM, Sami Mujawar wrote: >> External email: Use caution opening links or attachments >> >> >> Some SMBIOS structure/table fields have dependency on other SMBIOS >> structures/tables. These dependencies are established using handles >> pointing to the dependent tables. >> >> A SMBIOS table handle can be obtained by either installing a SMBIOS >> table or by allocating a handle, which requires complex management >> to avoid any clashes. >> >> Obtaining a SMBIOS handle by installation requires that the dependent >> table is installed before the parent SMBIOS table can be installed. >> Therefore, introduce a SMBIOS table dispatcher that walks the SMBIOS >> dependency list and schedules the dependent tables to be installed >> before the parent table is installed. >> >> Signed-off-by: Sami Mujawar > >> Cc: Alexei Fedorov > >> Cc: Pierre Gondois > >> Cc: Girish Mahadevan > >> Cc: Jeff Brasen > >> Cc: Ashish Singhal > >> Cc: Nick Ramirez > >> Cc: William Watson > >> Cc: Abner Chang > >> Cc: Samer El-Haj-Mahmoud > >> Cc: Jose Marinho > >> --- >> >> Notes: >> v2: >> - Update dispatcher state machine to remove StUnknown. [SAMI] >> - Move extern function to header file and move debug [ABNER] >> code together. >> - Updated code based on review feedback to move extern [SAMI] >> function to header file and also moved the debug code >> together. >> Ref: https://nam11.safelinks.protection.outlook.com/?url=3Dhttps%3A%2F%2= Fedk2.groups.io%2Fg%2Fdevel%2Fmessage%2F95341&data=3D05%7C01%7Cgmahadevan%4= 0nvidia.com%7C57205f56a9f84d2470b408db208ade8b%7C43083d15727340c1b7db39efd9= ccc17a%7C0%7C0%7C638139553079754853%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjA= wMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata= =3DJab1Rf4UjvIJybcAXFAVXRZBxGaOQki%2BC1KxnPjaxGE%3D&reserved=3D0 >> >> DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManagerDxe.i= nf | 4 +- >> DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.c = | 282 ++++++++++++++++++++ >> DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatcher.h = | 159 +++++++++++ >> 3 files changed, 444 insertions(+), 1 deletion(-) >> >> diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTabl= eManagerDxe.inf b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTa= bleManagerDxe.inf >> index ad8b3d037c169ca848b5ea84fd1086b83f37876f..b09272d883c6f4f05eb03dcd= ab3efeda92b2fbb6 100644 >> --- a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManage= rDxe.inf >> +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/DynamicTableManage= rDxe.inf >> @@ -1,7 +1,7 @@ >> ## @file >> # Module that drives the table generation and installation process. >> # >> -# Copyright (c) 2017 - 2019, ARM Limited. All rights reserved. >> +# Copyright (c) 2017 - 2022, Arm Limited. All rights reserved. >> # >> # SPDX-License-Identifier: BSD-2-Clause-Patent >> ## >> @@ -22,6 +22,8 @@ [Defines] >> >> [Sources] >> DynamicTableManagerDxe.c >> + SmbiosTableDispatcher.c >> + SmbiosTableDispatcher.h >> >> [Packages] >> MdePkg/MdePkg.dec >> diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTable= Dispatcher.c b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableD= ispatcher.c >> new file mode 100644 >> index 0000000000000000000000000000000000000000..0e728538d9f6eb0b164fea3a= 160d3233db833f8d >> --- /dev/null >> +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatc= her.c >> @@ -0,0 +1,282 @@ >> +/** @file >> + Dynamic Smbios Table Dispatcher >> + >> + Copyright (c) 2022 - 2023, Arm Limited. All rights reserved. >> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> +#include >> +#include >> + >> +#include >> +#include >> + >> +/** >> + The SMBIOS dispatcher state table. >> + >> + The SMBIOS dispatcher state table is used to establish the dependency >> + order in which the SMBIOS tables are installed. This allows the SMBIOS >> + dispatcher to dispatch the dependent tables for installation before th= e >> + parent table is installed. >> + The SMBIOS_TABLE_DISPATCHER.Dependency[] field is used to establish th= e >> + dependency list. >> + Elements in the Dependency list are resolved by increasing index. Howe= ver, >> + all orders are equivalent as: >> + - the Parent SMBIOS table will only be installed once all dependencies >> + have been satisfied. >> + - no cyclic dependency is allowed. >> + The dependency list is terminated by SMTT_NULL. >> +*/ >> +STATIC >> +SMBIOS_TABLE_DISPATCHER mSmBiosDispatcher[MAX_SMBIOS_TABLES] =3D { >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_INFORMATION, SMTT_NULL, SMTT_NULL, = SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_INFORMATION, SMTT_NULL, SMTT_NULL= , SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BASEBOARD_INFORMATION, SMTT_NULL, SMTT_N= ULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_ENCLOSURE, SMTT_NULL, SMTT_NULL, = SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_INFORMATION, SMBIOS_TYPE_CACHE= _INFORMATION, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CONTROLLER_INFORMATION, SMTT_NULL= , SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_MODULE_INFORMATON, SMTT_NULL, SMT= T_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_CACHE_INFORMATION, SMTT_NULL, SMTT_NULL,= SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORT_CONNECTOR_INFORMATION, SMTT_NULL, S= MTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_SLOTS, SMTT_NULL, SMTT_NULL, SMTT= _NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICE_INFORMATION, SMTT_NULL, S= MTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OEM_STRINGS, SMTT_NULL, SMTT_NULL, SMTT_= NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, SMTT_NULL,= SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION, SMTT_NULL, SM= TT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_GROUP_ASSOCIATIONS, SMTT_NULL, SMTT_NULL= , SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_EVENT_LOG, SMTT_NULL, SMTT_NULL, = SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY, SMBIOS_TYPE_32BIT= _MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT= _NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE, SMBIOS_TYPE_PHYSICAL_MEMO= RY_ARRAY, SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMBIOS_TYPE_64BIT_MEM= ORY_ERROR_INFORMATION, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_32BIT_MEMORY_ERROR_INFORMATION, SMTT_NUL= L, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS, SMTT_NULL, = SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_DEVICE_MAPPED_ADDRESS, SMTT_NULL,= SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BUILT_IN_POINTING_DEVICE, SMTT_NULL, SMT= T_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PORTABLE_BATTERY, SMTT_NULL, SMTT_NULL, = SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_RESET, SMTT_NULL, SMTT_NULL, SMTT= _NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_HARDWARE_SECURITY, SMTT_NULL, SMTT_NULL,= SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_CONTROLS, SMTT_NULL, SMTT_N= ULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_VOLTAGE_PROBE, SMTT_NULL, SMTT_NULL, SMT= T_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_COOLING_DEVICE, SMTT_NULL, SMTT_NULL, SM= TT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TEMPERATURE_PROBE, SMTT_NULL, SMTT_NULL,= SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ELECTRICAL_CURRENT_PROBE, SMTT_NULL, SMT= T_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_OUT_OF_BAND_REMOTE_ACCESS, SMTT_NULL, SM= TT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_BOOT_INTEGRITY_SERVICE, SMTT_NULL, SMTT_= NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_BOOT_INFORMATION, SMTT_NULL, SMTT= _NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_64BIT_MEMORY_ERROR_INFORMATION, SMTT_NUL= L, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE, SMTT_NULL, SMTT_NULL,= SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_COMPONENT, SMTT_NULL, = SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_DEVICE_THRESHOLD_DATA, SMTT_N= ULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MEMORY_CHANNEL, SMTT_NULL, SMTT_NULL, SM= TT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_IPMI_DEVICE_INFORMATION, SMTT_NULL, SMTT= _NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_SYSTEM_POWER_SUPPLY, SMTT_NULL, SMTT_NUL= L, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ADDITIONAL_INFORMATION, SMTT_NULL, SMTT_= NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_ONBOARD_DEVICES_EXTENDED_INFORMATION, SM= TT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_MANAGEMENT_CONTROLLER_HOST_INTERFACE, SM= TT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_TPM_DEVICE, SMTT_NULL, SMTT_NULL, SMTT_N= ULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_PROCESSOR_ADDITIONAL_INFORMATION, SMTT_N= ULL, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_FIRMWARE_INVENTORY_INFORMATION, SMTT_NUL= L, SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL), >> + SMBIOS_TABLE_DEP (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION, SMTT_NULL, = SMTT_NULL, SMTT_NULL, SMTT_NULL, SMTT_NULL) >> +}; >> + >> +#if !defined (MDEPKG_NDEBUG) >> + >> +/** >> + A string table describing the SMBIOS dispatcher states. >> +*/ >> +STATIC >> +CONST CHAR8 *SmbiosTableStateTxt[] =3D { >> + "StNotPresent", >> + "StPresent", >> + "StDispatched" >> +}; >> + >> +/** >> + Print the SMBIOS Table Dispatcher state information. >> + >> + @param Verbose Print detailed report >> +**/ >> +STATIC >> +VOID >> +EFIAPI >> +PrintDispatcherStatus ( >> + IN BOOLEAN Verbose >> + ) >> +{ >> + UINTN Index; >> + >> + DEBUG ((DEBUG_VERBOSE, "Dispatcher Status:\n")); >> + for (Index =3D 0; Index < ARRAY_SIZE (mSmBiosDispatcher); Index++) { >> + if ((!Verbose) && (mSmBiosDispatcher[Index].State =3D=3D StNotPresent)= ) { >> + continue; >> + } >> + >> + DEBUG (( >> + DEBUG_VERBOSE, >> + "%02d: %10a [%02d, %02d, %02d, %02d, %02d]\n", >> + mSmBiosDispatcher[Index].TableType, >> + SmbiosTableStateTxt[mSmBiosDispatcher[Index].State], >> + mSmBiosDispatcher[Index].Dependency[0], >> + mSmBiosDispatcher[Index].Dependency[1], >> + mSmBiosDispatcher[Index].Dependency[2], >> + mSmBiosDispatcher[Index].Dependency[3], >> + mSmBiosDispatcher[Index].Dependency[4] >> + )); >> + } // for >> + >> + DEBUG ((DEBUG_VERBOSE, "\n")); >> +} >> + >> +#define DEBUG_PRINT_DISPATCHER_STATUS(Verbose) PrintDispatcherStatus (V= erbose) >> +#else >> +#define DEBUG_PRINT_DISPATCHER_STATUS(x) >> +#endif >> + >> +/** >> + Initialise the SMBIOS table dispatcher. >> + >> + @param SmbiosTableInfo Pointer to the list of SMBIOS tables to be inst= alled. >> + @param SmbiosTableCount Count of SMBIOS tables to be installed. >> +**/ >> +VOID >> +EFIAPI >> +InitSmbiosTableDispatcher ( >> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *SmbiosTableInfo, >> + IN UINT32 SmbiosTableCount >> + ) >> +{ >> + UINTN Index; >> + SMBIOS_TABLE_TYPE TableType; >> + >> + // Search for the list of SMBIOS tables presented >> + // for installation and update the dispatcher status. >> + for (Index =3D 0; Index < SmbiosTableCount; Index++) { >> + TableType =3D SmbiosTableInfo[Index].TableType; >> + ASSERT (mSmBiosDispatcher[TableType].State !=3D StPresent); >=20 >=20 > [GM] > This ASSERT will be hit even if we have multiple SMBIOS CM objects of > the same type which is legal (for e.g there are multiple tables for > type17/19 ) >=20 > [SAMI] The understanding is that SmbiosTableInfo[] will only contain one = entry for a given TableType as it is used to indicate which generators are = to be instantiated. >=20 > Following is the sequence of operations: > - The dispatcher is initialised in InitSmbiosTableDispatcher(), which wil= l set the mSmBiosDispatcher[].State to StPresent if SmbiosTable= Info[] contains a table of Table_Type. > - SmbiosTableInfo[] will only contain one entry for each table type, e.g.= even if there are multiple Type17/Type19 tables to be installed. This entr= y indicates that table(s) of Type17/Type19 is/are requested to be installed= and that the corresponding generator must be instantiated. > - Once the SMBIOS table generator is instantiated, it will then request f= or the object(s) of the required type from the Configuration Manager that a= re required to construct the table. > - The generator can then decide if multiple SMBIOS tables are to be const= ructed based on the objects returned by the Configuration Manager. e.g. if = multiple Cm_Type17_objects are returned then the corresponding number of Ty= pe17 tables will be built by the generator. >=20 > Therefore, I think we should not hit the above assert. >=20 [GM] That sounds right, I'd made a mistake when installing the CM objects. I should be installing one of each SMBIOS table so that=20 GetEStdObjSmbiosTableList gets the list of the available tables and each=20 generator should install multiple tables of a given type based on the=20 number of CM objects available. I did expand the existing SMBIOS factory code to install multiple tables. Thanks for the clarification. Best Regards Girish > However, the code that may need to change/extend is the call to BuildAndI= nstallSmbiosTable(). I am not sure if we need to indicate that there could = be multiple SMBIOS tables that may be installed. For now, BuildAndInstallSm= biosTable() implies that a generator of the specified type is to be instant= iated for building the SMBIOS table of the specified type. >=20 > Hope this clarifies the scenario and please do let me know if I am missin= g something. >=20 > Also, I have only tested this patch with simulated data and there may be = some issues that we may find when the full stack is integrated. > So, thank you for going through the patch in detail. >=20 > [SAMI] >=20 > Best Regards > Girish >=20 >=20 >> + mSmBiosDispatcher[TableType].State =3D StPresent; >> + } >> + >> + DEBUG_PRINT_DISPATCHER_STATUS (FALSE); >> +} >> + >> +/** Schedule the dispatch of a SMBIOS table. >> + >> + The SMBIOS dispatcher state table is used to establish the dependency >> + order in which the SMBIOS tables are installed. This allows the SMBIOS >> + dispatcher to dispatch the dependent tables for installation before th= e >> + parent table is installed. >> + The SMBIOS_TABLE_DISPATCHER.Dependency[] field is used to establish th= e >> + dependency list. >> + Elements in the Dependency list are resolved by increasing index. Howe= ver, >> + all orders are equivalent as: >> + - the Parent SMBIOS table will only be installed once all dependencies >> + have been satisfied. >> + - no cyclic dependency is allowed. >> + The dependency list is terminated by SMTT_NULL. >> + >> + @param [in] TableType The SMBIOS table type to schedule for >> + dispatch. >> + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol >> + interface. >> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager >> + Protocol Interface. >> + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. >> + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. >> + @param [in] SmbiosTableCount Count of SMBIOS table info objects. >> + >> + @retval EFI_SUCCESS Success. >> + @retval EFI_INVALID_PARAMETER A parameter is invalid. >> + @retval EFI_NOT_FOUND Required object is not found. >> + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager >> + is less than the Object size for the >> + requested object. >> +**/ >> +EFI_STATUS >> +EFIAPI >> +DispatchSmbiosTable ( >> + IN CONST SMBIOS_TABLE_TYPE TableType, >> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProto= col, >> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, >> + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, >> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, >> + IN CONST UINT32 SmbiosTableCount >> + ) >> +{ >> + EFI_STATUS Status; >> + UINTN Index; >> + SMBIOS_TABLE_DISPATCHER *Disp; >> + >> + DEBUG ((DEBUG_VERBOSE, "->DP %02d\n", TableType)); >> + Disp =3D &mSmBiosDispatcher[TableType]; >> + if (Disp->State =3D=3D StNotPresent) { >> + DEBUG ((DEBUG_VERBOSE, "<-DP %02d : EFI_NOT_FOUND\n", TableType)); >> + return EFI_NOT_FOUND; >> + } >> + >> + if (Disp->State =3D=3D StDispatched) { >> + DEBUG ((DEBUG_VERBOSE, "<-DP %02d : EFI_ALREADY_STARTED\n", TableType)= ); >> + return EFI_ALREADY_STARTED; >> + } >> + >> + // Table is present so check the dependency. >> + for (Index =3D 0; Index < MAX_SMBIOS_DEPENDENCY; Index++) { >> + // Check if the dependency list is terminated by SMTT_NULL. >> + if (Disp->Dependency[Index] =3D=3D SMTT_NULL) { >> + break; >> + } >> + >> + Status =3D DispatchSmbiosTable ( >> + Disp->Dependency[Index], >> + TableFactoryProtocol, >> + CfgMgrProtocol, >> + SmbiosProtocol, >> + SmbiosTableInfo, >> + SmbiosTableCount >> + ); >> + if (EFI_ERROR (Status)) { >> + if ((Status =3D=3D EFI_ALREADY_STARTED) || (Status =3D=3D EFI_NOT_FOUN= D)) { >> + // Some dependencies may already be satisfied >> + // as other tables may also have similar >> + // dependencies i.e. EFI_ALREADY_STARTED >> + // Or >> + // the dependent table may be optional >> + // and not provided i.e. EFI_NOT_FOUND. >> + continue; >> + } >> + >> + DEBUG ((DEBUG_VERBOSE, "<-DP %02d : Status =3D %d\n", TableType, Statu= s)); >> + return Status; >> + } >> + } >> + >> + DEBUG ((DEBUG_VERBOSE, "DP %02d : Status =3D %d\n", TableType, Status)= ); >> + >> + // All dependencies satisfied - Install SMBIOS table >> + Disp->State =3D StDispatched; >> + // Find the SMBIOS table info matching the TableType >> + for (Index =3D 0; Index < SmbiosTableCount; Index++) { >> + if (SmbiosTableInfo[Index].TableType =3D=3D TableType) { >> + break; >> + } >> + } >> + >> + Status =3D BuildAndInstallSmbiosTable ( >> + TableFactoryProtocol, >> + CfgMgrProtocol, >> + SmbiosProtocol, >> + &SmbiosTableInfo[Index] >> + ); >> + if (EFI_ERROR (Status)) { >> + DEBUG (( >> + DEBUG_ERROR, >> + "ERROR: Failed to install SMBIOS Table." \ >> + " Id =3D %u Status =3D %r\n", >> + SmbiosTableInfo[Index].TableGeneratorId, >> + Status >> + )); >> + } >> + >> + DEBUG_PRINT_DISPATCHER_STATUS (FALSE); >> + DEBUG ((DEBUG_VERBOSE, "<-DP %0d\n", TableType)); >> + return Status; >> +} >> diff --git a/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTable= Dispatcher.h b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableD= ispatcher.h >> new file mode 100644 >> index 0000000000000000000000000000000000000000..d59eab4223c142293bdaf490= 5588f08e7a4a467f >> --- /dev/null >> +++ b/DynamicTablesPkg/Drivers/DynamicTableManagerDxe/SmbiosTableDispatc= her.h >> @@ -0,0 +1,159 @@ >> +/** @file >> + >> + Copyright (c) 2022 - 2023, Arm Limited. All rights reserved. >> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#ifndef SMBIOS_TABLE_DISPATCHER_H_ >> +#define SMBIOS_TABLE_DISPATCHER_H_ >> + >> +#include >> +#include >> + >> +/** >> + A SMBIOS Table Type from the OEM range reserved for terminating >> + the SMBIOS table dispatch dependency. >> + >> + Note: According to the SMBIOS specification, Table Types 0 >> + through 127 (7Fh) are reserved for and defined by the >> + SMBIOS specification. >> + Types 128 through 256 (80h to FFh) are available for system and >> + OEM-specific information. >> + >> + This Dynamic SMBIOS table generation implementation defines >> + TableType FFh as a NULL table which is used by the Dynamic >> + SMBIOS table dispatcher to terminate the dependency list. >> +*/ >> +#define SMTT_NULL 0xFF >> + >> +/** >> + A macro defining the maximum number of dependendant SMBIOS tables >> + represented by the SMBIOS table dispatcher. >> +*/ >> +#define MAX_SMBIOS_DEPENDENCY 5 >> + >> +/** >> + A macro defining the maximum table types handled by the SMBIOS >> + table dispatcher. >> +*/ >> +#define MAX_SMBIOS_TABLES (SMBIOS_TYPE_STRING_PROPERTY_INFORMATION + 1) >> + >> +/** >> + A helper macro to populate the SMBIOS table dispatcher table >> +*/ >> +#define SMBIOS_TABLE_DEP(TableId, Dep1, Dep2, Dep3, Dep4, Dep5) \ >> + { \ >> + TableId, \ >> + StNotPresent, \ >> + { Dep1, Dep2, Dep3, Dep4, Dep5 } \ >> + } >> + >> +/** >> + An enum describing the states of the SMBIOS table dispatcher. >> +*/ >> +typedef enum SmbiosTableState { >> + StNotPresent, ///< SMBIOS table is not present for installation. >> + StPresent, ///< SMBIOS table is present for installation. >> + StDispatched ///< SMBIOS table generators have been dispatched. >> +} SMBIOS_TABLE_STATE; >> + >> +/** >> + A structure describing the dependencies for a SMBIOS table and >> + the dispatcher state information. >> +*/ >> +typedef struct SmBiosTableDispatcher { >> + /// SMBIOS Structure/Table Type >> + SMBIOS_TABLE_TYPE TableType; >> + /// SMBIOS dispatcher state >> + SMBIOS_TABLE_STATE State; >> + /// SMBIOS Structure/Table dependency list >> + /// The list is terminated using SMTT_NULL. >> + SMBIOS_TABLE_TYPE Dependency[MAX_SMBIOS_DEPENDENCY]; >> +} SMBIOS_TABLE_DISPATCHER; >> + >> +/** >> + A helper function to build and install a SMBIOS table. >> + >> + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol >> + interface. >> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager >> + Protocol Interface. >> + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. >> + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. >> + >> + @retval EFI_SUCCESS Success. >> + @retval EFI_INVALID_PARAMETER A parameter is invalid. >> + @retval EFI_NOT_FOUND Required object is not found. >> + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager >> + is less than the Object size for the >> + requested object. >> +**/ >> +extern >> +EFI_STATUS >> +EFIAPI >> +BuildAndInstallSmbiosTable ( >> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProto= col, >> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, >> + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, >> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo >> + ); >> + >> +/** >> + Initialise the SMBIOS table dispatcher. >> + >> + @param SmbiosTableInfo Pointer to the list of SMBIOS tables to be inst= alled. >> + @param SmbiosTableCount Count of SMBIOS tables to be installed. >> +**/ >> +VOID >> +EFIAPI >> +InitSmbiosTableDispatcher ( >> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *SmbiosTableInfo, >> + IN UINT32 SmbiosTableCount >> + ); >> + >> +/** Schedule the dispatch of a SMBIOS table. >> + >> + The SMBIOS dispatcher state table is used to establish the dependency >> + order in which the SMBIOS tables are installed. This allows the SMBIOS >> + dispatcher to dispatch the dependent tables for installation before th= e >> + parent table is installed. >> + The SMBIOS_TABLE_DISPATCHER.Dependency[] field is used to establish th= e >> + dependency list. >> + Elements in the Dependency list are resolved by increasing index. Howe= ver, >> + all orders are equivalent as: >> + - the Parent SMBIOS table will only be installed once all dependencies >> + have been satisfied. >> + - no cyclic dependency is allowed. >> + The dependency list is terminated by SMTT_NULL. >> + >> + @param [in] TableType The SMBIOS table type to schedule for >> + dispatch. >> + @param [in] TableFactoryProtocol Pointer to the Table Factory Protocol >> + interface. >> + @param [in] CfgMgrProtocol Pointer to the Configuration Manager >> + Protocol Interface. >> + @param [in] SmbiosProtocol Pointer to the SMBIOS protocol. >> + @param [in] SmbiosTableInfo Pointer to the SMBIOS table Info. >> + @param [in] SmbiosTableCount Count of SMBIOS table info objects. >> + >> + @retval EFI_SUCCESS Success. >> + @retval EFI_INVALID_PARAMETER A parameter is invalid. >> + @retval EFI_NOT_FOUND Required object is not found. >> + @retval EFI_BAD_BUFFER_SIZE Size returned by the Configuration Manager >> + is less than the Object size for the >> + requested object. >> +**/ >> +EFI_STATUS >> +EFIAPI >> +DispatchSmbiosTable ( >> + IN CONST SMBIOS_TABLE_TYPE TableType, >> + IN CONST EDKII_DYNAMIC_TABLE_FACTORY_PROTOCOL *CONST TableFactoryProto= col, >> + IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CONST CfgMgrProtocol, >> + IN EFI_SMBIOS_PROTOCOL *SmbiosProtocol, >> + IN CM_STD_OBJ_SMBIOS_TABLE_INFO *CONST SmbiosTableInfo, >> + IN CONST UINT32 SmbiosTableCount >> + ); >> + >> +#endif // SMBIOS_TABLE_DISPATCHER_H_ >> -- >> 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' >> >=20 >=20 >=20