3

char ドライバーの DMAble メモリに mmap メソッドを実装したいと考えています。まずはDMA APIで実現してからPCIデバイスで実現したいと考えています。

dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, gfp_t gfp)

dma_alloc_coherent の最初の引数は、構造体デバイスへのポインターです。ISA または EISA の場合は NULL にすることができますが、DMA をサポートする有効なデバイスが必要です。次のコードは機能するはずですが、割り当ては失敗します。

/* register device in sysfs */
mmrmp->udev = device_create(mmrmp->class, NULL, mmrmp->major, NULL, DEVICE_NAME);
if (mmrmp->udev == NULL)
{
    goto devcreate_failed;
}
printk(KERN_INFO "%s: Char driver initialized and added to the system at addr %p", __func__, mmrmp->udev);
if(dma_supported(mmrmp->udev,DMA_BIT_MASK(32)))
    printk(KERN_INFO "device supports DMA");
else
    printk(KERN_INFO "device does not support DMA");

if(is_device_dma_capable(mmrmp->udev))
    printk(KERN_INFO "is_device_dma_capable: device supports DMA");
else
    printk(KERN_INFO "is_device_dma_capable: device does not support DMA");

if (!dma_set_mask(mmrmp->udev, dma_get_required_mask(mmrmp->udev)))
    printk(KERN_INFO "set DMA mask failed");

if ((mmrmp->dma_handle & dma_get_required_mask(mmrmp->udev)) == mmrmp->dma_handle)
    printk(KERN_INFO "Allocated physical address is within DMA region");
mmrmp->data = dma_alloc_coherent(mmrmp->udev, PAGE_SIZE, &mmrmp->dma_handle, GFP_KERNEL); 

dma_supported が 1 を返し、is_dma_capable_returns が 0 を返すのはなぜですか? dma_alloc_coherent をサポートするには、デバイスをどのように作成すればよいですか?

4

1 に答える 1