Skip to content

Commit 69dfbf8

Browse files
GuEe-GUIRbb666
authored andcommitted
[dm][nvme] replace the CPU physical address to DMA address
Signed-off-by: GuEe-GUI <2991707448@qq.com>
1 parent c3e1dd7 commit 69dfbf8

1 file changed

Lines changed: 26 additions & 18 deletions

File tree

‎components/drivers/nvme/nvme.c‎

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ rt_inline rt_le16_t nvme_next_cmdid(struct rt_nvme_controller *nvme)
100100
return rt_cpu_to_le16((rt_uint16_t)rt_atomic_add(&nvme->cmdid, 1));
101101
}
102102

103+
rt_inline rt_ubase_t nvme_queue_dma_flags(void)
104+
{
105+
return RT_DMA_F_NOCACHE | RT_DMA_F_LINEAR;
106+
}
107+
103108
static rt_err_t nvme_submit_cmd(struct rt_nvme_queue *queue,
104109
struct rt_nvme_command *cmd)
105110
{
@@ -397,7 +402,8 @@ static rt_ssize_t nvme_blk_rw(struct rt_nvme_device *ndev, rt_off_t slba,
397402
prp_list_size = pages * (prps_per_page - 1) + 1;
398403
}
399404
prp_list_ptr = prp_list;
400-
prp_list_dma = (rt_uint64_t)rt_kmem_v2p(prp_list_ptr);
405+
rt_dma_sync_out_data(nvme->dev, prp_list_ptr, prp_list_size,
406+
(rt_ubase_t *)&prp_list_dma, nvme_queue_dma_flags());
401407

402408
prp2_addr = prp_list_dma;
403409

@@ -452,7 +458,7 @@ static rt_ssize_t nvme_blk_read(struct rt_blk_disk *disk, rt_off_t sector,
452458
rt_uint32_t page_bits;
453459
rt_size_t buffer_size;
454460
rt_ubase_t buffer_dma;
455-
void *temp_buffer = RT_NULL;
461+
void *temp_buffer = RT_NULL, *dma_ptr = buffer;
456462
struct rt_nvme_device *ndev = rt_disk_to_nvme_device(disk);
457463
struct rt_nvme_controller *nvme = ndev->ctrl;
458464

@@ -472,9 +478,11 @@ static rt_ssize_t nvme_blk_read(struct rt_blk_disk *disk, rt_off_t sector,
472478
return -RT_ENOMEM;
473479
}
474480

475-
buffer_dma = (rt_ubase_t)rt_kmem_v2p(temp_buffer);
481+
dma_ptr = temp_buffer;
476482
}
477483

484+
rt_dma_sync_out_data(nvme->dev, dma_ptr, buffer_size, &buffer_dma, nvme_queue_dma_flags());
485+
478486
res = nvme_blk_rw(ndev, sector, buffer_dma, sector_count, RT_NVME_CMD_READ);
479487

480488
if (res > 0)
@@ -515,6 +523,7 @@ static rt_ssize_t nvme_blk_write(struct rt_blk_disk *disk, rt_off_t sector,
515523
rt_size_t buffer_size;
516524
rt_ubase_t buffer_dma;
517525
void *temp_buffer = RT_NULL;
526+
const void *dma_ptr = buffer;
518527
struct rt_nvme_device *ndev = rt_disk_to_nvme_device(disk);
519528
struct rt_nvme_controller *nvme = ndev->ctrl;
520529

@@ -534,13 +543,12 @@ static rt_ssize_t nvme_blk_write(struct rt_blk_disk *disk, rt_off_t sector,
534543
return -RT_ENOMEM;
535544
}
536545

537-
buffer_dma = (rt_ubase_t)rt_kmem_v2p(temp_buffer);
538-
539546
rt_memcpy(temp_buffer, buffer, buffer_size);
540-
buffer = temp_buffer;
547+
dma_ptr = temp_buffer;
541548
}
542549

543-
rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)buffer, buffer_size);
550+
rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)dma_ptr, buffer_size);
551+
rt_dma_sync_out_data(nvme->dev, (void *)dma_ptr, buffer_size, &buffer_dma, nvme_queue_dma_flags());
544552

545553
res = nvme_blk_rw(ndev, sector, buffer_dma, sector_count, RT_NVME_CMD_WRITE);
546554

@@ -694,11 +702,15 @@ static rt_err_t nvme_identify(struct rt_nvme_controller *nvme,
694702
rt_uint32_t nsid, rt_uint32_t cns, void *data)
695703
{
696704
rt_err_t err;
697-
rt_uint32_t page_size = nvme->page_size;
698-
rt_ubase_t data_phy = (rt_ubase_t)rt_kmem_v2p(data);
699-
int offset = data_phy & (page_size - 1);
705+
rt_ssize_t offset;
706+
rt_ubase_t data_phy = 0;
707+
rt_size_t page_size = nvme->page_size;
700708
struct rt_nvme_command cmd;
701709

710+
rt_dma_sync_out_data(nvme->dev, data, sizeof(struct rt_nvme_id_ctrl),
711+
&data_phy, nvme_queue_dma_flags());
712+
offset = data_phy & (page_size - 1);
713+
702714
rt_memset(&cmd, 0, sizeof(cmd));
703715
cmd.identify.opcode = RT_NVME_ADMIN_OPCODE_IDENTIFY;
704716
cmd.identify.nsid = rt_cpu_to_le32(nsid);
@@ -710,8 +722,9 @@ static rt_err_t nvme_identify(struct rt_nvme_controller *nvme,
710722
}
711723
else
712724
{
713-
data_phy += (page_size - offset);
714-
cmd.identify.prp2 = rt_cpu_to_le64(data_phy);
725+
rt_ubase_t data_phy2 = data_phy + (page_size - offset);
726+
727+
cmd.identify.prp2 = rt_cpu_to_le64(data_phy2);
715728
}
716729
cmd.identify.cns = rt_cpu_to_le32(cns);
717730

@@ -783,11 +796,6 @@ static rt_err_t nvme_detach_queue(struct rt_nvme_queue *queue,
783796
return nvme_submit_cmd(&nvme->admin_queue, &cmd);
784797
}
785798

786-
rt_inline rt_ubase_t nvme_queue_dma_flags(void)
787-
{
788-
return RT_DMA_F_NOCACHE | RT_DMA_F_LINEAR;
789-
}
790-
791799
static void nvme_free_queue(struct rt_nvme_queue *queue)
792800
{
793801
rt_ubase_t dma_flags;
@@ -863,7 +871,7 @@ static struct rt_nvme_queue *nvme_alloc_queue(struct rt_nvme_controller *nvme,
863871

864872
if (nvme->ops->setup_queue)
865873
{
866-
if (!(err = nvme->ops->setup_queue(queue)))
874+
if ((err = nvme->ops->setup_queue(queue)))
867875
{
868876
LOG_E("Setup[%s] queue error = %s", nvme->ops->name, rt_strerror(err));
869877

0 commit comments

Comments
 (0)