2 File to contain all the hardware specific stuff for the Smm Sw dispatch protocol.
4 Copyright (c) 2013-2015 Intel Corporation.
6 SPDX-License-Identifier: BSD-2-Clause-Patent
12 // Include common header file for this module.
14 #include "CommonHeader.h"
16 #include "QNCSmmHelpers.h"
18 EFI_SMM_CPU_PROTOCOL
*mSmmCpu
= NULL
;
20 CONST QNC_SMM_SOURCE_DESC SW_SOURCE_DESC
= {
24 {GPE_ADDR_TYPE
, {R_QNC_GPE0BLK_SMIE
}}, S_QNC_GPE0BLK_SMIE
, N_QNC_GPE0BLK_SMIE_APM
26 NULL_BIT_DESC_INITIALIZER
30 {GPE_ADDR_TYPE
, {R_QNC_GPE0BLK_SMIS
}}, S_QNC_GPE0BLK_SMIS
, N_QNC_GPE0BLK_SMIS_APM
37 IN DATABASE_RECORD
*Record
,
38 OUT QNC_SMM_CONTEXT
*Context
41 Context
->Sw
.SwSmiInputValue
= IoRead8 (R_APM_CNT
);
46 IN QNC_SMM_CONTEXT
*Context1
,
47 IN QNC_SMM_CONTEXT
*Context2
50 return (BOOLEAN
)( Context1
->Sw
.SwSmiInputValue
== Context2
->Sw
.SwSmiInputValue
);
55 IN DATABASE_RECORD
* Record
61 EFI_SMM_SAVE_STATE_IO_INFO IoState
;
64 // Locate SMM CPU protocol to retrieve the CPU save state
66 if (mSmmCpu
== NULL
) {
67 Status
= gSmst
->SmmLocateProtocol (&gEfiSmmCpuProtocolGuid
, NULL
, (VOID
**) &mSmmCpu
);
68 ASSERT_EFI_ERROR (Status
);
72 // Find the CPU which generated the software SMI
75 for (Index
= 0; Index
< gSmst
->NumberOfCpus
; Index
++) {
76 Status
= mSmmCpu
->ReadSaveState (
78 sizeof (EFI_SMM_SAVE_STATE_IO_INFO
),
79 EFI_SMM_SAVE_STATE_REGISTER_IO
,
83 if (!EFI_ERROR (Status
) && (IoState
.IoPort
== R_APM_CNT
)) {
89 Record
->CommBuffer
.Sw
.SwSmiCpuIndex
= CpuIndex
;