Blame view

kernel/linux-imx6_3.14.28/Documentation/powerpc/qe_firmware.txt 12.8 KB
6b13f685e   김민수   BSP 최초 추가
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
  	   Freescale QUICC Engine Firmware Uploading
  	   -----------------------------------------
  
  (c) 2007 Timur Tabi <timur at freescale.com>,
      Freescale Semiconductor
  
  Table of Contents
  =================
  
    I - Software License for Firmware
  
    II - Microcode Availability
  
    III - Description and Terminology
  
    IV - Microcode Programming Details
  
    V - Firmware Structure Layout
  
    VI - Sample Code for Creating Firmware Files
  
  Revision Information
  ====================
  
  November 30, 2007: Rev 1.0 - Initial version
  
  I - Software License for Firmware
  =================================
  
  Each firmware file comes with its own software license.  For information on
  the particular license, please see the license text that is distributed with
  the firmware.
  
  II - Microcode Availability
  ===========================
  
  Firmware files are distributed through various channels.  Some are available on
  http://opensource.freescale.com.  For other firmware files, please contact
  your Freescale representative or your operating system vendor.
  
  III - Description and Terminology
  ================================
  
  In this document, the term 'microcode' refers to the sequence of 32-bit
  integers that compose the actual QE microcode.
  
  The term 'firmware' refers to a binary blob that contains the microcode as
  well as other data that
  
  	1) describes the microcode's purpose
  	2) describes how and where to upload the microcode
  	3) specifies the values of various registers
  	4) includes additional data for use by specific device drivers
  
  Firmware files are binary files that contain only a firmware.
  
  IV - Microcode Programming Details
  ===================================
  
  The QE architecture allows for only one microcode present in I-RAM for each
  RISC processor.  To replace any current microcode, a full QE reset (which
  disables the microcode) must be performed first.
  
  QE microcode is uploaded using the following procedure:
  
  1) The microcode is placed into I-RAM at a specific location, using the
     IRAM.IADD and IRAM.IDATA registers.
  
  2) The CERCR.CIR bit is set to 0 or 1, depending on whether the firmware
     needs split I-RAM.  Split I-RAM is only meaningful for SOCs that have
     QEs with multiple RISC processors, such as the 8360.  Splitting the I-RAM
     allows each processor to run a different microcode, effectively creating an
     asymmetric multiprocessing (AMP) system.
  
  3) The TIBCR trap registers are loaded with the addresses of the trap handlers
     in the microcode.
  
  4) The RSP.ECCR register is programmed with the value provided.
  
  5) If necessary, device drivers that need the virtual traps and extended mode
     data will use them.
  
  Virtual Microcode Traps
  
  These virtual traps are conditional branches in the microcode.  These are
  "soft" provisional introduced in the ROMcode in order to enable higher
  flexibility and save h/w traps If new features are activated or an issue is
  being fixed in the RAM package utilizing they should be activated.  This data
  structure signals the microcode which of these virtual traps is active.
  
  This structure contains 6 words that the application should copy to some
  specific been defined.  This table describes the structure.
  
  	---------------------------------------------------------------
  	| Offset in |                  | Destination Offset | Size of |
  	|   array   |     Protocol     |   within PRAM      | Operand |
  	--------------------------------------------------------------|
  	|     0     | Ethernet         |      0xF8          | 4 bytes |
  	|           | interworking     |                    |         |
  	---------------------------------------------------------------
  	|     4     | ATM              |      0xF8          | 4 bytes |
  	|           | interworking     |                    |         |
  	---------------------------------------------------------------
  	|     8     | PPP              |      0xF8          | 4 bytes |
  	|           | interworking     |                    |         |
  	---------------------------------------------------------------
  	|     12    | Ethernet RX      |      0x22          | 1 byte  |
  	|           | Distributor Page |                    |         |
  	---------------------------------------------------------------
  	|     16    | ATM Globtal      |      0x28          | 1 byte  |
  	|           | Params Table     |                    |         |
  	---------------------------------------------------------------
  	|     20    | Insert Frame     |      0xF8          | 4 bytes |
  	---------------------------------------------------------------
  
  
  Extended Modes
  
  This is a double word bit array (64 bits) that defines special functionality
  which has an impact on the softwarew drivers.  Each bit has its own impact
  and has special instructions for the s/w associated with it.  This structure is
  described in this table:
  
  	-----------------------------------------------------------------------
  	| Bit #  |     Name     |   Description                               |
  	-----------------------------------------------------------------------
  	|   0    | General      | Indicates that prior to each host command   |
  	|        | push command | given by the application, the software must |
  	|        |              | assert a special host command (push command)|
  	|        |              | CECDR = 0x00800000.                         |
  	|        |              | CECR = 0x01c1000f.                          |
  	-----------------------------------------------------------------------
  	|   1    | UCC ATM      | Indicates that after issuing ATM RX INIT    |
  	|        | RX INIT      | command, the host must issue another special|
  	|        | push command | command (push command) and immediately      |
  	|        |              | following that re-issue the ATM RX INIT     |
  	|        |              | command. (This makes the sequence of        |
  	|        |              | initializing the ATM receiver a sequence of |
  	|        |              | three host commands)                        |
  	|        |              | CECDR = 0x00800000.                         |
  	|        |              | CECR = 0x01c1000f.                          |
  	-----------------------------------------------------------------------
  	|   2    | Add/remove   | Indicates that following the specific host  |
  	|        | command      | command: "Add/Remove entry in Hash Lookup   |
  	|        | validation   | Table" used in Interworking setup, the user |
  	|        |              | must issue another command.                 |
  	|        |              | CECDR = 0xce000003.                         |
  	|        |              | CECR = 0x01c10f58.                          |
  	-----------------------------------------------------------------------
  	|   3    | General push | Indicates that the s/w has to initialize    |
  	|        | command      | some pointers in the Ethernet thread pages  |
  	|        |              | which are used when Header Compression is   |
  	|        |              | activated.  The full details of these       |
  	|        |              | pointers is located in the software drivers.|
  	-----------------------------------------------------------------------
  	|   4    | General push | Indicates that after issuing Ethernet TX    |
  	|        | command      | INIT command, user must issue this command  |
  	|        |              | for each SNUM of Ethernet TX thread.        |
  	|        |              | CECDR = 0x00800003.                         |
  	|        |              | CECR = 0x7'b{0}, 8'b{Enet TX thread SNUM},  |
  	|        |              |        1'b{1}, 12'b{0}, 4'b{1}              |
  	-----------------------------------------------------------------------
  	| 5 - 31 |     N/A      | Reserved, set to zero.                      |
  	-----------------------------------------------------------------------
  
  V - Firmware Structure Layout
  ==============================
  
  QE microcode from Freescale is typically provided as a header file.  This
  header file contains macros that define the microcode binary itself as well as
  some other data used in uploading that microcode.  The format of these files
  do not lend themselves to simple inclusion into other code.  Hence,
  the need for a more portable format.  This section defines that format.
  
  Instead of distributing a header file, the microcode and related data are
  embedded into a binary blob.  This blob is passed to the qe_upload_firmware()
  function, which parses the blob and performs everything necessary to upload
  the microcode.
  
  All integers are big-endian.  See the comments for function
  qe_upload_firmware() for up-to-date implementation information.
  
  This structure supports versioning, where the version of the structure is
  embedded into the structure itself.  To ensure forward and backwards
  compatibility, all versions of the structure must use the same 'qe_header'
  structure at the beginning.
  
  'header' (type: struct qe_header):
  	The 'length' field is the size, in bytes, of the entire structure,
  	including all the microcode embedded in it, as well as the CRC (if
  	present).
  
  	The 'magic' field is an array of three bytes that contains the letters
  	'Q', 'E', and 'F'.  This is an identifier that indicates that this
  	structure is a QE Firmware structure.
  
  	The 'version' field is a single byte that indicates the version of this
  	structure.  If the layout of the structure should ever need to be
  	changed to add support for additional types of microcode, then the
  	version number should also be changed.
  
  The 'id' field is a null-terminated string(suitable for printing) that
  identifies the firmware.
  
  The 'count' field indicates the number of 'microcode' structures.  There
  must be one and only one 'microcode' structure for each RISC processor.
  Therefore, this field also represents the number of RISC processors for this
  SOC.
  
  The 'soc' structure contains the SOC numbers and revisions used to match
  the microcode to the SOC itself.  Normally, the microcode loader should
  check the data in this structure with the SOC number and revisions, and
  only upload the microcode if there's a match.  However, this check is not
  made on all platforms.
  
  Although it is not recommended, you can specify '0' in the soc.model
  field to skip matching SOCs altogether.
  
  The 'model' field is a 16-bit number that matches the actual SOC. The
  'major' and 'minor' fields are the major and minor revision numbers,
  respectively, of the SOC.
  
  For example, to match the 8323, revision 1.0:
       soc.model = 8323
       soc.major = 1
       soc.minor = 0
  
  'padding' is necessary for structure alignment.  This field ensures that the
  'extended_modes' field is aligned on a 64-bit boundary.
  
  'extended_modes' is a bitfield that defines special functionality which has an
  impact on the device drivers.  Each bit has its own impact and has special
  instructions for the driver associated with it.  This field is stored in
  the QE library and available to any driver that calles qe_get_firmware_info().
  
  'vtraps' is an array of 8 words that contain virtual trap values for each
  virtual traps.  As with 'extended_modes', this field is stored in the QE
  library and available to any driver that calles qe_get_firmware_info().
  
  'microcode' (type: struct qe_microcode):
  	For each RISC processor there is one 'microcode' structure.  The first
  	'microcode' structure is for the first RISC, and so on.
  
  	The 'id' field is a null-terminated string suitable for printing that
  	identifies this particular microcode.
  
  	'traps' is an array of 16 words that contain hardware trap values
  	for each of the 16 traps.  If trap[i] is 0, then this particular
  	trap is to be ignored (i.e. not written to TIBCR[i]).  The entire value
  	is written as-is to the TIBCR[i] register, so be sure to set the EN
  	and T_IBP bits if necessary.
  
  	'eccr' is the value to program into the ECCR register.
  
  	'iram_offset' is the offset into IRAM to start writing the
  	microcode.
  
  	'count' is the number of 32-bit words in the microcode.
  
  	'code_offset' is the offset, in bytes, from the beginning of this
  	structure where the microcode itself can be found.  The first
  	microcode binary should be located immediately after the 'microcode'
  	array.
  
  	'major', 'minor', and 'revision' are the major, minor, and revision
  	version numbers, respectively, of the microcode.  If all values are 0,
  	then these fields are ignored.
  
  	'reserved' is necessary for structure alignment.  Since 'microcode'
  	is an array, the 64-bit 'extended_modes' field needs to be aligned
  	on a 64-bit boundary, and this can only happen if the size of
  	'microcode' is a multiple of 8 bytes.  To ensure that, we add
  	'reserved'.
  
  After the last microcode is a 32-bit CRC.  It can be calculated using
  this algorithm:
  
  u32 crc32(const u8 *p, unsigned int len)
  {
  	unsigned int i;
  	u32 crc = 0;
  
  	while (len--) {
  	   crc ^= *p++;
  	   for (i = 0; i < 8; i++)
  		   crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
  	}
  	return crc;
  }
  
  VI - Sample Code for Creating Firmware Files
  ============================================
  
  A Python program that creates firmware binaries from the header files normally
  distributed by Freescale can be found on http://opensource.freescale.com.