OpenNuvoton / MA35D1_linux-5.10.y

MA35D1 Linux 5.10.y
Other
6 stars 9 forks source link

How MA35D1 can enable FIQ like NUC980 serials? #7

Closed haimingweili closed 3 months ago

haimingweili commented 3 months ago
  1. 目前我们项目产品正在进行升级,原有的产品使用的是NUC980系列,在我们程序开发过程中使用了NUC980关于FIQ的例程,使应用程序可以监测到不可屏蔽中断,进而做出低延迟反应,我们已购入MA35D16F987C开发板,根据数据手册对比,外设部分基本兼容,但是不知道能否开启FIQ中断,看GIC-400手册是支持FIQ中断,不知是否有关于FIQ使用例程?
  2. 在使用定时器开发时,加载新塘定时器驱动,定时器可以正常产生周期中断,我们需要将定时器驱动模块引入到我们开发的模块中,我们模块对特定中断使用EXPORT_SYMBOL进行了导出操作,在使能定时器GIC中断,并使能定时器中断后,出现中断只响应一次的情况,因为64位CPU我们是第一次使用,请问关于CPU部分是否有其他特殊的设置,比如需要设置中断组或者是其他寄存器? 以下是部分关于GIC改动代码: `static void exception_irq_entry gic_handle_irq(struct pt_regs regs) { u32 irqstat, irqnr; struct gic_chip_data gic = &gic_data[0]; void iomem *cpu_base = gic_data_cpu_base(gic);

    do { irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK); irqnr = irqstat & GICC_IAR_INT_ID_MASK;

    if (unlikely(irqnr >= 1020))
        break;
    
    if (static_branch_likely(&supports_deactivate_key))
        writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
    isb();
    
    /*
     * Ensure any shared data written by the CPU sending the IPI
     * is read after we've read the ACK register on the GIC.
     *
     * Pairs with the write barrier in gic_ipi_send_mask
     */
    if (irqnr <= 15) {
        smp_rmb();
    
        /*
         * The GIC encodes the source CPU in GICC_IAR,
         * leading to the deactivation to fail if not
         * written back as is to GICC_EOI.  Stash the INTID
         * away for gic_eoi_irq() to write back.  This only
         * works because we don't nest SGIs...
         */
        this_cpu_write(sgi_intid, irqstat);
    }
    
    if (irqnr == TMR2_IRQ) {
        pr_info("Enter the TMR2 IRQ... \n");
        /* Do IRQ handle */
        if (g_mod_handle_irq) {
            g_mod_handle_irq(irqnr);
        }
    } else {
        if (handle_domain_irq(gic->domain, irqnr, regs)) {
            WARN_ONCE(true, "Unexpected interrupt received!\n");
        }
    }

    } while (1); } EXPORT_SYMBOL(g_mod_handle_irq);`

ychuang3 commented 3 months ago

Linux kernel 中 Cortex-A35 的中斷處理由 GIC 驅動程序處理。GIC 驅動程序支援 IRQ,但不支援 FIQ。 請問為何需要使用 FIQ ? 有甚麼特別的需求? 可以考慮 MA35D1 的 RTP M4 ,或是採用 AMP 架構 (CPU0 run Linux, CPU1 run non-os) 由單獨 CPU 專門負責執行time critical 的任務

haimingweili commented 3 months ago

Linux kernel 中 Cortex-A35 的中斷處理由 GIC 驅動程序處理。GIC 驅動程序支援 IRQ,但不支援 FIQ。 請問為何需要使用 FIQ ? 有甚麼特別的需求? 可以考慮 MA35D1 的 RTP M4 ,或是採用 AMP 架構 (CPU0 run Linux, CPU1 run non-os) 由單獨 CPU 專門負責執行time critical 的任務

目前我们设备主要用于电力,为应对突发状况需要快速响应,从而避免一些设备故障,在NUC980中可以使用FIQ,我们想升级芯片获取更高性能,M4我们有考虑,但是更倾向于更高性能的A35,请问如果想使用AMP架构,我需要参考那些例程或者您这边可以提供一些相关资料吗?

