summaryrefslogtreecommitdiffstats
path: root/src/import/chips/p9/procedures/hwp/io/p9_io_xbus_scominit.C
blob: f2fe7d18e7c851b290dfbb380eea1fd0a75daf07 (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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: chips/p9/procedures/hwp/io/p9_io_xbus_scominit.C $            */
/*                                                                        */
/* IBM CONFIDENTIAL                                                       */
/*                                                                        */
/* EKB Project                                                            */
/*                                                                        */
/* COPYRIGHT 2015,2016                                                    */
/* [+] International Business Machines Corp.                              */
/*                                                                        */
/*                                                                        */
/* The source code for this program is not published or otherwise         */
/* divested of its trade secrets, irrespective of what has been           */
/* deposited with the U.S. Copyright Office.                              */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
///
/// @file p9_io_xbus_scominit.C
/// @brief Invoke XBUS initfile
///
//----------------------------------------------------------------------------
// *HWP HWP Owner       : Chris Steffen <cwsteffen@us.ibm.com>
// *HWP HWP Backup Owner: Gary Peterson <garyp@us.ibm.com>
// *HWP FW Owner        : Sumit Kumar <sumit_kumar@in.ibm.com>
// *HWP Team            : IO
// *HWP Level           : 2
// *HWP Consumed by     : FSP:HB
//----------------------------------------------------------------------------
//
// @verbatim
// High-level procedure flow:
//
//   Invoke XBUS scominit file.
//
// Procedure Prereq:
//   - System clocks are running.
// @endverbatim
//----------------------------------------------------------------------------


//------------------------------------------------------------------------------
//  Includes
//------------------------------------------------------------------------------
#include <p9_io_regs.H>
#include <p9_io_scom.H>
#include <p9_io_xbus_scominit.H>
#include <p9_xbus_g0_scom.H>
#include <p9_xbus_g1_scom.H>

enum
{
    ENUM_ATTR_XBUS_GROUP_0,
    ENUM_ATTR_XBUS_GROUP_1
};

//------------------------------------------------------------------------------
// Constant definitions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Function definitions
//------------------------------------------------------------------------------

/**
 * @brief Sets ATTR_IO_XBUS_MASTER_MODE based on fabric chip id and fabric group id
 * @param[in] i_target    Fapi2 Target
 * @param[in] i_ctarget   Fapi2 Connected Target
 * @retval    ReturnCode  Fapi2 ReturnCode
 */
fapi2::ReturnCode set_rx_master_mode(
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_target,
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_ctarget );

/**
 * @brief Gets the value of the ATTR_PROC_FABRIC_GROUP_ID and passes back by reference
 * @param[in] i_target    Fapi2 Target
 * @param[in] o_group_id  Group ID
 * @retval    ReturnCode  Fapi2 ReturnCode
 */
fapi2::ReturnCode p9_get_proc_fabric_group_id(
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_target,
    uint8_t&                                        o_group_id );

/**
 * @brief Gets the value of the ATTR_PROC_FABRIC_CHIP_ID and passes back by refernce
 * @param[in] i_target    Fapi2 Target
 * @param[in] o_chip_id   Chip ID
 * @retval    ReturnCode  Fapi2 ReturnCode
 */
fapi2::ReturnCode p9_get_proc_fabric_chip_id(
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_target,
    uint8_t&                                        o_chip_id );

/**
 * @brief HWP that calls the XBUS SCOM initfiles
 * Should be called for all valid/connected XBUS endpoints
 * @param[in] i_target           Reference to XBUS chiplet target
 * @param[in] i_connected_target Reference to connected XBUS chiplet target
 * @param[in] i_group            Reference to XBUS group-0/1
 * @return FAPI2_RC_SUCCESS on success, error otherwise
 */
fapi2::ReturnCode p9_io_xbus_scominit(
    const fapi2::Target<fapi2::TARGET_TYPE_XBUS>& i_target,
    const fapi2::Target<fapi2::TARGET_TYPE_XBUS>& i_connected_target,
    const uint8_t i_group)
{
    // mark HWP entry
    FAPI_INF("p9_io_xbus_scominit: Entering ...");
    const uint8_t     LANE_00  = 0;
    fapi2::ReturnCode rc       = fapi2::FAPI2_RC_SUCCESS;

    // get system target
    const fapi2::Target<fapi2::TARGET_TYPE_SYSTEM> l_system_target;


    // assert IO reset to power-up bus endpoint logic
    // read-modify-write, set single reset bit (HW auto-clears)
    // on writeback
    FAPI_TRY( io::rmw( EDIP_RX_IORESET, i_target, i_group, LANE_00, 1 ),
              "I/O Xbus Scominit: Primary Set Reset Hard Failed." );
    FAPI_TRY( io::rmw( EDIP_TX_IORESET, i_target, i_group, LANE_00, 1 ),
              "I/O Xbus Scominit: Primary Set Reset Hard Failed." );
    FAPI_TRY( io::rmw( EDIP_RX_IORESET, i_connected_target, i_group, LANE_00, 1 ),
              "I/O Xbus Scominit: Connected Set Reset Hard Failed." );
    FAPI_TRY( io::rmw( EDIP_TX_IORESET, i_connected_target, i_group, LANE_00, 1 ),
              "I/O Xbus Scominit: Primary Set Reset Hard Failed." );

    // Calculated HW Delay needed based on counter size and clock speed.
    // 50us -- Based on Counter Size, 40us minimum
    // 1 Million sim cycles -- Based on sim learning
    FAPI_TRY( fapi2::delay( 50000, 1000000 ) );

    FAPI_TRY( io::rmw( EDIP_RX_IORESET, i_target, i_group, LANE_00, 0 ),
              "I/O Xbus Scominit: Primary Set Reset Hard Failed." );
    FAPI_TRY( io::rmw( EDIP_TX_IORESET, i_target, i_group, LANE_00, 0 ),
              "I/O Xbus Scominit: Primary Set Reset Hard Failed." );
    FAPI_TRY( io::rmw( EDIP_RX_IORESET, i_connected_target, i_group, LANE_00, 0 ),
              "I/O Xbus Scominit: Connected Set Reset Hard Failed." );
    FAPI_TRY( io::rmw( EDIP_TX_IORESET, i_connected_target, i_group, LANE_00, 0 ),
              "I/O Xbus Scominit: Primary Set Reset Hard Failed." );


    // Set rx master/slave attribute prior to calling the scominit procedures.
    // The scominit procedure will reference the attribute to set the register field.
    FAPI_TRY( set_rx_master_mode( i_target, i_connected_target ),
              "Setting Rx Master Mode Attribute Failed." );

    switch(i_group)
    {
        case ENUM_ATTR_XBUS_GROUP_0:
            FAPI_INF("Group 0:Invoke FAPI procedure core: input_target");
            FAPI_EXEC_HWP(rc, p9_xbus_g0_scom, i_target, l_system_target);

            FAPI_INF("Group 0:Invoke FAPI procedure core: connected_target");
            FAPI_EXEC_HWP(rc, p9_xbus_g0_scom, i_connected_target, l_system_target);
            break;

        case ENUM_ATTR_XBUS_GROUP_1:
            FAPI_INF("Group 1:Invoke FAPI procedure core: input_target");
            FAPI_EXEC_HWP(rc, p9_xbus_g1_scom, i_target, l_system_target);

            FAPI_INF("Group 1:Invoke FAPI procedure core: connected_target");
            FAPI_EXEC_HWP(rc, p9_xbus_g1_scom, i_connected_target, l_system_target);
            break;
    }

    // mark HWP exit
    FAPI_INF("p9_io_xbus_scominit: ...Exiting");

fapi_try_exit:
    return fapi2::current_err;
}

/**
 * @brief Sets ATTR_IO_XBUS_MASTER_MODE based on fabric chip id and fabric group id
 * @param[in] i_target    Fapi2 Target
 * @param[in] i_ctarget   Fapi2 Connected Target
 * @retval    ReturnCode  Fapi2 ReturnCode
 */
fapi2::ReturnCode set_rx_master_mode(
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_target,
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_ctarget )
{
    FAPI_IMP( "I/O Xbus Scominit: Set Master Mode Enter." );
    uint8_t  l_primary_group_id   = 0;
    uint8_t  l_primary_chip_id    = 0;
    uint32_t l_primary_id         = 0;
    uint8_t  l_primary_attr       = 0;
    uint8_t  l_connected_group_id = 0;
    uint8_t  l_connected_chip_id  = 0;
    uint32_t l_connected_id       = 0;
    uint8_t  l_connected_attr     = 0;

    FAPI_TRY( p9_get_proc_fabric_group_id( i_target,  l_primary_group_id   ) );
    FAPI_TRY( p9_get_proc_fabric_group_id( i_ctarget, l_connected_group_id ) );

    FAPI_TRY( p9_get_proc_fabric_chip_id( i_target,  l_primary_chip_id   ) );
    FAPI_TRY( p9_get_proc_fabric_chip_id( i_ctarget, l_connected_chip_id ) );

    l_primary_id   = ( (uint32_t)l_primary_group_id   << 8 ) + (uint32_t)l_primary_chip_id;
    l_connected_id = ( (uint32_t)l_connected_group_id << 8 ) + (uint32_t)l_connected_chip_id;

    FAPI_DBG( "I/O Xbus Scominit: Target ID(%d) Connected ID(%d)", l_primary_id, l_connected_id );

    if( l_primary_id < l_connected_id )
    {
        l_primary_attr   = fapi2::ENUM_ATTR_IO_XBUS_MASTER_MODE_TRUE;
        l_connected_attr = fapi2::ENUM_ATTR_IO_XBUS_MASTER_MODE_FALSE;
    }
    else
    {
        l_primary_attr   = fapi2::ENUM_ATTR_IO_XBUS_MASTER_MODE_FALSE;
        l_connected_attr = fapi2::ENUM_ATTR_IO_XBUS_MASTER_MODE_TRUE;
    }

    FAPI_TRY( FAPI_ATTR_SET( fapi2::ATTR_IO_XBUS_MASTER_MODE, i_target, l_primary_attr ),
              "I/O Xbus Scominit: Set Primary Master Mode Attribute Failed." );
    FAPI_TRY( FAPI_ATTR_SET( fapi2::ATTR_IO_XBUS_MASTER_MODE, i_ctarget, l_connected_attr ),
              "I/O Xbus Scominit: Set Connected Master Mode Attribute Failed." );

fapi_try_exit:
    FAPI_IMP( "I/O Xbus Scominit: Set Master Mode Exit." );
    return fapi2::current_err;
}

/**
 * @brief Gets the value of the ATTR_PROC_FABRIC_GROUP_ID and passes back by reference
 * @param[in]  i_target    Fapi2 Target
 * @param[out] o_group_id  Group ID
 * @retval     ReturnCode  Fapi2 ReturnCode
 */
fapi2::ReturnCode p9_get_proc_fabric_group_id(
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_target,
    uint8_t&                                        o_group_id)
{
    FAPI_IMP("I/O Xbus Scominit: Get Proc Group Start.");

    fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_proc =
        i_target.getParent<fapi2::TARGET_TYPE_PROC_CHIP>();

    // Retrieve node attribute
    FAPI_TRY( FAPI_ATTR_GET( fapi2::ATTR_PROC_FABRIC_GROUP_ID, l_proc, o_group_id ),
              "(PROC): Error getting ATTR_PROC_FABRIC_GROUP_ID, l_rc 0x%.8X",
              (uint64_t)fapi2::current_err );

fapi_try_exit:
    FAPI_IMP("I/O Xbus Scominit: Get Proc Group Exit.");
    return fapi2::current_err;
}

/**
 * @brief Gets the value of the ATTR_PROC_FABRIC_CHIP_ID and passes back by refernce
 * @param[in]  i_target    Fapi2 Target
 * @param[out] o_chip_id   Chip ID
 * @retval     ReturnCode  Fapi2 ReturnCode
 */
fapi2::ReturnCode p9_get_proc_fabric_chip_id(
    const fapi2::Target< fapi2::TARGET_TYPE_XBUS >& i_target,
    uint8_t&                                        o_chip_id)
{
    FAPI_IMP("I/O Xbus Scominit: Get Proc Chip Id Start.");

    fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_proc =
        i_target.getParent<fapi2::TARGET_TYPE_PROC_CHIP>();

    // Retrieve pos ID attribute
    FAPI_TRY( FAPI_ATTR_GET( fapi2::ATTR_PROC_FABRIC_CHIP_ID, l_proc, o_chip_id ),
              "(PROC): Error getting ATTR_PROC_FABRIC_CHIP_ID, l_rc 0x%.8X",
              (uint64_t)fapi2::current_err );

fapi_try_exit:
    FAPI_IMP("I/O Xbus Scominit: Get Proc Chip Id Exit.");
    return fapi2::current_err;
}

OpenPOWER on IntegriCloud