]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Drivers/PL310L2Cache/PL310L2Cache.c
Armkg: Fix EDK2 coding style
[mirror_edk2.git] / ArmPkg / Drivers / PL310L2Cache / PL310L2Cache.c
CommitLineData
1bfda055 1/** @file\r
2*\r
3* Copyright (c) 2011, ARM Limited. All rights reserved.\r
4* \r
5* This program and the accompanying materials \r
6* are licensed and made available under the terms and conditions of the BSD License \r
7* which accompanies this distribution. The full text of the license may be found at \r
8* http://opensource.org/licenses/bsd-license.php \r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
12*\r
13**/\r
14\r
15#include <Library/IoLib.h>\r
16#include <Library/DebugLib.h>\r
17#include <Library/ArmLib.h>\r
18#include <Library/L2X0CacheLib.h>\r
19#include <Library/PcdLib.h>\r
20\r
21#define L2x0WriteReg(reg,val) MmioWrite32(PcdGet32(PcdL2x0ControllerBase) + reg, val)\r
22#define L2x0ReadReg(reg) MmioRead32(PcdGet32(PcdL2x0ControllerBase) + reg)\r
23\r
24// Initialize PL320 L2 Cache Controller\r
63adfb11 25VOID\r
26L2x0CacheInit (\r
27 IN UINTN L2x0Base,\r
28 IN BOOLEAN CacheEnabled\r
29 )\r
30{\r
31 UINT32 Data;\r
32 UINT32 Revision;\r
33 UINT32 Aux;\r
34 UINT32 PfCtl;\r
35 UINT32 PwrCtl;\r
36\r
37 // Check if L2x0 is present and is an ARM implementation\r
38 Data = L2x0ReadReg(L2X0_CACHEID);\r
39 if ((Data >> 24) != L2X0_CACHEID_IMPLEMENTER_ARM) {\r
40 ASSERT(0);\r
41 return;\r
42 }\r
43\r
44 // Check if L2x0 is PL310\r
45 if (((Data >> 6) & 0xF) != L2X0_CACHEID_PARTNUM_PL310) {\r
46 ASSERT(0);\r
47 return;\r
48 }\r
49\r
50 // RTL release\r
51 Revision = Data & 0x3F;\r
52\r
53 // Check if L2x0 is already enabled then we disable it\r
54 Data = L2x0ReadReg(L2X0_CTRL);\r
55 if (Data & L2X0_CTRL_ENABLED) {\r
56 L2x0WriteReg(L2X0_CTRL, L2X0_CTRL_DISABLED);\r
57 }\r
58\r
59 //\r
60 // Set up global configurations\r
61 //\r
62\r
63 // Auxiliary register: Non-secure interrupt access Control + Event monitor bus enable + SBO\r
64 Aux = L2X0_AUXCTRL_NSAC | L2X0_AUXCTRL_EM | L2X0_AUXCTRL_SBO;\r
65 // Use AWCACHE attributes for WA\r
66 Aux |= L2x0_AUXCTRL_AW_AWCACHE;\r
67 // Use default Size\r
68 Data = L2x0ReadReg(L2X0_AUXCTRL);\r
69 Aux |= Data & (0x7 << 17);\r
70 // Use default associativity\r
71 Aux |= Data & (0x1 << 16);\r
72 // Enabled I & D Prefetch\r
73 Aux |= L2x0_AUXCTRL_IPREFETCH | L2x0_AUXCTRL_DPREFETCH;\r
74\r
75 if (Revision >= 5) {\r
76 // Prefetch Offset Register\r
77 PfCtl = L2x0ReadReg(L2X0_PFCTRL);\r
78 // - Prefetch increment set to 0\r
79 // - Prefetch dropping off\r
80 // - Double linefills off\r
81 L2x0WriteReg(L2X0_PFCTRL, PfCtl);\r
82\r
83 // Power Control Register - L2X0_PWRCTRL\r
84 PwrCtl = L2x0ReadReg(L2X0_PWRCTRL);\r
85 // - Standby when idle off\r
86 // - Dynamic clock gating off\r
87 // - Nc,NC-shared dropping off\r
88 L2x0WriteReg(L2X0_PWRCTRL, PwrCtl);\r
89 }\r
1bfda055 90\r
91 if (Revision >= 4) {\r
92 // Tag RAM Latency register\r
93 // - Use default latency\r
94 \r
95 // Data RAM Latency Control register\r
96 // - Use default latency\r
97 } else if (Revision >= 2) {\r
98 L2x0WriteReg(L230_TAG_LATENCY,\r
99 (L2_TAG_ACCESS_LATENCY << 8)\r
100 | (L2_TAG_ACCESS_LATENCY << 4)\r
101 | L2_TAG_SETUP_LATENCY\r
102 );\r
103 \r
104 L2x0WriteReg(L230_DATA_LATENCY,\r
105 (L2_DATA_ACCESS_LATENCY << 8)\r
106 | (L2_DATA_ACCESS_LATENCY << 4)\r
107 | L2_DATA_SETUP_LATENCY\r
108 );\r
109 } else {\r
110 Aux |= (L2_TAG_ACCESS_LATENCY << 6)\r
111 | (L2_DATA_ACCESS_LATENCY << 3)\r
112 | L2_DATA_ACCESS_LATENCY;\r
113 }\r
114\r
63adfb11 115 // Write Auxiliary value\r
116 L2x0WriteReg(L2X0_AUXCTRL, Aux);\r
1bfda055 117\r
63adfb11 118 //\r
119 // Invalidate all entries in cache\r
120 //\r
121 L2x0WriteReg(L2X0_INVWAY, 0xffff);\r
122 // Poll cache maintenance register until invalidate operation is complete\r
123 while(L2x0ReadReg(L2X0_INVWAY) & 0xffff);\r
1bfda055 124\r
63adfb11 125 // Write to the Lockdown D and Lockdown I Register 9 if required\r
126 // - Not required\r
1bfda055 127\r
63adfb11 128 // Clear any residual raw interrupts\r
129 L2x0WriteReg(L2X0_INTCLEAR, 0x1FF);\r
1bfda055 130\r
63adfb11 131 // Enable the cache\r
132 if (CacheEnabled) {\r
133 L2x0WriteReg(L2X0_CTRL, L2X0_CTRL_ENABLED);\r
134 }\r
1bfda055 135}\r