#ifndef _LSI_SCSI_DXE_H_\r
#define _LSI_SCSI_DXE_H_\r
\r
+typedef struct {\r
+ //\r
+ // Allocate 32 UINT32 entries for the script and it's sufficient for\r
+ // 16 instructions.\r
+ //\r
+ UINT32 Script[32];\r
+ //\r
+ // The max size of CDB is 32.\r
+ //\r
+ UINT8 Cdb[32];\r
+ //\r
+ // Allocate 64KB for read/write buffer. It seems sufficient for the common\r
+ // boot scenarios.\r
+ //\r
+ // NOTE: The number of bytes for data transmission is bounded by DMA Byte\r
+ // Count (DBC), a 24-bit register, so the maximum is 0xFFFFFF (16MB-1).\r
+ //\r
+ UINT8 Data[SIZE_64KB];\r
+ //\r
+ // For SCSI Message In phase\r
+ //\r
+ UINT8 MsgIn[2];\r
+ //\r
+ // For SCSI Message Out phase\r
+ //\r
+ UINT8 MsgOut;\r
+ //\r
+ // For SCSI Status phase\r
+ //\r
+ UINT8 Status;\r
+} LSI_SCSI_DMA_BUFFER;\r
+\r
+typedef struct {\r
+ UINT32 Signature;\r
+ UINT64 OrigPciAttrs;\r
+ EFI_EVENT ExitBoot;\r
+ EFI_PCI_IO_PROTOCOL *PciIo;\r
+ UINT8 MaxTarget;\r
+ UINT8 MaxLun;\r
+ UINT32 StallPerPollUsec;\r
+ LSI_SCSI_DMA_BUFFER *Dma;\r
+ EFI_PHYSICAL_ADDRESS DmaPhysical;\r
+ VOID *DmaMapping;\r
+ EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;\r
+ EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;\r
+} LSI_SCSI_DEV;\r
+\r
+#define LSI_SCSI_DEV_SIGNATURE SIGNATURE_32 ('L','S','I','S')\r
+\r
+#define LSI_SCSI_FROM_PASS_THRU(PassThruPtr) \\r
+ CR (PassThruPtr, LSI_SCSI_DEV, PassThru, LSI_SCSI_DEV_SIGNATURE)\r
+\r
+#define LSI_SCSI_DMA_ADDR(Dev, MemberName) \\r
+ ((UINT32)(Dev->DmaPhysical + OFFSET_OF (LSI_SCSI_DMA_BUFFER, MemberName)))\r
+\r
//\r
// Probe, start and stop functions of this driver, called by the DXE core for\r
// specific devices.\r
EFI_STATUS\r
EFIAPI\r
LsiScsiControllerSupported (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
LsiScsiControllerStart (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
LsiScsiControllerStop (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
+ );\r
+\r
+//\r
+// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL\r
+// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,\r
+// sections\r
+// - 14.1 SCSI Driver Model Overview,\r
+// - 14.7 Extended SCSI Pass Thru Protocol.\r
+//\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiPassThru (\r
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+ IN UINT8 *Target,\r
+ IN UINT64 Lun,\r
+ IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,\r
+ IN EFI_EVENT Event OPTIONAL\r
);\r
\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetNextTargetLun (\r
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+ IN OUT UINT8 **TargetPointer,\r
+ IN OUT UINT64 *Lun\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiBuildDevicePath (\r
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+ IN UINT8 *Target,\r
+ IN UINT64 Lun,\r
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetTargetLun (\r
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+ OUT UINT8 **TargetPointer,\r
+ OUT UINT64 *Lun\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiResetChannel (\r
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiResetTargetLun (\r
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+ IN UINT8 *Target,\r
+ IN UINT64 Lun\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+LsiScsiGetNextTarget (\r
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,\r
+ IN OUT UINT8 **TargetPointer\r
+ );\r
\r
//\r
// The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and\r
EFI_STATUS\r
EFIAPI\r
LsiScsiGetDriverName (\r
- IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
- IN CHAR8 *Language,\r
- OUT CHAR16 **DriverName\r
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
+ IN CHAR8 *Language,\r
+ OUT CHAR16 **DriverName\r
);\r
\r
EFI_STATUS\r
EFIAPI\r
LsiScsiGetDeviceName (\r
- IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
- IN EFI_HANDLE DeviceHandle,\r
- IN EFI_HANDLE ChildHandle,\r
- IN CHAR8 *Language,\r
- OUT CHAR16 **ControllerName\r
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,\r
+ IN EFI_HANDLE DeviceHandle,\r
+ IN EFI_HANDLE ChildHandle,\r
+ IN CHAR8 *Language,\r
+ OUT CHAR16 **ControllerName\r
);\r
\r
#endif // _LSI_SCSI_DXE_H_\r