blob: e5366e97fcf0399f33343d40d37ac8f2cdb2ddf2 [file] [log] [blame]
efdesign987c0c64e2011-06-20 19:56:06 -07001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2011 Advanced Micro Devices, Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
efdesign987c0c64e2011-06-20 19:56:06 -070014 */
15
16
Elyes HAOUASe51d7312018-05-19 17:01:24 +020017#include <device/device.h>
efdesign987c0c64e2011-06-20 19:56:06 -070018#include <device/pci.h> /* device_operations */
19#include <device/pci_ids.h>
20#include <device/smbus.h> /* smbus_bus_operations */
zbao366f0fc2012-08-03 16:58:53 +080021#include <pc80/mc146818rtc.h>
Edward O'Callaghane61dd0f2014-05-06 23:53:09 +100022#include <pc80/i8254.h>
23#include <pc80/i8259.h>
efdesign987c0c64e2011-06-20 19:56:06 -070024#include <console/console.h> /* printk */
Kyösti Mälkkie2227a22014-02-05 13:02:55 +020025#include <device/pci_ehci.h>
Vladimir Serbinenko46a86f22014-10-08 22:38:54 +020026#include <arch/acpi.h>
efdesign987c0c64e2011-06-20 19:56:06 -070027#include "lpc.h" /* lpc_read_resources */
Elyes HAOUASb0f19882018-06-09 11:59:00 +020028#include "SbPlatform.h" /* Platform Specific Definitions */
29#include "chip.h" /* struct southbridge_amd_cimx_sb900_config */
efdesign987c0c64e2011-06-20 19:56:06 -070030
efdesign987c0c64e2011-06-20 19:56:06 -070031#ifndef _RAMSTAGE_
32#define _RAMSTAGE_
33#endif
34static AMDSBCFG sb_late_cfg; //global, init in sb900_cimx_config
35static AMDSBCFG *sb_config = &sb_late_cfg;
36
37
38/**
39 * @brief Entry point of Southbridge CIMx callout
40 *
41 * prototype UINT32 (*SBCIM_HOOK_ENTRY)(UINT32 Param1, UINT32 Param2, void* pConfig)
42 *
43 * @param[in] func Southbridge CIMx Function ID.
44 * @param[in] data Southbridge Input Data.
Martin Roth6355cbf2015-01-04 15:22:26 -070045 * @param[in] config Southbridge configuration structure pointer.
efdesign987c0c64e2011-06-20 19:56:06 -070046 *
47 */
Elyes HAOUAS251279c2018-07-08 12:41:56 +020048u32 sb900_callout_entry(u32 func, u32 data, void *config)
efdesign987c0c64e2011-06-20 19:56:06 -070049{
50 u32 ret = 0;
51
52 printk(BIOS_DEBUG, "SB900 - Late.c - sb900_callout_entry - Start.\n");
53 switch (func) {
54 case CB_SBGPP_RESET_ASSERT:
efdesign987c0c64e2011-06-20 19:56:06 -070055 break;
56
57 case CB_SBGPP_RESET_DEASSERT:
efdesign987c0c64e2011-06-20 19:56:06 -070058 break;
59
60//- case IMC_FIRMWARE_FAIL:
61//- break;
62
63 default:
64 break;
65 }
66
67 printk(BIOS_DEBUG, "SB900 - Late.c - sb900_callout_entry - End.\n");
68 return ret;
69}
70
71
72static struct pci_operations lops_pci = {
73 .set_subsystem = 0,
74};
75
Elyes HAOUASe51d7312018-05-19 17:01:24 +020076static void lpc_enable_resources(struct device *dev)
efdesign987c0c64e2011-06-20 19:56:06 -070077{
78
79 printk(BIOS_DEBUG, "SB900 - Late.c - lpc_enable_resources - Start.\n");
80 pci_dev_enable_resources(dev);
81 //lpc_enable_childrens_resources(dev);
82 printk(BIOS_DEBUG, "SB900 - Late.c - lpc_enable_resources - End.\n");
83}
84
Elyes HAOUASe51d7312018-05-19 17:01:24 +020085static void lpc_init(struct device *dev)
efdesign987c0c64e2011-06-20 19:56:06 -070086{
87 printk(BIOS_DEBUG, "SB900 - Late.c - lpc_init - Start.\n");
88 /* SB Configure HPET base and enable bit */
89//- hpetInit(sb_config, &(sb_config->BuildParameters));
Gabe Black03abaee212014-04-30 21:31:44 -070090 cmos_check_update_date();
zbao366f0fc2012-08-03 16:58:53 +080091
Mike Loptiena96d24d2013-02-25 10:41:28 -070092 /* Initialize the real time clock.
Gabe Blackb3f08c62014-04-30 17:12:25 -070093 * The 0 argument tells cmos_init not to
Mike Loptiena96d24d2013-02-25 10:41:28 -070094 * update CMOS unless it is invalid.
Gabe Blackb3f08c62014-04-30 17:12:25 -070095 * 1 tells cmos_init to always initialize the CMOS.
Mike Loptiena96d24d2013-02-25 10:41:28 -070096 */
Gabe Blackb3f08c62014-04-30 17:12:25 -070097 cmos_init(0);
Mike Loptiena96d24d2013-02-25 10:41:28 -070098
Edward O'Callaghane61dd0f2014-05-06 23:53:09 +100099 setup_i8259(); /* Initialize i8259 pic */
100 setup_i8254(); /* Initialize i8254 timers */
101
efdesign987c0c64e2011-06-20 19:56:06 -0700102 printk(BIOS_DEBUG, "SB900 - Late.c - lpc_init - End.\n");
103}
104
Vladimir Serbinenko46a86f22014-10-08 22:38:54 +0200105unsigned long acpi_fill_mcfg(unsigned long current)
106{
107 /* Just a dummy */
108 return current;
109}
110
efdesign987c0c64e2011-06-20 19:56:06 -0700111static struct device_operations lpc_ops = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200112 .read_resources = lpc_read_resources,
113 .set_resources = lpc_set_resources,
114 .enable_resources = lpc_enable_resources,
115 .init = lpc_init,
Vladimir Serbinenko83f81ca2014-11-09 13:30:50 +0100116#if IS_ENABLED(CONFIG_HAVE_ACPI_TABLES)
Vladimir Serbinenko46a86f22014-10-08 22:38:54 +0200117 .write_acpi_tables = acpi_write_hpet,
118#endif
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200119 .scan_bus = scan_lpc_bus,
120 .ops_pci = &lops_pci,
efdesign987c0c64e2011-06-20 19:56:06 -0700121};
122
123static const struct pci_driver lpc_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200124 .ops = &lpc_ops,
125 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200126 .device = PCI_DEVICE_ID_AMD_SB900_LPC,
efdesign987c0c64e2011-06-20 19:56:06 -0700127};
128
129
130static void sata_enable_resources(struct device *dev)
131{
132 printk(BIOS_DEBUG, "SB900 - Late.c - sata_enable_resources - Start.\n");
133//- sataInitAfterPciEnum(sb_config);
134 pci_dev_enable_resources(dev);
135 printk(BIOS_DEBUG, "SB900 - Late.c - sata_enable_resources - End.\n");
136}
137
138static void sata_init(struct device *dev)
139{
140 printk(BIOS_DEBUG, "SB900 - Late.c - sata_init - Start.\n");
141 sb_config->StdHeader.Func = SB_MID_POST_INIT;
142//- AmdSbDispatcher(sb_config); //sataInitMidPost only
143//- commonInitLateBoot(sb_config);
144//- sataInitLatePost(sb_config);
145 printk(BIOS_DEBUG, "SB900 - Late.c - sata_init - End.\n");
146}
147
148static struct device_operations sata_ops = {
149 .read_resources = pci_dev_read_resources,
150 .set_resources = pci_dev_set_resources,
151 .enable_resources = sata_enable_resources, //pci_dev_enable_resources,
152 .init = sata_init,
153 .scan_bus = 0,
154 .ops_pci = &lops_pci,
155};
156
157static const struct pci_driver sata_driver __pci_driver = {
158 .ops = &sata_ops,
159 .vendor = PCI_VENDOR_ID_AMD,
160#if (CONFIG_SATA_CONTROLLER_MODE == 0x0 || CONFIG_SATA_CONTROLLER_MODE == 0x3)
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200161 .device = PCI_DEVICE_ID_AMD_SB900_SATA, //SATA IDE Mode
efdesign987c0c64e2011-06-20 19:56:06 -0700162#endif
163#if (CONFIG_SATA_CONTROLLER_MODE == 0x2 || CONFIG_SATA_CONTROLLER_MODE == 0x4)
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200164 .device = PCI_DEVICE_ID_AMD_SB900_SATA_AHCI, //SATA AHCI Mode
efdesign987c0c64e2011-06-20 19:56:06 -0700165#endif
166#if (CONFIG_SATA_CONTROLLER_MODE == 0x5 || CONFIG_SATA_CONTROLLER_MODE == 0x6)
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200167 .device = PCI_DEVICE_ID_AMD_SB900_SATA_AMDAHCI, //SATA AMDAHCI Mode
efdesign987c0c64e2011-06-20 19:56:06 -0700168#endif
169#if (CONFIG_SATA_CONTROLLER_MODE == 0x1 && INCHIP_SATA_FORCE_RAID5 == 0x0)
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200170 .device = PCI_DEVICE_ID_AMD_SB900_SATA_RAID5, //SATA RAID5 Mode
efdesign987c0c64e2011-06-20 19:56:06 -0700171#endif
172#if (CONFIG_SATA_CONTROLLER_MODE == 0x1 && INCHIP_SATA_FORCE_RAID5 == 0x1)
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200173 .device = PCI_DEVICE_ID_AMD_SB900_SATA_RAID, //SATA RAID Mode
efdesign987c0c64e2011-06-20 19:56:06 -0700174#endif
175};
176
efdesign987c0c64e2011-06-20 19:56:06 -0700177static void usb_init(struct device *dev)
178{
179 printk(BIOS_DEBUG, "SB900 - Late.c - usb_init - Start.\n");
180//- usbInitAfterPciInit(sb_config);
181//- commonInitLateBoot(sb_config);
182 printk(BIOS_DEBUG, "SB900 - Late.c - usb_init - End.\n");
183}
184
185static struct device_operations usb_ops = {
Kyösti Mälkkifb387df2013-06-07 22:16:52 +0300186 .read_resources = pci_ehci_read_resources,
efdesign987c0c64e2011-06-20 19:56:06 -0700187 .set_resources = pci_dev_set_resources,
efdesign987c0c64e2011-06-20 19:56:06 -0700188 .enable_resources = pci_dev_enable_resources,
189 .init = usb_init,
190 .scan_bus = 0,
191 .ops_pci = &lops_pci,
192};
193
194/*
195 * The pci id of usb ctrl 0 and 1 are the same.
196 */
197static const struct pci_driver usb_xhci123_driver __pci_driver = {
198 .ops = &usb_ops,
199 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200200 .device = PCI_DEVICE_ID_AMD_SB900_USB_16_0, /* XHCI-USB1, XHCI-USB2 */
efdesign987c0c64e2011-06-20 19:56:06 -0700201};
202
203static const struct pci_driver usb_ohci123_driver __pci_driver = {
204 .ops = &usb_ops,
205 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200206 .device = PCI_DEVICE_ID_AMD_SB900_USB_18_0, /* OHCI-USB1, OHCI-USB2, OHCI-USB3 */
efdesign987c0c64e2011-06-20 19:56:06 -0700207};
208
209static const struct pci_driver usb_ehci123_driver __pci_driver = {
210 .ops = &usb_ops,
211 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200212 .device = PCI_DEVICE_ID_AMD_SB900_USB_18_2, /* EHCI-USB1, EHCI-USB2, EHCI-USB3 */
efdesign987c0c64e2011-06-20 19:56:06 -0700213};
214
215static const struct pci_driver usb_ohci4_driver __pci_driver = {
216 .ops = &usb_ops,
217 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200218 .device = PCI_DEVICE_ID_AMD_SB900_USB_20_5, /* OHCI-USB4 */
efdesign987c0c64e2011-06-20 19:56:06 -0700219};
220
221
222static void azalia_init(struct device *dev)
223{
224 printk(BIOS_DEBUG, "SB900 - Late.c - azalia_init - Start.\n");
225//- azaliaInitAfterPciEnum(sb_config); //Detect and configure High Definition Audio
226 printk(BIOS_DEBUG, "SB900 - Late.c - azalia_init - End.\n");
227}
228
229static struct device_operations azalia_ops = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200230 .read_resources = pci_dev_read_resources,
231 .set_resources = pci_dev_set_resources,
232 .enable_resources = pci_dev_enable_resources,
233 .init = azalia_init,
234 .scan_bus = 0,
235 .ops_pci = &lops_pci,
efdesign987c0c64e2011-06-20 19:56:06 -0700236};
237
238static const struct pci_driver azalia_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200239 .ops = &azalia_ops,
240 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200241 .device = PCI_DEVICE_ID_AMD_SB900_HDA,
efdesign987c0c64e2011-06-20 19:56:06 -0700242};
243
244
245static void gec_init(struct device *dev)
246{
247 printk(BIOS_DEBUG, "SB900 - Late.c - gec_init - Start.\n");
248//- gecInitAfterPciEnum(sb_config);
249//- gecInitLatePost(sb_config);
250 printk(BIOS_DEBUG, "SB900 - Late.c - gec_init - End.\n");
251}
252
253static struct device_operations gec_ops = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200254 .read_resources = pci_dev_read_resources,
255 .set_resources = pci_dev_set_resources,
256 .enable_resources = pci_dev_enable_resources,
257 .init = gec_init,
258 .scan_bus = 0,
259 .ops_pci = &lops_pci,
efdesign987c0c64e2011-06-20 19:56:06 -0700260};
261
262static const struct pci_driver gec_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200263 .ops = &gec_ops,
264 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200265 .device = PCI_DEVICE_ID_AMD_SB900_GEC,
efdesign987c0c64e2011-06-20 19:56:06 -0700266};
267
268
Elyes HAOUASe51d7312018-05-19 17:01:24 +0200269static void pcie_init(struct device *dev)
efdesign987c0c64e2011-06-20 19:56:06 -0700270{
271 printk(BIOS_DEBUG, "SB900 - Late.c - pcie_init - Start.\n");
272//- sbPcieGppLateInit(sb_config);
273 printk(BIOS_DEBUG, "SB900 - Late.c - pcie_init - End.\n");
274}
275
276static struct device_operations pci_ops = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200277 .read_resources = pci_bus_read_resources,
278 .set_resources = pci_dev_set_resources,
279 .enable_resources = pci_bus_enable_resources,
280 .init = pcie_init,
281 .scan_bus = pci_scan_bridge,
282 .reset_bus = pci_bus_reset,
283 .ops_pci = &lops_pci,
efdesign987c0c64e2011-06-20 19:56:06 -0700284};
285
286static const struct pci_driver pci_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200287 .ops = &pci_ops,
288 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200289 .device = PCI_DEVICE_ID_AMD_SB900_PCI,
efdesign987c0c64e2011-06-20 19:56:06 -0700290};
291
292
293struct device_operations bridge_ops = {
294 .read_resources = pci_bus_read_resources,
295 .set_resources = pci_dev_set_resources,
296 .enable_resources = pci_bus_enable_resources,
297 .init = pcie_init,
298 .scan_bus = pci_scan_bridge,
299 .enable = 0,
300 .reset_bus = pci_bus_reset,
301 .ops_pci = &lops_pci,
302};
303
304/* 0:15:0 PCIe PortA */
305static const struct pci_driver PORTA_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200306 .ops = &bridge_ops,
307 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200308 .device = PCI_DEVICE_ID_AMD_SB900_PCIEA,
efdesign987c0c64e2011-06-20 19:56:06 -0700309};
310
311/* 0:15:1 PCIe PortB */
312static const struct pci_driver PORTB_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200313 .ops = &bridge_ops,
314 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200315 .device = PCI_DEVICE_ID_AMD_SB900_PCIEB,
efdesign987c0c64e2011-06-20 19:56:06 -0700316};
317
318/* 0:15:2 PCIe PortC */
319static const struct pci_driver PORTC_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200320 .ops = &bridge_ops,
321 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200322 .device = PCI_DEVICE_ID_AMD_SB900_PCIEC,
efdesign987c0c64e2011-06-20 19:56:06 -0700323};
324
325/* 0:15:3 PCIe PortD */
326static const struct pci_driver PORTD_driver __pci_driver = {
Elyes HAOUASba28e8d2016-08-31 19:22:16 +0200327 .ops = &bridge_ops,
328 .vendor = PCI_VENDOR_ID_AMD,
Kyösti Mälkki9d9a5522016-11-19 22:14:59 +0200329 .device = PCI_DEVICE_ID_AMD_SB900_PCIED,
efdesign987c0c64e2011-06-20 19:56:06 -0700330};
331
332
333/**
334 * @brief SB Cimx entry point sbBeforePciInit wrapper
335 */
Elyes HAOUASe51d7312018-05-19 17:01:24 +0200336static void sb900_enable(struct device *dev)
efdesign987c0c64e2011-06-20 19:56:06 -0700337{
338 u8 gpp_port = 0;
339 struct southbridge_amd_cimx_sb900_config *sb_chip =
340 (struct southbridge_amd_cimx_sb900_config *)(dev->chip_info);
341
342 sb900_cimx_config(sb_config);
343 printk(BIOS_DEBUG, "sb900_enable() ");
344
345 /* Config SouthBridge SMBUS/ACPI/IDE/LPC/PCIB.*/
346//- commonInitEarlyBoot(sb_config);
347//- commonInitEarlyPost(sb_config);
348
349 switch (dev->path.pci.devfn) {
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100350 case PCI_DEVFN(0x10, 0): /* XHCI-USB */
efdesign987c0c64e2011-06-20 19:56:06 -0700351//- usbInitBeforePciEnum(sb_config); // USB POST TIME Only
352 break;
353
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100354 case PCI_DEVFN(0x11, 0): /* SATA */
efdesign987c0c64e2011-06-20 19:56:06 -0700355 if (dev->enabled) {
Elyes HAOUASb0f19882018-06-09 11:59:00 +0200356 sb_config->SATAMODE.SataMode.SataController = ENABLED;
Elyes HAOUAS0f8b8d92019-01-03 10:23:28 +0100357 if (sb_chip->boot_switch_sata_ide == 1)
efdesign987c0c64e2011-06-20 19:56:06 -0700358 sb_config->SATAMODE.SataMode.SataIdeCombMdPriSecOpt = 0; //0 -IDE as primary.
Elyes HAOUAS0f8b8d92019-01-03 10:23:28 +0100359 else if (sb_chip->boot_switch_sata_ide == 0)
efdesign987c0c64e2011-06-20 19:56:06 -0700360 sb_config->SATAMODE.SataMode.SataIdeCombMdPriSecOpt = 1; //1 -IDE as secondary.
361 } else {
Elyes HAOUASb0f19882018-06-09 11:59:00 +0200362 sb_config->SATAMODE.SataMode.SataController = DISABLED;
efdesign987c0c64e2011-06-20 19:56:06 -0700363 }
364
365//- sataInitBeforePciEnum(sb_config); // Init SATA class code and PHY
366 break;
367
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100368 case PCI_DEVFN(0x12, 0): /* OHCI-USB1 */
369 case PCI_DEVFN(0x12, 2): /* EHCI-USB1 */
370 case PCI_DEVFN(0x13, 0): /* OHCI-USB2 */
371 case PCI_DEVFN(0x13, 2): /* EHCI-USB2 */
372 case PCI_DEVFN(0x14, 5): /* OHCI-USB4 */
efdesign987c0c64e2011-06-20 19:56:06 -0700373//- usbInitBeforePciEnum(sb_config); // USB POST TIME Only
374 break;
375
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100376 case PCI_DEVFN(0x14, 0): /* SMBUS */
efdesign987c0c64e2011-06-20 19:56:06 -0700377 break;
378
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100379 case PCI_DEVFN(0x14, 1): /* IDE */
efdesign987c0c64e2011-06-20 19:56:06 -0700380 if (dev->enabled) {
381 sb_config->SATAMODE.SataMode.SataIdeCombinedMode = ENABLED;
382 } else {
Elyes HAOUASb0f19882018-06-09 11:59:00 +0200383 sb_config->SATAMODE.SataMode.SataIdeCombinedMode = DISABLED;
efdesign987c0c64e2011-06-20 19:56:06 -0700384 }
385//- sataInitBeforePciEnum(sb_config); // Init SATA class code and PHY
386 break;
387
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100388 case PCI_DEVFN(0x14, 2): /* HDA */
efdesign987c0c64e2011-06-20 19:56:06 -0700389 if (dev->enabled) {
Elyes HAOUASb0f19882018-06-09 11:59:00 +0200390 if (sb_config->AzaliaController == AZALIA_DISABLE) {
391 sb_config->AzaliaController = AZALIA_AUTO;
efdesign987c0c64e2011-06-20 19:56:06 -0700392 }
393 printk(BIOS_DEBUG, "hda enabled\n");
394 } else {
Elyes HAOUASb0f19882018-06-09 11:59:00 +0200395 sb_config->AzaliaController = AZALIA_DISABLE;
efdesign987c0c64e2011-06-20 19:56:06 -0700396 printk(BIOS_DEBUG, "hda disabled\n");
397 }
398//- azaliaInitBeforePciEnum(sb_config); // Detect and configure High Definition Audio
399 break;
400
401
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100402 case PCI_DEVFN(0x14, 3): /* LPC */
efdesign987c0c64e2011-06-20 19:56:06 -0700403 break;
404
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100405 case PCI_DEVFN(0x14, 4): /* PCI */
efdesign987c0c64e2011-06-20 19:56:06 -0700406 break;
407
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100408 case PCI_DEVFN(0x14, 6): /* GEC */
efdesign987c0c64e2011-06-20 19:56:06 -0700409 if (dev->enabled) {
410 sb_config->GecConfig = 0;
411 printk(BIOS_DEBUG, "gec enabled\n");
412 } else {
413 sb_config->GecConfig = 1;
414 printk(BIOS_DEBUG, "gec disabled\n");
415 }
416//- gecInitBeforePciEnum(sb_config); // Init GEC
417 break;
418
Elyes HAOUAS7d1a9482019-01-09 16:31:14 +0100419 case PCI_DEVFN(0x15, 0): /* PCIe PortA */
420 case PCI_DEVFN(0x15, 1): /* PCIe PortB */
421 case PCI_DEVFN(0x15, 2): /* PCIe PortC */
422 case PCI_DEVFN(0x15, 3): /* PCIe PortD */
efdesign987c0c64e2011-06-20 19:56:06 -0700423 gpp_port = (dev->path.pci.devfn) & 0x03;
424 if (dev->enabled) {
425 sb_config->PORTCONFIG[gpp_port].PortCfg.PortPresent = ENABLED;
426 } else {
427 sb_config->PORTCONFIG[gpp_port].PortCfg.PortPresent = DISABLED;
428 }
429
430 /*
431 * GPP_CFGMODE_X4000: PortA Lanes[3:0]
432 * GPP_CFGMODE_X2200: PortA Lanes[1:0], PortB Lanes[3:2]
433 * GPP_CFGMODE_X2110: PortA Lanes[1:0], PortB Lane2, PortC Lane3
434 * GPP_CFGMODE_X1111: PortA Lanes0, PortB Lane1, PortC Lane2, PortD Lane3
435 */
436 if (sb_config->GppLinkConfig != sb_chip->gpp_configuration) {
437 sb_config->GppLinkConfig = sb_chip->gpp_configuration;
438 }
439
440//- sbPcieGppEarlyInit(sb_config);
441 break;
442
443 default:
444 break;
445 }
446
447 /* Special setting ABCFG registers before PCI emulation. */
448//- abSpecialSetBeforePciEnum(sb_config);
Elyes HAOUASb0f19882018-06-09 11:59:00 +0200449//- usbDesertPll(sb_config);
efdesign987c0c64e2011-06-20 19:56:06 -0700450 //sb_config->StdHeader.Func = SB_BEFORE_PCI_INIT;
451 //AmdSbDispatcher(sb_config);
452}
453
454struct chip_operations southbridge_amd_cimx_sb900_ops = {
455 CHIP_NAME("ATI SB900")
456 .enable_dev = sb900_enable,
457};