This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/66AK2H12:从 Linux 用户空间读取 PCIe 条形寄存器时发生分段故障

Guru**** 2569255 points
Other Parts Discussed in Thread: TMS320C6678, 66AK2H12

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/625790/linux-66ak2h12-segmentation-fault-occurs-while-reading-pcie-bar-registers-from-linux-user-space

器件型号:66AK2H12
Thread 中讨论的其他器件:TMS320C6678

工具/软件:Linux

您好!

在我们的定制板中、Keystone2 (66AK2H12)连接到2个 Keystone 1 (tms320c6678)处理器(即 PCIe 开关)。 我们尝试通过 PCIe 引导 K1处理器。 我们交叉编译了 TI 提供的 Linux 主机 PCIe 示例(pciedemo.c)、并移植到其中一个 K2中。 它工作正常(成功引导一个 K1)。 因此、我们修改了 Linux 主机 PCIe 代码(pciedemo.c)以支持 sysfs、以便用户可以直接加载其应用程序(*。out)、而无需转换为十六进制格式。

首先、我们使用 sysfs 创建了 pciedemo.ko 模块、该模块成功插入内核(已知 thro PCIe 条形寄存器由 setpci 命令读取、并创建字符设备)

当我们尝试从用户空间访问应用寄存器 thro PCIe bar0时、会出现此问题。 在读取条形寄存器时、我遇到未处理的分割故障、但不是以书面形式。 为了供您参考、我提供了代码片段。

pcie_drv_inst[dev_id].bar_info[0].virtAddr =  

(void *) mmap (NULL、pcie_drv_inst[dev_id].bar_info[0]。length、
(PROT_READ | PROT_WRITE)、
map_shared、pci_drv_inst[dev_id].dev_desc、(off_t) pci_drv_inst[dev_id].bar_info[0].pcieAddr);

/* PCIe 应用寄存器虚拟地址(映射到 PCI 窗口)*/
#define PCI_REGV (MINOR、reg)(无符号*)(PCIe_drv_inst[MINOR).bar_info[0]。virtAddr + reg)

bar_num =*(PCI_REGV (DSP_id、IB_bar (IB_TRANS_Num)))/* 出现未处理的分割故障*/

*(PCI_REGV (DSP_id、IB_bar (IB_TRANS_num)))= bar_num;//无错误,但不知道写入的位置!!!! *

我对虚拟内存支持的疑问是、PCIe 基础驱动程序中还需要注意哪些事项?

注意:我们使用的是 ti git repo 提供的 Linux 3.10。 配置为32位模式的 PCIe 指示条。

请就此提供帮助?

此致、

S.Sivanantam  

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我们的板具有一个 Keystone2和两个 Keystone1处理器。

    此致、
    S.Sivanantam
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们将对此进行研究。 反馈将在可用时发布在此处。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用了 devmem2来访问寄存器、如果枚举了器件、它似乎起作用。 当您通过 sysfs 进行访问时、我认为该器件需要处于启动状态。

    雷克斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的回复。 我能够使用 devmem2访问寄存器。

    我遇到了与 我们的板(DSPC8682E)相似的 Advantech 板(连接:(PC) x86 -> PCIe 交换机-> 8 tms320c6678)

    我们的电路板连接是66AK2H12 -> PCIe 交换机-> 2 tms320c6678。 我修改了代码并交叉编译了代码并将其移植到了我们的电路板中。

    模块已成功插入、它已成功将器件添加到 sysfs.Log 中、如下所示

    root@tisbc:~/BEL_PCIe#./load.sh
    [168.975213] dspc868x_PCIe_EP:找到 TI667x PCIe EP @0xde81f000
    [168.981143] dspc868x_PCIe_EP:在此系统中检测1个 DSP
    [168.986707] dspc868x_PCIe_EP 0000:04:00.0:DSPC868x 探头
    [168.992308] dspc868x_PCIe_EP 0000:04:00.0:分配主要246次要0
    [168.998932] dspc868x_PCIe_EP 0000:04:00.0:已将器件添加到系统文件系统
    [169.006226] dspc868x_PCIe_EP 0000:04:00.0:  条形配置:
    [169.0121] dspc868x_PCIe_EP 0000:04:00.0:  开始          |      长度         |      标志
    [169.018538] dspc868x_PCIe_EP 0000:04:00.0:  0x52000000     |      00004096       |      0x00040200
    [169.025817] dspc868x_PCIe_EP 0000:04:00.0:  0x51800000     |      04194304       |      0x00042208
    [169.033154] dspc868x_PCIe_EP 0000:04:00.0:  0x51c00000     |      04194304       |      0x00042208
    [169.040434] dspc868x_PCIe_EP 0000:04:00.0:  0x51000000     |      08388608       |      0x00042208
    [169.047709] dspc868x_PCIe_EP 0000:04:00.0:映射到0xe08bc000的 TI667X 寄存器
    [169.055167] dspc868x_PCIe_EP 0000:04:00.0:器件以小端模式运行

    我使用以下命令验证了相同的情况

    "LS /dev/dspc_868x_0

    root@tisbc:~/BEL_PCIe# ls /dev/dspc868x_dsp_0
    /dev/dspc868x_dsp_0

    当我运行 DSP_Loader 应用程序时、我会收到以下错误、这与我之前在上述帖子中提到的错误相同
    在 pcie_drv.c (ti667x_EP_init_bar 函数)中通过虚拟内存指针(由 mmap 函数分配)读取数据时会发生此错误

    /DSP_Loader 查询列表
    [178.457140] 未处理的故障:0x1210 (0x1210)位于 bb6f8e300
    总线错误
    2017年6月22日01:32:58 tisbc [178.457140] 未处理的故障:0x1210 (位于 bb6f8e300)上的同步外部中止(0x1210)

    您还可以通过连接 K2 EVM 和 K1 EVM thro PCIe 来模拟上述问题。

    随函附上经修改的代码。

    请建议使用虚拟内存指针访问。

    此致、

    S.Sivananthame2e.ti.com/.../6354.BEL_5F00_PCIe_5F00_boot_5F00_code.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Sivanantam、

    我认为、如果您可以使用 devmem2访问地址、与 devmem2进行比较可能会获得一些有用的信息。

    雷克斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的输入。 我已经完成了代码。 当我将偏移设为0时、我认为偏移是个问题。 它 对几个字执行正确的读取和写入。 但批量读取和写入会产生位错误。   与虚拟内存高速缓存或虚拟页面设置相关的还有其他事项吗?


    此致、

    S.Sivanantam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    除上述内容外、虚拟内存页大小是否有任何限制? 因为 devmem2.c 使用4096字节、而我的代码的长度分别为4KB (bar 0应用)、4MB (bar1 L2SRAM)、4MB (Bar2 MSMC RAM)、8MB (Bar3 DDR3)。 我比较了这两个代码、发现了上述差异。

    请澄清。

    此致、

    S.Sivanantam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    现在、我能够通过 PCIe 启动处理器。 我按照 devmem2.c 打开了带有/dev/mem 的驱动程序

    我分配了条和长度、然后它开始工作。 我不知道为什么/dev/dspc_868x_dsp0 path 不起作用。 我正在对此进行调查。

    如果您对此有任何意见、请分享。

    此致、

    S.Sivanantam

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Sivanatham、

    很高兴您解决了问题。 我的目的是访问物理内存、/dev/mem 是有道理的。

    雷克斯