From 2c480b61ee5fd978326639834bae03a03083bf90 Mon Sep 17 00:00:00 2001
From: Ric Claus <claus@SLAC.Stanford.edu>
Date: Thu, 1 Mar 2012 17:25:07 -0800
Subject: [PATCH 12/14] Mods to clock.c for virtex4/5 BSPs
---
c/src/lib/libcpu/powerpc/ppc403/clock/clock.c | 55 ++++++++++++-------------
1 files changed, 27 insertions(+), 28 deletions(-)
diff --git a/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c b/c/src/lib/libcpu/powerpc/ppc403/clock/clock.c
index 52e240a..daa2a94 100644
a
|
b
|
static bool auto_restart; |
63 | 63 | |
64 | 64 | void Clock_exit( void ); |
65 | 65 | |
| 66 | static inline uint32_t get_itimer(void) |
| 67 | { |
| 68 | register uint32_t rc; |
| 69 | |
| 70 | #ifdef ppc403 /* this is a ppc403 */ |
| 71 | asm volatile ("mfspr %0, 0x3dd" : "=r" ((rc))); /* TBLO */ |
| 72 | #else /* ppc403 */ |
| 73 | asm volatile ("mfspr %0, 0x10c" : "=r" ((rc))); /* 405GP & 440 TBL */ |
| 74 | #endif /* ppc403 */ |
| 75 | |
| 76 | return rc; |
| 77 | } |
| 78 | |
66 | 79 | /* |
67 | 80 | * ISR Handler |
68 | 81 | */ |
… |
… |
void ClockOn(const rtems_irq_connect_data* unused) |
202 | 215 | else if ((pvr & 0xff00) == 0x0100) /* 403GB */ |
203 | 216 | auto_restart = true; |
204 | 217 | |
205 | | #elif defined(ppc405) /* ppc405 */ |
| 218 | #else |
| 219 | # ifdef ppc405 /* ppc405 */ |
206 | 220 | __asm__ volatile ("mfdcr %0, 0x0b2" : "=r" (iocr)); /*405GP CPC0_CR1 */ |
207 | 221 | if (bsp_timer_internal_clock) { |
208 | 222 | iocr &=~0x800000; /* timer clocked from system clock CETE */ |
… |
… |
void ClockOn(const rtems_irq_connect_data* unused) |
211 | 225 | } |
212 | 226 | /* 405GP CPC0_CR1 */ |
213 | 227 | __asm__ volatile ("mtdcr 0x0b2, %0" : "=r" (iocr) : "0" (iocr)); |
214 | | |
215 | | /* |
216 | | * Enable auto restart |
217 | | */ |
218 | | auto_restart = true; |
219 | | #else |
220 | | /* PPC440 */ |
| 228 | # else /* PPC440 */ |
221 | 229 | __asm__ volatile ("mfspr %0, 0x378" : "=r" (iocr)); /* 440 CCR1 */ |
222 | 230 | if (bsp_timer_internal_clock) { |
223 | | iocr &= ~0x00000100; /* timer clocked from system clock CETE */ |
| 231 | iocr &= ~0x00000100; /* timer clocked from system clock CPMC440CLOCK */ |
224 | 232 | } else { |
225 | | iocr |= 0x00000100; /* select external timer clock CETE */ |
| 233 | iocr |= 0x00000100; /* select CPU timer clock CPMC440TIMERCLOCK */ |
226 | 234 | } |
227 | 235 | __asm__ volatile ("mtspr 0x378, %0" : "=r" (iocr) : "0" (iocr)); /*440 CCR1*/ |
228 | | #endif |
| 236 | # endif /* ppc405 */ |
| 237 | |
| 238 | /* |
| 239 | * Enable auto restart |
| 240 | */ |
| 241 | auto_restart = true; |
| 242 | #endif /* ppc403 */ |
| 243 | |
229 | 244 | pit_value = rtems_configuration_get_microseconds_per_tick() * |
230 | 245 | bsp_clicks_per_usec; |
231 | 246 | |
… |
… |
void ClockOn(const rtems_irq_connect_data* unused) |
240 | 255 | |
241 | 256 | /* |
242 | 257 | * Set timer to autoreload, bit TCR->ARE = 1 0x0400000 |
243 | | * Enable PIT interrupt, bit TCR->PIE = 1 0x4000000 |
| 258 | * Enable PIT interrupt, bit TCR->PIE = 1 0x4000000 |
244 | 259 | */ |
245 | 260 | tick_time = get_itimer() + pit_value; |
246 | 261 | |
… |
… |
void Install_clock( |
274 | 289 | clockIrqConnData.on = ClockOn; |
275 | 290 | clockIrqConnData.off = ClockOff; |
276 | 291 | clockIrqConnData.isOn = ClockIsOn; |
277 | | #ifndef ppc440 |
278 | 292 | clockIrqConnData.name = BSP_PIT; |
279 | | #else |
280 | | clockIrqConnData.name = BSP_DECREMENTER; |
281 | | #endif |
282 | 293 | clockIrqConnData.hdl = clock_isr; |
283 | 294 | if (!BSP_install_rtems_irq_handler (&clockIrqConnData)) { |
284 | 295 | printk("Unable to connect Clock Irq handler\n"); |
… |
… |
void ReInstall_clock( |
297 | 308 | |
298 | 309 | rtems_interrupt_disable(isrlevel); |
299 | 310 | |
300 | | #ifndef ppc440 |
301 | 311 | clockIrqConnData.name = BSP_PIT; |
302 | | #else |
303 | | clockIrqConnData.name = BSP_DECREMENTER; |
304 | | #endif |
305 | 312 | if (!BSP_get_current_rtems_irq_handler(&clockIrqConnData)) { |
306 | 313 | printk("Unable to stop system clock\n"); |
307 | 314 | rtems_fatal_error_occurred(1); |
… |
… |
void ReInstall_clock( |
312 | 319 | clockIrqConnData.on = ClockOn; |
313 | 320 | clockIrqConnData.off = ClockOff; |
314 | 321 | clockIrqConnData.isOn = ClockIsOn; |
315 | | #ifndef ppc440 |
316 | 322 | clockIrqConnData.name = BSP_PIT; |
317 | | #else |
318 | | clockIrqConnData.name = BSP_DECREMENTER; |
319 | | #endif |
320 | 323 | clockIrqConnData.hdl = new_clock_isr; |
321 | 324 | |
322 | 325 | if (!BSP_install_rtems_irq_handler (&clockIrqConnData)) { |
… |
… |
void Clock_exit(void) |
338 | 341 | { |
339 | 342 | rtems_irq_connect_data clockIrqConnData; |
340 | 343 | |
341 | | #ifndef ppc440 |
342 | 344 | clockIrqConnData.name = BSP_PIT; |
343 | | #else |
344 | | clockIrqConnData.name = BSP_DECREMENTER; |
345 | | #endif |
346 | 345 | if (!BSP_get_current_rtems_irq_handler(&clockIrqConnData)) { |
347 | 346 | printk("Unable to stop system clock\n"); |
348 | 347 | rtems_fatal_error_occurred(1); |