The ARRAY_SIZE macro is convenient, yet mostly unused. Switch lots of
[coreboot.git] / src / mainboard / tyan / s2891 / get_bus_conf.c
1 #include <console/console.h>
2 #include <device/pci.h>
3 #include <device/pci_ids.h>
4 #include <string.h>
5 #include <stdint.h>
6 #if CONFIG_LOGICAL_CPUS==1
7 #include <cpu/amd/dualcore.h>
8 #endif
9
10 #include <cpu/amd/amdk8_sysconf.h>
11 #include <stdlib.h>
12
13 // Global variables for MB layouts and these will be shared by irqtable mptable and acpi_tables
14 //busnum is default
15         unsigned char bus_isa;
16         unsigned char bus_ck804_0; //1
17         unsigned char bus_ck804_1; //2
18         unsigned char bus_ck804_2; //3
19         unsigned char bus_ck804_3; //4
20         unsigned char bus_ck804_4; //5
21         unsigned char bus_ck804_5; //6
22         unsigned char bus_8131_0;  //7
23         unsigned char bus_8131_1;  //8
24         unsigned char bus_8131_2;  //9
25         unsigned char bus_coproc_0;
26         unsigned apicid_ck804;
27         unsigned apicid_8131_1;
28         unsigned apicid_8131_2;
29
30
31 unsigned pci1234x[] =
32 {        //Here you only need to set value in pci1234 for HT-IO that could be installed or not
33          //You may need to preset pci1234 for HTIO board, please refer to src/northbridge/amd/amdk8/get_sblk_pci1234.c for detail
34         0x0000000,
35         0x0000200,
36         0x0000100,
37 //        0x0000ff0,
38 //        0x0000ff0,
39 //        0x0000ff0,
40 //        0x0000ff0,
41 //        0x0000ff0
42 };
43 unsigned hcdnx[] =
44 { //HT Chain device num, actually it is unit id base of every ht device in chain, assume every chain only have 4 ht device at most
45         0x20202020,
46         0x20202020,
47         0x20202020,
48 //        0x20202020,
49 //        0x20202020,
50 //        0x20202020,
51 //        0x20202020,
52 //        0x20202020,
53 };
54
55 unsigned sbdn3;
56 unsigned coprocdn;
57
58 extern void get_sblk_pci1234(void);
59
60 static unsigned get_bus_conf_done = 0;
61
62 void get_bus_conf(void)
63 {
64
65         unsigned apicid_base;
66         unsigned sbdn;
67
68         device_t dev;
69         int i;
70
71         if(get_bus_conf_done==1) return; //do it only once
72
73         get_bus_conf_done = 1;
74
75         sysconf.hc_possible_num = ARRAY_SIZE(pci1234x);
76         for(i=0;i<sysconf.hc_possible_num; i++) {
77                 sysconf.pci1234[i] = pci1234x[i];
78                 sysconf.hcdn[i] = hcdnx[i];
79         }
80
81         get_sblk_pci1234();
82
83         sysconf.sbdn = (sysconf.hcdn[0] & 0xff); // first byte of first chain
84         sbdn = sysconf.sbdn;
85
86         sbdn3 = (sysconf.hcdn[1] & 0xff); // first byte of second chain
87
88         bus_ck804_0 = (sysconf.pci1234[0] >> 16) & 0xff;
89
90
91                 /* CK804 */
92                 dev = dev_find_slot(bus_ck804_0, PCI_DEVFN(sbdn + 0x09,0));
93                 if (dev) {
94                         bus_ck804_1 = pci_read_config8(dev, PCI_SECONDARY_BUS);
95                         bus_ck804_4 = pci_read_config8(dev, PCI_SUBORDINATE_BUS);
96                         bus_ck804_4++;
97                 }
98                 else {
99                         printk_debug("ERROR - could not find PCI 1:%02x.0, using defaults\n", sbdn + 0x09);
100
101                         bus_ck804_1 = 2;
102                         bus_ck804_4 = 3;
103                 }
104
105                 dev = dev_find_slot(bus_ck804_0, PCI_DEVFN(sbdn + 0x0d,0));
106                 if (dev) {
107                         bus_ck804_4 = pci_read_config8(dev, PCI_SECONDARY_BUS);
108                         bus_ck804_5 = pci_read_config8(dev, PCI_SUBORDINATE_BUS);
109                         bus_ck804_5++;
110                 }
111                 else {
112                         printk_debug("ERROR - could not find PCI 1:%02x.0, using defaults\n",sbdn + 0x0d);
113
114                         bus_ck804_5 = bus_ck804_4+1;
115                 }
116
117                 dev = dev_find_slot(bus_ck804_0, PCI_DEVFN(sbdn+ 0x0e,0));
118                 if (dev) {
119                         bus_ck804_5 = pci_read_config8(dev, PCI_SECONDARY_BUS);
120                         bus_isa = pci_read_config8(dev, PCI_SUBORDINATE_BUS);
121                         bus_isa++;
122                 }
123                 else {
124                         printk_debug("ERROR - could not find PCI 1:%02x.0, using defaults\n", sbdn+ 0x0e);
125                 }
126
127                 bus_8131_0 = (sysconf.pci1234[1] >> 16) & 0xff;
128                 /* 8131-1 */
129                 dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3,0));
130                 if (dev) {
131                         bus_8131_1 = pci_read_config8(dev, PCI_SECONDARY_BUS);
132                         bus_8131_2 = pci_read_config8(dev, PCI_SUBORDINATE_BUS);
133                         bus_8131_2++;
134                 }
135                 else {
136                         printk_debug("ERROR - could not find PCI %02x:01.0, using defaults\n", bus_8131_0);
137
138                         bus_8131_1 = bus_8131_0+1;
139                         bus_8131_2 = bus_8131_0+2;
140                 }
141                 /* 8131-2 */
142                 dev = dev_find_slot(bus_8131_0, PCI_DEVFN(sbdn3+1,0));
143                 if (dev) {
144                         bus_8131_2 = pci_read_config8(dev, PCI_SECONDARY_BUS);
145                         bus_isa = pci_read_config8(dev, PCI_SUBORDINATE_BUS);
146                         bus_isa++;
147                 }
148                 else {
149                         printk_debug("ERROR - could not find PCI %02x:02.0, using defaults\n", bus_8131_0);
150
151                         bus_8131_2 = bus_8131_1+1;
152                         bus_isa = bus_8131_1+2;
153                 }
154
155                 if(sysconf.pci1234[2] & 1) {
156                         bus_coproc_0 = (sysconf.pci1234[2] >> 16) & 0xff;
157                         coprocdn =  (sysconf.hcdn[2] & 0xff);
158                 }
159
160
161 /*I/O APICs:    APIC ID Version State           Address*/
162 #if CONFIG_LOGICAL_CPUS==1
163         apicid_base = get_apicid_base(3);
164 #else
165         apicid_base = CONFIG_MAX_PHYSICAL_CPUS;
166 #endif
167         apicid_ck804 = apicid_base+0;
168         apicid_8131_1 = apicid_base+1;
169         apicid_8131_2 = apicid_base+2;
170 }