diff --git a/drivers/disk/nvme/nvme_disk.c b/drivers/disk/nvme/nvme_disk.c index 3308e04db5b..834a6e2e6c7 100644 --- a/drivers/disk/nvme/nvme_disk.c +++ b/drivers/disk/nvme/nvme_disk.c @@ -34,6 +34,11 @@ static int nvme_disk_read(struct disk_info *disk, uint32_t payload_size; int ret = 0; + if (!NVME_IS_BUFFER_DWORD_ALIGNED(data_buf)) { + LOG_WRN("Data buffer pointer needs to be 4-bytes aligned"); + return -EINVAL; + } + nvme_lock(disk->dev); payload_size = num_sector * nvme_namespace_get_sector_size(ns); @@ -78,6 +83,11 @@ static int nvme_disk_write(struct disk_info *disk, uint32_t payload_size; int ret = 0; + if (!NVME_IS_BUFFER_DWORD_ALIGNED(data_buf)) { + LOG_WRN("Data buffer pointer needs to be 4-bytes aligned"); + return -EINVAL; + } + nvme_lock(disk->dev); payload_size = num_sector * nvme_namespace_get_sector_size(ns); diff --git a/drivers/disk/nvme/nvme_helpers.h b/drivers/disk/nvme/nvme_helpers.h index fb8165be519..325c6e9b842 100644 --- a/drivers/disk/nvme/nvme_helpers.h +++ b/drivers/disk/nvme/nvme_helpers.h @@ -514,4 +514,6 @@ enum shst_value { (mm_reg_t)b_a + nvme_mmio_offsetof(reg) + 4); \ } while (0) +#define NVME_IS_BUFFER_DWORD_ALIGNED(_buf_addr) (!((uintptr_t)_buf_addr & 0x3)) + #endif /* ZEPHYR_DRIVERS_DISK_NVME_NHME_HELPERS_H_ */