Aaron Durbin (adurbin@google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4885
-gerrit
commit 402d2b1a595cbc67233378511edeeee3994f8d61 Author: Aaron Durbin adurbin@chromium.org Date: Wed Oct 16 09:21:55 2013 -0700
rambi: disable internal pullups on ram_id[2:0]
The ram_id[2:0] signals have stuffing options for pull up/down with values of 10K. However, the default pulldown values for these pads are 20K. Therefore, one can't read a high value because of the high voltage threshold is 0.65 * Vref. Therefore the high signals are marginal at best.
Fix this issue by disabling the internal pull for the pads connected to ram_id[2:0].
BUG=chrome-os-partner:23350 BRANCH=None TEST=Built and checked that ram_id[2:0] is properly read now.
Change-Id: Ib414d5798b472574337d1b71b87a4cf92f40c762 Signed-off-by: Aaron Durbin adurbin@chromium.org Reviewed-on: https://chromium-review.googlesource.com/173211 Reviewed-by: Shawn Nematbakhsh shawnn@chromium.org Reviewed-by: Bernie Thompson bhthompson@chromium.org --- src/mainboard/google/rambi/romstage.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
diff --git a/src/mainboard/google/rambi/romstage.c b/src/mainboard/google/rambi/romstage.c index d15a21d..369ebad 100644 --- a/src/mainboard/google/rambi/romstage.c +++ b/src/mainboard/google/rambi/romstage.c @@ -37,14 +37,29 @@ #define GPIO_SSUS_38_PAD 50 #define GPIO_SSUS_39_PAD 58
+static inline void disable_internal_pull(int pad) +{ + const int pull_mask = ~(0xf << 7); + write32(ssus_pconf0(pad), read32(ssus_pconf0(pad)) & pull_mask); +} + static void *get_spd_pointer(char *spd_file_content, int total_spds) { int ram_id = 0;
+ /* The ram_id[2:0] pullups on rambi are too large for the default 20K + * pulldown on the pad. Therefore, disable the internal pull resistor to + * read high values correctly. */ + disable_internal_pull(GPIO_SSUS_37_PAD); + disable_internal_pull(GPIO_SSUS_38_PAD); + disable_internal_pull(GPIO_SSUS_39_PAD); + ram_id |= (ssus_get_gpio(GPIO_SSUS_37_PAD) << 0); ram_id |= (ssus_get_gpio(GPIO_SSUS_38_PAD) << 1); ram_id |= (ssus_get_gpio(GPIO_SSUS_39_PAD) << 2);
+ printk(BIOS_DEBUG, "ram_id=%d, total_spds: %d\n", ram_id, total_spds); + if (ram_id >= total_spds) return NULL;