audk/OvmfPkg/Include/IndustryStandard/LsiScsi.h

106 lines
3.0 KiB
C
Raw Normal View History

/** @file
Macros and type definitions for LSI 53C895A SCSI devices.
Copyright (C) 2020, SUSE LLC.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _LSI_SCSI_H_
#define _LSI_SCSI_H_
//
// Device ID
//
#define LSI_LOGIC_PCI_VENDOR_ID 0x1000
#define LSI_53C895A_PCI_DEVICE_ID 0x0012
//
// LSI 53C895A Registers
//
#define LSI_REG_DSTAT 0x0C
#define LSI_REG_ISTAT0 0x14
#define LSI_REG_DSP 0x2C
#define LSI_REG_SIST0 0x42
#define LSI_REG_SIST1 0x43
OvmfPkg/LsiScsiDxe: Process the SCSI Request Packet 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 <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Signed-off-by: Gary Lin <glin@suse.com> Message-Id: <20200717061130.8881-11-glin@suse.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
2020-07-17 08:11:29 +02:00
#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)
//
#define LSI_ISTAT0_DIP BIT0
#define LSI_ISTAT0_SIP BIT1
#define LSI_ISTAT0_INTF BIT2
#define LSI_ISTAT0_CON BIT3
#define LSI_ISTAT0_SEM BIT4
#define LSI_ISTAT0_SIGP BIT5
#define LSI_ISTAT0_SRST BIT6
#define LSI_ISTAT0_ABRT BIT7
OvmfPkg/LsiScsiDxe: Process the SCSI Request Packet 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 <jordan.l.justen@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Signed-off-by: Gary Lin <glin@suse.com> Message-Id: <20200717061130.8881-11-glin@suse.com> Reviewed-by: Laszlo Ersek <lersek@redhat.com>
2020-07-17 08:11:29 +02:00
//
// 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_