--- /dev/null
+/** @file\r
+ Various defines related to Cloud Hypervisor\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef __CLOUDHV_H__\r
+#define __CLOUDHV_H__\r
+\r
+//\r
+// Host Bridge Device ID\r
+//\r
+#define CLOUDHV_DEVICE_ID 0x0d57\r
+\r
+//\r
+// ACPI timer address\r
+//\r
+#define CLOUDHV_ACPI_TIMER_IO_ADDRESS 0xb008\r
+\r
+//\r
+// ACPI shutdown device address\r
+//\r
+#define CLOUDHV_ACPI_SHUTDOWN_IO_ADDRESS 0x03c0\r
+\r
+//\r
+// 32-bit MMIO memory hole base address\r
+//\r
+#define CLOUDHV_MMIO_HOLE_ADDRESS 0xc0000000\r
+\r
+//\r
+// 32-bit MMIO memory hole size\r
+//\r
+#define CLOUDHV_MMIO_HOLE_SIZE 0x38000000\r
+\r
+#endif // __CLOUDHV_H__\r
#include <IndustryStandard/I440FxPiix4.h>\r
#include <IndustryStandard/Bhyve.h>\r
#include <IndustryStandard/Microvm.h>\r
+#include <IndustryStandard/CloudHv.h>\r
\r
//\r
// OVMF Host Bridge DID Address\r
AcpiCtlReg = POWER_MGMT_REGISTER_Q35 (ICH9_ACPI_CNTL);\r
AcpiEnBit = ICH9_ACPI_CNTL_ACPI_EN;\r
break;\r
+ case CLOUDHV_DEVICE_ID:\r
+ mAcpiTimerIoAddr = CLOUDHV_ACPI_TIMER_IO_ADDRESS;\r
+ return RETURN_SUCCESS;\r
default:\r
DEBUG ((\r
DEBUG_ERROR,\r
AcpiCtlReg = POWER_MGMT_REGISTER_Q35 (ICH9_ACPI_CNTL);\r
AcpiEnBit = ICH9_ACPI_CNTL_ACPI_EN;\r
break;\r
+ case CLOUDHV_DEVICE_ID:\r
+ return RETURN_SUCCESS;\r
default:\r
DEBUG ((\r
DEBUG_ERROR,\r
case INTEL_Q35_MCH_DEVICE_ID:\r
Pmba = POWER_MGMT_REGISTER_Q35 (ICH9_PMBASE);\r
break;\r
+ case CLOUDHV_DEVICE_ID:\r
+ return IoRead32 (CLOUDHV_ACPI_TIMER_IO_ADDRESS);\r
default:\r
DEBUG ((\r
DEBUG_ERROR,\r
case INTEL_Q35_MCH_DEVICE_ID:\r
Pmba = POWER_MGMT_REGISTER_Q35 (ICH9_PMBASE);\r
break;\r
+ case CLOUDHV_DEVICE_ID:\r
+ mAcpiTimerIoAddr = CLOUDHV_ACPI_TIMER_IO_ADDRESS;\r
+ return RETURN_SUCCESS;\r
default:\r
DEBUG ((\r
DEBUG_ERROR,\r
PciWrite8 (PCI_LIB_ADDRESS (0, 0x1f, 0, 0x6b), PciHostIrqs[3]); // H\r
break;\r
case MICROVM_PSEUDO_DEVICE_ID:\r
+ case CLOUDHV_DEVICE_ID:\r
return;\r
default:\r
if (XenDetected ()) {\r
case INTEL_Q35_MCH_DEVICE_ID:\r
AcpiPmBaseAddress = ICH9_PMBASE_VALUE;\r
break;\r
+ case CLOUDHV_DEVICE_ID:\r
+ IoWrite8 (CLOUDHV_ACPI_SHUTDOWN_IO_ADDRESS, 5 << 2 | 1 << 5);\r
+ CpuDeadLoop ();\r
default:\r
ASSERT (FALSE);\r
CpuDeadLoop ();\r
#include <OvmfPlatforms.h> // PIIX4_PMBA_VALUE\r
\r
STATIC UINT16 mAcpiPmBaseAddress;\r
+STATIC UINT16 mAcpiHwReducedSleepCtl;\r
\r
EFI_STATUS\r
EFIAPI\r
case INTEL_Q35_MCH_DEVICE_ID:\r
mAcpiPmBaseAddress = ICH9_PMBASE_VALUE;\r
break;\r
+ case CLOUDHV_DEVICE_ID:\r
+ mAcpiHwReducedSleepCtl = CLOUDHV_ACPI_SHUTDOWN_IO_ADDRESS;\r
+ break;\r
default:\r
ASSERT (FALSE);\r
CpuDeadLoop ();\r
VOID\r
)\r
{\r
- IoBitFieldWrite16 (mAcpiPmBaseAddress + 4, 10, 13, 0);\r
- IoOr16 (mAcpiPmBaseAddress + 4, BIT13);\r
+ if (mAcpiHwReducedSleepCtl) {\r
+ IoWrite8 (mAcpiHwReducedSleepCtl, 5 << 2 | 1 << 5);\r
+ } else {\r
+ IoBitFieldWrite16 (mAcpiPmBaseAddress + 4, 10, 13, 0);\r
+ IoOr16 (mAcpiPmBaseAddress + 4, BIT13);\r
+ }\r
+\r
CpuDeadLoop ();\r
}\r
#include <IndustryStandard/E820.h>\r
#include <IndustryStandard/I440FxPiix4.h>\r
#include <IndustryStandard/Q35MchIch9.h>\r
+#include <IndustryStandard/CloudHv.h>\r
#include <PiPei.h>\r
#include <Register/Intel/SmramSaveStateMap.h>\r
\r
return;\r
}\r
\r
+ if (mHostBridgeDevId == CLOUDHV_DEVICE_ID) {\r
+ Uc32Size = CLOUDHV_MMIO_HOLE_SIZE;\r
+ mQemuUc32Base = CLOUDHV_MMIO_HOLE_ADDRESS;\r
+ return;\r
+ }\r
+\r
ASSERT (mHostBridgeDevId == INTEL_82441_DEVICE_ID);\r
//\r
// On i440fx, start with the [LowerMemorySize, 4GB) range. Make sure one\r
// practically any alignment, and we may not have enough variable MTRRs to\r
// cover it exactly.\r
//\r
- if (IsMtrrSupported ()) {\r
+ if (IsMtrrSupported () && (mHostBridgeDevId != CLOUDHV_DEVICE_ID)) {\r
MtrrGetAllMtrrs (&MtrrSettings);\r
\r
//\r
);\r
ASSERT_RETURN_ERROR (PcdStatus);\r
return;\r
+ case CLOUDHV_DEVICE_ID:\r
+ DEBUG ((DEBUG_INFO, "%a: Cloud Hypervisor host bridge\n", __FUNCTION__));\r
+ PcdStatus = PcdSet16S (\r
+ PcdOvmfHostBridgePciDevId,\r
+ CLOUDHV_DEVICE_ID\r
+ );\r
+ ASSERT_RETURN_ERROR (PcdStatus);\r
+ return;\r
default:\r
DEBUG ((\r
DEBUG_ERROR,\r