# 内核功能

Qualcomm^®^ Linux^®^ 内核提供以下与 Qualcomm 平台上的主线 Linux 内核相关的关键功能和改进：

- Qualcomm Linux BSP 专为支持使用 Qualcomm 平台的设备而量身定制。
- 设备树与 Qualcomm Linux 开发套件相对应。
- 提供多种定制编译版本配置以满足您的要求。
- Qualcomm Linux 内核集成到 Yocto 编译系统中。
- Qualcomm Linux 内核与上游 LTS 内核保持一致。增加的 Qualcomm 特定配置将单独维护。
- 支持配置、定制和编译可在使用 Qualcomm 硬件 SoC 产品的设备上刷写和启动的内核镜像。
- 使用 Gunyah™ Hypervisor 软件支持不受信虚拟机的虚拟化。
- 定期 LTS 从相应的 LTS 内核分支合并以获取最新的安全性和稳定性修复。

## UEFI 启动管理器

Qualcomm Linux 支持 systemd-boot 作为通用可扩展固件接口 (UEFI) 启动管理器来加载和启动 Linux 内核。在这种情况下，Qualcomm Linux 内核是作为 EFI 存根编译的。

### 启动流程和架构概述

冷启动是指从关机状态启动系统的过程。冷启动过程包括以下步骤：

1. 冷启动从 primary boot loader (PBL) 开始执行，以此设置初始系统，以便执行 eXtensible boot loader (XBL)。
2. XBL 执行包括 DDR 初始化在内的更广泛的系统初始化，并加载 UEFI 镜像。
3. UEFI 提供丰富的固件接口，用于将 systemd-boot 作为启动管理器加载至 Qualcomm Linux，以管理操作系统镜像。

有关完整冷启动流程的更多信息，请参阅 [Qualcomm Linux 启动指南](bundle/publicresource/topics/80-70018-4)中的[冷启动架构](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-4/bootloader-architecture.html)。

### Systemd-boot

Systemd-boot 是一种 UEFI 启动管理器，用于执行 EFI 镜像、提供启动项并支持统一内核镜像 (UKI)。Systemd-boot 支持以下组件：

