aboutsummaryrefslogtreecommitdiff
path: root/src/mainboard/apple/macbookpro10_1/early_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainboard/apple/macbookpro10_1/early_init.c')
-rw-r--r--src/mainboard/apple/macbookpro10_1/early_init.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/mainboard/apple/macbookpro10_1/early_init.c b/src/mainboard/apple/macbookpro10_1/early_init.c
new file mode 100644
index 0000000000..39596fd827
--- /dev/null
+++ b/src/mainboard/apple/macbookpro10_1/early_init.c
@@ -0,0 +1,105 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#include <device/pci_ops.h>
+#include <northbridge/intel/sandybridge/sandybridge.h>
+#include <northbridge/intel/sandybridge/raminit_native.h>
+#include <southbridge/intel/bd82x6x/pch.h>
+#include <drivers/apple/hybrid_graphics/hybrid_graphics.h>
+#include <cbfs.h>
+#include <southbridge/intel/common/gpio.h>
+
+const struct southbridge_usb_port mainboard_usb_ports[] = {
+ { 1, 0, 0 }, /* Ext A (XHCI/EHCI) */
+ { 1, 0, 1 }, /* Ext B (XHCI) */
+ { 1, 0, 2 }, /* Ext C (XHCI/EHCI) */
+ { 1, 0, 3 }, /* Ext D (XHCI) */
+ { 0, 0, -1 }, /* Unused */
+ { 1, 0, -1 }, /* SD */
+ { 1, 0, -1 }, /* Wi-Fi */
+ { 1, 0, -1 }, /* USB Hub (All LS/FS Devices) */
+ { 1, 0, -1 }, /* Camera */
+ { 1, 0, 4 }, /* Ext B (EHCI) */
+ { 1, 0, 5 }, /* Ext D (EHCI) */
+ { 1, 0, -1 }, /* BT */
+ { 0, 0, -1 }, /* Unused */
+ { 0, 0, -1 }, /* Unused */
+};
+
+void mainboard_early_init(int s3resume)
+{
+ bool igd, peg;
+ u32 reg32;
+
+ early_hybrid_graphics(&igd, &peg);
+
+ /* Hide disabled devices */
+ reg32 = pci_read_config32(HOST_BRIDGE, DEVEN);
+ reg32 &= ~(DEVEN_PEG10 | DEVEN_IGD);
+
+ if (peg)
+ reg32 |= DEVEN_PEG10;
+
+ if (igd) {
+ reg32 |= DEVEN_IGD;
+ } else {
+ /* Disable IGD VGA decode, no GTT or GFX stolen */
+ pci_write_config16(HOST_BRIDGE, GGC, 2);
+ }
+
+ pci_write_config32(HOST_BRIDGE, DEVEN, reg32);
+}
+
+static uint8_t *get_spd_data(int spd_index)
+{
+ uint8_t *spd_file;
+ size_t spd_file_len;
+
+ printk(BIOS_DEBUG, "spd index %d\n", spd_index);
+ spd_file = cbfs_map("spd.bin", &spd_file_len);
+ if (!spd_file)
+ die("SPD data not found.");
+
+ if (spd_file_len < spd_index * 256)
+ die("Missing SPD data.");
+
+ return spd_file + spd_index * 256;
+}
+
+void mainboard_get_spd(spd_raw_data *spd, bool id_only)
+{
+ uint8_t *memory;
+ const int spd_gpio_vector[] = {71, 70, 69, 68, -1};
+ int ramcfg = get_gpios(spd_gpio_vector);
+ int spd_index = -1;
+
+ /*
+ * GPIO68 GPIO69 GPIO70 GPIO71 Memory Supported
+ * 0 0 0 0 4G Hynix 1600S No
+ * 0 0 0 1 1G Samsung 1600 No
+ * 0 0 1 0 4G Samsung 1600S No
+ * 0 0 1 1 1G Hynix 1600 No
+ * 0 1 0 0 4G Elpida 1600S No
+ * 0 1 0 1 2G Samsung 1600 No
+ * 0 1 1 0 2G Samsung 1333 No
+ * 0 1 1 1 2G Hynix 1600 Yes
+ * 1 0 0 0 4G Samsung 1600 No
+ * 1 0 0 1 4G Hynix 1600 Yes
+ * 1 0 1 0 2G Elpida 1600S No
+ * 1 0 1 1 2G Elpida 1600 No
+ * 1 1 0 0 4G Elpida 1600 No
+ * 1 1 0 1 2G Samsung 1600S No
+ * 1 1 1 0 2G Hynix 1600S No
+ */
+
+ if (ramcfg == 7)
+ spd_index = 0;
+ else if (ramcfg == 9)
+ spd_index = 1;
+
+ if (spd_index == -1)
+ die("Unsupported memory, RAMCFG=%d\n", ramcfg);
+
+ memory = get_spd_data(spd_index);
+ memcpy(&spd[0], memory, 256);
+ memcpy(&spd[2], memory, 256);
+}