samus: Combine mainboard patches to build soc/intel/broadwell

Combine four patches dependencies. These will not build
individually, so combine them for coreboot.org upstream.

samus: Move SPD handling to separate file

The code to find the SPD data for the mainboard based on GPIOs
is moved from romstage.c into spd.c.

It relies on the updated pei_data structure from broadwell instead
of the haswell interface.

BUG=chrome-os-partner:28234
TEST=Build and boot on samus
CQ-DEPEND=CL:199921
CQ-DEPEND=CL:199922
CQ-DEPEND=CL:199923
CQ-DEPEND=CL:199943
CQ-DEPEND=CL:*163751

Original-Change-Id: I5bd56f81884dae117b35a1ffa5fb6e804fd3cb9c
Original-Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/199920
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
(cherry picked from commit 0bd2de4ba5eb8ba5e9d43f8e82ce9ff7587eab62)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>

samus: Move PEI data structure init to separate file

This needs to be executed in both romstage and ramstage
for the different PEI binary stages.

It uses the broadwell interface now instead of haswell.

BUG=chrome-os-partner:28234
TEST=Build and boot on samus
CQ-DEPEND=CL:199920
CQ-DEPEND=CL:199922
CQ-DEPEND=CL:199923
CQ-DEPEND=CL:199943
CQ-DEPEND=CL:*163751

Original-Change-Id: Ida05bd17b9e54f08ed0e2767361c9301a2e97709
Original-Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/199921
(cherry picked from commit 89f98a27ea561ec63e716b1f6446d92822a6a5de)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>

samus: Convert mainboard to use soc/intel/broadwell

Switch from the haswell cpu/northbridge/southbridge interface
to the soc/intel/broadwell interface.

- Use new headers where appropriate
- Remove code that is now done by the SOC generic code
- Update GPIO map to drop LP specific handling
- Update INT15 handlers, drop all but the boot display hook

BUG=chrome-os-partner:28234
TEST=Build and boot on samus
CQ-DEPEND=CL:199920
CQ-DEPEND=CL:199921
CQ-DEPEND=CL:199923
CQ-DEPEND=CL:199943
CQ-DEPEND=CL:*163751

Original-Change-Id: I56f3543612e89e2cdb4256b1bcd4279f5546b918
Original-Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/199922

(cherry picked from commit 715dbb06e9f79d1ec3647330311c45aa29362375)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>

samus: Add some code to print basic info from SPD

The handling of LPDDR is a bit messy in Intel platforms.  There
is no traditional SPD so instead one is created by hand from the
provided datasheets.

These have varying (and sometimes unexpected) geometry and it can
be important during bringup to know what configuration is being
passed to the memory training code.

This could in theory be put in a more generic location, but for now
this is the only board with LPDDR3 where I have found it valuable.

BUG=chrome-os-partner:28234
TEST=Build and boot on samus, look for SPD details on the console.
CQ-DEPEND=CL:199920
CQ-DEPEND=CL:199921
CQ-DEPEND=CL:199922
CQ-DEPEND=CL:199943
CQ-DEPEND=CL:*163751

Original-Change-Id: Ibce0187ceb77d37552ffa1b4a5935061d7019259
Original-Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/199923
(cherry picked from commit 3f36348dd7abc67048407f181065f1a99b3d0dab)
Signed-off-by: Marc Jones <marc.jones@se-eng.com>

Change-Id: I1d19dffbd0b2e838d1946670a0bee9f8e121869d
Reviewed-on: http://review.coreboot.org/7943
Tested-by: build bot (Jenkins)
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com>
This commit is contained in:
Duncan Laurie 2014-05-14 15:59:37 -07:00 committed by Marc Jones
parent 229958e0b9
commit 2663a55caf
19 changed files with 499 additions and 616 deletions

View File

@ -2,10 +2,7 @@ if BOARD_GOOGLE_SAMUS
config BOARD_SPECIFIC_OPTIONS # dummy config BOARD_SPECIFIC_OPTIONS # dummy
def_bool y def_bool y
select CPU_INTEL_SOCKET_RPGA989 select SOC_INTEL_BROADWELL
select NORTHBRIDGE_INTEL_HASWELL
select SOUTHBRIDGE_INTEL_LYNXPOINT
select INTEL_LYNXPOINT_LP
select BOARD_ROMSIZE_KB_8192 select BOARD_ROMSIZE_KB_8192
select EC_GOOGLE_CHROMEEC select EC_GOOGLE_CHROMEEC
select EC_SOFTWARE_SYNC select EC_SOFTWARE_SYNC
@ -18,13 +15,17 @@ config BOARD_SPECIFIC_OPTIONS # dummy
select MAINBOARD_HAS_CHROMEOS select MAINBOARD_HAS_CHROMEOS
select EXTERNAL_MRC_BLOB select EXTERNAL_MRC_BLOB
select MONOTONIC_TIMER_MSR select MONOTONIC_TIMER_MSR
select MAINBOARD_HAS_NATIVE_VGA_INIT select CHROMEOS_RAMOOPS_DYNAMIC
select INTEL_INT15 select INTEL_INT15
config VBOOT_RAMSTAGE_INDEX config VBOOT_RAMSTAGE_INDEX
hex hex
default 0x2 default 0x2
config VBOOT_REFCODE_INDEX
hex
default 0x3
config MAINBOARD_DIR config MAINBOARD_DIR
string string
default google/samus default google/samus
@ -33,9 +34,6 @@ config MAINBOARD_PART_NUMBER
string string
default "Samus" default "Samus"
config MMCONF_BASE_ADDRESS
hex
default 0xf0000000
config MAX_CPUS config MAX_CPUS
int int

View File

@ -24,7 +24,11 @@ ramstage-y += chromeos.c
smm-$(CONFIG_HAVE_SMI_HANDLER) += smihandler.c smm-$(CONFIG_HAVE_SMI_HANDLER) += smihandler.c
romstage-y += pei_data.c
ramstage-y += pei_data.c
## DIMM SPD for on-board memory ## DIMM SPD for on-board memory
romstage-y += spd.c
SPD_BIN = $(obj)/spd.bin SPD_BIN = $(obj)/spd.bin
# Order of names in SPD_SOURCES is important! # Order of names in SPD_SOURCES is important!

View File

@ -17,7 +17,7 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
Name(OIPG, Package() { Name (OIPG, Package() {
Package () { 0x0001, 0, 0xFFFFFFFF, "LynxPoint" }, // no recovery button Package () { 0x0001, 0, 0xFFFFFFFF, "PCH-LP" }, // no recovery button
Package () { 0x0003, 1, 16, "LynxPoint" }, // firmware write protect Package () { 0x0003, 1, 16, "PCH-LP" }, // firmware write protect
}) })

View File

@ -65,16 +65,6 @@ Scope (\_SB)
}) })
Name (_PRW, Package() { BOARD_TRACKPAD_WAKE_GPIO, 0x3 }) Name (_PRW, Package() { BOARD_TRACKPAD_WAKE_GPIO, 0x3 })
Method (_DSW, 3, NotSerialized)
{
Store (BOARD_TRACKPAD_WAKE_GPIO, Local0)
If (LEqual (Arg0, 1)) {
// Enable GPIO as wake source
\_SB.PCI0.LPCB.GWAK (Local0)
}
}
} }
Device (TSCR) Device (TSCR)
@ -98,19 +88,5 @@ Scope (\_SB)
BOARD_TOUCHSCREEN_I2C_ADDR BOARD_TOUCHSCREEN_I2C_ADDR
} }
}) })
#if 0 // Disabled until kernel driver is working
Name (_PRW, Package() { BOARD_TOUCHSCREEN_WAKE_GPIO, 0x3 })
Method (_DSW, 3, NotSerialized)
{
Store (BOARD_TOUCHSCREEN_WAKE_GPIO, Local0)
If (LEqual (Arg0, 1)) {
// Enable GPIO as wake source
\_SB.PCI0.LPCB.GWAK (Local0)
}
}
#endif
} }
} }

View File

@ -68,19 +68,5 @@ Method(_PTS,1)
Method(_WAK,1) Method(_WAK,1)
{ {
/* Update AC status */
Store (\_SB.PCI0.LPCB.EC0.ACEX, Local0)
if (LNotEqual (Local0, \PWRS)) {
Store (Local0, \PWRS)
Notify (\_SB.PCI0.LPCB.EC0.AC, 0x80)
}
/* Update LID status */
Store (\_SB.PCI0.LPCB.EC0.LIDS, Local0)
if (LNotEqual (Local0, \LIDS)) {
Store (Local0, \LIDS)
Notify (\_SB.LID0, 0x80)
}
Return(Package(){0,0}) Return(Package(){0,0})
} }

View File

