Angel Pons | 47f26db | 2020-04-05 13:22:34 +0200 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Aaron Durbin | c625d09 | 2013-10-04 16:00:07 -0500 | [diff] [blame] | 2 | |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 3 | #include <cbfs.h> |
Aaron Durbin | c625d09 | 2013-10-04 16:00:07 -0500 | [diff] [blame] | 4 | #include <console/console.h> |
Julius Werner | 18ea2d3 | 2014-10-07 16:42:17 -0700 | [diff] [blame] | 5 | #include <soc/gpio.h> |
| 6 | #include <soc/mrc_wrapper.h> |
| 7 | #include <soc/romstage.h> |
Matt DeVillier | ce0a564 | 2017-01-12 12:19:21 -0600 | [diff] [blame] | 8 | #include <variant/variant.h> |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 9 | |
Aaron Durbin | 100b14d | 2013-11-27 16:51:26 -0600 | [diff] [blame] | 10 | static void *get_spd_pointer(char *spd_file_content, int total_spds, int *dual) |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 11 | { |
| 12 | int ram_id = 0; |
| 13 | |
Matt DeVillier | ce0a564 | 2017-01-12 12:19:21 -0600 | [diff] [blame] | 14 | /* The ram_id[2:0] pullups are too large for the default 20K |
Aaron Durbin | 6c52ba7 | 2013-10-16 09:21:55 -0700 | [diff] [blame] | 15 | * pulldown on the pad. Therefore, disable the internal pull resistor to |
| 16 | * read high values correctly. */ |
Aaron Durbin | 4177db5 | 2014-02-05 14:55:26 -0600 | [diff] [blame] | 17 | ssus_disable_internal_pull(GPIO_SSUS_37_PAD); |
| 18 | ssus_disable_internal_pull(GPIO_SSUS_38_PAD); |
| 19 | ssus_disable_internal_pull(GPIO_SSUS_39_PAD); |
Matt DeVillier | 474a7c5 | 2017-02-07 22:07:56 -0600 | [diff] [blame] | 20 | #ifdef GPIO_SSUS_40_PAD_USE_PULLDOWN |
| 21 | /* To prevent floating pin on shipped systems. */ |
| 22 | ssus_enable_internal_pull(GPIO_SSUS_40_PAD, PAD_PULL_DOWN | PAD_PU_20K); |
Elyes HAOUAS | 2526fd4 | 2018-05-22 12:29:05 +0200 | [diff] [blame] | 23 | #elif defined(GPIO_SSUS_40_PAD) |
Matt DeVillier | 9be3f5d | 2017-01-16 17:32:38 -0600 | [diff] [blame] | 24 | ssus_disable_internal_pull(GPIO_SSUS_40_PAD); |
| 25 | #endif |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 26 | ram_id |= (ssus_get_gpio(GPIO_SSUS_37_PAD) << 0); |
| 27 | ram_id |= (ssus_get_gpio(GPIO_SSUS_38_PAD) << 1); |
| 28 | ram_id |= (ssus_get_gpio(GPIO_SSUS_39_PAD) << 2); |
Matt DeVillier | 9be3f5d | 2017-01-16 17:32:38 -0600 | [diff] [blame] | 29 | #ifdef GPIO_SSUS_40_PAD |
| 30 | ram_id |= (ssus_get_gpio(GPIO_SSUS_40_PAD) << 3); |
| 31 | #endif |
Aaron Durbin | 6c52ba7 | 2013-10-16 09:21:55 -0700 | [diff] [blame] | 32 | printk(BIOS_DEBUG, "ram_id=%d, total_spds: %d\n", ram_id, total_spds); |
| 33 | |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 34 | if (ram_id >= total_spds) |
| 35 | return NULL; |
| 36 | |
Aaron Durbin | 100b14d | 2013-11-27 16:51:26 -0600 | [diff] [blame] | 37 | /* Single channel configs */ |
| 38 | if (dual_channel_config & (1 << ram_id)) |
| 39 | *dual = 1; |
| 40 | |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 41 | return &spd_file_content[SPD_SIZE * ram_id]; |
| 42 | } |
| 43 | |
Kyösti Mälkki | 3e77279 | 2019-08-16 17:37:48 +0300 | [diff] [blame] | 44 | void mainboard_fill_mrc_params(struct mrc_params *mp) |
Aaron Durbin | c625d09 | 2013-10-04 16:00:07 -0500 | [diff] [blame] | 45 | { |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 46 | void *spd_content; |
Aaron Durbin | 100b14d | 2013-11-27 16:51:26 -0600 | [diff] [blame] | 47 | int dual_channel = 0; |
Aaron Durbin | 899d13d | 2015-05-15 23:39:23 -0500 | [diff] [blame] | 48 | void *spd_file; |
| 49 | size_t spd_fsize; |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 50 | |
Julius Werner | 834b3ec | 2020-03-04 16:52:08 -0800 | [diff] [blame^] | 51 | spd_file = cbfs_map("spd.bin", &spd_fsize); |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 52 | if (!spd_file) |
| 53 | die("SPD data not found."); |
| 54 | |
Aaron Durbin | 899d13d | 2015-05-15 23:39:23 -0500 | [diff] [blame] | 55 | spd_content = get_spd_pointer(spd_file, spd_fsize / SPD_SIZE, |
Aaron Durbin | 100b14d | 2013-11-27 16:51:26 -0600 | [diff] [blame] | 56 | &dual_channel); |
Aaron Durbin | 1f5eb1f | 2013-10-08 15:33:39 -0500 | [diff] [blame] | 57 | |
Kyösti Mälkki | 3e77279 | 2019-08-16 17:37:48 +0300 | [diff] [blame] | 58 | mp->mainboard.dram_type = DRAM_DDR3L; |
| 59 | mp->mainboard.dram_info_location = DRAM_INFO_SPD_MEM, |
| 60 | mp->mainboard.weaker_odt_settings = 1, |
| 61 | |
| 62 | mp->mainboard.dram_data[0] = spd_content; |
| 63 | if (dual_channel) |
| 64 | mp->mainboard.dram_data[1] = spd_content; |
Aaron Durbin | c625d09 | 2013-10-04 16:00:07 -0500 | [diff] [blame] | 65 | } |