- 论坛徽章:
- 0
|
在LLD3的提到要使用64-bit地址的话需要使用DAC,此时要调用pci_dac_set_dma_mask设置,而使用的地址也是dma64_addr_t。对于64-bit的CPU是不是用哪个都是一样的?看过一个实际驱动的直接自己处理的:
/* This macro gets the upper 32 bits of a 32 or 64 bit dma_addr_t, and
* yields 0 on 32-bit dma_addr_t's. The bizarre shift expression is
* necessary to compile on 32-bit platforms. */
#define DMA_ADDR_HI32(A) ((u32)((sizeof(A) == 8) ? ((A) >> (sizeof(A) * 8 - 32)) : 0))
/* This macro yields the low 32 bits of a 32 or 64 bit dma_addr_t. */
#define DMA_ADDR_LO32(A) ((u32) (A))
......
u32 index = stream_posted % BUFFERS_PER_STREAM;
dma_addr_t addr = stream->read_dma_addrs[index];
cmd.buffer_addr_lo32 = DMA_ADDR_LO32(addr);
cmd.buffer_addr_hi32 = DMA_ADDR_HI32(addr);
CMD_TRACE("READ channel= %d, size= %d, bus_addr= %#llx\n",
cmd.channel, cmd.size, addr);
cmd_index = cmds_posted % PCIE_CMD_QUEUE_ENTRIES;
tlr->buffer_cmd_array[cmd_index] = cmd;
cmds_posted++;
|
另外这个mask是控制什么的?i386要求是24-bit的mask,但在dma_map_single中没有做任何检查:
static inline int
dma_set_mask(struct device *dev, u64 mask)
{
if(!dev->dma_mask || !dma_supported(dev, mask))
return -EIO;
*dev->dma_mask = mask;
return 0;
}
|
使用的地方搜索了一下太杂一时没看出什么来。
再补充一句,上面的实际驱动是一个PCIe的板子的,对于PCIe还需要关心DAC吗?
[ 本帖最后由 Cyberman.Wu 于 2009-2-17 09:01 编辑 ] |
|