Freescale QUICC 引擎韌體上傳¶
2007 Timur Tabi <timur at freescale.com>, Freescale Semiconductor
修訂資訊¶
2007 年 11 月 30 日:Rev 1.0 - 初始版本
I - 韌體軟體許可¶
每個韌體檔案都有自己的軟體許可。有關特定許可的資訊,請參閱與韌體一起分發的許可文字。
II - 微碼可用性¶
韌體檔案透過各種渠道分發。有些可在 http://opensource.freescale.com 上獲得。對於其他韌體檔案,請聯絡您的 Freescale 代表或您的作業系統供應商。
III - 描述和術語¶
在本文件中,術語“微碼”指的是構成實際 QE 微碼的 32 位整數序列。
術語“韌體”指的是包含微碼以及其他資料的二進位制 blob,這些資料
描述微碼的用途
描述如何以及在何處上傳微碼
指定各種暫存器的值
包括供特定裝置驅動程式使用的其他資料
韌體檔案是僅包含韌體的二進位制檔案。
IV - 微碼程式設計細節¶
QE 架構允許每個 RISC 處理器在 I-RAM 中僅存在一個微碼。要替換任何當前微碼,必須首先執行完整的 QE 重置(這將停用微碼)。
QE 微碼使用以下過程上傳
使用 IRAM.IADD 和 IRAM.IDATA 暫存器將微碼放置到 I-RAM 中的特定位置。
CERCR.CIR 位設定為 0 或 1,具體取決於韌體是否需要拆分 I-RAM。拆分 I-RAM 僅對具有帶有多個 RISC 處理器的 QE 的 SOC 有意義,例如 8360。拆分 I-RAM 允許每個處理器執行不同的微碼,從而有效地建立非對稱多處理 (AMP) 系統。
TIBCR 陷阱暫存器載入微碼中陷阱處理程式的地址。
RSP.ECCR 暫存器使用提供的值進行程式設計。
如有必要,需要虛擬陷阱和擴充套件模式資料的裝置驅動程式將使用它們。
虛擬微碼陷阱
這些虛擬陷阱是微碼中的條件分支。這些是在 ROMcode 中引入的“軟”配置,以便實現更高的靈活性並節省硬體陷阱。如果新功能被啟用或在 RAM 包中修復了問題,則應啟用它們。此資料結構向微碼發出訊號,指示哪些虛擬陷阱處於活動狀態。
此結構包含 6 個字,應用程式應將其複製到一些特定的已定義位置。下表描述了該結構
---------------------------------------------------------------
| 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 |
---------------------------------------------------------------
擴充套件模式
這是一個雙字位陣列(64 位),定義了對軟體驅動程式有影響的特殊功能。每個位都有其自己的影響,並且具有與其關聯的軟體的特殊說明。下表描述了此結構
-----------------------------------------------------------------------
| 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 - 韌體結構佈局¶
Freescale 的 QE 微碼通常以標頭檔案的形式提供。此標頭檔案包含將微碼二進位制檔案本身以及用於上傳該微碼的一些其他資料定義為宏。這些檔案的格式不利於簡單地包含到其他程式碼中。因此,需要更可移植的格式。本節定義了該格式。
與其分發標頭檔案,不如將微碼和相關資料嵌入到二進位制 blob 中。此 blob 傳遞給 qe_upload_firmware() 函式,該函式解析 blob 並執行上傳微碼所需的一切。
所有整數都是大端序。有關最新的實現資訊,請參閱函式 qe_upload_firmware() 的註釋。
此結構支援版本控制,其中結構的版本嵌入到結構本身中。為確保向前和向後相容性,所有版本的結構都必須在開頭使用相同的“qe_header”結構。
- “header”(型別:struct qe_header)
“length”欄位是整個結構的大小(以位元組為單位),包括嵌入其中的所有微碼以及 CRC(如果存在)。
“magic”欄位是一個包含字母“Q”、“E”和“F”的三個位元組的陣列。這是一個識別符號,指示此結構是一個 QE 韌體結構。
“version”欄位是一個單位元組,指示此結構的版本。如果結構的佈局需要更改以新增對其他型別微碼的支援,則還應更改版本號。
“id”欄位是一個以 null 結尾的字串(適合列印),用於標識韌體。
“count”欄位指示“microcode”結構的數量。每個 RISC 處理器必須只有一個且只有一個“microcode”結構。因此,此欄位也代表此 SOC 的 RISC 處理器的數量。
“soc”結構包含用於將微碼與 SOC 本身匹配的 SOC 編號和修訂號。通常,微碼載入程式應使用 SOC 編號和修訂號檢查此結構中的資料,並且僅在匹配時才上傳微碼。但是,並非所有平臺都進行此檢查。
雖然不推薦,但您可以在 soc.model 欄位中指定“0”以完全跳過匹配 SOC。
“model”欄位是一個 16 位數字,與實際 SOC 匹配。“major”和“minor”欄位分別是 SOC 的主要和次要修訂號。
例如,要匹配 8323,修訂版 1.0
soc.model = 8323
soc.major = 1
soc.minor = 0
“padding”對於結構對齊是必要的。此欄位確保“extended_modes”欄位在 64 位邊界上對齊。
“extended_modes”是一個位欄位,用於定義對裝置驅動程式有影響的特殊功能。每個位都有其自己的影響,並且驅動程式具有與其關聯的特殊說明。此欄位儲存在 QE 庫中,並且可供呼叫 qe_get_firmware_info() 的任何驅動程式使用。
“vtraps”是一個包含每個虛擬陷阱的虛擬陷阱值的 8 個字的陣列。與“extended_modes”一樣,此欄位儲存在 QE 庫中,並且可供呼叫 qe_get_firmware_info() 的任何驅動程式使用。
- “microcode”(型別:struct qe_microcode)
對於每個 RISC 處理器,都有一個“microcode”結構。第一個“microcode”結構用於第一個 RISC,依此類推。
“id”欄位是一個適合列印的以 null 結尾的字串,用於標識此特定微碼。
“traps”是一個包含 16 個字的陣列,其中包含 16 個陷阱中的每一個的硬體陷阱值。如果 trap[i] 為 0,則忽略此特定陷阱(即,不寫入 TIBCR[i])。整個值按原樣寫入 TIBCR[i] 暫存器,因此請務必根據需要設定 EN 和 T_IBP 位。
“eccr”是要程式設計到 ECCR 暫存器中的值。
“iram_offset”是將微碼寫入 IRAM 的偏移量。
“count”是微碼中 32 位字的數量。
“code_offset”是從此結構的開頭開始可以找到微碼本身的偏移量(以位元組為單位)。第一個微碼二進位制檔案應位於“microcode”陣列之後。
“major”、“minor”和“revision”分別是微碼的主要、次要和修訂版本號。如果所有值為 0,則忽略這些欄位。
“reserved”對於結構對齊是必要的。由於“microcode”是一個數組,因此 64 位的“extended_modes”欄位需要在 64 位邊界上對齊,並且只有在“microcode”的大小是 8 位元組的倍數時才會發生這種情況。為了確保這一點,我們添加了“reserved”。
最後一個微碼之後是 32 位 CRC。可以使用以下演算法計算它
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 - 用於建立韌體檔案的示例程式碼¶
可以在 http://opensource.freescale.com 上找到一個 Python 程式,該程式可以從 Freescale 通常分發的標頭檔案建立韌體二進位制檔案。