Annotation of qemu/roms/openbios/utils/devbios/pcisets.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *                     OpenBIOS - free your system! 
        !             3:  *              ( firmware/flash device driver for Linux )
        !             4:  *                          
        !             5:  *  pcisets.c - support functions to map flash devices to kernel space  
        !             6:  *  
        !             7:  *  This program is part of a free implementation of the IEEE 1275-1994 
        !             8:  *  Standard for Boot (Initialization Configuration) Firmware.
        !             9:  *
        !            10:  *  Copyright (C) 1998-2004  Stefan Reinauer, <[email protected]>
        !            11:  *
        !            12:  *  This program is free software; you can redistribute it and/or modify
        !            13:  *  it under the terms of the GNU General Public License as published by
        !            14:  *  the Free Software Foundation; version 2 of the License.
        !            15:  *
        !            16:  *  This program is distributed in the hope that it will be useful,
        !            17:  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            18:  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            19:  *  GNU General Public License for more details.
        !            20:  *
        !            21:  *  You should have received a copy of the GNU General Public License
        !            22:  *  along with this program; if not, write to the Free Software
        !            23:  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
        !            24:  *
        !            25:  */
        !            26: 
        !            27: #include <linux/config.h>
        !            28: #include <linux/version.h>
        !            29: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
        !            30: #ifdef MODVERSIONS
        !            31: #include <linux/modversions.h>
        !            32: #endif
        !            33: #endif
        !            34: #include <linux/pci.h>
        !            35: #include <linux/types.h>
        !            36: #include <linux/ioport.h>
        !            37: #include <asm/io.h>
        !            38: #ifdef __alpha__
        !            39: #include <asm/hwrpb.h>
        !            40: #endif
        !            41: 
        !            42: #include "bios.h"
        !            43: #include "flashchips.h"
        !            44: #include "pcisets.h"
        !            45: #include "programming.h"
        !            46: 
        !            47: #ifdef CONFIG_PCI
        !            48: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
        !            49: #define pci_find_class pci_get_class
        !            50: #endif
        !            51: 
        !            52: #define pci_id(dev)    ((dev->vendor<<16) | (dev->device))
        !            53: struct pci_dev *hostbridge=NULL;
        !            54: static unsigned char pci_dummy[4];
        !            55: 
        !            56: /*
        !            57:  * ******************************************
        !            58:  *
        !            59:  *   own pci/shadow handling; We can't use 
        !            60:  *   the PCI bios here as it would sweep
        !            61:  *   itself out!
        !            62:  *
        !            63:  * ****************************************** 
        !            64:  */
        !            65: 
        !            66: static int pci_read(struct pci_dev *dev, unsigned char where)
        !            67: {
        !            68:        if (!dev) return 0;
        !            69:        
        !            70:        outl((0x80000000 | (dev->bus->number << 16) | (dev->devfn << 8) | 
        !            71:                                                        (where & ~3)), 0xCF8);
        !            72:        mb();
        !            73:        return inb(0xCFC + (where&3));
        !            74: }
        !            75: 
        !            76: static void pci_write(struct pci_dev *dev, unsigned char where, unsigned char value)
        !            77: {
        !            78:        if (!dev) return;
        !            79:        outl((0x80000000 | (dev->bus->number << 16) | (dev->devfn << 8) |
        !            80:                                                        (where & ~3)), 0xCF8);
        !            81:        mb();
        !            82:        outb(value, 0xCFC + (where&3));
        !            83: }
        !            84: 
        !            85: /* 
        !            86:  * standard system firmware adress emitter 
        !            87:  */
        !            88: 
        !            89: static int system_memarea(unsigned long *address, unsigned long *size, 
        !            90:                                                        struct pci_dev *dev)
        !            91: {
        !            92: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        !            93:        const struct pci_driver *drv;
        !            94:        drv = pci_dev_driver(dev);
        !            95: #endif
        !            96: #ifndef __alpha__
        !            97:        *address=0xffe00000;
        !            98:        *size=2048*1024;
        !            99: #else
        !           100:        *address=0xfffffffffc000000;
        !           101:        *size=512*1024;
        !           102: #endif
        !           103:        printk(KERN_INFO "BIOS: Probing system firmware with "
        !           104:                         "%ldk rom area @0x%lx (%04x:%04x)\n",
        !           105:                         (*size>>10), *address, dev->vendor, dev->device );
        !           106: #ifdef CONFIG_PCI_NAMES
        !           107: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        !           108:        if (drv) printk(KERN_INFO "BIOS: System device is %s\n", drv->name);
        !           109: #else
        !           110:        printk(KERN_INFO "BIOS: System device is %s\n", dev->name);
        !           111: #endif
        !           112: #endif
        !           113:        return 0;
        !           114: }
        !           115: 
        !           116: static int memarea_256k(unsigned long *address, unsigned long *size,
        !           117:                                                        struct pci_dev *dev)
        !           118: {
        !           119: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        !           120:        const struct pci_driver *drv;
        !           121:        drv = pci_dev_driver(dev);
        !           122: #endif
        !           123:        *address=0xfffc0000;
        !           124:        *size=256*1024;
        !           125:        printk(KERN_INFO "BIOS: Probing system firmware with "
        !           126:                         "%ldk rom area @0x%lx (%04x:%04x)\n",
        !           127:                         (*size>>10), *address, dev->vendor, dev->device );
        !           128: #ifdef CONFIG_PCI_NAMES
        !           129: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
        !           130:        if (drv) printk(KERN_INFO "BIOS: System device is %s\n", drv->name);
        !           131: #else
        !           132:        printk(KERN_INFO "BIOS: System device is %s\n", dev->name);
        !           133: #endif
        !           134: #endif
        !           135:        return 0;
        !           136: }
        !           137: 
        !           138: /*
        !           139:  * standard address emitter for normal pci devices
        !           140:  */
        !           141: 
        !           142: static int default_memarea(unsigned long *address, unsigned long *size,
        !           143:                                                         struct pci_dev *dev)
        !           144: {
        !           145: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
        !           146:        *address=dev->resource[PCI_ROM_RESOURCE].start;
        !           147:        *size=dev->resource[PCI_ROM_RESOURCE].end - *address + 1;
        !           148: #else
        !           149:        *address=0xdeadbeef;
        !           150:        *size=0x00000000;
        !           151: #endif
        !           152:        if (*address && (signed long)*address!=-1 ) {
        !           153:                printk (KERN_DEBUG "BIOS: Probing PCI device %02x:%02x.%01x "
        !           154:                                "with %ldk rom area @ 0x%lx\n",
        !           155:                                dev->bus->number, PCI_SLOT(dev->devfn),
        !           156:                                PCI_FUNC(dev->devfn),
        !           157:                                (*size>>10), *address);
        !           158:                return 1;
        !           159:        }
        !           160:        *address=0xdeadbeef;
        !           161:        *size=0x00000000;
        !           162:        return 0;
        !           163: }
        !           164: 
        !           165: #ifdef __alpha__
        !           166: void probe_alphafw(void)
        !           167: {
        !           168:        switch(hwrpb->sys_type) {
        !           169:        case ST_DEC_EB164:
        !           170:                /* Fall through */
        !           171:                break;
        !           172:        case ST_DTI_RUFFIAN:
        !           173:        /* case ST_DEC_TSUNAMI: // This crashes for whatever reason */
        !           174:                probe_pcibus();
        !           175:                return;
        !           176:        default:
        !           177:                printk(KERN_INFO "BIOS: unsupported alpha motherboard.\n");
        !           178:                return;
        !           179:        }
        !           180:        
        !           181:        /* LX164 has system variation 0x2000 */
        !           182:        if (hwrpb->sys_variation == 0x2000)
        !           183:                printk(KERN_INFO "BIOS: LX164 detected\n");
        !           184:        else
        !           185:                printk(KERN_INFO "BIOS: EB164 board detected. Sys_var=0x%lx\n",
        !           186:                                                hwrpb->sys_variation);
        !           187: 
        !           188:        flashdevices[flashcount].data=(void *)0xfff80000;
        !           189:        flash_probe_area(0xfff80000, 512*1024, 0);
        !           190: }
        !           191: #endif
        !           192: 
        !           193: #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) 
        !           194: #define pci_for_each_dev(dev) \
        !           195:         for(dev = pci_devices->next; dev != pci_devices; dev = dev->next)
        !           196: #endif
        !           197: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,74)
        !           198: #define pci_for_each_dev(dev) \
        !           199:         while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)))
        !           200: #endif
        !           201: 
        !           202: #define DEVICE(x) devices[g].pcidevs[x]
        !           203: void probe_pcibus(void)
        !           204: {
        !           205:        struct pci_dev *dev=NULL;
        !           206:        unsigned int g=0, d, map_always=0;
        !           207:        unsigned long addr, size;
        !           208:        
        !           209:        /* Look whether we find something supported */
        !           210:        pci_for_each_dev(dev) {
        !           211:                /* Search all device groups */
        !           212:                for (g=0; DEVICE(0); g++ ) {
        !           213:                        /* Search all devices in group */
        !           214:                        for (d=0; DEVICE(d) && DEVICE(d) != pci_id(dev); d++);
        !           215:                        if(DEVICE(d) == pci_id(dev))
        !           216:                                break;
        !           217:                }
        !           218: 
        !           219:                flashdevices[flashcount].idx=g;
        !           220:                flashdevices[flashcount].data=dev;
        !           221:                
        !           222:                map_always=devices[g].memarea(&addr, &size, dev);
        !           223: #ifdef DEBUG_PCI
        !           224:                printk(KERN_INFO "BIOS: device=%x, cs=%d addr=%lx, size=%ld\n",
        !           225:                                pci_id(dev),g, addr,size);
        !           226: #endif
        !           227:                if(!size)
        !           228:                        continue;
        !           229:                
        !           230:                flash_probe_area(addr, size, map_always);
        !           231:        }
        !           232: }
        !           233: #undef DEVICE
        !           234: 
        !           235: /* Intel 430, 440, 450 PCI Chipsets */
        !           236: 
        !           237: #define CURRENT ((struct pci_dev *)flashdevices[currflash].data)
        !           238: static int gporeg_save;
        !           239: static void intel4x0_activate(void)
        !           240: {
        !           241: #ifdef __ABIT_BE6II_v11__
        !           242: #define GPONUM 26
        !           243: #define GPOREG_OFFSET 0x34
        !           244:        register unsigned int gporeg;
        !           245:        /* Read Bus 0, Dev 7, Func 3, Reg 40-44 (Power Managment Base Address) */
        !           246:        outl (0x80003B40, 0x0CF8);
        !           247:        /* calc General Purpose Output Register I/O port address */
        !           248:        gporeg = (0xFFFFFFFE & inl (0x0CFC)) + GPOREG_OFFSET;
        !           249: 
        !           250:        /* Set GPO26 to 0 */
        !           251:        gporeg_save=inl(gporeg);
        !           252:        printk(KERN_DEBUG "BIOS: GPOREG=0x%08x, mask=0x%x, new=0x%x\n",gporeg_save, (~(1<<GPONUM)), gporeg_save&(~(1<<GPONUM)));
        !           253:        outl (gporeg_save&(~(1<<GPONUM)), gporeg);
        !           254: #undef GPOREG_OFFSET
        !           255: #endif
        !           256: 
        !           257:        pci_dummy[0]=pci_read(CURRENT, 0x4e);
        !           258:        pci_dummy[1]=pci_read(CURRENT, 0x4f);
        !           259:        
        !           260:        /* Write and 128k enable */
        !           261:        pci_dummy[2]=0x44; //0xC4
        !           262: 
        !           263:        if (CURRENT->device < 0x7000) {
        !           264:                /* enable 512k */
        !           265:                pci_dummy[2]|=0x80;
        !           266:        } else {
        !           267:                /* enable 1M */
        !           268:                pci_write(CURRENT, 0x4f, pci_dummy[1] | 0x02);
        !           269:        }
        !           270:        
        !           271:        pci_write(CURRENT, 0x4e, pci_dummy[0] | pci_dummy[2]);
        !           272: 
        !           273:        // printk(KERN_DEBUG "BIOS: isa bridge cfg is 0x%02x\n", pci_dummy[0]);
        !           274: }
        !           275: 
        !           276: static void intel4x0_deactivate(void)
        !           277: {
        !           278: #ifdef __ABIT_BE6II_v11__
        !           279: #define GPOREG_OFFSET 0x34
        !           280:        register unsigned long gporeg;
        !           281:                
        !           282:        /* Read Bus 0, Dev 7, Func 3, Reg 40-44 (Power Managment Base Address) */
        !           283:        outl (0x80003B40, 0x0CF8);
        !           284:        /* calc General Purpose Output Register I/O port address */
        !           285:        gporeg = (0xFFFFFFFE & inl (0x0CFC)) + GPOREG_OFFSET;
        !           286: 
        !           287:        /* Reset GBO26 */
        !           288:        outl (gporeg_save, gporeg);
        !           289: #undef GPOREG_OFFSET
        !           290: #endif
        !           291:        pci_write(CURRENT, 0x4e, pci_dummy[0]);
        !           292:        pci_write(CURRENT, 0x4f, pci_dummy[1]);
        !           293: }
        !           294: 
        !           295: /* preliminary support for Intel 830 mobile chipset. untested!! */
        !           296: 
        !           297: static void intel8x0_activate(void)
        !           298: {
        !           299:        pci_dummy[0]=pci_read(CURRENT, 0x4e);
        !           300:        pci_dummy[1]=pci_read(CURRENT, 0xe3);
        !           301:        pci_write(CURRENT, 0x4e, pci_dummy[0] | 0x01);
        !           302:        pci_write(CURRENT, 0xe3, pci_dummy[1] | 0xC0);
        !           303: 
        !           304:        // We don't have to change FWH_DEC_EN1, as it decodes
        !           305:        // all memory areas to the FWH per default. 
        !           306:        // We try it anyways.
        !           307: 
        !           308:        // FWH_DEC_EN1: isabridge, 0xe3,  8bit, default 0xff.
        !           309:        // FWH_SEL1:    isabridge, 0xe8, 32bit, default 0x00112233 (??)
        !           310: 
        !           311:        //printk(KERN_DEBUG "BIOS: BIOS_CNTL is 0x%02x\n", pci_dummy[0]);
        !           312:        //printk(KERN_DEBUG "BIOS: FWH_DEC_EN1 is 0x%02x\n", pci_dummy[1]);
        !           313: }
        !           314: 
        !           315: static void intel8x0_deactivate(void)
        !           316: {
        !           317:        pci_write(CURRENT, 0x4e, pci_dummy[0]);
        !           318:        pci_write(CURRENT, 0xe3, pci_dummy[1]);
        !           319: }
        !           320: 
        !           321: /* AMD 760/756/751 & VIA (M)VP3  */
        !           322: 
        !           323: static void amd7xx_activate(void)
        !           324: {
        !           325:        pci_dummy[0]=pci_read(CURRENT, 0x40); /* IO Control 1 */
        !           326:        pci_dummy[1]=pci_read(CURRENT, 0x43); /* SEGEN */
        !           327:        
        !           328:        pci_write(CURRENT, 0x40, pci_dummy[0] | 0x01);
        !           329:        pci_write(CURRENT, 0x43, pci_dummy[1] | 0x80);
        !           330: }
        !           331: 
        !           332: static void amd7xx_deactivate(void)
        !           333: {
        !           334:        pci_write(CURRENT, 0x43, pci_dummy[1]);
        !           335:        pci_write(CURRENT, 0x40, pci_dummy[0]);
        !           336: }
        !           337: 
        !           338: static void viamvp3_activate(void)
        !           339: {
        !           340:        hostbridge = pci_find_class(PCI_CLASS_BRIDGE_HOST<<8,NULL);
        !           341:        if (!hostbridge)
        !           342:                return;
        !           343:        pci_dummy[0]=pci_read(hostbridge,0x52);
        !           344:        pci_write(hostbridge, 0x52, pci_dummy[0] & 0xcf);
        !           345:        pci_dummy[1]=pci_read(hostbridge, 0x63);
        !           346:        pci_write(hostbridge, 0x63, pci_dummy[1] & 0x0f);
        !           347:        pci_dummy[2]=pci_read(CURRENT,0x43);
        !           348:        pci_write(CURRENT, 0x43, pci_dummy[2] |0xF8);
        !           349: 
        !           350:        pci_write(CURRENT, 0x40, pci_read(CURRENT,0x40) | 0x01);
        !           351: }
        !           352: 
        !           353: static void viamvp3_deactivate(void)
        !           354: {
        !           355:        if (!hostbridge)
        !           356:                return;
        !           357:        pci_write(CURRENT, 0x40, pci_read(CURRENT,0x40) & 0xfe);
        !           358:        pci_write(hostbridge, 0x63, pci_dummy[1]);
        !           359:        pci_write(hostbridge, 0x52, pci_dummy[0]);
        !           360:        pci_write(CURRENT, 0x43, pci_dummy[2]);
        !           361: }
        !           362: 
        !           363: /* SiS works with 530/5595 chipsets */
        !           364: 
        !           365: static void sis_activate(void) 
        !           366: {
        !           367:        char b;
        !           368:        hostbridge = pci_find_class(PCI_CLASS_BRIDGE_HOST<<8,NULL);
        !           369:        if (!hostbridge)
        !           370:                return;
        !           371:        
        !           372:        pci_dummy[0]=pci_read(hostbridge, 0x76);
        !           373:        pci_dummy[1]=readb(0x51);
        !           374:        pci_dummy[2]=pci_read(CURRENT, 0x40);
        !           375:        pci_dummy[3]=pci_read(CURRENT, 0x45);
        !           376:        
        !           377:        /* disable shadow */
        !           378:        pci_write(hostbridge, 0x76, 0x00);
        !           379:        /* disable cache */
        !           380:        writeb(pci_dummy[1] & 0x7f, 0x51);
        !           381:        
        !           382:        /* Enable 0xFFF8000~0xFFFF0000 decoding on SiS 540/630 */
        !           383:        pci_write(CURRENT, 0x40, pci_dummy[2]|0x0b);
        !           384:        /* Flash write enable on SiS 540/630 */
        !           385:        pci_write(CURRENT, 0x45, pci_dummy[3]|0x40);
        !           386: 
        !           387:        /* The same thing on SiS 950 SuperIO side */
        !           388:        outb(0x87, 0x2e);
        !           389:        outb(0x01, 0x2e);
        !           390:        outb(0x55, 0x2e);
        !           391:        outb(0x55, 0x2e);
        !           392:        if (inb(0x2f) != 0x87) {
        !           393:                /* printf("Can not access SiS 950\n"); */
        !           394:                return;
        !           395:        }
        !           396:        
        !           397:        outb(0x24, 0x2e);
        !           398:        b = inb(0x2f) | 0xfc;
        !           399:        outb(0x24, 0x2e);
        !           400:        outb(b, 0x2f);
        !           401:        outb(0x02, 0x2e);
        !           402:        outb(0x02, 0x2f);
        !           403: }
        !           404: 
        !           405: static void sis_deactivate(void) 
        !           406: {
        !           407:        if (!hostbridge)
        !           408:                return;
        !           409: 
        !           410:        /* Restore PCI Registers */
        !           411:        pci_write(hostbridge, 0x76, pci_dummy[0]);
        !           412:        pci_write(CURRENT, 0x45, pci_dummy[2]);
        !           413:        pci_write(CURRENT, 0x45, pci_dummy[3]);
        !           414:        /* restore cache to original status */
        !           415:        writeb(pci_dummy[1], 0x51);
        !           416: }
        !           417: 
        !           418: /* UMC 486 Chipset 8881/886a */
        !           419: 
        !           420: static void umc_activate(void)
        !           421: {
        !           422:        hostbridge = pci_find_class(PCI_CLASS_BRIDGE_HOST<<8,NULL);
        !           423:        if (!hostbridge)
        !           424:                return;
        !           425:        
        !           426:         pci_dummy[0]=pci_read(hostbridge, 0x54);
        !           427:        pci_dummy[1]=pci_read(hostbridge, 0x55);
        !           428: 
        !           429:         pci_write(hostbridge, 0x54, 0x00);
        !           430:         pci_write(hostbridge, 0x55, 0x40);
        !           431: 
        !           432:        pci_write(CURRENT,0x47, pci_read(CURRENT,0x47) & ~0x40);
        !           433: }
        !           434: 
        !           435: static void umc_deactivate(void)
        !           436: {
        !           437:        if (!hostbridge)
        !           438:                return;
        !           439:        
        !           440:        pci_write(CURRENT, 0x47, pci_read(CURRENT,0x47) | 0x40);
        !           441: 
        !           442:         pci_write(hostbridge, 0x54, pci_dummy[0]);
        !           443:         pci_write(hostbridge, 0x55, pci_dummy[1]);
        !           444: }
        !           445: 
        !           446: /* CS5530 functions */
        !           447: 
        !           448: static void cs5530_activate(void)
        !           449: {
        !           450:        /* Save modified registers for later reset */
        !           451:        pci_dummy[0]=pci_read(CURRENT,0x52);
        !           452:        pci_dummy[1]=pci_read(CURRENT,0x5b);
        !           453: 
        !           454:        /* enable rom write access */
        !           455:        pci_write(CURRENT, 0x52, pci_dummy[0]|0x06);
        !           456: 
        !           457:        /* enable rom positive decode */
        !           458:        // pci_write(CURRENT,0x5b, pci_dummy[1]|0x20);
        !           459:        // pci_write(CURRENT,0x52, pci_read(CURRENT,0x52)|0x01);
        !           460: }
        !           461: 
        !           462: static void cs5530_deactivate(void)
        !           463: {
        !           464:         pci_write(CURRENT, 0x52, pci_dummy[0]);
        !           465:         // pci_write(CURRENT, 0x5b, pci_dummy[1]);
        !           466: }
        !           467: 
        !           468: /* Reliance / ServerWorks */
        !           469: 
        !           470: static void reliance_activate(void)
        !           471: {
        !           472:        pci_dummy[0]=pci_read(CURRENT,0x41);
        !           473:        pci_dummy[1]=pci_read(CURRENT,0x70);
        !           474:        pci_dummy[2]=inb(0xc6f);
        !           475:        
        !           476:        /* Enable 512k */
        !           477:        pci_write(CURRENT, 0x41, pci_dummy[0] | 0x02);
        !           478:        /* Enable 4MB */
        !           479:        pci_write(CURRENT, 0x70, pci_dummy[1] | 0x80);
        !           480:        /* Enable flash write */
        !           481:        outb(pci_dummy[2] | 0x40, 0xc6f);
        !           482: }
        !           483:  
        !           484: static void reliance_deactivate(void)
        !           485: {
        !           486:        pci_write(CURRENT, 0x41, pci_dummy[0]);
        !           487:        pci_write(CURRENT, 0x70, pci_dummy[1]);
        !           488:        outb(pci_dummy[2], 0xc6f);
        !           489: }
        !           490: 
        !           491: /* ALi Methods - untested */
        !           492: static void ali_activate(void)
        !           493: {
        !           494:        pci_dummy[0]=pci_read(CURRENT, 0x47);
        !           495:        pci_dummy[1]=pci_read(CURRENT, 0x79);
        !           496:        pci_dummy[2]=pci_read(CURRENT, 0x7f);
        !           497: 
        !           498:        /* write enable, 256k enable */
        !           499: #ifdef OLD_ALi
        !           500:        pci_write(CURRENT, 0x47, pci_dummy[0]|0x47);
        !           501: #else
        !           502:        pci_write(CURRENT, 0x47, pci_dummy[0]|0x43);
        !           503: #endif
        !           504: 
        !           505:        /* M1543C rev B1 supports 512k. Register reserved before */
        !           506: #ifdef OLD_ALi
        !           507:        pci_write(CURRENT, 0x79, pci_dummy[1]|0x10);
        !           508:        pci_write(CURRENT, 0x7f, pci_dummy[2]|0x01);
        !           509: #else
        !           510:        pci_write(CURRENT, 0x7b, pci_dummy[1]|0x10);
        !           511: #endif
        !           512: }
        !           513: 
        !           514: static void ali_deactivate(void)
        !           515: {
        !           516:        pci_write(CURRENT, 0x47, pci_dummy[0]);
        !           517:        pci_write(CURRENT, 0x79, pci_dummy[1]);
        !           518:        pci_write(CURRENT, 0x7f, pci_dummy[2]);
        !           519: }
        !           520: 
        !           521: /* Default routines. Use these if nothing else works */
        !           522: #if 0
        !           523: static unsigned int def_addr;
        !           524: #endif
        !           525: static void default_activate(void)
        !           526: {
        !           527: #if 0 && LINUX_VERSION_CODE > KERNEL_VERSION(2,4,0)
        !           528:        struct resource *r;
        !           529:        
        !           530:        r=&CURRENT->resource[PCI_ROM_RESOURCE];
        !           531: 
        !           532:        r->flags |= PCI_ROM_ADDRESS_ENABLE;
        !           533:        r->flags &= ~(IORESOURCE_READONLY|IORESOURCE_CACHEABLE);
        !           534:        pci_read_config_dword(CURRENT, CURRENT->rom_base_reg, &def_addr);
        !           535:        if (def_addr)
        !           536:                pci_write_config_dword (CURRENT, CURRENT->rom_base_reg,
        !           537:                                def_addr|PCI_ROM_ADDRESS_ENABLE);
        !           538: #endif
        !           539: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
        !           540:        long ret;
        !           541: 
        !           542:        if (pci_enable_device(CURRENT))
        !           543:                return;
        !           544: 
        !           545:        pci_write_config_dword (CURRENT, CURRENT->rom_base_reg,
        !           546:                        pci_resource_start(CURRENT, PCI_ROM_RESOURCE)|
        !           547:                        PCI_ROM_ADDRESS_ENABLE);
        !           548: 
        !           549:        ret=(long)request_mem_region( pci_resource_start(CURRENT, 
        !           550:                                PCI_ROM_RESOURCE), pci_resource_len(CURRENT,
        !           551:                                        PCI_ROM_RESOURCE), "Firmware memory");
        !           552:        if (!ret)
        !           553:                printk (KERN_ERR "BIOS:   cannot reserve MMROM region " 
        !           554:                                "0x%lx+0x%lx\n",
        !           555:                                pci_resource_start(CURRENT, PCI_ROM_RESOURCE),
        !           556:                                pci_resource_len(CURRENT, PCI_ROM_RESOURCE));
        !           557:        else
        !           558:                printk (KERN_INFO "BIOS:   mapped rom region to 0x%lx\n", ret);
        !           559: #endif
        !           560: }
        !           561: 
        !           562: static void default_deactivate(void)
        !           563: {
        !           564: #if 0 && LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
        !           565:        struct resource *r;
        !           566:        r=&CURRENT->resource[PCI_ROM_RESOURCE];
        !           567:        r->flags &= ~PCI_ROM_ADDRESS_ENABLE;
        !           568:        r->flags |= (IORESOURCE_READONLY|IORESOURCE_CACHEABLE);
        !           569:        pci_write_config_dword (CURRENT, CURRENT->rom_base_reg, def_addr);
        !           570: #endif
        !           571: #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
        !           572:        release_mem_region(pci_resource_start(CURRENT, PCI_ROM_RESOURCE),
        !           573:                        pci_resource_len(CURRENT, PCI_ROM_RESOURCE));
        !           574: #endif
        !           575: }
        !           576: 
        !           577: const struct flashdev devices[] = {
        !           578:        /* Intel 4x0 chipsets */
        !           579:        { (int[]) { 0x8086122e, 0x80861234, 0x80867000, 0x80867110, 
        !           580:                    0x80867198, 0 },
        !           581:          intel4x0_activate, intel4x0_deactivate, system_memarea },
        !           582: 
        !           583:        /* Intel 8x0 chipsets */        
        !           584:        { (int[]) { 0x80862410, 0x80862420, 0x80862440, 0x8086244c,
        !           585:                    0x80862480, 0x8086248c, 0x80867600, 0 },
        !           586:          intel8x0_activate, intel8x0_deactivate, system_memarea },
        !           587: 
        !           588:        /* Irongate 75x, AMD-76xMP(X), VT8231/3 */
        !           589:        { (int[]) { 0x10227400, 0x10227408, 0x10227410, 0x10227440,
        !           590:                    0x11068231, 0x11063074, 0 },
        !           591:          amd7xx_activate, amd7xx_deactivate, system_memarea },
        !           592: 
        !           593:        /* AMD Hammer (thor chipset) */
        !           594:        { (int[]) { 0x10227468, 0 },
        !           595:          amd7xx_activate, amd7xx_deactivate, system_memarea },
        !           596: 
        !           597:        /* VIA (M)VP3, VT82C686 [Apollo Super South] */
        !           598:        { (int[]) { 0x11060586, 0x11060596, 0x11060686, 0 },
        !           599:          viamvp3_activate, viamvp3_deactivate, memarea_256k },
        !           600:          
        !           601:        /* UMC */  
        !           602:        { (int[]) { 0x1060886a, 0x10600886, 0x1060e886, 0x10608886, 0 },
        !           603:           umc_activate, umc_deactivate, system_memarea },
        !           604: 
        !           605:        /* SiS */
        !           606:        { (int[]) { 0x10390008, 0x10390018, 0 },
        !           607:           sis_activate, sis_deactivate, system_memarea },
        !           608: 
        !           609:        /* OPTi */
        !           610:        { (int[]) { 0x1045c558, 0 },
        !           611:          default_activate, default_deactivate, system_memarea },
        !           612: 
        !           613:        /* NSC CS5530(A) */
        !           614:        { (int[]) { 0x10780100, 0 },
        !           615:          cs5530_activate, cs5530_deactivate, memarea_256k },
        !           616: 
        !           617:        /* Reliance/ServerWorks NB6xxx */
        !           618:        { (int[]) { 0x11660200, 0 },
        !           619:          reliance_activate, reliance_deactivate, system_memarea },
        !           620: 
        !           621:        /* ALi */
        !           622:        { (int[]) { 0x10b91523, 0x10b91533, 0x10b91543, 0 },
        !           623:          ali_activate, ali_deactivate, system_memarea },
        !           624: 
        !           625:        { (int[]) { 0x00000000 },
        !           626:          default_activate, default_deactivate, default_memarea }
        !           627: };
        !           628: 
        !           629: #endif /* CONFIG_PCI */
        !           630: 

unix.superglobalmegacorp.com

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