Garrett D'Amore wrote: > Alan Perry wrote: >> I am sponsoring this self-review case. >> >> This case documents additional changes to an existing case. I believe >> that >> this case qualifies for self-review because the interfaces are >> Consolidation >> Private and backwards compatible with the existing interfaces. >> > > This is not the only criteria for self-review. Self-review cases must > also be so obvious and self explanatory that no further review is > desired or required. They should usually should not be introducing new > architecture. > > I believe this case exceed this threshold, and I would like to make sure > it is properly reviewed. Please convert this to a fast track with a one > week timer.
This case does not introduce new architecture. It is making changes to an architecture introduced in PSARC/2004/779. As far as the obvious criteria, obvious to whom? I find the interface changes fairly obvious. I did have to read about how SATA port multipliers work first and think about ways to implement support for them across the sata framework/sata HBA driver split. alan > > -- Garrett >> Template Version: @(#)sac_nextcase 1.68 02/23/09 SMI >> This information is Copyright 2009 Sun Microsystems >> 1. Introduction >> 1.1. Project/Component Working Name: >> SATA Framework Port Multiplier Support >> 1.2. Name of Document Author/Supplier: >> Author: Xiaoyu Zhang >> 1.3 Date of This Document: >> 14 July, 2009 >> 4. Technical Description >> >> 4.1. Background >> --------------- >> PSARC/2004/779 [1] established the SATA HBA Framework interface. >> PSARC/2005/679 [2] expanded this interface as needed to suport the >> marvell88sx >> and si3124 SATA HBA drivers. PSARC 2007/274 [3] expanded the interface >> further >> to support Native Command Queuing (NCQ) and ATAPI devices. >> PSARC/2007/448 [4] >> expanded the interface again to support releasing DMA framework-allocated >> resources associated with a command's buffer. >> >> This fast-track describes further interface changes required to >> support SATA >> port multipliers. >> >> 4.2. The Problem >> ---------------- >> >> 4.2.1. Required to support READ/WRITE PORTMULT command >> ------------------------------------------------------ >> According to the SATA Specification 2.6 [5] and the Port Multiplier >> Specification [6], READ PORT MULTIPLIER and WRITE PORT MULIPLIER are >> used to >> access the registers of the port multiplier. These two commands are >> necessary >> to the successful enumeration of the the port multiplier. >> >> Both SATA HBA drivers as well as the SATA module have internal functions >> operating on sata_pkt rather than isolated SATA commands. Therefore, >> READ/WRITE PORTMULT commands should be delivered to SATA HBA drivers in >> sata_pkt structures. >> >> 4.2.2. The insufficient sata_device interface >> --------------------------------------------- >> The sata_device is used as a parameter to the HBA probe entry point. >> Existing >> HBA implementations update only SATA Control Registers values in >> response to >> probe port operation. The port multiplier has its own Global Status & >> Control >> Registers, in which the parameters and status of the port multiplier >> itself >> are stored. The sata module needs this register information, so there >> needs >> to be a method for the SATA HBA driver to provide this information. >> >> 4.2.3. Required to handle port multiplier quirks >> ------------------------------------------------ >> The SATA specification 2.6 [5] defines the registers and enumeration >> process >> for port multipliers, however, some existing port multiplier models >> have quirks >> and might break the general enumeration or initialization process. The >> HBA >> driver should have idea of these quirks and determine its reaction. >> Additions >> to the interface are required to handle Port Multiplier behavior that is >> different the specification. >> >> >> 4.3. The Proposal >> ----------------- >> >> 4.3.1. Summary >> -------------- >> Revise the SATA interface to support port multiplier. Port multiplier >> support >> was partially designed and implemented inside SATA module. The proposal >> defines new interface functions necessary to support new SATA commands >> and new >> fields in sata_device structure to support port multiplier device. A >> blacklist >> structure is defined is added to to dealing with port multiplier >> discrepancies >> from the SATA specification. >> >> The initial consumer of the modified interface will be AHCI driver >> implementing SATA port multiplier support. >> >> Since the existing SATA HBA drivers and SATA module do not currently >> implement >> the structure version checking (except for sata_hba_tran structure), the >> proposed change will maintain the binary compatibility of the modified >> interface structure (sata_device). >> >> A SATA module supporting these interface changes will operate with >> SATA HBA >> drivers using the unmodified interface as well as SATA HBA drivers >> using the >> modified interface. >> >> 4.3.2. Interface Modifications >> ------------------------------ >> a) Add new structure sata_gscr. >> (See section 5.2.1 for more details) >> >> b) Modified sata_device structure. Add new field satadev_pmult_gscr >> for port >> multiplier device. >> (See section 5.3.1 for more details) >> >> c) The sata_device structure version (SATA_DEVICE_REV) will be >> increased to >> indicate added functionality. Current veriosn level is 1 - it >> will be increased to 2. >> (See section 5.3.1 for more details). >> >> d) The sata_hba_tran structure version (SATA_TRAN_HBA_REV) will be >> increased >> to 3 to indicate new functionality level of the entire SATA framework >> interface. >> (See section 5.3.2 for more details) >> >> e) Add three new SATA module interface functions. >> + sata_get_rdwr_pmult_pkt(); >> + sata_free_rdwr_pmult_pkt(); >> + sata_check_pmult_blacklist(); >> (See section 5.4 for more details) >> >> 4.5. Stability level >> -------------------- >> The stability level of the new interfaces will be the same as the >> other interfaces between SATA HBA Framework (SATA module) and >> SATA HBA driver, i.e. Consolidation Private. >> The requested release binding is micro release and patch release. >> >> >> 5. Interface Table >> ================== >> >> 5.1. Exported Interfaces >> ------------------------ >> >> ------------------------------------------------------------------------ >> Interface Level Comments >> ------------------------------------------------------------------------ >> SATA_DEVICE_REV Consolidation Symbol >> Private (redefine) >> SATA_DEVICE_REV_2 Consolidation sata_device version >> Private (new) >> SATA_TRAN_HBA_REV Consolidation Symbol >> Private (redefine) >> SATA_TRAN_HBA_REV_3 Consolidation sata_hba_tran version >> Private (new) >> sata_pmult_gscr Consolidation Interface structure >> Private (new) >> sata_device Consolidation Interface structure >> Private (modified) >> satadev_gscr Consolidation Interface structure >> Private (new) >> sata_get_rdwr_pmult_pkt Consolidation Interface function >> Private (new) >> sata_free_rdwr_pmult_pkt Consolidation Interface function >> Private (new) >> sata_check_pmult_blacklist Consolidation Interface function >> Private (new) >> >> 5.2. New structures >> ------------------- >> >> 5.2.1. New structure: sata_pmult_gscr >> ------------------------------------- >> struct sata_pmult_gscr { >> uint32_t gscr0; /* Product Identifier register */ >> uint32_t gscr1; /* Resrved Information register */ >> uint32_t gscr2; /* Port Information register */ >> uint32_t gscr64; /* Feature register */ >> }; >> >> >> 5.3. Redefined symbols >> ---------------------- >> >> 5.3.1. Redefine: SATA_DEVICE_REV & sata_device >> ---------------------------------------------- >> Modified field is indicated by a change bar. >> >> Old definition: >> #define SATA_DEVICE_REV_1 1 >> |#define SATA_DEVICE_REV SATA_DEVICE_REV_1 >> >> struct sata_device >> { >> int satadev_rev; /* structure version */ >> struct sata_address satadev_addr; /* sata port/device address */ >> uint32_t satadev_state; /* Port or device state */ >> uint32_t satadev_type; /* Attached device type */ >> struct sata_port_scr satadev_scr; /* Port status and ctrl regs */ >> uint32_t satadev_add_info; /* additional information, */ >> /* function specific */ >> }; >> >> New definition: >> #define SATA_DEVICE_REV_1 1 >> |#define SATA_DEVICE_REV_2 2 >> |#define SATA_DEVICE_REV SATA_DEVICE_REV_1 >> >> struct sata_device >> { >> int satadev_rev; /* structure version */ >> struct sata_address satadev_addr; /* sata port/device address */ >> uint32_t satadev_state; /* Port or device state */ >> uint32_t satadev_type; /* Attached device type */ >> struct sata_port_scr satadev_scr; /* Port status and ctrl regs */ >> uint32_t satadev_add_info; /* additional information, */ >> /* function specific */ >> | struct sata_pmult_gscr satadev_gscr; /* Port multiplier specific >> | global status and control >> | registers */ >> }; >> >> Implementation Notes: >> >> The satadev_gscr block is added for port multiplier's global status and >> control registers. >> >> >> 5.3.2. SATA_TRAN_HBA_REV redefinition >> ------------------------------------- >> Old definition: >> #define SATA_TRAN_HBA_REV SATA_TRAN_HBA_REV_2 >> >> New definitions: >> #define SATA_TRAN_HBA_REV_3 3 >> #define SATA_TRAN_HBA_REV SATA_TRAN_HBA_REV_3 >> >> Only version level of the sata_hba_tran structure is modified to indicate >> new functionality level of the entire SATA framework interface. >> New functionality includes: >> a) SATA module functions to get and free READ/WRITE PORTMULT sata >> packets. >> b) SATA port multiplier blacklist in SATA module >> c) Enable sata_device structure to support port multiplier device. >> New interface version (SATA_TRAN_HBA_REV_3) level also implies version >> 2 of >> the sata_device structure definition. >> >> >> 5.4. New Interface Functions >> ---------------------------- >> >> 5.4.1. sata_get_rdwr_pmult_pkt >> ------------------------------ >> #define SATA_RDWR_PMULT_PKT_TYPE_READ 1 >> #define SATA_RDWR_PMULT_PKT_TYPE_WRITE 2 >> >> NAME >> >> sata_get_rdwr_pmult_pkt - get sata packet to execute READ/WRITE >> PORTMULT >> command >> >> SYNOPSIS >> >> #include <sys/sata/impl/sata_hba.h> >> >> sata_pkt_t *sata_get_rdwr_pmult_pkt(dev_info_t *dip, >> sata_device_t *sata_device, uint8_t regn, >> uint32_t regv, uint32_t type); >> >> INTERFACE LEVEL >> >> Consolidation Private >> >> PARAMETERS >> >> dip >> Pointer to a dev_info_t structure, referring to the HBA device >> instance. >> >> sata_device >> Pointer to the structure specifying the SATA device address. >> >> regn >> Register that is supposed to be read/write. >> >> regv >> The value of the target register. This parameter is only used >> when the type parameter is set to SATA_RDWR_PMULT_PKT_TYPE_WRITE. >> >> type >> SATA_RDWR_PMULT_PKT_TYPE_READ Returned sata_pkt structure should >> contain >> READ PORTMULT command. >> >> SATA_RDWR_PMULT_PKT_TYPE_WRITE Returned sata_pkt structure should >> contain >> WRITE PORTMULT command. >> >> DESCRIPTION >> >> The sata_get_rdwr_pmult_pkt function is called by SATA HBA driver >> to obtain >> a fully initialized sata_pkt containing a READ/WRITE PORTMULT >> command, as >> well as a DMA-capable data buffer and DMA resources for the data >> buffer. >> The data buffer will satisfy HBA DMA attributes restrictions. The >> same >> data buffer could be also used for programmed I/O. >> >> The target register is specified by the regn argument. The command >> type is >> specified by type argument. >> >> The initialized sata packet does not specify any completion callback >> routine. No packet completion reason nor packet status is to be >> returned >> to SATA module. Once the SATA HBA completes sata_pkt usage, it >> should call >> sata_free_rdwr_pmult_pkt() function to free the packet and allocated >> resources. >> >> RETURN VALUES >> Returns a pointer to initialized sata_pkt if the function succeeds, >> and returns Null, if packet could not be allocated and/or >> initialized. >> >> CONTEXT >> This function cannot be called from the interrupt context. >> >> >> 5.4.2. sata_free_rdwr_pmult_pkt >> ------------------------------- >> >> NAME >> sata_free_rdwr_pmult_pkt - free sata packet allocated >> for READ/WRITE PORTMULT command >> >> SYNOPSIS >> #include <sys/sata/impl/sata_hba.h> >> >> void sata_free_rdwr_pmult_pkt(sata_pkt_t *sata_pkt); >> >> INTERFACE LEVEL >> >> Consolidation Private >> >> PARAMETERS >> sata_pkt sata_pkt allocated previoulsy by the >> sata_get_rdwr_pmult_pkt(). >> >> DESCRIPTION >> sata_free_rdwr_pmult_pkt function is called by the SATA HBA driver in >> order to release the sata_pkt structure allocated previously by >> sata_get_rdwr_pmult_pkt(). All resources associated with the >> packet are >> freed. After calling this function, the SATA HBA driver should not >> attempt >> to access any field and/or data buffer associated with the freed >> sata_pkt. >> >> RETURN VALUES >> Void >> >> CONTEXT >> This function may be called from the interrupt context. >> >> 5.4.3. sata_check_pmult_blacklist >> --------------------------------- >> >> NAME >> sata_check_pmult_blacklist - check if a port multiplier is on the >> blacklist >> >> SYNOPSIS >> #include <sys/sata/impl/sata_hba.h> >> >> int sata_check_pmult_blacklist(sata_device_t *sata_device); >> >> INTERFACE LEVEL >> >> Consolidation Private >> >> PARAMETERS >> sata_device Pointer to the sata_device structure that contains >> the global >> status and control register values of a port >> multiplier. >> >> DESCRIPTION >> sata_check_pmult_blacklist function is called by the SATA HBA >> driver in order to check if a port multiplier has any quirk. >> >> Some port multipliers have quirks, e.x. register values are not >> correctly >> configured. The SATA framework maintains a blacklist hence these port >> multiplier could be identified and properly handled. >> >> The model of a port multiplier can be uniquely identified by its >> read-only >> Global Status and Control Registers (GSCR[0,1,2]). In case a port >> multiplier >> is on the blacklist, this function will write the corresponding >> flags into >> satadev_add_info. >> >> RETURN VALUES >> SATA_SUCCESS The device is found on the blacklist and the >> sata_device >> structure is successfully updated. >> >> SATA_FAILURE The device is not on the blacklist. >> >> CONTEXT >> This function may be called from the interrupt context. >> >> >> 5.5. Release Summary >> >> S11, S10 Update >> >> 5.6. Packaging Changes >> >> 5.6.1. Binaries Modified >> ---------------------- >> /kernel/misc/sata >> /kernel/misc/amd64/sata >> /usr/include/sys/sata/sata_hba.h >> >> 5.6.2. Packages Affected >> ---------------------- >> SUNWckr >> SUNWhea >> >> 5.7. References >> >> [1] PSARC/2004/779 - SATA Framework Support >> [2] PSARC/2005/679 - SATA Framework Support (Updated) >> [3] PSARC/2007/274 - SATA Framework Interface Revision >> [4] PSARC/2008/448 - SATA Framework Addition >> [5] SATA Specification 2.6, Serial ATA International Organization >> [6] SATA Port Multiplier Specification 1.2, Serial ATA International >> Organization >> >> 6. Resources and Schedule >> 6.4. Steering Committee requested information >> 6.4.1. Consolidation C-team Name: >> ON >> 6.5. ARC review type: Automatic >> 6.6. ARC Exposure: open >> >> >