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