@ -21,20 +21,6 @@
Scope (\_TZ) Scope (\_TZ)
{ {
// Handler for throttle requests on this platform
// 0 = Stop throttling
// 1 = Start throttling
Method (THRT, 1, Serialized)
{
If (LEqual (Arg0, 0)) {
/* Disable Power Limit */
\_SB.PCI0.MCHC.CTLD ()
} Else {
/* Enable Power Limit */
\_SB.PCI0.MCHC.CTLE (\F0PW)
}
}
ThermalZone (THRM) ThermalZone (THRM)
{ {
Name (_TC1, 0x02) Name (_TC1, 0x02)

View File

@ -29,51 +29,27 @@
#include <device/pci.h> #include <device/pci.h>
#include <device/pci_ids.h> #include <device/pci_ids.h>
#include <cpu/cpu.h> #include <cpu/cpu.h>
#include <cpu/x86/msr.h> #include <broadwell/acpi.h>
#include <vendorcode/google/chromeos/gnvs.h> #include <broadwell/nvs.h>
#include <ec/google/chromeec/ec.h>
#include <southbridge/intel/lynxpoint/pch.h>
#include <southbridge/intel/lynxpoint/nvs.h>
#include "thermal.h" #include "thermal.h"
static void acpi_update_thermal_table(global_nvs_t *gnvs)
{
gnvs->tmps = TEMPERATURE_SENSOR_ID;
gnvs->tcrt = CRITICAL_TEMPERATURE;
gnvs->tpsv = PASSIVE_TEMPERATURE;
gnvs->tmax = MAX_TEMPERATURE;
gnvs->f0pw = EC_THROTTLE_POWER_LIMIT;
gnvs->flvl = 1;
}
void acpi_create_gnvs(global_nvs_t *gnvs) void acpi_create_gnvs(global_nvs_t *gnvs)
{ {
acpi_init_gnvs(gnvs);
/* Enable USB ports in S3 */ /* Enable USB ports in S3 */
gnvs->s3u0 = 1; gnvs->s3u0 = 1;
gnvs->s3u1 = 1;
/* Disable USB ports in S5 */ /* Disable USB ports in S5 */
gnvs->s5u0 = 0; gnvs->s5u0 = 0;
gnvs->s5u1 = 0;
/* TPM Present */ /* TPM Present */
gnvs->tpmp = 1; gnvs->tpmp = 1;
/* IGD Displays */ gnvs->tmps = TEMPERATURE_SENSOR_ID;
gnvs->ndid = 3; gnvs->tcrt = CRITICAL_TEMPERATURE;
gnvs->did[0] = 0x80000100; gnvs->tpsv = PASSIVE_TEMPERATURE;
gnvs->did[1] = 0x80000240; gnvs->tmax = MAX_TEMPERATURE;
gnvs->did[2] = 0x80000410;
gnvs->did[3] = 0x80000410;
gnvs->did[4] = 0x00000005;
#if CONFIG_CHROMEOS
gnvs->chromeos.vbt2 = google_ec_running_ro() ?
ACTIVE_ECFW_RO : ACTIVE_ECFW_RW;
#endif
acpi_update_thermal_table(gnvs);
} }
unsigned long acpi_fill_madt(unsigned long current) unsigned long acpi_fill_madt(unsigned long current)
@ -85,27 +61,5 @@ unsigned long acpi_fill_madt(unsigned long current)
current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *) current, current += acpi_create_madt_ioapic((acpi_madt_ioapic_t *) current,
2, IO_APIC_ADDR, 0); 2, IO_APIC_ADDR, 0);
/* INT_SRC_OVR */ return acpi_madt_irq_overrides(current);
current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 0, 2, 0);
current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 9, 9, MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_HIGH);
/* GPIO Controller */
current += acpi_create_madt_irqoverride((acpi_madt_irqoverride_t *)
current, 0, 14, 14, MP_IRQ_TRIGGER_LEVEL | MP_IRQ_POLARITY_HIGH);
return current;
}
unsigned long acpi_fill_slit(unsigned long current)
{
// Not implemented
return current;
}
unsigned long acpi_fill_srat(unsigned long current)
{
/* No NUMA, no SRAT */
return current;
} }

View File

@ -22,12 +22,12 @@
#include <arch/io.h> #include <arch/io.h>
#include <device/device.h> #include <device/device.h>
#include <device/pci.h> #include <device/pci.h>
#include <southbridge/intel/lynxpoint/pch.h> #include <console/console.h>
#include <vendorcode/google/chromeos/chromeos.h>
#if CONFIG_EC_GOOGLE_CHROMEEC
#include "ec.h"
#include <ec/google/chromeec/ec.h> #include <ec/google/chromeec/ec.h>
#endif #include <ec/google/chromeec/ec_commands.h>
#include <broadwell/gpio.h>
/* SPI Write protect is GPIO 16 */ /* SPI Write protect is GPIO 16 */
#define CROS_WP_GPIO 16 #define CROS_WP_GPIO 16
@ -39,13 +39,9 @@
static int get_lid_switch(void) static int get_lid_switch(void)
{ {
#if CONFIG_EC_GOOGLE_CHROMEEC
u8 ec_switches = inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_SWITCHES); u8 ec_switches = inb(EC_LPC_ADDR_MEMMAP + EC_MEMMAP_SWITCHES);
return !!(ec_switches & EC_SWITCH_LID_OPEN); return !!(ec_switches & EC_SWITCH_LID_OPEN);
#else
return 0;
#endif
} }
void fill_lb_gpios(struct lb_gpios *gpios) void fill_lb_gpios(struct lb_gpios *gpios)

View File

