*** empty log message ***
[coreboot.git] / src / drivers / generic / debug / debug_dev.c
1 #include <console/console.h>
2 #include <device/device.h>
3 #include <device/pci.h>
4 #include <device/pci_ids.h>
5 #include <device/pci_ops.h>
6 #include <cpu/x86/msr.h>
7 #include "chip.h"
8
9 static void print_pci_regs(struct device *dev)
10 {
11       uint8_t byte;
12       int i;
13
14       for(i=0;i<256;i++) {
15              byte = pci_read_config8(dev, i);
16    
17              if((i & 0xf)==0) printk_debug("\n%02x:",i);
18              printk_debug(" %02x",byte);
19       }
20       printk_debug("\n");
21
22 }
23 static void print_mem(void)
24 {
25         unsigned int i;
26         unsigned int start = 0xfffff000;
27         for(i=start;i<0xffffffff;i++) {
28              if((i & 0xf)==0) printk_debug("\n %08x:",i);
29              printk_debug(" %02x",(unsigned char)*((unsigned char *)i));
30              }
31         printk_debug(" %02x\n",(unsigned char)*((unsigned char *)i));
32
33  }
34 static void print_pci_regs_all(void)
35 {
36         struct device *dev;
37         unsigned char i,j,k;
38
39         for(i=0;i<=15;i++) {
40                 for(j=0;j<=0x1f;j++) {
41                         for (k=0;k<=6;k++){
42                                 dev = dev_find_slot(i, PCI_DEVFN(j, k));
43                                 if(!dev) {
44                                         continue;
45                                 }
46                                 if(!dev->enabled) {
47                                         continue;
48                                 }
49                                 printk_debug("\n%02x:%02x:%02x aka %s",i,j,k, dev_path(dev));
50                                 print_pci_regs(dev);
51                         }
52                 }
53         }
54
55 }
56
57 static void print_msr()
58 {
59         msr_t msr;
60         unsigned index;
61         unsigned eax, ebx, ecx, edx;
62         index = 0x80000007;
63         printk_debug("calling cpuid 0x%08x\n", index);
64         asm volatile(
65                 "cpuid"
66                 : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx)
67                 : "a" (index)
68                 );
69         printk_debug("cpuid[%08x]: %08x %08x %08x %08x\n",
70                 index, eax, ebx, ecx, edx);
71         if (edx & (3 << 1)) {
72                 index = 0xC0010042;
73                 printk_debug("Reading msr: 0x%08x\n", index);
74                 msr = rdmsr(index);
75                 printk_debug("msr[0x%08x]: 0x%08x%08x\n",
76                         index, msr.hi, msr.hi);
77         }
78
79 }
80  
81 static void debug_init(device_t dev)
82 {
83         device_t parent;
84         switch(dev->path.u.pnp.device) {
85 #if CONFIG_CHIP_NAME
86         case 0:
87                 parent = dev->bus->dev;
88                 printk_debug("DEBUG: %s", dev_path(parent));
89                 if(parent->chip_ops && parent->chip_ops->name) {
90                         printk_debug(": %s\n", parent->chip_ops->name);
91                 } else {
92                         printk_debug("\n");
93                 }
94                 break;
95 #endif
96                 
97         case 1:
98                 print_pci_regs_all();
99                 break;
100         case 2: 
101                 print_mem();
102                 break;
103         case 3:
104                 print_msr();
105                 break;
106         }
107 }
108
109 static void debug_noop(device_t dummy)
110 {
111 }
112
113 static struct device_operations debug_operations = {
114         .read_resources   = debug_noop,
115         .set_resources    = debug_noop,
116         .enable_resources = debug_noop,
117         .init             = debug_init,
118 };
119
120 static void enable_dev(struct device *dev)
121 {
122         dev->ops = &debug_operations;
123 }
124
125 struct chip_operations drivers_generic_debug_ops = {
126         CHIP_NAME("Debug device")
127         .enable_dev = enable_dev, 
128 };