1 /** @file
2   EDKII_UFS_HC_PLATFORM_PROTOCOL definition.
3 
4 Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #ifndef __EDKII_UFS_HC_PLATFORM_PROTOCOL_H__
10 #define __EDKII_UFS_HC_PLATFORM_PROTOCOL_H__
11 
12 #include <Protocol/UfsHostController.h>
13 
14 #define EDKII_UFS_HC_PLATFORM_PROTOCOL_VERSION 1
15 
16 extern EFI_GUID  gEdkiiUfsHcPlatformProtocolGuid;
17 
18 typedef struct _EDKII_UFS_HC_PLATFORM_PROTOCOL  EDKII_UFS_HC_PLATFORM_PROTOCOL;
19 
20 typedef struct _EDKII_UFS_HC_DRIVER_INTERFACE  EDKII_UFS_HC_DRIVER_INTERFACE;
21 
22 typedef struct {
23   UINT32 Opcode;
24   UINT32 Arg1;
25   UINT32 Arg2;
26   UINT32 Arg3;
27 } EDKII_UIC_COMMAND;
28 
29 /**
30   Execute UIC command
31 
32   @param[in]      This        Pointer to driver interface produced by the UFS controller.
33   @param[in, out] UicCommand  Descriptor of the command that will be executed.
34 
35   @retval EFI_SUCCESS            Command executed successfully.
36   @retval EFI_INVALID_PARAMETER  This or UicCommand is NULL.
37   @retval Others                 Command failed to execute.
38 **/
39 typedef
40 EFI_STATUS
41 (EFIAPI *EDKII_UFS_EXEC_UIC_COMMAND) (
42   IN      EDKII_UFS_HC_DRIVER_INTERFACE  *This,
43   IN OUT  EDKII_UIC_COMMAND              *UicCommand
44 );
45 
46 struct _EDKII_UFS_HC_DRIVER_INTERFACE {
47   ///
48   /// Protocol to accesss host controller MMIO and PCI registers.
49   ///
50   EDKII_UFS_HOST_CONTROLLER_PROTOCOL  *UfsHcProtocol;
51   ///
52   /// Function implementing UIC command execution.
53   ///
54   EDKII_UFS_EXEC_UIC_COMMAND          UfsExecUicCommand;
55 };
56 
57 typedef struct {
58   UINT32 Capabilities;
59   UINT32 Version;
60 } EDKII_UFS_HC_INFO;
61 
62 /**
63   Allows platform protocol to override host controller information
64 
65   @param[in]      ControllerHandle  Handle of the UFS controller.
66   @param[in, out] HcInfo            Pointer EDKII_UFS_HC_INFO associated with host controller.
67 
68   @retval EFI_SUCCESS            Function completed successfully.
69   @retval EFI_INVALID_PARAMETER  HcInfo is NULL.
70   @retval Others                 Function failed to complete.
71 **/
72 typedef
73 EFI_STATUS
74 (EFIAPI *EDKII_UFS_HC_PLATFORM_OVERRIDE_HC_INFO) (
75   IN     EFI_HANDLE         ControllerHandle,
76   IN OUT EDKII_UFS_HC_INFO  *HcInfo
77 );
78 
79 typedef enum {
80   EdkiiUfsHcPreHce,
81   EdkiiUfsHcPostHce,
82   EdkiiUfsHcPreLinkStartup,
83   EdkiiUfsHcPostLinkStartup
84 } EDKII_UFS_HC_PLATFORM_CALLBACK_PHASE;
85 
86 /**
87   Callback function for platform driver.
88 
89   @param[in]      ControllerHandle  Handle of the UFS controller.
90   @param[in]      CallbackPhase     Specifies when the platform protocol is called
91   @param[in, out] CallbackData      Data specific to the callback phase.
92                                     For PreHce and PostHce - EDKII_UFS_HC_DRIVER_INTERFACE.
93                                     For PreLinkStartup and PostLinkStartup - EDKII_UFS_HC_DRIVER_INTERFACE.
94 
95   @retval EFI_SUCCESS            Override function completed successfully.
96   @retval EFI_INVALID_PARAMETER  CallbackPhase is invalid or CallbackData is NULL when phase expects valid data.
97   @retval Others                 Function failed to complete.
98 **/
99 typedef
100 EFI_STATUS
101 (EFIAPI *EDKII_UFS_HC_PLATFORM_CALLBACK) (
102   IN     EFI_HANDLE                            ControllerHandle,
103   IN     EDKII_UFS_HC_PLATFORM_CALLBACK_PHASE  CallbackPhase,
104   IN OUT VOID                                  *CallbackData
105 );
106 
107 struct _EDKII_UFS_HC_PLATFORM_PROTOCOL {
108   ///
109   /// Version of the protocol.
110   ///
111   UINT32                                  Version;
112   ///
113   /// Allows platform driver to override host controller information.
114   ///
115   EDKII_UFS_HC_PLATFORM_OVERRIDE_HC_INFO  OverrideHcInfo;
116   ///
117   /// Allows platform driver to implement platform specific flows
118   /// for host controller.
119   ///
120   EDKII_UFS_HC_PLATFORM_CALLBACK          Callback;
121 };
122 
123 #endif
124 
125