2 * This file is part of the coreboot project.
4 * Copyright (C) 2007 Advanced Micro Devices, Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 static void setup_resource_map(const u32 *register_values, u32 max)
26 // print_debug("setting up resource map....");
28 for(i = 0; i < max; i += 3) {
33 dev = register_values[i] & ~0xff;
34 where = register_values[i] & 0xff;
35 reg = pci_read_config32(dev, where);
36 reg &= register_values[i+1];
37 reg |= register_values[i+2];
38 pci_write_config32(dev, where, reg);
40 // print_debug("done.\n");
44 void setup_resource_map_offset(const u32 *register_values, u32 max, u32 offset_pci_dev, u32 offset_io_base)
47 // print_debug("setting up resource map offset....");
48 for(i = 0; i < max; i += 3) {
52 dev = (register_values[i] & ~0xfff) + offset_pci_dev;
53 where = register_values[i] & 0xfff;
54 reg = pci_read_config32(dev, where);
55 reg &= register_values[i+1];
56 reg |= register_values[i+2] + offset_io_base;
57 pci_write_config32(dev, where, reg);
59 // print_debug("done.\n");
62 #define RES_PCI_IO 0x10
63 #define RES_PORT_IO_8 0x22
64 #define RES_PORT_IO_32 0x20
65 #define RES_MEM_IO 0x40
67 void setup_resource_map_x_offset(const u32 *register_values, u32 max, u32 offset_pci_dev, u32 offset_io_base)
72 print_debug("setting up resource map ex offset....");
79 for(i = 0; i < max; i += 4) {
81 printk(BIOS_DEBUG, "%04x: %02x %08x <- & %08x | %08x\n",
82 i/4, register_values[i],
83 register_values[i+1] + ( (register_values[i]==RES_PCI_IO) ? offset_pci_dev : 0),
85 register_values[i+3] + ( ( (register_values[i] & RES_PORT_IO_32) == RES_PORT_IO_32) ? offset_io_base : 0)
88 switch (register_values[i]) {
89 case RES_PCI_IO: //PCI
94 dev = (register_values[i+1] & ~0xfff) + offset_pci_dev;
95 where = register_values[i+1] & 0xfff;
96 reg = pci_read_config32(dev, where);
97 reg &= register_values[i+2];
98 reg |= register_values[i+3];
99 pci_write_config32(dev, where, reg);
102 case RES_PORT_IO_8: // io 8
106 where = register_values[i+1] + offset_io_base;
108 reg &= register_values[i+2];
109 reg |= register_values[i+3];
113 case RES_PORT_IO_32: //io32
117 where = register_values[i+1] + offset_io_base;
119 reg &= register_values[i+2];
120 reg |= register_values[i+3];
130 print_debug("done.\n");
134 void setup_resource_map_x(const u32 *register_values, u32 max)
139 print_debug("setting up resource map ex offset....");
145 for(i = 0; i < max; i += 4) {
147 printk(BIOS_DEBUG, "%04x: %02x %08x <- & %08x | %08x\n",
148 i/4, register_values[i],register_values[i+1], register_values[i+2], register_values[i+3]);
150 switch (register_values[i]) {
151 case RES_PCI_IO: //PCI
156 dev = register_values[i+1] & ~0xff;
157 where = register_values[i+1] & 0xff;
158 reg = pci_read_config32(dev, where);
159 reg &= register_values[i+2];
160 reg |= register_values[i+3];
161 pci_write_config32(dev, where, reg);
164 case RES_PORT_IO_8: // io 8
168 where = register_values[i+1];
170 reg &= register_values[i+2];
171 reg |= register_values[i+3];
175 case RES_PORT_IO_32: //io32
179 where = register_values[i+1];
181 reg &= register_values[i+2];
182 reg |= register_values[i+3];
192 print_debug("done.\n");
197 static void setup_iob_resource_map(const u32 *register_values, u32 max)
201 for(i = 0; i < max; i += 3) {
205 where = register_values[i];
207 reg &= register_values[i+1];
208 reg |= register_values[i+2];
213 static void setup_io_resource_map(const u32 *register_values, u32 max)
217 for(i = 0; i < max; i += 3) {
221 where = register_values[i];
223 reg &= register_values[i+1];
224 reg |= register_values[i+2];