From 186b9de95d8dfd6a944879915729ea75b7f3448a Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sat, 9 Apr 2016 19:19:01 -0500 Subject: [PATCH] and/nb/mct_ddr3: Pack all structures passed to ramstage and set alignment Two of the MCT data structures passed as substructures to ramstage were not packed, and additionally no alignment was specified. On at least SP5100-based platforms, specifying packed with no alignment caused boot failure dependent on the exact compiled binary layout (LPC hang). Specifying the alignment and packing the remaining structures appears to have resolved the remaining LPC hang issues on the KGPE-D16. Note that packing the remaining structures alone was not sufficient to eliminate the hang, however removing the packed attribute entirely (during debugging) did resolve the hang at the expense of potential problems in ramstage. Change-Id: If3a7509ed438870d4d05caaaaa091e1c47bf9b97 Signed-off-by: Timothy Pearson Reviewed-on: https://review.coreboot.org/14303 Reviewed-by: Martin Roth Tested-by: build bot (Jenkins) Tested-by: Raptor Engineering Automated Test Stand --- src/northbridge/amd/amdmct/mct_ddr3/mct_d.h | 14 +++++++------- src/northbridge/amd/amdmct/mct_ddr3/mwlc_d.h | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.h b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.h index bb6c72351b..aba39c1c2e 100644 --- a/src/northbridge/amd/amdmct/mct_ddr3/mct_d.h +++ b/src/northbridge/amd/amdmct/mct_ddr3/mct_d.h @@ -301,7 +301,7 @@ struct MCTStatStruc { uint32_t TSCFreq; uint16_t nvram_checksum; uint8_t try_ecc; -} __attribute__((packed)); +} __attribute__((packed, aligned(4))); /*============================================================================= Global MCT Configuration Status Word (GStatus) @@ -330,7 +330,7 @@ struct amd_spd_node_data { uint64_t nvram_spd_hash[MAX_DIMMS_SUPPORTED]; /* [DIMM] */ uint8_t nvram_spd_match; uint8_t nvram_memclk[2]; /* [channel] */ -} __attribute__((packed)); +} __attribute__((packed, aligned(4))); struct DCTStatStruc { /* A per Node structure*/ /* DCTStatStruct_F - start */ @@ -636,7 +636,7 @@ struct DCTStatStruc { /* A per Node structure*/ uint32_t DimmSerialNumber[MAX_DIMMS_SUPPORTED]; struct amd_spd_node_data spd_data; -} __attribute__((packed)); +} __attribute__((packed, aligned(4))); struct amd_s3_persistent_mct_channel_data { /* Stage 1 (1 dword) */ @@ -797,19 +797,19 @@ struct amd_s3_persistent_mct_channel_data { uint32_t f2x9cx0d0fe00a; /* TOTAL: 343 dwords */ -} __attribute__((packed)); +} __attribute__((packed, aligned(4))); struct amd_s3_persistent_node_data { uint32_t node_present; uint64_t spd_hash[MAX_DIMMS_SUPPORTED]; uint8_t memclk[2]; struct amd_s3_persistent_mct_channel_data channel[2]; -} __attribute__((packed)); +} __attribute__((packed, aligned(4))); struct amd_s3_persistent_data { struct amd_s3_persistent_node_data node[MAX_NODES_SUPPORTED]; uint16_t nvram_checksum; -} __attribute__((packed)); +} __attribute__((packed, aligned(4))); /*=============================================================================== Local Error Status Codes (DCTStatStruc.ErrCode) @@ -976,7 +976,7 @@ struct amdmct_memory_info { struct DCTStatStruc dct_stat[MAX_NODES_SUPPORTED]; uint16_t ecc_enabled; uint16_t ecc_scrub_rate; -} __attribute__((packed)); +} __attribute__((packed, aligned(4))); u32 Get_NB32(u32 dev, u32 reg); void Set_NB32(u32 dev, u32 reg, u32 val); diff --git a/src/northbridge/amd/amdmct/mct_ddr3/mwlc_d.h b/src/northbridge/amd/amdmct/mct_ddr3/mwlc_d.h index 2bd39f9f4d..28359a13c0 100644 --- a/src/northbridge/amd/amdmct/mct_ddr3/mwlc_d.h +++ b/src/northbridge/amd/amdmct/mct_ddr3/mwlc_d.h @@ -106,7 +106,7 @@ typedef struct _sMCTStruct { void (*AgesaDelay)(u32 delayval); /* IBV defined Delay Function */ -} sMCTStruct; +} __attribute__((packed, aligned(4))) sMCTStruct; /* DCT 0 and DCT 1 Data structure */ typedef struct _sDCTStruct @@ -161,6 +161,6 @@ typedef struct _sDCTStruct u8 DimmRanks[MAX_TOTAL_DIMMS]; /* Total Number of Ranks(per Dimm) */ uint64_t LogicalCPUID; u8 WLPass; -} sDCTStruct; +} __attribute__((packed, aligned(4))) sDCTStruct; #endif