]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.h
MdeModulePkg UfsPassThruDxe: Add Non-blocking I/O Support
[mirror_edk2.git] / MdeModulePkg / Bus / Ufs / UfsPassThruDxe / UfsPassThru.h
index ce8066f71e84867bb77e96e6a038043b18ef30fb..4f7087f44f42022271e497a2f3b6f202b5b00973 100644 (file)
@@ -50,6 +50,14 @@ typedef struct {
   UINT16   Rsvd:4;\r
 } UFS_EXPOSED_LUNS;\r
 \r
+//\r
+// Iterate through the doule linked list. This is delete-safe.\r
+// Do not touch NextEntry\r
+//\r
+#define EFI_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead)            \\r
+  for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\\r
+      Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink)\r
+\r
 typedef struct _UFS_PASS_THRU_PRIVATE_DATA {  \r
   UINT32                              Signature;\r
   EFI_HANDLE                          Handle;\r
@@ -69,9 +77,37 @@ typedef struct _UFS_PASS_THRU_PRIVATE_DATA {
   VOID                                *TmrlMapping;\r
 \r
   UFS_EXPOSED_LUNS                    Luns;\r
+\r
+  //\r
+  // For Non-blocking operation.\r
+  //\r
+  EFI_EVENT                           TimerEvent;\r
+  LIST_ENTRY                          Queue;\r
 } UFS_PASS_THRU_PRIVATE_DATA;\r
 \r
+#define UFS_PASS_THRU_TRANS_REQ_SIG   SIGNATURE_32 ('U', 'F', 'S', 'T')\r
+\r
+typedef struct {\r
+  UINT32                                        Signature;\r
+  LIST_ENTRY                                    TransferList;\r
+\r
+  UINT8                                         Slot;\r
+  UTP_TRD                                       *Trd;\r
+  UINT32                                        CmdDescSize;\r
+  VOID                                          *CmdDescHost;\r
+  VOID                                          *CmdDescMapping;\r
+  VOID                                          *DataBufMapping;\r
+\r
+  EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET    *Packet;\r
+  UINT64                                        TimeoutRemain;\r
+  EFI_EVENT                                     CallerEvent;\r
+} UFS_PASS_THRU_TRANS_REQ;\r
+\r
+#define UFS_PASS_THRU_TRANS_REQ_FROM_THIS(a) \\r
+    CR(a, UFS_PASS_THRU_TRANS_REQ, TransferList, UFS_PASS_THRU_TRANS_REQ_SIG)\r
+\r
 #define UFS_TIMEOUT                   EFI_TIMER_PERIOD_SECONDS(3)\r
+#define UFS_HC_ASYNC_TIMER            EFI_TIMER_PERIOD_MILLISECONDS(1)\r
 \r
 #define ROUNDUP8(x) (((x) % 8 == 0) ? (x) : ((x) / 8 + 1) * 8)\r
 \r
@@ -587,6 +623,11 @@ UfsPassThruGetNextTarget (
   @param[in]      Lun           The LUN of the UFS device to send the SCSI Request Packet.\r
   @param[in, out] Packet        A pointer to the SCSI Request Packet to send to a specified Lun of the\r
                                 UFS device.\r
+  @param[in]      Event         If nonblocking I/O is not supported then Event is ignored, and blocking\r
+                                I/O is performed. If Event is NULL, then blocking I/O is performed. If\r
+                                Event is not NULL and non blocking I/O is supported, then\r
+                                nonblocking I/O is performed, and Event will be signaled when the\r
+                                SCSI Request Packet completes.\r
 \r
   @retval EFI_SUCCESS           The SCSI Request Packet was sent by the host. For bi-directional\r
                                 commands, InTransferLength bytes were transferred from\r
@@ -603,7 +644,8 @@ EFI_STATUS
 UfsExecScsiCmds (\r
   IN     UFS_PASS_THRU_PRIVATE_DATA                  *Private,\r
   IN     UINT8                                       Lun,\r
-  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet\r
+  IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *Packet,\r
+  IN     EFI_EVENT                                   Event    OPTIONAL\r
   );\r
 \r
 /**\r
@@ -719,6 +761,37 @@ UfsExecNopCmds (
   IN  UFS_PASS_THRU_PRIVATE_DATA       *Private\r
   );\r
 \r
+/**\r
+  Call back function when the timer event is signaled.\r
+\r
+  @param[in]  Event     The Event this notify function registered to.\r
+  @param[in]  Context   Pointer to the context data registered to the Event.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+ProcessAsyncTaskList (\r
+  IN EFI_EVENT          Event,\r
+  IN VOID               *Context\r
+  );\r
+\r
+/**\r
+  Internal helper function which will signal the caller event and clean up\r
+  resources.\r
+\r
+  @param[in] Private   The pointer to the UFS_PASS_THRU_PRIVATE_DATA data\r
+                       structure.\r
+  @param[in] TransReq  The pointer to the UFS_PASS_THRU_TRANS_REQ data\r
+                       structure.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SignalCallerEvent (\r
+  IN UFS_PASS_THRU_PRIVATE_DATA      *Private,\r
+  IN UFS_PASS_THRU_TRANS_REQ         *TransReq\r
+  );\r
+\r
 extern EFI_COMPONENT_NAME_PROTOCOL  gUfsPassThruComponentName;\r
 extern EFI_COMPONENT_NAME2_PROTOCOL gUfsPassThruComponentName2;\r
 extern EFI_DRIVER_BINDING_PROTOCOL  gUfsPassThruDriverBinding;\r