[BACK]Return to machdep.c CVS log [TXT][DIR] Up to [local] / sys / arch / landisk / landisk

Annotation of sys/arch/landisk/landisk/machdep.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: machdep.c,v 1.13 2007/06/06 17:15:12 deraadt Exp $    */
        !             2: /*     $NetBSD: machdep.c,v 1.1 2006/09/01 21:26:18 uwe Exp $  */
        !             3:
        !             4: /*-
        !             5:  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * This code is derived from software contributed to The NetBSD Foundation
        !             9:  * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace
        !            10:  * Simulation Facility, NASA Ames Research Center.
        !            11:  *
        !            12:  * Redistribution and use in source and binary forms, with or without
        !            13:  * modification, are permitted provided that the following conditions
        !            14:  * are met:
        !            15:  * 1. Redistributions of source code must retain the above copyright
        !            16:  *    notice, this list of conditions and the following disclaimer.
        !            17:  * 2. Redistributions in binary form must reproduce the above copyright
        !            18:  *    notice, this list of conditions and the following disclaimer in the
        !            19:  *    documentation and/or other materials provided with the distribution.
        !            20:  * 3. All advertising materials mentioning features or use of this software
        !            21:  *    must display the following acknowledgement:
        !            22:  *     This product includes software developed by the NetBSD
        !            23:  *     Foundation, Inc. and its contributors.
        !            24:  * 4. Neither the name of The NetBSD Foundation nor the names of its
        !            25:  *    contributors may be used to endorse or promote products derived
        !            26:  *    from this software without specific prior written permission.
        !            27:  *
        !            28:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
        !            29:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            30:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            31:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
        !            32:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            33:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            34:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            35:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            36:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            37:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            38:  * POSSIBILITY OF SUCH DAMAGE.
        !            39:  */
        !            40:
        !            41: /*-
        !            42:  * Copyright (c) 1982, 1987, 1990 The Regents of the University of California.
        !            43:  * All rights reserved.
        !            44:  *
        !            45:  * This code is derived from software contributed to Berkeley by
        !            46:  * William Jolitz.
        !            47:  *
        !            48:  * Redistribution and use in source and binary forms, with or without
        !            49:  * modification, are permitted provided that the following conditions
        !            50:  * are met:
        !            51:  * 1. Redistributions of source code must retain the above copyright
        !            52:  *    notice, this list of conditions and the following disclaimer.
        !            53:  * 2. Redistributions in binary form must reproduce the above copyright
        !            54:  *    notice, this list of conditions and the following disclaimer in the
        !            55:  *    documentation and/or other materials provided with the distribution.
        !            56:  * 3. Neither the name of the University nor the names of its contributors
        !            57:  *    may be used to endorse or promote products derived from this software
        !            58:  *    without specific prior written permission.
        !            59:  *
        !            60:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
        !            61:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
        !            62:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            63:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
        !            64:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            65:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            66:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            67:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            68:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            69:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            70:  * SUCH DAMAGE.
        !            71:  *
        !            72:  *     @(#)machdep.c   7.4 (Berkeley) 6/3/91
        !            73:  */
        !            74:
        !            75: #include "ksyms.h"
        !            76:
        !            77: #include <sys/param.h>
        !            78: #include <sys/systm.h>
        !            79: #include <sys/kernel.h>
        !            80: #include <sys/user.h>
        !            81: #include <sys/mount.h>
        !            82: #include <sys/reboot.h>
        !            83: #include <sys/sysctl.h>
        !            84: #include <sys/exec.h>
        !            85: #include <sys/core.h>
        !            86: #include <sys/kcore.h>
        !            87:
        !            88: #include <uvm/uvm_extern.h>
        !            89:
        !            90: #include <dev/cons.h>
        !            91:
        !            92: #include <sh/bscreg.h>
        !            93: #include <sh/cpgreg.h>
        !            94: #include <sh/trap.h>
        !            95:
        !            96: #include <sh/cache.h>
        !            97: #include <sh/cache_sh4.h>
        !            98: #include <sh/mmu_sh4.h>
        !            99:
        !           100: #include <machine/cpu.h>
        !           101: #include <machine/kcore.h>
        !           102:
        !           103: #include <landisk/landisk/landiskreg.h>
        !           104:
        !           105: #ifdef DDB
        !           106: #include <machine/db_machdep.h>
        !           107: #include <ddb/db_extern.h>
        !           108: #include <ddb/db_interface.h>
        !           109: #endif
        !           110:
        !           111: /* the following is used externally (sysctl_hw) */
        !           112: char machine[] = MACHINE;              /* landisk */
        !           113:
        !           114: __dead void landisk_startup(int, char *);
        !           115: __dead void main(void);
        !           116: void   cpu_init_kcore_hdr(void);
        !           117: void   blink_led(void *);
        !           118:
        !           119: int    kbd_reset;
        !           120: int    led_blink;
        !           121:
        !           122: extern u_int32_t getramsize(void);
        !           123:
        !           124: void
        !           125: cpu_startup(void)
        !           126: {
        !           127:        extern char cpu_model[120];
        !           128:
        !           129:        /* XXX: show model (LANDISK/USL-5P) */
        !           130:        strlcpy(cpu_model, "I-O DATA USL-5P", sizeof cpu_model);
        !           131:
        !           132:         sh_startup();
        !           133: }
        !           134:
        !           135: vaddr_t kernend;       /* used by /dev/mem too */
        !           136: char *esym;
        !           137:
        !           138: __dead void
        !           139: landisk_startup(int howto, char *_esym)
        !           140: {
        !           141:        u_int32_t ramsize;
        !           142:
        !           143:        /* Start to determine heap area */
        !           144:        esym = _esym;
        !           145:        kernend = (vaddr_t)round_page((vaddr_t)esym);
        !           146:
        !           147:        boothowto = howto;
        !           148:
        !           149:        ramsize = getramsize();
        !           150:
        !           151:        /* Initialize CPU ops. */
        !           152:        sh_cpu_init(CPU_ARCH_SH4, CPU_PRODUCT_7751R);
        !           153:
        !           154:        /* Initialize early console */
        !           155:        consinit();
        !           156:
        !           157:        /* Load memory to UVM */
        !           158:        if (ramsize == 0 || ramsize > 512 * 1024 * 1024)
        !           159:                ramsize = IOM_RAM_SIZE;
        !           160:        physmem = atop(ramsize);
        !           161:        kernend = atop(round_page(SH3_P1SEG_TO_PHYS(kernend)));
        !           162:        uvm_page_physload(atop(IOM_RAM_BEGIN),
        !           163:            atop(IOM_RAM_BEGIN + ramsize), kernend,
        !           164:            atop(IOM_RAM_BEGIN + ramsize), VM_FREELIST_DEFAULT);
        !           165:        cpu_init_kcore_hdr();   /* need to be done before pmap_bootstrap */
        !           166:
        !           167:        /* Initialize proc0 u-area */
        !           168:        sh_proc0_init();
        !           169:
        !           170:        /* Initialize pmap and start to address translation */
        !           171:        pmap_bootstrap();
        !           172:
        !           173: #ifdef RAMDISK_HOOKS
        !           174:        boothowto |= RB_DFLTROOT;
        !           175: #endif /* RAMDISK_HOOKS */
        !           176:
        !           177: #if defined(DDB)
        !           178:        db_machine_init();
        !           179:        ddb_init();
        !           180:        if (boothowto & RB_KDB) {
        !           181:                Debugger();
        !           182:        }
        !           183: #endif
        !           184:
        !           185:        /* Jump to main */
        !           186:        __asm volatile(
        !           187:                "jmp    @%0\n\t"
        !           188:                " mov   %1, sp"
        !           189:                :: "r" (main), "r" (proc0.p_md.md_pcb->pcb_sf.sf_r7_bank));
        !           190:        /* NOTREACHED */
        !           191:        for (;;) ;
        !           192: }
        !           193:
        !           194: void
        !           195: boot(int howto)
        !           196: {
        !           197:
        !           198:        if (cold) {
        !           199:                if ((howto & RB_USERREQ) == 0)
        !           200:                        howto |= RB_HALT;
        !           201:                goto haltsys;
        !           202:        }
        !           203:
        !           204:        boothowto = howto;
        !           205:        if ((howto & RB_NOSYNC) == 0) {
        !           206:                vfs_shutdown();
        !           207:                /*
        !           208:                 * If we've been adjusting the clock, the todr
        !           209:                 * will be out of synch; adjust it now.
        !           210:                 */
        !           211:                if ((howto & RB_TIMEBAD) == 0)
        !           212:                        resettodr();
        !           213:                else
        !           214:                        printf("WARNING: not updating battery clock\n");
        !           215:        }
        !           216:
        !           217:        /* Disable interrupts. */
        !           218:        splhigh();
        !           219:
        !           220:        /* Do a dump if requested. */
        !           221:        if (howto & RB_DUMP)
        !           222:                dumpsys();
        !           223:
        !           224: haltsys:
        !           225:        doshutdownhooks();
        !           226:
        !           227:        if ((howto & RB_POWERDOWN) == RB_POWERDOWN) {
        !           228:                _reg_write_1(LANDISK_PWRMNG, PWRMNG_POWEROFF);
        !           229:                delay(1 * 1000 * 1000);
        !           230:                printf("POWEROFF FAILED!\n");
        !           231:                howto |= RB_HALT;
        !           232:        }
        !           233:
        !           234:        if (howto & RB_HALT) {
        !           235:                printf("\n");
        !           236:                printf("The operating system has halted.\n");
        !           237:                printf("Please press any key to reboot.\n\n");
        !           238:                cngetc();
        !           239:        }
        !           240:
        !           241:        printf("rebooting...\n");
        !           242:        machine_reset();
        !           243:
        !           244:        /*NOTREACHED*/
        !           245:        for (;;) {
        !           246:                continue;
        !           247:        }
        !           248: }
        !           249:
        !           250: void
        !           251: machine_reset(void)
        !           252: {
        !           253:        _cpu_exception_suspend();
        !           254:        _reg_write_4(SH_(EXPEVT), EXPEVT_RESET_MANUAL);
        !           255:        (void)*(volatile uint32_t *)0x80000001; /* CPU shutdown */
        !           256:
        !           257:        /*NOTREACHED*/
        !           258:        for (;;) {
        !           259:                continue;
        !           260:        }
        !           261: }
        !           262:
        !           263: #if !defined(DONT_INIT_BSC)
        !           264: /*
        !           265:  * InitializeBsc
        !           266:  * : BSC(Bus State Controller)
        !           267:  */
        !           268: void InitializeBsc(void);
        !           269:
        !           270: void
        !           271: InitializeBsc(void)
        !           272: {
        !           273:
        !           274:        /*
        !           275:         * Drive RAS,CAS in stand by mode and bus release mode
        !           276:         * Area0 = Normal memory, Area5,6=Normal(no burst)
        !           277:         * Area2 = Normal memory, Area3 = SDRAM, Area5 = Normal memory
        !           278:         * Area4 = Normal Memory
        !           279:         * Area6 = Normal memory
        !           280:         */
        !           281:        _reg_write_4(SH4_BCR1, BSC_BCR1_VAL);
        !           282:
        !           283:        /*
        !           284:         * Bus Width
        !           285:         * Area4: Bus width = 16bit
        !           286:         * Area6,5 = 16bit
        !           287:         * Area1 = 8bit
        !           288:         * Area2,3: Bus width = 32bit
        !           289:         */
        !           290:        _reg_write_2(SH4_BCR2, BSC_BCR2_VAL);
        !           291:
        !           292: #if defined(SH4) && defined(SH7751R)
        !           293:        if (cpu_product == CPU_PRODUCT_7751R) {
        !           294: #ifdef BSC_BCR3_VAL
        !           295:                _reg_write_2(SH4_BCR3, BSC_BCR3_VAL);
        !           296: #endif
        !           297: #ifdef BSC_BCR4_VAL
        !           298:                _reg_write_4(SH4_BCR4, BSC_BCR4_VAL);
        !           299: #endif
        !           300:        }
        !           301: #endif /* SH4 && SH7751R */
        !           302:
        !           303:        /*
        !           304:         * Idle cycle number in transition area and read to write
        !           305:         * Area6 = 3, Area5 = 3, Area4 = 3, Area3 = 3, Area2 = 3
        !           306:         * Area1 = 3, Area0 = 3
        !           307:         */
        !           308:        _reg_write_4(SH4_WCR1, BSC_WCR1_VAL);
        !           309:
        !           310:        /*
        !           311:         * Wait cycle
        !           312:         * Area 6 = 6
        !           313:         * Area 5 = 2
        !           314:         * Area 4 = 10
        !           315:         * Area 3 = 3
        !           316:         * Area 2,1 = 3
        !           317:         * Area 0 = 6
        !           318:         */
        !           319:        _reg_write_4(SH4_WCR2, BSC_WCR2_VAL);
        !           320:
        !           321: #ifdef BSC_WCR3_VAL
        !           322:        _reg_write_4(SH4_WCR3, BSC_WCR3_VAL);
        !           323: #endif
        !           324:
        !           325:        /*
        !           326:         * RAS pre-charge = 2cycle, RAS-CAS delay = 3 cycle,
        !           327:         * write pre-charge=1cycle
        !           328:         * CAS before RAS refresh RAS assert time = 3 cycle
        !           329:         * Disable burst, Bus size=32bit, Column Address=10bit, Refresh ON
        !           330:         * CAS before RAS refresh ON, EDO DRAM
        !           331:         */
        !           332:        _reg_write_4(SH4_MCR, BSC_MCR_VAL);
        !           333:
        !           334: #ifdef BSC_SDMR2_VAL
        !           335:        _reg_write_1(BSC_SDMR2_VAL, 0);
        !           336: #endif
        !           337:
        !           338: #ifdef BSC_SDMR3_VAL
        !           339:        _reg_write_1(BSC_SDMR3_VAL, 0);
        !           340: #endif /* BSC_SDMR3_VAL */
        !           341:
        !           342:        /*
        !           343:         * PCMCIA Control Register
        !           344:         * OE/WE assert delay 3.5 cycle
        !           345:         * OE/WE negate-address delay 3.5 cycle
        !           346:         */
        !           347: #ifdef BSC_PCR_VAL
        !           348:        _reg_write_2(SH4_PCR, BSC_PCR_VAL);
        !           349: #endif
        !           350:
        !           351:        /*
        !           352:         * Refresh Timer Control/Status Register
        !           353:         * Disable interrupt by CMF, closk 1/16, Disable OVF interrupt
        !           354:         * Count Limit = 1024
        !           355:         * In following statement, the reason why high byte = 0xa5(a4 in RFCR)
        !           356:         * is the rule of SH3 in writing these register.
        !           357:         */
        !           358:        _reg_write_2(SH4_RTCSR, BSC_RTCSR_VAL);
        !           359:
        !           360:        /*
        !           361:         * Refresh Timer Counter
        !           362:         * Initialize to 0
        !           363:         */
        !           364: #ifdef BSC_RTCNT_VAL
        !           365:        _reg_write_2(SH4_RTCNT, BSC_RTCNT_VAL);
        !           366: #endif
        !           367:
        !           368:        /* set Refresh Time Constant Register */
        !           369:        _reg_write_2(SH4_RTCOR, BSC_RTCOR_VAL);
        !           370:
        !           371:        /* init Refresh Count Register */
        !           372: #ifdef BSC_RFCR_VAL
        !           373:        _reg_write_2(SH4_RFCR, BSC_RFCR_VAL);
        !           374: #endif
        !           375:
        !           376:        /*
        !           377:         * Clock Pulse Generator
        !           378:         */
        !           379:        /* Set Clock mode (make internal clock double speed) */
        !           380:        _reg_write_2(SH4_FRQCR, FRQCR_VAL);
        !           381: }
        !           382: #endif /* !DONT_INIT_BSC */
        !           383:
        !           384: /*
        !           385:  * Dump the machine-dependent dump header.
        !           386:  */
        !           387: u_int
        !           388: cpu_dump(int (*dump)(dev_t, daddr64_t, caddr_t, size_t), daddr64_t *blknop)
        !           389: {
        !           390:        extern cpu_kcore_hdr_t cpu_kcore_hdr;
        !           391:        char buf[dbtob(1)];
        !           392:        cpu_kcore_hdr_t *h;
        !           393:        kcore_seg_t *kseg;
        !           394:        int rc;
        !           395:
        !           396: #ifdef DIAGNOSTIC
        !           397:        if (cpu_dumpsize() > btodb(sizeof buf)) {
        !           398:                printf("buffer too small in cpu_dump, ");
        !           399:                return (EINVAL);        /* "aborted" */
        !           400:        }
        !           401: #endif
        !           402:
        !           403:        bzero(buf, sizeof buf);
        !           404:        kseg = (kcore_seg_t *)buf;
        !           405:        h = (cpu_kcore_hdr_t *)(buf + ALIGN(sizeof(kcore_seg_t)));
        !           406:
        !           407:        /* Create the segment header */
        !           408:        CORE_SETMAGIC(*kseg, KCORE_MAGIC, MID_MACHINE, CORE_CPU);
        !           409:        kseg->c_size = dbtob(1) - ALIGN(sizeof(kcore_seg_t));
        !           410:
        !           411:        bcopy(&cpu_kcore_hdr, h, sizeof(*h));
        !           412:        /* We can now fill kptp in the header... */
        !           413:        h->kcore_kptp = SH3_P1SEG_TO_PHYS((vaddr_t)pmap_kernel()->pm_ptp);
        !           414:
        !           415:        rc = (*dump)(dumpdev, *blknop, buf, sizeof buf);
        !           416:        *blknop += btodb(sizeof buf);
        !           417:        return (rc);
        !           418: }
        !           419:
        !           420: /*
        !           421:  * Return the size of the machine-dependent dump header, in disk blocks.
        !           422:  */
        !           423: u_int
        !           424: cpu_dumpsize()
        !           425: {
        !           426:        u_int size;
        !           427:
        !           428:        size = ALIGN(sizeof(kcore_seg_t)) + ALIGN(sizeof(cpu_kcore_hdr_t));
        !           429:        return (btodb(roundup(size, dbtob(1))));
        !           430: }
        !           431:
        !           432: /*
        !           433:  * Fill the machine-dependent dump header.
        !           434:  */
        !           435: void
        !           436: cpu_init_kcore_hdr()
        !           437: {
        !           438:        extern cpu_kcore_hdr_t cpu_kcore_hdr;
        !           439:        cpu_kcore_hdr_t *h = &cpu_kcore_hdr;
        !           440:        phys_ram_seg_t *seg = cpu_kcore_hdr.kcore_segs;
        !           441:        struct vm_physseg *physseg = vm_physmem;
        !           442:        u_int i;
        !           443:
        !           444:        bzero(h, sizeof(*h));
        !           445:
        !           446:        h->kcore_nsegs = min(NPHYS_RAM_SEGS, (u_int)vm_nphysseg);
        !           447:        for (i = h->kcore_nsegs; i != 0; i--) {
        !           448:                seg->start = ptoa(physseg->start);
        !           449:                seg->size = (psize_t)ptoa(physseg->end - physseg->start);
        !           450:                seg++;
        !           451:                physseg++;
        !           452:        }
        !           453: }
        !           454:
        !           455: int
        !           456: cpu_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
        !           457:     size_t newlen, struct proc *p)
        !           458: {
        !           459:        int oldval, ret;
        !           460:
        !           461:        /* all sysctl names at this level are terminal */
        !           462:        if (namelen != 1)
        !           463:                return (ENOTDIR);               /* overloaded */
        !           464:
        !           465:        switch (name[0]) {
        !           466:        case CPU_CONSDEV: {
        !           467:                dev_t consdev;
        !           468:                if (cn_tab != NULL)
        !           469:                        consdev = cn_tab->cn_dev;
        !           470:                else
        !           471:                        consdev = NODEV;
        !           472:                return (sysctl_rdstruct(oldp, oldlenp, newp, &consdev,
        !           473:                    sizeof consdev));
        !           474:        }
        !           475:
        !           476:        case CPU_KBDRESET:
        !           477:                if (securelevel > 0)
        !           478:                        return (sysctl_rdint(oldp, oldlenp, newp, kbd_reset));
        !           479:                return (sysctl_int(oldp, oldlenp, newp, newlen, &kbd_reset));
        !           480:
        !           481:        case CPU_LED_BLINK:
        !           482:                oldval = led_blink;
        !           483:                ret = sysctl_int(oldp, oldlenp, newp, newlen, &led_blink);
        !           484:                if (oldval != led_blink)
        !           485:                        blink_led(NULL);
        !           486:                return (ret);
        !           487:
        !           488:        default:
        !           489:                return (EOPNOTSUPP);
        !           490:        }
        !           491:        /* NOTREACHED */
        !           492: }
        !           493:
        !           494: void
        !           495: blink_led(void *whatever)
        !           496: {
        !           497:        static struct timeout blink_tmo;
        !           498:        u_int8_t ledctrl;
        !           499:
        !           500:        if (led_blink == 0) {
        !           501:                _reg_write_1(LANDISK_LEDCTRL,
        !           502:                    LED_POWER_CHANGE | LED_POWER_VALUE);
        !           503:                return;
        !           504:        }
        !           505:
        !           506:        ledctrl = (u_int8_t)_reg_read_1(LANDISK_LEDCTRL) & LED_POWER_VALUE;
        !           507:        ledctrl ^= (LED_POWER_CHANGE | LED_POWER_VALUE);
        !           508:        _reg_write_1(LANDISK_LEDCTRL, ledctrl);
        !           509:
        !           510:        timeout_set(&blink_tmo, blink_led, NULL);
        !           511:        timeout_add(&blink_tmo,
        !           512:            ((averunnable.ldavg[0] + FSCALE) * hz) >> FSHIFT);
        !           513: }

CVSweb