summaryrefslogtreecommitdiffstats
path: root/src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_delta_scan_rw.h
blob: d9890863db6cdd6a4bb08f6cc150a424079cb54e (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
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* $Source: src/usr/hwpf/hwp/build_winkle_images/p8_slw_build/p8_delta_scan_rw.h $ */
/*                                                                        */
/* IBM CONFIDENTIAL                                                       */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 2012,2013              */
/*                                                                        */
/* p1                                                                     */
/*                                                                        */
/* Object Code Only (OCO) source materials                                */
/* Licensed Internal Code Source Materials                                */
/* IBM HostBoot Licensed Internal Code                                    */
/*                                                                        */
/* 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.                              */
/*                                                                        */
/* Origin: 30                                                             */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
// $Id: p8_delta_scan_rw.h,v 1.48 2013/12/03 05:45:04 cmolsen Exp $
#define OVERRIDE_OFFSET 8            // Byte offset of forward pointer's addr relative 
                                     //   to base forward pointer's addr.
#define SIZE_IMAGE_BUF_MAX      5000000 // Max ~5MB image buffer size.
#define SIZE_IMAGE_CENTAUR_MAX  5000000 // Max ~5MB image buffer size.
#define SIZE_REPR_RING_MAX        50000 // Max ~50kB repr ring buffer size.
#define SCOM_REG_MASK   0x00ffffff   // Scom register mask (within a chiplet)
#define CID_MASK        0xff000000   // Chiplet ID mask
#define CID_EX_LOW      0x10         // Lowest EX chiplet addr
#define CID_EX_HIGH     0x1f         // Highest EX chiplet addr

/*****  Xip customize support ****/
#define COMBINED_GOOD_VECTORS_TOC_NAME    "combined_good_vectors"
#define L2_SINGLE_MEMBER_ENABLE_TOC_NAME  "l2_single_member_enable_mask"
#define PROC_PIB_REPR_VECTOR_TOC_NAME     "proc_sbe_pibmem_repair_vector"
#define NEST_SKEWADJUST_VECTOR_TOC_NAME   "proc_sbe_nest_skewadjust_vector"
#define SECURITY_SETUP_VECTOR_TOC_NAME    "proc_sbe_security_setup_vector"
#define VALID_BOOT_CORES_MASK_TOC_NAME    "valid_boot_cores_mask"
#define MAX_PLL_RING_SIZE                  128 // Bytes
#define PERV_BNDY_PLL_RING_TOC_NAME       "perv_bndy_pll_ring"
#define PERV_BNDY_PLL_RING_ALT_TOC_NAME   "perv_bndy_pll_ring_alt"
#define MAX_FUNC_L3_RING_LIST_ENTRIES     64  
#define MAX_FUNC_L3_RING_SIZE             7000 // Bytes
#define FUNC_L3_RING_TOC_NAME             "ex_func_l3_ring"
#define MAX_CEN_PLL_RING_SIZE               80 // Bytes
#define TP_PLL_BNDY_RING_ALT_TOC_NAME     "tp_pll_bndy_ring_alt"
#define STANDALONE_MBOX0_VALUE_TOC_NAME   "standalone_mbox0_value"
#define STANDALONE_MBOX1_VALUE_TOC_NAME   "standalone_mbox1_value"
#define STANDALONE_MBOX2_VALUE_TOC_NAME   "standalone_mbox2_value"
#define STANDALONE_MBOX3_VALUE_TOC_NAME   "standalone_mbox3_value"
#define UNTRUSTED_BAR_TOC_NAME            "fabric_config"
#define UNTRUSTED_PBA_BAR_TOC_NAME        "fabric_config_pba"

/*****  Scan setting  *****/
#define OPCG_SCAN_RATIO                     4
#define P8_OPCG_SCAN_RATIO_BITS             (uint64_t(OPCG_SCAN_RATIO-1)<<(63-8))
#define P8_OPCG_GO_BITS                     (uint64_t(0x40000000)<<32)
#define P8_SCAN_POLL_MASK_BIT15             (uint64_t(0x00010000)<<32)

/*****  Scan Control Regs  *****/
#define P8_PORE_OPCG_CTRL_REG0_0x00030002   0x00030002 // OPCG control reg 0
#define P8_PORE_OPCG_CTRL_REG1_0x00030003   0x00030003 // OPCG control reg 1
#define P8_PORE_OPCG_CTRL_REG2_0x00030004   0x00030004 // OPCG control reg 2
#define P8_PORE_OPCG_START_REG3_0x00030005  0x00030005 // OPCG start reg 3
#define P8_PORE_CLOCK_REGION_0x00030006     0x00030006 // Clock region control
#define P8_PORE_CLOCK_CONTROLLER_REG        0x00030007 // Addr of clock ctrl scom reg
#define P8_PORE_CLOCK_STATUS_0x00030008     0x00030008 // Status of clocks running
#define P8_PORE_SHIFT_REG                   0x00038000 // Addr of scom reg that does scan ring shifting
#define P8_SCAN_CHECK_WORD                  0xA5A55A5A // Header check word

/*****  Ring state *****/
#define MAX_RING_SIZE 500000   // 500kbits is the max ring size in bits

/***** Return codes *****/
#define DSLWB_RING_SEARCH_MATCH               0
#define DSLWB_RING_SEARCH_EXHAUST_MATCH      30
#define DSLWB_RING_SEARCH_NO_MATCH           31
#define DSLWB_RING_SEARCH_MESS               32
#define DSLWB_SLWB_SUCCESS                    0
#define DSLWB_SLWB_NO_RING_MATCH             40
#define DSLWB_SLWB_DX_ERROR                  41
#define DSLWB_SLWB_WF_ERROR                  42
#define DSLWB_SLWB_WF_IMAGE_ERROR            43
#define DSLWB_SLWB_IMAGE_ERROR               44
#define DSLWB_SLWB_UNKNOWN_ERROR             45
#define IMGBUILD_SUCCESS                      0  // Successful img build.
#define IMGBUILD_ERR_GENERIC                  1  // Non-specific error code.
#define IMGBUILD_ERR_FILE_ACCESS              2  // Unable to access/open file.
#define IMGBUILD_ERR_CHIPLET_ID_MESS          4  // Chiplet ID mess(mostly for VPD rings).
#define IMGBUILD_NO_RINGS_FOUND               5  // Successful img build but no rings found.
#define IMGBUILD_BAD_ARGS                     6  // Bad function arguments.
#define IMGBUILD_ERR_MEMORY                   7  // Memory allocation error.
#define IMGBUILD_ERR_RING_TOO_LARGE           8  // Ring size exceeds HB/PHYP's buffer.
#define IMGBUILD_ERR_CHECK_CODE               9  // Coding or image data problem.
#define IMGBUILD_INVALID_IMAGE               10  // Invalid image.
#define IMGBUILD_IMAGE_SIZE_MISMATCH         11  // Mismatch between image sizes.
#define IMGBUILD_IMAGE_SIZE_MESS             12  // Messed up image or section sizes.
#define IMGBUILD_RINGTYPE_NOT_ALLOWED        13  // Ringtype not allowed.
#define IMGBUILD_BUFFER_TOO_SMALL            14  // Buffer too small.
#define IMGBUILD_ERR_PORE_INLINE             20  // Pore inline error.
#define IMGBUILD_ERR_PORE_INLINE_ASM         21  // Err assoc w/inline assembler.
#define IMGBUILD_RING_SEARCH_MATCH            0
#define IMGBUILD_RING_SEARCH_EXHAUST_MATCH   30
#define IMGBUILD_RING_SEARCH_NO_MATCH        31
#define IMGBUILD_RING_SEARCH_MESS            32
#define IMGBUILD_ERR_RING_SEARCH             33  // Err assoc w/ring retrieval.
#define IMGBUILD_ERR_DATACARE_RING_MESS      34  // Err assoc w/datacare & vpd ring sizes.
#define IMGBUILD_ERR_WF_CREATE               45  // Err assoc w/create_wiggle_flip_prg.
#define IMGBUILD_ERR_RING_WRITE_TO_IMAGE     46  // Err assoc w/wr_ring_block_to_img.
#define IMGBUILD_ERR_SECTION_SIZING          48  // Err assoc w/section sizing.
#define IMGBUILD_ERR_GET_SECTION             49  // Err assoc w/getting section ID.
#define IMGBUILD_ERR_SECTION_DELETE          50  // Err assoc w/deleting ELF section.
#define IMGBUILD_ERR_APPEND                  51  // Err assoc w/appending to ELF section.
#define IMGBUILD_ERR_INCOMPLETE_IMG_BUILD    52  // The image was built, but with errors.
#define IMGBUILD_ERR_FWD_BACK_PTR_MESS       53  // Forward or backward pointer mess.
#define IMGBUILD_ERR_KEYWORD_NOT_FOUND       54  // Image keyword not found.
#define IMGBUILD_ERR_MISALIGNED_RING_LAYOUT  55  // Ring layout is misaligned.
#define IMGBUILD_ERR_IMAGE_TOO_LARGE         56  // Image too large. Exceeded max size.
#define IMGBUILD_ERR_XIP_MISC                57  // Miscellaneous XIP image error.
#define IMGBUILD_ERR_XIP_UNKNOWN             58  // Unknown XIP image error.
#define IMGBUILD_ERR_RS4_DECOMPRESS          59  // Error during RS4 decompression.
#define IMGBUILD_ERR_RS4_COMPRESS            60  // Error during RS4 compression.
#define IMGBUILD_ERR_RAM_HDRS_NOT_SYNCED     61  // Ram headers not synchronized.
#define IMGBUILD_ERR_RAM_TABLE_FULL          63  // Ram table is full.       
#define IMGBUILD_ERR_RAM_CODE                64  // Code error in Ram API code.
#define IMGBUILD_ERR_RAM_INVALID_PARM        65  // Invalid Ramming parameter.
#define IMGBUILD_WARN_RAM_TABLE_CONTAMINATION 66 // Ram table contamination
#define IMGBUILD_ERR_RAM_TABLE_FAIL          67  // Unsuccessful RAM table build.
#define IMGBUILD_ERR_RAM_TABLE_END_NOT_FOUND 68  // Table entry end bit not found.
#define IMGBUILD_ERR_SCOM_INVALID_PARM       70  // Invalid Scomming parameter.
#define IMGBUILD_ERR_SCOM_HDRS_NOT_SYNCD     72  // Scom headers out of sync.
#define IMGBUILD_ERR_SCOM_ENTRY_NOT_FOUND    74  // Scom entry not found (OR/AND oper.)
#define IMGBUILD_ERR_SCOM_REPEAT_ENTRIES     76  // Repeat entries not allow.
#define IMGBUILD_ERR_SCOM_INVALID_SUBSECTION 77  // Invalid subsection value.
#define IMGBUILD_ERR_SCOM_TABLE_FAIL         79  // Unsuccessful SCOM table build.

#if defined SLW_COMMAND_LINE_RAM || defined XIPC_COMMAND_LINE
#define SLW_COMMAND_LINE
#endif

#if defined __FAPI && !(defined __P8_PORE_TABLE_GEN_API_C)
#define MY_INF(_fmt_, _args_...) FAPI_INF(_fmt_, ##_args_)
#ifndef SLW_COMMAND_LINE
#define MY_ERR(_fmt_, _args_...) FAPI_ERR(_fmt_, ##_args_)
#else
#define MY_ERR(_fmt_, _args_...) FAPI_INF(_fmt_, ##_args_)
#endif // End of SLW_COMMAND_LINE
#define MY_DBG(_fmt_, _args_...) FAPI_DBG(_fmt_, ##_args_)
#else  // End of __FAPI
#ifdef SLW_COMMAND_LINE
#define MY_INF(_fmt_, _args_...) printf(_fmt_, ##_args_)
#define MY_ERR(_fmt_, _args_...) printf(_fmt_, ##_args_)
#define MY_DBG(_fmt_, _args_...) printf(_fmt_, ##_args_)
#else  // End of SLW_COMMAND_LINE
#define MY_INF(_fmt_, _args_...)
#define MY_ERR(_fmt_, _args_...)
#define MY_DBG(_fmt_, _args_...)
#endif  // End of not(__FAPI) & not(SLW_COMMAND_LINE)
#endif

#ifdef SLW_COMMAND_LINE
// Debug and development stuff
//#define IGNORE_FOR_NOW  // Causes code sections to be ignored.
#define DEBUG_SUPPORT   // Activates sbe-xip debug support.
#endif

//#include <stdio.h>
//#include <stdint.h>
//#include <stdlib.h>
#include <p8_pore_api_custom.h>
#include <string.h>

#if defined SLW_COMMAND_LINE
#include <stdint.h> // May be in conflict with p8_pore_api_custom.h
#include <stdlib.h> // May be in conflict with p8_pore_api_custom.h
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#endif //End of SLW_COMMAND_LINE

// Not needed by:
// - Done: p8_pore_table_gen_api, p8_slw_build, p8_xip_customize, sbe_xip_tool,
//   p8_delta_scan, p8_ipl_build, p8_centaur_build.
// - So, what was this used for?
//#include <pore_bitmanip.H>

#include <p8_image_help_base.H>

#if !(defined __P8_PORE_TABLE_GEN_API_C) && !(defined __CEN_XIP_CUSTOMIZE_C) && !(defined SLW_COMMAND_LINE_RAM)
// We don't need this include for gen_cpureg/scom or slw ramming.
#include <p8_scan_compression.H>
#endif

#undef __PORE_INLINE_ASSEMBLER_C__
#include <pore_inline.h>

#if( defined(__cplusplus) && !defined(PLIC_MODULE) )
extern "C" {
#endif


#if !(defined __P8_PORE_TABLE_GEN_API_C) && !(defined SLW_COMMAND_LINE_RAM)

// Info:
// DeltaRingLayout describes the sequential order of the content in the compressed delta
//   ring blocks in the .initf section in the SBE-XIP images.
// When creating the .initf delta ring blocks, the following rules must be followed:
// - Everything must be stored in BE format.
// - {entryOffset; sizeOfThis; sizeOfMeta; metaData} must be word-aligned to ensure 
//   that the {rs4Launch} starts on a word boundary.
// - {rs4Launch} must start on a word boundary (see earlier rule how to do that).
// - {entryOffset; sizeOfThis; sizeOfMeta; metaData; rs4Launch} must be double-word-
//   aligned to ensure that {rs4Delta} starts on a double-word boundary.
// - {rs4Delta} must start on a double-word bournday (see earlier rule how to do that).
//
typedef struct {
  uint64_t entryOffset;
  uint64_t backItemPtr;
  uint32_t sizeOfThis;
  uint32_t sizeOfMeta; // Exact size of meta data. Arbitrary size. Not null terminated.
  uint32_t ddLevel;
  uint8_t  sysPhase;
  uint8_t  override;
  uint8_t  reserved1;
  uint8_t  reserved2;
  char     *metaData;  // Arbitrary size. Extra bytes to next alignment are random or 0s.
  uint32_t *rs4Launch; // Code. Must be 4-byte aligned. Actually should be 8-B align!
  uint32_t *rs4Delta;  // Data. Must be 8-byte aligned.
  uint32_t *wfInline;  // Code. Must be 4-byte aligned. Actually should be 8-B align!
} DeltaRingLayout;

typedef struct {
  uint32_t sizeOfData;
  char     data[];
} MetaData;

int calc_ring_delta_state(  
              const uint32_t  *i_init,
							const uint32_t  *i_alter,
							uint32_t        *o_delta,
							const uint32_t  i_ringLen);

int  create_wiggle_flip_prg(  
              uint32_t   *i_deltaRing,
              uint32_t   i_ringBitLen,
              uint32_t   i_scanSelectData,
              uint32_t   i_chipletID,
              uint32_t   **o_wfInline,
              uint32_t   *o_wfInlineLenInWords,
              uint8_t    i_flushOptimization,
							uint32_t   i_scanMaxRotate,
              uint32_t   i_waitsScanDelay,
              uint32_t   i_ddLevel);

uint64_t calc_ring_layout_entry_offset(
							uint8_t  i_typeRingLayout,
							uint32_t i_sizeMetaData);

int write_ring_block_to_image(  
							void             *io_image,
							const char       *i_ringName,    // NULL if no name.
              DeltaRingLayout  *i_ringBlock,
							const uint8_t    i_idxVector,   // [0-15] - Ignored if ringName==NULL
							const uint8_t    i_override,    // [0,1]  - Ignored if ringName==NULL
							const uint8_t    i_overridable, // [0,1]  - Ignored if ringName==NULL
              const uint32_t   i_sizeImageMax,
              const uint8_t    i_xipSectionId,
              void             *i_bufTmp,
              const uint32_t   i_sizeBufTmp);

#if !(defined __CEN_XIP_CUSTOMIZE_C)

int p8_centaur_build( 
							void      *i_imageIn,
              uint32_t  i_ddLevel,
              void      *i_imageOut,
              uint32_t  i_sizeImageOutMax);

int p8_ipl_build(     
							void      *i_imageIn,
              uint32_t  i_ddLevel,
              void      *i_imageOut,
              uint32_t  i_sizeImageOutMax);

int get_ring_layout_from_image2(  
							const void  *i_imageIn,
              uint32_t    i_ddLevel,
              uint8_t      i_sysPhase,
              DeltaRingLayout  **o_rs4RingLayout,
              void        **nextRing,
              uint8_t     i_xipSectionId);

int gen_ring_delta_state(  
              uint32_t   bitLen, 
              uint32_t   *i_init, 
              uint32_t   *i_alter,
              uint32_t   *o_delta,
              uint32_t   verbose);

int write_rs4_ring_to_ref_image(  
              char       *i_fnImage,
              CompressedScanData *i_RS4,
              uint32_t   i_ddLevel,
              uint8_t    i_sysPhase,
              uint8_t    i_override,
							uint8_t    i_ringType,
              char       *i_varName,
              char       *i_fnMetaData,
							void       *i_bufTmp,
							uint32_t   i_sizeBufTmp,
              uint32_t   verbose);

int write_vpd_ring_to_ipl_image(
              void       *io_image,
							uint32_t   &io_sizeImageOut,
							CompressedScanData *i_bufRs4Ring,
							uint32_t   i_ddLevel,
							uint8_t    i_sysPhase,
              char       *i_ringName,
							void       *i_bufTmp,
							uint32_t   i_sizeBufTmp,
              uint8_t    i_xipSection);

int write_vpd_ring_to_slw_image(
              void       *io_image,
							uint32_t   &io_sizeImageOut,
							CompressedScanData *i_bufRs4Ring,
							uint32_t   i_ddLevel,
							uint8_t    i_sysPhase,
              char       *i_ringName,
							void       *i_bufTmp,
							uint32_t   i_sizeBufTmp,
              uint8_t    i_bWcSpace);

int check_and_perform_ring_datacare( 
						  void      *i_imageRef,
							void      *io_buf1,
							uint8_t   i_ddLevel,
						  uint8_t   i_sysPhase,
							char      *i_ringName,
							void      *i_buf2,
							uint32_t  i_sizeBuf2);
							
int get_delta_ring_from_image(
              char       *i_fnImage,
              char       *i_varName,
              uint32_t   i_ddLevel,
              uint8_t    i_sysPhase,
              uint8_t    i_override,
              MetaData  **o_metaData,
              CompressedScanData  **o_deltaRingRS4,
              uint32_t   verbose);

int write_wiggle_flip_to_image(
              void       *io_imageOut,
              uint32_t   *i_sizeImageMaxNew,
              DeltaRingLayout *i_ringLayout,
              uint32_t   *i_wfInline,
              uint32_t   i_wfInlineLenInWords);

int get_ring_layout_from_image(  
              const void *i_imageIn,
              uint32_t   i_ddLevel,
              uint8_t    i_sysPhase,
              DeltaRingLayout  *o_rs4RingLayout,
              void       **nextRing);

int append_empty_section(
              void      *io_image,
              int       *i_sizeImageMaxNew,
              uint32_t  i_sectionId,
              int       *i_sizeSection,
							uint8_t   i_bFixed);

int initialize_slw_section(
              void      *io_image,
              uint32_t  *i_sizeImageMaxNew);

int create_and_initialize_fixed_image(
              void      *io_image);

int update_runtime_scom_pointer(
							void			*io_image);

void cleanup(
              void *buf1=NULL,
              void *buf2=NULL,
              void *buf3=NULL,
              void *buf4=NULL,
              void *buf5=NULL);
              
#endif  // End of !(defined __CEN_XIP_CUSTOMIZE_C)

#endif  // End of !(defined __P8_PORE_TABLE_GEN_API_C) && !(defined SLW_COMMAND_LINE_RAM)

// Byte-reverse a 32-bit integer if on an LE machine
inline uint32_t myRev32(const uint32_t i_x)
{
    uint32_t rx;

#ifdef _BIG_ENDIAN
    rx = i_x;
#else
    uint8_t *pix = (uint8_t*)(&i_x);
    uint8_t *prx = (uint8_t*)(&rx);

    prx[0] = pix[3];
    prx[1] = pix[2];
    prx[2] = pix[1];
    prx[3] = pix[0];
#endif

    return rx;
}

// Byte-reverse a 64-bit integer if on a little-endian machine
inline uint64_t myRev64(const uint64_t i_x)
{
    uint64_t rx;

#ifdef _BIG_ENDIAN
    rx = i_x;
#else
    uint8_t *pix = (uint8_t*)(&i_x);
    uint8_t *prx = (uint8_t*)(&rx);

    prx[0] = pix[7];
    prx[1] = pix[6];
    prx[2] = pix[5];
    prx[3] = pix[4];
    prx[4] = pix[3];
    prx[5] = pix[2];
    prx[6] = pix[1];
    prx[7] = pix[0];
#endif

    return rx;
}

// N-byte align an address, offset or size (aos)
inline uint64_t myByteAlign( const uint8_t nBytes, const uint64_t aos)
{
  return ((aos+nBytes-1)/nBytes)*nBytes;
}

#if( defined(__cplusplus) && !defined(PLIC_MODULE) )
}
#endif
OpenPOWER on IntegriCloud