€•FAŒ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”Œ8/translations/zh_CN/arch/arm/google/chromebook-boot-flow”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ8/translations/zh_TW/arch/arm/google/chromebook-boot-flow”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ8/translations/it_IT/arch/arm/google/chromebook-boot-flow”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ8/translations/ja_JP/arch/arm/google/chromebook-boot-flow”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ8/translations/ko_KR/arch/arm/google/chromebook-boot-flow”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ8/translations/sp_SP/arch/arm/google/chromebook-boot-flow”Œ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”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh£sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1h”hhhžhhŸŒR/var/lib/git/docbuild/linux/Documentation/arch/arm/google/chromebook-boot-flow.rst”h KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒChromebook Boot Flow”h]”hŒChromebook Boot Flow”…””}”(hh»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h¹hh¶hžhhŸh³h KubhŒ paragraph”“”)”}”(hXFMost recent Chromebooks that use device tree are using the opensource depthcharge_ bootloader. Depthcharge_ expects the OS to be packaged as a `FIT Image`_ which contains an OS image as well as a collection of device trees. It is up to depthcharge_ to pick the right device tree from the `FIT Image`_ and provide it to the OS.”h]”(hŒFMost recent Chromebooks that use device tree are using the opensource ”…””}”(hhĖhžhhŸNh NubhŒ reference”“”)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hhÕhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”Œrefuri”Œ]https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/depthcharge/”uh1hÓhhˌresolved”KubhŒ bootloader. ”…””}”(hhĖhžhhŸNh NubhŌ)”}”(hŒ Depthcharge_”h]”hŒ Depthcharge”…””}”(hhģhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ Depthcharge”håhęuh1hÓhhĖhēKubhŒ$ expects the OS to be packaged as a ”…””}”(hhĖhžhhŸNh NubhŌ)”}”(hŒ `FIT Image`_”h]”hŒ FIT Image”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ FIT Image”håŒ.https://doc.coreboot.org/lib/payloads/fit.html”uh1hÓhhĖhēKubhŒQ which contains an OS image as well as a collection of device trees. It is up to ”…””}”(hhĖhžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhhĖhēKubhŒ( to pick the right device tree from the ”…””}”(hhĖhžhhŸNh NubhŌ)”}”(hŒ `FIT Image`_”h]”hŒ FIT Image”…””}”(hj)hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ FIT Image”håjuh1hÓhhĖhēKubhŒ and provide it to the OS.”…””}”(hhĖhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhŹ)”}”(hŒ]The scheme that depthcharge_ uses to pick the device tree takes into account three variables:”h]”(hŒThe scheme that ”…””}”(hjChžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjKhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhjChēKubhŒA uses to pick the device tree takes into account three variables:”…””}”(hjChžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K hh¶hžhubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒKBoard name, specified at depthcharge_ compile time. This is $(BOARD) below.”h]”hŹ)”}”(hjnh]”(hŒBoard name, specified at ”…””}”(hjphžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjwhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhjphēKubhŒ& compile time. This is $(BOARD) below.”…””}”(hjphžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khjlubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjghžhhŸh³h Nubjk)”}”(hŒ‡Board revision number, determined at runtime (perhaps by reading GPIO strappings, perhaps via some other method). This is $(REV) below.”h]”hŹ)”}”(hŒ‡Board revision number, determined at runtime (perhaps by reading GPIO strappings, perhaps via some other method). This is $(REV) below.”h]”hŒ‡Board revision number, determined at runtime (perhaps by reading GPIO strappings, perhaps via some other method). This is $(REV) below.”…””}”(hj›hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khj—ubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjghžhhŸh³h Nubjk)”}”(hŒJSKU number, read from GPIO strappings at boot time. This is $(SKU) below. ”h]”hŹ)”}”(hŒISKU number, read from GPIO strappings at boot time. This is $(SKU) below.”h]”hŒISKU number, read from GPIO strappings at boot time. This is $(SKU) below.”…””}”(hj³hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h KhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjghžhhŸh³h Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jehŸh³h Khh¶hžhubhŹ)”}”(hŒOFor recent Chromebooks, depthcharge_ creates a match list that looks like this:”h]”(hŒFor recent Chromebooks, ”…””}”(hjĻhžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hj×hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhjĻhēKubhŒ+ creates a match list that looks like this:”…””}”(hjĻhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubjf)”}”(hhh]”(jk)”}”(hŒ#google,$(BOARD)-rev$(REV)-sku$(SKU)”h]”hŹ)”}”(hjöh]”hŒ#google,$(BOARD)-rev$(REV)-sku$(SKU)”…””}”(hjųhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khjōubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjńhžhhŸh³h Nubjk)”}”(hŒgoogle,$(BOARD)-rev$(REV)”h]”hŹ)”}”(hj h]”hŒgoogle,$(BOARD)-rev$(REV)”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjńhžhhŸh³h Nubjk)”}”(hŒgoogle,$(BOARD)-sku$(SKU)”h]”hŹ)”}”(hj$h]”hŒgoogle,$(BOARD)-sku$(SKU)”…””}”(hj&hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjńhžhhŸh³h Nubjk)”}”(hŒgoogle,$(BOARD) ”h]”hŹ)”}”(hŒgoogle,$(BOARD)”h]”hŒgoogle,$(BOARD)”…””}”(hj=hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjńhžhhŸh³h Nubeh}”(h]”h ]”h"]”h$]”h&]”jĶjĪuh1jehŸh³h Khh¶hžhubhŹ)”}”(hŒ‡Note that some older Chromebooks use a slightly different list that may not include SKU matching or may prioritize SKU/rev differently.”h]”hŒ‡Note that some older Chromebooks use a slightly different list that may not include SKU matching or may prioritize SKU/rev differently.”…””}”(hjWhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhŹ)”}”(hŒ‚Note that for some boards there may be extra board-specific logic to inject extra compatibles into the list, but this is uncommon.”h]”hŒ‚Note that for some boards there may be extra board-specific logic to inject extra compatibles into the list, but this is uncommon.”…””}”(hjehžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h Khh¶hžhubhŹ)”}”(hXDepthcharge_ will look through all device trees in the `FIT Image`_ trying to find one that matches the most specific compatible. It will then look through all device trees in the `FIT Image`_ trying to find the one that matches the *second most* specific compatible, etc.”h]”(hŌ)”}”(hŒ Depthcharge_”h]”hŒ Depthcharge”…””}”(hjwhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ Depthcharge”håhęuh1hÓhjshēKubhŒ+ will look through all device trees in the ”…””}”(hjshžhhŸNh NubhŌ)”}”(hŒ `FIT Image`_”h]”hŒ FIT Image”…””}”(hj‹hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ FIT Image”håjuh1hÓhjshēKubhŒq trying to find one that matches the most specific compatible. It will then look through all device trees in the ”…””}”(hjshžhhŸNh NubhŌ)”}”(hŒ `FIT Image`_”h]”hŒ FIT Image”…””}”(hjŸhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ FIT Image”håjuh1hÓhjshēKubhŒ) trying to find the one that matches the ”…””}”(hjshžhhŸNh NubhŒemphasis”“”)”}”(hŒ *second most*”h]”hŒ second most”…””}”(hjµhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j³hjsubhŒ specific compatible, etc.”…””}”(hjshžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K"hh¶hžhubhŹ)”}”(hŒēWhen searching for a device tree, depthcharge_ doesn't care where the compatible string falls within a device tree's root compatible string array. As an example, if we're on board "lazor", rev 4, SKU 0 and we have two device trees:”h]”(hŒ"When searching for a device tree, ”…””}”(hjĶhžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjÕhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhjĶhēKubhŒĆ doesn’t care where the compatible string falls within a device tree’s root compatible string array. As an example, if we’re on board ā€œlazorā€, rev 4, SKU 0 and we have two device trees:”…””}”(hjĶhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K'hh¶hžhubjf)”}”(hhh]”(jk)”}”(hŒA"google,lazor-rev5-sku0", "google,lazor-rev4-sku0", "qcom,sc7180"”h]”hŹ)”}”(hjōh]”hŒMā€œgoogle,lazor-rev5-sku0ā€, ā€œgoogle,lazor-rev4-sku0ā€, ā€œqcom,sc7180ā€”…””}”(hjöhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K,hjņubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjļhžhhŸh³h Nubjk)”}”(hŒ"google,lazor", "qcom,sc7180" ”h]”hŹ)”}”(hŒ"google,lazor", "qcom,sc7180"”h]”hŒ%ā€œgoogle,lazorā€, ā€œqcom,sc7180ā€”…””}”(hj hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K-hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jjhjļhžhhŸh³h Nubeh}”(h]”h ]”h"]”h$]”h&]”jĶjĪuh1jehŸh³h K,hh¶hžhubhŹ)”}”(hŒŅThen depthcharge_ will pick the first device tree even though "google,lazor-rev4-sku0" was the second compatible listed in that device tree. This is because it is a more specific compatible than "google,lazor".”h]”(hŒThen ”…””}”(hj'hžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hj/hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhj'hēKubhŒÉ will pick the first device tree even though ā€œgoogle,lazor-rev4-sku0ā€ was the second compatible listed in that device tree. This is because it is a more specific compatible than ā€œgoogle,lazorā€.”…””}”(hj'hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K/hh¶hžhubhŹ)”}”(hXIt should be noted that depthcharge_ does not have any smarts to try to match board or SKU revisions that are "close by". That is to say that if depthcharge_ knows it's on "rev4" of a board but there is no "rev4" device tree then depthcharge_ *won't* look for a "rev3" device tree.”h]”(hŒIt should be noted that ”…””}”(hjIhžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjQhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhjIhēKubhŒq does not have any smarts to try to match board or SKU revisions that are ā€œclose byā€. That is to say that if ”…””}”(hjIhžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjehžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhjIhēKubhŒS knows it’s on ā€œrev4ā€ of a board but there is no ā€œrev4ā€ device tree then ”…””}”(hjIhžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjyhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhjIhēKubhŒ ”…””}”(hjIhžhhŸNh Nubj“)”}”(hŒ*won't*”h]”hŒwon’t”…””}”(hjhžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j³hjIubhŒ# look for a ā€œrev3ā€ device tree.”…””}”(hjIhžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K3hh¶hžhubhŹ)”}”(hŒīIn general when any significant changes are made to a board the board revision number is increased even if none of those changes need to be reflected in the device tree. Thus it's fairly common to see device trees with multiple revisions.”h]”hŒšIn general when any significant changes are made to a board the board revision number is increased even if none of those changes need to be reflected in the device tree. Thus it’s fairly common to see device trees with multiple revisions.”…””}”(hj„hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K8hh¶hžhubhŹ)”}”(hXqIt should be noted that, taking into account the above system that depthcharge_ has, the most flexibility is achieved if the device tree supporting the newest revision(s) of a board omits the "-rev{REV}" compatible strings. When this is done then if you get a new board revision and try to run old software on it then we'll at pick the newest device tree we know about.”h]”(hŒCIt should be noted that, taking into account the above system that ”…””}”(hj³hžhhŸNh NubhŌ)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hj»hžhhŸNh Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”håhęuh1hÓhj³hēKubhX( has, the most flexibility is achieved if the device tree supporting the newest revision(s) of a board omits the ā€œ-rev{REV}ā€ compatible strings. When this is done then if you get a new board revision and try to run old software on it then we’ll at pick the newest device tree we know about.”…””}”(hj³hžhhŸNh Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÉhŸh³h K=hh¶hžhubhŒtarget”“”)”}”(hŒn.. _depthcharge: https://source.chromium.org/chromiumos/chromiumos/codesearch/+/main:src/platform/depthcharge/”h]”h}”(h]”Œ depthcharge”ah ]”h"]”Œ depthcharge”ah$]”h&]”håhęuh1jÕh KDhh¶hžhhŸh³Œ referenced”KubjÖ)”}”(hŒ?.. _`FIT Image`: https://doc.coreboot.org/lib/payloads/fit.html”h]”h}”(h]”Œ fit-image”ah ]”h"]”Œ fit image”ah$]”h&]”håjuh1jÕh KEhh¶hžhhŸh³jćKubeh}”(h]”Œchromebook-boot-flow”ah ]”h"]”Œchromebook boot flow”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”}”(Œ depthcharge”]”(hÕhģjjKjwj×jwjÕj/jQjejyj»eŒ fit image”]”(jj)j‹jŸeuŒrefids”}”Œnameids”}”(jõjņjąjŻjķjźuŒ nametypes”}”(jõ‰jąˆjķˆuh}”(jņh¶jŻj×jźjäuŒ 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.