1 /** @file
2 BOT Transportation implementation.
3 
4 Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
5 
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions
8 of the BSD License which accompanies this distribution.  The
9 full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11 
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #ifndef _PEI_BOT_PEIM_H_
18 #define _PEI_BOT_PEIM_H_
19 
20 
21 #include <PiPei.h>
22 
23 #include <Ppi/UsbIo.h>
24 #include <Ppi/UsbHostController.h>
25 #include <Ppi/BlockIo.h>
26 
27 //#include <Library/DebugLib.h>
28 #include <Library/PeimEntryPoint.h>
29 #include <Library/PeiServicesLib.h>
30 #include <Library/BaseMemoryLib.h>
31 
32 #include <IndustryStandard/Atapi.h>
33 
34 #pragma pack(1)
35 //
36 // Bulk Only device protocol
37 //
38 typedef struct {
39   UINT32  Signature;
40   UINT32  Tag;
41   UINT32  DataTransferLength;
42   UINT8   Flags;
43   UINT8   Lun;
44   UINT8   CmdLen;
45   UINT8   CmdBlock[16];
46 } CBW;
47 
48 typedef struct {
49   UINT32  Signature;
50   UINT32  Tag;
51   UINT32  DataResidue;
52   UINT8   Status;
53 } CSW;
54 
55 #pragma pack()
56 //
57 // Status code, see Usb Bot device spec
58 //
59 #define CSWSIG  0x53425355
60 #define CBWSIG  0x43425355
61 
62 /**
63   Sends out ATAPI Inquiry Packet Command to the specified device. This command will
64   return INQUIRY data of the device.
65 
66   @param PeiServices    The pointer of EFI_PEI_SERVICES.
67   @param PeiBotDevice   The pointer to PEI_BOT_DEVICE instance.
68 
69   @retval EFI_SUCCESS       Inquiry command completes successfully.
70   @retval EFI_DEVICE_ERROR  Inquiry command failed.
71 
72 **/
73 EFI_STATUS
74 PeiUsbInquiry (
75   IN  EFI_PEI_SERVICES  **PeiServices,
76   IN  PEI_BOT_DEVICE    *PeiBotDevice
77   );
78 
79 /**
80   Sends out ATAPI Test Unit Ready Packet Command to the specified device
81   to find out whether device is accessible.
82 
83   @param PeiServices    The pointer of EFI_PEI_SERVICES.
84   @param PeiBotDevice   The pointer to PEI_BOT_DEVICE instance.
85 
86   @retval EFI_SUCCESS        TestUnit command executed successfully.
87   @retval EFI_DEVICE_ERROR   Device cannot be executed TestUnit command successfully.
88 
89 **/
90 EFI_STATUS
91 PeiUsbTestUnitReady (
92   IN  EFI_PEI_SERVICES  **PeiServices,
93   IN  PEI_BOT_DEVICE    *PeiBotDevice
94   );
95 
96 /**
97   Sends out ATAPI Request Sense Packet Command to the specified device.
98 
99   @param PeiServices    The pointer of EFI_PEI_SERVICES.
100   @param PeiBotDevice   The pointer to PEI_BOT_DEVICE instance.
101   @param SenseCounts    Length of sense buffer.
102   @param SenseKeyBuffer Pointer to sense buffer.
103 
104   @retval EFI_SUCCESS           Command executed successfully.
105   @retval EFI_DEVICE_ERROR      Some device errors happen.
106 
107 **/
108 EFI_STATUS
109 PeiUsbRequestSense (
110   IN  EFI_PEI_SERVICES  **PeiServices,
111   IN  PEI_BOT_DEVICE    *PeiBotDevice,
112   OUT UINTN             *SenseCounts,
113   IN  UINT8             *SenseKeyBuffer
114   );
115 
116 /**
117   Sends out ATAPI Read Capacity Packet Command to the specified device.
118   This command will return the information regarding the capacity of the
119   media in the device.
120 
121   @param PeiServices    The pointer of EFI_PEI_SERVICES.
122   @param PeiBotDevice   The pointer to PEI_BOT_DEVICE instance.
123 
124   @retval EFI_SUCCESS           Command executed successfully.
125   @retval EFI_DEVICE_ERROR      Some device errors happen.
126 
127 **/
128 EFI_STATUS
129 PeiUsbReadCapacity (
130   IN  EFI_PEI_SERVICES  **PeiServices,
131   IN  PEI_BOT_DEVICE    *PeiBotDevice
132   );
133 
134 /**
135   Sends out ATAPI Read Format Capacity Data Command to the specified device.
136   This command will return the information regarding the capacity of the
137   media in the device.
138 
139   @param PeiServices    The pointer of EFI_PEI_SERVICES.
140   @param PeiBotDevice   The pointer to PEI_BOT_DEVICE instance.
141 
142   @retval EFI_SUCCESS           Command executed successfully.
143   @retval EFI_DEVICE_ERROR      Some device errors happen.
144 
145 **/
146 EFI_STATUS
147 PeiUsbReadFormattedCapacity (
148   IN  EFI_PEI_SERVICES  **PeiServices,
149   IN  PEI_BOT_DEVICE    *PeiBotDevice
150   );
151 
152 /**
153   Execute Read(10) ATAPI command on a specific SCSI target.
154 
155   Executes the ATAPI Read(10) command on the ATAPI target specified by PeiBotDevice.
156 
157   @param PeiServices       The pointer of EFI_PEI_SERVICES.
158   @param PeiBotDevice      The pointer to PEI_BOT_DEVICE instance.
159   @param Buffer            The pointer to data buffer.
160   @param Lba               The start logic block address of reading.
161   @param NumberOfBlocks    The block number of reading.
162 
163   @retval EFI_SUCCESS           Command executed successfully.
164   @retval EFI_DEVICE_ERROR      Some device errors happen.
165 
166 **/
167 EFI_STATUS
168 PeiUsbRead10 (
169   IN  EFI_PEI_SERVICES  **PeiServices,
170   IN  PEI_BOT_DEVICE    *PeiBotDevice,
171   IN  VOID              *Buffer,
172   IN  EFI_PEI_LBA       Lba,
173   IN  UINTN             NumberOfBlocks
174   );
175 
176 /**
177   Check if there is media according to sense data.
178 
179   @param  SenseData   Pointer to sense data.
180   @param  SenseCounts Count of sense data.
181 
182   @retval TRUE    No media
183   @retval FALSE   Media exists
184 
185 **/
186 BOOLEAN
187 IsNoMedia (
188   IN  ATAPI_REQUEST_SENSE_DATA    *SenseData,
189   IN  UINTN                 SenseCounts
190   );
191 
192 /**
193   Check if there is media error according to sense data.
194 
195   @param  SenseData   Pointer to sense data.
196   @param  SenseCounts Count of sense data.
197 
198   @retval TRUE    Media error
199   @retval FALSE   No media error
200 
201 **/
202 BOOLEAN
203 IsMediaError (
204   IN  ATAPI_REQUEST_SENSE_DATA    *SenseData,
205   IN  UINTN                 SenseCounts
206   );
207 
208 /**
209   Check if media is changed according to sense data.
210 
211   @param  SenseData   Pointer to sense data.
212   @param  SenseCounts Count of sense data.
213 
214   @retval TRUE    There is media change event.
215   @retval FALSE   media is NOT changed.
216 
217 **/
218 BOOLEAN
219 IsMediaChange (
220   IN  ATAPI_REQUEST_SENSE_DATA    *SenseData,
221   IN  UINTN                 SenseCounts
222   );
223 
224 #endif
225