ChinaUnix.net
相关文章推荐:

dma_alloc_coherent

ldd3上说,dma_alloc_coherent函数分配的内存是一致性dma映射的, 就是说cpu和dma看到的内存内容是一致的。如果要做到cpu和dma看到内容是一致的,那就是说, 这段内存必须是不经过cache的。 我在看代码的时候,在分配内存时,使用了如下的内存分配标志。 #define pgprot_dmacoherent(prot) \ __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN) 即指明该内存是L_PTE_MT_BUFFERABLE的,这是什么意思,我的理解...

by xiaojsj - 内核源码 - 2013-09-26 12:56:22 阅读(3046) 回复(7)

相关讨论

本帖最后由 527639827 于 2010-05-21 08:22 编辑 从ldd3上440页看到 建立一致性dma映射函数 rc=dma_alloc_coherent(struct *dev, size_t size, dma_addr_t *dma_handle, int flag) 该函数实际获得两个地址, 1、函数的返回值是一个(rc),代表缓冲区的内核虚拟地址 2、相关的总线地址,保存在dma_handle中 我有一些疑问: 1、dma_handle这个地址究竟是干什么用的?如果我的dev是个pci设备,那么dma_...

by 527639827 - Linux环境编程 - 2010-05-27 11:39:22 阅读(9528) 回复(6)

代码如下: ssize_t fpga_wr_write(struct file * pfile, const char __user * ch_user, size_t count, loff_t * pos) { u64 addr64; printk(KERN_ALERT "dma write begin\n"); // 写入数据 dma_src = dma_alloc_coherent(&my_s_dev->dev,1024,bus_src_addr,GFP_KERNEL);//这里crash printk(KERN_ALERT "dma write end\n"); return 0; } static int __devinit fpga_wr_probe(struct pci_dev* ...

by liushui1029 - 驱动开发 - 2012-04-12 14:49:27 阅读(1472) 回复(1)

本帖最后由 testh 于 2012-11-30 19:11 编辑 熟悉的请讲讲。 连续调用两次dma_alloc_coherent(NULL,1024*1024,&addr,GFP_KERNEL)只有第一次成功,后面的就会失败,这是什么原因导致的呢? 代码如下:[code]dma_addr_t addr[2]; unsigned char *vir[2]; static int __init testmacro_init(void) { int i; printk("enter init\n"); for(i=0;i<2;i++) { vir=dma_alloc_coherent(NULL,1024,&addr,GFP_KERNEL); ...

by testh - 内核源码 - 2012-11-30 21:53:28 阅读(3585) 回复(3)

我最近用ppc作为主控通过pci连接一个外设。外设自己是有dma的,我想问的是为什么外设可以通过dma访问dma_alloc_coherent分配的地址的呢? 这个地址我没有通过pci做映射的,按照道理来讲,只有通过pci映射才是可以的啊。难道dma_alloc_coherent自己做了处理?

by wushichun - Linux环境编程 - 2011-11-29 18:45:52 阅读(2656) 回复(1)

char *src; dma_addr_t memory_phy_base; src = dma_alloc_coherent(NULL, 0x4000, &memory_phy_base, GFP_KERNEL|GFP_dma); printk("src:%08lx, virt_to_phys: %08lx, actual_phys: %08lx,phy_to_virt: %08lx", (unsigned long)src, (unsigned long)virt_to_phys(src), (unsigned long )memory_phy_base, (unsigned long)phys_to_virt(memory_phy_base)); 运行结果: src:ff8ee000, virt_...

by wan_zilove - 驱动开发 - 2010-05-05 13:26:43 阅读(3129) 回复(0)

请问dma_alloc_coherent分配的内存有没有通过pci的 bar映射。我目前的系统bar空间预先都映射好了3个,另外3个没有用,但是驱动中用dma_alloc_coherent分配了内存,并把返回的物理地址告诉pci设备,然后pci设备就可以访问dma_alloc_coherent分配的内存,为什么呢?并没有经过bar映射啊

by wushichun - 内核源码 - 2011-07-06 09:17:19 阅读(2610) 回复(0)

该函数经常作为framebuffer的内存申请函数,但是该函数申请的内存,对cache的操作,禁掉了读cache,但是并没有禁掉写buffer, 这样的话,如果用户对内存操作时,有可能数据并没有完全写到mem上,而只是更新了cache,从而造成图像显示的问题。 这个问题怎么去保证呢?我在显示驱动里面也没有看到刷新cache到mem的操作动作?

by hnzpzg - 驱动开发 - 2013-10-12 09:35:26 阅读(1016) 回复(3)

当使用root.initramfs时,把文件系统生成的镜像编译进内核。其中lcd是模块编译,需要手动加载。系统启动后加载lcd的驱动akfb_drv.ko,屏幕正常显示背景蓝。 当更换文件系统为squashfs和jiffs2的时候就出现问题。把jiffs2和squashfs分别烧入到spi flash的两个去,还是模块化加载lcd 驱动akfb_drv.ko,这个时候开机,手动加载lcd驱动,就会出现 ak37-lcd ak37-lcd: alloc framebuffer 261120 bytes. ak37-lcd: probe of ak3...

by 和尚VS秃头 - 嵌入式开发 - 2014-06-09 19:02:23 阅读(1054) 回复(0)

最近在做一个关于HDMI驱动反面的移植,在给设备alloc framebuffer时,我追踪代码到get_coherent_dma_mask函数时,遇到问题,就是这个coherent_dma_mask 变量,它是device结构体里的一个变量,我就不懂了,按照网上查到的资料,我给它赋值为0xffffffff,运行时却出现错误,如果不赋值,它的值为0,运行是就分配不到内存。。烦请那位大虾做过相关或类似的驱动,不吝赐教啊!!快急死了。。。

by ppltsqpp - 移动操作系统 - 2011-07-07 10:59:18 阅读(3448) 回复(1)

#ifndef CONFIG_HAVE_ARCH_BOOTMEM_NODE extern void __init reserve_bootmem (unsigned long addr, unsigned long size); #define alloc_bootmem(x) __alloc_bootmem((x), SMP_CACHE_BYTES, __pa(MAX_dma_ADDRESS)) #define alloc_bootmem_low(x) __alloc_bootmem((x), SMP_CACHE_BYTES, 0) #define alloc_bootmem_pages(x) __alloc_bootmem((x), PAGE_SIZE, __pa(MAX_dma_ADDRESS)) #define alloc_bootmem_low_pages(x) ...

by baozhao - Linux文档专区 - 2005-02-24 00:29:41 阅读(1548) 回复(0)