Annotation of coherent/b/kernel/ldrv/clockedf.c, revision 1.1

1.1     ! root        1: /* clockedf.c - support routines for alternate clock rate
        !             2:               - this is the FAR version of clocked.c for loadable drivers
        !             3: 
        !             4:   altclk_in(hz, fn) - install routine with specified rate
        !             5:                           "hz" should be a multiple of system rate of 100 Hz
        !             6: 
        !             7:   altclk_out()      - uninstall alternate clock routine and restore system rate
        !             8:                        return old value of "altclk"
        !             9: 
        !            10:   altclk_rate(hz)   - set clock interrupt rate
        !            11:                        new rate must be an even multiple of system rate "HZ"
        !            12:                        return 0 if completed ok, -1 otherwise
        !            13: 
        !            14:   History:
        !            15:     90/08/08 hws       initial version, works with hs.c modified for com[1-4]
        !            16:     90/08/14 hws       make it more like a Unix system call
        !            17:     90/09/12 hws       add far version
        !            18: */
        !            19: 
        !            20: #include       <sys/coherent.h>        /* altclk */
        !            21: #include       <sys/const.h>   /* HZ */
        !            22: 
        !            23: #define        PIT     0x40    /* 8253 port */
        !            24: #define        TMR0_M3 0x36    /* timer 0, mode 3 */
        !            25: #if 0
        !            26: /* nominal IBM rate is 1.1900 MHz */
        !            27: #define        SYS_HZ  1190000L        /* rate of input clock to timer 0 */
        !            28: #else
        !            29: /* current kernel rate is 1.1932 MHz */
        !            30: #define        SYS_HZ  1193200L        /* rate of input clock to timer 0 */
        !            31: #endif
        !            32: 
        !            33: typedef int (*PFI)();  /* pointer to function returning int */
        !            34: 
        !            35: extern saddr_t ucs;
        !            36: 
        !            37: static int altclk_rate(hz)
        !            38: unsigned int hz;
        !            39: {
        !            40:   int s;       /* to save CPU irpt flag */
        !            41:   unsigned int interval;       /* period for hz, in units of 1.19 MHz ticks */
        !            42:   int ret;
        !            43: 
        !            44:   if (hz >= HZ && hz % HZ == 0) {      /* can't go slower than HZ! */
        !            45:     interval = SYS_HZ/hz;
        !            46:     s = sphi();        /* disable irpts */
        !            47:     outb(PIT+3, TMR0_M3);
        !            48:     outb(PIT, interval & 0xff);
        !            49:     outb(PIT, interval >> 8);  /* unsigned shift */
        !            50:     spl(s);    /* restore previous irpt state */
        !            51:     ret = 0;
        !            52:   }
        !            53:   else {
        !            54:     ret = -1;
        !            55:   }
        !            56:   return ret;
        !            57: }
        !            58: 
        !            59: int altclk_in(hz, fn)
        !            60: int hz;
        !            61: PFI fn;
        !            62: {
        !            63:   int ret;
        !            64:   int s;
        !            65: 
        !            66:   if ((ret = altclk_rate(hz)) == 0) {
        !            67:     s = sphi();
        !            68:     altclk = fn;
        !            69:     altsel = cs_sel();
        !            70:     spl(s);
        !            71:   }
        !            72:   return ret;
        !            73: }
        !            74: 
        !            75: PFI altclk_out()
        !            76: {
        !            77:   PFI ret;
        !            78:   int s;
        !            79: 
        !            80:   ret = altclk;
        !            81:   if (ret) {
        !            82:     altclk_rate(HZ);
        !            83:     s = sphi();
        !            84:     altclk = 0;
        !            85:     altsel = 0;
        !            86:     spl(s);
        !            87:   }
        !            88:   return ret;
        !            89: }

unix.superglobalmegacorp.com

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