Skip to the content.

aarch64

顶层

static const struct iommu_ops apple_dart_iommu_ops ;

定义 : apple_dart_map_pages

page table

文档

openeuler 的文档

smmu page table 解释地很清晰

TODO

如何知道当前的 smmu 用的是那个版本 v3

在 apple 中:

# ls -la /sys/bus/platform/drivers/arm-smmu
total 0
drwxr-xr-x  2 root root     0 Jun 12 16:35 .
drwxr-xr-x 70 root root     0 Jun 12 16:35 ..
lrwxrwxrwx  1 root root     0 Jun 12 16:57 arm-smmu.0.auto -> ../../../../devices/platform/arm-smmu.0.auto
lrwxrwxrwx  1 root root     0 Jun 12 16:57 arm-smmu.1.auto -> ../../../../devices/platform/arm-smmu.1.auto

参考一下这个

https://github.com/wangzhou/notes/blob/master/iommu/PASID_analysis

卧龙凤雏 kunpeng + megaraid_sas

第一次尝试: 如果让 megaraid_sas 开机就绑定到 vfio 上

echo "options vfio-pci ids=8086:158b" | sudo tee /etc/modprobe.d/vfio.conf
echo "add_drivers+=\" vfio vfio-pci \"" | sudo tee /etc/dracut.conf.d/vfio.conf
sudo dracut -f

然后就无法开机,不断的抛出错误,似乎不难理解,就是这个 arm iommu 和 megaraid 卡不兼容

[  420.979049] arm-smmu-v3 arm-smmu-v3.4.auto: event: F_TRANSLATION client: 0000:87:00.0 sid: 0x8700 ssid: 0x0 iova: 0x272f7900 ipa: 0x272f7000
[  421.129512] arm-smmu-v3 arm-smmu-v3.4.auto: unpriv data write s1 "Input address caused fault" stag: 0x0
[  421.241596] arm-smmu-v3 arm-smmu-v3.4.auto: event 0x10 received:
[  421.313241] arm-smmu-v3 arm-smmu-v3.4.auto:  0x0000870000000010
[  421.383856] arm-smmu-v3 arm-smmu-v3.4.auto:  0x0000020000000000
[  421.454470] arm-smmu-v3 arm-smmu-v3.4.auto:  0x00000000272f7800
[  421.525091] arm-smmu-v3 arm-smmu-v3.4.auto:  0x00000000272f7000

第二次尝试: 让不要加载

echo "blacklist megaraid_sas" | sudo tee /etc/modprobe.d/blacklist-megaraid.conf
sudo dracut -f -v
sudo lsinitrd /boot/initramfs-6.17.1-300.fc43.aarch64.img | grep mega
-rw-r--r--   1 root     root           23 Oct 14 08:00 etc/modprobe.d/blacklist-megaraid.conf
-rw-r--r--   1 root     root         3240 Oct  6 08:00 usr/lib/modules/6.17.1-300.fc43.aarch64/kernel/drivers/hid/hid-megaworld.ko.xz
drwxr-xr-x   2 root     root            0 Oct 14 08:00 usr/lib/modules/6.17.1-300.fc43.aarch64/kernel/drivers/scsi/megaraid
-rw-r--r--   1 root     root       100912 Oct  6 08:00 usr/lib/modules/6.17.1-300.fc43.aarch64/kernel/drivers/scsi/megaraid/megaraid_sas.ko.xz

第三次尝试: 直接移除掉 megaraid 驱动

sudo rm /usr/lib/modules/6.17.1-300.fc43.aarch64/kernel/drivers/scsi/megaraid/megaraid_sas.ko.xz
sudo depmod
sudo dracut -f -v

也没有作用,这个错误和驱动没有关系,总是会报错的:

[  128.670689] pci 0000:87:00.0: AER: can't recover (no error_detected callback)
[  128.755886] pci 0000:80:10.0: AER: device recovery failed
[  128.820289] pci 0000:80:10.0: aer_status: 0x00008000, aer_mask: 0x04500000
[  128.902303] pci 0000:80:10.0:    [15] CmpltAbrt              (First)
[  128.978106] pci 0000:80:10.0: aer_layer=Transaction Layer, aer_agent=Completer ID
[  129.067381] pci 0000:80:10.0: aer_uncor_severity: 0x00462030
[  129.134888] pci 0000:80:10.0: AER:   TLP Header: 0x40000010 0x870000ff 0x27af9700 0x00000000

arm iommu 也许可以通过 ai 快速掌握吧

oe 的 workaround 技术就是这个了:

static void arm_smmu_install_bypass_ste_for_dev(struct arm_smmu_device *smmu,
				    u32 sid)
{
	u64 val;
	__le64 *step = arm_smmu_get_step_for_sid(smmu, sid);

	if (!step)
		return;

	val = STRTAB_STE_0_V;
	val |= FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_BYPASS);
	step[0] = cpu_to_le64(val);
	step[1] = cpu_to_le64(FIELD_PREP(STRTAB_STE_1_SHCFG,
	STRTAB_STE_1_SHCFG_INCOMING));
	step[2] = 0;
}

本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。