症状
Zynq で Linux Kernel 4.5以降 を動作させた時、"mmc0: Timeout waiting for hardware interrupt" が起きて SD-Card が読めません。
SD-Card に root file system を作っていた場合、Linux が起動出来なくなります。
原因
Linux Kernel 4.5 以降、なにやら sdhci ドライバ周りにかなり変更が入っています。その変更内容(特に ADMA 周り)が Zynq と相性悪いようです。
原因は別にあるようです。詳細は次の記事を参照してください。この記事の内容は古くなっていますが、参考のため残しておきます。
参考
対処方法
あくまでも暫定対策ですが、sdhci ドライバの ADMA を使わないようにします。
Linux メインラインの場合
手っ取り早く対処するには、bootargs に sdhci.debug_quirks=64 を追加します。
ちなみに 64 という数字は linux kernel の drivers/mmc/host/sdhci.h で次のように定義されている値です。
/* Controller has an unusable ADMA engine */
#define SDHCI_QUIRK_BROKEN_ADMA (1<<6)
この値を debug_quirks に設定していると、ADMA は BROKEN(壊れている?)と見なされて ADMA は使わないようになります。
Xilinx が提供する Linux の場合
Xilinx が提供している linux の場合、デバイスツリーで broken-adma2 プロパティを追加すると良いようです。