"no warnings day"
[coreboot.git] / src / southbridge / broadcom / bcm5785 / bcm5785_early_setup.c
1 /*
2  * Copyright  2005 AMD
3  *  by yinghai.lu@amd.com
4  */
5
6 static void bcm5785_enable_rom(void)
7 {
8         unsigned char byte;
9         device_t addr;
10
11         /* Enable 4MB rom access at 0xFFC00000 - 0xFFFFFFFF */
12         /* Locate the BCM 5785 SB PCI Main */
13         addr = pci_locate_device(PCI_ID(0x1166, 0x0205), 0); // 0x0201?
14
15         /* Set the 4MB enable bit bit */
16         byte = pci_read_config8(addr, 0x41);
17         byte |= 0x0e;
18         pci_write_config8(addr, 0x41, byte);
19 }
20
21 static void bcm5785_enable_lpc(void)
22 {
23
24         uint8_t byte;
25         device_t dev;
26
27         dev = pci_locate_device(PCI_ID(0x1166, 0x0234), 0);
28
29         /* LPC Control 0 */
30         byte = pci_read_config8(dev, 0x44);
31         /* Serial 0 */
32         byte |= (1<<6);
33         pci_write_config8(dev, 0x44, byte);
34
35         /* LPC Control 4 */
36         byte = pci_read_config8(dev, 0x48);
37         /* superio port 0x2e/4e enable */
38         byte |=(1<<1)|(1<<0);
39         pci_write_config8(dev, 0x48, byte);
40 }
41
42 static void bcm5785_enable_wdt_port_cf9(void)
43 {
44         device_t dev;
45         uint32_t dword;
46         uint32_t dword_old;
47
48         dev = pci_locate_device(PCI_ID(0x1166, 0x0205), 0);
49
50         dword_old = pci_read_config32(dev, 0x4c);
51         dword = dword_old | (1<<4); //enable Timer Func
52         if(dword != dword_old ) {
53                 pci_write_config32(dev, 0x4c, dword);
54         }
55
56         dword_old = pci_read_config32(dev, 0x6c);
57         dword = dword_old | (1<<9); //unhide Timer Func in pci space
58         if(dword != dword_old ) {
59                 pci_write_config32(dev, 0x6c, dword);
60         }
61
62         dev = pci_locate_device(PCI_ID(0x1166, 0x0238), 0);
63
64         /* enable cf9 */
65         pci_write_config8(dev, 0x40, (1<<2));
66 }
67
68 static unsigned get_sbdn(unsigned bus)
69 {
70         device_t dev;
71
72         /* Find the device.
73          * There can only be one 8111 on a hypertransport chain/bus.
74          */
75         dev = pci_locate_device_on_bus(
76                 PCI_ID(0x1166, 0x0036),
77                 bus);
78
79         return (dev>>15) & 0x1f;
80
81 }
82
83 #define SB_VFSMAF 0
84
85 static void enable_fid_change_on_sb(unsigned sbbusn, unsigned sbdn)
86 {
87         //ACPI Decode Enable    
88         outb(0x0e, 0xcd6);
89         outb((1<<3), 0xcd7);
90
91         // set port to 0x2060
92         outb(0x67, 0xcd6);
93         outb(0x60, 0xcd7);
94         outb(0x68, 0xcd6);
95         outb(0x20, 0xcd7);
96
97         outb(0x69, 0xcd6);
98         outb(7, 0xcd7);
99
100         outb(0x64, 0xcd6);
101         outb(9, 0xcd7);
102 }
103
104 static void ldtstop_sb(void)
105 {
106         outb(1, 0x2060);
107 }
108
109
110 void hard_reset(void)
111 {
112         bcm5785_enable_wdt_port_cf9();
113
114         set_bios_reset();
115
116         /* full reset */
117         outb(0x0a, 0x0cf9);
118         outb(0x0e, 0x0cf9);
119 }
120
121 void soft_reset(void)
122 {
123         bcm5785_enable_wdt_port_cf9();
124
125         set_bios_reset();
126 #if 1
127         /* link reset */
128 //        outb(0x02, 0x0cf9);
129         outb(0x06, 0x0cf9);
130 #endif
131 }
132
133
134
135 static void bcm5785_enable_msg(void)
136 {
137         device_t dev;
138         uint32_t dword;
139         uint32_t dword_old;
140         uint8_t byte;
141
142         dev = pci_locate_device(PCI_ID(0x1166, 0x0205), 0);
143
144         byte = pci_read_config8(dev, 0x42);
145         byte = (1<<1); //enable a20
146         pci_write_config8(dev, 0x42, byte);
147
148         dword_old = pci_read_config32(dev, 0x6c);
149         // bit 5: enable A20 Message
150         // bit 4: enable interrupt messages
151         // bit 3: enable reset init message
152         // bit 2: enable keyboard init message
153         // bit 1: enable upsteam messages
154         // bit 0: enable shutdowm message to init generation
155         dword = dword_old | (1<<5) | (1<<3) | (1<<2) | (1<<1) | (1<<0); // bit 1 and bit 4 must be set, otherwise interrupt msg will not be delivered to the processor
156         if(dword != dword_old ) {
157                 pci_write_config32(dev, 0x6c, dword);
158         }
159
160 }
161
162 static void bcm5785_early_setup(void)
163 {
164         uint8_t byte;
165         uint32_t dword;
166         device_t dev;
167
168 //F0
169         // enable device on bcm5785 at first
170         dev = pci_locate_device(PCI_ID(0x1166, 0x0205), 0);
171         dword = pci_read_config32(dev, 0x64);
172         dword |=  (1<<15) | (1<<11) | (1<<3); // ioapci enable
173         dword |= (1<<8); // USB enable
174         dword |= /* (1<<27)|*/(1<<14); // IDE enable
175         pci_write_config32(dev, 0x64, dword);
176
177         byte = pci_read_config8(dev, 0x84);
178         byte |= (1<<0); // SATA enable
179         pci_write_config8(dev, 0x84, byte);
180
181 // WDT and cf9 for later in coreboot_ram to call hard_reset
182         bcm5785_enable_wdt_port_cf9();
183
184         bcm5785_enable_msg();
185
186
187 // IDE related
188         //F0
189         byte = pci_read_config8(dev, 0x4e);
190         byte |= (1<<4); //enable IDE ext regs
191         pci_write_config8(dev, 0x4e, byte);
192
193         //F1
194         dev = pci_locate_device(PCI_ID(0x1166, 0x0214), 0);
195         byte = pci_read_config8(dev, 0x48);
196         byte &= ~1; // disable pri channel
197         pci_write_config8(dev, 0x48, byte);
198         pci_write_config8(dev, 0xb0, 0x01);
199         pci_write_config8(dev, 0xb2, 0x02);
200         byte = pci_read_config8(dev, 0x06);
201         byte |= (1<<4); // so b0, b2 can not be changed from now
202         pci_write_config8(dev, 0x06, byte);
203         byte = pci_read_config8(dev, 0x49);
204         byte |= 1; // enable second channel
205         pci_write_config8(dev, 0x49, byte);
206
207         //F2
208         dev = pci_locate_device(PCI_ID(0x1166, 0x0234), 0);
209
210         byte = pci_read_config8(dev, 0x40);
211         byte |= (1<<3)|(1<<2); // LPC Retry, LPC to PCI DMA enable
212         pci_write_config8(dev, 0x40, byte);
213
214         pci_write_config32(dev, 0x60, 0x0000ffff); // LPC Memory hole start and end
215
216 // USB related
217         pci_write_config8(dev, 0x90, 0x40);
218         pci_write_config8(dev, 0x92, 0x06);
219         pci_write_config8(dev, 0x9c, 0x7c); //PHY timinig register
220         pci_write_config8(dev, 0xa4, 0x02); //mask reg - low/full speed func
221         pci_write_config8(dev, 0xa5, 0x02); //mask reg - low/full speed func
222         pci_write_config8(dev, 0xa6, 0x00); //mask reg - high speed func
223         pci_write_config8(dev, 0xb4, 0x40);
224 }