sphinx.addnodesdocument)}( rawsourcechildren](docutils.nodessubstitution_definition)}(h&.. |AArch32| replace:: :term:`AArch32`h]h pending_xref)}(h:term:`AArch32`h]h inline)}(hhh]h TextAArch32}(hhparenthuba attributes}(ids]classes](xrefstdstd-termenames]dupnames]backrefs]utagnamehh!hubah"}(h$]h&]h+]h-]h/]refdocdesign/psci-pd-tree refdomainh)reftypeterm refexplicitrefwarn reftargetAArch32uh1hsource lineKh!h ubah"}(h$]h&]h+]AArch32ah-]h/]uh1h hAhBhCKh!hhhubh )}(h&.. |AArch64| replace:: :term:`AArch64`h]h)}(h:term:`AArch64`h]h)}(hhQh]hAArch64}(hhh!hSubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!hOubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainh]reftypeterm refexplicitrefwarnh?AArch64uh1hhAhBhCKh!hKubah"}(h$]h&]h+]AArch64ah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |AMU| replace:: :term:`AMU`h]h)}(h :term:`AMU`h]h)}(hh|h]hAMU}(hhh!h~ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!hzubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainhreftypeterm refexplicitrefwarnh?AMUuh1hhAhBhCKh!hvubah"}(h$]h&]h+]AMUah-]h/]uh1h hAhBhCKh!hhhubh )}(h&.. |AMUs| replace:: :term:`AMUs `h]h)}(h:term:`AMUs `h]h)}(hhh]hAMUs}(hhh!hubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!hubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainhreftypeterm refexplicitrefwarnh?AMUuh1hhAhBhCKh!hubah"}(h$]h&]h+]AMUsah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |API| replace:: :term:`API`h]h)}(h :term:`API`h]h)}(hhh]hAPI}(hhh!hubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!hubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainhތreftypeterm refexplicitrefwarnh?APIuh1hhAhBhCKh!hubah"}(h$]h&]h+]APIah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |BTI| replace:: :term:`BTI`h]h)}(h :term:`BTI`h]h)}(hhh]hBTI}(hhh!hubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!hubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?BTIuh1hhAhBhCKh!hubah"}(h$]h&]h+]BTIah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |CoT| replace:: :term:`CoT`h]h)}(h :term:`CoT`h]h)}(hj(h]hCoT}(hhh!j*ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j&ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj4reftypeterm refexplicitrefwarnh?CoTuh1hhAhBhCKh!j"ubah"}(h$]h&]h+]CoTah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |COT| replace:: :term:`COT`h]h)}(h :term:`COT`h]h)}(hjSh]hCOT}(hhh!jUubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jQubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj_reftypeterm refexplicitrefwarnh?COTuh1hhAhBhCKh!jMubah"}(h$]h&]h+]COTah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |CSS| replace:: :term:`CSS`h]h)}(h :term:`CSS`h]h)}(hj~h]hCSS}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j|ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?CSSuh1hhAhBhCK h!jxubah"}(h$]h&]h+]CSSah-]h/]uh1h hAhBhCK h!hhhubh )}(h.. |CVE| replace:: :term:`CVE`h]h)}(h :term:`CVE`h]h)}(hjh]hCVE}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?CVEuh1hhAhBhCK h!jubah"}(h$]h&]h+]CVEah-]h/]uh1h hAhBhCK h!hhhubh )}(h.. |DTB| replace:: :term:`DTB`h]h)}(h :term:`DTB`h]h)}(hjh]hDTB}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?DTBuh1hhAhBhCK h!jubah"}(h$]h&]h+]DTBah-]h/]uh1h hAhBhCK h!hhhubh )}(h .. |DS-5| replace:: :term:`DS-5`h]h)}(h :term:`DS-5`h]h)}(hjh]hDS-5}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?DS-5uh1hhAhBhCK h!jubah"}(h$]h&]h+]DS-5ah-]h/]uh1h hAhBhCK h!hhhubh )}(h.. |DSU| replace:: :term:`DSU`h]h)}(h :term:`DSU`h]h)}(hj*h]hDSU}(hhh!j,ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j(ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj6reftypeterm refexplicitrefwarnh?DSUuh1hhAhBhCK h!j$ubah"}(h$]h&]h+]DSUah-]h/]uh1h hAhBhCK h!hhhubh )}(h.. |DT| replace:: :term:`DT`h]h)}(h :term:`DT`h]h)}(hjUh]hDT}(hhh!jWubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jSubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjareftypeterm refexplicitrefwarnh?DTuh1hhAhBhCKh!jOubah"}(h$]h&]h+]DTah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |EL| replace:: :term:`EL`h]h)}(h :term:`EL`h]h)}(hjh]hEL}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j~ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?ELuh1hhAhBhCKh!jzubah"}(h$]h&]h+]ELah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |EHF| replace:: :term:`EHF`h]h)}(h :term:`EHF`h]h)}(hjh]hEHF}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?EHFuh1hhAhBhCKh!jubah"}(h$]h&]h+]EHFah-]h/]uh1h hAhBhCKh!hhhubh )}(h".. |FCONF| replace:: :term:`FCONF`h]h)}(h :term:`FCONF`h]h)}(hjh]hFCONF}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?FCONFuh1hhAhBhCKh!jubah"}(h$]h&]h+]FCONFah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |FDT| replace:: :term:`FDT`h]h)}(h :term:`FDT`h]h)}(hjh]hFDT}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?FDTuh1hhAhBhCKh!jubah"}(h$]h&]h+]FDTah-]h/]uh1h hAhBhCKh!hhhubh )}(h .. |FF-A| replace:: :term:`FF-A`h]h)}(h :term:`FF-A`h]h)}(hj,h]hFF-A}(hhh!j.ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j*ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj8reftypeterm refexplicitrefwarnh?FF-Auh1hhAhBhCKh!j&ubah"}(h$]h&]h+]FF-Aah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |FIP| replace:: :term:`FIP`h]h)}(h :term:`FIP`h]h)}(hjWh]hFIP}(hhh!jYubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jUubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjcreftypeterm refexplicitrefwarnh?FIPuh1hhAhBhCKh!jQubah"}(h$]h&]h+]FIPah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |FVP| replace:: :term:`FVP`h]h)}(h :term:`FVP`h]h)}(hjh]hFVP}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?FVPuh1hhAhBhCKh!j|ubah"}(h$]h&]h+]FVPah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |FWU| replace:: :term:`FWU`h]h)}(h :term:`FWU`h]h)}(hjh]hFWU}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?FWUuh1hhAhBhCKh!jubah"}(h$]h&]h+]FWUah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |GIC| replace:: :term:`GIC`h]h)}(h :term:`GIC`h]h)}(hjh]hGIC}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?GICuh1hhAhBhCKh!jubah"}(h$]h&]h+]GICah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |ISA| replace:: :term:`ISA`h]h)}(h :term:`ISA`h]h)}(hjh]hISA}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?ISAuh1hhAhBhCKh!jubah"}(h$]h&]h+]ISAah-]h/]uh1h hAhBhCKh!hhhubh )}(h$.. |Linaro| replace:: :term:`Linaro`h]h)}(h:term:`Linaro`h]h)}(hj.h]hLinaro}(hhh!j0ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j,ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj:reftypeterm refexplicitrefwarnh?Linarouh1hhAhBhCKh!j(ubah"}(h$]h&]h+]Linaroah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |MMU| replace:: :term:`MMU`h]h)}(h :term:`MMU`h]h)}(hjYh]hMMU}(hhh!j[ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jWubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjereftypeterm refexplicitrefwarnh?MMUuh1hhAhBhCKh!jSubah"}(h$]h&]h+]MMUah-]h/]uh1h hAhBhCKh!hhhubh )}(h .. |MPAM| replace:: :term:`MPAM`h]h)}(h :term:`MPAM`h]h)}(hjh]hMPAM}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?MPAMuh1hhAhBhCKh!j~ubah"}(h$]h&]h+]MPAMah-]h/]uh1h hAhBhCKh!hhhubh )}(h .. |MPMM| replace:: :term:`MPMM`h]h)}(h :term:`MPMM`h]h)}(hjh]hMPMM}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?MPMMuh1hhAhBhCKh!jubah"}(h$]h&]h+]MPMMah-]h/]uh1h hAhBhCKh!hhhubh )}(h".. |MPIDR| replace:: :term:`MPIDR`h]h)}(h :term:`MPIDR`h]h)}(hjh]hMPIDR}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?MPIDRuh1hhAhBhCKh!jubah"}(h$]h&]h+]MPIDRah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |MTE| replace:: :term:`MTE`h]h)}(h :term:`MTE`h]h)}(hjh]hMTE}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?MTEuh1hhAhBhCKh!jubah"}(h$]h&]h+]MTEah-]h/]uh1h hAhBhCKh!hhhubh )}(h.. |OEN| replace:: :term:`OEN`h]h)}(h :term:`OEN`h]h)}(hj0h]hOEN}(hhh!j2ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j.ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj<reftypeterm refexplicitrefwarnh?OENuh1hhAhBhCKh!j*ubah"}(h$]h&]h+]OENah-]h/]uh1h hAhBhCKh!hhhubh )}(h$.. |OP-TEE| replace:: :term:`OP-TEE`h]h)}(h:term:`OP-TEE`h]h)}(hj[h]hOP-TEE}(hhh!j]ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jYubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjgreftypeterm refexplicitrefwarnh?OP-TEEuh1hhAhBhCK h!jUubah"}(h$]h&]h+]OP-TEEah-]h/]uh1h hAhBhCK h!hhhubh )}(h.. |OTE| replace:: :term:`OTE`h]h)}(h :term:`OTE`h]h)}(hjh]hOTE}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?OTEuh1hhAhBhCK!h!jubah"}(h$]h&]h+]OTEah-]h/]uh1h hAhBhCK!h!hhhubh )}(h.. |PDD| replace:: :term:`PDD`h]h)}(h :term:`PDD`h]h)}(hjh]hPDD}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?PDDuh1hhAhBhCK"h!jubah"}(h$]h&]h+]PDDah-]h/]uh1h hAhBhCK"h!hhhubh )}(h".. |PAUTH| replace:: :term:`PAUTH`h]h)}(h :term:`PAUTH`h]h)}(hjh]hPAUTH}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?PAUTHuh1hhAhBhCK#h!jubah"}(h$]h&]h+]PAUTHah-]h/]uh1h hAhBhCK#h!hhhubh )}(h.. |PMF| replace:: :term:`PMF`h]h)}(h :term:`PMF`h]h)}(hjh]hPMF}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?PMFuh1hhAhBhCK$h!jubah"}(h$]h&]h+]PMFah-]h/]uh1h hAhBhCK$h!hhhubh )}(h .. |PSCI| replace:: :term:`PSCI`h]h)}(h :term:`PSCI`h]h)}(hj2h]hPSCI}(hhh!j4ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j0ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj>reftypeterm refexplicitrefwarnh?PSCIuh1hhAhBhCK%h!j,ubah"}(h$]h&]h+]PSCIah-]h/]uh1h hAhBhCK%h!hhhubh )}(h.. |RAS| replace:: :term:`RAS`h]h)}(h :term:`RAS`h]h)}(hj]h]hRAS}(hhh!j_ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j[ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjireftypeterm refexplicitrefwarnh?RASuh1hhAhBhCK&h!jWubah"}(h$]h&]h+]RASah-]h/]uh1h hAhBhCK&h!hhhubh )}(h.. |ROT| replace:: :term:`ROT`h]h)}(h :term:`ROT`h]h)}(hjh]hROT}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?ROTuh1hhAhBhCK'h!jubah"}(h$]h&]h+]ROTah-]h/]uh1h hAhBhCK'h!hhhubh )}(h .. |SCMI| replace:: :term:`SCMI`h]h)}(h :term:`SCMI`h]h)}(hjh]hSCMI}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SCMIuh1hhAhBhCK(h!jubah"}(h$]h&]h+]SCMIah-]h/]uh1h hAhBhCK(h!hhhubh )}(h.. |SCP| replace:: :term:`SCP`h]h)}(h :term:`SCP`h]h)}(hjh]hSCP}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SCPuh1hhAhBhCK)h!jubah"}(h$]h&]h+]SCPah-]h/]uh1h hAhBhCK)h!hhhubh )}(h .. |SDEI| replace:: :term:`SDEI`h]h)}(h :term:`SDEI`h]h)}(hj h]hSDEI}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SDEIuh1hhAhBhCK*h!jubah"}(h$]h&]h+]SDEIah-]h/]uh1h hAhBhCK*h!hhhubh )}(h.. |SDS| replace:: :term:`SDS`h]h)}(h :term:`SDS`h]h)}(hj4h]hSDS}(hhh!j6ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j2ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj@reftypeterm refexplicitrefwarnh?SDSuh1hhAhBhCK+h!j.ubah"}(h$]h&]h+]SDSah-]h/]uh1h hAhBhCK+h!hhhubh )}(h.. |SEA| replace:: :term:`SEA`h]h)}(h :term:`SEA`h]h)}(hj_h]hSEA}(hhh!jaubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j]ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjkreftypeterm refexplicitrefwarnh?SEAuh1hhAhBhCK,h!jYubah"}(h$]h&]h+]SEAah-]h/]uh1h hAhBhCK,h!hhhubh )}(h.. |SiP| replace:: :term:`SiP`h]h)}(h :term:`SiP`h]h)}(hjh]hSiP}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SiPuh1hhAhBhCK-h!jubah"}(h$]h&]h+]SiPah-]h/]uh1h hAhBhCK-h!hhhubh )}(h.. |SIP| replace:: :term:`SIP`h]h)}(h :term:`SIP`h]h)}(hjh]hSIP}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SIPuh1hhAhBhCK.h!jubah"}(h$]h&]h+]SIPah-]h/]uh1h hAhBhCK.h!hhhubh )}(h.. |SMC| replace:: :term:`SMC`h]h)}(h :term:`SMC`h]h)}(hjh]hSMC}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SMCuh1hhAhBhCK/h!jubah"}(h$]h&]h+]SMCah-]h/]uh1h hAhBhCK/h!hhhubh )}(h".. |SMCCC| replace:: :term:`SMCCC`h]h)}(h :term:`SMCCC`h]h)}(hj h]hSMCCC}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SMCCCuh1hhAhBhCK0h!jubah"}(h$]h&]h+]SMCCCah-]h/]uh1h hAhBhCK0h!hhhubh )}(h.. |SoC| replace:: :term:`SoC`h]h)}(h :term:`SoC`h]h)}(hj6h]hSoC}(hhh!j8ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j4ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjBreftypeterm refexplicitrefwarnh?SoCuh1hhAhBhCK1h!j0ubah"}(h$]h&]h+]SoCah-]h/]uh1h hAhBhCK1h!hhhubh )}(h.. |SP| replace:: :term:`SP`h]h)}(h :term:`SP`h]h)}(hjah]hSP}(hhh!jcubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j_ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjmreftypeterm refexplicitrefwarnh?SPuh1hhAhBhCK2h!j[ubah"}(h$]h&]h+]SPah-]h/]uh1h hAhBhCK2h!hhhubh )}(h.. |SPD| replace:: :term:`SPD`h]h)}(h :term:`SPD`h]h)}(hjh]hSPD}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SPDuh1hhAhBhCK3h!jubah"}(h$]h&]h+]SPDah-]h/]uh1h hAhBhCK3h!hhhubh )}(h.. |SPM| replace:: :term:`SPM`h]h)}(h :term:`SPM`h]h)}(hjh]hSPM}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SPMuh1hhAhBhCK4h!jubah"}(h$]h&]h+]SPMah-]h/]uh1h hAhBhCK4h!hhhubh )}(h .. |SSBS| replace:: :term:`SSBS`h]h)}(h :term:`SSBS`h]h)}(hjh]hSSBS}(hhh!jubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!jubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjreftypeterm refexplicitrefwarnh?SSBSuh1hhAhBhCK5h!jubah"}(h$]h&]h+]SSBSah-]h/]uh1h hAhBhCK5h!hhhubh )}(h.. |SVE| replace:: :term:`SVE`h]h)}(h :term:`SVE`h]h)}(hj h]hSVE}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?SVEuh1hhAhBhCK6h!j ubah"}(h$]h&]h+]SVEah-]h/]uh1h hAhBhCK6h!hhhubh )}(h.. |TBB| replace:: :term:`TBB`h]h)}(h :term:`TBB`h]h)}(hj8 h]hTBB}(hhh!j: ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j6 ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjD reftypeterm refexplicitrefwarnh?TBBuh1hhAhBhCK7h!j2 ubah"}(h$]h&]h+]TBBah-]h/]uh1h hAhBhCK7h!hhhubh )}(h .. |TBBR| replace:: :term:`TBBR`h]h)}(h :term:`TBBR`h]h)}(hjc h]hTBBR}(hhh!je ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!ja ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjo reftypeterm refexplicitrefwarnh?TBBRuh1hhAhBhCK8h!j] ubah"}(h$]h&]h+]TBBRah-]h/]uh1h hAhBhCK8h!hhhubh )}(h.. |TEE| replace:: :term:`TEE`h]h)}(h :term:`TEE`h]h)}(hj h]hTEE}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?TEEuh1hhAhBhCK9h!j ubah"}(h$]h&]h+]TEEah-]h/]uh1h hAhBhCK9h!hhhubh )}(h .. |TF-A| replace:: :term:`TF-A`h]h)}(h :term:`TF-A`h]h)}(hj h]hTF-A}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?TF-Auh1hhAhBhCK:h!j ubah"}(h$]h&]h+]TF-Aah-]h/]uh1h hAhBhCK:h!hhhubh )}(h .. |TF-M| replace:: :term:`TF-M`h]h)}(h :term:`TF-M`h]h)}(hj h]hTF-M}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?TF-Muh1hhAhBhCK;h!j ubah"}(h$]h&]h+]TF-Mah-]h/]uh1h hAhBhCK;h!hhhubh )}(h.. |TLB| replace:: :term:`TLB`h]h)}(h :term:`TLB`h]h)}(hj h]hTLB}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?TLBuh1hhAhBhCKh!j_ ubah"}(h$]h&]h+]TRNGah-]h/]uh1h hAhBhCK>h!hhhubh )}(h.. |TSP| replace:: :term:`TSP`h]h)}(h :term:`TSP`h]h)}(hj h]hTSP}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?TSPuh1hhAhBhCK?h!j ubah"}(h$]h&]h+]TSPah-]h/]uh1h hAhBhCK?h!hhhubh )}(h.. |TZC| replace:: :term:`TZC`h]h)}(h :term:`TZC`h]h)}(hj h]hTZC}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?TZCuh1hhAhBhCK@h!j ubah"}(h$]h&]h+]TZCah-]h/]uh1h hAhBhCK@h!hhhubh )}(h".. |UBSAN| replace:: :term:`UBSAN`h]h)}(h :term:`UBSAN`h]h)}(hj h]hUBSAN}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?UBSANuh1hhAhBhCKAh!j ubah"}(h$]h&]h+]UBSANah-]h/]uh1h hAhBhCKAh!hhhubh )}(h .. |UEFI| replace:: :term:`UEFI`h]h)}(h :term:`UEFI`h]h)}(hj h]hUEFI}(hhh!j ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainj reftypeterm refexplicitrefwarnh?UEFIuh1hhAhBhCKBh!j ubah"}(h$]h&]h+]UEFIah-]h/]uh1h hAhBhCKBh!hhhubh )}(h .. |WDOG| replace:: :term:`WDOG`h]h)}(h :term:`WDOG`h]h)}(hj< h]hWDOG}(hhh!j> ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!j: ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjH reftypeterm refexplicitrefwarnh?WDOGuh1hhAhBhCKCh!j6 ubah"}(h$]h&]h+]WDOGah-]h/]uh1h hAhBhCKCh!hhhubh )}(h!.. |XLAT| replace:: :term:`XLAT` h]h)}(h :term:`XLAT`h]h)}(hjg h]hXLAT}(hhh!ji ubah"}(h$]h&](h(stdstd-termeh+]h-]h/]uh1hh!je ubah"}(h$]h&]h+]h-]h/]refdoch9 refdomainjs reftypeterm refexplicitrefwarnh?XLATuh1hhAhBhCKDh!ja ubah"}(h$]h&]h+]XLATah-]h/]uh1h hAhBhCKDh!hhhubh section)}(hhh](h title)}(h PSCI Power Domain Tree Structureh]h PSCI Power Domain Tree Structure}(hj h!j hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAT/home/test/workspace/code/optee_3.16/trusted-firmware-a/docs/design/psci-pd-tree.rsthCKubj )}(hhh](j )}(h Requirementsh]h Requirements}(hj h!j hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCKubh enumerated_list)}(hhh](h list_item)}(hXA platform must export the ``plat_get_aff_count()`` and ``plat_get_aff_state()`` APIs to enable the generic PSCI code to populate a tree that describes the hierarchy of power domains in the system. This approach is inflexible because a change to the topology requires a change in the code. It would be much simpler for the platform to describe its power domain tree in a data structure. h](h paragraph)}(hX!A platform must export the ``plat_get_aff_count()`` and ``plat_get_aff_state()`` APIs to enable the generic PSCI code to populate a tree that describes the hierarchy of power domains in the system. This approach is inflexible because a change to the topology requires a change in the code.h](hA platform must export the }(hA platform must export the h!j ubh literal)}(h``plat_get_aff_count()``h]hplat_get_aff_count()}(hhh!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j ubh and }(h and h!j ubj )}(h``plat_get_aff_state()``h]hplat_get_aff_state()}(hhh!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j ubh APIs to enable the generic PSCI code to populate a tree that describes the hierarchy of power domains in the system. This approach is inflexible because a change to the topology requires a change in the code.}(h APIs to enable the generic PSCI code to populate a tree that describes the hierarchy of power domains in the system. This approach is inflexible because a change to the topology requires a change in the code.h!j ubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!j ubj )}(h`It would be much simpler for the platform to describe its power domain tree in a data structure.h]h`It would be much simpler for the platform to describe its power domain tree in a data structure.}(hj h!j ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCK h!j ubeh"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubj )}(hXThe generic PSCI code generates MPIDRs in order to populate the power domain tree. It also uses an MPIDR to find a node in the tree. The assumption that a platform will use exactly the same MPIDRs as generated by the generic PSCI code is not scalable. The use of an MPIDR also restricts the number of levels in the power domain tree to four. Therefore, there is a need to decouple allocation of MPIDRs from the mechanism used to populate the power domain topology tree. h](j )}(hXUThe generic PSCI code generates MPIDRs in order to populate the power domain tree. It also uses an MPIDR to find a node in the tree. The assumption that a platform will use exactly the same MPIDRs as generated by the generic PSCI code is not scalable. The use of an MPIDR also restricts the number of levels in the power domain tree to four.h]hXUThe generic PSCI code generates MPIDRs in order to populate the power domain tree. It also uses an MPIDR to find a node in the tree. The assumption that a platform will use exactly the same MPIDRs as generated by the generic PSCI code is not scalable. The use of an MPIDR also restricts the number of levels in the power domain tree to four.}(hj h!j ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!j ubj )}(hTherefore, there is a need to decouple allocation of MPIDRs from the mechanism used to populate the power domain topology tree.h]hTherefore, there is a need to decouple allocation of MPIDRs from the mechanism used to populate the power domain topology tree.}(hj h!j ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!j ubeh"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubj )}(hX<The current arrangement of the power domain tree requires a binary search over the sibling nodes at a particular level to find a specified power domain node. During a power management operation, the tree is traversed from a 'start' to an 'end' power level. The binary search is required to find the node at each level. The natural way to perform this traversal is to start from a leaf node and follow the parent node pointer to reach the end level. Therefore, there is a need to define data structures that implement the tree in a way which facilitates such a traversal. h](j )}(hXThe current arrangement of the power domain tree requires a binary search over the sibling nodes at a particular level to find a specified power domain node. During a power management operation, the tree is traversed from a 'start' to an 'end' power level. The binary search is required to find the node at each level. The natural way to perform this traversal is to start from a leaf node and follow the parent node pointer to reach the end level.h]hXThe current arrangement of the power domain tree requires a binary search over the sibling nodes at a particular level to find a specified power domain node. During a power management operation, the tree is traversed from a ‘start’ to an ‘end’ power level. The binary search is required to find the node at each level. The natural way to perform this traversal is to start from a leaf node and follow the parent node pointer to reach the end level.}(hj7 h!j5 ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!j1 ubj )}(hyTherefore, there is a need to define data structures that implement the tree in a way which facilitates such a traversal.h]hyTherefore, there is a need to define data structures that implement the tree in a way which facilitates such a traversal.}(hjE h!jC ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCK!h!j1 ubeh"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubj )}(hXThe attributes of a core power domain differ from the attributes of power domains at higher levels. For example, only a core power domain can be identified using an MPIDR. There is no requirement to perform state coordination while performing a power management operation on the core power domain. Therefore, there is a need to implement the tree in a way which facilitates this distinction between a leaf and non-leaf node and any associated optimizations. h](j )}(hX)The attributes of a core power domain differ from the attributes of power domains at higher levels. For example, only a core power domain can be identified using an MPIDR. There is no requirement to perform state coordination while performing a power management operation on the core power domain.h]hX)The attributes of a core power domain differ from the attributes of power domains at higher levels. For example, only a core power domain can be identified using an MPIDR. There is no requirement to perform state coordination while performing a power management operation on the core power domain.}(hj] h!j[ ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCK$h!jW ubj )}(hTherefore, there is a need to implement the tree in a way which facilitates this distinction between a leaf and non-leaf node and any associated optimizations.h]hTherefore, there is a need to implement the tree in a way which facilitates this distinction between a leaf and non-leaf node and any associated optimizations.}(hjk h!ji ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCK)h!jW ubeh"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubeh"}(h$]h&]h+]h-]h/]enumtypearabicprefixhsuffix.uh1j h!j hhhAj hCKubeh"}(h$] requirementsah&]h+] requirementsah-]h/]uh1j h!j hhhAj hCKubh transition)}(h--------------h]h"}(h$]h&]h+]h-]h/]uh1j hAj hCK-h!j hhubj )}(hhh](j )}(hDesignh]hDesign}(hj h!j hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCK0ubj )}(hhh](j )}(hDescribing a power domain treeh]hDescribing a power domain tree}(hj h!j hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCK3ubj )}(hTo fulfill requirement 1., the existing platform APIs ``plat_get_aff_count()`` and ``plat_get_aff_state()`` have been removed. A platform must define an array of unsigned chars such that:h](h6To fulfill requirement 1., the existing platform APIs }(h6To fulfill requirement 1., the existing platform APIs h!j hhhANhCNubj )}(h``plat_get_aff_count()``h]hplat_get_aff_count()}(hhh!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j ubh and }(h and h!j hhhANhCNubj )}(h``plat_get_aff_state()``h]hplat_get_aff_state()}(hhh!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j ubhP have been removed. A platform must define an array of unsigned chars such that:}(hP have been removed. A platform must define an array of unsigned chars such that:h!j hhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCK5h!j hhubj )}(hhh](j )}(hX The first entry in the array specifies the number of power domains at the highest power level implemented in the platform. This caters for platforms where the power domain tree does not have a single root node, for example, the FVP has two cluster power domains at the highest level (1). h]j )}(hXThe first entry in the array specifies the number of power domains at the highest power level implemented in the platform. This caters for platforms where the power domain tree does not have a single root node, for example, the FVP has two cluster power domains at the highest level (1).h]hXThe first entry in the array specifies the number of power domains at the highest power level implemented in the platform. This caters for platforms where the power domain tree does not have a single root node, for example, the FVP has two cluster power domains at the highest level (1).}(hj h!j ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCK9h!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubj )}(h{Each subsequent entry corresponds to a power domain and contains the number of power domains that are its direct children. h]j )}(hzEach subsequent entry corresponds to a power domain and contains the number of power domains that are its direct children.h]hzEach subsequent entry corresponds to a power domain and contains the number of power domains that are its direct children.}(hj h!j ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCK>h!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubj )}(hcThe size of the array minus the first entry will be equal to the number of non-leaf power domains. h]j )}(hbThe size of the array minus the first entry will be equal to the number of non-leaf power domains.h]hbThe size of the array minus the first entry will be equal to the number of non-leaf power domains.}(hj, h!j* ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKAh!j& ubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubj )}(hThe value in each entry in the array is used to find the number of entries to consider at the next level. The sum of the values (number of children) of all the entries at a level specifies the number of entries in the array for the next level. h]j )}(hThe value in each entry in the array is used to find the number of entries to consider at the next level. The sum of the values (number of children) of all the entries at a level specifies the number of entries in the array for the next level.h]hThe value in each entry in the array is used to find the number of entries to consider at the next level. The sum of the values (number of children) of all the entries at a level specifies the number of entries in the array for the next level.}(hjD h!jB ubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKDh!j> ubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCNubeh"}(h$]h&]h+]h-]h/]j j j hj j uh1j h!j hhhAj hCK9ubj )}(hThe following example power domain topology tree will be used to describe the above text further. The leaf and non-leaf nodes in this tree have been numbered separately.h]hThe following example power domain topology tree will be used to describe the above text further. The leaf and non-leaf nodes in this tree have been numbered separately.}(hj^ h!j\ hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKIh!j hhubh literal_block)}(hX +-+ |0| +-+ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +-+ +-+ |1| |2| +-+ +-+ / \ / \ / \ / \ / \ / \ / \ / \ +-+ +-+ +-+ +-+ |3| |4| |5| |6| +-+ +-+ +-+ +-+ +---+-----+ +----+----| +----+----+ +----+-----+-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | v v v v v v v v v v v v v +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +--+ +--+ +--+ |0| |1| |2| |3| |4| |5| |6| |7| |8| |9| |10| |11| |12| +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +--+ +--+ +--+h]hX +-+ |0| +-+ / \ / \ / \ / \ / \ / \ / \ / \ / \ / \ +-+ +-+ |1| |2| +-+ +-+ / \ / \ / \ / \ / \ / \ / \ / \ +-+ +-+ +-+ +-+ |3| |4| |5| |6| +-+ +-+ +-+ +-+ +---+-----+ +----+----| +----+----+ +----+-----+-----+ | | | | | | | | | | | | | | | | | | | | | | | | | | v v v v v v v v v v v v v +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +--+ +--+ +--+ |0| |1| |2| |3| |4| |5| |6| |7| |8| |9| |10| |11| |12| +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +-+ +--+ +--+ +--+}(hhh!jl ubah"}(h$]h&]h+]h-]h/] xml:spacepreserveuh1jj hAj hCKOh!j hhubj )}(hMThis tree is defined by the platform as the array described above as follows:h]hMThis tree is defined by the platform as the array described above as follows:}(hj~ h!j| hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKnh!j hhubjk )}(hX#define PLAT_NUM_POWER_DOMAINS 20 #define PLATFORM_CORE_COUNT 13 #define PSCI_NUM_NON_CPU_PWR_DOMAINS \ (PLAT_NUM_POWER_DOMAINS - PLATFORM_CORE_COUNT) unsigned char plat_power_domain_tree_desc[] = { 1, 2, 2, 2, 3, 3, 3, 4};h]hX#define PLAT_NUM_POWER_DOMAINS 20 #define PLATFORM_CORE_COUNT 13 #define PSCI_NUM_NON_CPU_PWR_DOMAINS \ (PLAT_NUM_POWER_DOMAINS - PLATFORM_CORE_COUNT) unsigned char plat_power_domain_tree_desc[] = { 1, 2, 2, 2, 3, 3, 3, 4};}(hhh!j ubah"}(h$]h&]h+]h-]h/]forcehighlight_args}jz j{ languagecuh1jj hAj hCKph!j hhubeh"}(h$]describing-a-power-domain-treeah&]h+]describing a power domain treeah-]h/]uh1j h!j hhhAj hCK3ubj )}(hhh](j )}(h4Removing assumptions about MPIDRs used in a platformh]h4Removing assumptions about MPIDRs used in a platform}(hj h!j hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!j hhhAj hCKzubj )}(hTo fulfill requirement 2., it is assumed that the platform assigns a unique number (core index) between ``0`` and ``PLAT_CORE_COUNT - 1`` to each core power domain. MPIDRs could be allocated in any manner and will not be used to populate the tree.h](hhTo fulfill requirement 2., it is assumed that the platform assigns a unique number (core index) between }(hhTo fulfill requirement 2., it is assumed that the platform assigns a unique number (core index) between h!j hhhANhCNubj )}(h``0``h]h0}(hhh!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j ubh and }(h and h!j hhhANhCNubj )}(h``PLAT_CORE_COUNT - 1``h]hPLAT_CORE_COUNT - 1}(hhh!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j ubhn to each core power domain. MPIDRs could be allocated in any manner and will not be used to populate the tree.}(hn to each core power domain. MPIDRs could be allocated in any manner and will not be used to populate the tree.h!j hhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCK|h!j hhubj )}(hXb``plat_core_pos_by_mpidr(mpidr)`` will return the core index for the core corresponding to the MPIDR. It will return an error (-1) if an MPIDR is passed which is not allocated or corresponds to an absent core. The semantics of this platform API have changed since it is required to validate the passed MPIDR. It has been made a mandatory API as a result.h](j )}(h!``plat_core_pos_by_mpidr(mpidr)``h]hplat_core_pos_by_mpidr(mpidr)}(hhh!j ubah"}(h$]h&]h+]h-]h/]uh1j h!j ubhXA will return the core index for the core corresponding to the MPIDR. It will return an error (-1) if an MPIDR is passed which is not allocated or corresponds to an absent core. The semantics of this platform API have changed since it is required to validate the passed MPIDR. It has been made a mandatory API as a result.}(hXA will return the core index for the core corresponding to the MPIDR. It will return an error (-1) if an MPIDR is passed which is not allocated or corresponds to an absent core. The semantics of this platform API have changed since it is required to validate the passed MPIDR. It has been made a mandatory API as a result.h!j hhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!j hhubj )}(hAnother mandatory API, ``plat_my_core_pos()`` has been added to return the core index for the calling core. This API provides a more lightweight mechanism to get the index since there is no need to validate the MPIDR of the calling core.h](hAnother mandatory API, }(hAnother mandatory API, h!jhhhANhCNubj )}(h``plat_my_core_pos()``h]hplat_my_core_pos()}(hhh!jubah"}(h$]h&]h+]h-]h/]uh1j h!jubh has been added to return the core index for the calling core. This API provides a more lightweight mechanism to get the index since there is no need to validate the MPIDR of the calling core.}(h has been added to return the core index for the calling core. This API provides a more lightweight mechanism to get the index since there is no need to validate the MPIDR of the calling core.h!jhhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!j hhubj )}(hXThe platform should assign the core indices (as illustrated in the diagram above) such that, if the core nodes are numbered from left to right, then the index for a core domain will be the same as the index returned by ``plat_core_pos_by_mpidr()`` or ``plat_my_core_pos()`` for that core. This relationship allows the core nodes to be allocated in a separate array (requirement 4.) during ``psci_setup()`` in such an order that the index of the core in the array is the same as the return value from these APIs.h](hThe platform should assign the core indices (as illustrated in the diagram above) such that, if the core nodes are numbered from left to right, then the index for a core domain will be the same as the index returned by }(hThe platform should assign the core indices (as illustrated in the diagram above) such that, if the core nodes are numbered from left to right, then the index for a core domain will be the same as the index returned by h!j*hhhANhCNubj )}(h``plat_core_pos_by_mpidr()``h]hplat_core_pos_by_mpidr()}(hhh!j3ubah"}(h$]h&]h+]h-]h/]uh1j h!j*ubh or }(h or h!j*hhhANhCNubj )}(h``plat_my_core_pos()``h]hplat_my_core_pos()}(hhh!jFubah"}(h$]h&]h+]h-]h/]uh1j h!j*ubht for that core. This relationship allows the core nodes to be allocated in a separate array (requirement 4.) during }(ht for that core. This relationship allows the core nodes to be allocated in a separate array (requirement 4.) during h!j*hhhANhCNubj )}(h``psci_setup()``h]h psci_setup()}(hhh!jYubah"}(h$]h&]h+]h-]h/]uh1j h!j*ubhj in such an order that the index of the core in the array is the same as the return value from these APIs.}(hj in such an order that the index of the core in the array is the same as the return value from these APIs.h!j*hhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!j hhubj )}(hhh](j )}(h&Dealing with holes in MPIDR allocationh]h&Dealing with holes in MPIDR allocation}(hjwh!juhhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!jrhhhAj hCKubj )}(hX For platforms where the number of allocated MPIDRs is equal to the number of core power domains, for example, Juno and FVPs, the logic to convert an MPIDR to a core index should remain unchanged. Both Juno and FVP use a simple collision proof hash function to do this.h]hX For platforms where the number of allocated MPIDRs is equal to the number of core power domains, for example, Juno and FVPs, the logic to convert an MPIDR to a core index should remain unchanged. Both Juno and FVP use a simple collision proof hash function to do this.}(hjh!jhhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jrhhubj )}(hX+It is possible that on some platforms, the allocation of MPIDRs is not contiguous or certain cores have been disabled. This essentially means that the MPIDRs have been sparsely allocated, that is, the size of the range of MPIDRs used by the platform is not equal to the number of core power domains.h]hX+It is possible that on some platforms, the allocation of MPIDRs is not contiguous or certain cores have been disabled. This essentially means that the MPIDRs have been sparsely allocated, that is, the size of the range of MPIDRs used by the platform is not equal to the number of core power domains.}(hjh!jhhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jrhhubj )}(hTThe platform could adopt one of the following approaches to deal with this scenario:h]hTThe platform could adopt one of the following approaches to deal with this scenario:}(hjh!jhhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jrhhubj )}(hhh](j )}(hX1Implement more complex logic to convert a valid MPIDR to a core index while maintaining the relationship described earlier. This means that the power domain tree descriptor will not describe any core power domains which are disabled or absent. Entries will not be allocated in the tree for these domains. h]j )}(hX0Implement more complex logic to convert a valid MPIDR to a core index while maintaining the relationship described earlier. This means that the power domain tree descriptor will not describe any core power domains which are disabled or absent. Entries will not be allocated in the tree for these domains.h]hX0Implement more complex logic to convert a valid MPIDR to a core index while maintaining the relationship described earlier. This means that the power domain tree descriptor will not describe any core power domains which are disabled or absent. Entries will not be allocated in the tree for these domains.}(hjh!jubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jubah"}(h$]h&]h+]h-]h/]uh1j h!jhhhAj hCNubj )}(hXrTreat unallocated MPIDRs and disabled cores as absent but still describe them in the power domain descriptor, that is, the number of core nodes described is equal to the size of the range of MPIDRs allocated. This approach will lead to memory wastage since entries will be allocated in the tree but will allow use of a simpler logic to convert an MPIDR to a core index. h]j )}(hXqTreat unallocated MPIDRs and disabled cores as absent but still describe them in the power domain descriptor, that is, the number of core nodes described is equal to the size of the range of MPIDRs allocated. This approach will lead to memory wastage since entries will be allocated in the tree but will allow use of a simpler logic to convert an MPIDR to a core index.h]hXqTreat unallocated MPIDRs and disabled cores as absent but still describe them in the power domain descriptor, that is, the number of core nodes described is equal to the size of the range of MPIDRs allocated. This approach will lead to memory wastage since entries will be allocated in the tree but will allow use of a simpler logic to convert an MPIDR to a core index.}(hjh!jubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jubah"}(h$]h&]h+]h-]h/]uh1j h!jhhhAj hCNubeh"}(h$]h&]h+]h-]h/]j j j hj j uh1j h!jrhhhAj hCKubeh"}(h$]&dealing-with-holes-in-mpidr-allocationah&]h+]&dealing with holes in mpidr allocationah-]h/]uh1j h!j hhhAj hCKubeh"}(h$]4removing-assumptions-about-mpidrs-used-in-a-platformah&]h+]4removing assumptions about mpidrs used in a platformah-]h/]uh1j h!j hhhAj hCKzubj )}(hhh](j )}(hMTraversing through and distinguishing between core and non-core power domainsh]hMTraversing through and distinguishing between core and non-core power domains}(hjh!jhhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!jhhhAj hCKubj )}(hTo fulfill requirement 3 and 4, separate data structures have been defined to represent leaf and non-leaf power domain nodes in the tree.h]hTo fulfill requirement 3 and 4, separate data structures have been defined to represent leaf and non-leaf power domain nodes in the tree.}(hj h!jhhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jhhubjk )}(hX/******************************************************************************* * The following two data structures implement the power domain tree. The tree * is used to track the state of all the nodes i.e. power domain instances * described by the platform. The tree consists of nodes that describe CPU power * domains i.e. leaf nodes and all other power domains which are parents of a * CPU power domain i.e. non-leaf nodes. ******************************************************************************/ typedef struct non_cpu_pwr_domain_node { /* * Index of the first CPU power domain node level 0 which has this node * as its parent. */ unsigned int cpu_start_idx; /* * Number of CPU power domains which are siblings of the domain indexed * by 'cpu_start_idx' i.e. all the domains in the range 'cpu_start_idx * -> cpu_start_idx + ncpus' have this node as their parent. */ unsigned int ncpus; /* Index of the parent power domain node */ unsigned int parent_node; ----- } non_cpu_pd_node_t; typedef struct cpu_pwr_domain_node { u_register_t mpidr; /* Index of the parent power domain node */ unsigned int parent_node; ----- } cpu_pd_node_t;h]hX/******************************************************************************* * The following two data structures implement the power domain tree. The tree * is used to track the state of all the nodes i.e. power domain instances * described by the platform. The tree consists of nodes that describe CPU power * domains i.e. leaf nodes and all other power domains which are parents of a * CPU power domain i.e. non-leaf nodes. ******************************************************************************/ typedef struct non_cpu_pwr_domain_node { /* * Index of the first CPU power domain node level 0 which has this node * as its parent. */ unsigned int cpu_start_idx; /* * Number of CPU power domains which are siblings of the domain indexed * by 'cpu_start_idx' i.e. all the domains in the range 'cpu_start_idx * -> cpu_start_idx + ncpus' have this node as their parent. */ unsigned int ncpus; /* Index of the parent power domain node */ unsigned int parent_node; ----- } non_cpu_pd_node_t; typedef struct cpu_pwr_domain_node { u_register_t mpidr; /* Index of the parent power domain node */ unsigned int parent_node; ----- } cpu_pd_node_t;}(hhh!jubah"}(h$]h&]h+]h-]h/]forcehighlight_args}jz j{ j j uh1jj hAj hCKh!jhhubj )}(hWThe power domain tree is implemented as a combination of the following data structures.h]hWThe power domain tree is implemented as a combination of the following data structures.}(hj(h!j&hhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jhhubjk )}(h|non_cpu_pd_node_t psci_non_cpu_pd_nodes[PSCI_NUM_NON_CPU_PWR_DOMAINS]; cpu_pd_node_t psci_cpu_pd_nodes[PLATFORM_CORE_COUNT];h]h|non_cpu_pd_node_t psci_non_cpu_pd_nodes[PSCI_NUM_NON_CPU_PWR_DOMAINS]; cpu_pd_node_t psci_cpu_pd_nodes[PLATFORM_CORE_COUNT];}(hhh!j4ubah"}(h$]h&]h+]h-]h/]forcehighlight_args}jz j{ j j uh1jj hAj hCKh!jhhubeh"}(h$]Mtraversing-through-and-distinguishing-between-core-and-non-core-power-domainsah&]h+]Mtraversing through and distinguishing between core and non-core power domainsah-]h/]uh1j h!j hhhAj hCKubj )}(hhh](j )}(h Populating the power domain treeh]h Populating the power domain tree}(hjRh!jPhhhANhCNubah"}(h$]h&]h+]h-]h/]uh1j h!jMhhhAj hCKubj )}(hX{The ``populate_power_domain_tree()`` function in ``psci_setup.c`` implements the algorithm to parse the power domain descriptor exported by the platform to populate the two arrays. It is essentially a breadth-first-search. The nodes for each level starting from the root are laid out one after another in the ``psci_non_cpu_pd_nodes`` and ``psci_cpu_pd_nodes`` arrays as follows:h](hThe }(hThe h!j^hhhANhCNubj )}(h ``populate_power_domain_tree()``h]hpopulate_power_domain_tree()}(hhh!jgubah"}(h$]h&]h+]h-]h/]uh1j h!j^ubh function in }(h function in h!j^hhhANhCNubj )}(h``psci_setup.c``h]h psci_setup.c}(hhh!jzubah"}(h$]h&]h+]h-]h/]uh1j h!j^ubh implements the algorithm to parse the power domain descriptor exported by the platform to populate the two arrays. It is essentially a breadth-first-search. The nodes for each level starting from the root are laid out one after another in the }(h implements the algorithm to parse the power domain descriptor exported by the platform to populate the two arrays. It is essentially a breadth-first-search. The nodes for each level starting from the root are laid out one after another in the h!j^hhhANhCNubj )}(h``psci_non_cpu_pd_nodes``h]hpsci_non_cpu_pd_nodes}(hhh!jubah"}(h$]h&]h+]h-]h/]uh1j h!j^ubh and }(h and h!j^hhhANhCNubj )}(h``psci_cpu_pd_nodes``h]hpsci_cpu_pd_nodes}(hhh!jubah"}(h$]h&]h+]h-]h/]uh1j h!j^ubh arrays as follows:}(h arrays as follows:h!j^hhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jMhhubjk )}(hmpsci_non_cpu_pd_nodes -> [[Level 3 nodes][Level 2 nodes][Level 1 nodes]] psci_cpu_pd_nodes -> [Level 0 nodes]h]hmpsci_non_cpu_pd_nodes -> [[Level 3 nodes][Level 2 nodes][Level 1 nodes]] psci_cpu_pd_nodes -> [Level 0 nodes]}(hhh!jubah"}(h$]h&]h+]h-]h/]jz j{ uh1jj hAj hCKh!jMhhubj )}(hFor the example power domain tree illustrated above, the ``psci_cpu_pd_nodes`` will be populated as follows. The value in each entry is the index of the parent node. Other fields have been ignored for simplicity.h](h9For the example power domain tree illustrated above, the }(h9For the example power domain tree illustrated above, the h!jhhhANhCNubj )}(h``psci_cpu_pd_nodes``h]hpsci_cpu_pd_nodes}(hhh!jubah"}(h$]h&]h+]h-]h/]uh1j h!jubh will be populated as follows. The value in each entry is the index of the parent node. Other fields have been ignored for simplicity.}(h will be populated as follows. The value in each entry is the index of the parent node. Other fields have been ignored for simplicity.h!jhhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCKh!jMhhubjk )}(hX +-------------+ ^ CPU0 | 3 | | +-------------+ | CPU1 | 3 | | +-------------+ | CPU2 | 3 | | +-------------+ | CPU3 | 4 | | +-------------+ | CPU4 | 4 | | +-------------+ | CPU5 | 4 | | PLATFORM_CORE_COUNT +-------------+ | CPU6 | 5 | | +-------------+ | CPU7 | 5 | | +-------------+ | CPU8 | 5 | | +-------------+ | CPU9 | 6 | | +-------------+ | CPU10 | 6 | | +-------------+ | CPU11 | 6 | | +-------------+ | CPU12 | 6 | v +-------------+h]hX +-------------+ ^ CPU0 | 3 | | +-------------+ | CPU1 | 3 | | +-------------+ | CPU2 | 3 | | +-------------+ | CPU3 | 4 | | +-------------+ | CPU4 | 4 | | +-------------+ | CPU5 | 4 | | PLATFORM_CORE_COUNT +-------------+ | CPU6 | 5 | | +-------------+ | CPU7 | 5 | | +-------------+ | CPU8 | 5 | | +-------------+ | CPU9 | 6 | | +-------------+ | CPU10 | 6 | | +-------------+ | CPU11 | 6 | | +-------------+ | CPU12 | 6 | v +-------------+}(hhh!jubah"}(h$]h&]h+]h-]h/]jz j{ uh1jj hAj hCKh!jMhhubj )}(hzThe ``psci_non_cpu_pd_nodes`` array will be populated as follows. The value in each entry is the index of the parent node.h](hThe }(hThe h!jhhhANhCNubj )}(h``psci_non_cpu_pd_nodes``h]hpsci_non_cpu_pd_nodes}(hhh!jubah"}(h$]h&]h+]h-]h/]uh1j h!jubh] array will be populated as follows. The value in each entry is the index of the parent node.}(h] array will be populated as follows. The value in each entry is the index of the parent node.h!jhhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCMh!jMhhubjk )}(hX +-------------+ ^ PD0 | -1 | | +-------------+ | PD1 | 0 | | +-------------+ | PD2 | 0 | | +-------------+ | PD3 | 1 | | PLAT_NUM_POWER_DOMAINS - +-------------+ | PLATFORM_CORE_COUNT PD4 | 1 | | +-------------+ | PD5 | 2 | | +-------------+ | PD6 | 2 | | +-------------+ vh]hX +-------------+ ^ PD0 | -1 | | +-------------+ | PD1 | 0 | | +-------------+ | PD2 | 0 | | +-------------+ | PD3 | 1 | | PLAT_NUM_POWER_DOMAINS - +-------------+ | PLATFORM_CORE_COUNT PD4 | 1 | | +-------------+ | PD5 | 2 | | +-------------+ | PD6 | 2 | | +-------------+ v}(hhh!jubah"}(h$]h&]h+]h-]h/]jz j{ uh1jj hAj hCMh!jMhhubj )}(hXbEach core can find its node in the ``psci_cpu_pd_nodes`` array using the ``plat_my_core_pos()`` function. When a core is turned on, the normal world provides an MPIDR. The ``plat_core_pos_by_mpidr()`` function is used to validate the MPIDR before using it to find the corresponding core node. The non-core power domain nodes do not need to be identified.h](h#Each core can find its node in the }(h#Each core can find its node in the h!j'hhhANhCNubj )}(h``psci_cpu_pd_nodes``h]hpsci_cpu_pd_nodes}(hhh!j0ubah"}(h$]h&]h+]h-]h/]uh1j h!j'ubh array using the }(h array using the h!j'hhhANhCNubj )}(h``plat_my_core_pos()``h]hplat_my_core_pos()}(hhh!jCubah"}(h$]h&]h+]h-]h/]uh1j h!j'ubhM function. When a core is turned on, the normal world provides an MPIDR. The }(hM function. When a core is turned on, the normal world provides an MPIDR. The h!j'hhhANhCNubj )}(h``plat_core_pos_by_mpidr()``h]hplat_core_pos_by_mpidr()}(hhh!jVubah"}(h$]h&]h+]h-]h/]uh1j h!j'ubh function is used to validate the MPIDR before using it to find the corresponding core node. The non-core power domain nodes do not need to be identified.}(h function is used to validate the MPIDR before using it to find the corresponding core node. The non-core power domain nodes do not need to be identified.h!j'hhhANhCNubeh"}(h$]h&]h+]h-]h/]uh1j hAj hCM(h!jMhhubj )}(h--------------h]h"}(h$]h&]h+]h-]h/]uh1j hAj hCM.h!jMhhubj )}(hM*Copyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.*h]h emphasis)}(hj{h]hKCopyright (c) 2017-2018, Arm Limited and Contributors. All rights reserved.}(hhh!jubah"}(h$]h&]h+]h-]h/]uh1j}h!jyubah"}(h$]h&]h+]h-]h/]uh1j hAj hCM0h!jMhhubeh"}(h$] populating-the-power-domain-treeah&]h+] populating the power domain treeah-]h/]uh1j h!j hhhAj hCKubeh"}(h$]designah&]h+]designah-]h/]uh1j h!j hhhAj hCK0ubeh"}(h$] psci-power-domain-tree-structureah&]h+] psci power domain tree structureah-]h/]uh1j h!hhhhAj hCKubeh"}(h$]h&]h+]h-]h/]sourcej uh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcej _destinationN _config_files]pep_referencesN pep_base_url https://www.python.org/dev/peps/pep_file_url_templatepep-%04drfc_referencesN rfc_base_urlhttps://tools.ietf.org/html/ tab_widthKtrim_footnote_reference_spacefile_insertion_enabled raw_enabledKsyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xformembed_stylesheetcloak_email_addressesenvNubreporterNindirect_targets]substitution_defs}(hHh hshKhhvhhhhjhjJj"jujMjjxjjjjj!jjLj$jwjOjjzjjjjj#jjNj&jyjQjj|jjjjj%jjPj(j{jSjj~jjjjj'jjRj*j}jUjjjjjjj)jjTj,jjWjjjjjjj+jjVj.jjYjjjjjjj-jjXj0jj[jjjjj jj/ j jZ j2 j j] j j j j j j j1 j j\ j4 j j_ j j j j j j j3 j j^ j6 j ja usubstitution_names}(aarch32hHaarch64hsamuhamushɌapihbtijcotjucssjcvejdtbjds-5j!dsujLdtjweljehfjfconfjfdtj#ff-ajNfipjyfvpjfwujgicjisaj%linarojPmmuj{mpamjmpmmjmpidrjmtej'oenjRop-teej}otejpddjpauthjpmfj)pscijTrasjrotjscmijscpjsdeij+sdsjVseajsipjsmcjsmcccj-socjXspjspdjspmjssbsj svej/ tbbjZ tbbrj teej tf-aj tf-mj tlbj1 tlkj\ trngj tspj tzcj ubsanj uefij3 wdogj^ xlatj urefnames}refids}nameids}(jjj j jjj j jjjjjJjGjju nametypes}(jNj NjNj NjNjNjJNjNuh$}(jj j j jj j j jj jjrjGjjjMu footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN decorationNhhub.