:p
atchew
Login
From: Abner Chang <abner.chang@amd.com> edk2 ManageabilityPkg is introduced to provide edk2 drivers and libraries for industry platform management standards, such as PLDM (Platform Level Data Model), MCTP (Management Component Transfer Protocol), IPMI (Intelligent Platform Management Interface) and others. The framework of ManageabilityPkg is designed to flexibly support the transport interfaces for above industry standards, the transport interfaces such as KCS or I2C for IPMI, PCI VDM (Vendor Defined Message), I2C or KCS for MCTP, or the OEM proprietary transports. Please check the Readme file for the design guidance: https://github.com/changab/edk2-platforms/blob/Manageability_IPMI_upstream/Features/ManageabilityPkg/Readme.md In this version we had implemented, - KCS manageability transport library - Manageability library helper library - IPMI PEI/DXE/SMM protocol implementations Next upstream would be edk2 MCTP_PROTOCOL implementation that also consumes the manageability transport libraries. Abner Chang (8): ManageabilityPkg: Add Readme file ManageabilityPkg: Initial package ManageabilityPkg: Add NULL ManageabilityTransportLib ManageabilityPkg: Add ManageabilityTransportHelperLib ManageabilityPkg/ManageabilityTransportKcsLib ManageabilityPkg: Implement Ipmi Protocol/Ppi ManageabilityPkg: Add IpmiProtocol to Manageability Package edk2-platforms: Maintainers.txt .../ManageabilityPkg/ManageabilityPkg.dec | 48 ++ .../Include/Dsc/Manageability.dsc | 25 + .../ManageabilityPkg/ManageabilityPkg.dsc | 45 ++ .../BaseManageabilityTransportHelper.inf | 40 + .../BaseManageabilityTransportNull.inf | 28 + .../Dxe/DxeManageabilityTransportKcs.inf | 44 + .../IpmiProtocol/Dxe/IpmiProtocolDxe.inf | 50 ++ .../Universal/IpmiProtocol/Pei/IpmiPpiPei.inf | 51 ++ .../IpmiProtocol/Smm/IpmiProtocolSmm.inf | 52 ++ .../Library/ManageabilityTransportHelperLib.h | 93 +++ .../Library/ManageabilityTransportIpmiLib.h | 24 + .../Library/ManageabilityTransportLib.h | 335 ++++++++ .../Common/ManageabilityTransportKcs.h | 106 +++ .../IpmiProtocol/Common/IpmiProtocolCommon.h | 108 +++ .../BaseManageabilityTransportHelper.c | 242 ++++++ .../BaseManageabilityTransportNull.c | 64 ++ .../Common/KcsCommon.c | 480 +++++++++++ .../Dxe/ManageabilityTransportKcs.c | 375 +++++++++ .../IpmiProtocol/Common/IpmiProtocolCommon.c | 245 ++++++ .../Universal/IpmiProtocol/Dxe/IpmiProtocol.c | 177 +++++ .../Universal/IpmiProtocol/Pei/IpmiPpi.c | 151 ++++ .../Universal/IpmiProtocol/Smm/IpmiProtocol.c | 147 ++++ Features/ManageabilityPkg/Readme.md | 177 +++++ .../Media/ManageabilityDriverStack.svg | 752 ++++++++++++++++++ .../BaseManageabilityTransportHelper.uni | 13 + .../BaseManageabilityTransportNull.uni | 13 + .../Dxe/ManageabilityTransportKcs.uni | 13 + Maintainers.txt | 11 +- .../Library/RiscVOpensbiLib/opensbi | 2 +- 29 files changed, 3908 insertions(+), 3 deletions(-) create mode 100644 Features/ManageabilityPkg/ManageabilityPkg.dec create mode 100644 Features/ManageabilityPkg/Include/Dsc/Manageability.dsc create mode 100644 Features/ManageabilityPkg/ManageabilityPkg.dsc create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm.inf create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelperLib.h create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportIpmiLib.h create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.h create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.c create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.c create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c create mode 100644 Features/ManageabilityPkg/Readme.md create mode 100644 Features/ManageabilityPkg/Documents/Media/ManageabilityDriverStack.svg create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.uni create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.uni create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.uni -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100671): https://edk2.groups.io/g/devel/message/100671 Mute This Topic: https://groups.io/mt/97357738/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> Add Readme file of edk2 platform ManageabilityPkg. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> Cc: Abdul Lateef Attar <abdattar@amd.com> --- Features/ManageabilityPkg/Readme.md | 177 +++++ .../Media/ManageabilityDriverStack.svg | 752 ++++++++++++++++++ 2 files changed, 929 insertions(+) create mode 100644 Features/ManageabilityPkg/Readme.md create mode 100644 Features/ManageabilityPkg/Documents/Media/ManageabilityDriverStack.svg diff --git a/Features/ManageabilityPkg/Readme.md b/Features/ManageabilityPkg/Readme.md new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Readme.md @@ -XXX,XX +XXX,XX @@ +# EDK2 Manageability Package + +edk2 ManageabilityPkg is introduced to provide edk2 drivers and +libraries for industry platform management standards, such as PLDM (Platform +Level Data Model), MCTP (Management Component Transfer Protocol), IPMI +(Intelligent Platform Management Interface) and others. The framework of +ManageabilityPkg is designed to flexibly support the transport interfaces for above +industry standards, the transport interfaces such as KCS or I2C for IPMI, PCI VDM +(Vendor Defined Message), I2C or KCS for MCTP, or the OEM proprietary transports. + +Below figure shows the driver stacks which are abstracted to support disparate +transports for specifications of platform management. +![Manageability Package Driver Stack](https://github.com/changab/edk2-platforms/blob/Manageability_IPMI_upstream/Features/ManageabilityPkg/Documents/Media/ManageabilityDriverStack.svg) + +## Manageability Transport edk2 Driver Stack +edk2 manageability transport library is designed to incorporated with disparate +manageability protocols. In order to flexibly facilitating the transport +functionalities, below functions must be provided by manageability transport +library to compliant with the framework of ManageabilityPkg design. + +* ### ***AcquireTransportSession()*** + edk2 manageability protocol driver invokes this function to acquire the + transport session to transmit manageability packet. The implementation + could reset the transport interface, initial the transport interface + internal structure and the [Manageability Transport Function Structure](#manageability-transport-function-structure). + The [Transport Token](#transfer-token) is returned to the caller for further manageability packet + transmit and receive. + + +* ### ***GetTransportCapability()*** + edk2 Manageability protocol driver invokes this function to get the capabilities + of transport interface. The implementation of manageability transport library + can optionally support advanced features such as multi-sessions on transport + interface or asynchronous transfer. + +* ### ***ReleaseTransportSession()*** + edk2 manageability protocol driver invokes this function to release the transport + session. + + ### **Manageability Transport Function Structure** + + Below is the function structure initiated by the manageability transport library and + returned in the transport token when caller invokes [AcquireTransportSession](#acquiretransportsession) + function. + + + ***MANAGEABILITY_TRANSPORT_FUNCTION*** is declared as an union to accommodate + different versions of transport function set. This allows the function added to + support the new functionalities in the future and also keep the backward compatibility. + Developers can not modify the previous version of function structure, instead + developers can create a new function structure with the increased version number + that includes the previous version of function set and new added functions. + +``` + typedef union { + MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 *Version1_0; + } MANAGEABILITY_TRANSPORT_FUNCTION; + + struct _MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 { + MANAGEABILITY_TRANSPORT_INIT TransportInit; + MANAGEABILITY_TRANSPORT_STATUS TransportStatus; + MANAGEABILITY_TRANSPORT_RESET TransportReset; + MANAGEABILITY_TRANSPORT_TRANSMIT_RECEIVE TransportTransmitReceive; + }; +``` +* ***TransportInit()*** + + Manageability protocol driver invokes this function to initial the transport + interface with the optional hardware configuration of the transport interface. + Whether the transport interface requires initialization or not depends on the + transport interface characteristics. The hardware information is optional passed to + this function if the manageability protocol driver would like to use the different + hardware configuration of transport interface. For example, the different I/O + address of KCS interface, or the memory mapped I/O KCS interface. The structure + format of hardware information is created according to the hardware design of + transport interface. + +* ***TransportStatus()*** + + Manageability protocol driver invokes this function to get the status of transport + interface. How does this function report the status depends on the transport + interface characteristics and the implementation of this function. + +* ***TransportReset()*** + + Manageability protocol driver can invoke this function to reset and recover the + transport interface in case the error status is reported by the transport + interface. Whether the transport interface can be reset or not depends on the + transport interface characteristics and the implementation of this function. + +* ***TransportTransmitReceive()*** + Manageability protocol driver invokes this function to transmit and/or receive the + packet. Caller has to setup the [Transfer Token](#transfer-token) when invoke to + this function. + + ### **Transfer Token** + +``` + struct _MANAGEABILITY_TRANSFER_TOKEN { + EFI_EVENT ReceiveEvent; + MANAGEABILITY_TRANSPORT_HEADER TransmitHeader; + MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer; + MANAGEABILITY_TRANSMIT_PACKAGE TransmitPackage; + MANAGEABILITY_RECEIVE_PACKAGE ReceivePackage; + EFI_STATUS TransferStatus; + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; +}; +``` + +* ***ReceiveEvent*** + + The optional EFI event is created to wait for the signal of response data + readiness. The parameter is valid only if the transport interface supports + asynchronous transfer. MANAGEABILITY_TRANSPORT_CAPABILITY_ASYNCHRONOUS_TRANSFER bit + must be set in the returned *TransportCapability* parameter in + [GetTransportCapability()](#gettransportcapability) to indicate the + transport interface is capable for asynchronous transfer. + +* ***TransmitHeader*** + + The transmit header is different according to the disparate transport interfaces + for the manageability protocol. For example, the transmit header is different when + MCTP packet is transmitted over I2C and KCS. Having this header abstracted from + manageability transport library to make the transport implementation agnostic to the + manageability protocol specification. + +* ***TransmitTrailer*** + + The transmit trailer may be different according to the disparate transport + interface for the manageability protocol. Having this header abstracted from + manageability transport library to make the transport implementation agnostic to the + manageability protocol specification. + +* ***TransmitPackage*** + + The buffer of packet to transmit, this could be a value of NULL if the manageability + protocol is going to harvest the datagram sent by the management entity. + +* ***ReceivePackage*** + + The receive buffer, this could be a value of NULL if the manageability + protocol is going to send the request to management endpoint which has no response + required. + +* ***TransferStatus*** + + In order to support both synchronous and asynchronous transfer with a unified + function, ***TransportTransmitReceive()*** is designed as a + non return value function. Instead, the status of transmit/receive is returned + in the transfer token. When the asynchronous transfer, manageability transport + library has to set the status in transfer token before signal ***ReceiveEvent***. + +* ***TransportAdditionalStatus*** + + The additional transport status after the transfer. + +## Industry Standard Manageability Protocol edk2 Driver Stack +The edk2 implementation of industry manageability standards such as IpmiProtocol and +MctpProtocol abstract the command layer and provide the unified protocol interface to +build up the manageability packet for subordinate specifications. edk2 manageability +protocol driver is linked with desired manageability transport library base on the +platform design. + +## Transport Implementation + + The manageability transport library could have the implementation in library or + invoke the existing edk2 protocol which is defined in UEFI or PI specifications. + This is the implementation decision made by the developer when introduce a new + manageability transport library. + +## Build the Manageability Package +In order to use the modules provided by ManageabilityPkg, **PACKAGES_PATH** must +contains the path to point to [edk2-platform Features](https://github.com/tianocore/edk2-platforms/tree/master/Features): + +``` +$ export PACKAGES_PATH=$PWD/edk2:$PWD/edk2-platforms:$PWD/edk2-platforms/Features +``` diff --git a/Features/ManageabilityPkg/Documents/Media/ManageabilityDriverStack.svg b/Features/ManageabilityPkg/Documents/Media/ManageabilityDriverStack.svg new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Documents/Media/ManageabilityDriverStack.svg @@ -XXX,XX +XXX,XX @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.2" width="355.6mm" height="215.9mm" viewBox="0 0 35560 21590" preserveAspectRatio="xMidYMid" fill-rule="evenodd" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:presentation="http://sun.com/xmlns/staroffice/presentation" xmlns:smil="http://www.w3.org/2001/SMIL20/" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xml:space="preserve"> + <defs class="ClipPathGroup"> + <clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse"> + <rect x="0" y="0" width="35560" height="21590"/> + </clipPath> + <clipPath id="presentation_clip_path_shrink" clipPathUnits="userSpaceOnUse"> + <rect x="35" y="21" width="35489" height="21547"/> + </clipPath> + </defs> + <defs> + <font id="EmbeddedFont_1" horiz-adv-x="2048"> + <font-face font-family="Arial embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1852" descent="423"/> + <missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/> + <glyph unicode="•" horiz-adv-x="530" d="M 109,718 C 109,788 134,848 184,897 233,946 293,971 362,971 432,971 492,946 542,897 591,848 616,788 616,718 616,648 591,588 542,539 492,489 432,464 362,464 293,464 233,489 184,539 134,588 109,648 109,718 Z"/> + </font> + </defs> + <defs> + <font id="EmbeddedFont_2" horiz-adv-x="2048"> + <font-face font-family="Calibri embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1535" descent="503"/> + <missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/> + <glyph unicode="y" horiz-adv-x="875" d="M 563,0 L 443,-331 C 439,-342 429,-350 413,-355 396,-361 371,-364 338,-364 321,-364 307,-363 296,-361 285,-360 277,-357 272,-353 266,-349 263,-344 262,-337 261,-330 263,-322 267,-313 L 391,0 C 385,3 379,7 374,13 369,19 365,25 363,32 L 42,892 C 37,906 34,917 34,925 34,933 37,939 42,944 47,949 56,952 68,954 80,955 96,956 116,956 136,956 152,956 163,955 174,954 183,952 190,949 197,946 202,943 205,938 208,933 211,926 214,917 L 471,195 474,195 722,921 C 726,934 731,942 737,946 742,949 751,952 762,954 773,955 790,956 811,956 830,956 845,955 857,954 869,952 878,949 884,944 889,939 892,933 892,925 892,917 890,907 886,895 L 563,0 Z"/> + <glyph unicode="v" horiz-adv-x="875" d="M 891,927 C 891,924 891,922 891,919 890,916 890,912 889,909 888,906 888,902 887,898 886,894 884,890 883,885 L 576,30 C 573,23 570,17 566,12 561,7 555,4 546,1 537,-2 526,-3 513,-4 500,-5 483,-6 463,-6 443,-6 426,-5 413,-4 400,-3 389,-1 381,2 372,5 366,8 361,13 356,18 353,23 350,30 L 44,885 C 41,893 39,900 38,906 36,912 35,917 35,920 34,923 34,925 34,927 34,932 35,937 38,941 41,945 45,948 52,951 58,953 66,954 77,955 87,956 100,956 115,956 134,956 150,956 162,955 173,954 182,952 189,949 195,946 200,943 203,939 206,935 208,930 211,924 L 465,182 469,170 472,182 723,924 C 724,930 727,935 730,939 733,943 738,946 745,949 751,952 760,954 771,955 782,956 796,956 814,956 829,956 842,956 852,955 862,954 870,953 876,950 881,947 885,944 888,941 890,937 891,932 891,927 Z"/> + <glyph unicode="u" horiz-adv-x="795" d="M 924,25 C 924,20 923,15 921,12 918,8 914,5 908,2 902,-1 894,-3 885,-4 875,-5 863,-6 849,-6 834,-6 821,-5 812,-4 802,-3 794,-1 789,2 783,5 779,8 777,12 775,15 774,20 774,25 L 774,144 C 723,87 672,46 622,20 572,-6 521,-19 470,-19 410,-19 360,-9 319,11 278,31 244,58 219,93 194,127 176,167 165,213 154,258 148,314 148,379 L 148,925 C 148,930 149,935 152,939 154,942 158,946 165,949 172,952 180,954 191,955 202,956 215,956 231,956 247,956 260,956 271,955 282,954 290,952 297,949 303,946 307,942 310,939 313,935 314,930 314,925 L 314,401 C 314,348 318,306 326,275 333,243 345,216 361,194 376,171 396,154 420,142 444,129 472,123 504,123 545,123 587,138 628,167 669,196 712,239 758,296 L 758,925 C 758,930 759,935 762,939 764,942 768,946 775,949 782,952 790,954 801,955 811,956 824,956 841,956 857,956 870,956 881,955 892,954 900,952 906,949 912,946 917,942 920,939 923,935 924,930 924,925 L 924,25 Z"/> + <glyph unicode="t" horiz-adv-x="610" d="M 621,91 C 621,72 620,56 617,45 614,34 610,25 605,20 600,15 592,10 581,5 570,0 558,-3 545,-6 531,-9 516,-12 501,-14 486,-16 470,-17 455,-17 408,-17 368,-11 335,2 302,14 274,33 253,58 232,83 216,114 207,153 197,191 192,236 192,288 L 192,814 66,814 C 56,814 48,819 42,830 36,841 33,858 33,882 33,895 34,905 36,914 37,923 39,930 42,936 45,941 48,945 53,948 57,950 62,951 67,951 L 192,951 192,1165 C 192,1170 193,1174 196,1178 198,1182 202,1186 209,1189 215,1192 223,1194 234,1195 245,1196 258,1197 274,1197 291,1197 304,1196 315,1195 326,1194 334,1192 340,1189 346,1186 350,1182 353,1178 356,1174 357,1170 357,1165 L 357,951 588,951 C 593,951 598,950 602,948 606,945 610,941 613,936 616,930 618,923 619,914 620,905 621,895 621,882 621,858 618,841 612,830 606,819 598,814 588,814 L 357,814 357,312 C 357,250 366,203 385,172 403,140 436,124 483,124 498,124 512,126 524,129 536,132 547,135 556,138 565,141 573,145 580,148 587,151 593,152 598,152 601,152 605,151 608,150 611,148 613,145 615,140 616,135 618,129 619,121 620,113 621,103 621,91 Z"/> + <glyph unicode="s" horiz-adv-x="636" d="M 718,270 C 718,224 710,183 693,147 676,111 651,81 620,56 589,31 551,13 508,0 465,-13 417,-19 365,-19 333,-19 303,-16 274,-11 245,-6 219,0 196,8 173,15 153,23 137,32 121,40 109,47 102,54 95,61 89,70 86,82 83,94 81,110 81,131 81,144 82,154 83,163 84,172 86,179 88,184 90,189 93,193 97,196 100,198 104,199 109,199 116,199 127,195 142,186 156,177 174,167 195,156 216,145 240,136 269,127 298,118 331,113 368,113 396,113 421,116 444,122 467,128 486,137 503,149 520,160 533,175 542,193 551,211 555,232 555,257 555,282 549,304 536,321 523,338 505,354 484,367 463,380 439,392 412,403 385,413 358,424 330,435 301,446 274,459 247,474 220,488 195,505 174,526 153,547 136,571 123,600 110,629 103,663 103,703 103,738 110,772 124,805 137,837 158,865 185,890 212,914 247,933 288,948 329,963 376,970 431,970 455,970 479,968 503,964 527,960 549,955 568,949 587,943 604,937 618,930 631,923 642,916 649,911 656,906 660,901 663,897 665,893 667,889 668,884 669,879 670,872 671,865 672,858 672,849 672,838 672,827 672,817 671,809 670,800 668,793 666,788 663,783 660,779 657,777 654,774 650,773 646,773 640,773 631,777 620,784 609,791 594,799 576,808 558,816 537,824 513,831 488,838 460,842 429,842 401,842 376,839 355,833 334,826 316,817 303,806 289,794 279,780 272,764 265,748 261,731 261,712 261,686 268,664 281,647 294,629 312,613 333,600 354,587 379,575 406,564 433,553 461,542 490,531 518,520 546,507 574,493 601,479 626,462 647,442 668,422 686,398 699,370 712,342 718,309 718,270 Z"/> + <glyph unicode="r" horiz-adv-x="557" d="M 679,866 C 679,851 679,839 678,829 677,819 676,811 674,806 672,800 670,796 667,793 664,790 659,788 654,788 649,788 642,790 635,793 627,796 618,799 609,802 599,805 588,807 576,810 564,813 551,814 537,814 520,814 504,811 488,804 472,797 455,786 438,771 420,756 401,735 382,710 363,685 341,654 318,617 L 318,25 C 318,20 317,15 314,12 311,8 307,5 301,2 295,-1 287,-3 276,-4 265,-5 252,-6 235,-6 219,-6 206,-5 195,-4 184,-3 176,-1 170,2 163,5 159,8 157,12 154,15 153,20 153,25 L 153,925 C 153,930 154,935 156,939 158,942 162,946 168,949 174,952 182,954 191,955 200,956 213,956 228,956 243,956 255,956 265,955 274,954 282,952 287,949 292,946 296,942 299,939 301,935 302,930 302,925 L 302,794 C 327,830 350,859 372,882 393,905 414,923 433,936 452,949 472,958 491,963 510,968 529,970 548,970 557,970 567,970 578,969 589,968 600,966 612,963 624,960 635,957 645,954 654,951 661,947 665,944 669,941 672,938 673,935 674,932 676,928 677,923 678,918 678,912 679,903 679,894 679,881 679,866 Z"/> + <glyph unicode="p" horiz-adv-x="848" d="M 981,489 C 981,410 973,340 956,277 939,214 914,161 881,118 848,74 807,40 758,17 709,-7 654,-19 591,-19 564,-19 540,-16 517,-11 494,-6 472,3 451,14 429,25 407,40 386,57 365,74 342,95 318,118 L 318,-332 C 318,-337 317,-342 314,-346 311,-350 307,-353 301,-356 295,-359 287,-361 276,-362 265,-363 252,-364 235,-364 219,-364 206,-363 195,-362 184,-361 176,-359 170,-356 163,-353 159,-350 157,-346 154,-342 153,-337 153,-332 L 153,925 C 153,931 154,936 156,940 158,943 162,946 168,949 174,952 182,954 191,955 200,956 212,956 225,956 239,956 251,956 260,955 269,954 276,952 282,949 288,946 292,943 295,940 297,936 298,931 298,925 L 298,804 C 325,832 352,856 377,877 402,898 428,915 454,929 479,942 506,953 533,960 560,967 588,970 618,970 683,970 739,957 785,932 831,907 869,872 898,828 927,784 948,733 961,675 974,616 981,554 981,489 Z M 810,470 C 810,516 806,561 799,604 792,647 780,685 763,718 746,751 723,778 694,798 665,818 630,828 587,828 565,828 544,825 523,819 502,812 481,802 460,789 438,775 416,757 392,735 369,712 344,685 318,652 L 318,294 C 364,239 407,196 448,167 489,138 532,123 577,123 618,123 654,133 684,153 714,173 738,200 756,233 775,266 788,304 797,345 806,386 810,428 810,470 Z"/> + <glyph unicode="o" horiz-adv-x="927" d="M 990,485 C 990,412 980,344 961,283 942,221 913,168 875,123 836,78 788,44 731,19 673,-6 606,-19 530,-19 456,-19 392,-8 337,14 282,36 236,68 199,110 162,152 135,203 117,263 99,323 90,391 90,467 90,540 100,608 119,670 138,731 166,784 205,829 243,874 291,908 348,933 405,958 472,970 549,970 623,970 688,959 743,937 798,915 843,883 880,841 917,799 944,748 963,688 981,628 990,560 990,485 Z M 819,474 C 819,523 814,569 805,612 796,655 781,693 760,726 740,759 711,785 676,804 640,823 596,832 543,832 493,832 451,823 416,806 381,789 351,764 329,733 306,701 289,663 278,620 267,577 261,529 261,478 261,429 266,382 275,339 284,296 299,258 320,226 341,193 370,168 405,149 441,130 485,120 538,120 587,120 629,129 665,146 700,163 730,188 752,219 775,250 792,288 803,331 814,374 819,422 819,474 Z"/> + <glyph unicode="n" horiz-adv-x="795" d="M 928,25 C 928,20 927,15 924,12 921,8 917,5 911,2 905,-1 897,-3 886,-4 875,-5 862,-6 846,-6 829,-6 816,-5 805,-4 794,-3 786,-1 780,2 774,5 770,8 767,12 764,15 763,20 763,25 L 763,552 C 763,603 759,645 751,676 743,707 731,734 716,757 701,780 681,797 657,809 632,821 604,827 572,827 531,827 489,812 448,783 407,754 363,711 318,654 L 318,25 C 318,20 317,15 314,12 311,8 307,5 301,2 295,-1 287,-3 276,-4 265,-5 252,-6 235,-6 219,-6 206,-5 195,-4 184,-3 176,-1 170,2 163,5 159,8 157,12 154,15 153,20 153,25 L 153,925 C 153,930 154,935 156,939 158,942 162,946 168,949 174,952 182,954 191,955 200,956 213,956 228,956 243,956 255,956 265,955 274,954 282,952 287,949 292,946 296,942 299,939 301,935 302,930 302,925 L 302,806 C 353,863 403,904 454,931 504,957 555,970 606,970 666,970 717,960 758,940 799,919 832,892 857,858 882,824 901,784 912,739 923,693 928,638 928,574 L 928,25 Z"/> + <glyph unicode="m" horiz-adv-x="1351" d="M 1488,25 C 1488,20 1487,15 1484,12 1481,8 1477,5 1471,2 1465,-1 1457,-3 1446,-4 1435,-5 1422,-6 1406,-6 1389,-6 1376,-5 1365,-4 1354,-3 1346,-1 1340,2 1333,5 1329,8 1326,12 1323,15 1322,20 1322,25 L 1322,572 C 1322,610 1319,645 1312,676 1305,707 1295,734 1280,757 1265,780 1247,797 1224,809 1201,821 1175,827 1144,827 1106,827 1068,812 1030,783 991,754 949,711 903,654 L 903,25 C 903,20 902,15 899,12 896,8 892,5 886,2 879,-1 871,-3 860,-4 849,-5 836,-6 820,-6 805,-6 792,-5 781,-4 770,-3 761,-1 755,2 748,5 744,8 742,12 739,15 738,20 738,25 L 738,572 C 738,610 734,645 727,676 720,707 709,734 694,757 679,780 661,797 639,809 616,821 590,827 559,827 521,827 483,812 444,783 405,754 363,711 318,654 L 318,25 C 318,20 317,15 314,12 311,8 307,5 301,2 295,-1 287,-3 276,-4 265,-5 252,-6 235,-6 219,-6 206,-5 195,-4 184,-3 176,-1 170,2 163,5 159,8 157,12 154,15 153,20 153,25 L 153,925 C 153,930 154,935 156,939 158,942 162,946 168,949 174,952 182,954 191,955 200,956 213,956 228,956 243,956 255,956 265,955 274,954 282,952 287,949 292,946 296,942 299,939 301,935 302,930 302,925 L 302,806 C 353,863 402,904 450,931 497,957 545,970 594,970 631,970 665,966 695,957 724,948 750,936 773,921 796,905 815,886 831,865 847,843 860,819 871,792 901,825 930,852 957,875 984,898 1010,916 1035,930 1060,944 1084,954 1108,961 1131,967 1155,970 1179,970 1237,970 1286,960 1325,940 1364,919 1396,892 1421,858 1445,824 1462,784 1473,739 1483,693 1488,645 1488,594 L 1488,25 Z"/> + <glyph unicode="l" horiz-adv-x="187" d="M 318,25 C 318,20 317,15 314,12 311,8 307,5 301,2 295,-1 287,-3 276,-4 265,-5 252,-6 235,-6 219,-6 206,-5 195,-4 184,-3 176,-1 170,2 163,5 159,8 157,12 154,15 153,20 153,25 L 153,1361 C 153,1366 154,1371 157,1375 159,1379 163,1382 170,1385 176,1388 184,1390 195,1391 206,1392 219,1393 235,1393 252,1393 265,1392 276,1391 287,1390 295,1388 301,1385 307,1382 311,1379 314,1375 317,1371 318,1366 318,1361 L 318,25 Z"/> + <glyph unicode="k" horiz-adv-x="769" d="M 892,26 C 892,21 891,16 888,12 885,8 881,5 875,2 868,-1 859,-3 848,-4 837,-5 822,-6 805,-6 787,-6 772,-5 761,-4 749,-3 739,-2 731,1 723,3 717,6 712,11 707,15 702,20 698,26 L 318,524 318,25 C 318,20 317,15 314,12 311,8 307,5 301,2 295,-1 287,-3 276,-4 265,-5 252,-6 235,-6 219,-6 206,-5 195,-4 184,-3 176,-1 170,2 163,5 159,8 157,12 154,15 153,20 153,25 L 153,1361 C 153,1366 154,1371 157,1375 159,1379 163,1382 170,1385 176,1388 184,1390 195,1391 206,1392 219,1393 235,1393 252,1393 265,1392 276,1391 287,1390 295,1388 301,1385 307,1382 311,1379 314,1375 317,1371 318,1366 318,1361 L 318,547 658,921 C 663,928 669,933 675,938 681,942 688,946 697,949 705,952 715,954 726,955 737,956 751,956 767,956 784,956 798,956 809,955 820,954 830,952 837,950 844,947 849,944 852,941 855,937 856,932 856,926 856,918 854,910 850,902 845,894 838,885 828,874 L 502,548 868,73 C 877,62 883,53 887,46 890,39 892,32 892,26 Z"/> + <glyph unicode="i" horiz-adv-x="213" d="M 318,25 C 318,20 317,15 314,12 311,8 307,5 301,2 295,-1 287,-3 276,-4 265,-5 252,-6 235,-6 219,-6 206,-5 195,-4 184,-3 176,-1 170,2 163,5 159,8 157,12 154,15 153,20 153,25 L 153,925 C 153,930 154,934 157,938 159,942 163,945 170,948 176,951 184,953 195,954 206,955 219,956 235,956 252,956 265,955 276,954 287,953 295,951 301,948 307,945 311,942 314,938 317,934 318,930 318,925 L 318,25 Z M 337,1229 C 337,1190 330,1164 315,1150 300,1136 273,1129 234,1129 195,1129 169,1136 155,1150 140,1163 133,1189 133,1227 133,1266 140,1292 155,1306 170,1320 197,1327 236,1327 275,1327 301,1320 316,1307 330,1293 337,1267 337,1229 Z"/> + <glyph unicode="h" horiz-adv-x="795" d="M 928,25 C 928,20 927,15 924,12 921,8 917,5 911,2 905,-1 897,-3 886,-4 875,-5 862,-6 846,-6 829,-6 816,-5 805,-4 794,-3 786,-1 780,2 774,5 770,8 767,12 764,15 763,20 763,25 L 763,552 C 763,603 759,645 751,676 743,707 731,734 716,757 701,780 681,797 657,809 632,821 604,827 572,827 531,827 489,812 448,783 407,754 363,711 318,654 L 318,25 C 318,20 317,15 314,12 311,8 307,5 301,2 295,-1 287,-3 276,-4 265,-5 252,-6 235,-6 219,-6 206,-5 195,-4 184,-3 176,-1 170,2 163,5 159,8 157,12 154,15 153,20 153,25 L 153,1361 C 153,1366 154,1371 157,1375 159,1379 163,1382 170,1385 176,1388 184,1390 195,1391 206,1392 219,1393 235,1393 252,1393 265,1392 276,1391 287,1390 295,1388 301,1385 307,1382 311,1379 314,1375 317,1371 318,1366 318,1361 L 318,822 C 365,872 413,909 461,934 509,958 557,970 606,970 666,970 717,960 758,940 799,919 832,892 857,858 882,824 901,784 912,739 923,693 928,638 928,573 L 928,25 Z"/> + <glyph unicode="g" horiz-adv-x="848" d="M 905,884 C 905,861 902,844 896,834 889,823 881,818 871,818 L 742,818 C 765,794 782,768 791,739 800,710 805,679 805,648 805,596 797,550 780,510 763,470 740,436 709,409 678,381 641,360 598,345 555,330 508,323 456,323 419,323 385,328 352,338 319,347 293,359 275,374 263,362 253,348 246,333 238,318 234,300 234,280 234,257 245,237 267,222 288,207 317,198 353,197 L 588,187 C 633,186 674,180 711,169 748,158 781,142 808,122 835,101 857,76 872,47 887,17 895,-18 895,-57 895,-98 886,-138 869,-175 852,-212 825,-245 790,-273 754,-302 708,-324 653,-340 598,-357 532,-365 457,-365 384,-365 323,-359 272,-346 221,-334 179,-317 146,-296 113,-275 90,-249 75,-219 60,-190 53,-158 53,-123 53,-101 56,-80 61,-59 66,-38 75,-19 86,0 97,19 110,37 127,54 143,71 162,87 183,104 150,121 126,142 111,167 95,192 87,220 87,249 87,290 95,326 112,358 129,390 149,419 174,444 153,469 137,497 125,528 113,559 107,596 107,640 107,691 116,737 133,778 150,819 174,853 205,881 236,909 273,931 316,946 359,961 405,968 456,968 483,968 509,967 533,964 556,961 578,956 599,951 L 871,951 C 882,951 891,946 897,935 902,924 905,907 905,884 Z M 647,647 C 647,708 630,756 597,791 563,825 515,842 453,842 421,842 393,837 370,826 346,815 326,801 311,782 295,763 283,742 276,718 268,693 264,668 264,641 264,582 281,535 315,501 348,467 395,450 456,450 489,450 517,455 541,466 565,476 585,490 601,509 616,527 628,548 636,572 643,596 647,621 647,647 Z M 730,-66 C 730,-27 714,3 683,24 651,45 608,56 554,57 L 321,65 C 300,48 282,33 269,18 255,3 244,-12 236,-25 228,-39 223,-53 220,-66 217,-79 215,-93 215,-107 215,-150 237,-183 281,-205 325,-228 386,-239 465,-239 515,-239 557,-234 591,-224 624,-215 651,-202 672,-186 693,-170 708,-152 717,-131 726,-110 730,-89 730,-66 Z"/> + <glyph unicode="f" horiz-adv-x="636" d="M 646,1295 C 646,1282 645,1272 644,1265 643,1257 641,1251 640,1246 638,1241 636,1238 633,1237 630,1235 627,1234 623,1234 618,1234 613,1236 606,1239 599,1242 590,1245 580,1249 570,1252 558,1256 545,1259 531,1262 515,1263 497,1263 472,1263 451,1259 434,1251 417,1243 403,1231 392,1214 381,1197 374,1175 369,1148 364,1121 362,1088 362,1049 L 362,951 563,951 C 568,951 573,950 577,948 580,945 584,941 587,936 590,930 592,923 594,914 595,905 596,895 596,882 596,858 593,841 587,830 581,819 573,814 563,814 L 362,814 362,25 C 362,20 361,15 358,12 355,8 351,5 345,2 338,-1 330,-3 319,-4 308,-5 295,-6 279,-6 263,-6 250,-5 239,-4 228,-3 220,-1 214,2 207,5 203,8 200,12 197,15 196,20 196,25 L 196,814 69,814 C 58,814 50,819 45,830 40,841 37,858 37,882 37,895 38,905 39,914 40,923 42,930 45,936 48,941 51,945 55,948 59,950 64,951 69,951 L 196,951 196,1044 C 196,1107 202,1161 214,1206 225,1251 243,1287 267,1316 291,1345 321,1366 358,1380 394,1393 437,1400 486,1400 509,1400 532,1398 554,1394 576,1389 593,1385 605,1380 617,1375 625,1370 629,1366 633,1362 636,1357 639,1351 642,1344 644,1337 645,1328 646,1319 646,1308 646,1295 Z"/> + <glyph unicode="e" horiz-adv-x="848" d="M 921,514 C 921,488 914,470 901,459 888,448 873,442 857,442 L 264,442 C 264,392 269,347 279,307 289,267 306,233 329,204 353,175 383,153 421,138 458,123 504,115 558,115 601,115 639,119 673,126 706,133 735,140 760,149 784,158 804,166 820,173 836,180 848,183 856,183 861,183 865,182 868,180 872,177 875,174 877,169 879,164 880,158 881,150 882,141 883,131 883,119 883,110 883,103 882,97 881,90 881,85 880,80 879,75 877,70 875,66 872,62 869,58 866,55 862,51 851,45 833,37 815,28 792,20 763,12 734,4 701,-3 664,-9 626,-16 586,-19 543,-19 469,-19 404,-9 349,12 293,33 246,63 208,104 170,145 141,196 122,257 103,318 93,390 93,471 93,548 103,618 123,680 143,741 172,794 210,837 247,880 293,913 346,936 399,959 459,970 525,970 596,970 656,959 706,936 755,913 796,883 828,845 860,806 884,761 899,710 914,658 921,603 921,544 L 921,514 Z M 755,563 C 757,650 738,718 697,767 657,816 596,841 517,841 476,841 440,833 409,818 378,803 352,782 331,757 311,732 295,702 283,669 272,635 265,600 264,563 L 755,563 Z"/> + <glyph unicode="d" horiz-adv-x="848" d="M 924,25 C 924,20 923,15 921,11 918,7 914,4 909,2 903,-1 895,-3 886,-4 877,-5 865,-6 852,-6 838,-6 826,-5 817,-4 808,-3 800,-1 794,2 788,4 784,7 781,11 778,15 777,20 777,25 L 777,144 C 730,93 681,53 630,24 579,-5 523,-19 462,-19 396,-19 340,-6 293,20 246,45 209,80 180,124 151,167 129,219 116,278 103,337 96,399 96,464 96,541 104,611 121,674 138,736 162,789 195,833 228,877 268,911 317,935 365,958 421,970 484,970 537,970 585,959 629,936 672,913 715,879 758,834 L 758,1357 C 758,1362 759,1366 762,1371 764,1375 768,1378 775,1381 782,1383 790,1385 801,1387 811,1388 824,1389 840,1389 857,1389 870,1388 881,1387 892,1385 900,1383 906,1381 912,1378 917,1375 920,1371 923,1366 924,1362 924,1357 L 924,25 Z M 758,658 C 713,713 670,756 629,785 587,814 543,828 498,828 456,828 420,818 391,798 362,778 338,752 320,719 301,686 288,649 280,608 271,567 267,525 267,482 267,437 271,392 278,349 285,306 297,267 314,234 331,200 354,173 383,153 412,132 448,122 491,122 513,122 534,125 555,131 575,137 596,147 617,161 638,175 661,193 684,216 707,238 732,265 758,298 L 758,658 Z"/> + <glyph unicode="c" horiz-adv-x="716" d="M 800,162 C 800,151 800,141 799,133 798,124 797,117 796,112 794,106 792,101 790,97 787,92 782,86 774,78 765,69 751,59 731,47 711,34 689,23 664,14 639,4 611,-4 582,-10 553,-16 522,-19 491,-19 426,-19 369,-8 319,13 269,34 227,66 194,107 160,148 134,198 117,258 99,317 90,386 90,464 90,553 101,629 123,693 144,756 174,808 212,849 249,890 294,920 345,940 396,959 451,969 510,969 539,969 567,966 594,961 621,956 645,949 668,940 691,931 711,921 729,910 746,899 759,889 767,881 775,873 781,867 784,862 787,857 789,852 791,846 793,839 794,832 795,824 796,816 796,806 796,794 796,768 793,750 787,740 781,729 774,724 765,724 755,724 744,730 731,741 718,752 701,764 681,777 661,790 637,803 609,814 580,825 547,830 508,830 429,830 368,800 326,739 283,678 262,589 262,473 262,415 268,364 279,321 290,277 306,240 327,211 348,182 375,160 406,146 437,131 472,124 512,124 550,124 583,130 612,142 641,154 666,167 687,182 708,196 725,209 740,221 754,232 765,238 773,238 778,238 782,237 785,234 788,231 791,227 794,221 796,214 798,206 799,197 800,187 800,175 800,162 Z"/> + <glyph unicode="b" horiz-adv-x="848" d="M 981,487 C 981,409 973,339 956,277 939,214 914,161 881,117 848,73 807,39 759,16 711,-7 656,-19 594,-19 565,-19 539,-16 515,-10 490,-5 466,4 443,17 420,30 396,46 373,65 350,84 325,108 299,135 L 299,25 C 299,20 298,15 295,11 292,7 288,4 282,2 276,-1 269,-3 260,-4 251,-5 239,-6 225,-6 212,-6 200,-5 191,-4 182,-3 174,-1 168,2 162,4 158,7 156,11 154,15 153,20 153,25 L 153,1361 C 153,1366 154,1371 157,1375 159,1379 163,1382 170,1385 176,1388 184,1390 195,1391 206,1392 219,1393 235,1393 252,1393 265,1392 276,1391 287,1390 295,1388 301,1385 307,1382 311,1379 314,1375 317,1371 318,1366 318,1361 L 318,822 C 345,849 371,872 396,891 421,910 445,925 469,937 493,948 517,957 541,962 565,967 590,970 617,970 682,970 738,957 785,931 831,905 869,870 898,827 927,783 948,732 961,673 974,614 981,552 981,487 Z M 810,468 C 810,514 806,559 799,602 792,645 780,684 763,717 745,750 722,777 693,798 664,818 629,828 586,828 564,828 543,825 522,819 501,813 480,803 459,789 437,775 415,757 392,735 369,713 344,685 318,652 L 318,293 C 364,238 407,196 449,167 490,138 534,123 579,123 620,123 656,133 685,153 715,173 739,200 757,233 776,266 789,303 797,344 806,385 810,426 810,468 Z"/> + <glyph unicode="a" horiz-adv-x="769" d="M 831,24 C 831,16 828,10 823,6 818,2 810,-1 801,-3 792,-5 778,-6 760,-6 743,-6 729,-5 719,-3 708,-1 701,2 696,6 691,10 689,16 689,24 L 689,114 C 650,72 606,39 558,16 509,-7 458,-19 404,-19 357,-19 314,-13 276,0 237,12 205,30 178,53 151,76 130,105 115,139 100,173 92,212 92,255 92,306 102,350 123,387 144,424 173,455 212,480 251,505 298,523 354,536 410,548 473,554 543,554 L 667,554 667,624 C 667,659 663,689 656,716 649,743 637,765 621,783 604,800 583,814 557,823 531,832 499,836 461,836 420,836 384,831 352,822 319,812 291,801 267,790 242,778 222,767 206,758 189,748 177,743 169,743 164,743 159,744 155,747 151,750 148,754 145,759 142,764 139,771 138,780 137,788 136,797 136,807 136,824 137,837 140,847 142,856 148,865 157,874 166,883 181,893 203,905 225,916 250,927 279,937 308,946 339,954 373,961 407,967 441,970 476,970 541,970 596,963 641,948 686,933 723,912 751,884 779,855 799,820 812,778 825,736 831,687 831,631 L 831,24 Z M 667,435 L 526,435 C 481,435 441,431 408,424 375,416 347,405 325,390 303,375 287,357 277,336 266,315 261,290 261,263 261,216 276,179 306,152 335,124 377,110 430,110 473,110 514,121 551,143 588,165 626,199 667,244 L 667,435 Z"/> + <glyph unicode="X" horiz-adv-x="1007" d="M 996,62 C 1005,47 1010,36 1012,27 1013,18 1011,12 1005,7 999,2 989,-2 976,-3 962,-5 944,-6 921,-6 900,-6 883,-5 871,-4 859,-3 850,-2 843,1 836,4 830,7 827,11 823,14 820,19 817,25 L 529,540 238,25 C 235,19 231,14 227,10 223,6 218,3 211,1 204,-2 194,-3 182,-4 170,-5 154,-6 134,-6 112,-6 95,-5 82,-3 69,-2 61,2 56,7 51,12 49,18 51,27 52,36 57,47 66,62 L 419,657 82,1232 C 74,1247 69,1259 67,1268 64,1277 66,1284 71,1289 76,1294 86,1297 99,1298 112,1299 131,1300 154,1300 174,1300 190,1300 203,1299 216,1298 226,1296 233,1294 240,1291 246,1288 249,1284 252,1279 256,1274 260,1269 L 538,785 814,1269 C 817,1274 821,1279 824,1284 827,1288 832,1291 839,1294 845,1296 854,1298 865,1299 876,1300 892,1300 911,1300 932,1300 949,1299 962,1298 975,1296 984,1293 990,1288 995,1283 997,1277 996,1268 995,1259 990,1247 982,1232 L 646,661 996,62 Z"/> + <glyph unicode="V" horiz-adv-x="1113" d="M 695,30 C 692,23 689,17 684,12 679,7 673,4 665,1 656,-2 646,-3 633,-4 620,-5 603,-6 584,-6 569,-6 557,-6 546,-5 535,-5 525,-4 517,-3 509,-2 502,0 497,2 491,3 486,5 482,8 478,11 475,14 473,18 470,21 468,26 466,31 L 43,1233 C 38,1248 35,1260 35,1269 34,1278 37,1284 43,1289 49,1294 59,1297 72,1298 85,1299 103,1300 126,1300 145,1300 160,1300 171,1299 182,1298 190,1296 196,1293 202,1290 207,1287 210,1283 213,1278 215,1273 218,1266 L 589,177 590,177 951,1264 C 953,1271 955,1277 958,1282 961,1287 965,1290 972,1293 979,1296 988,1298 1000,1299 1012,1300 1028,1300 1048,1300 1069,1300 1085,1299 1097,1298 1109,1296 1117,1293 1122,1288 1126,1283 1128,1277 1127,1268 1126,1259 1122,1247 1117,1232 L 695,30 Z"/> + <glyph unicode="U" horiz-adv-x="980" d="M 1145,478 C 1145,399 1134,329 1111,268 1088,206 1055,154 1012,111 969,68 917,36 856,14 795,-8 725,-19 647,-19 576,-19 511,-9 452,12 393,33 343,63 301,104 259,144 227,194 204,255 181,316 170,386 170,465 L 170,1268 C 170,1273 171,1278 174,1282 177,1286 181,1289 188,1292 195,1294 203,1296 214,1298 225,1299 239,1300 256,1300 272,1300 286,1299 297,1298 308,1296 317,1294 324,1292 330,1289 334,1286 337,1282 340,1278 341,1273 341,1268 L 341,486 C 341,426 348,374 363,329 378,284 399,247 427,218 454,188 488,166 527,151 566,136 609,128 658,128 708,128 753,135 792,150 831,165 864,187 891,216 918,245 938,282 953,325 967,368 974,419 974,477 L 974,1268 C 974,1273 975,1278 978,1282 981,1286 985,1289 992,1292 999,1294 1008,1296 1019,1298 1030,1299 1043,1300 1060,1300 1076,1300 1090,1299 1101,1298 1112,1296 1120,1294 1127,1292 1133,1289 1138,1286 1141,1282 1144,1278 1145,1273 1145,1268 L 1145,478 Z"/> + <glyph unicode="T" horiz-adv-x="980" d="M 983,1220 C 983,1207 982,1196 981,1187 980,1178 978,1170 975,1165 972,1159 968,1155 964,1152 959,1149 954,1148 949,1148 L 585,1148 585,26 C 585,21 584,16 581,12 578,8 574,5 567,3 560,0 552,-2 541,-3 530,-5 516,-6 499,-6 483,-6 469,-5 458,-3 447,-2 438,0 431,3 424,5 420,8 417,12 414,16 413,21 413,26 L 413,1148 49,1148 C 44,1148 39,1149 35,1152 30,1155 27,1159 24,1165 21,1170 19,1178 18,1187 16,1196 15,1207 15,1220 15,1233 16,1244 18,1254 19,1263 21,1271 24,1277 27,1283 30,1287 35,1290 39,1293 44,1294 49,1294 L 949,1294 C 954,1294 959,1293 964,1290 968,1287 972,1283 975,1277 978,1271 980,1263 981,1254 982,1244 983,1233 983,1220 Z"/> + <glyph unicode="S" horiz-adv-x="821" d="M 867,363 C 867,302 856,248 834,201 811,154 780,114 741,81 701,48 654,23 601,6 547,-11 489,-19 427,-19 384,-19 344,-15 307,-8 270,-1 237,8 208,19 179,30 154,41 135,52 115,63 101,73 94,81 86,89 80,99 77,112 73,124 71,140 71,161 71,176 72,188 73,198 74,207 76,215 79,221 82,227 85,231 89,234 93,236 98,237 103,237 112,237 126,231 143,220 160,209 181,196 208,183 235,170 267,157 305,146 342,134 386,128 435,128 472,128 507,133 538,143 569,153 595,167 618,186 640,204 657,226 669,253 681,280 687,310 687,344 687,381 679,412 662,438 645,464 623,487 596,507 569,526 538,544 503,561 468,577 432,594 395,611 358,628 323,646 288,667 253,688 222,712 195,740 168,768 146,801 129,839 112,876 103,921 103,974 103,1028 113,1076 133,1119 152,1161 180,1196 215,1225 250,1254 291,1276 340,1291 388,1306 440,1313 496,1313 525,1313 554,1311 583,1306 612,1301 639,1294 665,1286 690,1277 713,1268 733,1258 753,1247 766,1239 773,1233 779,1226 783,1221 785,1218 787,1214 789,1209 790,1204 791,1198 792,1191 793,1183 794,1175 794,1165 794,1152 794,1140 794,1129 793,1120 792,1111 790,1103 788,1097 786,1090 783,1086 780,1083 776,1080 772,1078 767,1078 760,1078 748,1083 733,1092 717,1101 698,1112 675,1124 652,1135 626,1146 595,1156 564,1165 529,1170 490,1170 454,1170 423,1165 396,1156 369,1146 347,1133 330,1117 313,1101 300,1082 291,1060 282,1038 278,1015 278,990 278,954 286,923 303,897 320,871 342,848 370,828 397,808 429,790 464,773 499,756 535,740 572,723 609,706 645,687 680,667 715,646 747,622 775,595 802,567 825,534 842,497 859,459 867,414 867,363 Z"/> + <glyph unicode="R" horiz-adv-x="874" d="M 1035,26 C 1035,21 1034,16 1032,12 1030,8 1026,5 1019,2 1012,-1 1003,-3 991,-4 979,-5 963,-6 943,-6 926,-6 912,-5 901,-4 890,-3 881,0 874,3 867,6 862,10 859,15 855,20 852,27 849,35 L 730,340 C 716,375 702,407 687,436 672,465 654,490 633,511 612,532 588,548 560,560 532,571 498,577 459,577 L 344,577 344,26 C 344,21 343,16 340,12 337,8 332,5 326,3 319,0 311,-2 300,-3 289,-5 275,-6 258,-6 241,-6 228,-5 217,-3 206,-2 197,0 190,3 183,5 179,8 176,12 173,16 172,21 172,26 L 172,1224 C 172,1250 179,1268 193,1279 206,1289 221,1294 236,1294 L 511,1294 C 544,1294 571,1293 593,1292 614,1290 634,1288 651,1286 701,1277 745,1264 784,1245 822,1226 854,1203 880,1174 906,1145 926,1113 939,1076 952,1039 958,998 958,953 958,910 952,871 941,837 929,802 912,772 890,746 868,719 842,696 811,677 780,658 746,641 708,628 729,619 749,607 766,593 783,578 800,561 815,541 830,521 844,498 857,472 870,446 884,417 897,384 L 1013,99 C 1022,75 1028,58 1031,49 1034,39 1035,31 1035,26 Z M 776,935 C 776,986 765,1029 742,1064 719,1099 681,1124 628,1139 611,1144 593,1147 572,1149 551,1151 523,1152 489,1152 L 344,1152 344,716 512,716 C 557,716 597,722 630,733 663,744 690,759 712,779 734,798 750,821 761,848 771,875 776,904 776,935 Z"/> + <glyph unicode="P" horiz-adv-x="821" d="M 967,915 C 967,850 956,792 935,740 914,688 883,644 844,607 804,570 755,542 698,522 640,502 571,492 491,492 L 344,492 344,26 C 344,21 343,16 340,12 337,8 332,5 326,3 319,0 311,-2 300,-3 289,-5 275,-6 258,-6 241,-6 228,-5 217,-3 206,-2 197,0 190,3 183,5 179,8 176,12 173,16 172,21 172,26 L 172,1220 C 172,1247 179,1266 193,1277 207,1288 223,1294 240,1294 L 517,1294 C 545,1294 572,1293 598,1291 623,1288 654,1283 689,1276 724,1268 759,1254 796,1233 832,1212 863,1186 888,1155 913,1124 933,1089 947,1049 960,1008 967,964 967,915 Z M 786,901 C 786,954 776,998 757,1033 737,1068 713,1095 684,1112 655,1129 625,1140 594,1145 563,1150 532,1152 503,1152 L 344,1152 344,633 499,633 C 551,633 594,640 629,653 663,666 692,685 715,709 738,732 756,761 768,794 780,827 786,862 786,901 Z"/> + <glyph unicode="O" horiz-adv-x="1192" d="M 1256,662 C 1256,557 1244,463 1219,379 1194,295 1158,224 1109,165 1060,106 998,60 924,29 850,-3 764,-19 665,-19 568,-19 484,-4 413,25 342,54 283,96 237,151 190,206 156,275 133,357 110,439 99,533 99,640 99,742 111,835 136,918 161,1001 198,1072 247,1131 296,1189 358,1234 432,1266 506,1297 592,1313 691,1313 786,1313 869,1299 940,1270 1011,1241 1070,1200 1117,1145 1164,1090 1199,1022 1222,941 1245,860 1256,767 1256,662 Z M 1074,650 C 1074,723 1068,792 1055,855 1042,918 1020,972 990,1019 959,1065 919,1101 868,1127 818,1153 755,1166 681,1166 606,1166 543,1152 493,1124 442,1096 401,1059 369,1012 338,965 315,911 301,849 288,786 281,721 281,652 281,576 287,506 300,442 313,378 334,323 364,277 394,230 434,194 484,169 535,143 598,130 674,130 749,130 812,144 863,172 915,200 956,238 987,286 1018,333 1041,388 1054,451 1067,514 1074,580 1074,650 Z"/> + <glyph unicode="N" horiz-adv-x="1006" d="M 1150,71 C 1150,58 1148,46 1143,37 1139,28 1133,20 1126,14 1118,8 1110,4 1101,1 1092,-2 1083,-3 1075,-3 L 1018,-3 C 1000,-3 984,-1 971,3 957,6 944,13 932,23 920,32 908,45 896,62 884,79 871,100 858,126 L 463,862 C 442,900 422,940 401,982 380,1023 360,1064 342,1103 L 340,1103 C 341,1055 342,1006 343,956 344,906 344,856 344,807 L 344,26 C 344,21 343,17 340,13 337,8 332,5 326,3 319,0 310,-2 299,-3 288,-5 274,-6 257,-6 241,-6 227,-5 216,-3 205,-2 196,0 190,3 184,5 179,8 176,13 173,17 172,21 172,26 L 172,1220 C 172,1247 180,1266 195,1277 210,1288 226,1294 244,1294 L 329,1294 C 349,1294 366,1292 379,1289 392,1286 404,1280 415,1273 426,1265 436,1254 446,1241 456,1227 466,1210 477,1189 L 781,621 C 800,586 818,553 835,520 852,487 869,454 885,422 901,390 917,359 933,328 949,297 965,265 980,234 L 981,234 C 980,287 979,342 979,399 978,456 978,510 978,563 L 978,1265 C 978,1270 979,1274 982,1278 985,1282 990,1286 996,1289 1003,1292 1012,1294 1023,1295 1034,1296 1048,1297 1066,1297 1081,1297 1094,1296 1106,1295 1117,1294 1126,1292 1132,1289 1138,1286 1143,1282 1146,1278 1149,1274 1150,1270 1150,1265 L 1150,71 Z"/> + <glyph unicode="M" horiz-adv-x="1430" d="M 1579,26 C 1579,21 1578,16 1575,12 1572,8 1567,5 1560,3 1554,0 1545,-2 1534,-3 1524,-5 1510,-6 1492,-6 1477,-6 1463,-5 1452,-3 1440,-2 1432,0 1425,3 1418,5 1414,8 1411,12 1408,16 1407,21 1407,26 L 1407,1153 1405,1153 949,21 C 947,16 944,12 941,9 937,6 932,3 925,1 918,-2 909,-3 900,-4 890,-5 878,-6 865,-6 851,-6 839,-5 829,-4 819,-3 811,-1 804,2 797,4 792,7 789,10 785,13 782,17 781,21 L 345,1153 344,1153 344,26 C 344,21 343,16 340,12 337,8 332,5 325,3 319,0 310,-2 299,-3 288,-5 274,-6 256,-6 240,-6 226,-5 215,-3 204,-2 196,0 189,3 182,5 178,8 176,12 173,16 172,21 172,26 L 172,1216 C 172,1244 179,1264 194,1276 209,1288 226,1294 244,1294 L 350,1294 C 371,1294 390,1292 407,1288 423,1284 437,1278 449,1269 461,1260 472,1249 480,1236 488,1223 495,1207 501,1189 L 871,252 876,252 1261,1186 C 1268,1206 1277,1223 1285,1237 1294,1251 1304,1262 1314,1271 1325,1279 1337,1285 1349,1289 1362,1292 1377,1294 1394,1294 L 1505,1294 C 1515,1294 1525,1293 1534,1290 1543,1287 1551,1282 1557,1276 1564,1269 1569,1261 1573,1252 1577,1242 1579,1230 1579,1216 L 1579,26 Z"/> + <glyph unicode="L" horiz-adv-x="689" d="M 843,75 C 843,62 842,51 841,42 840,33 838,25 835,19 832,12 828,8 824,5 819,2 814,0 808,0 L 236,0 C 221,0 206,5 193,16 179,26 172,44 172,70 L 172,1268 C 172,1273 173,1278 176,1282 179,1286 183,1289 190,1292 197,1294 206,1296 217,1298 228,1299 242,1300 258,1300 275,1300 289,1299 300,1298 311,1296 319,1294 326,1292 333,1289 337,1286 340,1282 343,1278 344,1273 344,1268 L 344,149 808,149 C 814,149 819,148 824,145 828,142 832,137 835,132 838,126 840,118 841,109 842,100 843,88 843,75 Z"/> + <glyph unicode="K" horiz-adv-x="874" d="M 1016,28 C 1016,23 1015,18 1013,14 1010,9 1006,6 999,3 992,0 983,-2 972,-3 961,-5 946,-6 928,-6 905,-6 886,-5 871,-3 856,-1 845,3 838,8 831,13 825,19 820,26 L 344,673 344,26 C 344,21 343,17 340,13 337,8 333,5 326,3 319,0 311,-2 300,-3 289,-5 275,-6 258,-6 242,-6 228,-5 217,-3 206,-2 197,0 190,3 183,5 179,8 176,13 173,17 172,21 172,26 L 172,1268 C 172,1273 173,1278 176,1282 179,1286 183,1289 190,1292 197,1294 206,1296 217,1298 228,1299 242,1300 258,1300 275,1300 289,1299 300,1298 311,1296 319,1294 326,1292 333,1289 337,1286 340,1282 343,1278 344,1273 344,1268 L 344,693 802,1268 C 806,1274 811,1279 816,1283 821,1287 828,1290 836,1293 843,1295 853,1297 864,1298 875,1299 889,1300 906,1300 923,1300 937,1299 948,1298 959,1296 967,1294 974,1291 980,1288 984,1285 987,1281 989,1277 990,1273 990,1268 990,1259 988,1251 984,1242 979,1233 971,1221 959,1206 L 530,693 992,79 C 1003,62 1010,50 1013,44 1015,37 1016,32 1016,28 Z"/> + <glyph unicode="I" horiz-adv-x="186" d="M 344,26 C 344,21 343,16 340,12 337,8 333,5 326,3 319,0 311,-2 300,-3 289,-5 275,-6 258,-6 242,-6 228,-5 217,-3 206,-2 197,0 190,3 183,5 179,8 176,12 173,16 172,21 172,26 L 172,1268 C 172,1273 174,1278 177,1282 180,1286 185,1289 192,1292 199,1294 208,1296 219,1298 230,1299 243,1300 258,1300 275,1300 289,1299 300,1298 311,1296 319,1294 326,1292 333,1289 337,1286 340,1282 343,1278 344,1273 344,1268 L 344,26 Z"/> + <glyph unicode="H" horiz-adv-x="953" d="M 1104,26 C 1104,21 1103,16 1100,12 1097,8 1093,5 1086,3 1079,0 1071,-2 1060,-3 1049,-5 1035,-6 1019,-6 1002,-6 988,-5 977,-3 966,-2 958,0 951,3 944,5 940,8 937,12 934,16 933,21 933,26 L 933,600 344,600 344,26 C 344,21 343,16 340,12 337,8 333,5 326,3 319,0 311,-2 300,-3 289,-5 275,-6 258,-6 242,-6 228,-5 217,-3 206,-2 197,0 190,3 183,5 179,8 176,12 173,16 172,21 172,26 L 172,1268 C 172,1273 173,1278 176,1282 179,1286 183,1289 190,1292 197,1294 206,1296 217,1298 228,1299 242,1300 258,1300 275,1300 289,1299 300,1298 311,1296 319,1294 326,1292 333,1289 337,1286 340,1282 343,1278 344,1273 344,1268 L 344,750 933,750 933,1268 C 933,1273 934,1278 937,1282 940,1286 944,1289 951,1292 958,1294 966,1296 977,1298 988,1299 1002,1300 1019,1300 1035,1300 1049,1299 1060,1298 1071,1296 1079,1294 1086,1292 1093,1289 1097,1286 1100,1282 1103,1278 1104,1273 1104,1268 L 1104,26 Z"/> + <glyph unicode="F" horiz-adv-x="689" d="M 852,1220 C 852,1207 851,1196 850,1187 849,1178 846,1170 843,1165 840,1159 836,1155 832,1152 827,1149 823,1148 818,1148 L 344,1148 344,708 792,708 C 797,708 801,707 806,705 810,702 814,698 817,693 820,688 823,681 824,672 825,663 826,651 826,637 826,624 825,614 824,605 823,596 820,588 817,583 814,577 810,573 806,570 801,567 797,565 792,565 L 344,565 344,26 C 344,21 343,17 340,13 337,8 333,5 326,3 319,0 311,-2 300,-3 289,-5 275,-6 258,-6 242,-6 228,-5 217,-3 206,-2 197,0 190,3 183,5 179,8 176,13 173,17 172,21 172,26 L 172,1224 C 172,1250 179,1268 193,1279 206,1289 221,1294 236,1294 L 818,1294 C 823,1294 827,1293 832,1290 836,1287 840,1283 843,1277 846,1271 849,1263 850,1254 851,1244 852,1233 852,1220 Z"/> + <glyph unicode="D" horiz-adv-x="1006" d="M 1167,666 C 1167,554 1153,456 1124,373 1095,289 1054,220 999,165 944,110 876,68 796,41 716,14 621,0 510,0 L 236,0 C 221,0 206,5 193,16 179,26 172,44 172,70 L 172,1224 C 172,1250 179,1268 193,1279 206,1289 221,1294 236,1294 L 529,1294 C 641,1294 736,1280 813,1251 890,1222 955,1180 1008,1126 1060,1071 1100,1005 1127,928 1154,851 1167,763 1167,666 Z M 986,659 C 986,729 977,794 960,855 943,915 916,967 879,1011 842,1055 795,1089 738,1114 681,1139 608,1151 519,1151 L 344,1151 344,144 521,144 C 604,144 673,154 730,175 787,196 834,227 872,270 910,313 939,366 958,431 977,495 986,571 986,659 Z"/> + <glyph unicode="C" horiz-adv-x="954" d="M 1036,183 C 1036,172 1036,163 1035,155 1034,147 1033,140 1032,134 1030,128 1028,123 1025,118 1022,113 1018,108 1011,101 1004,94 990,84 969,71 948,57 921,44 890,31 858,18 822,7 781,-2 740,-11 695,-16 646,-16 562,-16 486,-2 419,26 351,54 293,95 246,150 198,205 161,272 136,353 110,433 97,525 97,630 97,737 111,833 139,917 166,1001 205,1072 255,1131 305,1189 365,1233 435,1264 504,1295 581,1310 666,1310 703,1310 740,1307 775,1300 810,1293 843,1284 873,1273 903,1262 930,1250 953,1236 976,1222 993,1211 1002,1202 1011,1193 1016,1186 1019,1181 1022,1176 1024,1171 1026,1165 1027,1158 1029,1151 1030,1142 1031,1133 1031,1123 1031,1111 1031,1098 1030,1086 1029,1077 1028,1068 1026,1060 1023,1054 1020,1047 1017,1043 1013,1040 1010,1037 1005,1035 1000,1035 990,1035 977,1042 961,1055 944,1068 922,1082 896,1098 869,1113 837,1128 799,1141 761,1154 716,1160 663,1160 605,1160 553,1149 506,1126 458,1103 418,1069 385,1024 351,979 325,925 307,861 288,796 279,723 279,640 279,558 288,486 306,423 323,360 349,307 382,265 415,222 456,190 504,169 552,147 607,136 668,136 720,136 765,142 803,155 842,168 875,182 902,198 929,213 951,227 969,240 986,253 1000,259 1010,259 1015,259 1019,258 1022,256 1025,254 1028,250 1030,245 1032,239 1033,231 1034,221 1035,211 1036,198 1036,183 Z"/> + <glyph unicode="B" horiz-adv-x="874" d="M 1025,371 C 1025,330 1020,293 1010,259 999,224 985,193 966,166 947,139 925,115 899,94 872,73 843,56 810,42 777,28 741,18 704,11 666,4 623,0 574,0 L 236,0 C 221,0 206,5 193,16 179,26 172,44 172,70 L 172,1224 C 172,1250 179,1268 193,1279 206,1289 221,1294 236,1294 L 530,1294 C 607,1294 671,1287 720,1272 769,1257 811,1236 844,1208 877,1180 901,1146 918,1105 935,1064 943,1018 943,967 943,936 939,907 932,879 925,851 914,825 900,802 885,778 867,757 846,738 824,719 799,704 771,692 806,685 839,673 870,656 901,638 928,615 951,588 974,561 992,529 1005,492 1018,455 1025,415 1025,371 Z M 766,950 C 766,981 762,1010 753,1035 744,1060 731,1082 712,1100 694,1117 669,1131 639,1140 609,1149 570,1154 521,1154 L 343,1154 343,735 539,735 C 583,735 619,741 646,753 674,764 696,780 714,800 732,819 745,842 754,869 762,895 766,922 766,950 Z M 844,361 C 844,400 838,434 826,463 813,492 795,517 772,537 748,557 718,572 683,583 647,593 602,598 549,598 L 343,598 343,142 593,142 C 632,142 666,147 695,156 725,165 750,179 773,198 795,216 812,239 825,266 838,293 844,325 844,361 Z"/> + <glyph unicode=":" horiz-adv-x="213" d="M 397,800 C 397,779 396,761 393,746 390,731 384,720 376,711 367,702 356,695 343,692 330,688 313,686 292,686 271,686 253,688 240,692 227,695 216,702 208,711 200,720 195,731 192,746 189,761 187,779 187,800 187,823 189,842 192,857 195,872 200,884 208,893 216,902 227,908 240,912 253,915 271,917 292,917 313,917 330,915 343,912 356,908 367,902 376,893 384,884 390,872 393,857 396,842 397,823 397,800 Z M 397,106 C 397,84 396,66 393,51 390,36 384,25 376,16 367,7 356,0 343,-3 330,-7 313,-9 292,-9 271,-9 253,-7 240,-3 227,0 216,7 208,16 200,25 195,36 192,51 189,66 187,84 187,106 187,128 189,147 192,162 195,177 200,188 208,197 216,206 227,212 240,216 253,220 271,222 292,222 313,222 330,220 343,216 356,212 367,206 376,197 384,188 390,177 393,162 396,147 397,128 397,106 Z"/> + <glyph unicode="3" horiz-adv-x="848" d="M 914,370 C 914,311 904,257 883,210 862,162 833,121 794,87 755,53 708,27 651,9 594,-10 530,-19 459,-19 416,-19 375,-15 338,-8 300,-1 266,7 237,17 208,26 183,36 164,47 145,57 133,64 128,69 123,74 119,78 116,83 113,88 111,93 109,100 107,107 106,115 105,125 104,134 103,146 103,160 103,184 105,201 110,210 115,219 122,224 131,224 137,224 149,219 167,208 185,197 208,186 237,174 265,161 298,150 336,139 374,128 417,123 463,123 508,123 548,129 582,140 616,151 645,167 668,188 691,209 709,233 721,262 732,290 738,321 738,354 738,391 731,424 716,453 701,482 679,508 651,529 622,550 587,567 545,578 504,589 456,595 403,595 L 276,595 C 271,595 265,596 260,599 255,601 251,605 247,610 243,615 240,622 238,631 235,640 234,651 234,665 234,678 235,688 237,697 239,705 242,712 246,717 249,722 253,725 258,728 263,730 268,731 274,731 L 387,731 C 431,731 471,737 506,748 541,759 570,776 595,797 619,818 638,844 651,874 664,903 670,936 670,973 670,1000 666,1025 657,1050 648,1074 635,1095 618,1113 601,1131 579,1145 552,1156 525,1166 493,1171 458,1171 419,1171 384,1165 352,1154 319,1142 290,1129 265,1116 240,1103 219,1090 202,1079 185,1067 174,1061 167,1061 162,1061 158,1062 155,1064 151,1065 148,1069 146,1074 143,1079 142,1086 141,1095 140,1104 139,1115 139,1130 139,1140 139,1149 140,1157 141,1164 142,1171 144,1177 146,1182 148,1187 151,1192 154,1197 158,1202 165,1209 171,1215 184,1224 203,1236 222,1248 246,1260 275,1272 303,1283 336,1293 373,1301 410,1309 449,1313 492,1313 552,1313 605,1305 650,1290 695,1275 733,1253 764,1225 794,1197 817,1164 832,1125 847,1086 854,1042 854,995 854,954 849,917 838,882 827,847 812,816 791,789 770,762 745,739 715,720 685,701 650,687 611,680 L 611,678 C 656,673 697,662 734,645 771,627 802,605 829,578 856,551 877,520 892,485 907,449 914,411 914,370 Z"/> + <glyph unicode="2" horiz-adv-x="821" d="M 924,74 C 924,62 923,51 922,42 920,33 918,25 915,19 912,12 908,8 903,5 898,2 892,0 886,0 L 171,0 C 162,0 154,1 147,4 140,6 134,10 129,15 124,20 120,28 118,38 115,48 114,60 114,75 114,88 115,100 116,110 117,120 119,129 122,137 126,144 130,152 135,160 140,167 147,175 155,184 L 414,450 C 474,511 522,566 558,615 594,664 622,708 641,748 661,788 674,824 680,857 686,890 689,920 689,949 689,978 684,1005 675,1031 665,1056 651,1079 633,1098 615,1117 592,1133 564,1144 537,1155 505,1161 469,1161 427,1161 390,1155 356,1144 323,1133 294,1120 269,1107 243,1094 222,1081 206,1070 189,1059 176,1053 168,1053 163,1053 159,1054 155,1057 151,1060 148,1064 146,1070 143,1076 141,1084 140,1094 139,1104 138,1116 138,1130 138,1140 138,1149 139,1156 140,1163 141,1170 143,1175 144,1180 146,1185 149,1190 152,1195 157,1201 165,1208 173,1215 187,1224 207,1236 226,1248 251,1260 281,1272 310,1283 343,1293 379,1301 414,1309 452,1313 491,1313 554,1313 609,1304 656,1287 703,1269 742,1245 773,1214 804,1183 827,1148 842,1107 857,1066 865,1023 865,977 865,936 861,895 854,854 847,813 831,768 808,721 784,673 750,620 705,562 660,503 601,436 527,360 L 322,146 885,146 C 890,146 896,145 901,142 906,139 910,134 914,128 917,122 920,115 922,106 923,97 924,86 924,74 Z"/> + <glyph unicode="." horiz-adv-x="239" d="M 366,109 C 366,62 358,30 343,15 327,-1 298,-9 257,-9 217,-9 189,-1 174,14 159,29 151,60 151,106 151,153 159,185 175,201 190,216 219,224 260,224 300,224 328,216 343,201 358,186 366,155 366,109 Z"/> + <glyph unicode="," horiz-adv-x="345" d="M 371,143 C 371,122 370,103 368,86 366,69 363,52 358,37 353,22 347,7 340,-8 332,-23 322,-39 311,-56 L 174,-262 C 171,-267 167,-271 163,-274 158,-277 153,-280 147,-283 140,-286 133,-287 125,-288 116,-289 106,-290 93,-290 82,-290 72,-289 65,-288 57,-287 51,-286 48,-283 45,-281 43,-278 43,-274 42,-270 43,-265 46,-260 L 179,15 179,143 C 179,161 181,175 185,186 188,197 194,205 202,210 210,215 220,219 232,221 244,223 259,224 276,224 293,224 307,223 319,221 331,219 341,215 349,210 356,205 362,197 366,186 369,175 371,161 371,143 Z"/> + <glyph unicode=" " horiz-adv-x="450"/> + </font> + </defs> + <defs> + <font id="EmbeddedFont_3" horiz-adv-x="2048"> + <font-face font-family="Calibri embedded" units-per-em="2048" font-weight="bold" font-style="normal" ascent="1535" descent="503"/> + <missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/> + <glyph unicode="y" horiz-adv-x="954" d="M 643,0 L 535,-316 C 529,-333 513,-345 486,-352 459,-359 420,-363 369,-363 342,-363 321,-362 305,-359 289,-357 277,-353 269,-348 261,-343 257,-336 256,-328 255,-320 257,-310 262,-299 L 381,0 C 372,4 365,10 358,19 351,27 345,36 342,45 L 35,865 C 26,888 22,906 22,919 22,931 26,941 34,948 42,955 56,959 75,962 94,965 119,966 150,966 179,966 201,966 218,965 235,964 248,961 257,957 266,953 273,947 278,939 283,930 287,918 292,903 L 502,306 505,306 697,915 C 701,932 706,944 713,950 719,955 729,959 744,962 759,965 784,966 821,966 850,966 874,965 893,962 912,959 926,954 935,947 944,940 948,930 948,918 948,905 945,891 940,874 L 643,0 Z"/> + <glyph unicode="x" horiz-adv-x="875" d="M 901,52 C 906,41 909,31 909,24 908,17 903,11 894,6 885,1 870,-2 851,-3 832,-5 806,-6 774,-6 744,-6 720,-5 702,-4 683,-3 669,-1 659,2 648,5 641,8 636,13 631,17 627,22 624,29 L 459,346 294,29 C 291,22 288,17 283,13 278,8 271,5 262,2 252,-1 238,-3 221,-4 204,-5 181,-6 153,-6 124,-6 100,-5 83,-3 66,-2 53,1 45,6 37,11 33,17 33,24 32,31 35,41 41,52 L 288,491 60,903 C 54,915 51,925 51,934 50,942 54,948 63,953 72,958 86,961 105,963 124,965 149,966 182,966 211,966 235,966 253,965 270,964 284,962 294,960 304,958 311,955 316,951 321,946 325,941 328,934 L 487,636 645,934 C 647,939 650,944 654,948 658,952 664,955 673,958 682,961 694,963 709,964 724,965 744,966 770,966 799,966 823,965 841,964 858,963 871,960 879,955 886,950 890,944 890,936 889,927 885,916 878,903 L 656,498 901,52 Z"/> + <glyph unicode="v" horiz-adv-x="954" d="M 947,927 C 947,924 947,920 947,915 946,910 946,905 945,900 944,894 942,887 941,880 939,873 937,864 934,855 L 666,48 C 663,37 658,28 653,21 647,14 638,8 625,4 612,0 594,-3 572,-4 549,-5 520,-6 484,-6 449,-6 420,-5 398,-3 375,-2 358,1 345,5 332,9 323,15 318,22 312,29 307,37 304,48 L 36,855 C 32,868 29,880 27,891 24,902 23,909 23,914 22,919 22,923 22,927 22,934 24,940 28,945 31,950 38,954 47,957 56,960 69,963 86,964 102,965 122,966 147,966 174,966 196,965 213,964 230,962 243,960 253,957 262,954 269,949 273,944 277,938 280,931 283,923 L 486,268 492,243 498,268 698,923 C 700,931 703,938 708,944 712,949 719,954 728,957 737,960 750,962 766,964 781,965 802,966 827,966 852,966 872,965 888,964 903,963 915,960 924,957 933,954 939,950 942,945 945,940 947,934 947,927 Z"/> + <glyph unicode="u" horiz-adv-x="874" d="M 972,34 C 972,27 970,22 967,17 964,12 958,7 950,4 941,1 930,-2 917,-3 903,-5 886,-6 865,-6 843,-6 825,-5 812,-3 798,-2 787,1 779,4 771,7 765,12 762,17 759,22 757,27 757,34 L 757,137 C 708,84 658,44 607,17 556,-10 503,-23 448,-23 387,-23 335,-13 294,7 252,27 218,54 193,89 167,124 149,164 138,210 127,255 121,312 121,380 L 121,926 C 121,933 123,939 127,944 130,949 137,953 147,956 156,959 169,962 186,964 202,965 222,966 246,966 271,966 291,965 307,964 323,962 336,959 346,956 355,953 362,949 366,944 370,939 372,933 372,926 L 372,422 C 372,375 375,340 381,315 387,290 396,269 409,252 421,234 437,220 456,211 475,201 497,196 522,196 554,196 586,208 619,231 651,254 685,288 722,333 L 722,926 C 722,933 724,939 728,944 731,949 738,953 748,956 757,959 770,962 786,964 802,965 822,966 847,966 872,966 892,965 908,964 924,962 937,959 946,956 955,953 962,949 966,944 970,939 972,933 972,926 L 972,34 Z"/> + <glyph unicode="t" horiz-adv-x="662" d="M 654,122 C 654,93 652,70 649,55 645,39 640,28 634,22 628,15 619,10 608,5 596,0 582,-5 567,-8 551,-12 534,-15 516,-17 497,-19 479,-20 460,-20 410,-20 367,-14 330,-1 293,12 263,31 239,58 215,84 197,117 186,157 175,197 169,244 169,299 L 169,756 62,756 C 49,756 40,764 33,780 26,795 23,821 23,858 23,877 24,894 26,907 27,920 30,931 33,939 36,946 41,952 46,955 51,958 56,960 63,960 L 169,960 169,1159 C 169,1166 171,1172 175,1177 178,1182 185,1187 195,1191 204,1194 217,1197 234,1199 250,1200 270,1201 294,1201 319,1201 339,1200 356,1199 372,1197 385,1194 394,1191 403,1187 410,1182 414,1177 418,1172 420,1166 420,1159 L 420,960 614,960 C 621,960 627,958 632,955 637,952 641,946 644,939 647,931 650,920 652,907 653,894 654,877 654,858 654,821 651,795 644,780 637,764 628,756 615,756 L 420,756 420,337 C 420,288 428,252 443,228 458,203 486,191 525,191 538,191 550,192 561,195 572,197 581,200 590,203 598,206 605,208 611,211 616,213 621,214 626,214 630,214 634,213 638,211 641,208 644,204 646,197 648,190 650,180 652,168 653,156 654,141 654,122 Z"/> + <glyph unicode="s" horiz-adv-x="715" d="M 754,286 C 754,235 745,191 726,152 707,113 680,81 645,55 610,29 569,10 522,-3 475,-16 423,-23 368,-23 335,-23 303,-20 273,-15 242,-10 215,-4 191,4 167,11 147,19 131,27 115,35 103,43 96,50 89,57 83,68 79,83 75,98 73,120 73,149 73,168 74,184 75,196 76,207 78,217 81,224 84,231 87,235 91,238 95,240 100,241 106,241 113,241 124,237 139,229 153,220 171,211 192,201 213,191 238,182 267,173 295,164 327,160 363,160 386,160 406,162 424,167 441,172 457,178 470,187 483,196 492,207 499,220 506,233 509,249 509,266 509,286 503,303 491,318 478,332 462,344 442,355 421,366 398,376 373,385 347,394 321,405 294,416 267,427 240,440 215,455 189,470 166,488 146,509 125,530 109,556 97,586 84,616 78,652 78,694 78,737 86,776 103,812 120,847 144,878 175,903 206,928 245,948 290,962 335,976 385,983 441,983 469,983 496,981 523,977 549,973 573,968 594,962 615,956 633,950 648,943 663,936 673,930 680,925 686,920 690,915 693,910 696,905 698,899 699,892 700,885 702,876 703,866 704,855 704,842 704,827 704,809 704,794 703,783 702,772 700,763 698,756 695,749 692,745 688,743 684,740 679,739 674,739 668,739 659,743 646,750 633,757 618,764 599,772 580,780 558,788 533,795 508,802 479,805 447,805 424,805 405,803 388,798 371,793 358,787 347,778 336,769 328,759 323,748 318,736 315,723 315,710 315,689 321,672 334,658 347,644 363,632 384,621 405,610 428,600 455,591 481,582 508,572 535,561 562,550 588,537 615,522 641,507 664,489 685,468 706,447 722,421 735,392 748,362 754,327 754,286 Z"/> + <glyph unicode="r" horiz-adv-x="609" d="M 699,843 C 699,819 698,799 697,784 696,769 694,757 691,748 688,739 685,733 681,730 676,727 671,725 664,725 659,725 653,726 646,729 639,731 632,733 624,736 615,739 606,741 596,744 586,746 575,747 563,747 549,747 535,744 521,739 507,733 493,724 478,712 463,700 447,684 431,664 414,644 397,619 378,590 L 378,34 C 378,27 376,22 372,17 368,12 361,7 352,4 342,1 329,-2 313,-3 297,-5 277,-6 252,-6 227,-6 207,-5 191,-3 175,-2 162,1 153,4 143,7 136,12 132,17 128,22 126,27 126,34 L 126,926 C 126,933 128,939 131,944 134,949 140,953 149,956 158,959 169,962 183,964 196,965 213,966 234,966 255,966 273,965 287,964 301,962 312,959 320,956 327,953 333,949 336,944 339,939 341,933 341,926 L 341,815 C 364,848 386,876 407,898 428,919 447,936 466,949 485,962 503,971 522,976 541,981 559,983 578,983 587,983 596,983 606,982 616,981 626,979 637,977 648,974 657,972 665,969 673,966 679,962 683,959 686,956 689,952 691,948 692,944 694,939 695,932 696,925 697,914 698,900 699,886 699,867 699,843 Z"/> + <glyph unicode="p" horiz-adv-x="927" d="M 1024,493 C 1024,414 1016,342 999,279 982,215 957,161 924,116 891,71 851,37 802,13 753,-11 698,-23 635,-23 609,-23 585,-20 564,-15 542,-10 521,-3 501,8 480,18 460,31 440,46 420,61 399,79 378,100 L 378,-320 C 378,-327 376,-333 372,-338 368,-343 361,-348 352,-351 342,-355 329,-358 313,-360 297,-362 277,-363 252,-363 227,-363 207,-362 191,-360 175,-358 162,-355 153,-351 143,-348 136,-343 132,-338 128,-333 126,-327 126,-320 L 126,926 C 126,933 128,939 131,944 134,949 140,953 149,956 157,959 168,962 182,964 195,965 212,966 233,966 253,966 270,965 284,964 297,962 308,959 317,956 325,953 331,949 334,944 337,939 339,933 339,926 L 339,821 C 365,848 391,871 416,892 441,912 466,929 492,943 518,956 545,966 573,973 600,980 630,983 661,983 726,983 782,970 828,945 874,919 912,884 941,839 970,794 991,742 1004,683 1017,624 1024,560 1024,493 Z M 762,475 C 762,513 759,550 754,585 748,620 738,651 725,678 711,705 693,727 671,744 648,760 620,768 587,768 570,768 554,766 538,761 521,756 505,747 488,736 471,725 453,710 435,692 417,674 398,652 378,625 L 378,331 C 413,286 447,252 479,228 511,203 544,191 579,191 612,191 640,199 663,216 686,233 704,255 719,282 734,309 745,339 752,373 759,407 762,441 762,475 Z"/> + <glyph unicode="o" horiz-adv-x="980" d="M 1028,489 C 1028,413 1018,344 998,281 978,218 948,164 907,119 866,74 815,39 754,14 693,-11 621,-23 539,-23 460,-23 391,-12 332,10 273,32 225,64 186,106 147,148 119,200 100,261 81,322 72,392 72,471 72,547 82,617 103,680 123,743 153,797 194,842 235,887 286,921 347,946 408,971 479,983 561,983 641,983 710,972 769,951 828,929 876,897 915,855 953,813 981,761 1000,700 1019,639 1028,568 1028,489 Z M 769,479 C 769,523 766,564 759,601 752,638 740,670 723,697 706,724 684,746 657,761 629,776 594,784 552,784 515,784 482,777 454,764 426,750 403,730 385,704 367,677 354,646 345,609 336,572 331,529 331,482 331,438 335,398 342,361 349,324 361,291 378,264 394,237 416,216 444,201 472,186 507,178 548,178 586,178 619,185 647,199 675,212 698,232 716,258 734,284 747,316 756,353 765,390 769,432 769,479 Z"/> + <glyph unicode="n" horiz-adv-x="874" d="M 978,34 C 978,27 976,22 972,17 968,12 961,7 952,4 943,1 930,-2 914,-3 897,-5 877,-6 853,-6 828,-6 808,-5 792,-3 775,-2 762,1 753,4 744,7 737,12 733,17 729,22 727,27 727,34 L 727,543 C 727,586 724,620 718,645 711,670 702,691 690,709 678,726 663,740 644,750 625,759 602,764 577,764 545,764 513,752 480,729 447,706 413,672 378,627 L 378,34 C 378,27 376,22 372,17 368,12 361,7 352,4 342,1 329,-2 313,-3 297,-5 277,-6 252,-6 227,-6 207,-5 191,-3 175,-2 162,1 153,4 143,7 136,12 132,17 128,22 126,27 126,34 L 126,926 C 126,933 128,939 131,944 134,949 140,953 149,956 158,959 169,962 183,964 196,965 213,966 234,966 255,966 273,965 287,964 301,962 312,959 320,956 327,953 333,949 336,944 339,939 341,933 341,926 L 341,823 C 390,876 441,916 492,943 543,970 596,983 651,983 712,983 763,973 805,953 846,933 880,906 906,872 931,837 950,797 961,751 972,705 978,650 978,585 L 978,34 Z"/> + <glyph unicode="m" horiz-adv-x="1456" d="M 1545,34 C 1545,27 1543,22 1539,17 1535,12 1528,7 1519,4 1510,1 1497,-2 1481,-3 1465,-5 1445,-6 1420,-6 1395,-6 1374,-5 1358,-3 1342,-2 1329,1 1320,4 1310,7 1303,12 1300,17 1296,22 1294,27 1294,34 L 1294,563 C 1294,593 1291,620 1286,645 1280,670 1271,691 1260,709 1248,726 1233,740 1216,750 1198,759 1177,764 1152,764 1122,764 1092,752 1061,729 1030,706 997,672 961,627 L 961,34 C 961,27 959,22 955,17 951,12 944,7 935,4 925,1 912,-2 896,-3 880,-5 860,-6 836,-6 811,-6 791,-5 775,-3 759,-2 746,1 737,4 727,7 720,12 716,17 712,22 710,27 710,34 L 710,563 C 710,593 707,620 702,645 696,670 687,691 676,709 665,726 650,740 632,750 614,759 593,764 569,764 538,764 508,752 477,729 446,706 413,672 378,627 L 378,34 C 378,27 376,22 372,17 368,12 361,7 352,4 342,1 329,-2 313,-3 297,-5 277,-6 252,-6 227,-6 207,-5 191,-3 175,-2 162,1 153,4 143,7 136,12 132,17 128,22 126,27 126,34 L 126,926 C 126,933 128,939 131,944 134,949 140,953 149,956 158,959 169,962 183,964 196,965 213,966 234,966 255,966 273,965 287,964 301,962 312,959 320,956 327,953 333,949 336,944 339,939 341,933 341,926 L 341,823 C 390,876 440,916 489,943 538,970 589,983 642,983 679,983 712,979 741,972 770,964 797,953 820,939 843,924 862,907 879,887 896,867 910,845 921,820 948,849 974,873 1000,894 1025,915 1051,932 1076,945 1101,958 1126,967 1151,974 1176,980 1201,983 1227,983 1286,983 1336,973 1377,953 1418,933 1451,906 1476,872 1501,837 1518,797 1529,751 1540,705 1545,656 1545,605 L 1545,34 Z"/> + <glyph unicode="l" horiz-adv-x="292" d="M 378,34 C 378,27 376,22 372,17 368,12 361,7 352,4 342,1 329,-2 313,-3 297,-5 277,-6 252,-6 227,-6 207,-5 191,-3 175,-2 162,1 153,4 143,7 136,12 132,17 128,22 126,27 126,34 L 126,1349 C 126,1356 128,1362 132,1367 136,1372 143,1377 153,1381 162,1384 175,1387 191,1389 207,1391 227,1392 252,1392 277,1392 297,1391 313,1389 329,1387 342,1384 352,1381 361,1377 368,1372 372,1367 376,1362 378,1356 378,1349 L 378,34 Z"/> + <glyph unicode="k" horiz-adv-x="848" d="M 955,33 C 955,26 953,21 950,16 946,11 939,7 930,4 920,1 907,-2 890,-3 873,-5 852,-6 825,-6 798,-6 776,-5 759,-4 742,-3 728,0 717,3 706,6 697,10 691,15 685,20 680,27 675,36 L 378,506 378,34 C 378,27 376,22 372,17 368,12 361,7 352,4 342,1 329,-2 313,-3 297,-5 277,-6 252,-6 227,-6 207,-5 191,-3 175,-2 162,1 153,4 143,7 136,12 132,17 128,22 126,27 126,34 L 126,1349 C 126,1356 128,1362 132,1367 136,1372 143,1377 153,1381 162,1384 175,1387 191,1389 207,1391 227,1392 252,1392 277,1392 297,1391 313,1389 329,1387 342,1384 352,1381 361,1377 368,1372 372,1367 376,1362 378,1356 378,1349 L 378,566 642,921 C 647,929 653,936 660,942 667,948 676,953 687,956 698,959 711,962 728,964 744,965 765,966 790,966 815,966 836,965 853,964 870,962 883,959 894,956 904,953 911,949 915,944 919,939 921,932 921,925 921,915 919,904 914,893 909,882 901,870 891,857 L 630,561 932,94 C 940,81 946,69 950,60 953,50 955,41 955,33 Z"/> + <glyph unicode="i" horiz-adv-x="292" d="M 378,34 C 378,27 376,22 372,17 368,12 361,7 352,4 342,1 329,-2 313,-3 297,-5 277,-6 252,-6 227,-6 207,-5 191,-3 175,-2 162,1 153,4 143,7 136,12 132,17 128,22 126,27 126,34 L 126,924 C 126,931 128,937 132,942 136,947 143,951 153,955 162,958 175,961 191,963 207,965 227,966 252,966 277,966 297,965 313,963 329,961 342,958 352,955 361,951 368,947 372,942 376,937 378,931 378,924 L 378,34 Z M 397,1228 C 397,1177 387,1142 366,1123 345,1104 307,1094 251,1094 194,1094 156,1103 137,1122 117,1141 107,1174 107,1223 107,1274 117,1309 138,1329 158,1348 196,1358 253,1358 309,1358 347,1349 367,1330 387,1311 397,1277 397,1228 Z"/> + <glyph unicode="h" horiz-adv-x="874" d="M 978,34 C 978,27 976,22 972,17 968,12 961,7 952,4 943,1 930,-2 914,-3 897,-5 877,-6 853,-6 828,-6 808,-5 792,-3 775,-2 762,1 753,4 744,7 737,12 733,17 729,22 727,27 727,34 L 727,543 C 727,586 724,620 718,645 711,670 702,691 690,709 678,726 663,740 644,750 625,759 602,764 577,764 545,764 513,752 480,729 447,706 413,672 378,627 L 378,34 C 378,27 376,22 372,17 368,12 361,7 352,4 342,1 329,-2 313,-3 297,-5 277,-6 252,-6 227,-6 207,-5 191,-3 175,-2 162,1 153,4 143,7 136,12 132,17 128,22 126,27 126,34 L 126,1349 C 126,1356 128,1362 132,1367 136,1372 143,1377 153,1381 162,1384 175,1387 191,1389 207,1391 227,1392 252,1392 277,1392 297,1391 313,1389 329,1387 342,1384 352,1381 361,1377 368,1372 372,1367 376,1362 378,1356 378,1349 L 378,856 C 421,899 466,931 511,952 556,973 602,983 651,983 712,983 763,973 805,953 846,933 880,906 906,871 931,836 950,796 961,750 972,703 978,647 978,581 L 978,34 Z"/> + <glyph unicode="g" horiz-adv-x="901" d="M 930,864 C 930,832 926,808 919,793 912,778 903,770 892,770 L 787,770 C 802,754 812,736 819,716 825,695 828,674 828,652 828,600 819,554 802,514 785,473 760,439 728,412 695,384 656,363 611,349 565,334 514,327 458,327 429,327 402,331 376,338 350,345 330,353 316,362 308,353 301,343 295,331 288,319 285,306 285,291 285,272 294,256 311,244 328,231 351,224 382,223 L 599,215 C 650,213 695,206 735,194 774,181 808,164 835,142 862,119 882,92 897,61 911,30 918,-6 918,-46 918,-90 908,-131 889,-170 870,-209 841,-243 802,-272 763,-301 715,-323 657,-340 598,-357 530,-365 452,-365 376,-365 311,-359 258,-347 204,-335 160,-318 126,-297 91,-276 66,-250 51,-220 35,-191 27,-158 27,-123 27,-101 30,-80 36,-60 41,-40 50,-21 61,-2 72,16 85,33 101,50 117,67 135,83 156,98 127,113 105,134 90,161 74,187 66,216 66,247 66,286 75,322 93,355 111,387 134,416 163,442 140,465 121,493 107,526 93,559 86,599 86,648 86,700 95,747 114,788 132,829 157,863 190,892 223,920 262,942 307,957 352,972 402,979 457,979 485,979 512,977 538,974 563,971 587,966 609,960 L 892,960 C 903,960 913,953 920,938 927,923 930,899 930,864 Z M 607,653 C 607,701 594,738 567,765 540,792 503,805 454,805 429,805 408,801 389,793 370,784 355,773 343,759 330,744 321,728 315,709 309,690 306,670 306,649 306,604 319,568 346,542 373,515 410,502 457,502 482,502 504,506 523,514 542,522 557,533 570,547 582,561 591,577 598,596 604,614 607,633 607,653 Z M 666,-59 C 666,-29 654,-6 630,10 606,26 573,35 531,36 L 352,41 C 335,28 321,16 311,5 300,-7 292,-18 286,-29 279,-40 275,-50 273,-60 271,-70 270,-80 270,-91 270,-124 287,-150 321,-167 354,-184 402,-193 463,-193 501,-193 533,-189 559,-181 585,-174 606,-164 622,-151 638,-138 649,-124 656,-108 663,-93 666,-76 666,-59 Z"/> + <glyph unicode="f" horiz-adv-x="662" d="M 664,1266 C 664,1247 663,1231 662,1220 661,1208 659,1199 656,1193 653,1186 650,1182 647,1180 644,1177 640,1176 636,1176 631,1176 626,1177 621,1180 615,1182 608,1184 600,1187 591,1190 581,1192 570,1195 559,1197 545,1198 530,1198 512,1198 497,1195 484,1190 471,1184 460,1175 451,1163 442,1150 436,1134 432,1115 428,1095 426,1071 426,1042 L 426,960 589,960 C 595,960 601,958 606,955 611,952 615,946 618,939 621,931 624,920 626,907 627,894 628,877 628,858 628,821 625,795 618,780 611,764 602,756 589,756 L 426,756 426,34 C 426,27 424,22 420,17 416,12 409,7 400,4 391,1 378,-2 361,-3 344,-5 324,-6 300,-6 276,-6 256,-5 240,-3 223,-2 210,1 201,4 191,7 184,12 181,17 177,22 175,27 175,34 L 175,756 63,756 C 50,756 41,764 35,780 28,795 25,821 25,858 25,877 26,894 28,907 29,920 32,931 35,939 38,946 42,952 47,955 52,958 57,960 64,960 L 175,960 175,1035 C 175,1096 181,1149 193,1195 205,1240 224,1278 250,1309 275,1339 308,1362 348,1377 387,1392 434,1400 488,1400 514,1400 539,1398 562,1394 585,1389 604,1385 617,1380 630,1375 639,1370 644,1366 649,1361 653,1355 656,1347 659,1338 661,1328 662,1315 663,1302 664,1285 664,1266 Z"/> + <glyph unicode="e" horiz-adv-x="901" d="M 950,506 C 950,475 943,453 930,438 916,423 897,416 873,416 L 330,416 C 330,378 335,344 344,313 353,282 367,255 387,234 406,212 432,195 463,184 494,173 531,167 574,167 618,167 657,170 690,177 723,183 752,190 777,198 801,205 821,212 837,219 853,225 866,228 876,228 882,228 887,227 891,225 895,222 898,218 901,212 904,206 906,198 907,187 908,176 908,162 908,145 908,130 908,118 907,108 906,97 905,88 904,81 903,74 901,68 898,63 895,58 892,53 888,48 883,43 871,37 852,29 833,21 808,13 778,6 748,-2 714,-9 675,-14 636,-20 595,-23 551,-23 472,-23 402,-13 343,7 283,27 233,57 193,98 153,139 123,190 104,252 84,314 74,387 74,470 74,549 84,621 105,685 126,748 156,802 195,847 234,891 282,925 339,948 395,971 458,983 529,983 604,983 668,972 721,950 774,928 817,898 851,859 885,820 910,773 926,720 942,667 950,609 950,546 L 950,506 Z M 706,578 C 708,649 694,704 664,745 633,785 586,805 523,805 491,805 463,799 440,787 416,775 396,759 381,739 365,718 353,694 345,667 336,639 331,609 330,578 L 706,578 Z"/> + <glyph unicode="d" horiz-adv-x="927" d="M 972,34 C 972,27 970,21 967,16 964,11 958,6 950,3 942,0 931,-3 918,-4 904,-5 887,-6 867,-6 846,-6 828,-5 815,-4 802,-3 791,0 783,3 774,6 768,11 765,16 761,21 759,27 759,34 L 759,133 C 713,84 665,45 615,18 564,-9 508,-23 447,-23 379,-23 322,-10 275,17 228,43 189,78 160,123 130,168 108,220 95,280 82,339 75,402 75,468 75,547 84,619 101,682 118,745 142,799 175,844 208,889 248,923 297,947 346,971 402,983 465,983 515,983 560,973 601,953 642,932 682,902 722,863 L 722,1346 C 722,1353 724,1359 728,1364 731,1369 738,1374 748,1378 757,1381 770,1384 786,1386 802,1388 822,1389 847,1389 872,1389 892,1388 908,1386 924,1384 937,1381 946,1378 955,1374 962,1369 966,1364 970,1359 972,1353 972,1346 L 972,34 Z M 722,630 C 686,675 652,710 619,734 586,758 551,770 515,770 482,770 454,762 431,746 407,729 388,707 374,680 359,653 349,622 342,589 335,555 331,520 331,485 331,448 334,411 340,376 346,341 356,309 370,282 383,254 401,232 424,215 447,198 475,190 510,190 527,190 544,193 561,198 577,203 594,211 611,222 628,233 645,248 663,267 681,285 701,307 722,334 L 722,630 Z"/> + <glyph unicode="c" horiz-adv-x="742" d="M 801,176 C 801,159 801,144 800,133 799,121 797,111 796,103 794,95 792,89 790,84 787,79 782,72 774,65 766,57 752,48 733,37 714,26 692,16 667,7 642,-2 616,-9 587,-14 558,-19 528,-22 497,-22 428,-22 368,-11 315,10 262,31 217,63 181,105 145,146 118,197 100,257 81,317 72,386 72,463 72,552 83,630 106,695 128,760 159,813 199,856 239,899 286,930 341,951 396,972 456,982 521,982 548,982 574,980 600,975 625,970 649,964 672,956 694,948 714,939 732,929 749,919 762,910 769,903 776,896 782,890 785,885 788,880 790,873 792,865 793,857 795,847 796,836 797,824 797,810 797,793 797,754 794,727 787,712 780,696 772,688 761,688 750,688 738,693 725,702 712,711 697,722 680,733 663,744 642,755 618,764 594,773 565,778 532,778 467,778 417,753 382,703 347,652 330,578 330,481 330,433 334,391 343,354 352,317 365,287 382,262 399,237 420,219 446,207 471,194 501,188 535,188 570,188 600,193 625,204 650,214 671,225 690,238 709,251 724,262 737,273 750,283 760,288 769,288 775,288 780,286 784,283 788,280 791,274 794,265 796,256 798,244 799,230 800,216 801,198 801,176 Z"/> + <glyph unicode="b" horiz-adv-x="927" d="M 1024,492 C 1024,413 1015,341 998,278 981,215 956,161 923,116 890,71 850,37 803,13 755,-11 701,-23 640,-23 610,-23 582,-20 556,-14 530,-9 505,0 482,13 458,26 435,42 412,61 389,80 365,104 341,131 L 341,34 C 341,27 339,21 336,16 332,11 326,6 318,3 309,0 298,-3 284,-4 270,-5 253,-6 233,-6 212,-6 195,-5 182,-4 168,-3 157,0 149,3 140,6 134,11 131,16 128,21 126,27 126,34 L 126,1349 C 126,1356 128,1362 132,1367 136,1372 143,1377 153,1381 162,1384 175,1387 191,1389 207,1391 227,1392 252,1392 277,1392 297,1391 313,1389 329,1387 342,1384 352,1381 361,1377 368,1372 372,1367 376,1362 378,1356 378,1349 L 378,856 C 401,879 423,898 446,914 469,930 491,943 514,954 537,964 560,971 584,976 608,981 633,983 660,983 726,983 782,970 828,944 874,917 912,882 941,837 970,792 991,740 1004,681 1017,621 1024,558 1024,492 Z M 763,474 C 763,512 760,549 755,584 749,619 739,651 725,678 711,705 693,727 671,744 648,760 620,768 586,768 569,768 553,766 537,761 521,756 505,748 488,737 471,726 453,711 435,693 417,675 398,653 378,626 L 378,330 C 413,285 447,250 480,227 512,203 546,191 581,191 614,191 641,199 664,216 687,233 706,254 721,281 736,308 746,338 753,372 760,406 763,440 763,474 Z"/> + <glyph unicode="a" horiz-adv-x="848" d="M 886,31 C 886,22 883,14 876,9 869,4 859,0 845,-2 830,-5 809,-6 781,-6 751,-6 729,-5 716,-2 702,0 692,4 687,9 681,14 678,22 678,31 L 678,102 C 641,63 600,32 553,10 506,-12 453,-23 396,-23 349,-23 305,-17 266,-4 226,8 192,26 163,51 134,75 111,105 95,141 79,177 71,219 71,267 71,319 81,364 102,403 122,441 152,473 193,498 233,523 283,541 343,553 403,565 473,571 552,571 L 639,571 639,625 C 639,653 636,678 631,699 625,720 616,737 603,751 590,765 572,775 551,782 529,789 502,792 470,792 428,792 391,787 358,778 325,769 295,758 270,747 245,736 224,725 207,716 190,707 176,702 165,702 158,702 151,704 146,709 140,714 135,720 132,729 128,738 125,748 123,761 121,774 120,788 120,803 120,824 122,840 125,852 128,864 135,875 144,885 153,894 170,905 193,917 216,928 244,939 275,949 306,959 341,967 378,974 415,980 453,983 492,983 562,983 622,976 672,963 721,949 762,928 794,900 826,871 849,835 864,790 879,745 886,692 886,631 L 886,31 Z M 639,413 L 543,413 C 502,413 468,410 439,404 410,398 387,389 369,377 351,365 338,351 330,334 321,317 317,297 317,275 317,238 329,208 353,187 376,166 409,155 451,155 486,155 519,164 549,182 578,200 608,226 639,261 L 639,413 Z"/> + <glyph unicode="T" horiz-adv-x="1006" d="M 1002,1186 C 1002,1167 1001,1150 1000,1137 998,1123 995,1112 992,1104 989,1095 985,1089 980,1085 975,1081 969,1079 963,1079 L 639,1079 639,36 C 639,29 637,23 633,18 628,13 621,8 611,5 601,2 588,-1 571,-3 554,-5 532,-6 507,-6 482,-6 461,-5 444,-3 427,-1 413,2 403,5 393,8 386,13 382,18 377,23 375,29 375,36 L 375,1079 51,1079 C 44,1079 39,1081 34,1085 29,1089 25,1095 22,1104 19,1112 16,1123 15,1137 13,1150 12,1167 12,1186 12,1206 13,1223 15,1237 16,1251 19,1262 22,1271 25,1279 29,1285 34,1289 39,1292 44,1294 51,1294 L 963,1294 C 969,1294 975,1292 980,1289 985,1285 989,1279 992,1271 995,1262 998,1251 1000,1237 1001,1223 1002,1206 1002,1186 Z"/> + <glyph unicode="S" horiz-adv-x="848" d="M 908,388 C 908,320 895,260 870,209 845,158 810,115 767,81 724,46 673,20 615,3 557,-14 495,-23 429,-23 384,-23 343,-19 305,-12 266,-5 232,4 203,15 174,25 149,36 130,47 110,58 96,68 87,77 78,86 72,98 69,115 65,131 63,154 63,185 63,206 64,223 65,237 66,251 69,262 72,271 75,280 79,286 84,290 89,293 94,295 101,295 110,295 124,290 141,279 158,268 179,255 206,242 233,229 265,217 302,206 339,195 381,189 430,189 462,189 491,193 516,201 541,208 563,219 581,233 598,247 612,264 621,285 630,306 635,329 635,354 635,383 627,409 611,430 595,451 574,469 549,486 523,502 494,517 461,532 428,546 395,561 360,577 325,593 292,611 259,632 226,652 197,676 172,705 146,733 125,766 109,805 93,844 85,890 85,944 85,1006 97,1061 120,1108 143,1155 174,1194 213,1225 252,1256 298,1279 351,1294 404,1309 460,1317 519,1317 550,1317 580,1315 611,1310 642,1305 670,1299 697,1291 724,1283 747,1274 768,1264 789,1254 802,1246 809,1239 816,1232 820,1227 823,1222 825,1217 827,1211 829,1204 830,1196 831,1186 832,1175 833,1163 833,1148 833,1131 833,1112 833,1095 832,1082 831,1069 829,1058 827,1049 824,1040 821,1034 817,1030 812,1026 806,1024 799,1024 792,1024 780,1029 764,1038 748,1047 728,1058 705,1069 682,1080 655,1090 624,1099 593,1108 560,1112 523,1112 494,1112 469,1109 448,1102 427,1095 409,1085 395,1073 380,1060 370,1045 363,1028 356,1011 352,992 352,973 352,944 360,920 376,899 391,878 412,859 439,843 465,826 495,811 528,797 561,782 595,767 630,751 665,735 699,717 732,697 765,676 795,652 821,624 847,595 868,562 884,524 900,485 908,440 908,388 Z"/> + <glyph unicode="R" horiz-adv-x="980" d="M 1101,34 C 1101,27 1100,21 1097,16 1094,11 1088,6 1078,3 1068,0 1053,-3 1034,-4 1015,-5 988,-6 955,-6 927,-6 905,-5 888,-4 871,-3 858,0 849,4 839,7 832,12 828,18 824,23 821,30 818,38 L 702,327 C 688,360 674,389 661,414 648,439 633,461 617,478 600,495 581,507 560,516 539,525 514,529 486,529 L 404,529 404,36 C 404,29 402,23 398,18 393,13 386,8 376,5 366,2 353,-1 336,-3 319,-5 298,-6 272,-6 247,-6 226,-5 209,-3 192,-1 178,2 168,5 158,8 151,13 147,18 143,23 141,29 141,36 L 141,1211 C 141,1240 149,1262 164,1275 179,1288 197,1294 219,1294 L 554,1294 C 588,1294 616,1293 638,1292 660,1291 680,1289 698,1287 750,1280 797,1267 839,1249 880,1231 916,1208 945,1179 974,1150 996,1115 1011,1076 1026,1036 1034,990 1034,939 1034,896 1029,856 1018,821 1007,785 990,753 969,725 948,697 921,673 890,652 859,631 823,615 783,602 802,593 821,581 838,568 855,555 871,539 886,520 901,501 915,479 928,455 941,430 954,403 967,372 L 1076,117 C 1086,92 1093,73 1096,62 1099,50 1101,41 1101,34 Z M 762,912 C 762,955 752,991 733,1020 714,1049 682,1070 638,1082 625,1085 610,1088 593,1090 576,1092 552,1093 522,1093 L 404,1093 404,726 538,726 C 575,726 608,731 636,740 664,749 687,761 706,778 725,794 739,813 748,836 757,859 762,884 762,912 Z"/> + <glyph unicode="P" horiz-adv-x="901" d="M 1027,901 C 1027,828 1016,764 993,708 970,652 937,605 894,567 851,528 798,499 735,479 672,459 597,449 512,449 L 404,449 404,36 C 404,29 402,23 398,18 393,13 386,8 376,5 366,2 353,-1 336,-3 319,-5 298,-6 272,-6 247,-6 226,-5 209,-3 192,-1 178,2 168,5 158,8 151,13 147,18 143,23 141,29 141,36 L 141,1200 C 141,1231 149,1255 166,1271 182,1286 203,1294 230,1294 L 535,1294 C 566,1294 595,1293 623,1291 650,1288 683,1283 722,1276 761,1268 800,1254 840,1233 879,1212 913,1186 941,1155 969,1123 990,1086 1005,1044 1020,1001 1027,954 1027,901 Z M 752,882 C 752,927 744,965 728,994 712,1023 692,1045 669,1059 646,1073 621,1082 596,1086 570,1089 543,1091 516,1091 L 404,1091 404,652 522,652 C 564,652 599,658 628,669 656,680 679,696 697,717 715,737 729,761 738,790 747,818 752,849 752,882 Z"/> + <glyph unicode="M" horiz-adv-x="1509" d="M 1649,36 C 1649,29 1647,23 1644,18 1640,13 1633,8 1624,5 1614,2 1601,-1 1585,-3 1569,-5 1549,-6 1524,-6 1500,-6 1480,-5 1464,-3 1448,-1 1435,2 1426,5 1417,8 1410,13 1406,18 1402,23 1400,29 1400,36 L 1400,1089 1398,1089 1023,37 C 1020,28 1016,21 1010,16 1004,10 996,5 986,2 975,-1 962,-3 946,-4 930,-5 911,-6 888,-6 865,-6 846,-5 830,-3 814,-2 801,1 791,5 780,8 772,13 766,18 760,23 756,30 754,37 L 392,1089 390,1089 390,36 C 390,29 388,23 385,18 381,13 374,8 364,5 354,2 341,-1 326,-3 310,-5 290,-6 265,-6 241,-6 221,-5 205,-3 189,-1 176,2 167,5 157,8 150,13 147,18 143,23 141,29 141,36 L 141,1189 C 141,1223 150,1249 168,1267 186,1285 210,1294 240,1294 L 412,1294 C 443,1294 469,1292 491,1287 513,1282 532,1273 548,1262 564,1250 577,1235 588,1216 599,1197 608,1173 616,1145 L 896,374 900,374 1190,1143 C 1199,1171 1208,1195 1219,1214 1229,1233 1241,1249 1255,1261 1268,1273 1284,1282 1303,1287 1322,1292 1343,1294 1368,1294 L 1545,1294 C 1563,1294 1579,1292 1592,1287 1605,1282 1615,1276 1624,1267 1632,1258 1638,1247 1643,1234 1647,1221 1649,1206 1649,1189 L 1649,36 Z"/> + <glyph unicode="L" horiz-adv-x="742" d="M 852,110 C 852,90 851,73 850,60 848,46 845,35 842,26 839,17 835,10 830,6 825,2 819,0 812,0 L 219,0 C 197,0 179,7 164,20 149,33 141,54 141,83 L 141,1258 C 141,1265 143,1271 148,1276 152,1281 159,1286 169,1289 179,1292 193,1295 210,1297 227,1299 248,1300 273,1300 299,1300 320,1299 337,1297 354,1295 367,1292 377,1289 387,1286 394,1281 399,1276 403,1271 405,1265 405,1258 L 405,217 812,217 C 819,217 825,215 830,212 835,208 839,202 842,194 845,185 848,174 850,161 851,147 852,130 852,110 Z"/> + <glyph unicode="I" horiz-adv-x="292" d="M 405,36 C 405,29 403,23 399,18 394,13 387,8 377,5 367,2 354,-1 337,-3 320,-5 299,-6 273,-6 248,-6 227,-5 210,-3 193,-1 179,2 169,5 159,8 152,13 148,18 143,23 141,29 141,36 L 141,1258 C 141,1265 143,1271 148,1276 152,1281 159,1286 170,1289 180,1292 193,1295 210,1297 227,1299 248,1300 273,1300 299,1300 320,1299 337,1297 354,1295 367,1292 377,1289 387,1286 394,1281 399,1276 403,1271 405,1265 405,1258 L 405,36 Z"/> + <glyph unicode="D" horiz-adv-x="1113" d="M 1216,666 C 1216,547 1201,446 1170,362 1139,277 1094,208 1036,155 978,102 908,63 825,38 742,13 643,0 528,0 L 219,0 C 197,0 179,7 164,20 149,33 141,54 141,83 L 141,1211 C 141,1240 149,1262 164,1275 179,1288 197,1294 219,1294 L 551,1294 C 666,1294 764,1281 845,1254 925,1227 993,1187 1048,1134 1103,1081 1144,1015 1173,937 1202,859 1216,769 1216,666 Z M 944,657 C 944,718 937,775 923,828 908,881 885,926 854,965 822,1004 781,1034 732,1056 682,1077 617,1088 536,1088 L 403,1088 403,208 540,208 C 612,208 673,217 722,236 771,255 813,283 846,321 879,358 903,405 920,461 936,517 944,582 944,657 Z"/> + <glyph unicode="A" horiz-adv-x="1218" d="M 1201,98 C 1209,74 1214,55 1216,41 1218,27 1215,17 1208,10 1201,3 1188,-2 1169,-3 1150,-5 1125,-6 1092,-6 1058,-6 1032,-5 1013,-4 994,-3 979,-1 969,2 959,5 952,9 948,14 944,19 941,26 938,35 L 851,295 365,295 283,42 C 280,33 277,25 273,19 268,12 261,7 252,4 242,0 228,-3 211,-4 193,-5 170,-6 141,-6 110,-6 86,-5 69,-3 52,-1 40,4 33,12 26,19 24,30 26,44 28,58 33,77 41,100 L 440,1248 C 444,1259 449,1269 454,1276 459,1283 468,1288 480,1292 491,1295 507,1298 528,1299 549,1300 576,1300 610,1300 649,1300 681,1300 704,1299 727,1298 746,1295 759,1292 772,1288 781,1282 787,1275 792,1268 797,1258 801,1245 L 1201,98 Z M 607,1047 L 606,1047 423,497 790,497 607,1047 Z"/> + <glyph unicode=":" horiz-adv-x="319" d="M 442,790 C 442,762 440,739 435,720 430,701 423,686 412,674 401,662 386,654 368,649 350,644 327,641 300,641 273,641 250,644 232,649 214,654 200,662 189,674 178,686 170,701 166,720 162,739 160,762 160,790 160,819 162,843 166,862 170,881 178,897 189,909 200,921 214,930 232,935 250,940 273,943 300,943 327,943 350,940 368,935 386,930 401,921 412,909 423,897 430,881 435,862 440,843 442,819 442,790 Z M 442,137 C 442,109 440,86 435,67 430,48 423,32 412,20 401,8 386,0 368,-5 350,-10 327,-13 300,-13 273,-13 250,-10 232,-5 214,0 200,8 189,20 178,32 170,48 166,67 162,86 160,109 160,137 160,165 162,189 166,209 170,228 178,244 189,256 200,268 214,277 232,282 250,287 273,289 300,289 327,289 350,287 368,282 386,277 401,268 412,256 423,244 430,228 435,209 440,189 442,165 442,137 Z"/> + <glyph unicode=" " horiz-adv-x="450"/> + </font> + </defs> + <defs class="TextShapeIndex"> + <g ooo:slide="id1" ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41 id42 id43 id44 id45 id46 id47 id48 id49 id50 id51 id52 id53 id54 id55 id56 id57 id58 id59 id60 id61 id62 id63 id64 id65 id66 id67 id68 id69 id70 id71 id72 id73 id74 id75 id76 id77 id78 id79 id80 id81"/> + </defs> + <defs class="EmbeddedBulletChars"> + <g id="bullet-char-template-57356" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/> + </g> + <g id="bullet-char-template-57354" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/> + </g> + <g id="bullet-char-template-10146" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/> + </g> + <g id="bullet-char-template-10132" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/> + </g> + <g id="bullet-char-template-10007" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/> + </g> + <g id="bullet-char-template-10004" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/> + </g> + <g id="bullet-char-template-9679" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/> + </g> + <g id="bullet-char-template-8226" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/> + </g> + <g id="bullet-char-template-8211" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/> + </g> + <g id="bullet-char-template-61548" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 173,740 C 173,903 231,1043 346,1159 462,1274 601,1332 765,1332 928,1332 1067,1274 1183,1159 1299,1043 1357,903 1357,740 1357,577 1299,437 1183,322 1067,206 928,148 765,148 601,148 462,206 346,322 231,437 173,577 173,740 Z"/> + </g> + </defs> + <g> + <g id="id2" class="Master_Slide"> + <g id="bg-id2" class="Background"/> + <g id="bo-id2" class="BackgroundObjects"/> + </g> + </g> + <g class="SlideGroup"> + <g> + <g id="container-id1"> + <g id="id1" class="Slide" clip-path="url(#presentation_clip_path)"> + <g class="Page"> + <defs class="SlideBackground"> + <g id="bg-id1" class="Background"> + <path fill="rgb(0,0,0)" stroke="none" d="M 17767,21576 L -13,21576 -13,-13 35546,-13 35546,21576 17767,21576 Z"/> + </g> + </defs> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id3"> + <rect class="BoundingBox" stroke="none" fill="none" x="81" y="-63" width="35480" height="21717"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 17820,21621 L 82,21652 82,0 35559,-62 35559,21590 17820,21621 Z"/> + <path fill="none" stroke="rgb(17,17,17)" d="M 17820,21621 L 82,21652 82,0 35559,-62 35559,21590 17820,21621 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id4"> + <rect class="BoundingBox" stroke="none" fill="none" x="16733" y="4561" width="3176" height="2162"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 16769,4597 L 19872,4597 19872,6686 16769,6686 16769,4597 Z"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="71" stroke-linejoin="round" d="M 16769,4597 L 19872,4597 19872,6686 16769,6686 16769,4597 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="18034" y="5099"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">KCS </tspan></tspan><tspan class="TextPosition" x="17194" y="5564"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="17565" y="6029"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="17069" y="6494"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library Instance</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id5"> + <rect class="BoundingBox" stroke="none" fill="none" x="16704" y="7518" width="3176" height="2162"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 16740,7554 L 19843,7554 19843,9643 16740,9643 16740,7554 Z"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="71" stroke-linejoin="round" d="M 16740,7554 L 19843,7554 19843,9643 16740,9643 16740,7554 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="18039" y="8056"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">I2C </tspan></tspan><tspan class="TextPosition" x="17165" y="8521"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="17536" y="8986"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="17040" y="9451"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library Instance</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id6"> + <rect class="BoundingBox" stroke="none" fill="none" x="16725" y="16362" width="3176" height="2162"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 16761,16398 L 19864,16398 19864,18487 16761,18487 16761,16398 Z"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="71" stroke-linejoin="round" d="M 16761,16398 L 19864,16398 19864,18487 16761,18487 16761,16398 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="18060" y="16900"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">I3C </tspan></tspan><tspan class="TextPosition" x="17186" y="17365"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="17557" y="17830"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="17061" y="18295"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library Instance</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id7"> + <rect class="BoundingBox" stroke="none" fill="none" x="16704" y="13415" width="3176" height="2162"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 16740,13451 L 19843,13451 19843,15540 16740,15540 16740,13451 Z"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="71" stroke-linejoin="round" d="M 16740,13451 L 19843,13451 19843,15540 16740,15540 16740,13451 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="17972" y="13953"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">USB </tspan></tspan><tspan class="TextPosition" x="17165" y="14418"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="17536" y="14883"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="17040" y="15348"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library Instance</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id8"> + <rect class="BoundingBox" stroke="none" fill="none" x="16704" y="10469" width="3176" height="2162"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 16740,10505 L 19843,10505 19843,12594 16740,12594 16740,10505 Z"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="71" stroke-linejoin="round" d="M 16740,10505 L 19843,10505 19843,12594 16740,12594 16740,10505 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="17595" y="11007"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">PCI VDM </tspan></tspan><tspan class="TextPosition" x="17165" y="11472"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="17536" y="11937"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="17040" y="12402"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library Instance</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id9"> + <rect class="BoundingBox" stroke="none" fill="none" x="16755" y="19206" width="3176" height="1582"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 16791,19242 L 19894,19242 19894,20751 16791,20751 16791,19242 Z"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="71" stroke-linejoin="round" d="M 16791,19242 L 19894,19242 19894,20751 16791,20751 16791,19242 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="17045" y="19743"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Others: MMBI, </tspan></tspan><tspan class="TextPosition" x="17045" y="20124"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Block transfer,</tspan></tspan><tspan class="TextPosition" x="17045" y="20505"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">RMII, etc.</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id10"> + <rect class="BoundingBox" stroke="none" fill="none" x="28869" y="4490" width="2822" height="2185"/> + <path fill="rgb(0,112,192)" stroke="none" d="M 28905,4526 L 31654,4526 31654,6638 28905,6638 28905,4526 Z"/> + <path fill="none" stroke="rgb(189,251,255)" stroke-width="71" stroke-linejoin="round" d="M 28905,4526 L 31654,4526 31654,6638 28905,6638 28905,4526 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="29282" y="5568"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">KCS Protocol </tspan></tspan><tspan class="TextPosition" x="29750" y="6033"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Driver </tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id11"> + <rect class="BoundingBox" stroke="none" fill="none" x="28869" y="7414" width="2822" height="2230"/> + <path fill="rgb(0,112,192)" stroke="none" d="M 28905,7450 L 31654,7450 31654,9607 28905,9607 28905,7450 Z"/> + <path fill="none" stroke="rgb(189,251,255)" stroke-width="71" stroke-linejoin="round" d="M 28905,7450 L 31654,7450 31654,9607 28905,9607 28905,7450 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="29739" y="8282"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">SMBus </tspan></tspan><tspan class="TextPosition" x="29612" y="8747"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Protocol </tspan></tspan><tspan class="TextPosition" x="29795" y="9212"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id12"> + <rect class="BoundingBox" stroke="none" fill="none" x="28904" y="10466" width="2822" height="2136"/> + <path fill="rgb(0,112,192)" stroke="none" d="M 28940,10502 L 31689,10502 31689,12565 28940,12565 28940,10502 Z"/> + <path fill="none" stroke="rgb(189,251,255)" stroke-width="71" stroke-linejoin="round" d="M 28940,10502 L 31689,10502 31689,12565 28940,12565 28940,10502 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="29349" y="11520"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">PCI Protocol </tspan></tspan><tspan class="TextPosition" x="29830" y="11985"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id13"> + <rect class="BoundingBox" stroke="none" fill="none" x="28922" y="13390" width="2822" height="2116"/> + <path fill="rgb(0,112,192)" stroke="none" d="M 28958,13426 L 31707,13426 31707,15469 28958,15469 28958,13426 Z"/> + <path fill="none" stroke="rgb(189,251,255)" stroke-width="71" stroke-linejoin="round" d="M 28958,13426 L 31707,13426 31707,15469 28958,15469 28958,13426 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="29301" y="14434"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">USB Protocol </tspan></tspan><tspan class="TextPosition" x="29848" y="14899"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id14"> + <rect class="BoundingBox" stroke="none" fill="none" x="28922" y="16247" width="2822" height="2270"/> + <path fill="rgb(0,112,192)" stroke="none" d="M 28958,16283 L 31707,16283 31707,18480 28958,18480 28958,16283 Z"/> + <path fill="none" stroke="rgb(189,251,255)" stroke-width="71" stroke-linejoin="round" d="M 28958,16283 L 31707,16283 31707,18480 28958,18480 28958,16283 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="388px" font-weight="400"><tspan class="TextPosition" x="30080" y="17135"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">I3C</tspan></tspan><tspan class="TextPosition" x="29621" y="17600"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre"> Protocol </tspan></tspan><tspan class="TextPosition" x="29848" y="18065"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id15"> + <rect class="BoundingBox" stroke="none" fill="none" x="1298" y="7516" width="6055" height="6180"/> + <path fill="rgb(0,170,181)" fill-opacity="0.639" stroke="rgb(255,255,255)" stroke-opacity="0.639" d="M 2011,7516 L 2012,7516 C 1887,7516 1764,7549 1655,7612 1547,7674 1457,7764 1395,7872 1332,7981 1299,8104 1299,8229 L 1299,12982 1299,12982 C 1299,13107 1332,13230 1395,13339 1457,13447 1547,13537 1655,13599 1764,13662 1887,13695 2012,13695 L 6639,13695 6639,13695 C 6764,13695 6887,13662 6996,13599 7104,13537 7194,13447 7256,13339 7319,13230 7352,13107 7352,12982 L 7352,8228 7352,8229 7352,8229 C 7352,8104 7319,7981 7256,7872 7194,7764 7104,7674 6996,7612 6887,7549 6764,7516 6639,7516 L 2011,7516 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id16"> + <rect class="BoundingBox" stroke="none" fill="none" x="4271" y="10123" width="2665" height="2308"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 4307,10159 L 6899,10159 6899,12394 4307,12394 4307,10159 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 4307,10159 L 6899,10159 6899,12394 4307,12394 4307,10159 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="5092" y="11256"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">PLDM </tspan></tspan><tspan class="TextPosition" x="4880" y="11763"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id17"> + <rect class="BoundingBox" stroke="none" fill="none" x="8892" y="6886" width="2665" height="2485"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 8928,6922 L 11520,6922 11520,9334 8928,9334 8928,6922 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 8928,6922 L 11520,6922 11520,9334 8928,9334 8928,6922 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="9715" y="8107"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">MCTP </tspan></tspan><tspan class="TextPosition" x="9501" y="8614"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id18"> + <rect class="BoundingBox" stroke="none" fill="none" x="8949" y="9406" width="2593" height="945"/> + <path fill="rgb(237,28,36)" stroke="none" d="M 8949,9406 L 11541,9406 11541,10350 8949,10350 8949,9406 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="370px" font-weight="400"><tspan class="TextPosition" x="9527" y="9804"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="9728" y="10248"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id19"> + <rect class="BoundingBox" stroke="none" fill="none" x="6053" y="15017" width="2665" height="2558"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 6089,15053 L 8681,15053 8681,17538 6089,17538 6089,15053 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 6089,15053 L 8681,15053 8681,17538 6089,17538 6089,15053 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="6988" y="16275"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">IPMI </tspan></tspan><tspan class="TextPosition" x="6662" y="16782"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id20"> + <rect class="BoundingBox" stroke="none" fill="none" x="6071" y="17565" width="2670" height="945"/> + <path fill="rgb(237,28,36)" stroke="none" d="M 6071,17565 L 8740,17565 8740,18509 6071,18509 6071,17565 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="370px" font-weight="400"><tspan class="TextPosition" x="6687" y="17963"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="6888" y="18407"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id21"> + <rect class="BoundingBox" stroke="none" fill="none" x="2048" y="8817" width="2376" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 2241,8853 L 2241,8853 C 2214,8853 2187,8860 2163,8874 2139,8888 2119,8908 2105,8932 2091,8956 2084,8983 2084,9010 L 2084,9639 2084,9640 C 2084,9667 2091,9694 2105,9718 2119,9742 2139,9762 2163,9776 2187,9790 2214,9797 2241,9797 L 4229,9797 4230,9797 C 4257,9797 4284,9790 4308,9776 4332,9762 4352,9742 4366,9718 4380,9694 4387,9667 4387,9640 L 4387,9010 4387,9010 4387,9010 C 4387,8983 4380,8956 4366,8932 4352,8908 4332,8888 4308,8874 4284,8860 4257,8853 4230,8853 L 2241,8853 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 2241,8853 L 2241,8853 C 2214,8853 2187,8860 2163,8874 2139,8888 2119,8908 2105,8932 2091,8956 2084,8983 2084,9010 L 2084,9639 2084,9640 C 2084,9667 2091,9694 2105,9718 2119,9742 2139,9762 2163,9776 2187,9790 2214,9797 2241,9797 L 4229,9797 4230,9797 C 4257,9797 4284,9790 4308,9776 4332,9762 4352,9742 4366,9718 4380,9694 4387,9667 4387,9640 L 4387,9010 4387,9010 4387,9010 C 4387,8983 4380,8956 4366,8932 4352,8908 4332,8888 4308,8874 4284,8860 4257,8853 4230,8853 L 2241,8853 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="2560" y="9452"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">PLDM BCC</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id22"> + <rect class="BoundingBox" stroke="none" fill="none" x="4319" y="7705" width="2376" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 4512,7741 L 4512,7741 C 4485,7741 4458,7748 4434,7762 4410,7776 4390,7796 4376,7820 4362,7844 4355,7871 4355,7898 L 4355,8527 4355,8528 C 4355,8555 4362,8582 4376,8606 4390,8630 4410,8650 4434,8664 4458,8678 4485,8685 4512,8685 L 6500,8685 6501,8685 C 6528,8685 6555,8678 6579,8664 6603,8650 6623,8630 6637,8606 6651,8582 6658,8555 6658,8528 L 6658,7898 6658,7898 6658,7898 C 6658,7871 6651,7844 6637,7820 6623,7796 6603,7776 6579,7762 6555,7748 6528,7741 6501,7741 L 4512,7741 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 4512,7741 L 4512,7741 C 4485,7741 4458,7748 4434,7762 4410,7776 4390,7796 4376,7820 4362,7844 4355,7871 4355,7898 L 4355,8527 4355,8528 C 4355,8555 4362,8582 4376,8606 4390,8630 4410,8650 4434,8664 4458,8678 4485,8685 4512,8685 L 6500,8685 6501,8685 C 6528,8685 6555,8678 6579,8664 6603,8650 6623,8630 6637,8606 6651,8582 6658,8555 6658,8528 L 6658,7898 6658,7898 6658,7898 C 6658,7871 6651,7844 6637,7820 6623,7796 6603,7776 6579,7762 6555,7748 6528,7741 6501,7741 L 4512,7741 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="5123" y="8150"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">PLDM </tspan></tspan><tspan class="TextPosition" x="4994" y="8531"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">SMBIOS</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id23"> + <rect class="BoundingBox" stroke="none" fill="none" x="1392" y="11618" width="2376" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 1585,11654 L 1585,11654 C 1558,11654 1531,11661 1507,11675 1483,11689 1463,11709 1449,11733 1435,11757 1428,11784 1428,11811 L 1428,12440 1428,12441 C 1428,12468 1435,12495 1449,12519 1463,12543 1483,12563 1507,12577 1531,12591 1558,12598 1585,12598 L 3573,12598 3574,12598 C 3601,12598 3628,12591 3652,12577 3676,12563 3696,12543 3710,12519 3724,12495 3731,12468 3731,12441 L 3731,11811 3731,11811 3731,11811 C 3731,11784 3724,11757 3710,11733 3696,11709 3676,11689 3652,11675 3628,11661 3601,11654 3574,11654 L 1585,11654 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 1585,11654 L 1585,11654 C 1558,11654 1531,11661 1507,11675 1483,11689 1463,11709 1449,11733 1435,11757 1428,11784 1428,11811 L 1428,12440 1428,12441 C 1428,12468 1435,12495 1449,12519 1463,12543 1483,12563 1507,12577 1531,12591 1558,12598 1585,12598 L 3573,12598 3574,12598 C 3601,12598 3628,12591 3652,12577 3676,12563 3696,12543 3710,12519 3724,12495 3731,12468 3731,12441 L 3731,11811 3731,11811 3731,11811 C 3731,11784 3724,11757 3710,11733 3696,11709 3676,11689 3652,11675 3628,11661 3601,11654 3574,11654 L 1585,11654 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="1899" y="12253"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">PLDM FRU</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id24"> + <rect class="BoundingBox" stroke="none" fill="none" x="1386" y="10166" width="2376" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 1579,10202 L 1579,10202 C 1552,10202 1525,10209 1501,10223 1477,10237 1457,10257 1443,10281 1429,10305 1422,10332 1422,10359 L 1422,10988 1422,10989 C 1422,11016 1429,11043 1443,11067 1457,11091 1477,11111 1501,11125 1525,11139 1552,11146 1579,11146 L 3567,11146 3568,11146 C 3595,11146 3622,11139 3646,11125 3670,11111 3690,11091 3704,11067 3718,11043 3725,11016 3725,10989 L 3725,10359 3725,10359 3725,10359 C 3725,10332 3718,10305 3704,10281 3690,10257 3670,10237 3646,10223 3622,10209 3595,10202 3568,10202 L 1579,10202 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 1579,10202 L 1579,10202 C 1552,10202 1525,10209 1501,10223 1477,10237 1457,10257 1443,10281 1429,10305 1422,10332 1422,10359 L 1422,10988 1422,10989 C 1422,11016 1429,11043 1443,11067 1457,11091 1477,11111 1501,11125 1525,11139 1552,11146 1579,11146 L 3567,11146 3568,11146 C 3595,11146 3622,11139 3646,11125 3670,11111 3690,11091 3704,11067 3718,11043 3725,11016 3725,10989 L 3725,10359 3725,10359 3725,10359 C 3725,10332 3718,10305 3704,10281 3690,10257 3670,10237 3646,10223 3622,10209 3595,10202 3568,10202 L 1579,10202 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="1851" y="10801"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">PLDM PMC</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id25"> + <rect class="BoundingBox" stroke="none" fill="none" x="3717" y="11276" width="592" height="864"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 3730,12126 L 4147,11513"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 4308,11276 L 4057,11468 4222,11580 4308,11276 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id26"> + <rect class="BoundingBox" stroke="none" fill="none" x="3711" y="10661" width="598" height="616"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 3724,10674 L 4108,11070"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 4308,11276 L 4171,10991 4027,11130 4308,11276 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id27"> + <rect class="BoundingBox" stroke="none" fill="none" x="4373" y="9312" width="1231" height="848"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 4386,9325 L 5367,9997"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 5603,10159 L 5412,9907 5299,10072 5603,10159 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id28"> + <rect class="BoundingBox" stroke="none" fill="none" x="5483" y="8672" width="202" height="1488"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 5506,8685 L 5584,9873"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 5603,10159 L 5683,9853 5484,9866 5603,10159 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id29"> + <rect class="BoundingBox" stroke="none" fill="none" x="4819" y="5188" width="2376" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 5012,5224 L 5012,5224 C 4985,5224 4958,5231 4934,5245 4910,5259 4890,5279 4876,5303 4862,5327 4855,5354 4855,5381 L 4855,6010 4855,6011 C 4855,6038 4862,6065 4876,6089 4890,6113 4910,6133 4934,6147 4958,6161 4985,6168 5012,6168 L 7000,6168 7001,6168 C 7028,6168 7055,6161 7079,6147 7103,6133 7123,6113 7137,6089 7151,6065 7158,6038 7158,6011 L 7158,5381 7158,5381 7158,5381 C 7158,5354 7151,5327 7137,5303 7123,5279 7103,5259 7079,5245 7055,5231 7028,5224 7001,5224 L 5012,5224 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 5012,5224 L 5012,5224 C 4985,5224 4958,5231 4934,5245 4910,5259 4890,5279 4876,5303 4862,5327 4855,5354 4855,5381 L 4855,6010 4855,6011 C 4855,6038 4862,6065 4876,6089 4890,6113 4910,6133 4934,6147 4958,6161 4985,6168 5012,6168 L 7000,6168 7001,6168 C 7028,6168 7055,6161 7079,6147 7103,6133 7123,6113 7137,6089 7151,6065 7158,6038 7158,6011 L 7158,5381 7158,5381 7158,5381 C 7158,5354 7151,5327 7137,5303 7123,5279 7103,5259 7079,5245 7055,5231 7028,5224 7001,5224 L 5012,5224 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="5623" y="5823"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">PLDM</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id30"> + <rect class="BoundingBox" stroke="none" fill="none" x="7430" y="4036" width="2608" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 7623,4072 L 7623,4072 C 7596,4072 7569,4079 7545,4093 7521,4107 7501,4127 7487,4151 7473,4175 7466,4202 7466,4229 L 7466,4858 7466,4859 C 7466,4886 7473,4913 7487,4937 7501,4961 7521,4981 7545,4995 7569,5009 7596,5016 7623,5016 L 9843,5016 9844,5016 C 9871,5016 9898,5009 9922,4995 9946,4981 9966,4961 9980,4937 9994,4913 10001,4886 10001,4859 L 10001,4229 10001,4229 10001,4229 C 10001,4202 9994,4175 9980,4151 9966,4127 9946,4107 9922,4093 9898,4079 9871,4072 9844,4072 L 7623,4072 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 7623,4072 L 7623,4072 C 7596,4072 7569,4079 7545,4093 7521,4107 7501,4127 7487,4151 7473,4175 7466,4202 7466,4229 L 7466,4858 7466,4859 C 7466,4886 7473,4913 7487,4937 7501,4961 7521,4981 7545,4995 7569,5009 7596,5016 7623,5016 L 9843,5016 9844,5016 C 9871,5016 9898,5009 9922,4995 9946,4981 9966,4961 9980,4937 9994,4913 10001,4886 10001,4859 L 10001,4229 10001,4229 10001,4229 C 10001,4202 9994,4175 9980,4151 9966,4127 9946,4107 9922,4093 9898,4079 9871,4072 9844,4072 L 7623,4072 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="8326" y="4481"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">NVMe </tspan></tspan><tspan class="TextPosition" x="7869" y="4862"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">Management</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id31"> + <rect class="BoundingBox" stroke="none" fill="none" x="8720" y="5003" width="1505" height="1921"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 8733,5016 L 10047,6697"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 10224,6923 L 10118,6625 9960,6748 10224,6923 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id32"> + <rect class="BoundingBox" stroke="none" fill="none" x="7144" y="5683" width="3081" height="1241"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 7157,5696 L 9958,6817"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 10224,6923 L 9983,6719 9908,6904 10224,6923 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id33"> + <rect class="BoundingBox" stroke="none" fill="none" x="1707" y="18187" width="2608" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 1900,18223 L 1900,18223 C 1873,18223 1846,18230 1822,18244 1798,18258 1778,18278 1764,18302 1750,18326 1743,18353 1743,18380 L 1743,19009 1743,19010 C 1743,19037 1750,19064 1764,19088 1778,19112 1798,19132 1822,19146 1846,19160 1873,19167 1900,19167 L 4120,19167 4121,19167 C 4148,19167 4175,19160 4199,19146 4223,19132 4243,19112 4257,19088 4271,19064 4278,19037 4278,19010 L 4278,18380 4278,18380 4278,18380 C 4278,18353 4271,18326 4257,18302 4243,18278 4223,18258 4199,18244 4175,18230 4148,18223 4121,18223 L 1900,18223 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 1900,18223 L 1900,18223 C 1873,18223 1846,18230 1822,18244 1798,18258 1778,18278 1764,18302 1750,18326 1743,18353 1743,18380 L 1743,19009 1743,19010 C 1743,19037 1750,19064 1764,19088 1778,19112 1798,19132 1822,19146 1846,19160 1873,19167 1900,19167 L 4120,19167 4121,19167 C 4148,19167 4175,19160 4199,19146 4223,19132 4243,19112 4257,19088 4271,19064 4278,19037 4278,19010 L 4278,18380 4278,18380 4278,18380 C 4278,18353 4271,18326 4257,18302 4243,18278 4223,18258 4199,18244 4175,18230 4148,18223 4121,18223 L 1900,18223 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="2288" y="18822"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">IPMI NetFn</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id34"> + <rect class="BoundingBox" stroke="none" fill="none" x="4264" y="16295" width="1827" height="2414"/> + <path fill="none" stroke="rgb(255,192,0)" stroke-width="26" stroke-linejoin="round" d="M 4277,18695 L 5917,16524"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 6090,16295 L 5829,16474 5989,16595 6090,16295 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id35"> + <rect class="BoundingBox" stroke="none" fill="none" x="1325" y="16471" width="2608" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 1518,16507 L 1518,16507 C 1491,16507 1464,16514 1440,16528 1416,16542 1396,16562 1382,16586 1368,16610 1361,16637 1361,16664 L 1361,17293 1361,17294 C 1361,17321 1368,17348 1382,17372 1396,17396 1416,17416 1440,17430 1464,17444 1491,17451 1518,17451 L 3738,17451 3739,17451 C 3766,17451 3793,17444 3817,17430 3841,17416 3861,17396 3875,17372 3889,17348 3896,17321 3896,17294 L 3896,16664 3896,16664 3896,16664 C 3896,16637 3889,16610 3875,16586 3861,16562 3841,16542 3817,16528 3793,16514 3766,16507 3739,16507 L 1518,16507 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 1518,16507 L 1518,16507 C 1491,16507 1464,16514 1440,16528 1416,16542 1396,16562 1382,16586 1368,16610 1361,16637 1361,16664 L 1361,17293 1361,17294 C 1361,17321 1368,17348 1382,17372 1396,17396 1416,17416 1440,17430 1464,17444 1491,17451 1518,17451 L 3738,17451 3739,17451 C 3766,17451 3793,17444 3817,17430 3841,17416 3861,17396 3875,17372 3889,17348 3896,17321 3896,17294 L 3896,16664 3896,16664 3896,16664 C 3896,16637 3889,16610 3875,16586 3861,16562 3841,16542 3817,16528 3793,16514 3766,16507 3739,16507 L 1518,16507 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="1980" y="16916"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">Redfish HI </tspan></tspan><tspan class="TextPosition" x="2240" y="17297"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">NetFn</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id36"> + <rect class="BoundingBox" stroke="none" fill="none" x="3882" y="16288" width="2209" height="705"/> + <path fill="none" stroke="rgb(255,192,0)" stroke-width="26" stroke-linejoin="round" d="M 3895,16979 L 5816,16380"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 6090,16295 L 5774,16289 5833,16480 6090,16295 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id37"> + <rect class="BoundingBox" stroke="none" fill="none" x="11528" y="9865" width="993" height="1080"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 12326,10733 L 11541,9878"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 12520,10944 L 12391,10655 12243,10791 12520,10944 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id38"> + <rect class="BoundingBox" stroke="none" fill="none" x="10462" y="4517" width="2608" height="1017"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 10655,4553 L 10655,4553 C 10628,4553 10601,4560 10577,4574 10553,4588 10533,4608 10519,4632 10505,4656 10498,4683 10498,4710 L 10498,5339 10498,5340 C 10498,5367 10505,5394 10519,5418 10533,5442 10553,5462 10577,5476 10601,5490 10628,5497 10655,5497 L 12875,5497 12876,5497 C 12903,5497 12930,5490 12954,5476 12978,5462 12998,5442 13012,5418 13026,5394 13033,5367 13033,5340 L 13033,4710 13033,4710 13033,4710 C 13033,4683 13026,4656 13012,4632 12998,4608 12978,4588 12954,4574 12930,4560 12903,4553 12876,4553 L 10655,4553 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 10655,4553 L 10655,4553 C 10628,4553 10601,4560 10577,4574 10553,4588 10533,4608 10519,4632 10505,4656 10498,4683 10498,4710 L 10498,5339 10498,5340 C 10498,5367 10505,5394 10519,5418 10533,5442 10553,5462 10577,5476 10601,5490 10628,5497 10655,5497 L 12875,5497 12876,5497 C 12903,5497 12930,5490 12954,5476 12978,5462 12998,5442 13012,5418 13026,5394 13033,5367 13033,5340 L 13033,4710 13033,4710 13033,4710 C 13033,4683 13026,4656 13012,4632 12998,4608 12978,4588 12954,4574 12930,4560 12903,4553 12876,4553 L 10655,4553 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="10819" y="5152"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">CXL Device CCI</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id39"> + <rect class="BoundingBox" stroke="none" fill="none" x="10224" y="5484" width="1555" height="1440"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 11765,5497 L 10434,6728"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 10224,6923 L 10512,6793 10376,6646 10224,6923 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id40"> + <rect class="BoundingBox" stroke="none" fill="none" x="8726" y="12585" width="3795" height="5466"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 12357,12821 L 8739,18037"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 12520,12585 L 12267,12775 12431,12889 12520,12585 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id41"> + <rect class="BoundingBox" stroke="none" fill="none" x="1669" y="14528" width="2608" height="1326"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 1913,14564 L 1914,14564 C 1877,14564 1841,14574 1809,14592 1778,14610 1751,14637 1733,14668 1715,14700 1705,14736 1705,14773 L 1705,15608 1705,15608 C 1705,15645 1715,15681 1733,15713 1751,15744 1778,15771 1809,15789 1841,15807 1877,15817 1914,15817 L 4031,15817 4031,15817 C 4068,15817 4104,15807 4136,15789 4167,15771 4194,15744 4212,15713 4230,15681 4240,15645 4240,15608 L 4240,14772 4240,14773 4240,14773 C 4240,14736 4230,14700 4212,14668 4194,14637 4167,14610 4136,14592 4104,14574 4068,14564 4031,14564 L 1913,14564 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="71" stroke-linejoin="round" d="M 1913,14564 L 1914,14564 C 1877,14564 1841,14574 1809,14592 1778,14610 1751,14637 1733,14668 1715,14700 1705,14736 1705,14773 L 1705,15608 1705,15608 C 1705,15645 1715,15681 1733,15713 1751,15744 1778,15771 1809,15789 1841,15807 1877,15817 1914,15817 L 4031,15817 4031,15817 C 4068,15817 4104,15807 4136,15789 4167,15771 4194,15744 4212,15713 4230,15681 4240,15645 4240,15608 L 4240,14772 4240,14773 4240,14773 C 4240,14736 4230,14700 4212,14668 4194,14637 4167,14610 4136,14592 4104,14574 4068,14564 4031,14564 L 1913,14564 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="400"><tspan class="TextPosition" x="2500" y="14937"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">Redfish </tspan></tspan><tspan class="TextPosition" x="2311" y="15318"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">Credential </tspan></tspan><tspan class="TextPosition" x="2584" y="15699"><tspan fill="rgb(0,0,0)" stroke="none" style="white-space: pre">NetFn</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id42"> + <rect class="BoundingBox" stroke="none" fill="none" x="4226" y="15177" width="1865" height="1119"/> + <path fill="none" stroke="rgb(255,192,0)" stroke-width="26" stroke-linejoin="round" d="M 4239,15190 L 5844,16148"/> + <path fill="rgb(255,192,0)" stroke="none" d="M 6090,16295 L 5884,16055 5781,16227 6090,16295 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id43"> + <rect class="BoundingBox" stroke="none" fill="none" x="4325" y="6168" width="1682" height="1349"/> + <g style="opacity: 0.541176470588235"> + <path fill="none" stroke="rgb(0,170,181)" stroke-width="44" stroke-linejoin="round" d="M 5782,6347 L 4549,7337"/> + <path fill="rgb(0,170,181)" stroke="none" d="M 6006,6168 L 5709,6278 5835,6434 6006,6168 Z"/> + <path fill="rgb(0,170,181)" stroke="none" d="M 4325,7516 L 4622,7406 4496,7250 4325,7516 Z"/> + </g> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id44"> + <rect class="BoundingBox" stroke="none" fill="none" x="12143" y="10591" width="2502" height="2347"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 12157,11764 L 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12159,11706 12163,11649 12171,11592 12181,11535 12195,11478 12212,11423 12231,11368 12254,11314 12279,11262 12307,11210 12338,11160 12371,11112 12407,11065 12445,11020 12486,10976 12529,10935 12574,10896 12621,10859 12670,10824 12720,10791 12773,10761 12827,10733 12882,10708 12939,10685 12997,10665 13055,10648 13115,10634 13175,10622 13236,10613 13297,10608 13359,10604 13420,10604 13482,10607 13543,10612 13604,10621 13664,10632 13724,10646 13783,10663 13841,10682 13898,10704 13953,10729 14007,10757 14060,10786 14111,10819 14160,10853 14208,10890 14253,10929 14296,10970 14337,11013 14376,11058 14412,11105 14446,11153 14477,11203 14505,11254 14531,11307 14554,11360 14574,11415 14591,11470 14605,11526 14616,11583 14624,11640 14629,11698 14631,11756 14630,11813 14626,11871 14619,11928 14608,11985 14595,12041 14579,12097 14560,12152 14538,12206 14513,12259 14485,12310 14455,12360 14422,12409 14387,12456 14349,12502 14308,12545 14266,12587 14221,12627 14174,12664 14126,12699 14075,12732 14023,12763 13969,12791 13914,12817 13858,12839 13800,12860 13741,12877 13682,12892 13622,12904 13561,12913 13500,12920 13438,12923 13377,12924 13315,12922 13254,12917 13193,12909 13133,12898 13073,12884 13014,12868 12956,12849 12899,12827 12843,12803 12789,12776 12736,12746 12684,12714 12635,12680 12587,12643 12542,12605 12498,12564 12457,12521 12418,12477 12381,12430 12347,12382 12316,12332 12287,12281 12261,12229 12238,12176 12217,12121 12200,12066 12185,12010 12174,11953 12165,11896 12160,11839 12157,11781 12157,11764 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="26" stroke-linejoin="round" d="M 12157,11764 L 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12157,11764 12159,11706 12163,11649 12171,11592 12181,11535 12195,11478 12212,11423 12231,11368 12254,11314 12279,11262 12307,11210 12338,11160 12371,11112 12407,11065 12445,11020 12486,10976 12529,10935 12574,10896 12621,10859 12670,10824 12720,10791 12773,10761 12827,10733 12882,10708 12939,10685 12997,10665 13055,10648 13115,10634 13175,10622 13236,10613 13297,10608 13359,10604 13420,10604 13482,10607 13543,10612 13604,10621 13664,10632 13724,10646 13783,10663 13841,10682 13898,10704 13953,10729 14007,10757 14060,10786 14111,10819 14160,10853 14208,10890 14253,10929 14296,10970 14337,11013 14376,11058 14412,11105 14446,11153 14477,11203 14505,11254 14531,11307 14554,11360 14574,11415 14591,11470 14605,11526 14616,11583 14624,11640 14629,11698 14631,11756 14630,11813 14626,11871 14619,11928 14608,11985 14595,12041 14579,12097 14560,12152 14538,12206 14513,12259 14485,12310 14455,12360 14422,12409 14387,12456 14349,12502 14308,12545 14266,12587 14221,12627 14174,12664 14126,12699 14075,12732 14023,12763 13969,12791 13914,12817 13858,12839 13800,12860 13741,12877 13682,12892 13622,12904 13561,12913 13500,12920 13438,12923 13377,12924 13315,12922 13254,12917 13193,12909 13133,12898 13073,12884 13014,12868 12956,12849 12899,12827 12843,12803 12789,12776 12736,12746 12684,12714 12635,12680 12587,12643 12542,12605 12498,12564 12457,12521 12418,12477 12381,12430 12347,12382 12316,12332 12287,12281 12261,12229 12238,12176 12217,12121 12200,12066 12185,12010 12174,11953 12165,11896 12160,11839 12157,11781 12157,11764 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="318px" font-weight="700"><tspan class="TextPosition" x="12826" y="11510"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Platform </tspan></tspan><tspan class="TextPosition" x="12597" y="11891"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Replaceable </tspan></tspan><tspan class="TextPosition" x="12938" y="12272"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Library</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id45"> + <rect class="BoundingBox" stroke="none" fill="none" x="20978" y="3083" width="6936" height="17808"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 21807,3105 L 21807,3105 C 21666,3105 21527,3142 21404,3213 21282,3284 21180,3386 21109,3508 21038,3631 21001,3770 21001,3911 L 21001,20061 21001,20062 C 21001,20203 21038,20342 21109,20465 21180,20587 21282,20689 21404,20760 21527,20831 21666,20868 21807,20868 L 27084,20868 27085,20868 C 27226,20868 27365,20831 27488,20760 27610,20689 27712,20587 27783,20465 27854,20342 27891,20203 27891,20062 L 27891,3911 27891,3911 27891,3911 C 27891,3770 27854,3631 27783,3508 27712,3386 27610,3284 27488,3213 27365,3142 27226,3105 27085,3105 L 21807,3105 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id46"> + <rect class="BoundingBox" stroke="none" fill="none" x="19849" y="4426" width="3116" height="1238"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 19871,5641 L 21425,5641 21425,4526 22677,4526"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 22964,4526 L 22664,4426 22664,4626 22964,4526 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id47"> + <rect class="BoundingBox" stroke="none" fill="none" x="19820" y="7552" width="3145" height="1069"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 19842,8598 L 21411,8598 21411,7652 22677,7652"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 22964,7652 L 22664,7552 22664,7752 22964,7652 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id48"> + <rect class="BoundingBox" stroke="none" fill="none" x="19820" y="10577" width="3168" height="995"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 19842,11549 L 21422,11549 21422,10677 22700,10677"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 22987,10677 L 22687,10577 22687,10777 22987,10677 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id49"> + <rect class="BoundingBox" stroke="none" fill="none" x="19820" y="13623" width="3209" height="895"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 19842,14495 L 21443,14495 21443,13723 22741,13723"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 23028,13723 L 22728,13623 22728,13823 23028,13723 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id50"> + <rect class="BoundingBox" stroke="none" fill="none" x="19841" y="16682" width="3188" height="783"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 19863,17442 L 21453,17442 21453,16782 22741,16782"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 23028,16782 L 22728,16682 22728,16882 23028,16782 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id51"> + <rect class="BoundingBox" stroke="none" fill="none" x="19842" y="6158" width="9050" height="201"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="44" stroke-linejoin="round" d="M 19864,6258 L 28604,6258"/> + <path fill="rgb(237,28,36)" stroke="none" d="M 28891,6258 L 28591,6158 28591,6358 28891,6258 Z"/> + </g> + </g> + <g class="TextShape"> + <g id="id52"> + <rect class="BoundingBox" stroke="none" fill="none" x="20972" y="18658" width="7190" height="1967"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="700"><tspan class="TextPosition" x="21226" y="19138"><tspan fill="rgb(127,127,127)" stroke="none" style="white-space: pre">The gray box is the optional Implementation </tspan></tspan><tspan class="TextPosition" x="21226" y="19561"><tspan fill="rgb(127,127,127)" stroke="none" style="white-space: pre">that supports:</tspan></tspan></tspan><tspan ooo:numbering-type="bullet-style" class="ListItem" font-family="Calibri, sans-serif" font-size="353px" font-weight="700"><tspan class="TextPosition" x="21226" y="19963"><tspan id="id82.bp" class="BulletPlaceholder"/></tspan><tspan class="TextPosition" x="21548" y="19984"><tspan fill="rgb(127,127,127)" stroke="none" style="white-space: pre">Multiple transfer tokens</tspan></tspan></tspan><tspan ooo:numbering-type="bullet-style" class="ListItem" font-family="Calibri, sans-serif" font-size="353px" font-weight="700"><tspan class="TextPosition" x="21226" y="20386"><tspan id="id83.bp" class="BulletPlaceholder"/></tspan><tspan class="TextPosition" x="21548" y="20407"><tspan fill="rgb(127,127,127)" stroke="none" style="white-space: pre">Asynchronous Transfer</tspan></tspan></tspan></text> + <g class="BulletChars"> + <g id="bullet-char-id82.bp" class="BulletChar"> + <g transform="translate(21226,19963)" fill="rgb(255,255,255)" stroke="none"> + <use transform="scale(353,353)" xlink:href="#bullet-char-template-8226"/> + </g> + </g> + <g id="bullet-char-id83.bp" class="BulletChar"> + <g transform="translate(21226,20386)" fill="rgb(255,255,255)" stroke="none"> + <use transform="scale(353,353)" xlink:href="#bullet-char-template-8226"/> + </g> + </g> + </g> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id53"> + <rect class="BoundingBox" stroke="none" fill="none" x="25690" y="4504" width="3216" height="1179"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 25712,4526 L 27302,4526 27302,5582 28618,5582"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 28905,5582 L 28605,5482 28605,5682 28905,5582 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id54"> + <rect class="BoundingBox" stroke="none" fill="none" x="25690" y="7630" width="3216" height="999"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 25712,7652 L 27302,7652 27302,8528 28618,8528"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 28905,8528 L 28605,8428 28605,8628 28905,8528 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id55"> + <rect class="BoundingBox" stroke="none" fill="none" x="25713" y="10655" width="3228" height="979"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 25735,10677 L 27331,10677 27331,11533 28653,11533"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 28940,11533 L 28640,11433 28640,11633 28940,11533 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id56"> + <rect class="BoundingBox" stroke="none" fill="none" x="25754" y="13701" width="3205" height="847"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 25776,13723 L 27361,13723 27361,14447 28671,14447"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 28958,14447 L 28658,14347 28658,14547 28958,14447 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id57"> + <rect class="BoundingBox" stroke="none" fill="none" x="25754" y="16760" width="3205" height="722"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 25776,16782 L 27361,16782 27361,17381 28671,17381"/> + <path fill="rgb(127,127,127)" stroke="none" d="M 28958,17381 L 28658,17281 28658,17481 28958,17381 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id58"> + <rect class="BoundingBox" stroke="none" fill="none" x="22942" y="3514" width="2794" height="2025"/> + <path fill="rgb(89,89,89)" stroke="none" d="M 22964,3536 L 25713,3536 25713,5515 22964,5515 22964,3536 Z"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 22964,3536 L 25713,3536 25713,5515 22964,5515 22964,3536 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="24080" y="4096"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">KCS </tspan></tspan><tspan class="TextPosition" x="23320" y="4519"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="23654" y="4942"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="23262" y="5365"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Protocol Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id59"> + <rect class="BoundingBox" stroke="none" fill="none" x="22942" y="6640" width="2794" height="2024"/> + <path fill="rgb(89,89,89)" stroke="none" d="M 22964,6662 L 25713,6662 25713,8641 22964,8641 22964,6662 Z"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 22964,6662 L 25713,6662 25713,8641 22964,8641 22964,6662 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="24111" y="7222"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">I2C </tspan></tspan><tspan class="TextPosition" x="23320" y="7645"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="23654" y="8068"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="23262" y="8491"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Protocol Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id60"> + <rect class="BoundingBox" stroke="none" fill="none" x="22965" y="9665" width="2794" height="2024"/> + <path fill="rgb(89,89,89)" stroke="none" d="M 22987,9687 L 25736,9687 25736,11666 22987,11666 22987,9687 Z"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 22987,9687 L 25736,9687 25736,11666 22987,11666 22987,9687 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="23734" y="10247"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">PCI VDM </tspan></tspan><tspan class="TextPosition" x="23343" y="10670"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="23677" y="11093"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="23285" y="11516"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Protocol Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id61"> + <rect class="BoundingBox" stroke="none" fill="none" x="23006" y="12711" width="2794" height="2025"/> + <path fill="rgb(89,89,89)" stroke="none" d="M 23028,12733 L 25777,12733 25777,14712 23028,14712 23028,12733 Z"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 23028,12733 L 25777,12733 25777,14712 23028,14712 23028,12733 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="24114" y="13293"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">USB </tspan></tspan><tspan class="TextPosition" x="23384" y="13716"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="23718" y="14139"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="23326" y="14562"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Protocol Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id62"> + <rect class="BoundingBox" stroke="none" fill="none" x="23006" y="15770" width="2794" height="2025"/> + <path fill="rgb(89,89,89)" stroke="none" d="M 23028,15792 L 25777,15792 25777,17771 23028,17771 23028,15792 Z"/> + <path fill="none" stroke="rgb(127,127,127)" stroke-width="44" stroke-linejoin="round" d="M 23028,15792 L 25777,15792 25777,17771 23028,17771 23028,15792 Z"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="24175" y="16352"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">I3C </tspan></tspan><tspan class="TextPosition" x="23384" y="16775"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Manageability </tspan></tspan><tspan class="TextPosition" x="23718" y="17198"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="23326" y="17621"><tspan fill="rgb(166,166,166)" stroke="none" style="white-space: pre">Protocol Driver</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id63"> + <rect class="BoundingBox" stroke="none" fill="none" x="19791" y="9138" width="9050" height="201"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="44" stroke-linejoin="round" d="M 19813,9238 L 28553,9238"/> + <path fill="rgb(237,28,36)" stroke="none" d="M 28840,9238 L 28540,9138 28540,9338 28840,9238 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id64"> + <rect class="BoundingBox" stroke="none" fill="none" x="19822" y="12168" width="9049" height="201"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="44" stroke-linejoin="round" d="M 19844,12268 L 28583,12268"/> + <path fill="rgb(237,28,36)" stroke="none" d="M 28870,12268 L 28570,12168 28570,12368 28870,12268 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id65"> + <rect class="BoundingBox" stroke="none" fill="none" x="19714" y="15130" width="9198" height="201"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="44" stroke-linejoin="round" d="M 19736,15230 L 28624,15230"/> + <path fill="rgb(237,28,36)" stroke="none" d="M 28911,15230 L 28611,15130 28611,15330 28911,15230 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id66"> + <rect class="BoundingBox" stroke="none" fill="none" x="19822" y="18243" width="9050" height="201"/> + <path fill="none" stroke="rgb(237,28,36)" stroke-width="44" stroke-linejoin="round" d="M 19844,18343 L 28584,18343"/> + <path fill="rgb(237,28,36)" stroke="none" d="M 28871,18343 L 28571,18243 28571,18443 28871,18343 Z"/> + </g> + </g> + <g class="TextShape"> + <g id="id67"> + <rect class="BoundingBox" stroke="none" fill="none" x="21444" y="5676" width="6504" height="685"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="21698" y="6156"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Implementation can call to the protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="TextShape"> + <g id="id68"> + <rect class="BoundingBox" stroke="none" fill="none" x="21416" y="8625" width="6504" height="685"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="21670" y="9105"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Implementation can call to the protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="TextShape"> + <g id="id69"> + <rect class="BoundingBox" stroke="none" fill="none" x="21404" y="11667" width="6504" height="685"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="21658" y="12147"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Implementation can call to the protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="TextShape"> + <g id="id70"> + <rect class="BoundingBox" stroke="none" fill="none" x="21474" y="14660" width="6504" height="685"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="21728" y="15140"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Implementation can call to the protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="TextShape"> + <g id="id71"> + <rect class="BoundingBox" stroke="none" fill="none" x="21505" y="17746" width="6504" height="685"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="353px" font-weight="400"><tspan class="TextPosition" x="21759" y="18226"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Implementation can call to the protocol</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id72"> + <rect class="BoundingBox" stroke="none" fill="none" x="14630" y="5491" width="2140" height="6275"/> + <path fill="none" stroke="rgb(255,0,0)" d="M 14631,11764 L 15689,11764 15689,5641 16489,5641"/> + <path fill="rgb(255,0,0)" stroke="none" d="M 16469,5491 L 16769,5641 16469,5791 16469,5491 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id73"> + <rect class="BoundingBox" stroke="none" fill="none" x="14630" y="8448" width="2111" height="3318"/> + <path fill="none" stroke="rgb(255,0,0)" d="M 14631,11764 L 15674,11764 15674,8598 16460,8598"/> + <path fill="rgb(255,0,0)" stroke="none" d="M 16440,8448 L 16740,8598 16440,8748 16440,8448 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id74"> + <rect class="BoundingBox" stroke="none" fill="none" x="14630" y="11399" width="2111" height="367"/> + <path fill="none" stroke="rgb(255,0,0)" d="M 14631,11764 L 15674,11764 15674,11549 16460,11549"/> + <path fill="rgb(255,0,0)" stroke="none" d="M 16440,11399 L 16740,11549 16440,11699 16440,11399 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id75"> + <rect class="BoundingBox" stroke="none" fill="none" x="14630" y="11763" width="2111" height="2883"/> + <path fill="none" stroke="rgb(255,0,0)" d="M 14631,11764 L 15674,11764 15674,14495 16460,14495"/> + <path fill="rgb(255,0,0)" stroke="none" d="M 16440,14345 L 16740,14495 16440,14645 16440,14345 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id76"> + <rect class="BoundingBox" stroke="none" fill="none" x="14630" y="11763" width="2132" height="5830"/> + <path fill="none" stroke="rgb(255,0,0)" d="M 14631,11764 L 15685,11764 15685,17442 16481,17442"/> + <path fill="rgb(255,0,0)" stroke="none" d="M 16461,17292 L 16761,17442 16461,17592 16461,17292 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id77"> + <rect class="BoundingBox" stroke="none" fill="none" x="14630" y="11763" width="2162" height="8384"/> + <path fill="none" stroke="rgb(255,0,0)" d="M 14631,11764 L 15700,11764 15700,19996 16511,19996"/> + <path fill="rgb(255,0,0)" stroke="none" d="M 16491,19846 L 16791,19996 16491,20146 16491,19846 Z"/> + </g> + </g> + <g class="TextShape"> + <g id="id78"> + <rect class="BoundingBox" stroke="none" fill="none" x="1787" y="1035" width="12701" height="2793"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="846px" font-weight="700"><tspan class="TextPosition" x="2037" y="1795"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Industry Standard Manageability </tspan></tspan><tspan class="TextPosition" x="2037" y="2642"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Protocol Driver Stack</tspan></tspan></tspan></text> + </g> + </g> + <g class="TextShape"> + <g id="id79"> + <rect class="BoundingBox" stroke="none" fill="none" x="16392" y="952" width="11431" height="2793"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="846px" font-weight="700"><tspan class="TextPosition" x="16642" y="1712"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Manageability Transport </tspan></tspan><tspan class="TextPosition" x="16642" y="2559"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Driver Stack</tspan></tspan></tspan></text> + </g> + </g> + <g class="TextShape"> + <g id="id80"> + <rect class="BoundingBox" stroke="none" fill="none" x="27917" y="1018" width="6386" height="2793"/> + <text class="SVGTextShape"><tspan class="TextParagraph" font-family="Calibri, sans-serif" font-size="846px" font-weight="700"><tspan class="TextPosition" x="28167" y="1778"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Transport </tspan></tspan><tspan class="TextPosition" x="28167" y="2625"><tspan fill="rgb(255,255,255)" stroke="none" style="white-space: pre">Implementation</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.ConnectorShape"> + <g id="id81"> + <rect class="BoundingBox" stroke="none" fill="none" x="6898" y="7978" width="2032" height="3300"/> + <path fill="none" stroke="rgb(255,255,255)" d="M 6899,11276 L 7914,11276 7914,8128 8649,8128"/> + <path fill="rgb(255,255,255)" stroke="none" d="M 8629,7978 L 8929,8128 8629,8278 8629,7978 Z"/> + </g> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100672): https://edk2.groups.io/g/devel/message/100672 Mute This Topic: https://groups.io/mt/97357746/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> Initial commit of ManageabilityPkg Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Abdul Lateef Attar <abdattar@amd.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> --- .../ManageabilityPkg/ManageabilityPkg.dec | 18 +++++++++ .../Include/Dsc/Manageability.dsc | 16 ++++++++ .../ManageabilityPkg/ManageabilityPkg.dsc | 40 +++++++++++++++++++ 3 files changed, 74 insertions(+) create mode 100644 Features/ManageabilityPkg/ManageabilityPkg.dec create mode 100644 Features/ManageabilityPkg/Include/Dsc/Manageability.dsc create mode 100644 Features/ManageabilityPkg/ManageabilityPkg.dsc diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dec b/Features/ManageabilityPkg/ManageabilityPkg.dec new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/ManageabilityPkg.dec @@ -XXX,XX +XXX,XX @@ +## @file +# Manageabilty Package +# This is the package provides the edk2 drivers and libraries +# those are related to the platform management. +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + DEC_SPECIFICATION = 0x0001001d + PACKAGE_NAME = ManageabilityPkg + PACKAGE_GUID = 36310119-4FB2-4BA3-959D-74C16B849F9E + PACKAGE_VERSION = 1.0 + +[Includes] + Include diff --git a/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc b/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc @@ -XXX,XX +XXX,XX @@ +## @file +# Common libraries for Manageabilty Package +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[LibraryClasses.ARM, LibraryClasses.AARCH64] + # + # This library provides the instrinsic functions generated by a given compiler. + # + NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf + NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf + ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf + diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dsc b/Features/ManageabilityPkg/ManageabilityPkg.dsc new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/ManageabilityPkg.dsc @@ -XXX,XX +XXX,XX @@ +## @file +# Manageabilty Package +# This is the package provides edk2 drivers and libraries +# those are related to the platform management. +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + PLATFORM_NAME = ManageabilityPkg + PLATFORM_GUID = 7A98123A-B194-40B6-A863-A52192F6D65D + PLATFORM_VERSION = 1.0 + DSC_SPECIFICATION = 0x0001001e + OUTPUT_DIRECTORY = Build/ManageabilityPkg + SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64|RISCV64 + BUILD_TARGETS = DEBUG|RELEASE|NOOPT + SKUID_IDENTIFIER = DEFAULT + +[Packages] + MinPlatformPkg/MinPlatformPkg.dec + +[PcdsFeatureFlag] + # + # MinPlatform common include currently required PCD + # + gMinPlatformPkgTokenSpaceGuid.PcdSmiHandlerProfileEnable |FALSE + gMinPlatformPkgTokenSpaceGuid.PcdUefiSecureBootEnable |FALSE + gMinPlatformPkgTokenSpaceGuid.PcdPerformanceEnable |FALSE + +# +# Include common libraries +# +!include MinPlatformPkg/Include/Dsc/CoreCommonLib.dsc +!include MinPlatformPkg/Include/Dsc/CorePeiLib.dsc +!include MinPlatformPkg/Include/Dsc/CoreDxeLib.dsc + +!include Include/Dsc/Manageability.dsc + -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100673): https://edk2.groups.io/g/devel/message/100673 Mute This Topic: https://groups.io/mt/97357753/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> The NULL instance of ManageabilityTransportLib library. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> Cc: Abdul Lateef Attar <abdattar@amd.com> --- .../ManageabilityPkg/ManageabilityPkg.dec | 9 + .../ManageabilityPkg/ManageabilityPkg.dsc | 4 +- .../BaseManageabilityTransportNull.inf | 28 ++ .../Library/ManageabilityTransportIpmiLib.h | 24 ++ .../Library/ManageabilityTransportLib.h | 335 ++++++++++++++++++ .../BaseManageabilityTransportNull.c | 64 ++++ .../BaseManageabilityTransportNull.uni | 13 + 7 files changed, 476 insertions(+), 1 deletion(-) create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportIpmiLib.h create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.c create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.uni diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dec b/Features/ManageabilityPkg/ManageabilityPkg.dec index XXXXXXX..XXXXXXX 100644 --- a/Features/ManageabilityPkg/ManageabilityPkg.dec +++ b/Features/ManageabilityPkg/ManageabilityPkg.dec @@ -XXX,XX +XXX,XX @@ [Includes] Include + +[LibraryClasses] + ## @libraryclass Manageability Transport Library + # Manageability Transport Library definitions + ManageabilityTransportLib|Include/Library/ManageabilityTransportLib.h + +[Guids] + gManageabilityPkgTokenSpaceGuid = { 0xBDEFFF48, 0x1C31, 0x49CD, { 0xA7, 0x6D, 0x92, 0x9E, 0x60, 0xDB, 0xB9, 0xF8 } } + diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dsc b/Features/ManageabilityPkg/ManageabilityPkg.dsc index XXXXXXX..XXXXXXX 100644 --- a/Features/ManageabilityPkg/ManageabilityPkg.dsc +++ b/Features/ManageabilityPkg/ManageabilityPkg.dsc @@ -XXX,XX +XXX,XX @@ !include MinPlatformPkg/Include/Dsc/CorePeiLib.dsc !include MinPlatformPkg/Include/Dsc/CoreDxeLib.dsc -!include Include/Dsc/Manageability.dsc +[LibraryClasses] + ManageabilityTransportLib|ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf +!include Include/Dsc/Manageability.dsc diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf b/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf @@ -XXX,XX +XXX,XX @@ +## @file +# Null instance of Manageability Transport Library +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = BaseManageabilityTransportNull + MODULE_UNI_FILE = BaseManageabilityTransportNull.uni + FILE_GUID = B63DC070-FB44-44F3-8E9A-DA6CC712EF4F + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ManageabilityTransportLib + +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + BaseManageabilityTransportNull.c + +[Packages] + ManageabilityPkg/ManageabilityPkg.dec + MdePkg/MdePkg.dec + diff --git a/Features/ManageabilityPkg/Include/Library/ManageabilityTransportIpmiLib.h b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportIpmiLib.h new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportIpmiLib.h @@ -XXX,XX +XXX,XX @@ +/** @file + + This file defines the manageability IPMI protocol specific transport data. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MANAGEABILITY_TRANSPORT_IPMI_LIB_H_ +#define MANAGEABILITY_TRANSPORT_IPMI_LIB_H_ + +#include <Library/ManageabilityTransportLib.h> + +/// +/// The IPMI command header which is apart from +/// the payload. +/// +typedef struct { + UINT8 NetFn; + UINT8 Lun; + UINT8 Command; +} MANAGEABILITY_IPMI_TRANSPORT_HEADER; + +#endif diff --git a/Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h @@ -XXX,XX +XXX,XX @@ +/** @file + + This file defines the manageability transport interface library and functions. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MANAGEABILITY_TRANSPORT_LIB_H_ +#define MANAGEABILITY_TRANSPORT_LIB_H_ + +#define MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MAJOR 1 +#define MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MINOR 0 +#define MANAGEABILITY_TRANSPORT_TOKEN_VERSION ((MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MAJOR << 8) |\ + MANAGEABILITY_TRANSPORT_TOKEN_VERSION_MINOR) + +typedef struct _MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 MANAGEABILITY_TRANSPORT_FUNCTION_V1_0; +typedef struct _MANAGEABILITY_TRANSPORT MANAGEABILITY_TRANSPORT; +typedef struct _MANAGEABILITY_TRANSPORT_TOKEN MANAGEABILITY_TRANSPORT_TOKEN; +typedef struct _MANAGEABILITY_TRANSFER_TOKEN MANAGEABILITY_TRANSFER_TOKEN; + +/// +/// Optional transport header and trailer required +/// for the transport interface. +/// +typedef VOID *MANAGEABILITY_TRANSPORT_HEADER; +typedef VOID *MANAGEABILITY_TRANSPORT_TRAILER; + +/// +/// The transport interface specific hardware information. +/// + +typedef union { + UINT16 IoAddress16; + UINT32 IoAddress32; +} MANAGEABILITY_TRANSPORT_HARDWARE_IO; + +/// +/// Manageability KCS protocol interface hardware information. +/// +typedef struct { + BOOLEAN MemoryMap; + MANAGEABILITY_TRANSPORT_HARDWARE_IO IoBaseAddress; + MANAGEABILITY_TRANSPORT_HARDWARE_IO IoDataInAddress; + MANAGEABILITY_TRANSPORT_HARDWARE_IO IoDataOutAddress; + MANAGEABILITY_TRANSPORT_HARDWARE_IO IoCommandAddress; + MANAGEABILITY_TRANSPORT_HARDWARE_IO IoStatusAddress; +} MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO; +#define MANAGEABILITY_TRANSPORT_KCS_IO_MAP_IO FALSE +#define MANAGEABILITY_TRANSPORT_KCS_MEMORY_MAP_IO TRUE + +typedef union { + VOID *Pointer; + MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *Kcs; +} MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION; + +/// +/// Additional transport interface status. +/// +typedef UINT32 MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS; +#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NO_ERRORS 0x00000000 +#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_ERROR 0x00000001 +#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_BUSY_IN_READ 0x00000002 +#define MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_BUSY_IN_WRITE 0x00000004 + +/// +/// Additional transport interface features. +/// +typedef UINT32 MANAGEABILITY_TRANSPORT_CAPABILITY; +#define MANAGEABILITY_TRANSPORT_CAPABILITY_MULTIPLE_TRANSFER_TOKENS 0x00000001 +#define MANAGEABILITY_TRANSPORT_CAPABILITY_ASYNCHRONOUS_TRANSFER 0x00000002 + +/// +/// Definitions of Manageability transport interface functions. +/// This is a union that can accommodate the new functions +/// introduced to the Manageability transport library in the future. +/// The new added function must has its own MANAGEABILITY_TRANSPORT_FUNCTION +/// structure with the incremental version number. +/// e.g., MANAGEABILITY_TRANSPORT_FUNCTION_V1_1. +/// +/// The new function must be added base on the last version of +/// MANAGEABILITY_TRANSPORT_FUNCTION to keep the backward compatability. +/// +typedef union { + MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 *Version1_0; +} MANAGEABILITY_TRANSPORT_FUNCTION; + +/// +/// Manageability specification GUID/Name table structure +/// +typedef struct { + EFI_GUID *SpecificationGuid; + CHAR16 *SpecificationName; +} MANAGEABILITY_SPECIFICATION_NAME; + +/// +/// Definitions of Transmit/Receive package +/// +typedef struct { + UINT8 *TransmitPayload; + UINT32 TransmitSizeInByte; + UINT32 TransmitTimeoutInMillisecond; +} MANAGEABILITY_TRANSMIT_PACKAGE; + +typedef struct { + UINT8 *ReceiveBuffer; + UINT32 ReceiveSizeInByte; + UINT32 TransmitTimeoutInMillisecond; +} MANAGEABILITY_RECEIVE_PACKAGE; + +/// +/// Definitions of Manageability transport interface. +/// +struct _MANAGEABILITY_TRANSPORT { + EFI_GUID *ManageabilityTransportSpecification; ///< The Manageability Transport Interface spec. + UINT16 TransportVersion; ///< The version of transport interface + ///< function that indicates which version + ///< of MANAGEABILITY_TRANSPORT_FUNCTION + ///< is unsupported by this library. + CHAR16 *TransportName; ///< Human readable string of + ///< this transport interface. + MANAGEABILITY_TRANSPORT_FUNCTION Function; ///< Transport functions +}; + +/// +/// Definitions of Manageability transport token. +/// +struct _MANAGEABILITY_TRANSPORT_TOKEN { + EFI_GUID *ManageabilityProtocolSpecification; ///< The Manageability Protocol spec. + MANAGEABILITY_TRANSPORT *Transport; +}; + +#define MANAGEABILITY_TRANSPORT_NO_TIMEOUT 0 + +/// +/// The Manageability transport receive token used to receive +/// the response from transport interface after transmitting the +/// request. +/// +struct _MANAGEABILITY_TRANSFER_TOKEN { + EFI_EVENT ReceiveEvent; ///< The EFI event is created to + ///< wait the signal for the readiness + ///< of response data. + ///< If NULL, transport library should + ///< just return the response data in + ///< ReceiveBuffer then the process returns + ///< to caller. Otherwise the transport + ///< library can signal event when the + ///< response is ready for caller. That + ///< means the transport library can + ///< optionally implement the asynchronous + ///< transfer mechanism or when the multiple + ///< transport sessions are acquired. + MANAGEABILITY_TRANSPORT_HEADER TransmitHeader; ///< This is the transport-specific header + ///< which is sent discretely of payload. + ///< This field can be NULL if the transport + ///< doesn't require this. + MANAGEABILITY_TRANSPORT_TRAILER TransmitTrailer; ///< This is the transport-specific trailer + ///< which is sent discretely of payload. + ///< This field can be NULL if the transport + ///< doesn't require this. + MANAGEABILITY_TRANSMIT_PACKAGE TransmitPackage; ///< The payload sent to transport interface. + MANAGEABILITY_RECEIVE_PACKAGE ReceivePackage; ///< The buffer to receive the response. + EFI_STATUS TransferStatus; ///< The EFI Status of the transfer. + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; ///< The additional status of transport + ///< interface. +}; + +/** + This function acquires to create a transport session to transmit manageability + packet. A transport token is returned to caller for the follow up operations. + + @param [in] ManageabilityProtocolSpec The protocol spec the transport interface is acquired for. + @param [out] TransportToken The pointer to receive the transport token created by + the target transport interface library. + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_OUT_OF_RESOURCES Out of resource to create a new transport session. + @retval EFI_UNSUPPORTED Protocol is not supported on this transport interface. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +AcquireTransportSession ( + IN EFI_GUID *ManageabilityProtocolSpec, + OUT MANAGEABILITY_TRANSPORT_TOKEN **TransportToken + ); + +/** + This function returns the transport capabilities. + + @param [out] TransportFeature Pointer to receive transport capabilities. + See the definitions of + MANAGEABILITY_TRANSPORT_CAPABILITY. + +**/ +VOID +GetTransportCapability ( + OUT MANAGEABILITY_TRANSPORT_CAPABILITY *TransportCapability + ); + +/** + This function releases the manageability transport session. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession. + @retval EFI_SUCCESS Token is released successfully. + @retval EFI_INVALID_PARAMETER Invalid TransportToken. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +ReleaseTransportSession ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken + ); + +/** + This function initializes the transport interface. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [in] HardwareInfo This is the optional hardware information + assigned to this transport interface. + + @retval EFI_SUCCESS Transport interface is initialized + successfully. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_NOT_READY The transport interface works fine but + @retval is not ready. + @retval EFI_DEVICE_ERROR The transport interface has problems. + @retval EFI_ALREADY_STARTED Teh protocol interface has already initialized. + @retval Otherwise Other errors. + +**/ +typedef +EFI_STATUS +(EFIAPI *MANAGEABILITY_TRANSPORT_INIT)( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION HardwareInfo OPTIONAL + ); + +/** + This function returns the transport interface status. + The generic EFI_STATUS is returned to caller directly, The additional + information of transport interface could be optionally returned in + TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [out] TransportAdditionalStatus The additional status of transport + interface. + NULL means no additional status of this + transport interface. + + @retval EFI_SUCCESS Transport interface status is returned. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_DEVICE_ERROR The transport interface has problems to return + @retval status. + Otherwise Other errors. + +**/ +typedef +EFI_STATUS +(EFIAPI *MANAGEABILITY_TRANSPORT_STATUS)( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ); + +/** + This function resets the transport interface. + The generic EFI_STATUS is returned to caller directly after reseting transport + interface. The additional information of transport interface could be optionally + returned in TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [out] TransportAdditionalStatus The additional status of specific transport + interface after the reset. + NULL means no additional status of this + transport interface. + + @retval EFI_SUCCESS Transport interface status is returned. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_TIMEOUT The reset process is time out. + @retval EFI_DEVICE_ERROR The transport interface has problems to return + status. + Otherwise Other errors. + +**/ +typedef +EFI_STATUS +(EFIAPI *MANAGEABILITY_TRANSPORT_RESET)( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ); + +/** + This function transmit the request over target transport interface. + The generic EFI_STATUS is returned to caller directly after reseting transport + interface. The additional information of transport interface could be optionally + returned in TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [in] TransferToken The transfer token, see the definition of + MANAGEABILITY_TRANSFER_TOKEN. + + @retval The EFI status is returned in MANAGEABILITY_TRANSFER_TOKEN. + +**/ +typedef +VOID +(EFIAPI *MANAGEABILITY_TRANSPORT_TRANSMIT_RECEIVE)( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSFER_TOKEN *TransferToken + ); + +/// +/// The first version of Manageability transport interface function. +/// +struct _MANAGEABILITY_TRANSPORT_FUNCTION_V1_0 { + MANAGEABILITY_TRANSPORT_INIT TransportInit; ///< Initial the transport. + MANAGEABILITY_TRANSPORT_STATUS TransportStatus; ///< Get the transport status. + MANAGEABILITY_TRANSPORT_RESET TransportReset; ///< Reset the transport. + MANAGEABILITY_TRANSPORT_TRANSMIT_RECEIVE TransportTransmitReceive; ///< Transmit the packet over + ///< transport and get the + ///< response back. +}; + +#endif diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.c b/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.c @@ -XXX,XX +XXX,XX @@ +/** @file + Null instance of Manageability Transport Library + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <Uefi.h> +#include <Library/ManageabilityTransportLib.h> + +/** + This function acquires to create a transport session to transmit manageability + packet. A transport token is returned to caller for the follow up operations. + + @param [in] ManageabilityProtocolSpec The protocol spec the transport interface is acquired. + @param [out] TransportToken The pointer to receive the transport token created by + the target transport interface library. + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_OUT_OF_RESOURCES Out of resource to create a new transport session. + @retval EFI_UNSUPPORTED Protocol is not supported on this transport interface. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +AcquireTransportSession ( + IN EFI_GUID *ManageabilityProtocolSpec, + OUT MANAGEABILITY_TRANSPORT_TOKEN **TransportToken + ) +{ + return EFI_UNSUPPORTED; +} + +/** + This function returns the transport capabilities. + + @param [out] TransportFeature Pointer to receive transport capabilities. + See the definitions of + MANAGEABILITY_TRANSPORT_CAPABILITY. + +**/ +VOID +GetTransportCapability ( + OUT MANAGEABILITY_TRANSPORT_CAPABILITY *TransportCapability + ) +{ + *TransportCapability = 0; +} + +/** + This function releases the manageability session. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession. + @retval EFI_SUCCESS Token is released successfully. + Otherwise Other errors. + +**/ +EFI_STATUS +ReleaseTransportSession ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken + ) +{ + return EFI_SUCCESS; +} diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.uni b/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.uni new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.uni @@ -XXX,XX +XXX,XX @@ +// /** @file +// Null instance of Manageability Transport Library +// +// Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "Null instance of Manageability Transport Library" + +#string STR_MODULE_DESCRIPTION #language en-US "Manageability Transport library implementation for build ManageabilityPkg only." + -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100674): https://edk2.groups.io/g/devel/message/100674 Mute This Topic: https://groups.io/mt/97357754/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> The helper functions library facilitates reducing duplicated code in the manageability transport library instances. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> Cc: Abdul Lateef Attar <abdattar@amd.com> --- .../ManageabilityPkg/ManageabilityPkg.dec | 23 +- .../Include/Dsc/Manageability.dsc | 2 + .../BaseManageabilityTransportHelper.inf | 40 +++ .../Library/ManageabilityTransportHelperLib.h | 93 +++++++ .../BaseManageabilityTransportHelper.c | 242 ++++++++++++++++++ .../BaseManageabilityTransportHelper.uni | 13 + 6 files changed, 412 insertions(+), 1 deletion(-) create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelperLib.h create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.c create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.uni diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dec b/Features/ManageabilityPkg/ManageabilityPkg.dec index XXXXXXX..XXXXXXX 100644 --- a/Features/ManageabilityPkg/ManageabilityPkg.dec +++ b/Features/ManageabilityPkg/ManageabilityPkg.dec @@ -XXX,XX +XXX,XX @@ # Manageability Transport Library definitions ManageabilityTransportLib|Include/Library/ManageabilityTransportLib.h + ## @libraryclass Manageability Transport Helper Library + # Provide the help functions to use ManageabilityTransportLib + ManageabilityTransportHelperLib|Include/Library/ManageabilityTransportHelperLib.h + [Guids] - gManageabilityPkgTokenSpaceGuid = { 0xBDEFFF48, 0x1C31, 0x49CD, { 0xA7, 0x6D, 0x92, 0x9E, 0x60, 0xDB, 0xB9, 0xF8 } } + gManageabilityPkgTokenSpaceGuid = { 0xBDEFFF48, 0x1C31, 0x49CD, { 0xA7, 0x6D, 0x92, 0x9E, 0x60, 0xDB, 0xB9, 0xF8 } } + + # Manageability Transport Interface type + # + # Manageability Transport KCS + gManageabilityTransportKcsGuid = { 0x5A6E64E9, 0xFD47, 0x4086, { 0xAA, 0xB0, 0x7A, 0x5F, 0xD7, 0x6B, 0x02, 0x2E } } + # Manageability Transport I2C + gManageabilityTransportI2CGuid = { 0x5B174658, 0x8263, 0x4CB8, { 0xA0, 0x0F, 0xD6, 0x82, 0xE6, 0xBC, 0x74, 0x93 } } + # Manageability Transport PCI VDM + gManageabilityTransportPciVdmGuid = { 0x388021A7, 0xFB59, 0x4811, { 0x9D, 0xA7, 0xD5, 0x63, 0x7D, 0x04, 0xA7, 0x2F } } + # Manageability Protocol Specification + # + # Manageability Protocol IPMI + gManageabilityProtocolIpmiGuid = { 0x36ACA47C, 0xCC80, 0x473B, { 0xAB, 0xEC, 0xF3, 0x98, 0xFF, 0x87, 0x74, 0x5B } } + # Manageability Protocol MCTP + gManageabilityProtocolMctpGuid = { 0x76FED8F1, 0x0BE5, 0x4269, { 0xA3, 0x1A, 0x38, 0x0F, 0x54, 0xF1, 0xA1, 0x8A } } + # Manageability Protocol PLDM + gManageabilityProtocolPldmGuid = { 0x3958090D, 0x69DD, 0x4868, { 0x9C, 0x41, 0xC9, 0xAC, 0x31, 0xB5, 0x25, 0xC5 } } diff --git a/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc b/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc index XXXXXXX..XXXXXXX 100644 --- a/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc +++ b/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc @@ -XXX,XX +XXX,XX @@ # SPDX-License-Identifier: BSD-2-Clause-Patent # ## +[LibraryClasses] + ManageabilityTransportHelperLib|ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf [LibraryClasses.ARM, LibraryClasses.AARCH64] # diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf @@ -XXX,XX +XXX,XX @@ +## @file +# Null instance of Manageability Transport Helper Library +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = BaseManageabilityTransportHelper + MODULE_UNI_FILE = BaseManageabilityTransportHelper.uni + FILE_GUID = 52F2DE11-A8FC-4A06-B8C6-10DCF4A7397C + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = ManageabilityTransportHelperLib + +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + BaseManageabilityTransportHelper.c + +[LibraryClasses] + BaseMemoryLib + DebugLib + +[Packages] + ManageabilityPkg/ManageabilityPkg.dec + MdePkg/MdePkg.dec + +[Guids] + gManageabilityTransportKcsGuid + gManageabilityTransportI2CGuid + gManageabilityTransportPciVdmGuid + gManageabilityProtocolIpmiGuid + gManageabilityProtocolMctpGuid + gManageabilityProtocolPldmGuid + diff --git a/Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelperLib.h b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelperLib.h new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelperLib.h @@ -XXX,XX +XXX,XX @@ +/** @file + + This file defines the manageability transport interface library and functions. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MANAGEABILITY_TRANSPORT_HELPER_LIB_H_ +#define MANAGEABILITY_TRANSPORT_HELPER_LIB_H_ + +#include <Library/ManageabilityTransportLib.h> + +typedef struct _MANAGEABILITY_PROTOCOL_NAME MANAGEABILITY_PROTOCOL_NAME; + +/** + Helper function returns the human readable name of Manageability specification. + + @param[out] SpecificationGuid The Manageability specification GUID + + @retval !NULL Human readable name is returned; + @retval NULL No string found, the given Manageability specification is + not supported. +**/ +CHAR16 * +HelperManageabilitySpecName ( + IN EFI_GUID *SpecificationGuid + ); + +/** + Helper function to check if the Manageability specification is supported + by transport interface or not. + + @param[in] TransportGuid GUID of the transport interface. + @param[in] SupportedManageabilityProtocolArray The Manageability protocols supported + by the transport interface. + @param[in] NumberOfSupportedProtocolInArray Number of protocols in the array. + @param[in] ManageabilityProtocolToCheck The Manageability specification to check. + + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_INVALID_PARAMETER Either NumberOfSupportedProtocolInArray = 0 or + SupportedManageabilityProtocolArray = NULL. + @retval EFI_UNSUPPORTED Out of resource to create a new transport session. + Otherwise Other errors. +**/ +EFI_STATUS +HelperManageabilityCheckSupportedSpec ( + IN EFI_GUID *TransportGuid, + IN EFI_GUID **SupportedManageabilityProtocolArray, + IN UINT8 NumberOfSupportedProtocolInArray, + IN EFI_GUID *ManageabilityProtocolToCheck + ); + +/** + Helper function to acquire the Manageability transport token. + + @param[in] ManageabilityProtocolSpec The Manageability protocol specification. + @param[out] TransportToken Pointer to receive Manageability transport + token. + + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_OUT_OF_RESOURCES Out of resource to create a new transport session. + @retval EFI_UNSUPPORTED Token is created successfully. + @retval EFI_DEVICE_ERROR The transport interface has problems + @retval EFI_INVALID_PARAMETER INput parameter is not valid. + Otherwise Other errors. +**/ +EFI_STATUS +HelperAcquireManageabilityTransport ( + IN EFI_GUID *ManageabilityProtocolSpec, + OUT MANAGEABILITY_TRANSPORT_TOKEN **TransportToken + ); + +/** + Helper function to initial the transport interface. + + @param[in] TransportToken Transport token. + @param[in] HardwareInfo Optional hardware information of transport interface. + @param[out] TransportAdditionalStatus Transport additional status. + + @retval EFI_SUCCESS Transport interface is initiated successfully. + @retval EFI_DEVICE_ERROR The transport interface has problems + @retval EFI_INVALID_PARAMETER INput parameter is not valid. + Otherwise Other errors. +**/ +EFI_STATUS +HelperInitManageabilityTransport ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION HardwareInfo OPTIONAL, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ); + +#endif diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.c b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.c @@ -XXX,XX +XXX,XX @@ +/** @file + Null instance of Manageability Transport Helper Library + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <Uefi.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/ManageabilityTransportHelperLib.h> + +MANAGEABILITY_SPECIFICATION_NAME ManageabilitySpecNameTable[] = { + { &gManageabilityTransportKcsGuid, L"KCS" }, + { &gManageabilityTransportI2CGuid, L"I2C" }, + { &gManageabilityTransportPciVdmGuid, L"PCI VDM" }, + { &gManageabilityProtocolIpmiGuid, L"IPMI" }, + { &gManageabilityProtocolMctpGuid, L"MCTP" }, + { &gManageabilityProtocolPldmGuid, L"PLDM" } +}; + +UINT16 ManageabilitySpecNum = sizeof (ManageabilitySpecNameTable)/ sizeof (MANAGEABILITY_SPECIFICATION_NAME); + +/** + Helper function returns the human readable name of Manageability specification. + + @param[in] SpecificationGuid The Manageability specification GUID + + @retval !NULL Human readable name is returned; + @retval NULL No string found, the given Manageability specification is + not supported. +**/ +CHAR16 * +HelperManageabilitySpecName ( + IN EFI_GUID *SpecificationGuid + ) +{ + UINT16 Index; + MANAGEABILITY_SPECIFICATION_NAME *ThisSpec; + + if (ManageabilitySpecNum == 0) { + return NULL; + } + + ThisSpec = ManageabilitySpecNameTable; + for (Index = 0; Index < ManageabilitySpecNum; Index++) { + if (CompareGuid ( + SpecificationGuid, + ThisSpec->SpecificationGuid + )) + { + return ThisSpec->SpecificationName; + } + + ThisSpec++; + } + + return NULL; +} + +/** + Helper function to check if the Manageability specification is supported + by transport interface or not. + + @param[in] TransportGuid GUID of the transport interface. + @param[in] SupportedManageabilityProtocolArray The Manageability protocols supported + by the transport interface. + @param[in] NumberOfSupportedProtocolInArray Number of protocols in the array. + @param[in] ManageabilityProtocolToCheck The Manageability specification to check. + + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_INVALID_PARAMETER Either NumberOfSupportedProtocolInArray = 0 or + SupportedManageabilityProtocolArray = NULL. + @retval EFI_UNSUPPORTED Out of resource to create a new transport session. + Otherwise Other errors. +**/ +EFI_STATUS +HelperManageabilityCheckSupportedSpec ( + IN EFI_GUID *TransportGuid, + IN EFI_GUID **SupportedManageabilityProtocolArray, + IN UINT8 NumberOfSupportedProtocolInArray, + IN EFI_GUID *ManageabilityProtocolToCheck + ) +{ + UINT16 Index; + EFI_GUID *ThisSpecGuid; + + if ((NumberOfSupportedProtocolInArray == 0) || (SupportedManageabilityProtocolArray == NULL)) { + return EFI_INVALID_PARAMETER; + } + + ThisSpecGuid = *SupportedManageabilityProtocolArray; + for (Index = 0; Index < NumberOfSupportedProtocolInArray; Index++) { + if (CompareGuid ( + ThisSpecGuid, + ManageabilityProtocolToCheck + )) + { + DEBUG (( + DEBUG_VERBOSE, + "%a: Transport interface %s supports %s manageability specification.\n", + __FUNCTION__, + HelperManageabilitySpecName (TransportGuid), + HelperManageabilitySpecName (ManageabilityProtocolToCheck) + )); + return EFI_SUCCESS; + } + + ThisSpecGuid++; + } + + DEBUG (( + DEBUG_ERROR, + "%a: Transport interface %s doesn't support %s manageability specification.\n", + __FUNCTION__, + HelperManageabilitySpecName (TransportGuid), + HelperManageabilitySpecName (ManageabilityProtocolToCheck) + )); + return EFI_UNSUPPORTED; +} + +/** + Helper function to acquire the Manageability transport token. + + @param[in] ManageabilityProtocolSpec The Manageability protocol specification. + @param[out] TransportToken Pointer to receive Manageability transport + token. + + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_OUT_OF_RESOURCES Out of resource to create a new transport session. + @retval EFI_UNSUPPORTED Token is created successfully. + @retval EFI_INVALID_PARAMETER Input parameter is not valid. + Otherwise Other errors. +**/ +EFI_STATUS +HelperAcquireManageabilityTransport ( + IN EFI_GUID *ManageabilityProtocolSpec, + OUT MANAGEABILITY_TRANSPORT_TOKEN **TransportToken + ) +{ + EFI_STATUS Status; + CHAR16 *ManageabilityProtocolName; + CHAR16 *ManageabilityTransportName; + + DEBUG ((DEBUG_INFO, "%a: Entry\n", __FUNCTION__)); + if ((TransportToken == NULL) || (ManageabilityProtocolSpec == NULL)) { + DEBUG ((DEBUG_ERROR, "%a: One of the required input parameters is NULL.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + *TransportToken = NULL; + ManageabilityProtocolName = HelperManageabilitySpecName (ManageabilityProtocolSpec); + if (ManageabilityProtocolName == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Unsupported Manageability Protocol Specification\n", __FUNCTION__)); + return EFI_UNSUPPORTED; + } + + DEBUG ((DEBUG_INFO, " Manageability protocol %s is going to acquire transport interface token...\n", ManageabilityProtocolName)); + + Status = AcquireTransportSession (ManageabilityProtocolSpec, TransportToken); + if (Status == EFI_UNSUPPORTED) { + DEBUG ((DEBUG_ERROR, "%a: No supported transport interface for %s packet.\n", __FUNCTION__, ManageabilityProtocolName)); + return Status; + } + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: Fail to acquire Manageability transport token for %s (%r).\n", + __FUNCTION__, + ManageabilityProtocolName, + Status + )); + return Status; + } + + ManageabilityTransportName = HelperManageabilitySpecName ((*TransportToken)->Transport->ManageabilityTransportSpecification); + if (ManageabilityTransportName == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Unsupported Manageability Transport Interface Specification\n", __FUNCTION__)); + return EFI_UNSUPPORTED; + } + + DEBUG ((DEBUG_INFO, "%a: This is the transfer session for %s over %s\n", __FUNCTION__, ManageabilityProtocolName, ManageabilityTransportName)); + return Status; +} + +/** + Helper function to initial the transport interface. + + @param[in] TransportToken Transport token. + @param[in] HardwareInfo Optional hardware information of transport interface. + @param[out] TransportAdditionalStatus Transport additional status. + + @retval EFI_SUCCESS Transport interface is initiated successfully. + @retval EFI_DEVICE_ERROR The transport interface has problems + @retval EFI_INVALID_PARAMETER INput parameter is not valid. + Otherwise Other errors. +**/ +EFI_STATUS +HelperInitManageabilityTransport ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION HardwareInfo OPTIONAL, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ) +{ + EFI_STATUS Status; + + if (TransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: TransportToken is invalid.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + // Initial transport interface. + Status = TransportToken->Transport->Function.Version1_0->TransportInit (TransportToken, HardwareInfo); + if ((Status != EFI_SUCCESS) && (Status != EFI_ALREADY_STARTED)) { + if (Status == EFI_DEVICE_ERROR) { + // Try to reset the transport and initialize it again. + Status = TransportToken->Transport->Function.Version1_0->TransportReset ( + TransportToken, + TransportAdditionalStatus + ); + if (EFI_ERROR (Status)) { + if (Status == EFI_UNSUPPORTED) { + DEBUG ((DEBUG_ERROR, "%a: Transport interface doesn't have reset capability.\n", __FUNCTION__)); + } else { + DEBUG ((DEBUG_ERROR, "%a: Fail to reset transport interface (%r).\n", __FUNCTION__, Status)); + } + + Status = EFI_DEVICE_ERROR; + } else { + Status = TransportToken->Transport->Function.Version1_0->TransportInit (TransportToken, HardwareInfo); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Transport interface is not able to use after the reset (%r).\n", __FUNCTION__, Status)); + } + } + } else { + DEBUG ((DEBUG_ERROR, "%a: Transport interface is not able to use (%r).\n", __FUNCTION__, Status)); + } + } + + return Status; +} diff --git a/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.uni b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.uni new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.uni @@ -XXX,XX +XXX,XX @@ +// /** @file +// Null instance of Manageability Transport Helper Library +// +// Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "Manageability Transport Helper Library" + +#string STR_MODULE_DESCRIPTION #language en-US "Manageability Transport Helper Functions." + -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100675): https://edk2.groups.io/g/devel/message/100675 Mute This Topic: https://groups.io/mt/97357755/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> This is the KCS manageability transport library instance follows the design guidance described in Readme file under ManageabilityPkg. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Abdul Lateef Attar <abdattar@amd.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> --- .../ManageabilityPkg/ManageabilityPkg.dsc | 3 + .../Dxe/DxeManageabilityTransportKcs.inf | 44 ++ .../Common/ManageabilityTransportKcs.h | 106 ++++ .../Common/KcsCommon.c | 480 ++++++++++++++++++ .../Dxe/ManageabilityTransportKcs.c | 375 ++++++++++++++ .../Dxe/ManageabilityTransportKcs.uni | 13 + .../Library/RiscVOpensbiLib/opensbi | 2 +- 7 files changed, 1022 insertions(+), 1 deletion(-) create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.uni diff --git a/Features/ManageabilityPkg/ManageabilityPkg.dsc b/Features/ManageabilityPkg/ManageabilityPkg.dsc index XXXXXXX..XXXXXXX 100644 --- a/Features/ManageabilityPkg/ManageabilityPkg.dsc +++ b/Features/ManageabilityPkg/ManageabilityPkg.dsc @@ -XXX,XX +XXX,XX @@ !include MinPlatformPkg/Include/Dsc/CorePeiLib.dsc !include MinPlatformPkg/Include/Dsc/CoreDxeLib.dsc +[Components] + ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf + [LibraryClasses] ManageabilityTransportLib|ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf @@ -XXX,XX +XXX,XX @@ +## @file +# KCS instance of Manageability Transport Library +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x0001001B + BASE_NAME = DxeManageabilityTransportKcs + MODULE_UNI_FILE = ManageabilityTransportKcs.uni + FILE_GUID = FCCC8B34-145A-4927-9F08-553ADC579AF7 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = ManageabilityTransportLib + +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + ManageabilityTransportKcs.c + ../Common/KcsCommon.c + ../Common/ManageabilityTransportKcs.h + +[Packages] + ManageabilityPkg/ManageabilityPkg.dec + MdePkg/MdePkg.dec + +[LibraryClasses] + DebugLib + IoLib + TimerLib + MemoryAllocationLib + +[Guids] + gManageabilityTransportKcsGuid + gManageabilityProtocolMctpGuid + gManageabilityProtocolIpmiGuid + +[FixedPcd] + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress # Used as default KCS I/O base adddress + diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h @@ -XXX,XX +XXX,XX @@ +/** @file + + Manageability transport KCS internal used definitions. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MANAGEABILITY_TRANSPORT_KCS_LIB_H_ +#define MANAGEABILITY_TRANSPORT_KCS_LIB_H_ + +#include <Library/ManageabilityTransportLib.h> + +#define MANAGEABILITY_TRANSPORT_KCS_SIGNATURE SIGNATURE_32 ('M', 'T', 'K', 'C') + +#define KCS_BASE_ADDRESS mKcsHardwareInfo.IoBaseAddress +#define KCS_REG_DATA_IN mKcsHardwareInfo.IoDataInAddress +#define KCS_REG_DATA_OUT mKcsHardwareInfo.IoDataOutAddress +#define KCS_REG_COMMAND mKcsHardwareInfo.IoCommandAddress +#define KCS_REG_STATUS mKcsHardwareInfo.IoStatusAddress + +/// +/// Manageability transport KCS internal data structure. +/// +typedef struct { + UINTN Signature; + MANAGEABILITY_TRANSPORT_TOKEN Token; +} MANAGEABILITY_TRANSPORT_KCS; + +#define MANAGEABILITY_TRANSPORT_KCS_FROM_LINK(a) CR (a, MANAGEABILITY_TRANSPORT_KCS, Token, MANAGEABILITY_TRANSPORT_KCS_SIGNATURE) + +#define IPMI_KCS_GET_STATE(s) (s >> 6) +#define IPMI_KCS_SET_STATE(s) (s << 6) + +/// 5 sec, according to IPMI spec +#define IPMI_KCS_TIMEOUT_5_SEC 5000*1000 +#define IPMI_KCS_TIMEOUT_1MS 1000 + +/** + This service communicates with BMC using KCS protocol. + + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + @param[out] ResponseData Command Response Data. The completion + code is the first byte of response + data. + @param[in, out] ResponseDataSize Size of Command Response Data. + + @retval EFI_SUCCESS The command byte stream was + successfully submit to the device and a + response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent + to the device or a response was not + successfully received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi + command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to + the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of + resource or data size error. +**/ + +EFI_STATUS +EFIAPI +KcsTransportSendCommand ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ); + +/** + This function reads 8-bit value from register address. + + @param[in] Address This represents either 16-bit IO address + or 32-bit memory mapped address. + + @retval UINT8 8-bit value. +**/ +UINT8 +KcsRegisterRead8 ( + MANAGEABILITY_TRANSPORT_HARDWARE_IO Address + ); + +/** + This function writes 8-bit value to register address. + + @param[in] Address This represents either 16-bit IO address + or 32-bit memory mapped address. + @param[in] Value 8-bit value write to register address + + @retval UINT8 8-bit value. +**/ +VOID +KcsRegisterWrite8 ( + MANAGEABILITY_TRANSPORT_HARDWARE_IO Address, + UINT8 Value + ); + +#endif diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c @@ -XXX,XX +XXX,XX @@ +/** @file + + KCS instance of Manageability Transport Library + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Uefi.h> +#include <IndustryStandard/IpmiKcs.h> +#include <Library/BaseMemoryLib.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/TimerLib.h> + +#include "ManageabilityTransportKcs.h" + +extern MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO mKcsHardwareInfo; + +/** + This function waits for parameter Flag to set. + Checks status flag in every 1ms internal till 5 seconds elapses. + + @param[in] Flag KCS Flag to test. + @retval EFI_SUCCESS The KCS flag under test is set. + @retval EFI_TIMEOUT The KCS flag didn't set in 5 second windows. +**/ +EFI_STATUS +WaitStatusSet ( + IN UINT8 Flag + ) +{ + UINT64 Timeout = 0; + + while (!(KcsRegisterRead8 (KCS_REG_STATUS) & Flag)) { + MicroSecondDelay (IPMI_KCS_TIMEOUT_1MS); + Timeout = Timeout + IPMI_KCS_TIMEOUT_1MS; + if (Timeout >= IPMI_KCS_TIMEOUT_5_SEC) { + return EFI_TIMEOUT; + } + } + + return EFI_SUCCESS; +} + +/** + This function waits for parameter Flag to get cleared. + Checks status flag in every 1ms internal till 5 seconds elapses. + + @param[in] Flag KCS Flag to test. + + @retval EFI_SUCCESS The KCS flag under test is clear. + @retval EFI_TIMEOUT The KCS flag didn't cleared in 5 second windows. +**/ +EFI_STATUS +WaitStatusClear ( + IN UINT8 Flag + ) +{ + UINT64 Timeout = 0; + + while (KcsRegisterRead8 (KCS_REG_STATUS) & Flag) { + MicroSecondDelay (IPMI_KCS_TIMEOUT_1MS); + Timeout = Timeout + IPMI_KCS_TIMEOUT_1MS; + if (Timeout >= IPMI_KCS_TIMEOUT_5_SEC) { + return EFI_TIMEOUT; + } + } + + return EFI_SUCCESS; +} + +/** + This function validates KCS OBF bit. + Checks whether OBF bit is set or not. + + @retval EFI_SUCCESS OBF bit is set. + @retval EFI_NOT_READY OBF bit is not set. +**/ +EFI_STATUS +ClearOBF ( + VOID + ) +{ + if (KcsRegisterRead8 (KCS_REG_STATUS) & IPMI_KCS_OBF) { + KcsRegisterRead8 (KCS_REG_DATA_IN); // read the data to clear the OBF + if (KcsRegisterRead8 (KCS_REG_STATUS) & IPMI_KCS_OBF) { + return EFI_NOT_READY; + } + } + + return EFI_SUCCESS; +} + +/** + This function writes/sends data to the KCS port. + Algorithm is based on flow chart provided in IPMI spec 2.0 + Figure 9-6, KCS Interface BMC to SMS Write Transfer Flow Chart + + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + + @retval EFI_SUCCESS The command byte stream was successfully + submit to the device and a response was + successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent to the + device or a response was not successfully + received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi command + access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to + the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of resource or + data size error. +**/ +EFI_STATUS +KcsTransportWrite ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize + ) +{ + EFI_STATUS Status; + UINT32 Length; + UINT8 *Buffer; + UINT8 *BufferPtr; + + Length = sizeof (NetFunction) + sizeof (Command); + if (RequestData != NULL) { + Length = Length + RequestDataSize; + } + + Buffer = AllocateZeroPool (Length); + if (Buffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Buffer[0] = NetFunction + // Buffer[1] = Command + // Buffer [2..RequestDataSize] = RequestData + // + BufferPtr = Buffer; + CopyMem (BufferPtr, &NetFunction, sizeof (NetFunction)); + BufferPtr += sizeof (NetFunction); + CopyMem (BufferPtr, &Command, sizeof (Command)); + BufferPtr += sizeof (Command); + if (Length > (sizeof (NetFunction) + sizeof (Command))) { + CopyMem (BufferPtr, RequestData, RequestDataSize); + } + + BufferPtr = Buffer; + + // Step 1. wait for IBF to get clear + Status = WaitStatusClear (IPMI_KCS_IBF); + if (EFI_ERROR (Status)) { + FreePool (Buffer); + return Status; + } + + // Step 2. clear OBF + if (EFI_ERROR (ClearOBF ())) { + FreePool (Buffer); + return EFI_NOT_READY; + } + + // Step 3. WR_START to CMD, phase=wr_start + KcsRegisterWrite8 (KCS_REG_COMMAND, IPMI_KCS_CONTROL_CODE_WRITE_START); + + // Step 4. wait for IBF to get clear + Status = WaitStatusClear (IPMI_KCS_IBF); + if (EFI_ERROR (Status)) { + FreePool (Buffer); + return Status; + } + + // Step 5. check state it should be WRITE_STATE, else exit with error + if (IPMI_KCS_GET_STATE (KcsRegisterRead8 (KCS_REG_STATUS)) != IPMI_KCS_WRITE_STATE) { + FreePool (Buffer); + return EFI_NOT_READY; + } + + // Step 6, Clear OBF + if (EFI_ERROR (ClearOBF ())) { + FreePool (Buffer); + return EFI_NOT_READY; + } + + while (Length > 1) { + // Step 7, phase wr_data, write one byte of Data + KcsRegisterWrite8 (KCS_REG_DATA_OUT, *BufferPtr); + Length--; + BufferPtr++; + + // Step 8. wait for IBF clear + Status = WaitStatusClear (IPMI_KCS_IBF); + if (EFI_ERROR (Status)) { + FreePool (Buffer); + return Status; + } + + // Step 9. check state it should be WRITE_STATE, else exit with error + if (IPMI_KCS_GET_STATE (KcsRegisterRead8 (KCS_REG_STATUS)) != IPMI_KCS_WRITE_STATE) { + FreePool (Buffer); + return EFI_NOT_READY; + } + + // Step 10 + if (EFI_ERROR (ClearOBF ())) { + FreePool (Buffer); + return EFI_NOT_READY; + } + + // + // Step 11, check for DATA completion if more than one byte; + // if still need to be transferred then go to step 7 and repeat + // + } + + // Step 12, WR_END to CMD + KcsRegisterWrite8 (KCS_REG_COMMAND, IPMI_KCS_CONTROL_CODE_WRITE_END); + + // Step 13. wait for IBF to get clear + Status = WaitStatusClear (IPMI_KCS_IBF); + if (EFI_ERROR (Status)) { + FreePool (Buffer); + return Status; + } + + // Step 14. check state it should be WRITE_STATE, else exit with error + if (IPMI_KCS_GET_STATE (KcsRegisterRead8 (KCS_REG_STATUS)) != IPMI_KCS_WRITE_STATE) { + FreePool (Buffer); + return EFI_NOT_READY; + } + + // Step 15 + if (EFI_ERROR (ClearOBF ())) { + FreePool (Buffer); + return EFI_NOT_READY; + } + + // Step 16, write the last byte + KcsRegisterWrite8 (KCS_REG_DATA_OUT, *BufferPtr); + FreePool (Buffer); + return EFI_SUCCESS; +} + +/** + This function sends/receives data from KCS port. + Algorithm is based on flow chart provided in IPMI spec 2.0 + Figure 9-7, KCS Interface BMC to SMS Read Transfer Flow Chart + + @param [in] DataBytes Buffer to hold the read Data. + @param [in, out] Length Number of Bytes read from KCS port. + @retval EFI_SUCCESS The command byte stream was + successfully submit to the device and + a response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent + to the device or a response was not + successfully received from the + device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi + command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully set + to the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of + resource or data size error. +**/ +EFI_STATUS +KcsTransportRead ( + OUT UINT8 *DataByte, + IN OUT UINT32 *Length + ) +{ + EFI_STATUS Status; + UINT32 ReadLength; + + ReadLength = 0; + while (ReadLength < *Length) { + // Step 1. wait for IBF to get clear + Status = WaitStatusClear (IPMI_KCS_IBF); + if (EFI_ERROR (Status)) { + *Length = ReadLength; + return Status; + } + + // Step 2. check state it should be READ_STATE, else exit with error + if (IPMI_KCS_GET_STATE (KcsRegisterRead8 (KCS_REG_STATUS)) == IPMI_KCS_READ_STATE) { + // Step 2.1.1 check of OBF to get clear + Status = WaitStatusSet (IPMI_KCS_OBF); + if (EFI_ERROR (Status)) { + *Length = ReadLength; + return Status; + } + + // Step 2.1.2 read data from data out + DataByte[ReadLength++] = KcsRegisterRead8 (KCS_REG_DATA_IN); + Status = WaitStatusClear (IPMI_KCS_IBF); + if (EFI_ERROR (Status)) { + *Length = ReadLength; + return Status; + } + + // Step 2.1.3 Write READ byte to data in register. + KcsRegisterWrite8 (KCS_REG_DATA_OUT, IPMI_KCS_CONTROL_CODE_READ); + } else if (IPMI_KCS_GET_STATE (KcsRegisterRead8 (KCS_REG_STATUS)) == IPMI_KCS_IDLE_STATE) { + // Step 2.2.1 + Status = WaitStatusSet (IPMI_KCS_OBF); + if (EFI_ERROR (Status)) { + *Length = ReadLength; + return Status; + } + + // Step 2.2.2 read dummy data + KcsRegisterRead8 (KCS_REG_DATA_IN); // Dummy read as per IPMI spec + *Length = ReadLength; + return EFI_SUCCESS; + } else { + *Length = ReadLength; + return EFI_DEVICE_ERROR; + } + } + + *Length = ReadLength; + return EFI_SUCCESS; +} + +/** + This service communicates with BMC using KCS protocol. + + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + @param[out] ResponseData Command Response Data. The completion + code is the first byte of response + data. + @param[in, out] ResponseDataSize Size of Command Response Data. + + @retval EFI_SUCCESS The command byte stream was + successfully submit to the device and a + response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent + to the device or a response was not + successfully received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi + command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to + the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of + resource or data size error. +**/ +EFI_STATUS +EFIAPI +KcsTransportSendCommand ( + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +{ + EFI_STATUS Status; + UINT32 RspHeaderSize; + IPMI_KCS_RESPONSE_HEADER RspHeader; + + if ((RequestData != NULL) && (RequestDataSize <= 0)) { + return EFI_INVALID_PARAMETER; + } + + Status = KcsTransportWrite ( + (NetFunction << 2), + Command, + RequestData, + RequestDataSize + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "IPMI KCS Write Failed with Status(%r) for NetFunction(0x%x)," \ + " Command(0x%x).\n", + Status, + NetFunction, + Command + )); + return Status; + } + + // + // Read the response header + RspHeaderSize = sizeof (IPMI_KCS_RESPONSE_HEADER); + Status = KcsTransportRead ((UINT8 *)&RspHeader, &RspHeaderSize); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "IPMI KCS read response header failed Status(%r), " \ + "RspNetFunction = 0x%x, " \ + "CompletionCode = 0x%x \n", + Status, + RspHeader.NetFunc, + RspHeader.CompletionCode + )); + return (Status); + } + + Status = KcsTransportRead ((UINT8 *)ResponseData, ResponseDataSize); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "IPMI KCS response read Failed with Status(%r) for NetFunction(0x%x)," \ + " Command(0x%x).\n", + Status, + NetFunction, + Command + )); + } + + return Status; +} + +/** + This function reads 8-bit value from register address. + + @param[in] Address This represents either 16-bit IO address + or 32-bit memory mapped address. + + @retval UINT8 8-bit value. +**/ +UINT8 +KcsRegisterRead8 ( + MANAGEABILITY_TRANSPORT_HARDWARE_IO Address + ) +{ + UINT8 Value; + + if (mKcsHardwareInfo.MemoryMap == MANAGEABILITY_TRANSPORT_KCS_MEMORY_MAP_IO) { + // Read 8-bit value from 32-bit Memory mapped address. + Value = MmioRead8 ((UINTN)Address.IoAddress32); + } else { + // Read 8-bit value from 16-bit I/O address + Value = IoRead8 ((UINTN)Address.IoAddress16); + } + + return Value; +} + +/** + This function writes 8-bit value to register address. + + @param[in] Address This represents either 16-bit IO address + or 32-bit memory mapped address. + @param[in] Value 8-bit value write to register address + + @retval UINT8 8-bit value. +**/ +VOID +KcsRegisterWrite8 ( + MANAGEABILITY_TRANSPORT_HARDWARE_IO Address, + UINT8 Value + ) +{ + if (mKcsHardwareInfo.MemoryMap == MANAGEABILITY_TRANSPORT_KCS_MEMORY_MAP_IO) { + // Write 8-bit value to 32-bit Memory mapped address. + MmioWrite8 ((UINTN)Address.IoAddress32, Value); + } else { + // Write 8-bit value to 16-bit I/O address + IoWrite8 ((UINTN)Address.IoAddress16, Value); + } +} diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c @@ -XXX,XX +XXX,XX @@ +/** @file + + KCS instance of Manageability Transport Library + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +*/ + +#include <Uefi.h> +#include <IndustryStandard/IpmiKcs.h> +#include <Library/IoLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/ManageabilityTransportLib.h> +#include <Library/ManageabilityTransportIpmiLib.h> +#include <Library/ManageabilityTransportHelperLib.h> + +#include "ManageabilityTransportKcs.h" + +MANAGEABILITY_TRANSPORT_KCS *mSingleSessionToken = NULL; + +EFI_GUID *SupportedManageabilityProtocol[] = { + &gManageabilityProtocolIpmiGuid, + &gManageabilityProtocolMctpGuid +}; + +UINT8 NumberOfSupportedProtocol = (sizeof (SupportedManageabilityProtocol)/sizeof (EFI_GUID *)); + +MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO mKcsHardwareInfo; + +/** + This function initializes the transport interface. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [in] HardwareInfo The hardware information + assigned to KCS transport interface. + + @retval EFI_SUCCESS Transport interface is initialized + successfully. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_NOT_READY The transport interface works fine but + @retval is not ready. + @retval EFI_DEVICE_ERROR The transport interface has problems. + @retval EFI_ALREADY_STARTED Teh protocol interface has already initialized. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +EFIAPI +KcsTransportInit ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION HardwareInfo OPTIONAL + ) +{ + CHAR16 *ManageabilityProtocolName; + + if (TransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Invalid transport token.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + if (HardwareInfo.Kcs == NULL) { + DEBUG ((DEBUG_INFO, "%a: Hardware information is not provided, use dfault settings.\n", __FUNCTION__)); + mKcsHardwareInfo.MemoryMap = MANAGEABILITY_TRANSPORT_KCS_IO_MAP_IO; + mKcsHardwareInfo.IoBaseAddress.IoAddress16 = PcdGet16 (PcdIpmiKcsBaseAddress); + mKcsHardwareInfo.IoDataInAddress.IoAddress16 = mKcsHardwareInfo.IoBaseAddress.IoAddress16 + IPMI_KCS_DATA_IN_REGISTER_OFFSET; + mKcsHardwareInfo.IoDataOutAddress.IoAddress16 = mKcsHardwareInfo.IoBaseAddress.IoAddress16 + IPMI_KCS_DATA_OUT_REGISTER_OFFSET; + mKcsHardwareInfo.IoCommandAddress.IoAddress16 = mKcsHardwareInfo.IoBaseAddress.IoAddress16 + IPMI_KCS_COMMAND_REGISTER_OFFSET; + mKcsHardwareInfo.IoStatusAddress.IoAddress16 = mKcsHardwareInfo.IoBaseAddress.IoAddress16 + IPMI_KCS_STATUS_REGISTER_OFFSET; + } else { + mKcsHardwareInfo.MemoryMap = ((MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *)HardwareInfo.Kcs)->MemoryMap; + mKcsHardwareInfo.IoBaseAddress = ((MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *)HardwareInfo.Kcs)->IoBaseAddress; + mKcsHardwareInfo.IoDataInAddress = ((MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *)HardwareInfo.Kcs)->IoDataInAddress; + mKcsHardwareInfo.IoDataOutAddress = ((MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *)HardwareInfo.Kcs)->IoDataOutAddress; + mKcsHardwareInfo.IoCommandAddress = ((MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *)HardwareInfo.Kcs)->IoCommandAddress; + mKcsHardwareInfo.IoStatusAddress = ((MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *)HardwareInfo.Kcs)->IoStatusAddress; + } + + // Get protocol specification name. + ManageabilityProtocolName = HelperManageabilitySpecName (TransportToken->ManageabilityProtocolSpecification); + + DEBUG ((DEBUG_INFO, "%a: KCS transport hardware for %s is:\n", __FUNCTION__, ManageabilityProtocolName)); + if (mKcsHardwareInfo.MemoryMap) { + DEBUG ((DEBUG_INFO, "Memory Map I/O\n", __FUNCTION__)); + DEBUG ((DEBUG_INFO, "Base Memory Address : 0x%08x\n", mKcsHardwareInfo.IoBaseAddress.IoAddress32)); + DEBUG ((DEBUG_INFO, "Data in Address : 0x%08x\n", mKcsHardwareInfo.IoDataInAddress.IoAddress32)); + DEBUG ((DEBUG_INFO, "Data out Address : 0x%08x\n", mKcsHardwareInfo.IoDataOutAddress.IoAddress32)); + DEBUG ((DEBUG_INFO, "Command Address : 0x%08x\n", mKcsHardwareInfo.IoCommandAddress.IoAddress32)); + DEBUG ((DEBUG_INFO, "Status Address : 0x%08x\n", mKcsHardwareInfo.IoStatusAddress.IoAddress32)); + } else { + DEBUG ((DEBUG_INFO, "I/O Map I/O\n")); + DEBUG ((DEBUG_INFO, "Base I/O port : 0x%04x\n", mKcsHardwareInfo.IoBaseAddress.IoAddress16)); + DEBUG ((DEBUG_INFO, "Data in I/O port : 0x%04x\n", mKcsHardwareInfo.IoDataInAddress.IoAddress16)); + DEBUG ((DEBUG_INFO, "Data out I/O port: 0x%04x\n", mKcsHardwareInfo.IoDataOutAddress.IoAddress16)); + DEBUG ((DEBUG_INFO, "Command I/O port : 0x%04x\n", mKcsHardwareInfo.IoCommandAddress.IoAddress16)); + DEBUG ((DEBUG_INFO, "Status I/O port : 0x%04x\n", mKcsHardwareInfo.IoStatusAddress.IoAddress16)); + } + + return EFI_SUCCESS; +} + +/** + This function returns the transport interface status. + The generic EFI_STATUS is returned to caller directly, The additional + information of transport interface could be optionally returned in + TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [out] TransportAdditionalStatus The additional status of transport + interface. + NULL means no additional status of this + transport interface. + + @retval EFI_SUCCESS Transport interface status is returned. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_DEVICE_ERROR The transport interface has problems to return + @retval EFI_UNSUPPORTED The transport interface doesn't have status report. + Otherwise Other errors. + +**/ +EFI_STATUS +EFIAPI +KcsTransportStatus ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ) +{ + UINT8 TransportStatus; + + if (TransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Invalid transport token.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + if (TransportAdditionalStatus == NULL) { + return EFI_SUCCESS; + } + + TransportStatus = IPMI_KCS_GET_STATE (KcsRegisterRead8 (KCS_REG_STATUS)); + *TransportAdditionalStatus = MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_NO_ERRORS; + if (TransportStatus != IPMI_KCS_IDLE_STATE) { + if (TransportStatus == IPMI_KCS_READ_STATE) { + // + // Transport is in read state. + *TransportAdditionalStatus |= MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_BUSY_IN_READ; + return EFI_NOT_READY; + } else if (TransportStatus == IPMI_KCS_WRITE_STATE) { + // + // Transport is in read state. + *TransportAdditionalStatus |= MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS_BUSY_IN_WRITE; + return EFI_NOT_READY; + } else { + return EFI_DEVICE_ERROR; + } + } + + return EFI_SUCCESS; +} + +/** + This function resets the transport interface. + The generic EFI_STATUS is returned to caller directly after reseting transport + interface. The additional information of transport interface could be optionally + returned in TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [out] TransportAdditionalStatus The additional status of specific transport + interface after the reset. + NULL means no additional status of this + transport interface. + + @retval EFI_SUCCESS Transport interface status is returned. + @retval EFI_INVALID_PARAMETER The invalid transport token. + @retval EFI_TIMEOUT The reset process is time out. + @retval EFI_DEVICE_ERROR The transport interface has problems to return + status. + Otherwise Other errors. + +**/ +EFI_STATUS +EFIAPI +KcsTransportReset ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS *TransportAdditionalStatus OPTIONAL + ) +{ + return EFI_UNSUPPORTED; +} + +/** + This function transmit the request over target transport interface. + The generic EFI_STATUS is returned to caller directly after reseting transport + interface. The additional information of transport interface could be optionally + returned in TransportAdditionalStatus to describes the status that can't be + described obviously through EFI_STATUS. + See the definition of MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession function. + @param [in] TransferToken The transfer token, see the definition of + MANAGEABILITY_TRANSFER_TOKEN. + + @retval The EFI status is returned in MANAGEABILITY_TRANSFER_TOKEN. + +**/ +VOID +EFIAPI +KcsTransportTransmitReceive ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN MANAGEABILITY_TRANSFER_TOKEN *TransferToken + ) +{ + EFI_STATUS Status; + MANAGEABILITY_IPMI_TRANSPORT_HEADER *TransmitHeader; + + if (TransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Invalid transport token.\n", __FUNCTION__)); + return; + } + + TransmitHeader = (MANAGEABILITY_IPMI_TRANSPORT_HEADER *)&TransferToken->TransmitHeader; + if (TransmitHeader == NULL) { + TransferToken->TransferStatus = EFI_INVALID_PARAMETER; + return; + } + + Status = KcsTransportSendCommand ( + TransmitHeader->NetFn, + TransmitHeader->Command, + TransferToken->TransmitPackage.TransmitPayload, + TransferToken->TransmitPackage.TransmitSizeInByte, + TransferToken->ReceivePackage.ReceiveBuffer, + &TransferToken->ReceivePackage.ReceiveSizeInByte + ); + + TransferToken->TransferStatus = Status; + KcsTransportStatus (TransportToken, &TransferToken->TransportAdditionalStatus); +} + +/** + This function acquires to create a transport session to transmit manageability + packet. A transport token is returned to caller for the follow up operations. + + @param [in] ManageabilityProtocolSpec The protocol spec the transport interface is acquired. + @param [out] TransportToken The pointer to receive the transport token created by + the target transport interface library. + @retval EFI_SUCCESS Token is created successfully. + @retval EFI_OUT_OF_RESOURCES Out of resource to create a new transport session. + @retval EFI_UNSUPPORTED Protocol is not supported on this transport interface. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +AcquireTransportSession ( + IN EFI_GUID *ManageabilityProtocolSpec, + OUT MANAGEABILITY_TRANSPORT_TOKEN **TransportToken + ) +{ + EFI_STATUS Status; + MANAGEABILITY_TRANSPORT_KCS *KcsTransportToken; + + if (ManageabilityProtocolSpec == NULL) { + DEBUG ((DEBUG_ERROR, "%a: No Manageability protocol specification specified.\n", __FUNCTION__)); + return EFI_INVALID_PARAMETER; + } + + Status = HelperManageabilityCheckSupportedSpec ( + &gManageabilityTransportKcsGuid, + SupportedManageabilityProtocol, + NumberOfSupportedProtocol, + ManageabilityProtocolSpec + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Protocol is not supported on this transport interface.\n", __FUNCTION__)); + return EFI_UNSUPPORTED; + } + + if (mSingleSessionToken != NULL) { + DEBUG ((DEBUG_ERROR, "%a: This manageability transport library only supports one session transport token.\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + KcsTransportToken = AllocateZeroPool (sizeof (MANAGEABILITY_TRANSPORT_KCS)); + if (KcsTransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for MANAGEABILITY_TRANSPORT_KCS\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + KcsTransportToken->Signature = MANAGEABILITY_TRANSPORT_KCS_SIGNATURE; + KcsTransportToken->Token.ManageabilityProtocolSpecification = ManageabilityProtocolSpec; + KcsTransportToken->Token.Transport->TransportVersion = MANAGEABILITY_TRANSPORT_TOKEN_VERSION; + KcsTransportToken->Token.Transport->ManageabilityTransportSpecification = &gManageabilityTransportKcsGuid; + KcsTransportToken->Token.Transport->TransportName = L"KCS"; + KcsTransportToken->Token.Transport->Function.Version1_0 = AllocateZeroPool (sizeof (MANAGEABILITY_TRANSPORT_FUNCTION_V1_0)); + if (KcsTransportToken->Token.Transport->Function.Version1_0 == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Fail to allocate memory for MANAGEABILITY_TRANSPORT_FUNCTION_V1_0\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + KcsTransportToken->Token.Transport->Function.Version1_0->TransportInit = KcsTransportInit; + KcsTransportToken->Token.Transport->Function.Version1_0->TransportReset = KcsTransportReset; + KcsTransportToken->Token.Transport->Function.Version1_0->TransportStatus = KcsTransportStatus; + KcsTransportToken->Token.Transport->Function.Version1_0->TransportTransmitReceive = KcsTransportTransmitReceive; + + mSingleSessionToken = KcsTransportToken; + *TransportToken = &KcsTransportToken->Token; + return EFI_SUCCESS; +} + +/** + This function returns the transport capabilities. + + @param [out] TransportFeature Pointer to receive transport capabilities. + See the definitions of + MANAGEABILITY_TRANSPORT_CAPABILITY. + +**/ +VOID +GetTransportCapability ( + OUT MANAGEABILITY_TRANSPORT_CAPABILITY *TransportCapability + ) +{ + if (TransportCapability != NULL) { + *TransportCapability = 0; + } +} + +/** + This function releases the manageability session. + + @param [in] TransportToken The transport token acquired through + AcquireTransportSession. + @retval EFI_SUCCESS Token is released successfully. + @retval EFI_INVALID_PARAMETER Invalid TransportToken. + @retval Otherwise Other errors. + +**/ +EFI_STATUS +ReleaseTransportSession ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken + ) +{ + EFI_STATUS Status; + MANAGEABILITY_TRANSPORT_KCS *KcsTransportToken; + + if (TransportToken == NULL) { + Status = EFI_INVALID_PARAMETER; + } + + KcsTransportToken = MANAGEABILITY_TRANSPORT_KCS_FROM_LINK (TransportToken); + if (mSingleSessionToken != KcsTransportToken) { + Status = EFI_INVALID_PARAMETER; + } + + if (KcsTransportToken != NULL) { + FreePool (KcsTransportToken->Token.Transport->Function.Version1_0); + FreePool (KcsTransportToken); + mSingleSessionToken = NULL; + Status = EFI_SUCCESS; + } + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Fail to release KCS transport token (%r).\n", __FUNCTION__, Status)); + } + + return Status; +} diff --git a/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.uni b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.uni new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.uni @@ -XXX,XX +XXX,XX @@ +// /** @file +// KCS instance of Manageability Transport Library +// +// Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +// +// SPDX-License-Identifier: BSD-2-Clause-Patent +// +// **/ + +#string STR_MODULE_ABSTRACT #language en-US "KCS instance of Manageability Transport Library" + +#string STR_MODULE_DESCRIPTION #language en-US "KCS Manageability Transport library implementation." + diff --git a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi index XXXXXXX..XXXXXXX 160000 --- a/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi +++ b/Silicon/RISC-V/ProcessorPkg/Library/RiscVOpensbiLib/opensbi @@ -1 +1 @@ -Subproject commit a731c7e36988c3308e1978ecde491f2f6182d490 +Subproject commit 937caee0833115f69d697ca190001ba0aa5c7368 -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100676): https://edk2.groups.io/g/devel/message/100676 Mute This Topic: https://groups.io/mt/97357756/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> Add Ipmi Protocol/Ppi/SMM implementations. The underlying implementation of transport interface depends on the binded ManageabilityTransportLib. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Abdul Lateef Attar <abdattar@amd.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> --- .../IpmiProtocol/Dxe/IpmiProtocolDxe.inf | 50 ++++ .../Universal/IpmiProtocol/Pei/IpmiPpiPei.inf | 51 ++++ .../IpmiProtocol/Smm/IpmiProtocolSmm.inf | 52 ++++ .../IpmiProtocol/Common/IpmiProtocolCommon.h | 108 ++++++++ .../IpmiProtocol/Common/IpmiProtocolCommon.c | 245 ++++++++++++++++++ .../Universal/IpmiProtocol/Dxe/IpmiProtocol.c | 177 +++++++++++++ .../Universal/IpmiProtocol/Pei/IpmiPpi.c | 151 +++++++++++ .../Universal/IpmiProtocol/Smm/IpmiProtocol.c | 147 +++++++++++ 8 files changed, 981 insertions(+) create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.h create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.inf b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.inf new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.inf @@ -XXX,XX +XXX,XX @@ +## @file +# IPMI Protocol DXE Driver. +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001d + BASE_NAME = IpmiDxe + FILE_GUID = BC41B0C2-9D8A-42B5-A28F-02CE0D4A6C28 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = DxeIpmiEntry + UNLOAD_IMAGE = IpmiUnloadImage + +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + IpmiProtocol.c + ../Common/IpmiProtocolCommon.c + ../Common/IpmiProtocolCommon.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + ManageabilityPkg/ManageabilityPkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + ManageabilityTransportHelperLib + ManageabilityTransportLib + UefiDriverEntryPoint + UefiBootServicesTableLib + +[Protocols] + gIpmiProtocolGuid # PROTOCOL ALWAYS_PRODUCED + +[Guids] + gManageabilityProtocolIpmiGuid + gManageabilityTransportKcsGuid + +[FixedPcd] + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress + +[Depex] + TRUE diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf @@ -XXX,XX +XXX,XX @@ +## @file +# IPMI Protocol PEI Driver. +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x0001001d + BASE_NAME = IpmiPei + FILE_GUID = 7832F989-CB72-4715-ADCA-35C0B031856C + MODULE_TYPE = PEIM + VERSION_STRING = 1.0 + ENTRY_POINT = PeiIpmiEntry + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# + +[Sources] + IpmiPpi.c + ../Common/IpmiProtocolCommon.c + ../Common/IpmiProtocolCommon.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + ManageabilityPkg/ManageabilityPkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + ManageabilityTransportHelperLib + ManageabilityTransportLib + PeimEntryPoint + ManageabilityTransportLib + +[Ppis] + gPeiIpmiPpiGuid # PPI ALWAYS PRODUCED + +[Guids] + gManageabilityProtocolIpmiGuid + gManageabilityTransportKcsGuid + +[FixedPcd] + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress + +[Depex] + TRUE diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm.inf b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm.inf new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm.inf @@ -XXX,XX +XXX,XX @@ +## @file +# IPMI Protocol SMM Driver. +# +# Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 ARM AARCH64 +# +[Defines] + INF_VERSION = 0x0001001d + BASE_NAME = IpmiSmm + FILE_GUID = CDD5D1DE-E3D3-4B1F-8689-DCC661561BB4 + MODULE_TYPE = DXE_SMM_DRIVER + PI_SPECIFICATION_VERSION = 0x0001000A + VERSION_STRING = 1.0 + ENTRY_POINT = SmmIpmiEntry + +[Sources] + IpmiProtocol.c + ../Common/IpmiProtocolCommon.c + ../Common/IpmiProtocolCommon.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + ManageabilityPkg/ManageabilityPkg.dec + +[LibraryClasses] + BaseMemoryLib + DebugLib + ManageabilityTransportHelperLib + ManageabilityTransportLib + SmmServicesTableLib + UefiDriverEntryPoint + UefiBootServicesTableLib + +[Protocols] + gSmmIpmiProtocolGuid # PROTOCOL ALWAYS_PRODUCED + +[Guids] + gManageabilityProtocolIpmiGuid + gManageabilityTransportKcsGuid + +[FixedPcd] + gEfiMdePkgTokenSpaceGuid.PcdIpmiKcsBaseAddress + +[Depex] + TRUE diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.h b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.h new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.h @@ -XXX,XX +XXX,XX @@ +/** @file + + IPMI Manageability Protocol common header file. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef MANAGEABILITY_IPMI_COMMON_H_ +#define MANAGEABILITY_IPMI_COMMON_H_ + +#include <IndustryStandard/IpmiKcs.h> +#include <Library/ManageabilityTransportLib.h> + +/// +/// IPMI KCS hardware information. +/// +#define IPMI_KCS_BASE_ADDRESS PcdGet16 (PcdIpmiKcsBaseAddress) +#define IPMI_KCS_REG_DATA_IN IPMI_KCS_BASE_ADDRESS + IPMI_KCS_DATA_IN_REGISTER_OFFSET +#define IPMI_KCS_REG_DATA_OUT IPMI_KCS_BASE_ADDRESS + IPMI_KCS_DATA_OUT_REGISTER_OFFSET +#define IPMI_KCS_REG_COMMAND IPMI_KCS_BASE_ADDRESS + IPMI_KCS_COMMAND_REGISTER_OFFSET +#define IPMI_KCS_REG_STATUS IPMI_KCS_BASE_ADDRESS + IPMI_KCS_STATUS_REGISTER_OFFSET + +/** + This functions setup the IPMI transport hardware information according + to the specification of transport token acquired from transport library. + + @param[in] TransportToken The transport interface. + @param[out] HardwareInformation Pointer to receive the hardware information. + + @retval EFI_SUCCESS Hardware information is returned in HardwareInformation. + Caller must free the memory allocated for HardwareInformation + once it doesn't need it. + @retval EFI_UNSUPPORTED No hardware information for the specification specified + in the transport token. +**/ +EFI_STATUS +SetupIpmiTransportHardwareInformation ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION *HardwareInformation + ); + +/** + This functions setup the final header/body/trailer packets for + the acquired transport interface. + + @param[in] TransportToken The transport interface. + @param[in] NetFunction IPMI function. + @param[in] Command IPMI command. + @param[out] PacketHeader The pointer to receive header of request. + @param[in, out] PacketBody The request body. + When IN, it is the caller's request body. + When OUT and NULL, the request body is not + changed. + Whee out and non-NULL, the request body is + changed to comfort the transport interface. + @param[in, out] PacketBodySize The request body size. + When IN and non-zero, it is the new data + length of request body. + When IN and zero, the request body is unchanged. + @param[out] PacketTrailer The pointer to receive trailer of request. + + @retval EFI_SUCCESS Request packet is returned. + @retval EFI_UNSUPPORTED Request packet is not returned because + the unsupported transport interface. +**/ +EFI_STATUS +SetupIpmiRequestTransportPacket ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN UINT8 NetFunction, + IN UINT8 Command, + OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader, + IN OUT UINT8 **PacketBody, + IN OUT UINT32 *PacketBodySize, + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer + ); + +/** + Common code to submit IPMI commands + + @param[in] TransportToken TRansport token. + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + @param[out] ResponseData Command Response Data. The completion code is the first byte of response data. + @param[in, out] ResponseDataSize Size of Command Response Data. + + @retval EFI_SUCCESS The command byte stream was successfully submit to the device and a response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent to the device or a response was not successfully received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of resource or data size error. +**/ +EFI_STATUS +CommonIpmiSubmitCommand ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ); + +#endif diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.c b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.c @@ -XXX,XX +XXX,XX @@ +/** @file + + IPMI Manageability Protocol common file. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ +#include <Uefi.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/ManageabilityTransportIpmiLib.h> +#include <Library/ManageabilityTransportLib.h> + +#include "IpmiProtocolCommon.h" + +extern CHAR16 *mTransportName; + +MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION mHardwareInformation; + +/** + This functions setup the IPMI transport hardware information according + to the specification of transport token acquired from transport library. + + @param[in] TransportToken The transport interface. + @param[out] HardwareInformation Pointer to receive the hardware information. + + @retval EFI_SUCCESS Hardware information is returned in HardwareInformation. + Caller must free the memory allocated for HardwareInformation + once it doesn't need it. + @retval EFI_UNSUPPORTED No hardware information for the specification specified + in the transport token. + #retval EFI_OUT_OF_RESOURCES Not enough memory for MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO. +**/ +EFI_STATUS +SetupIpmiTransportHardwareInformation ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + OUT MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION *HardwareInformation + ) +{ + MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO *KcsHardwareInfo; + + KcsHardwareInfo = AllocatePool (sizeof (MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO)); + if (KcsHardwareInfo == NULL) { + DEBUG ((DEBUG_ERROR, "%a: Not enough memory for MANAGEABILITY_TRANSPORT_KCS_HARDWARE_INFO.\n", __FUNCTION__)); + return EFI_OUT_OF_RESOURCES; + } + + if (CompareGuid (&gManageabilityTransportKcsGuid, TransportToken->Transport->ManageabilityTransportSpecification)) { + // This is KCS transport interface. + KcsHardwareInfo->MemoryMap = MANAGEABILITY_TRANSPORT_KCS_IO_MAP_IO; + KcsHardwareInfo->IoBaseAddress.IoAddress16 = IPMI_KCS_BASE_ADDRESS; + KcsHardwareInfo->IoDataInAddress.IoAddress16 = IPMI_KCS_REG_DATA_IN; + KcsHardwareInfo->IoDataOutAddress.IoAddress16 = IPMI_KCS_REG_DATA_OUT; + KcsHardwareInfo->IoCommandAddress.IoAddress16 = IPMI_KCS_REG_COMMAND; + KcsHardwareInfo->IoStatusAddress.IoAddress16 = IPMI_KCS_REG_STATUS; + *HardwareInformation = + (MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION)KcsHardwareInfo; + return EFI_SUCCESS; + } else { + DEBUG ((DEBUG_ERROR, "%a: No implementation of setting hardware information.", __FUNCTION__)); + ASSERT (FALSE); + } + + return EFI_UNSUPPORTED; +} + +/** + This functions setup the final header/body/trailer packets for + the acquired transport interface. + + @param[in] TransportToken The transport interface. + @param[in] NetFunction IPMI function. + @param[in] Command IPMI command. + @param[out] PacketHeader The pointer to receive header of request. + @param[in, out] PacketBody The request body. + When IN, it is the caller's request body. + When OUT and NULL, the request body is not + changed. + When OUT and non-NULL, the request body is + changed to conform the transport interface. + @param[in, out] PacketBodySize The request body size. + When IN and non-zero, it is the new data + length of request body. + When IN and zero, the request body is unchanged. + @param[out] PacketTrailer The pointer to receive trailer of request. + + @retval EFI_SUCCESS Request packet is returned. + @retval EFI_UNSUPPORTED Request packet is not returned because + the unsupported transport interface. +**/ +EFI_STATUS +SetupIpmiRequestTransportPacket ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN UINT8 NetFunction, + IN UINT8 Command, + OUT MANAGEABILITY_TRANSPORT_HEADER *PacketHeader, + IN OUT UINT8 **PacketBody, + IN OUT UINT32 *PacketBodySize, + OUT MANAGEABILITY_TRANSPORT_TRAILER *PacketTrailer + ) +{ + MANAGEABILITY_IPMI_TRANSPORT_HEADER *IpmiHeader; + + if (CompareGuid (&gManageabilityTransportKcsGuid, TransportToken->Transport->ManageabilityTransportSpecification)) { + // This is KCS transport interface. + IpmiHeader = AllocateZeroPool (sizeof (MANAGEABILITY_IPMI_TRANSPORT_HEADER)); + if (IpmiHeader == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + IpmiHeader->Command = Command; + IpmiHeader->Lun = 0; + IpmiHeader->NetFn = NetFunction; + *PacketHeader = (MANAGEABILITY_TRANSPORT_HEADER *)IpmiHeader; + *PacketTrailer = NULL; + *PacketBody = NULL; + *PacketBodySize = 0; + } else { + DEBUG ((DEBUG_ERROR, "%a: No implementation of building up packet.", __FUNCTION__)); + ASSERT (FALSE); + } + + return EFI_SUCCESS; +} + +/** + Common code to submit IPMI commands + + @param[in] TransportToken TRansport token. + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + @param[out] ResponseData Command Response Data. The completion code is the first byte of response data. + @param[in, out] ResponseDataSize Size of Command Response Data. + + @retval EFI_SUCCESS The command byte stream was successfully submit to the device and a response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent to the device or a response was not successfully received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of resource or data size error. +**/ +EFI_STATUS +CommonIpmiSubmitCommand ( + IN MANAGEABILITY_TRANSPORT_TOKEN *TransportToken, + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +{ + EFI_STATUS Status; + UINT8 *ThisRequestData; + UINT32 ThisRequestDataSize; + MANAGEABILITY_TRANSFER_TOKEN TransferToken; + MANAGEABILITY_TRANSPORT_HEADER IpmiTransportHeader; + MANAGEABILITY_TRANSPORT_TRAILER IpmiTransportTrailer; + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; + + if (TransportToken == NULL) { + DEBUG ((DEBUG_ERROR, "%a: No transport toke for IPMI\n", __FUNCTION__)); + return EFI_UNSUPPORTED; + } + + Status = TransportToken->Transport->Function.Version1_0->TransportStatus ( + TransportToken, + &TransportAdditionalStatus + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Transport %s for IPMI has problem - (%r)\n", __FUNCTION__, mTransportName, Status)); + return Status; + } + + ThisRequestData = RequestData; + ThisRequestDataSize = RequestDataSize; + IpmiTransportHeader = NULL; + IpmiTransportTrailer = NULL; + Status = SetupIpmiRequestTransportPacket ( + TransportToken, + NetFunction, + Command, + &IpmiTransportHeader, + &ThisRequestData, + &ThisRequestDataSize, + &IpmiTransportTrailer + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Fail to build packets - (%r)\n", __FUNCTION__, Status)); + return Status; + } + + TransferToken.TransmitHeader = IpmiTransportHeader; + TransferToken.TransmitTrailer = IpmiTransportTrailer; + ZeroMem (&TransferToken, sizeof (MANAGEABILITY_TRANSFER_TOKEN)); + + // Transmit packet. + if ((ThisRequestData == NULL) || (ThisRequestDataSize == 0)) { + TransferToken.TransmitPackage.TransmitPayload = RequestData; + TransferToken.TransmitPackage.TransmitSizeInByte = RequestDataSize; + } else { + TransferToken.TransmitPackage.TransmitPayload = ThisRequestData; + TransferToken.TransmitPackage.TransmitSizeInByte = ThisRequestDataSize; + } + + TransferToken.TransmitPackage.TransmitTimeoutInMillisecond = MANAGEABILITY_TRANSPORT_NO_TIMEOUT; + + // Receive packet. + TransferToken.ReceivePackage.ReceiveBuffer = ResponseData; + TransferToken.ReceivePackage.ReceiveSizeInByte = *ResponseDataSize; + TransferToken.ReceivePackage.TransmitTimeoutInMillisecond = MANAGEABILITY_TRANSPORT_NO_TIMEOUT; + TransportToken->Transport->Function.Version1_0->TransportTransmitReceive ( + TransportToken, + &TransferToken + ); + + if (IpmiTransportHeader != NULL) { + FreePool ((VOID *)IpmiTransportHeader); + } + + if (IpmiTransportTrailer != NULL) { + FreePool ((VOID *)IpmiTransportTrailer); + } + + if (ThisRequestData != NULL) { + FreePool ((VOID *)ThisRequestData); + } + + // Return transfer status. + // + Status = TransferToken.TransferStatus; + TransportAdditionalStatus = TransferToken.TransportAdditionalStatus; + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to send IPMI command over %s\n", __FUNCTION__, mTransportName)); + return Status; + } + + *ResponseDataSize = TransferToken.ReceivePackage.ReceiveSizeInByte; + return Status; +} diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c @@ -XXX,XX +XXX,XX @@ +/** @file + This file provides IPMI Protocol implementation. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <PiDxe.h> +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/ManageabilityTransportLib.h> +#include <Library/ManageabilityTransportIpmiLib.h> +#include <Library/ManageabilityTransportHelperLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/IpmiProtocol.h> + +#include "IpmiProtocolCommon.h" + +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken = NULL; +CHAR16 *mTransportName; + +extern MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION mHardwareInformation; + +/** + This service enables submitting commands via Ipmi. + + @param[in] This This point for IPMI_PROTOCOL structure. + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + @param[out] ResponseData Command Response Data. The completion code is the first byte of response data. + @param[in, out] ResponseDataSize Size of Command Response Data. + + @retval EFI_SUCCESS The command byte stream was successfully submit to the device and a response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent to the device or a response was not successfully received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of resource or data size error. +**/ +EFI_STATUS +EFIAPI +DxeIpmiSubmitCommand ( + IN IPMI_PROTOCOL *This, + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +{ + EFI_STATUS Status; + + Status = CommonIpmiSubmitCommand ( + mTransportToken, + NetFunction, + Command, + RequestData, + RequestDataSize, + ResponseData, + ResponseDataSize + ); + return Status; +} + +static IPMI_PROTOCOL mIpmiProtocol = { + DxeIpmiSubmitCommand +}; + +/** + The entry point of the Ipmi DXE driver. + + @param[in] ImageHandle - Handle of this driver image + @param[in] SystemTable - Table containing standard EFI services + + @retval EFI_SUCCESS - IPMI Protocol is installed successfully. + @retval Otherwise - Other errors. +**/ +EFI_STATUS +EFIAPI +DxeIpmiEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; + + GetTransportCapability (&TransportCapability); + + Status = HelperAcquireManageabilityTransport ( + &gManageabilityProtocolIpmiGuid, + &mTransportToken + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for IPMI protocol - %r\n", __FUNCTION__, Status)); + return Status; + } + + mTransportName = HelperManageabilitySpecName (mTransportToken->Transport->ManageabilityTransportSpecification); + DEBUG ((DEBUG_ERROR, "%a: IPMI protocol over %s.\n", __FUNCTION__, mTransportName)); + + // + // Setup hardware information according to the transport interface. + Status = SetupIpmiTransportHardwareInformation ( + mTransportToken, + &mHardwareInformation + ); + if (EFI_ERROR (Status)) { + if (Status == EFI_UNSUPPORTED) { + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s transport interface.\n", __FUNCTION__, mTransportName)); + } + + return Status; + } + + // + // Initial transport interface with the hardware information assigned. + Status = HelperInitManageabilityTransport ( + mTransportToken, + mHardwareInformation, + &TransportAdditionalStatus + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Handle = NULL; + Status = gBS->InstallProtocolInterface ( + &Handle, + &gIpmiProtocolGuid, + EFI_NATIVE_INTERFACE, + (VOID **)&mIpmiProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI protocol - %r\n", __FUNCTION__, Status)); + } + + return Status; +} + +/** + This is the unload handler for IPMI protocol module. + + Release the MANAGEABILITY_TRANSPORT_TOKEN acquired at entry point. + + @param[in] ImageHandle The drivers' driver image. + + @retval EFI_SUCCESS The image is unloaded. + @retval Others Failed to unload the image. + +**/ +EFI_STATUS +EFIAPI +IpmiUnloadImage ( + IN EFI_HANDLE ImageHandle + ) +{ + EFI_STATUS Status; + + Status = EFI_SUCCESS; + if (mTransportToken != NULL) { + Status = ReleaseTransportSession (mTransportToken); + } + + if (mHardwareInformation.Pointer != NULL) { + FreePool (mHardwareInformation.Pointer); + } + + return Status; +} diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c @@ -XXX,XX +XXX,XX @@ +/** @file + This file provides IPMI PPI implementation. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <PiPei.h> +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/ManageabilityTransportLib.h> +#include <Library/ManageabilityTransportIpmiLib.h> +#include <Library/ManageabilityTransportHelperLib.h> +#include <Library/PeiServicesLib.h> + +#include <Ppi/IpmiPpi.h> + +#include "IpmiProtocolCommon.h" + +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken = NULL; +CHAR16 *mTransportName; + +extern MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION mHardwareInformation; + +/** + This service enables submitting commands via Ipmi. + + @param[in] This This point for PEI_IPMI_PPI structure. + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + @param[out] ResponseData Command Response Data. The completion code is the first byte of response data. + @param[in, out] ResponseDataSize Size of Command Response Data. + + @retval EFI_SUCCESS The command byte stream was successfully submit to the device and a response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent to the device or a response was not successfully received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of resource or data size error. +**/ +EFI_STATUS +EFIAPI +PeiIpmiSubmitCommand ( + IN PEI_IPMI_PPI *This, + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +{ + EFI_STATUS Status; + + Status = CommonIpmiSubmitCommand ( + mTransportToken, + NetFunction, + Command, + RequestData, + RequestDataSize, + ResponseData, + ResponseDataSize + ); + return Status; +} + +static PEI_IPMI_PPI mPeiIpmiPpi = { + PeiIpmiSubmitCommand +}; + +static EFI_PEI_PPI_DESCRIPTOR mIpmiPpiList[] = { + { + (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), + &gPeiIpmiPpiGuid, + &mPeiIpmiPpi + } +}; + +/** + The entry point of the Ipmi PPI PEIM. + + @param FileHandle Handle of the file being invoked. + @param PeiServices Describes the list of possible PEI Services. + + @retval EFI_SUCCESS Indicates that Ipmi initialization completed successfully. + @retval Others Indicates that Ipmi initialization could not complete successfully. +**/ +EFI_STATUS +EFIAPI +PeiIpmiEntry ( + IN EFI_PEI_FILE_HANDLE FileHandle, + IN CONST EFI_PEI_SERVICES **PeiServices + ) +{ + EFI_STATUS Status; + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; + + GetTransportCapability (&TransportCapability); + + Status = HelperAcquireManageabilityTransport ( + &gManageabilityProtocolIpmiGuid, + &mTransportToken + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for IPMI protocol - %r\n", __FUNCTION__, Status)); + return Status; + } + + mTransportName = HelperManageabilitySpecName (mTransportToken->Transport->ManageabilityTransportSpecification); + DEBUG ((DEBUG_ERROR, "%a: IPMI protocol over %s.\n", __FUNCTION__, mTransportName)); + + // + // Setup hardware information according to the transport interface. + Status = SetupIpmiTransportHardwareInformation ( + mTransportToken, + &mHardwareInformation + ); + if (EFI_ERROR (Status)) { + if (Status == EFI_UNSUPPORTED) { + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s transport interface.\n", __FUNCTION__, mTransportName)); + } + + return Status; + } + + // + // Initial transport interface with the hardware information assigned. + Status = HelperInitManageabilityTransport ( + mTransportToken, + mHardwareInformation, + &TransportAdditionalStatus + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Install IPMI PPI. + // + Status = PeiServicesInstallPpi (&mIpmiPpiList[0]); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI PPI - %r\n", __FUNCTION__, Status)); + } + + return Status; +} diff --git a/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c new file mode 100644 index XXXXXXX..XXXXXXX --- /dev/null +++ b/Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c @@ -XXX,XX +XXX,XX @@ +/** @file + This file provides IPMI SMM Protocol implementation. + + Copyright (C) 2023 Advanced Micro Devices, Inc. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <PiDxe.h> +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/ManageabilityTransportLib.h> +#include <Library/ManageabilityTransportIpmiLib.h> +#include <Library/ManageabilityTransportHelperLib.h> +#include <Library/SmmServicesTableLib.h> +#include <Library/UefiBootServicesTableLib.h> + +#include <Protocol/IpmiProtocol.h> + +#include "IpmiProtocolCommon.h" + +MANAGEABILITY_TRANSPORT_TOKEN *mTransportToken = NULL; +CHAR16 *mTransportName; + +extern MANAGEABILITY_TRANSPORT_HARDWARE_INFORMATION mHardwareInformation; + +/** + This service enables submitting commands via Ipmi. + + @param[in] This This point for IPMI_PROTOCOL structure. + @param[in] NetFunction Net function of the command. + @param[in] Command IPMI Command. + @param[in] RequestData Command Request Data. + @param[in] RequestDataSize Size of Command Request Data. + @param[out] ResponseData Command Response Data. The completion code is the first byte of response data. + @param[in, out] ResponseDataSize Size of Command Response Data. + + @retval EFI_SUCCESS The command byte stream was successfully submit to the device and a response was successfully received. + @retval EFI_NOT_FOUND The command was not successfully sent to the device or a response was not successfully received from the device. + @retval EFI_NOT_READY Ipmi Device is not ready for Ipmi command access. + @retval EFI_DEVICE_ERROR Ipmi Device hardware error. + @retval EFI_TIMEOUT The command time out. + @retval EFI_UNSUPPORTED The command was not successfully sent to the device. + @retval EFI_OUT_OF_RESOURCES The resource allocation is out of resource or data size error. +**/ +EFI_STATUS +EFIAPI +SmmIpmiSubmitCommand ( + IN IPMI_PROTOCOL *This, + IN UINT8 NetFunction, + IN UINT8 Command, + IN UINT8 *RequestData, + IN UINT32 RequestDataSize, + OUT UINT8 *ResponseData, + IN OUT UINT32 *ResponseDataSize + ) +{ + EFI_STATUS Status; + + Status = CommonIpmiSubmitCommand ( + mTransportToken, + NetFunction, + Command, + RequestData, + RequestDataSize, + ResponseData, + ResponseDataSize + ); + return Status; +} + +static IPMI_PROTOCOL mIpmiProtocol = { + SmmIpmiSubmitCommand +}; + +/** + The entry point of the Ipmi DXE driver. + + @param[in] ImageHandle - Handle of this driver image + @param[in] SystemTable - Table containing standard EFI services + + @retval EFI_SUCCESS - IPMI Protocol is installed successfully. + @retval Otherwise - Other errors. +**/ +EFI_STATUS +EFIAPI +SmmIpmiEntry ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + MANAGEABILITY_TRANSPORT_CAPABILITY TransportCapability; + MANAGEABILITY_TRANSPORT_ADDITIONAL_STATUS TransportAdditionalStatus; + + GetTransportCapability (&TransportCapability); + + Status = HelperAcquireManageabilityTransport ( + &gManageabilityProtocolIpmiGuid, + &mTransportToken + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to acquire transport interface for IPMI protocol - %r\n", __FUNCTION__, Status)); + return Status; + } + + mTransportName = HelperManageabilitySpecName (mTransportToken->Transport->ManageabilityTransportSpecification); + DEBUG ((DEBUG_ERROR, "%a: IPMI protocol over %s.\n", __FUNCTION__, mTransportName)); + + // + // Setup hardware information according to the transport interface. + Status = SetupIpmiTransportHardwareInformation ( + mTransportToken, + &mHardwareInformation + ); + if (EFI_ERROR (Status)) { + if (Status == EFI_UNSUPPORTED) { + DEBUG ((DEBUG_ERROR, "%a: No hardware information of %s transport interface.\n", __FUNCTION__, mTransportName)); + } + + return Status; + } + + // + // Initial transport interface with the hardware information assigned. + Status = HelperInitManageabilityTransport ( + mTransportToken, + mHardwareInformation, + &TransportAdditionalStatus + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Handle = NULL; + Status = gSmst->SmmInstallProtocolInterface ( + &Handle, + &gSmmIpmiProtocolGuid, + EFI_NATIVE_INTERFACE, + (VOID **)&mIpmiProtocol + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Failed to install IPMI SMM protocol - %r\n", __FUNCTION__, Status)); + } + + return Status; +} -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100677): https://edk2.groups.io/g/devel/message/100677 Mute This Topic: https://groups.io/mt/97357757/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> Add Ipmi Protocol/Ppi/SMM modules to ManageabilityPkg. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com> Cc: Abdul Lateef Attar <abdattar@amd.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> --- Features/ManageabilityPkg/Include/Dsc/Manageability.dsc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc b/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc index XXXXXXX..XXXXXXX 100644 --- a/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc +++ b/Features/ManageabilityPkg/Include/Dsc/Manageability.dsc @@ -XXX,XX +XXX,XX @@ NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf +[Components.IA32] + ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf + +[Components.X64] + ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.inf + ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm.inf + -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100678): https://edk2.groups.io/g/devel/message/100678 Mute This Topic: https://groups.io/mt/97357758/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> Add maintainer and reviewer of ManageabilityPkg. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Abdul Lateef Attar <abdattar@amd.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nickle Wang <nicklew@nvidia.com> --- Maintainers.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Maintainers.txt b/Maintainers.txt index XXXXXXX..XXXXXXX 100644 --- a/Maintainers.txt +++ b/Maintainers.txt @@ -XXX,XX +XXX,XX @@ F: Features/Intel/UserInterface/ M: Dandan Bi <dandan.bi@intel.com> R: Liming Gao <gaoliming@byosoft.com.cn> +Features/ManageabilityPkg +F: Features/ManageabilityPkg/ +M: Abner Chang <abner.chang@amd.com> +M: Isaac Oram <isaac.w.oram@intel.com> +R: Abdul Lateef Attar <AbdulLateef.Attar@amd.com> +R: Nickle Wang <nicklew@nvidia.com> + Platform/Intel F: Platform/Intel/ M: Sai Chaganty <rangasai.v.chaganty@intel.com> @@ -XXX,XX +XXX,XX @@ R: Yuwei Chen <yuwei.chen@intel.com> Loongson platforms F: Platform/Loongson/ -M: Bibo Mao <maobibo@loongson.cn> +M: Bibo Mao <maobibo@loongson.cn> M: Xianglai li <lixianglai@loongson.cn> M: Chao Li <lichao@loongson.cn> - + Marvell platforms and silicon F: Platform/Marvell/ F: Platform/SolidRun/Armada80x0McBin/ -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#100679): https://edk2.groups.io/g/devel/message/100679 Mute This Topic: https://groups.io/mt/97357759/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-
From: Abner Chang <abner.chang@amd.com> edk2 ManageabilityPkg is introduced to provide edk2 drivers and libraries for industry platform management standards, such as PLDM (Platform Level Data Model), MCTP (Management Component Transfer Protocol), IPMI (Intelligent Platform Management Interface) and others. The framework of ManageabilityPkg is designed to flexibly support the transport interfaces for above industry standards, the transport interfaces such as KCS or I2C for IPMI, PCI VDM (Vendor Defined Message), I2C or KCS for MCTP, or the OEM proprietary transports. Please check the Readme file for the design guidance: https://github.com/changab/edk2-platforms/blob/Manageability_IPMI_upstream/Features/ManageabilityPkg/Readme.md In V4: 1. Address Leif's comments on V3. 2. Reorganize patch 4/9, separate header file to preceding patch (3/9). In V3: 1. Address reviewers commnets on V2. 2. Revise IpmiPpi driver to not using global vriable. In V2: Fix some issues on below files, 1. Features/ManageabilityPkg/Library/Common/KcsCommon.c 2. Features/ManageabilityPkg/Library/Dxe/ManageabilityTransportKcs.c 3. Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiprotocolCommon.c In V1, we had implemented, - KCS manageability transport library - Manageability library helper library - IPMI PEI/DXE/SMM protocol implementations Next upstream would be edk2 MCTP_PROTOCOL implementation that also consumes the manageability transport libraries. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Abdul Lateef Attar <abdattar@amd.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Isaac Oram <isaac.w.oram@intel.com> Cc: Nickle Wang <nicklew@nvidia.com> Abner Chang (9): ManageabilityPkg: Add Readme file ManageabilityPkg: Initial package ManageabilityPkg: Add ManageabilityTransportLib header file ManageabilityPkg: Add NULL ManageabilityTransportLib ManageabilityPkg: Add ManageabilityTransportHelperLib ManageabilityPkg/ManageabilityTransportKcsLib ManageabilityPkg: Implement Ipmi Protocol/Ppi ManageabilityPkg: Add IpmiProtocol to Manageability Package edk2-platforms: Maintainers.txt .../ManageabilityPkg/ManageabilityPkg.dec | 48 ++ .../Include/Dsc/Manageability.dsc | 25 + .../ManageabilityPkg/ManageabilityPkg.dsc | 44 + .../BaseManageabilityTransportHelper.inf | 41 + .../BaseManageabilityTransportNull.inf | 28 + .../Dxe/DxeManageabilityTransportKcs.inf | 44 + .../IpmiProtocol/Dxe/IpmiProtocolDxe.inf | 50 ++ .../Universal/IpmiProtocol/Pei/IpmiPpiPei.inf | 53 ++ .../IpmiProtocol/Smm/IpmiProtocolSmm.inf | 52 ++ .../Library/ManageabilityTransportHelperLib.h | 93 +++ .../Library/ManageabilityTransportIpmiLib.h | 24 + .../Library/ManageabilityTransportLib.h | 336 ++++++++ .../Common/ManageabilityTransportKcs.h | 105 +++ .../IpmiProtocol/Common/IpmiProtocolCommon.h | 108 +++ .../IpmiProtocol/Pei/IpmiPpiInternal.h | 25 + .../BaseManageabilityTransportHelper.c | 261 ++++++ .../BaseManageabilityTransportNull.c | 64 ++ .../Common/KcsCommon.c | 502 ++++++++++++ .../Dxe/ManageabilityTransportKcs.c | 389 +++++++++ .../IpmiProtocol/Common/IpmiProtocolCommon.c | 252 ++++++ .../Universal/IpmiProtocol/Dxe/IpmiProtocol.c | 177 +++++ .../Universal/IpmiProtocol/Pei/IpmiPpi.c | 159 ++++ .../Universal/IpmiProtocol/Smm/IpmiProtocol.c | 147 ++++ Features/ManageabilityPkg/Readme.md | 177 +++++ .../Media/ManageabilityDriverStack.svg | 752 ++++++++++++++++++ .../BaseManageabilityTransportHelper.uni | 13 + .../BaseManageabilityTransportNull.uni | 13 + .../Dxe/ManageabilityTransportKcs.uni | 13 + Maintainers.txt | 7 + 29 files changed, 4002 insertions(+) create mode 100644 Features/ManageabilityPkg/ManageabilityPkg.dec create mode 100644 Features/ManageabilityPkg/Include/Dsc/Manageability.dsc create mode 100644 Features/ManageabilityPkg/ManageabilityPkg.dsc create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.inf create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.inf create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/DxeManageabilityTransportKcs.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocolDxe.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiPei.inf create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocolSmm.inf create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportHelperLib.h create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportIpmiLib.h create mode 100644 Features/ManageabilityPkg/Include/Library/ManageabilityTransportLib.h create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/ManageabilityTransportKcs.h create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.h create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpiInternal.h create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.c create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.c create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Common/KcsCommon.c create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Common/IpmiProtocolCommon.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Dxe/IpmiProtocol.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Pei/IpmiPpi.c create mode 100644 Features/ManageabilityPkg/Universal/IpmiProtocol/Smm/IpmiProtocol.c create mode 100644 Features/ManageabilityPkg/Readme.md create mode 100644 Features/ManageabilityPkg/Documents/Media/ManageabilityDriverStack.svg create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportHelperLib/BaseManageabilityTransportHelper.uni create mode 100644 Features/ManageabilityPkg/Library/BaseManageabilityTransportNullLib/BaseManageabilityTransportNull.uni create mode 100644 Features/ManageabilityPkg/Library/ManageabilityTransportKcsLib/Dxe/ManageabilityTransportKcs.uni -- 2.37.1.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#101543): https://edk2.groups.io/g/devel/message/101543 Mute This Topic: https://groups.io/mt/97770700/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=-=-=-=-=-=-=-=-=-=-=-