1fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/** @file
2fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  This driver will report some MMIO/IO resources to dxe core, extract smbios and acpi
3fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  tables from coreboot and install.
4fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
5fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
6fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  This program and the accompanying materials
7fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  are licensed and made available under the terms and conditions of the BSD License
8fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  which accompanies this distribution.  The full text of the license may be found at
9fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  http://opensource.org/licenses/bsd-license.php.
10fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
11fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
14fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/
15fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma#include "CbSupportDxe.h"
16fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
17fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaUINTN mPmCtrlReg = 0;
18fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/**
19fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  Reserve MMIO/IO resource in GCD
20fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
21fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  IsMMIO        Flag of whether it is mmio resource or io resource.
22fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  GcdType       Type of the space.
23fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  BaseAddress   Base address of the space.
24fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  Length        Length of the space.
25fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  Alignment     Align with 2^Alignment
26fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  ImageHandle   Handle for the image of this driver.
27fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
28fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @retval EFI_SUCCESS   Reserve successful
29fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/
30fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaEFI_STATUS
31fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaCbReserveResourceInGcd (
32fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN BOOLEAN               IsMMIO,
33fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN UINTN                 GcdType,
34fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN EFI_PHYSICAL_ADDRESS  BaseAddress,
35fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN UINT64                Length,
36fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN UINTN                 Alignment,
37fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN EFI_HANDLE            ImageHandle
38fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  )
39fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma{
40fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	EFI_STATUS               Status;
41fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
42fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  if (IsMMIO) {
43fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    Status = gDS->AddMemorySpace (
44fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    GcdType,
45fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    BaseAddress,
46fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    Length,
47fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    EFI_MEMORY_UC
48fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    );
49fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    if (EFI_ERROR (Status)) {
50fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma      DEBUG ((
51fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma        EFI_D_ERROR,
5242e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan        "Failed to add memory space :0x%lx 0x%lx\n",
53fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma        BaseAddress,
54fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma        Length
55fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma        ));
56fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    }
57fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    ASSERT_EFI_ERROR (Status);
58fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    Status = gDS->AllocateMemorySpace (
59fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    EfiGcdAllocateAddress,
60fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    GcdType,
61fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    Alignment,
62fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    Length,
63fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    &BaseAddress,
64fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    ImageHandle,
65fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    NULL
66fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    );
67fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    ASSERT_EFI_ERROR (Status);
68fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  } else {
69fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    Status = gDS->AddIoSpace (
70fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    GcdType,
71fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    BaseAddress,
72fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    Length
73fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    );
74fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    ASSERT_EFI_ERROR (Status);
75fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    Status = gDS->AllocateIoSpace (
76fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    EfiGcdAllocateAddress,
77fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    GcdType,
78fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    Alignment,
79fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    Length,
80fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    &BaseAddress,
81fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    ImageHandle,
82fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    NULL
83fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    );
84fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma    ASSERT_EFI_ERROR (Status);
85fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  }
86fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  return Status;
87fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma}
88fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
89fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/**
90fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  Notification function of EVT_GROUP_READY_TO_BOOT event group.
91fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
92fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  This is a notification function registered on EVT_GROUP_READY_TO_BOOT event group.
93fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  When the Boot Manager is about to load and execute a boot option, it reclaims variable
94fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  storage if free size is below the threshold.
95fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
96fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  Event        Event whose notification function is being invoked.
97fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param  Context      Pointer to the notification function's context.
98fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
99fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/
100fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaVOID
101c952b5b124693c3864dbdf6ab5bb80fb399f2af2Scott DuplichanEFIAPI
102fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaOnReadyToBoot (
103c952b5b124693c3864dbdf6ab5bb80fb399f2af2Scott Duplichan  IN  EFI_EVENT  Event,
104c952b5b124693c3864dbdf6ab5bb80fb399f2af2Scott Duplichan  IN  VOID       *Context
105fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  )
106fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma{
107fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
108fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// Enable SCI
109fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
110fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	IoOr16 (mPmCtrlReg, BIT0);
111fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
11242e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan	DEBUG ((EFI_D_ERROR, "Enable SCI bit at 0x%lx before boot\n", (UINT64)mPmCtrlReg));
113fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma}
114fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
115fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma/**
116fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  Main entry for the Coreboot Support DXE module.
117fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
118fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param[in] ImageHandle    The firmware allocated handle for the EFI image.
119fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @param[in] SystemTable    A pointer to the EFI System Table.
120fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
121fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @retval EFI_SUCCESS       The entry point is executed successfully.
122fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  @retval other             Some error occurs when executing this entry point.
123fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
124fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma**/
125fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaEFI_STATUS
1266d577625ed4eb154414e2b041a976eb6aac76f78Scott DuplichanEFIAPI
127fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice MaCbDxeEntryPoint (
128fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN EFI_HANDLE         ImageHandle,
129fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  IN EFI_SYSTEM_TABLE   *SystemTable
130fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  )
131fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma{
132fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	EFI_STATUS Status;
133fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	EFI_EVENT  ReadyToBootEvent;
134fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	EFI_HOB_GUID_TYPE  *GuidHob;
135fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	SYSTEM_TABLE_INFO  *pSystemTableInfo;
136fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	ACPI_BOARD_INFO    *pAcpiBoardInfo;
137fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
138fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	Status = EFI_SUCCESS;
139fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
140fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// Report MMIO/IO Resources
141fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
142fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEE00000, SIZE_1MB, 0, SystemTable); // LAPIC
143fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	ASSERT_EFI_ERROR (Status);
144fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
145fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFEC00000, SIZE_4KB, 0, SystemTable); // IOAPIC
146fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	ASSERT_EFI_ERROR (Status);
147fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
148fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	Status = CbReserveResourceInGcd (TRUE, EfiGcdMemoryTypeMemoryMappedIo, 0xFED00000, SIZE_1KB, 0, SystemTable); // HPET
149fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	ASSERT_EFI_ERROR (Status);
150fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
151fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
152fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// Find the system table information guid hob
153fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
154fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	GuidHob = GetFirstGuidHob (&gUefiSystemTableInfoGuid);
155fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	ASSERT (GuidHob != NULL);
156fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  pSystemTableInfo = (SYSTEM_TABLE_INFO *)GET_GUID_HOB_DATA (GuidHob);
157fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
158fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
159fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// Install Acpi Table
160fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
161fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	if (pSystemTableInfo->AcpiTableBase != 0 && pSystemTableInfo->AcpiTableSize != 0) {
16242e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan		DEBUG ((EFI_D_ERROR, "Install Acpi Table at 0x%lx, length 0x%x\n", pSystemTableInfo->AcpiTableBase, pSystemTableInfo->AcpiTableSize));
163fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma		Status = gBS->InstallConfigurationTable (&gEfiAcpiTableGuid, (VOID *)(UINTN)pSystemTableInfo->AcpiTableBase);
164fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma		ASSERT_EFI_ERROR (Status);
165fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	}
166fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
167fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
168fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// Install Smbios Table
169fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
170fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	if (pSystemTableInfo->SmbiosTableBase != 0 && pSystemTableInfo->SmbiosTableSize != 0) {
17142e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan		DEBUG ((EFI_D_ERROR, "Install Smbios Table at 0x%lx, length 0x%x\n", pSystemTableInfo->SmbiosTableBase, pSystemTableInfo->SmbiosTableSize));
172fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma		Status = gBS->InstallConfigurationTable (&gEfiSmbiosTableGuid, (VOID *)(UINTN)pSystemTableInfo->SmbiosTableBase);
173fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma		ASSERT_EFI_ERROR (Status);
174fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	}
175fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
176fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
177fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// Find the acpi board information guid hob
178fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
179fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid);
180fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	ASSERT (GuidHob != NULL);
181fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob);
182fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
183fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  mPmCtrlReg = (UINTN)pAcpiBoardInfo->PmCtrlRegBase;
18442e548a846cf93bd97f27220bc9c6b5e487e96feScott Duplichan	DEBUG ((EFI_D_ERROR, "PmCtrlReg at 0x%lx\n", (UINT64)mPmCtrlReg));
185fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
186fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
187fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// Register callback on the ready to boot event
188fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	// in order to enable SCI
189fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	//
190fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma	ReadyToBootEvent = NULL;
191fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  Status = EfiCreateEventReadyToBootEx (
192fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    TPL_CALLBACK,
193fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    OnReadyToBoot,
194fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    NULL,
195fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    &ReadyToBootEvent
196fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma                    );
197fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  ASSERT_EFI_ERROR (Status);
198fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
199fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma  return EFI_SUCCESS;
200fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma}
201fce4ecd92cf137d479c0dc97461bec3512e9c98dMaurice Ma
202