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 static void setup_resource_map_offset(const u32 *register_values,
45 u32 max, u32 offset_pci_dev,
49 // print_debug("setting up resource map offset....");
50 for(i = 0; i < max; i += 3) {
54 dev = (register_values[i] & ~0xfff) + offset_pci_dev;
55 where = register_values[i] & 0xfff;
56 reg = pci_read_config32(dev, where);
57 reg &= register_values[i+1];
58 reg |= register_values[i+2] + offset_io_base;
59 pci_write_config32(dev, where, reg);
61 // print_debug("done.\n");
64 #define RES_PCI_IO 0x10
65 #define RES_PORT_IO_8 0x22
66 #define RES_PORT_IO_32 0x20
67 #define RES_MEM_IO 0x40
69 static void setup_resource_map_x_offset(const u32 *register_values, u32 max,
70 u32 offset_pci_dev, u32 offset_io_base)
75 print_debug("setting up resource map ex offset....");
82 for(i = 0; i < max; i += 4) {
84 printk(BIOS_DEBUG, "%04x: %02x %08x <- & %08x | %08x\n",
85 i/4, register_values[i],
86 register_values[i+1] + ( (register_values[i]==RES_PCI_IO) ? offset_pci_dev : 0),
88 register_values[i+3] + ( ( (register_values[i] & RES_PORT_IO_32) == RES_PORT_IO_32) ? offset_io_base : 0)
91 switch (register_values[i]) {
92 case RES_PCI_IO: //PCI
97 dev = (register_values[i+1] & ~0xfff) + offset_pci_dev;
98 where = register_values[i+1] & 0xfff;
99 reg = pci_read_config32(dev, where);
100 reg &= register_values[i+2];
101 reg |= register_values[i+3];
102 pci_write_config32(dev, where, reg);
105 case RES_PORT_IO_8: // io 8
109 where = register_values[i+1] + offset_io_base;
111 reg &= register_values[i+2];
112 reg |= register_values[i+3];
116 case RES_PORT_IO_32: //io32
120 where = register_values[i+1] + offset_io_base;
122 reg &= register_values[i+2];
123 reg |= register_values[i+3];
133 print_debug("done.\n");
136 static void setup_resource_map_x(const u32 *register_values, u32 max)
141 print_debug("setting up resource map ex offset....");
147 for(i = 0; i < max; i += 4) {
149 printk(BIOS_DEBUG, "%04x: %02x %08x <- & %08x | %08x\n",
150 i/4, register_values[i],register_values[i+1], register_values[i+2], register_values[i+3]);
152 switch (register_values[i]) {
153 case RES_PCI_IO: //PCI
158 dev = register_values[i+1] & ~0xff;
159 where = register_values[i+1] & 0xff;
160 reg = pci_read_config32(dev, where);
161 reg &= register_values[i+2];
162 reg |= register_values[i+3];
163 pci_write_config32(dev, where, reg);
166 case RES_PORT_IO_8: // io 8
170 where = register_values[i+1];
172 reg &= register_values[i+2];
173 reg |= register_values[i+3];
177 case RES_PORT_IO_32: //io32
181 where = register_values[i+1];
183 reg &= register_values[i+2];
184 reg |= register_values[i+3];
194 print_debug("done.\n");
198 static void setup_iob_resource_map(const u32 *register_values, u32 max)
202 for(i = 0; i < max; i += 3) {
206 where = register_values[i];
208 reg &= register_values[i+1];
209 reg |= register_values[i+2];
214 static void setup_io_resource_map(const u32 *register_values, u32 max)
218 for(i = 0; i < max; i += 3) {
222 where = register_values[i];
224 reg &= register_values[i+1];
225 reg |= register_values[i+2];