summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp
diff options
context:
space:
mode:
authorJenny Huynh <jhuynh@us.ibm.com>2018-04-17 09:48:50 -0500
committerChristian R. Geddes <crgeddes@us.ibm.com>2018-07-13 12:18:32 -0400
commit2a377a20bf0bbf9d122dc7cd066949bd57c9578b (patch)
treecc25fe4c04e138224430730ccfe6774c90ea7b50 /src/import/chips/p9/procedures/hwp
parent613fa4b3a5c5acbd3b868289a843e014bf4ab129 (diff)
downloadtalos-hostboot-2a377a20bf0bbf9d122dc7cd066949bd57c9578b.tar.gz
talos-hostboot-2a377a20bf0bbf9d122dc7cd066949bd57c9578b.zip
Secure memory allocation and setup
p9_mss_eff_grouping.C: - determines whether secure mem is requested, reserves smf space - always reserve smf at end of range because of end-of-range bit - set addr15 when reporting smf base address - mask off group_id(0) via chip address extension if smf is enabled - updated to set value of attr_smf_enabled - enhanced error reporting with smf config/supported values - made values reported to attr_mss_mcs_group_32 more clear p9_mss_setup_bars.C: - set MCFGPA/MCFGPMA registers with SMF data - fixed scom registers for MCFGPA/MCFGPMA hole setup - added note to leave MCFIR_invalid_smf masked for HW451708/HW451711 - added assert to check for HOLE1 and SMF enable overlaps p9_query_mssinfo.C: - updated to print out SMF reservations - print out HTM/OCC/SMF reservations regardless of mirroring enable p9_fbc_utils.C: - prevent group_id(0)=1 from affecting mappable memory ranges p9_sbe_fabricinit.C: - mask off group_id(0) via chip address extension if smf is enabled p9_setup_sbe_config.C, p9_sbe_attr_setup.C: - use scratch_reg6 bit(16) to pass smf_config value initfiles: - removed setup to use other addr bits as secure bit; core only uses addr15 - added setup for ncu addr15 value in hcode - always set addr15 config bit in bridge unit if smf is supported - set addr15 bit across all mcs if smf is enabled - added in settings to enable smf in nmmu unit - hardcode group_id(0) bit in chipext mask for bridge unit if smf is supported attributes: - ATTR_SMF_ENABLE is a system level attribute - changed SMF_ENABLE->SMF_CONFIG; smf_enabled will be (config && supported) CQ:HW451708 CQ:HW451711 Change-Id: I6cf85600354baa322e959c922f596ecc5c68a458 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57322 Tested-by: FSP CI Jenkins <fsp-CI-jenkins+hostboot@us.ibm.com> Reviewed-by: Thi N. Tran <thi@us.ibm.com> Tested-by: Jenkins Server <pfd-jenkins+hostboot@us.ibm.com> Tested-by: HWSV CI <hwsv-ci+hostboot@us.ibm.com> Dev-Ready: Brent Wieman <bwieman@us.ibm.com> Tested-by: PPE CI <ppe-ci+hostboot@us.ibm.com> Reviewed-by: Joseph J. McGill <jmcgill@us.ibm.com> Reviewed-by: Jennifer A. Stofer <stofer@us.ibm.com> Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/57348 Tested-by: Jenkins OP Build CI <op-jenkins+hostboot@us.ibm.com> Tested-by: Jenkins OP HW <op-hw-jenkins+hostboot@us.ibm.com> Reviewed-by: Christian R. Geddes <crgeddes@us.ibm.com>
Diffstat (limited to 'src/import/chips/p9/procedures/hwp')
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9_cxa_scom.C12
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9_int_scom.C12
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9_mmu_scom.C17
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9_npu_scom.C42
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9_nx_scom.C12
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9_vas_scom.C40
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9c_mi_scom.C11
-rw-r--r--src/import/chips/p9/procedures/hwp/initfiles/p9n_mcs_scom.C11
-rw-r--r--src/import/chips/p9/procedures/hwp/lib/p9_hcd_memmap_base.H1
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C14
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.H4
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C260
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.H9
-rw-r--r--src/import/chips/p9/procedures/hwp/nest/p9_mss_setup_bars.C119
-rw-r--r--src/import/chips/p9/procedures/hwp/perv/p9_setup_sbe_config.C48
-rw-r--r--src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C16
16 files changed, 583 insertions, 45 deletions
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9_cxa_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9_cxa_scom.C
index d9f2bdb58..58c7b19f4 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9_cxa_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9_cxa_scom.C
@@ -35,6 +35,7 @@ constexpr uint64_t literal_1 = 1;
constexpr uint64_t literal_0x801B1F98D8717000 = 0x801B1F98D8717000;
constexpr uint64_t literal_0x0000000000000 = 0x0000000000000;
constexpr uint64_t literal_0b1 = 0b1;
+constexpr uint64_t literal_0b10 = 0b10;
constexpr uint64_t literal_0b0000 = 0b0000;
constexpr uint64_t literal_0b111 = 0b111;
constexpr uint64_t literal_0b0010 = 0b0010;
@@ -56,6 +57,8 @@ fapi2::ReturnCode p9_cxa_scom(const fapi2::Target<fapi2::TARGET_TYPE_CAPP>& TGT0
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID));
fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID_Type l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID));
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
fapi2::buffer<uint64_t> l_scom_buffer;
{
FAPI_TRY(fapi2::getScom( TGT0, 0x2010803ull, l_scom_buffer ));
@@ -137,6 +140,15 @@ fapi2::ReturnCode p9_cxa_scom(const fapi2::Target<fapi2::TARGET_TYPE_CAPP>& TGT0
l_scom_buffer.insert<25, 3, 61, uint64_t>(l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID );
}
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) || ((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<19, 2, 62, uint64_t>(literal_0b10 );
+ }
+ }
+
if (((l_chip_id == 0x5) && (l_chip_ec == 0x20)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5)
&& (l_chip_ec == 0x23)) )
{
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9_int_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9_int_scom.C
index 8fac28a73..1bf2efad1 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9_int_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9_int_scom.C
@@ -31,6 +31,7 @@ using namespace fapi2;
constexpr uint64_t literal_0 = 0;
constexpr uint64_t literal_1 = 1;
+constexpr uint64_t literal_0b10 = 0b10;
constexpr uint64_t literal_0x0070000072040140 = 0x0070000072040140;
constexpr uint64_t literal_0x2000004004028000 = 0x2000004004028000;
constexpr uint64_t literal_0x20000040040281C3 = 0x20000040040281C3;
@@ -69,6 +70,8 @@ fapi2::ReturnCode p9_int_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID));
fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID_Type l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID));
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
fapi2::ATTR_CHIP_EC_FEATURE_HW426891_Type l_TGT0_ATTR_CHIP_EC_FEATURE_HW426891;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_HW426891, TGT0, l_TGT0_ATTR_CHIP_EC_FEATURE_HW426891));
fapi2::ATTR_CHIP_EC_FEATURE_HW411637_Type l_TGT0_ATTR_CHIP_EC_FEATURE_HW411637;
@@ -99,6 +102,15 @@ fapi2::ReturnCode p9_int_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
l_scom_buffer.insert<9, 3, 61, uint64_t>(l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID );
}
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) || ((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<12, 2, 62, uint64_t>(literal_0b10 );
+ }
+ }
+
FAPI_TRY(fapi2::putScom(TGT0, 0x501300aull, l_scom_buffer));
}
{
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9_mmu_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9_mmu_scom.C
index b67ed43fc..58373c5cb 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9_mmu_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9_mmu_scom.C
@@ -44,6 +44,7 @@ constexpr uint64_t literal_0x000000000000 = 0x000000000000;
constexpr uint64_t literal_0x910000040F00 = 0x910000040F00;
constexpr uint64_t literal_0x911100000F00 = 0x911100000F00;
constexpr uint64_t literal_0x991100000F00 = 0x991100000F00;
+constexpr uint64_t literal_0b110 = 0b110;
constexpr uint64_t literal_0b11111 = 0b11111;
constexpr uint64_t literal_0x00E = 0x00E;
constexpr uint64_t literal_0x000 = 0x000;
@@ -63,6 +64,8 @@ fapi2::ReturnCode p9_mmu_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_HW414700, TGT0, l_TGT0_ATTR_CHIP_EC_FEATURE_HW414700));
fapi2::ATTR_PROC_FABRIC_PUMP_MODE_Type l_TGT1_ATTR_PROC_FABRIC_PUMP_MODE;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_PUMP_MODE, TGT1, l_TGT1_ATTR_PROC_FABRIC_PUMP_MODE));
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
fapi2::buffer<uint64_t> l_scom_buffer;
{
FAPI_TRY(fapi2::getScom( TGT0, 0x5012c03ull, l_scom_buffer ));
@@ -206,6 +209,20 @@ fapi2::ReturnCode p9_mmu_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
FAPI_TRY(fapi2::putScom(TGT0, 0x5012c47ull, l_scom_buffer));
}
{
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) || ((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
+ FAPI_TRY(fapi2::getScom( TGT0, 0x5012c4cull, l_scom_buffer ));
+
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<0, 3, 61, uint64_t>(literal_0b110 );
+ }
+
+ FAPI_TRY(fapi2::putScom(TGT0, 0x5012c4cull, l_scom_buffer));
+ }
+ }
+ {
FAPI_TRY(fapi2::getScom( TGT0, 0x5012c52ull, l_scom_buffer ));
l_scom_buffer.insert<30, 1, 59, uint64_t>(literal_0b11111 );
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9_npu_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9_npu_scom.C
index 6736c2e69..0b0377b37 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9_npu_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9_npu_scom.C
@@ -71,6 +71,7 @@ constexpr uint64_t literal_0x000801A200000000 = 0x000801A200000000;
constexpr uint64_t literal_0xFFFF0BFFF0000000 = 0xFFFF0BFFF0000000;
constexpr uint64_t literal_0x009A48180F01FFFF = 0x009A48180F01FFFF;
constexpr uint64_t literal_0x8005000200500000 = 0x8005000200500000;
+constexpr uint64_t literal_0b10 = 0b10;
constexpr uint64_t literal_0x0000F40000000003 = 0x0000F40000000003;
constexpr uint64_t literal_0xF000003FF00C0FFF = 0xF000003FF00C0FFF;
constexpr uint64_t literal_0x0000100000024000 = 0x0000100000024000;
@@ -120,6 +121,8 @@ fapi2::ReturnCode p9_npu_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_DISABLE_NPU_FREEZE, TGT0,
l_TGT0_ATTR_CHIP_EC_FEATURE_DISABLE_NPU_FREEZE));
uint64_t l_def_ENABLE_NPU_FREEZE = (l_TGT0_ATTR_CHIP_EC_FEATURE_DISABLE_NPU_FREEZE == literal_0);
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
fapi2::buffer<uint64_t> l_scom_buffer;
{
if (((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
@@ -6528,6 +6531,32 @@ fapi2::ReturnCode p9_npu_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
}
}
{
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) || ((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
+ FAPI_TRY(fapi2::getScom( TGT0, 0x5013c0aull, l_scom_buffer ));
+
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<0, 2, 62, uint64_t>(literal_0b10 );
+ }
+ }
+
+ if (((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<0, 2, 62, uint64_t>(literal_0b10 );
+ }
+ }
+
+ FAPI_TRY(fapi2::putScom(TGT0, 0x5013c0aull, l_scom_buffer));
+ }
+ }
+ {
if (((l_chip_id == 0x5) && (l_chip_ec == 0x20)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x21)) || ((l_chip_id == 0x5)
&& (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x10))
|| ((l_chip_id == 0x6) && (l_chip_ec == 0x11)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6)
@@ -6801,6 +6830,19 @@ fapi2::ReturnCode p9_npu_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
{
if (((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
{
+ FAPI_TRY(fapi2::getScom( TGT0, 0x5013ccaull, l_scom_buffer ));
+
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<0, 2, 62, uint64_t>(literal_0b10 );
+ }
+
+ FAPI_TRY(fapi2::putScom(TGT0, 0x5013ccaull, l_scom_buffer));
+ }
+ }
+ {
+ if (((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
FAPI_TRY(fapi2::getScom( TGT0, 0x5013d03ull, l_scom_buffer ));
if (((l_def_NVLINK_ACTIVE == literal_1) && (l_def_ENABLE_NPU_FREEZE == literal_0)))
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9_nx_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9_nx_scom.C
index c563c6710..b08ba5471 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9_nx_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9_nx_scom.C
@@ -35,6 +35,7 @@ constexpr uint64_t literal_0b1 = 0b1;
constexpr uint64_t literal_0b11 = 0b11;
constexpr uint64_t literal_0b00 = 0b00;
constexpr uint64_t literal_0 = 0;
+constexpr uint64_t literal_0b10 = 0b10;
constexpr uint64_t literal_0xFC = 0xFC;
constexpr uint64_t literal_8 = 8;
constexpr uint64_t literal_2 = 2;
@@ -61,6 +62,8 @@ fapi2::ReturnCode p9_nx_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID));
fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID_Type l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID));
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
fapi2::buffer<uint64_t> l_scom_buffer;
{
FAPI_TRY(fapi2::getScom( TGT0, 0x2011041ull, l_scom_buffer ));
@@ -665,6 +668,15 @@ fapi2::ReturnCode p9_nx_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
l_scom_buffer.insert<60, 3, 61, uint64_t>(l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID );
}
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) || ((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<34, 2, 62, uint64_t>(literal_0b10 );
+ }
+ }
+
if (((l_chip_id == 0x5) && (l_chip_ec == 0x20)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5)
&& (l_chip_ec == 0x23)) )
{
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9_vas_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9_vas_scom.C
index 801ba3aaf..fa2710824 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9_vas_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9_vas_scom.C
@@ -35,6 +35,7 @@ constexpr uint64_t literal_0 = 0;
constexpr uint64_t literal_0x00DD0201C0000000 = 0x00DD0201C0000000;
constexpr uint64_t literal_0x00DF0201C0000000 = 0x00DF0201C0000000;
constexpr uint64_t literal_0x0080000000000000 = 0x0080000000000000;
+constexpr uint64_t literal_0b10 = 0b10;
constexpr uint64_t literal_0x1 = 0x1;
constexpr uint64_t literal_0xFC = 0xFC;
@@ -52,6 +53,8 @@ fapi2::ReturnCode p9_vas_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID));
fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID_Type l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID, TGT1, l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID));
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
fapi2::ATTR_PROC_FABRIC_PUMP_MODE_Type l_TGT1_ATTR_PROC_FABRIC_PUMP_MODE;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_PUMP_MODE, TGT1, l_TGT1_ATTR_PROC_FABRIC_PUMP_MODE));
fapi2::buffer<uint64_t> l_scom_buffer;
@@ -118,29 +121,32 @@ fapi2::ReturnCode p9_vas_scom(const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>&
}
}
{
- if (((l_chip_id == 0x5) && (l_chip_ec == 0x10)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x20)) || ((l_chip_id == 0x5)
- && (l_chip_ec == 0x21)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23))
- || ((l_chip_id == 0x6) && (l_chip_ec == 0x10)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x11)) || ((l_chip_id == 0x6)
- && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) )
- {
- FAPI_TRY(fapi2::getScom( TGT0, 0x301184dull, l_scom_buffer ));
+ FAPI_TRY(fapi2::getScom( TGT0, 0x301184dull, l_scom_buffer ));
- if (((l_chip_id == 0x5) && (l_chip_ec == 0x20)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x21)) || ((l_chip_id == 0x5)
- && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x10))
- || ((l_chip_id == 0x6) && (l_chip_ec == 0x11)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6)
- && (l_chip_ec == 0x13)) )
- {
- l_scom_buffer.insert<0, 4, 60, uint64_t>(l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID );
- l_scom_buffer.insert<4, 3, 61, uint64_t>(l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID );
- }
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x20)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x21)) || ((l_chip_id == 0x5)
+ && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x10))
+ || ((l_chip_id == 0x6) && (l_chip_ec == 0x11)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x13)) )
+ {
+ l_scom_buffer.insert<0, 4, 60, uint64_t>(l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_GROUP_ID );
+ l_scom_buffer.insert<4, 3, 61, uint64_t>(l_TGT1_ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID );
+ }
- if (((l_chip_id == 0x5) && (l_chip_ec == 0x10)) )
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) || ((l_chip_id == 0x6)
+ && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) || ((l_chip_id == 0x7) && (l_chip_ec == 0x10)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
{
- l_scom_buffer.insert<19, 1, 63, uint64_t>(literal_0x1 );
+ l_scom_buffer.insert<11, 2, 62, uint64_t>(literal_0b10 );
}
+ }
- FAPI_TRY(fapi2::putScom(TGT0, 0x301184dull, l_scom_buffer));
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x10)) )
+ {
+ l_scom_buffer.insert<19, 1, 63, uint64_t>(literal_0x1 );
}
+
+ FAPI_TRY(fapi2::putScom(TGT0, 0x301184dull, l_scom_buffer));
}
{
FAPI_TRY(fapi2::getScom( TGT0, 0x301184eull, l_scom_buffer ));
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9c_mi_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9c_mi_scom.C
index 24d504147..8b526c36e 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9c_mi_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9c_mi_scom.C
@@ -44,6 +44,7 @@ constexpr uint64_t literal_1400 = 1400;
constexpr uint64_t literal_1500 = 1500;
constexpr uint64_t literal_0b0000000000001000000 = 0b0000000000001000000;
constexpr uint64_t literal_0b0000000000001000 = 0b0000000000001000;
+constexpr uint64_t literal_0b10 = 0b10;
constexpr uint64_t literal_0b01 = 0b01;
constexpr uint64_t literal_5 = 5;
@@ -79,6 +80,8 @@ fapi2::ReturnCode p9c_mi_scom(const fapi2::Target<fapi2::TARGET_TYPE_MI>& TGT0,
l_TGT2_ATTR_CHIP_EC_FEATURE_HW423533_P9UDD11_MDI));
uint64_t l_def_ENABLE_AMO_CACHING = literal_1;
uint64_t l_def_ENABLE_HWFM = literal_1;
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
uint64_t l_def_ENABLE_MCU_TIMEOUTS = literal_1;
fapi2::buffer<uint64_t> l_scom_buffer;
{
@@ -272,6 +275,14 @@ fapi2::ReturnCode p9c_mi_scom(const fapi2::Target<fapi2::TARGET_TYPE_MI>& TGT0,
l_scom_buffer.insert<46, 1, 63, uint64_t>(l_MC01_PBI01_SCOMFIR_MCMODE2_MCHWFM_ENABLE_OFF );
}
+ if (((l_chip_id == 0x6) && (l_chip_ec == 0x12)) || ((l_chip_id == 0x6) && (l_chip_ec == 0x13)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<19, 2, 62, uint64_t>(literal_0b10 );
+ }
+ }
+
FAPI_TRY(fapi2::putScom(TGT0, 0x5010813ull, l_scom_buffer));
}
{
diff --git a/src/import/chips/p9/procedures/hwp/initfiles/p9n_mcs_scom.C b/src/import/chips/p9/procedures/hwp/initfiles/p9n_mcs_scom.C
index 7c195fc9b..9b28a4810 100644
--- a/src/import/chips/p9/procedures/hwp/initfiles/p9n_mcs_scom.C
+++ b/src/import/chips/p9/procedures/hwp/initfiles/p9n_mcs_scom.C
@@ -36,6 +36,7 @@ constexpr uint64_t literal_8 = 8;
constexpr uint64_t literal_25 = 25;
constexpr uint64_t literal_0b001111 = 0b001111;
constexpr uint64_t literal_0b0000000000001000000 = 0b0000000000001000000;
+constexpr uint64_t literal_0b10 = 0b10;
constexpr uint64_t literal_0b0001100000000 = 0b0001100000000;
constexpr uint64_t literal_1350 = 1350;
constexpr uint64_t literal_1000 = 1000;
@@ -56,6 +57,8 @@ fapi2::ReturnCode p9n_mcs_scom(const fapi2::Target<fapi2::TARGET_TYPE_MCS>& TGT0
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_HW398139, TGT2, l_TGT2_ATTR_CHIP_EC_FEATURE_HW398139));
fapi2::ATTR_ENABLE_MEM_EARLY_DATA_SCOM_Type l_TGT1_ATTR_ENABLE_MEM_EARLY_DATA_SCOM;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_ENABLE_MEM_EARLY_DATA_SCOM, TGT1, l_TGT1_ATTR_ENABLE_MEM_EARLY_DATA_SCOM));
+ fapi2::ATTR_SMF_CONFIG_Type l_TGT1_ATTR_SMF_CONFIG;
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, TGT1, l_TGT1_ATTR_SMF_CONFIG));
fapi2::ATTR_RISK_LEVEL_Type l_TGT1_ATTR_RISK_LEVEL;
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_RISK_LEVEL, TGT1, l_TGT1_ATTR_RISK_LEVEL));
fapi2::ATTR_FREQ_PB_MHZ_Type l_TGT1_ATTR_FREQ_PB_MHZ;
@@ -176,6 +179,14 @@ fapi2::ReturnCode p9n_mcs_scom(const fapi2::Target<fapi2::TARGET_TYPE_MCS>& TGT0
{
FAPI_TRY(fapi2::getScom( TGT0, 0x5010813ull, l_scom_buffer ));
+ if (((l_chip_id == 0x5) && (l_chip_ec == 0x22)) || ((l_chip_id == 0x5) && (l_chip_ec == 0x23)) )
+ {
+ if ((l_TGT1_ATTR_SMF_CONFIG == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED))
+ {
+ l_scom_buffer.insert<19, 2, 62, uint64_t>(literal_0b10 );
+ }
+ }
+
if (((l_chip_id == 0x5) && (l_chip_ec == 0x10)) )
{
if ((l_TGT1_ATTR_RISK_LEVEL == literal_0))
diff --git a/src/import/chips/p9/procedures/hwp/lib/p9_hcd_memmap_base.H b/src/import/chips/p9/procedures/hwp/lib/p9_hcd_memmap_base.H
index 7aef823f8..06b5a61d7 100644
--- a/src/import/chips/p9/procedures/hwp/lib/p9_hcd_memmap_base.H
+++ b/src/import/chips/p9/procedures/hwp/lib/p9_hcd_memmap_base.H
@@ -237,6 +237,7 @@ HCD_CONST(SGPE_ENABLE_MEM_EARLY_DATA_SCOM_POS, 0x00008000)
HCD_CONST(SGPE_PROC_FAB_PUMP_MODE_BIT_POS, 0x00004000)
HCD_CONST(SGPE_CACHE_SKEWADJ_DISABLE_BIT_POS, 0x00002000)
HCD_CONST(SGPE_CACHE_DCADJ_DISABLE_BIT_POS, 0x00001000)
+HCD_CONST(SGPE_PROC_SMF_CONFIG_BIT_POS, 0x00000800)
///24x7
HCD_CONST(QPMR_AUX_OFFSET, (512 * ONE_KB))
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C b/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C
index a01d20298..5cd11f3b3 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.C
@@ -266,6 +266,8 @@ fapi2::ReturnCode p9_fbc_utils_get_chip_base_address(
fapi2::ATTR_CHIP_EC_FEATURE_EXTENDED_ADDRESSING_MODE_Type l_extended_addressing_mode;
fapi2::ATTR_CHIP_EC_FEATURE_HW423589_OPTION2_Type l_hw423589_option2;
+ fapi2::ATTR_CHIP_EC_FEATURE_SMF_SUPPORTED_Type l_smf_supported;
+ fapi2::ATTR_SMF_CONFIG_Type l_smf_config;
FAPI_TRY(p9_fbc_utils_get_chip_base_address_no_aliases(i_target,
i_addr_mode,
@@ -294,6 +296,18 @@ fapi2::ReturnCode p9_fbc_utils_get_chip_base_address(
l_addr_extension_chip_id),
"Error from FAPI_ATTR_GET (ATTR_FABRIC_ADDR_EXTENSION_CHIP_ID");
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, FAPI_SYSTEM, l_smf_config),
+ "Error from FAPI_ATTR_GET (ATTR_SMF_CONFIG)");
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_SMF_SUPPORTED, i_target, l_smf_supported),
+ "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_SMF_SUPPORTED)");
+
+ // mask group_id(0) to prevent it from being exposed to callers if smf is enabled
+ if (l_smf_config && l_smf_supported)
+ {
+ l_addr_extension_group_id &= ~CHIP_ADDRESS_EXTENSION_GROUP_ID_MASK_SMF_ENABLE;
+ }
+
// mask all but LSB, prevent regions above RA bit 21 from being exposed to callers
l_addr_extension_chip_id &= 0x01;
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.H b/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.H
index 423855624..588cf5b4a 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.H
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_fbc_utils.H
@@ -72,6 +72,10 @@ const uint64_t FABRIC_CACHELINE_SIZE = 0x80;
const uint8_t CHIP_ADDRESS_EXTENSION_GROUP_ID_MASK_HW423589_OPTION2 = 0x0;
const uint8_t CHIP_ADDRESS_EXTENSION_CHIP_ID_MASK_HW423589_OPTION2 = 0x7;
+// chip address extension mask, for SMF_ENABLE
+// repurposes group ID(0) as secure memory indicator
+const uint8_t CHIP_ADDRESS_EXTENSION_GROUP_ID_MASK_SMF_ENABLE = 0x8;
+
const uint64_t MAX_INTERLEAVE_GROUP_SIZE = 0x40000000000ULL; // 4_TB
const uint64_t MAX_INTERLEAVE_GROUP_SIZE_HW423589_OPTION2 = 0x8000000000ULL; // 512_GB
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C b/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C
index 2552568a0..0149317da 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.C
@@ -112,6 +112,9 @@ struct EffGroupingSysAttrs
uint8_t iv_selectiveMode = 0; // ATTR_MEM_MIRROR_PLACEMENT_POLICY
uint8_t iv_hwMirrorEnabled = 0; // ATTR_MRW_HW_MIRRORING_ENABLE
uint8_t iv_groupsAllowed = 0; // ATTR_MSS_INTERLEAVE_ENABLE
+ uint8_t iv_smfSupported = 0; // ATTR_CHIP_EC_FEATURE_SMF_SUPPORTED
+ uint8_t iv_smfConfig = 0; // ATTR_SMF_CONFIG
+ uint8_t iv_smfEnabled = 0; // ATTR_SMF_ENABLED
};
// See doxygen in struct definition.
@@ -144,6 +147,14 @@ fapi2::ReturnCode EffGroupingSysAttrs::getAttrs()
FAPI_DBG("Extended addressing supported: %d, HW423589 option2: %d",
l_extended_addressing_mode,
l_hw423589_option2);
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG, FAPI_SYSTEM, iv_smfConfig),
+ "Error from FAPI_ATTR_GET (ATTR_SMF_CONFIG)");
+
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CHIP_EC_FEATURE_SMF_SUPPORTED, l_targets.front(), iv_smfSupported),
+ "Error from FAPI_ATTR_GET (ATTR_CHIP_EC_FEATURE_SMF_SUPPORTED)");
+
+ FAPI_DBG("SMF config: %d, supported: %d", iv_smfConfig, iv_smfSupported);
}
if (l_extended_addressing_mode)
@@ -154,6 +165,12 @@ fapi2::ReturnCode EffGroupingSysAttrs::getAttrs()
l_addr_extension_chip_id = CHIP_ADDRESS_EXTENSION_CHIP_ID_MASK_HW423589_OPTION2;
}
+ if (iv_smfConfig && iv_smfSupported)
+ {
+ l_addr_extension_group_id |= CHIP_ADDRESS_EXTENSION_GROUP_ID_MASK_SMF_ENABLE;
+ iv_smfEnabled = fapi2::ENUM_ATTR_SMF_ENABLED_TRUE;
+ }
+
// enable extended addressing mode, seed attributes from defaults
// should allow for testing alternate configurations via Cronus with const
// attribute overrides
@@ -185,6 +202,11 @@ fapi2::ReturnCode EffGroupingSysAttrs::getAttrs()
l_max_interleave_group_size),
"Error from FAPI_ATTR_SET (ATTR_MAX_INTERLEAVE_GROUP_SIZE)");
+ // Set smf enabled attribute
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_SMF_ENABLED,
+ FAPI_SYSTEM, iv_smfEnabled),
+ "Error from FAPI_ATTR_SET (ATTR_SMF_ENABLED)");
+
// Get mirror placement policy
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_MEM_MIRROR_PLACEMENT_POLICY,
FAPI_SYSTEM, iv_selectiveMode),
@@ -237,6 +259,7 @@ fapi2::ReturnCode EffGroupingSysAttrs::getAttrs()
FAPI_INF(" ATTR_MEM_MIRROR_PLACEMENT_POLICY 0x%.8X", iv_selectiveMode);
FAPI_INF(" ATTR_MRW_HW_MIRRORING_ENABLE 0x%.8X", iv_hwMirrorEnabled);
FAPI_INF(" ATTR_MSS_INTERLEAVE_ENABLE 0x%.8X", iv_groupsAllowed);
+ FAPI_INF(" ATTR_SMF_ENABLED 0x%X", iv_smfEnabled);
fapi_try_exit:
FAPI_DBG("Exiting EffGroupingSysAttrs::getAttrs");
@@ -292,6 +315,9 @@ struct EffGroupingProcAttrs
uint64_t iv_chtmBarSizes[NUM_OF_CHTM_REGIONS]; // ATTR_PROC_CHTM_BAR_SIZES
uint64_t iv_occSandboxSize = 0; // ATTR_PROC_OCC_SANDBOX_SIZE
+
+ uint64_t iv_smfBarSize = 0; // ATTR_PROC_SMF_BAR_SIZE
+
uint32_t iv_fabricSystemId = 0; // ATTR_PROC_FABRIC_SYSTEM_ID
uint8_t iv_fabricGroupId = 0; // ATTR_PROC_FABRIC_GROUP_ID
uint8_t iv_fabricChipId = 0; // ATTR_PROC_FABRIC_CHIP_ID
@@ -354,6 +380,12 @@ fapi2::ReturnCode EffGroupingProcAttrs::getAttrs(
"Error getting ATTR_PROC_OCC_SANDBOX_SIZE, l_rc 0x%.8X",
(uint64_t)fapi2::current_err);
+ // Get Secure Memory (SMF) bar size
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_SMF_BAR_SIZE, i_target,
+ iv_smfBarSize),
+ "Error getting ATTR_PROC_SMF_BAR_SIZE, l_rc 0x%.8X",
+ (uint64_t)fapi2::current_err);
+
// Get Fabric system ID
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_SYSTEM_ID, i_target,
iv_fabricSystemId),
@@ -388,6 +420,7 @@ fapi2::ReturnCode EffGroupingProcAttrs::getAttrs(
}
FAPI_INF(" ATTR_PROC_OCC_SANDBOX_SIZE 0x%.16llX", iv_occSandboxSize);
+ FAPI_INF(" ATTR_PROC_SMF_BAR_SIZE 0x%.16llX", iv_smfBarSize);
FAPI_INF(" ATTR_PROC_FABRIC_SYSTEM_ID 0x%.8X", iv_fabricSystemId);
FAPI_INF(" ATTR_PROC_FABRIC_GROUP_ID 0x%.8X", iv_fabricGroupId);
FAPI_INF(" ATTR_PROC_FABRIC_CHIP_ID 0x%.8X", iv_fabricChipId);
@@ -855,6 +888,22 @@ struct EffGroupingBaseSizeData
const EffGroupingProcAttrs& i_procAttrs);
///
+ /// @brief Setting SMF base addresses based on bar size
+ ///
+ /// @param[in] i_target Reference to Processor Chip Target
+ /// @param[in] i_sysAttrs System attribute settings
+ /// @param[in] i_procAttrs Proc attribute values
+ /// @param[in] io_groupData Effective grouping data info
+ ///
+ /// @return FAPI2_RC_SUCCESS if success, else error code.
+ ///
+ fapi2::ReturnCode setSMFBaseSizeData(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const EffGroupingSysAttrs& i_sysAttrs,
+ const EffGroupingProcAttrs& i_procAttrs,
+ EffGroupingData& io_groupData);
+
+ ///
/// @brief setBaseSizeAttr
/// Function that set base and size attribute values for both mirror
/// and non-mirror based on given base/size data.
@@ -881,6 +930,7 @@ struct EffGroupingBaseSizeData
uint64_t iv_mirror_sizes[NUM_MIRROR_REGIONS];
uint64_t iv_mirror_sizes_ack[NUM_MIRROR_REGIONS];
+ uint64_t iv_smf_bar_base = 0;
uint64_t iv_occ_sandbox_base = 0;
uint64_t iv_nhtm_bar_base = 0;
uint64_t iv_chtm_bar_bases[NUM_OF_CHTM_REGIONS];
@@ -1195,7 +1245,7 @@ fapi2::ReturnCode EffGroupingBaseSizeData::set_HTM_OCC_base_addr(
{
FAPI_ASSERT(l_mem_sizes[l_index] >= l_htmOccSize,
fapi2::MSS_EFF_GROUPING_HTM_OCC_BAR_NOT_POSSIBLE()
- .set_AJUSTED_SIZE(l_mem_sizes[l_index])
+ .set_ADJUSTED_SIZE(l_mem_sizes[l_index])
.set_NHTM_TOTAL_BAR_SIZE(l_nhtmSize)
.set_CHTM_TOTAL_BAR_SIZE(l_chtmSize)
.set_OCC_SANDBOX_BAR_SIZE(i_procAttrs.iv_occSandboxSize)
@@ -1295,6 +1345,197 @@ fapi_try_exit:
return fapi2::current_err;
}
+// See description in struct definition
+fapi2::ReturnCode EffGroupingBaseSizeData::setSMFBaseSizeData(
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP>& i_target,
+ const EffGroupingSysAttrs& i_sysAttrs,
+ const EffGroupingProcAttrs& i_procAttrs,
+ EffGroupingData& io_groupData)
+{
+ FAPI_DBG("Entering");
+
+ // Hold mem bases & sizes for mirror/non-mirror
+ uint64_t l_mem_bases[NUM_NON_MIRROR_REGIONS];
+ uint64_t l_mem_sizes[NUM_NON_MIRROR_REGIONS];
+ uint64_t l_smf_bases[NUM_NON_MIRROR_REGIONS];
+ uint64_t l_smf_sizes[NUM_NON_MIRROR_REGIONS];
+ uint64_t l_smf_valid[NUM_NON_MIRROR_REGIONS];
+ uint8_t l_numRegions = 0;
+ uint8_t l_memHole = 0;
+ uint8_t l_index = 0;
+ uint64_t l_accMemSize = 0;
+ uint64_t l_totalSize = 0;
+ uint64_t l_memSizeAfterSmf = 0;
+
+ // Set local variables with attribute values
+ uint64_t l_smfTotalSize = i_procAttrs.iv_smfBarSize;
+ uint64_t l_smfSupported = i_sysAttrs.iv_smfSupported;
+ uint64_t l_smfConfig = i_sysAttrs.iv_smfConfig;
+ uint64_t l_smfEnabled = i_sysAttrs.iv_smfEnabled;
+
+ // No SMF space requested, exit
+ if (l_smfTotalSize == 0)
+ {
+ FAPI_INF("setSMFBaseSizeData: No SMF memory requested.");
+ goto fapi_try_exit;
+ }
+
+ // Determine whether secure memory region can be enabled
+ FAPI_ASSERT(l_smfEnabled != 0,
+ fapi2::MSS_EFF_GROUPING_SMF_NOT_ENABLED_OR_SUPPORTED()
+ .set_SMF_SUPPORTED(l_smfSupported)
+ .set_SMF_CONFIG(l_smfConfig)
+ .set_SMF_ENABLED(l_smfEnabled)
+ .set_SMF_TOTAL_BAR_SIZE(l_smfTotalSize),
+ "EffGroupingBaseSizeData::setSMFBaseSizeData: Requirements to "
+ "enable a secure memory space not met. "
+ "smfSupported 0x%llX, smfConfig 0x%llX, smfEnabled 0x%llX, smfSize 0x%.16llX",
+ l_smfSupported, l_smfConfig, l_smfEnabled, l_smfTotalSize);
+
+ // Setup mem base and size working array depending on mirror setting
+ if (i_sysAttrs.iv_selectiveMode ==
+ fapi2::ENUM_ATTR_MEM_MIRROR_PLACEMENT_POLICY_NORMAL) // Normal
+ {
+ l_numRegions = NUM_NON_MIRROR_REGIONS;
+ memcpy(l_mem_bases, iv_mem_bases, sizeof(iv_mem_bases));
+ memcpy(l_mem_sizes, iv_memory_sizes, sizeof(iv_memory_sizes));
+ }
+ else // Flipped
+ {
+ l_numRegions = NUM_MIRROR_REGIONS;
+ memcpy(l_mem_bases, iv_mirror_bases, sizeof(iv_mirror_bases));
+ memcpy(l_mem_sizes, iv_mirror_sizes, sizeof(iv_mirror_sizes));
+ }
+
+ // Setup smf base and size working array
+ memset(l_smf_valid, 0, sizeof(l_smf_valid));
+ memset(l_smf_bases, 0, sizeof(l_smf_bases));
+ memset(l_smf_sizes, 0, sizeof(l_smf_sizes));
+
+ // Calculate total available memory
+ for (uint8_t ii = 0; ii < l_numRegions; ii++)
+ {
+ l_totalSize += l_mem_sizes[ii];
+
+ for (uint8_t jj = 0; jj < NUM_OF_ALT_MEM_REGIONS; jj++)
+ {
+ if (io_groupData.iv_data[ii][ALT_VALID(jj)])
+ {
+ l_memHole++;
+ }
+ }
+ }
+
+ FAPI_INF("Total memory size = %.16lld bytes (%d GB) , l_memHole %d",
+ l_totalSize, l_totalSize >> 30, l_memHole);
+
+ // Error if total memory is not enough for requested SMF
+ FAPI_ASSERT(l_totalSize >= l_smfTotalSize,
+ fapi2::MSS_EFF_GROUPING_NO_SPACE_FOR_SMF_BAR()
+ .set_TOTAL_SIZE(l_totalSize)
+ .set_SMF_TOTAL_BAR_SIZE(l_smfTotalSize)
+ .set_MIRROR_PLACEMENT_POLICY(i_sysAttrs.iv_selectiveMode),
+ "EffGroupingBaseSizeData::setSMFBaseSizeData: Required memory "
+ "space for requested SMF BAR is not available. "
+ "Placement policy %u, MemSize 0x%.16llX, SmfSize 0x%.16llX",
+ i_sysAttrs.iv_selectiveMode, l_totalSize, l_smfTotalSize);
+
+ // Calculate which memory region the SMF memory starts
+ l_memSizeAfterSmf = l_totalSize - l_smfTotalSize;
+ FAPI_DBG("Memsize available after SMF: %.16lld (%d GB)",
+ l_memSizeAfterSmf, l_memSizeAfterSmf >> 30);
+
+ l_index = getMemoryRegionIndex(l_mem_bases[0] + l_memSizeAfterSmf,
+ i_sysAttrs,
+ l_accMemSize);
+
+ // Adjusted memory size for region where SMF starts
+ l_mem_sizes[l_index] = l_mem_sizes[l_index] -
+ (l_accMemSize - l_memSizeAfterSmf);
+
+ FAPI_DBG("Adjusted memsize at index - l_mem_sizes[%d] = %.16lld (%d GB)",
+ l_index, l_mem_sizes[l_index], l_mem_sizes[l_index] >> 30);
+
+ if (l_memHole)
+ {
+ FAPI_ASSERT(l_mem_sizes[l_index] >= l_smfTotalSize,
+ fapi2::MSS_EFF_GROUPING_SMF_BAR_NOT_POSSIBLE()
+ .set_ADJUSTED_SIZE(l_mem_sizes[l_index])
+ .set_SMF_TOTAL_BAR_SIZE(l_smfTotalSize)
+ .set_MIRROR_PLACEMENT_POLICY(i_sysAttrs.iv_selectiveMode),
+ "EffGroupingBaseSizeData::setSMFBaseSizeData: Memory SMF "
+ "BAR not possible, Placement policy %u, "
+ "MemorySizes[%d] 0x%.16llX, SmfSize 0x%.16llX",
+ i_sysAttrs.iv_selectiveMode, l_index, l_mem_sizes[l_index],
+ l_smfTotalSize);
+ }
+
+ // Setting SMF base address for ATTR_PROC_SMF_BAR_BASE_ADDR
+ // Also sets addr(15) to indicate secure memory base address
+ iv_smf_bar_base = l_mem_bases[l_index] + l_mem_sizes[l_index];
+ iv_smf_bar_base |= ((uint64_t)1 << (63 - 15));
+
+ // Allocate SMF base address and size for region where SMF starts
+ l_smf_bases[l_index] = l_mem_bases[l_index] + l_mem_sizes[l_index];
+ l_smf_sizes[l_index] = (l_accMemSize - l_memSizeAfterSmf);
+ l_smf_valid[l_index] = 1;
+
+ // Redefine memory region for SMF and zero out memory size of regions used by SMF
+ for (uint8_t ii = l_index + 1; ii < l_numRegions; ii++)
+ {
+ l_smf_bases[ii] = l_mem_bases[ii];
+ l_smf_sizes[ii] = l_mem_sizes[ii];
+ l_mem_sizes[ii] = 0;
+
+ if (l_smf_sizes[ii] != 0)
+ {
+ l_smf_valid[ii] = 1;
+ }
+ }
+
+ // Update mem sizes with working array values
+ if (l_numRegions == NUM_NON_MIRROR_REGIONS)
+ {
+ memcpy(iv_memory_sizes, l_mem_sizes, sizeof(iv_memory_sizes));
+ }
+ else
+ {
+ memcpy(iv_mirror_sizes, l_mem_sizes, sizeof(iv_mirror_sizes));
+ }
+
+ // Update SMF data in groupData variable for ATTR_MSS_MCS_GROUP_32
+ // Note: Lower address is compared against addr(22:35)
+ for (uint8_t ii = 0; ii < io_groupData.iv_numGroups; ii++)
+ {
+ io_groupData.iv_data[ii][SMF_VALID] = l_smf_valid[ii];
+ io_groupData.iv_data[ii][SMF_SIZE] = l_smf_sizes[ii] >> (63 - 35);
+ io_groupData.iv_data[ii][SMF_BASE_ADDR] = l_smf_bases[ii] >> (63 - 35);
+ }
+
+ // Result traces
+ FAPI_INF("EffGroupingBaseSizeData::setSMFBaseSizeData");
+ FAPI_INF(" Placement policy %u, total mem %.16lld (%d GB), smfSize %.16lld (%d GB)",
+ i_sysAttrs.iv_selectiveMode, l_totalSize, l_totalSize >> 30,
+ l_smfTotalSize, l_smfTotalSize >> 30);
+
+ for (uint8_t ii = 0; ii < l_numRegions; ii++)
+ {
+ FAPI_INF(" Index: %d, iv_mem_bases 0x%.16llX, iv_memory_sizes 0x%.16llX",
+ ii, l_mem_bases[ii], l_mem_sizes[ii]);
+ }
+
+ FAPI_INF("SMF_BASE %.16lld (%d GB)", iv_smf_bar_base, iv_smf_bar_base >> 30);
+
+ for (uint8_t ii = 0; ii < l_numRegions; ii++)
+ {
+ FAPI_INF(" Index: %d, iv_smf_bases 0x%.16llX, iv_smf_sizes 0x%.16llX",
+ ii, l_smf_bases[ii], l_smf_sizes[ii]);
+ }
+
+fapi_try_exit:
+ FAPI_DBG("Exiting");
+ return fapi2::current_err;
+}
// See description in struct definition
fapi2::ReturnCode EffGroupingBaseSizeData::setBaseSizeAttr(
@@ -1338,7 +1579,7 @@ fapi2::ReturnCode EffGroupingBaseSizeData::setBaseSizeAttr(
// Set ATTR_PROC_NHTM_BAR_BASE_ADDR
FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_NHTM_BAR_BASE_ADDR, i_target,
iv_nhtm_bar_base),
- "Error setting ATTR_PROC_HTM_BAR_BASE_ADDR, "
+ "Error setting ATTR_PROC_NHTM_BAR_BASE_ADDR, "
"l_rc 0x%.8X", (uint64_t)fapi2::current_err);
// Set ATTR_PROC_CHTM_BAR_BASE_ADDR
@@ -1353,6 +1594,12 @@ fapi2::ReturnCode EffGroupingBaseSizeData::setBaseSizeAttr(
"Error setting ATTR_PROC_OCC_SANDBOX_BASE_ADDR, l_rc 0x%.8X",
(uint64_t)fapi2::current_err);
+ // Set ATTR_PROC_SMF_BAR_BASE_ADDR
+ FAPI_TRY(FAPI_ATTR_SET(fapi2::ATTR_PROC_SMF_BAR_BASE_ADDR, i_target,
+ iv_smf_bar_base),
+ "Error setting ATTR_PROC_SMF_BAR_BASE_ADDR, "
+ "l_rc 0x%.8X", (uint64_t)fapi2::current_err);
+
// Mirror mode attribute setting
if (i_sysAttrs.iv_hwMirrorEnabled != fapi2::ENUM_ATTR_MRW_HW_MIRRORING_ENABLE_FALSE)
{
@@ -1414,6 +1661,9 @@ fapi2::ReturnCode EffGroupingBaseSizeData::setBaseSizeAttr(
FAPI_INF("ATTR_PROC_OCC_SANDBOX_BASE_ADDR: 0x%.16llX (%d GB)",
iv_occ_sandbox_base, iv_occ_sandbox_base >> 30);
+ FAPI_INF("ATTR_PROC_SMF_BAR_BASE_ADDR : 0x%.16llX (%d GB)",
+ iv_smf_bar_base, iv_smf_bar_base >> 30);
+
// Display mirror mode attribute values
if (i_sysAttrs.iv_hwMirrorEnabled != fapi2::ENUM_ATTR_MRW_HW_MIRRORING_ENABLE_FALSE)
{
@@ -3469,6 +3719,12 @@ fapi2::ReturnCode p9_mss_eff_grouping(
// Set memory base and size
l_baseSizeData.setBaseSizeData(l_sysAttrs, l_groupData);
+ // Set SMF base addresses
+ FAPI_TRY(l_baseSizeData.setSMFBaseSizeData(i_target, l_sysAttrs,
+ l_procAttrs, l_groupData),
+ "setSMFBaseSizeData() returns error l_rc 0x%.8X",
+ (uint64_t)fapi2::current_err);
+
// Set HTM/OCC base addresses
FAPI_TRY(l_baseSizeData.set_HTM_OCC_base_addr(i_target, l_sysAttrs,
l_groupData, l_procAttrs),
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.H b/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.H
index 3f4f2f465..6b9e5370a 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.H
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_mss_eff_grouping.H
@@ -5,7 +5,7 @@
/* */
/* OpenPOWER HostBoot Project */
/* */
-/* Contributors Listed Below - COPYRIGHT 2015,2017 */
+/* Contributors Listed Below - COPYRIGHT 2015,2018 */
/* [+] International Business Machines Corp. */
/* */
/* */
@@ -55,7 +55,7 @@
// Constants used for EffGroupingData struct
const uint8_t DATA_GROUPS = 16; // 8 regular groups, 8 mirrored groups
const uint8_t MIRR_OFFSET = 8; // Start of mirrored offset in DATA_GROUPS
-const uint8_t DATA_ELEMENTS = 18; // 18 items of data for each group
+const uint8_t DATA_ELEMENTS = 21; // 21 items of data for each group
// Indexes used for EffGroupingData::iv_data DATA ELEMENTS
const uint8_t PORT_SIZE = 0; // Memory size of each port in group (GB)
@@ -63,9 +63,12 @@ const uint8_t PORTS_IN_GROUP = 1; // Number of ports in group
const uint8_t GROUP_SIZE = 2; // Memory size of entire group (GB)
const uint8_t BASE_ADDR = 3; // Base Address
#define MEMBER_IDX(X) ((X) + 4) // List of MC ports in group
-#define ALT_VALID(X) ((X) + 12) // Alt Memory valid (2 alt memory regions)
+#define ALT_VALID(X) ((X) + 12) // Alt Memory Valid (2 alt memory regions)
#define ALT_SIZE(X) ((X) + 14) // Alt Memory Size
#define ALT_BASE_ADDR(X) ((X) + 16) // Alt Base Address
+const uint8_t SMF_VALID = 18; // SMF Memory Valid
+const uint8_t SMF_SIZE = 19; // SMF Memory Size
+const uint8_t SMF_BASE_ADDR = 20; // SMF Base Address
// Number of memory regions
const uint8_t NUM_NON_MIRROR_REGIONS = 8;
diff --git a/src/import/chips/p9/procedures/hwp/nest/p9_mss_setup_bars.C b/src/import/chips/p9/procedures/hwp/nest/p9_mss_setup_bars.C
index a2ca88232..d43001262 100644
--- a/src/import/chips/p9/procedures/hwp/nest/p9_mss_setup_bars.C
+++ b/src/import/chips/p9/procedures/hwp/nest/p9_mss_setup_bars.C
@@ -42,6 +42,8 @@
#include <p9_mss_eff_grouping.H>
#include <p9_mc_scom_addresses.H>
#include <p9_mc_scom_addresses_fld.H>
+#include <p9n2_mc_scom_addresses.H>
+#include <p9n2_mc_scom_addresses_fld.H>
#include <map>
#include <generic/memory/lib/utils/memory_size.H>
@@ -125,7 +127,7 @@ struct mcPortGroupInfo_t
*/
inline mcPortGroupInfo_t()
: myGroup(0), numPortsInGroup(0), groupSize(0), groupBaseAddr(0),
- channelId(0)
+ channelId(0), smfMemValid(0), smfMemSize(0), smfBaseAddr(0)
{
memset(altMemValid, 0, sizeof(altMemValid));
memset(altMemSize, 0, sizeof(altMemSize));
@@ -146,6 +148,11 @@ struct mcPortGroupInfo_t
uint8_t altMemValid[NUM_OF_ALT_MEM_REGIONS];
uint32_t altMemSize[NUM_OF_ALT_MEM_REGIONS];
uint32_t altBaseAddr[NUM_OF_ALT_MEM_REGIONS];
+
+ // SMF_MEM
+ uint8_t smfMemValid;
+ uint32_t smfMemSize;
+ uint32_t smfBaseAddr;
};
/**
@@ -162,7 +169,9 @@ struct mcBarData_t
: MCFGP_valid(false), MCFGP_chan_per_group(0),
MCFGP_chan0_group_member_id(0), MCFGP_chan1_group_member_id(0),
MCFGP_group_size(0), MCFGP_groupBaseAddr(0),
- MCFGPM_valid(false), MCFGPM_group_size(0), MCFGPM_groupBaseAddr(0)
+ MCFGPM_valid(false), MCFGPM_group_size(0), MCFGPM_groupBaseAddr(0),
+ MCFGPA_SMF_valid(0), MCFGPA_SMF_LOWER_addr(0), MCFGPA_SMF_UPPER_addr(0),
+ MCFGPMA_SMF_valid(0), MCFGPMA_SMF_LOWER_addr(0), MCFGPMA_SMF_UPPER_addr(0)
{
memset(MCFGPA_HOLE_valid, 0, sizeof(MCFGPA_HOLE_valid));
memset(MCFGPA_HOLE_LOWER_addr, 0, sizeof(MCFGPA_HOLE_LOWER_addr));
@@ -190,11 +199,17 @@ struct mcBarData_t
bool MCFGPA_HOLE_valid[NUM_OF_ALT_MEM_REGIONS];
uint32_t MCFGPA_HOLE_LOWER_addr[NUM_OF_ALT_MEM_REGIONS];
uint32_t MCFGPA_HOLE_UPPER_addr[NUM_OF_ALT_MEM_REGIONS];
+ bool MCFGPA_SMF_valid;
+ uint32_t MCFGPA_SMF_LOWER_addr;
+ uint32_t MCFGPA_SMF_UPPER_addr;
// Info to program MCFGPMA reg
bool MCFGPMA_HOLE_valid[NUM_OF_ALT_MEM_REGIONS];
uint32_t MCFGPMA_HOLE_LOWER_addr[NUM_OF_ALT_MEM_REGIONS];
uint32_t MCFGPMA_HOLE_UPPER_addr[NUM_OF_ALT_MEM_REGIONS];
+ bool MCFGPMA_SMF_valid;
+ uint32_t MCFGPMA_SMF_LOWER_addr;
+ uint32_t MCFGPMA_SMF_UPPER_addr;
};
///----------------------------------------------------------------------------
@@ -707,6 +722,33 @@ fapi2::ReturnCode getNonMirrorBarData(const fapi2::Target<T>& i_mcTarget,
}
+ // SMF Section of MCFGPA and MCFGPMA
+ if ( i_portInfo[0].smfMemValid )
+ {
+ o_mcBarData.MCFGPA_SMF_valid = 1;
+ o_mcBarData.MCFGPA_SMF_LOWER_addr = i_portInfo[0].smfBaseAddr;
+ o_mcBarData.MCFGPA_SMF_UPPER_addr = i_portInfo[0].smfBaseAddr + i_portInfo[0].smfMemSize;
+ }
+ else
+ {
+ o_mcBarData.MCFGPA_SMF_valid = 0;
+ o_mcBarData.MCFGPA_SMF_LOWER_addr = 0;
+ o_mcBarData.MCFGPA_SMF_UPPER_addr = 0;
+ }
+
+ if ( i_portInfo[1].smfMemValid )
+ {
+ o_mcBarData.MCFGPMA_SMF_valid = 1;
+ o_mcBarData.MCFGPMA_SMF_LOWER_addr = i_portInfo[1].smfBaseAddr;
+ o_mcBarData.MCFGPMA_SMF_UPPER_addr = i_portInfo[1].smfBaseAddr + i_portInfo[1].smfMemSize;
+ }
+ else
+ {
+ o_mcBarData.MCFGPMA_SMF_valid = 0;
+ o_mcBarData.MCFGPMA_SMF_LOWER_addr = 0;
+ o_mcBarData.MCFGPMA_SMF_UPPER_addr = 0;
+ }
+
fapi_try_exit:
FAPI_DBG("Exit");
return fapi2::current_err;
@@ -933,6 +975,14 @@ void getPortData(const bool i_nonMirror,
o_portInfo[l_mcPortNum].altBaseAddr[ii] = i_groupData[l_group][ALT_BASE_ADDR(ii)];
}
}
+
+ // SMF memory regions
+ if (i_groupData[l_group][SMF_VALID])
+ {
+ o_portInfo[l_mcPortNum].smfMemValid = 1;
+ o_portInfo[l_mcPortNum].smfMemSize = i_groupData[l_group][SMF_SIZE];
+ o_portInfo[l_mcPortNum].smfBaseAddr = i_groupData[l_group][SMF_BASE_ADDR];
+ }
}
} // Port loop
@@ -1224,6 +1274,14 @@ fapi2::ReturnCode writeMCBarData(
// 3. ---- Set MCFGPA reg -----
l_scomData = 0;
+ // Assert if both HOLE1 and SMF are valid, settings will overlap
+ FAPI_ASSERT((l_data.MCFGPA_HOLE_valid[1] && l_data.MCFGPA_SMF_valid) == 0,
+ fapi2::MSS_SETUP_BARS_HOLE1_SMF_CONFLICT()
+ .set_TARGET(l_target)
+ .set_HOLE1_VALID(l_data.MCFGPA_HOLE_valid[1])
+ .set_SMF_VALID(l_data.MCFGPA_SMF_valid),
+ "Error: MCFGPA HOLE1 and SMF are both valid, settings will overlap");
+
// Hole 0
if (l_data.MCFGPA_HOLE_valid[0] == true)
{
@@ -1242,14 +1300,14 @@ fapi2::ReturnCode writeMCBarData(
// 0b0000000001 = 4GB
l_scomData.insertFromRight<MCS_MCFGPA_HOLE0_UPPER_ADDRESS,
MCS_MCFGPA_HOLE0_UPPER_ADDRESS_LEN>(
- (l_data.MCFGPMA_HOLE_UPPER_addr[0] >> 2));
+ (l_data.MCFGPA_HOLE_UPPER_addr[0] >> 2));
}
// Hole 1
if (l_data.MCFGPA_HOLE_valid[1] == true)
{
// MCFGPA HOLE1 valid (bit 0)
- l_scomData.setBit<MCS_MCFGPA_HOLE0_VALID>();
+ l_scomData.setBit<MCS_MCFGPA_HOLE1_VALID>();
// MCFGPA_HOLE1_UPPER_ADDRESS_AT_END_OF_RANGE
setUpperAddrEndOfRangeBit(l_target, l_scomData);
@@ -1263,7 +1321,26 @@ fapi2::ReturnCode writeMCBarData(
// 0b0000000001 = 4GB
l_scomData.insertFromRight<MCS_MCFGPA_HOLE1_UPPER_ADDRESS,
MCS_MCFGPA_HOLE1_UPPER_ADDRESS_LEN>(
- (l_data.MCFGPMA_HOLE_UPPER_addr[1] >> 2));
+ (l_data.MCFGPA_HOLE_UPPER_addr[1] >> 2));
+ }
+
+ // SMF
+ if (l_data.MCFGPA_SMF_valid == true)
+ {
+ // MCFGPA SMF valid (bit 0)
+ l_scomData.setBit<P9N2_MCS_MCFGPA_SMF_VALID>();
+
+ // MCFGPA_SMF_UPPER_ADDRESS_AT_END_OF_RANGE
+ l_scomData.setBit<P9N2_MCS_MCFGPA_SMF_UPPER_ADDRESS_AT_END_OF_RANGE>();
+
+ // SMF lower addr
+ l_scomData.insertFromRight<P9N2_MCS_MCFGPA_SMF_LOWER_ADDRESS,
+ P9N2_MCS_MCFGPA_SMF_LOWER_ADDRESS_LEN>(
+ (l_data.MCFGPA_SMF_LOWER_addr));
+ // SMF upper addr
+ l_scomData.insertFromRight<P9N2_MCS_MCFGPA_SMF_UPPER_ADDRESS,
+ P9N2_MCS_MCFGPA_SMF_UPPER_ADDRESS_LEN>(
+ (l_data.MCFGPA_SMF_UPPER_addr));
}
// Write to reg
@@ -1275,6 +1352,14 @@ fapi2::ReturnCode writeMCBarData(
// 4. ---- Set MCFGPMA reg -----
l_scomData = 0;
+ // Assert if both HOLE1 and SMF are valid, settings will overlap
+ FAPI_ASSERT((l_data.MCFGPMA_HOLE_valid[1] && l_data.MCFGPMA_SMF_valid) == 0,
+ fapi2::MSS_SETUP_BARS_HOLE1_SMF_CONFLICT()
+ .set_TARGET(l_target)
+ .set_HOLE1_VALID(l_data.MCFGPMA_HOLE_valid[1])
+ .set_SMF_VALID(l_data.MCFGPMA_SMF_valid),
+ "Error: MCFGPMA HOLE1 and SMF are both valid, settings will overlap");
+
// Hole 0
if (l_data.MCFGPMA_HOLE_valid[0] == true)
{
@@ -1317,6 +1402,25 @@ fapi2::ReturnCode writeMCBarData(
(l_data.MCFGPMA_HOLE_UPPER_addr[1] >> 2));
}
+ // SMF
+ if (l_data.MCFGPMA_SMF_valid == true)
+ {
+ // MCFGPMA SMF valid (bit 0)
+ l_scomData.setBit<P9N2_MCS_MCFGPMA_SMF_VALID>();
+
+ // MCFGPMA_SMF_UPPER_ADDRESS_AT_END_OF_RANGE
+ l_scomData.setBit<P9N2_MCS_MCFGPMA_SMF_UPPER_ADDRESS_AT_END_OF_RANGE>();
+
+ // SMF lower addr
+ l_scomData.insertFromRight<P9N2_MCS_MCFGPMA_SMF_LOWER_ADDRESS,
+ P9N2_MCS_MCFGPMA_SMF_LOWER_ADDRESS_LEN>(
+ (l_data.MCFGPMA_SMF_LOWER_addr));
+ // SMF upper addr
+ l_scomData.insertFromRight<P9N2_MCS_MCFGPMA_SMF_UPPER_ADDRESS,
+ P9N2_MCS_MCFGPMA_SMF_UPPER_ADDRESS_LEN>(
+ (l_data.MCFGPMA_SMF_UPPER_addr));
+ }
+
// Write to reg
FAPI_INF("Write MCFGPMA reg 0x%.16llX, Value 0x%.16llX",
MCS_MCFGPMA, l_scomData);
@@ -1381,6 +1485,9 @@ fapi2::ReturnCode unmaskMCFIR(
l_mcfirmask_and.clearBit<MCS_MCFIR_MS_WAT_DEBUG_CONFIG_REG_ERROR>();
}
+ // Defect HW451708, HW451711
+ // Leave MCS_MCFIR_INVALID_SMF_ACCESS masked if MCD cl_probes are enabled
+
for (auto l_pair : i_mcBarDataPair)
{
fapi2::Target<T> l_target = l_pair.first;
@@ -1423,7 +1530,7 @@ fapi2::ReturnCode p9_mss_setup_bars(
// Get functional MCS chiplets, should be none for Cumulus
auto l_mcsChiplets = i_target.getChildren<fapi2::TARGET_TYPE_MCS>();
- // Get functional MI chiplets, , should be none for Nimbus
+ // Get functional MI chiplets, should be none for Nimbus
auto l_miChiplets = i_target.getChildren<fapi2::TARGET_TYPE_MI>();
FAPI_INF("Num of MCS %u; Num of MIs %u", l_mcsChiplets.size(), l_miChiplets.size());
diff --git a/src/import/chips/p9/procedures/hwp/perv/p9_setup_sbe_config.C b/src/import/chips/p9/procedures/hwp/perv/p9_setup_sbe_config.C
index 636f345be..91b7635bc 100644
--- a/src/import/chips/p9/procedures/hwp/perv/p9_setup_sbe_config.C
+++ b/src/import/chips/p9/procedures/hwp/perv/p9_setup_sbe_config.C
@@ -46,10 +46,10 @@
enum P9_SETUP_SBE_CONFIG_Private_Constants
{
// Scratch_reg_1
- ATTR_EQ_GARD_STARTBIT = 0,
- ATTR_EQ_GARD_LENGTH = 6,
- ATTR_EC_GARD_STARTBIT = 8,
- ATTR_EC_GARD_LENGTH = 24,
+ ATTR_EQ_GARD_STARTBIT = 0,
+ ATTR_EQ_GARD_LENGTH = 6,
+ ATTR_EC_GARD_STARTBIT = 8,
+ ATTR_EC_GARD_LENGTH = 24,
// Scratch_reg_2
ATTR_I2C_BUS_DIV_REF_STARTBIT = 0,
@@ -58,8 +58,8 @@ enum P9_SETUP_SBE_CONFIG_Private_Constants
ATTR_OPTICS_CONFIG_MODE_OBUS1_BIT = 17,
ATTR_OPTICS_CONFIG_MODE_OBUS2_BIT = 18,
ATTR_OPTICS_CONFIG_MODE_OBUS3_BIT = 19,
- ATTR_MC_PLL_BUCKET_STARTBIT = 21,
- ATTR_MC_PLL_BUCKET_LENGTH = 3,
+ ATTR_MC_PLL_BUCKET_STARTBIT = 21,
+ ATTR_MC_PLL_BUCKET_LENGTH = 3,
ATTR_OB0_PLL_BUCKET_STARTBIT = 24,
ATTR_OB0_PLL_BUCKET_LENGTH = 2,
ATTR_OB1_PLL_BUCKET_STARTBIT = 26,
@@ -98,17 +98,18 @@ enum P9_SETUP_SBE_CONFIG_Private_Constants
ATTR_SLOW_PCI_REF_CLOCK_BIT = 5,
// Scratch_reg_6
+ ATTR_SMF_CONFIG = 16,
ATTR_PROC_EFF_FABRIC_GROUP_ID_STARTBIT = 17,
- ATTR_PROC_EFF_FABRIC_GROUP_ID_LENGTH = 3,
- ATTR_PROC_EFF_FABRIC_CHIP_ID_STARTBIT = 20,
- ATTR_PROC_EFF_FABRIC_CHIP_ID_LENGTH = 3,
- ATTR_PUMP_CHIP_IS_GROUP = 23,
- ATTR_PROC_FABRIC_GROUP_ID_STARTBIT = 26,
- ATTR_PROC_FABRIC_GROUP_ID_LENGTH = 3,
- ATTR_PROC_FABRIC_CHIP_ID_STARTBIT = 29,
- ATTR_PROC_FABRIC_CHIP_ID_LENGTH = 3,
- ATTR_PROC_MEM_TO_USE_STARTBIT = 1,
- ATTR_PROC_MEM_TO_USE_LENGTH = 6,
+ ATTR_PROC_EFF_FABRIC_GROUP_ID_LENGTH = 3,
+ ATTR_PROC_EFF_FABRIC_CHIP_ID_STARTBIT = 20,
+ ATTR_PROC_EFF_FABRIC_CHIP_ID_LENGTH = 3,
+ ATTR_PUMP_CHIP_IS_GROUP = 23,
+ ATTR_PROC_FABRIC_GROUP_ID_STARTBIT = 26,
+ ATTR_PROC_FABRIC_GROUP_ID_LENGTH = 3,
+ ATTR_PROC_FABRIC_CHIP_ID_STARTBIT = 29,
+ ATTR_PROC_FABRIC_CHIP_ID_LENGTH = 3,
+ ATTR_PROC_MEM_TO_USE_STARTBIT = 1,
+ ATTR_PROC_MEM_TO_USE_LENGTH = 6,
};
@@ -526,6 +527,7 @@ fapi2::ReturnCode p9_setup_sbe_config(const
}
//set_scratch6_reg
{
+ uint8_t l_smf_config;
uint8_t l_pump_mode;
uint8_t l_proc_chip_mem_to_use;
@@ -557,6 +559,20 @@ fapi2::ReturnCode p9_setup_sbe_config(const
l_read_scratch_reg.setBit<24>();
}
+ FAPI_DBG("Reading SMF_CONFIG");
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG,
+ fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
+ l_smf_config));
+
+ if (l_smf_config == fapi2::ENUM_ATTR_SMF_CONFIG_ENABLED)
+ {
+ l_read_scratch_reg.setBit<ATTR_SMF_CONFIG>();
+ }
+ else
+ {
+ l_read_scratch_reg.clearBit<ATTR_SMF_CONFIG>();
+ }
+
FAPI_DBG("Reading PUMP MODE");
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_PROC_FABRIC_PUMP_MODE,
fapi2::Target<fapi2::TARGET_TYPE_SYSTEM>(),
diff --git a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
index e8e4abe9d..b92d67fdb 100644
--- a/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
+++ b/src/import/chips/p9/procedures/hwp/pm/p9_hcode_image_build.C
@@ -884,7 +884,6 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
attrVal),
"Error from FAPI_ATTR_GET for attribute ATTR_ENABLE_MEM_EARLY_DATA_SCOM");
- //Attribute set to 0x01 for CHIP_IS_NODE
if( attrVal == fapi2::ENUM_ATTR_ENABLE_MEM_EARLY_DATA_SCOM_ON )
{
sgpeFlag |= SGPE_ENABLE_MEM_EARLY_DATA_SCOM_POS;
@@ -940,6 +939,21 @@ fapi2::ReturnCode updateImageFlags( Homerlayout_t* i_pChipHomer, CONST_FAPI2_PRO
///
+ FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_SMF_CONFIG,
+ FAPI_SYSTEM,
+ attrVal),
+ "Error from FAPI_ATTR_GET for attribute ATTR_SMF_CONFIG");
+ FAPI_DBG("SMF Config Attr Value : %d", attrVal );
+
+ if( attrVal )
+ {
+ sgpeFlag |= SGPE_PROC_SMF_CONFIG_BIT_POS;
+ }
+
+ FAPI_DBG("SMF Config : %s", attrVal ? "TRUE" : "FALSE" );
+
+ ///
+
FAPI_TRY(FAPI_ATTR_GET(fapi2::ATTR_CME_INSTRUCTION_TRACE_ENABLE,
i_procTgt,
attrVal),
OpenPOWER on IntegriCloud