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:无法加载 PVRSRVKM/SGX 驱动程序

Guru**** 2551900 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/615731/linux-pvrsrvkm-sgx-driver-fails-to-load

主题中讨论的其他器件:DRA752

在 Linux 论坛上发布了我的查询,没有得到任何答复:

我们有一个基于 Jacinto 6的定制板,通过 Linux 4.45启动它时附带以下 SDK

ti-processor-sdk-linux-automotive-dra7xx-evm-03.02.00.03-installer.bin

加载 GPU 驱动程序'pvrsrvkm.ko"时遇到问题

#insmod pvrsrvkm.ko

[46.464932]  powerdomain:GPU_pwrdm:等待时间过长、无法完成转换
[46.634790]  powerdomain:GPU_pwrdm:等待时间过长、无法完成转换
[46.804621]  powerdomain:GPU_pwrdm:等待时间过长、无法完成转换
[46.814292]  OMAP-hwmod:GPU:_wait_target_ready 失败:-16
[46.982827]  powerdomain:GPU_pwrdm:等待时间过长、无法完成转换
[46.992798]  PVR_K:(错误):EnableSGXClocks:PM_Runtime_get_sync 失败(16)
[47.000075]  PVR_K:(错误):SysInitialize:无法启用系统时钟(175)

它看起来是 GPU Powerdomain 问题、在插入驱动程序时未解决。

为了确认这一点、我们显示了以下调试消息:

 

