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.

[参考译文] AM625:SDK 08:AM6252 remoteproc 在启动时崩溃

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1271494/am625-sdk-08-am6252-remoteproc-crash-on-boot

器件型号:AM625
主题中讨论的其他器件: TLV320AIC26

我们有一个使用 AM6254处理器的工作引导。  尝试启动 AM6252处理器时、我看到 Remoteproc 同步外部中止内核转储。 我的理解是、与6252的唯一区别在于它有2个 ARM 内核、而不是4个、但此错误似乎与此相矛盾。  有什么想法吗?

[   17.143823] k3-m4-rproc 5000000.m4fss: assigned reserved memory node m4f-dma-memory@9cb00000
[   17.221196] k3-m4-rproc 5000000.m4fss: configured M4 for remoteproc mode
[   17.285665] k3-m4-rproc 5000000.m4fss: local reset is deasserted for device
[   17.364848] remoteproc remoteproc0: 5000000.m4fss is available
[   17.397859] remoteproc remoteproc0: powering up 5000000.m4fss
[   17.403712] remoteproc remoteproc0: Booting fw image am62-mcu-m4f0_0-fw, size 54860
[   17.420106]  remoteproc0#vdev0buffer: assigned reserved memory node m4f-dma-memory@9cb00000
[   17.431819] virtio_rpmsg_bus virtio0: rpmsg host is online
[   17.443375]  remoteproc0#vdev0buffer: registered virtio0 (type 7)
[   17.449523] remoteproc remoteproc0: remote processor 5000000.m4fss is now up
[   17.463138] virtio_rpmsg_bus virtio0: creating channel ti.ipc4.ping-pong addr 0xd
[   17.471102] virtio_rpmsg_bus virtio0: creating channel rpmsg_chrdev addr 0xe
[   17.491528] Internal error: synchronous external abort: 96000010 [#1] PREEMPT SMP
[   17.499023] Modules linked in: dwc3_am62(+) rti_wdt(+) virtio_rpmsg_bus ti_k3_m4_remoteproc snd_soc_tlv320aic26 sa2ul pruss sha512_generic authenc cdns_dphy ltc2945 at24 sch_fq_codel cryptodev(O) ipv6
[   17.516894] CPU: 1 PID: 219 Comm: systemd-udevd Tainted: G           O      5.10.168-yocto-standard #1
[   17.526191] Hardware name: Critical Link MitySOM-AM62x (DT)
[   17.531760] pstate: 80000005 (Nzcv daif -PAN -UAO -TCO BTYPE=--)
[   17.537772] pc : rti_wdt_probe+0x1e8/0x4f0 [rti_wdt]
[   17.542738] lr : rti_wdt_probe+0x1d8/0x4f0 [rti_wdt]
[   17.547693] sp : ffff800011c5b920
[   17.550999] x29: ffff800011c5b920 x28: 0000000000000100 
[   17.556309] x27: ffff80001011c1a8 x26: 0000000000000003 
[   17.561615] x25: ffff800011603d98 x24: 000000000000004a 
[   17.566923] x23: ffff00000467a920 x22: ffff000002423400 
[   17.572231] x21: ffff00000467a890 x20: ffff000002423410 
[   17.577539] x19: ffff00000467a880 x18: 0000000000000000 
[   17.582848] x17: 0000000000000000 x16: 0000000000000000 
[   17.588155] x15: 0000000000000000 x14: ffff000005c0d580 
[   17.593463] x13: 0000000000000000 x12: ffff8000117dd000 
[   17.598769] x11: ffff8000117d7000 x10: 0000000000001000 
[   17.604078] x9 : ffff80001075c0fc x8 : ffff8000114c2b7c 
[   17.609389] x7 : 0000000000000041 x6 : 000000000000008b 
[   17.614697] x5 : 000000000e021000 x4 : ffff000002423610 
[   17.620005] x3 : ffff000005e5cd00 x2 : 0000000000000000 
[   17.625312] x1 : ffff000005c0b900 x0 : ffff8000117d5090 
[   17.630620] Call trace:
[   17.633071]  rti_wdt_probe+0x1e8/0x4f0 [rti_wdt]
[   17.637691]  platform_drv_probe+0x5c/0xb0
[   17.641695]  really_probe+0xf4/0x408
[   17.645266]  driver_probe_device+0x60/0xc0
[   17.649357]  device_driver_attach+0x7c/0x88
[   17.653533]  __driver_attach+0x70/0x100
[   17.657362]  bus_for_each_dev+0x78/0xc8
[   17.661192]  driver_attach+0x2c/0x38
[   17.664762]  bus_add_driver+0x15c/0x210
[   17.668592]  driver_register+0x6c/0x128
[   17.672423]  __platform_driver_register+0x50/0x60
[   17.677124]  rti_wdt_driver_init+0x2c/0x1000 [rti_wdt]
[   17.682260]  do_one_initcall+0x4c/0x2e0
[   17.686094]  do_init_module+0x50/0x210
[   17.689838]  load_module+0x20fc/0x27a8
[   17.693580]  __do_sys_finit_module+0xb8/0xf8
[   17.697843]  __arm64_sys_finit_module+0x28/0x38
[   17.702370]  el0_svc_common.constprop.0+0x80/0x1d0
[   17.707154]  do_el0_svc+0x2c/0xa8
[   17.710465]  el0_svc+0x20/0x30
[   17.713515]  el0_sync_handler+0xb0/0xb8
[   17.717343]  el0_sync+0x180/0x1c0
[   17.720659] Code: f9000260 b140041f 54001128 91024000 (b9400000) 
[   17.726748] ---[ end trace fbd7824ab88012ad ]---
[   17.797896] platform 78000000.r5f: R5F core may have been powered on by a different host, programmed state (0) != actual state (1)
[   17.923128] platform 78000000.r5f: configured R5F for IPC-only mode
[   17.988926] platform 78000000.r5f: assigned reserved memory node r5f-dma-memory@9da00000

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

    Jonathan、您好!

    Remoteproc 与您的错误无关。 Remoteproc 是控制处理器上的非 Linux 内核的 Linux 驱动程序。 因此、我们希望初始化 M4F 内核、然后连接到器件管理器(DM) R5F 内核、该内核应该在引导流程的早期已引导。 这正是正在发生的事情。

    您是否禁用了 AM6252器件上不包含的其他 A53内核? 请参考
    https://dev.ti.com/tirex/explore/node?node=A__AGMop5fjikXYw819LJNi-w__linux_academy_am62x__XaWts8R__LATEST

    我还没有在末尾尝试过、但我认为如果您不使用 Linux devicetree 来正确禁用不存在的 A53内核、可能会出现看门狗错误。

    此致、

    尼克

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

    Remoteproc 与您的错误无关。 Remoteproc 是控制处理器上的非 Linux 内核的 Linux 驱动程序。 因此、我们希望初始化 M4F 内核、然后连接到器件管理器(DM) R5F 内核、该内核应该在引导流程的早期已引导。 这正是正在发生的事情。

    您是否禁用了 AM6252器件上不包含的其他 A53内核? 请参考

    [/报价]

    删除内核不会删除此内核转储。

    感谢您为看门狗驱动程序提供的指针。

    [  17.633071] RTI_WDT_PROBE+0x1e8/0x4f0 [RTI_WDT]

    此驱动器可通过器件树启用5个不同的节点。 main_rti0、main_rti1、main_rti2、main_rti3、main_rti15。  我假设0-3表示不同的 ARM 内核。 rti15代表什么有什么想法吗?

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

    禁用 main_rti2、并且 main_rti3被要求用来去除内核转储。 注意还需要从 cluster0节点中删除核心,以防止出现 DTB 构建问题。  这在其他 e2e 文章中提到、但链接的 Linux 学院中没有提到。

    这应该添加到 https://dev.ti.com/tirex/explore/node?node=A__AGMop5fjikXYw819LJNi-w__linux_academy_am62x__XaWts8R__LATEST


    群集0 (&C)
    /delete-node/core2;
    /delete-node/core3;
    };

    &main_rti2
    状态="已禁用"
    };

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

    Jonathan、您好!

    感谢您回复您的解决方案! 我在下面的一个新常见问题解答中使用了您的终端输出和示例代码: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1272468/faq-am62ax-am62x-am64x-rti_wdt_probe-error-on-linux-boot

    RTI15与 GPU 相关联。 由于您的器件型号具有 GPU、RTI 将保持启用状态。 但是、如果您将来使用 AM623x 或 AM620x 进行任何设计、也将需要禁用 GPU RTI。

    此致、

    尼克

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

    很好、您是否忘记删除 CPU@2和 CPU@3节点、还是删除那些可选节点?

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

    Jonathan、您好!

    我不确定我是否理解您的问题。

    此时、引导流程不会检查 AM6254与 AM6252与 AM6231与等的情况。 因此、我们只为超集器件 AM6254编写一个 Linux devicetree、然后客户必须为不具备 AM6254所有特性的"子集"器件手动更新其 Linux devicetree。  

    我认为、在理论上、uboot 可以检查器件型号、然后修改 Linux devicetree 设置、但我们目前不需要该特性。 因此,将来可能会增加,但我现在不能保证。

    您的测试对我很有帮助、因为我的办公桌上只有超集器件、所以即使我禁用了超集器件上的 A53内核、我也不会看到这个错误。

    此致、

    尼克

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

    抱歉、Nick、我想我搞错了。 对应的典型公式。  它提到删除 cluster0/内核并禁用 RTI、但不会删除 CPU 节点。  

    CPU
    /delete-node/cpu@2;
    /delete-node/cpu@3;
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为 uboot 在理论上可以检查器件型号并修改 Linux devicetre 设置、但目前不需要该功能。 因此,它可能会在将来添加,但我不能保证它现在。[/报价]

    我为我们的 SOM 从事这项工作。  我目前将使用我们的出厂配置来确定内核数量以及是否存在 GPU。  您知道处理器中是否有可用来代替确定此信息的寄存器吗?

    此代码正常运行、只需要检测内核数量以及是否存在 GPU 即可。

    #include <common.h>
    #include <dm/ofnode.h>
    #include <fdt_support.h>
    #include <linux/libfdt.h>
    
    /*
     * Remove cpu nodes from the device tree based on the number of CPUs
     */
    int ft_fixup_cpu(void *blob, struct bd_info *bd, int num_present_cpus)
    {
    	int ret;
    	int nodeoffset;
    	char buf[64];
    
    	// Ex: For 2 present cpus, we want to disable cpu@2 and cpu@3
    	for (int cpu_num = 3; cpu_num >= num_present_cpus; cpu_num--) {
    		printf("%s: Disabling CPU %d\n", __func__, cpu_num);
    
    		/* Find the CPU node */
    		snprintf(buf, sizeof(buf), "/cpus/cpu@%d", cpu_num);
    		nodeoffset = fdt_path_offset(blob, buf);
    		if (nodeoffset < 0) {
    			printf("%s: Could not find %s node\n", __func__, buf);
    			return nodeoffset;
    		}
    
    		/* Delete the CPU node */
    		ret = fdt_del_node(blob, nodeoffset);
    		if (ret < 0) {
    			printf("%s: Could not delete %s node\n", __func__, buf);
    			return ret;
    		}
    
    		/* Find the cpu cluster node */
    		snprintf(buf, sizeof(buf), "/cpus/cpu-map/cluster0/core%d", cpu_num);
    		nodeoffset = fdt_path_offset(blob, buf);
    		if (nodeoffset < 0) {
    			printf("%s: Could not find %s node\n", __func__, buf);
    			return nodeoffset;
    		}
    
    		/* Delete the cpu cluster node */
    		ret = fdt_del_node(blob, nodeoffset);
    		if (ret < 0) {
    			printf("%s: Could not delete %s node\n", __func__, buf);
    			return ret;
    		}
    
    		/* Disable the cpu watchdog */
    		snprintf(buf, sizeof(buf), "main_rti%d", cpu_num);
    		ret = fdt_status_disabled_by_alias(blob, buf);
    		if (ret < 0) {
    			printf("%s: Could not disable %s node\n", __func__, buf);
    			return ret;
    		}
    	}
    
    	return ret;
    }
    
    /*
     * Remove gpu nodes from the device tree if gpu is not present
     */
    int ft_fixup_gpu(void *blob, struct bd_info *bd, bool gpu_present)
    {
    	int ret;
    
    	if (!gpu_present) {
    		printf("%s: Disabling GPU\n", __func__);
    
    		/* Disable the gpu node */
    		ret = fdt_status_disabled_by_alias(blob, "gpu");
    		if (ret < 0) {
    			printf("%s: Could not disable gpu node\n", __func__);
    			return ret;
    		}
    
    		/* Disable the gpu watchdog */
    		ret = fdt_status_disabled_by_alias(blob, "main_rti15");
    		if (ret < 0) {
    			printf("%s: Could not disable main_rti15 node\n", __func__);
    			return ret;
    		}
    	}
    
    	return ret;
    }
    
    /*
     * This function is called right before the kernel is booted. "blob" is the
     * device tree that will be passed to the kernel.
     */
    int ft_system_setup(void *blob, struct bd_info *bd)
    {
    	int ret = 0;
    
    	// Don't abort the boot if the device tree nodes can't be fixed up
    	(void)ft_fixup_cpu(blob, bd, 1);
    
    	(void)ft_fixup_gpu(blob, bd, false);
    
    	return ret;
    }

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

    Jonathan、您好!

    使用/delete-node/就足够了。 无需进行额外修改即可禁用未使用的 A53内核。

    有关 uboot 中的检测问题、请参阅以下主题:
    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1259573/processor-sdk-am62x-how-to-read-the-number-of-cpu-cores-under-uboot

    如果您需要 uboot 的其他支持、请告诉我、我会将您的主题传递给具有更多 uboot 体验的团队成员。

    此致、

    尼克

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

    感谢链接。  是否有可能通过寄存器确定速度等级?  目前我只希望 AM6231 SOM 不支持1.4GHz、但基于速度等级可以更好。

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

    没关系、这也是 USER_ID 寄存器的一部分。

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

    很高兴你找到了! 请随时提出后续问题、我可能只需要向另一位团队成员发送更详细的 uboot 问题以进行评论。

    如果您编写了任何认为我们应添加到 uboot 以自动检测器件并调整 devicetree 文件的很酷的代码、请随时在此处附加它、我会创建一个新要求并提供指向您的示例代码的链接。

    此致、

    尼克

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

    感谢您与我们 Jonathan 分享您的代码! 我已经开始并提出了 TI 的软件要求、希望 TI 可以考虑将自动检测功能添加到 uboot 中并以链接到您的代码为例。

    未来的读者、如果您想了解该要求是否已被接受、实施等的最新信息、请 在您询问时参考 SITREQ-3302 (或本主题)。

    此致、

    尼克