Changes between Version 6 and Version 7 of hba_driver
- Timestamp:
- Mar 25, 2015, 7:20:43 PM (10 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
hba_driver
v6 v7 7 7 The ''vci_multi_ahci'' component is a multi-channels, block oriented, external mass storage controller respecting the AHCI standard. Each channel define an independant physical disk, but this driver supports only one channel, because the GIET-VM uses only one physical disk. 8 8 9 The '''Command List''' is a software FIFO that can contain up to 32 independant commands, posted by different user tasks. These independant transfers are handled by the HBA device in the same order as they have been written in the command list. There is no global lock protecting the the HBA device, but the command list being a shared structure, the driver uses an atomic_increment() to get a slot in the command list, and increment the write pointer.9 The '''Command List''' is a software FIFO that can contain up to 32 independant commands, posted by different user tasks. These independant transfers are handled by the HBA device in the same order as they have been written in the command list. There is no global lock protecting the the HBA device, but the command list being a shared structure, the driver uses an ''_atomicc_increment()'' to get a slot in the Command List, and increment the write pointer. 10 10 11 11 This driver implements two operating mode: … … 13 13 * In '''descheduling mode''', the calling task is descheduled, and the calling task global index is saved in the ''_hba_gtid[32]'' array, indexed by the command index. The task must be reactivated when the command is completed. This mode is used, to handle the user system calls. 14 14 15 As several user tasks can concurrently register commands in the command list, and there is only one HBA interrupt per channel, this interrupt is not linked to a specific calling task: in descheduling mode, the HBA IRQ is a "global" IRQ that is statically routed to processor P[x_io,y_io,0] in cluster_io. The associated global HBA_ISR send a WAKUP WTI to all tasks that have a completed command. This HBA_ISR uses a read pointer on the Command List to identify the expected command completion. The incrementation of this read pointer does not require atomic_increment()as there is no concurrent access on this pointer.15 As several user tasks can concurrently register commands in the command list, and there is only one HBA interrupt per channel, this interrupt is not linked to a specific calling task: in descheduling mode, the HBA IRQ is a "global" IRQ that is statically routed to processor P[x_io,y_io,0] in cluster_io. The associated global HBA_ISR send a WAKUP WTI to all tasks that have a completed command. This HBA_ISR uses a read pointer on the Command List to identify the expected command completion. The incrementation of this read pointer does not require ''_atomic_increment()'' as there is no concurrent access on this pointer. 16 16 17 17 The SEG_IOC_BASE address must be defined in the hard_config.h file.