REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the EmbeddedPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Andrew Fish <afish@apple.com>
		
			
				
	
	
		
			466 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			466 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Main file of the MMC Dxe driver. The driver entrypoint is defined into this file.
 | 
						|
 | 
						|
  Copyright (c) 2011-2013, ARM Limited. All rights reserved.
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <Protocol/DevicePath.h>
 | 
						|
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
#include <Library/DevicePathLib.h>
 | 
						|
 | 
						|
#include "Mmc.h"
 | 
						|
 | 
						|
EFI_BLOCK_IO_MEDIA  mMmcMediaTemplate = {
 | 
						|
  SIGNATURE_32 ('m', 'm', 'c', 'o'), // MediaId
 | 
						|
  TRUE,                              // RemovableMedia
 | 
						|
  FALSE,                             // MediaPresent
 | 
						|
  FALSE,                             // LogicalPartition
 | 
						|
  FALSE,                             // ReadOnly
 | 
						|
  FALSE,                             // WriteCaching
 | 
						|
  512,                               // BlockSize
 | 
						|
  4,                                 // IoAlign
 | 
						|
  0,                                 // Pad
 | 
						|
  0                                  // LastBlock
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// This device structure is serviced as a header.
 | 
						|
// Its next field points to the first root bridge device node.
 | 
						|
//
 | 
						|
LIST_ENTRY  mMmcHostPool;
 | 
						|
 | 
						|
/**
 | 
						|
  Event triggered by the timer to check if any cards have been removed
 | 
						|
  or if new ones have been plugged in
 | 
						|
**/
 | 
						|
 | 
						|
EFI_EVENT  gCheckCardsEvent;
 | 
						|
 | 
						|
/**
 | 
						|
  Initialize the MMC Host Pool to support multiple MMC devices
 | 
						|
**/
 | 
						|
VOID
 | 
						|
InitializeMmcHostPool (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  InitializeListHead (&mMmcHostPool);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Insert a new Mmc Host controller to the pool
 | 
						|
**/
 | 
						|
VOID
 | 
						|
InsertMmcHost (
 | 
						|
  IN MMC_HOST_INSTANCE  *MmcHostInstance
 | 
						|
  )
 | 
						|
{
 | 
						|
  InsertTailList (&mMmcHostPool, &(MmcHostInstance->Link));
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
  Remove a new Mmc Host controller to the pool
 | 
						|
*/
 | 
						|
VOID
 | 
						|
RemoveMmcHost (
 | 
						|
  IN MMC_HOST_INSTANCE  *MmcHostInstance
 | 
						|
  )
 | 
						|
{
 | 
						|
  RemoveEntryList (&(MmcHostInstance->Link));
 | 
						|
}
 | 
						|
 | 
						|
MMC_HOST_INSTANCE *
 | 
						|
CreateMmcHostInstance (
 | 
						|
  IN EFI_MMC_HOST_PROTOCOL  *MmcHost
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
  MMC_HOST_INSTANCE         *MmcHostInstance;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *NewDevicePathNode;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *DevicePath;
 | 
						|
 | 
						|
  MmcHostInstance = AllocateZeroPool (sizeof (MMC_HOST_INSTANCE));
 | 
						|
  if (MmcHostInstance == NULL) {
 | 
						|
    return NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  MmcHostInstance->Signature = MMC_HOST_INSTANCE_SIGNATURE;
 | 
						|
 | 
						|
  MmcHostInstance->State = MmcHwInitializationState;
 | 
						|
 | 
						|
  MmcHostInstance->BlockIo.Media = AllocateCopyPool (sizeof (EFI_BLOCK_IO_MEDIA), &mMmcMediaTemplate);
 | 
						|
  if (MmcHostInstance->BlockIo.Media == NULL) {
 | 
						|
    goto FREE_INSTANCE;
 | 
						|
  }
 | 
						|
 | 
						|
  MmcHostInstance->BlockIo.Revision    = EFI_BLOCK_IO_INTERFACE_REVISION;
 | 
						|
  MmcHostInstance->BlockIo.Reset       = MmcReset;
 | 
						|
  MmcHostInstance->BlockIo.ReadBlocks  = MmcReadBlocks;
 | 
						|
  MmcHostInstance->BlockIo.WriteBlocks = MmcWriteBlocks;
 | 
						|
  MmcHostInstance->BlockIo.FlushBlocks = MmcFlushBlocks;
 | 
						|
 | 
						|
  MmcHostInstance->MmcHost = MmcHost;
 | 
						|
 | 
						|
  // Create DevicePath for the new MMC Host
 | 
						|
  Status = MmcHost->BuildDevicePath (MmcHost, &NewDevicePathNode);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    goto FREE_MEDIA;
 | 
						|
  }
 | 
						|
 | 
						|
  DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)AllocatePool (END_DEVICE_PATH_LENGTH);
 | 
						|
  if (DevicePath == NULL) {
 | 
						|
    goto FREE_MEDIA;
 | 
						|
  }
 | 
						|
 | 
						|
  SetDevicePathEndNode (DevicePath);
 | 
						|
  MmcHostInstance->DevicePath = AppendDevicePathNode (DevicePath, NewDevicePathNode);
 | 
						|
 | 
						|
  // Publish BlockIO protocol interface
 | 
						|
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
						|
                  &MmcHostInstance->MmcHandle,
 | 
						|
                  &gEfiBlockIoProtocolGuid,
 | 
						|
                  &MmcHostInstance->BlockIo,
 | 
						|
                  &gEfiDevicePathProtocolGuid,
 | 
						|
                  MmcHostInstance->DevicePath,
 | 
						|
                  NULL
 | 
						|
                  );
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    goto FREE_DEVICE_PATH;
 | 
						|
  }
 | 
						|
 | 
						|
  return MmcHostInstance;
 | 
						|
 | 
						|
FREE_DEVICE_PATH:
 | 
						|
  FreePool (DevicePath);
 | 
						|
 | 
						|
FREE_MEDIA:
 | 
						|
  FreePool (MmcHostInstance->BlockIo.Media);
 | 
						|
 | 
						|
FREE_INSTANCE:
 | 
						|
  FreePool (MmcHostInstance);
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}
 | 
						|
 | 
						|
