blob: d3d81fde367daace83e0b6ce11f136bb5381079c [file] [log] [blame]
Angel Ponsb5a2a522020-04-05 13:21:48 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Martin Rothac35e622017-11-07 13:43:02 -07002
Martin Rothac35e622017-11-07 13:43:02 -07003#include <baseboard/variants.h>
Marc Jonesfede56b2017-11-16 18:53:47 -07004#include <console/console.h>
Elyes HAOUAS3b3d0852021-02-01 10:09:40 +01005#include <gpio.h>
Marc Jonesfede56b2017-11-16 18:53:47 -07006#include <spd_bin.h>
Martin Rothac35e622017-11-07 13:43:02 -07007#include <variant/gpio.h>
Marc Jonesfede56b2017-11-16 18:53:47 -07008#include <amdblocks/dimm_spd.h>
Martin Rothac35e622017-11-07 13:43:02 -07009
Aaron Durbin64031672018-04-21 14:45:32 -060010uint8_t __weak variant_memory_sku(void)
Martin Rothac35e622017-11-07 13:43:02 -070011{
12 gpio_t pads[] = {
13 [3] = MEM_CONFIG3,
14 [2] = MEM_CONFIG2,
15 [1] = MEM_CONFIG1,
16 [0] = MEM_CONFIG0,
17 };
18
Martin Roth1cdb6f22017-11-17 09:25:02 -070019 return gpio_base2_value(pads, ARRAY_SIZE(pads));
Martin Rothac35e622017-11-07 13:43:02 -070020}
Marc Jonesfede56b2017-11-16 18:53:47 -070021
Aaron Durbin64031672018-04-21 14:45:32 -060022int __weak variant_mainboard_read_spd(uint8_t spdAddress,
Marc Jonesfede56b2017-11-16 18:53:47 -070023 char *buf, size_t len)
24{
25 struct region_device spd_rdev;
26 u8 spd_index = variant_memory_sku();
27
28 printk(BIOS_INFO, "%s SPD index %d\n", __func__, spd_index);
29
30 if (get_spd_cbfs_rdev(&spd_rdev, spd_index) < 0) {
31 printk(BIOS_ERR, "Error: spd.bin not found\n");
32 return -1;
33 }
34
35 if (len != region_device_sz(&spd_rdev)) {
36 printk(BIOS_ERR, "Error: spd.bin is not the correct size\n");
37 return -1;
38 }
39
40 if (rdev_readat(&spd_rdev, buf, 0, len) != len) {
41 printk(BIOS_ERR, "Error: couldn't read spd.bin\n");
42 return -1;
43 }
44
45 return 0;
46}