]> git.proxmox.com Git - mirror_edk2.git/blame - QuarkPlatformPkg/Platform/Pei/PlatformInit/PlatformErratas.c
ArmPkg/CompilerIntrinsicsLib: Add uread, uwrite GCC assembly sources
[mirror_edk2.git] / QuarkPlatformPkg / Platform / Pei / PlatformInit / PlatformErratas.c
CommitLineData
b303605e
MK
1/** @file\r
2Platform Erratas performed by early init PEIM driver.\r
3\r
4Copyright (c) 2013 Intel Corporation.\r
5\r
0eb3de2e 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
b303605e
MK
7\r
8**/\r
9\r
10#include "CommonHeader.h"\r
11#include "PlatformEarlyInit.h"\r
12\r
13//\r
14// Constants.\r
15//\r
16\r
17//\r
18// Platform EHCI Packet Buffer OUT/IN Thresholds, values in number of DWORDs.\r
19//\r
20#define EHCI_OUT_THRESHOLD_VALUE (0x7f)\r
21#define EHCI_IN_THRESHOLD_VALUE (0x7f)\r
22\r
23//\r
24// Platform init USB device interrupt masks.\r
25//\r
26#define V_IOH_USBDEVICE_D_INTR_MSK_UDC_REG (0x0000007f)\r
27#define V_IOH_USBDEVICE_EP_INTR_MSK_UDC_REG (B_IOH_USBDEVICE_EP_INTR_MSK_UDC_REG_OUT_EP_MASK | B_IOH_USBDEVICE_EP_INTR_MSK_UDC_REG_IN_EP_MASK)\r
28\r
29//\r
30// Global variables defined within this source module.\r
31//\r
32\r
33UINTN IohEhciPciReg[IOH_MAX_EHCI_USB_CONTROLLERS] = {\r
34 PCI_LIB_ADDRESS (IOH_USB_BUS_NUMBER, IOH_USB_EHCI_DEVICE_NUMBER, IOH_EHCI_FUNCTION_NUMBER, 0),\r
35};\r
36\r
37UINTN IohUsbDevicePciReg[IOH_MAX_USBDEVICE_USB_CONTROLLERS] = {\r
38 PCI_LIB_ADDRESS (IOH_USB_BUS_NUMBER, IOH_USBDEVICE_DEVICE_NUMBER, IOH_USBDEVICE_FUNCTION_NUMBER, 0),\r
39};\r
40\r
41//\r
42// Routines local to this source module.\r
43//\r
44\r
45/** Perform USB erratas after MRC init.\r
46\r
47**/\r
48VOID\r
49PlatformUsbErratasPostMrc (\r
50 VOID\r
51 )\r
52{\r
53 UINT32 Index;\r
54 UINT32 TempBar0Addr;\r
55 UINT16 SaveCmdReg;\r
56 UINT32 SaveBar0Reg;\r
57\r
58 TempBar0Addr = PcdGet32(PcdPeiQNCUsbControllerMemoryBaseAddress);\r
59\r
60 //\r
61 // Apply EHCI controller erratas.\r
62 //\r
63 for (Index = 0; Index < IOH_MAX_EHCI_USB_CONTROLLERS; Index++, TempBar0Addr += IOH_USB_CONTROLLER_MMIO_RANGE) {\r
64\r
65 if ((PciRead16 (IohEhciPciReg[Index] + R_IOH_USB_VENDOR_ID)) != V_IOH_USB_VENDOR_ID) {\r
66 continue; // Device not enabled, skip.\r
67 }\r
68\r
69 //\r
70 // Save current settings for PCI CMD/BAR0 registers\r
71 //\r
72 SaveCmdReg = PciRead16 (IohEhciPciReg[Index] + R_IOH_USB_COMMAND);\r
73 SaveBar0Reg = PciRead32 (IohEhciPciReg[Index] + R_IOH_USB_MEMBAR);\r
74\r
75 //\r
76 // Temp. assign base address register, Enable Memory Space.\r
77 //\r
78 PciWrite32 ((IohEhciPciReg[Index] + R_IOH_USB_MEMBAR), TempBar0Addr);\r
79 PciWrite16 (IohEhciPciReg[Index] + R_IOH_USB_COMMAND, SaveCmdReg | B_IOH_USB_COMMAND_MSE);\r
80\r
81\r
82 //\r
83 // Set packet buffer OUT/IN thresholds.\r
84 //\r
85 MmioAndThenOr32 (\r
86 TempBar0Addr + R_IOH_EHCI_INSNREG01,\r
87 (UINT32) (~(B_IOH_EHCI_INSNREG01_OUT_THRESHOLD_MASK | B_IOH_EHCI_INSNREG01_IN_THRESHOLD_MASK)),\r
88 (UINT32) ((EHCI_OUT_THRESHOLD_VALUE << B_IOH_EHCI_INSNREG01_OUT_THRESHOLD_BP) | (EHCI_IN_THRESHOLD_VALUE << B_IOH_EHCI_INSNREG01_IN_THRESHOLD_BP))\r
89 );\r
90\r
91 //\r
92 // Restore settings for PCI CMD/BAR0 registers\r
93 //\r
94 PciWrite32 ((IohEhciPciReg[Index] + R_IOH_USB_MEMBAR), SaveBar0Reg);\r
95 PciWrite16 (IohEhciPciReg[Index] + R_IOH_USB_COMMAND, SaveCmdReg);\r
96 }\r
97\r
98 //\r
99 // Apply USB device controller erratas.\r
100 //\r
101 for (Index = 0; Index < IOH_MAX_USBDEVICE_USB_CONTROLLERS; Index++, TempBar0Addr += IOH_USB_CONTROLLER_MMIO_RANGE) {\r
102\r
103 if ((PciRead16 (IohUsbDevicePciReg[Index] + R_IOH_USB_VENDOR_ID)) != V_IOH_USB_VENDOR_ID) {\r
104 continue; // Device not enabled, skip.\r
105 }\r
106\r
107 //\r
108 // Save current settings for PCI CMD/BAR0 registers\r
109 //\r
110 SaveCmdReg = PciRead16 (IohUsbDevicePciReg[Index] + R_IOH_USB_COMMAND);\r
111 SaveBar0Reg = PciRead32 (IohUsbDevicePciReg[Index] + R_IOH_USB_MEMBAR);\r
112\r
113 //\r
114 // Temp. assign base address register, Enable Memory Space.\r
115 //\r
116 PciWrite32 ((IohUsbDevicePciReg[Index] + R_IOH_USB_MEMBAR), TempBar0Addr);\r
117 PciWrite16 (IohUsbDevicePciReg[Index] + R_IOH_USB_COMMAND, SaveCmdReg | B_IOH_USB_COMMAND_MSE);\r
118\r
119 //\r
120 // Erratas for USB Device interrupt registers.\r
121 //\r
122\r
123 //\r
124 // 1st Mask interrupts.\r
125 //\r
126 MmioWrite32 (\r
127 TempBar0Addr + R_IOH_USBDEVICE_D_INTR_MSK_UDC_REG,\r
128 V_IOH_USBDEVICE_D_INTR_MSK_UDC_REG\r
129 );\r
130 //\r
131 // 2nd RW/1C of equivalent status bits.\r
132 //\r
133 MmioWrite32 (\r
134 TempBar0Addr + R_IOH_USBDEVICE_D_INTR_UDC_REG,\r
135 V_IOH_USBDEVICE_D_INTR_MSK_UDC_REG\r
136 );\r
137\r
138 //\r
139 // 1st Mask end point interrupts.\r
140 //\r
141 MmioWrite32 (\r
142 TempBar0Addr + R_IOH_USBDEVICE_EP_INTR_MSK_UDC_REG,\r
143 V_IOH_USBDEVICE_EP_INTR_MSK_UDC_REG\r
144 );\r
145 //\r
146 // 2nd RW/1C of equivalent end point status bits.\r
147 //\r
148 MmioWrite32 (\r
149 TempBar0Addr + R_IOH_USBDEVICE_EP_INTR_UDC_REG,\r
150 V_IOH_USBDEVICE_EP_INTR_MSK_UDC_REG\r
151 );\r
152\r
153 //\r
154 // Restore settings for PCI CMD/BAR0 registers\r
155 //\r
156 PciWrite32 ((IohUsbDevicePciReg[Index] + R_IOH_USB_MEMBAR), SaveBar0Reg);\r
157 PciWrite16 (IohUsbDevicePciReg[Index] + R_IOH_USB_COMMAND, SaveCmdReg);\r
158 }\r
159}\r
160\r
161//\r
162// Routines exported by this source module.\r
163//\r
164\r
165/** Perform Platform Erratas after MRC.\r
166\r
167 @retval EFI_SUCCESS Operation success.\r
168\r
169**/\r
170EFI_STATUS\r
171EFIAPI\r
172PlatformErratasPostMrc (\r
173 VOID\r
174 )\r
175{\r
176 PlatformUsbErratasPostMrc ();\r
177 return EFI_SUCCESS;\r
178}\r