blob: e31106e05945394ce3786ba38241857cc34365bc [file] [log] [blame]
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +03001
2#include <device/pci_def.h>
3#include <console/console.h>
4#include <stdlib.h>
5#include <arch/io.h>
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +03006#include <spd.h>
7
8#include "raminit.h"
9#include "debug.h"
10
Stefan Reinauerb15975b2011-10-21 12:57:59 -070011/*
12 * generic debug code, used by mainboard specific romstage.c
13 *
14 */
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +030015
16void print_debug_pci_dev(unsigned dev)
Stefan Reinauerb15975b2011-10-21 12:57:59 -070017{
Stefan Reinauer65b72ab2015-01-05 12:59:54 -080018 printk(BIOS_DEBUG, "PCI: %02x:%02x.%x",
19 (dev >> 16) & 0xff, (dev >> 11) & 0x1f, (dev >> 8) & 7);
Stefan Reinauerb15975b2011-10-21 12:57:59 -070020}
21
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +030022void print_pci_devices(void)
Stefan Reinauerb15975b2011-10-21 12:57:59 -070023{
Antonello Dettori7ea0fe52016-09-03 10:45:33 +020024 pci_devfn_t dev;
Elyes HAOUAS12df9502016-08-23 21:29:48 +020025 for (dev = PCI_DEV(0, 0, 0);
Stefan Reinauerb15975b2011-10-21 12:57:59 -070026 dev <= PCI_DEV(0xff, 0x1f, 0x7);
27 dev += PCI_DEV(0,0,1)) {
28 uint32_t id;
29 id = pci_read_config32(dev, PCI_VENDOR_ID);
30 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
31 (((id >> 16) & 0xffff) == 0xffff) ||
32 (((id >> 16) & 0xffff) == 0x0000)) {
33 continue;
34 }
35 print_debug_pci_dev(dev);
Stefan Reinauer65b72ab2015-01-05 12:59:54 -080036 printk(BIOS_DEBUG, "\n");
Stefan Reinauerb15975b2011-10-21 12:57:59 -070037 }
38}
39
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +030040void dump_pci_device(unsigned dev)
Stefan Reinauerb15975b2011-10-21 12:57:59 -070041{
42 int i;
43 print_debug_pci_dev(dev);
44
Elyes HAOUAS12df9502016-08-23 21:29:48 +020045 for (i = 0; i < 256; i++) {
Stefan Reinauerb15975b2011-10-21 12:57:59 -070046 unsigned char val;
Stefan Reinauer65b72ab2015-01-05 12:59:54 -080047 if ((i & 0x0f) == 0)
Elyes HAOUAS93095522016-09-17 21:05:10 +020048 printk(BIOS_DEBUG, "\n%02x:",i);
Stefan Reinauerb15975b2011-10-21 12:57:59 -070049 val = pci_read_config8(dev, i);
Stefan Reinauerb15975b2011-10-21 12:57:59 -070050 printk(BIOS_DEBUG, " %02x", val);
Stefan Reinauerb15975b2011-10-21 12:57:59 -070051 }
Stefan Reinauer65b72ab2015-01-05 12:59:54 -080052 printk(BIOS_DEBUG, "\n");
Stefan Reinauerb15975b2011-10-21 12:57:59 -070053}
54
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +030055void dump_pci_devices(void)
Stefan Reinauerb15975b2011-10-21 12:57:59 -070056{
Antonello Dettori7ea0fe52016-09-03 10:45:33 +020057 pci_devfn_t dev;
Elyes HAOUAS12df9502016-08-23 21:29:48 +020058 for (dev = PCI_DEV(0, 0, 0);
Stefan Reinauerb15975b2011-10-21 12:57:59 -070059 dev <= PCI_DEV(0xff, 0x1f, 0x7);
60 dev += PCI_DEV(0,0,1)) {
61 uint32_t id;
62 id = pci_read_config32(dev, PCI_VENDOR_ID);
63 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
64 (((id >> 16) & 0xffff) == 0xffff) ||
65 (((id >> 16) & 0xffff) == 0x0000)) {
66 continue;
67 }
68 dump_pci_device(dev);
69 }
70}
71
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +030072void dump_pci_devices_on_bus(unsigned busn)
Stefan Reinauerb15975b2011-10-21 12:57:59 -070073{
Antonello Dettori7ea0fe52016-09-03 10:45:33 +020074 pci_devfn_t dev;
Elyes HAOUAS93095522016-09-17 21:05:10 +020075 for (dev = PCI_DEV(busn, 0, 0);
76 dev <= PCI_DEV(busn, 0x1f, 0x7);
77 dev += PCI_DEV(0,0,1)) {
78 uint32_t id;
79 id = pci_read_config32(dev, PCI_VENDOR_ID);
80 if (((id & 0xffff) == 0x0000) || ((id & 0xffff) == 0xffff) ||
Elyes HAOUAS22710a62016-09-20 19:16:55 +020081 (((id >> 16) & 0xffff) == 0xffff) ||
82 (((id >> 16) & 0xffff) == 0x0000)) {
Elyes HAOUAS93095522016-09-17 21:05:10 +020083 continue;
84 }
85 dump_pci_device(dev);
86 }
Stefan Reinauerb15975b2011-10-21 12:57:59 -070087}
88
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +030089void dump_spd_registers(const struct mem_controller *ctrl)
Stefan Reinauerb15975b2011-10-21 12:57:59 -070090{
91 int i;
Stefan Reinauer65b72ab2015-01-05 12:59:54 -080092 printk(BIOS_DEBUG, "\n");
Elyes HAOUAS12df9502016-08-23 21:29:48 +020093 for (i = 0; i < 4; i++) {
Stefan Reinauerb15975b2011-10-21 12:57:59 -070094 unsigned device;
95 device = ctrl->channel0[i];
96 if (device) {
97 int j;
Stefan Reinauerb15975b2011-10-21 12:57:59 -070098 printk(BIOS_DEBUG, "dimm: %02x.0: %02x", i, device);
Elyes HAOUAS12df9502016-08-23 21:29:48 +020099 for (j = 0; j < 128; j++) {
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700100 int status;
101 unsigned char byte;
Stefan Reinauer65b72ab2015-01-05 12:59:54 -0800102 if ((j & 0xf) == 0)
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700103 printk(BIOS_DEBUG, "\n%02x: ", j);
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +0300104 status = spd_read_byte(device, j);
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700105 if (status < 0) {
106 break;
107 }
108 byte = status & 0xff;
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700109 printk(BIOS_DEBUG, "%02x ", byte);
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700110 }
Stefan Reinauer65b72ab2015-01-05 12:59:54 -0800111 printk(BIOS_DEBUG, "\n");
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700112 }
113 device = ctrl->channel1[i];
114 if (device) {
115 int j;
Elyes HAOUAS93095522016-09-17 21:05:10 +0200116 printk(BIOS_DEBUG, "dimm: %02x.1: %02x", i, device);
Elyes HAOUAS12df9502016-08-23 21:29:48 +0200117 for (j = 0; j < 128; j++) {
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700118 int status;
119 unsigned char byte;
Stefan Reinauer65b72ab2015-01-05 12:59:54 -0800120 if ((j & 0xf) == 0)
Elyes HAOUAS93095522016-09-17 21:05:10 +0200121 printk(BIOS_DEBUG, "\n%02x: ", j);
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +0300122 status = spd_read_byte(device, j);
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700123 if (status < 0) {
124 break;
125 }
126 byte = status & 0xff;
Elyes HAOUAS93095522016-09-17 21:05:10 +0200127 printk(BIOS_DEBUG, "%02x ", byte);
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700128 }
Stefan Reinauer65b72ab2015-01-05 12:59:54 -0800129 printk(BIOS_DEBUG, "\n");
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700130 }
131 }
132}
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +0300133void dump_smbus_registers(void)
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700134{
135 unsigned device;
Elyes HAOUAS93095522016-09-17 21:05:10 +0200136 printk(BIOS_DEBUG, "\n");
137 for (device = 1; device < 0x80; device++) {
138 int j;
Elyes HAOUAS12df9502016-08-23 21:29:48 +0200139 if ( spd_read_byte(device, 0) < 0 ) continue;
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700140 printk(BIOS_DEBUG, "smbus: %02x", device);
Elyes HAOUAS93095522016-09-17 21:05:10 +0200141 for (j = 0; j < 256; j++) {
142 int status;
143 unsigned char byte;
144 status = spd_read_byte(device, j);
145 if (status < 0) {
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700146 break;
Elyes HAOUAS93095522016-09-17 21:05:10 +0200147 }
148 if ((j & 0xf) == 0)
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700149 printk(BIOS_DEBUG, "\n%02x: ",j);
Elyes HAOUAS93095522016-09-17 21:05:10 +0200150 byte = status & 0xff;
151 printk(BIOS_DEBUG, "%02x ", byte);
152 }
153 printk(BIOS_DEBUG, "\n");
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700154 }
155}
156
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +0300157void dump_io_resources(unsigned port)
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700158{
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700159 int i;
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700160 printk(BIOS_DEBUG, "%04x:\n", port);
Elyes HAOUAS93095522016-09-17 21:05:10 +0200161 for (i = 0; i < 256; i++) {
162 uint8_t val;
163 if ((i & 0x0f) == 0)
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700164 printk(BIOS_DEBUG, "%02x:", i);
Elyes HAOUAS93095522016-09-17 21:05:10 +0200165 val = inb(port);
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700166 printk(BIOS_DEBUG, " %02x",val);
Elyes HAOUAS93095522016-09-17 21:05:10 +0200167 if ((i & 0x0f) == 0x0f) {
168 printk(BIOS_DEBUG, "\n");
169 }
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700170 port++;
Elyes HAOUAS93095522016-09-17 21:05:10 +0200171 }
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700172}
173
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +0300174void dump_mem(unsigned start, unsigned end)
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700175{
Elyes HAOUAS93095522016-09-17 21:05:10 +0200176 unsigned i;
Stefan Reinauer65b72ab2015-01-05 12:59:54 -0800177 printk(BIOS_DEBUG, "dump_mem:");
Elyes HAOUAS93095522016-09-17 21:05:10 +0200178 for (i = start; i < end; i++) {
Elyes HAOUAS12df9502016-08-23 21:29:48 +0200179 if ((i & 0xf)==0)
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700180 printk(BIOS_DEBUG, "\n%08x:", i);
Stefan Reinauerb15975b2011-10-21 12:57:59 -0700181 printk(BIOS_DEBUG, " %02x", (unsigned char)*((unsigned char *)i));
Elyes HAOUAS93095522016-09-17 21:05:10 +0200182 }
183 printk(BIOS_DEBUG, "\n");
Kyösti Mälkki93b4ed92012-04-18 21:13:33 +0300184}