timer_cpulocal.cc (13106:3af014b59080) | timer_cpulocal.cc (13230:2988dc5d1d6f) |
---|---|
1/* 2 * Copyright (c) 2010-2013,2018 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 102 unchanged lines hidden (view full) --- 111void 112CpuLocalTimer::Timer::read(PacketPtr pkt, Addr daddr) 113{ 114 DPRINTF(Timer, "Reading from CpuLocalTimer at offset: %#x\n", daddr); 115 Tick time; 116 117 switch(daddr) { 118 case TimerLoadReg: | 1/* 2 * Copyright (c) 2010-2013,2018 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 102 unchanged lines hidden (view full) --- 111void 112CpuLocalTimer::Timer::read(PacketPtr pkt, Addr daddr) 113{ 114 DPRINTF(Timer, "Reading from CpuLocalTimer at offset: %#x\n", daddr); 115 Tick time; 116 117 switch(daddr) { 118 case TimerLoadReg: |
119 pkt->set | 119 pkt->setLE<uint32_t>(timerLoadValue); |
120 break; 121 case TimerCounterReg: 122 DPRINTF(Timer, "Event schedule for timer %d, clock=%d, prescale=%d\n", 123 timerZeroEvent.when(), parent->clockPeriod(), 124 timerControl.prescalar); 125 time = timerZeroEvent.when() - curTick(); 126 time = time / parent->clockPeriod() / 127 power(16, timerControl.prescalar); 128 DPRINTF(Timer, "-- returning counter at %d\n", time); | 120 break; 121 case TimerCounterReg: 122 DPRINTF(Timer, "Event schedule for timer %d, clock=%d, prescale=%d\n", 123 timerZeroEvent.when(), parent->clockPeriod(), 124 timerControl.prescalar); 125 time = timerZeroEvent.when() - curTick(); 126 time = time / parent->clockPeriod() / 127 power(16, timerControl.prescalar); 128 DPRINTF(Timer, "-- returning counter at %d\n", time); |
129 pkt->set | 129 pkt->setLE<uint32_t>(time); |
130 break; 131 case TimerControlReg: | 130 break; 131 case TimerControlReg: |
132 pkt->set | 132 pkt->setLE<uint32_t>(timerControl); |
133 break; 134 case TimerIntStatusReg: | 133 break; 134 case TimerIntStatusReg: |
135 pkt->set | 135 pkt->setLE<uint32_t>(rawIntTimer); |
136 break; 137 case WatchdogLoadReg: | 136 break; 137 case WatchdogLoadReg: |
138 pkt->set | 138 pkt->setLE<uint32_t>(watchdogLoadValue); |
139 break; 140 case WatchdogCounterReg: 141 DPRINTF(Timer, 142 "Event schedule for watchdog %d, clock=%d, prescale=%d\n", 143 watchdogZeroEvent.when(), parent->clockPeriod(), 144 watchdogControl.prescalar); 145 time = watchdogZeroEvent.when() - curTick(); 146 time = time / parent->clockPeriod() / 147 power(16, watchdogControl.prescalar); 148 DPRINTF(Timer, "-- returning counter at %d\n", time); | 139 break; 140 case WatchdogCounterReg: 141 DPRINTF(Timer, 142 "Event schedule for watchdog %d, clock=%d, prescale=%d\n", 143 watchdogZeroEvent.when(), parent->clockPeriod(), 144 watchdogControl.prescalar); 145 time = watchdogZeroEvent.when() - curTick(); 146 time = time / parent->clockPeriod() / 147 power(16, watchdogControl.prescalar); 148 DPRINTF(Timer, "-- returning counter at %d\n", time); |
149 pkt->set | 149 pkt->setLE<uint32_t>(time); |
150 break; 151 case WatchdogControlReg: | 150 break; 151 case WatchdogControlReg: |
152 pkt->set | 152 pkt->setLE<uint32_t>(watchdogControl); |
153 break; 154 case WatchdogIntStatusReg: | 153 break; 154 case WatchdogIntStatusReg: |
155 pkt->set | 155 pkt->setLE<uint32_t>(rawIntWatchdog); |
156 break; 157 case WatchdogResetStatusReg: | 156 break; 157 case WatchdogResetStatusReg: |
158 pkt->set | 158 pkt->setLE<uint32_t>(rawResetWatchdog); |
159 break; 160 case WatchdogDisableReg: 161 panic("Tried to read from WatchdogDisableRegister\n"); 162 break; 163 default: 164 panic("Tried to read CpuLocalTimer at offset %#x\n", daddr); 165 break; 166 } --- 25 unchanged lines hidden (view full) --- 192 bool old_enable; 193 bool old_wd_mode; 194 uint32_t old_val; 195 196 switch (daddr) { 197 case TimerLoadReg: 198 // Writing to this register also resets the counter register and 199 // starts decrementing if the counter is enabled. | 159 break; 160 case WatchdogDisableReg: 161 panic("Tried to read from WatchdogDisableRegister\n"); 162 break; 163 default: 164 panic("Tried to read CpuLocalTimer at offset %#x\n", daddr); 165 break; 166 } --- 25 unchanged lines hidden (view full) --- 192 bool old_enable; 193 bool old_wd_mode; 194 uint32_t old_val; 195 196 switch (daddr) { 197 case TimerLoadReg: 198 // Writing to this register also resets the counter register and 199 // starts decrementing if the counter is enabled. |
200 timerLoadValue = pkt->get | 200 timerLoadValue = pkt->getLE<uint32_t>(); |
201 restartTimerCounter(timerLoadValue); 202 break; 203 case TimerCounterReg: 204 // Can be written, doesn't start counting unless the timer is enabled | 201 restartTimerCounter(timerLoadValue); 202 break; 203 case TimerCounterReg: 204 // Can be written, doesn't start counting unless the timer is enabled |
205 restartTimerCounter(pkt->get | 205 restartTimerCounter(pkt->getLE<uint32_t>()); |
206 break; 207 case TimerControlReg: 208 old_enable = timerControl.enable; | 206 break; 207 case TimerControlReg: 208 old_enable = timerControl.enable; |
209 timerControl = pkt->get | 209 timerControl = pkt->getLE<uint32_t>(); |
210 if ((old_enable == 0) && timerControl.enable) 211 restartTimerCounter(timerLoadValue); 212 break; 213 case TimerIntStatusReg: 214 rawIntTimer = false; 215 if (pendingIntTimer) { 216 pendingIntTimer = false; 217 DPRINTF(Timer, "Clearing interrupt\n"); 218 } 219 break; 220 case WatchdogLoadReg: | 210 if ((old_enable == 0) && timerControl.enable) 211 restartTimerCounter(timerLoadValue); 212 break; 213 case TimerIntStatusReg: 214 rawIntTimer = false; 215 if (pendingIntTimer) { 216 pendingIntTimer = false; 217 DPRINTF(Timer, "Clearing interrupt\n"); 218 } 219 break; 220 case WatchdogLoadReg: |
221 watchdogLoadValue = pkt->get | 221 watchdogLoadValue = pkt->getLE<uint32_t>(); |
222 restartWatchdogCounter(watchdogLoadValue); 223 break; 224 case WatchdogCounterReg: 225 // Can't be written when in watchdog mode, but can in timer mode 226 if (!watchdogControl.watchdogMode) { | 222 restartWatchdogCounter(watchdogLoadValue); 223 break; 224 case WatchdogCounterReg: 225 // Can't be written when in watchdog mode, but can in timer mode 226 if (!watchdogControl.watchdogMode) { |
227 restartWatchdogCounter(pkt->get | 227 restartWatchdogCounter(pkt->getLE<uint32_t>()); |
228 } 229 break; 230 case WatchdogControlReg: 231 old_enable = watchdogControl.enable; 232 old_wd_mode = watchdogControl.watchdogMode; | 228 } 229 break; 230 case WatchdogControlReg: 231 old_enable = watchdogControl.enable; 232 old_wd_mode = watchdogControl.watchdogMode; |
233 watchdogControl = pkt->get | 233 watchdogControl = pkt->getLE<uint32_t>(); |
234 if ((old_enable == 0) && watchdogControl.enable) 235 restartWatchdogCounter(watchdogLoadValue); 236 // cannot disable watchdog using control register 237 if ((old_wd_mode == 1) && watchdogControl.watchdogMode == 0) 238 watchdogControl.watchdogMode = 1; 239 break; 240 case WatchdogIntStatusReg: 241 rawIntWatchdog = false; 242 if (pendingIntWatchdog) { 243 pendingIntWatchdog = false; 244 DPRINTF(Timer, "Clearing watchdog interrupt\n"); 245 } 246 break; 247 case WatchdogResetStatusReg: 248 rawResetWatchdog = false; 249 DPRINTF(Timer, "Clearing watchdog reset flag\n"); 250 break; 251 case WatchdogDisableReg: 252 old_val = watchdogDisableReg; | 234 if ((old_enable == 0) && watchdogControl.enable) 235 restartWatchdogCounter(watchdogLoadValue); 236 // cannot disable watchdog using control register 237 if ((old_wd_mode == 1) && watchdogControl.watchdogMode == 0) 238 watchdogControl.watchdogMode = 1; 239 break; 240 case WatchdogIntStatusReg: 241 rawIntWatchdog = false; 242 if (pendingIntWatchdog) { 243 pendingIntWatchdog = false; 244 DPRINTF(Timer, "Clearing watchdog interrupt\n"); 245 } 246 break; 247 case WatchdogResetStatusReg: 248 rawResetWatchdog = false; 249 DPRINTF(Timer, "Clearing watchdog reset flag\n"); 250 break; 251 case WatchdogDisableReg: 252 old_val = watchdogDisableReg; |
253 watchdogDisableReg = pkt->get | 253 watchdogDisableReg = pkt->getLE<uint32_t>(); |
254 // if this sequence is observed, turn off watchdog mode 255 if (old_val == 0x12345678 && watchdogDisableReg == 0x87654321) 256 watchdogControl.watchdogMode = 0; 257 break; 258 default: 259 panic("Tried to write CpuLocalTimer timer at offset %#x\n", daddr); 260 break; 261 } --- 189 unchanged lines hidden --- | 254 // if this sequence is observed, turn off watchdog mode 255 if (old_val == 0x12345678 && watchdogDisableReg == 0x87654321) 256 watchdogControl.watchdogMode = 0; 257 break; 258 default: 259 panic("Tried to write CpuLocalTimer timer at offset %#x\n", daddr); 260 break; 261 } --- 189 unchanged lines hidden --- |