Linux 主线内核包括对 Qualcomm Hexagon DSP 架构的支持arch/hexagon
。列出的维护者MAINTAINERS
是:
QUALCOMM HEXAGON ARCHITECTURE
M: Richard Kuo <[email protected]>
L: [email protected]
S: Supported
F: arch/hexagon/
该文件arch/hexagon/configs/comet_defconfig
包含一个定义配置根据 的说法,有一个名为“Comet Board”的董事会arch/hexagon/Kconfig
。
这个彗星板是什么?是谁做的?
答案1
Rob Landley(他在 Qualcomm&quic 中“花了半年时间在上面安装 Linux”)有一些关于该主板的笔记。它是高通内部的主板,配备未指定的 Snapdragon 和 256 MB 或 RAM,有一些网络,没有本地存储。该芯片可能与 Nexus One 中的芯片相同:QSD8250(Snapdragon S1),带有一些在 65 nm 上制造的 600 MHz 的 QDSP6,可能是 qdsp6 V2。
https://landley.net/notes-2012.html#24-02-2012
人们不断在电子邮件中询问我有关高通 Hexagon 的问题,我不断写下长篇解释,然后就不再写了。这是我最近写的关于该主题的电子邮件,供后代参考。已经一年半了,我们所做的基础工作已经完成,现在故事可以出来了。
请记住,我从事这方面工作的合同已于 2010 年 10 月到期,所以这些是我一年多前的模糊回忆:...
他们有一个内部模拟器,这是一些可怕的专有东西,他们外包给第三方来生产,如果我没记错的话,高通的律师竭尽全力确保他们没有获取源代码,因为有一堆“专有的显然更好,呃”。我预计这会狠狠地打击他们,因为这个傻瓜对 Linux 移植来说毫无用处。
大多数情况下我们只是使用真实的硬件。我们有一些叫做“comet”板的东西,它有一个 snapdragon SOC 和大约 256M 的内存,你可以在上面启动和运行代码。 (没有本地存储可言,我最终在 busybox 中实现了 nbd-client 来获取一些。)
曾尝试向 qemu 添加六边形支持,但失败了(Scott 有人做到了,...)。不幸的是,尝试它的人无法理解 TCG(我认为他主要是一名经理),而且它从未取得任何进展。 :( ...
就 Linux 而言,它是一个以 100mhz 运行的 6 路 SMP 芯片,但每个周期它最多可以调度 4 条指令,因此您可以恢复到更接近 300mhz 的性能......
Snapdragon 片上系统(您可以在 Nexus One 等设备中找到)实际上包含四个处理器:
1) ARMv7“Scorpion”处理器高通从 ARM 获得许可,然后进行了优化(在罗利园区,他们保护自己的地盘,高通的内部政治)。
2) 高通内部开发的QDSP6“Scorpion”处理器(在奥斯汀)。在 Android 中,它被用作“多媒体协处理器”,但实际上是一个功能强大的 4 路 VLIW 通用处理器,具有大量矢量指令。 ...
对于 Linux 移植,我们在 Hexagon 启动后关闭了其他 3 个处理器。我真的真的非常想要一个引导加载程序,我可以在我的 Nexus One 上作为 Android 应用程序运行,以在六边形上引导 Linux(将 uboot 和 kernel+initramfs blob 复制到内存中,启动 ARMv5 引导处理器来运行该 uboot,停止ARM),但我永远无法让理查德·郭(Richard Kuo)或任何人写一个。 (除非我至少有一个 USB 转串口适配器来为我提供一个串行控制台,否则它不会有用,事实证明这并不简单。所有 Snapdragon 外围驱动程序都在 Android 树中,但在 arch 下/arm。Linutronix 人员关注的最重要的事情之一就是将它们取出并转移到通用架构上,以便 Hexagon 可以使用它们。)...
关于 MMU 的注释:该芯片实际上还没有 MMU。相反,它具有一组由软件加载的转换后备缓冲区插槽。他们制作了一个充当 MMU 的二进制 blob,并且他们的 u-boot 的 snapdragon 端口(我认为在 armv5 启动处理器中运行)加载这个 blob 并将其连接到页面错误中断,因此它充当软件 mmu(他们的 Linux 端口依赖于哪个)。
现有 Snapdragon 芯片(嗯,我认为是 QDSP6v2)中 Hexagon 变体的主要问题是它们没有足够的 TLB 插槽。如果你运行完整的 6 路 SMP 进行 gcc 编译等,它会猛烈地撞击缓存并减慢自身速度。在我的测试中,性能“最佳点”位于 -j3 或 -j4 附近。我认为我们没有足够快地发现这个问题来修复 QDSP6v3(尽管由于这是 4 级 500mhz 变体,无论如何它对 TLB 的压力较小,所以或多或少处于他们的最佳点)做有)。但是 QDSP6v4(我离开时正在开发中)添加了更多的 TLB 插槽,这应该会大大提高 Linux 下的性能。
2013 年起的公共 minivm 虚拟机管理程序 -http://permalink.gmane.org/gmane.linux.ports.hexagon/553仅适用于 v2 和 v3:https://www.codeaurora.org/projects/all-active-projects/hexagon-minivm“此实现仅在 Hexagon 架构 v2 和 v3 上运行。”
Minivm 源代码在那里:https://source.codeaurora.org/quic/hmvm/hexagonMVM/tree/minivm.S
#define TLB_ENTRIES 64 * V2/V3 User/Supervisor Strategy: * MSB of ASID is used for User/Supervisor.
QDSP6v2 的参数(600MHz / 6 线程)也在 Linux 源代码中硬编码: http://elixir.free-electrons.com/linux/v4.12.3/source/arch/hexagon/kernel/setup.c#L56
/*
* These will eventually be pulled in via either some hypervisor
* or devicetree description. Hardwiring for now.
*/
pcycle_freq_mhz = 600;
thread_freq_mhz = 100;
sleep_clk_freq = 32000;
...
* This is just really brutal and shouldn't be used anyways,
* especially on V2. Left here just in case.
也支持一些模拟器(不确定是否是 hexagon-sim)
/*
* Simulator has a few differences from the hardware.
* For now, check uninitialized-but-mapped memory
* prior to invoking setup_arch_memory().
*/
if (*(int *)((unsigned long)_end + 8) == 0x1f1f1f1f)
on_simulator = 1;
Linux 代码是在 2009-2010 年左右编写的:http://elixir.free-electrons.com/linux/v4.12.3/source/arch/hexagon/lib/memcpy.S
* History
*
* DJH 5/15/09 Initial version 1.0
* DJH 6/ 1/09 Version 1.1 modified ABI to inlcude R16-R19
* DJH 7/12/09 Version 1.2 optimized codesize down to 760 was 840
* DJH 10/14/09 Version 1.3 added special loop for aligned case, was
..
* DJH 4/23/10 version 1.6