Annotation of qemu/roms/openbios/drivers/macio.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *   derived from mol/mol.c,
        !             3:  *   Copyright (C) 2003, 2004 Samuel Rydh ([email protected])
        !             4:  *
        !             5:  *   This program is free software; you can redistribute it and/or
        !             6:  *   modify it under the terms of the GNU General Public License
        !             7:  *   version 2
        !             8:  *
        !             9:  */
        !            10: 
        !            11: #include "config.h"
        !            12: #include "arch/common/nvram.h"
        !            13: #include "packages/nvram.h"
        !            14: #include "libopenbios/bindings.h"
        !            15: #include "libc/byteorder.h"
        !            16: #include "libc/vsprintf.h"
        !            17: 
        !            18: #include "drivers/drivers.h"
        !            19: #include "macio.h"
        !            20: #include "cuda.h"
        !            21: #include "escc.h"
        !            22: #include "drivers/pci.h"
        !            23: 
        !            24: #define OW_IO_NVRAM_SIZE   0x00020000
        !            25: #define OW_IO_NVRAM_OFFSET 0x00060000
        !            26: #define OW_IO_NVRAM_SHIFT  4
        !            27: 
        !            28: #define NW_IO_NVRAM_SIZE   0x00004000
        !            29: #define NW_IO_NVRAM_OFFSET 0xfff04000
        !            30: #define NW_IO_NVRAM_SHIFT  1
        !            31: 
        !            32: #define IO_OPENPIC_SIZE    0x00040000
        !            33: #define IO_OPENPIC_OFFSET  0x00040000
        !            34: 
        !            35: static char *nvram;
        !            36: 
        !            37: int
        !            38: arch_nvram_size( void )
        !            39: {
        !            40:         if (is_oldworld())
        !            41:                 return OW_IO_NVRAM_SIZE >> OW_IO_NVRAM_SHIFT;
        !            42:         else
        !            43:                 return NW_IO_NVRAM_SIZE >> NW_IO_NVRAM_SHIFT;
        !            44: }
        !            45: 
        !            46: void macio_nvram_init(const char *path, phys_addr_t addr)
        !            47: {
        !            48:        phandle_t chosen, aliases;
        !            49:        phandle_t dnode;
        !            50:        int props[2];
        !            51:        char buf[64];
        !            52:         unsigned long nvram_size, nvram_offset;
        !            53: 
        !            54:         if (is_oldworld()) {
        !            55:                 nvram_offset = OW_IO_NVRAM_OFFSET;
        !            56:                 nvram_size = OW_IO_NVRAM_SIZE;
        !            57:         } else {
        !            58:                 nvram_offset = NW_IO_NVRAM_OFFSET;
        !            59:                 nvram_size = NW_IO_NVRAM_SIZE;
        !            60:                 push_str("/");
        !            61:                 fword("find-device");
        !            62:                 fword("new-device");
        !            63:                 push_str("nvram");
        !            64:                 fword("device-name");
        !            65:                 fword("finish-device");
        !            66:         }
        !            67:        nvram = (char*)addr + nvram_offset;
        !            68:         snprintf(buf, sizeof(buf), "%s/nvram", path);
        !            69:        nvram_init(buf);
        !            70:        dnode = find_dev(buf);
        !            71:        set_int_property(dnode, "#bytes", arch_nvram_size() );
        !            72:        props[0] = __cpu_to_be32(nvram_offset);
        !            73:        props[1] = __cpu_to_be32(nvram_size);
        !            74:        set_property(dnode, "reg", (char *)&props, sizeof(props));
        !            75:        set_property(dnode, "device_type", "nvram", 6);
        !            76:        NEWWORLD(set_property(dnode, "compatible", "nvram,flash", 12));
        !            77: 
        !            78:        chosen = find_dev("/chosen");
        !            79:        push_str(buf);
        !            80:        fword("open-dev");
        !            81:        set_int_property(chosen, "nvram", POP());
        !            82: 
        !            83:        aliases = find_dev("/aliases");
        !            84:        set_property(aliases, "nvram", buf, strlen(buf) + 1);
        !            85: }
        !            86: 
        !            87: #ifdef DUMP_NVRAM
        !            88: static void
        !            89: dump_nvram(void)
        !            90: {
        !            91:   int i, j;
        !            92:   for (i = 0; i < 10; i++)
        !            93:     {
        !            94:       for (j = 0; j < 16; j++)
        !            95:       printk ("%02x ", nvram[(i*16+j)<<4]);
        !            96:       printk (" ");
        !            97:       for (j = 0; j < 16; j++)
        !            98:         if (isprint(nvram[(i*16+j)<<4]))
        !            99:             printk("%c", nvram[(i*16+j)<<4]);
        !           100:         else
        !           101:           printk(".");
        !           102:       printk ("\n");
        !           103:       }
        !           104: }
        !           105: #endif
        !           106: 
        !           107: 
        !           108: void
        !           109: arch_nvram_put( char *buf )
        !           110: {
        !           111:        int i;
        !           112:         unsigned int it_shift;
        !           113: 
        !           114:         if (is_oldworld())
        !           115:                 it_shift = OW_IO_NVRAM_SHIFT;
        !           116:         else
        !           117:                 it_shift = NW_IO_NVRAM_SHIFT;
        !           118: 
        !           119:        for (i=0; i< arch_nvram_size() ; i++)
        !           120:                nvram[i << it_shift] = buf[i];
        !           121: #ifdef DUMP_NVRAM
        !           122:        printk("new nvram:\n");
        !           123:        dump_nvram();
        !           124: #endif
        !           125: }
        !           126: 
        !           127: void
        !           128: arch_nvram_get( char *buf )
        !           129: {
        !           130:        int i;
        !           131:         unsigned int it_shift;
        !           132: 
        !           133:         if (is_oldworld())
        !           134:                 it_shift = OW_IO_NVRAM_SHIFT;
        !           135:         else
        !           136:                 it_shift = NW_IO_NVRAM_SHIFT;
        !           137: 
        !           138:        for (i=0; i< arch_nvram_size(); i++)
        !           139:                 buf[i] = nvram[i << it_shift];
        !           140: 
        !           141: #ifdef DUMP_NVRAM
        !           142:        printk("current nvram:\n");
        !           143:        dump_nvram();
        !           144: #endif
        !           145: }
        !           146: 
        !           147: static void
        !           148: openpic_init(const char *path, phys_addr_t addr)
        !           149: {
        !           150:         phandle_t target_node;
        !           151:         phandle_t dnode;
        !           152:         int props[2];
        !           153:         char buf[128];
        !           154: 
        !           155:         push_str(path);
        !           156:         fword("find-device");
        !           157:         fword("new-device");
        !           158:         push_str("interrupt-controller");
        !           159:         fword("device-name");
        !           160: 
        !           161:         snprintf(buf, sizeof(buf), "%s/interrupt-controller", path);
        !           162:         dnode = find_dev(buf);
        !           163:         set_property(dnode, "device_type", "open-pic", 9);
        !           164:         set_property(dnode, "compatible", "chrp,open-pic", 14);
        !           165:         set_property(dnode, "built-in", "", 0);
        !           166:         props[0] = __cpu_to_be32(IO_OPENPIC_OFFSET);
        !           167:         props[1] = __cpu_to_be32(IO_OPENPIC_SIZE);
        !           168:         set_property(dnode, "reg", (char *)&props, sizeof(props));
        !           169:         set_int_property(dnode, "#interrupt-cells", 2);
        !           170:         set_int_property(dnode, "#address-cells", 0);
        !           171:         set_property(dnode, "interrupt-controller", "", 0);
        !           172:         set_int_property(dnode, "clock-frequency", 4166666);
        !           173: 
        !           174:         fword("finish-device");
        !           175: 
        !           176:         if (is_newworld()) {
        !           177:             u32 *interrupt_map;
        !           178:             int len, i;
        !           179: 
        !           180:             /* patch in interrupt parent */
        !           181:             dnode = find_dev(buf);
        !           182: 
        !           183:             target_node = find_dev("/pci/mac-io");
        !           184:             set_int_property(target_node, "interrupt-parent", dnode);
        !           185: 
        !           186:             target_node = find_dev("/pci/mac-io/escc/ch-a");
        !           187:             set_int_property(target_node, "interrupt-parent", dnode);
        !           188: 
        !           189:             target_node = find_dev("/pci/mac-io/escc/ch-b");
        !           190:             set_int_property(target_node, "interrupt-parent", dnode);
        !           191: 
        !           192:             target_node = find_dev("/pci");
        !           193:             set_int_property(target_node, "interrupt-parent", dnode);
        !           194: 
        !           195:             interrupt_map = (u32 *)get_property(target_node, "interrupt-map", &len);
        !           196:             for (i = 0; i < 4; i++) {
        !           197:                 interrupt_map[(i * 7) + PCI_INT_MAP_PIC_HANDLE] = (u32)dnode;
        !           198:             }
        !           199:             set_property(target_node, "interrupt-map", (char *)interrupt_map, len);
        !           200:         }
        !           201: }
        !           202: 
        !           203: DECLARE_NODE(ob_macio, INSTALL_OPEN, sizeof(int), "Tmac-io");
        !           204: 
        !           205: /* ( str len -- addr ) */
        !           206: 
        !           207: static void
        !           208: ob_macio_decode_unit(void *private)
        !           209: {
        !           210:        ucell addr;
        !           211: 
        !           212:        const char *arg = pop_fstr_copy();
        !           213: 
        !           214:        addr = strtol(arg, NULL, 16);
        !           215: 
        !           216:        free((char*)arg);
        !           217: 
        !           218:        PUSH(addr);
        !           219: }
        !           220: 
        !           221: /*  ( addr -- str len ) */
        !           222: 
        !           223: static void
        !           224: ob_macio_encode_unit(void *private)
        !           225: {
        !           226:        char buf[8];
        !           227: 
        !           228:        ucell addr = POP();
        !           229: 
        !           230:        snprintf(buf, sizeof(buf), "%x", addr);
        !           231: 
        !           232:        push_str(buf);
        !           233: }
        !           234: 
        !           235: NODE_METHODS(ob_macio) = {
        !           236:         { "decode-unit",       ob_macio_decode_unit    },
        !           237:         { "encode-unit",       ob_macio_encode_unit    },
        !           238: };
        !           239: 
        !           240: void
        !           241: ob_macio_heathrow_init(const char *path, phys_addr_t addr)
        !           242: {
        !           243:         phandle_t aliases;
        !           244: 
        !           245:        REGISTER_NODE(ob_macio);
        !           246:        aliases = find_dev("/aliases");
        !           247:        set_property(aliases, "mac-io", path, strlen(path) + 1);
        !           248: 
        !           249:        cuda_init(path, addr);
        !           250:        macio_nvram_init(path, addr);
        !           251:         escc_init(path, addr);
        !           252:        macio_ide_init(path, addr, 1);
        !           253: }
        !           254: 
        !           255: void
        !           256: ob_macio_keylargo_init(const char *path, phys_addr_t addr)
        !           257: {
        !           258:         phandle_t aliases;
        !           259: 
        !           260:         aliases = find_dev("/aliases");
        !           261:         set_property(aliases, "mac-io", path, strlen(path) + 1);
        !           262: 
        !           263:         cuda_init(path, addr);
        !           264:         /* The NewWorld NVRAM is not located in the MacIO device */
        !           265:         macio_nvram_init("", 0);
        !           266:         escc_init(path, addr);
        !           267:         macio_ide_init(path, addr, 3);
        !           268:         openpic_init(path, addr);
        !           269: }

unix.superglobalmegacorp.com

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