OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
OcRtcLib.c
Go to the documentation of this file.
1
20#include <Library/IoLib.h>
21#include <Library/OcRtcLib.h>
22#include "OcRtcLibInternal.h"
23
24UINT8
26 IN UINT8 Offset
27 )
28{
29 UINT8 RtcIndexPort;
30 UINT8 RtcDataPort;
31 UINT8 RtcIndexNmi;
32
33 if (Offset < RTC_BANK_SIZE) {
34 RtcIndexPort = R_PCH_RTC_INDEX;
35 RtcDataPort = R_PCH_RTC_TARGET;
36 } else {
37 RtcIndexPort = R_PCH_RTC_EXT_INDEX;
38 RtcDataPort = R_PCH_RTC_EXT_TARGET;
39 }
40
41 RtcIndexNmi = IoRead8 (RtcIndexPort) & RTC_NMI_MASK;
42 IoWrite8 (RtcIndexPort, (Offset & RTC_DATA_MASK) | RtcIndexNmi);
43 return IoRead8 (RtcDataPort);
44}
45
46VOID
48 IN UINT8 Offset,
49 IN UINT8 Value
50 )
51{
52 UINT8 RtcIndexPort;
53 UINT8 RtcDataPort;
54 UINT8 RtcIndexNmi;
55
56 if (Offset < RTC_BANK_SIZE) {
57 RtcIndexPort = R_PCH_RTC_INDEX;
58 RtcDataPort = R_PCH_RTC_TARGET;
59 } else {
60 RtcIndexPort = R_PCH_RTC_EXT_INDEX;
61 RtcDataPort = R_PCH_RTC_EXT_TARGET;
62 }
63
64 RtcIndexNmi = IoRead8 (RtcIndexPort) & RTC_NMI_MASK;
65 IoWrite8 (RtcIndexPort, (Offset & RTC_DATA_MASK) | RtcIndexNmi);
66 IoWrite8 (RtcDataPort, Value);
67}
68
69UINT16
71 IN CONST VOID *Data,
72 IN UINTN Size
73 )
74{
75 CONST UINT8 *Buffer;
76 CONST UINT8 *BufferEnd;
77 UINT16 Checksum;
78 UINTN Index;
79
80 Buffer = Data;
81 BufferEnd = Buffer + Size;
82 Checksum = 0;
83
84 while (Buffer < BufferEnd) {
85 Checksum ^= *Buffer++;
86 for (Index = 0; Index < APPLE_RTC_CHECKSUM_ROUNDS; ++Index) {
87 if (Checksum & 1U) {
88 Checksum >>= 1U;
90 } else {
91 Checksum >>= 1U;
92 }
93 }
94 }
95
96 return Checksum;
97}
98
99UINT8
101 IN UINT8 Offset
102 )
103{
104 UINT8 RtcIndexPort;
105 UINT8 RtcDataPort;
106
107 //
108 // CMOS access registers (using alternative access not to handle NMI bit)
109 //
110 if (Offset < RTC_BANK_SIZE) {
111 RtcIndexPort = R_PCH_RTC_INDEX_ALT;
112 RtcDataPort = R_PCH_RTC_TARGET_ALT;
113 } else {
114 RtcIndexPort = R_PCH_RTC_EXT_INDEX_ALT;
115 RtcDataPort = R_PCH_RTC_EXT_TARGET_ALT;
116 }
117
118 IoWrite8 (RtcIndexPort, Offset & RTC_DATA_MASK);
119 return IoRead8 (RtcDataPort);
120}
121
122VOID
124 IN UINT8 Offset,
125 IN UINT8 Value
126 )
127{
128 UINT8 RtcIndexPort;
129 UINT8 RtcDataPort;
130
131 //
132 // CMOS access registers (using alternative access not to handle NMI bit)
133 //
134 if (Offset < RTC_BANK_SIZE) {
135 RtcIndexPort = R_PCH_RTC_INDEX_ALT;
136 RtcDataPort = R_PCH_RTC_TARGET_ALT;
137 } else {
138 RtcIndexPort = R_PCH_RTC_EXT_INDEX_ALT;
139 RtcDataPort = R_PCH_RTC_EXT_TARGET_ALT;
140 }
141
142 IoWrite8 (RtcIndexPort, Offset & RTC_DATA_MASK);
143 IoWrite8 (RtcDataPort, Value);
144}
UINT8 Checksum
All 32 bits added together have to equal 1.
Definition AppleNec.h:77
#define APPLE_RTC_CHECKSUM_ROUNDS
Definition AppleRtc.h:368
#define APPLE_RTC_CHECKSUM_POLYNOMIAL
Definition AppleRtc.h:357
DMG_SIZE_DEVICE_PATH Size
UINT8 OcRtcRead(IN UINT8 Offset)
Definition OcRtcLib.c:25
UINT8 OcRtcReadIvy(IN UINT8 Offset)
Definition OcRtcLib.c:100
VOID OcRtcWrite(IN UINT8 Offset, IN UINT8 Value)
Definition OcRtcLib.c:47
VOID OcRtcWriteIvy(IN UINT8 Offset, IN UINT8 Value)
Definition OcRtcLib.c:123
UINT16 OcRtcChecksumApple(IN CONST VOID *Data, IN UINTN Size)
Definition OcRtcLib.c:70
#define R_PCH_RTC_TARGET_ALT
#define R_PCH_RTC_EXT_TARGET
#define R_PCH_RTC_EXT_INDEX
#define R_PCH_RTC_INDEX_ALT
#define R_PCH_RTC_TARGET
#define R_PCH_RTC_EXT_TARGET_ALT
#define R_PCH_RTC_INDEX
#define R_PCH_RTC_EXT_INDEX_ALT
#define RTC_DATA_MASK
#define RTC_NMI_MASK
#define RTC_BANK_SIZE
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
UINT8 EFIAPI IoWrite8(IN UINTN Port, IN UINT8 Value)
Definition UserMisc.c:307
UINT8 EFIAPI IoRead8(IN UINTN Port)
Definition UserMisc.c:298