- 启动条目：类型 1 boot loader 规范条目位于 ESP 上的 `loader/entries/` 目录。这些文件描述了 Qualcomm Linux 内核镜像及其相关的 initrd 镜像和其他 EFI 可执行文件。
- UKI：类型 2 boot loader 规范 EFI 统一内核镜像是位于 ESP 上的 `/EFI/Linux/` 目录中的可执行 EFI 二进制文件。

    有关启动项和统一内核镜像的更多信息，参见 [BootLoader Specification](https://uapi-group.org/specifications/specs/boot_loader_specification)。

Systemd-boot 是 元 Yocto 层的 systemd 软件包的一部分。Yocto recipe 使用 `systemd-boot_254.4.bb` 配方文件编译 systemd-boot，以及 `uki.bbclass` 配方文件来处理 ESP 镜像生成。

有关 systemd-boot 的更多信息，请参阅[使用 systemd-boot 和 UKI 配置和安全启动](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-27/qualcomm_linux_software_components.html#configure-and-secure-boot-with-systemd-boot-and-uki)。

### Qualcomm Linux 内核作为 EFI stub

EFI boot stub 允许直接启动 Qualcomm Linux 内核，而无需传统的 EFI boot loader。

当使用 `CONFIG_EFI_STUB` 内核配置选项编译 Qualcomm Linux 内核时，启动固件可以将 EFI 镜像作为可执行文件加载。在这种情况下，固件加载程序导航到 EFI 镜像 `drivers/firmware/efi/libstub/` 中的 `EFI boot stub` 位置以启动内核。

对于 Arm^®^ (Arm64)，在没有压缩内核支持的情况下，内核镜像作为可移植可执行 (PE) 文件格式或通用目标文件格式 (COFF) 镜像运行，并且 EFI 存根链接到内核中。

有关将 Linux 内核作为 EFI 镜像启动的详细信息，参见 [EFI Boot Stub](https://docs.kernel.org/admin-guide/efi-stub.html)。

### 启动镜像和 ESP 或启动分区

ESP 或启动分区作为打包 systemd-boot 和 UKI 的 `efi.bin` 镜像的存储位置。UKI 包括内核镜像、initramfs 和内核命令行参数。

UEFI 固件用于启动 UEFI boot loader 并加载内核启动镜像。ESP 分区使用 UEFI 规范支持的文件分配表 (FAT) 文件系统进行格式化。有关 UKI 镜像格式以及基础 Qualcomm Linux 元层中相应支持的更多信息，请参阅 [systemd-boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-27/platform_software_features.html#systemd-boot)。

### DTB 的选择

所有设备树 blob 均打包至 `dtb.bin` 中。UEFI 选择并加载适合 Qualcomm Linux 内核的 DTB。

要了解启动时 DTB 选择，可参见[平台设备树和内核配置](https://docs.qualcomm.com/doc/80-70020-3SC/topic/customize.html##platform-support-0)。

## 配置 DTB 支持

Qualcomm Linux 按照以下步骤来选择设备树文件、更改内核配置以及编译树外内核模块。

## 平台设备树

Qualcomm Linux 支持设备树叠加功能，以维护设备外树 blob 并将其与基线设备树 blob 合并。SoC 设备树支持存在于 `arch/arm64/boot/dts/qcom` 目录中的内核源代码中。

Qualcomm 设备树源文件列出了设备树，并进行明确区分，以包含下游增加的配置，同时支持与上游对齐的基本配置。

下游内容托管在内核源代码之外。树外驱动程序在内核之外维护增加的设备树叠加内容。在编译过程中，相应的设备树叠加文件与基本的板级 DTB 合并，生成统一的 DTB，与启动镜像配合使用。

下图显示了 QCS6490 上设备树叠加的编译过程以及自定义 BSP 的 DTB 生成：

Note

- 基本 BSP 遵循相同的编译过程，不包含 **addons** 下游设备树文件。
- 对于 DT 叠加 和 DTB 生成，所有支持的 Qualcomm 硬件 SoC 都遵循相同的编译流程。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export device-tree.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="11.8611in" height="9.41319in" viewbox="0 0 853.999 677.749" xml:space="preserve" color-interpolation-filters="sRGB" class="st29" aria-label="../_images/device-tree.svg"><v:documentproperties v:langid="1033" v:viewmarkup="false"></v:documentproperties>
<style>.svg-1 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-width: 2 }
.svg-1 .st2 { fill: none }
.svg-1 .st3 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-1 .st4 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st5 { fill: #8d8df7; stroke: #fafafa; stroke-width: 1.5 }
.svg-1 .st6 { fill: #ffffff; font-family: Microsoft YaHei UI; font-size: 0.916672em }
.svg-1 .st7 { fill: #8d8df7; stroke: #000000; stroke-opacity: 0; stroke-width: 0.749999 }
.svg-1 .st8 { fill: #ffffff; font-family: Calibri; font-size: 0.916672em }
.svg-1 .st9 { fill: #6280cc; stroke: #000000; stroke-opacity: 0; stroke-width: 0.749999 }
.svg-1 .st10 { fill: #ffffff; font-family: Calibri; font-size: 1.00001em }
.svg-1 .st11 { font-size: 1em }
.svg-1 .st12 { fill: none; stroke: #7c8aa3; stroke-width: 1.25 }
.svg-1 .st13 { fill: #7c8aa3; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st14 { fill: #007884; stroke: #000000; stroke-opacity: 0; stroke-width: 0.749999 }
.svg-1 .st15 { font-family: Roboto; font-size: 1em }
.svg-1 .st16 { fill: #d2d7e1; stroke: none; stroke-width: 1.25 }
.svg-1 .st17 { fill: #000000; font-family: Microsoft YaHei UI; font-size: 0.916672em }
.svg-1 .st18 { marker-start: url("#mrkr4-106"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st19 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.45454523168344 }
.svg-1 .st20 { marker-start: url("#mrkr4-127"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st21 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.37313411810636 }
.svg-1 .st22 { marker-end: url("#mrkr4-161"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-1 .st23 { fill: #8d8df7; stroke: #8d8df7; stroke-opacity: 0; stroke-width: 2 }
.svg-1 .st24 { fill: none; stroke: none; stroke-width: 0.25 }
.svg-1 .st25 { fill: #000000; font-family: Microsoft YaHei UI; font-size: 1.00001em }
.svg-1 .st26 { fill: #007884; stroke: none; stroke-width: 2 }
.svg-1 .st27 { fill: #6280cc; stroke: none; stroke-width: 2 }
.svg-1 .st28 { fill: #7c8aa3; stroke: none; stroke-width: 2 }
.svg-1 .st29 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-106" class="st19" v:arrowtype="4" v:arrowsize="1" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.2000010786527) "></use>	</marker>	<marker id="mrkr4-127" class="st21" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(2.6800015101137) "></use>	</marker>	<marker id="mrkr4-161" class="st21" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="-0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-2.6800015101137,-2.6800015101137) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="8.99999" v:shadowoffsety="-8.99999"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(2,-2)">		<title>Sheet.1</title>		<path d="M-0 673.75 A4.00009 4.00009 -180 0 0 4 677.75 L846 677.75 A4.00009 4.00009 -180 0 0 850 673.75 L850 8 A4.00009					 4.00009 -180 0 0 846 4 L4 4 A4.00009 4.00009 -180 0 0 0 8 L0 673.75 Z" class="st1"></path>	</g>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(2.9091,-176.78)">		<title>Sheet.2</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L848.54 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L848.54 677.75" class="st3"></path>	</g>	<g id="shape3-6" v:mid="3" v:groupcontext="shape" transform="translate(656.999,1281) rotate(180)">		<title>Sheet.3</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L505.87 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L505.87 677.75" class="st4"></path>	</g>	<g id="shape4-9" v:mid="4" v:groupcontext="shape" transform="translate(28.1875,-623.093)">		<title>Rectangle.1000</title>		<desc>Kernel</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="664.086" width="376.32" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L374.31 677.75 A2.00004 2.00004 -180 0 0 376.31 675.75 L376.31					 652.42 A2.00004 2.00004 -180 0 0 374.31 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 -0 652.42 L0 675.75 Z" class="st5"></path>		<text x="177.16" y="667.39" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>内核</text>		</g>	<g id="shape5-12" v:mid="5" v:groupcontext="shape" transform="translate(28.1875,-550.225)">		<title>Rectangle.1001</title>		<desc>sc7280.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="664.086" width="376.32" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L374.31 677.75 A2.00004 2.00004 -180 0 0 376.31 675.75 L376.31					 652.42 A2.00004 2.00004 -180 0 0 374.31 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 -0 652.42 L0 675.75 Z" class="st7"></path>		<text x="162.99" y="667.39" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>sc7280.dtsi</text>		</g>	<g id="shape6-15" v:mid="6" v:groupcontext="shape" transform="translate(28.1875,-513.791)">		<title>Rectangle.1002</title>		<desc>qcm6490.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="188.156" cy="664.086" width="376.32" height="27.3253"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L373.43 677.75 A2.88006 2.88006 -180 0 0 376.31 674.87 L376.31					 653.3 A2.88006 2.88006 -180 0 0 373.43 650.42 L2.88 650.42 A2.88006 2.88006 -180 0 0 0 653.3 L0 674.87 Z" class="st9"></path>		<text x="157.86" y="667.39" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490.dtsi</text>		</g>	<g id="shape7-18" v:mid="7" v:groupcontext="shape" transform="translate(98.9999,-463.695)">		<title>Rectangle.1004</title>		<desc>qcs6490-rb3gen2.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="62.9999" cy="664.086" width="126" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L124 677.75 A2.00004 2.00004 -180 0 0 126 675.75 L126 652.42 A2.00004					 2.00004 -180 0 0 124 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 -0 652.42 L0 675.75 Z" class="st7"></path>		<text x="15.93" y="667.39" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dts</text>		</g>	<g id="shape8-21" v:mid="8" v:groupcontext="shape" transform="translate(240,-463.695)">		<title>Rectangle.1005</title>		<desc>qcm6490-addons.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.2499" cy="664.086" width="164.5" height="27.3253"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.62 677.75 A2.88006 2.88006 -180 0 0 164.5 674.87 L164.5					 653.3 A2.88006 2.88006 -180 0 0 161.62 650.42 L2.88 650.42 A2.88006 2.88006 -180 0 0 0 653.3 L0 674.87 Z" class="st9"></path>		<text x="29.52" y="667.69" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons.dtsi</text>		</g>	<g id="shape9-24" v:mid="9" v:groupcontext="shape" transform="translate(240,-400.271)">		<title>Rectangle.1007</title>		<desc>qcm6490-addons-rb3gen2.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.2499" cy="657.876" width="164.5" height="39.7459"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.62 677.75 A2.88006 2.88006 -180 0 0 164.5 674.87 L164.5					 640.88 A2.88006 2.88006 -180 0 0 161.62 638 L2.88 638 A2.88006 2.88006 -180 0 0 -0 640.88 L0 674.87 Z" class="st9"></path>		<text x="7.4" y="661.48" class="st10" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-rb3gen2.dtsi</text>		</g>	<g id="shape10-27" v:mid="10" v:groupcontext="shape" transform="translate(240.511,-345.884)">		<title>Rectangle.1008</title>		<desc>qcs6490-addons-rb3gen2.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="16.88" y="665.75" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dts</text>		</g>	<g id="shape11-30" v:mid="11" v:groupcontext="shape" transform="translate(240.511,-307.288)">		<title>Rectangle.1009</title>		<desc>qcs6490-addons-rb3gen2-ia.mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="23.47" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-<tspan x="56.96" dy="1.2em" class="st11">ia.mezz.dts</tspan></text>		</g>	<g id="shape12-34" v:mid="12" v:groupcontext="shape" transform="translate(240.511,-268.692)">		<title>Rectangle.1010</title>		<desc>qcs6490-addons-rb3gen2-ptz-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="14.88" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-ptz-<tspan x="62.24" dy="1.2em" class="st11">mezz.dts</tspan></text>		</g>	<g id="shape13-38" v:mid="13" v:groupcontext="shape" transform="translate(240.511,-230.096)">		<title>Rectangle.1011</title>		<desc>qcs6490-addons-rb3gen2-video-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="9.51" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-video-<tspan x="62.24" dy="1.2em" class="st11">mezz.dts</tspan></text>		</g>	<g id="shape14-42" v:mid="14" v:groupcontext="shape" transform="translate(240.511,-191.5)">		<title>Rectangle.1012</title>		<desc>qcs6490-addons-rb3gen2-vision-mezz.dts</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="662.451" width="163.98" height="30.5986"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L161.1 677.75 A2.88006 2.88006 -180 0 0 163.98 674.87 L163.98					 650.03 A2.88006 2.88006 -180 0 0 161.1 647.15 L2.88 647.15 A2.88006 2.88006 -180 0 0 -0 650.03 L0 674.87					 Z" class="st9"></path>		<text x="8.83" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2-vision-<tspan x="62.24" dy="1.2em" class="st11">mezz.dts</tspan></text>		</g>	<g id="shape15-46" v:mid="15" v:groupcontext="shape" transform="translate(232,-184.199)">		<title>Rectangle.1013</title>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L178 677.75 A2.00004 2.00004 -180 0 0 180 675.75 L180 480.86 A2.00004					 2.00004 -180 0 0 178 478.86 L2 478.86 A2.00004 2.00004 -180 0 0 -0 480.86 L0 675.75 Z" class="st12"></path>	</g>	<g id="shape16-48" v:mid="16" v:groupcontext="shape" transform="translate(460.187,-624.692)">		<title>Rectangle.1014</title>		<desc>Camera</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="80.9999" cy="664.086" width="162" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L160 677.75 A2.00004 2.00004 -180 0 0 162 675.75 L162 652.42 A2.00004					 2.00004 -180 0 0 160 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 0 652.42 L0 675.75 Z" class="st7"></path>		<text x="64.5" y="667.39" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>摄像头</text>		</g>	<g id="shape17-51" v:mid="17" v:groupcontext="shape" transform="translate(458.687,-537.676)">		<title>Rectangle.1015</title>		<desc>qcm6490-camera.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.4999" cy="658.338" width="165" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L162.12 677.75 A2.88006 2.88006 -180 0 0 165 674.87 L165 641.81					 A2.88006 2.88006 -180 0 0 162.12 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 0 641.81 L0 674.87 Z" class="st9"></path>		<text x="33.88" y="661.64" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-camera.dtsi</text>		</g>	<g id="shape18-54" v:mid="18" v:groupcontext="shape" transform="translate(458.687,-466.5)">		<title>Rectangle.1017</title>		<desc>qcs6490-addons-camera-rb3gen2.dtso</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="82.4999" cy="658.338" width="165" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L162.12 677.75 A2.88006 2.88006 -180 0 0 165 674.87 L165 641.81					 A2.88006 2.88006 -180 0 0 162.12 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 -0 641.81 L0 674.87 Z" class="st9"></path>		<text x="25.93" y="655.04" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="52.73" dy="1.2em" class="st11">rb3gen2.dtso</tspan></text>		</g>	<g id="shape19-58" v:mid="19" v:groupcontext="shape" transform="translate(656.499,-624.692)">		<title>Rectangle.1019</title>		<desc>Component N</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="85.4999" cy="664.086" width="171" height="27.3253"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L169 677.75 A2.00004 2.00004 -180 0 0 171 675.75 L171 652.42 A2.00004					 2.00004 -180 0 0 169 650.42 L2 650.42 A2.00004 2.00004 -180 0 0 0 652.42 L0 675.75 Z" class="st7"></path>		<text x="68.4" y="667.39" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>组件 <tspan class="st11" v:langid="1033">N</tspan></text>		</g>	<g id="shape20-62" v:mid="20" v:groupcontext="shape" transform="translate(654.916,-537.676)">		<title>Rectangle.1020</title>		<desc>qcm6490-&#60;component&#62;.dtsi</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="87.0832" cy="658.338" width="174.17" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L171.29 677.75 A2.88006 2.88006 -180 0 0 174.17 674.87 L174.17					 641.81 A2.88006 2.88006 -180 0 0 171.29 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 -0 641.81 L0 674.87					 Z" class="st9"></path>		<text x="23.86" y="661.64" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-&#60;component&#62;.dtsi</text>		</g>	<g id="shape21-65" v:mid="21" v:groupcontext="shape" transform="translate(654.916,-466.5)">		<title>Rectangle.1021</title>		<desc>qcm6490-addons-&#60;component&#62;.dtso</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="87.0832" cy="658.338" width="174.17" height="38.8235"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L171.29 677.75 A2.88006 2.88006 -180 0 0 174.17 674.87 L174.17					 641.81 A2.88006 2.88006 -180 0 0 171.29 638.93 L2.88 638.93 A2.88006 2.88006 -180 0 0 0 641.81 L0 674.87					 Z" class="st9"></path>		<text x="4.18" y="661.64" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-&#60;component&#62;.dtso</text>		</g>	<g id="shape22-68" v:mid="22" v:groupcontext="shape" transform="translate(98.9999,-125.753)">		<title>Rectangle.1023</title>		<desc>qcs6490-rb3gen2.dtb</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="62.9999" cy="657.876" width="126" height="39.7459"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L124 677.75 A2.00004 2.00004 -180 0 0 126 675.75 L126 640 A2.00004					 2.00004 -180 0 0 124 638 L2 638 A2.00004 2.00004 -180 0 0 0 640 L0 675.75 Z" class="st13"></path>		<text x="15.19" y="661.18" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-rb3gen2.dtb</text>		</g>	<g id="shape23-71" v:mid="23" v:groupcontext="shape" transform="translate(457.344,-125.753)">		<title>Rectangle.1026</title>		<desc>qcs6490-addons-camera-rb3gen2.dtbo</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="84.6561" cy="657.876" width="169.32" height="39.7459"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L167.31 677.75 A2.00004 2.00004 -180 0 0 169.31 675.75 L169.31					 640 A2.00004 2.00004 -180 0 0 167.31 638 L2 638 A2.00004 2.00004 -180 0 0 0 640 L0 675.75 Z" class="st13"></path>		<text x="28.09" y="654.58" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-camera-<tspan x="54.15" dy="1.2em" class="st11">rb3gen2.dtbo</tspan></text>		</g>	<g id="shape24-75" v:mid="24" v:groupcontext="shape" transform="translate(656.999,-64.4016)">		<title>Rectangle.1028</title>		<desc>qcm6490-addons-&#60;component&#62;.dtbo</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="84.9999" cy="662.451" width="170" height="30.5986"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L168 677.75 A2.00004 2.00004 -180 0 0 170 675.75 L170 649.15 A2.00004					 2.00004 -180 0 0 168 647.15 L2 647.15 A2.00004 2.00004 -180 0 0 0 649.15 L0 675.75 Z" class="st13"></path>		<text x="44.52" y="659.15" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcm6490-addons-<tspan x="41.84" dy="1.2em" class="st11">&#60;component&#62;.dtbo</tspan></text>		</g>	<g id="shape25-79" v:mid="25" v:groupcontext="shape" transform="translate(656.804,1271) rotate(180)">		<title>Sheet.25</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L482.76 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L482.76 677.75" class="st4"></path>	</g>	<g id="shape26-82" v:mid="26" v:groupcontext="shape" transform="translate(352.187,-66.0376)">		<title>Rectangle.1029</title>		<desc>Build time fdt overlay</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="76.4999" cy="664.086" width="153" height="27.3253"></v:textrect>		<path d="M-0 674.87 A2.88006 2.88006 -180 0 0 2.88 677.75 L150.12 677.75 A2.88006 2.88006 -180 0 0 153 674.87 L153 653.3					 A2.88006 2.88006 -180 0 0 150.12 650.42 L2.88 650.42 A2.88006 2.88006 -180 0 0 -0 653.3 L0 674.87 Z" class="st14"></path>		<text x="33.7" y="667.43" class="st6" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>编译时间 <tspan class="st15" v:langid="1033">fdt </tspan>叠加</text>		</g>	<g id="shape27-86" v:mid="27" v:groupcontext="shape" transform="translate(27.7576,-587.906)">		<title>Sheet.27</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L799.24 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L799.24 677.75" class="st3"></path>	</g>	<g id="shape28-89" v:mid="28" v:groupcontext="shape" transform="translate(-253.562,500.97) rotate(-90)">		<title>Sheet.28</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L482.75 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L482.75 677.75" class="st3"></path>	</g>	<g id="shape29-92" v:mid="29" v:groupcontext="shape" transform="translate(-37.5625,500.97) rotate(-90)">		<title>Sheet.29</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L482.75 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L482.75 677.75" class="st3"></path>	</g>	<g id="shape30-95" v:mid="30" v:groupcontext="shape" transform="translate(460.687,-595.999)">		<title>Sheet.30</title>		<desc>(Board dependent)</desc>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="80.4999" cy="665.999" width="161" height="23.5"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L159 677.75 A2.00004 2.00004 -180 0 0 161 675.75 L161 656.25 A2.00004					 2.00004 -180 0 0 159 654.25 L2 654.25 A2.00004 2.00004 -180 0 0 -0 656.25 L0 675.75 Z" class="st16"></path>		<text x="42" y="669.3" class="st17" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>（依赖于主板）</text>		</g>	<g id="shape31-98" v:mid="31" v:groupcontext="shape" transform="translate(656.499,-595.999)">		<title>Sheet.31</title>		<desc>(Board independent)</desc>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="85.4999" cy="665.999" width="171" height="23.5"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L169 677.75 A2.00004 2.00004 -180 0 0 171 675.75 L171 656.25 A2.00004					 2.00004 -180 0 0 169 654.25 L2 654.25 A2.00004 2.00004 -180 0 0 0 656.25 L0 675.75 Z" class="st16"></path>		<text x="47" y="669.3" class="st17" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>（依赖于主板）</text>		</g>	<g id="shape32-101" v:mid="32" v:groupcontext="shape" transform="translate(-515.75,186.729) rotate(-90)">		<title>Sheet.32</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L22.77 677.75" class="st18"></path>	</g>	<g id="shape33-107" v:mid="33" v:groupcontext="shape" transform="translate(-355.25,237.733) rotate(-90)">		<title>Sheet.33</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L23.33 677.75" class="st18"></path>	</g>	<g id="shape34-112" v:mid="34" v:groupcontext="shape" transform="translate(-355.25,294.66) rotate(-90)">		<title>Sheet.34</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L17.18 677.75" class="st18"></path>	</g>	<g id="shape35-117" v:mid="35" v:groupcontext="shape" transform="translate(-515.837,512.052) rotate(-89.9832)">		<title>Sheet.35</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L298.2 677.75" class="st18"></path>	</g>	<g id="shape36-122" v:mid="36" v:groupcontext="shape" transform="translate(-135.747,514.08) rotate(-90.1547)">		<title>Sheet.36</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L301 677.75" class="st20"></path>	</g>	<g id="shape37-128" v:mid="37" v:groupcontext="shape" transform="translate(64.2499,582.749) rotate(-90)">		<title>Sheet.37</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L371.5 677.75" class="st20"></path>	</g>	<g id="shape38-133" v:mid="38" v:groupcontext="shape" transform="translate(64.2499,172.426) rotate(-90)">		<title>Sheet.38</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L32.35 677.75" class="st20"></path>	</g>	<g id="shape39-138" v:mid="39" v:groupcontext="shape" transform="translate(-136.562,172.426) rotate(-90)">		<title>Sheet.39</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L32.35 677.75" class="st20"></path>	</g>	<g id="shape40-143" v:mid="40" v:groupcontext="shape" transform="translate(828.872,553.97) rotate(90.1406)">		<title>Sheet.40</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L50.94 677.75" class="st20"></path>	</g>	<g id="shape41-148" v:mid="41" v:groupcontext="shape" transform="translate(850.624,552.014) rotate(90)">		<title>Sheet.41</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L7.68 677.75 L8.04 677.75 L41.29 677.75" class="st20"></path>	</g>	<g id="shape42-153" v:mid="42" v:groupcontext="shape" transform="translate(879.749,214.054) rotate(90)">		<title>Sheet.42</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L173.06 677.75 L0 677.75 Z" class="st2"></path>		<path d="M0 677.75 L173.06 677.75" class="st4"></path>	</g>	<g id="shape43-156" v:mid="43" v:groupcontext="shape" v:layermember="0" transform="translate(202,-283.64)">		<title>Dynamic connector.1061</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 670.75 L0 677.75 L21.96 677.75 L30 677.75" class="st22"></path>	</g>	<g id="shape44-162" v:mid="44" v:groupcontext="shape" transform="translate(240.523,-125.753)">		<title>Rectangle.1062</title>		<desc>qcs6490-addons-rb3gen2.dtb</desc>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="81.9885" cy="657.876" width="163.98" height="39.7459"></v:textrect>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L161.98 677.75 A2.00004 2.00004 -180 0 0 163.98 675.75 L163.98					 640 A2.00004 2.00004 -180 0 0 161.98 638 L2 638 A2.00004 2.00004 -180 0 0 0 640 L0 675.75 Z" class="st13"></path>		<text x="16.14" y="661.18" class="st8" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>qcs6490-addons-rb3gen2.dtb</text>		</g>	<g id="shape45-165" v:mid="45" v:groupcontext="shape" transform="translate(-354.985,530.777) rotate(-91.5664)">		<title>Sheet.45</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L18.71 677.75" class="st18"></path>	</g>	<g id="shape46-170" v:mid="46" v:groupcontext="shape" transform="translate(493.2,-18.5002)">		<title>Sheet.46</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st23"></path>	</g>	<g id="shape47-172" v:mid="47" v:groupcontext="shape" transform="translate(-135.751,590.741) rotate(-89.9985)">		<title>Sheet.47</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 677.75 L6.24 677.75 L6.6 677.75 L38.76 677.75" class="st18"></path>	</g>	<g id="shape48-177" v:mid="48" v:groupcontext="shape" transform="translate(1000.26,551.997) rotate(90)">		<title>Sheet.48</title>		<path d="M0 677.75 L31.21 677.75 L39.25 677.75" class="st22"></path>	</g>	<g id="shape49-182" v:mid="49" v:groupcontext="shape" transform="translate(510.7,-20.1441)">		<title>Sheet.49</title>		<desc>Upstream</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="22.5502" cy="670.849" width="45.11" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="45.1004" height="13.8" class="st24"></rect>		<text x="4" y="674.45" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>上游</text>		</g>	<g id="shape50-185" v:mid="50" v:groupcontext="shape" transform="translate(576.334,-18.5002)">		<title>Sheet.50</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st26"></path>	</g>	<g id="shape51-187" v:mid="51" v:groupcontext="shape" transform="translate(594,-20.1441)">		<title>Sheet.51</title>		<desc>Open source</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="17.1503" cy="670.849" width="34.31" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="34.3005" height="13.8" class="st24"></rect>		<text x="4" y="674.45" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>下游</text>		</g>	<g id="shape52-190" v:mid="52" v:groupcontext="shape" transform="translate(659.468,-18.5002)">		<title>Sheet.52</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st27"></path>	</g>	<g id="shape53-192" v:mid="53" v:groupcontext="shape" transform="translate(678.176,-20.1441)">		<title>Sheet.53</title>		<desc>Downstream</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="31.0243" cy="670.849" width="62.05" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="62.0486" height="13.8" class="st24"></rect>		<text x="4" y="674.45" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>开源代码</text>		</g>	<g id="shape54-195" v:mid="54" v:groupcontext="shape" transform="translate(742.601,-18.5002)">		<title>Sheet.54</title>		<v:userdefs>			<v:ud v:nameu="visAltText" v:val="VT4(Device tree overlay)"></v:ud>			<v:ud v:nameu="visAltDescription" v:val="VT4(This image shows the  device tree overlay feature to support out-of-device tree blobs and baseline device tree blobs.)"></v:ud>		</v:userdefs>		<path d="M0 675.75 A2.00004 2.00004 -180 0 0 2 677.75 L15.8 677.75 A2.00004 2.00004 -180 0 0 17.8 675.75 L17.8 662.66					 A2.00004 2.00004 -180 0 0 15.8 660.66 L2 660.66 A2.00004 2.00004 -180 0 0 0 662.66 L0 675.75 Z" class="st28"></path>	</g>	<g id="shape55-197" v:mid="55" v:groupcontext="shape" transform="translate(760.101,-20.1441)">		<title>Sheet.55</title>		<desc>Build blobs</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="32.1493" cy="670.849" width="64.3" height="13.8"></v:textrect>		<rect x="0" y="663.949" width="64.2987" height="13.8" class="st24"></rect>		<text x="4" y="674.49" class="st25" v:langid="2052"><v:paragraph></v:paragraph><v:tablist></v:tablist>编译 <tspan class="st15" v:langid="1033">blob</tspan></text>		</g></g>
</svg>

**图：QCS6490 上的设备树叠加**

构建系统使用 `fdt_overlay` 工具用于在构建期间配置树外设备树叠加处理。

DTBO 合并流程支持合并 `meta-qcom-hwe/conf/machine/<SoC>-<board>-<variant>.conf` 文件中列出的 DTBO 文件。

以下是如何在 QCS6490 上枚举设备树变量的示例。有关平台特定的信息，可参见电路板特定的机器配置文件。

# List of dtbs for corresponding supported qcs6490 platforms
    KERNEL_DEVICETREE = " \
                         qcom/<SoC>-addons-<Variant>.dtb \
                         "
    # Additional list of dtbos to be overlaid on top of base kernel devicetree files
    # Format - KERNEL_TECH_DTBOS[<base-dtb-name>] = "<dtbo1 <dtbo2> ..."
    # For example:
    
    KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
    qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
    qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
    qcm6490-video.dtbo qcm6490-wlan-upstream.dtbo \
    "
    Copy to clipboard

按照以下步骤更新内核中支持的 DTB，并在启动时选择 DTB：

**内核中的 DTB 编译支持**

要将新平台的设备树集成到内核编译中，可更新 `Makefile`。

以下示例展示了为 QCS6490 SoC 定制 DTB 的方法。复制以下方法以添加新的 DTB。

diff --git a/arch/arm64/boot/dts/qcom/Makefile b/arch/arm64/boot/dts/qcom/Makefile
    index 183aeba47193..a7815c774f7c 100644
    --- a/arch/arm64/boot/dts/qcom/Makefile
    +++ b/arch/arm64/boot/dts/qcom/Makefile
    dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-addons-rb3gen2.dtb
    +dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-my-board.dtb
    dtb-$(CONFIG_ARCH_QCOM)        += qcs6490-rb3gen2.dtb
    dtb-$(CONFIG_ARCH_QCOM)        += qcs404-evb-1000.dtb
    Copy to clipboard

**在机器配置中包含 DTB**

Yocto 机器配置也进行了更新，包括相应的设备树 blob。例如，要添加支持 QCS6490 机器的设备树，请使用以下文件：

`meta-qcom-hwe/conf/machine/qcs6490-rb3gen2-core-kit.conf`：

OUT_OF_KERNEL_DTSO - qcs6490-rb3gen2-core-kit.conf
    # List of dtbs for corresponding supported qcs6490 platforms
    KERNEL_DEVICETREE = " \
                         qcom/qcs6490-my-board.dtb   \
                         qcom/qcs6490-addons-rb3gen2.dtb \
                         qcom/qcs6490-my-board.dtb   \
                         "

    # Additional list of DTBOs to be overylaid on top of base kernel devicetree
    # See how existing boards are managing it in the following example:
    # Format - KERNEL_TECH_DTBOS[<base-dtb-name>] = "<dtbo1 <dtbo2> ..."
    
    KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = " \
    qcm6490-graphics.dtbo qcm6490-wlan-rb3.dtbo \
    qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
    qcm6490-video.dtbo qcm6490-wlan-upstream.dtbo \
    Copy to clipboard

Note

请参见 `meta-qcom-hwe/conf/machine/*.conf` 目录中有关不同 SoC 的机器配置文件。定制 BSP 版本的 DTB 文件名包含 `addons`。

**启动时选择 DTB**

定制 DTB 将作为 UKI 镜像的一部分打包，该镜像可在 EFI 中更新，从而通过所选 DTB 启动。

使用 ukify 工具生成 UKI 镜像。ukify 工具是 `tmp-glibc/sysroots-components/x86_64/systemd-boot-native/usr/bin/ukify` 编译目录中 Yocto 编译的一部分。

要生成 UKI 镜像，请运行以下命令：

# Note - ukify tool need python 3.10 version or above
    
       ukify build --efi-arch=aa64  \
                --stub=<build-path>/tmp-glibc/deploy/images/<SoC>/linuxaa64.efi.stub \
                --linux=<build-path>/tmp-glibc/deploy/images/<SoC>/Image \
                --initrd=<build-path>/tmp-glibc/deploy/images/<SoC>/initramfs-qcom-image-<SoC>.cpio.gz \
                --cmdline="console=ttyMSM0,115200n8 earlycon qcom_geni_serial.con_enabled=1 kernel.sched_pelt_multiplier=4 mem_sleep_default=s2idle" \
                --devicetree=<build-path>/tmp-glibc/deploy/images/<SoC>/<SoC>-my-board.dtb \
                --output=./uki.efi
    Copy to clipboard

ukify 编译命令生成带有自定义板卡 DTB `uki.efi` 的镜像。

要更新 ESP 分区中的 `uki.efi` 镜像，请执行以下操作：

# Following may need sudo privilege
    
    # Take the yocto build generated efi.bin and mount it locally
      mount <build-path>/tmp-glibc/deploy/images/<SoC>/efi.bin  /mnt --options rw
    
    # Overwrite the uki.efi with one packaged above
      cp uki.efi /mnt/EFI/Linux/uki.efi
      umount /mnt
    
    # now efi.bin carries packaged uki.efi which can be flashed to the target and booted
    # UEFI shall now pick the <SoC>-my-board.dtb that is part of uki.efi image
    
    # reboot into fastboot and flash efi.bin
      fastboot flash efi <build-path>/tmp-glibc/deploy/images/<SoC>/efi.bin
    Copy to clipboard

有关设备树规范的更多信息，请参见 [The Devicetree Specification](https://www.devicetree.org/specifications/)。

有关设备树的 Linux 内核文档，请参见 [Linux and the Devicetree](https://docs.kernel.org/devicetree/usage-model.html)。

**DTBO 合并序列**

`image-qcom-deploy.bbclass` 分类中的 `merge_dtbos()` 任务使用 `fdt_overlay` 工具合并 DTBO。

`merge_dtbos()` 任务迭代按以下顺序进行：

1. 在配置文件中列出 DTBO 文件名。
2. DTBO 文件名通过 `KERNEL_DEVICETREE` 变量进行迭代。
3. 对于每个基础 DTB，DTBO 合并任务叠加 `KERNEL_TECH_DTBOS` 变量中列出的 DTBO。
4. 叠加过程完成后，将生成最终的 DTB 输出。

## Remoteproc 子系统

Remoteproc 框架用于将固件加载到 Qualcomm 平台上的其他子系统中，例如音频数字信号处理器 (aDSP) 和计算数字信号处理器 (cDSP)。

Remoteproc 框架分为两部分：

- 核心框架：核心框架包含了共同的逻辑。核心框架用于加载固件并启动或停止远程处理器。
- Remoteproc 驱动程序：驱动程序包含管理相应核心的平台特定操作。Remoteproc 驱动程序向核心框架注册一个 remoteproc 实例和一组操作。

在非对称多处理 (ASMP) 配置中，SoC 上存在多个异构远程处理器。远程处理器运行不同的固件（或操作系统）实例。

如需详细了解 Qualcomm Linux 用于管理其他核心的标准框架，参见 [Remote Processor Framework](https://www.kernel.org/doc/html/next/staging/remoteproc.html)。

## Qualcomm 对 remoteproc 的支持

Qualcomm 已增强 remoteproc 框架，以便使用上游 PAS 驱动程序进行外设固件鉴权。

Qualcomm Linux 中的 remoteproc 驱动程序实现了外设鉴权服务 (PAS) 驱动程序，该驱动程序是一种基于 TrustZone 的外设镜像加载程序，用于 Qualcomm SoC 设备上的远程处理器。

有关详细信息，请参阅  [qcom_q6v5_pas.c](https://github.com/torvalds/linux/blob/master/drivers/remoteproc/qcom_q6v5_pas.c)。

远程处理器用于管理各种协处理器的生命周期，如 aDSP、cDSP、modem 外设子系统 (MPSS) 和无线处理器子系统 (WPSS) 等。基于 QCS6490 的电路板和 Dragonwing™ RB3 Gen 2 开发套件上支持的协处理器包括 aDSP、cDSP 和 WPSS。

Note

支持的远程处理器子系统列表取决于正在使用的 SoC。

**用户界面：** remoteproc 框架可跟踪注册的 remoteproc 设备并提供用于启动和关闭设备的用户接口。用户空间可以使用以下 `sysfs` 接口查询和更改 remoteproc 的当前状态界面：

remoteproc user space interface
    # start remoteproc:
      echo "start" > /sys/class/remoteproc/remoteprocN/state
    
    # stop remoteproc:
      echo "stop" > /sys/class/remoteproc/remoteprocN/state
    Copy to clipboard

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export remoteproc-framework.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="9.03414in" height="6.6177in" viewbox="0 0 650.458 476.474" xml:space="preserve" color-interpolation-filters="sRGB" class="st19" aria-label="../_images/remoteproc-framework.svg"><v:documentproperties v:langid="1033" v:viewmarkup="false"></v:documentproperties>
<style>.svg-2 .st1 { fill: #fafafa; stroke: #d2d7e1; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-2 .st2 { fill: none; stroke: #6280cc; stroke-dasharray: 10.5, 7.5; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st3 { fill: #007884; stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-opacity: 0; stroke-width: 2 }
.svg-2 .st4 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-2 .st5 { fill: #ffffff; font-family: Microsoft YaHei UI; font-size: 1.16666em }
.svg-2 .st6 { fill: #ffffff; font-family: Calibri; font-size: 1.16666em }
.svg-2 .st7 { fill: none }
.svg-2 .st8 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st9 { fill: #000000; font-family: Microsoft YaHei UI; font-size: 1.16666em }
.svg-2 .st10 { font-size: 1em }
.svg-2 .st11 { font-family: Microsoft YaHei UI; font-size: 1em }
.svg-2 .st12 { fill: none; stroke: #6280cc; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.5 }
.svg-2 .st13 { marker-end: url("#mrkr4-80"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-2 .st14 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.52631587886755 }
.svg-2 .st15 { marker-end: url("#mrkr4-80"); marker-start: url("#mrkr4-105"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 2 }
.svg-2 .st16 { fill: #000000; font-family: Calibri; font-size: 1.16666em }
.svg-2 .st17 { fill: #007884; stroke: #000000; stroke-opacity: 0; stroke-width: 2 }
.svg-2 .st18 { fill: none; stroke: none; stroke-width: 0.25 }
.svg-2 .st19 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-80" class="st14" v:arrowtype="4" v:arrowsize="1" v:setback="3.8" refx="-3.7999993545764" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-1.8999996772882,-1.8999996772882) "></use>	</marker>	<marker id="mrkr4-105" class="st14" v:arrowtype="4" v:arrowsize="1" v:setback="0" refx="0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(1.8999996772882) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="0.0138889" v:pagescale="0.0138889" v:drawingunits="29" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Flowchart" v:index="0"></v:layer>	<v:layer v:name="Irrigation System" v:index="1"></v:layer>	<v:layer v:name="Flow Segment" v:index="2"></v:layer>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(1,-1)">		<title>Sheet.1</title>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L644 476.47 A4.00009 4.00009 -180 0 0 648 472.47 L648 6 A4.00009					 4.00009 -180 0 0 644 2 L4 2 A4.00009 4.00009 -180 0 0 -0 6 L0 472.47 Z" class="st1"></path>	</g>	<g id="shape3-3" v:mid="3" v:groupcontext="shape" v:layermember="0" transform="translate(160.304,-70.1074)">		<title>Process.1001</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 476.47 L463.7 476.47 L463.7 281.1 L0 281.1 L0 476.47 Z" class="st2"></path>	</g>	<g id="shape4-5" v:mid="4" v:groupcontext="shape" v:layermember="0" transform="translate(56.4571,-403.884)">		<title>Process</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L143.23 476.47 A4.00009 4.00009 -180 0 0 147.23 472.47 L147.23					 433.88 A4.00009 4.00009 -180 0 0 143.23 429.88 L4 429.88 A4.00009 4.00009 -180 0 0 0 433.88 L0 472.47 Z" class="st3"></path>	</g>	<g id="shape5-7" v:mid="5" v:groupcontext="shape" v:layermember="0" transform="translate(306.742,-403.884)">		<title>Process.5</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L143.23 476.47 A4.00009 4.00009 -180 0 0 147.23 472.47 L147.23					 433.88 A4.00009 4.00009 -180 0 0 143.23 429.88 L4 429.88 A4.00009 4.00009 -180 0 0 0 433.88 L0 472.47 Z" class="st3"></path>	</g>	<g id="shape6-9" v:mid="6" v:groupcontext="shape" transform="translate(76.0868,-419.829)">		<title>Sheet.6</title>		<desc>User space clients</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="53.9825" cy="469.675" width="107.98" height="13.5991"></v:textrect>		<rect x="0" y="462.875" width="107.966" height="13.5991" class="st4"></rect>		<text x="4.98" y="473.88" class="st5" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>用户空间客户端</text>		</g>	<g id="shape7-12" v:mid="7" v:groupcontext="shape" transform="translate(316.557,-417.342)">		<title>Sheet.7</title>		<desc>Peripheral manager</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="63.7976" cy="467.408" width="127.61" height="18.1322"></v:textrect>		<rect x="0" y="458.342" width="127.596" height="18.1322" class="st4"></rect>		<text x="28.8" y="471.61" class="st5" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>外设管理器</text>		</g>	<g id="shape8-15" v:mid="8" v:groupcontext="shape" v:layermember="0" transform="translate(19.4966,-321.585)">		<title>Process.11</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L236.83 476.47 A4.00009 4.00009 -180 0 0 240.83 472.47 L240.83					 439.26 A4.00009 4.00009 -180 0 0 236.83 435.26 L4 435.26 A4.00009 4.00009 -180 0 0 -0 439.26 L0 472.47 Z" class="st3"></path>	</g>	<g id="shape9-17" v:mid="9" v:groupcontext="shape" transform="translate(27.0387,-330.237)">		<title>Sheet.9</title>		<desc>/sys/class/remoteproc/remoteproc*</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="112.873" cy="465.141" width="225.76" height="22.6674"></v:textrect>		<rect x="0" y="453.807" width="225.747" height="22.6674" class="st4"></rect>		<text x="8.93" y="469.34" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/sys/class/remoteproc/remoteproc*</text>		</g>	<g id="shape10-20" v:mid="10" v:groupcontext="shape" v:layermember="1;2" transform="translate(2.4814,-342.194)">		<title>Lateral line</title>		<v:custprops>			<v:cp v:nameu="ShapeClass" v:lbl="Shape class" v:invis="true" v:langid="1033" v:val="VT4(Building Component)"></v:cp>			<v:cp v:nameu="ShapeType" v:lbl="Shape type" v:invis="true" v:langid="1033" v:val="VT4(Flow Segment)"></v:cp>			<v:cp v:nameu="SubShapeType" v:lbl="Subshape type" v:invis="true" v:langid="1033" v:val="VT4(Pipe Segment)"></v:cp>			<v:cp v:nameu="BaseElevation" v:lbl="Base elevation" v:type="2" v:langid="1033"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="SolSH" v:val="VT4({5D50005D-537C-4738-9C46-130C74335A6D})"></v:ud>			<v:ud v:nameu="ShapeClass" v:prompt="Building Component" v:val="VT0(3):26"></v:ud>			<v:ud v:nameu="ShapeType" v:prompt="Flow Segment" v:val="VT0(19):26"></v:ud>			<v:ud v:nameu="SubShapeType" v:prompt="Pipe Segment" v:val="VT0(56):26"></v:ud>		</v:userdefs>		<path d="M0 476.47 L17.02 476.47 L0 476.47 Z" class="st7"></path>		<path d="M0 476.47 L17.02 476.47" class="st8"></path>	</g>	<g id="shape11-23" v:mid="11" v:groupcontext="shape" v:layermember="1;2" transform="translate(261.563,-342.192) rotate(0.148518)">		<title>Lateral line.27</title>		<v:custprops>			<v:cp v:nameu="ShapeClass" v:lbl="Shape class" v:invis="true" v:langid="1033" v:val="VT4(Building Component)"></v:cp>			<v:cp v:nameu="ShapeType" v:lbl="Shape type" v:invis="true" v:langid="1033" v:val="VT4(Flow Segment)"></v:cp>			<v:cp v:nameu="SubShapeType" v:lbl="Subshape type" v:invis="true" v:langid="1033" v:val="VT4(Pipe Segment)"></v:cp>			<v:cp v:nameu="BaseElevation" v:lbl="Base elevation" v:type="2" v:langid="1033"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="SolSH" v:val="VT4({5D50005D-537C-4738-9C46-130C74335A6D})"></v:ud>			<v:ud v:nameu="ShapeClass" v:prompt="Building Component" v:val="VT0(3):26"></v:ud>			<v:ud v:nameu="ShapeType" v:prompt="Flow Segment" v:val="VT0(19):26"></v:ud>			<v:ud v:nameu="SubShapeType" v:prompt="Pipe Segment" v:val="VT0(56):26"></v:ud>		</v:userdefs>		<path d="M0 476.47 L46.41 476.47 L0 476.47 Z" class="st7"></path>		<path d="M0 476.47 L46.41 476.47" class="st8"></path>	</g>	<g id="shape12-26" v:mid="12" v:groupcontext="shape" v:layermember="0" transform="translate(306.742,-321.465)">		<title>Process.28</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L143.23 476.47 A4.00009 4.00009 -180 0 0 147.23 472.47 L147.23					 439.26 A4.00009 4.00009 -180 0 0 143.23 435.26 L4 435.26 A4.00009 4.00009 -180 0 0 0 439.26 L0 472.47 Z" class="st3"></path>	</g>	<g id="shape13-28" v:mid="13" v:groupcontext="shape" v:layermember="1;2" transform="translate(455.968,-342.074)">		<title>Lateral line.29</title>		<v:custprops>			<v:cp v:nameu="ShapeClass" v:lbl="Shape class" v:invis="true" v:langid="1033" v:val="VT4(Building Component)"></v:cp>			<v:cp v:nameu="ShapeType" v:lbl="Shape type" v:invis="true" v:langid="1033" v:val="VT4(Flow Segment)"></v:cp>			<v:cp v:nameu="SubShapeType" v:lbl="Subshape type" v:invis="true" v:langid="1033" v:val="VT4(Pipe Segment)"></v:cp>			<v:cp v:nameu="BaseElevation" v:lbl="Base elevation" v:type="2" v:langid="1033"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="SolSH" v:val="VT4({5D50005D-537C-4738-9C46-130C74335A6D})"></v:ud>			<v:ud v:nameu="ShapeClass" v:prompt="Building Component" v:val="VT0(3):26"></v:ud>			<v:ud v:nameu="ShapeType" v:prompt="Flow Segment" v:val="VT0(19):26"></v:ud>			<v:ud v:nameu="SubShapeType" v:prompt="Pipe Segment" v:val="VT0(56):26"></v:ud>		</v:userdefs>		<path d="M0 476.47 L193.74 476.47 L0 476.47 Z" class="st7"></path>		<path d="M0 476.47 L193.74 476.47" class="st8"></path>	</g>	<g id="shape14-31" v:mid="14" v:groupcontext="shape" transform="translate(553.475,-346.261)">		<title>Sheet.14</title>		<desc>Userspace</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="37.5249" cy="465.76" width="75.07" height="21.429"></v:textrect>		<rect x="0" y="455.045" width="75.0507" height="21.429" class="st4"></rect>		<text x="15.06" y="469.96" class="st9" v:langid="2052"><v:paragraph v:horizalign="2"></v:paragraph><v:tablist></v:tablist>用户空间</text>		</g>	<g id="shape15-34" v:mid="15" v:groupcontext="shape" transform="translate(311.352,-333.004)">		<title>Sheet.15</title>		<desc>/dev/remoteproc*</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="68.8537" cy="467.408" width="137.72" height="18.1322"></v:textrect>		<rect x="0" y="458.342" width="137.708" height="18.1322" class="st4"></rect>		<text x="15.83" y="471.61" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>/dev/remoteproc*</text>		</g>	<g id="shape16-37" v:mid="16" v:groupcontext="shape" transform="translate(580.026,-319.842)">		<title>Sheet.16</title>		<desc>Kernel</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="24.2495" cy="467.408" width="48.52" height="18.1322"></v:textrect>		<rect x="0" y="458.342" width="48.5" height="18.1322" class="st4"></rect>		<text x="16.5" y="471.61" class="st9" v:langid="2052"><v:paragraph v:horizalign="2"></v:paragraph><v:tablist></v:tablist>内核</text>		</g>	<g id="shape17-40" v:mid="17" v:groupcontext="shape" v:layermember="0" transform="translate(174.169,-208.474)">		<title>Process.1002</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M-0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L236.83 476.47 A4.00009 4.00009 -180 0 0 240.83 472.47 L240.83					 439.26 A4.00009 4.00009 -180 0 0 236.83 435.26 L4 435.26 A4.00009 4.00009 -180 0 0 0 439.26 L0 472.47 Z" class="st3"></path>	</g>	<g id="shape18-42" v:mid="18" v:groupcontext="shape" v:layermember="0" transform="translate(448.514,-208.474)">		<title>Process.1003</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L155.49 476.47 A4.00009 4.00009 -180 0 0 159.49 472.47 L159.49					 439.26 A4.00009 4.00009 -180 0 0 155.49 435.26 L4 435.26 A4.00009 4.00009 -180 0 0 0 439.26 L0 472.47 Z" class="st3"></path>	</g>	<g id="shape19-44" v:mid="19" v:groupcontext="shape" v:layermember="0" transform="translate(449,-126.822)">		<title>Process.1004</title>		<desc>Mdt-loader/SCM driver</desc>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="79.7426" cy="455.87" width="159.5" height="41.2095"></v:textrect>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L155.49 476.47 A4.00009 4.00009 -180 0 0 159.49 472.47 L159.49					 439.26 A4.00009 4.00009 -180 0 0 155.49 435.26 L4 435.26 A4.00009 4.00009 -180 0 0 0 439.26 L0 472.47 Z" class="st3"></path>		<text x="44.64" y="450.75" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Mdt-loader/<v:lf></v:lf><tspan x="37.23" dy="1.298em" class="st10">SCM </tspan><tspan class="st11" v:langid="2052">驱动程序</tspan></text>		</g>	<g id="shape20-49" v:mid="20" v:groupcontext="shape" v:layermember="0" transform="translate(179.077,-86.2295)">		<title>Process.1005</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 474.47 A2.00005 2.00005 -180 0 0 2 476.47 L231.98 476.47 A2.00005 2.00005 -180 0 0 233.98 474.47 L233.98					 396.67 A2.00005 2.00005 -180 0 0 231.98 394.67 L2 394.67 A2.00005 2.00005 -180 0 0 0 396.67 L0 474.47 Z" class="st12"></path>	</g>	<g id="shape21-51" v:mid="21" v:groupcontext="shape" v:layermember="0" transform="translate(184.975,-117.449)">		<title>Process.1006</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M-0 474.47 A2.00005 2.00005 -180 0 0 2 476.47 L69.58 476.47 A2.00005 2.00005 -180 0 0 71.58 474.47 L71.58 433.95					 A2.00005 2.00005 -180 0 0 69.58 431.95 L2 431.95 A2.00005 2.00005 -180 0 0 0 433.95 L0 474.47 Z" class="st3"></path>	</g>	<g id="shape22-53" v:mid="22" v:groupcontext="shape" v:layermember="0" transform="translate(259,-117.449)">		<title>Process.1007</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 474.47 A2.00005 2.00005 -180 0 0 2 476.47 L51.4 476.47 A2.00005 2.00005 -180 0 0 53.4 474.47 L53.4 433.95					 A2.00005 2.00005 -180 0 0 51.4 431.95 L2 431.95 A2.00005 2.00005 -180 0 0 0 433.95 L0 474.47 Z" class="st3"></path>	</g>	<g id="shape23-55" v:mid="23" v:groupcontext="shape" v:layermember="0" transform="translate(314.693,-117.449)">		<title>Process.1008</title>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<path d="M0 474.47 A2.00005 2.00005 -180 0 0 2 476.47 L90.4 476.47 A2.00005 2.00005 -180 0 0 92.4 474.47 L92.4 433.95					 A2.00005 2.00005 -180 0 0 90.4 431.95 L2 431.95 A2.00005 2.00005 -180 0 0 -0 433.95 L0 474.47 Z" class="st3"></path>	</g>	<g id="shape24-57" v:mid="24" v:groupcontext="shape" transform="translate(192.752,-219.955)">		<title>Sheet.24</title>		<desc>Remoteproc core</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="102.496" cy="467.408" width="205.01" height="18.1322"></v:textrect>		<rect x="0" y="458.342" width="204.991" height="18.1322" class="st4"></rect>		<text x="51.75" y="472.07" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Remoteproc <tspan class="st11" v:langid="2052">核心</tspan></text>		</g>	<g id="shape25-61" v:mid="25" v:groupcontext="shape" transform="translate(465.554,-212.32)">		<title>Sheet.25</title>		<desc>Remoteproc platform device</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="63.7976" cy="459.715" width="127.61" height="33.5186"></v:textrect>		<rect x="0" y="442.956" width="127.596" height="33.5186" class="st4"></rect>		<text x="28.63" y="455.51" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Remoteproc<v:lf></v:lf><tspan x="35.8" dy="1.2em" class="st11" v:langid="2052">平台设备</tspan></text>		</g>	<g id="shape26-65" v:mid="26" v:groupcontext="shape" transform="translate(191,-132.695)">		<title>Sheet.26</title>		<desc>sysmon</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="29.0699" cy="469.128" width="58.16" height="14.6933"></v:textrect>		<rect x="0" y="461.781" width="58.1409" height="14.6933" class="st4"></rect>		<text x="7.47" y="473.33" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>sysmon</text>		</g>	<g id="shape27-68" v:mid="27" v:groupcontext="shape" transform="translate(264.662,-132.695)">		<title>Sheet.27</title>		<desc>Glink</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="20.7673" cy="469.128" width="41.55" height="14.6933"></v:textrect>		<rect x="0" y="461.781" width="41.5357" height="14.6933" class="st4"></rect>		<text x="6.28" y="473.33" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Glink</text>		</g>	<g id="shape28-71" v:mid="28" v:groupcontext="shape" transform="translate(321.454,-125.237)">		<title>Sheet.28</title>		<desc>SSR notification</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.4763" cy="461.67" width="78.97" height="29.6091"></v:textrect>		<rect x="0" y="446.865" width="78.9537" height="29.6091" class="st4"></rect>		<text x="13.66" y="466.33" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>SSR <tspan class="st11" v:langid="2052">通知</tspan></text>		</g>	<g id="shape29-75" v:mid="29" v:groupcontext="shape" transform="translate(606.548,72.5906) rotate(90)">		<title>Sheet.29</title>		<path d="M0 476.47 L33.61 476.47 L33.61 476.47" class="st13"></path>	</g>	<g id="shape30-81" v:mid="30" v:groupcontext="shape" transform="translate(675.184,155.01) rotate(90)">		<title>Sheet.30</title>		<path d="M0 476.47 L64.24 476.47 L64.24 476.47" class="st13"></path>	</g>	<g id="shape31-86" v:mid="31" v:groupcontext="shape" transform="translate(856.832,72.5906) rotate(90)">		<title>Sheet.31</title>		<path d="M0 476.47 L33.61 476.47 L33.61 476.47" class="st13"></path>	</g>	<g id="shape32-91" v:mid="32" v:groupcontext="shape" transform="translate(856.832,155.01) rotate(90)">		<title>Sheet.32</title>		<path d="M0 476.47 L64.24 476.47 L64.24 476.47" class="st13"></path>	</g>	<g id="shape33-96" v:mid="33" v:groupcontext="shape" v:layermember="0" transform="translate(21,-208.474)">		<title>Process.1026</title>		<desc>Kernel clients</desc>		<v:custprops>			<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>			<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>			<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>		</v:custprops>		<v:userdefs>			<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>			<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>			<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>			<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>		</v:userdefs>		<v:textblock v:margins="rect(2,2,2,2)"></v:textblock>		<v:textrect cx="59.8494" cy="455.87" width="119.71" height="41.2095"></v:textrect>		<path d="M0 472.47 A4.00009 4.00009 -180 0 0 4 476.47 L115.7 476.47 A4.00009 4.00009 -180 0 0 119.7 472.47 L119.7 439.26					 A4.00009 4.00009 -180 0 0 115.7 435.26 L4 435.26 A4.00009 4.00009 -180 0 0 -0 439.26 L0 472.47 Z" class="st3"></path>		<text x="24.85" y="460.07" class="st5" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>内核客户端</text>		</g>	<g id="shape34-99" v:mid="34" v:groupcontext="shape" transform="translate(139.816,-229.082)">		<title>Sheet.34</title>		<path d="M0 476.47 L7.24 476.47 L7.6 476.47 L20.85 476.47 L26.08 476.47 L26.08 476.47" class="st15"></path>	</g>	<g id="shape35-107" v:mid="35" v:groupcontext="shape" transform="translate(771.062,268) rotate(90)">		<title>Sheet.35</title>		<path d="M0 476.47 L31.7 476.47 L31.7 476.47" class="st13"></path>	</g>	<g id="shape36-112" v:mid="36" v:groupcontext="shape" transform="translate(189.351,-91.8834)">		<title>Sheet.36</title>		<desc>Remoteproc subdevices</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="107.999" cy="466.679" width="216.02" height="19.591"></v:textrect>		<rect x="0" y="456.883" width="216" height="19.591" class="st4"></rect>		<text x="50.25" y="471.34" class="st16" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Remoteproc <tspan class="st11" v:langid="2052">子设备</tspan></text>		</g>	<g id="shape37-116" v:mid="37" v:groupcontext="shape" transform="translate(415.7,-229.082)">		<title>Sheet.37</title>		<path d="M0 476.47 L7.24 476.47 L7.6 476.47 L23.62 476.47 L25.2 476.47 L25.2 476.47" class="st15"></path>	</g>	<g id="shape38-123" v:mid="38" v:groupcontext="shape" transform="translate(534.351,-14.4998)">		<title>Sheet.38</title>		<path d="M0 474.47 A2.00005 2.00005 -180 0 0 2 476.47 L17.5 476.47 A2.00005 2.00005 -180 0 0 19.5 474.47 L19.5 459.64					 A2.00005 2.00005 -180 0 0 17.5 457.64 L2 457.64 A2.00005 2.00005 -180 0 0 -0 459.64 L0 474.47 Z" class="st17"></path>	</g>	<g id="shape39-125" v:mid="39" v:groupcontext="shape" transform="translate(545.552,-14.9901)">		<title>Sheet.39</title>		<desc>Open source</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="39.2256" cy="467.549" width="78.46" height="17.85"></v:textrect>		<rect x="0" y="458.624" width="78.452" height="17.85" class="st18"></rect>		<text x="18.45" y="471.75" class="st9" v:langid="2052"><v:paragraph v:horizalign="2"></v:paragraph><v:tablist></v:tablist>开源代码</text>		</g></g>
</svg>

**图：Remoteproc 支持**

## 配置 Remoteproc 恢复和子系统重启

Remoteproc 子设备负责管理远程处理器子系统崩溃和恢复场景中的通信环境。

通信环境等实体必须确定远程处理器何时启动或关闭。每个子设备都有两个操作：

- `probe()`，在 remoteproc `start()` 之后调用
- `remove()`，在 `stop()` 之前调用

当远程处理器发生致命错误时，remoteproc 驱动程序会处理该错误并调用 `rproc_report_crash()`，从而触发故障远程处理器的恢复。

恢复处理程序会执行以下操作：

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export Remoteproc-recovery.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="10.6875in" height="1.21886in" viewbox="0 0 769.499 87.7579" xml:space="preserve" color-interpolation-filters="sRGB" class="st8" aria-label="../_images/Remoteproc-recovery.svg"><v:documentproperties v:langid="1033" v:viewmarkup="false"></v:documentproperties>
<style>.svg-3 .st1 { fill: #fafafa; stroke: #c7c8c8; stroke-width: 1.25 }
.svg-3 .st2 { marker-end: url("#mrkr4-10"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1.25 }
.svg-3 .st3 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.33156521850386 }
.svg-3 .st4 { fill: #6280cc; stroke: #c8c8c8; stroke-opacity: 0; stroke-width: 1.25 }
.svg-3 .st5 { fill: #ffffff; font-family: Microsoft YaHei UI; font-size: 1.16666em }
.svg-3 .st6 { font-family: Roboto; font-size: 1em }
.svg-3 .st7 { font-size: 1em }
.svg-3 .st8 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-10" class="st3" v:arrowtype="4" v:arrowsize="2" v:setback="6.032" refx="-6.0319957835889" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.0159978917945,-3.0159978917945) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="0" v:shadowoffsetx="9.00001" v:shadowoffsety="-9.00001"></v:pageproperties>	<g id="group1-1" transform="translate(1.25,-1.25)" v:mid="1" v:groupcontext="group">		<title>Sheet.1</title>		<g id="shape2-2" v:mid="2" v:groupcontext="shape">			<title>Rectangle</title>			<v:userdefs>				<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>			</v:userdefs>			<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L763 87.76 A4.0001 4.0001 -180 0 0 767 83.76 L767 6.5 A4.0001 4.0001						 -180 0 0 763 2.5 L4 2.5 A4.0001 4.0001 -180 0 0 -0 6.5 L0 83.76 Z" class="st1"></path>		</g>		<g id="group3-4" transform="translate(11.7053,-11.0733)" v:mid="3" v:groupcontext="group">			<title>Sheet.3</title>			<g id="shape4-5" v:mid="4" v:groupcontext="shape" transform="translate(152.789,-32.0846)">				<title>Sheet.4</title>				<path d="M0 87.76 L35.21 87.76 L35.21 87.76" class="st2"></path>			</g>			<g id="shape5-11" v:mid="5" v:groupcontext="shape" transform="translate(349.008,-32.0846)">				<title>Sheet.5</title>				<path d="M0 87.76 L34.44 87.76 L34.44 87.76" class="st2"></path>			</g>			<g id="shape6-16" v:mid="6" v:groupcontext="shape" transform="translate(547.984,-32.0846)">				<title>Sheet.6</title>				<path d="M0 87.76 L30.96 87.76 L30.96 87.76" class="st2"></path>			</g>			<g id="group7-21" transform="translate(586.287,-5.68434E-14)" v:mid="7" v:groupcontext="group">				<title>Sheet.7</title>				<g id="shape8-22" v:mid="8" v:groupcontext="shape" transform="translate(0.459497,-0.820729) rotate(0.3)">					<title>Rectangle.1012</title>					<v:userdefs>						<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>					</v:userdefs>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L152.98 87.76 A4.0001 4.0001 -180 0 0 156.98 83.76 L156.98								 29.47 A4.0001 4.0001 -180 0 0 152.98 25.47 L4 25.47 A4.0001 4.0001 -180 0 0 -0 29.47 L0 83.76								 Z" class="st4"></path>				</g>				<g id="shape9-24" v:mid="9" v:groupcontext="shape" transform="translate(21.1031,-12.9561)">					<title>Sheet.9</title>					<desc>Start remoteproc instance</desc>					<v:userdefs></v:userdefs>					<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>					<v:textrect cx="57.5466" cy="68.6299" width="115.11" height="38.257"></v:textrect>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L111.1 87.76 A4.0001 4.0001 -180 0 0 115.1 83.76 L115.1								 53.5 A4.0001 4.0001 -180 0 0 111.1 49.5 L4 49.5 A4.0001 4.0001 -180 0 0 0 53.5 L0 83.76 Z" class="st4"></path>					<text x="5.32" y="64.48" class="st5" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>启动 <tspan class="st6" v:langid="1033">remoteproc<v:lf></v:lf></tspan><tspan x="43.55" dy="1.204em" class="st7">实例</tspan></text>					</g>			</g>			<g id="group10-29" transform="translate(390.857,-5.68434E-14)" v:mid="10" v:groupcontext="group">				<title>Sheet.10</title>				<g id="shape11-30" v:mid="11" v:groupcontext="shape" transform="translate(0.459497,-0.820729) rotate(0.3)">					<title>Rectangle.1006</title>					<v:userdefs>						<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>					</v:userdefs>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L152.98 87.76 A4.0001 4.0001 -180 0 0 156.98 83.76 L156.98								 29.47 A4.0001 4.0001 -180 0 0 152.98 25.47 L4 25.47 A4.0001 4.0001 -180 0 0 -0 29.47 L0 83.76								 Z" class="st4"></path>				</g>				<g id="shape12-32" v:mid="12" v:groupcontext="shape" transform="translate(23.852,-21.5556)">					<title>Sheet.12</title>					<desc>Reload firmware</desc>					<v:userdefs></v:userdefs>					<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>					<v:textrect cx="54.7977" cy="77.2288" width="109.61" height="21.0581"></v:textrect>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L105.6 87.76 A4.0001 4.0001 -180 0 0 109.6 83.76 L109.6								 70.7 A4.0001 4.0001 -180 0 0 105.6 66.7 L4 66.7 A4.0001 4.0001 -180 0 0 -0 70.7 L0 83.76 Z" class="st4"></path>					<text x="12.8" y="81.43" class="st5" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>重新加载固件</text>					</g>			</g>			<g id="group13-35" transform="translate(195.429,-5.68434E-14)" v:mid="13" v:groupcontext="group">				<title>Sheet.13</title>				<g id="shape14-36" v:mid="14" v:groupcontext="shape" transform="translate(0.459497,-0.820729) rotate(0.3)">					<title>Rectangle.1005</title>					<v:userdefs>						<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>					</v:userdefs>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L152.98 87.76 A4.0001 4.0001 -180 0 0 156.98 83.76 L156.98								 29.47 A4.0001 4.0001 -180 0 0 152.98 25.47 L4 25.47 A4.0001 4.0001 -180 0 0 -0 29.47 L0 83.76								 Z" class="st4"></path>				</g>				<g id="shape15-38" v:mid="15" v:groupcontext="shape" transform="translate(16.3706,-12.9561)">					<title>Sheet.15</title>					<desc>Invoke coredump generator</desc>					<v:userdefs></v:userdefs>					<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>					<v:textrect cx="63.2662" cy="68.6299" width="126.55" height="38.257"></v:textrect>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L122.54 87.76 A4.0001 4.0001 -180 0 0 126.54 83.76 L126.54								 53.5 A4.0001 4.0001 -180 0 0 122.54 49.5 L4 49.5 A4.0001 4.0001 -180 0 0 0 53.5 L0 83.76 Z" class="st4"></path>					<text x="15.59" y="64.48" class="st5" v:langid="2052"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>调用 <tspan class="st6" v:langid="1033">coredump<v:lf></v:lf></tspan><tspan x="42.27" dy="1.204em" class="st7">生成器</tspan></text>					</g>			</g>			<g id="group16-43" v:mid="16" v:groupcontext="group">				<title>Sheet.16</title>				<g id="shape17-44" v:mid="17" v:groupcontext="shape" transform="translate(0.459497,-0.820729) rotate(0.3)">					<title>Rectangle.1001</title>					<v:userdefs>						<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>					</v:userdefs>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L152.98 87.76 A4.0001 4.0001 -180 0 0 156.98 83.76 L156.98								 29.47 A4.0001 4.0001 -180 0 0 152.98 25.47 L4 25.47 A4.0001 4.0001 -180 0 0 -0 29.47 L0 83.76								 Z" class="st4"></path>				</g>				<g id="shape18-46" v:mid="18" v:groupcontext="shape" transform="translate(21.1031,-12.9561)">					<title>Sheet.18</title>					<desc>Stop remoteproc instance</desc>					<v:userdefs></v:userdefs>					<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>					<v:textrect cx="57.5466" cy="68.6299" width="115.11" height="38.257"></v:textrect>					<path d="M0 83.76 A4.0001 4.0001 -180 0 0 4 87.76 L111.1 87.76 A4.0001 4.0001 -180 0 0 115.1 83.76 L115.1								 53.5 A4.0001 4.0001 -180 0 0 111.1 49.5 L4 49.5 A4.0001 4.0001 -180 0 0 0 53.5 L0 83.76 Z" class="st4"></path>					<text x="5.32" y="64.48" class="st5" v:langid="2052"><v:paragraph v:horizalign="1" v:bulletsize="0.166667"></v:paragraph><v:tablist></v:tablist>停止 <tspan class="st6" v:langid="1033">remoteproc<v:lf></v:lf></tspan><tspan x="43.55" dy="1.204em" class="st7">实例</tspan></text>					</g>			</g>		</g>	</g></g>
</svg>

**图：Remoteproc 崩溃序列**

要使用用户空间中的恢复 `debugfs` 节点来启用和禁用恢复，请执行以下操作：

mount -t debugfs nodev /sys/kernel/debug
    echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/recovery
    Copy to clipboard

## 启用或禁用核心 dump

使用 Qualcomm Linux 内核 devcoredump 功能，支持远程处理器核心 dump，以便调试子系统崩溃问题。

当子系统崩溃时，devcoredump 会将正在恢复的 remoteproc 的内存拍照呈现在 `/sys/class/devcoredump/devcdN/data` 节点中，同时将相关的崩溃 `uevent` 发送到用户空间。读取 sysfs 节点时，sysfs 会通过 ELF 容器提供内存段；对该节点进行写入操作时，会释放相关资源并销毁 devcoredump 实例。

公开 debugfs 节点，用于从用户空间启用和禁用核心 dump。

# Disable core dumps:
      echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump
    
    # Enable core dumps:
      echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump
    #
    # N represents the index number of the remote processor.
    Copy to clipboard

Note

Qualcomm SoC 在 remoteproc 崩溃（远程处理器上的致命错误）时会触发内核 panic，以便收集完整的 RAM dump 文件，用于进行崩溃分析。仅当核心 dump 禁用时，才会启用内核 panic 模式。

仅当为子系统启用了核心 dump 时，才会在子系统崩溃时创建 devcoredump `/sys/class/devcoredump/devcdN/data` 节点。要启用核心 dump，请运行 `echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump` 命令。`devcdN/data` 节点是临时的，超时后会被删除。要调试问题，请使用 `copy` 命令将 `devcdN/data` 节点复制到本地设备以便安全使用。删除超时在 `base/devcoredump.c` 中定义。

以下是复制核心 dump 的示例命令：

# Copy Core dump to a local device
      cp /sys/class/devcoredump/devcdN/data > /var/spool/crash/dump_file.elf
    #
    # N represents the index of core dump. It is incremented each time a new core dump is generated.
    Copy to clipboard

要将核心 dump 文件传输到主机设备并调试问题，请使用 Qualcomm Crash Analysis Portal (QCAP)。

Note

有关 QCAP 的更多信息，请参阅 [Parse RAM dumps using QCAP](https://docs.qualcomm.com/bundle/resource/topics/80-70020-12A/debugging_linux_kernel.html#parse_ram_dumps_using_qcap)。

## 在 DT 中配置 remoteproc 节点和固件加载

Remoteproc 设备使用 DT 绑定在相应的设备树文件中进行配置。根据 `Documentation/devicetree/bindings/remoteproc/` 目录中的 DT 绑定，该配置包括兼容的设备名称、内存区域、中断设置和时钟参考。

以下示例显示了 `arch/arm64/boot/dts/qcom/qcs6490.dtsi` 文件中的 QCS6490 aDSP remoteproc 设备树配置：

remoteproc_adsp: remoteproc@3000000 {
              compatible = "qcom,sc7280-adsp-pas";
              reg = <0x0 0x03000000 0x0 0x100>;
    
              interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
                                      <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
                                      <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
                                      <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
                                      <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>,
                                      <&adsp_smp2p_in 7 IRQ_TYPE_EDGE_RISING>;
              interrupt-names = "wdog", "fatal", "ready", "handover",
                              "stop-ack", "shutdown-ack";
    
              clocks = <&rpmhcc RPMH_CXO_CLK>;
              clock-names = "xo";
              <snip>
     };
    Copy to clipboard

检查 `arch/arm64/boot/dts/qcom/sa8775p.dtsi` 路径中的 IQ-9075 设备树配置文件。

Note

要获取所有 Qualcomm SoC 的设备树配置文件，参见相应的平台 DTSI 文件。

所有固件文件都位于 `rootfs` 中的 `/lib/firmware` 目录中并在相应板卡设备树 `arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts` 文件中进行相关配置。对于其他 Qualcomm 硬件 SoC，请参阅 `arch/arm64/boot/dts/qcom/<SoC>-<board>.dts` 文件。

以下示例展示了 remoteproc DT 配置：

&remoteproc_adsp {
    firmware-name = "qcom/qcs6490/adsp.mdt";
    status = "okay";
    };
    Copy to clipboard

在 remoteproc 成功启动后，会显示以下日志：

**
    \# remoteproc success**
    "remoteproc remoteproc1: remote processor 4080000.remoteproc is now up"
    Copy to clipboard

在 remoteproc 固件加载失败后，会显示以下日志：

**
    \# remoteproc failure**
    Error log: "remoteproc remoteproc0: Direct firmware load for qcom/qcs6490/modem.mdt failed with error -2"
    
    # Caused by: error loading firmware.
    # Solution: ensure that the modem firmware is copied to /lib/firmware/qcom/qcs6490 in rootfs.
    Copy to clipboard

Qualcomm^®^ Linux 内核基线支持所有内存管理功能和分配器。以下信息概述了如何定制内存映射和执行堆管理。

有关 Linux 内核内存管理的详细信息，参见 [Memory management](https://www.kernel.org/doc/html/next/core-api/index.html#memory-management)。

**内存映射**

内存映射描述了内核启动过程中为子系统（如 Modem、摄像头、aDSP 和 cDSP 等）保留的区域。

内存映射为 DTSI 中的划分区域设置 `no-map`，使内核无法访问这些区域。

可配置的划分区域定义在 `reserved-memory` 节点下的 `arch/arm64/boot/dts/qcom/qcs6490.dtsi` 文件中。

reserved-memory {
                   cdsp_secure_heap_mem: cdsp-secure-heap@81800000 {
                            reg = <0x0 0x81800000 0x0 0x1e00000>;
                            no-map;
                   };
    
                   camera_mem: camera@84300000 {
                            reg = <0x0 0x84300000 0x0 0x500000>;
                            no-map;
                   };
    
                   wpss_mem: wpss@0x84800000 {
                            reg = <0x0 0x84800000 0x0 0x1900000>;
                            no-map;
                   };
    
                   adsp_mem: adsp@86100000 {
                            reg = <0x0 0x86100000 0x0 0x2800000>;
                            no-map;
                   };
    };
    Copy to clipboard

Note

对于 Qualcomm SoC ，参见 SoC 特定的 Qualcomm DTSI 文件以获取此信息。

以下早期启动日志显示了为不同子系统创建的划分区域：

[    0.000000] OF: reserved mem: 0x0000000081800000..0x00000000835fffff (30720 KiB) nomap non-reusable cdsp-secure-heap@81800000
    [    0.000000] OF: reserved mem: 0x0000000084300000..0x00000000847fffff (5120 KiB) nomap non-reusable camera@84300000
    [    0.000000] OF: reserved mem: 0x0000000084800000..0x00000000860fffff (25600 KiB) nomap non-reusable wpss@0x84800000
    [    0.000000] OF: reserved mem: 0x0000000086100000..0x00000000888fffff (40960 KiB) nomap non-reusable adsp@86100000
    Copy to clipboard

Qualcomm Linux 分发版支持 CMA 来分配物理上连续的大内存。CMA 在启动时会保留大块的物理上连续的内存区域，并在 CMA 分配时提供物理上连续的内存。不使用时，CMA 内存可供内核伙伴分配器进行可移动分配。

要更改默认 CMA 区域的大小，请运行内核命令行参数中的 `cma=size_in_MB`。有关如何使用内核参数的详细信息，可参见以下示例：

cma=nn[MG]@[start[MG][-end[MG]]]
                            [KNL,CMA]
                            Sets the size of kernel global memory area for
                            contiguous memory allocations and optionally the
                            placement constraint by the physical address range of
                            memory allocations. A value of 0 disables CMA
                            altogether. For more information, see
                            kernel/dma/contiguous.c
    Copy to clipboard

自定义 CMA 区域定义在 `reserved-memory` 节点，其兼容标签 `shared-dma-pool` 指示 CMA 区域：

adsp_heap_mem: adsp-heap {
                            compatible = "shared-dma-pool";
                            alloc-ranges = <0x0 0x00000000 0x0 0xffffffff>;
                            reusable;
                            alignment = <0x0 0x400000>;
                            size = <0x0 0xc00000>;
                   };
    Copy to clipboard

以下所示为启动时保留的 aDSP CMA 内存区域的日志示例：

[    0.000000] OF: reserved mem: initialized node adsp-heap, compatible id shared-dma-pool
    [    0.000000] OF: reserved mem: 0x00000000ff000000..0x00000000ffbfffff (12288 KiB) map reusable adsp-heap
    Copy to clipboard

## 添加自定义 CMA 堆

要使用 DMA-BUF 堆创建自定义 CMA 区域，请使用 Qualcomm Linux 内核中现有的 DMA-BUF 框架。

Qualcomm Linux 内核导出自定义 DMA-BUF 堆的 `cma_heap_add()` API。

/**
    * cma_heap_add - adds a CMA heap to dmabuf heaps
    * @cma:       pointer to the CMA pool to register the heap for
    * @data:      unused
    *
    * Returns 0 on success. Else, returns errno.
    */
    
    int cma_heap_add(struct cma *cma, void *data);
    Copy to clipboard

导出到用户空间的 DMA-BUF 堆，其名称与设备树中 CMA 区域的 phandle 相同。

要添加自定义 CMA 堆，可执行以下操作：

1. 要创建定制 CMA 区域，请参见[连续内存分配器](https://docs.qualcomm.com/doc/80-70020-3SC/topic/features.html##memory-contiguous)。
2. 在要添加自定义堆的驱动程序中：

    1. 解析新添加的 CMA 区域的设备树。
    2. 添加与驱动程序相关的 DMA-BUF 堆。

int create_my_cma_heap(struct device *dev)
            {
               int rc = 0, idx = 0;
            
               rc = of_reserved_mem_device_init_by_idx(dev, dev->of_node, 0);  // Parse the devicetree for the cma region
            
               if (rc) {
                        pr_err("No reserved DMA memory, ret=%d\n", rc);
                        rc = -EINVAL;
                        goto err;
               }
            
               rc = cma_heap_add(dev->cma_area, NULL);  // Add a dmabuf heap associated with the cma region
            
               if (rc) {
                        pr_err("cma_heap_add failed, ret=%d\n", rc);
                        rc = -EINVAL;
                        goto err;
               }
            
            err:
               return rc;
            }
            Copy to clipboard

Note

将 CMA 区域对齐到 4 MB 地址基址并设置大小，以支持页面迁移。迁移发生在 page-block 级别的 2 ^pageblock\_order^ 页。在 Qualcomm Linux 内核中，页面块阶次为 10。

## 支持的堆

下表列出了 Qualcomm Linux 分发版默认支持的堆：

表：默认支持的堆

| 堆名称 | Dev 节点 | 说明 | 用法 |
| --- | --- | --- | --- |
| 系统堆 | /dev/dma_heap/system<br>    Copy to clipboard | 内核会创建默认的 DMA-BUF 堆。 | 所有通用用例都必须遵循系统堆，系统堆在底层使用的是常见的 Linux 内存管理伙伴分配器。 |
| Reserved | /dev/dma_heap/reserved<br>    Copy to clipboard | 系统中创建的默认 CMA 类型的堆，使用默认*保留的* CMA 区域。 | 如果由于任何限制而需要使用连续内存，可使用 CMA 堆。 |
| 定制 CMA 堆 | /dev/dma_heap/my_cma_heap<br>    Copy to clipboard | 用户定义的 CMA 类型的堆。 | 为特定的定制 CMA 堆创建自己的 CMA 类型的堆时使用。 |

## 使用 DMA-BUF 堆

Qualcomm Linux 分发版支持 DMA-BUF 堆，用于分配自定义 CMA 堆。对于 DMA-BUF 堆，每个堆在 `/dev/dma_heap` 文件系统中都有一个设备文件。除了系统堆和常用的 CMA 预留堆外，用户还可以创建自己的 CMA 类型的 DMA-BUF 堆。

下面是一个示例程序，演示了如何使用 Qualcomm Linux 内核创建的 DMA-BUF 系统堆 `/dev/dma_heap/system:`

include <stdio.h>
    include <stdlib.h>
    include <fcntl.h>
    include <errno.h>
    include <unistd.h>
    include <sys/ioctl.h>
    include <linux/dma-buf.h>
    #include <linux/dma-heap.h>
    
    define DMA_HEAP_NAME "system"
    define SZ_4 0x00000004  // to allocate a 4K buffer
    
    int main()
    {
    int fd, dma_buf_fd;
    
    struct dma_heap_allocation_data dma_alloc_data = {
       .len = SZ_4,
       .fd_flags = O_RDWR | O_CLOEXEC,
    };
    
    struct dma_buf_sync sync_start = {
       .flags = DMA_BUF_SYNC_START,
    };
    struct dma_buf_sync sync_end = {
       .flags = DMA_BUF_SYNC_END,
    };
    
    fd = open("/dev/dma_heap/system", O_RDWR);
    if (fd < 0) {
       perror("open");
       return errno;
    }
    
    dma_buf_fd = ioctl(fd, DMA_HEAP_IOCTL_ALLOC, &dma_alloc_data);
    if (dma_buf_fd < 0) {
       perror("ioctl");
       return errno;
    }
    printf("Allocated DMA buffer with fd %d\n", dma_buf_fd);
    
    if (ioctl(dma_buf_fd, DMA_BUF_IOCTL_SYNC, &sync_start)) {
       perror("ioctl DMA_BUF_IOCTL_SYNC start");
       return errno;
    }
    
    //        Do something with the buffer here
    
    if (ioctl(dma_buf_fd, DMA_BUF_IOCTL_SYNC, &sync_end))
    {
       perror("ioctl DMA_BUF_IOCTL_SYNC end");
       return errno;
    }
    
    if (close(dma_buf_fd)) {
       perror("close");
       return errno;
    }
    
    if (close(fd)) {
       perror("close");
       return errno;
    }
    
    return 0;
    }
    Copy to clipboard

## 将 ZRAM 配置为交换设备

ZRAM 是一种压缩交换机制，可在 RAM 中创建虚拟块设备。ZRAM 已作为模块在内核 defconfig 中启用。

在 `recipes-extended/zram/zram/zram-swap-init-update` 文件的 Yocto 编译中配置 ZRAM。

如需启用或配置 ZRAM，可执行以下程序：

# check if zram module is loaded
      lsmod | grep zram
    
    # else load it
      modprobe zram
    
    # Configure /dev/zram0 size according to your RAM size
      echo 128M > /sys/block/zram0/disksize
    
    # activate swap
      mkswap /dev/zram0
      swapon /dev/zram0
    Copy to clipboard

要将 ZRAM 配置为交换设备，请参阅 [zram: Compressed RAM-based block devices](https://www.kernel.org/doc/html/v6.6/admin-guide/blockdev/zram.html)。

## 扩展内存映射

若要扩展内存映射，可调整 DTSI 文件中内存区域的地址和大小。

使用以下信息扩展划分区域：

使用以下语法在 **reserved-memory** 节点中的 `arch/arm64/boot/dts/qcom/<SoC>-<board>-<variant>.dts` 文件中添加划分区域：

my_carveout_mem: my_carveout_mem@address {
          reg= <0x0 0xbase_address 0x0 0xsize>;
          no-map;
    }
    Copy to clipboard

例如：

my_carveout_mem: my_carveout_mem@d0800000 {
          reg= <0x0 0xd0800000 0x0 0x100000>;
          no-map;
    }
    Copy to clipboard

表：划分区域的语法

| 变量 | 说明 |
| --- | --- |
| my_carveout_mem@d0800000<br>    Copy to clipboard | 指示设备节点的名称。按照惯例，应将内存区域的基址附加到名称中。 |
| my_carveout_mem<br>    Copy to clipboard | 指示分配给此节点的标签，该标签可供设备树中的其他节点使用 phandle 引用此节点时使用。 |
| reg<br>    Copy to clipboard | 指示属性，该属性是一个 64 位值，用于定义内存区域的基址和大小。 |
| no-map<br>    Copy to clipboard | 指示此区域已划分，内核应从其可寻址范围中删除映射。 |

Note

- 任何区域都不应重叠。如果必须增大某个区域的大小，则移动所有其他后续区域，并在设备树中进行配置以避免重叠。
- 内核要求供内核使用的所有内存区域边界都对齐到 1 MB。
- 现有划分区域受受信任固件保护，防止内核访问。减小其大小或将其删除可能会导致外部中止，造成内核崩溃。

**添加 CMA 区域**

要在**保留内存**节点下的 `arch/arm64/boot/dts/qcom/<SoC>-<board>-<variant>.dts` 文件中添加 CMA 区域，请使用以下语法：

my_cma_mem: my_cma {
       compatible = "shared-dma-pool";
       alloc-ranges = <0x0 0x00000000 0x0 0xffffffff>;
       reusable;
       alignment = <0x0 0x400000>;
       size = <0x0 0x1400000>;
    };
    Copy to clipboard

表：添加 CMA 区域的语法

| 参数 | 说明 |
| --- | --- |
| my_cma_mem<br>    Copy to clipboard | CMA 节点的标签，可用作 phandle。标签 `my_cma` 是 CMA 区域的名称。 |
| shared-dma-pool<br>    Copy to clipboard | 指示此区域是 CMA 区域。 |
| alloc-ranges<br>    Copy to clipboard | 指示此区域是否应处于某个特定的内存限制范围内，因为某些设备无法访问超过 32 位地址限制的内存区域。 |
| reusable<br>    Copy to clipboard | 指示内核可以在该内存区域空闲时使用其中的内存。 |
| alignment<br>    Copy to clipboard | 指示此区域中的任何对齐要求。 |
| size<br>    Copy to clipboard | 指示区域的大小： |
| reg<br>    Copy to clipboard | 这是一个可选属性，指示用于内存分配的固定区域，若不设置此属性，则以随机地址动态分配内存。 |

Qualcomm Linux 内核支持标准的 Linux 调度器方案。内核使用调度器根据 CPU 能耗选择适合放置任务的目标 CPU。

调度器决定进程的运行顺序。调度器运行每个 CPU 的运行队列中的进程。

内核基线支持标准的 Linux 调度器方案。内核使用 [Energy Aware Scheduling (EAS)](https://www.kernel.org/doc/html/next/scheduler/sched-energy.html) 功能根据 CPU 能耗选择适合放置任务的目标 CPU。

EAS 会取代完全公平调度器 (CFS) 任务唤醒负载均衡代码。在采用非对称 CPU 拓扑的系统中，它会使用 CPU 的能量模型 (EM) 和实体负载跟踪 (PELT) 信号，在任务唤醒负载均衡期间选择节能的目标 CPU。

有关调度器的基本文档，参见 [Scheduler](https://www.kernel.org/doc/html/next/scheduler/index.html)。

## 了解 CPU 拓扑和 EAS

Qualcomm SoC 采用异构 CPU 拓扑，这些拓扑通过 EAS 中使用的 CPU 容量指标加以区分。

EAS 使用*容量*的概念来区分具有不同计算能力的 CPU。CPU 的容量表示的是相对于系统中性能最强的 CPU 而言，以最高频率运行时完成的工作量。容量值归一化至 1024 范围内（最强大 CPU/群集的容量值配置为 1024）。

EAS 根据 CPU 节点中指定的 Dhrystone 每秒百万条指令 (DMIPS) 值和群集支持的最高频率确定群集的容量。

下表列出了 CPU 拓扑和容量对应的 `sysfs` 节点：

> 
> 
> 表：CPU 拓扑和容量
> 
> 
> | 命令 | 目的 |
> | --- | --- |
> | cat /sys/devices/system/cpu/cpu*/cpu_capacity<br>    Copy to clipboard | 获取系统中每个 CPU 的相关容量。 |
> | cat /sys/devices/system/cpu/cpufreq/policy*/related_cpus<br>    Copy to clipboard | 获取与系统中每个群集相关的 CPU 列表。 |

有关调度器如何使用 CPU 容量的详细信息，参见 [Capacity Aware Scheduling](https://www.kernel.org/doc/html/next/scheduler/sched-capacity.html)。

## 更改默认 CPU 频率调节器

CPU 频率调节器可以在 runtime 更改，也可以在编译版本编译过程中静态设置。

1. Kconfig 配置选项：要设置 CPU 频率调节器，请在内核 defconfiguration 文件中启用相应的驱动程序。

    要设置 `PERFROMANCE` 调节器作为默认 CPU 频率调节器，请在 defconfiguration 文件中设置 `CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y`。
2. 内核命令行选项：要覆盖内核配置选项，请在 `meta-qcom-hwe/conf/machine/include/qcom-<SoC>.inc` 文件中的内核命令行中添加 `cpufreq.default_governor=performance` 参数，以设置适当的 CPU 频率调节器。

## 配置实体负载跟踪

实体负载跟踪 (PELT) 是一种负载跟踪机制，用于跟踪 `sched_entities/groups/runqueues` 的负载计算。

调节 PELT 时钟乘数以满足功耗和性能要求。

命令行参数 `sched_pelt_multiplier` 允许您设置时钟乘数。时钟乘数可调节 PELT 上升/下降速度，以便优化系统功耗和性能。

半衰期越短，任务的 CPU 利用率累积得越快。这些任务被分配给性能 CPU，从而以更高的功耗实现更好的性能。此外，CPU 利用率也会累积起来，以便在更短的时间内选择更高的 CPU 频率。

Note

半衰期还会影响任务利用率的下降方式。UTIL EST 功能可加快下降速度。

在 Linux 内核中，PELT 半衰期乘数会影响系统如何适应不断变化的工作负载，并根据历史利用率数据调整 CPU 频率。该配置可加快 PELT 时钟并缩短半衰期，从而加快系统响应速度。

通过内核命令行参数配置 PELT 乘数：

`kernel.sched_pelt_multiplier=[1, 2, 4] Default value: 1 (half life 32 msec), 2 (half life 16msec), 4(half life 8 msec)]`

有关 PELT 的详细信息，参见 [Per-entity load tracking](https://lwn.net/Articles/531853/)。

## 配置 SchedUtil 调速器

SchedUtil CPU 频率调节器是 Qualcomm Linux 内核中的默认调节器。SchedUtil 根据 CPU 利用率预测最佳工作点 (OPP)，从而在频率请求与能耗预测之间保持一致。

SchedUtil CPU 频率调节器与 EAS 相关联，它试图预测所有 CPU 下一步将在哪个 OPP 下运行以估算它们的能耗。

有关更多信息，请参阅 [SchedUtil](https://www.kernel.org/doc/html/next/scheduler/schedutil.html)。

## 配置利用率限制 (UCLAMP)

利用率限制是调度器的一个功能，允许用户空间管理任务的性能要求。

要执行限制操作，请配置以下参数：

- `UCLAMP_MIN`：如果设置为任意值 `> 0`，则任务需求将始终大于或等于该值。如果实际任务需求大于此值，则使用实际需求信号，但如果实际任务需求小于此值，则将 `UCLAMP_MIN` 报告为任务需求。
- `UCLAMP_MAX`：如果设置为任意值 `> 0`，则任务需求将始终小于或等于该值。如果实际任务需求小于该值，则使用实际需求信号；但如果实际任务需求大于该值，则将 `UCLAMP_MAX` 作为任务需求报告。

Note

`UCLAMP_MAX > UCLAMP_MIN`

使用 UCLAMP 影响调度器的任务分配决策。

在异构系统中，调度器使用任务需求或利用率信号（PELT 信号）将任务分类为小任务或大任务。根据任务分类的输入，调度器会选择较小（计算能力较低）或较大（计算能力较高）的 CPU 核心进行任务放置，这可能会对功耗产生影响。

例如，将非重要（琐碎/后台/综合管理）任务限制为较低的值 (`lower UCLAMP_MAX`)，从而促使调度器将任务分配到小群集。同样，将重要/前台/活动任务限制为较高的值 (`higher UCLAMP_MIN`)，从而促使调度器将任务分配到大群集。

UCLAMP 还允许通过调度器控制频率指导。

要满足任务的快速频率上升需求，可将任务限制为较高的需求 (`UCLAMP_MIN`) 值。更高的限制有助于提升群集的频率，以满足任务的性能要求。

UCLAMP 操作允许从用户空间对任务/任务组进行性能管理。

UCLAMP 允许放置任务或任务组，并允许性能提示或约束。此机制用于影响调度器放置决策或影响群集的频率指导。

有关更多信息，请参阅 [UCLAMP](https://www.kernel.org/doc/html/next/scheduler/sched-util-clamp.html)。有关接口和配置的更多信息，请参见 [Utilization Clamping](https://www.kernel.org/doc/html/v6.6/scheduler/sched-util-clamp.html)。

## 了解 CPU 拓扑和 EAS

Qualcomm SoC 采用异构 CPU 拓扑，这些拓扑通过 EAS 中使用的 CPU 容量指标加以区分。

EAS 使用*容量*的概念来区分具有不同计算能力的 CPU。CPU 的容量表示的是相对于系统中性能最强的 CPU 而言，以最高频率运行时完成的工作量。容量值归一化至 1024 范围内（最强大 CPU/群集的容量值配置为 1024）。

EAS 根据 CPU 节点中指定的 Dhrystone 每秒百万条指令 (DMIPS) 值和群集支持的最高频率确定群集的容量。

下表列出了 CPU 拓扑和容量对应的 `sysfs` 节点：

> 
> 
> 表：CPU 拓扑和容量
> 
> 
> | 命令 | 目的 |
> | --- | --- |
> | cat /sys/devices/system/cpu/cpu*/cpu_capacity<br>    Copy to clipboard | 获取系统中每个 CPU 的相关容量。 |
> | cat /sys/devices/system/cpu/cpufreq/policy*/related_cpus<br>    Copy to clipboard | 获取与系统中每个群集相关的 CPU 列表。 |

有关调度器如何使用 CPU 容量的详细信息，参见 [Capacity Aware Scheduling](https://www.kernel.org/doc/html/next/scheduler/sched-capacity.html)。

## 配置实体负载跟踪

实体负载跟踪 (PELT) 是一种负载跟踪机制，用于跟踪 `sched_entities/groups/runqueues` 的负载计算。

调节 PELT 时钟乘数以满足功耗和性能要求。

命令行参数 `sched_pelt_multiplier` 允许您设置时钟乘数。时钟乘数可调节 PELT 上升/下降速度，以便优化系统功耗和性能。

半衰期越短，任务的 CPU 利用率累积得越快。这些任务被分配给性能 CPU，从而以更高的功耗实现更好的性能。此外，CPU 利用率也会累积起来，以便在更短的时间内选择更高的 CPU 频率。

Note

半衰期还会影响任务利用率的下降方式。UTIL EST 功能可加快下降速度。

在 Linux 内核中，PELT 半衰期乘数会影响系统如何适应不断变化的工作负载，并根据历史利用率数据调整 CPU 频率。该配置可加快 PELT 时钟并缩短半衰期，从而加快系统响应速度。

通过内核命令行参数配置 PELT 乘数：

`kernel.sched_pelt_multiplier=[1, 2, 4] Default value: 1 (half life 32 msec), 2 (half life 16msec), 4(half life 8 msec)]`

有关 PELT 的详细信息，参见 [Per-entity load tracking](https://lwn.net/Articles/531853/)。

## 配置 SchedUtil 调速器

SchedUtil CPU 频率调节器是 Qualcomm Linux 内核中的默认调节器。SchedUtil 根据 CPU 利用率预测最佳工作点 (OPP)，从而在频率请求与能耗预测之间保持一致。

SchedUtil CPU 频率调节器与 EAS 相关联，它试图预测所有 CPU 下一步将在哪个 OPP 下运行以估算它们的能耗。

有关更多信息，请参阅 [SchedUtil](https://www.kernel.org/doc/html/next/scheduler/schedutil.html)。

## 配置利用率限制 (UCLAMP)

利用率限制是调度器的一个功能，允许用户空间管理任务的性能要求。

要执行限制操作，请配置以下参数：

- `UCLAMP_MIN`：如果设置为任意值 `> 0`，则任务需求将始终大于或等于该值。如果实际任务需求大于此值，则使用实际需求信号，但如果实际任务需求小于此值，则将 `UCLAMP_MIN` 报告为任务需求。
- `UCLAMP_MAX`：如果设置为任意值 `> 0`，则任务需求将始终小于或等于该值。如果实际任务需求小于该值，则使用实际需求信号；但如果实际任务需求大于该值，则将 `UCLAMP_MAX` 作为任务需求报告。

Note

`UCLAMP_MAX > UCLAMP_MIN`

使用 UCLAMP 影响调度器的任务分配决策。

在异构系统中，调度器使用任务需求或利用率信号（PELT 信号）将任务分类为小任务或大任务。根据任务分类的输入，调度器会选择较小（计算能力较低）或较大（计算能力较高）的 CPU 核心进行任务放置，这可能会对功耗产生影响。

例如，将非重要（琐碎/后台/综合管理）任务限制为较低的值 (`lower UCLAMP_MAX`)，从而促使调度器将任务分配到小群集。同样，将重要/前台/活动任务限制为较高的值 (`higher UCLAMP_MIN`)，从而促使调度器将任务分配到大群集。

UCLAMP 还允许通过调度器控制频率指导。

要满足任务的快速频率上升需求，可将任务限制为较高的需求 (`UCLAMP_MIN`) 值。更高的限制有助于提升群集的频率，以满足任务的性能要求。

UCLAMP 操作允许从用户空间对任务/任务组进行性能管理。

UCLAMP 允许放置任务或任务组，并允许性能提示或约束。此机制用于影响调度器放置决策或影响群集的频率指导。

有关更多信息，请参阅 [UCLAMP](https://www.kernel.org/doc/html/next/scheduler/sched-util-clamp.html)。有关接口和配置的更多信息，请参见 [Utilization Clamping](https://www.kernel.org/doc/html/v6.6/scheduler/sched-util-clamp.html)。

Qualcomm Linux 内核基线支持多种 DVFS 实现，以便根据系统要求以动态方式管理频率调节。

## 选择 CPU DVFS 调速器

您可以选择一个调速器来调整系统的功率或性能，同时更改 `CPUfreq` 调节器（`powersave/performace/schedutil`）。默认情况下，在 Qualcomm Linux 内核上，将 CPU 频率调节器设置为 `performance`。

表：CPU DVFS 变量

| 变量 | 说明 | 路径 |
| --- | --- | --- |
| scaling_governor<br>    Copy to clipboard | 将调节器设置为性能模式。 | echo performance > /sys/devices/system/cpu/cpufreq/policy*/scaling_governor<br>    Copy to clipboard |
| scaling_max_freq<br>    Copy to clipboard | 设置 CPU 群集的最高频率。 | /sys/devices/system/cpu/cpufreq/policy*/scaling_max_freq<br>    Copy to clipboard |
| scaling_min_freq<br>    Copy to clipboard | 设置 CPU 群集的最低频率。 | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq<br>    Copy to clipboard |

有关 `CPUfreq` 的更多信息，请参阅 [CPU frequency and voltage scaling code in the Linux(TM) kernel](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)。

## 配置缓存和内存 DVFS 调节器

静态映射 DVFS 调节器将 CPU 工作频率与以下各项保持一致：

- 三级缓存 (L3)
- 最后一级缓存控制器 (LLCC)
- DDR RAM

如果 CPU 频率达到最高，无论是通过将 CPU 频率调节器设置为性能模式来达到最高，还是因系统中的负载过高而达到最高，L3、LLCC 和 DDR 也以最高频率运行。

该调节器的驱动程序位于 `drivers/cpufreq/qcom-cpufreq-hw.c` 文件，并且静态映射位于 `arch/arm64/boot/dts/qcom/sc7280.dtsi` 文件。

Note

对于 Qualcomm SoC，请参阅特定于平台的 DTSI 文件以获取此信息。

另一个带宽监测 (BWMON) 调节器用于根据 CPU 与 LLCC 和 CPU 与 DDR 之间的流量检测，对 LLCC 和 DDR 的频率进行投票。该调节器的驱动程序位于 `drivers/soc/qcom/icc-bwmon.c` 文件。

**CPU 频率**与 **L3/DDR 频率**之间的映射根据功耗或性能要求调整。

在 DTSI 中，对于每个 CPUx 节点，都有一个 `operating-points-v2 = <&cpux_opp_table>` 条目。`cpux_opp_table` 保存 CPU、L3 和 DDR 频率之间的静态映射。

例如：

cpu0_opp_300mhz: opp-300000000 {
       opp-hz = /bits/ 64 <300000000>;
       opp-peak-kBps = <800000 9600000>;
    };
    Copy to clipboard

当 CPU 0 以 300 MHz 运行时，它对 L3 表决 9600000，这相当于 300,000 Hz（9600000/w）的 L3 频率。如果表决为 DDR 提供 800,000 Hz，则所得 DDR 工作频率为   200,000 Hz (800000 / w)。

在等式中，“w”表示单个周期内可以写入多少个字节：

- 对于 DDR，“w”为 4（每个通道每个周期执行两次事务，每次事务为 2 个字节）。
- 对于 L3，“w”为 32（每个周期一个事务，每个事务 32 个字节）。

Note

这些值是针对 DDR 每条通道设置的，该映射将 CPU 频率与内存控制器 (MC) 通道带宽相关联。调整此映射表会影响功耗和性能特征。

有关工作性能点 (OPP) 框架和语法的更多信息，请参见 [Generic OPP (Operating Performance Points) Bindings](https://www.kernel.org/doc/Documentation/devicetree/bindings/opp/opp.txt)。

## 配置调度程序 DVFS 设置

调度器 DVFS 设置在 `post_boot script` 文件中定义。

所有启动后设置都在 `meta-qcom-hwe/recipes-core/initscripts/files/post_boot.sh` 脚本中。更多信息，请参阅 [post_boot.sh](https://github.com/qualcomm-linux/meta-qcom-hwe/blob/scarthgap/recipes-core/initscripts/files/post_boot.sh)。

## 选择 CPU DVFS 调速器

您可以选择一个调速器来调整系统的功率或性能，同时更改 `CPUfreq` 调节器（`powersave/performace/schedutil`）。默认情况下，在 Qualcomm Linux 内核上，将 CPU 频率调节器设置为 `performance`。

表：CPU DVFS 变量

| 变量 | 说明 | 路径 |
| --- | --- | --- |
| scaling_governor<br>    Copy to clipboard | 将调节器设置为性能模式。 | echo performance > /sys/devices/system/cpu/cpufreq/policy*/scaling_governor<br>    Copy to clipboard |
| scaling_max_freq<br>    Copy to clipboard | 设置 CPU 群集的最高频率。 | /sys/devices/system/cpu/cpufreq/policy*/scaling_max_freq<br>    Copy to clipboard |
| scaling_min_freq<br>    Copy to clipboard | 设置 CPU 群集的最低频率。 | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq<br>    Copy to clipboard |

有关 `CPUfreq` 的更多信息，请参阅 [CPU frequency and voltage scaling code in the Linux(TM) kernel](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)。

## 配置缓存和内存 DVFS 调节器

静态映射 DVFS 调节器将 CPU 工作频率与以下各项保持一致：

- 三级缓存 (L3)
- 最后一级缓存控制器 (LLCC)
- DDR RAM

如果 CPU 频率达到最高，无论是通过将 CPU 频率调节器设置为性能模式来达到最高，还是因系统中的负载过高而达到最高，L3、LLCC 和 DDR 也以最高频率运行。

该调节器的驱动程序位于 `drivers/cpufreq/qcom-cpufreq-hw.c` 文件，并且静态映射位于 `arch/arm64/boot/dts/qcom/sc7280.dtsi` 文件。

Note

对于 Qualcomm SoC，请参阅特定于平台的 DTSI 文件以获取此信息。

另一个带宽监测 (BWMON) 调节器用于根据 CPU 与 LLCC 和 CPU 与 DDR 之间的流量检测，对 LLCC 和 DDR 的频率进行投票。该调节器的驱动程序位于 `drivers/soc/qcom/icc-bwmon.c` 文件。

**CPU 频率**与 **L3/DDR 频率**之间的映射根据功耗或性能要求调整。

在 DTSI 中，对于每个 CPUx 节点，都有一个 `operating-points-v2 = <&cpux_opp_table>` 条目。`cpux_opp_table` 保存 CPU、L3 和 DDR 频率之间的静态映射。

例如：

cpu0_opp_300mhz: opp-300000000 {
       opp-hz = /bits/ 64 <300000000>;
       opp-peak-kBps = <800000 9600000>;
    };
    Copy to clipboard

当 CPU 0 以 300 MHz 运行时，它对 L3 表决 9600000，这相当于 300,000 Hz（9600000/w）的 L3 频率。如果表决为 DDR 提供 800,000 Hz，则所得 DDR 工作频率为   200,000 Hz (800000 / w)。

在等式中，“w”表示单个周期内可以写入多少个字节：

- 对于 DDR，“w”为 4（每个通道每个周期执行两次事务，每次事务为 2 个字节）。
- 对于 L3，“w”为 32（每个周期一个事务，每个事务 32 个字节）。

Note

这些值是针对 DDR 每条通道设置的，该映射将 CPU 频率与内存控制器 (MC) 通道带宽相关联。调整此映射表会影响功耗和性能特征。

有关工作性能点 (OPP) 框架和语法的更多信息，请参见 [Generic OPP (Operating Performance Points) Bindings](https://www.kernel.org/doc/Documentation/devicetree/bindings/opp/opp.txt)。

Last Published: Jul 22, 2025