@@ -36,7 +36,7 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::initialize(bool is_queue_polled)
36
36
{
37
37
// Nr of queues = one queue per core
38
38
auto nr_of_queues = Processor::count ();
39
- auto irq = is_queue_polled ? Optional< u8 > {} : device_identifier (). interrupt_line (). value () ;
39
+ auto queue_type = is_queue_polled ? QueueType::Polled : QueueType::IRQ ;
40
40
41
41
PCI::enable_memory_space (device_identifier ());
42
42
PCI::enable_bus_mastering (device_identifier ());
@@ -52,7 +52,7 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::initialize(bool is_queue_polled)
52
52
m_ready_timeout = Time::from_milliseconds ((CAP_TO (caps) + 1 ) * 500 ); // CAP.TO is in 500ms units
53
53
54
54
calculate_doorbell_stride ();
55
- TRY (create_admin_queue (irq ));
55
+ TRY (create_admin_queue (queue_type ));
56
56
VERIFY (m_admin_queue_ready == true );
57
57
58
58
VERIFY (IO_QUEUE_SIZE < MQES (caps));
@@ -61,7 +61,7 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::initialize(bool is_queue_polled)
61
61
// Create an IO queue per core
62
62
for (u32 cpuid = 0 ; cpuid < nr_of_queues; ++cpuid) {
63
63
// qid is zero is used for admin queue
64
- TRY (create_io_queue (cpuid + 1 , irq ));
64
+ TRY (create_io_queue (cpuid + 1 , queue_type ));
65
65
}
66
66
TRY (identify_and_init_namespaces ());
67
67
return {};
@@ -249,7 +249,7 @@ void NVMeController::complete_current_request([[maybe_unused]] AsyncDeviceReques
249
249
VERIFY_NOT_REACHED ();
250
250
}
251
251
252
- UNMAP_AFTER_INIT ErrorOr<void > NVMeController::create_admin_queue (Optional< u8 > irq )
252
+ UNMAP_AFTER_INIT ErrorOr<void > NVMeController::create_admin_queue (QueueType queue_type )
253
253
{
254
254
auto qdepth = get_admin_q_dept ();
255
255
OwnPtr<Memory::Region> cq_dma_region;
@@ -287,13 +287,13 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::create_admin_queue(Optional<u8> i
287
287
return maybe_error;
288
288
}
289
289
set_admin_queue_ready_flag ();
290
- m_admin_queue = TRY (NVMeQueue::try_create (0 , irq , qdepth, move (cq_dma_region), cq_dma_pages, move (sq_dma_region), sq_dma_pages, move (doorbell_regs)));
290
+ m_admin_queue = TRY (NVMeQueue::try_create (0 , device_identifier (). interrupt_line (). value () , qdepth, move (cq_dma_region), cq_dma_pages, move (sq_dma_region), sq_dma_pages, move (doorbell_regs), queue_type ));
291
291
292
292
dbgln_if (NVME_DEBUG, " NVMe: Admin queue created" );
293
293
return {};
294
294
}
295
295
296
- UNMAP_AFTER_INIT ErrorOr<void > NVMeController::create_io_queue (u8 qid, Optional< u8 > irq )
296
+ UNMAP_AFTER_INIT ErrorOr<void > NVMeController::create_io_queue (u8 qid, QueueType queue_type )
297
297
{
298
298
OwnPtr<Memory::Region> cq_dma_region;
299
299
Vector<NonnullRefPtr<Memory::PhysicalPage>> cq_dma_pages;
@@ -323,7 +323,7 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::create_io_queue(u8 qid, Optional<
323
323
sub.create_cq .cqid = qid;
324
324
// The queue size is 0 based
325
325
sub.create_cq .qsize = AK::convert_between_host_and_little_endian (IO_QUEUE_SIZE - 1 );
326
- auto flags = irq. has_value ( ) ? QUEUE_IRQ_ENABLED : QUEUE_IRQ_DISABLED;
326
+ auto flags = (queue_type == QueueType::IRQ ) ? QUEUE_IRQ_ENABLED : QUEUE_IRQ_DISABLED;
327
327
flags |= QUEUE_PHY_CONTIGUOUS;
328
328
// TODO: Eventually move to MSI.
329
329
// For now using pin based interrupts. Clear the first 16 bits
@@ -347,7 +347,7 @@ UNMAP_AFTER_INIT ErrorOr<void> NVMeController::create_io_queue(u8 qid, Optional<
347
347
auto queue_doorbell_offset = REG_SQ0TDBL_START + ((2 * qid) * (4 << m_dbl_stride));
348
348
auto doorbell_regs = TRY (Memory::map_typed_writable<DoorbellRegister volatile >(PhysicalAddress (m_bar + queue_doorbell_offset)));
349
349
350
- m_queues.append (TRY (NVMeQueue::try_create (qid, irq , IO_QUEUE_SIZE, move (cq_dma_region), cq_dma_pages, move (sq_dma_region), sq_dma_pages, move (doorbell_regs))));
350
+ m_queues.append (TRY (NVMeQueue::try_create (qid, device_identifier (). interrupt_line (). value () , IO_QUEUE_SIZE, move (cq_dma_region), cq_dma_pages, move (sq_dma_region), sq_dma_pages, move (doorbell_regs), queue_type )));
351
351
dbgln_if (NVME_DEBUG, " NVMe: Created IO Queue with QID{}" , m_queues.size ());
352
352
return {};
353
353
}
0 commit comments