| 508 | } |
| 509 | |
| 510 | static 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 | |
| 555 | static rt_err_t nvme_blk_getgeome(struct rt_blk_disk *disk, |
| 556 | struct rt_device_blk_geometry *geometry) |
nothing calls this directly
no test coverage detected