@ -1,4 +1,4 @@
chip northbridge/intel/haswell chip soc/intel/broadwell
# Enable eDP Hotplug with 6ms pulse # Enable eDP Hotplug with 6ms pulse
register "gpu_dp_d_hotplug" = "0x06" register "gpu_dp_d_hotplug" = "0x06"
@ -21,104 +21,81 @@ chip northbridge/intel/haswell
register "gpu_panel_power_backlight_on_delay" = "2000" # 200ms register "gpu_panel_power_backlight_on_delay" = "2000" # 200ms
register "gpu_panel_power_backlight_off_delay" = "2000" # 200ms register "gpu_panel_power_backlight_off_delay" = "2000" # 200ms
register "pirqa_routing" = "0x8b"
register "pirqb_routing" = "0x8a"
register "pirqc_routing" = "0x8b"
register "pirqd_routing" = "0x8b"
register "pirqe_routing" = "0x80"
register "pirqf_routing" = "0x80"
register "pirqg_routing" = "0x80"
register "pirqh_routing" = "0x80"
# EC range is 0x800-0x9ff
register "gen1_dec" = "0x00fc0801"
register "gen2_dec" = "0x00fc0901"
# EC_SMI is GPIO34
register "alt_gp_smi_en" = "0x0004"
register "gpe0_en_1" = "0x00000000"
# EC_SCI is GPIO36
register "gpe0_en_2" = "0x00000010"
register "gpe0_en_3" = "0x00000000"
register "gpe0_en_4" = "0x00000000"
register "sata_port_map" = "0x1"
register "sio_acpi_mode" = "0"
# Force enable ASPM for PCIe Port 1
register "pcie_port_force_aspm" = "0x01"
# Disable PCIe CLKOUT 1-5 and CLKOUT_XDP
register "icc_clock_disable" = "0x013e0000"
# Enable S0ix
register "s0ix_enable" = "1"
device cpu_cluster 0 on device cpu_cluster 0 on
chip cpu/intel/socket_rPGA989 device lapic 0 on end
device lapic 0 on end
end
chip cpu/intel/haswell
# Magic APIC ID to locate this chip
device lapic 0xACAC off end
register "c1_battery" = "2" # ACPI(C1) = MWAIT(C1E)
register "c2_battery" = "9" # ACPI(C2) = MWAIT(C7S)
register "c3_battery" = "12" # ACPI(C3) = MWAIT(C10)
register "c1_acpower" = "2" # ACPI(C1) = MWAIT(C1E)
register "c2_acpower" = "9" # ACPI(C2) = MWAIT(C7S)
register "c3_acpower" = "12" # ACPI(C3) = MWAIT(C10)
end
end end
device domain 0 on device domain 0 on
device pci 00.0 on end # host bridge device pci 00.0 on end # host bridge
device pci 02.0 on end # vga controller device pci 02.0 on end # vga controller
device pci 03.0 on end # mini-hd audio device pci 03.0 on end # mini-hd audio
device pci 13.0 on end # Smart Sound Audio DSP
chip southbridge/intel/lynxpoint device pci 14.0 on end # USB3 XHCI
register "pirqa_routing" = "0x8b" device pci 15.0 on end # Serial I/O DMA
register "pirqb_routing" = "0x8a" device pci 15.1 on end # I2C0
register "pirqc_routing" = "0x8b" device pci 15.2 on end # I2C1
register "pirqd_routing" = "0x8b" device pci 15.3 off end # GSPI0
register "pirqe_routing" = "0x80" device pci 15.4 off end # GSPI1
register "pirqf_routing" = "0x80" device pci 15.5 off end # UART0
register "pirqg_routing" = "0x80" device pci 15.6 off end # UART1
register "pirqh_routing" = "0x80" device pci 16.0 on end # Management Engine Interface 1
device pci 16.1 off end # Management Engine Interface 2
# EC range is 0x800-0x9ff device pci 16.2 off end # Management Engine IDE-R
register "gen1_dec" = "0x00fc0801" device pci 16.3 off end # Management Engine KT
register "gen2_dec" = "0x00fc0901" device pci 17.0 off end # SDIO
device pci 19.0 off end # GbE
# EC_SMI is GPIO34 device pci 1b.0 off end # High Definition Audio
register "alt_gp_smi_en" = "0x0004" device pci 1c.0 on end # PCIe Port #1
register "gpe0_en_1" = "0x00000000" device pci 1c.1 off end # PCIe Port #2
# EC_SCI is GPIO36 device pci 1c.2 off end # PCIe Port #3
register "gpe0_en_2" = "0x00000010" device pci 1c.3 off end # PCIe Port #4
register "gpe0_en_3" = "0x00000000" device pci 1c.4 off end # PCIe Port #5
register "gpe0_en_4" = "0x00000000" device pci 1c.5 off end # PCIe Port #6
device pci 1d.0 off end # USB2 EHCI
register "ide_legacy_combined" = "0x0" device pci 1e.0 off end # PCI bridge
register "sata_ahci" = "0x1" device pci 1f.0 on
register "sata_port_map" = "0x1" chip ec/google/chromeec
# We only have one init function that
register "sio_acpi_mode" = "0" # we need to call to initialize the
register "sio_i2c0_voltage" = "0" # 3.3V # keyboard part of the EC.
register "sio_i2c1_voltage" = "0" # 3.3V device pnp ff.1 on # dummy address
# Force enable ASPM for PCIe Port 1
register "pcie_port_force_aspm" = "0x01"
# Disable PCIe CLKOUT 1-5 and CLKOUT_XDP
register "icc_clock_disable" = "0x013e0000"
# Route all USB ports to XHCI per default
register "xhci_default" = "1"
device pci 13.0 on end # Smart Sound Audio DSP
device pci 14.0 on end # USB3 XHCI
device pci 15.0 on end # Serial I/O DMA
device pci 15.1 on end # I2C0
device pci 15.2 on end # I2C1
device pci 15.3 off end # GSPI0
device pci 15.4 off end # GSPI1
device pci 15.5 off end # UART0
device pci 15.6 off end # UART1
device pci 16.0 on end # Management Engine Interface 1
device pci 16.1 off end # Management Engine Interface 2
device pci 16.2 off end # Management Engine IDE-R
device pci 16.3 off end # Management Engine KT
device pci 17.0 off end # SDIO
device pci 19.0 off end # GbE
device pci 1b.0 off end # High Definition Audio
device pci 1c.0 on end # PCIe Port #1
device pci 1c.1 off end # PCIe Port #2
device pci 1c.2 off end # PCIe Port #3
device pci 1c.3 off end # PCIe Port #4
device pci 1c.4 off end # PCIe Port #5
device pci 1c.5 off end # PCIe Port #6
device pci 1d.0 on end # USB2 EHCI
device pci 1e.0 off end # PCI bridge
device pci 1f.0 on
chip ec/google/chromeec
# We only have one init function that
# we need to call to initialize the
# keyboard part of the EC.
device pnp ff.1 on # dummy address
end
end end
end # LPC bridge end
device pci 1f.2 on end # SATA Controller end # LPC bridge
device pci 1f.3 off end # SMBus device pci 1f.2 on end # SATA Controller
device pci 1f.6 on end # Thermal device pci 1f.3 off end # SMBus
end device pci 1f.6 on end # Thermal
end end
end end

View File

