diff options
author | Timur Tabi <timur@freescale.com> | 2008-01-08 11:30:58 -0500 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2008-01-23 20:34:06 -0500 |
commit | bc556ba940085e46e0ab1b5ed7c31428dc86dd03 (patch) | |
tree | 68d8aada0531c5d5070c3e7327de606894584971 /include | |
parent | a21e282a124f4679c040087ab73aa5b147d4275f (diff) |
[POWERPC] QE: Add ability to upload QE firmware
Define the layout of a binary blob that contains a QE firmware and instructions
on how to upload it. Add function qe_upload_firmware() to parse the blob
and perform the actual upload. Fully define 'struct rsp' in immap_qe.h to
include the actual RISC Special Registers. Added description of a new
QE firmware node to booting-without-of.txt.
Signed-off-by: Timur Tabi <timur@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-powerpc/immap_qe.h | 34 | ||||
-rw-r--r-- | include/asm-powerpc/qe.h | 61 |
2 files changed, 93 insertions, 2 deletions
diff --git a/include/asm-powerpc/immap_qe.h b/include/asm-powerpc/immap_qe.h index aba9806b31c9..82a452615097 100644 --- a/include/asm-powerpc/immap_qe.h +++ b/include/asm-powerpc/immap_qe.h | |||
@@ -393,9 +393,39 @@ struct dbg { | |||
393 | u8 res2[0x48]; | 393 | u8 res2[0x48]; |
394 | } __attribute__ ((packed)); | 394 | } __attribute__ ((packed)); |
395 | 395 | ||
396 | /* RISC Special Registers (Trap and Breakpoint) */ | 396 | /* |
397 | * RISC Special Registers (Trap and Breakpoint). These are described in | ||
398 | * the QE Developer's Handbook. | ||
399 | */ | ||
397 | struct rsp { | 400 | struct rsp { |
398 | u32 reg[0x40]; /* 64 32-bit registers */ | 401 | __be32 tibcr[16]; /* Trap/instruction breakpoint control regs */ |
402 | u8 res0[64]; | ||
403 | __be32 ibcr0; | ||
404 | __be32 ibs0; | ||
405 | __be32 ibcnr0; | ||
406 | u8 res1[4]; | ||
407 | __be32 ibcr1; | ||
408 | __be32 ibs1; | ||
409 | __be32 ibcnr1; | ||
410 | __be32 npcr; | ||
411 | __be32 dbcr; | ||
412 | __be32 dbar; | ||
413 | __be32 dbamr; | ||
414 | __be32 dbsr; | ||
415 | __be32 dbcnr; | ||
416 | u8 res2[12]; | ||
417 | __be32 dbdr_h; | ||
418 | __be32 dbdr_l; | ||
419 | __be32 dbdmr_h; | ||
420 | __be32 dbdmr_l; | ||
421 | __be32 bsr; | ||
422 | __be32 bor; | ||
423 | __be32 bior; | ||
424 | u8 res3[4]; | ||
425 | __be32 iatr[4]; | ||
426 | __be32 eccr; /* Exception control configuration register */ | ||
427 | __be32 eicr; | ||
428 | u8 res4[0x100-0xf8]; | ||
399 | } __attribute__ ((packed)); | 429 | } __attribute__ ((packed)); |
400 | 430 | ||
401 | struct qe_immap { | 431 | struct qe_immap { |
diff --git a/include/asm-powerpc/qe.h b/include/asm-powerpc/qe.h index a24b7b14958f..430dc77b35fc 100644 --- a/include/asm-powerpc/qe.h +++ b/include/asm-powerpc/qe.h | |||
@@ -94,6 +94,58 @@ unsigned long qe_muram_alloc_fixed(unsigned long offset, int size); | |||
94 | void qe_muram_dump(void); | 94 | void qe_muram_dump(void); |
95 | void *qe_muram_addr(unsigned long offset); | 95 | void *qe_muram_addr(unsigned long offset); |
96 | 96 | ||
97 | /* Structure that defines QE firmware binary files. | ||
98 | * | ||
99 | * See Documentation/powerpc/qe-firmware.txt for a description of these | ||
100 | * fields. | ||
101 | */ | ||
102 | struct qe_firmware { | ||
103 | struct qe_header { | ||
104 | __be32 length; /* Length of the entire structure, in bytes */ | ||
105 | u8 magic[3]; /* Set to { 'Q', 'E', 'F' } */ | ||
106 | u8 version; /* Version of this layout. First ver is '1' */ | ||
107 | } header; | ||
108 | u8 id[62]; /* Null-terminated identifier string */ | ||
109 | u8 split; /* 0 = shared I-RAM, 1 = split I-RAM */ | ||
110 | u8 count; /* Number of microcode[] structures */ | ||
111 | struct { | ||
112 | __be16 model; /* The SOC model */ | ||
113 | u8 major; /* The SOC revision major */ | ||
114 | u8 minor; /* The SOC revision minor */ | ||
115 | } __attribute__ ((packed)) soc; | ||
116 | u8 padding[4]; /* Reserved, for alignment */ | ||
117 | __be64 extended_modes; /* Extended modes */ | ||
118 | __be32 vtraps[8]; /* Virtual trap addresses */ | ||
119 | u8 reserved[4]; /* Reserved, for future expansion */ | ||
120 | struct qe_microcode { | ||
121 | u8 id[32]; /* Null-terminated identifier */ | ||
122 | __be32 traps[16]; /* Trap addresses, 0 == ignore */ | ||
123 | __be32 eccr; /* The value for the ECCR register */ | ||
124 | __be32 iram_offset; /* Offset into I-RAM for the code */ | ||
125 | __be32 count; /* Number of 32-bit words of the code */ | ||
126 | __be32 code_offset; /* Offset of the actual microcode */ | ||
127 | u8 major; /* The microcode version major */ | ||
128 | u8 minor; /* The microcode version minor */ | ||
129 | u8 revision; /* The microcode version revision */ | ||
130 | u8 padding; /* Reserved, for alignment */ | ||
131 | u8 reserved[4]; /* Reserved, for future expansion */ | ||
132 | } __attribute__ ((packed)) microcode[1]; | ||
133 | /* All microcode binaries should be located here */ | ||
134 | /* CRC32 should be located here, after the microcode binaries */ | ||
135 | } __attribute__ ((packed)); | ||
136 | |||
137 | struct qe_firmware_info { | ||
138 | char id[64]; /* Firmware name */ | ||
139 | u32 vtraps[8]; /* Virtual trap addresses */ | ||
140 | u64 extended_modes; /* Extended modes */ | ||
141 | }; | ||
142 | |||
143 | /* Upload a firmware to the QE */ | ||
144 | int qe_upload_firmware(const struct qe_firmware *firmware); | ||
145 | |||
146 | /* Obtain information on the uploaded firmware */ | ||
147 | struct qe_firmware_info *qe_get_firmware_info(void); | ||
148 | |||
97 | /* Buffer descriptors */ | 149 | /* Buffer descriptors */ |
98 | struct qe_bd { | 150 | struct qe_bd { |
99 | __be16 status; | 151 | __be16 status; |
@@ -329,6 +381,15 @@ enum comm_dir { | |||
329 | 381 | ||
330 | #define QE_SDEBCR_BA_MASK 0x01FFFFFF | 382 | #define QE_SDEBCR_BA_MASK 0x01FFFFFF |
331 | 383 | ||
384 | /* Communication Processor */ | ||
385 | #define QE_CP_CERCR_MEE 0x8000 /* Multi-user RAM ECC enable */ | ||
386 | #define QE_CP_CERCR_IEE 0x4000 /* Instruction RAM ECC enable */ | ||
387 | #define QE_CP_CERCR_CIR 0x0800 /* Common instruction RAM */ | ||
388 | |||
389 | /* I-RAM */ | ||
390 | #define QE_IRAM_IADD_AIE 0x80000000 /* Auto Increment Enable */ | ||
391 | #define QE_IRAM_IADD_BADDR 0x00080000 /* Base Address */ | ||
392 | |||
332 | /* UPC */ | 393 | /* UPC */ |
333 | #define UPGCR_PROTOCOL 0x80000000 /* protocol ul2 or pl2 */ | 394 | #define UPGCR_PROTOCOL 0x80000000 /* protocol ul2 or pl2 */ |
334 | #define UPGCR_TMS 0x40000000 /* Transmit master/slave mode */ | 395 | #define UPGCR_TMS 0x40000000 /* Transmit master/slave mode */ |