3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/DebugLib.h>
15 #include <Library/MemoryAllocationLib.h>
16 #include <Library/UefiBootServicesTableLib.h>
18 #include <Protocol/EmbeddedExternalDevice.h>
19 #include <Protocol/SmbusHc.h>
21 EFI_SMBUS_HC_PROTOCOL
*Smbus
;
25 IN EMBEDDED_EXTERNAL_DEVICE
*This
,
32 EFI_SMBUS_DEVICE_ADDRESS SlaveAddress
;
34 UINTN DeviceRegisterLength
= 1;
36 SlaveAddress
.SmbusDeviceAddress
= EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register
);
37 DeviceRegister
= (UINT8
)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register
);
39 //Write DeviceRegister.
40 Status
= Smbus
->Execute(Smbus
, SlaveAddress
, 0, EfiSmbusWriteBlock
, FALSE
, &DeviceRegisterLength
, &DeviceRegister
);
41 if (EFI_ERROR(Status
)) {
46 Status
= Smbus
->Execute(Smbus
, SlaveAddress
, 0, EfiSmbusReadBlock
, FALSE
, &Length
, Buffer
);
52 IN EMBEDDED_EXTERNAL_DEVICE
*This
,
59 EFI_SMBUS_DEVICE_ADDRESS SlaveAddress
;
61 UINTN DeviceBufferLength
= Length
+ 1;
64 SlaveAddress
.SmbusDeviceAddress
= EXTERNAL_DEVICE_REGISTER_TO_SLAVE_ADDRESS(Register
);
65 DeviceRegister
= (UINT8
)EXTERNAL_DEVICE_REGISTER_TO_REGISTER(Register
);
67 //Prepare buffer for writing
68 DeviceBuffer
= (UINT8
*)AllocatePool(DeviceBufferLength
);
69 if (DeviceBuffer
== NULL
) {
70 Status
= EFI_OUT_OF_RESOURCES
;
74 //Set Device register followed by data to write.
75 DeviceBuffer
[0] = DeviceRegister
;
76 CopyMem(&DeviceBuffer
[1], Buffer
, Length
);
79 Status
= Smbus
->Execute(Smbus
, SlaveAddress
, 0, EfiSmbusWriteBlock
, FALSE
, &DeviceBufferLength
, DeviceBuffer
);
80 if (EFI_ERROR(Status
)) {
86 FreePool(DeviceBuffer
);
92 EMBEDDED_EXTERNAL_DEVICE ExternalDevice
= {
99 IN EFI_HANDLE ImageHandle
,
100 IN EFI_SYSTEM_TABLE
*SystemTable
105 Status
= gBS
->LocateProtocol(&gEfiSmbusHcProtocolGuid
, NULL
, (VOID
**)&Smbus
);
106 ASSERT_EFI_ERROR(Status
);
108 Status
= gBS
->InstallMultipleProtocolInterfaces(&ImageHandle
, &gEmbeddedExternalDeviceProtocolGuid
, &ExternalDevice
, NULL
);