1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 23:07:35 +00:00

Kernel: Add individual struct definitions for NVMeSubmission

Only a generic struct definition was present for NVMeSubmission. To
improve type safety and clarity, added an union of NVMeSubmission
structs that are applicable to the command being submitted.
This commit is contained in:
Pankaj Raghav 2022-01-16 17:47:42 +05:30 committed by Idan Horowitz
parent ba7846647c
commit 567b3a4810
5 changed files with 94 additions and 39 deletions

View file

@ -93,7 +93,7 @@ bool NVMeQueue::handle_irq(const RegisterState&)
return nr_of_processed_cqes ? true : false;
}
void NVMeQueue::submit_sqe(struct NVMeSubmission& sub)
void NVMeQueue::submit_sqe(NVMeSubmission& sub)
{
SpinlockLocker lock(m_sq_lock);
// For now let's use sq tail as a unique command id.
@ -144,12 +144,11 @@ void NVMeQueue::read(AsyncBlockDeviceRequest& request, u16 nsid, u64 index, u32
m_current_request = request;
sub.op = OP_NVME_READ;
sub.nsid = nsid;
sub.cdw10 = AK::convert_between_host_and_little_endian(index & 0xFFFFFFFF);
sub.cdw11 = AK::convert_between_host_and_little_endian(index >> 32);
sub.rw.nsid = nsid;
sub.rw.slba = AK::convert_between_host_and_little_endian(index);
// No. of lbas is 0 based
sub.cdw12 = AK::convert_between_host_and_little_endian((count - 1) & 0xFFFF);
sub.data_ptr.prp1 = reinterpret_cast<u64>(AK::convert_between_host_and_little_endian(m_rw_dma_page->paddr().as_ptr()));
sub.rw.length = AK::convert_between_host_and_little_endian((count - 1) & 0xFFFF);
sub.rw.data_ptr.prp1 = reinterpret_cast<u64>(AK::convert_between_host_and_little_endian(m_rw_dma_page->paddr().as_ptr()));
full_memory_barrier();
submit_sqe(sub);
@ -166,12 +165,11 @@ void NVMeQueue::write(AsyncBlockDeviceRequest& request, u16 nsid, u64 index, u32
return;
}
sub.op = OP_NVME_WRITE;
sub.nsid = nsid;
sub.cdw10 = AK::convert_between_host_and_little_endian(index & 0xFFFFFFFF);
sub.cdw11 = AK::convert_between_host_and_little_endian(index >> 32);
sub.rw.nsid = nsid;
sub.rw.slba = AK::convert_between_host_and_little_endian(index);
// No. of lbas is 0 based
sub.cdw12 = AK::convert_between_host_and_little_endian((count - 1) & 0xFFFF);
sub.data_ptr.prp1 = reinterpret_cast<u64>(AK::convert_between_host_and_little_endian(m_rw_dma_page->paddr().as_ptr()));
sub.rw.length = AK::convert_between_host_and_little_endian((count - 1) & 0xFFFF);
sub.rw.data_ptr.prp1 = reinterpret_cast<u64>(AK::convert_between_host_and_little_endian(m_rw_dma_page->paddr().as_ptr()));
full_memory_barrier();
submit_sqe(sub);