强制打开BIOS中禁用的I/OAT DCA(二)

上文提到打开R410中I/OAT DCA特性, 是通过在用户层控制.

还有一种可以直接修改内核DMA I/OAT 驱动可以做到. google搜索到的 :)

首先打开内核支持:

Device Drivers ---> DMA Engine support ---> Intel I/OAT DMA support

添加修改寄存器函数, 详细可看前篇.

// 修改CPU MSR寄存器 static void dca_force_msr(void *dummy) { uint32_t data1, data2; rdmsr(MSR_P6_DCA_CAP, data1, data2); if (!(data1 & 1)) data1 |= 1; wrmsr(MSR_P6_DCA_CAP, data1, data2); } #define INTEL_BRIDGE_DCAEN_OFFSET 0x64 #define INTEL_BRIDGE_DCAEN_BIT 6 // 修改PCI配置寄存器 void dca_force(void) { struct pci_dev *pdev = NULL; /* enable DCA in intel upstream bridges */ for_each_pci_dev(pdev) { if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE && pdev->vendor == PCI_VENDOR_ID_INTEL && !pdev->bus->self) { u32 val; int ret; ret = pci_read_config_dword(pdev, INTEL_BRIDGE_DCAEN_OFFSET, &val); if (ret < 0) continue; if (!(val & (1<<INTEL_BRIDGE_DCAEN_BIT))) { dev_printk(KERN_INFO, &pdev->dev, "enabling DCA in upstream bridge/n"); val |= 1<<INTEL_BRIDGE_DCAEN_BIT; pci_write_config_dword(pdev, INTEL_BRIDGE_DCAEN_OFFSET, val); } } } /* enable DCA in processors */ on_each_cpu(dca_force_msr, NULL, 1); }

以下是详细的patch, Kernel version 2.6.29.5

diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index f4e505f..1e83796 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h @@ -85,6 +85,7 @@ #define MSR_P6_PERFCTR1 0x000000c2 #define MSR_P6_EVNTSEL0 0x00000186 #define MSR_P6_EVNTSEL1 0x00000187 +#define MSR_P6_DCA_CAP 0x000001f8 /* AMD64 MSRs. Not complete. See the architecture manual for a more complete list. */ diff --git a/drivers/dma/ioat.c b/drivers/dma/ioat.c index ed83dd9..8af1960 100644 --- a/drivers/dma/ioat.c +++ b/drivers/dma/ioat.c @@ -71,10 +71,16 @@ static int __devinit ioat_probe(struct pci_dev *pdev, const struct pci_device_id *id); static void __devexit ioat_remove(struct pci_dev *pdev); +void dca_force(void); + static int ioat_dca_enabled = 1; module_param(ioat_dca_enabled, int, 0644); MODULE_PARM_DESC(ioat_dca_enabled, "control support of dca service (default: 1)"); +static int ioat_dca_force = 0; +module_param(ioat_dca_force, int, 0644); +MODULE_PARM_DESC(ioat_dca_force, "enforce dca in upstream bridges and processors (default: 0)"); + static struct pci_driver ioat_pci_driver = { .name = "ioatdma", .id_table = ioat_pci_tbl, @@ -191,6 +197,9 @@ static void __devexit ioat_remove(struct pci_dev *pdev) static int __init ioat_init_module(void) { + if (ioat_dca_force) + dca_force(); + return pci_register_driver(&ioat_pci_driver); } module_init(ioat_init_module); diff --git a/drivers/dma/ioat_dca.c b/drivers/dma/ioat_dca.c index c012a1e..3f45f78 100644 --- a/drivers/dma/ioat_dca.c +++ b/drivers/dma/ioat_dca.c @@ -88,6 +88,45 @@ static inline u16 dcaid_from_pcidev(struct pci_dev *pci) return (pci->bus->number << 8) | pci->devfn; } +static void dca_force_msr(void *dummy) +{ + uint32_t data1, data2; + rdmsr(MSR_P6_DCA_CAP, data1, data2); + if (!(data1 & 1)) + data1 |= 1; + wrmsr(MSR_P6_DCA_CAP, data1, data2); +} + +#define INTEL_BRIDGE_DCAEN_OFFSET 0x64 +#define INTEL_BRIDGE_DCAEN_BIT 6 + +void dca_force(void) +{ + struct pci_dev *pdev = NULL; + + /* enable DCA in intel upstream bridges */ + for_each_pci_dev(pdev) { + if (pdev->hdr_type == PCI_HEADER_TYPE_BRIDGE + && pdev->vendor == PCI_VENDOR_ID_INTEL + && !pdev->bus->self) { + u32 val; + int ret; + + ret = pci_read_config_dword(pdev, INTEL_BRIDGE_DCAEN_OFFSET, &val); + if (ret < 0) + continue; + if (!(val & (1<<INTEL_BRIDGE_DCAEN_BIT))) { + dev_printk(KERN_INFO, &pdev->dev, "enabling DCA in upstream bridge/n"); + val |= 1<<INTEL_BRIDGE_DCAEN_BIT; + pci_write_config_dword(pdev, INTEL_BRIDGE_DCAEN_OFFSET, val); + } + } + } + + /* enable DCA in processors */ + on_each_cpu(dca_force_msr, NULL, 1); +} + static int dca_enabled_in_bios(struct pci_dev *pdev) { /* CPUID level 9 returns DCA configuration */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!感谢您的提问。根据您的描述,这是一个关于PackageManager的错误日志,表明在解析 /system/framework/oat 目录时出现了问题,缺少了基本 APK 文件。 在Android系统oat目录存储了经过优化的dex文件,以提高应用程序的运行效率。而基本APK文件则是应用程序的核心安装包。根据错误提示,系统无法在 /system/framework/oat 目录找到基本APK文件,导致解析失败。 这个问题可能是由于系统文件的损坏或缺失引起的。为了解决这个问题,您可以尝试以下步骤: 1. 清除应用程序缓存:在设备的设置找到应用程序管理器,然后找到PackageManager相关的应用程序(例如Google Play Store),清除其缓存。 2. 检查系统文件完整性:如果清除缓存没有解决问题,您可以尝试使用系统自带的文件检查工具(如Android Recovery Mode)来检查和修复系统文件的完整性。 3. 刷机或恢复出厂设置:如果以上方法都无法解决问题,您可以考虑刷机或恢复出厂设置来重置系统,并重新安装应用程序。 请注意,在进行任何系统操作之前,请务必备份重要数据,并确保您对这些操作有足够的了解和经验,以避免意外数据丢失或设备损坏。 如果问题仍然存在,建议您咨询设备制造商或Android系统的支持团队,以获得更专业的帮助和指导。 希望以上信息对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值