[dm][nvme] replace the CPU physical address to DMA address

Signed-off-by: GuEe-GUI <2991707448@qq.com>
This commit is contained in:
GuEe-GUI 2026-07-22 23:34:17 +08:00 committed by Rbb666
parent c3e1dd7946
commit 69dfbf86fd
1 changed files with 26 additions and 18 deletions

View File

@ -100,6 +100,11 @@ rt_inline rt_le16_t nvme_next_cmdid(struct rt_nvme_controller *nvme)
return rt_cpu_to_le16((rt_uint16_t)rt_atomic_add(&nvme->cmdid, 1));
}
rt_inline rt_ubase_t nvme_queue_dma_flags(void)
{
return RT_DMA_F_NOCACHE | RT_DMA_F_LINEAR;
}
static rt_err_t nvme_submit_cmd(struct rt_nvme_queue *queue,
struct rt_nvme_command *cmd)
{
@ -397,7 +402,8 @@ static rt_ssize_t nvme_blk_rw(struct rt_nvme_device *ndev, rt_off_t slba,
prp_list_size = pages * (prps_per_page - 1) + 1;
}
prp_list_ptr = prp_list;
prp_list_dma = (rt_uint64_t)rt_kmem_v2p(prp_list_ptr);
rt_dma_sync_out_data(nvme->dev, prp_list_ptr, prp_list_size,
(rt_ubase_t *)&prp_list_dma, nvme_queue_dma_flags());
prp2_addr = prp_list_dma;
@ -452,7 +458,7 @@ static rt_ssize_t nvme_blk_read(struct rt_blk_disk *disk, rt_off_t sector,
rt_uint32_t page_bits;
rt_size_t buffer_size;
rt_ubase_t buffer_dma;
void *temp_buffer = RT_NULL;
void *temp_buffer = RT_NULL, *dma_ptr = buffer;
struct rt_nvme_device *ndev = rt_disk_to_nvme_device(disk);
struct rt_nvme_controller *nvme = ndev->ctrl;
@ -472,9 +478,11 @@ static rt_ssize_t nvme_blk_read(struct rt_blk_disk *disk, rt_off_t sector,
return -RT_ENOMEM;
}
buffer_dma = (rt_ubase_t)rt_kmem_v2p(temp_buffer);
dma_ptr = temp_buffer;
}
rt_dma_sync_out_data(nvme->dev, dma_ptr, buffer_size, &buffer_dma, nvme_queue_dma_flags());
res = nvme_blk_rw(ndev, sector, buffer_dma, sector_count, RT_NVME_CMD_READ);
if (res > 0)
@ -515,6 +523,7 @@ static rt_ssize_t nvme_blk_write(struct rt_blk_disk *disk, rt_off_t sector,
rt_size_t buffer_size;
rt_ubase_t buffer_dma;
void *temp_buffer = RT_NULL;
const void *dma_ptr = buffer;
struct rt_nvme_device *ndev = rt_disk_to_nvme_device(disk);
struct rt_nvme_controller *nvme = ndev->ctrl;
@ -534,13 +543,12 @@ static rt_ssize_t nvme_blk_write(struct rt_blk_disk *disk, rt_off_t sector,
return -RT_ENOMEM;
}
buffer_dma = (rt_ubase_t)rt_kmem_v2p(temp_buffer);
rt_memcpy(temp_buffer, buffer, buffer_size);
buffer = temp_buffer;
dma_ptr = temp_buffer;
}
rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)buffer, buffer_size);
rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)dma_ptr, buffer_size);
rt_dma_sync_out_data(nvme->dev, (void *)dma_ptr, buffer_size, &buffer_dma, nvme_queue_dma_flags());
res = nvme_blk_rw(ndev, sector, buffer_dma, sector_count, RT_NVME_CMD_WRITE);
@ -694,11 +702,15 @@ static rt_err_t nvme_identify(struct rt_nvme_controller *nvme,
rt_uint32_t nsid, rt_uint32_t cns, void *data)
{
rt_err_t err;
rt_uint32_t page_size = nvme->page_size;
rt_ubase_t data_phy = (rt_ubase_t)rt_kmem_v2p(data);
int offset = data_phy & (page_size - 1);
rt_ssize_t offset;
rt_ubase_t data_phy = 0;
rt_size_t page_size = nvme->page_size;
struct rt_nvme_command cmd;
rt_dma_sync_out_data(nvme->dev, data, sizeof(struct rt_nvme_id_ctrl),
&data_phy, nvme_queue_dma_flags());
offset = data_phy & (page_size - 1);
rt_memset(&cmd, 0, sizeof(cmd));
cmd.identify.opcode = RT_NVME_ADMIN_OPCODE_IDENTIFY;
cmd.identify.nsid = rt_cpu_to_le32(nsid);
@ -710,8 +722,9 @@ static rt_err_t nvme_identify(struct rt_nvme_controller *nvme,
}
else
{
data_phy += (page_size - offset);
cmd.identify.prp2 = rt_cpu_to_le64(data_phy);
rt_ubase_t data_phy2 = data_phy + (page_size - offset);
cmd.identify.prp2 = rt_cpu_to_le64(data_phy2);
}
cmd.identify.cns = rt_cpu_to_le32(cns);
@ -783,11 +796,6 @@ static rt_err_t nvme_detach_queue(struct rt_nvme_queue *queue,
return nvme_submit_cmd(&nvme->admin_queue, &cmd);
}
rt_inline rt_ubase_t nvme_queue_dma_flags(void)
{
return RT_DMA_F_NOCACHE | RT_DMA_F_LINEAR;
}
static void nvme_free_queue(struct rt_nvme_queue *queue)
{
rt_ubase_t dma_flags;
@ -863,7 +871,7 @@ static struct rt_nvme_queue *nvme_alloc_queue(struct rt_nvme_controller *nvme,
if (nvme->ops->setup_queue)
{
if (!(err = nvme->ops->setup_queue(queue)))
if ((err = nvme->ops->setup_queue(queue)))
{
LOG_E("Setup[%s] queue error = %s", nvme->ops->name, rt_strerror(err));