#define RES_DEBUG 0 static void setup_resource_map_offset(const unsigned int *register_values, int max, unsigned offset_pci_dev, unsigned offset_io_base) { int i; // print_debug("setting up resource map offset...."); #if 0 print_debug("\r\n"); #endif for(i = 0; i < max; i += 3) { device_t dev; unsigned where; unsigned long reg; #if 0 prink_debug("%08x <- %08x\r\n", register_values[i] + offset_pci_dev, register_values[i+2]); #endif dev = (register_values[i] & ~0xfff) + offset_pci_dev; where = register_values[i] & 0xfff; reg = pci_read_config32(dev, where); reg &= register_values[i+1]; reg |= register_values[i+2] + offset_io_base; pci_write_config32(dev, where, reg); #if 0 reg = pci_read_config32(register_values[i]); reg &= register_values[i+1]; reg |= register_values[i+2] & ~register_values[i+1]; pci_write_config32(register_values[i], reg); #endif } // print_debug("done.\r\n"); } #define RES_PCI_IO 0x10 #define RES_PORT_IO_8 0x22 #define RES_PORT_IO_32 0x20 #define RES_MEM_IO 0x40 static void setup_resource_map_x_offset(const unsigned int *register_values, int max, unsigned offset_pci_dev, unsigned offset_io_base) { int i; #if RES_DEBUG print_debug("setting up resource map ex offset...."); #endif #if RES_DEBUG print_debug("\r\n"); #endif for(i = 0; i < max; i += 4) { #if RES_DEBUG printk(BIOS_DEBUG, "%04x: %02x %08x <- & %08x | %08x\r\n", i>>2, register_values[i], register_values[i+1] + ( (register_values[i]==RES_PCI_IO) ? offset_pci_dev : 0), register_values[i+2], register_values[i+3] + ( ( (register_values[i] & RES_PORT_IO_32) == RES_PORT_IO_32) ? offset_io_base : 0) ); #endif switch (register_values[i]) { case RES_PCI_IO: //PCI { device_t dev; unsigned where; unsigned long reg; dev = (register_values[i+1] & ~0xfff) + offset_pci_dev; where = register_values[i+1] & 0xfff; reg = pci_read_config32(dev, where); reg &= register_values[i+2]; reg |= register_values[i+3]; pci_write_config32(dev, where, reg); } break; case RES_PORT_IO_8: // io 8 { unsigned where; unsigned reg; where = register_values[i+1] + offset_io_base; reg = inb(where); reg &= register_values[i+2]; reg |= register_values[i+3]; outb(reg, where); } break; case RES_PORT_IO_32: //io32 { unsigned where; unsigned long reg; where = register_values[i+1] + offset_io_base; reg = inl(where); reg &= register_values[i+2]; reg |= register_values[i+3]; outl(reg, where); } break; #if 0 case RES_MEM_IO: //mem { unsigned where; unsigned long reg; where = register_values[i+1]; reg = read32(where); reg &= register_values[i+2]; reg |= register_values[i+3]; write32( where, reg); } break; #endif } // switch } #if RES_DEBUG print_debug("done.\r\n"); #endif } static void setup_resource_map_x(const unsigned int *register_values, int max) { int i; #if RES_DEBUG print_debug("setting up resource map ex offset...."); #endif #if RES_DEBUG print_debug("\r\n"); #endif for(i = 0; i < max; i += 4) { #if RES_DEBUG printk(BIOS_DEBUG, "%04x: %02x %08x <- & %08x | %08x\r\n", i/4, register_values[i],register_values[i+1], register_values[i+2], register_values[i+3]); #endif switch (register_values[i]) { case RES_PCI_IO: //PCI { device_t dev; unsigned where; unsigned long reg; dev = register_values[i+1] & ~0xfff; where = register_values[i+1] & 0xfff; reg = pci_read_config32(dev, where); reg &= register_values[i+2]; reg |= register_values[i+3]; pci_write_config32(dev, where, reg); } break; case RES_PORT_IO_8: // io 8 { unsigned where; unsigned reg; where = register_values[i+1]; reg = inb(where); reg &= register_values[i+2]; reg |= register_values[i+3]; outb(reg, where); } break; case RES_PORT_IO_32: //io32 { unsigned where; unsigned long reg; where = register_values[i+1]; reg = inl(where); reg &= register_values[i+2]; reg |= register_values[i+3]; outl(reg, where); } break; #if 0 case RES_MEM_IO: //mem { unsigned where; unsigned long reg; where = register_values[i+1]; reg = read32(where); reg &= register_values[i+2]; reg |= register_values[i+3]; write32( where, reg); } break; #endif } // switch } #if RES_DEBUG print_debug("done.\r\n"); #endif } static void setup_iob_resource_map(const unsigned int *register_values, int max) { int i; for(i = 0; i < max; i += 3) { unsigned where; unsigned reg; where = register_values[i]; #if 0 udelay(2000); print_debug_hex16(where); #endif reg = inb(where); #if 0 print_debug("="); print_debug_hex8(reg); #endif reg &= register_values[i+1]; reg |= register_values[i+2]; #if 0 print_debug(" <- "); print_debug_hex8(reg); #endif outb(reg, where); #if 0 print_debug(" -> "); reg = inb(where); print_debug_hex8(reg); print_debug("\r\n"); #endif } } static void setup_io_resource_map(const unsigned int *register_values, int max) { int i; for(i = 0; i < max; i += 3) { unsigned where; unsigned long reg; where = register_values[i]; #if 0 udelay(2000); print_debug_hex16(where); #endif reg = inl(where); #if 0 udelay(2000); print_debug("="); print_debug_hex32(reg); #endif reg &= register_values[i+1]; reg |= register_values[i+2]; #if 0 udelay(2000); print_debug(" <- "); print_debug_hex32(reg); #endif outl(reg, where); #if 0 udelay(2000); print_debug(" -> "); reg = inl(where); print_debug_hex32(reg); print_debug("\r\n"); #endif } } #if 0 static void setup_mem_resource_map(const unsigned int *register_values, int max) { int i; for(i = 0; i < max; i += 3) { unsigned where; unsigned long reg; #if 0 print_debug_hex32(register_values[i]); print_debug(" <-"); print_debug_hex32(register_values[i+2]); #endif where = register_values[i]; reg = read32(where); reg &= register_values[i+1]; reg |= register_values[i+2]; write32( where, reg); #if 0 print_debug(" RB "); reg = read32(where); print_debug_hex32(reg); print_debug("\r\n"); #endif } } #endif