Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

/*******************************************************************************
*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved. 
*
*Redistribution and use in source and binary forms, with or without modification, are permitted provided 
*that the following conditions are met: 
*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
*following disclaimer. 
*2. Redistributions in binary form must reproduce the above copyright notice, 
*this list of conditions and the following disclaimer in the documentation and/or other materials provided
*with the distribution. 
*
*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 
*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*
* $FreeBSD$
*
********************************************************************************/
/********************************************************************************
**    
*   sm.h 
*
*   Abstract:   This module defines the contants, enum and #define definition used
*               by SAT Moduled (SM).
*     
********************************************************************************/

#ifndef SM_H
#define SM_H

/*************************************************
 *   constants for type field in smMem_t
 *************************************************/
#define SM_CACHED_MEM                             0x00     /**< CACHED memory type */
#define SM_DMA_MEM                                0x01     /**< DMA memory type */
#define SM_CACHED_DMA_MEM                         0x02     /**< CACHED DMA memory type */

/*************************************************
 *   constants for API return values
 *************************************************/
typedef enum
{
  SM_RC_SUCCESS,
  SM_RC_FAILURE,
  SM_RC_BUSY,
  SM_RC_NODEVICE,
  SM_RC_VERSION_INCOMPATIBLE,
  SM_RC_VERSION_UNTESTED,
  SM_RC_RSV1,
  SM_RC_RSV2,
  SM_RC_RSV3,
  SM_RC_RSV4,
  SM_RC_DEVICE_BUSY, /* must be the same as tiDeviceBusy */
  
} smStatus_t;

typedef enum
{
  smIOSuccess,
  smIOOverRun,
  smIOUnderRun,
  smIOFailed,
  smIODifError,
  smIOEncryptError,
  smIORetry,           /* open retry timeout */
  smIOSTPResourceBusy, /* stp resource busy */
} smIOStatus_t;

typedef enum
{
  smDetailBusy,
  smDetailNotValid,
  smDetailNoLogin,
  smDetailAbortLogin,
  smDetailAbortReset,
  smDetailAborted,
  smDetailDifMismatch,
  smDetailDifAppTagMismatch,
  smDetailDifRefTagMismatch,
  smDetailDifCrcMismatch,
  smDetailDekKeyCacheMiss,
  smDetailCipherModeInvalid,
  smDetailDekIVMismatch,
  smDetailDekRamInterfaceError,
  smDetailDekIndexOutofBounds,
  smDetailOtherError
} smIOStatusDetail_t;

/*
 * Data direction for I/O request
 */
typedef enum
{
  smDirectionIn   = 0x0000,
  smDirectionOut  = 0x0001
}smDataDirection_t;

/*
 * Event types for tdsmEventCB()
 * do not change: Needs to be in sync with TISA API
 */
typedef enum
{
  smIntrEventTypeCnxError,
  smIntrEventTypeDiscovery,
  smIntrEventTypeTransportRecovery,
  smIntrEventTypeTaskManagement,
  smIntrEventTypeDeviceChange,
  smIntrEventTypeLogin,
  smIntrEventTypeLocalAbort  
} smIntrEventType_t;

typedef enum
{
  smTMOK,
  smTMFailed
} smTMEventStatus_t;

/*
 * Flags in smSuperScsiInitiatorRequest_t
 */
#define SM_SCSI_INITIATOR_DIF         0x00000001
#define SM_SCSI_INITIATOR_ENCRYPT     0x00000002

/*
 * Flags in smSuperScsiInitiatorRequest_t
 */
#define SM_SCSI_TARGET_DIF         0x00000001
#define SM_SCSI_TARGET_MIRROR      0x00000002
#define SM_SCSI_TARGET_ENCRYPT     0x00000004

typedef struct {
                void		*tdData;
                void		*smData;
} smContext_t;


typedef    smContext_t    smDeviceHandle_t;

typedef    smContext_t    smIORequest_t;

typedef    smContext_t    smRoot_t;

