@@ -60,6 +60,8 @@ namespace DEVTREE
6060{
6161using namespace TARGETING ;
6262
63+ typedef std ::pair < uint64_t ,uint64_t > homerAddr_t ;
64+
6365#define CHIPID_EXTRACT_NODE (i_chipid ) (i_chipid >> CHIPID_NODE_SHIFT)
6466#define CHIPID_EXTRACT_PROC (i_chipid ) (i_chipid & CHIPID_PROC_MASK)
6567
@@ -185,27 +187,24 @@ uint32_t getMembChipId(const TARGETING::Target * i_pMemb)
185187 return l_membId ;
186188}
187189
188-
189- uint64_t getHomerPhysAddr (const TARGETING ::Target * i_pProc )
190+ uint64_t getOccCommonAddr ()
190191{
191- //If running Sapphire need to place this at the top of memory
192- uint64_t homerPhysAddrBase = VMM_HOMER_REGION_START_ADDR ;
193- if (TARGETING ::is_sapphire_load ())
194- {
195- homerPhysAddrBase = TARGETING ::get_top_mem_addr ();
196- assert (homerPhysAddrBase != 0 ,
197- "bld_devtree: Top of memory was 0!" );
198- homerPhysAddrBase -= VMM_ALL_HOMER_OCC_MEMORY_SIZE ;
199- }
192+ TARGETING ::Target * sys = NULL ;
193+ TARGETING ::targetService ().getTopLevelTarget (sys );
194+ uint64_t l_physAddr = sys -> getAttr < ATTR_OCC_COMMON_AREA_PHYS_ADDR > ( );
195+ return l_physAddr ;
196+ }
200197
201- uint8_t tmpPos = i_pProc -> getAttr < ATTR_POSITION > ( );
202- uint64_t tmpOffset = tmpPos * VMM_HOMER_INSTANCE_SIZE ;
203- uint64_t targHomer = homerPhysAddrBase + tmpOffset ;
198+ homerAddr_t getHomerPhysAddr (const TARGETING ::Target * i_pProc )
199+ {
200+ uint64_t l_homerPhysAddrBase = i_pProc -> getAttr < ATTR_HOMER_PHYS_ADDR > ( );
201+ uint8_t l_Pos = i_pProc -> getAttr < ATTR_POSITION > ( );
204202
205- TRACFCOMP ( g_trac_devtree , "proc ChipID [%X] HOMER is at %.16X" ,
206- getProcChipId (i_pProc ), targHomer );
203+ TRACFCOMP ( g_trac_devtree , "proc ChipID [%X] HOMER is at %.16X"
204+ " instance %d" ,
205+ getProcChipId (i_pProc ), l_homerPhysAddrBase , l_Pos );
207206
208- return targHomer ;
207+ return homerAddr_t ( l_homerPhysAddrBase , l_Pos ) ;
209208}
210209
211210void add_i2c_info ( const TARGETING ::Target * i_targ ,
@@ -946,14 +945,18 @@ uint32_t bld_intr_node(devTree * i_dt, dtOffset_t & i_parentNode,
946945
947946
948947void add_reserved_mem (devTree * i_dt ,
949- std ::vector < uint64_t > & i_homerAddr ,
948+ std ::vector < homerAddr_t > & i_homerAddr ,
950949 uint64_t i_extraAddr [],
951950 uint64_t i_extraSize [],
952951 const char * i_extraStr [],
953952 uint64_t i_extraCnt )
954953{
955954 /*
956- * The reserved-names and reserve-names properties work hand in hand.
955+ * TODO RTC: 131056 remove non-node reserved memory entries
956+ * - reserved-names and reserved-ranges
957+ * - reserved map ??
958+ * hints are provided for the scope of code to remove
959+ * The reserved-names and reserve-ranges properties work hand in hand.
957960 * The first one is a list of strings providing a "name" for each entry
958961 * in the second one using the traditional "vendor,name" format.
959962 *
@@ -966,6 +969,10 @@ void add_reserved_mem(devTree * i_dt,
966969 * Corresponding entries must also be created in the "reserved map" part
967970 * of the flat device-tree (which is a binary list in the header of the
968971 * fdt).
972+ * **** remove to here
973+ *
974+ * Reserved memory is passed in a node-based format. An instance
975+ * number distinquishes homer regions.
969976 *
970977 * Unless a component (skiboot or Linux) specifically knows about a region
971978 * (usually based on its name) and decides to change or remove it, all
@@ -977,20 +984,50 @@ void add_reserved_mem(devTree * i_dt,
977984
978985 size_t l_num = i_homerAddr .size ();
979986
987+ // 131056: Won't need these
980988 const char * homerStr = "ibm,slw-occ-image" ;
981989 const char * reserve_strs [l_num + i_extraCnt + 1 ];
982990 uint64_t ranges [l_num + i_extraCnt ][2 ];
983991 uint64_t cell_count = sizeof (ranges ) / sizeof (uint64_t );
984992 uint64_t res_mem_addrs [l_num + i_extraCnt ];
985993 uint64_t res_mem_sizes [l_num + i_extraCnt ];
986994
995+ // create the nodes for the node based format
996+ dtOffset_t rootMemNode = i_dt -> addNode (rootNode , "ibm,hostboot" );
997+ i_dt -> addPropertyCell32 (rootMemNode , "#address-cells" , 2 );
998+ i_dt -> addPropertyCell32 (rootMemNode , "#size-cells" , 2 );
999+ dtOffset_t reservedMemNode = i_dt -> addNode (rootMemNode , "reserved-memory" );
1000+ i_dt -> addPropertyCell32 (reservedMemNode , "#address-cells" , 2 );
1001+ i_dt -> addPropertyCell32 (reservedMemNode , "#size-cells" , 2 );
1002+ i_dt -> addProperty (reservedMemNode , "ranges" );
1003+
9871004 for (size_t i = 0 ; i < l_num ; i ++ )
9881005 {
1006+ uint64_t l_homerAddr = i_homerAddr [i ].first ;
1007+ uint64_t l_homerInstance = i_homerAddr [i ].second ;
1008+ TRACFCOMP ( g_trac_devtree , "Reserved Region %s @ %lx, %lx instance %d" ,
1009+ homerStr ,
1010+ l_homerAddr ,
1011+ VMM_HOMER_INSTANCE_SIZE ,
1012+ l_homerInstance );
1013+
1014+ // 131056: Won't need these
9891015 reserve_strs [i ] = homerStr ;
990- ranges [i ][0 ] = i_homerAddr [ i ] ;
1016+ ranges [i ][0 ] = l_homerAddr ;
9911017 ranges [i ][1 ] = VMM_HOMER_INSTANCE_SIZE ;
992- res_mem_addrs [i ] = i_homerAddr [ i ] ;
1018+ res_mem_addrs [i ] = l_homerAddr ;
9931019 res_mem_sizes [i ] = VMM_HOMER_INSTANCE_SIZE ;
1020+
1021+ // add node style inclulding homer instance.
1022+ dtOffset_t homerNode = i_dt -> addNode (reservedMemNode ,
1023+ "ibm,homer-image" ,
1024+ l_homerAddr );
1025+ uint64_t propertyCells [2 ]= {l_homerAddr , VMM_HOMER_INSTANCE_SIZE };
1026+ i_dt -> addPropertyCells64 (homerNode , "reg" , propertyCells , 2 );
1027+ const char * propertyStrs [] = {"ibm,homer-image" , NULL };
1028+ i_dt -> addPropertyStrings (homerNode , "ibm,prd-label" ,propertyStrs );
1029+ i_dt -> addPropertyCell32 (homerNode , "ibm,prd-instance" ,
1030+ l_homerInstance );
9941031 }
9951032
9961033 for (size_t i = 0 ; i < i_extraCnt ; i ++ )
@@ -1000,22 +1037,44 @@ void add_reserved_mem(devTree * i_dt,
10001037 TRACFCOMP ( g_trac_devtree , "Reserved Region %s @ %lx, %lx" ,
10011038 i_extraStr [i ], i_extraAddr [i ], i_extraSize [i ]);
10021039
1040+ // 131056: Won't need these
10031041 reserve_strs [l_num ] = i_extraStr [i ];
10041042 ranges [l_num ][0 ] = i_extraAddr [i ];
10051043 ranges [l_num ][1 ] = i_extraSize [i ];
1006-
10071044 res_mem_addrs [l_num ] = i_extraAddr [i ];
10081045 res_mem_sizes [l_num ] = i_extraSize [i ];
1009-
10101046 l_num ++ ;
1047+
1048+ // add node style entry
1049+ dtOffset_t extraNode = i_dt -> addNode (reservedMemNode ,
1050+ i_extraStr [i ],
1051+ i_extraAddr [i ]);
1052+ uint64_t propertyCells [2 ]= {i_extraAddr [i ],i_extraSize [i ]};
1053+ i_dt -> addPropertyCells64 (extraNode , "reg" , propertyCells , 2 );
1054+ const char * propertyStrs [] = {i_extraStr [i ], NULL };
1055+ i_dt -> addPropertyStrings (extraNode , "ibm,prd-label" ,propertyStrs );
10111056 }
10121057 else
10131058 {
10141059 cell_count -= sizeof (ranges [0 ]);
10151060 }
10161061 }
1062+ // add node style occ common node
1063+ const char * occStr = "ibm,occ-common-area" ;
1064+ uint64_t l_occCommonPhysAddr = getOccCommonAddr ();
1065+ uint64_t l_occCommonPhysSize = VMM_OCC_COMMON_SIZE ;
1066+ TRACFCOMP ( g_trac_devtree , "Reserved Region %s @ %lx, %lx" ,
1067+ occStr , l_occCommonPhysAddr , l_occCommonPhysSize );
1068+ dtOffset_t occNode = i_dt -> addNode (reservedMemNode ,
1069+ occStr ,
1070+ l_occCommonPhysAddr );
1071+ uint64_t propertyCells [2 ]= {l_occCommonPhysAddr , l_occCommonPhysSize };
1072+ i_dt -> addPropertyCells64 (occNode , "reg" , propertyCells , 2 );
1073+ const char * propertyStrs [] = {occStr , NULL };
1074+ i_dt -> addPropertyStrings (occNode , "ibm,prd-label" ,propertyStrs );
1075+
1076+ // 131056: Won't need the rest
10171077 reserve_strs [l_num ] = NULL ;
1018-
10191078 i_dt -> addPropertyStrings (rootNode , "reserved-names" , reserve_strs );
10201079 i_dt -> addPropertyCells64 (rootNode , "reserved-ranges" ,
10211080 reinterpret_cast < uint64_t * > (ranges ),
@@ -1283,7 +1342,7 @@ errlHndl_t bld_fdt_system(devTree * i_dt, bool i_smallTree)
12831342
12841343
12851344errlHndl_t bld_fdt_cpu (devTree * i_dt ,
1286- std ::vector < uint64_t > & o_homerRegions ,
1345+ std ::vector < homerAddr_t > & o_homerRegions ,
12871346 bool i_smallTree )
12881347{
12891348 // Nothing to do for small trees currently.
@@ -1356,7 +1415,7 @@ errlHndl_t bld_fdt_cpu(devTree * i_dt,
13561415}
13571416
13581417errlHndl_t bld_fdt_reserved_mem (devTree * i_dt ,
1359- std ::vector < uint64_t > & i_homerRegions ,
1418+ std ::vector < homerAddr_t > & i_homerRegions ,
13601419 bool i_smallTree )
13611420{
13621421 errlHndl_t errhdl = NULL ;
@@ -1982,7 +2041,7 @@ errlHndl_t build_flatdevtree( uint64_t i_dtAddr, size_t i_dtSize,
19822041 break ;
19832042 }
19842043
1985- std ::vector < uint64_t > l_homerRegions ;
2044+ std ::vector < homerAddr_t > l_homerRegions ;
19862045
19872046 TRACFCOMP ( g_trac_devtree , "---devtree cpu ---" );
19882047 errhdl = bld_fdt_cpu (dt , l_homerRegions , i_smallTree );
0 commit comments