Skip to content

Commit 77fb3e2

Browse files
Bill SchwartzA. Patrick Williams III
authored andcommitted
Support multiple instances for reserved memory
Update HBRT interface to add an instance to get_resvered_mem and update devtree entries with instance. Change-Id: Ie0c5a76ce5ff347354bc91898e1c4dc032430e13 RTC: 131056 Reviewed-on: http://gfw160.aus.stglabs.ibm.com:8080/gerrit/19281 Tested-by: Jenkins Server Reviewed-by: Daniel M. Crowell <dcrowell@us.ibm.com> Tested-by: Jenkins OP Build CI Tested-by: Jenkins OP HW Reviewed-by: MATTHEW A. PLOETZ <maploetz@us.ibm.com> Reviewed-by: A. Patrick Williams III <iawillia@us.ibm.com>
1 parent 5a39b44 commit 77fb3e2

File tree

10 files changed

+123
-46
lines changed

10 files changed

+123
-46
lines changed

src/include/runtime/interface.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,9 +153,10 @@ typedef struct hostInterfaces
153153
/** Get the address of a reserved memory region by its devtree name.
154154
*
155155
* @param[in] Devtree name (ex. "ibm,hbrt-vpd-image")
156+
* @param[in] Devtree instance
156157
* @return physical address of region (or NULL).
157158
**/
158-
uint64_t (*get_reserved_mem)(const char*);
159+
uint64_t (*get_reserved_mem)(const char *name, uint32_t instance);
159160

