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