]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/PlatformInitPei/Stall.c
Vlv2TbltDevicePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Vlv2TbltDevicePkg / PlatformInitPei / Stall.c
CommitLineData
3cbfba02
DW
1/** @file\r
2\r
3 Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
9dc8036d
MK
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3cbfba02
DW
7 \r\r
8\r
9\r
10\r
11Module Name:\r
12\r
13 Stall.c\r
14\r
15Abstract:\r
16\r
17 Produce Stall Ppi.\r
18\r
19--*/\r
20\r
21\r
22#include "PlatformEarlyInit.h"\r
23\r
24\r
25/**\r
26\r
27 Waits for at least the given number of microseconds.\r
28\r
29 @param PeiServices General purpose services available to every PEIM.\r
30 @param This PPI instance structure.\r
31 @param Microseconds Desired length of time to wait.\r
32\r
33 @retval EFI_SUCCESS If the desired amount of time was passed.\r
34\r
35*/\r
36EFI_STATUS\r
37EFIAPI\r
38Stall (\r
39 IN CONST EFI_PEI_SERVICES **PeiServices,\r
40 IN CONST EFI_PEI_STALL_PPI *This,\r
41 IN UINTN Microseconds\r
42 )\r
43{\r
44 UINTN Ticks;\r
45 UINTN Counts;\r
46 UINT32 CurrentTick;\r
47 UINT32 OriginalTick;\r
48 UINT32 RemainingTick;\r
49\r
50 if (Microseconds == 0) {\r
51 return EFI_SUCCESS;\r
52 }\r
53\r
54 OriginalTick = IoRead32 (ACPI_BASE_ADDRESS + R_PCH_ACPI_PM1_TMR);\r
55 OriginalTick &= (V_PCH_ACPI_PM1_TMR_MAX_VAL - 1);\r
56 CurrentTick = OriginalTick;\r
57\r
58 //\r
59 // The timer frequency is 3.579545MHz, so 1 ms corresponds to 3.58 clocks\r
60 //\r
61 Ticks = Microseconds * 358 / 100 + OriginalTick + 1;\r
62\r
63 //\r
64 // The loops needed for timer overflow\r
65 //\r
66 Counts = (UINTN)RShiftU64((UINT64)Ticks, 24);\r
67\r
68 //\r
69 // Remaining clocks within one loop\r
70 //\r
71 RemainingTick = Ticks & 0xFFFFFF;\r
72\r
73 //\r
74 // Do not intend to use TMROF_STS bit of register PM1_STS, because this add extra\r
75 // one I/O operation, and may generate SMI\r
76 //\r
77 while (Counts != 0) {\r
78 CurrentTick = IoRead32 (ACPI_BASE_ADDRESS + R_PCH_ACPI_PM1_TMR) & B_PCH_ACPI_PM1_TMR_VAL;\r
79 if (CurrentTick <= OriginalTick) {\r
80 Counts--;\r
81 }\r
82 OriginalTick = CurrentTick;\r
83 }\r
84\r
85 while ((RemainingTick > CurrentTick) && (OriginalTick <= CurrentTick)) {\r
86 OriginalTick = CurrentTick;\r
87 CurrentTick = IoRead32 (ACPI_BASE_ADDRESS + R_PCH_ACPI_PM1_TMR) & B_PCH_ACPI_PM1_TMR_VAL;\r
88 }\r
89\r
90 return EFI_SUCCESS;\r
91}\r