Alan Perry wrote: > 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. > > The case has been reviewed by at least two of the engineers that work > on the sata framework, including the owner of the framework, and > presented to the entire sata dev team. Who would review this case > outside of the sata dev team?
I don't know. But I do know that none of said members are represented on PSARC and that either way the case needs to be properly reviewed, or at least *available* for review. It definitely exceeds the self-review threshold. Assertions by project teams that a case is reviewed internally are *not* a substitute for review at ARC. -- Garrett > > 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 >>> >>> >> >