1 /*++
2
3 Copyright (c) 2005, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13 LegacyMetronome.c
14
15 Abstract:
16
17 This contains the installation function for the driver.
18
19 --*/
20
21 #include "Metronome.h"
22
23 //
24 // Handle for the Metronome Architectural Protocol instance produced by this driver
25 //
26 EFI_HANDLE mMetronomeHandle = NULL;
27
28 //
29 // The Metronome Architectural Protocol instance produced by this driver
30 //
31 EFI_METRONOME_ARCH_PROTOCOL mMetronome = {
32 WaitForTick,
33 TICK_PERIOD
34 };
35
36 //
37 // Worker Functions
38 //
39 EFI_STATUS
40 EFIAPI
WaitForTick(IN EFI_METRONOME_ARCH_PROTOCOL * This,IN UINT32 TickNumber)41 WaitForTick (
42 IN EFI_METRONOME_ARCH_PROTOCOL *This,
43 IN UINT32 TickNumber
44 )
45 /*++
46
47 Routine Description:
48
49 Waits for the TickNumber of ticks from a known platform time source.
50
51 Arguments:
52
53 This Pointer to the protocol instance.
54
55 Returns:
56
57 EFI_SUCCESS If number of ticks occurred.
58 EFI_NOT_FOUND Could not locate CPU IO protocol
59
60 --*/
61 // TODO: TickNumber - add argument and description to function comment
62 {
63 //
64 // Wait for TickNumber toggles of the Refresh bit
65 //
66 for (; TickNumber != 0x00; TickNumber--) {
67 while ((IoRead8(REFRESH_PORT) & REFRESH_ON) == REFRESH_ON);
68 while ((IoRead8(REFRESH_PORT) & REFRESH_ON) == REFRESH_OFF);
69 }
70
71 return EFI_SUCCESS;
72 }
73
74 EFI_STATUS
75 EFIAPI
InstallMetronome(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)76 InstallMetronome (
77 IN EFI_HANDLE ImageHandle,
78 IN EFI_SYSTEM_TABLE *SystemTable
79 )
80 /*++
81
82 Routine Description:
83
84 Install the LegacyMetronome driver. Loads a Metronome Arch Protocol based
85 on the Port 61 timer.
86
87 Arguments:
88
89 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)
90
91 Returns:
92
93 EFI_SUCCESS - Metronome Architectural Protocol Installed
94
95 --*/
96 // TODO: ImageHandle - add argument and description to function comment
97 // TODO: SystemTable - add argument and description to function comment
98 {
99 EFI_STATUS Status;
100
101 //
102 // Make sure the Metronome Architectural Protocol is not already installed in the system
103 //
104 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiMetronomeArchProtocolGuid);
105
106 //
107 // Program port 61 timer 1 as refresh timer. We could use ACPI timer in the
108 // future.
109 //
110 IoWrite8 (TIMER1_CONTROL_PORT, LOAD_COUNTER1_LSB);
111 IoWrite8 (TIMER1_COUNT_PORT, COUNTER1_COUNT);
112
113 //
114 // Install on a new handle
115 //
116 Status = gBS->InstallMultipleProtocolInterfaces (
117 &mMetronomeHandle,
118 &gEfiMetronomeArchProtocolGuid,
119 &mMetronome,
120 NULL
121 );
122 ASSERT_EFI_ERROR (Status);
123
124 return Status;
125 }
126