gpt4 book ai didi

linux-kernel - 使用 32 位操作执行 ioread/write64

转载 作者:行者123 更新时间:2023-12-02 03:40:56 25 4
gpt4 key购买 nike

我正在使用旋风 V 在双端口 RAM (HPS_master->FPGA_slave) 上执行读/写。对于 32 位数据,它可以通过使用 ioread32 和 iowrite32 来执行,但它不能满足我们的数据传输目标速度(在仅调整到 400MHz 后在信号选项卡中需要更长的周期)。Cyclone V 使用 ARM Cortex-A9 MPCore 处理器( 32 位),但如数据表中所述,AXI 总线能够配置高达 64 位。 asm/io.h 只支持到 ioread32/iowrite32。我们尝试使用 altera 软件在 HPS-FPGA 中配置 64 位,我尝试使用下面的代码进行读/写,但我得到了错误的数据。任何适当的解决方案和方法来验证这一点?

static void iowrite64(u64 val,  u64 addr)
{
iowrite32((u32)val, (u32) addr);
iowrite32(val >> 32, (u32)addr + 1);
}
static u64 ioread64 (u64 addr)
{
return ioread32(addr) | ((u64)ioread32((u32)addr + 1) << 32);
}

更新/解决方案:我们能够从 logram 中读取 64 位数据。以下是我们所做的更改。
-driver/amba/bus.c,我们把u32改成u64。
- 我们在 io.h 中添加另一个内联函数
    static inline u64 __raw_readq(const volatile void __iomem *addr)
{
u64 val;
asm volatile("ldrd r2, %0" : "+Qo" (*(volatile u64 __force *)addr));
register u32 v1 asm ("r2");
val = v1;
register u32 v2 asm ("r3");
val=(val<<32) | v2;
return val;
}

-printk 最多可以打印 32 位,但我们打印 2 次。

最佳答案

这些 ARM 版本位于 arch/arm/include/asm/io.h . iowrite32宏最终会调用这些。您可以查看 32 位的实现。

static inline void __raw_writel(u32 val, volatile void __iomem *addr)
{
asm volatile("str %1, %0"
: "+Qo" (*(volatile u32 __force *)addr)
: "r" (val));
}

有一条名为 strd 的 ARMv5+ 指令它需要两个寄存器并写入它们。如果您的 BUS 结构配置正确,它可能会将其作为单个循环运行。但是,您需要正确设置许多其他内容。 I/O 页面的 MMU 权限以及 ARM AXI 到 FPGA 设备的物理/FPGA 连接。

64 位 ARM 汇编器值没有公共(public) gcc 约束。正如调用约定将它们放在 r0 中一样和 r1我们可以使函数永远不会内联。
static noinline void __raw_write64(u64 val, volatile void __iomem *addr)
{
register u32 v1 asm ("r0") = val >> 32;
register u32 v2 asm ("r1") = val & 0xfffffffUL;
asm volatile("strd r0, %0"
: "+Qo" (*(volatile u64 __force *)addr)
: "r" (v1), "r" (v2));
}

这至少可以使用 objdump 生成良好的代码,但您可能需要对其进行润色以提高生产质量。

这至少是所需的代码。我认为默认情况下设备内存应该是不可缓存和不可缓冲的。您可能还需要屏障类型说明。

关于linux-kernel - 使用 32 位操作执行 ioread/write64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20088419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com