お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2019-03-18 17:35:43

9600
新しいメンバ
登録日: 2019-03-18

UEFI環境下でDMA転送を行うには何か設定が要りますか?

こんにちは、お世話になります。
デバイスドライバーを開発しようとしている者です。

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、パラメータ、あるいはドライバの関数等で
何か情報をお持ちの方、何卒、ご教示をお願いいたします。
よろしくお願いいたします。

オフライン

 

#2 2019-04-05 16:50:16

9600
新しいメンバ
登録日: 2019-03-18

Re: UEFI環境下でDMA転送を行うには何か設定が要りますか?

自己レスです。
解決しました。

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することで今回は良しといたします。)

オフライン

 

Board footer

Powered by FluxBB