blob: cb254aa415ddb4fe72bc44d52110e78d9e57f194 [file] [log] [blame]
Zane Shelley5a266612019-08-15 16:23:53 -05001
Zane Shelley7bf1f6d2019-10-18 16:03:51 -05002#include <isolator/hei_isolation_node.hpp>
Zane Shelleyca9f6252019-10-25 21:17:30 -05003#include <isolator/hei_isolator.hpp>
Zane Shelley75e68e92019-10-18 16:16:23 -05004#include <register/hei_hardware_register.hpp>
Zane Shelleyfc7ab192019-09-27 15:45:16 -05005#include <util/hei_flyweight.hpp>
Zane Shelley5a266612019-08-15 16:23:53 -05006
Zane Shelley75e68e92019-10-18 16:16:23 -05007// BEGIN temporary code
Zane Shelley11b89942019-11-07 11:07:28 -06008#include <isolator/hei_isolation_node.hpp>
Zane Shelleyb0559b92019-12-05 22:18:20 -06009#include <register/hei_operator_register.hpp>
Zane Shelley75e68e92019-10-18 16:16:23 -050010#include <register/hei_scom_register.hpp>
11// END temporary code
12
Zane Shelley5a266612019-08-15 16:23:53 -050013namespace libhei
14{
15
Zane Shelleyfe27b652019-10-28 11:33:07 -050016ReturnCode Isolator::initialize(void* i_buffer, size_t i_bufferSize,
Zane Shelley83da2452019-10-25 15:45:34 -050017 bool i_forceInit)
Zane Shelley5a266612019-08-15 16:23:53 -050018{
19 ReturnCode rc;
20
21 // BEGIN temporary code
Zane Shelley83da2452019-10-25 15:45:34 -050022 HEI_INF("Isolator::initialize(%p,%lu,%d)", i_buffer, i_bufferSize,
23 i_forceInit);
Zane Shelley65ed96a2019-10-14 13:06:11 -050024
Zane Shelley11b89942019-11-07 11:07:28 -060025 auto& scom_fw = Flyweight<ScomRegister>::getSingleton();
26 auto& idScom_fw = Flyweight<IdScomRegister>::getSingleton();
27 auto& isoNode_fw = Flyweight<IsolationNode>::getSingleton();
Zane Shelley8deb0902019-10-14 15:52:27 -050028
Zane Shelley11b89942019-11-07 11:07:28 -060029 auto& idScom0 = idScom_fw.get(IdScomRegister{
30 static_cast<ChipType_t>(0xdeadbeef), static_cast<RegisterId_t>(0x1111),
31 REG_INST_DEFAULT, REG_ACCESS_RW, 0x80000000FF000000});
Zane Shelley8deb0902019-10-14 15:52:27 -050032
Zane Shelley11b89942019-11-07 11:07:28 -060033 auto& scom0 = scom_fw.get(ScomRegister{
34 static_cast<ChipType_t>(0xdeadbeef), static_cast<RegisterId_t>(0x2222),
35 REG_INST_DEFAULT, REG_ACCESS_RW, 0x00FF0000});
36
37 auto& node0 = isoNode_fw.get(IsolationNode{idScom0});
38 auto& node1 = isoNode_fw.get(IsolationNode{scom0});
39
40 node0.addRule(ATTN_TYPE_CHECKSTOP, &idScom0);
41 node0.addChild(48, &node1);
42
43 node1.addRule(ATTN_TYPE_CHECKSTOP, &scom0);
44
45 iv_isoStart[static_cast<ChipType_t>(0xdeadbeef)].push_back(
46 {&node0, ATTN_TYPE_CHECKSTOP});
Zane Shelley5a266612019-08-15 16:23:53 -050047 // END temporary code
48
49 return rc;
50}
51
52void Isolator::uninitialize()
53{
Zane Shelley7bf1f6d2019-10-18 16:03:51 -050054 // Remove all of the IsolationNode objects stored in the flyweights. This
55 // must be done before removing the HardwareRegister objects
56 Flyweight<IsolationNode>::getSingleton().clear();
57
Zane Shelleyd0af3582019-09-19 10:48:59 -050058 // Must flush the hardware register cache before deleting any
59 // HardwareRegister objects.
60 HardwareRegister::flushAll();
61
Zane Shelley7bf1f6d2019-10-18 16:03:51 -050062 // Remove all of the HardwareRegister objects stored in the flyweights.
Zane Shelley8deb0902019-10-14 15:52:27 -050063 Flyweight<ScomRegister>::getSingleton().clear();
64 Flyweight<IdScomRegister>::getSingleton().clear();
Zane Shelley5a266612019-08-15 16:23:53 -050065}
66
Zane Shelleyfe27b652019-10-28 11:33:07 -050067ReturnCode Isolator::isolate(const std::vector<Chip>& i_chipList,
68 IsolationData& o_isoData) const
Zane Shelley5a266612019-08-15 16:23:53 -050069{
70 ReturnCode rc;
71
72 // Flush the isolation data to ensure a clean slate.
Zane Shelley93b61ad2019-10-16 20:41:03 -050073 o_isoData.flush();
Zane Shelley5a266612019-08-15 16:23:53 -050074
Zane Shelleyd0af3582019-09-19 10:48:59 -050075 // Flush the hardware register cache to avoid using stale data.
76 HardwareRegister::flushAll();
77
Zane Shelley61565dc2019-09-18 21:57:10 -050078 // Analyze active error on each chip.
Zane Shelleyfe27b652019-10-28 11:33:07 -050079 for (const auto& chip : i_chipList)
Zane Shelleyb406de42019-09-09 16:10:38 -050080 {
Zane Shelley61565dc2019-09-18 21:57:10 -050081 // BEGIN temporary code
Zane Shelley83da2452019-10-25 15:45:34 -050082 HEI_INF("Isolator::isolate(%p,%u)", chip.getChip(), chip.getType());
Zane Shelley11b89942019-11-07 11:07:28 -060083
84 // Isolation objects for this chip's type must exist.
85 const auto& chip_itr = iv_isoStart.find(chip.getType());
86 HEI_ASSERT(iv_isoStart.end() != chip_itr);
87
88 for (const auto& pair : chip_itr->second)
89 {
90 if (pair.first->analyze(chip, pair.second, o_isoData))
91 {
92 for (const auto& sig : o_isoData.getSignatureList())
93 {
94 HEI_INF("Signature(%p,0x%x,0x%x,0x%x,0x%x)",
95 sig.getChip().getChip(), sig.getId(),
96 sig.getInstance(), sig.getBit(), sig.getAttnType());
97 }
98 }
99 }
Zane Shelley61565dc2019-09-18 21:57:10 -0500100 // END temporary code
Zane Shelleyb406de42019-09-09 16:10:38 -0500101 }
Zane Shelley5a266612019-08-15 16:23:53 -0500102
103 return rc;
104}
105
106} // end namespace libhei