@ -31,22 +31,21 @@ DefinitionBlock(
{ {
// Some generic macros // Some generic macros
#include "acpi/platform.asl" #include "acpi/platform.asl"
#include "acpi/mainboard.asl"
// global NVS and variables // global NVS and variables
#include <southbridge/intel/lynxpoint/acpi/globalnvs.asl> #include <soc/intel/broadwell/acpi/globalnvs.asl>
// General Purpose Events // General Purpose Events
//#include "acpi/gpe.asl" //#include "acpi/gpe.asl"
// CPU // CPU
#include <cpu/intel/haswell/acpi/cpu.asl> #include <soc/intel/broadwell/acpi/cpu.asl>
Scope (\_SB) { Scope (\_SB) {
Device (PCI0) Device (PCI0)
{ {
#include <northbridge/intel/haswell/acpi/haswell.asl> #include <soc/intel/broadwell/acpi/systemagent.asl>
#include <southbridge/intel/lynxpoint/acpi/pch.asl> #include <soc/intel/broadwell/acpi/pch.asl>
} }
} }
@ -58,5 +57,8 @@ DefinitionBlock(
#include <vendorcode/google/chromeos/acpi/chromeos.asl> #include <vendorcode/google/chromeos/acpi/chromeos.asl>
// Chipset specific sleep states // Chipset specific sleep states
#include <southbridge/intel/lynxpoint/acpi/sleepstates.asl> #include <soc/intel/broadwell/acpi/sleepstates.asl>
// Mainboard specific
#include "acpi/mainboard.asl"
} }

View File

@ -2,6 +2,7 @@
* This file is part of the coreboot project. * This file is part of the coreboot project.
* *
* Copyright (C) 2007-2009 coresystems GmbH * Copyright (C) 2007-2009 coresystems GmbH
* Copyright (C) 2014 Google Inc.
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -18,20 +19,16 @@
*/ */
#include <string.h> #include <string.h>
#include <device/pci.h> #include <broadwell/acpi.h>
#include <arch/acpi.h>
#include <cpu/x86/smm.h>
#include <southbridge/intel/lynxpoint/pch.h>
void acpi_create_fadt(acpi_fadt_t * fadt, acpi_facs_t * facs, void *dsdt) void acpi_create_fadt(acpi_fadt_t * fadt, acpi_facs_t * facs, void *dsdt)
{ {
acpi_header_t *header = &(fadt->header); acpi_header_t *header = &(fadt->header);
u16 pmbase = get_pmbase();
memset((void *) fadt, 0, sizeof(acpi_fadt_t)); memset((void *) fadt, 0, sizeof(acpi_fadt_t));
memcpy(header->signature, "FACP", 4); memcpy(header->signature, "FACP", 4);
header->length = sizeof(acpi_fadt_t); header->length = sizeof(acpi_fadt_t);
header->revision = 3; header->revision = 5;
memcpy(header->oem_id, OEM_ID, 6); memcpy(header->oem_id, OEM_ID, 6);
memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8); memcpy(header->oem_table_id, ACPI_TABLE_CREATOR, 8);
memcpy(header->asl_compiler_id, ASLC, 4); memcpy(header->asl_compiler_id, ASLC, 4);
@ -42,114 +39,12 @@ void acpi_create_fadt(acpi_fadt_t * fadt, acpi_facs_t * facs, void *dsdt)
fadt->model = 1; fadt->model = 1;
fadt->preferred_pm_profile = PM_MOBILE; fadt->preferred_pm_profile = PM_MOBILE;
fadt->sci_int = 0x9;
fadt->smi_cmd = APM_CNT;
fadt->acpi_enable = APM_CNT_ACPI_ENABLE;
fadt->acpi_disable = APM_CNT_ACPI_DISABLE;
fadt->s4bios_req = 0x0;
fadt->pstate_cnt = 0;
fadt->pm1a_evt_blk = pmbase;
fadt->pm1b_evt_blk = 0x0;
fadt->pm1a_cnt_blk = pmbase + 0x4;
fadt->pm1b_cnt_blk = 0x0;
fadt->pm2_cnt_blk = pmbase + 0x50;
fadt->pm_tmr_blk = pmbase + 0x8;
fadt->gpe0_blk = pmbase + 0x80;
fadt->gpe1_blk = 0;
fadt->pm1_evt_len = 4;
fadt->pm1_cnt_len = 2;
fadt->pm2_cnt_len = 1;
fadt->pm_tmr_len = 4;
fadt->gpe0_blk_len = 32;
fadt->gpe1_blk_len = 0;
fadt->gpe1_base = 0;
fadt->cst_cnt = 0;
fadt->p_lvl2_lat = 1;
fadt->p_lvl3_lat = 87;
fadt->flush_size = 1024;
fadt->flush_stride = 16;
fadt->duty_offset = 1;
fadt->duty_width = 0;
fadt->day_alrm = 0xd;
fadt->mon_alrm = 0x00;
fadt->century = 0x00;
fadt->iapc_boot_arch = ACPI_FADT_LEGACY_DEVICES | ACPI_FADT_8042;
fadt->flags = ACPI_FADT_WBINVD | ACPI_FADT_C1_SUPPORTED |
ACPI_FADT_C2_MP_SUPPORTED | ACPI_FADT_SLEEP_BUTTON |
ACPI_FADT_RESET_REGISTER | ACPI_FADT_SEALED_CASE |
ACPI_FADT_S4_RTC_WAKE | ACPI_FADT_PLATFORM_CLOCK;
fadt->reset_reg.space_id = 1;
fadt->reset_reg.bit_width = 8;
fadt->reset_reg.bit_offset = 0;
fadt->reset_reg.resv = 0;
fadt->reset_reg.addrl = 0xcf9;
fadt->reset_reg.addrh = 0;
fadt->reset_value = 6;
fadt->x_firmware_ctl_l = (unsigned long)facs; fadt->x_firmware_ctl_l = (unsigned long)facs;
fadt->x_firmware_ctl_h = 0; fadt->x_firmware_ctl_h = 0;
fadt->x_dsdt_l = (unsigned long)dsdt; fadt->x_dsdt_l = (unsigned long)dsdt;
fadt->x_dsdt_h = 0; fadt->x_dsdt_h = 0;
fadt->x_pm1a_evt_blk.space_id = 1; acpi_fill_in_fadt(fadt);
fadt->x_pm1a_evt_blk.bit_width = 32;
fadt->x_pm1a_evt_blk.bit_offset = 0;
fadt->x_pm1a_evt_blk.resv = 0;
fadt->x_pm1a_evt_blk.addrl = pmbase;
fadt->x_pm1a_evt_blk.addrh = 0x0;
fadt->x_pm1b_evt_blk.space_id = 1;
fadt->x_pm1b_evt_blk.bit_width = 0;
fadt->x_pm1b_evt_blk.bit_offset = 0;
fadt->x_pm1b_evt_blk.resv = 0;
fadt->x_pm1b_evt_blk.addrl = 0x0;
fadt->x_pm1b_evt_blk.addrh = 0x0;
fadt->x_pm1a_cnt_blk.space_id = 1;
fadt->x_pm1a_cnt_blk.bit_width = 16;
fadt->x_pm1a_cnt_blk.bit_offset = 0;
fadt->x_pm1a_cnt_blk.resv = 0;
fadt->x_pm1a_cnt_blk.addrl = pmbase + 0x4;
fadt->x_pm1a_cnt_blk.addrh = 0x0;
fadt->x_pm1b_cnt_blk.space_id = 1;
fadt->x_pm1b_cnt_blk.bit_width = 0;
fadt->x_pm1b_cnt_blk.bit_offset = 0;
fadt->x_pm1b_cnt_blk.resv = 0;
fadt->x_pm1b_cnt_blk.addrl = 0x0;
fadt->x_pm1b_cnt_blk.addrh = 0x0;
fadt->x_pm2_cnt_blk.space_id = 1;
fadt->x_pm2_cnt_blk.bit_width = 8;
fadt->x_pm2_cnt_blk.bit_offset = 0;
fadt->x_pm2_cnt_blk.resv = 0;
fadt->x_pm2_cnt_blk.addrl = pmbase + 0x50;
fadt->x_pm2_cnt_blk.addrh = 0x0;
fadt->x_pm_tmr_blk.space_id = 1;
fadt->x_pm_tmr_blk.bit_width = 32;
fadt->x_pm_tmr_blk.bit_offset = 0;
fadt->x_pm_tmr_blk.resv = 0;
fadt->x_pm_tmr_blk.addrl = pmbase + 0x8;
fadt->x_pm_tmr_blk.addrh = 0x0;
fadt->x_gpe0_blk.space_id = 0;
fadt->x_gpe0_blk.bit_width = 0;
fadt->x_gpe0_blk.bit_offset = 0;
fadt->x_gpe0_blk.resv = 0;
fadt->x_gpe0_blk.addrl = 0;
fadt->x_gpe0_blk.addrh = 0x0;
fadt->x_gpe1_blk.space_id = 1;
fadt->x_gpe1_blk.bit_width = 0;
fadt->x_gpe1_blk.bit_offset = 0;
fadt->x_gpe1_blk.resv = 0;
fadt->x_gpe1_blk.addrl = 0x0;
fadt->x_gpe1_blk.addrh = 0x0;
header->checksum = header->checksum =
acpi_checksum((void *) fadt, header->length); acpi_checksum((void *) fadt, header->length);

View File

@ -20,105 +20,107 @@
#ifndef SAMUS_GPIO_H #ifndef SAMUS_GPIO_H
#define SAMUS_GPIO_H #define SAMUS_GPIO_H
struct pch_lp_gpio_map; #include <broadwell/gpio.h>
const struct pch_lp_gpio_map mainboard_gpio_map[] = { #define SAMUS_GPIO_PP3300_AUTOBAHN_EN 23
LP_GPIO_UNUSED, /* 0: UNUSED */
LP_GPIO_UNUSED, /* 1: UNUSED */ static const struct gpio_config mainboard_gpio_config[] = {
LP_GPIO_UNUSED, /* 2: UNUSED */ PCH_GPIO_UNUSED, /* 0: UNUSED */
LP_GPIO_UNUSED, /* 3: UNUSED */ PCH_GPIO_UNUSED, /* 1: UNUSED */
LP_GPIO_NATIVE, /* 4: NATIVE: I2C0_SDA_GPIO4 */ PCH_GPIO_UNUSED, /* 2: UNUSED */
LP_GPIO_NATIVE, /* 5: NATIVE: I2C0_SCL_GPIO5 */ PCH_GPIO_UNUSED, /* 3: UNUSED */
LP_GPIO_NATIVE, /* 6: NATIVE: I2C1_SDA_GPIO6 */ PCH_GPIO_NATIVE, /* 4: NATIVE: I2C0_SDA_GPIO4 */
LP_GPIO_NATIVE, /* 7: NATIVE: I2C1_SCL_GPIO7 */ PCH_GPIO_NATIVE, /* 5: NATIVE: I2C0_SCL_GPIO5 */
LP_GPIO_ACPI_SCI, /* 8: PCH_LTE_WAKE_L */ PCH_GPIO_NATIVE, /* 6: NATIVE: I2C1_SDA_GPIO6 */
LP_GPIO_IRQ_EDGE, /* 9: NFC_INT (GPIO IRQ) */ PCH_GPIO_NATIVE, /* 7: NATIVE: I2C1_SCL_GPIO7 */
LP_GPIO_ACPI_SCI, /* 10: PCH_WLAN_WAKE_L */ PCH_GPIO_ACPI_SCI, /* 8: PCH_LTE_WAKE_L */
LP_GPIO_UNUSED, /* 11: UNUSED */ PCH_GPIO_IRQ_EDGE, /* 9: NFC_INT (GPIO IRQ) */
LP_GPIO_UNUSED, /* 12: UNUSED */ PCH_GPIO_ACPI_SCI, /* 10: PCH_WLAN_WAKE_L */
LP_GPIO_PIRQ, /* 13: TRACKPAD_INT_L (PIRQL) */ PCH_GPIO_UNUSED, /* 11: UNUSED */
LP_GPIO_PIRQ, /* 14: TOUCH_INT_L (PIRQM) */ PCH_GPIO_UNUSED, /* 12: UNUSED */
LP_GPIO_UNUSED, /* 15: UNUSED (STRAP) */ PCH_GPIO_PIRQ, /* 13: TRACKPAD_INT_L (PIRQL) */
LP_GPIO_INPUT, /* 16: PCH_WP */ PCH_GPIO_PIRQ, /* 14: TOUCH_INT_L (PIRQM) */
LP_GPIO_UNUSED, /* 17: UNUSED */ PCH_GPIO_UNUSED, /* 15: UNUSED (STRAP) */
LP_GPIO_NATIVE, /* 18: PCIE_WLAN_CLKREQ_L */ PCH_GPIO_INPUT, /* 16: PCH_WP */
LP_GPIO_UNUSED, /* 19: UNUSED */ PCH_GPIO_UNUSED, /* 17: UNUSED */
LP_GPIO_UNUSED, /* 20: UNUSED */ PCH_GPIO_NATIVE, /* 18: PCIE_WLAN_CLKREQ_L */
LP_GPIO_OUT_HIGH, /* 21: PP3300_SSD_EN */ PCH_GPIO_UNUSED, /* 19: UNUSED */
LP_GPIO_UNUSED, /* 22: UNUSED */ PCH_GPIO_UNUSED, /* 20: UNUSED */
LP_GPIO_OUT_HIGH, /* 23: PP3300_AUTOBAHN_EN */ PCH_GPIO_OUT_HIGH, /* 21: PP3300_SSD_EN */
LP_GPIO_UNUSED, /* 24: UNUSED */ PCH_GPIO_UNUSED, /* 22: UNUSED */
LP_GPIO_INPUT, /* 25: EC_IN_RW */ PCH_GPIO_OUT_LOW, /* 23: PP3300_AUTOBAHN_EN */
LP_GPIO_OUT_HIGH, /* 26: NFC_EN */ PCH_GPIO_UNUSED, /* 24: UNUSED */
LP_GPIO_UNUSED, /* 27: UNUSED */ PCH_GPIO_INPUT, /* 25: EC_IN_RW */
LP_GPIO_UNUSED, /* 28: UNUSED */ PCH_GPIO_OUT_HIGH, /* 26: NFC_EN */
LP_GPIO_UNUSED, /* 29: UNUSED */ PCH_GPIO_UNUSED, /* 27: UNUSED */
LP_GPIO_NATIVE, /* 30: NATIVE: PCH_SUSWARN_L */ PCH_GPIO_UNUSED, /* 28: UNUSED */
LP_GPIO_NATIVE, /* 31: NATIVE: ACOK_BUF */ PCH_GPIO_UNUSED, /* 29: UNUSED */
LP_GPIO_NATIVE, /* 32: NATIVE: LPC_CLKRUN_L */ PCH_GPIO_NATIVE, /* 30: NATIVE: PCH_SUSWARN_L */
LP_GPIO_NATIVE, /* 33: NATIVE: SSD_DEVSLP */ PCH_GPIO_NATIVE, /* 31: NATIVE: ACOK_BUF */
LP_GPIO_ACPI_SMI, /* 34: EC_SMI_L */ PCH_GPIO_NATIVE, /* 32: NATIVE: LPC_CLKRUN_L */
LP_GPIO_ACPI_SMI, /* 35: PCH_NMI_DBG_L (route in NMI_EN) */ PCH_GPIO_NATIVE, /* 33: NATIVE: SSD_DEVSLP */
LP_GPIO_ACPI_SCI, /* 36: EC_SCI_L */ PCH_GPIO_ACPI_SMI, /* 34: EC_SMI_L */
LP_GPIO_UNUSED, /* 37: UNUSED */ PCH_GPIO_ACPI_SMI, /* 35: PCH_NMI_DBG_L (route in NMI_EN) */
LP_GPIO_UNUSED, /* 38: UNUSED */ PCH_GPIO_ACPI_SCI, /* 36: EC_SCI_L */
LP_GPIO_UNUSED, /* 39: UNUSED */ PCH_GPIO_UNUSED, /* 37: UNUSED */
LP_GPIO_NATIVE, /* 40: NATIVE: PCH_USB1_OC_L */ PCH_GPIO_UNUSED, /* 38: UNUSED */
LP_GPIO_NATIVE, /* 41: NATIVE: PCH_USB2_OC_L */ PCH_GPIO_UNUSED, /* 39: UNUSED */
LP_GPIO_OUT_HIGH, /* 42: WLAN_DISABLE_L */ PCH_GPIO_NATIVE, /* 40: NATIVE: PCH_USB1_OC_L */
LP_GPIO_OUT_HIGH, /* 43: PP1800_CODEC_EN */ PCH_GPIO_NATIVE, /* 41: NATIVE: PCH_USB2_OC_L */
LP_GPIO_OUT_HIGH, /* 44: CODEC_LDOENA */ PCH_GPIO_OUT_HIGH, /* 42: WLAN_DISABLE_L */
LP_GPIO_PIRQ, /* 45: ACCEL_INT (PIRQW) */ PCH_GPIO_OUT_HIGH, /* 43: PP1800_CODEC_EN */
LP_GPIO_PIRQ, /* 46: CODEC_INT_L (PIRQO) */ PCH_GPIO_OUT_HIGH, /* 44: CODEC_LDOENA */
LP_GPIO_PIRQ, /* 47: ACCEL_GYRO_INT (PIRQP) */ PCH_GPIO_PIRQ, /* 45: ACCEL_INT (PIRQW) */
LP_GPIO_UNUSED, /* 48: UNUSED */ PCH_GPIO_PIRQ, /* 46: CODEC_INT_L (PIRQO) */
LP_GPIO_INPUT, /* 49: HDMI_CEC */ PCH_GPIO_PIRQ, /* 47: ACCEL_GYRO_INT (PIRQP) */
LP_GPIO_UNUSED, /* 50: UNUSED */ PCH_GPIO_UNUSED, /* 48: UNUSED */
LP_GPIO_UNUSED, /* 51: UNUSED */ PCH_GPIO_INPUT, /* 49: HDMI_CEC */
LP_GPIO_INPUT, /* 52: SIM_DET */ PCH_GPIO_UNUSED, /* 50: UNUSED */
LP_GPIO_UNUSED, /* 53: UNUSED */ PCH_GPIO_UNUSED, /* 51: UNUSED */
LP_GPIO_UNUSED, /* 54: UNUSED */ PCH_GPIO_INPUT, /* 52: SIM_DET */
LP_GPIO_UNUSED, /* 55: UNUSED */ PCH_GPIO_UNUSED, /* 53: UNUSED */
LP_GPIO_UNUSED, /* 56: UNUSED */ PCH_GPIO_UNUSED, /* 54: UNUSED */
LP_GPIO_OUT_HIGH, /* 57: CODEC_RESET_L */ PCH_GPIO_UNUSED, /* 55: UNUSED */
LP_GPIO_UNUSED, /* 58: UNUSED */ PCH_GPIO_UNUSED, /* 56: UNUSED */
LP_GPIO_OUT_HIGH, /* 59: LTE_DISABLE_L */ PCH_GPIO_OUT_HIGH, /* 57: CODEC_RESET_L */
LP_GPIO_UNUSED, /* 60: UNUSED */ PCH_GPIO_UNUSED, /* 58: UNUSED */
LP_GPIO_NATIVE, /* 61: NATIVE: PCH_SUS_STAT */ PCH_GPIO_OUT_HIGH, /* 59: LTE_DISABLE_L */
LP_GPIO_NATIVE, /* 62: NATIVE: PCH_SUSCLK */ PCH_GPIO_UNUSED, /* 60: UNUSED */
LP_GPIO_NATIVE, /* 63: NATIVE: PCH_SLP_S5_L */ PCH_GPIO_NATIVE, /* 61: NATIVE: PCH_SUS_STAT */
LP_GPIO_OUT_LOW, /* 64: NFC_FW_UPDATE */ PCH_GPIO_NATIVE, /* 62: NATIVE: PCH_SUSCLK */
LP_GPIO_INPUT, /* 65: MINIDP_PWR_FLT_L */ PCH_GPIO_NATIVE, /* 63: NATIVE: PCH_SS5_L */
LP_GPIO_OUT_HIGH, /* 66: MINIDP_PWR_EN */ PCH_GPIO_OUT_LOW, /* 64: NFC_FW_UPDATE */
LP_GPIO_INPUT, /* 67: RAM_ID0 */ PCH_GPIO_INPUT, /* 65: MINIDP_PWR_FLT_L */
LP_GPIO_INPUT, /* 68: RAM_ID1 */ PCH_GPIO_OUT_HIGH, /* 66: MINIDP_PWR_EN */
LP_GPIO_INPUT, /* 69: RAM_ID2 */ PCH_GPIO_INPUT, /* 67: RAM_ID0 */
LP_GPIO_OUT_HIGH, /* 70: LTE_POWER_ON */ PCH_GPIO_INPUT, /* 68: RAM_ID1 */
LP_GPIO_NATIVE, /* 71: NATIVE: MODPHY_EN */ PCH_GPIO_INPUT, /* 69: RAM_ID2 */
LP_GPIO_UNUSED, /* 72: UNUSED */ PCH_GPIO_OUT_HIGH, /* 70: LTE_POWER_ON */
LP_GPIO_UNUSED, /* 73: UNUSED */ PCH_GPIO_NATIVE, /* 71: NATIVE: MODPHY_EN */
LP_GPIO_UNUSED, /* 74: UNUSED */ PCH_GPIO_UNUSED, /* 72: UNUSED */
LP_GPIO_UNUSED, /* 75: UNUSED */ PCH_GPIO_UNUSED, /* 73: UNUSED */
LP_GPIO_UNUSED, /* 76: UNUSED */ PCH_GPIO_UNUSED, /* 74: UNUSED */
LP_GPIO_UNUSED, /* 77: UNUSED */ PCH_GPIO_UNUSED, /* 75: UNUSED */
LP_GPIO_UNUSED, /* 78: UNUSED */ PCH_GPIO_UNUSED, /* 76: UNUSED */
LP_GPIO_UNUSED, /* 79: UNUSED */ PCH_GPIO_UNUSED, /* 77: UNUSED */
LP_GPIO_UNUSED, /* 80: UNUSED */ PCH_GPIO_UNUSED, /* 78: UNUSED */
LP_GPIO_UNUSED, /* 81: UNUSED */ PCH_GPIO_UNUSED, /* 79: UNUSED */
LP_GPIO_NATIVE, /* 82: NATIVE: EC_RCIN_L */ PCH_GPIO_UNUSED, /* 80: UNUSED */
LP_GPIO_UNUSED, /* 83: UNUSED */ PCH_GPIO_UNUSED, /* 81: UNUSED */
LP_GPIO_UNUSED, /* 84: UNUSED */ PCH_GPIO_NATIVE, /* 82: NATIVE: EC_RCIN_L */
LP_GPIO_UNUSED, /* 85: UNUSED */ PCH_GPIO_UNUSED, /* 83: UNUSED */
LP_GPIO_UNUSED, /* 86: UNUSED (STRAP) */ PCH_GPIO_UNUSED, /* 84: UNUSED */
LP_GPIO_UNUSED, /* 87: UNUSED */ PCH_GPIO_UNUSED, /* 85: UNUSED */
LP_GPIO_UNUSED, /* 88: UNUSED */ PCH_GPIO_UNUSED, /* 86: UNUSED (STRAP) */
LP_GPIO_OUT_HIGH, /* 89: PP3300_SD_EN */ PCH_GPIO_UNUSED, /* 87: UNUSED */
LP_GPIO_UNUSED, /* 90: UNUSED */ PCH_GPIO_UNUSED, /* 88: UNUSED */
LP_GPIO_NATIVE, /* 91: NATIVE: UART0_PCHRX_BTTX */ PCH_GPIO_OUT_HIGH, /* 89: PP3300_SD_EN */
LP_GPIO_NATIVE, /* 92: NATIVE: UART0_PCHTX_BTRX */ PCH_GPIO_UNUSED, /* 90: UNUSED */
LP_GPIO_NATIVE, /* 93: NATIVE: UART0_PCHRTS_BTCTS_L */ PCH_GPIO_NATIVE, /* 91: NATIVE: UART0_PCHRX_BTTX */
LP_GPIO_NATIVE, /* 94: NATIVE: UART0_PCHCTS_BTRTS_L */ PCH_GPIO_NATIVE, /* 92: NATIVE: UART0_PCHTX_BTRX */
LP_GPIO_END PCH_GPIO_NATIVE, /* 93: NATIVE: UART0_PCHRTS_BTCTS_L */
PCH_GPIO_NATIVE, /* 94: NATIVE: UART0_PCHCTS_BTRTS_L */
PCH_GPIO_END
}; };
#endif #endif

View File

@ -32,16 +32,9 @@
#include <arch/io.h> #include <arch/io.h>
#include <arch/interrupt.h> #include <arch/interrupt.h>
#include <boot/coreboot_tables.h> #include <boot/coreboot_tables.h>
#include <southbridge/intel/lynxpoint/pch.h>
#include "ec.h" #include "ec.h"
#include "onboard.h" #include "onboard.h"
void mainboard_suspend_resume(void)
{
/* Call SMM finalize() handlers before resume */
outb(0xcb, 0xb2);
}
static void mainboard_init(device_t dev) static void mainboard_init(device_t dev)
{ {
mainboard_ec_init(); mainboard_ec_init();

View File

@ -0,0 +1,81 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2014 Google Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#include <string.h>
#include <broadwell/gpio.h>
#include <broadwell/pei_data.h>
#include <broadwell/pei_wrapper.h>
void mainboard_fill_pei_data(struct pei_data *pei_data)
{
/* DQ byte map for Samus board */
const u8 dq_map[2][6][2] = {
{ { 0x0F, 0xF0 }, { 0x00, 0xF0 }, { 0x0F, 0xF0 },
{ 0x0F, 0x00 }, { 0xFF, 0x00 }, { 0xFF, 0x00 } },
{ { 0x0F, 0xF0 }, { 0x00, 0xF0 }, { 0x0F, 0xF0 },
{ 0x0F, 0x00 }, { 0xFF, 0x00 }, { 0xFF, 0x00 } } };
/* DQS CPU<>DRAM map for Samus board */
const u8 dqs_map[2][8] = {
{ 2, 0, 1, 3, 6, 4, 7, 5 },
{ 2, 1, 0, 3, 6, 5, 4, 7 } };
pei_data->ec_present = 1;
/* One installed DIMM per channel */
pei_data->dimm_channel0_disabled = 2;
pei_data->dimm_channel1_disabled = 2;
memcpy(pei_data->dq_map, dq_map, sizeof(dq_map));
memcpy(pei_data->dqs_map, dqs_map, sizeof(dqs_map));
/* P0: HOST PORT */
pei_data_usb2_port(pei_data, 0, 0x0080, 1, 0,
USB_PORT_BACK_PANEL);
/* P1: HOST PORT */
pei_data_usb2_port(pei_data, 1, 0x0080, 1, 1,
USB_PORT_BACK_PANEL);
/* P2: EMPTY */
pei_data_usb2_port(pei_data, 2, 0x0000, 0, USB_OC_PIN_SKIP,
USB_PORT_SKIP);
/* P3: SD CARD */
pei_data_usb2_port(pei_data, 3, 0x0040, 0, USB_OC_PIN_SKIP,
USB_PORT_INTERNAL);
/* P4: EMPTY */
pei_data_usb2_port(pei_data, 4, 0x0000, 0, USB_OC_PIN_SKIP,
USB_PORT_SKIP);
/* P5: WWAN */
pei_data_usb2_port(pei_data, 5, 0x0040, 1, USB_OC_PIN_SKIP,
USB_PORT_INTERNAL);
/* P6: CAMERA */
pei_data_usb2_port(pei_data, 6, 0x0040, 1, USB_OC_PIN_SKIP,
USB_PORT_INTERNAL);
/* P7: BT */
pei_data_usb2_port(pei_data, 7, 0x0040, 1, USB_OC_PIN_SKIP,
USB_PORT_INTERNAL);
/* P1: HOST PORT */
pei_data_usb3_port(pei_data, 0, 1, 0, 0);
/* P2: HOST PORT */
pei_data_usb3_port(pei_data, 1, 1, 1, 0);
/* P3: EMPTY */
pei_data_usb3_port(pei_data, 2, 0, USB_OC_PIN_SKIP, 0);
/* P4: SD CARD */
pei_data_usb3_port(pei_data, 3, 0, USB_OC_PIN_SKIP, 0);
}

View File

@ -18,151 +18,40 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <cbfs.h> #include <cbfs.h>
#include <console/console.h> #include <console/console.h>
#include <cpu/intel/haswell/haswell.h> #include <string.h>
#include <northbridge/intel/haswell/haswell.h> #include <ec/google/chromeec/ec.h>
#include <northbridge/intel/haswell/raminit.h> //#include <broadwell/gpio.h>
#include <southbridge/intel/lynxpoint/pch.h> #include <broadwell/pei_data.h>
#include <southbridge/intel/lynxpoint/lp_gpio.h> #include <broadwell/pei_wrapper.h>
#include <broadwell/romstage.h>
#include "spd.h"
#include "gpio.h" #include "gpio.h"
const struct rcba_config_instruction rcba_config[] = { void mainboard_romstage_entry(struct romstage_params *rp)
{
struct pei_data pei_data;
post_code(0x32);
/* Ensure the EC is in the right mode for recovery */
google_chromeec_early_init();
/* Initialize GPIOs */
init_gpios(mainboard_gpio_config);
/* Fill out PEI DATA */
memset(&pei_data, 0, sizeof(pei_data));
mainboard_fill_pei_data(&pei_data);
mainboard_fill_spd_data(&pei_data);
rp->pei_data = &pei_data;
romstage_common(rp);
/* /*
* GFX INTA -> PIRQA (MSI) * Enable PP3300_AUTOBAHN_EN after initial GPIO setup
* D28IP_P1IP PCIE INTA -> PIRQA * to prevent possible brownout.
* D29IP_E1P EHCI INTA -> PIRQD
* D20IP_XHCI XHCI INTA -> PIRQC (MSI)
* D31IP_SIP SATA INTA -> PIRQF (MSI)
* D31IP_SMIP SMBUS INTB -> PIRQG
* D31IP_TTIP THRT INTC -> PIRQA
* D27IP_ZIP HDA INTA -> PIRQG (MSI)
*/ */
set_gpio(SAMUS_GPIO_PP3300_AUTOBAHN_EN, GPIO_OUT_HIGH);
/* Device interrupt pin register (board specific) */
RCBA_SET_REG_32(D31IP, (INTC << D31IP_TTIP) | (NOINT << D31IP_SIP2) |
(INTB << D31IP_SMIP) | (INTA << D31IP_SIP)),
RCBA_SET_REG_32(D29IP, (INTA << D29IP_E1P)),
RCBA_SET_REG_32(D28IP, (INTA << D28IP_P1IP) | (INTC << D28IP_P3IP) |
(INTB << D28IP_P4IP)),
RCBA_SET_REG_32(D27IP, (INTA << D27IP_ZIP)),
RCBA_SET_REG_32(D26IP, (INTA << D26IP_E2P)),
RCBA_SET_REG_32(D22IP, (NOINT << D22IP_MEI1IP)),
RCBA_SET_REG_32(D20IP, (INTA << D20IP_XHCI)),
/* Device interrupt route registers */
RCBA_SET_REG_32(D31IR, DIR_ROUTE(PIRQG, PIRQC, PIRQB, PIRQA)),/* LPC */
RCBA_SET_REG_32(D29IR, DIR_ROUTE(PIRQD, PIRQD, PIRQD, PIRQD)),/* EHCI */
RCBA_SET_REG_32(D28IR, DIR_ROUTE(PIRQA, PIRQB, PIRQC, PIRQD)),/* PCIE */
RCBA_SET_REG_32(D27IR, DIR_ROUTE(PIRQG, PIRQG, PIRQG, PIRQG)),/* HDA */
RCBA_SET_REG_32(D22IR, DIR_ROUTE(PIRQA, PIRQA, PIRQA, PIRQA)),/* ME */
RCBA_SET_REG_32(D21IR, DIR_ROUTE(PIRQE, PIRQF, PIRQF, PIRQF)),/* SIO */
RCBA_SET_REG_32(D20IR, DIR_ROUTE(PIRQC, PIRQC, PIRQC, PIRQC)),/* XHCI */
RCBA_SET_REG_32(D23IR, DIR_ROUTE(PIRQH, PIRQH, PIRQH, PIRQH)),/* SDIO */
/* Disable unused devices (board specific) */
RCBA_RMW_REG_32(FD, ~0, PCH_DISABLE_ALWAYS),
RCBA_END_CONFIG,
};
/* Copy SPD data for on-board memory */
static void copy_spd(struct pei_data *peid)
{
const int gpio_vector[] = {67, 68, 69, -1};
int spd_index = get_gpios(gpio_vector);
char *spd_file;
size_t spd_file_len;
printk(BIOS_DEBUG, "SPD index %d\n", spd_index);
spd_file = cbfs_get_file_content(CBFS_DEFAULT_MEDIA, "spd.bin", 0xab,
&spd_file_len);
if (!spd_file)
die("SPD data not found.");
if (spd_file_len <
((spd_index + 1) * sizeof(peid->spd_data[0]))) {
printk(BIOS_ERR, "SPD index override to 0 - old hardware?\n");
spd_index = 0;
}
if (spd_file_len < sizeof(peid->spd_data[0]))
die("Missing SPD data.");
memcpy(peid->spd_data[0],
spd_file +
spd_index * sizeof(peid->spd_data[0]),
sizeof(peid->spd_data[0]));
}
void mainboard_romstage_entry(unsigned long bist)
{
struct pei_data pei_data = {
.pei_version = PEI_VERSION,
.mchbar = DEFAULT_MCHBAR,
.dmibar = DEFAULT_DMIBAR,
.epbar = DEFAULT_EPBAR,
.pciexbar = DEFAULT_PCIEXBAR,
.smbusbar = SMBUS_IO_BASE,
.wdbbar = 0x4000000,
.wdbsize = 0x1000,
.hpet_address = HPET_ADDR,
.rcba = DEFAULT_RCBA,
.pmbase = DEFAULT_PMBASE,
.gpiobase = DEFAULT_GPIOBASE,
.temp_mmio_base = 0xfed08000,
.system_type = 5, /* ULT */
.tseg_size = CONFIG_SMM_TSEG_SIZE,
.spd_addresses = { 0xff, 0x00, 0xff, 0x00 },
.ec_present = 1,
// 0 = leave channel enabled
// 1 = disable dimm 0 on channel
// 2 = disable dimm 1 on channel
// 3 = disable dimm 0+1 on channel
.dimm_channel0_disabled = 2,
.dimm_channel1_disabled = 2,
.max_ddr3_freq = 1600,
.usb_xhci_on_resume = 1,
.usb2_ports = {
/* Length, Enable, OCn#, Location */
{ 0x0080, 1, 0, /* P0: HOST PORT */
USB_PORT_BACK_PANEL },
{ 0x0080, 1, 1, /* P1: HOST PORT */
USB_PORT_BACK_PANEL },
{ 0x0000, 0, USB_OC_PIN_SKIP, /* P2: EMPTY */
USB_PORT_SKIP },
{ 0x0040, 1, USB_OC_PIN_SKIP, /* P3: SD CARD */
USB_PORT_INTERNAL },
{ 0x0000, 0, USB_OC_PIN_SKIP, /* P4: EMPTY */
USB_PORT_SKIP },
{ 0x0040, 1, USB_OC_PIN_SKIP, /* P5: WWAN */
USB_PORT_INTERNAL },
{ 0x0040, 1, USB_OC_PIN_SKIP, /* P6: CAMERA */
USB_PORT_INTERNAL },
{ 0x0040, 1, USB_OC_PIN_SKIP, /* P7: BT */
USB_PORT_INTERNAL },
},
.usb3_ports = {
/* Enable, OCn# */
{ 1, 0 }, /* P1: HOST PORT */
{ 1, 1 }, /* P2: HOST PORT */
{ 0, USB_OC_PIN_SKIP }, /* P3: EMPTY */
{ 1, USB_OC_PIN_SKIP }, /* P4: SD CARD */
},
};
struct romstage_params romstage_params = {
.pei_data = &pei_data,
.gpio_map = &mainboard_gpio_map,
.rcba_config = &rcba_config[0],
.bist = bist,
.copy_spd = copy_spd,
};
/* Call into the real romstage main with this board's attributes. */
romstage_common(&romstage_params);
} }

View File

@ -21,16 +21,15 @@
#include <arch/io.h> #include <arch/io.h>
#include <console/console.h> #include <console/console.h>
#include <cpu/x86/smm.h> #include <cpu/x86/smm.h>
#include <southbridge/intel/lynxpoint/lp_gpio.h> #include <broadwell/pm.h>
#include <southbridge/intel/lynxpoint/nvs.h> #include <broadwell/smm.h>
#include <southbridge/intel/lynxpoint/pch.h>
#include <southbridge/intel/lynxpoint/me.h>
#include <northbridge/intel/haswell/haswell.h>
#include <cpu/intel/haswell/haswell.h>
#include <elog.h> #include <elog.h>
/* Include EC functions */
#include <ec/google/chromeec/ec.h> #include <ec/google/chromeec/ec.h>
#include <broadwell/gpio.h>
#include <broadwell/iomap.h>
#include <broadwell/nvs.h>
#include <broadwell/pm.h>
#include <broadwell/smm.h>
#include "ec.h" #include "ec.h"
/* GPIO46 controls the WLAN_DISABLE_L signal. */ /* GPIO46 controls the WLAN_DISABLE_L signal. */
@ -74,9 +73,9 @@ static u8 mainboard_smi_ec(void)
printk(BIOS_DEBUG, "LID CLOSED, SHUTDOWN\n"); printk(BIOS_DEBUG, "LID CLOSED, SHUTDOWN\n");
/* Go to S5 */ /* Go to S5 */
pm1_cnt = inl(get_pmbase() + PM1_CNT); pm1_cnt = inl(ACPI_BASE_ADDRESS + PM1_CNT);
pm1_cnt |= (0xf << 10); pm1_cnt |= (0xf << 10);
outl(pm1_cnt, get_pmbase() + PM1_CNT); outl(pm1_cnt, ACPI_BASE_ADDRESS + PM1_CNT);
break; break;
} }
@ -97,12 +96,12 @@ void mainboard_smi_sleep(u8 slp_typ)
/* Disable USB charging if required */ /* Disable USB charging if required */
switch (slp_typ) { switch (slp_typ) {
case 3: case 3:
if (smm_get_gnvs()->s3u0 == 0) if (smm_get_gnvs()->s3u0 == 0) {
google_chromeec_set_usb_charge_mode( google_chromeec_set_usb_charge_mode(
0, USB_CHARGE_MODE_DISABLED); 0, USB_CHARGE_MODE_DISABLED);
if (smm_get_gnvs()->s3u1 == 0)
google_chromeec_set_usb_charge_mode( google_chromeec_set_usb_charge_mode(
1, USB_CHARGE_MODE_DISABLED); 1, USB_CHARGE_MODE_DISABLED);
}
/* Prevent leak from standby rail to WLAN rail in S3. */ /* Prevent leak from standby rail to WLAN rail in S3. */
set_gpio(GPIO_WLAN_DISABLE_L, 0); set_gpio(GPIO_WLAN_DISABLE_L, 0);
@ -113,12 +112,12 @@ void mainboard_smi_sleep(u8 slp_typ)
google_chromeec_set_wake_mask(MAINBOARD_EC_S3_WAKE_EVENTS); google_chromeec_set_wake_mask(MAINBOARD_EC_S3_WAKE_EVENTS);
break; break;
case 5: case 5:
if (smm_get_gnvs()->s5u0 == 0) if (smm_get_gnvs()->s5u0 == 0) {
google_chromeec_set_usb_charge_mode( google_chromeec_set_usb_charge_mode(
0, USB_CHARGE_MODE_DISABLED); 0, USB_CHARGE_MODE_DISABLED);
if (smm_get_gnvs()->s5u1 == 0)
google_chromeec_set_usb_charge_mode( google_chromeec_set_usb_charge_mode(
1, USB_CHARGE_MODE_DISABLED); 1, USB_CHARGE_MODE_DISABLED);
}
/* Prevent leak from standby rail to WLAN rail in S5. */ /* Prevent leak from standby rail to WLAN rail in S5. */
set_gpio(GPIO_WLAN_DISABLE_L, 0); set_gpio(GPIO_WLAN_DISABLE_L, 0);
@ -138,25 +137,9 @@ void mainboard_smi_sleep(u8 slp_typ)
while (google_chromeec_get_event() != 0); while (google_chromeec_get_event() != 0);
} }
#define APMC_FINALIZE 0xcb
static int mainboard_finalized = 0;
int mainboard_smi_apmc(u8 apmc) int mainboard_smi_apmc(u8 apmc)
{ {
switch (apmc) { switch (apmc) {
case APMC_FINALIZE:
if (mainboard_finalized) {
printk(BIOS_DEBUG, "SMI#: Already finalized\n");
return 0;
}
intel_pch_finalize_smm();
intel_northbridge_haswell_finalize_smm();
intel_cpu_haswell_finalize_smm();
mainboard_finalized = 1;
break;
case APM_CNT_ACPI_ENABLE: case APM_CNT_ACPI_ENABLE:
google_chromeec_set_smi_mask(0); google_chromeec_set_smi_mask(0);
/* Clear all pending events */ /* Clear all pending events */

View File

@ -0,0 +1,121 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2014 Google Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <arch/byteorder.h>
#include <cbfs.h>
#include <console/console.h>
#include <string.h>
#include <broadwell/gpio.h>
#include <broadwell/pei_data.h>
#include <broadwell/romstage.h>
#include "gpio.h"
#include "spd.h"
static void mainboard_print_spd_info(uint8_t spd[])
{
const int spd_banks[8] = { 8, 16, 32, 64, -1, -1, -1, -1 };
const int spd_capmb[8] = { 1, 2, 4, 8, 16, 32, 64, 0 };
const int spd_rows[8] = { 12, 13, 14, 15, 16, -1, -1, -1 };
const int spd_cols[8] = { 9, 10, 11, 12, -1, -1, -1, -1 };
const int spd_ranks[8] = { 1, 2, 3, 4, -1, -1, -1, -1 };
const int spd_devw[8] = { 4, 8, 16, 32, -1, -1, -1, -1 };
const int spd_busw[8] = { 8, 16, 32, 64, -1, -1, -1, -1 };
char spd_name[SPD_PART_LEN+1] = { 0 };
int banks = spd_banks[(spd[SPD_DENSITY_BANKS] >> 4) & 7];
int capmb = spd_capmb[spd[SPD_DENSITY_BANKS] & 7] * 256;
int rows = spd_rows[(spd[SPD_ADDRESSING] >> 3) & 7];
int cols = spd_cols[spd[SPD_ADDRESSING] & 7];
int ranks = spd_ranks[(spd[SPD_ORGANIZATION] >> 3) & 7];
int devw = spd_devw[spd[SPD_ORGANIZATION] & 7];
int busw = spd_busw[spd[SPD_BUS_DEV_WIDTH] & 7];
/* Module type */
printk(BIOS_INFO, "SPD: module type is ");
switch (spd[SPD_DRAM_TYPE]) {
case SPD_DRAM_DDR3:
printk(BIOS_INFO, "DDR3\n");
break;
case SPD_DRAM_LPDDR3:
printk(BIOS_INFO, "LPDDR3\n");
break;
default:
printk(BIOS_INFO, "Unknown (%02x)\n", spd[SPD_DRAM_TYPE]);
break;
}
/* Module Part Number */
memcpy(spd_name, &spd[SPD_PART_OFF], SPD_PART_LEN);
spd_name[SPD_PART_LEN] = 0;
printk(BIOS_INFO, "SPD: module part is %s\n", spd_name);
printk(BIOS_INFO, "SPD: banks %d, ranks %d, rows %d, columns %d, "
"density %d Mb\n", banks, ranks, rows, cols, capmb);
printk(BIOS_INFO, "SPD: device width %d bits, bus width %d bits\n",
devw, busw);
if (capmb > 0 && busw > 0 && devw > 0 && ranks > 0) {
/* SIZE = DENSITY / 8 * BUS_WIDTH / SDRAM_WIDTH * RANKS */
printk(BIOS_INFO, "SPD: module size is %u MB (per channel)\n",
capmb / 8 * busw / devw * ranks);
}
}
/* Copy SPD data for on-board memory */
void mainboard_fill_spd_data(struct pei_data *pei_data)
{
int spd_gpio[3];
int spd_index;
int spd_file_len;
struct cbfs_file *spd_file;
spd_gpio[0] = get_gpio(SPD_GPIO_BIT0);
spd_gpio[1] = get_gpio(SPD_GPIO_BIT1);
spd_gpio[2] = get_gpio(SPD_GPIO_BIT2);
spd_index = spd_gpio[2] << 2 | spd_gpio[1] << 1 | spd_gpio[0];
printk(BIOS_DEBUG, "SPD: index %d (GPIO%d=%d GPIO%d=%d GPIO%d=%d)\n",
spd_index,
SPD_GPIO_BIT2, spd_gpio[2],
SPD_GPIO_BIT1, spd_gpio[1],
SPD_GPIO_BIT0, spd_gpio[0]);
spd_file = cbfs_get_file(CBFS_DEFAULT_MEDIA, "spd.bin");
if (!spd_file)
die("SPD data not found.");
spd_file_len = ntohl(spd_file->len);
if (spd_file_len < ((spd_index + 1) * SPD_LEN)) {
printk(BIOS_ERR, "SPD index override to 0 - old hardware?\n");
spd_index = 0;
}
if (spd_file_len < SPD_LEN)
die("Missing SPD data.");
/* Assume same memory in both channels */
spd_index *= SPD_LEN;
memcpy(pei_data->spd_data[0][0],
((char*)CBFS_SUBHEADER(spd_file)) + spd_index, SPD_LEN);
memcpy(pei_data->spd_data[1][0],
((char*)CBFS_SUBHEADER(spd_file)) + spd_index, SPD_LEN);
mainboard_print_spd_info(pei_data->spd_data[0][0]);
}

View File

@ -0,0 +1,43 @@
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2014 Google Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef MAINBOARD_SPD_H
#define MAINBOARD_SPD_H
#define SPD_LEN 256
#define SPD_DRAM_TYPE 2
#define SPD_DRAM_DDR3 0x0b
#define SPD_DRAM_LPDDR3 0xf1
#define SPD_DENSITY_BANKS 4
#define SPD_ADDRESSING 5
#define SPD_ORGANIZATION 7
#define SPD_BUS_DEV_WIDTH 8
#define SPD_PART_OFF 128
#define SPD_PART_LEN 18
/* Samus board memory configuration GPIOs */
#define SPD_GPIO_BIT0 67
#define SPD_GPIO_BIT1 68
#define SPD_GPIO_BIT2 69
struct pei_data;
void mainboard_fill_spd_data(struct pei_data *pei_data);
#endif

View File

@ -22,9 +22,6 @@
#define TEMPERATURE_SENSOR_ID 0 /* PECI */ #define TEMPERATURE_SENSOR_ID 0 /* PECI */
/* Power level to set when EC requests throttle */
#define EC_THROTTLE_POWER_LIMIT 12 /* 12W */
/* Temperature which OS will shutdown at */ /* Temperature which OS will shutdown at */
#define CRITICAL_TEMPERATURE 99 #define CRITICAL_TEMPERATURE 99