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