1*207bed41SMurulidhar Nataraju #include <iostream> 2*207bed41SMurulidhar Nataraju #include <stdexcept> 3*207bed41SMurulidhar Nataraju #include <array> 4*207bed41SMurulidhar Nataraju #include "sbe_interfaces.hpp" 5*207bed41SMurulidhar Nataraju 6*207bed41SMurulidhar Nataraju namespace openpower 7*207bed41SMurulidhar Nataraju { 8*207bed41SMurulidhar Nataraju namespace sbe 9*207bed41SMurulidhar Nataraju { 10*207bed41SMurulidhar Nataraju 11*207bed41SMurulidhar Nataraju //Helper interfaces 12*207bed41SMurulidhar Nataraju static inline uint32_t upper(uint64_t value) 13*207bed41SMurulidhar Nataraju { 14*207bed41SMurulidhar Nataraju return ((value & 0xFFFFFFFF00000000ull) >> 32); 15*207bed41SMurulidhar Nataraju } 16*207bed41SMurulidhar Nataraju 17*207bed41SMurulidhar Nataraju static inline uint32_t lower(uint64_t value) 18*207bed41SMurulidhar Nataraju { 19*207bed41SMurulidhar Nataraju return (value & 0xFFFFFFFF); 20*207bed41SMurulidhar Nataraju } 21*207bed41SMurulidhar Nataraju 22*207bed41SMurulidhar Nataraju using sbe_word_t = uint32_t; 23*207bed41SMurulidhar Nataraju 24*207bed41SMurulidhar Nataraju namespace scom 25*207bed41SMurulidhar Nataraju { 26*207bed41SMurulidhar Nataraju 27*207bed41SMurulidhar Nataraju //Constants specific to SCOM operations 28*207bed41SMurulidhar Nataraju static constexpr sbe_word_t READ_OPCODE = 0x0000A201; 29*207bed41SMurulidhar Nataraju static constexpr sbe_word_t WRITE_OPCODE = 0x0000A202; 30*207bed41SMurulidhar Nataraju static constexpr size_t READ_CMD_LENGTH = 0x4; 31*207bed41SMurulidhar Nataraju static constexpr size_t WRITE_CMD_LENGTH = 0x6; 32*207bed41SMurulidhar Nataraju 33*207bed41SMurulidhar Nataraju //Reading SCOM Registers 34*207bed41SMurulidhar Nataraju uint64_t read(const char* devPath, 35*207bed41SMurulidhar Nataraju uint64_t address) 36*207bed41SMurulidhar Nataraju { 37*207bed41SMurulidhar Nataraju uint64_t value = 0; 38*207bed41SMurulidhar Nataraju 39*207bed41SMurulidhar Nataraju //Validate input device path 40*207bed41SMurulidhar Nataraju if (devPath == nullptr) 41*207bed41SMurulidhar Nataraju { 42*207bed41SMurulidhar Nataraju throw std::runtime_error("NULL FIFO device path"); 43*207bed41SMurulidhar Nataraju } 44*207bed41SMurulidhar Nataraju 45*207bed41SMurulidhar Nataraju //Build SCOM read request command 46*207bed41SMurulidhar Nataraju std::array<sbe_word_t, READ_CMD_LENGTH> command = 47*207bed41SMurulidhar Nataraju { 48*207bed41SMurulidhar Nataraju static_cast<sbe_word_t>(READ_CMD_LENGTH), 49*207bed41SMurulidhar Nataraju READ_OPCODE, 50*207bed41SMurulidhar Nataraju upper(address), 51*207bed41SMurulidhar Nataraju lower(address) 52*207bed41SMurulidhar Nataraju }; 53*207bed41SMurulidhar Nataraju 54*207bed41SMurulidhar Nataraju std::cout << "Size of read command buffer:" << command.size(); 55*207bed41SMurulidhar Nataraju 56*207bed41SMurulidhar Nataraju // TODO: Call an interface to read the command to the SBE FIFO and read the 57*207bed41SMurulidhar Nataraju // response from the SBE FIFO device 58*207bed41SMurulidhar Nataraju 59*207bed41SMurulidhar Nataraju return value; 60*207bed41SMurulidhar Nataraju } 61*207bed41SMurulidhar Nataraju 62*207bed41SMurulidhar Nataraju void write(const char* devPath, 63*207bed41SMurulidhar Nataraju uint64_t address, 64*207bed41SMurulidhar Nataraju uint64_t data) 65*207bed41SMurulidhar Nataraju { 66*207bed41SMurulidhar Nataraju //Validate input device path 67*207bed41SMurulidhar Nataraju if (devPath == nullptr) 68*207bed41SMurulidhar Nataraju { 69*207bed41SMurulidhar Nataraju throw std::runtime_error("NULL FIFO device path"); 70*207bed41SMurulidhar Nataraju } 71*207bed41SMurulidhar Nataraju 72*207bed41SMurulidhar Nataraju //Build SCOM write request command 73*207bed41SMurulidhar Nataraju std::array<sbe_word_t, WRITE_CMD_LENGTH> command = 74*207bed41SMurulidhar Nataraju { 75*207bed41SMurulidhar Nataraju static_cast<sbe_word_t>(WRITE_CMD_LENGTH), 76*207bed41SMurulidhar Nataraju WRITE_OPCODE, 77*207bed41SMurulidhar Nataraju upper(address), 78*207bed41SMurulidhar Nataraju lower(address), 79*207bed41SMurulidhar Nataraju upper(data), 80*207bed41SMurulidhar Nataraju lower(data) 81*207bed41SMurulidhar Nataraju }; 82*207bed41SMurulidhar Nataraju 83*207bed41SMurulidhar Nataraju std::cout << "Size of write command buffer:" << command.size(); 84*207bed41SMurulidhar Nataraju 85*207bed41SMurulidhar Nataraju // TODO: Call an interface to write the command to the SBE FIFO and read the 86*207bed41SMurulidhar Nataraju // response from the SBE FIFO device 87*207bed41SMurulidhar Nataraju 88*207bed41SMurulidhar Nataraju } 89*207bed41SMurulidhar Nataraju 90*207bed41SMurulidhar Nataraju } // namespace scom 91*207bed41SMurulidhar Nataraju } // namespace sbe 92*207bed41SMurulidhar Nataraju } // namespace openpower 93