5 void setup_resource_map_offset(const unsigned int *register_values, int max, unsigned offset_pci_dev, unsigned offset_io_base)
9 printk(BIOS_DEBUG, "setting up resource map offset....\n");
11 for(i = 0; i < max; i += 3) {
14 unsigned long reg = 0;
16 prink_debug("%08x <- %08x\n", register_values[i] + offset_pci_dev, register_values[i+2]);
18 dev = (register_values[i] & ~0xfff) + offset_pci_dev;
19 where = register_values[i] & 0xfff;
20 if (register_values[i+1])
21 reg = pci_read_config32(dev, where);
22 reg &= register_values[i+1];
23 reg |= register_values[i+2] + offset_io_base;
24 pci_write_config32(dev, where, reg);
26 reg = pci_read_config32(register_values[i]);
27 reg &= register_values[i+1];
28 reg |= register_values[i+2] & ~register_values[i+1];
29 pci_write_config32(register_values[i], reg);
33 printk(BIOS_DEBUG, "done.\n");
37 #define RES_PCI_IO 0x10
38 #define RES_PORT_IO_8 0x22
39 #define RES_PORT_IO_32 0x20
40 #define RES_MEM_IO 0x40
42 static void setup_resource_map_x_offset(const unsigned int *register_values, int max, unsigned offset_pci_dev, unsigned offset_io_base)
47 printk(BIOS_DEBUG, "setting up resource map ex offset....\n");
49 for(i = 0; i < max; i += 4) {
51 printk(BIOS_DEBUG, "%04x: %02x %08x <- & %08x | %08x\n",
52 i>>2, register_values[i],
53 register_values[i+1] + ( (register_values[i]==RES_PCI_IO) ? offset_pci_dev : 0),
55 register_values[i+3] + ( ( (register_values[i] & RES_PORT_IO_32) == RES_PORT_IO_32) ? offset_io_base : 0)
58 switch (register_values[i]) {
59 case RES_PCI_IO: //PCI
63 unsigned long reg = 0;
64 dev = (register_values[i+1] & ~0xfff) + offset_pci_dev;
65 where = register_values[i+1] & 0xfff;
66 if (register_values[i+2])
67 reg = pci_read_config32(dev, where);
68 reg &= register_values[i+2];
69 reg |= register_values[i+3];
70 pci_write_config32(dev, where, reg);
73 case RES_PORT_IO_8: // io 8
77 where = register_values[i+1] + offset_io_base;
78 if (register_values[i+2])
80 reg &= register_values[i+2];
81 reg |= register_values[i+3];
85 case RES_PORT_IO_32: //io32
88 unsigned long reg = 0;
89 where = register_values[i+1] + offset_io_base;
90 if (register_values[i+2])
92 reg &= register_values[i+2];
93 reg |= register_values[i+3];
98 case RES_MEM_IO: //mem
102 where = register_values[i+1];
104 reg &= register_values[i+2];
105 reg |= register_values[i+3];
106 write32( where, reg);
117 printk(BIOS_DEBUG, "done.\n");
121 static inline void setup_resource_map_x(const unsigned int *register_values, int max)
123 setup_resource_map_x_offset(register_values, max, 0, 0);
127 static void setup_io_resource_map(const unsigned int *register_values, int max)
131 for(i = 0; i < max; i += 3) {
135 where = register_values[i];
138 printk(BIOS_DEBUG, "%04x", where);
144 printk(BIOS_DEBUG, "=%08x", reg);
146 reg &= register_values[i+1];
147 reg |= register_values[i+2];
151 printk(BIOS_DEBUG, " <- %08x", reg);
157 printk(BIOS_DEBUG, " -> %08x\n", reg);
162 static void setup_mem_resource_map(const unsigned int *register_values, int max)
166 for(i = 0; i < max; i += 3) {
170 prink(BIOS_DEBUG, "%08x <- %08x\n",
171 register_values[i], register_values[i+2]);
173 where = register_values[i];
175 reg &= register_values[i+1];
176 reg |= register_values[i+2];
177 write32( where, reg);
180 prink(BIOS_DEBUG, " RB %08x\n", reg);