€•0BŒ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ŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ8/translations/pt_BR/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”…””}”(hjh²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”…””}”(hj)h²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ùj$uh1hç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 ”…””}”(hjWh²hh³Nh´Nubhè)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”hùhúuh1hçhjWhûKubhŒA uses to pick the device tree takes into account three variables:”…””}”(hjWh²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Þ)”}”(hj‚h]”(hŒBoard name, specified at ”…””}”(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Œ& compile time. This is $(BOARD) below.”…””}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hj{h²hh³hÇh´Nubj)”}”(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&]”uh1j~hj{h²hh³hÇh´Nubj)”}”(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&]”uh1j~hj{h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jyh³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²hubjz)”}”(hhh]”(j)”}”(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´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjh²hh³hÇh´Nubj)”}”(hŒgoogle,$(BOARD)-rev$(REV)”h]”hÞ)”}”(hj!h]”hŒgoogle,$(BOARD)-rev$(REV)”…””}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjh²hh³hÇh´Nubj)”}”(hŒgoogle,$(BOARD)-sku$(SKU)”h]”hÞ)”}”(hj8h]”hŒgoogle,$(BOARD)-sku$(SKU)”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´Khj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjh²hh³hÇh´Nubj)”}”(hŒgoogle,$(BOARD) ”h]”hÞ)”}”(hŒgoogle,$(BOARD)”h]”hŒgoogle,$(BOARD)”…””}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÝh³hÇh´KhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jájâuh1jyh³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.”…””}”(hjkh²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.”…””}”(hjyh²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”…””}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ Depthcharge”hùhúuh1hçhj‡hûKubhŒ+ will look through all device trees in the ”…””}”(hj‡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ùj$uh1hçhj‡hûKubhŒq trying to find one that matches the most specific compatible. It will then look through all device trees in the ”…””}”(hj‡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ùj$uh1hçhj‡hûKubhŒ) trying to find the one that matches the ”…””}”(hj‡h²hh³Nh´NubhŒemphasis”“”)”}”(hŒ *second most*”h]”hŒ second most”…””}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj‡ubhŒ specific compatible, etc.”…””}”(hj‡h²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²hubjz)”}”(hhh]”(j)”}”(hŒA"google,lazor-rev5-sku0", "google,lazor-rev4-sku0", "qcom,sc7180"”h]”hÞ)”}”(hjh]”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,hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjh²hh³hÇh´Nubj)”}”(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-hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j~hjh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jájâuh1jyh³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”…””}”(hjCh²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 ”…””}”(hj]h²hh³Nh´Nubhè)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”hùhúuh1hçhj]hû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 ”…””}”(hj]h²hh³Nh´Nubhè)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”hùhúuh1hçhj]hûKubhŒS knows it’s on “rev4†of a board but there is no “rev4†device tree then ”…””}”(hj]h²hh³Nh´Nubhè)”}”(hŒ depthcharge_”h]”hŒ depthcharge”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ depthcharge”hùhúuh1hçhj]hûKubhŒ ”…””}”(hj]h²hh³Nh´NubjÈ)”}”(hŒ*won't*”h]”hŒwon’t”…””}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÇhj]ubhŒ# look for a “rev3†device tree.”…””}”(hj]h²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ùj$uh1jé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éjj)j_j‹jëj‹jéjCjejyjjÏeŒ fit image”]”(jj=jŸj³euŒrefids”}”Œnameids”}”(j jjôjñjjþuŒ nametypes”}”(j ‰jôˆjˆuh}”(jhÊ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.