Skip to content

Commit

Permalink
OvmfPkg/LsiScsiDxe: Process the SCSI Request Packet
Browse files Browse the repository at this point in the history
This is the second part of LsiScsiPassThru(). LsiScsiProcessRequest() is
added to translate the SCSI Request Packet into the LSI 53C895A
commands. This function utilizes the so-called Script buffer to transmit
a series of commands to the chip and then polls the DMA Status (DSTAT)
register until the Scripts Interrupt Instruction Received (SIR) bit
sets. Once the script is done, the SCSI Request Packet will be modified
to reflect the result of the script. The Cumulative SCSI Byte Count
(CSBC) register is fetched before and after the script to calculate the
transferred bytes and update InTransferLength/OutTransferLength if
necessary.

v3:
  - Set DStat, SIst0, and SIst1 to 0 before using them
  - Amend the if statements for the DMA data instruction and add the
    assertions for the data direction
  - Also set SenseDataLength to 0 on the error path
  - Fix typos and amend comments
  - Amend the error handling of the calculation of transferred bytes
v2:
  - Use the BITx macros for the most of LSI_* constants
  - Fix a typo: contorller => controller
  - Add SeaBIOS lsi-scsi driver as one of the references of the script
  - Cast the result of sizeof to UINT32 for the instructions of the
    script
  - Drop the backslashes
  - Replace LSI_SCSI_DMA_ADDR_LOW with LSI_SCSI_DMA_ADDR since we
    already removed DUAL_ADDRESS_CYCLE
  - Add more comments for the script
  - Fix the check of the script size at the end of the script
  - Always set SenseDataLength to 0 to avoid the caller to access
    SenseData
  - Improve the error handling in LsiScsiProcessRequest()

Cc: Jordan Justen <[email protected]>
Cc: Laszlo Ersek <[email protected]>
Cc: Ard Biesheuvel <[email protected]>
Signed-off-by: Gary Lin <[email protected]>
Message-Id: <[email protected]>
Reviewed-by: Laszlo Ersek <[email protected]>
  • Loading branch information
lcp authored and mergify[bot] committed Jul 17, 2020
1 parent 97e6081 commit 31830b0
Show file tree
Hide file tree
Showing 5 changed files with 498 additions and 1 deletion.
64 changes: 64 additions & 0 deletions OvmfPkg/Include/IndustryStandard/LsiScsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,19 @@
#define LSI_REG_DSP 0x2C
#define LSI_REG_SIST0 0x42
#define LSI_REG_SIST1 0x43
#define LSI_REG_CSBC 0xDC

//
// The status bits for DMA Status (DSTAT)
//
#define LSI_DSTAT_IID BIT0
#define LSI_DSTAT_R BIT1
#define LSI_DSTAT_SIR BIT2
#define LSI_DSTAT_SSI BIT3
#define LSI_DSTAT_ABRT BIT4
#define LSI_DSTAT_BF BIT5
#define LSI_DSTAT_MDPE BIT6
#define LSI_DSTAT_DFE BIT7

//
// The status bits for Interrupt Status Zero (ISTAT0)
Expand All @@ -38,4 +51,55 @@
#define LSI_ISTAT0_SRST BIT6
#define LSI_ISTAT0_ABRT BIT7

//
// The status bits for SCSI Interrupt Status Zero (SIST0)
//
#define LSI_SIST0_PAR BIT0
#define LSI_SIST0_RST BIT1
#define LSI_SIST0_UDC BIT2
#define LSI_SIST0_SGE BIT3
#define LSI_SIST0_RSL BIT4
#define LSI_SIST0_SEL BIT5
#define LSI_SIST0_CMP BIT6
#define LSI_SIST0_MA BIT7

//
// The status bits for SCSI Interrupt Status One (SIST1)
//
#define LSI_SIST1_HTH BIT0
#define LSI_SIST1_GEN BIT1
#define LSI_SIST1_STO BIT2
#define LSI_SIST1_R3 BIT3
#define LSI_SIST1_SBMC BIT4
#define LSI_SIST1_R5 BIT5
#define LSI_SIST1_R6 BIT6
#define LSI_SIST1_R7 BIT7

//
// LSI 53C895A Script Instructions
//
#define LSI_INS_TYPE_BLK 0x00000000
#define LSI_INS_TYPE_IO BIT30
#define LSI_INS_TYPE_TC BIT31

#define LSI_INS_BLK_SCSIP_DAT_OUT 0x00000000
#define LSI_INS_BLK_SCSIP_DAT_IN BIT24
#define LSI_INS_BLK_SCSIP_CMD BIT25
#define LSI_INS_BLK_SCSIP_STAT (BIT24 | BIT25)
#define LSI_INS_BLK_SCSIP_MSG_OUT (BIT25 | BIT26)
#define LSI_INS_BLK_SCSIP_MSG_IN (BIT24 | BIT25 | BIT26)

#define LSI_INS_IO_OPC_SEL 0x00000000
#define LSI_INS_IO_OPC_WAIT_RESEL BIT28

#define LSI_INS_TC_CP BIT17
#define LSI_INS_TC_JMP BIT19
#define LSI_INS_TC_RA BIT23

#define LSI_INS_TC_OPC_JMP 0x00000000
#define LSI_INS_TC_OPC_INT (BIT27 | BIT28)

#define LSI_INS_TC_SCSIP_DAT_OUT 0x00000000
#define LSI_INS_TC_SCSIP_MSG_IN (BIT24 | BIT25 | BIT26)

#endif // _LSI_SCSI_H_
Loading

0 comments on commit 31830b0

Please sign in to comment.