typedef struct 
{
	bit8  lun[8];               /* logical unit number  */
} smLUN_t;

typedef struct{
		smLUN_t         lun;
		bit32           expDataLength;
		bit32           taskAttribute;
		bit32           crn;
		bit8            cdb[16];
} smIniScsiCmnd_t;



typedef struct{
               void 	*virtPtr;
               void 	*osHandle;
               bit32 	physAddrUpper;
               bit32 	physAddrLower;
               bit32 	totalLength;
               bit32 	numElements;
               bit32 	singleElementLength;
               bit32 	alignment;
               bit32 	type;
               bit32 	reserved;
} smMem_t;

#define SM_NUM_MEM_CHUNKS 8

typedef struct{
               bit32            count;
               smMem_t          smMemory[SM_NUM_MEM_CHUNKS];
} smMemoryRequirement_t;

typedef struct{
	       bit32 	lower;
	       bit32 	upper;
	       bit32 	len;
	       bit32 	type;
} smSgl_t;

/*
 * DIF operation
 */
#define DIF_INSERT                     0
#define DIF_VERIFY_FORWARD             1
#define DIF_VERIFY_DELETE              2
#define DIF_VERIFY_REPLACE             3
#define DIF_VERIFY_UDT_REPLACE_CRC     5
#define DIF_REPLACE_UDT_REPLACE_CRC    7

#define DIF_UDT_SIZE              6

typedef struct smDif
{
  agBOOLEAN   enableDIFPerLA;
  bit32       flag;
  bit16       initialIOSeed;
  bit16       reserved;
  bit32       DIFPerLAAddrLo;
  bit32       DIFPerLAAddrHi;
  bit16       DIFPerLARegion0SecCount;
  bit16       DIFPerLANumOfRegions;
  bit8        udtArray[DIF_UDT_SIZE];
  bit8        udrtArray[DIF_UDT_SIZE];  
} smDif_t;

typedef struct smEncryptDek {
    bit32          dekTable;
    bit32          dekIndex;
} smEncryptDek_t;

typedef struct smEncrypt {
  smEncryptDek_t     dekInfo;	
  bit32          kekIndex;
  agBOOLEAN      keyTagCheck;
  agBOOLEAN  	   enableEncryptionPerLA;    
  bit32          sectorSizeIndex;
  bit32          encryptMode;
  bit32          keyTag_W0;
  bit32          keyTag_W1;
  bit32          tweakVal_W0;
  bit32          tweakVal_W1;
  bit32          tweakVal_W2;
  bit32          tweakVal_W3;
  bit32          EncryptionPerLAAddrLo;
  bit32          EncryptionPerLAAddrHi;
  bit16          EncryptionPerLRegion0SecCount;
  bit16          reserved;
} smEncrypt_t;

typedef struct smScsiInitiatorRequest {
	      void                     *sglVirtualAddr;
	      smIniScsiCmnd_t          scsiCmnd;
	      smSgl_t                  smSgl1;
	      smDataDirection_t        dataDirection;
} smScsiInitiatorRequest_t;

typedef struct smSuperScsiInitiatorRequest
{
  void                *sglVirtualAddr;
  smIniScsiCmnd_t     scsiCmnd;     
  smSgl_t             smSgl1;
  smDataDirection_t   dataDirection;
  bit32               flags; /* 
                               bit 0-1: reserved
                               bit 2: enable encryption
                               bit 3: enable dif
                               bit 4-7: reserved
                               bit 8-23: DIF SKIP Bytes
                               bit 24-31: Reserved
                             */
  smDif_t             Dif;
  smEncrypt_t         Encrypt;
} smSuperScsiInitiatorRequest_t;

typedef struct{
	       void     *senseData;
	       bit8 	senseLen;
} smSenseData_t;

typedef struct{
               bit32			maxActiveIOs;
               bit32			numDevHandles;
#ifdef SM_DEBUG
               bit32			SMDebugLevel;
#endif
} smSwConfig_t;


#define smBOOLEAN  bit32










#endif  /* SM_H */