AN889の日記

組込みエンジニアのブログ

【Yocto】NXP QorIQプロセッサ向けLinuxでのCONFIG_SMP

NXPのQorIQシリーズのT1014プロセッサー*1は一コアなので、これのLinuxビルドでカーネルコンフィギュレーションのCONFIG_SMP(Symmetric Multi-Processing support)を無効にしたところ、ネットワークが使えなくなりました。 QorIQシリーズにはDPAA(Data Path Acceleration Architecture)というネットワーク高速化処理機構があります。DPAAはいくつかの機能から構成されるのですが、このうちのBMAN(Buffer manager)とQMAN(Queue manager)が CONFIG_SMP 無効で使えなくなるためでした。ドライバーの初期化が失敗します。カーネルログです。

bman_portal ff4000000.bman-portal: unable to set IRQ affinity
bman_portal ff4000000.bman-portal: init_pcfg: Portal failure on cpu 0
bman_portal ff4000000.bman-portal: portal init failed
qman_ccsr ffe318000.qman: Allocated PFDR 0x3c000000 0x2000000
qman_portal ff6000000.qman-portal: unable to set IRQ affinity
qman_portal ff6000000.qman-portal: init_pcfg: Portal failure on cpu 0
qman_portal ff6000000.qman-portal: portal init failed
fsl_dpa dpaa-ethernet.0: failing probe due to bman portals probe error

カーネルバージョン4.14*2で具体的に説明します(4.19*3も同じです)。 BMAN、QMANのドライバーはdrivers/soc/fsl/qbman/にあります。BMANドライバーの初期化失敗までの流れです。

bman_portal.c: bman_portals_probed() 
 ↓
bman_portal.c: init_pcfg()
 ↓
bman.c: bman_create_affine_portal()
 ↓
bman.c: bman_create_portal()
 ↓
dpaa_sys.h: dpaa_set_portal_irq_affinity() の irq_can_set_affinity() 呼出しが偽でエラー

このirq_can_set_affinity()include/linux/interrupt.hで宣言されてますが、CONFIG_SMP 無効だと

static inline int irq_can_set_affinity(unsigned int irq)
{
    return 0;
}

と実装されているためです。 QMANドライバーも同じくこの関数呼び出しでエラーになります。

一コアだから CONFIG_SMP 無効にしたいところですが仕方ないですね。