nb/intel/haswell: Use unshifted SPD addresses in mainboards

It's common to use the raw, unshifted I2C address in coreboot. Adapt
mainboards accordingly and perform the shift in MRC glue code.

Tested on Asrock B85M Pro4, still boots and still resumes from S3.

Change-Id: I4e4978772744ea27f4c5a88def60a8ded66520e1
Signed-off-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/51458
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/mainboard/asrock/b85m_pro4/romstage.c b/src/mainboard/asrock/b85m_pro4/romstage.c
index 7a4e402..793a7d7 100644
--- a/src/mainboard/asrock/b85m_pro4/romstage.c
+++ b/src/mainboard/asrock/b85m_pro4/romstage.c
@@ -19,10 +19,10 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[1] = 0xa2;
-	spdi->addresses[2] = 0xa4;
-	spdi->addresses[3] = 0xa6;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[1] = 0x51;
+	spdi->addresses[2] = 0x52;
+	spdi->addresses[3] = 0x53;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/mainboard/asrock/h81m-hds/romstage.c b/src/mainboard/asrock/h81m-hds/romstage.c
index 58f9697..a5b667f 100644
--- a/src/mainboard/asrock/h81m-hds/romstage.c
+++ b/src/mainboard/asrock/h81m-hds/romstage.c
@@ -19,8 +19,8 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[2] = 0xa4;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[2] = 0x52;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/mainboard/google/beltino/romstage.c b/src/mainboard/google/beltino/romstage.c
index b69fb93..9904d5a 100644
--- a/src/mainboard/google/beltino/romstage.c
+++ b/src/mainboard/google/beltino/romstage.c
@@ -42,8 +42,8 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[2] = 0xa4;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[2] = 0x52;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/mainboard/hp/folio_9480m/romstage.c b/src/mainboard/hp/folio_9480m/romstage.c
index af3005f..865fcc6 100644
--- a/src/mainboard/hp/folio_9480m/romstage.c
+++ b/src/mainboard/hp/folio_9480m/romstage.c
@@ -19,8 +19,8 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[2] = 0xa4;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[2] = 0x52;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/mainboard/intel/baskingridge/romstage.c b/src/mainboard/intel/baskingridge/romstage.c
index 7580799..0f2719a 100644
--- a/src/mainboard/intel/baskingridge/romstage.c
+++ b/src/mainboard/intel/baskingridge/romstage.c
@@ -43,10 +43,10 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[1] = 0xa2;
-	spdi->addresses[2] = 0xa4;
-	spdi->addresses[3] = 0xa6;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[1] = 0x51;
+	spdi->addresses[2] = 0x52;
+	spdi->addresses[3] = 0x53;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/mainboard/lenovo/t440p/romstage.c b/src/mainboard/lenovo/t440p/romstage.c
index 7840a1f..a85935b 100644
--- a/src/mainboard/lenovo/t440p/romstage.c
+++ b/src/mainboard/lenovo/t440p/romstage.c
@@ -42,8 +42,8 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[2] = 0xa2;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[2] = 0x51;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/mainboard/msi/h81m-p33/romstage.c b/src/mainboard/msi/h81m-p33/romstage.c
index 059ebdc..97c888d 100644
--- a/src/mainboard/msi/h81m-p33/romstage.c
+++ b/src/mainboard/msi/h81m-p33/romstage.c
@@ -19,8 +19,8 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[2] = 0xa4;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[2] = 0x52;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/mainboard/supermicro/x10slm-f/romstage.c b/src/mainboard/supermicro/x10slm-f/romstage.c
index 2ec993f..e555bea 100644
--- a/src/mainboard/supermicro/x10slm-f/romstage.c
+++ b/src/mainboard/supermicro/x10slm-f/romstage.c
@@ -19,10 +19,10 @@
 
 void mb_get_spd_map(struct spd_info *spdi)
 {
-	spdi->addresses[0] = 0xa0;
-	spdi->addresses[1] = 0xa2;
-	spdi->addresses[2] = 0xa4;
-	spdi->addresses[3] = 0xa6;
+	spdi->addresses[0] = 0x50;
+	spdi->addresses[1] = 0x51;
+	spdi->addresses[2] = 0x52;
+	spdi->addresses[3] = 0x53;
 }
 
 const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS] = {
diff --git a/src/northbridge/intel/haswell/raminit.c b/src/northbridge/intel/haswell/raminit.c
index d84d3fb..1f84ffa 100644
--- a/src/northbridge/intel/haswell/raminit.c
+++ b/src/northbridge/intel/haswell/raminit.c
@@ -347,8 +347,11 @@
 	struct spd_info spdi = {0};
 	mb_get_spd_map(&spdi);
 
-	for (size_t i = 0; i < ARRAY_SIZE(spdi.addresses); i++)
-		pei_data.spd_addresses[i] = spdi.addresses[i];
+	/* MRC expects left-aligned SMBus addresses, and 0xff for memory-down */
+	for (size_t i = 0; i < ARRAY_SIZE(spdi.addresses); i++) {
+		const uint8_t addr = spdi.addresses[i];
+		pei_data.spd_addresses[i] = addr == SPD_MEMORY_DOWN ? 0xff : addr << 1;
+	}
 
 	/* Calculate unimplemented DIMM slots for each channel */
 	pei_data.dimm_channel0_disabled = make_channel_disabled_mask(&pei_data, 0);
diff --git a/src/northbridge/intel/haswell/raminit.h b/src/northbridge/intel/haswell/raminit.h
index 7eb3980..ab245d8 100644
--- a/src/northbridge/intel/haswell/raminit.h
+++ b/src/northbridge/intel/haswell/raminit.h
@@ -17,7 +17,7 @@
 extern const struct usb2_port_setting mainboard_usb2_ports[MAX_USB2_PORTS];
 extern const struct usb3_port_setting mainboard_usb3_ports[MAX_USB3_PORTS];
 
-/* Mainboard callback to fill in the SPD addresses in MRC format */
+/* Mainboard callback to fill in the SPD addresses */
 void mb_get_spd_map(struct spd_info *spdi);
 
 void perform_raminit(const int s3resume);