Annotation of kernel/bsd/dev/ppc/nvram.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /*
                     26:  * Driver for Non-volatile RAM.
                     27:  */
                     28: #import <sys/param.h>
                     29: #import <sys/systm.h>
                     30: #import <sys/conf.h>
                     31: #import <sys/ioctl.h>
                     32: #import <sys/tty.h>
                     33: #import <sys/proc.h>
                     34: #import <sys/uio.h>
                     35: #include <machdep/ppc/DeviceTree.h>
                     36: #include <machdep/ppc/proc_reg.h>
                     37: #include <machdep/ppc/powermac.h>
                     38: 
                     39: #define        NVRAM_SIZE              8192
                     40: 
                     41: enum {
                     42:        NVRAM_IOMEM,
                     43:        NVRAM_PORT,
                     44:        NVRAM_PMU,
                     45:        NVRAM_NONE
                     46: } nvram_kind = NVRAM_NONE;
                     47: 
                     48: static volatile unsigned char *nvram_data = NULL;
                     49: static volatile unsigned char *nvram_port = NULL;
                     50: 
                     51: int nvopened;
                     52: 
                     53: typedef struct {
                     54:     long       address;
                     55:     long       length;
                     56: } nvram_reg;
                     57: 
                     58: nvprobe()
                     59: {
                     60:     DTEntryIterator iter;
                     61:     DTEntry entry;
                     62:     char *str;
                     63:     int dummy;
                     64:     int result;
                     65:     nvram_reg *regs;
                     66:     int len;
                     67: 
                     68:     if ( HasPMU() ) {
                     69:        nvram_kind = NVRAM_PMU;
                     70:        return;
                     71:     }
                     72: 
                     73:     if (DTLookupEntry(NULL, "/", &entry) != kSuccess) {
                     74:        return;         // failed
                     75:     }
                     76:     if (DTCreateEntryIterator(0, &iter) != kSuccess) {
                     77:        return;         // failed
                     78:     }
                     79:     do {
                     80:        result = DTGetProperty(entry, "device_type", (void **)&str, &dummy);
                     81:        if (result == kSuccess && strcmp(str, "nvram") == 0) {
                     82:            result = DTGetProperty(entry, "reg", (void **)&regs, &len);
                     83:            if (result == kSuccess) {
                     84:                switch (len) {
                     85:                case    8:
                     86:                    nvram_kind = NVRAM_IOMEM;
                     87:                    nvram_data = (volatile unsigned char *)
                     88:                                PCI_IO_BASE_PHYS+regs[0].address;
                     89:                    break;
                     90:                case    16:
                     91:                    nvram_kind = NVRAM_PORT;
                     92:                    nvram_port = (volatile unsigned char *)
                     93:                                PCI_IO_BASE_PHYS+regs[0].address;
                     94:                    nvram_data = (volatile unsigned char *)
                     95:                                PCI_IO_BASE_PHYS+regs[1].address;
                     96:                    break;
                     97:                default:
                     98:                        break;
                     99:                }
                    100:                break;
                    101:            }
                    102:        }
                    103: 
                    104:        while ((result = DTIterateEntries(iter, &entry)) == kIterationDone) {
                    105:            if ((result = DTExitEntry(iter, &entry)) != kSuccess) {
                    106:                break;
                    107:            }
                    108:        }
                    109:        if (result == kSuccess) {
                    110:            result = DTEnterEntry(iter, entry);
                    111:        }
                    112:     } while (result == kSuccess);
                    113: 
                    114:     DTDisposeEntryIterator(iter);
                    115: }
                    116: 
                    117: /*ARGSUSED*/
                    118: nvopen(dev, flag, devtype, pp)
                    119:        dev_t dev;
                    120:        int flag, devtype;
                    121:        struct proc *pp;
                    122: {
                    123:     if (!nvopened) {
                    124:        nvprobe();
                    125:     }
                    126:     if (nvram_kind == NVRAM_NONE) {
                    127:        return (ENODEV);
                    128:     }
                    129:     return 0;
                    130: }
                    131: 
                    132: /*ARGSUSED*/
                    133: nvclose(dev, flag, mode, pp)
                    134:        dev_t dev;
                    135:        int flag, mode;
                    136:        struct proc *pp;
                    137: {
                    138:     return 0;
                    139: }
                    140: 
                    141: /*ARGSUSED*/
                    142: nvread(dev, uio, ioflag)
                    143:        dev_t dev;
                    144:        struct uio *uio;
                    145:        int ioflag;
                    146: {
                    147:        register struct iovec *iov;
                    148:        long offset;
                    149:        long size;
                    150:        int c;
                    151:        unsigned char cc;
                    152:        long    read = 0;
                    153:        int error = 0;
                    154: 
                    155:        offset = uio->uio_offset;
                    156:        if (offset >= NVRAM_SIZE) {
                    157:                error = EIO;
                    158:                goto failed;
                    159:        }
                    160: 
                    161:        size = uio->uio_resid;
                    162: 
                    163:        if (offset+size > NVRAM_SIZE) {
                    164:                size = NVRAM_SIZE-offset;
                    165:        }
                    166: 
                    167:        switch (nvram_kind) {
                    168:        case    NVRAM_IOMEM:
                    169:                for (read = 0; read < size; read++, offset++)  {
                    170:                        c = nvram_data[offset << 4];
                    171:                        eieio(); /* better safe than sorry! */
                    172:                        error = ureadc(c, uio);
                    173:                        if (error)
                    174:                                goto failed;
                    175:                }
                    176:                break;
                    177: 
                    178:        case    NVRAM_PORT:
                    179:                for (read = 0; read < size; read++, offset++) {
                    180:                        *nvram_port = offset >> 5; eieio();
                    181:                        c = nvram_data[(offset & 0x1f) << 4];
                    182:                        eieio();
                    183:                        error = ureadc(c, uio);
                    184:                        if (error)
                    185:                                goto failed;
                    186:                }
                    187:                break;
                    188: 
                    189:        case    NVRAM_PMU:
                    190:                for (read = 0; read < size; read++, offset++)  {
                    191:                        ReadNVRAM(offset, 1, &cc);
                    192:                        c = (int)cc;
                    193:                        error = ureadc(c, uio);
                    194:                        if (error)
                    195:                                goto failed;
                    196:                }
                    197:                break;
                    198:        }
                    199: failed:
                    200:        return error;
                    201: }
                    202: 
                    203: /*ARGSUSED*/
                    204: nvwrite(dev, uio, ioflag)
                    205:        dev_t dev;
                    206:        struct uio *uio;
                    207:        int ioflag;
                    208: {
                    209:        register struct iovec *iov;
                    210:        long offset;
                    211:        long size;
                    212:        int c;
                    213:        unsigned char cc;
                    214:        long    wrote = 0;
                    215: 
                    216:        offset = uio->uio_offset;
                    217:        if (offset >= NVRAM_SIZE) {
                    218:                return EIO;
                    219:        }
                    220: 
                    221:        size = uio->uio_resid;
                    222:        if (offset+size > NVRAM_SIZE)
                    223:                size = NVRAM_SIZE-offset;
                    224: 
                    225:        switch (nvram_kind) {
                    226:        case    NVRAM_IOMEM:
                    227:                for (wrote = 0; wrote < size; wrote++, offset++)  {
                    228:                        c = uwritec(uio);
                    229:                        if (c < 0)
                    230:                                goto failed;
                    231:                        nvram_data[offset << 4] = c;
                    232:                        eieio();
                    233:                }
                    234:                break;
                    235: 
                    236:        case    NVRAM_PORT:
                    237:                for (wrote = 0; wrote < size; wrote++, offset++) {
                    238:                        c = uwritec(uio);
                    239:                        if (c < 0)
                    240:                                goto failed;
                    241:                        *nvram_port = offset >> 5; eieio();
                    242:                        nvram_data[(offset & 0x1f) << 4] = c;
                    243:                        eieio();
                    244:                }
                    245:                break;
                    246: 
                    247:        case    NVRAM_PMU:
                    248:                for (wrote = 0; wrote < size; wrote++, offset++) {
                    249:                        c = uwritec(uio);
                    250:                        if (c < 0)
                    251:                                goto failed;
                    252:                        cc = (unsigned char)c;
                    253:                        WriteNVRAM(offset, 1, &cc);
                    254:                }
                    255:                break;
                    256:        }
                    257: failed:
                    258:        return 0;
                    259: }

unix.superglobalmegacorp.com

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