MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / nvme_blk_write

Function nvme_blk_write

components/drivers/nvme/nvme.c:510–553  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

508}
509
510static rt_ssize_t nvme_blk_write(struct rt_blk_disk *disk, rt_off_t sector,
511 const void *buffer, rt_size_t sector_count)
512{
513 rt_ssize_t res;
514 rt_uint32_t page_bits;
515 rt_size_t buffer_size;
516 rt_ubase_t buffer_dma;
517 void *temp_buffer = RT_NULL;
518 struct rt_nvme_device *ndev = rt_disk_to_nvme_device(disk);
519 struct rt_nvme_controller *nvme = ndev->ctrl;
520
521 buffer_size = (1 << ndev->lba_shift) * sector_count;
522 buffer_dma = (rt_ubase_t)rt_kmem_v2p((void *)buffer);
523
524 if ((nvme->sgl_mode && (buffer_dma & RT_GENMASK(1, 0))) ||
525 (!nvme->sgl_mode && (buffer_dma & ARCH_PAGE_MASK)))
526 {
527 LOG_D("DMA PRP direct %s buffer MUST 4-bytes or page aligned", "write");
528
529 page_bits = rt_page_bits(buffer_size);
530 temp_buffer = rt_pages_alloc(page_bits);
531
532 if (!temp_buffer)
533 {
534 return -RT_ENOMEM;
535 }
536
537 buffer_dma = (rt_ubase_t)rt_kmem_v2p(temp_buffer);
538
539 rt_memcpy(temp_buffer, buffer, buffer_size);
540 buffer = temp_buffer;
541 }
542
543 rt_hw_cpu_dcache_ops(RT_HW_CACHE_FLUSH, (void *)buffer, buffer_size);
544
545 res = nvme_blk_rw(ndev, sector, buffer_dma, sector_count, RT_NVME_CMD_WRITE);
546
547 if (temp_buffer)
548 {
549 rt_pages_free(temp_buffer, page_bits);
550 }
551
552 return res;
553}
554
555static rt_err_t nvme_blk_getgeome(struct rt_blk_disk *disk,
556 struct rt_device_blk_geometry *geometry)

Callers

nothing calls this directly

Calls 7

rt_kmem_v2pFunction · 0.85
rt_page_bitsFunction · 0.85
rt_pages_allocFunction · 0.85
rt_memcpyFunction · 0.85
nvme_blk_rwFunction · 0.85
rt_pages_freeFunction · 0.85
rt_hw_cpu_dcache_opsFunction · 0.50

Tested by

no test coverage detected