janitor task: unify and cleanup naming.
[coreboot.git] / src / northbridge / amd / amdfam10 / debug.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2007 Advanced Micro Devices, Inc.
5  *
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.
9  *
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.
14  *
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
18  */
19
20 /*
21  * Generic FAM10 debug code, used by mainboard specific romstage.c
22  */
23
24 #include "amdfam10_pci.c"
25
26 static void udelay_tsc(u32 us);
27
28 static  void print_debug_addr(const char *str, void *val)
29 {
30 #if CACHE_AS_RAM_ADDRESS_DEBUG == 1
31                 printk_debug("------Address debug: %s%x------\n", str, val);
32 #endif
33 }
34
35 static void print_debug_pci_dev(u32 dev)
36 {
37 #if CONFIG_PCI_BUS_SEGN_BITS==0
38         printk_debug("PCI: %02x:%02x.%02x", (dev>>20) & 0xff, (dev>>15) & 0x1f, (dev>>12) & 0x7);
39 #else
40         printk_debug("PCI: %04x:%02x:%02x.%02x", (dev>>28) & 0x0f, (dev>>20) & 0xff, (dev>>15) & 0x1f, (dev>>12) & 0x7);
41 #endif
42 }
43
44 static void print_pci_devices(void)
45 {
46         device_t dev;
47         for(dev = PCI_DEV(0, 0, 0);
48                 dev <= PCI_DEV(0xff, 0x1f, 0x7);
49                 dev += PCI_DEV(0,0,1)) {
50                 u32 id;
51                 id = pci_read_config32(dev, PCI_VENDOR_ID);
52                 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
53                         (((id >> 16) & 0xffff) == 0xffff) ||
54                         (((id >> 16) & 0xffff) == 0x0000)) {
55                         continue;
56                 }
57                 print_debug_pci_dev(dev);
58                 printk_debug(" %04x:%04x\n", (id & 0xffff), (id>>16));
59                 if(((dev>>12) & 0x07) == 0) {
60                         u8 hdr_type;
61                         hdr_type = pci_read_config8(dev, PCI_HEADER_TYPE);
62                         if((hdr_type & 0x80) != 0x80) {
63                                 dev += PCI_DEV(0,0,7);
64                         }
65                 }
66         }
67 }
68
69 static void print_pci_devices_on_bus(u32 busn)
70 {
71         device_t dev;
72         for(dev = PCI_DEV(busn, 0, 0);
73                 dev <= PCI_DEV(busn, 0x1f, 0x7);
74                 dev += PCI_DEV(0,0,1)) {
75                 u32 id;
76                 id = pci_read_config32(dev, PCI_VENDOR_ID);
77                 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
78                    (((id >> 16) & 0xffff) == 0xffff) ||
79                    (((id >> 16) & 0xffff) == 0x0000)) {
80                         continue;
81                 }
82                 print_debug_pci_dev(dev);
83                 printk_debug(" %04x:%04x\n", (id & 0xffff), (id>>16));
84                 if(((dev>>12) & 0x07) == 0) {
85                         u8 hdr_type;
86                         hdr_type = pci_read_config8(dev, PCI_HEADER_TYPE);
87                         if((hdr_type & 0x80) != 0x80) {
88                                  dev += PCI_DEV(0,0,7);
89                         }
90                 }
91         }
92 }
93
94
95
96 static void dump_pci_device_range(u32 dev, u32 start_reg, u32 size)
97 {
98         int i;
99         print_debug_pci_dev(dev);
100         int j;
101         int end = start_reg + size;
102
103         for(i = start_reg; i < end; i+=4) {
104                 u32 val;
105                 if ((i & 0x0f) == 0) {
106                         printk_debug("\n%04x:",i);
107                 }
108                 val = pci_read_config32(dev, i);
109                 for(j=0;j<4;j++) {
110                         printk_debug(" %02x", val & 0xff);
111                         val >>= 8;
112                 }
113         }
114         print_debug("\n");
115 }
116 static void dump_pci_device(u32 dev)
117 {
118         dump_pci_device_range(dev, 0, 4096);
119 }
120 static u32 pci_read_config32_index_wait(device_t dev, u32 index_reg, u32 index);
121 static void dump_pci_device_index_wait_range(u32 dev, u32 index_reg, u32 start,
122                                         u32 size)
123 {
124         int i;
125         int end = start + size;
126         print_debug_pci_dev(dev);
127         print_debug(" -- index_reg="); print_debug_hex32(index_reg);
128
129         for(i = start; i < end; i++) {
130                 u32 val;
131                 int j;
132                 printk_debug("\n%02x:",i);
133                 val = pci_read_config32_index_wait(dev, index_reg, i);
134                 for(j=0;j<4;j++) {
135                         printk_debug(" %02x", val & 0xff);
136                         val >>= 8;
137                 }
138
139         }
140         print_debug("\n");
141 }
142 static void dump_pci_device_index_wait(u32 dev, u32 index_reg)
143 {
144         dump_pci_device_index_wait_range(dev, index_reg, 0, 0x54);
145         dump_pci_device_index_wait_range(dev, index_reg, 0x100, 0x08); //DIMM1 when memclk > 400Hz
146 //      dump_pci_device_index_wait_range(dev, index_reg, 0x200, 0x08); //DIMM2
147 //      dump_pci_device_index_wait_range(dev, index_reg, 0x300, 0x08); //DIMM3
148
149 }
150
151 static void dump_pci_device_index(u32 dev, u32 index_reg, u32 type, u32 length)
152 {
153         int i;
154         print_debug_pci_dev(dev);
155
156         print_debug(" index reg: "); print_debug_hex16(index_reg); print_debug(" type: "); print_debug_hex8(type);
157
158         type<<=28;
159
160         for(i = 0; i < length; i++) {
161                 u32 val;
162                 if ((i & 0x0f) == 0) {
163                         printk_debug("\n%02x:",i);
164                 }
165                 val = pci_read_config32_index(dev, index_reg, i|type);
166                 printk_debug(" %08x", val);
167         }
168         print_debug("\n");
169 }
170
171
172 static void dump_pci_devices(void)
173 {
174         device_t dev;
175         for(dev = PCI_DEV(0, 0, 0);
176                 dev <= PCI_DEV(0xff, 0x1f, 0x7);
177                 dev += PCI_DEV(0,0,1)) {
178                 u32 id;
179                 id = pci_read_config32(dev, PCI_VENDOR_ID);
180                 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
181                         (((id >> 16) & 0xffff) == 0xffff) ||
182                         (((id >> 16) & 0xffff) == 0x0000)) {
183                         continue;
184                 }
185                 dump_pci_device(dev);
186
187                 if(((dev>>12) & 0x07) == 0) {
188                         u8 hdr_type;
189                         hdr_type = pci_read_config8(dev, PCI_HEADER_TYPE);
190                         if((hdr_type & 0x80) != 0x80) {
191                                 dev += PCI_DEV(0,0,7);
192                         }
193                 }
194         }
195 }
196
197
198 static void dump_pci_devices_on_bus(u32 busn)
199 {
200         device_t dev;
201         for(dev = PCI_DEV(busn, 0, 0);
202                 dev <= PCI_DEV(busn, 0x1f, 0x7);
203                 dev += PCI_DEV(0,0,1)) {
204                 u32 id;
205                 id = pci_read_config32(dev, PCI_VENDOR_ID);
206                 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
207                    (((id >> 16) & 0xffff) == 0xffff) ||
208                    (((id >> 16) & 0xffff) == 0x0000)) {
209                         continue;
210                 }
211                 dump_pci_device(dev);
212
213                 if(((dev>>12) & 0x07) == 0) {
214                         u8 hdr_type;
215                         hdr_type = pci_read_config8(dev, PCI_HEADER_TYPE);
216                         if((hdr_type & 0x80) != 0x80) {
217                                 dev += PCI_DEV(0,0,7);
218                         }
219                 }
220         }
221 }
222
223 #ifndef DEBUG_SMBUS
224 #define DEBUG_SMBUS 0
225 #endif
226
227 #if DEBUG_SMBUS == 1
228
229 static void dump_spd_registers(const struct mem_controller *ctrl)
230 {
231         int i;
232         print_debug("\n");
233         for(i = 0; i < DIMM_SOCKETS; i++) {
234                 u32 device;
235                 device = ctrl->spd_addr[i];
236                 if (device) {
237                         int j;
238                         printk_debug("dimm: %02x.0: %02x", i, device);
239                         for(j = 0; j < 128; j++) {
240                                 int status;
241                                 u8 byte;
242                                 if ((j & 0xf) == 0) {
243                                         printk_debug("\n%02x: ", j);
244                                 }
245                                 status = smbus_read_byte(device, j);
246                                 if (status < 0) {
247                                         break;
248                                 }
249                                 byte = status & 0xff;
250                                 printk_debug("%02x ", byte);
251                         }
252                         print_debug("\n");
253                 }
254                 device = ctrl->spd_addr[i+DIMM_SOCKETS];
255                 if (device) {
256                         int j;
257                         printk_debug("dimm: %02x.1: %02x", i, device);
258                         for(j = 0; j < 128; j++) {
259                                 int status;
260                                 u8 byte;
261                                 if ((j & 0xf) == 0) {
262                                         printk_debug("\n%02x: ", j);
263                                 }
264                                 status = smbus_read_byte(device, j);
265                                 if (status < 0) {
266                                         break;
267                                 }
268                                 byte = status & 0xff;
269                                 printk_debug("%02x ", byte);
270                         }
271                         print_debug("\n");
272                 }
273         }
274 }
275 static void dump_smbus_registers(void)
276 {
277         u32 device;
278         print_debug("\n");
279         for(device = 1; device < 0x80; device++) {
280                 int j;
281                 if( smbus_read_byte(device, 0) < 0 ) continue;
282                 printk_debug("smbus: %02x", device);
283                 for(j = 0; j < 256; j++) {
284                         int status;
285                         u8 byte;
286                         status = smbus_read_byte(device, j);
287                         if (status < 0) {
288                                 break;
289                         }
290                         if ((j & 0xf) == 0) {
291                                 printk_debug("\n%02x: ",j);
292                         }
293                         byte = status & 0xff;
294                         printk_debug("%02x ", byte);
295                 }
296                 print_debug("\n");
297         }
298 }
299 #endif
300 static void dump_io_resources(u32 port)
301 {
302
303         int i;
304         udelay_tsc(2000);
305         printk_debug("%04x:\n", port);
306         for(i=0;i<256;i++) {
307                 u8 val;
308                 if ((i & 0x0f) == 0) {
309                         printk_debug("%02x:", i);
310                 }
311                 val = inb(port);
312                 printk_debug(" %02x",val);
313                 if ((i & 0x0f) == 0x0f) {
314                         print_debug("\n");
315                 }
316                 port++;
317         }
318 }
319
320 static void dump_mem(u32 start, u32 end)
321 {
322         u32 i;
323         print_debug("dump_mem:");
324         for(i=start;i<end;i++) {
325                 if((i & 0xf)==0) {
326                         printk_debug("\n%08x:", i);
327                 }
328                 printk_debug(" %02x", (u8)*((u8 *)i));
329         }
330         print_debug("\n");
331 }