]> git.proxmox.com Git - mirror_edk2.git/blob - QuarkSocPkg/QuarkNorthCluster/Smm/DxeSmm/QncSmmDispatcher/QNC/QNCSmmSw.c
QuarkSocPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / QuarkSocPkg / QuarkNorthCluster / Smm / DxeSmm / QncSmmDispatcher / QNC / QNCSmmSw.c
1 /** @file
2 File to contain all the hardware specific stuff for the Smm Sw dispatch protocol.
3
4 Copyright (c) 2013-2015 Intel Corporation.
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8
9 **/
10
11 //
12 // Include common header file for this module.
13 //
14 #include "CommonHeader.h"
15
16 #include "QNCSmmHelpers.h"
17
18 EFI_SMM_CPU_PROTOCOL *mSmmCpu = NULL;
19
20 CONST QNC_SMM_SOURCE_DESC SW_SOURCE_DESC = {
21 QNC_SMM_NO_FLAGS,
22 {
23 {
24 {GPE_ADDR_TYPE, {R_QNC_GPE0BLK_SMIE}}, S_QNC_GPE0BLK_SMIE, N_QNC_GPE0BLK_SMIE_APM
25 },
26 NULL_BIT_DESC_INITIALIZER
27 },
28 {
29 {
30 {GPE_ADDR_TYPE, {R_QNC_GPE0BLK_SMIS}}, S_QNC_GPE0BLK_SMIS, N_QNC_GPE0BLK_SMIS_APM
31 }
32 }
33 };
34
35 VOID
36 SwGetContext(
37 IN DATABASE_RECORD *Record,
38 OUT QNC_SMM_CONTEXT *Context
39 )
40 {
41 Context->Sw.SwSmiInputValue = IoRead8 (R_APM_CNT);
42 }
43
44 BOOLEAN
45 SwCmpContext (
46 IN QNC_SMM_CONTEXT *Context1,
47 IN QNC_SMM_CONTEXT *Context2
48 )
49 {
50 return (BOOLEAN)( Context1->Sw.SwSmiInputValue == Context2->Sw.SwSmiInputValue );
51 }
52
53 VOID
54 SwGetBuffer (
55 IN DATABASE_RECORD * Record
56 )
57 {
58 EFI_STATUS Status;
59 UINTN Index;
60 UINTN CpuIndex;
61 EFI_SMM_SAVE_STATE_IO_INFO IoState;
62
63 //
64 // Locate SMM CPU protocol to retrieve the CPU save state
65 //
66 if (mSmmCpu == NULL) {
67 Status = gSmst->SmmLocateProtocol (&gEfiSmmCpuProtocolGuid, NULL, (VOID **) &mSmmCpu);
68 ASSERT_EFI_ERROR (Status);
69 }
70
71 //
72 // Find the CPU which generated the software SMI
73 //
74 CpuIndex = 0;
75 for (Index = 0; Index < gSmst->NumberOfCpus; Index++) {
76 Status = mSmmCpu->ReadSaveState (
77 mSmmCpu,
78 sizeof (EFI_SMM_SAVE_STATE_IO_INFO),
79 EFI_SMM_SAVE_STATE_REGISTER_IO,
80 Index,
81 &IoState
82 );
83 if (!EFI_ERROR (Status) && (IoState.IoPort == R_APM_CNT)) {
84 CpuIndex = Index;
85 break;
86 }
87 }
88
89 Record->CommBuffer.Sw.SwSmiCpuIndex = CpuIndex;
90 }