From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2607:f8b0:4003:c06::236; helo=mail-oi0-x236.google.com; envelope-from=delco@google.com; receiver=edk2-devel@lists.01.org Received: from mail-oi0-x236.google.com (mail-oi0-x236.google.com [IPv6:2607:f8b0:4003:c06::236]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id CE728203B9903 for ; Sun, 27 May 2018 14:57:17 -0700 (PDT) Received: by mail-oi0-x236.google.com with SMTP id k5-v6so8873007oiw.0 for ; Sun, 27 May 2018 14:57:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:from:date:message-id:subject:to:cc; bh=QqJhOpDG21JNAUXjGdJHV08uODjZh/jgQG8p3ni0z0s=; b=KdKerzDifEwGtfTLO74nPy2lzqdfdeuYTs1JHb5N8Wmg+q00fjc4xhJOUaNEHWcmea wIjwX6Q7Tr4g9LlCHjpMpf9N3v9xHkgT6aAvT7KOEPBBpsVtk7qHL3Fqm5mEKM3CWl5h UUSffgc8jpOzLClFZo4mO9QRPX55vOUSmw7SQ1kzrkvTpNAxty/hHHWSGp3M43KJqwhG FU4EyK8hsdkDsi8a9gJ4hRdCmgGUnewNSCdMWHpmA/9QGionmJlw1GiGi2qMGPHQLBxn n9Wsw/gEY83VQOPZhUfUtFq4fmsXfCb9etQy4DlIAmRmjtLsK8xwncoRVfG4Ivk93gdH 8bvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to:cc; bh=QqJhOpDG21JNAUXjGdJHV08uODjZh/jgQG8p3ni0z0s=; b=pmisLaTm243M8wwzzBZEmpjIRs7m+qVAbDOZaNTCwBMGTyKY66W9RWBV8MNL84KZq6 aH8il+VRQWnDuM854V+uKrmhl7OpgWZfzDNvzKxH4zfLEYTo7rq0U/pNFXrRFk3uNxB6 hxxGYSdPsz3F9gIeD8kNu+YYvLsB0uJiJhn8+a+hlnAAmfYsKZkED6TAHuD4xPSoGOk4 y52u1387z+Lh0SeTub6LiGhNcBHI4MqRgEAnYJpSz9zNZNSUys4Fd8wMXi8nPWb5ayBV Pi5m39+Kq3zHbImC70BgQzDsGzMQfmJeaqmTkQCQjTVviaDIqAPFRj79fvwdi28RV9CT nC2Q== X-Gm-Message-State: ALKqPwedPOMaWC0zRB+cLFVWAHaA3VWI8PMg408EZtnun3DXYF7r+ktx rAYFcT6yYVcBatxITPSoLmeMV07J1rKDKjfcpwqUzsKhZc8= X-Google-Smtp-Source: AB8JxZpII1p/y397c6aewfOEQI2SaLBGFYUyA/d/DagSAGM0AlJyM5nXwzzjnLaQevtrpym+wjNTEq8CUcxTAO6oLdw= X-Received: by 2002:aca:be43:: with SMTP id o64-v6mr5826707oif.212.1527458236172; Sun, 27 May 2018 14:57:16 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a4a:26ce:0:0:0:0:0 with HTTP; Sun, 27 May 2018 14:57:15 -0700 (PDT) From: Matt Delco Date: Sun, 27 May 2018 14:57:15 -0700 Message-ID: To: edk2-devel@lists.01.org Cc: Maurice Ma , Prince Agyeman , Benjamin You X-Mailman-Approved-At: Mon, 28 May 2018 04:30:17 -0700 X-Content-Filtered-By: Mailman/MimeDel 2.1.26 Subject: [PATCH] CorebootModulePkg/CbSupportDxe: Enable ACPI via cmd register X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 27 May 2018 21:57:18 -0000 Content-Type: text/plain; charset="UTF-8" The existing code sets the SCI_EN bit directly, which is a violation of the ACPI spec ("It is the responsibility of the hardware to set or reset this bit. OSPM always preserves this bit position"). The proper way to cause this bit to bit set is to reference the FADT table and write the value of ACPI_ENABLE to SMI_CMD. The SMI will in turn set the SCI_EN bit. Prior to this change ACPI events were not being delivered because ACPI was not properly enabled and the OS also did not attempt to enable ACPI since it sees that SCI_EN is already set. After this change I observed that ACPI events were now being delivered properly. Cc: Maurice Ma Cc: Prince Agyeman Cc: Benjamin You Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Matt Delco --- CorebootModulePkg/CbSupportDxe/CbSupportDxe.c | 79 ++++++++++++++++--- .../CbSupportDxe/CbSupportDxe.inf | 1 + 2 files changed, 68 insertions(+), 12 deletions(-) diff --git a/CorebootModulePkg/CbSupportDxe/CbSupportDxe.c b/CorebootModulePkg/CbSupportDxe/CbSupportDxe.c index c526c9e871..4c7917ff2a 100755 --- a/CorebootModulePkg/CbSupportDxe/CbSupportDxe.c +++ b/CorebootModulePkg/CbSupportDxe/CbSupportDxe.c @@ -14,7 +14,10 @@ **/ #include "CbSupportDxe.h" -UINTN mPmCtrlReg = 0; +BOOLEAN mSmiPortFound = FALSE; +UINTN mSmiCommandPort = 0; +UINT8 mAcpiEnable = 0; + /** Reserve MMIO/IO resource in GCD @@ -107,9 +110,63 @@ OnReadyToBoot ( // // Enable SCI // - IoOr16 (mPmCtrlReg, BIT0); + if (!mSmiPortFound) { + DEBUG ((DEBUG_ERROR, "SMI port not known so can not enable SCI\n")); + } else { + IoWrite8 (mSmiCommandPort, mAcpiEnable); + DEBUG ((DEBUG_ERROR, "Enable ACPI at 0x%lx with 0x%x before boot\n", (UINT64)mSmiCommandPort, (UINT32)mAcpiEnable)); + } +} + +/** + Lookup port and value for enabling ACPI + + @param[in] SystemTable A pointer to the EFI System Table. - DEBUG ((EFI_D_ERROR, "Enable SCI bit at 0x%lx before boot\n", (UINT64)mPmCtrlReg)); +**/ +VOID +FindAcpiFadtTableInfo ( + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp; + EFI_ACPI_DESCRIPTION_HEADER *Rsdt; + EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *Fadt; + UINTN Index; + Rsdp = NULL; + Rsdt = NULL; + Fadt = NULL; + + for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) { + if (CompareGuid (&(SystemTable->ConfigurationTable[Index].VendorGuid), &gEfiAcpi20TableGuid)) { + Rsdp = SystemTable->ConfigurationTable[Index].VendorTable; + break; + } + } + if (Rsdp == NULL) { + return; + } + + Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress; + if (Rsdt == NULL || Rsdt->Signature != EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) { + return; + } + for (Index = sizeof (EFI_ACPI_DESCRIPTION_HEADER); Index < Rsdt->Length; Index = Index + sizeof (UINT32)) { + UINT32 Data32 = *(UINT32 *) ((UINT8 *) Rsdt + Index); + Fadt = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *) (UINT32 *) (UINTN) Data32; + if (Fadt->Header.Signature == EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) { + break; + } + } + + if (Fadt == NULL || Fadt->Header.Signature != EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE) { + return; + } + + mSmiPortFound = TRUE; + mSmiCommandPort = Fadt->SmiCmd; + mAcpiEnable = Fadt->AcpiEnable; + return; } /** @@ -133,7 +190,6 @@ CbDxeEntryPoint ( EFI_EVENT ReadyToBootEvent; EFI_HOB_GUID_TYPE *GuidHob; SYSTEM_TABLE_INFO *pSystemTableInfo; - ACPI_BOARD_INFO *pAcpiBoardInfo; FRAME_BUFFER_INFO *FbInfo; Status = EFI_SUCCESS; @@ -172,14 +228,14 @@ CbDxeEntryPoint ( } // - // Find the acpi board information guid hob + // Find the SMI port in the FADT table in acpi // - GuidHob = GetFirstGuidHob (&gUefiAcpiBoardInfoGuid); - ASSERT (GuidHob != NULL); - pAcpiBoardInfo = (ACPI_BOARD_INFO *)GET_GUID_HOB_DATA (GuidHob); - - mPmCtrlReg = (UINTN)pAcpiBoardInfo->PmCtrlRegBase; - DEBUG ((EFI_D_ERROR, "PmCtrlReg at 0x%lx\n", (UINT64)mPmCtrlReg)); + FindAcpiFadtTableInfo(SystemTable); + if (mSmiPortFound) { + DEBUG ((DEBUG_ERROR, "Found ACPI enable info in FADT: 0x%lx 0x%x\n", (UINT64)mSmiCommandPort, (UINT32)mAcpiEnable)); + } else { + DEBUG ((DEBUG_ERROR, "Failed to find FADT info for enabling ACPI\n")); + } // // Find the frame buffer information and update PCDs @@ -212,4 +268,3 @@ CbDxeEntryPoint ( return EFI_SUCCESS; } - diff --git a/CorebootModulePkg/CbSupportDxe/CbSupportDxe.inf b/CorebootModulePkg/CbSupportDxe/CbSupportDxe.inf index 99245183ea..e334dafdb7 100644 --- a/CorebootModulePkg/CbSupportDxe/CbSupportDxe.inf +++ b/CorebootModulePkg/CbSupportDxe/CbSupportDxe.inf @@ -51,6 +51,7 @@ [Guids] gEfiAcpiTableGuid + gEfiAcpi20TableGuid gEfiSmbiosTableGuid gUefiSystemTableInfoGuid gUefiAcpiBoardInfoGuid -- 2.17.0.921.gf22659ad46-goog