€•ü6Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ+/translations/zh_CN/driver-api/pldmfw/index”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/zh_TW/driver-api/pldmfw/index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/it_IT/driver-api/pldmfw/index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ja_JP/driver-api/pldmfw/index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/ko_KR/driver-api/pldmfw/index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/pt_BR/driver-api/pldmfw/index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ+/translations/sp_SP/driver-api/pldmfw/index”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ%SPDX-License-Identifier: GPL-2.0-only”h]”hŒ%SPDX-License-Identifier: GPL-2.0-only”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒE/var/lib/git/docbuild/linux/Documentation/driver-api/pldmfw/index.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ"PLDM Firmware Flash Update Library”h]”hŒ"PLDM Firmware Flash Update Library”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒ paragraph”“”)”}”(hŒÀ``pldmfw`` implements functionality for updating the flash on a device using the PLDM for Firmware Update standard .”h]”(hŒliteral”“”)”}”(hŒ ``pldmfw``”h]”hŒpldmfw”…””}”(hhåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhhßubhŒj implements functionality for updating the flash on a device using the PLDM for Firmware Update standard <”…””}”(hhßh²hh³Nh´NubhŒ reference”“”)”}”(hŒJhttps://www.dmtf.org/documents/pmci/pldm-firmware-update-specification-100”h]”hŒJhttps://www.dmtf.org/documents/pmci/pldm-firmware-update-specification-100”…””}”(hhùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”hûuh1h÷hhßubhŒ>.”…””}”(hhßh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhŒcompound”“”)”}”(hhh]”hŒtoctree”“”)”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”hŒdriver-api/pldmfw/index”Œentries”]”(NŒdriver-api/pldmfw/file-format”†”NŒdriver-api/pldmfw/driver-ops”†”eŒ includefiles”]”(j%j'eŒmaxdepth”KŒcaption”NŒglob”‰Œhidden”‰Œ includehidden”‰Œnumbered”KŒ titlesonly”‰Œ rawentries”]”uh1jh³hÇh´K hjubah}”(h]”h ]”Œtoctree-wrapper”ah"]”h$]”h&]”uh1jhhÊh²hh³hÇh´NubhÉ)”}”(hhh]”(hÎ)”}”(hŒ"Overview of the ``pldmfw`` library”h]”(hŒOverview of the ”…””}”(hj>h²hh³Nh´Nubhä)”}”(hŒ ``pldmfw``”h]”hŒpldmfw”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj>ubhŒ library”…””}”(hj>h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj;h²hh³hÇh´KubhÞ)”}”(hŒ¥The ``pldmfw`` library is intended to be used by device drivers for implementing device flash update based on firmware files following the PLDM firmware file format.”h]”(hŒThe ”…””}”(hj^h²hh³Nh´Nubhä)”}”(hŒ ``pldmfw``”h]”hŒpldmfw”…””}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhj^ubhŒ— library is intended to be used by device drivers for implementing device flash update based on firmware files following the PLDM firmware file format.”…””}”(hj^h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj;h²hubhÞ)”}”(hŒxIt is implemented using an ops table that allows device drivers to provide the underlying device specific functionality.”h]”hŒxIt is implemented using an ops table that allows device drivers to provide the underlying device specific functionality.”…””}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj;h²hubhÞ)”}”(hXÛ``pldmfw`` implements logic to parse the packed binary format of the PLDM firmware file into data structures, and then uses the provided function operations to determine if the firmware file is a match for the device. If so, it sends the record and component data to the firmware using the device specific implementations provided by device drivers. Once the device firmware indicates that the update may be performed, the firmware data is sent to the device for programming.”h]”(hä)”}”(hŒ ``pldmfw``”h]”hŒpldmfw”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjŒubhXÑ implements logic to parse the packed binary format of the PLDM firmware file into data structures, and then uses the provided function operations to determine if the firmware file is a match for the device. If so, it sends the record and component data to the firmware using the device specific implementations provided by device drivers. Once the device firmware indicates that the update may be performed, the firmware data is sent to the device for programming.”…””}”(hjŒh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj;h²hubeh}”(h]”Œoverview-of-the-pldmfw-library”ah ]”h"]”Œoverview of the pldmfw library”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒParsing the PLDM file”h]”hŒParsing the PLDM file”…””}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj°h²hh³hÇh´K$ubhÞ)”}”(hX=The PLDM file format uses packed binary data, with most multi-byte fields stored in the Little Endian format. Several pieces of data are variable length, including version strings and the number of records and components. Due to this, it is not straight forward to index the record, record descriptors, or components.”h]”hX=The PLDM file format uses packed binary data, with most multi-byte fields stored in the Little Endian format. Several pieces of data are variable length, including version strings and the number of records and components. Due to this, it is not straight forward to index the record, record descriptors, or components.”…””}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K&hj°h²hubhÞ)”}”(hŒ™To avoid proliferating access to the packed binary data, the ``pldmfw`` library parses and extracts this data into simpler structures for ease of access.”h]”(hŒ=To avoid proliferating access to the packed binary data, the ”…””}”(hjÏh²hh³Nh´Nubhä)”}”(hŒ ``pldmfw``”h]”hŒpldmfw”…””}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjÏubhŒR library parses and extracts this data into simpler structures for ease of access.”…””}”(hjÏh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K,hj°h²hubhÞ)”}”(hŒüIn order to safely process the firmware file, care is taken to avoid unaligned access of multi-byte fields, and to properly convert from Little Endian to CPU host format. Additionally the records, descriptors, and components are stored in linked lists.”h]”hŒüIn order to safely process the firmware file, care is taken to avoid unaligned access of multi-byte fields, and to properly convert from Little Endian to CPU host format. Additionally the records, descriptors, and components are stored in linked lists.”…””}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K0hj°h²hubeh}”(h]”Œparsing-the-pldm-file”ah ]”h"]”Œparsing the pldm file”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K$ubhÉ)”}”(hhh]”(hÎ)”}”(hŒPerforming a flash update”h]”hŒPerforming a flash update”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K6ubhÞ)”}”(hŒMTo perform a flash update, the ``pldmfw`` module performs the following steps”h]”(hŒTo perform a flash update, the ”…””}”(hjh²hh³Nh´Nubhä)”}”(hŒ ``pldmfw``”h]”hŒpldmfw”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hãhjubhŒ$ module performs the following steps”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K8hjh²hubhŒenumerated_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒhjlubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj8h²hh³hÇh´Nubj<)”}”(hŒøFor each component that the record indicates, send the component data to the device. For each component, the firmware may respond with an indication of whether the update is suitable or not. If any component is not suitable, the update is canceled.”h]”hÞ)”}”(hŒøFor each component that the record indicates, send the component data to the device. For each component, the firmware may respond with an indication of whether the update is suitable or not. If any component is not suitable, the update is canceled.”h]”hŒøFor each component that the record indicates, send the component data to the device. For each component, the firmware may respond with an indication of whether the update is suitable or not. If any component is not suitable, the update is canceled.”…””}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´K@hj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj8h²hh³hÇh´Nubj<)”}”(hŒMFor each component, send the binary data to the device firmware for updating.”h]”hÞ)”}”(hŒMFor each component, send the binary data to the device firmware for updating.”h]”hŒMFor each component, send the binary data to the device firmware for updating.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KDhjœubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj8h²hh³hÇh´Nubj<)”}”(hŒfAfter all components are programmed, perform any final device-specific actions to finalize the update.”h]”hÞ)”}”(hŒfAfter all components are programmed, perform any final device-specific actions to finalize the update.”h]”hŒfAfter all components are programmed, perform any final device-specific actions to finalize the update.”…””}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KFhj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j;hj8h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œenumtype”Œarabic”Œprefix”hŒsuffix”Œ.”uh1j6hjh²hh³hÇh´K;ubeh}”(h]”Œperforming-a-flash-update”ah ]”h"]”Œperforming a flash update”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K6ubeh}”(h]”Œ"pldm-firmware-flash-update-library”ah ]”h"]”Œ"pldm firmware flash update library”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jäjáj­jªjjÿjÜjÙuŒ nametypes”}”(jä‰j­‰j‰j܉uh}”(jáhÊjªj;jÿj°jÙjuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.