summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_grouping.C
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_grouping.C')
-rw-r--r--src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_grouping.C528
1 files changed, 456 insertions, 72 deletions
diff --git a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_grouping.C b/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_grouping.C
index 37fcc87cb..e9fbcca25 100644
--- a/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_grouping.C
+++ b/src/usr/hwpf/hwp/mc_config/mss_eff_config/mss_eff_grouping.C
@@ -20,7 +20,7 @@
/* Origin: 30 */
/* */
/* IBM_PROLOG_END_TAG */
-// $Id: mss_eff_grouping.C,v 1.25 2013/05/23 11:18:45 gpaulraj Exp $
+// $Id: mss_eff_grouping.C,v 1.27 2013/08/13 09:52:18 gpaulraj Exp $
//------------------------------------------------------------------------------
// *! (C) Copyright International Business Machines Corp. 2011
// *! All Rights Reserved -- Property of IBM
@@ -38,6 +38,9 @@
//------------------------------------------------------------------------------
// Version:| Author: | Date: | Comment:
//---------|----------|---------|-----------------------------------------------
+// 1.27 | gpaulraj | 08-13-13| Fixed alternate BAR settings for Mirror
+// 1.26 | gpaulraj | 08-12-13| added mirror policy and HTM/OCC Bar setup
+// 1.25 | gpaulraj | 05-23-13| Fixed FW review feedback
// 1.24 | bellows | 04-09-13| Updates that really allow checkboard and all group sizes. Before, group size of 1 was all that was possible
// 1.23 | bellows | 03-26-13| Allow for checkboard mode with more than one mcs per group
// 1.22 | bellows | 03-21-13| Error Logging support
@@ -112,6 +115,17 @@ extern "C" {
// MSS EFF GROUPING Variables..........
//----------------------------------------------------
+const uint8_t MCS_SIZE = 0;
+const uint8_t MCS_IN_GROUP = 1;
+const uint8_t GROUP_SIZE = 2;
+const uint8_t BASE_ADDR = 3;
+const uint8_t MEMBERS_START_ID = 4;
+const uint8_t MEMBERS_END = 11;
+const uint8_t ALT_VALID = 12;
+const uint8_t ALT_SIZE = 13;
+const uint8_t ALT_BASE_ADDR = 14;
+const uint8_t LARGEST_MBA_SIZE = 15;
+
ReturnCode mss_eff_grouping(
@@ -125,6 +139,10 @@ extern "C" {
//uint32_t pos=0;
uint64_t mss_base_address;
uint64_t mirror_base;
+ uint64_t occ_sandbox_base;
+ uint64_t occ_sandbox_size;
+ uint64_t htm_bar_base;
+ uint64_t htm_bar_size;
//uint32_t MBA_size[8][2]={{0}};
//uint32_t MCS_size[8]={0};
uint32_t l_unit_pos =0;
@@ -229,8 +247,7 @@ extern "C" {
uint8_t pos1=0;
uint8_t pos2=0;
uint8_t allowed=0;
-
-
+ uint8_t selective_mode=2;
for(uint8_t i=0;i<6;i++)
config4_pos[i]=0;
@@ -239,6 +256,8 @@ extern "C" {
if(!rc.ok()) {FAPI_ERR("MSS_INTERLEAVE_ENABLE is not available"); return rc; }
rc = FAPI_ATTR_GET(ATTR_ALL_MCS_IN_INTERLEAVING_GROUP, NULL,check_board); // system level attribute
if (!rc.ok()) { FAPI_ERR("Error reading ATTR_ALL_MCS_IN_INTERLEAVING_GROUP"); return rc; }
+ rc = FAPI_ATTR_GET(ATTR_MEM_MIRROR_PLACEMENT_POLICY, NULL,selective_mode);
+ if (!rc.ok()) { FAPI_ERR("Error reading ATTR_MEM_MIRROR_PLACEMENT_POLICY"); return rc; }
if(check_board) // this is a 1 when interleaving is required to be on Only acceptable > 1MCS per group
{
@@ -281,9 +300,6 @@ extern "C" {
if(!(groups_allowed & 0x08)){FAPI_INF("8MCS/GROUP");}
if((groups_allowed & 0x02) || (groups_allowed & 0x04)||(groups_allowed & 0x08)){FAPI_INF("FABRIC IS IN CHECKER BOARD MODE BUT YOU ARE ASKING FOR MORE THAN 1MCS/GROUP. YOU ARE NOT GOING TO HAVE PERFOMRANCE YOU COULD GET IF YOU WERE IN CHECKERBOARD MODE");}
-
-
-
}
else
{
@@ -547,7 +563,7 @@ extern "C" {
uint64_t total_size_non_mirr =0;
for(pos=0;pos<=gp_pos;pos++)
- {
+ {
eff_grouping_data.groupID[pos][GROUP_SIZE] = eff_grouping_data.groupID[pos][MCS_SIZE]*eff_grouping_data.groupID[pos][MCS_IN_GROUP];
//eff_grouping_data.groupID[pos+8][2]= eff_grouping_data.groupID[pos][2]/2; // group size when mirrored
@@ -565,6 +581,7 @@ extern "C" {
//eff_grouping_data.groupID[pos+8][GROUP_SIZE] = eff_grouping_data.groupID[pos][GROUP_SIZE]/2; //group size with alternate bars
//eff_grouping_data.groupID[pos+8][ALT_SIZE] = eff_grouping_data.groupID[pos][ALT_SIZE]/2;
eff_grouping_data.groupID[pos][ALT_VALID] =1;
+ // eff_grouping_data.groupID[pos+8][ALT_VALID] =1;
}
total_size_non_mirr += eff_grouping_data.groupID[pos][GROUP_SIZE];
@@ -598,29 +615,51 @@ extern "C" {
if(eff_grouping_data.groupID[pos][MCS_SIZE]!=0 && eff_grouping_data.groupID[pos][MCS_IN_GROUP]>1 )
{
eff_grouping_data.groupID[pos+8][GROUP_SIZE]= eff_grouping_data.groupID[pos][GROUP_SIZE]/2; // group size when mirrored
-
-
if(eff_grouping_data.groupID[pos][ALT_VALID])
{
FAPI_INF("Mirrored group pos %d needs alternate bars defintation group Size %d\n",pos,eff_grouping_data.groupID[pos][GROUP_SIZE]);
//mirrored group
eff_grouping_data.groupID[pos+8][GROUP_SIZE] = eff_grouping_data.groupID[pos][GROUP_SIZE]/2; //group size with alternate bars
eff_grouping_data.groupID[pos+8][ALT_SIZE] = eff_grouping_data.groupID[pos][ALT_SIZE]/2;
+ eff_grouping_data.groupID[pos+8][ALT_VALID] =1;
}
}
}
+ if ( selective_mode == 2)
+ {
+ mss_base_address = 0;
+ rc = FAPI_ATTR_GET(ATTR_PROC_MEM_BASE,&i_target,mss_base_address);
+ mss_base_address = mss_base_address >> 30;
+ if(!rc.ok()) return rc;
+
+ rc = FAPI_ATTR_GET(ATTR_PROC_MIRROR_BASE,&i_target,mirror_base);
+ mirror_base = mirror_base >> 30;
+ if(!rc.ok()) return rc;
+ rc = FAPI_ATTR_GET(ATTR_PROC_HTM_BAR_SIZE,&i_target,htm_bar_size);
+ if(!rc.ok()) return rc;
- rc = FAPI_ATTR_GET(ATTR_PROC_MEM_BASE,&i_target,mss_base_address);
- mss_base_address = mss_base_address >> 30;
- if(!rc.ok()) return rc;
+ rc = FAPI_ATTR_GET(ATTR_PROC_OCC_SANDBOX_SIZE,&i_target,occ_sandbox_size);
+ if(!rc.ok()) return rc;
+ }
+
+ else{
+ rc = FAPI_ATTR_GET(ATTR_PROC_MEM_BASE,&i_target,mss_base_address);
+ mss_base_address = mss_base_address >> 30;
+ if(!rc.ok()) return rc;
+
+ rc = FAPI_ATTR_GET(ATTR_PROC_MIRROR_BASE,&i_target,mirror_base);
+ mirror_base = mirror_base >> 30;
- rc = FAPI_ATTR_GET(ATTR_PROC_MIRROR_BASE,&i_target,mirror_base);
- mirror_base = mirror_base >> 30;
+ if(!rc.ok()) return rc;
+ rc = FAPI_ATTR_GET(ATTR_PROC_HTM_BAR_SIZE,&i_target,htm_bar_size);
+ if(!rc.ok()) return rc;
- if(!rc.ok()) return rc;
+ rc = FAPI_ATTR_GET(ATTR_PROC_OCC_SANDBOX_SIZE,&i_target,occ_sandbox_size);
+ if(!rc.ok()) return rc;
+ }
if( mss_base_address > (mirror_base + total_size_non_mirr/2) || mirror_base > (mss_base_address + total_size_non_mirr))
{
@@ -650,7 +689,6 @@ extern "C" {
}
}
-
if(eff_grouping_data.groupID[pos][MCS_IN_GROUP]>1 )
{
eff_grouping_data.groupID[pos+8][BASE_ADDR]=mirror_base;
@@ -658,6 +696,7 @@ extern "C" {
if(eff_grouping_data.groupID[pos][ALT_VALID])
{
eff_grouping_data.groupID[pos+8][ALT_BASE_ADDR] = eff_grouping_data.groupID[pos+8][BASE_ADDR]+ eff_grouping_data.groupID[pos+8][GROUP_SIZE]/2; //mirrored base address with alternate bars
+ eff_grouping_data.groupID[pos+8][ALT_VALID] =1;
}
}
@@ -708,10 +747,13 @@ extern "C" {
uint64_t mem_bases[8];
+ uint64_t mem_bases_ack[8];
uint64_t l_memory_sizes[8];
- //uint64_t mirror_base;
+ uint64_t l_memory_sizes_ack[8];
uint64_t mirror_bases[4];
+ uint64_t mirror_bases_ack[4];
uint64_t l_mirror_sizes[4];
+ uint64_t l_mirror_sizes_ack[4];
//uint32_t temp[8];
for(uint8_t i=0;i<8;i++)
{
@@ -749,22 +791,344 @@ extern "C" {
}
// base addresses for distinct non-mirrored ranges
+
mem_bases[0]=eff_grouping_data.groupID[0][BASE_ADDR];
- mem_bases[0] = mem_bases[0] <<30;
mem_bases[1]=eff_grouping_data.groupID[1][BASE_ADDR];
- mem_bases[1] = mem_bases[1] <<30;
mem_bases[2]=eff_grouping_data.groupID[2][BASE_ADDR];
- mem_bases[2] = mem_bases[2] <<30;
mem_bases[3]=eff_grouping_data.groupID[3][BASE_ADDR];
- mem_bases[3] = mem_bases[3] <<30;
mem_bases[4]=eff_grouping_data.groupID[4][BASE_ADDR];
- mem_bases[4] = mem_bases[4] <<30;
mem_bases[5]=eff_grouping_data.groupID[5][BASE_ADDR];
- mem_bases[5] = mem_bases[5] <<30;
mem_bases[6]=eff_grouping_data.groupID[6][BASE_ADDR];
- mem_bases[6] = mem_bases[6] <<30;
mem_bases[7]=eff_grouping_data.groupID[7][BASE_ADDR];
- mem_bases[7] = mem_bases[7] <<30;
+
+ mem_bases_ack[0]=eff_grouping_data.groupID[0][BASE_ADDR];
+ mem_bases_ack[1]=eff_grouping_data.groupID[1][BASE_ADDR];
+ mem_bases_ack[2]=eff_grouping_data.groupID[2][BASE_ADDR];
+ mem_bases_ack[3]=eff_grouping_data.groupID[3][BASE_ADDR];
+ mem_bases_ack[4]=eff_grouping_data.groupID[4][BASE_ADDR];
+ mem_bases_ack[5]=eff_grouping_data.groupID[5][BASE_ADDR];
+ mem_bases_ack[6]=eff_grouping_data.groupID[6][BASE_ADDR];
+ mem_bases_ack[7]=eff_grouping_data.groupID[7][BASE_ADDR];
+
+ if(selective_mode == 2)
+ {
+ l_memory_sizes[0]=eff_grouping_data.groupID[0][GROUP_SIZE]/2;
+ l_memory_sizes[1]=eff_grouping_data.groupID[1][GROUP_SIZE]/2;
+ l_memory_sizes[2]=eff_grouping_data.groupID[2][GROUP_SIZE]/2;
+ l_memory_sizes[3]=eff_grouping_data.groupID[3][GROUP_SIZE]/2;
+ l_memory_sizes[4]=eff_grouping_data.groupID[4][GROUP_SIZE]/2;
+ l_memory_sizes[5]=eff_grouping_data.groupID[5][GROUP_SIZE]/2;
+ l_memory_sizes[6]=eff_grouping_data.groupID[6][GROUP_SIZE]/2;
+ l_memory_sizes[7]=eff_grouping_data.groupID[7][GROUP_SIZE]/2;
+
+ }
+ else
+ {
+ // sizes for distinct non-mirrored ranges
+ l_memory_sizes[0]=eff_grouping_data.groupID[0][MCS_SIZE]* eff_grouping_data.groupID[0][MCS_IN_GROUP];
+ l_memory_sizes[1]=eff_grouping_data.groupID[1][MCS_SIZE]* eff_grouping_data.groupID[1][MCS_IN_GROUP];
+ l_memory_sizes[2]=eff_grouping_data.groupID[2][MCS_SIZE]* eff_grouping_data.groupID[2][MCS_IN_GROUP];
+ l_memory_sizes[3]=eff_grouping_data.groupID[3][MCS_SIZE]* eff_grouping_data.groupID[3][MCS_IN_GROUP];
+ l_memory_sizes[4]=eff_grouping_data.groupID[4][MCS_SIZE]* eff_grouping_data.groupID[4][MCS_IN_GROUP];
+ l_memory_sizes[5]=eff_grouping_data.groupID[5][MCS_SIZE]* eff_grouping_data.groupID[5][MCS_IN_GROUP];
+ l_memory_sizes[6]=eff_grouping_data.groupID[6][MCS_SIZE]* eff_grouping_data.groupID[6][MCS_IN_GROUP];
+ l_memory_sizes[7]=eff_grouping_data.groupID[7][MCS_SIZE]* eff_grouping_data.groupID[7][MCS_IN_GROUP];
+ }
+
+ l_memory_sizes_ack[0]=eff_grouping_data.groupID[0][GROUP_SIZE];
+ l_memory_sizes_ack[1]=eff_grouping_data.groupID[1][GROUP_SIZE];
+ l_memory_sizes_ack[2]=eff_grouping_data.groupID[2][GROUP_SIZE];
+ l_memory_sizes_ack[3]=eff_grouping_data.groupID[3][GROUP_SIZE];
+ l_memory_sizes_ack[4]=eff_grouping_data.groupID[4][GROUP_SIZE];
+ l_memory_sizes_ack[5]=eff_grouping_data.groupID[5][GROUP_SIZE];
+ l_memory_sizes_ack[6]=eff_grouping_data.groupID[6][GROUP_SIZE];
+ l_memory_sizes_ack[7]=eff_grouping_data.groupID[7][GROUP_SIZE];
+
+ // process mirrored ranges
+ //
+ if(selective_mode == 2)
+ {
+ uint8_t groupcount =0;
+ for(i=0;i<8;i++)
+ {
+ if(eff_grouping_data.groupID[i][GROUP_SIZE] > 1) { groupcount++;}
+ }
+ if(groupcount<7)
+ {
+ mem_bases[groupcount+0] = eff_grouping_data.groupID[8][BASE_ADDR] + (eff_grouping_data.groupID[8][GROUP_SIZE]/2);
+ mem_bases[groupcount+1] = eff_grouping_data.groupID[9][BASE_ADDR] + (eff_grouping_data.groupID[9][GROUP_SIZE]/2);
+ mem_bases[groupcount+2] = eff_grouping_data.groupID[10][BASE_ADDR] + (eff_grouping_data.groupID[10][GROUP_SIZE]/2);
+ mem_bases[groupcount+3] = eff_grouping_data.groupID[11][BASE_ADDR] + (eff_grouping_data.groupID[11][GROUP_SIZE]/2);
+ }
+
+ mirror_bases[0] = 0; //grouping_data.groupID[8][BASE_ADDR];
+ mirror_bases[1] = 0; //eff_grouping_data.groupID[9][BASE_ADDR];
+ mirror_bases[2] = 0; //eff_grouping_data.groupID[10][BASE_ADDR];
+ mirror_bases[3] = 0; //eff_grouping_data.groupID[11][BASE_ADDR];
+ }
+ else
+ {
+
+ // base addresses for distinct mirrored ranges
+ mirror_bases[0] = eff_grouping_data.groupID[8][BASE_ADDR];
+ mirror_bases[1] = eff_grouping_data.groupID[9][BASE_ADDR];
+ mirror_bases[2] = eff_grouping_data.groupID[10][BASE_ADDR];
+ mirror_bases[3] = eff_grouping_data.groupID[11][BASE_ADDR];
+ }
+ mirror_bases_ack[0] = eff_grouping_data.groupID[8][BASE_ADDR];
+ mirror_bases_ack[1] = eff_grouping_data.groupID[9][BASE_ADDR];
+ mirror_bases_ack[2] = eff_grouping_data.groupID[10][BASE_ADDR];
+ mirror_bases_ack[3] = eff_grouping_data.groupID[11][BASE_ADDR];
+
+
+ if(selective_mode == 2)
+ {
+ uint8_t groupcount =0;
+ for(i=0;i<8;i++)
+ {
+ if(eff_grouping_data.groupID[i][MCS_IN_GROUP] > 1 ) { groupcount++;}
+ }
+ if(groupcount<7)
+ {
+ l_memory_sizes[groupcount+0] = eff_grouping_data.groupID[8][GROUP_SIZE]/2;
+ l_memory_sizes[groupcount+1] = eff_grouping_data.groupID[9][GROUP_SIZE]/2;
+ l_memory_sizes[groupcount+2] = eff_grouping_data.groupID[10][GROUP_SIZE]/2;
+ l_memory_sizes[groupcount+3] = eff_grouping_data.groupID[11][GROUP_SIZE]/2;
+ }
+ l_mirror_sizes[0] =0;
+ l_mirror_sizes[1] =0;
+ l_mirror_sizes[2] =0;
+ l_mirror_sizes[3] =0;
+ }
+ else
+ {
+ // sizes for distinct mirrored ranges
+ for(i=0;i<4;i++)
+ {
+ if(eff_grouping_data.groupID[i][MCS_IN_GROUP] > 1 )
+ l_mirror_sizes[i]= (eff_grouping_data.groupID[i][MCS_SIZE] *eff_grouping_data.groupID[0][MCS_IN_GROUP]) / 2;
+ else
+ {
+ l_mirror_sizes[i] =0;
+ }
+ }
+ }
+ l_mirror_sizes_ack[0]=eff_grouping_data.groupID[8][GROUP_SIZE];
+ l_mirror_sizes_ack[1]=eff_grouping_data.groupID[9][GROUP_SIZE];
+ l_mirror_sizes_ack[2]=eff_grouping_data.groupID[10][GROUP_SIZE];
+ l_mirror_sizes_ack[3]=eff_grouping_data.groupID[11][GROUP_SIZE];
+
+ mem_bases[0] = mem_bases[0] <<30;
+ mem_bases[1] = mem_bases[1] <<30;
+ mem_bases[2] = mem_bases[2] <<30;
+ mem_bases[3] = mem_bases[3] <<30;
+ mem_bases[4] = mem_bases[4] <<30;
+ mem_bases[5] = mem_bases[5] <<30;
+ mem_bases[6] = mem_bases[6] <<30;
+ mem_bases[7] = mem_bases[7] <<30;
+
+
+ mem_bases_ack[0] = mem_bases_ack[0] <<30;
+ mem_bases_ack[1] = mem_bases_ack[1] <<30;
+ mem_bases_ack[2] = mem_bases_ack[2] <<30;
+ mem_bases_ack[3] = mem_bases_ack[3] <<30;
+ mem_bases_ack[4] = mem_bases_ack[4] <<30;
+ mem_bases_ack[5] = mem_bases_ack[5] <<30;
+ mem_bases_ack[6] = mem_bases_ack[6] <<30;
+ mem_bases_ack[7] = mem_bases_ack[7] <<30;
+
+ l_memory_sizes[0] = l_memory_sizes[0] <<30;
+ l_memory_sizes[1] = l_memory_sizes[1] <<30;
+ l_memory_sizes[2] = l_memory_sizes[2] <<30;
+ l_memory_sizes[3] = l_memory_sizes[3] <<30;
+ l_memory_sizes[4] = l_memory_sizes[4] <<30;
+ l_memory_sizes[5] = l_memory_sizes[5] <<30;
+ l_memory_sizes[6] = l_memory_sizes[6] <<30;
+ l_memory_sizes[7] = l_memory_sizes[7] <<30;
+
+
+ l_memory_sizes_ack[0] = l_memory_sizes_ack[0] <<30;
+ l_memory_sizes_ack[1] = l_memory_sizes_ack[1] <<30;
+ l_memory_sizes_ack[2] = l_memory_sizes_ack[2] <<30;
+ l_memory_sizes_ack[3] = l_memory_sizes_ack[3] <<30;
+ l_memory_sizes_ack[4] = l_memory_sizes_ack[4] <<30;
+ l_memory_sizes_ack[5] = l_memory_sizes_ack[5] <<30;
+ l_memory_sizes_ack[6] = l_memory_sizes_ack[6] <<30;
+ l_memory_sizes_ack[7] = l_memory_sizes_ack[7] <<30;
+
+ mirror_bases[0] = mirror_bases[0]<<30;
+ mirror_bases[1] = mirror_bases[1]<<30;
+ mirror_bases[2] = mirror_bases[2]<<30;
+ mirror_bases[3] = mirror_bases[3]<<30;
+
+
+ mirror_bases_ack[0] = mirror_bases_ack[0]<<30;
+ mirror_bases_ack[1] = mirror_bases_ack[1]<<30;
+ mirror_bases_ack[2] = mirror_bases_ack[2]<<30;
+ mirror_bases_ack[3] = mirror_bases_ack[3]<<30;
+
+ l_mirror_sizes[0] = l_mirror_sizes[0]<<30;
+ l_mirror_sizes[1] = l_mirror_sizes[1]<<30;
+ l_mirror_sizes[2] = l_mirror_sizes[2]<<30;
+ l_mirror_sizes[3] = l_mirror_sizes[3]<<30;
+
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[0]: %016llx", l_mirror_sizes[0]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[1]: %016llx", l_mirror_sizes[1]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[2]: %016llx", l_mirror_sizes[2]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[3]: %016llx", l_mirror_sizes[3]);
+
+ l_mirror_sizes_ack[0] = l_mirror_sizes_ack[0]<<30;
+ l_mirror_sizes_ack[1] = l_mirror_sizes_ack[1]<<30;
+ l_mirror_sizes_ack[2] = l_mirror_sizes_ack[2]<<30;
+ l_mirror_sizes_ack[3] = l_mirror_sizes_ack[3]<<30;
+
+ ReturnCode ungroup_rc;
+ if (selective_mode == 0x02)
+ {
+ if (htm_bar_size != 0 || occ_sandbox_size != 0)
+ {
+ FAPI_ERR("Selective mode does not support the HTM and OCC SANDBOX BARS");
+ // FAPI_SET_HWP_ERROR(ungroup_rc,RC_OPT_MEMMAP_ALLOC_ERR);
+ break;
+ }
+ }
+ else if(selective_mode == 0x00)
+ {
+ uint64_t total_size = 0;
+ uint8_t memhole =0;
+ for(i=0;i<8;i++)
+ {
+ total_size += l_memory_sizes[i];
+ if (eff_grouping_data.groupID[i][ALT_VALID]) { memhole++; }
+ }
+ if ((total_size >= (htm_bar_size+occ_sandbox_size)) && ((htm_bar_size+occ_sandbox_size)>0))
+ {
+ uint64_t other_bar_size =0;
+ other_bar_size = htm_bar_size+occ_sandbox_size ;
+ uint64_t non_mirroring_size = total_size - other_bar_size;
+ uint64_t temp_size = 0;
+ uint8_t done =0;
+ uint8_t j;
+ i=0;
+ while(!done)
+ {
+ if ((temp_size <= non_mirroring_size) && ( non_mirroring_size <= (temp_size += l_memory_sizes[i++])))
+ {
+ done = 1;
+ }
+ }
+ j =i;
+// if ( (other_bar_size > l_memory_sizes[i-1]) && (memhole==0))
+// {
+// l_memory_sizes[i-1] = l_memory_sizes[i-1] - (temp_size - non_mirroring_size);
+// for(;i<8;i++){ if (l_memory_sizes[i]) l_memory_sizes[i] =0;}
+// }
+ if (memhole)
+ {
+ if( l_memory_sizes[j-1] < other_bar_size )
+ {
+ FAPI_ERR(" MEMORY HTM/OCC BAR not possible ");
+ FAPI_DBG(" TOTAL MEMORY %016llx", l_memory_sizes[j-1]);
+ break;
+ }
+ else{ l_memory_sizes[i-1] = l_memory_sizes[i-1] - (temp_size - non_mirroring_size);}
+ }
+ else{ l_memory_sizes[i-1] = l_memory_sizes[i-1] - (temp_size - non_mirroring_size); for(;i<8;i++){ if (l_memory_sizes[i]) l_memory_sizes[i] =0;}}
+
+ if( htm_bar_size < occ_sandbox_size)
+ {
+ occ_sandbox_base = mem_bases[j-1]+l_memory_sizes[j-1];
+ htm_bar_base = occ_sandbox_base + occ_sandbox_size;
+ }
+ else
+ {
+ htm_bar_base = mem_bases[j-1]+l_memory_sizes[j-1];
+ occ_sandbox_base = htm_bar_base + htm_bar_size;
+ }
+
+ FAPI_DBG(" TOTAL MEMORY %016llx", total_size);
+ FAPI_DBG(" MIRRORING SIZE: %016llx & %d", l_mirror_sizes[j-1], j);
+ FAPI_DBG(" Requitred MIRRORING SIZE: %016llx ", non_mirroring_size);
+ FAPI_DBG(" HTM_BASE : %016llx", htm_bar_base) ;
+ FAPI_DBG(" OCC_BASE : %016llx", occ_sandbox_base);
+
+ }
+ else if ((total_size >= (htm_bar_size+occ_sandbox_size)) && ((htm_bar_size+occ_sandbox_size) ==0)) {}
+ else
+ {
+
+ FAPI_ERR(" Required memory space for the HTM and OCC SANDBOX BARS is not available ");
+ // FAPI_SET_HWP_ERROR((ungroup_rc,RC_OPT_MEMMAP_ALLOC_ERR);
+ break;
+ }
+ }
+ else if(selective_mode == 0x01)
+ {
+ uint64_t total_size = 0;
+ uint8_t memhole =0;
+ uint8_t j=0;
+ for(i=0;i<4;i++)
+ {
+ total_size += l_mirror_sizes[i];
+ if (eff_grouping_data.groupID[i][ALT_VALID]) { memhole++; }
+ }
+ //if (total_size >= (htm_bar_size+occ_sandbox_size))
+ if ((total_size >= (htm_bar_size+occ_sandbox_size)) && ((htm_bar_size+occ_sandbox_size)>0))
+ {
+ uint64_t other_bar_size =0;
+ other_bar_size = htm_bar_size+occ_sandbox_size ;
+ uint64_t non_mirroring_size = total_size - other_bar_size;
+ uint64_t temp_size = 0;
+ uint8_t done =0;
+ i=0;
+ while(!done)
+ {
+ if ((temp_size <= non_mirroring_size) && ( non_mirroring_size <= (temp_size += l_mirror_sizes[i++])))
+ {
+ done = 1;
+ }
+ }
+ j = i;
+// if ( (other_bar_size > l_mirror_sizes[i-1]) && (memhole==0))
+// {
+// l_mirror_sizes[i-1] = l_mirror_sizes[i-1] - (temp_size - non_mirroring_size);
+/// for(;i<4;i++){ if (l_mirror_sizes[i]) l_mirror_sizes[i] =0;}
+// }
+ if (memhole)
+ {
+ if( l_mirror_sizes[j-1] < other_bar_size )
+ {
+ FAPI_ERR(" MEMORY HTM/OCC BAR not possible ");
+ FAPI_DBG(" TOTAL MEMORY %016llx", l_memory_sizes[j-1]);
+ break;
+ }
+ else{ l_mirror_sizes[i-1] = l_mirror_sizes[i-1] - (temp_size - non_mirroring_size);}
+ }
+ else{ l_mirror_sizes[i-1] = l_mirror_sizes[i-1] - (temp_size - non_mirroring_size); for(;i<8;i++){ if (l_memory_sizes[i]) l_memory_sizes[i] =0;}}
+ if( htm_bar_size < occ_sandbox_size)
+ {
+ occ_sandbox_base = mirror_bases[j-1]+ l_mirror_sizes[j-1];
+ htm_bar_size = occ_sandbox_base + occ_sandbox_size;
+ }
+ else
+ {
+ htm_bar_base = mirror_bases[j-1]+ l_mirror_sizes[j-1];
+ occ_sandbox_base = htm_bar_base + htm_bar_size;
+ }
+ FAPI_DBG(" TOTAL MEMORY %016llx", total_size);
+ FAPI_DBG(" MIRRORING SIZE: %016llx & %d", l_mirror_sizes[j-1], j);
+ FAPI_DBG(" Requitred MIRRORING SIZE: %016llx ", non_mirroring_size);
+ FAPI_DBG(" HTM_BASE : %016llx", htm_bar_base) ;
+ FAPI_DBG(" OCC_BASE : %016llx", occ_sandbox_base);
+ }
+ else if ((total_size >= (htm_bar_size+occ_sandbox_size)) && ((htm_bar_size+occ_sandbox_size) ==0)) {}
+ else
+ {
+ FAPI_ERR(" Required memory space for the HTM and OCC SANDBOX BARS is not available ");
+ // FAPI_SET_HWP_ERROR((ungroup_rc,RC_OPT_MEMMAP_ALLOC_ERR);
+ break;
+ }
+ }
FAPI_DBG(" ATTR_PROC_MEM_BASES[0]: %016llx", mem_bases[0]);
FAPI_DBG(" ATTR_PROC_MEM_BASES[1]: %016llx", mem_bases[1]);
@@ -782,23 +1146,23 @@ extern "C" {
break;
}
- // sizes for distinct non-mirrored ranges
- l_memory_sizes[0]=eff_grouping_data.groupID[0][GROUP_SIZE];
- l_memory_sizes[0] = l_memory_sizes[0] <<30;
- l_memory_sizes[1]=eff_grouping_data.groupID[1][GROUP_SIZE];
- l_memory_sizes[1] = l_memory_sizes[1] <<30;
- l_memory_sizes[2]=eff_grouping_data.groupID[2][GROUP_SIZE];
- l_memory_sizes[2] = l_memory_sizes[2] <<30;
- l_memory_sizes[3]=eff_grouping_data.groupID[3][GROUP_SIZE];
- l_memory_sizes[3] = l_memory_sizes[3] <<30;
- l_memory_sizes[4]=eff_grouping_data.groupID[4][GROUP_SIZE];
- l_memory_sizes[4] = l_memory_sizes[4] <<30;
- l_memory_sizes[5]=eff_grouping_data.groupID[5][GROUP_SIZE];
- l_memory_sizes[5] = l_memory_sizes[5] <<30;
- l_memory_sizes[6]=eff_grouping_data.groupID[6][GROUP_SIZE];
- l_memory_sizes[6] = l_memory_sizes[6] <<30;
- l_memory_sizes[7]=eff_grouping_data.groupID[7][GROUP_SIZE];
- l_memory_sizes[7] = l_memory_sizes[7] <<30;
+
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[0]: %016llx", mem_bases_ack[0]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[1]: %016llx", mem_bases_ack[1]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[2]: %016llx", mem_bases_ack[2]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[3]: %016llx", mem_bases_ack[3]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[4]: %016llx", mem_bases_ack[4]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[5]: %016llx", mem_bases_ack[5]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[6]: %016llx", mem_bases_ack[6]);
+ FAPI_DBG(" ATTR_PROC_MEM_BASES_ACK[7]: %016llx", mem_bases_ack[7]);
+
+ rc = FAPI_ATTR_SET(ATTR_PROC_MEM_BASES_ACK, &i_target, mem_bases_ack);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MEM_BASES_ACK");
+ break;
+ }
+
FAPI_DBG(" ATTR_PROC_MEM_SIZES[0]: %016llx", l_memory_sizes[0]);
FAPI_DBG(" ATTR_PROC_MEM_SIZES[1]: %016llx", l_memory_sizes[1]);
@@ -808,21 +1172,27 @@ extern "C" {
FAPI_DBG(" ATTR_PROC_MEM_SIZES[5]: %016llx", l_memory_sizes[5]);
FAPI_DBG(" ATTR_PROC_MEM_SIZES[6]: %016llx", l_memory_sizes[6]);
FAPI_DBG(" ATTR_PROC_MEM_SIZES[7]: %016llx", l_memory_sizes[7]);
-
rc = FAPI_ATTR_SET(ATTR_PROC_MEM_SIZES, &i_target, l_memory_sizes);
if (!rc.ok())
{
FAPI_ERR("Error writing ATTR_PROC_MEM_SIZES");
break;
}
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[0]: %016llx", l_memory_sizes[0]);
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[1]: %016llx", l_memory_sizes[1]);
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[2]: %016llx", l_memory_sizes[2]);
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[3]: %016llx", l_memory_sizes[3]);
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[4]: %016llx", l_memory_sizes[4]);
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[5]: %016llx", l_memory_sizes[5]);
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[6]: %016llx", l_memory_sizes[6]);
- FAPI_DBG(" ATTR_PROC_MEM_SIZES[7]: %016llx", l_memory_sizes[7]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[0]: %016llx", l_memory_sizes_ack[0]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[1]: %016llx", l_memory_sizes_ack[1]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[2]: %016llx", l_memory_sizes_ack[2]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[3]: %016llx", l_memory_sizes_ack[3]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[4]: %016llx", l_memory_sizes_ack[4]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[5]: %016llx", l_memory_sizes_ack[5]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[6]: %016llx", l_memory_sizes_ack[6]);
+ FAPI_DBG(" ATTR_PROC_MEM_SIZES_ACK[7]: %016llx", l_memory_sizes_ack[7]);
+
+ rc = FAPI_ATTR_SET(ATTR_PROC_MEM_SIZES_ACK, &i_target, l_memory_sizes_ack);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MEM_SIZES_ACK");
+ break;
+ }
rc = FAPI_ATTR_SET(ATTR_MSS_MCS_GROUP_32,&i_target, eff_grouping_data.groupID);
if (!rc.ok())
@@ -830,20 +1200,8 @@ extern "C" {
FAPI_ERR("Error writing ATTR_MSS_MCS_GROUP");
break;
}
- // process mirrored ranges
- //
-
- // base addresses for distinct mirrored ranges
- mirror_bases[0] = eff_grouping_data.groupID[8][BASE_ADDR];
- mirror_bases[1] = eff_grouping_data.groupID[9][BASE_ADDR];
- mirror_bases[2] = eff_grouping_data.groupID[10][BASE_ADDR];
- mirror_bases[3] = eff_grouping_data.groupID[11][BASE_ADDR];
- mirror_bases[0] = mirror_bases[0]<<30;
- mirror_bases[1] = mirror_bases[1]<<30;
- mirror_bases[2] = mirror_bases[2]<<30;
- mirror_bases[3] = mirror_bases[3]<<30;
FAPI_DBG(" ATTR_PROC_MIRROR_BASES[0]: %016llx", mirror_bases[0]);
FAPI_DBG(" ATTR_PROC_MIRROR_BASES[1]: %016llx", mirror_bases[1]);
FAPI_DBG(" ATTR_PROC_MIRROR_BASES[2]: %016llx", mirror_bases[2]);
@@ -856,16 +1214,17 @@ extern "C" {
break;
}
- // sizes for distinct mirrored ranges
- l_mirror_sizes[0]=eff_grouping_data.groupID[8][GROUP_SIZE];
- l_mirror_sizes[1]=eff_grouping_data.groupID[9][GROUP_SIZE];
- l_mirror_sizes[2]=eff_grouping_data.groupID[10][GROUP_SIZE];
- l_mirror_sizes[3]=eff_grouping_data.groupID[11][GROUP_SIZE];
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[0]: %016llx", mirror_bases_ack[0]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[1]: %016llx", mirror_bases_ack[1]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[2]: %016llx", mirror_bases_ack[2]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_BASES[3]: %016llx", mirror_bases_ack[3]);
- l_mirror_sizes[0] = l_mirror_sizes[0]<<30;
- l_mirror_sizes[1] = l_mirror_sizes[1]<<30;
- l_mirror_sizes[2] = l_mirror_sizes[2]<<30;
- l_mirror_sizes[3] = l_mirror_sizes[3]<<30;
+ rc = FAPI_ATTR_SET(ATTR_PROC_MIRROR_BASES_ACK, &i_target, mirror_bases_ack);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MIRROR_BASES_ACK");
+ break;
+ }
FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[0]: %016llx", l_mirror_sizes[0]);
FAPI_DBG(" ATTR_PROC_MIRROR_SIZES[1]: %016llx", l_mirror_sizes[1]);
@@ -878,6 +1237,31 @@ extern "C" {
FAPI_ERR("Error writing ATTR_PROC_MIRROR_SIZES");
break;
}
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES_ACK[0]: %016llx", l_mirror_sizes_ack[0]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES_ACK[1]: %016llx", l_mirror_sizes_ack[1]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES_ACK[2]: %016llx", l_mirror_sizes_ack[2]);
+ FAPI_DBG(" ATTR_PROC_MIRROR_SIZES_ACK[3]: %016llx", l_mirror_sizes_ack[3]);
+ rc = FAPI_ATTR_SET(ATTR_PROC_MIRROR_SIZES_ACK, &i_target, l_mirror_sizes_ack);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_MIRROR_SIZES_ACK");
+ break;
+ }
+ rc = FAPI_ATTR_SET(ATTR_PROC_HTM_BAR_BASE_ADDR, &i_target, htm_bar_base);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_HTM_BAR_BASE_ADDR");
+ break;
+
+ }
+
+ rc = FAPI_ATTR_SET( ATTR_PROC_OCC_SANDBOX_BASE_ADDR, &i_target, occ_sandbox_base);
+ if (!rc.ok())
+ {
+ FAPI_ERR("Error writing ATTR_PROC_OCC_SANDBOX_BASE_ADDR");
+ break;
+
+ }
}while(0);
return rc;
}
OpenPOWER on IntegriCloud