hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/** @file
  A Library to support all BMC access via IPMI command during Dxe Phase.
 
  @copyright
  Copyright 1999 - 2021 Intel Corporation. <BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
 
#include <PiDxe.h>
#include <Protocol/IpmiTransportProtocol.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/DebugLib.h>
 
STATIC IPMI_TRANSPORT     *mIpmiTransport = NULL;
VOID                      *mEfiIpmiProtocolNotifyReg;
EFI_EVENT                 mEfiIpmiProtocolEvent;
 
/**
  Callback function for locating the IpmiTransport protocol.
  @param[in]  Event    Event on which the callback is called.
  @param[in]  Context  The context of the Callback.
 
  @retval EFI_SUCCESS  Return from EfiLocateProtocolInterface function.
  @retval Other        Failure.
 
**/
EFI_STATUS
NotifyIpmiTransportCallback (
  IN EFI_EVENT Event,
  IN VOID      *Context
  )
{
  EFI_STATUS  Status;
 
  Status = EFI_SUCCESS;
  if (mIpmiTransport == NULL) {
    Status = gBS->LocateProtocol (
                    &gIpmiTransportProtocolGuid,
                    NULL,
                    (VOID **) &mIpmiTransport
                    );
  }
 
  return Status;
}
 
/**
  Initialize the global varible with the pointer of IpmiTransport Protocol.
 
  @retval EFI_SUCCESS  Always return success.
 
**/
EFI_STATUS
InitializeIpmiBase (
  VOID
  )
{
  EFI_STATUS  Status;
 
  if (mIpmiTransport == NULL) {
    Status = gBS->CreateEvent (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, (EFI_EVENT_NOTIFY) NotifyIpmiTransportCallback, NULL, &mEfiIpmiProtocolEvent);
    ASSERT_EFI_ERROR (Status);
    if (Status != EFI_SUCCESS) {
      return Status;
    }
 
    Status = gBS->RegisterProtocolNotify (&gIpmiTransportProtocolGuid, mEfiIpmiProtocolEvent, &mEfiIpmiProtocolNotifyReg);
    ASSERT_EFI_ERROR (Status);
    if (Status != EFI_SUCCESS) {
      return Status;
    }
 
    gBS->SignalEvent (mEfiIpmiProtocolEvent);
  }
 
  return EFI_SUCCESS;
}
 
/**
  Routine to send commands to BMC.
  @param[in]       NetFunction        Net function of the command
  @param[in]       Command            IPMI Command
  @param[in]       CommandData        Command Data
  @param[in]       CommandDataSize    Size of CommandData
  @param[out]  ResponseData       Response Data
  @param[in, out]  ResponseDataSize   Response Data Size
 
  @retval EFI_SUCCESS            Return Successly.
  @retval EFI_NOT_AVAILABLE_YET  IpmiTransport Protocol is not installed yet
  @retval Other                  Failure.
 
**/
EFI_STATUS
IpmiSubmitCommand (
  IN UINT8        NetFunction,
  IN UINT8        Command,
  IN UINT8        *CommandData,
  IN UINT32       CommandDataSize,
  OUT UINT8       *ResponseData,
  IN OUT UINT32   *ResponseDataSize
  )
{
  EFI_STATUS  Status;
 
  Status = gBS->LocateProtocol (&gIpmiTransportProtocolGuid, NULL, (VOID **) &mIpmiTransport);
  if (EFI_ERROR (Status)) {
    ASSERT_EFI_ERROR (Status);
    return Status;
  }
 
  Status = mIpmiTransport->IpmiSubmitCommand (
                             mIpmiTransport,
                             NetFunction,
                             0,
                             Command,
                             CommandData,
                             CommandDataSize,
                             ResponseData,
                             ResponseDataSize
                             );
  return Status;
}
 
/**
  Routine to send commands to BMC.
  @param[out]  BmcStatus    A pointer to the BMC_STATUS.
  @param[out]  ComAddress   Pointer to the SM_COM_ADDRESS.
 
  @retval EFI_SUCCESS            Restart Successly.
  @retval EFI_NOT_AVAILABLE_YET  IpmiTransport Protocol is not installed yet.
  @retval Other                  Failure.
 
**/
EFI_STATUS
IpmiGetBmcStatus (
  OUT BMC_STATUS                         *BmcStatus,
  OUT SM_COM_ADDRESS                     *ComAddress
  )
{
  EFI_STATUS  Status;
 
  Status = gBS->LocateProtocol (&gIpmiTransportProtocolGuid, NULL, (VOID **) &mIpmiTransport);
  if (EFI_ERROR (Status)) {
    ASSERT_EFI_ERROR (Status);
    return Status;
  }
 
  Status = mIpmiTransport->GetBmcStatus (
                             mIpmiTransport,
                             BmcStatus,
                             ComAddress
                             );
  return Status;
}