ychuang3 commented 3 months ago

AMP 工作模式已經有客戶採用,您可以參考 https://github.com/wosayttn/sdk-bsp-ma35d1-evb-aarch32-heterogeneous 說明 這是 MA35D1 CPU0 跑 Linux, CPU1 跑 RT_Thread。

簡單來說 Buildroot menuconfig 勾選如下設定即可 image

然後把 CPU1 運行 的 RT-Thread, 或是 Non-OS code 放到 buildroot output/image 目錄下 檔名如截圖所示 AmpCore1.bin, 檔名是可以修改的。

如果 CPU1 要跑 RT-Thread,請參考上述連結

如果 CPU1 要跑 Non-OS,請使用 MA35D1 Non-OS BSP,SampleCode\AmpCore1 可以直接編譯出 AmpCore1.bin。

haimingweili commented 3 months ago

AMP 工作模式已經有客戶採用,您可以參考 https://github.com/wosayttn/sdk-bsp-ma35d1-evb-aarch32-heterogeneous 說明 這是 MA35D1 CPU0 跑 Linux, CPU1 跑 RT_Thread。

簡單來說 Buildroot menuconfig 勾選如下設定即可 image

然後把 CPU1 運行 的 RT-Thread, 或是 Non-OS code 放到 buildroot output/image 目錄下 檔名如截圖所示 AmpCore1.bin, 檔名是可以修改的。

如果 CPU1 要跑 RT-Thread,請參考上述連結

如果 CPU1 要跑 Non-OS,請使用 MA35D1 Non-OS BSP,SampleCode\AmpCore1 可以直接編譯出 AmpCore1.bin。

好的,我按照例程测试一下,非常感谢。

haimingweili commented 3 months ago

通过buildroot编译和烧写固件之后,可以验证多核AMP架构下,CPU0和CPU1可以独立运行操作系统,运行状态很好,我参考了 MA35D1 Non-OS BSP的例程,看到OpenAMP的例程只涉及到RTP M4和A35的交互,A35-0和A35-1之间是否也可以通过OpenAMP进行交互,目前有没有相关例程呢?

ychuang3 commented 3 months ago

A35 與 M4 之間有 Wormhole 硬件支援交互,但是 A35 核之間並沒有。 目前我們在開發中,可能 4月底 才會有初版 release。 AMP 應用的 application note 文件也在撰寫中。

建議暫時的作法, Linux 在 device tree 設定一塊內存為 reserved memory,劃分為 CPU0->CPU1, CPU1->CPU0, 及 control 區塊,先用這種方式做簡單溝通。等到我們完成 A35 雙核之間的 repmsg 通訊支援,再做轉換。

另外提醒,Non-OS BSP AMP 範例使用 UART16 打印,但是在 TF-A 是將 UART16 設定給 RTP M4 使用,需要修改才能給 A35 用來打印訊息。 修改檔案 buildroot/output/build/arm-trusted-firmware-custom/fdts/ma35d1.dtsi 將 改為 。 重新編譯
make arm-trusted-firmware-rebuild

haimingweili commented 3 months ago

A35 與 M4 之間有 Wormhole 硬件支援交互,但是 A35 核之間並沒有。 目前我們在開發中,可能 4月底 才會有初版 release。 AMP 應用的 application note 文件也在撰寫中。

建議暫時的作法, Linux 在 device tree 設定一塊內存為 reserved memory,劃分為 CPU0->CPU1, CPU1->CPU0, 及 control 區塊,先用這種方式做簡單溝通。等到我們完成 A35 雙核之間的 repmsg 通訊支援,再做轉換。

另外提醒,Non-OS BSP AMP 範例使用 UART16 打印,但是在 TF-A 是將 UART16 設定給 RTP M4 使用,需要修改才能給 A35 用來打印訊息。 修改檔案 buildroot/output/build/arm-trusted-firmware-custom/fdts/ma35d1.dtsi 將 改為 。 重新編譯 make arm-trusted-firmware-rebuild

好的,明白,多谢支持!