]>
Commit | Line | Data |
---|---|---|
c049fc99 JY |
1 | /** @file\r |
2 | \r | |
3 | Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r | |
4 | This program and the accompanying materials\r | |
5 | are licensed and made available under the terms and conditions of the BSD License\r | |
6 | which accompanies this distribution. The full text of the license may be found at\r | |
7 | http://opensource.org/licenses/bsd-license.php.\r | |
8 | \r | |
9 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
10 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r | |
11 | \r | |
12 | **/\r | |
13 | \r | |
14 | #include "DmaProtection.h"\r | |
15 | \r | |
16 | /**\r | |
17 | Create extended context entry.\r | |
18 | \r | |
19 | @param[in] VtdIndex The index of the VTd engine.\r | |
20 | \r | |
21 | @retval EFI_SUCCESS The extended context entry is created.\r | |
22 | @retval EFI_OUT_OF_RESOURCE No enough resource to create extended context entry.\r | |
23 | **/\r | |
24 | EFI_STATUS\r | |
25 | CreateExtContextEntry (\r | |
26 | IN UINTN VtdIndex\r | |
27 | )\r | |
28 | {\r | |
29 | UINTN Index;\r | |
30 | VOID *Buffer;\r | |
31 | UINTN RootPages;\r | |
32 | UINTN ContextPages;\r | |
33 | VTD_EXT_ROOT_ENTRY *ExtRootEntry;\r | |
34 | VTD_EXT_CONTEXT_ENTRY *ExtContextEntryTable;\r | |
35 | VTD_EXT_CONTEXT_ENTRY *ExtContextEntry;\r | |
f77d35c7 | 36 | VTD_SOURCE_ID *PciSourceId;\r |
c049fc99 JY |
37 | VTD_SOURCE_ID SourceId;\r |
38 | UINTN MaxBusNumber;\r | |
39 | UINTN EntryTablePages;\r | |
40 | \r | |
41 | MaxBusNumber = 0;\r | |
f77d35c7 JY |
42 | for (Index = 0; Index < mVtdUnitInformation[VtdIndex].PciDeviceInfo.PciDeviceDataNumber; Index++) {\r |
43 | PciSourceId = &mVtdUnitInformation[VtdIndex].PciDeviceInfo.PciDeviceData[Index].PciSourceId;\r | |
44 | if (PciSourceId->Bits.Bus > MaxBusNumber) {\r | |
45 | MaxBusNumber = PciSourceId->Bits.Bus;\r | |
c049fc99 JY |
46 | }\r |
47 | }\r | |
48 | DEBUG ((DEBUG_INFO," MaxBusNumber - 0x%x\n", MaxBusNumber));\r | |
49 | \r | |
50 | RootPages = EFI_SIZE_TO_PAGES (sizeof (VTD_EXT_ROOT_ENTRY) * VTD_ROOT_ENTRY_NUMBER);\r | |
51 | ContextPages = EFI_SIZE_TO_PAGES (sizeof (VTD_EXT_CONTEXT_ENTRY) * VTD_CONTEXT_ENTRY_NUMBER);\r | |
52 | EntryTablePages = RootPages + ContextPages * (MaxBusNumber + 1);\r | |
53 | Buffer = AllocateZeroPages (EntryTablePages);\r | |
54 | if (Buffer == NULL) {\r | |
55 | DEBUG ((DEBUG_INFO,"Could not Alloc Root Entry Table.. \n"));\r | |
56 | return EFI_OUT_OF_RESOURCES;\r | |
57 | }\r | |
58 | mVtdUnitInformation[VtdIndex].ExtRootEntryTable = (VTD_EXT_ROOT_ENTRY *)Buffer;\r | |
59 | Buffer = (UINT8 *)Buffer + EFI_PAGES_TO_SIZE (RootPages);\r | |
60 | \r | |
f77d35c7 JY |
61 | for (Index = 0; Index < mVtdUnitInformation[VtdIndex].PciDeviceInfo.PciDeviceDataNumber; Index++) {\r |
62 | PciSourceId = &mVtdUnitInformation[VtdIndex].PciDeviceInfo.PciDeviceData[Index].PciSourceId;\r | |
c049fc99 | 63 | \r |
f77d35c7 JY |
64 | SourceId.Bits.Bus = PciSourceId->Bits.Bus;\r |
65 | SourceId.Bits.Device = PciSourceId->Bits.Device;\r | |
66 | SourceId.Bits.Function = PciSourceId->Bits.Function;\r | |
c049fc99 JY |
67 | \r |
68 | ExtRootEntry = &mVtdUnitInformation[VtdIndex].ExtRootEntryTable[SourceId.Index.RootIndex];\r | |
69 | if (ExtRootEntry->Bits.LowerPresent == 0) {\r | |
76c6f69c SZ |
70 | ExtRootEntry->Bits.LowerContextTablePointerLo = (UINT32) RShiftU64 ((UINT64)(UINTN)Buffer, 12);\r |
71 | ExtRootEntry->Bits.LowerContextTablePointerHi = (UINT32) RShiftU64 ((UINT64)(UINTN)Buffer, 32);\r | |
c049fc99 | 72 | ExtRootEntry->Bits.LowerPresent = 1;\r |
76c6f69c SZ |
73 | ExtRootEntry->Bits.UpperContextTablePointerLo = (UINT32) RShiftU64 ((UINT64)(UINTN)Buffer, 12) + 1;\r |
74 | ExtRootEntry->Bits.UpperContextTablePointerHi = (UINT32) RShiftU64 (RShiftU64 ((UINT64)(UINTN)Buffer, 12) + 1, 20);\r | |
c049fc99 | 75 | ExtRootEntry->Bits.UpperPresent = 1;\r |
4ad5f597 | 76 | FlushPageTableMemory (VtdIndex, (UINTN)ExtRootEntry, sizeof(*ExtRootEntry));\r |
c049fc99 JY |
77 | Buffer = (UINT8 *)Buffer + EFI_PAGES_TO_SIZE (ContextPages);\r |
78 | }\r | |
79 | \r | |
76c6f69c | 80 | ExtContextEntryTable = (VTD_EXT_CONTEXT_ENTRY *)(UINTN)VTD_64BITS_ADDRESS(ExtRootEntry->Bits.LowerContextTablePointerLo, ExtRootEntry->Bits.LowerContextTablePointerHi) ;\r |
c049fc99 JY |
81 | ExtContextEntry = &ExtContextEntryTable[SourceId.Index.ContextIndex];\r |
82 | ExtContextEntry->Bits.TranslationType = 0;\r | |
83 | ExtContextEntry->Bits.FaultProcessingDisable = 0;\r | |
84 | ExtContextEntry->Bits.Present = 0;\r | |
85 | \r | |
86 | DEBUG ((DEBUG_INFO,"DOMAIN: S%04x, B%02x D%02x F%02x\n", mVtdUnitInformation[VtdIndex].Segment, SourceId.Bits.Bus, SourceId.Bits.Device, SourceId.Bits.Function));\r | |
87 | \r | |
88 | switch (mVtdUnitInformation[VtdIndex].CapReg.Bits.SAGAW) {\r | |
89 | case BIT1:\r | |
90 | ExtContextEntry->Bits.AddressWidth = 0x1;\r | |
91 | break;\r | |
92 | case BIT2:\r | |
93 | ExtContextEntry->Bits.AddressWidth = 0x2;\r | |
94 | break;\r | |
95 | }\r | |
4ad5f597 | 96 | FlushPageTableMemory (VtdIndex, (UINTN)ExtContextEntry, sizeof(*ExtContextEntry));\r |
c049fc99 JY |
97 | }\r |
98 | \r | |
99 | return EFI_SUCCESS;\r | |
100 | }\r | |
101 | \r | |
102 | /**\r | |
103 | Dump DMAR extended context entry table.\r | |
104 | \r | |
105 | @param[in] ExtRootEntry DMAR extended root entry.\r | |
106 | **/\r | |
107 | VOID\r | |
108 | DumpDmarExtContextEntryTable (\r | |
109 | IN VTD_EXT_ROOT_ENTRY *ExtRootEntry\r | |
110 | )\r | |
111 | {\r | |
112 | UINTN Index;\r | |
113 | UINTN Index2;\r | |
114 | VTD_EXT_CONTEXT_ENTRY *ExtContextEntry;\r | |
115 | \r | |
116 | DEBUG ((DEBUG_INFO,"=========================\n"));\r | |
117 | DEBUG ((DEBUG_INFO,"DMAR ExtContext Entry Table:\n"));\r | |
118 | \r | |
119 | DEBUG ((DEBUG_INFO,"ExtRootEntry Address - 0x%x\n", ExtRootEntry));\r | |
120 | \r | |
121 | for (Index = 0; Index < VTD_ROOT_ENTRY_NUMBER; Index++) {\r | |
122 | if ((ExtRootEntry[Index].Uint128.Uint64Lo != 0) || (ExtRootEntry[Index].Uint128.Uint64Hi != 0)) {\r | |
123 | DEBUG ((DEBUG_INFO," ExtRootEntry(0x%02x) B%02x - 0x%016lx %016lx\n",\r | |
124 | Index, Index, ExtRootEntry[Index].Uint128.Uint64Hi, ExtRootEntry[Index].Uint128.Uint64Lo));\r | |
125 | }\r | |
126 | if (ExtRootEntry[Index].Bits.LowerPresent == 0) {\r | |
127 | continue;\r | |
128 | }\r | |
76c6f69c | 129 | ExtContextEntry = (VTD_EXT_CONTEXT_ENTRY *)(UINTN)VTD_64BITS_ADDRESS(ExtRootEntry[Index].Bits.LowerContextTablePointerLo, ExtRootEntry[Index].Bits.LowerContextTablePointerHi);\r |
c049fc99 JY |
130 | for (Index2 = 0; Index2 < VTD_CONTEXT_ENTRY_NUMBER/2; Index2++) {\r |
131 | if ((ExtContextEntry[Index2].Uint256.Uint64_1 != 0) || (ExtContextEntry[Index2].Uint256.Uint64_2 != 0) ||\r | |
132 | (ExtContextEntry[Index2].Uint256.Uint64_3 != 0) || (ExtContextEntry[Index2].Uint256.Uint64_4 != 0)) {\r | |
133 | DEBUG ((DEBUG_INFO," ExtContextEntryLower(0x%02x) D%02xF%02x - 0x%016lx %016lx %016lx %016lx\n",\r | |
134 | Index2, Index2 >> 3, Index2 & 0x7, ExtContextEntry[Index2].Uint256.Uint64_4, ExtContextEntry[Index2].Uint256.Uint64_3, ExtContextEntry[Index2].Uint256.Uint64_2, ExtContextEntry[Index2].Uint256.Uint64_1));\r | |
135 | }\r | |
136 | if (ExtContextEntry[Index2].Bits.Present == 0) {\r | |
137 | continue;\r | |
138 | }\r | |
139 | }\r | |
140 | \r | |
141 | if (ExtRootEntry[Index].Bits.UpperPresent == 0) {\r | |
142 | continue;\r | |
143 | }\r | |
76c6f69c | 144 | ExtContextEntry = (VTD_EXT_CONTEXT_ENTRY *)(UINTN)VTD_64BITS_ADDRESS(ExtRootEntry[Index].Bits.UpperContextTablePointerLo, ExtRootEntry[Index].Bits.UpperContextTablePointerHi);\r |
c049fc99 JY |
145 | for (Index2 = 0; Index2 < VTD_CONTEXT_ENTRY_NUMBER/2; Index2++) {\r |
146 | if ((ExtContextEntry[Index2].Uint256.Uint64_1 != 0) || (ExtContextEntry[Index2].Uint256.Uint64_2 != 0) ||\r | |
147 | (ExtContextEntry[Index2].Uint256.Uint64_3 != 0) || (ExtContextEntry[Index2].Uint256.Uint64_4 != 0)) {\r | |
148 | DEBUG ((DEBUG_INFO," ExtContextEntryUpper(0x%02x) D%02xF%02x - 0x%016lx %016lx %016lx %016lx\n",\r | |
149 | Index2, (Index2 + 128) >> 3, (Index2 + 128) & 0x7, ExtContextEntry[Index2].Uint256.Uint64_4, ExtContextEntry[Index2].Uint256.Uint64_3, ExtContextEntry[Index2].Uint256.Uint64_2, ExtContextEntry[Index2].Uint256.Uint64_1));\r | |
150 | }\r | |
151 | if (ExtContextEntry[Index2].Bits.Present == 0) {\r | |
152 | continue;\r | |
153 | }\r | |
154 | }\r | |
155 | }\r | |
156 | DEBUG ((DEBUG_INFO,"=========================\n"));\r | |
157 | }\r |