@@ -638,6 +638,7 @@ fapi2::ReturnCode eff_dimm::factory ( const spd::facade& i_spd_decoder,
638
638
uint8_t l_buffer_type = 0 ;
639
639
kind_t l_dimm_kind = DEFAULT_KIND ;
640
640
rcw_settings l_raw_card ;
641
+ uint8_t l_master_ranks = 0 ;
641
642
642
643
fapi2 ::ReturnCode l_rc ;
643
644
const auto l_dimm = i_spd_decoder .get_dimm_target ();
@@ -646,6 +647,8 @@ fapi2::ReturnCode eff_dimm::factory ( const spd::facade& i_spd_decoder,
646
647
// Dram_gen and dimm_type are set in mss_freq and we'll call the SPD decoder to get the reg and buff type
647
648
FAPI_TRY ( eff_dram_gen (l_dimm , l_gen ), "Failed eff_dram_gen() accessor for %s" , mss ::c_str (l_dimm ) );
648
649
FAPI_TRY ( eff_dimm_type (l_dimm , l_type ), "Failed eff_dimm_type() accessor for %s" , mss ::c_str (l_dimm ) );
650
+ FAPI_TRY ( eff_num_master_ranks_per_dimm (l_dimm , l_master_ranks ), "Failed eff_dimm_type() accessor for %s" ,
651
+ mss ::c_str (l_dimm ) );
649
652
650
653
FAPI_TRY ( i_spd_decoder .register_and_buffer_type (l_buffer_type ),
651
654
"Failed decoding register and buffer type from SPD for %s" , mss ::c_str (l_dimm ) );
@@ -660,7 +663,7 @@ fapi2::ReturnCode eff_dimm::factory ( const spd::facade& i_spd_decoder,
660
663
switch (l_buffer_type )
661
664
{
662
665
case LRDIMM_DB01 :
663
- o_fact_obj = std ::make_shared < eff_lrdimm_db01 > ( i_spd_decoder , l_raw_card , l_rc );
666
+ o_fact_obj = std ::make_shared < eff_lrdimm_db01 > ( i_spd_decoder , l_raw_card , l_master_ranks , l_rc );
664
667
665
668
// Assert that l_rc is good and o_fact_object isn't null
666
669
FAPI_ASSERT ( ((l_rc == fapi2 ::FAPI2_RC_SUCCESS ) && (o_fact_obj != nullptr )),
@@ -675,7 +678,7 @@ fapi2::ReturnCode eff_dimm::factory ( const spd::facade& i_spd_decoder,
675
678
break ;
676
679
677
680
case LRDIMM_DB02 :
678
- o_fact_obj = std ::make_shared < eff_lrdimm_db02 > ( i_spd_decoder , l_raw_card , l_rc );
681
+ o_fact_obj = std ::make_shared < eff_lrdimm_db02 > ( i_spd_decoder , l_raw_card , l_master_ranks , l_rc );
679
682
680
683
// Assert that l_rc is good and o_fact_object isn't null
681
684
FAPI_ASSERT ( ((l_rc == fapi2 ::FAPI2_RC_SUCCESS ) && (o_fact_obj != nullptr )),
@@ -2900,12 +2903,26 @@ fapi_try_exit:
2900
2903
/// @brief Determines & sets effective config for Vref DQ Train Value and Range
2901
2904
/// @return fapi2::FAPI2_RC_SUCCESS if okay
2902
2905
///
2903
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
2904
2906
fapi2 ::ReturnCode eff_lrdimm ::vref_dq_train_value_and_range ()
2905
2907
{
2908
+ constexpr uint8_t VREF_73PERCENT = 0x14 ;
2909
+ constexpr uint8_t VREF_83PERCENT = 0x24 ;
2910
+ constexpr uint8_t TRAIN_VALUE [NUM_VALID_RANKS_CONFIGS ] =
2911
+ {
2912
+ VREF_73PERCENT , // 2 ranks per DIMM
2913
+ VREF_83PERCENT , // 4 ranks per DIMM
2914
+ };
2915
+ // Yes, range1 has a value of 0 this is taken from the JEDEC spec
2916
+ constexpr uint8_t RANGE1 = 0x00 ;
2917
+ constexpr uint8_t TRAIN_RANGE [NUM_VALID_RANKS_CONFIGS ] =
2918
+ {
2919
+ RANGE1 ,
2920
+ RANGE1 ,
2921
+ };
2922
+
2923
+
2906
2924
uint8_t l_vref_dq_train_value [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
2907
2925
uint8_t l_vref_dq_train_range [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
2908
- fapi2 ::buffer < uint8_t > l_vref_range ;
2909
2926
2910
2927
// Gets the attributes
2911
2928
FAPI_TRY ( eff_vref_dq_train_value (iv_mcs , & l_vref_dq_train_value [0 ][0 ][0 ]) );
@@ -2915,11 +2932,8 @@ fapi2::ReturnCode eff_lrdimm::vref_dq_train_value_and_range()
2915
2932
// It should be good enough to get us going
2916
2933
for (uint64_t l_rank = 0 ; l_rank < MAX_RANK_PER_DIMM ; ++ l_rank )
2917
2934
{
2918
- constexpr uint8_t VREF_79PERCENT = 0x1d ;
2919
- // Yes, range1 has a value of 0 this is taken from the JEDEC spec
2920
- constexpr uint8_t RANGE1 = 0x00 ;
2921
- l_vref_dq_train_value [iv_port_index ][iv_dimm_index ][l_rank ] = VREF_79PERCENT ;
2922
- l_vref_dq_train_range [iv_port_index ][iv_dimm_index ][l_rank ] = RANGE1 ;
2935
+ l_vref_dq_train_value [iv_port_index ][iv_dimm_index ][mss ::index (l_rank )] = TRAIN_VALUE [iv_master_ranks_index ];
2936
+ l_vref_dq_train_range [iv_port_index ][iv_dimm_index ][mss ::index (l_rank )] = TRAIN_RANGE [iv_master_ranks_index ];
2923
2937
}
2924
2938
2925
2939
FAPI_TRY ( FAPI_ATTR_SET (fapi2 ::ATTR_EFF_VREF_DQ_TRAIN_VALUE , iv_mcs , l_vref_dq_train_value ),
@@ -4400,21 +4414,22 @@ fapi_try_exit:
4400
4414
/// @return fapi2::FAPI2_RC_SUCCESS if okay
4401
4415
/// @note used for MRS01
4402
4416
///
4403
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
4404
4417
fapi2 ::ReturnCode eff_lrdimm ::dram_rtt_nom ()
4405
4418
{
4419
+ constexpr uint8_t DRAM_RTT_VALUES [NUM_VALID_RANKS_CONFIGS ] =
4420
+ {
4421
+ 0b111 , // 2R - 34Ohm
4422
+ 0b111 , // 4R - 34Ohm
4423
+ };
4424
+
4406
4425
uint8_t l_mcs_attrs [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
4407
4426
FAPI_TRY ( eff_dram_rtt_nom (iv_mcs , & l_mcs_attrs [0 ][0 ][0 ]) );
4408
4427
4409
- // The host is in charge of ensuring good termination from the buffer to the DRAM
4410
- // That means that we need to know and set the settings
4411
- // Currently, our SI team thinks that the 2R single drop open power settings will work for BUP
4412
- // We're going to hard code in those settings the above story can be used as a catchall to improve settings if need be
4413
- // Loops through all ranks
4414
4428
for (uint64_t l_rank = 0 ; l_rank < MAX_RANK_PER_DIMM ; ++ l_rank )
4415
4429
{
4416
- // Taking the 34ohm value from up above
4417
- l_mcs_attrs [iv_port_index ][iv_dimm_index ][l_rank ] = 0b111 ;
4430
+ // Gets the ODT scheme for the DRAM for this DIMM - we only want to toggle ODT to the DIMM we are writing to
4431
+ // We do a bitwise mask here to only get the ODT for the current DIMM
4432
+ l_mcs_attrs [iv_port_index ][iv_dimm_index ][mss ::index (l_rank )] = DRAM_RTT_VALUES [iv_master_ranks_index ];
4418
4433
}
4419
4434
4420
4435
FAPI_TRY ( FAPI_ATTR_SET (fapi2 ::ATTR_EFF_DRAM_RTT_NOM , iv_mcs , l_mcs_attrs ) );
@@ -4481,9 +4496,14 @@ fapi_try_exit:
4481
4496
/// @return fapi2::FAPI2_RC_SUCCESS if okay
4482
4497
/// @note used for MRS02
4483
4498
///
4484
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
4485
4499
fapi2 ::ReturnCode eff_lrdimm ::dram_rtt_wr ()
4486
4500
{
4501
+ constexpr uint8_t DRAM_RTT_VALUES [NUM_VALID_RANKS_CONFIGS ] =
4502
+ {
4503
+ 0b000 , // 2R - disable
4504
+ 0b001 , // 4R - 120Ohm
4505
+ };
4506
+
4487
4507
uint8_t l_mcs_attrs [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
4488
4508
FAPI_TRY ( eff_dram_rtt_wr (iv_mcs , & l_mcs_attrs [0 ][0 ][0 ]) );
4489
4509
@@ -4494,8 +4514,9 @@ fapi2::ReturnCode eff_lrdimm::dram_rtt_wr()
4494
4514
// Loops through all ranks
4495
4515
for (uint64_t l_rank = 0 ; l_rank < MAX_RANK_PER_DIMM ; ++ l_rank )
4496
4516
{
4497
- // Taking the disable value from up above
4498
- l_mcs_attrs [iv_port_index ][iv_dimm_index ][l_rank ] = 0b000 ;
4517
+ // Gets the ODT scheme for the DRAM for this DIMM - we only want to toggle ODT to the DIMM we are writing to
4518
+ // We do a bitwise mask here to only get the ODT for the current DIMM
4519
+ l_mcs_attrs [iv_port_index ][iv_dimm_index ][l_rank ] = DRAM_RTT_VALUES [iv_master_ranks_index ];
4499
4520
}
4500
4521
4501
4522
// Set the attribute
@@ -4554,9 +4575,14 @@ fapi_try_exit:
4554
4575
/// @return fapi2::FAPI2_RC_SUCCESS if okay
4555
4576
/// @note used for MRS05
4556
4577
///
4557
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
4558
4578
fapi2 ::ReturnCode eff_lrdimm ::dram_rtt_park ()
4559
4579
{
4580
+ constexpr uint8_t DRAM_RTT_VALUES [NUM_VALID_RANKS_CONFIGS ] =
4581
+ {
4582
+ 0b000 , // 2R - disable
4583
+ 0b010 , // 4R - 120Ohm
4584
+ };
4585
+
4560
4586
uint8_t l_mcs_attrs [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
4561
4587
4562
4588
FAPI_TRY ( eff_dram_rtt_park (iv_mcs , & l_mcs_attrs [0 ][0 ][0 ]) );
@@ -4568,8 +4594,9 @@ fapi2::ReturnCode eff_lrdimm::dram_rtt_park()
4568
4594
// Loops through all ranks
4569
4595
for (uint64_t l_rank = 0 ; l_rank < MAX_RANK_PER_DIMM ; ++ l_rank )
4570
4596
{
4571
- // Taking the disable value from up above
4572
- l_mcs_attrs [iv_port_index ][iv_dimm_index ][l_rank ] = 0b000 ;
4597
+ // Gets the ODT scheme for the DRAM for this DIMM - we only want to toggle ODT to the DIMM we are writing to
4598
+ // We do a bitwise mask here to only get the ODT for the current DIMM
4599
+ l_mcs_attrs [iv_port_index ][iv_dimm_index ][mss ::index (l_rank )] = DRAM_RTT_VALUES [iv_master_ranks_index ];
4573
4600
}
4574
4601
4575
4602
FAPI_TRY ( FAPI_ATTR_SET (fapi2 ::ATTR_EFF_DRAM_RTT_PARK , iv_mcs , l_mcs_attrs ) );
@@ -4909,7 +4936,6 @@ fapi_try_exit:
4909
4936
/// DRAM Interface MDQ/MDQS ODT Strength for Data Buffer
4910
4937
/// Comes from SPD
4911
4938
///
4912
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
4913
4939
fapi2 ::ReturnCode eff_lrdimm ::dimm_bc04 ()
4914
4940
{
4915
4941
// Retrieve MCS attribute data
@@ -4934,7 +4960,6 @@ fapi_try_exit:
4934
4960
/// Page 57 Table 28
4935
4961
/// @note DRAM Interface MDQ/MDQS Output Driver Impedance control
4936
4962
///
4937
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
4938
4963
fapi2 ::ReturnCode eff_lrdimm ::dimm_bc05 ()
4939
4964
{
4940
4965
// Taken from the SI spreadsheet - we want 34 Ohms so 0x01
@@ -5469,17 +5494,22 @@ fapi_try_exit:
5469
5494
/// @brief Determines and sets DIMM F5BC6x
5470
5495
/// @return fapi2::FAPI2_RC_SUCCESS if okay
5471
5496
///
5472
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
5473
5497
fapi2 ::ReturnCode eff_lrdimm ::dimm_f5bc6x ()
5474
5498
{
5475
5499
constexpr uint8_t VREF_73PERCENT = 0x14 ;
5500
+ constexpr uint8_t VREF_83PERCENT = 0x24 ;
5501
+ constexpr uint8_t RD_VREF [NUM_VALID_RANKS_CONFIGS ] =
5502
+ {
5503
+ VREF_73PERCENT , // 2 ranks per DIMM
5504
+ VREF_83PERCENT , // 4 ranks per DIMM
5505
+ };
5476
5506
uint8_t l_attrs_dimm_f5bc6x [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ] = {};
5477
5507
5478
5508
// Retrieve MCS attribute data
5479
5509
FAPI_TRY ( eff_dimm_ddr4_f5bc6x (iv_mcs , & l_attrs_dimm_f5bc6x [0 ][0 ]) );
5480
5510
5481
5511
// F5BC6x is just the VREF training range
5482
- l_attrs_dimm_f5bc6x [iv_port_index ][iv_dimm_index ] = VREF_73PERCENT ;
5512
+ l_attrs_dimm_f5bc6x [iv_port_index ][iv_dimm_index ] = RD_VREF [ iv_master_ranks_index ] ;
5483
5513
5484
5514
FAPI_TRY ( FAPI_ATTR_SET (fapi2 ::ATTR_EFF_DIMM_DDR4_F5BC6x , iv_mcs , l_attrs_dimm_f5bc6x ),
5485
5515
"Failed setting attribute for ATTR_EFF_DIMM_DDR4_F5BC6x" );
@@ -5529,17 +5559,22 @@ fapi_try_exit:
5529
5559
/// @brief Determines & sets effective config for DRAM output driver impedance control
5530
5560
/// @return fapi2::FAPI2_RC_SUCCESS if okay
5531
5561
///
5532
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
5533
5562
fapi2 ::ReturnCode eff_lrdimm ::dram_odic ()
5534
5563
{
5564
+ constexpr uint8_t DRAM_ODIC_VALUES [NUM_VALID_RANKS_CONFIGS ] =
5565
+ {
5566
+ fapi2 ::ENUM_ATTR_MSS_VPD_MT_DRAM_DRV_IMP_DQ_DQS_OHM34 , // 2 ranks per DIMM
5567
+ fapi2 ::ENUM_ATTR_MSS_VPD_MT_DRAM_DRV_IMP_DQ_DQS_OHM34 , // 4 ranks per DIMM
5568
+ };
5569
+
5535
5570
uint8_t l_dram_odic [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
5536
5571
FAPI_TRY ( eff_dram_odic (iv_mcs , & l_dram_odic [0 ][0 ][0 ]));
5537
5572
5538
5573
// Updates DRAM ODIC with the VPD value
5539
5574
for (uint8_t l_rank = 0 ; l_rank < MAX_RANK_PER_DIMM ; ++ l_rank )
5540
5575
{
5541
5576
// JEDEC setting - taken from SI spreadsheet
5542
- l_dram_odic [iv_port_index ][iv_dimm_index ][l_rank ] = fapi2 :: ENUM_ATTR_MSS_VPD_MT_DRAM_DRV_IMP_DQ_DQS_OHM34 ;
5577
+ l_dram_odic [iv_port_index ][iv_dimm_index ][mss :: index ( l_rank ) ] = DRAM_ODIC_VALUES [ iv_master_ranks_index ] ;
5543
5578
}
5544
5579
5545
5580
FAPI_TRY ( FAPI_ATTR_SET (fapi2 ::ATTR_EFF_DRAM_ODIC , iv_mcs , l_dram_odic ) );
@@ -5936,27 +5971,38 @@ fapi_try_exit:
5936
5971
///
5937
5972
fapi2 ::ReturnCode eff_lrdimm ::odt_wr ()
5938
5973
{
5939
- constexpr uint8_t ODT_2R_1DROP_VALUES [MAX_RANK_PER_DIMM ] =
5974
+ constexpr uint8_t DRAM_ODT_VALUES [ NUM_VALID_RANKS_CONFIGS ] [MAX_RANK_PER_DIMM ] =
5940
5975
{
5941
- 0x40 ,
5942
- 0x80 ,
5943
- 0x00 ,
5944
- 0x00 ,
5976
+ { 0x44 , 0x88 , 0x00 , 0x00 , }, // 2 ranks per DIMM
5977
+ { 0xcc , 0xcc , 0xcc , 0xcc , }, // 4 ranks per DIMM
5945
5978
};
5946
5979
5980
+ // Masks on the ODT for a specific DIMM
5981
+ constexpr uint8_t DIMM_ODT_MASK [MAX_DIMM_PER_PORT ] = { 0xf0 , 0x0f };
5982
+
5947
5983
uint8_t l_mcs_attr [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
5984
+ uint8_t l_vpd_odt [MAX_RANK_PER_DIMM ] = {};
5948
5985
5949
5986
// Gets the VPD value
5950
5987
FAPI_TRY ( eff_odt_wr ( iv_mcs , & (l_mcs_attr [0 ][0 ][0 ])) );
5988
+ FAPI_TRY ( mss ::vpd_mt_odt_wr (iv_dimm , & (l_vpd_odt [0 ])));
5951
5989
5952
5990
// Loops through and sets/updates all ranks
5953
5991
for (uint64_t l_rank = 0 ; l_rank < MAX_RANK_PER_DIMM ; ++ l_rank )
5954
5992
{
5955
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
5956
- // Currently, we're using a 2R single drop system
5957
- // To avoid terminating our 0th rank twice, we just want to pass in the termination directly
5958
- // This will be sorted out as part of the above RTC
5959
- l_mcs_attr [iv_port_index ][iv_dimm_index ][l_rank ] = ODT_2R_1DROP_VALUES [l_rank ];
5993
+ // Gets the ODT scheme for the DRAM for this DIMM - we only want to toggle ODT to the DIMM we are writing to
5994
+ // We do a bitwise mask here to only get the ODT for the current DIMM
5995
+ const auto l_dram_odt = DRAM_ODT_VALUES [iv_master_ranks_index ][l_rank ] & DIMM_ODT_MASK [iv_dimm_index ];
5996
+
5997
+ // For the host side ODT, we want to get the ODT from the VPD and do a bitwise or to only get the ODT for the opposite DIMM
5998
+ // If we include the ODT for this DIMM, we could end up over terminating the DRAM side ODT
5999
+ // The buffer's or the ODT together AND all of our LRDIMM values include ODT, so we will get the ODT we need for the host-> buffer interface
6000
+ // We also use the 0th position for the host side ODT as we use the 1R termination settings for LRDIMM
6001
+ const auto l_opposite_dimm_index = (iv_dimm_index + 1 ) % MAX_DIMM_PER_PORT ;
6002
+ const auto l_host_odt = l_vpd_odt [0 ] & DIMM_ODT_MASK [l_opposite_dimm_index ];
6003
+
6004
+ // Do the final bitwise or
6005
+ l_mcs_attr [iv_port_index ][iv_dimm_index ][l_rank ] = l_dram_odt | l_host_odt ;
5960
6006
}
5961
6007
5962
6008
FAPI_TRY ( FAPI_ATTR_SET (fapi2 ::ATTR_MSS_EFF_ODT_WR , iv_mcs , l_mcs_attr ) );
@@ -6085,8 +6131,17 @@ fapi_try_exit:
6085
6131
///
6086
6132
fapi2 ::ReturnCode eff_lrdimm ::odt_rd ()
6087
6133
{
6134
+ constexpr uint8_t DRAM_ODT_VALUES [NUM_VALID_RANKS_CONFIGS ][MAX_RANK_PER_DIMM ] =
6135
+ {
6136
+ { 0x00 , 0x00 , 0x00 , 0x00 , }, // 2 ranks per DIMM
6137
+ { 0x44 , 0x88 , 0x44 , 0x88 , }, // 4 ranks per DIMM
6138
+ };
6139
+
6140
+ // Masks on the ODT for a specific DIMM
6141
+ constexpr uint8_t DIMM_ODT_MASK [MAX_DIMM_PER_PORT ] = { 0xf0 , 0x0f };
6142
+
6088
6143
uint8_t l_mcs_attr [PORTS_PER_MCS ][MAX_DIMM_PER_PORT ][MAX_RANK_PER_DIMM ] = {};
6089
- uint8_t l_vpd_odt [MAX_RANK_PER_DIMM ];
6144
+ uint8_t l_vpd_odt [MAX_RANK_PER_DIMM ] = {} ;
6090
6145
6091
6146
// Gets the VPD value
6092
6147
FAPI_TRY ( mss ::vpd_mt_odt_rd (iv_dimm , & (l_vpd_odt [0 ])));
@@ -6095,12 +6150,19 @@ fapi2::ReturnCode eff_lrdimm::odt_rd()
6095
6150
// Loops through and sets/updates all ranks
6096
6151
for (uint64_t l_rank = 0 ; l_rank < MAX_RANK_PER_DIMM ; ++ l_rank )
6097
6152
{
6098
- // TODO:RTC200577 Update LRDIMM termination settings for dual drop and 4 rank DIMM's
6099
- // So, here we do a bitwise or of our LR settings and our VPD settings
6100
- // The VPD contains the host <-> buffer settings
6101
- // The constant contains the buffer <-> DRAM
6102
- // Due to how the ODT functions, we need to or them
6103
- l_mcs_attr [iv_port_index ][iv_dimm_index ][l_rank ] = l_vpd_odt [l_rank ] | 0x00 ;
6153
+ // Gets the ODT scheme for the DRAM for this DIMM - we only want to toggle ODT to the DIMM we are writing to
6154
+ // We do a bitwise mask here to only get the ODT for the current DIMM
6155
+ const auto l_dram_odt = DRAM_ODT_VALUES [iv_master_ranks_index ][l_rank ] & DIMM_ODT_MASK [iv_dimm_index ];
6156
+
6157
+ // For the host side ODT, we want to get the ODT from the VPD and do a bitwise or to only get the ODT for the opposite DIMM
6158
+ // If we include the ODT for this DIMM, we could end up over terminating the DRAM side ODT
6159
+ // The buffer's or the ODT together AND all of our LRDIMM values include ODT, so we will get the ODT we need for the host-> buffer interface
6160
+ // We also use the 0th position for the host side ODT as we use the 1R termination settings for LRDIMM
6161
+ const auto l_opposite_dimm_index = (iv_dimm_index + 1 ) % MAX_DIMM_PER_PORT ;
6162
+ const auto l_host_odt = l_vpd_odt [0 ] & DIMM_ODT_MASK [l_opposite_dimm_index ];
6163
+
6164
+ // Do the final bitwise or
6165
+ l_mcs_attr [iv_port_index ][iv_dimm_index ][l_rank ] = l_dram_odt | l_host_odt ;
6104
6166
}
6105
6167
6106
6168
FAPI_TRY ( FAPI_ATTR_SET (fapi2 ::ATTR_MSS_EFF_ODT_RD , iv_mcs , l_mcs_attr ) );
0 commit comments