
Ubuntu日本語フォーラム
ログインしていません。
こんにちは、お世話になります。
デバイスドライバーを開発しようとしている者です。
Ubuntu18.4.2LTS 、カーネル4.18.20ソースコードを取得し、
CONFIG_DMA_CMA スイッチをONして構築
grubでカーネルパラメータにintel_iommu=on cma=256M を追加している環境です。
(パソコンはSINTRONES社 ABOX-5000-i5 車載用ファンレスPCです)
自前で開発のPCIeボードのDMA回路からPC側へDMA転送しようとしています。
Ubuntuの通常インストールではSSDがMBRパーティションタイプでフォーマット、インストールされます
この環境では自前のデバイスドライバーでボードレジスタへのDMA用アドレスの設定とスタート後に
メモリーへデータ転送されてきます。(ちなみにメモリ確保関数はdma_alloc_coherentで128MB確保)
問題は、ubuntuをUEFI(EFI)環境(SSDはGPTパーティションタイプ)にインストールしたときに
ボードレジスタへはアクセスできるのになぜかDMA転送されてこないという現象が起きております。
そこで、どなたかEFI環境下のDMA転送に関し、知識をお持ちの方、
カーネルのCONFIG、パラメータ、あるいはドライバの関数等で
何か情報をお持ちの方、何卒、ご教示をお願いいたします。
よろしくお願いいたします。
オフライン
自己レスです。
解決しました。
lspciコマンドで状況確認すると busmasterの項目がEFI環境の時、busmaster- となっておりました。
カーネルのソースをあらためて探索すると、内包ドライバのいくつかが BASMASTER を自分でONしているコードを見つけました
これに倣い、私のドライバにもBASMASTERだけ追加でONするようにしたところ、EFI環境でもDMA転送ができました。
probe関数の中で行う。
/* Set to BUSMASTER */
if(pci_read_config_word(dev, PCI_COMMAND, &command) == 0) {
command |= PCI_COMMAND_MASTER;
pci_write_config_word(dev, PCI_COMMAND, command);
}
以上です。
(本当は起動時にBIOSとボードとのやり取りの中でボードのコンフィグレーションレジスタの設定値を読んで
DMAバスマスタONにしてもらいたかったのですが、使用しているマザーボードのEFI-BIOSとのやり取りでは
それがうまくいかなかったようです。OS起動後に自分から積極的にONすることで今回は良しといたします。)
オフライン