2 * This file is part of the coreboot project.
4 * Copyright (C) 2005 AMD
5 * Written by Yinghai Lu <yinghai.lu@amd.com> for AMD.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
23 #include "bcm5785_enable_rom.c"
25 static void bcm5785_enable_lpc(void)
30 dev = pci_locate_device(PCI_ID(0x1166, 0x0234), 0);
33 byte = pci_read_config8(dev, 0x44);
36 pci_write_config8(dev, 0x44, byte);
39 byte = pci_read_config8(dev, 0x48);
40 /* superio port 0x2e/4e enable */
42 pci_write_config8(dev, 0x48, byte);
45 static void bcm5785_enable_wdt_port_cf9(void)
51 dev = pci_locate_device(PCI_ID(0x1166, 0x0205), 0);
53 dword_old = pci_read_config32(dev, 0x4c);
54 dword = dword_old | (1<<4); //enable Timer Func
55 if(dword != dword_old ) {
56 pci_write_config32(dev, 0x4c, dword);
59 dword_old = pci_read_config32(dev, 0x6c);
60 dword = dword_old | (1<<9); //unhide Timer Func in pci space
61 if(dword != dword_old ) {
62 pci_write_config32(dev, 0x6c, dword);
65 dev = pci_locate_device(PCI_ID(0x1166, 0x0238), 0);
68 pci_write_config8(dev, 0x40, (1<<2));
71 unsigned get_sbdn(unsigned bus)
76 * There can only be one bcm5785 on a hypertransport chain/bus.
78 dev = pci_locate_device_on_bus(
79 PCI_ID(0x1166, 0x0036),
82 return (dev>>15) & 0x1f;
88 void enable_fid_change_on_sb(unsigned sbbusn, unsigned sbdn)
107 void ldtstop_sb(void)
113 void hard_reset(void)
115 bcm5785_enable_wdt_port_cf9();
124 void soft_reset(void)
126 bcm5785_enable_wdt_port_cf9();
131 // outb(0x02, 0x0cf9);
136 static void bcm5785_enable_msg(void)
143 dev = pci_locate_device(PCI_ID(0x1166, 0x0205), 0);
145 byte = pci_read_config8(dev, 0x42);
146 byte = (1<<1); //enable a20
147 pci_write_config8(dev, 0x42, byte);
149 dword_old = pci_read_config32(dev, 0x6c);
150 // bit 5: enable A20 Message
151 // bit 4: enable interrupt messages
152 // bit 3: enable reset init message
153 // bit 2: enable keyboard init message
154 // bit 1: enable upsteam messages
155 // bit 0: enable shutdowm message to init generation
156 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
157 if(dword != dword_old ) {
158 pci_write_config32(dev, 0x6c, dword);
162 static void bcm5785_early_setup(void)
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);
177 byte = pci_read_config8(dev, 0x84);
178 byte |= (1<<0); // SATA enable
179 pci_write_config8(dev, 0x84, byte);
181 // WDT and cf9 for later in coreboot_ram to call hard_reset
182 bcm5785_enable_wdt_port_cf9();
184 bcm5785_enable_msg();
189 byte = pci_read_config8(dev, 0x4e);
190 byte |= (1<<4); //enable IDE ext regs
191 pci_write_config8(dev, 0x4e, byte);
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);
208 dev = pci_locate_device(PCI_ID(0x1166, 0x0234), 0);
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);
214 pci_write_config32(dev, 0x60, 0x0000ffff); // LPC Memory hole start and end
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);