diff --git a/arch/arm/mach-omap2/prm44xx.c b/arch/arm/mach-omap2/prm44xx.c
索引8f26621..39a28ba 100644
-- a/arch/arm/mach-omap2/prm44xx.c
++ b/arch/arm/mach-omap2/prm44xx.c
@@-422、6 +422、8 @@静态空 omap44xx_PRM_CLEAR_LOSS_FLAGS_OLD (u8器件、S16安装、
 
 静态 int omar4_pwrdm_set_next pwrst (struct powerdomain * pwrdm、u8 pwrst)
 {
+      pr_alert ("OMAP4_pwrdm_set_next _pwrst 为%d\n"、pwrst);
+       
       OMAP4_prminst_RMW_inst_reg_bits (OMAP_powerstate_mask、
                                       (pwrst << omap_powerstate_shift)、
                                       pwrdm->prcm_partition、
@@-650、8 +652、29 @@静态 int omAP4_pwrdm_wait_transition (struct powerdomain * pwrdm)
              (C++< PWRdm_transition _援助))
               udelay (1);
 
+
/*      打开状态*/
+        if (!strcmp (pwrdm->name、"GPU_pwrdm"))
+      {
+              pr_info ("******* Insie OMAP4_PM_PWSTCTRL_WRITE ******* \n");
+              OMAP4_prminst_RMW_AP4_REG_Bits (0x3、3、pwrdm->prcm_partition、pwrdm->prcm_fs、OMinst_PM_PWSTCTRL);
+      }
+
+      if (!strcmp (pwrdm->name、"GPU_pwrdm"))
+      {
+              pr_alert (" READ_OMAP4_PM_PWSTCTRL 的值为%x\n"、OMAP4_prminst_Read_inst_reg (pwrdm->prcm_partition、pwrdm->prcm_fs、
+                                       OMAP4_PM_PWSTCTRL);
+      }
+
+        if (!strcmp (pwrdm->name、"GPU_pwrdm"))
+      {
+              pr_alert ("**" PM_PW_STCTRL_SGX 的值 is_prm4x %x\n"、OMAP4_prminst_read_inst_reg (pwrdm->prcm_partition、pwrdm->prcm_fs、OMAP4_PM_PWSTST);
+             /* pr_alert ("**PM_PW_STCTRL_SGX 的值为_1_prm4x %x\n"、 readl_relaxed (pwrdm->prcm_fs + OMAP4_PM_PWSTST));*/
+               
+      }
+
       if (c > PWRDM_TRANSION_EVAOUT){
-              pr_err ("powerdomain:%s:等待时间过长、无法完成转换\n"、
+              pr_err ("powerdomain!!!!!!!! :%s:等待时间过长,无法完成转换\n",
                      pwrdm->name);
               RETURN -EAGAIN;
       }

 

OMAP4_PM_PWSTST 读取"0x100000"、这意味着第20位被置位、并且正在进行电源域处理。尽管输入、我们可以将 OMAP4_PM_PWSTST 的值读取为0x37。

OMAP4_PM_PWSTST 和 OMAP4_PM_PWSTCTRL 的值以 dmesg 的两个不同间隔捕获

[0.000000]     正常区域:内存映射使用1536页
[0.000000]     正常区域:保留0页
[0.000000]     正常区域:196608页、LIFO 批处理:31
[0.000000]     HIGHMEM 区域:327167页、LIFO 批处理:31
[0.000000]   DRA752 ES1.1
[0.000000]   检查电源域是否始终处于打开状态***** 30000
[0.0000]*********    Insie OMAP4_PM_PWSTCTRL_WRITE *******
[0.000000]   READ_OMAP4_PM_PWSTCTRL 的值为30003
[0.000000]   PM_PW_STCTRL_SGX 的值为_prm4x 0
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   OMAP4_pwrdm_set_next _pwrst 为3
[0.000000]   检查电源域是否始终处于打开状态***** 30003.
[0.0000]*********    Insie OMAP4_PM_PWSTCTRL_WRITE *******
[0.000000]   READ_OMAP4_PM_PWSTCTRL 的值为30003
[0.000000]   PM_PW_STCTRL_SGX is _prm4x 37的值
[0.000000]   检查电源域是否始终处于打开状态***** 30003.
[0.0000]*********    Insie OMAP4_PM_PWSTCTRL_WRITE *******
[0.000000]   READ_OMAP4_PM_PWSTCTRL 的值为30003
[0.000000]   PM_PW_STCTRL_SGX is _prm4x 37的值
[0.000000]   PERCPU:嵌入式12页/CPU @eef34000 s19584 r8192 d21376 u49152
[0.000000]   pcpu-alloc:s19584 r8192 d21376 u49152 alloc=12*4096
[0.000000]   pcpu-alloc:[0][1] 1.

 

[2.823839]   TI OMAP4 +器件的电源管理。
[2.828743]   OMAP4_pwrdm_set_next _pwrst 为0
[2.832974]   OMAP4_pwrdm_set_next _pwrst 为0
[2.837177]   OMAP4_pwrdm_set_next _pwrst 为0
[2.841404]   OMAP4_pwrdm_set_next _pwrst 为0
[2.845608]   OMAP4_pwrdm_set_next _pwrst 为0
[2.849835]   OMAP4_pwrdm_set_next _pwrst 为0
[2.854038]   OMAP4_pwrdm_set_next _pwrst 为0
[2.858239]   OMAP4_pwrdm_set_next _pwrst 为0
[2.862462]   OMAP4_pwrdm_set_next _pwrst 为1
[2.866664]   OMAP4_pwrdm_set_next _pwrst 为0
[2.870895]   OMAP4_pwrdm_set_next _pwrst 为3
[2.875098]   OMAP4_pwrdm_set_next _pwrst 为0
[2.879302]   OMAP4_pwrdm_set_next _pwrst 为0
[2.883523]   OMAP4_pwrdm_set_next _pwrst 为0
[2.887725]   OMAP4_pwrdm_set_next _pwrst 为0
[2.891953]   OMAP4_pwrdm_set_next _pwrst 为0
[2.896171]   OMAP4_pwrdm_set_next _pwrst 为3
[2.900402]   OMAP4_pwrdm_set_next _pwrst 为3
[2.904648]   检查电源域是否始终打开***** 30000
[2.910155    Insie OMAP4_PM_PWSTCTRL_WRITE *******
[2.915750]   READ_OMAP4_PM_PWSTCTRL 的值为30003
[2.920734]   PM_PW_STCTRL_SGX is _prm4x 0的四个值
[2.925720]   检查电源域是否始终打开***** 30003.
[2.931226    Insie OMAP4_PM_PWSTCTRL_WRITE *******
[2.936821]   READ_OMAP4_PM_PWSTCTRL 的值为30003
[2.941804]   PM_PW_STCTRL_SGX 是_prm4x 0的四个值

 

有人能告诉我们,为什么在插入驱动程序时电源域关闭?

似乎,SGX 模块的 Power Domain 在重置或进入空闲状态后从未出现。

这就是我们为使 SGX 模块始终保持活动状态所做的工作:

diff --git a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
索引 e564f92..c5742cb 100644
-- a/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
++ b/arch/arm/mach-omap2/omap_hwmod_7xx_data.c
@@-1256、6 +1256、7 @@静态结构 omap_hwmod dra7xx_gp_hwmod ={
.class =&dra7xx_GPU_hwmod_class、
clkdm_name ="GPU_clkdm"、
main_clk ="GPU_core_gclk_mux"、
+.flags = HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET、
.prcm ={
.OMAP4 ={
clkctrl_offs = DRA7XX_CM_GPU_GPU_CLKCTRL_offset、
(结束)

现在、我们实际上看不到[46.464932] powerdomain:GPU_pwrdm:等待太长时间才能完成转换消息和 SGX/GPU 状态
位于/sys/power/state 上

此外,在加载 pvrsrvkm.ko 时,我们还会看到这些消息

insmod /run/media/axsb/lib/modules/4.4.45/extra/pvrsrvkm.ko
[50.506713][DRM]在次要0上初始化 PVR 1.14.3699939 20110701
[50.512952] OMAP_L3_NOC 44000000.OCP:L3应用程序错误:目标2 mod:1 (不可清除)
[50.512964] OMA_L3_NOC 440000.OCP:L3调试错误:目标2 mod:1 (不可清除)

是否有人可以确认我们,pvrsrvkm.ko 是否存在“L3应用程序错误”或其他一些一般问题?

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

    我已将您的问题转发给图形专家。

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

    好的、谢谢。 非常感谢!

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

    在启动过程中或在 pvrsrvkm.ko 重新加载时,我无法看到任何 PVR 错误。
    请向我们提供重现这一问题的确切步骤。

    关于"L3应用程序错误"。
    您是否会发送整个引导日志(包括崩溃转储)。

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

    由于两周内没有您的活动、我将关闭该主题。
    如果您对此主题有任何其他疑问、请在此处写下并重新打开。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉 Nikolay 的详细回答、我已经离开了。

    我们实际上通过将 GPU 稳压器置于 DTS 文件中的"始终开启"域来修复它。

    此修复程序是否对您有所帮助?

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

    好的、只需注意一点。 这将增加器件消耗。

    此致、
    尼古拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、你认为应该有其他的"适当的"解决方法吗?

    如果将 GPIO 稳压器保持在"始终开启"的域上、GPU 电源管理毫无意义。

    谢谢
    Amit
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不、我不这么做。
    在启动过程中或在 pvrsrvkm.ko 重新加载时,我无法看到任何 PVR 错误。
    您的定制设备上使用了哪个.dts 文件?

    谢谢、
    尼古拉