summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h
diff options
context:
space:
mode:
Diffstat (limited to 'MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h')
-rw-r--r--MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h833
1 files changed, 833 insertions, 0 deletions
diff --git a/MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h b/MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h
new file mode 100644
index 0000000..49b97a8
--- /dev/null
+++ b/MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h
@@ -0,0 +1,833 @@
+/** @file
+ Copyright (c) 2006, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ Module Name: AtapiPassThru.h
+
+**/
+
+#ifndef _APT_H
+#define _APT_H
+
+
+//
+// The package level header files this module uses
+//
+#include <Uefi.h>
+//
+// The protocols, PPI and GUID defintions for this module
+//
+#include <Protocol/ScsiPassThru.h>
+#include <Protocol/PciIo.h>
+//
+// The Library classes this module consumes
+//
+#include <Library/DebugLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/BaseLib.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <IndustryStandard/pci22.h>
+
+///
+/// bit definition
+///
+#define bit(a) (1 << (a))
+
+#define MAX_TARGET_ID 4
+
+//
+// IDE Registers
+//
+typedef union {
+ UINT16 Command; /* when write */
+ UINT16 Status; /* when read */
+} IDE_CMD_OR_STATUS;
+
+typedef union {
+ UINT16 Error; /* when read */
+ UINT16 Feature; /* when write */
+} IDE_ERROR_OR_FEATURE;
+
+typedef union {
+ UINT16 AltStatus; /* when read */
+ UINT16 DeviceControl; /* when write */
+} IDE_AltStatus_OR_DeviceControl;
+
+///
+/// IDE registers set
+///
+typedef struct {
+ UINT16 Data;
+ IDE_ERROR_OR_FEATURE Reg1;
+ UINT16 SectorCount;
+ UINT16 SectorNumber;
+ UINT16 CylinderLsb;
+ UINT16 CylinderMsb;
+ UINT16 Head;
+ IDE_CMD_OR_STATUS Reg;
+
+ IDE_AltStatus_OR_DeviceControl Alt;
+ UINT16 DriveAddress;
+
+ UINT16 MasterSlave;
+} IDE_BASE_REGISTERS;
+
+#define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE EFI_SIGNATURE_32 ('a', 's', 'p', 't')
+
+typedef struct {
+ UINTN Signature;
+
+ EFI_HANDLE Handle;
+ EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru;
+ EFI_SCSI_PASS_THRU_MODE ScsiPassThruMode;
+ EFI_PCI_IO_PROTOCOL *PciIo;
+
+ //
+ // Local Data goes here
+ //
+ IDE_BASE_REGISTERS *IoPort;
+
+ CHAR16 ControllerName[100];
+ CHAR16 ChannelName[100];
+
+ UINT32 LatestTargetId;
+ UINT64 LatestLun;
+
+} ATAPI_SCSI_PASS_THRU_DEV;
+
+#define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \
+ CR (a, \
+ ATAPI_SCSI_PASS_THRU_DEV, \
+ ScsiPassThru, \
+ ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE \
+ )
+
+//
+// Global Variables
+//
+extern EFI_DRIVER_BINDING_PROTOCOL gAtapiScsiPassThruDriverBinding;
+extern EFI_COMPONENT_NAME_PROTOCOL gAtapiScsiPassThruComponentName;
+
+//
+// ATAPI Command op code
+//
+#define OP_INQUIRY 0x12
+#define OP_LOAD_UNLOAD_CD 0xa6
+#define OP_MECHANISM_STATUS 0xbd
+#define OP_MODE_SELECT_10 0x55
+#define OP_MODE_SENSE_10 0x5a
+#define OP_PAUSE_RESUME 0x4b
+#define OP_PLAY_AUDIO_10 0x45
+#define OP_PLAY_AUDIO_MSF 0x47
+#define OP_PLAY_CD 0xbc
+#define OP_PLAY_CD_MSF 0xb4
+#define OP_PREVENT_ALLOW_MEDIUM_REMOVAL 0x1e
+#define OP_READ_10 0x28
+#define OP_READ_12 0xa8
+#define OP_READ_CAPACITY 0x25
+#define OP_READ_CD 0xbe
+#define OP_READ_CD_MSF 0xb9
+#define OP_READ_HEADER 0x44
+#define OP_READ_SUB_CHANNEL 0x42
+#define OP_READ_TOC 0x43
+#define OP_REQUEST_SENSE 0x03
+#define OP_SCAN 0xba
+#define OP_SEEK_10 0x2b
+#define OP_SET_CD_SPEED 0xbb
+#define OP_STOPPLAY_SCAN 0x4e
+#define OP_START_STOP_UNIT 0x1b
+#define OP_TEST_UNIT_READY 0x00
+
+#define OP_FORMAT_UNIT 0x04
+#define OP_READ_FORMAT_CAPACITIES 0x23
+#define OP_VERIFY 0x2f
+#define OP_WRITE_10 0x2a
+#define OP_WRITE_12 0xaa
+#define OP_WRITE_AND_VERIFY 0x2e
+
+//
+// ATA Command
+//
+#define ATAPI_SOFT_RESET_CMD 0x08
+
+typedef enum {
+ DataIn = 0,
+ DataOut = 1,
+ NoData = 2,
+ End = 0xff
+} DATA_DIRECTION;
+
+typedef struct {
+ UINT8 OpCode;
+ DATA_DIRECTION Direction;
+} SCSI_COMMAND_SET;
+
+#define MAX_CHANNEL 2
+
+#define ValidCdbLength(Len) ((Len) == 6 || (Len) == 10 || (Len) == 12) ? 1 : 0
+
+//
+// IDE registers bit definitions
+//
+// ATA Err Reg bitmap
+//
+#define BBK_ERR bit (7) ///< Bad block detected
+#define UNC_ERR bit (6) ///< Uncorrectable Data
+#define MC_ERR bit (5) ///< Media Change
+#define IDNF_ERR bit (4) ///< ID Not Found
+#define MCR_ERR bit (3) ///< Media Change Requested
+#define ABRT_ERR bit (2) ///< Aborted Command
+#define TK0NF_ERR bit (1) ///< Track 0 Not Found
+#define AMNF_ERR bit (0) ///< Address Mark Not Found
+
+//
+// ATAPI Err Reg bitmap
+//
+#define SENSE_KEY_ERR (bit (7) | bit (6) | bit (5) | bit (4))
+#define EOM_ERR bit (1) ///< End of Media Detected
+#define ILI_ERR bit (0) ///< Illegal Length Indication
+
+//
+// Device/Head Reg
+//
+#define LBA_MODE bit (6)
+#define DEV bit (4)
+#define HS3 bit (3)
+#define HS2 bit (2)
+#define HS1 bit (1)
+#define HS0 bit (0)
+#define CHS_MODE (0)
+#define DRV0 (0)
+#define DRV1 (1)
+#define MST_DRV DRV0
+#define SLV_DRV DRV1
+
+//
+// Status Reg
+//
+#define BSY bit (7) ///< Controller Busy
+#define DRDY bit (6) ///< Drive Ready
+#define DWF bit (5) ///< Drive Write Fault
+#define DSC bit (4) ///< Disk Seek Complete
+#define DRQ bit (3) ///< Data Request
+#define CORR bit (2) ///< Corrected Data
+#define IDX bit (1) ///< Index
+#define ERR bit (0) ///< Error
+#define CHECK bit (0) ///< Check bit for ATAPI Status Reg
+
+//
+// Device Control Reg
+//
+#define SRST bit (2) ///< Software Reset
+#define IEN_L bit (1) ///< Interrupt Enable
+
+//
+// ATAPI Feature Register
+//
+#define OVERLAP bit (1)
+#define DMA bit (0)
+
+//
+// ATAPI Interrupt Reason Reson Reg (ATA Sector Count Register)
+//
+#define RELEASE bit (2)
+#define IO bit (1)
+#define CoD bit (0)
+
+#define PACKET_CMD 0xA0
+
+#define DEFAULT_CMD (0xa0)
+//
+// default content of device control register, disable INT
+//
+#define DEFAULT_CTL (0x0a)
+#define MAX_ATAPI_BYTE_COUNT (0xfffe)
+
+//
+// function prototype
+//
+
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruDriverBindingSupported (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE Controller,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
+ );
+
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruDriverBindingStart (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE Controller,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
+ );
+
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruDriverBindingStop (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE Controller,
+ IN UINTN NumberOfChildren,
+ IN EFI_HANDLE *ChildHandleBuffer
+ );
+
+//
+// EFI Component Name Functions
+//
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruComponentNameGetDriverName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN CHAR8 *Language,
+ OUT CHAR16 **DriverName
+ );
+
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruComponentNameGetControllerName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN EFI_HANDLE ControllerHandle,
+ IN EFI_HANDLE ChildHandle OPTIONAL,
+ IN CHAR8 *Language,
+ OUT CHAR16 **ControllerName
+ );
+
+/**
+ AtapiScsiPassThruDriverEntryPoint
+
+ @param ImageHandle
+ @param SystemTable
+
+ @todo Add function description
+ @todo ImageHandle - add argument description
+ @todo SystemTable - add argument description
+ @todo add return values
+--*/
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruDriverEntryPoint (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+;
+
+/**
+ RegisterAtapiScsiPassThru
+
+ @param This
+ @param Controller
+ @param PciIo
+
+ @todo Add function description
+ @todo This add argument description
+ @todo Controller add argument description
+ @todo PciIo add argument description
+ @todo add return values
+**/
+EFI_STATUS
+RegisterAtapiScsiPassThru (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE Controller,
+ IN EFI_PCI_IO_PROTOCOL *PciIo
+ )
+;
+
+/**
+ AtapiScsiPassThruFunction
+
+ @param This
+ @param Target
+ @param Lun
+ @param Packet
+ @param Event
+
+ @todo Add function description
+ @todo This - add argument description
+ @todo Target - add argument description
+ @todo Lun - add argument description
+ @todo Packet - add argument description
+ @todo Event - add argument description
+ @todo add return values
+**/
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruFunction (
+ IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT32 Target,
+ IN UINT64 Lun,
+ IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
+ IN EFI_EVENT Event OPTIONAL
+ )
+;
+
+/**
+ AtapiScsiPassThruGetNextDevice
+
+ TODO: Add function description
+
+ @param This TODO: add argument description
+ @param Target TODO: add argument description
+ @param Lun TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruGetNextDevice (
+ IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
+ IN OUT UINT32 *Target,
+ IN OUT UINT64 *Lun
+ )
+;
+
+/**
+ AtapiScsiPassThruBuildDevicePath
+
+ TODO: Add function description
+
+ @param This TODO: add argument description
+ @param Target TODO: add argument description
+ @param Lun TODO: add argument description
+ @param DevicePath TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruBuildDevicePath (
+ IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT32 Target,
+ IN UINT64 Lun,
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
+ )
+;
+
+/**
+ AtapiScsiPassThruGetTargetLun
+
+ TODO: Add function description
+
+ @param This TODO: add argument description
+ @param DevicePath TODO: add argument description
+ @param Target TODO: add argument description
+ @param Lun TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruGetTargetLun (
+ IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
+ OUT UINT32 *Target,
+ OUT UINT64 *Lun
+ )
+;
+
+/**
+ AtapiScsiPassThruResetChannel
+
+ TODO: Add function description
+
+ @param This TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruResetChannel (
+ IN EFI_SCSI_PASS_THRU_PROTOCOL *This
+ )
+;
+
+/**
+ AtapiScsiPassThruResetTarget
+
+ TODO: Add function description
+
+ @param This TODO: add argument description
+ @param Target TODO: add argument description
+ @param Lun TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+EFIAPI
+AtapiScsiPassThruResetTarget (
+ IN EFI_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT32 Target,
+ IN UINT64 Lun
+ )
+;
+
+/**
+ CheckSCSIRequestPacket
+
+ TODO: Add function description
+
+ @param Packet TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+CheckSCSIRequestPacket (
+ EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
+ )
+;
+
+/**
+ SubmitBlockingIoCommand
+
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param Target TODO: add argument description
+ @param Packet TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+SubmitBlockingIoCommand (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT32 Target,
+ EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
+ )
+;
+
+/**
+ IsCommandValid
+
+ TODO: Add function description
+
+ @param Packet - TODO: add argument description
+
+ @return TODO: add return values
+
+--*/
+BOOLEAN
+IsCommandValid (
+ EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
+ )
+;
+
+/**
+ RequestSenseCommand
+
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param Target TODO: add argument description
+ @param Timeout TODO: add argument description
+ @param SenseData TODO: add argument description
+ @param SenseDataLength TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+RequestSenseCommand (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT32 Target,
+ UINT64 Timeout,
+ VOID *SenseData,
+ UINT8 *SenseDataLength
+ )
+;
+
+/**
+ AtapiPacketCommand
+
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param Target TODO: add argument description
+ @param PacketCommand TODO: add argument description
+ @param Buffer TODO: add argument description
+ @param ByteCount TODO: add argument description
+ @param Direction TODO: add argument description
+ @param TimeOutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+AtapiPacketCommand (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT32 Target,
+ UINT8 *PacketCommand,
+ VOID *Buffer,
+ UINT32 *ByteCount,
+ DATA_DIRECTION Direction,
+ UINT64 TimeOutInMicroSeconds
+ )
+;
+
+
+/**
+ ReadPortB
+
+ TODO: Add function description
+
+ @param PciIo TODO: add argument description
+ @param Port TODO: add argument description
+
+ TODO: add return values
+
+**/
+UINT8
+ReadPortB (
+ IN EFI_PCI_IO_PROTOCOL *PciIo,
+ IN UINT16 Port
+ )
+;
+
+
+/**
+ ReadPortW
+
+ TODO: Add function description
+
+ @param PciIo TODO: add argument description
+ @param Port TODO: add argument description
+
+ TODO: add return values
+
+**/
+UINT16
+ReadPortW (
+ IN EFI_PCI_IO_PROTOCOL *PciIo,
+ IN UINT16 Port
+ )
+;
+
+
+/**
+ WritePortB
+
+ TODO: Add function description
+
+ @param PciIo TODO: add argument description
+ @param Port TODO: add argument description
+ @param Data TODO: add argument description
+
+ TODO: add return values
+
+**/
+VOID
+WritePortB (
+ IN EFI_PCI_IO_PROTOCOL *PciIo,
+ IN UINT16 Port,
+ IN UINT8 Data
+ )
+;
+
+
+/**
+ WritePortW
+
+ TODO: Add function description
+
+ @param PciIo TODO: add argument description
+ @param Port TODO: add argument description
+ @param Data TODO: add argument description
+
+ TODO: add return values
+
+**/
+VOID
+WritePortW (
+ IN EFI_PCI_IO_PROTOCOL *PciIo,
+ IN UINT16 Port,
+ IN UINT16 Data
+ )
+;
+
+/**
+ StatusDRQClear
+
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeOutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+StatusDRQClear (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeOutInMicroSeconds
+ )
+;
+
+/**
+ AltStatusDRQClear
+
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeOutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+AltStatusDRQClear (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeOutInMicroSeconds
+ )
+;
+
+/**
+ StatusDRQReady
+
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeOutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+StatusDRQReady (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeOutInMicroSeconds
+ )
+;
+
+/**
+ AltStatusDRQReady
+
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeOutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+AltStatusDRQReady (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeOutInMicroSeconds
+ )
+;
+
+/**
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeoutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+StatusWaitForBSYClear (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeoutInMicroSeconds
+ )
+;
+
+/**
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeoutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+AltStatusWaitForBSYClear (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeoutInMicroSeconds
+ )
+;
+
+/**
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeoutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+StatusDRDYReady (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeoutInMicroSeconds
+ )
+;
+
+/**
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param TimeoutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+AltStatusDRDYReady (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT64 TimeoutInMicroSeconds
+ )
+;
+
+/**
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+ @param Buffer TODO: add argument description
+ @param ByteCount TODO: add argument description
+ @param Direction TODO: add argument description
+ @param TimeOutInMicroSeconds TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+AtapiPassThruPioReadWriteData (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate,
+ UINT16 *Buffer,
+ UINT32 *ByteCount,
+ DATA_DIRECTION Direction,
+ UINT64 TimeOutInMicroSeconds
+ )
+;
+
+/**
+ TODO: Add function description
+
+ @param AtapiScsiPrivate TODO: add argument description
+
+ TODO: add return values
+
+**/
+EFI_STATUS
+AtapiPassThruCheckErrorStatus (
+ ATAPI_SCSI_PASS_THRU_DEV *AtapiScsiPrivate
+ )
+;
+#endif