Subversion Repositories shark

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*
 *  include/asm-i386/mach-default/mach_resources.h
 *
 *  Machine specific resource allocation for generic.
 *  Split out from setup.c by Osamu Tomita <tomita@cinet.co.jp>
 */

#ifndef _MACH_RESOURCES_H
#define _MACH_RESOURCES_H

struct resource standard_io_resources[] = {
        { "dma1", 0x00, 0x1f, IORESOURCE_BUSY },
        { "pic1", 0x20, 0x21, IORESOURCE_BUSY },
        { "timer", 0x40, 0x5f, IORESOURCE_BUSY },
        { "keyboard", 0x60, 0x6f, IORESOURCE_BUSY },
        { "dma page reg", 0x80, 0x8f, IORESOURCE_BUSY },
        { "pic2", 0xa0, 0xa1, IORESOURCE_BUSY },
        { "dma2", 0xc0, 0xdf, IORESOURCE_BUSY },
        { "fpu", 0xf0, 0xff, IORESOURCE_BUSY }
};

#define STANDARD_IO_RESOURCES (sizeof(standard_io_resources)/sizeof(struct resource))

static struct resource vram_resource = { "Video RAM area", 0xa0000, 0xbffff, IORESOURCE_BUSY };

/* System ROM resources */
#define MAXROMS 6
static struct resource rom_resources[MAXROMS] = {
        { "System ROM", 0xF0000, 0xFFFFF, IORESOURCE_BUSY },
        { "Video ROM", 0xc0000, 0xc7fff, IORESOURCE_BUSY }
};

#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)

static inline void probe_video_rom(int roms)
{
        unsigned long base;
        unsigned char *romstart;


        /* Video ROM is standard at C000:0000 - C7FF:0000, check signature */
        for (base = 0xC0000; base < 0xE0000; base += 2048) {
                romstart = isa_bus_to_virt(base);
                if (!romsignature(romstart))
                        continue;
                request_resource(&iomem_resource, rom_resources + roms);
                roms++;
                break;
        }
}

static inline void probe_extension_roms(int roms)
{
        unsigned long base;
        unsigned char *romstart;

        /* Extension roms at C800:0000 - DFFF:0000 */
        for (base = 0xC8000; base < 0xE0000; base += 2048) {
                unsigned long length;

                romstart = isa_bus_to_virt(base);
                if (!romsignature(romstart))
                        continue;
                length = romstart[2] * 512;
                if (length) {
                        unsigned int i;
                        unsigned char chksum;

                        chksum = 0;
                        for (i = 0; i < length; i++)
                                chksum += romstart[i];

                        /* Good checksum? */
                        if (!chksum) {
                                rom_resources[roms].start = base;
                                rom_resources[roms].end = base + length - 1;
                                rom_resources[roms].name = "Extension ROM";
                                rom_resources[roms].flags = IORESOURCE_BUSY;

                                request_resource(&iomem_resource, rom_resources + roms);
                                roms++;
                                if (roms >= MAXROMS)
                                        return;
                        }
                }
        }

        /* Final check for motherboard extension rom at E000:0000 */
        base = 0xE0000;
        romstart = isa_bus_to_virt(base);

        if (romsignature(romstart)) {
                rom_resources[roms].start = base;
                rom_resources[roms].end = base + 65535;
                rom_resources[roms].name = "Extension ROM";
                rom_resources[roms].flags = IORESOURCE_BUSY;

                request_resource(&iomem_resource, rom_resources + roms);
        }
}

static inline void request_graphics_resource(void)
{
        request_resource(&iomem_resource, &vram_resource);
}

#endif /* !_MACH_RESOURCES_H */