/** @file
SPI Host controller entry point for DXE
Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "SpiHc.h"
EFI_HANDLE mSpiHcHandle = 0;
/**
Entry point of the SPI Host Controller driver. Installs the EFI_SPI_HC_PROTOCOL on mSpiHcHandle.
Also installs the EFI_DEVICE_PATH_PROTOCOL corresponding to the SPI Host controller on the same
mSpiHcHandle.
@param[in] ImageHandle Image handle of this driver.
@param[in] SystemTable Pointer to standard EFI system table.
@retval EFI_SUCCESS Succeed.
@retval EFI_OUT_RESOURCES If the system has run out of memory
**/
EFI_STATUS
EFIAPI
SpiHcProtocolEntry (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_SPI_HC_PROTOCOL *HcProtocol;
EFI_DEVICE_PATH_PROTOCOL *HcDevicePath;
DEBUG ((DEBUG_VERBOSE, "%a - ENTRY\n", __func__));
// Allocate the SPI Host Controller protocol
HcProtocol = AllocateZeroPool (sizeof (EFI_SPI_HC_PROTOCOL));
ASSERT (HcProtocol != NULL);
if (HcProtocol == NULL) {
return EFI_OUT_OF_RESOURCES;
}
// Fill in the SPI Host Controller Protocol
Status = GetPlatformSpiHcDetails (
&HcProtocol->Attributes,
&HcProtocol->FrameSizeSupportMask,
&HcProtocol->MaximumTransferBytes
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_VERBOSE, "Error, no Platform SPI HC details\n"));
return Status;
}
HcProtocol->ChipSelect = ChipSelect;
HcProtocol->Clock = Clock;
HcProtocol->Transaction = Transaction;
// Install Host Controller protocol
Status = gBS->InstallProtocolInterface (
&mSpiHcHandle,
&gEfiSpiHcProtocolGuid,
EFI_NATIVE_INTERFACE,
HcProtocol
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_VERBOSE, "Error installing gEfiSpiHcProtocolGuid\n"));
return Status;
}
Status = GetSpiHcDevicePath (&HcDevicePath);
// Install HC device path here on this handle as well
Status = gBS->InstallProtocolInterface (
&mSpiHcHandle,
&gEfiDevicePathProtocolGuid,
EFI_NATIVE_INTERFACE,
HcDevicePath
);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_VERBOSE, "Error installing gEfiDevicePathProtocolGuid\n"));
}
DEBUG ((DEBUG_VERBOSE, "%a - EXIT Status=%r\n", __func__, Status));
return Status;
}