160161
/**
161162
* @brief Force a core to be awake, or clear the force

src/usr/devtree/bld_devtree.C

Lines changed: 86 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ namespace DEVTREE
6060
{
6161
using 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

211210
void 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

948947
void 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

12851344
errlHndl_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

13581417
errlHndl_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);

src/usr/hwpf/hwp/occ/occ.C

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,10 @@ namespace HBOCC
102102
//==============================
103103
//Setup Addresses
104104
//==============================
105-
uint8_t procPos = i_target->getAttr<ATTR_POSITION>();
106-
uint64_t procOffset = (procPos * VMM_HOMER_INSTANCE_SIZE);
107105

108106
#ifndef __HOSTBOOT_RUNTIME
107+
uint8_t procPos = i_target->getAttr<ATTR_POSITION>();
108+
uint64_t procOffset = (procPos * VMM_HOMER_INSTANCE_SIZE);
109109
uint64_t occImgPaddr =
110110
i_homerPhysAddrBase + procOffset + HOMER_OFFSET_TO_OCC_IMG;
111111

@@ -125,15 +125,16 @@ namespace HBOCC
125125
uint64_t occImgPaddr = homerPaddr + HOMER_OFFSET_TO_OCC_IMG;
126126
uint64_t occImgVaddr = homerVaddr + HOMER_OFFSET_TO_OCC_IMG;
127127

128-
uint64_t commonPhysAddr = // After homer region
129-
(homerPaddr - procOffset) + VMM_HOMER_REGION_SIZE;
128+
TARGETING::Target* sys = NULL;
129+
TARGETING::targetService().getTopLevelTarget(sys);
130+
uint64_t commonPhysAddr =
131+
sys->getAttr<ATTR_OCC_COMMON_AREA_PHYS_ADDR>();
130132

131133
uint64_t homerHostVirtAddr =
132134
homerVaddr + HOMER_OFFSET_TO_OCC_HOST_DATA;
133135

134136
#endif
135137

136-
137138
//==============================
138139
// Load OCC
139140
//==============================

src/usr/hwpf/hwp/occ/occ_common.C

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,10 @@ namespace HBOCC
270270

271271
// BAR3 is the OCC Common Area
272272
// Bar size is in MB, obtained value of 8MB from Tim Hallett
273+
TARGETING::Target* sys = NULL;
274+
TARGETING::targetService().getTopLevelTarget(sys);
275+
sys->setAttr<ATTR_OCC_COMMON_AREA_PHYS_ADDR>(i_commonPhysAddr);
276+
273277
TRACUCOMP( g_fapiImpTd,
274278
INFO_MRK"loadOCC: OCC Common Addr: 0x%.8X,size=0x%.8X",
275279
i_commonPhysAddr,VMM_OCC_COMMON_SIZE_IN_MB);

src/usr/hwpf/hwp/occ/runtime/rt_occ.C

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -431,22 +431,18 @@ namespace RT_OCC
431431
// If we already loaded OCC during the IPL we need to fix up
432432
// the virtual address because we're now not using virtual
433433
// memory
434-
// Note: We called our memory "ibm,slw-occ-image" but OPAL
435-
// created their own range that subsumed ours
436-
//@todo-RTC:124392-solve this naming issue...
437-
uint64_t l_base_homer =
438-
g_hostInterfaces->get_reserved_mem("ibm,homer-image");
439434

440435
TargetHandleList procChips;
441436
getAllChips(procChips, TYPE_PROC, true);
442437
for (TargetHandleList::iterator itr = procChips.begin();
443438
itr != procChips.end();
444439
++itr)
445440
{
446-
uint64_t l_offset = (*itr)->getAttr<ATTR_POSITION>()
447-
* VMM_HOMER_INSTANCE_SIZE;
448-
(*itr)->setAttr<ATTR_HOMER_VIRT_ADDR>
449-
(l_base_homer+l_offset);
441+
uint64_t l_instance = (*itr)->getAttr<ATTR_POSITION>();
442+
uint64_t l_homerAddr =
443+
g_hostInterfaces->get_reserved_mem("ibm,homer-image",
444+
l_instance);
445+
(*itr)->setAttr<ATTR_HOMER_VIRT_ADDR>(l_homerAddr);
450446
}
451447
}
452448
};

src/usr/targeting/common/xmltohb/attribute_types_hb.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,20 @@
378378
<hbOnly/>
379379
</attribute>
380380

381+
<attribute>
382+
<id>OCC_COMMON_AREA_PHYS_ADDR</id>
383+
<description>
384+
Physical address where OCC Common Area is placed in mainstore.
385+
</description>
386+
<simpleType>
387+
<uint64_t></uint64_t>
388+
</simpleType>
389+
<persistency>volatile-zeroed</persistency>
390+
<readable/>
391+
<writeable/>
392+
<hbOnly/>
393+
</attribute>
394+
381395
<attribute>
382396
<id>HOMER_PHYS_ADDR</id>
383397
<description>

src/usr/targeting/common/xmltohb/target_types_hb.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
<attribute><id>HTMGT_SAFEMODE</id></attribute>
7676
<attribute><id>IPMI_SENSORS</id></attribute>
7777
<attribute><id>IPMI_MAX_BUFFER_SIZE</id></attribute>
78+
<attribute><id>OCC_COMMON_AREA_PHYS_ADDR</id> </attribute>
7879
</targetTypeExtension>
7980

8081
<targetTypeExtension>

src/usr/targeting/runtime/attrrp_rt.C

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/* */
66
/* OpenPOWER HostBoot Project */
77
/* */
8-
/* Contributors Listed Below - COPYRIGHT 2013,2014 */
8+
/* Contributors Listed Below - COPYRIGHT 2013,2015 */
99
/* [+] International Business Machines Corp. */
1010
/* */
1111
/* */
@@ -43,7 +43,7 @@ namespace TARGETING
4343
do
4444
{
4545
TargetingHeader* l_header = reinterpret_cast<TargetingHeader*>(
46-
g_hostInterfaces->get_reserved_mem("ibm,hbrt-target-image"));
46+
g_hostInterfaces->get_reserved_mem("ibm,hbrt-target-image",0));
4747

4848
if ((NULL == l_header) ||
4949
(l_header->eyeCatcher != PNOR_TARG_EYE_CATCHER))

src/usr/testcore/rtloader/loader.H

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,8 @@ class RuntimeLoaderTest : public CxxTest::TestSuite
309309
}
310310

311311
//--------------------------------------------------------------------
312-
static uint64_t rt_get_reserved_mem(const char* i_region)
312+
static uint64_t rt_get_reserved_mem(const char* i_region,
313+
uint32_t i_instance)
313314
{
314315
if (0 == strcmp(i_region, "ibm,hbrt-vpd-image"))
315316
return rt_get_vpd();

src/usr/vpd/runtime/rt_vpd.C

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ errlHndl_t getPnorAddr( pnorInformation & i_pnorInfo,
9494
g_hostInterfaces != NULL &&
9595
g_hostInterfaces->get_reserved_mem)
9696
{
97-
vpd_addr = g_hostInterfaces->get_reserved_mem("ibm,hbrt-vpd-image");
97+
vpd_addr = g_hostInterfaces->get_reserved_mem("ibm,hbrt-vpd-image",0);
9898
if(vpd_addr == 0)
9999
{
100100
TRACFCOMP(g_trac_vpd,ERR_MRK"rt_vpd: Failed to get VPD addr. "

0 commit comments

Comments
 (0)