diff options
author | Matt DeVillier <matt.devillier@gmail.com> | 2017-08-20 14:48:57 -0500 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2017-09-15 02:36:13 +0000 |
commit | e69a9c75816dd3cd6a9af50a09eb090ea00cfed4 (patch) | |
tree | 63f4440d3739a1e1efe266572f3c2e8a9e7455b5 /src/mainboard/google/cyan/spd | |
parent | 982688a41ae91218fbb2cfbdb8ff19005ffce0f9 (diff) |
google/cyan: convert to variant configuration
Setup cyan to be the baseboard for other Google Braswell
boards, to be added in subsequent commits:
- Keep code common to all Google Braswell boards in the baseboard,
and separate out the board-specific bits into the new cyan variant.
- Define the I2C ACPI devices such that they can be easily reused for
other variants.
- Switch the trackpad/touchscreen interrupts from edge to level,
for better performance/compatibility, as was done with all previous
Google boards.
- Add code to the baseboard to allow optional variant-specific
parameters to be used for both memory and silicon init.
- Remove superfluous includes, replace some hardcoded values with
variables, and correct typos/formatting errors.
Change-Id: Iabbbad16efa9cfa79338f4e94d0771779900d8d9
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-on: https://review.coreboot.org/21126
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Diffstat (limited to 'src/mainboard/google/cyan/spd')
-rw-r--r-- | src/mainboard/google/cyan/spd/Makefile.inc | 42 | ||||
-rw-r--r-- | src/mainboard/google/cyan/spd/spd.c | 67 | ||||
-rw-r--r-- | src/mainboard/google/cyan/spd/spd_util.h | 22 |
3 files changed, 38 insertions, 93 deletions
diff --git a/src/mainboard/google/cyan/spd/Makefile.inc b/src/mainboard/google/cyan/spd/Makefile.inc deleted file mode 100644 index f5960863ae..0000000000 --- a/src/mainboard/google/cyan/spd/Makefile.inc +++ /dev/null @@ -1,42 +0,0 @@ -## -## This file is part of the coreboot project. -## -## Copyright (C) 2013 Google Inc. -## Copyright (C) 2015 Intel Corp. -## -## 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. -## - -romstage-y += spd.c - -SPD_BIN = $(obj)/spd.bin - -SPD_SOURCES = samsung_2GiB_dimm_K4B4G1646Q-HYK0 -SPD_SOURCES += hynix_2GiB_dimm_HMT425S6CFR6A_H5TC4G63CFR -SPD_SOURCES += samsung_2GiB_dimm_K4B4G1646Q-HYK0 -SPD_SOURCES += hynix_2GiB_dimm_HMT425S6CFR6A_H5TC4G63CFR -SPD_SOURCES += samsung_2GiB_dimm_K4B4G1646E-BYK0 -SPD_SOURCES += micron_2GiB_dimm_MT41K256M16TW-107 -SPD_SOURCES += samsung_2GiB_dimm_K4B4G1646E-BYK0 -SPD_SOURCES += micron_2GiB_dimm_MT41K256M16TW-107 - -SPD_DEPS := $(foreach f, $(SPD_SOURCES), src/mainboard/$(MAINBOARDDIR)/spd/$(f).spd.hex) - -# Include spd ROM data -$(SPD_BIN): $(SPD_DEPS) - for f in $+; \ - do for c in $$(cat $$f | grep -v ^#); \ - do printf $$(printf '\%o' 0x$$c); \ - done; \ - done > $@ - -cbfs-files-y += spd.bin -spd.bin-file := $(SPD_BIN) -spd.bin-type := spd diff --git a/src/mainboard/google/cyan/spd/spd.c b/src/mainboard/google/cyan/spd/spd.c index 0c0d4f5651..f38fc58ff8 100644 --- a/src/mainboard/google/cyan/spd/spd.c +++ b/src/mainboard/google/cyan/spd/spd.c @@ -26,24 +26,10 @@ #include <soc/romstage.h> #include <string.h> #include <spd_bin.h> +#include "spd_util.h" -/* - * 0b0000 - 4GiB total - 2 x 2GiB Samsung K4B4G1646Q-HYK0 1600MHz - * 0b0001 - 4GiB total - 2 x 2GiB Hynix H5TC4G63CFR-PBA 1600MHz - * 0b0010 - 2GiB total - 1 x 2GiB Samsung K4B4G1646Q-HYK0 1600MHz - * 0b0011 - 2GiB total - 1 x 2GiB Hynix H5TC4G63CFR-PBA 1600MHz - * 0b0100 - 4GiB total - 2 x 2GiB Samsung K4B4G1646E-BYK0 1600MHz - * 0b0101 - 4GiB total - 2 x 2GiB Micro MT41K256M16TW-107 1600MHz - * 0b0110 - 2GiB total - 1 x 2GiB Samsung K4B4G1646E-BYK0 1600MHz - * 0b0111 - 2GiB total - 1 x 2GiB Micro MT41K256M16TW-107 1600MHz - */ -static const uint32_t dual_channel_config = (1 << 0) | (1 << 1) - | (1 << 4) | (1 << 5); - -static void *get_spd_pointer(char *spd_file_content, int total_spds, int *dual) +__attribute__ ((weak)) uint8_t get_ramid(void) { - int ram_id = 0; - gpio_t spd_gpios[] = { GP_SW_80, /* SATA_GP3, RAMID0 */ GP_SW_67, /* I2C3_SCL, RAMID1 */ @@ -51,45 +37,24 @@ static void *get_spd_pointer(char *spd_file_content, int total_spds, int *dual) GP_SW_64, /* I2C3_SDA, RAMID3 */ }; - ram_id = gpio_base2_value(spd_gpios, ARRAY_SIZE(spd_gpios)); - printk(BIOS_DEBUG, "ram_id=%d, total_spds: %d\n", ram_id, total_spds); - if (ram_id >= total_spds) - return NULL; + return gpio_base2_value(spd_gpios, ARRAY_SIZE(spd_gpios)); +} + +static void *get_spd_pointer(char *spd_file_content, int total_spds, int *dual) +{ + int ram_id = 0; + int spd_index = 0; - /* Determine if this is a single or dual channel memory system */ - if (dual_channel_config & (1 << ram_id)) - *dual = 1; + ram_id = get_ramid(); + printk(BIOS_DEBUG, "ram_id=%d, total_spds: %d\n", ram_id, total_spds); - /* Display the RAM type */ - switch (ram_id) { - case 0: - printk(BIOS_DEBUG, "4GiB Samsung K4B4G1646Q-HYK0 1600MHz\n"); - break; - case 2: - printk(BIOS_DEBUG, "2GiB Samsung K4B4G1646Q-HYK0 1600MHz\n"); - break; - case 1: - printk(BIOS_DEBUG, "4GiB Hynix H5TC4G63CFR-PBA 1600MHz\n"); - break; - case 3: - printk(BIOS_DEBUG, "2GiB Hynix H5TC4G63CFR-PBA 1600MHz\n"); - break; - case 4: - printk(BIOS_DEBUG, "4GiB Samsung K4B4G1646E-BYK0 1600MHz\n"); - break; - case 5: - printk(BIOS_DEBUG, "4GiB Micro MT41K256M16TW-107 1600MHz\n"); - break; - case 6: - printk(BIOS_DEBUG, "2GiB Samsung K4B4G1646E-BYK0 1600MHz\n"); - break; - case 7: - printk(BIOS_DEBUG, "2GiB Micro MT41K256M16TW-107 1600MHz\n"); - break; + spd_index = get_variant_spd_index(ram_id, dual); + if (spd_index >= total_spds) { + printk(BIOS_ERR, "SPD index > total SPDs\n"); + return NULL; } - /* Return the serial product data for the RAM */ - return &spd_file_content[SPD_PAGE_LEN * ram_id]; + return &spd_file_content[SPD_PAGE_LEN * spd_index]; } /* Copy SPD data for on-board memory */ diff --git a/src/mainboard/google/cyan/spd/spd_util.h b/src/mainboard/google/cyan/spd/spd_util.h new file mode 100644 index 0000000000..11d6eaa16d --- /dev/null +++ b/src/mainboard/google/cyan/spd/spd_util.h @@ -0,0 +1,22 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2017 Matt DeVillier + * + * 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. + */ + +#ifndef SPD_UTIL_H +#define SPD_UTIL_H + +uint8_t get_ramid(void); +int get_variant_spd_index(int ram_id, int *dual); + +#endif /* SPD_UTIL_H */ |