Annotation of qemu/roms/SLOF/clients/net-snk/kernel/timer.c, revision 1.1.1.1

1.1       root        1: /******************************************************************************
                      2:  * Copyright (c) 2004, 2008 IBM Corporation
                      3:  * All rights reserved.
                      4:  * This program and the accompanying materials
                      5:  * are made available under the terms of the BSD License
                      6:  * which accompanies this distribution, and is available at
                      7:  * http://www.opensource.org/licenses/bsd-license.php
                      8:  *
                      9:  * Contributors:
                     10:  *     IBM Corporation - initial implementation
                     11:  *****************************************************************************/
                     12: #include <types.h>
                     13: 
                     14: //*******************************************************************
                     15: // variable "tb_freq" contains the frequency in Hz
                     16: // and is read from the device tree (setup by LLFW) in "init.c"
                     17: uint64_t tb_freq;
                     18: 
                     19: //-------------------------------------------------------------------
                     20: // Read the current timebase
                     21: uint64_t get_time(void)
                     22: {
                     23:     uint64_t act;
                     24: 
                     25:     __asm__ __volatile__( 
                     26:         "0:     mftbu   %0 ;\
                     27:                 mftbl   %%r0 ; \
                     28:                 mftbu   %%r4 ; \
                     29:                 cmpw    %0,%%r4 ; \
                     30:                 bne     0b; \
                     31:                 sldi    %0,%0,32; \
                     32:                 or      %0,%0,%%r0"
                     33:         : "=r"(act)
                     34:         : /* no inputs */
                     35:         : "r0", "r4");
                     36:     return act;
                     37: }
                     38: 
                     39: //-------------------------------------------------------------------
                     40: // wait for ticks/scale timebase ticks
                     41: void wait_ticks(uint64_t ticks)
                     42: {
                     43:         uint64_t timeout = get_time() + ticks;
                     44:         while (get_time() < timeout) {
                     45:                 unsigned int i;
                     46:                 for (i = 1000; i > 0; i--)
                     47:                         __asm__ __volatile__ ("" : : : "memory");
                     48:         }
                     49: }
                     50: 
                     51: //-------------------------------------------------------------------
                     52: // wait for (at least) usecs microseconds
                     53: void udelay(unsigned int usecs)
                     54: {
                     55:         // first multiply the usec with timebase and then devide
                     56:         // because 1.000.000 is relatively huge compared to usecs
                     57:         wait_ticks((usecs*tb_freq)/1000000);
                     58: }
                     59: 
                     60: //-------------------------------------------------------------------
                     61: // wait for (at least) msecs milliseconds
                     62: void mdelay(unsigned int msecs)
                     63: {
                     64:         // first multiply the msec and timebase and then devide
                     65:         // because 1.000 is relatively huge compared to msecs
                     66:         wait_ticks((msecs*tb_freq)/1000);
                     67: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.