我正在为SPI连接的LCD写帧缓冲驱动程序。我使用kmalloc分配缓冲区,这是相当大的 - 150KB。考虑到kmalloc分配缓冲区的方式,ksize报告说,更多的内存正在被使用 - 大约256KB左右。kmalloc中的缓冲区是否也是DMA安全缓冲区?
SPI spi_transfer结构需要指向tx和rx缓冲区的指针,它们都必须是DMA安全的。因为我希望tx缓冲区大约为16KB,我可以在kmalloced视频缓冲区内分配缓冲区,并仍然是DMA安全的吗?
这可能被认为是不成熟的优化,但视频缓冲区中有太多的空闲空间,所以感觉不好不要使用它!本质上存在之间分配的内存没有任何区别:
kmalloc(videosize)
和
kmalloc(PAGE_ALIGN(videosize) + txbufsize)
这样一个可以采取kptr返回,并做到:
txbuf = (u8 *)kptr + PAGE_ALIGN(videosize);
我知道的那部分“DMA安全”的要求是适当的对齐 - CPU缓存线的大小,我相信... - 但不应该页面对齐为这个好吗?
顺便说一句,我不确定tx和rx是否可以指向相同的地方。 spi.h标题也不清楚(实际上明确不清楚)。由于rx缓冲区永远不会超过几个字节,因此试图找出问题将会很麻烦!
也许尝试构建你的代码直接写入到内存DMA'ble,而不是一个kmalloc的缓冲? – tangrs
你为什么使用'kmalloc'作为视频缓冲区? –
与__get_free_pages相反?应该没有什么区别......他们都是DMA安全的。我可以半回答我自己的问题 - 如果我对齐一个页面,我相信会排除任何缓存一致性问题的可能性,即使它是过度杀毒,也不会查看TLB的东西。 – carveone