@@ -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+
103108static 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-
791799static 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