]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Bhyve/AcpiPlatformDxe/Bhyve.c
OvmfPkg/Bhyve: Fix various style issues
[mirror_edk2.git] / OvmfPkg / Bhyve / AcpiPlatformDxe / Bhyve.c
CommitLineData
656419f9
RC
1/*\r
2 * Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com>\r
3 * Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>\r
4 * Copyright (C) 2012, Red Hat, Inc.\r
5 * Copyright (c) 2014, Pluribus Networks, Inc.\r
6 *\r
7 * SPDX-License-Identifier: BSD-2-Clause-Patent\r
8 */\r
9#include "AcpiPlatform.h"\r
10\r
11#include <Library/BaseMemoryLib.h>\r
656419f9 12#include <Library/BhyveFwCtlLib.h>\r
9fb629ed 13#include <Library/MemoryAllocationLib.h>\r
656419f9
RC
14\r
15STATIC\r
16EFI_STATUS\r
17EFIAPI\r
18BhyveInstallAcpiMadtTable (\r
19 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,\r
20 IN VOID *AcpiTableBuffer,\r
21 IN UINTN AcpiTableBufferSize,\r
22 OUT UINTN *TableKey\r
23 )\r
24{\r
25 UINT32 CpuCount;\r
26 UINTN cSize;\r
27 UINTN NewBufferSize;\r
28 EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt;\r
29 EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE *LocalApic;\r
30 EFI_ACPI_1_0_IO_APIC_STRUCTURE *IoApic;\r
31 EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE *Iso;\r
32 VOID *Ptr;\r
33 UINTN Loop;\r
34 EFI_STATUS Status;\r
35\r
36 ASSERT (AcpiTableBufferSize >= sizeof (EFI_ACPI_DESCRIPTION_HEADER));\r
37\r
38 // Query the host for the number of vCPUs\r
39 CpuCount = 0;\r
40 cSize = sizeof(CpuCount);\r
41 if (BhyveFwCtlGet ("hw.ncpu", &CpuCount, &cSize) == RETURN_SUCCESS) {\r
42 DEBUG ((DEBUG_INFO, "Retrieved CpuCount %d\n", CpuCount));\r
43 ASSERT (CpuCount >= 1);\r
44 } else {\r
45 DEBUG ((DEBUG_INFO, "CpuCount retrieval error\n"));\r
46 CpuCount = 1;\r
47 }\r
48\r
49 NewBufferSize = 1 * sizeof (*Madt) +\r
50 CpuCount * sizeof (*LocalApic) +\r
51 1 * sizeof (*IoApic) +\r
52 1 * sizeof (*Iso);\r
53\r
54 Madt = AllocatePool (NewBufferSize);\r
55 if (Madt == NULL) {\r
56 return EFI_OUT_OF_RESOURCES;\r
57 }\r
58\r
59 CopyMem (&(Madt->Header), AcpiTableBuffer, sizeof (EFI_ACPI_DESCRIPTION_HEADER));\r
60 Madt->Header.Length = (UINT32) NewBufferSize;\r
61 Madt->LocalApicAddress = 0xFEE00000;\r
62 Madt->Flags = EFI_ACPI_1_0_PCAT_COMPAT;\r
63 Ptr = Madt + 1;\r
64\r
65 LocalApic = Ptr;\r
66 for (Loop = 0; Loop < CpuCount; ++Loop) {\r
67 LocalApic->Type = EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC;\r
68 LocalApic->Length = sizeof (*LocalApic);\r
69 LocalApic->AcpiProcessorId = (UINT8) Loop;\r
70 LocalApic->ApicId = (UINT8) Loop;\r
71 LocalApic->Flags = 1; // enabled\r
72 ++LocalApic;\r
73 }\r
74 Ptr = LocalApic;\r
75\r
76 IoApic = Ptr;\r
77 IoApic->Type = EFI_ACPI_1_0_IO_APIC;\r
78 IoApic->Length = sizeof (*IoApic);\r
79 IoApic->IoApicId = (UINT8) CpuCount;\r
80 IoApic->Reserved = EFI_ACPI_RESERVED_BYTE;\r
81 IoApic->IoApicAddress = 0xFEC00000;\r
82 IoApic->SystemVectorBase = 0x00000000;\r
83 Ptr = IoApic + 1;\r
84\r
85 //\r
86 // IRQ0 (8254 Timer) => IRQ2 (PIC) Interrupt Source Override Structure\r
87 //\r
88 Iso = Ptr;\r
89 Iso->Type = EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE;\r
90 Iso->Length = sizeof (*Iso);\r
91 Iso->Bus = 0x00; // ISA\r
92 Iso->Source = 0x00; // IRQ0\r
93 Iso->GlobalSystemInterruptVector = 0x00000002;\r
94 Iso->Flags = 0x0000; // Conforms to specs of the bus\r
95 Ptr = Iso + 1;\r
96\r
97 ASSERT ((UINTN) ((UINT8 *)Ptr - (UINT8 *)Madt) == NewBufferSize);\r
98 Status = InstallAcpiTable (AcpiProtocol, Madt, NewBufferSize, TableKey);\r
99\r
100 FreePool (Madt);\r
101\r
102 return Status;\r
103}\r
104\r
105EFI_STATUS\r
106EFIAPI\r
107BhyveInstallAcpiTable (\r
108 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,\r
109 IN VOID *AcpiTableBuffer,\r
110 IN UINTN AcpiTableBufferSize,\r
111 OUT UINTN *TableKey\r
112 )\r
113{\r
114 EFI_ACPI_DESCRIPTION_HEADER *Hdr;\r
115 EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction;\r
116\r
117 Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AcpiTableBuffer;\r
118 switch (Hdr->Signature) {\r
119 case EFI_ACPI_1_0_APIC_SIGNATURE:\r
120 TableInstallFunction = BhyveInstallAcpiMadtTable;\r
121 break;\r
122 default:\r
123 TableInstallFunction = InstallAcpiTable;\r
124 }\r
125\r
126 return TableInstallFunction (\r
127 AcpiProtocol,\r
128 AcpiTableBuffer,\r
129 AcpiTableBufferSize,\r
130 TableKey\r
131 );\r
132}\r