summaryrefslogtreecommitdiff
path: root/BraswellPlatformPkg/Common/Silicon/IntelSiliconBasic/CpuInit/Ia32/MpCpu.c
blob: b6e3ed8f8e8eaa0837a0dcf35ee3ea9365894631 (plain)
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
/** @file
  MP Support driver.

  Copyright (c) 1999 - 2015, Intel Corporation. All rights reserved.<BR>

  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php.

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#include "CpuDxe.h"
#include "MpCommon.h"
#include "PlatformMpService.h"

extern EFI_CPU_MICROCODE_HEADER **mMicrocodePointerBuffer;

ACPI_CPU_DATA_COMPATIBILITY       *mAcpiCpuData;
MP_SYSTEM_DATA                    *mMPSystemData;

EFI_DEVICE_PATH_PROTOCOL  *
AppendDevicePath (
  IN EFI_DEVICE_PATH_PROTOCOL  *Src1,
  IN EFI_DEVICE_PATH_PROTOCOL  *Src2
  );

UINTN
DevicePathSize (
  IN EFI_DEVICE_PATH_PROTOCOL  *DevicePath
  );

/**
  Initializes MP support in the system.

  @param[in]  ImageHandle           Image handle of the loaded driver
  @param[in]  *SystemTable          Pointer to the System Table

  @retval   EFI_SUCCESS             Multiple processors are initialized successfully.
  @retval   EFI_NOT_FOUND           The ACPI variable is not found in S3 boot path.
  @retval   EFI_OUT_OF_RESOURCES    No enough resoruces (such as out of memory).

**/
EFI_STATUS
InitializeMpSupport (
  IN EFI_HANDLE                       ImageHandle,
  IN EFI_SYSTEM_TABLE                 *SystemTable
  )
{
  EFI_STATUS            Status;
  MP_CPU_RESERVED_DATA  *MpCpuReservedData;

  MpCpuReservedData = NULL;

  if (ImageHandle != NULL) {

    Status = AllocateReservedMemoryBelow4G (
               sizeof (MP_CPU_RESERVED_DATA),
               (VOID **) &MpCpuReservedData
               );

    if (EFI_ERROR (Status)) {
      return Status;
    }

    ZeroMem (MpCpuReservedData, sizeof (MP_CPU_RESERVED_DATA));

    mMPSystemData                         = &(MpCpuReservedData->MPSystemData);
    mAcpiCpuData                          = &(MpCpuReservedData->AcpiCpuData);

    CopyMem (
      MpCpuReservedData->MicrocodePointerBuffer,
      mMicrocodePointerBuffer,
      sizeof (EFI_CPU_MICROCODE_HEADER *) * (NUMBER_OF_MICROCODE_UPDATE + 1)
      );

    mAcpiCpuData->CpuPrivateData          = (EFI_PHYSICAL_ADDRESS)(UINTN)(&(mMPSystemData->S3DataPointer));
    mAcpiCpuData->S3BootPath              = FALSE;
    mAcpiCpuData->MicrocodePointerBuffer  = (EFI_PHYSICAL_ADDRESS)(UINTN)(MpCpuReservedData->MicrocodePointerBuffer);
    mAcpiCpuData->GdtrProfile             = (EFI_PHYSICAL_ADDRESS)(UINTN)(&(MpCpuReservedData->GdtrProfile));
    mAcpiCpuData->IdtrProfile             = (EFI_PHYSICAL_ADDRESS)(UINTN)(&(MpCpuReservedData->IdtrProfile));

    MpServiceInitialize ();
  }

  return EFI_SUCCESS;
}