summaryrefslogtreecommitdiffstats
path: root/src/usr/pnor/runtime/rt_pnor.H
blob: 6af1119956164eacc6a338251aee622867bf477e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: src/usr/pnor/runtime/rt_pnor.H $                              */
/*                                                                        */
/* OpenPOWER HostBoot Project                                             */
/*                                                                        */
/* Contributors Listed Below - COPYRIGHT 2014,2017                        */
/* [+] International Business Machines Corp.                              */
/*                                                                        */
/*                                                                        */
/* Licensed under the Apache License, Version 2.0 (the "License");        */
/* you may not use this file except in compliance with the License.       */
/* You may obtain a copy of the License at                                */
/*                                                                        */
/*     http://www.apache.org/licenses/LICENSE-2.0                         */
/*                                                                        */
/* Unless required by applicable law or agreed to in writing, software    */
/* distributed under the License is distributed on an "AS IS" BASIS,      */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        */
/* implied. See the License for the specific language governing           */
/* permissions and limitations under the License.                         */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
#ifndef _RT_PNOR_H_
#define _RT_PNOR_H_

#include <pnor/pnorif.H>
#include "../pnor_common.H"
#include <errl/errlentry.H>
#include <map>

typedef std::pair<void*, void*> PnorAddrPair_t;
typedef std::map<PNOR::SectionId, PnorAddrPair_t> PnorAddrMap_t;

class RtPnor
{
    public:

      /**
       * @brief Static Initializer
       * @param[in] ref to errlHndl_t
       */
        static void init ( errlHndl_t &io_rtaskRetErrl );

      /**
       * @brief  Return the size and address of a given section
       *         of PNOR data at runtime
       *         Called by external PNOR::getSectionInfo()
       *
       * @param[in] i_section   PNOR section
       * @param[out] o_info     Location and size information
       *
       * @return errlHndl_t     Error log if request was invalid
       */
        errlHndl_t getSectionInfo ( PNOR::SectionId i_section,
                                    PNOR::SectionInfo_t& o_info);

      /**
       * @brief  Writes the data back to PNOR of a given section
       *         of PNOR at runtime
       *         Called by external PNOR::flush()
       *
       * @param[in] i_section   PNOR section
       * @return errlHndl_t     Error log if request was invalid
       */
        errlHndl_t flush (PNOR::SectionId i_section);

      /**
       * @brief Returns information about a given side of pnor
       *        (Called by an external interface PNOR::getSideInfo())
       * @param[in]  i_side PNOR side
       * @param[out] o_info side information
       *
       * @return errlHndl_t Error log if request was invalid
       */
        errlHndl_t getSideInfo( PNOR::SideId i_side,
                                PNOR::SideInfo_t& o_info);

      /**
       * @brief  Clears the specified PNOR section with all FF's (w/ good ECC)
       *
       * @param[in] i_id  PNOR section to clear
       *
       * @return Error if fails
       */
        errlHndl_t clearSection(PNOR::SectionId i_section);

        /**
         * @brief Retrieve some information about the PNOR/SFC hardware
         *        In runtime, some of this information is from attributes.
         *
         * @param[out] o_pnorInfo Information about PNOR.
         */
        errlHndl_t getPnorInfo( PNOR::PnorInfo_t& o_pnorInfo );

    protected:
       /**
        * @brief Constructor
        */
        RtPnor();

       /**
        * @brief Destructor
        */
        ~RtPnor();

    private:
        /**
         * Cached copy of section data
         */
        PNOR::SectionData_t iv_TOC[PNOR::NUM_SECTIONS+1];

        /**
         * Keeps track of the data pointers for different sections in the PNOR
         */
        PnorAddrMap_t iv_pnorMap;

        /**
         * @brief  Reads data from the PNOR device
         *          and removes ecc if necessary
         *
         * @param[in] i_procId  processor id
         * @param[in] i_section section of the pnor to write back
         * @param[in] i_offset  offset into the pnor
         * @param[in] i_size    size of data to read in bytes
         * @param[in] i_ecc     true=verify and strip ECC after reading
         * @param[in] o_data    Buffer to copy data into
         *
         * @return Error from device
         */
        // @TODO RTC 173489
        // Remove static once FSP fully supports signing of PNOR sections that
        // did not previously have a sha512 header.  Also add the const method
        // qualifier back in
        static errlHndl_t readFromDevice (uint64_t i_procId,
                                   PNOR::SectionId i_section,
                                   uint64_t i_offset,
                                   size_t i_size,
                                   bool i_ecc,
                                   void* o_data);

        // @TODO RTC 173489
        // Remove API once FSP fully supports signing of PNOR sections that did
        // not previously have a sha512 header
        friend errlHndl_t PNOR::readHeaderMagic(
                  PNOR::SectionId      i_secId,
            const PNOR::SectionData_t& i_TOC,
                  size_t               i_size,
                  void* const          o_pData);

        /**
         * @brief  Write data back to the PNOR device
         *         and injects ecc if necessary
         *
         * @param[in] i_procId  processor id
         * @param[in] i_section section of the pnor to write back
         * @param[in] i_offset  offset into the pnor
         * @param[in] i_size    size of data to read in bytes
         * @param[in] i_ecc     true=apply ECC before writing
         * @param[in] i_src     Buffer to copy data from
         *
         * @return Error from device
         */
        errlHndl_t writeToDevice( uint64_t i_procId,
                                  PNOR::SectionId i_section,
                                  uint64_t i_offset,
                                  size_t i_size,
                                  bool i_ecc,
                                  void* i_src );

        /**
         * @brief Verify both TOC's and store section information from one of
         *  the verified TOC's
         *
         * @return Error from device
         */
        errlHndl_t readTOC();

        /**
         * @brief Get processor id of master proc and cache in internal variable
         *
         * @return errlHndl_t - Error from runtime targeting call
         */
        errlHndl_t getMasterProcId();

        // Cached master Proc Id
        static uint64_t iv_masterProcId;

        //allow testcases to see inside the class
        friend class PnorRtTest;

        /**
         * @brief Static instance function for testcase only
         */
        static RtPnor& getInstance();
};

#endif
OpenPOWER on IntegriCloud