EFI_STATUS
 | 
						|
DestroyMmcHostInstance (
 | 
						|
  IN MMC_HOST_INSTANCE  *MmcHostInstance
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
 | 
						|
  // Uninstall Protocol Interfaces
 | 
						|
  Status = gBS->UninstallMultipleProtocolInterfaces (
 | 
						|
                  MmcHostInstance->MmcHandle,
 | 
						|
                  &gEfiBlockIoProtocolGuid,
 | 
						|
                  &(MmcHostInstance->BlockIo),
 | 
						|
                  &gEfiDevicePathProtocolGuid,
 | 
						|
                  MmcHostInstance->DevicePath,
 | 
						|
                  NULL
 | 
						|
                  );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Free Memory allocated for the instance
 | 
						|
  if (MmcHostInstance->BlockIo.Media) {
 | 
						|
    FreePool (MmcHostInstance->BlockIo.Media);
 | 
						|
  }
 | 
						|
 | 
						|
  if (MmcHostInstance->CardInfo.ECSDData) {
 | 
						|
    FreePages (MmcHostInstance->CardInfo.ECSDData, EFI_SIZE_TO_PAGES (sizeof (ECSD)));
 | 
						|
  }
 | 
						|
 | 
						|
  FreePool (MmcHostInstance);
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  This function checks if the controller implement the Mmc Host and the Device Path Protocols
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
MmcDriverBindingSupported (
 | 
						|
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | 
						|
  IN EFI_HANDLE                   Controller,
 | 
						|
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
  // EFI_DEVICE_PATH_PROTOCOL        *ParentDevicePath;
 | 
						|
  EFI_MMC_HOST_PROTOCOL  *MmcHost;
 | 
						|
  EFI_DEV_PATH_PTR       Node;
 | 
						|
 | 
						|
  //
 | 
						|
  // Check RemainingDevicePath validation
 | 
						|
  //
 | 
						|
  if (RemainingDevicePath != NULL) {
 | 
						|
    //
 | 
						|
    // Check if RemainingDevicePath is the End of Device Path Node,
 | 
						|
    // if yes, go on checking other conditions
 | 
						|
    //
 | 
						|
    if (!IsDevicePathEnd (RemainingDevicePath)) {
 | 
						|
      //
 | 
						|
      // If RemainingDevicePath isn't the End of Device Path Node,
 | 
						|
      // check its validation
 | 
						|
      //
 | 
						|
      Node.DevPath = RemainingDevicePath;
 | 
						|
      if ((Node.DevPath->Type != HARDWARE_DEVICE_PATH) ||
 | 
						|
          (Node.DevPath->SubType != HW_VENDOR_DP) ||
 | 
						|
          (DevicePathNodeLength (Node.DevPath) != sizeof (VENDOR_DEVICE_PATH)))
 | 
						|
      {
 | 
						|
        return EFI_UNSUPPORTED;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Check if Mmc Host protocol is installed by platform
 | 
						|
  //
 | 
						|
  Status = gBS->OpenProtocol (
 | 
						|
                  Controller,
 | 
						|
                  &gEmbeddedMmcHostProtocolGuid,
 | 
						|
                  (VOID **)&MmcHost,
 | 
						|
                  This->DriverBindingHandle,
 | 
						|
                  Controller,
 | 
						|
                  EFI_OPEN_PROTOCOL_BY_DRIVER
 | 
						|
                  );
 | 
						|
  if (Status == EFI_ALREADY_STARTED) {
 | 
						|
    return EFI_SUCCESS;
 | 
						|
  }
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Close the Mmc Host used to perform the supported test
 | 
						|
  //
 | 
						|
  gBS->CloseProtocol (
 | 
						|
         Controller,
 | 
						|
         &gEmbeddedMmcHostProtocolGuid,
 | 
						|
         This->DriverBindingHandle,
 | 
						|
         Controller
 | 
						|
         );
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
MmcDriverBindingStart (
 | 
						|
  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
 | 
						|
  IN EFI_HANDLE                   Controller,
 | 
						|
  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS             Status;
 | 
						|
  MMC_HOST_INSTANCE      *MmcHostInstance;
 | 
						|
  EFI_MMC_HOST_PROTOCOL  *MmcHost;
 | 
						|
 | 
						|
  //
 | 
						|
  // Check RemainingDevicePath validation
 | 
						|
  //
 | 
						|
  if (RemainingDevicePath != NULL) {
 | 
						|
    //
 | 
						|
    // Check if RemainingDevicePath is the End of Device Path Node,
 | 
						|
    // if yes, return EFI_SUCCESS
 | 
						|
    //
 | 
						|
    if (IsDevicePathEnd (RemainingDevicePath)) {
 | 
						|
      return EFI_SUCCESS;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Get the Mmc Host protocol
 | 
						|
  //
 | 
						|
  Status = gBS->OpenProtocol (
 | 
						|
                  Controller,
 | 
						|
                  &gEmbeddedMmcHostProtocolGuid,
 | 
						|
                  (VOID **)&MmcHost,
 | 
						|
                  This->DriverBindingHandle,
 | 
						|
                  Controller,
 | 
						|
                  EFI_OPEN_PROTOCOL_BY_DRIVER
 | 
						|
                  );
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    if (Status == EFI_ALREADY_STARTED) {
 | 
						|
      return EFI_SUCCESS;
 | 
						|
    }
 | 
						|
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  MmcHostInstance = CreateMmcHostInstance (MmcHost);
 | 
						|
  if (MmcHostInstance != NULL) {
 | 
						|
    // Add the handle to the pool
 | 
						|
    InsertMmcHost (MmcHostInstance);
 | 
						|
 | 
						|
    MmcHostInstance->Initialized = FALSE;
 | 
						|
 | 
						|
    // Detect card presence now
 | 
						|
    CheckCardsCallback (NULL, NULL);
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
MmcDriverBindingStop (
 | 
						|
  IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
 | 
						|
  IN  EFI_HANDLE                   Controller,
 | 
						|
  IN  UINTN                        NumberOfChildren,
 | 
						|
  IN  EFI_HANDLE                   *ChildHandleBuffer
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS         Status = EFI_SUCCESS;
 | 
						|
  LIST_ENTRY         *CurrentLink;
 | 
						|
  MMC_HOST_INSTANCE  *MmcHostInstance;
 | 
						|
 | 
						|
  MMC_TRACE ("MmcDriverBindingStop()");
 | 
						|
 | 
						|
  // For each MMC instance
 | 
						|
  CurrentLink = mMmcHostPool.ForwardLink;
 | 
						|
  while (CurrentLink != NULL && CurrentLink != &mMmcHostPool && (Status == EFI_SUCCESS)) {
 | 
						|
    MmcHostInstance = MMC_HOST_INSTANCE_FROM_LINK (CurrentLink);
 | 
						|
    ASSERT (MmcHostInstance != NULL);
 | 
						|
 | 
						|
    // Close gEmbeddedMmcHostProtocolGuid
 | 
						|
    Status = gBS->CloseProtocol (
 | 
						|
                    Controller,
 | 
						|
                    &gEmbeddedMmcHostProtocolGuid,
 | 
						|
                    This->DriverBindingHandle,
 | 
						|
                    Controller
 | 
						|
                    );
 | 
						|
 | 
						|
    // Remove MMC Host Instance from the pool
 | 
						|
    RemoveMmcHost (MmcHostInstance);
 | 
						|
 | 
						|
    // Destroy MmcHostInstance
 | 
						|
    DestroyMmcHostInstance (MmcHostInstance);
 | 
						|
  }
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
CheckCardsCallback (
 | 
						|
  IN  EFI_EVENT  Event,
 | 
						|
  IN  VOID       *Context
 | 
						|
  )
 | 
						|
{
 | 
						|
  LIST_ENTRY         *CurrentLink;
 | 
						|
  MMC_HOST_INSTANCE  *MmcHostInstance;
 | 
						|
  EFI_STATUS         Status;
 | 
						|
 | 
						|
  CurrentLink = mMmcHostPool.ForwardLink;
 | 
						|
  while (CurrentLink != NULL && CurrentLink != &mMmcHostPool) {
 | 
						|
    MmcHostInstance = MMC_HOST_INSTANCE_FROM_LINK (CurrentLink);
 | 
						|
    ASSERT (MmcHostInstance != NULL);
 | 
						|
 | 
						|
    if (MmcHostInstance->MmcHost->IsCardPresent (MmcHostInstance->MmcHost) == !MmcHostInstance->Initialized) {
 | 
						|
      MmcHostInstance->State                       = MmcHwInitializationState;
 | 
						|
      MmcHostInstance->BlockIo.Media->MediaPresent = !MmcHostInstance->Initialized;
 | 
						|
      MmcHostInstance->Initialized                 = !MmcHostInstance->Initialized;
 | 
						|
 | 
						|
      if (MmcHostInstance->BlockIo.Media->MediaPresent) {
 | 
						|
        InitializeMmcDevice (MmcHostInstance);
 | 
						|
      }
 | 
						|
 | 
						|
      Status = gBS->ReinstallProtocolInterface (
 | 
						|
                      (MmcHostInstance->MmcHandle),
 | 
						|
                      &gEfiBlockIoProtocolGuid,
 | 
						|
                      &(MmcHostInstance->BlockIo),
 | 
						|
                      &(MmcHostInstance->BlockIo)
 | 
						|
                      );
 | 
						|
 | 
						|
      if (EFI_ERROR (Status)) {
 | 
						|
        Print (L"MMC Card: Error reinstalling BlockIo interface\n");
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    CurrentLink = CurrentLink->ForwardLink;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
EFI_DRIVER_BINDING_PROTOCOL  gMmcDriverBinding = {
 | 
						|
  MmcDriverBindingSupported,
 | 
						|
  MmcDriverBindingStart,
 | 
						|
  MmcDriverBindingStop,
 | 
						|
  0xa,
 | 
						|
  NULL,
 | 
						|
  NULL
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
MmcDxeInitialize (
 | 
						|
  IN EFI_HANDLE        ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
 | 
						|
  //
 | 
						|
  // Initializes MMC Host pool
 | 
						|
  //
 | 
						|
  InitializeMmcHostPool ();
 | 
						|
 | 
						|
  //
 | 
						|
  // Install driver model protocol(s).
 | 
						|
  //
 | 
						|
  Status = EfiLibInstallDriverBindingComponentName2 (
 | 
						|
             ImageHandle,
 | 
						|
             SystemTable,
 | 
						|
             &gMmcDriverBinding,
 | 
						|
             ImageHandle,
 | 
						|
             &gMmcComponentName,
 | 
						|
             &gMmcComponentName2
 | 
						|
             );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Install driver diagnostics
 | 
						|
  Status = gBS->InstallMultipleProtocolInterfaces (
 | 
						|
                  &ImageHandle,
 | 
						|
                  &gEfiDriverDiagnostics2ProtocolGuid,
 | 
						|
                  &gMmcDriverDiagnostics2,
 | 
						|
                  NULL
 | 
						|
                  );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  // Use a timer to detect if a card has been plugged in or removed
 | 
						|
  Status = gBS->CreateEvent (
 | 
						|
                  EVT_NOTIFY_SIGNAL | EVT_TIMER,
 | 
						|
                  TPL_CALLBACK,
 | 
						|
                  CheckCardsCallback,
 | 
						|
                  NULL,
 | 
						|
                  &gCheckCardsEvent
 | 
						|
                  );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  Status = gBS->SetTimer (
 | 
						|
                  gCheckCardsEvent,
 | 
						|
                  TimerPeriodic,
 | 
						|
                  (UINT64)(10*1000*200)
 | 
						|
                  );                    // 200 ms
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 |