I've noticed that about half the time, the kernels I build take what I
think is a long time (> 20 seconds) in calibrate_delay().

That is, there is quite a pause between
    Calibrating delay loop...
and (the answer, of sorts)
    133.12 BogoMIPS

    => bootm ff800000
    ## Booting image at ff800000 ...
       Image Name:   Musenki kernel 2.4.19pre1
       Image Type:   PowerPC Linux Kernel Image (gzip compressed)
       Data Size:    674330 Bytes = 658 kB = 0 MB
       Load Address: 00000000
       Entry Point:  00000000
       Verifying Checksum ... OK
       Uncompressing Kernel Image ... OK
    Memory BAT mapping: BAT2=32Mb, BAT3=0Mb, residual: 0Mb
    Linux version 2.4.19pre1 (jim at ford) (gcc version 2.95.4 20011002 (Debian 
prerelease)) #4 Fri Apr 19 05:58:00 CDT 2002
    Musenki M3/M1: See www.musenki.com for details
    On node 0 totalpages: 8192
    zone(0): 8192 pages.
    zone(1): 0 pages.
    zone(2): 0 pages.
    Kernel command line: root=/dev/nfs rw 
nfsroot=192.168.0.8:/usr/local/m1_nfsroot 
ip=192.168.0.42:192.168.0.8:192.168.0.1:255.255.255.0:fuckme::off
    OpenPIC Version 1.2 (1 CPUs and 138 IRQ sources) at fc040000
    time_init: decrementer frequency = 25.000000 MHz
    Calibrating delay loop... 133.12 BogoMIPS
    Memory: 30452k available (1200k kernel code, 480k data, 88k init, 0k 
highmem)
    Dentry-cache hash table entries: 4096 (order: 3, 32768 bytes)
    Inode-cache hash table entries: 2048 (order: 2, 16384 bytes)
    Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
    Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
    Page-cache hash table entries: 8192 (order: 3, 32768 bytes)
    POSIX conformance testing by UNIFIX
    PCI: Probing PCI hardware
    [...]

I, as on so many other machines in arch/ppc/platforms/, set

        loops_per_jiffy = 50000000 / HZ;

as the first line of musenki_setup_arch(), though I've tried
"100000000 / HZ;" with no difference in effect.

Interestingly, loops_per_jiffy is apparently over-written when
calibrate_delay() is called:

    void __init calibrate_delay(void)
    {
            unsigned long ticks, loopbit;
            int lps_precision = LPS_PREC;

            loops_per_jiffy = (1<<12);

            printk("Calibrating delay loop... ");
            while (loops_per_jiffy <<= 1) {
                    /* wait for "start of" clock tick */
                    ticks = jiffies;
                    while (ticks == jiffies)
                            /* nothing */;
                    /* Go .. */
                    ticks = jiffies;
                    __delay(loops_per_jiffy);
                    ticks = jiffies - ticks;
                    if (ticks)
                            break;
            }

    /* Do a binary approximation to get loops_per_jiffy set to equal one clock
       (up to lps_precision bits) */
            loops_per_jiffy >>= 1;
            loopbit = loops_per_jiffy;
            while ( lps_precision-- && (loopbit >>= 1) ) {
                    loops_per_jiffy |= loopbit;
                    ticks = jiffies;
                    while (ticks == jiffies);
                    ticks = jiffies;
                    __delay(loops_per_jiffy);
                    if (jiffies != ticks)   /* longer than 1 tick */
                            loops_per_jiffy &= ~loopbit;
            }

    /* Round the value and print it */
            printk("%lu.%02lu BogoMIPS\n",
                    loops_per_jiffy/(500000/HZ),
                    (loops_per_jiffy/(5000/HZ)) % 100);
    }



anyone have a clue to offer?

Jim


** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/



Reply via email to