From 24c704c667ca06ccf9182bbf68bf507976e6c3dc Mon Sep 17 00:00:00 2001 From: ETWen Date: Mon, 17 Aug 2026 08:52:11 +0800 Subject: [PATCH] docs(arch): Add ARCHITECTURE.md and CLAUDE.md, init repo Bring the Blanton Tera Term TTL test suite under version control and document how the pieces fit together. - ARCHITECTURE.md: A/B/C script roles, host-to-DUT-to-FPGA data path, config/settings/profile data models, PCIe AER + EDAC topology table, 10 key constraints, and 6 development phases derived from the Status_20260814 spreadsheet's On-Going items - CLAUDE.md: stack, smoke-test commands, conventions, and the hardware footguns (per-unit BDF, VSPI vs VI2C timing, repeated START, STORE_USER_ALL, ARB_LOST false positives) - secret/: gitignored credential store with README + .example template, so the DUT login stops living in 1_Blanton_Script_A.ttl - .gitignore: secret/*, For_AI/, *.log, publish/, *.DSN Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_014RetWKFZFG1ZHcitQAyhwM --- .gitignore | 24 + ARCHITECTURE.md | 548 +++ CLAUDE.md | 110 + docs/Blantons_FPGA_Registers.md | 3564 +++++++++++++++++ docs/Blantons_FPGA_Registers_Map_draft.xlsx | Bin 0 -> 94649 bytes docs/Blantons_FPGA_Registers_draft.docx | Bin 0 -> 376299 bytes .../Blantons_PCIe_AER_and_DDR_EDAC_checks.pdf | Bin 0 -> 90597 bytes docs/TTL_Script_Blanton_Status_20260814.xlsx | Bin 0 -> 14689 bytes publish/.gitkeep | 0 secret/README.md | 35 + secret/config_secret.ttl.example | 24 + src/Script_ABC_Blanton/1_Blanton_Script_A.ttl | 95 + src/Script_ABC_Blanton/2_Blanton_Script_B.ttl | 74 + src/Script_ABC_Blanton/3_Blanton_Script_C.ttl | 46 + .../LTC2980_Margin_Script/README.md | 184 + .../LTC2980_Margin_Script/blanton_cb_i2c.sh | 444 ++ .../blanton_fpga_pcimem.sh | 270 ++ .../LTC2980_Margin_Script/logs/.gitkeep | 0 .../LTC2980_Margin_Script/margin.sh | 493 +++ .../profiles/all_off.conf | 22 + .../profiles/comboA.conf | 22 + .../profiles/comboB.conf | 22 + .../profiles/combo_high3.conf | 22 + .../profiles/combo_high5.conf | 22 + .../profiles/combo_low3.conf | 22 + .../profiles/combo_low5.conf | 22 + .../profiles/combo_normal.conf | 23 + .../script/margin_apply_profile_all.sh | 50 + .../script/margin_save_all.sh | 32 + .../script/margin_status_all.sh | 29 + .../settings/Blanton_CB_CONN13.conf | 52 + .../settings/Blanton_SWB0_CONN13.conf | 52 + .../settings/Blanton_SWB0_CONN14.conf | 52 + .../settings/Blanton_SWB0_CONN15.conf | 52 + .../settings/Blanton_SWB0_CONN16.conf | 52 + .../settings/Blanton_SWB1_CONN13.conf | 52 + .../settings/Blanton_SWB1_CONN14.conf | 52 + .../settings/Blanton_SWB1_CONN15.conf | 52 + .../settings/Blanton_SWB1_CONN16.conf | 52 + .../Blanton_Script/blanton_cb_i2c.sh | 444 ++ .../Blanton_Script/blanton_fpga_pcimem.sh | 277 ++ .../Blanton_Script/blanton_icb_vi2c.sh | 167 + .../Blanton_Script/blanton_pwr_data.sh | 653 +++ .../Blanton_Script/blanton_temp_sensor.sh | 225 ++ src/Script_ABC_Blanton/config.ttl | 15 + src/Script_ABC_Blanton/logs/.gitkeep | 0 .../utils/kill_all_process.ttl | 2 + src/Script_ABC_Blanton/utils/pcie_bus.ttl | 4 + src/Script_ABC_Blanton/utils/setup_pmon.ttl | 14 + src/Script_ABC_Blanton/utils/show_dmesg.ttl | 8 + .../utils/show_margin_status.ttl | 46 + .../utils/show_pcie_error_reg.ttl | 10 + .../utils/show_pcie_error_reg_BMC.ttl | 15 + .../utils/show_pcie_error_reg_DDR.ttl | 23 + .../utils/show_pcie_error_reg_FPGA.ttl | 7 + .../utils/show_pcie_error_reg_I210.ttl | 15 + .../utils/show_pcie_error_reg_SSD.ttl | 15 + .../utils/show_pcie_error_reg_TH6_SWB0.ttl | 15 + .../utils/show_pcie_error_reg_TH6_SWB1.ttl | 15 + tools/.gitkeep | 0 60 files changed, 8637 insertions(+) create mode 100644 .gitignore create mode 100644 ARCHITECTURE.md create mode 100644 CLAUDE.md create mode 100644 docs/Blantons_FPGA_Registers.md create mode 100644 docs/Blantons_FPGA_Registers_Map_draft.xlsx create mode 100644 docs/Blantons_FPGA_Registers_draft.docx create mode 100644 docs/Blantons_PCIe_AER_and_DDR_EDAC_checks.pdf create mode 100644 docs/TTL_Script_Blanton_Status_20260814.xlsx create mode 100644 publish/.gitkeep create mode 100644 secret/README.md create mode 100644 secret/config_secret.ttl.example create mode 100644 src/Script_ABC_Blanton/1_Blanton_Script_A.ttl create mode 100644 src/Script_ABC_Blanton/2_Blanton_Script_B.ttl create mode 100644 src/Script_ABC_Blanton/3_Blanton_Script_C.ttl create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/README.md create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_cb_i2c.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_fpga_pcimem.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/logs/.gitkeep create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/margin.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/all_off.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboA.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboB.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high3.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high5.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low3.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low5.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_normal.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_apply_profile_all.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_save_all.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_status_all.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_CB_CONN13.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN13.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN14.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN15.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN16.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN13.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN14.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN15.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN16.conf create mode 100644 src/Script_ABC_Blanton/Blanton_Script/blanton_cb_i2c.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/blanton_fpga_pcimem.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/blanton_icb_vi2c.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/blanton_pwr_data.sh create mode 100644 src/Script_ABC_Blanton/Blanton_Script/blanton_temp_sensor.sh create mode 100644 src/Script_ABC_Blanton/config.ttl create mode 100644 src/Script_ABC_Blanton/logs/.gitkeep create mode 100644 src/Script_ABC_Blanton/utils/kill_all_process.ttl create mode 100644 src/Script_ABC_Blanton/utils/pcie_bus.ttl create mode 100644 src/Script_ABC_Blanton/utils/setup_pmon.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_dmesg.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_margin_status.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg_BMC.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg_DDR.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg_FPGA.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg_I210.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg_SSD.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg_TH6_SWB0.ttl create mode 100644 src/Script_ABC_Blanton/utils/show_pcie_error_reg_TH6_SWB1.ttl create mode 100644 tools/.gitkeep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8af875b --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# secret/ 全部忽略,但保留 README 與範本 +secret/* +!secret/README.md +!secret/*.example +!secret/.gitkeep + +# AI 協作素材不入 git +For_AI/ + +# 測試 log(含 DUT 序號 / MAC / 韌體版本,保留目錄結構即可) +*.log +!**/logs/.gitkeep +!**/Logs/.gitkeep + +# 打包輸出 +publish/* +!publish/.gitkeep + +# Office 暫存檔 +~$* + +# 客戶板 schematic 原始檔(機密,勿入 repo) +*.DSN +*.dsn diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..28864a6 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,548 @@ +# ARCHITECTURE — Blanton TTL Script + +## Overview + +**Blanton_TTL_Script** 是 Blanton(Project Helios)交換器平台的**系統層可靠性測試自動化腳本組**。 +測試工程師在 Windows 端用 **Tera Term (TTL macro)** 透過 COM port 連上 DUT 的 SONiC console, +由 A / B / C 三支腳本依序驅動一整輪 stress + margin + error-counter 測試,全程自動存 log。 + +三支腳本的分工就是一輪測試的三個階段: + +| Script | 階段 | 做什麼 | +|--------|------|--------| +| `1_Blanton_Script_A.ttl` | **Pre-test / Baseline** | 登入、對時、載入 shell 工具、清 PCIe AER、抓 PCIe tree / margin / PMON / dmesg 基線 | +| `2_Blanton_Script_B.ttl` | **Stress / Soak** | 開 CPU / DDR / SSD / USB / PCIe / I2C 壓力程序,之後進無限迴圈每輪抓 fan / temp / margin | +| `3_Blanton_Script_C.ttl` | **Post-test / Verdict** | 殺掉壓力程序、再抓一次 PMON / dmesg / PCIe AER,比對 stress log 判定 | + +DUT 端的實際取數能力則來自一組 **bash 工具庫**(`Blanton_Script/`),這一層才是真正碰硬體的地方: +CB FPGA 的 PCIe BAR(`pcimem`)→ FPGA 內建 I2C / VI2C master → 板上 VRM、溫度感測器、 +LTC2980 margin 控制器。TTL 只負責「按順序 `sendln` 並把畫面收進 log」,硬體語意全在 bash 這層。 + +**使用者**:硬體 / 系統驗證工程師(ETWen、KC、Alan)。 +**核心價值**:把一輪要跑數小時、跨 PCIe / DDR / I2C / 電源多個子系統的 reliability run, +壓縮成「開 Tera Term → 跑 A → 跑 B 泡著 → 跑 C 收工」三個動作,且每一筆數據都有 log 可回溯。 + +--- + +## Tech Stack + +| Layer | Technology | +|-------|-----------| +| 測試控制端(Host) | Tera Term 5.x **TTL macro**(`.ttl`),Windows | +| Host ↔ DUT 通道 | RS-232 / USB-Serial COM port(SONiC console) | +| DUT OS | SONiC(Debian-based network OS),bash + busybox/mawk | +| DUT 端工具語言 | Bash Shell Script | +| 暫存器存取後端 | `pcimem`(mmap PCI sysfs `resource0` + BAR 相對 offset) | +| I2C / PMBus 路徑 | CB FPGA F3 OpenCores I2C master、CB FPGA F3 VI2C proxy、CPU 原生 bus(`i2cset`/`i2cget`) | +| 電源 margin | LTC2980(= 2 × LTC2977)over PMBus,LINEAR16 編碼 | +| 錯誤計數來源 | Linux PCIe AER sysfs(`aer_dev_*`)、EDAC sysfs(`dimm_ce/ue_count`) | +| 平台監控 | SONiC `show platform *`(pmon container) | +| 壓力測試 | `mlucas-avx2`(AMD CPU)、`~/hammer/tools/stress_*.py`(DDR / SSD / USB / PCIe / I2C) | +| 版本控制 | Git(NAS + Gitea 私有 remote;**不推 GitHub,含客戶 NDA 資料**) | + +> ⚠️ **無編譯步驟。** TTL 與 bash 都是直譯執行,「build」等同「把 `src/Script_ABC_Blanton/` 複製到 +> Tera Term 工作目錄,並把 `Blanton_Script/` scp 到 DUT 的 `~/`」。 + +--- + +## Architecture Diagram + +``` +┌──────────────────────────────────────────────────────────────┐ +│ Windows Host — Tera Term 5.x │ +│ │ +│ 1_Blanton_Script_A.ttl ──┐ │ +│ 2_Blanton_Script_B.ttl ──┼─→ include "config.ttl" │ +│ 3_Blanton_Script_C.ttl ──┘ (prompt / EN_* 旗標) │ +│ │ │ +│ └─→ include "utils/*.ttl" (可重用取數片段) │ +│ │ +│ logopen → Logs/Blanton_Margin_.log (整段 console 存檔) │ +└───────────────────────┬──────────────────────────────────────┘ + │ COM port:sendln "" / wait "" + ▼ +┌──────────────────────────────────────────────────────────────┐ +│ DUT — SONiC console (root@sonic:~#) │ +│ │ +│ ~/Blanton_Script/ (source 進 shell 後成為一組函數) │ +│ ├ blanton_fpga_pcimem.sh cb_fpga / pmc_fpga / swb0_fpga │ +│ ├ blanton_cb_i2c.sh cb_i2c_* / cb_pmbus_* │ +│ ├ blanton_icb_vi2c.sh vi2c_* (ICB/PDB proxy) │ +│ ├ blanton_temp_sensor.sh temp_cb / temp_icb / temp_all │ +│ ├ blanton_pwr_data.sh pwr_data / pwr_data_pdb │ +│ └ LTC2980_Margin_Script/ margin_init / margin_status ... │ +│ │ +│ ~/hammer/tools/ 壓力程序(mlucas-avx2, stress_*.py) │ +│ SONiC CLI show platform fan/temperature/... │ +│ Linux sysfs aer_dev_* / edac mc0/rank* │ +└───────────────────────┬──────────────────────────────────────┘ + │ pcimem /sys/bus/pci/devices/0000:03:00./resource0 + ▼ +┌──────────────────────────────────────────────────────────────┐ +│ CB FPGA (PCIe EP,4 個 Function) │ +│ F0 local regs:RST_CAUSE_REG 0xD90 / SWB 0xD94,0xD98 │ +│ F3 I2C master Ch0..Ch17 (base 0x300, stride 0x20) │ +│ F3 VI2C→ICB Ch0..Ch4 (base 0x780, stride 0x20) │ +│ F2 VSPI 橋接 PMC/ICB/SWB(慢,~18ms/reg,本專案不走) │ +└───────────────────────┬──────────────────────────────────────┘ + │ I2C / PMBus + ▼ + TCA9546/9543 mux · MP29816/MP2985B VRM · TMP75/TMP432 溫感 + MAX31790 風扇 · LTC2980 margin (CONN13~16 × CB/SWB0/SWB1) + PDB:Hotswap / Power brick / EFUSE(走 VI2C ch3/ch4) +``` + +--- + +## Project Structure + +``` +Blanton_TTL_Script/ +│ +├── CLAUDE.md # 專案記憶 & 給 Claude 的指令 +├── ARCHITECTURE.md # 本架構文件 +├── .gitignore # secret/ + For_AI/ + logs 規則 +│ +├── docs/ # 規格與狀態文件(客戶提供 / 專案產出) +│ ├── Blantons_FPGA_Registers.md # FPGA 暫存器規格(markdown 正本,查 offset 用) +│ ├── Blantons_FPGA_Registers_draft.docx # 同上,客戶原始 docx +│ ├── Blantons_FPGA_Registers_Map_draft.xlsx +│ ├── Blantons_PCIe_AER_and_DDR_EDAC_checks.pdf # AER / EDAC 檢查點依據 +│ └── TTL_Script_Blanton_Status_20260814.xlsx # ⭐ 三支腳本逐項 Status(OK / On-Going + Owner) +│ +├── tools/ # Host 端輔助腳本(log 解析、報表產生) +│ +├── secret/ # 🚫 gitignored — DUT 密碼、per-unit BDF、COM 設定 +│ ├── README.md # ✅ committed — 用途索引 +│ ├── config_secret.ttl.example # ✅ committed — 帳密範本(__CHANGE_ME__) +│ └── config_secret.ttl # 🚫 實際帳密,由 config.ttl include +│ +├── For_AI/ # 🚫 gitignored — AI 協作素材(波形截圖、草稿) +│ +├── publish/ # 可交付的打包輸出(Blanton_Script_ABC_v_/ + zip) +│ +└── src/ + └── Script_ABC_Blanton/ # ← Tera Term 的工作目錄(整包給測試員) + │ + ├── config.ttl # 全域設定:testcase 名、EN_Margin / EN_log、三個 prompt 字串 + ├── 1_Blanton_Script_A.ttl # Pre-test:登入 → 對時 → source 工具 → 清 AER → 抓基線 + ├── 2_Blanton_Script_B.ttl # Stress:開壓力程序 → while 1 每輪抓 fan/temp/margin + ├── 3_Blanton_Script_C.ttl # Post-test:kill → 再抓一次 → 比對 stress log + │ + ├── utils/ # 可 include 的取數片段(TTL,無狀態、只 wait+sendln) + │ ├── pcie_bus.ttl # lspci -tvvv / -vv + │ ├── setup_pmon.ttl # show platform summary/fan/temperature/psu/voltage/current/ssd + │ ├── show_dmesg.ttl # date + dmesg grep error/fail/warning + │ ├── show_margin_status.ttl # source margin_status_all.sh(掃 9 顆 LTC2980) + │ ├── kill_all_process.ttl # kill $(jobs -p) + │ ├── show_pcie_error_reg.ttl # 舊的合併版(已被下列 per-device 版取代) + │ ├── show_pcie_error_reg_TH6_SWB0.ttl # EP 01:00.0 + RP 00:01.1 + │ ├── show_pcie_error_reg_TH6_SWB1.ttl # EP 02:00.0 + RP 00:01.2 + │ ├── show_pcie_error_reg_FPGA.ttl # RP 00:01.5(共用上游) + │ ├── show_pcie_error_reg_BMC.ttl # EP 03:00.0 + RP 00:01.4 + │ ├── show_pcie_error_reg_I210.ttl # EP 07:00.0 + RP 00:02.4 + │ ├── show_pcie_error_reg_SSD.ttl # EP 06:00.0 + RP 00:02.1 + │ └── show_pcie_error_reg_DDR.ttl # EDAC mc0 rank0~3 CE/UE + │ + ├── logs/ # Tera Term logopen 輸出(*.log gitignored) + │ + └── Blanton_Script/ # ← scp 到 DUT ~/ 的單位(bash 工具庫) + ├── blanton_fpga_pcimem.sh # pcimem 後端:cb_fpga/pmc_fpga/icb_fpga/swb0_fpga/swb1_fpga + ├── blanton_cb_i2c.sh # CB FPGA F3 I2C master(Ch0~Ch17)+ PMBus helper + ├── blanton_icb_vi2c.sh # CB F3 VI2C proxy → ICB/PDB(Ch0~Ch4) + ├── blanton_temp_sensor.sh # TMP75 / TMP432 讀溫(CB Ch10 mux + ICB VI2C Ch2) + ├── blanton_pwr_data.sh # SWB VRM + PDB brick 的 Vin/Vout/Iout/Temp 表 + └── LTC2980_Margin_Script/ # 電壓 margin 子專案(另有獨立 repo) + ├── margin.sh # margin_init/status/set/apply_profile/save + ├── settings/*.conf # 一個 .conf = 一顆 LTC2980(CB + SWB0/1 × CONN13~16) + ├── profiles/*.conf # 16-ch 批次組合(comboA/B、high3/5、low3/5、normal、off) + ├── script/*_all.sh # 跨 9 顆 LTC2980 的批次 status / apply / save + └── logs/ # margin 操作 log +``` + +--- + +## Data Models + +本專案沒有資料庫,「資料模型」是**設定檔格式**與**暫存器 / sysfs 語意**。 + +### 1. `config.ttl` — 全域測試參數(TTL 變數) + +```ini +strTestcase = "Margin" ; 測項名,進 log 檔名 +project_name = "Blanton" ; 專案名,進 log 檔名 +EN_Margin = 1 ; 1=跑 margin 掃描, 0=跳過 +EN_log = 1 ; 1=logopen 存檔, 0=不存 +prompt_login = "sonic login:" +prompt_sonic = "admin@sonic:~$" +prompt_sonic_root = "root@sonic:~#" +``` + +Log 檔名規則:`\Logs\__.log` + +### 2. `settings/.conf` — 一顆 LTC2980(16 channel) + +| 欄位 | 型別 | 說明 | +|------|------|------| +| `TRANSPORT` | string | `""`/`"i2c"` = CPU 原生 bus(`i2cset`);`"swb"` = 走 CB FPGA F3 I2C | +| `CB_I2C_CH` | int | `TRANSPORT="swb"` 時的 FPGA I2C 通道(6/7/8/9) | +| `CHIPS[]` | string[2] | `"bus:addr"`,index 0 → CH0~7、index 1 → CH8~15 | +| `CHIP_PRE_CMD[]` / `CHIP_POST_CMD[]` | string[1] | mux 切換等前後置指令,`;` 分隔多筆 | +| `CH_VNOM` | string | 標稱電壓(`"-"` = 未使用 / NC) | +| `CH_NET` | string | 電路 net name(對照 schematic) | + +Channel 定址:`ch / 8` → `CHIPS[]` index,`ch % 8` → LTC2977 PMBus PAGE(0x00~0x07)。 + +### 3. `profiles/*.conf` — 16-ch 批次 margin 組合 + +```bash +PROFILE_CHANNELS=( "0:high:8" "1:low:8" ... ) # "channel:operation:change_percent" +``` + +| operation | PMBus `OPERATION`(0x01) | 說明 | +|-----------|------------------------|------| +| `high` | `0xA8` | Margin high | +| `low` | `0x98` | Margin low | +| `nominal` | `0x80` | 回標稱值(跟隨 VOUT_COMMAND) | +| `off` | `0x00` | 關閉輸出 | + +### 4. FPGA / I2C 暫存器語意(工具庫依賴) + +| 區塊 | 位置 | 關鍵欄位 | +|------|------|----------| +| CB F0 local | `cb_fpga 0 0xD90` | `RST_CAUSE_REG`;`0xD94`/`0xD98` = SWB0/SWB1 | +| CB F3 I2C(每 ch 0x20 stride,base 0x300) | `+00/04` PRSCL, `+08` CTRL(b7 MOD_EN), `+0C` TX/RX, `+10` CMD/STAT, `+14` MUX_SEL, `+18` RST, `+1C` SEM | +| CB F3 VI2C(base 0x780,ICB/PDB) | 同上,但 **`+1C` 無 SEM** | +| I2C CMD | `STA=0x80 STO=0x40 RD=0x20 WR=0x10 NACK=0x08 IACK=0x01` | +| I2C STAT | `RX_ACK=0x80(1=NACK) BUSY=0x40 ARB_LOST=0x20 TIP=0x02 INT=0x01` | +| Prescale @75MHz | `0x88` = 100 kHz、`0x24` = 400 kHz | + +### 5. 錯誤計數 sysfs(判定依據) + +| 類別 | 路徑 | 判定 | +|------|------|------| +| PCIe AER(EP + 上游 RP 都要看) | `/sys/bus/pci/devices//aer_dev_{correctable,nonfatal,fatal}` | test 前後差值 > 0 即 fail(correctable 需依 spec 設門檻) | +| DDR EDAC | `/sys/devices/system/edac/mc/mc0/rank<0-3>/dimm_{ce,ue}_count` | UE > 0 直接 fail;CE 依門檻 | + +**Blanton PCIe 拓樸對照**(`show_pcie_error_reg_*.ttl` 的來源): + +| 裝置 | Endpoint BDF | Upstream Root Port | +|------|--------------|--------------------| +| TH6 SWB0 | `0000:01:00.0` | `0000:00:01.1` | +| TH6 SWB1 | `0000:02:00.0` | `0000:00:01.2` | +| CB FPGA | (F0~F3 @ `0000:03:00.x`) | `0000:00:01.5` | +| BMC | `0000:03:00.0` | `0000:00:01.4` | +| I210 1G NIC | `0000:07:00.0` | `0000:00:02.4` | +| NVMe SSD | `0000:06:00.0` | `0000:00:02.1` | + +> ⚠️ **BDF 是 per-unit 的**。`blanton_fpga_pcimem.sh` 的 `FUNCT0..3_RES` 已經改過三次 +> (04:00.x → 03:00.x → 05:00.x → 03:00.x)。換 DUT 一定要先 `lspci -Dnn | grep -i fpga` 重新確認, +> 同理 `show_pcie_error_reg_*.ttl` 裡的 BDF 也要跟著校。 + +--- + +## Key Features + +| 模組 | 進入點 | 功能 | +|------|--------|------| +| **Script A(Pre-test)** | `1_Blanton_Script_A.ttl` | root 登入 → `mkdir ./logs` → `date -s` 對時 → source 五個 bash 工具 → 清/讀 7 組 PCIe AER → `lspci -tvvv/-vv` → margin 全掃 → PMON 七項 → dmesg 三 grep → `messagebox` 提示接 Script B | +| **Script B(Stress)** | `2_Blanton_Script_B.ttl` | `mlucas-avx2 -cpu 0:15` + 5 份 `stress_mem.py` + `stress_hhmd/ssd/pcie/usb.py` 全部背景執行 → `jobs` 確認 → `while 1` 每輪 `show platform fan` / `temperature` / margin | +| **Script C(Post-test)** | `3_Blanton_Script_C.ttl` | `kill $(jobs -p)` → PMON + dmesg 再抓一次 → 7 組 AER 再抓一次 → `cat` mlucas / stress_ssd log → 完成 messagebox | +| **FPGA 暫存器存取** | `cb_fpga [data]` | pcimem 打 `resource0` + BAR 相對 offset,32-bit word;`pmc/icb/swb0/swb1_fpga` 走 VSPI 窗口 | +| **CB I2C / PMBus** | `cb_i2c_init/scan/read/write`、`cb_pmbus_read/write/linear16` | FPGA F3 OpenCores master,**讀用 Repeated START**(SMBus/PMBus 裝置必需) | +| **ICB / PDB 存取** | `vi2c_init/scan/read/write`、`vi2c_scan_all` | CB F3 VI2C proxy,~3.3 ms/reg,取代 VSPI 的 ~18 ms/reg(後者會踩 SMBus 25–35 ms timeout) | +| **溫度** | `temp_cb` / `temp_icb` / `temp_all` | TMP75(12-bit 左靠齊 ×0.0625)、TMP432(含 RANGE bit 的 −64 偏移、remote1/2) | +| **電源資料** | `pwr_data` / `pwr_data_pdb` / `pwr_pdb_id` | SWB VRM 全軌 Vin/Vout/Iout/Temp 對齊表;MP29816 解析度**執行期從 `MFR_VOUT_SCALE_LOOP` 讀**,不寫死 | +| **電壓 Margin** | `margin_init/status/set/apply_profile/save` + `*_all.sh` | 9 顆 LTC2980(CB CONN13、SWB0/1 CONN13~16)批次 high/low margin 與狀態掃描 | + +--- + +## Data Flow + +### 一輪完整測試(端到端) + +``` +[測試員] 開 Tera Term,連 COM,Control → Macro → 1_Blanton_Script_A.ttl + │ + ▼ +Script A ── logopen Logs/Blanton_Margin_.log ──┐ (之後所有畫面都進這個檔) + │ │ + ├─ 登入 admin → sudo -i → root@sonic:~# │ + ├─ date -s "" ← 讓 DUT 時戳可對照 │ + ├─ source 5 個 bash 工具(函數進 shell) │ + ├─ AER 基線:7 組 EP+RP 的 correctable/nonfatal/fatal + ├─ lspci -tvvv / -vv ← 拓樸 + link speed/width + ├─ margin_status_all ← 9 顆 LTC2980 × 16ch 的 Vout 與偏差% + ├─ show platform × 7 ← fan/temp/psu/voltage/current/ssdhealth + └─ dmesg | grep error/fail/warning + ▼ +[messagebox "Start Script B"] ← 人工確認後手動跑 B + │ + ▼ +Script B ── 同一個 log 檔續寫(logwrite 分隔線) + ├─ 背景程序:mlucas-avx2(CPU) ×1, stress_mem ×5, + │ stress_hhmd(I2C/LSB/PCIe), stress_ssd, stress_pcie, stress_usb + ├─ jobs ← 確認全部起來了 + └─ while 1: fan → temperature → margin_status_all (soak 期間持續取樣) + ▼ +[測試員 Ctrl-C / 停止 macro,接著跑 C] + │ + ▼ +Script C + ├─ kill $(jobs -p) ← 收掉所有背景壓力 + ├─ show platform × 7 + dmesg ← 收工快照 + ├─ AER 再抓一次 ← 與 Script A 基線相減 = 本輪新增錯誤 + └─ cat mlucas_amm_log / log.stress_ssd ← 壓力程式自身的 pass/fail + ▼ +[messagebox "GOOD JOB! Test Case DONE"] → 人工檢查 log +``` + +### 硬體讀值路徑(以「讀一顆 SWB VRM 的 Vout」為例) + +``` +pwr_data + └→ cb_pmbus_read 0x8B 2 (blanton_cb_i2c.sh) + └→ _cbi2c_xfer_read:STA+WR(slave|W) → WR(reg) → Sr + STA+WR(slave|R) + → RD(ACK) → RD(NACK)+STO ← Repeated START + └→ cb_fpga 3 <0x300 + ch*0x20 + reg> (blanton_fpga_pcimem.sh) + └→ pcimem /sys/bus/pci/devices/0000:03:00.3/resource0 w [data] + └→ CB FPGA BAR0 → F3 I2C master → SCL/SDA → MP29816/MP2985B + └→ 解碼:MP2985B = 1 mV/LSB;MP29816 = 由 MFR_VOUT_SCALE_LOOP(0x29) bit[12:10] 決定 + Vin 一律 31.25 mV/LSB(÷32) +``` + +--- + +## Key Constraints & Business Rules + +1. **A → B → C 必須依序跑,且 B 之後才能跑 C。** Script B 的背景 job 只存在於那個 shell session, + Script C 的 `kill $(jobs -p)` 依賴同一個 session;中途斷線就得手動收程序。 +2. **A / B / C 共用同一個 log 檔**:只有 Script A `logopen`,B / C 用 `logwrite` 續寫分隔線。 + 跑 B/C 前若關掉了 Tera Term,log 就斷了。 +3. **PCIe AER 的判定是「差值」不是「絕對值」**:Script A 抓基線、Script C 抓結果, + 兩者相減才是本輪產生的錯誤。EP 與上游 Root Port **兩邊都要看**(錯誤可能只記在 RP)。 +4. **BDF 是 per-unit 的**,換 DUT 必須重新確認並改 `blanton_fpga_pcimem.sh` 的 `FUNCT0..3_RES` + 與 `utils/show_pcie_error_reg_*.ttl`(見 Data Models §5 註)。 +5. **ICB / PDB 一律走 VI2C,不走 VSPI**:VSPI ~18 ms/reg 會讓 I2C byte 相之間拉到 ~50 ms, + 踩中 SMBus 25–35 ms timeout,裝置會 NACK register pointer。實測全 5 通道掃描 9.4 s vs 34.0 s。 +6. **I2C 讀一律用 Repeated START**(不是 STOP + START):PMBus / SMBus 裝置(VRM、EFUSE) + 只吃 Sr;只有純暫存器裝置兩種都行。 +7. **`margin_save`(`STORE_USER_ALL`)會永久寫進 NVM**,斷電保留。測試流程中**絕不執行**, + 以免覆蓋客戶出廠 config。`margin.sh` 的 auto-enable 只改 RAM(`ON_OFF_CONFIG`),斷電復原。 +8. **操作硬體電壓有損壞 DUT 的風險**:套 profile 前先確認該軌 OV/UV limit 與 servo DAC 注入電阻 + 有 populate(本板部分 margin 電阻標 PROTO,沒 populate 的軌電壓不會動)。 +9. **`ARB_LOST` 不等於裝置存在**:`vi2c_scan` 只看 `RX_ACK`,仲裁失敗會被誤報成「有裝置」。 + `blanton_pwr_data.sh` 因此加了 ARB_LOST-aware retry 與 plausibility window + (`0xFFFF` 或超出範圍一律回 `NA`)——**寧可 NA 也不要印出一個看起來像數據的錯值**。 +10. **DUT 密碼不得進 git**:`1_Blanton_Script_A.ttl` 目前的 `sendln "YourPaSsWoRd"` 是 placeholder, + 實際帳密必須放 `secret/config_secret.ttl`(gitignored)並由 `config.ttl` include。 +11. **客戶 NDA**:`docs/` 內含客戶 FPGA 規格與 schematic 衍生資訊,**本 repo 只推 NAS + Gitea, + 絕不推 GitHub**。 + +--- + +## Security Considerations + +| 項目 | 做法 | +|------|------| +| **DUT console 帳密** | 集中在 `secret/config_secret.ttl`(gitignored),`config.ttl` 以 `include` 載入。repo 內只留 `secret/config_secret.ttl.example`,敏感欄位一律 `__CHANGE_ME__` | +| **`secret/` 資料夾** | 本機 / 現場敏感資料集中地:DUT 帳密、per-unit BDF 覆寫、COM port 設定、客戶提供的未公開附件。`.gitignore` 用 `secret/*` + `!secret/README.md` + `!secret/*.example` + `!secret/.gitkeep`,**除 README 與 `.example` 外全部忽略** | +| **客戶機密文件** | `docs/` 內 FPGA 規格(docx/xlsx/md)屬客戶 NDA 範圍;schematic 原始檔(`*.DSN`)一律 gitignore,不進 repo | +| **Remote 限制** | 只推私有 remote:`nas`(`git.et-wen.com:51222`)+ `gitea`(`etgit.et-wen.com`)。**不設 GitHub `origin`** | +| **測試 log** | `logs/*.log` 含 DUT 序號、MAC、韌體版本等可識別資訊 → gitignore,只保留目錄結構(`.gitkeep`) | +| **破壞性硬體指令** | `margin_save` / `STORE_USER_ALL` 為永久 NVM 寫入,工具預設不呼叫;批次腳本 `margin_save_all.sh` 在 README 與腳本頂端都有警語 | +| **root 權限** | 全流程在 `root@sonic:~#` 下執行(pcimem / i2c 需要);腳本不留任何 `chmod 777` 或放寬權限的動作 | +| **For_AI/** | AI 協作素材(截圖、草稿筆記)整個資料夾 gitignore,避免不小心把客戶圖面帶進 repo | + +--- + +## Build & Setup Steps + +無編譯。從零到能跑一輪測試: + +```bash +# ── 0. 取得專案(開發機 / 測試 NB)──────────────────────────── +git clone ssh://ETHouseNAS@git.et-wen.com:51222/volume1/git/Blanton_TTL_Script.git +cd Blanton_TTL_Script + +# ── 1. 準備帳密(不進 git)────────────────────────────────── +cp secret/config_secret.ttl.example secret/config_secret.ttl +# 編輯 secret/config_secret.ttl,填入實際 DUT 帳密(取代 __CHANGE_ME__) + +# ── 2. DUT 端:部署 bash 工具庫 ───────────────────────────── +scp -r src/Script_ABC_Blanton/Blanton_Script admin@:~/ +ssh admin@ 'sudo -i' +# (現場無網路時改用 USB 隨身碟複製到 ~/Blanton_Script) + +# ── 3. DUT 端:確認 FPGA BDF(每台不同!)──────────────────── +lspci -Dnn | grep -i fpga # 例:0000:03:00.0 +ls -d /sys/bus/pci/devices/0000:*:00.3 +# 若不是 0000:03:00.x,改 ~/Blanton_Script/blanton_fpga_pcimem.sh 的 FUNCT0..3_RES +# 以及 src/Script_ABC_Blanton/utils/show_pcie_error_reg_*.ttl 內的 BDF + +# ── 4. DUT 端:煙霧測試(跑 Script A 之前先手動確認)────────── +source ~/Blanton_Script/blanton_fpga_pcimem.sh +cb_fpga 0 0xD90 # RST_CAUSE_REG,讀得到值 = BAR 通了 +source ~/Blanton_Script/blanton_cb_i2c.sh +cb_i2c_init 11 && cb_i2c_scan 11 # Ch11 風扇控制器,應看到 0x20 +source ~/Blanton_Script/LTC2980_Margin_Script/margin.sh +margin_init Blanton_CB_CONN13 && margin_status +``` + +**Host(Windows)端:** + +``` +1. 安裝 Tera Term 5.x +2. 把 src\Script_ABC_Blanton\ 整包複製到本機(路徑不要有空白與非 ASCII) +3. 在該資料夾下建立 Logs\ 目錄(Script A 的 logopen 需要) +4. Tera Term 連上 DUT COM port(預設 115200-8-N-1) +5. Control → Macro → 選 1_Blanton_Script_A.ttl +6. A 跑完出現 messagebox → 手動跑 2_Blanton_Script_B.ttl(soak) +7. Soak 時間到 → 停止 B 的 macro → 跑 3_Blanton_Script_C.ttl +8. 檢查 Logs\Blanton_Margin_.log +``` + +> 註:本專案非 .NET / Blazor / EC2 架構,`aws-ec2-deploy` 與 `vbox-run-deploy` 兩份部署指南不適用,已跳過。 + +--- + +## Development Phases + +現況基準:`docs/TTL_Script_Blanton_Status_20260814.xlsx` 已逐項標記 OK / On-Going, +以下 Phase 直接把該表的 On-Going 項目排進來,並補上工程化(版控、密碼外移、打包)的缺口。 + +### Phase 1 — 版控化 + 密碼外移(工作量:S) + +**目標:** 專案進 git(NAS + Gitea),帳密不再躺在腳本裡,任何人 clone 下來照文件就能跑。 + +**包含:** +- [ ] `git init` + `.gitignore`(`secret/*`、`For_AI/`、`logs/*.log`、`~$*`、`*.DSN`) +- [ ] 建 `secret/README.md` + `secret/config_secret.ttl.example`(`__CHANGE_ME__` placeholder) +- [ ] `config.ttl` 改為 `include "..\..\secret\config_secret.ttl"`(或現場放同層), + 把 `1_Blanton_Script_A.ttl` 的 `sendln "YourPaSsWoRd"` 換成 `sendln dut_password` +- [ ] `src/Script_ABC_Blanton/logs/.gitkeep`,既有 `Blanton_Margin_20260814-164122.log` 移出 repo +- [ ] `CLAUDE.md` + `ARCHITECTURE.md` 進 repo,push `nas` + `gitea`(**不推 GitHub**) + +**驗收條件:** 在另一台機器 `git clone` → 填 `secret/config_secret.ttl` → Script A 能完整登入並產生 log; +`git log -p` 中搜不到任何實際密碼。 + +--- + +### Phase 2 — Script A 補完:Check History + Margin 驗收(工作量:M) + +**目標:** Script A 的基線資料補齊到「開機原因 + 全部電壓軌」都有紀錄,Status 表的兩個 On-Going 轉 OK。 + +**包含:** +- [ ] 新增 `utils/show_reset_cause.ttl`:`cb_fpga 0 0xD90`(RST_CAUSE_REG)、 + `cb_fpga 0 0xD94`(SWB0)、`cb_fpga 0 0xD98`(SWB1),並在註解貼上 bit 定義 + (來源 `docs/Blantons_FPGA_Registers.md` §5 RST_CAUSE_REG) +- [ ] Script A 的 `; ========== Check History ==========` 區塊改 include 上面這支 +- [ ] `utils/show_margin_status.ttl`:清掉已註解的 per-conf 舊寫法,只留 + `margin_status_all.sh`;確認 9 顆 LTC2980 都能掃到(含 SWB 的 `TRANSPORT="swb"` 路徑) +- [ ] 新增 `utils/show_pwr_data.ttl`(`pwr_data` + `pwr_data_pdb`)與 + `utils/show_temp_sensor.ttl`(`temp_all`),把 `blanton_pwr_data.sh` / + `blanton_temp_sensor.sh` 真正接進流程(目前 Script A 只 source 沒用) +- [ ] Script A 開頭加 BDF 自檢:`lspci -Dnn | grep -i fpga`,log 裡看得到本台的實際 BDF + +**驗收條件:** 跑一次 Script A,log 內同時含 reset cause 三個暫存器值、9 顆 LTC2980 × 16ch 的 +margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值,且無 `ERR` / `NA` 以外的異常。 + +--- + +### Phase 3 — Script B 壓力層穩固化(工作量:M) + +**目標:** 壓力程序起得來、起不來看得出來,soak 迴圈有時戳、可控週期。 + +**包含:** +- [ ] 部署 `~/hammer/tools/` 前置檢查:新增 `utils/check_hammer_tools.ttl` + (`ls -l ~/hammer/tools/` + `ls ~/hammer/tools/amd/mlucas-avx2`),缺檔就別往下跑 +- [ ] 壓力程序 log 加時戳,避免多輪覆蓋: + `mlucas_amm_log` → `~/logs/mlucas_amm_log_$(date +%Y%m%d-%H%M%S).log`(Status 表 ScriptB #2 的既定寫法) +- [ ] `jobs` 之後加驗證:期望 10 個背景 job(1 mlucas + 5 mem + hhmd/ssd/pcie/usb), + 數量不符時 `messagebox` 提示 +- [ ] soak 迴圈改為「每輪先 `date`、跑完 `pause <間隔>`」, + 把 `EN_LoopInterval`(預設 600 秒 = 10 min)放進 `config.ttl`,兌現 Status 表的「Get data every 10mins」 +- [ ] soak 每輪補 `show platform psustatus` / `voltage` / `current`(目前只有 fan + temperature) +- [ ] 補 `; ========== CLEAR EVENT ==========`(Status 表 ScriptB #1,Owner: Alan) + +**驗收條件:** Script B 啟動後 `jobs` 顯示 10 個 job;連續跑 3 輪,log 內三段各自帶正確時戳且間隔 ≈10 min; +故意把 `~/hammer` 改名,Script B 會在前置檢查就停下並提示。 + +--- + +### Phase 4 — Traffic 與 SONiC 介面資料(工作量:M) + +**目標:** 補齊 Status 表中 Owner=Alan 的三個 traffic 項目,讓測試涵蓋交換晶片的資料面。 + +**包含:** +- [ ] `utils/traffic_setup.ttl`:Blanton/SONiC 版的 port 起始設定與 counter 清零 + (對照 Carlsbad 的 `clear int stat global`,改用 SONiC `sonic-clear counters`) +- [ ] `utils/show_traffic_counters.ttl`:`show interface counters`、 + `show interface counters errors`、`show interface status` +- [ ] `utils/show_interface_detail.ttl`:`show interface transceiver eeprom/dom`、 + `show interface link-training`(對照 Carlsbad `sho int transceiver detail`) +- [ ] `utils/show_tech.ttl`:`show techsupport`(Script C 收工快照,Status 表 ScriptC #4) +- [ ] Script A 的 TRAFFIC-SETUP-STAGE 與 Script C 的 CHECK Traffic counters 接上這些片段 +- [ ] `config.ttl` 加 `EN_Traffic` 旗標,未接線的站點可整段跳過 + +**驗收條件:** `EN_Traffic=1` 時,Script A log 有清零後的 counter 基線、Script C log 有結束時的 +counter 與 error-counter,兩者可直接相減;`EN_Traffic=0` 時整段不執行且不報錯。 + +--- + +### Phase 5 — Log 解析與自動判定(工作量:L) + +**目標:** 不用人眼掃幾 MB 的 console log,跑完自動吐一張 PASS/FAIL 摘要。 + +**包含:** +- [ ] `tools/parse_blanton_log.py`:吃 `Logs/*.log`,切出 ScriptA / ScriptB / ScriptC 三段 + (靠 `logwrite` 的 `#####` 分隔線) +- [ ] AER / EDAC 差值計算:抽出 A 與 C 兩次的 `aer_dev_*` 與 `dimm_{ce,ue}_count`,輸出增量表, + UE > 0 或 fatal/nonfatal > 0 直接標 FAIL +- [ ] Margin 表解析:把 9 顆 × 16ch 的 Vout / 偏差% 收成 CSV,標出超出 ±(profile 設定值 + 容差) 的軌 +- [ ] 溫度 / 風扇 / 電源趨勢:soak 期間逐輪取樣 → CSV(可直接畫圖) +- [ ] Stress 判定:`mlucas_amm_log` 與 `log.stress_ssd` 的錯誤關鍵字掃描 +- [ ] 產出 `Logs/_summary.md`:一頁 PASS/FAIL + 每個子系統一行結論 + +**驗收條件:** 拿一份既有 log(如 `Blanton_Margin_20260814-164122.log`)跑解析器, +產出 summary 與 CSV;人工植入一筆假的 `dimm_ue_count=1` 後,summary 正確翻成 FAIL。 + +--- + +### Phase 6 — 打包、Runbook 與交付(工作量:S) + +**目標:** 產出可直接交給現場測試員(或客戶)的一包,含操作手冊,不需要看原始碼。 + +**包含:** +- [ ] `tools/publish.sh`:把 `src/Script_ABC_Blanton/` + 空 `Logs/` + `secret/*.example` + 打包成 `publish/Blanton_Script_ABC_v_/` 與同名 zip(比照 + 既有的 `Blanton_Script_ABC_v1.0_20251229` 命名) +- [ ] `README.md`(現場用):Tera Term 設定、A→B→C 操作順序、常見錯誤(BDF 不符、 + margin 掃不到、hammer 工具缺檔)與對應處理 +- [ ] `CHANGELOG.md`:延續三支腳本頂端的 Version History,集中成一份 +- [ ] 三支腳本的 header 版號與 `CHANGELOG.md` 對齊,`config.ttl` 加 `script_version` 並寫進 log 開頭 +- [ ] `docs/TTL_Script_Blanton_Status_*.xlsx` 更新為全 OK,或把剩餘項目移進 Future Extensions +- [ ] 打 git tag `v1.1.0`,push `nas` + `gitea` + +**驗收條件:** 從 zip 解壓到一台乾淨的測試 NB,照 README 操作,不看原始碼就能完成一輪 A→B→C +並產出 summary;`publish/` 內容與 git tag 一致。 + +--- + +## Future Extensions + +- **Script B 的 eye measurement**:Status 表 ScriptB「Take one round of eye measurement on uplink ports」 + 目前是空區塊,待 TH6 SDK 的 eye scan 指令確認後補上。 +- **PDB 電源轉換值驗證**:`blanton_pwr_data.sh` 的 PDB 段落在第一台 DUT(COM39)因 ch4 仲裁問題無法驗證, + COM36 才拿到部分結果;`READ_VIN` 已知不是真的輸入電壓(跟隨 `READ_VOUT`)。待拿到 brick 的 + `MFR_ID`/`MFR_MODEL` 後對照 datasheet 定案。 +- **`show_pcie_error_reg.ttl` 淘汰**:舊的合併版已被 7 支 per-device 版取代,確認無人引用後刪除。 +- **BDF 自動偵測**:把 `blanton_fpga_pcimem.sh` 註解中的 auto-detect 片段轉正, + 用 `lspci -Dnn | grep -i fpga` 動態填 `FUNCT0..3_RES`,讓換 DUT 不用改檔。 +- **SSH / 網路模式**:目前全走 COM console。若 DUT 管理網路可用,可改用 `plink`/`ssh` 執行同一組 + bash 工具,速度與可靠度都比 serial 好,TTL 只保留開機階段。 +- **多 DUT 併行**:多台 DUT 同時 soak 時,Tera Term 每台開一個 macro window; + 可考慮改成 Python(`pyserial`)統一排程與集中收 log。 +- **與 `LTC2980_Margin_Script` 獨立 repo 的同步機制**:目前 `Blanton_Script/LTC2980_Margin_Script/` + 是該 repo 的複本(少了 `ARCHITECTURE.md`/`CLAUDE.md`/`Reference/`,多了兩支 `blanton_*` 後端)。 + 待評估改用 git submodule 或明確的 vendored 同步腳本。 diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..e915ad6 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,110 @@ +# CLAUDE.md — Blanton TTL Script + +## 專案簡介 + +Blanton(Project Helios)交換器平台的系統層可靠性測試自動化腳本組。 +Windows 端用 **Tera Term TTL macro** 透過 COM console 驅動 DUT 的 SONiC, +A / B / C 三支腳本分別跑「基線 → 壓力 soak → 收工判定」,全程存 log。 +DUT 端的取數能力由一組 **bash 工具庫** 提供(CB FPGA `pcimem` → FPGA I2C/VI2C → VRM / 溫感 / LTC2980)。 + +完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。 + +## 技術棧 + +- **Host**:Tera Term 5.x TTL macro(`.ttl`),Windows +- **DUT**:SONiC(Debian-based),bash + busybox/mawk,`root@sonic:~#` +- **暫存器存取**:`pcimem`(mmap PCI sysfs `resource0` + BAR 相對 offset,一律 32-bit word) +- **I2C/PMBus**:CB FPGA F3 I2C master(Ch0~Ch17,base 0x300 stride 0x20)、 + CB F3 VI2C proxy → ICB/PDB(Ch0~Ch4,base 0x780)、CPU 原生 bus(`i2cset`/`i2cget`) +- **Margin**:LTC2980(= 2 × LTC2977)over PMBus,LINEAR16 +- **判定資料源**:PCIe AER sysfs(`aer_dev_*`)、EDAC sysfs(`dimm_{ce,ue}_count`)、SONiC `show platform *` +- **無編譯步驟**:TTL 與 bash 都直譯執行 + +## 常用指令 + +```bash +# ── 部署 bash 工具庫到 DUT ────────────────────────── +scp -r src/Script_ABC_Blanton/Blanton_Script admin@:~/ + +# ── DUT 上先確認 FPGA BDF(每台不同!)─────────────── +lspci -Dnn | grep -i fpga +ls -d /sys/bus/pci/devices/0000:*:00.3 + +# ── DUT 上載入工具(Script A 也是做這五件事)───────── +source ~/Blanton_Script/blanton_fpga_pcimem.sh +source ~/Blanton_Script/blanton_cb_i2c.sh +source ~/Blanton_Script/blanton_icb_vi2c.sh +source ~/Blanton_Script/blanton_pwr_data.sh +source ~/Blanton_Script/LTC2980_Margin_Script/margin.sh + +# ── 煙霧測試 ──────────────────────────────────────── +cb_fpga 0 0xD90 # RST_CAUSE_REG,讀得到 = BAR 通了 +cb_i2c_init 11 && cb_i2c_scan 11 # Ch11 風扇控制器,應看到 0x20 +vi2c_scan_all # ICB/PDB 五個通道 +temp_all # CB + ICB 溫感 +pwr_data # SWB VRM 全軌 +margin_init Blanton_CB_CONN13 && margin_status + +# ── 各工具的 help ─────────────────────────────────── +blanton_fpga_help ; blanton_cb_i2c_help ; vi2c_help +temp_sensor_help ; pwr_data_help +``` + +**Host 端跑一輪測試:** + +``` +Tera Term 連 COM port (115200-8-N-1) +→ Control → Macro → 1_Blanton_Script_A.ttl (基線,跑完出 messagebox) +→ 手動跑 2_Blanton_Script_B.ttl (壓力 soak,while 1 迴圈,泡到時間到停掉) +→ 手動跑 3_Blanton_Script_C.ttl (kill + 收工快照 + 判定) +→ 檢查 Logs\Blanton_Margin_.log +``` + +## 開發慣例 + +- **執行單位**:`src/Script_ABC_Blanton/` 整包給測試員(Tera Term 工作目錄); + 其中 `Blanton_Script/` 是 scp 到 DUT `~/` 的單位 +- **TTL 分層**:`config.ttl` 放設定 → 三支主腳本編排流程 → `utils/*.ttl` 是可 include 的無狀態片段 + (只做 `wait prompt_sonic_root` + `sendln`,不設變數、不 logopen) +- **新增取數項目** = 新增一支 `utils/show_xxx.ttl`,再在主腳本 `include`,不要往主腳本塞指令 +- **bash 命名**:公開函數 `cb_i2c_* / vi2c_* / temp_* / pwr_* / margin_*`,內部 helper 一律底線開頭 + (`_cbi2c_* / _vr / _ts_* / _pwr_*`) +- **版本紀錄**:每支 `.ttl` 與 `.sh` 檔頭都有 `Version History` 區塊,改動時**在檔頭補一行** + (`V1.0.2 YYYY-MM-DD <做了什麼>`),不要只改版號 +- **Commit**:Conventional Commits,**英文**。scope 用 `ttl` / `fpga` / `i2c` / `vi2c` / + `margin` / `pwr` / `temp` / `docs` +- **Status 表**:`docs/TTL_Script_Blanton_Status_*.xlsx` 是逐項進度的正本(OK / On-Going + Owner), + 完成一項就同步更新,別讓文件跟腳本脫節 + +## 注意事項 + +- 🔒 **NDA:本 repo 只推 `nas` + `gitea`,絕不推 GitHub。** `docs/` 內含客戶 FPGA 規格。 +- 🔒 **DUT 帳密不進 git**。`1_Blanton_Script_A.ttl` 的 `sendln "YourPaSsWoRd"` 是 placeholder, + 實際值放 `secret/config_secret.ttl`(gitignored)。**任何 commit 前先 grep 一次確認沒帶到真密碼。** +- ⚠️ **PCIe BDF 是 per-unit 的**。`blanton_fpga_pcimem.sh` 的 `FUNCT0..3_RES` 已經改過三次 + (04:00.x → 03:00.x → 05:00.x → 03:00.x)。換 DUT 一定先 `lspci -Dnn | grep -i fpga`, + `utils/show_pcie_error_reg_*.ttl` 內的 BDF 也要一起校。 +- ⚠️ **AER 判定看差值不看絕對值**:Script A 抓基線、Script C 抓結果,相減才是本輪錯誤。 + **Endpoint 與上游 Root Port 兩邊都要讀**,錯誤可能只記在 RP。 +- ⚠️ **ICB/PDB 一律走 VI2C(`blanton_icb_vi2c.sh`),不要走 VSPI**:VSPI ~18 ms/reg 會讓 I2C + byte 相間隔拉到 ~50 ms,踩中 SMBus 25–35 ms timeout,裝置直接 NACK。實測全掃 9.4 s vs 34.0 s。 +- ⚠️ **I2C 讀一律 Repeated START**(不是 STOP + START),否則 PMBus/SMBus 裝置(VRM、EFUSE)不理。 +- ⚠️ **`margin_save` / `STORE_USER_ALL` 會永久寫 NVM**,斷電保留 → **測試流程中絕不執行**, + 以免覆蓋客戶出廠 config。`margin.sh` 的 auto-enable(`ON_OFF_CONFIG=0x1a`)只改 RAM,斷電復原。 +- ⚠️ **改電壓會弄壞 DUT**:套 profile 前確認該軌 OV/UV limit,且 servo DAC 注入電阻有 populate + (本板部分 margin 電阻標 PROTO,沒 populate 的軌電壓不會動,不是腳本壞掉)。 +- ⚠️ **`ARB_LOST` ≠ 有裝置**:`vi2c_scan` 只看 `RX_ACK`,仲裁失敗會被誤報成裝置存在。 + `blanton_pwr_data.sh` 已加 retry + plausibility window,**寧可印 `NA` 也不要印看起來像數據的錯值**。 +- ⚠️ **A → B → C 必須同一個 Tera Term session**:B 的背景 job 與 C 的 `kill $(jobs -p)` 綁在同一個 + shell;log 也只有 A 會 `logopen`,B/C 是續寫。中途關掉 window 就得手動收程序、log 也斷了。 +- ⚠️ **MP29816 的 Vout 解析度不是固定值**,由 `MFR_VOUT_SCALE_LOOP(0x29)` bit[12:10] 決定, + `blanton_pwr_data.sh` 執行期從晶片讀;xlsx 上寫的 `/5mV` 與 MP2985B 的 `+49` offset **都是錯的**。 + +## 資料夾說明 + +- `src/Script_ABC_Blanton/` — 可執行內容(Tera Term 工作目錄;內含要 scp 到 DUT 的 `Blanton_Script/`) +- `docs/` — 客戶 FPGA 規格、AER/EDAC 檢查依據、逐項 Status 表 +- `tools/` — Host 端輔助腳本(log 解析、報表產生、打包) +- `publish/` — 交付用打包輸出(`Blanton_Script_ABC_v_/` + zip) +- `secret/` — 🚫 gitignored(除 `README.md` 與 `*.example`):DUT 帳密、per-unit BDF 覆寫、COM 設定 +- `For_AI/` — 🚫 gitignored:AI 協作素材(波形截圖、草稿筆記) diff --git a/docs/Blantons_FPGA_Registers.md b/docs/Blantons_FPGA_Registers.md new file mode 100644 index 0000000..d495ad0 --- /dev/null +++ b/docs/Blantons_FPGA_Registers.md @@ -0,0 +1,3564 @@ +# Blanton (Project Helios) FPGA Register Specification + +> **Status:** Draft · **Source FPGA:** CB / SWB / ICB +> Converted from `Blantons_FPGA_Registers_draft.docx` and `Blantons_FPGA_Registers_Map_draft.xlsx`. +> This Markdown is a faithful, human-readable rendering of the two HPE source files — values are not edited. + +## Contents + +1. [Revision History](#1-revision-history) +2. [Document Abbreviations](#2-document-abbreviations) +3. [Register Address Map](#3-register-address-map) +4. [MSI Interrupt Mapping](#4-msi-interrupt-mapping) +5. [Register Descriptions](#5-register-descriptions) + +--- + +## 1. Revision History + +| Revision No. | Date
mm/dd/yy | Author | Changes | +|---|---|---|---| +| 0.1 | 03/20/2026 | Peter | 1st Draft | +| 0.2 | 03/23/2026 | Peter | Reviewed by HW | +| 0.3 | 04/06/2026 | Peter | CB
F0 PWR_CTRL/STAT changes
Move USRPRT power to F1 USRPRT_PWR_CTRL/STAT
Move USB 5V to USB_CTRL_REG
Added separate THRM_SUICIDE bit control for SWB 0/1
Added power status of SWB0/1 - #SWB_PWROK
USB_STAT_REG – added new detection bit [1]
ICB_CTRL_REG [3:0] – added encoded reset control to ICB
Fix minor typo in F1 registers
F1 USRPRT_PWR_CTRL – Efuse to QSFP are default to disabled
TND_BMC_GPIO_CTRL/STAT/DIR – replace bit [7] with [0]
Updated LED_CTRL_4/5_REG description
Decouple SWB reset signal into RST_CAUSE_SWB_REG (from RST_CAUSE_REG)
TND_PWR_CTRL/STAT_REG – added new power rails control and status bits
F1 RTM_CTL_REG #RTM_RST default change to asserted | + +**Register-map spreadsheet revisions:** + +| Rev | Date | Description | +|---|---|---| +| 0.1 | 2026-03-20 | First Draft | +| 0.2 | 2026-03-23 | Reviewed by HW | +| 0.3 | 2026-04-07 | - Add missing INTRD_STAT_REG - Add USRPRT_PWR_CTRL/STAT_REG - Updated CB-MSI / SWB-INT / ICB-INT tabs - Added USB_CTRL_REG - Added RST_CAUSE_SWB_REG (SWB0/1) | + +--- + +## 2. Document Abbreviations + +| Abbr. | Meaning | +|---|---| +| TBD | To be determined | +| W1C | Write 1 to clear | +| W0C | Write 0 to clear | +| RO | Read Only | +| WO | Write Only | +| RW | Read & Write | + +--- + +## 3. Register Address Map + +Address map of every FPGA register, grouped by FPGA type and PCI function. +Offsets are byte offsets within the function register window. `DW` = number of 32-bit double-words the entry occupies. + +### CB — Control Board + +#### CB — Function 0 + +| Offset | DW | Register | Group | Comment | +|---|---|---|---|---| +| 0x000 | 1 | FPGA_REV_ID_REG | GEN & ID | CB_FPGA revision & Id register | +| 0x004 | 1 | RSVD | GEN & ID | | +| 0x008 | 1 | RSVD | GEN & ID | | +| 0x00C | 1 | RSVD | GEN & ID | | +| 0x010 | 12 | RSVD | GEN & ID | | +| 0x040 | 1 | FUNC_CAP_0_REG | GEN & ID | | +| 0x044 | 1 | FUNC_CAP_1_REG | GEN & ID | | +| 0x048 | 1 | FUNC_CAP_2_REG | GEN & ID | | +| 0x04C | 1 | FUNC_CAP_3_REG | GEN & ID | | +| 0x050 | 1 | FUNC_CAP_4_REG | GEN & ID | | +| 0x054 | 1 | FUNC_CAP_5_REG | GEN & ID | | +| 0x058 | 1 | FUNC_CAP_6_REG | GEN & ID | | +| 0x05C | 1 | FUNC_CAP_7_REG | GEN & ID | | +| 0x060 | 1 | FUNC_CAP_8_REG | GEN & ID | | +| 0x064 | 7 | RSVD | GEN & ID | | +| 0x080 | 1 | FPGA_RECONFIG_CTRL_REG | FPGA Reconfig | | +| 0x084 | 1 | FPGA_RECONFIG_STAT_REG | FPGA Reconfig | | +| 0x088 | 6 | RSVD | FPGA Reconfig | 88 | +| 0x0A0 | 1 | RSVD | FPGA Reconfig | | +| 0x0A4 | 1 | RSVD | FPGA Reconfig | | +| 0x0A8 | 6 | RSVD | FPGA Reconfig | | +| 0x0C0 | 1 | SCRTCH_0_REG | Scratchpad | | +| 0x0C4 | 1 | SCRTCH_1_REG | Scratchpad | | +| 0x0C8 | 1 | SCRTCH_2_REG | Scratchpad | | +| 0x0CC | 1 | SCRTCH_3_REG | Scratchpad | | +| 0x0D0 | 12 | RSVD | Scratchpad | | +| 0x100 | 1 | DEV_MSI_0_PEND_REG | MSI INT | | +| 0x104 | 1 | RSVD | MSI INT | | +| 0x108 | 1 | DEV_MSI_0_INT_EN_REG | MSI INT | | +| 0x10C | 1 | RSVD | MSI INT | | +| 0x110 | 1 | DEV_MSI_1_PEND_REG | MSI INT | | +| 0x114 | 1 | RSVD | MSI INT | | +| 0x118 | 1 | DEV_MSI_1_INT_EN_REG | MSI INT | | +| 0x11C | 1 | RSVD | MSI INT | | +| 0x120 | 1 | DEV_MSI_2_PEND_REG | MSI INT | | +| 0x124 | 1 | RSVD | MSI INT | | +| 0x128 | 1 | DEV_MSI_2_INT_EN_REG | MSI INT | | +| 0x12C | 1 | RSVD | MSI INT | | +| 0x130 | 1 | DEV_MSI_3_PEND_REG | MSI INT | | +| 0x134 | 1 | RSVD | MSI INT | | +| 0x138 | 1 | DEV_MSI_3_INT_EN_REG | MSI INT | | +| 0x13C | 1 | RSVD | MSI INT | | +| 0x140 | 1 | DEV_MSI_4_PEND_REG | MSI INT | | +| 0x144 | 1 | RSVD | MSI INT | | +| 0x148 | 1 | DEV_MSI_4_INT_EN_REG | MSI INT | | +| 0x14C | 1 | RSVD | MSI INT | | +| 0x150 | 1 | DEV_MSI_5_PEND_REG | MSI INT | | +| 0x154 | 1 | RSVD | MSI INT | | +| 0x158 | 1 | DEV_MSI_5_INT_EN_REG | MSI INT | | +| 0x15C | 1 | RSVD | MSI INT | | +| 0x160 | 1 | DEV_MSI_6_PEND_REG | MSI INT | 160 | +| 0x164 | 1 | RSVD | MSI INT | | +| 0x168 | 1 | DEV_MSI_6_INT_EN_REG | MSI INT | | +| 0x16C | 1 | RSVD | MSI INT | | +| 0x170 | 1 | DEV_MSI_7_PEND_REG | MSI INT | | +| 0x174 | 1 | RSVD | MSI INT | | +| 0x178 | 1 | DEV_MSI_7_INT_EN_REG | MSI INT | | +| 0x17C | 1 | RSVD | MSI INT | | +| 0x180 | 64 | RSVD | MSI INT | | +| 0x280 | 32 | RSVD | Mailbox | | +| 0x300 | 1 | PWR_CTRL_REG | Power | | +| 0x304 | 1 | PWR_STAT_REG | Power | | +| 0x308 | 1 | PWR_STAT_PLRTY_REG | Power | | +| 0x30C | 1 | PWR_STAT_EDG_LVL_REG | Power | | +| 0x310 | 1 | PWR_STAT_INT_EN_REG | Power | | +| 0x314 | 1 | PWR_STAT_INT_STAT_REG | Power | | +| 0x318 | 1 | PWR_STAT_INT_CLR_REG | Power | | +| 0x31C | 1 | SEM_REG | Power | | +| 0x320 | 24 | RSVD | Power | | +| 0x380 | 1 | RS232_SPD_SNS_REG | Speed Sense | | +| 0x384 | 1 | RS232_CLR_SPD_SNS_REG | Speed Sense | | +| 0x388 | 14 | RSVD | Speed Sense | | +| 0x3C0 | 1 | RSVD | TPM | For TPM 1.0 and 2.0 | +| 0x3C4 | 1 | TPM_STAT_REG | TPM | | +| 0x3C8 | 1 | TPM_STAT_PLRTY_REG | TPM | | +| 0x3CC | 1 | TPM_STAT_EDG_LVL_REG | TPM | | +| 0x3D0 | 1 | TPM_STAT_INT_EN_REG | TPM | | +| 0x3D4 | 1 | TPM_STAT_INT_STAT_REG | TPM | | +| 0x3D8 | 1 | TPM_STAT_INT_CLR_REG | TPM | | +| 0x3DC | 1 | SEM_REG | TPM | | +| 0x3E0 | 24 | RSVD | TPM | | +| 0x440 | 1 | PMC_CTRL_REG | PMC | | +| 0x444 | 1 | PMC_STAT_REG | PMC | | +| 0x448 | 1 | PMC_STAT_PLRTY_REG | PMC | | +| 0x44C | 1 | PMC_STAT_EDG_LVL_REG | PMC | | +| 0x450 | 1 | PMC_STAT_INT_EN_REG | PMC | | +| 0x454 | 1 | PMC_STAT_INT_STAT_REG | PMC | | +| 0x458 | 1 | PMC_STAT_INT_CLR_REG | PMC | | +| 0x45C | 1 | SEM_REG | PMC | | +| 0x460 | 8 | RSVD | PMC | | +| 0x480 | 1 | ICB_CTRL_REG | ICB | | +| 0x484 | 1 | ICB_STAT_REG | ICB | | +| 0x488 | 1 | ICB_STAT_PLRTY_REG | ICB | | +| 0x48C | 1 | ICB_STAT_EDG_LVL_REG | ICB | | +| 0x490 | 1 | ICB_STAT_INT_EN_REG | ICB | | +| 0x494 | 1 | ICB_STAT_INT_STAT_REG | ICB | | +| 0x498 | 1 | ICB_STAT_INT_CLR_REG | ICB | | +| 0x49C | 1 | SEM_REG | ICB | | +| 0x4A0 | 8 | RSVD | ICB | | +| 0x4C0 | 1 | SWB_CTRL_REG | SWB0 | | +| 0x4C4 | 1 | SWB_STAT_REG | SWB0 | | +| 0x4C8 | 1 | SWB_STAT_PLRTY_REG | SWB0 | | +| 0x4CC | 1 | SWB_STAT_EDG_LVL_REG | SWB0 | | +| 0x4D0 | 1 | SWB_STAT_INT_EN_REG | SWB0 | | +| 0x4D4 | 1 | SWB_STAT_INT_STAT_REG | SWB0 | | +| 0x4D8 | 1 | SWB_STAT_INT_CLR_REG | SWB0 | | +| 0x4DC | 1 | SEM_REG | SWB0 | | +| 0x4E0 | 8 | RSVD | SWB0 | | +| 0x500 | 1 | SWB_CTRL_REG | SWB1 | | +| 0x504 | 1 | SWB_STAT_REG | SWB1 | 504 | +| 0x508 | 1 | SWB_STAT_PLRTY_REG | SWB1 | | +| 0x50C | 1 | SWB_STAT_EDG_LVL_REG | SWB1 | | +| 0x510 | 1 | SWB_STAT_INT_EN_REG | SWB1 | | +| 0x514 | 1 | SWB_STAT_INT_STAT_REG | SWB1 | | +| 0x518 | 1 | SWB_STAT_INT_CLR_REG | SWB1 | | +| 0x51C | 1 | SEM_REG | SWB1 | | +| 0x520 | 8 | RSVD | SWB1 | | +| 0x540 | 1 | BMC_CTRL_REG | BMC | | +| 0x544 | 1 | BMC_STAT_REG | BMC | | +| 0x548 | 1 | BMC_STAT_PLRTY_REG | BMC | | +| 0x54C | 1 | BMC_STAT_EDG_LVL_REG | BMC | | +| 0x550 | 1 | BMC_STAT_INT_EN_REG | BMC | | +| 0x554 | 1 | BMC_STAT_INT_STAT_REG | BMC | | +| 0x558 | 1 | BMC_STAT_INT_CLR_REG | BMC | | +| 0x55C | 1 | SEM_REG | BMC | | +| 0x560 | 8 | RSVD | BMC | | +| 0x580 | 1 | RSVD | THRM | | +| 0x584 | 1 | THRM_STAT_REG | THRM | | +| 0x588 | 1 | THRM_STAT_PLRTY_REG | THRM | | +| 0x58C | 1 | THRM_STAT_EDG_LVL_REG | THRM | | +| 0x590 | 1 | THRM_STAT_INT_EN_REG | THRM | | +| 0x594 | 1 | THRM_STAT_INT_STAT_REG | THRM | | +| 0x598 | 1 | THRM_STAT_INT_CLR_REG | THRM | | +| 0x59C | 1 | SEM_REG | THRM | | +| 0x5A0 | 8 | RSVD | THRM | | +| 0x5C0 | 1 | USB_CTRL_REG | USB | | +| 0x5C4 | 1 | USB_STAT_REG | USB | | +| 0x5C8 | 1 | USB_STAT_PLRTY_REG | USB | | +| 0x5CC | 1 | USB_STAT_EDG_LVL_REG | USB | | +| 0x5D0 | 1 | USB_STAT_INT_EN_REG | USB | | +| 0x5D4 | 1 | USB_STAT_INT_STAT_REG | USB | | +| 0x5D8 | 1 | USB_STAT_INT_CLR_REG | USB | | +| 0x5DC | 1 | SEM_REG | USB | | +| 0x5E0 | 8 | RSVD | USB | | +| 0x600 | 1 | RSVD | BTN | | +| 0x604 | 1 | BTN_STAT_REG | BTN | | +| 0x608 | 1 | BTN_STAT_PLRTY_REG | BTN | | +| 0x60C | 1 | BTN_STAT_EDG_LVL_REG | BTN | | +| 0x610 | 1 | BTN_STAT_INT_EN_REG | BTN | | +| 0x614 | 1 | BTN_STAT_INT_STAT_REG | BTN | | +| 0x618 | 1 | BTN_STAT_INT_CLR_REG | BTN | | +| 0x61C | 1 | SEM_REG | BTN | | +| 0x620 | 8 | RSVD | BTN | | +| 0x640 | 1 | RSVD | LEAK | | +| 0x644 | 1 | LEAK_STAT_REG | LEAK | | +| 0x648 | 1 | LEAK_STAT_PLRTY_REG | LEAK | 648 | +| 0x64C | 1 | LEAK_STAT_EDG_LVL_REG | LEAK | | +| 0x650 | 1 | LEAK_STAT_INT_EN_REG | LEAK | 650 | +| 0x654 | 1 | LEAK_STAT_INT_STAT_REG | LEAK | | +| 0x658 | 1 | LEAK_STAT_INT_CLR_REG | LEAK | | +| 0x65C | 1 | SEM_REG | LEAK | | +| 0x660 | 8 | RSVD | LEAK | | +| 0x680 | 1 | NFC_CTRL_REG | NFC | | +| 0x684 | 1 | NFC_STAT_REG | NFC | | +| 0x688 | 1 | NFC_STAT_PLRTY_REG | NFC | | +| 0x68C | 1 | NFC_STAT_EDG_LVL_REG | NFC | | +| 0x690 | 1 | NFC_STAT_INT_EN_REG | NFC | | +| 0x694 | 1 | NFC_STAT_INT_STAT_REG | NFC | | +| 0x698 | 1 | NFC_STAT_INT_CLR_REG | NFC | | +| 0x69C | 1 | SEM_REG | NFC | | +| 0x6A0 | 8 | RSVD | NFC | | +| 0x6C0 | 1 | RSVD | Intrusion | | +| 0x6C4 | 1 | INTRD_STAT_REG | Intrusion | | +| 0x6C8 | 1 | INTRD_STAT_PLRTY_REG | Intrusion | | +| 0x6CC | 1 | INTRD_STAT_EDG_LVL_REG | Intrusion | | +| 0x6D0 | 1 | INTRD_STAT_INT_EN_REG | Intrusion | | +| 0x6D4 | 1 | INTRD_STAT_INT_STAT_REG | Intrusion | | +| 0x6D8 | 1 | INTRD_STAT_INT_CLR_REG | Intrusion | | +| 0x6DC | 1 | SEM_REG | Intrusion | | +| 0x6E0 | 8 | RSVD | Intrusion | | +| 0x700 | 1 | RSVD | Battery | | +| 0x704 | 1 | BTRY_STAT_REG | Battery | | +| 0x708 | 1 | BTRY_STAT_PLRTY_REG | Battery | | +| 0x70C | 1 | BTRY_STAT_EDG_LVL_REG | Battery | | +| 0x710 | 1 | BTRY_STAT_INT_EN_REG | Battery | | +| 0x714 | 1 | BTRY_STAT_INT_STAT_REG | Battery | | +| 0x718 | 1 | BTRY_STAT_INT_CLR_REG | Battery | | +| 0x71C | 1 | SEM_REG | Battery | | +| 0x720 | 8 | RSVD | Battery | | +| 0x740 | 32 | RSVD | RSVD | | +| 0x7C0 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x7C4 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x7C8 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x7CC | 1 | EN_ACCSS_PRTCTD_REG | Other Dev ctrl-stat-int | | +| 0x7D0 | 1 | UART_MUX_REG | Other Dev ctrl-stat-int | | +| 0x7D4 | 1 | I2C_MUX_RST_REG | Other Dev ctrl-stat-int | | +| 0x7D8 | 1 | CPU_INTR_CTRL_REG | Other Dev ctrl-stat-int | | +| 0x7DC | 1 | BMC_JTAG_CTRL_REG | Other Dev ctrl-stat-int | | +| 0x7E0 | 1 | SWB0_JTAG_CTRL_REG | Other Dev ctrl-stat-int | | +| 0x7E4 | 1 | SWB1_JTAG_CTRL_REG | Other Dev ctrl-stat-int | | +| 0x7E8 | 198 | RSVD | RSVD | | +| 0xB00 | 1 | FLSH_CTRL_REG | Flash Write Protect | | +| 0xB04 | 31 | RSVD | Flash Write Protect | | +| 0xB80 | 1 | LED_SYNC_REG | LED | | +| 0xB84 | 1 | LED_CONFIG_REG | LED | | +| 0xB88 | 1 | LED_CTRL_0_REG | LED | | +| 0xB8C | 1 | LED_CTRL_1_REG | LED | | +| 0xB90 | 1 | LED_CTRL_2_REG | LED | | +| 0xB94 | 1 | LED_CTRL_3_REG | LED | | +| 0xB98 | 1 | LED_CTRL_4_REG | LED | | +| 0xB9C | 1 | LED_CTRL_5_REG | LED | | +| 0xBA0 | 1 | RSVD | LED | | +| 0xBA4 | 1 | RSVD | LED | | +| 0xBA8 | 1 | RSVD | LED | | +| 0xBAC | 1 | RSVD | LED | | +| 0xBB0 | 1 | RSVD | LED | | +| 0xBB4 | 8 | RSVD | RSVD | | +| 0xBD4 | 1 | WDG_CTRL_REG | WDG Ctrl-Stat-int | | +| 0xBD8 | 1 | WDG_STAT_REG | WDG Ctrl-Stat-int | | +| 0xBDC | 1 | WDG_RST_REG | WDG Ctrl-Stat-int | | +| 0xBE0 | 8 | RSVD | RSVD | | +| 0xC00 | 1 | TND_CTRL_REG | Debug & Test | | +| 0xC04 | 1 | TND_STAT_REG | Debug & Test | | +| 0xC08 | 1 | TND_PWR_CTRL_REG | Debug & Test | | +| 0xC0C | 1 | TND_PWR_STAT_REG | Debug & Test | | +| 0xC10 | 1 | TND_CLK_CTRL_REG | Debug & Test | | +| 0xC14 | 1 | RSVD | Debug & Test | | +| 0xC18 | 1 | TND_PMC_GPIO_CTRL_REG | Debug & Test | | +| 0xC1C | 1 | TND_PMC_GPIO_STAT_REG | Debug & Test | | +| 0xC20 | 1 | TND_PMC_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC24 | 1 | TND_BMC_GPIO_CTRL_REG | Debug & Test | | +| 0xC28 | 1 | TND_BMC_GPIO_STAT_REG | Debug & Test | | +| 0xC2C | 1 | TND_BMC_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC30 | 1 | TND_SWB0_GPIO_CTRL_REG | Debug & Test | | +| 0xC34 | 1 | TND_SWB0_GPIO_STAT_REG | Debug & Test | | +| 0xC38 | 1 | TND_SWB0_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC3C | 1 | TND_SWB1_GPIO_CTRL_REG | Debug & Test | | +| 0xC40 | 1 | TND_SWB1_GPIO_STAT_REG | Debug & Test | | +| 0xC44 | 1 | TND_SWB1_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC48 | 1 | TND_ICB_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC4C | 1 | TND_ICB_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC50 | 1 | TND_ICB_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC54 | 79 | RSVD | Debug & Test | | +| 0xD90 | 1 | RST_CAUSE_REG | Reset Stat | | +| 0xD94 | 1 | RST_CAUSE_SWB_REG | Reset Stat SWB0 | For SWB 0 | +| 0xD98 | 1 | RST_CAUSE_SWB_REG | Reset Stat SWB1 | For SWB 1 | +| 0xD9C | 1 | RSVD | RSVD | | + +#### CB — Function 1 + +| Offset | DW | Register | Group | Comment | +|---|---|---|---|---| +| 0x000 | 1 | FPGA_REV_ID_REG | GEN & ID | MCB FPGA revision & Id register | +| 0x004 | 1 | RSVD | GEN & ID | | +| 0x008 | 1 | RSVD | GEN & ID | | +| 0x00C | 13 | RSVD | GEN & ID | | +| 0x040 | 1 | FUNC_CAP_0_REG | GEN & ID | number of interrupts for MSI vectors 0 to 3 | +| 0x044 | 1 | FUNC_CAP_1_REG | GEN & ID | number of interrupts for MSI vectors 4 to 7 | +| 0x048 | 1 | FUNC_CAP_2_REG | GEN & ID | number of interrupts for MSI vectors 8 to 11 | +| 0x04C | 1 | FUNC_CAP_3_REG | GEN & ID | number of interrupts for MSI vectors 12 to 15 | +| 0x050 | 1 | FUNC_CAP_4_REG | GEN & ID | number of interrupts for MSI vectors 16 to 19 | +| 0x054 | 1 | FUNC_CAP_5_REG | GEN & ID | number of interrupts for MSI vectors 20 to 23 | +| 0x058 | 1 | FUNC_CAP_6_REG | GEN & ID | number of interrupts for MSI vectors 24 to 27 | +| 0x05C | 1 | FUNC_CAP_7_REG | GEN & ID | number of interrupts for MSI vectors 28 to 31 | +| 0x060 | 1 | FUNC_CAP_8_REG | GEN & ID | | +| 0x064 | 7 | RSVD | GEN & ID | | +| 0x080 | 16 | RSVD | RSVD | | +| 0x0C0 | 1 | SCRTCH_0_REG | Scratchpad | Scratch Registers for SW use | +| 0x0C4 | 1 | SCRTCH_1_REG | Scratchpad | Scratch Registers for SW use | +| 0x0C8 | 1 | SCRTCH_2_REG | Scratchpad | Scratch Registers for SW use | +| 0x0CC | 1 | SCRTCH_3_REG | Scratchpad | Scratch Registers for SW use | +| 0x0D0 | 12 | RSVD | Scratchpad | 12 register reserved for scratch | +| 0x100 | 1 | DEV_MSI_0_PEND_REG | MSI INT | | +| 0x104 | 1 | RSVD | MSI INT | to extend DEV_MSI_PEND_REG | +| 0x108 | 1 | DEV_MSI_0_INT_EN_REG | MSI INT | | +| 0x10C | 1 | RSVD | RSVD | to extend DEV_MSI_INT_EN_REG | +| 0x110 | 1 | DEV_MSI_1_PEND_REG | MSI INT | For other MSI Ctrl registers or INT vector registers | +| 0x114 | 1 | RSVD | MSI INT | | +| 0x118 | 1 | DEV_MSI_1_INT_EN_REG | MSI INT | | +| 0x11C | 1 | RSVD | RSVD | | +| 0x120 | 1 | DEV_MSI_2_PEND_REG | MSI INT | | +| 0x124 | 1 | RSVD | MSI INT | | +| 0x128 | 1 | DEV_MSI_2_INT_EN_REG | MSI INT | | +| 0x12C | 1 | RSVD | MSI INT | | +| 0x130 | 1 | DEV_MSI_3_PEND_REG | MSI INT | | +| 0x134 | 1 | RSVD | MSI INT | | +| 0x138 | 1 | DEV_MSI_3_INT_EN_REG | MSI INT | | +| 0x13C | 1 | RSVD | MSI INT | | +| 0x140 | 1 | DEV_MSI_4_PEND_REG | MSI INT | | +| 0x144 | 1 | RSVD | MSI INT | | +| 0x148 | 1 | DEV_MSI_4_INT_EN_REG | MSI INT | | +| 0x14C | 1 | RSVD | MSI INT | | +| 0x150 | 1 | DEV_MSI_5_PEND_REG | MSI INT | | +| 0x154 | 1 | RSVD | MSI INT | | +| 0x158 | 1 | DEV_MSI_5_INT_EN_REG | MSI INT | | +| 0x15C | 1 | RSVD | MSI INT | | +| 0x160 | 1 | DEV_MSI_6_PEND_REG | MSI INT | | +| 0x164 | 1 | RSVD | MSI INT | | +| 0x168 | 1 | DEV_MSI_6_INT_EN_REG | MSI INT | | +| 0x16C | 117 | RSVD | RSVD | | +| 0x340 | 1 | FAN_CTRL_REG | FAN | | +| 0x344 | 1 | FAN_STAT_REG | FAN | | +| 0x348 | 1 | FAN_STAT_PLRTY_REG | FAN | | +| 0x34C | 1 | FAN_STAT_EDG_LVL_REG | FAN | | +| 0x350 | 1 | FAN_STAT_INT_EN_REG | FAN | 350 | +| 0x354 | 1 | FAN_STAT_INT_STAT_REG | FAN | | +| 0x358 | 1 | FAN_STAT_INT_CLR_REG | FAN | | +| 0x35C | 1 | SEM_REG | FAN | | +| 0x360 | 8 | RSVD | RSVD | | +| 0x380 | 1 | RTM_CTRL_REG | Retimer | | +| 0x384 | 1 | RTM_STAT_REG | Retimer | | +| 0x388 | 1 | RTM_STAT_PLRTY_REG | Retimer | | +| 0x38C | 1 | RTM_STAT_EDG_LVL_REG | Retimer | | +| 0x390 | 1 | RTM_STAT_INT_EN_REG | Retimer | | +| 0x394 | 1 | RTM_STAT_INT_STAT_REG | Retimer | | +| 0x398 | 1 | RTM_STAT_INT_CLR_REG | Retimer | | +| 0x39C | 1 | SEM_REG | Retimer | | +| 0x3A0 | 8 | RSVD | Retimer | | +| 0x3C0 | 1 | ETH_CTRLR_CTRL_REG | Ethernet Controller | | +| 0x3C4 | 1 | ETH_CTRLR_STAT_REG | Ethernet Controller | 3C4 | +| 0x3C8 | 1 | ETH_CTRLR_STAT_PLRTY_REG | Ethernet Controller | | +| 0x3CC | 1 | ETH_CTRLR_STAT_EDG_LVL_REG | Ethernet Controller | | +| 0x3D0 | 1 | ETH_CTRLR_STAT_INT_EN_REG | Ethernet Controller | | +| 0x3D4 | 1 | ETH_CTRLR_STAT_INT_STAT_REG | Ethernet Controller | | +| 0x3D8 | 1 | ETH_CTRLR_STAT_INT_CLR_REG | Ethernet Controller | | +| 0x3DC | 1 | SEM_REG | Ethernet Controller | | +| 0x3E0 | 8 | RSVD | Ethernet Controller | | +| 0x400 | 240 | RSVD | RSVD | | +| 0x7C0 | 1 | USRPRT_PWR_CTRL_REG | FE Power stat-ctrl | | +| 0x7C4 | 1 | USRPRT_PWR_STAT_REG | FE Power stat-ctrl | | +| 0x7C8 | 1 | USRPRT_PWR_STAT_PLRTY_REG | FE Power stat-ctrl | | +| 0x7CC | 1 | USRPRT_PWR_STAT_EDG_LVL_REG | FE Power stat-ctrl | | +| 0x7D0 | 1 | USRPRT_PWR_STAT_INT_EN_REG | FE Power stat-ctrl | | +| 0x7D4 | 1 | USRPRT_PWR_STAT_INT_STAT_REG | FE Power stat-ctrl | | +| 0x7D8 | 1 | USRPRT_PWR_STAT_INT_CLR_REG | FE Power stat-ctrl | | +| 0x7DC | 1 | SEM_REG | FE Power stat-ctrl | | +| 0x7E0 | 8 | RSVD | FE Power stat-ctrl | | +| 0x800 | 1 | USRPRT_CTRL_0_REG | FE stat-ctrl | | +| 0x804 | 1 | USRPRT_STAT_0_REG | FE stat-ctrl | | +| 0x808 | 1 | USRPRT_STAT_0_PLRTY_REG | FE stat-ctrl | | +| 0x80C | 1 | USRPRT_STAT_0_EDG_LVL_REG | FE stat-ctrl | | +| 0x810 | 1 | USRPRT_STAT_0_INT_EN_REG | FE stat-ctrl | | +| 0x814 | 1 | USRPRT_STAT_0_INT_STAT_REG | FE stat-ctrl | | +| 0x818 | 1 | USRPRT_STAT_0_INT_CLR_REG | FE stat-ctrl | | +| 0x81C | 1 | SEM_REG | FE stat-ctrl | | +| 0x820 | 8 | RSVD | FE stat-ctrl | | +| 0x840 | 1 | USRPRT_CTRL_1_REG | FE stat-ctrl | | +| 0x844 | 1 | USRPRT_STAT_1_REG | FE stat-ctrl | | +| 0x848 | 1 | USRPRT_STAT_1_PLRTY_REG | FE stat-ctrl | | +| 0x84C | 1 | USRPRT_STAT_1_EDG_LVL_REG | FE stat-ctrl | | +| 0x850 | 1 | USRPRT_STAT_1_INT_EN_REG | FE stat-ctrl | | +| 0x854 | 1 | USRPRT_STAT_1_INT_STAT_REG | FE stat-ctrl | | +| 0x858 | 1 | USRPRT_STAT_1_INT_CLR_REG | FE stat-ctrl | | +| 0x85C | 1 | SEM_REG | FE stat-ctrl | | +| 0x860 | 8 | RSVD | FE stat-ctrl | | +| 0x880 | 96 | RSVD | RSVD | | +| 0xA00 | 1 | PHY_CTRL_0_REG | PHY stat-ctrl | | +| 0xA04 | 1 | RSVD | PHY stat-ctrl | | +| 0xA08 | 1 | RSVD | PHY stat-ctrl | | +| 0xA0C | 1 | RSVD | PHY stat-ctrl | | +| 0xA10 | 1 | RSVD | PHY stat-ctrl | | +| 0xA14 | 1 | RSVD | PHY stat-ctrl | | +| 0xA18 | 1 | RSVD | PHY stat-ctrl | | +| 0xA1C | 1 | RSVD | PHY stat-ctrl | | +| 0xA20 | 8 | RSVD | PHY stat-ctrl | | +| 0xA40 | 16 | RSVD | RSVD | | + +#### CB — Function 2 + +| Offset | DW | Register | Group | Comment | +|---|---|---|---|---| +| 0x000 | 1 | FPGA_REV_ID_REG | GEN & ID | MCB FPGA revision & Id register | +| 0x004 | 1 | RSVD | GEN & ID | | +| 0x008 | 1 | RSVD | GEN & ID | | +| 0x00C | 13 | RSVD | GEN & ID | | +| 0x040 | 1 | FUNC_CAP_0_REG | GEN & ID | number of interrupts for MSI vectors 0 to 3 | +| 0x044 | 1 | FUNC_CAP_1_REG | GEN & ID | number of interrupts for MSI vectors 4 to 7 | +| 0x048 | 1 | FUNC_CAP_2_REG | GEN & ID | number of interrupts for MSI vectors 8 to 11 | +| 0x04C | 1 | FUNC_CAP_3_REG | GEN & ID | number of interrupts for MSI vectors 12 to 15 | +| 0x050 | 1 | FUNC_CAP_4_REG | GEN & ID | number of interrupts for MSI vectors 16 to 19 | +| 0x054 | 1 | FUNC_CAP_5_REG | GEN & ID | number of interrupts for MSI vectors 20 to 23 | +| 0x058 | 1 | FUNC_CAP_6_REG | GEN & ID | number of interrupts for MSI vectors 24 to 27 | +| 0x05C | 1 | FUNC_CAP_7_REG | GEN & ID | number of interrupts for MSI vectors 28 to 31 | +| 0x060 | 1 | FUNC_CAP_8_REG | GEN & ID | | +| 0x064 | 7 | RSVD | GEN & ID | | +| 0x080 | 16 | RSVD | RSVD | | +| 0x0C0 | 1 | SCRTCH_0_REG | Scratchpad | Scratch Registers for SW use | +| 0x0C4 | 1 | SCRTCH_1_REG | Scratchpad | Scratch Registers for SW use | +| 0x0C8 | 1 | SCRTCH_2_REG | Scratchpad | Scratch Registers for SW use | +| 0x0CC | 1 | SCRTCH_3_REG | Scratchpad | Scratch Registers for SW use | +| 0x0D0 | 12 | RSVD | Scratchpad | 12 register reserved for scratch | +| 0x100 | 1 | DEV_MSI_0_PEND_REG | MSI INT | | +| 0x104 | 1 | RSVD | MSI INT | to extend DEV_MSI_PEND_REG | +| 0x108 | 1 | DEV_MSI_0_INT_EN_REG | MSI INT | | +| 0x10C | 1 | RSVD | MSI INT | to extend DEV_MSI_INT_EN_REG | +| 0x110 | 124 | RSVD | MSI INT | For other MSI Ctrl registers or INT vector registers | +| 0x300 | 1 | SPI_CMD_STAT_REG | SPI-flash | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x304 | 1 | SPI_ADD_REG | SPI-flash | Word address | +| 0x308 | 1 | SPI_WR_DATA_REG | SPI-flash | 32-bit data to be written in Configuration Flash Memory | +| 0x30C | 1 | SPI_RD_DATA_REG | SPI-flash | Holds read data form configuration Flash memory. | +| 0x310 | 1 | SPI_RST_REG | SPI-flash | Reset FPGA SPI module. | +| 0x314 | 1 | SEM_REG | SPI-flash | Semaphore Register | +| 0x318 | 10 | RSVD | RSVD | | +| 0x340 | 1 | SPI_CMD_STAT_REG | VSPI-Flash-PMC | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x344 | 1 | SPI_ADD_REG | VSPI-Flash-PMC | Word address | +| 0x348 | 1 | SPI_WR_DATA_REG | VSPI-Flash-PMC | 32-bit data to be written in Configuration Flash Memory | +| 0x34C | 1 | SPI_RD_DATA_REG | VSPI-Flash-PMC | Holds read data form configuration Flash memory. | +| 0x350 | 1 | SPI_RST_REG | VSPI-Flash-PMC | Reset VSPI-Flash module. | +| 0x354 | 11 | RSVD | RSVD | | +| 0x380 | 1 | SPI_CMD_STAT_REG | VSPI-Flash-ICB | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x384 | 1 | SPI_ADD_REG | VSPI-Flash-ICB | Word address | +| 0x388 | 1 | SPI_WR_DATA_REG | VSPI-Flash-ICB | 32-bit data to be written in Configuration Flash Memory | +| 0x38C | 1 | SPI_RD_DATA_REG | VSPI-Flash-ICB | Holds read data form configuration Flash memory. | +| 0x390 | 1 | SPI_RST_REG | VSPI-Flash-ICB | Reset VSPI-Flash module. | +| 0x394 | 11 | RSVD | RSVD | | +| 0x3C0 | 1 | SPI_CMD_STAT_REG | VSPI-Flash-SWB0 | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x3C4 | 1 | SPI_ADD_REG | VSPI-Flash-SWB0 | Word address | +| 0x3C8 | 1 | SPI_WR_DATA_REG | VSPI-Flash-SWB0 | 32-bit data to be written in Configuration Flash Memory | +| 0x3CC | 1 | SPI_RD_DATA_REG | VSPI-Flash-SWB0 | Holds read data form configuration Flash memory. | +| 0x3D0 | 1 | SPI_RST_REG | VSPI-Flash-SWB0 | Reset VSPI-Flash module. | +| 0x3D4 | 11 | RSVD | RSVD | | +| 0x400 | 1 | SPI_CMD_STAT_REG | VSPI-Flash-SWB1 | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x404 | 1 | SPI_ADD_REG | VSPI-Flash-SWB1 | Word address | +| 0x408 | 1 | SPI_WR_DATA_REG | VSPI-Flash-SWB1 | 32-bit data to be written in Configuration Flash Memory | +| 0x40C | 1 | SPI_RD_DATA_REG | VSPI-Flash-SWB1 | Holds read data form configuration Flash memory. | +| 0x410 | 1 | SPI_RST_REG | VSPI-Flash-SWB1 | Reset VSPI-Flash module. | +| 0x414 | 11 | RSVD | RSVD | | +| 0x440 | 128 | RSVD | RSVD | Reserved space for more VSPI-Flash channels | +| 0x640 | 1 | SPI_CMD_STAT_REG | VSPI-PMC | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x644 | 1 | SPI_ADD_REG | VSPI-PMC | Word address | +| 0x648 | 1 | SPI_WR_DATA_REG | VSPI-PMC | 32-bit data to be written in Configuration Flash Memory | +| 0x64C | 1 | SPI_RD_DATA_REG | VSPI-PMC | Holds read data form configuration Flash memory. | +| 0x650 | 1 | SPI_RST_REG | VSPI-PMC | Reset VSPI module. | +| 0x654 | 11 | RSVD | RSVD | | +| 0x680 | 1 | SPI_CMD_STAT_REG | VSPI-ICB | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x684 | 1 | SPI_ADD_REG | VSPI-ICB | Word address | +| 0x688 | 1 | SPI_WR_DATA_REG | VSPI-ICB | 32-bit data to be written in Configuration Flash Memory | +| 0x68C | 1 | SPI_RD_DATA_REG | VSPI-ICB | Holds read data form configuration Flash memory. | +| 0x690 | 1 | SPI_RST_REG | VSPI-ICB | Reset VSPI module. | +| 0x694 | 11 | RSVD | RSVD | | +| 0x6C0 | 1 | SPI_CMD_STAT_REG | VSPI-SWB0 | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x6C4 | 1 | SPI_ADD_REG | VSPI-SWB0 | Word address | +| 0x6C8 | 1 | SPI_WR_DATA_REG | VSPI-SWB0 | 32-bit data to be written in Configuration Flash Memory | +| 0x6CC | 1 | SPI_RD_DATA_REG | VSPI-SWB0 | Holds read data form configuration Flash memory. | +| 0x6D0 | 1 | SPI_RST_REG | VSPI-SWB0 | Reset VSPI module. | +| 0x6D4 | 11 | RSVD | RSVD | | +| 0x700 | 1 | SPI_CMD_STAT_REG | VSPI-SWB1 | Ready, NEW_CMD, Read, Write, Erase, Read Silicon Id, Illegal Erase, Illegal Write | +| 0x704 | 1 | SPI_ADD_REG | VSPI-SWB1 | Word address | +| 0x708 | 1 | SPI_WR_DATA_REG | VSPI-SWB1 | 32-bit data to be written in Configuration Flash Memory | +| 0x70C | 1 | SPI_RD_DATA_REG | VSPI-SWB1 | Holds read data form configuration Flash memory. | +| 0x710 | 1 | SPI_RST_REG | VSPI-SWB1 | Reset VSPI module. | +| 0x714 | 11 | RSVD | RSVD | | +| 0x740 | 64 | RSVD | RSVD | Reserved space for more VSPI channels | +| 0x840 | 1 | GEN_SPI_RD_DATA_REG | GEN-SPI-SWB0 | Generic SPI interface to SWB0, alternate route TH6 SPI flash | +| 0x844 | 1 | GEN_SPI_WR_DATA_REG | GEN-SPI-SWB0 | | +| 0x848 | 1 | GEN_SPI_STAT_REG | GEN-SPI-SWB0 | | +| 0x84C | 1 | GEN_SPI_CTRL_REG | GEN-SPI-SWB0 | | +| 0x850 | 1 | GEN_SPI_CFG_CTRL_REG | GEN-SPI-SWB0 | | +| 0x854 | 1 | GEN_SPI_SLV_REG | GEN-SPI-SWB0 | | +| 0x858 | 1 | SPI_RST_REG | GEN-SPI-SWB0 | | +| 0x85C | 1 | SEM_REG | GEN-SPI-SWB0 | | +| 0x860 | 8 | RSVD | GEN-SPI-SWB0 | | +| 0x880 | 1 | GEN_SPI_RD_DATA_REG | GEN-SPI-SWB1 | Generic SPI interface to SWB1, alternate route TH6 SPI flash | +| 0x884 | 1 | GEN_SPI_WR_DATA_REG | GEN-SPI-SWB1 | | +| 0x888 | 1 | GEN_SPI_STAT_REG | GEN-SPI-SWB1 | | +| 0x88C | 1 | GEN_SPI_CTRL_REG | GEN-SPI-SWB1 | | +| 0x890 | 1 | GEN_SPI_CFG_CTRL_REG | GEN-SPI-SWB1 | | +| 0x894 | 1 | GEN_SPI_SLV_REG | GEN-SPI-SWB1 | | +| 0x898 | 1 | SPI_RST_REG | GEN-SPI-SWB1 | | +| 0x89C | 1 | SEM_REG | GEN-SPI-SWB1 | | +| 0x8A0 | 8 | RSVD | GEN-SPI-SWB1 | | +| 0x8C0 | 64 | RSVD | RSVD | Reserved space for more SPI channels | +| 0x9C0 | 1 | MDIO_STAT_CMD_REG | MDIO-CH0 | To Retimer | +| 0x9C4 | 1 | MDIO_CTRL_REG | MDIO-CH0 | | +| 0x9C8 | 1 | MDIO_STK_CTRL_REG | MDIO-CH0 | | +| 0x9CC | 1 | MDIO_STK_ADDR_CONF_REG | MDIO-CH0 | | +| 0x9D0 | 1 | MDIO_STK_STAT_REG | MDIO-CH0 | | +| 0x9D4 | 1 | MDIO_STK_RAM_DATA_REG | MDIO-CH0 | | +| 0x9D8 | 1 | MDIO_STK_RAM_ADDR_REG | MDIO-CH0 | | +| 0x9DC | 1 | MDIO_STAT_INT_REG | MDIO-CH0 | | +| 0x9E0 | 128 | RSVD | RSVD | | + +#### CB — Function 3 + +| Offset | DW | Register | Group | Comment | +|---|---|---|---|---| +| 0x000 | 1 | FPGA_REV_ID_REG | GEN & ID | MCB FPGA revision & Id register | +| 0x004 | 1 | RSVD | GEN & ID | | +| 0x008 | 1 | RSVD | GEN & ID | | +| 0x00C | 13 | RSVD | GEN & ID | | +| 0x040 | 1 | FUNC_CAP_0_REG | GEN & ID | number of interrupts for MSI vectors 0 to 3 | +| 0x044 | 1 | FUNC_CAP_1_REG | GEN & ID | number of interrupts for MSI vectors 4 to 7 | +| 0x048 | 1 | FUNC_CAP_2_REG | GEN & ID | number of interrupts for MSI vectors 8 to 11 | +| 0x04C | 1 | FUNC_CAP_3_REG | GEN & ID | number of interrupts for MSI vectors 12 to 15 | +| 0x050 | 1 | FUNC_CAP_4_REG | GEN & ID | number of interrupts for MSI vectors 16 to 19 | +| 0x054 | 1 | FUNC_CAP_5_REG | GEN & ID | number of interrupts for MSI vectors 20 to 23 | +| 0x058 | 1 | FUNC_CAP_6_REG | GEN & ID | number of interrupts for MSI vectors 24 to 27 | +| 0x05C | 1 | FUNC_CAP_7_REG | GEN & ID | number of interrupts for MSI vectors 28 to 31 | +| 0x060 | 1 | FUNC_CAP_8_REG | GEN & ID | | +| 0x064 | 7 | RSVD | GEN & ID | | +| 0x080 | 16 | RSVD | RSVD | | +| 0x0C0 | 1 | SCRTCH_0_REG | Scratchpad | Scratch Registers for SW use | +| 0x0C4 | 1 | SCRTCH_1_REG | Scratchpad | Scratch Registers for SW use | +| 0x0C8 | 1 | SCRTCH_2_REG | Scratchpad | Scratch Registers for SW use | +| 0x0CC | 1 | SCRTCH_3_REG | Scratchpad | Scratch Registers for SW use | +| 0x0D0 | 12 | RSVD | Scratchpad | 12 register reserved for scratch | +| 0x100 | 1 | DEV_MSI_0_PEND_REG | MSI INT | | +| 0x104 | 1 | RSVD | MSI INT | to extend DEV_MSI_PEND_REG | +| 0x108 | 1 | DEV_MSI_0_INT_EN_REG | MSI INT | | +| 0x10C | 1 | RSVD | MSI INT | to extend DEV_MSI_INT_EN_REG | +| 0x110 | 124 | RSVD | MSI INT | For other MSI Ctrl registers or INT vector registers | +| 0x300 | 1 | I2C_PRSCL_LO_REG | I2C-Ch0 | SWB_0 1) M0 - 4ch I2C MUX TCA9546 (0xE8/0xE9) 2) M0.C0 Temp Sensor TPM432 (0x98/0x99) 3) M0.C1 Temp Sensor TPM432 (0x98/0x99) 4) M0.C2 Temp Sensor TPM432 (0x98/0x99) | +| 0x304 | 1 | I2C_PRSCL_HI_REG | I2C-Ch0 | | +| 0x308 | 1 | I2C_CTRL_REG | I2C-Ch0 | | +| 0x30C | 0 | I2C_TX_REG | I2C-Ch0 | | +| 0x30C | 1 | I2C_RX_REG | I2C-Ch0 | | +| 0x310 | 0 | I2C_CMD_REG | I2C-Ch0 | | +| 0x310 | 1 | I2C_STAT_REG | I2C-Ch0 | | +| 0x314 | 1 | I2C_MUX_SEL_REG | I2C-Ch0 | | +| 0x318 | 1 | I2C_RST_REG | I2C-Ch0 | | +| 0x31C | 1 | SEM_REG | I2C-Ch0 | | +| 0x320 | 1 | I2C_PRSCL_LO_REG | I2C-Ch1 | SWB_1 1) M0 - 4ch I2C MUX TCA9546 (0xE8/0xE9) 2) M0.C0 Temp Sensor TPM432 (0x98/0x99) 3) M0.C1 Temp Sensor TPM432 (0x98/0x99) 4) M0.C2 Temp Sensor TPM432 (0x98/0x99) | +| 0x324 | 1 | I2C_PRSCL_HI_REG | I2C-Ch1 | | +| 0x328 | 1 | I2C_CTRL_REG | I2C-Ch1 | | +| 0x32C | 0 | I2C_TX_REG | I2C-Ch1 | | +| 0x32C | 1 | I2C_RX_REG | I2C-Ch1 | | +| 0x330 | 0 | I2C_CMD_REG | I2C-Ch1 | | +| 0x330 | 1 | I2C_STAT_REG | I2C-Ch1 | | +| 0x334 | 1 | I2C_MUX_SEL_REG | I2C-Ch1 | | +| 0x338 | 1 | I2C_RST_REG | I2C-Ch1 | | +| 0x33C | 1 | SEM_REG | I2C-Ch1 | | +| 0x340 | 1 | I2C_PRSCL_LO_REG | I2C-Ch2 | SWB_0 1) SWB_FPGA - FPGA (0x80/0x81) 2) IO Exp - PCA9555 (0x48/0x49) | +| 0x344 | 1 | I2C_PRSCL_HI_REG | I2C-Ch2 | | +| 0x348 | 1 | I2C_CTRL_REG | I2C-Ch2 | | +| 0x34C | 0 | I2C_TX_REG | I2C-Ch2 | | +| 0x34C | 1 | I2C_RX_REG | I2C-Ch2 | | +| 0x350 | 0 | I2C_CMD_REG | I2C-Ch2 | | +| 0x350 | 1 | I2C_STAT_REG | I2C-Ch2 | | +| 0x354 | 1 | I2C_MUX_SEL_REG | I2C-Ch2 | | +| 0x358 | 1 | I2C_RST_REG | I2C-Ch2 | | +| 0x35C | 1 | SEM_REG | I2C-Ch2 | | +| 0x360 | 1 | I2C_PRSCL_LO_REG | I2C-Ch3 | SWB_1 1) SWB_FPGA - FPGA (0x80/0x81) 2) IO Exp - PCA9555 (0x48/0x49) | +| 0x364 | 1 | I2C_PRSCL_HI_REG | I2C-Ch3 | | +| 0x368 | 1 | I2C_CTRL_REG | I2C-Ch3 | | +| 0x36C | 0 | I2C_TX_REG | I2C-Ch3 | | +| 0x36C | 1 | I2C_RX_REG | I2C-Ch3 | | +| 0x370 | 0 | I2C_CMD_REG | I2C-Ch3 | | +| 0x370 | 1 | I2C_STAT_REG | I2C-Ch3 | | +| 0x374 | 1 | I2C_MUX_SEL_REG | I2C-Ch3 | | +| 0x378 | 1 | I2C_RST_REG | I2C-Ch3 | | +| 0x37C | 1 | SEM_REG | I2C-Ch3 | | +| 0x380 | 1 | I2C_PRSCL_LO_REG | I2C-Ch4 | SWB_0 1) M1 4ch I2C MUX TCA9546 (0xE8/0xE9) 2) M1.C0 Clk GEN - SI5363A (0xB0/0xB1) Clk GEN - SI5363A (0xB2/0xB3) Tray Catridge - EEPROM (0xA0/0xA1) 3) M1.C1 Clk GEN - SI5363A (0xB4/0xB5) Clk GEN - SI5363A (0xB6/0xB7) Clk GEN - SI5363A (0xB8/0xB9) Tray Catridge - EEPROM (0xA0/0xA1) 4) M1.C2 SWB EEPROM (0xA0/0xA1) | +| 0x384 | 1 | I2C_PRSCL_HI_REG | I2C-Ch4 | | +| 0x388 | 1 | I2C_CTRL_REG | I2C-Ch4 | | +| 0x38C | 0 | I2C_TX_REG | I2C-Ch4 | | +| 0x38C | 1 | I2C_RX_REG | I2C-Ch4 | | +| 0x390 | 0 | I2C_CMD_REG | I2C-Ch4 | | +| 0x390 | 1 | I2C_STAT_REG | I2C-Ch4 | | +| 0x394 | 1 | I2C_MUX_SEL_REG | I2C-Ch4 | | +| 0x398 | 1 | I2C_RST_REG | I2C-Ch4 | | +| 0x39C | 1 | SEM_REG | I2C-Ch4 | | +| 0x3A0 | 1 | I2C_PRSCL_LO_REG | I2C-Ch5 | SWB_1 1) M1 4ch I2C MUX TCA9546 (0xE8/0xE9) 2) M1.C0 Clk GEN - SI5363A (0xB0/0xB1) Clk GEN - SI5363A (0xB2/0xB3) Tray Catridge - EEPROM (0xA0/0xA1) 3) M1.C1 Clk GEN - SI5363A (0xB4/0xB5) Clk GEN - SI5363A (0xB6/0xB7) Clk GEN - SI5363A (0xB8/0xB9) Tray Catridge - EEPROM (0xA0/0xA1) 4) M1.C2 SWB EEPROM (0xA0/0xA1) | +| 0x3A4 | 1 | I2C_PRSCL_HI_REG | I2C-Ch5 | | +| 0x3A8 | 1 | I2C_CTRL_REG | I2C-Ch5 | | +| 0x3AC | 0 | I2C_TX_REG | I2C-Ch5 | | +| 0x3AC | 1 | I2C_RX_REG | I2C-Ch5 | | +| 0x3B0 | 0 | I2C_CMD_REG | I2C-Ch5 | | +| 0x3B0 | 1 | I2C_STAT_REG | I2C-Ch5 | | +| 0x3B4 | 1 | I2C_MUX_SEL_REG | I2C-Ch5 | | +| 0x3B8 | 1 | I2C_RST_REG | I2C-Ch5 | | +| 0x3BC | 1 | SEM_REG | I2C-Ch5 | | +| 0x3C0 | 1 | I2C_PRSCL_LO_REG | I2C-Ch6 | SWB_0 1) VRM - M29816 (0x40/0x41) 2) VRM - M2985B (0x42/0x43) 3) VRM - M2985B (0x44/0x45) 4) VRM - M2985B (0x46/0x47) 5) VRM - M2985B (0x48/0x49) | +| 0x3C4 | 1 | I2C_PRSCL_HI_REG | I2C-Ch6 | | +| 0x3C8 | 1 | I2C_CTRL_REG | I2C-Ch6 | | +| 0x3CC | 0 | I2C_TX_REG | I2C-Ch6 | | +| 0x3CC | 1 | I2C_RX_REG | I2C-Ch6 | | +| 0x3D0 | 0 | I2C_CMD_REG | I2C-Ch6 | | +| 0x3D0 | 1 | I2C_STAT_REG | I2C-Ch6 | | +| 0x3D4 | 1 | I2C_MUX_SEL_REG | I2C-Ch6 | | +| 0x3D8 | 1 | I2C_RST_REG | I2C-Ch6 | | +| 0x3DC | 1 | SEM_REG | I2C-Ch6 | | +| 0x3E0 | 1 | I2C_PRSCL_LO_REG | I2C-Ch7 | SWB_1 1) VRM - M29816 (0x40/0x41) 2) VRM - M2985B (0x42/0x43) 3) VRM - M2985B (0x44/0x45) 4) VRM - M2985B (0x46/0x47) 5) VRM - M2985B (0x48/0x49) | +| 0x3E4 | 1 | I2C_PRSCL_HI_REG | I2C-Ch7 | | +| 0x3E8 | 1 | I2C_CTRL_REG | I2C-Ch7 | | +| 0x3EC | 0 | I2C_TX_REG | I2C-Ch7 | | +| 0x3EC | 1 | I2C_RX_REG | I2C-Ch7 | | +| 0x3F0 | 0 | I2C_CMD_REG | I2C-Ch7 | | +| 0x3F0 | 1 | I2C_STAT_REG | I2C-Ch7 | | +| 0x3F4 | 1 | I2C_MUX_SEL_REG | I2C-Ch7 | | +| 0x3F8 | 1 | I2C_RST_REG | I2C-Ch7 | | +| 0x3FC | 1 | SEM_REG | I2C-Ch7 | | +| 0x400 | 1 | I2C_PRSCL_LO_REG | I2C-Ch8 | SWB_0 1) VRM - M2985B (0x4A/0x4B) 2) VRM - M2985B (0x4C/0x4D) 3) VRM - M2985B (0x4E/0x4F) 4) VRM - M2985B (0x50/0x51) 5) VRM - M2985B (0x52/0x53) | +| 0x404 | 1 | I2C_PRSCL_HI_REG | I2C-Ch8 | | +| 0x408 | 1 | I2C_CTRL_REG | I2C-Ch8 | | +| 0x40C | 0 | I2C_TX_REG | I2C-Ch8 | | +| 0x40C | 1 | I2C_RX_REG | I2C-Ch8 | | +| 0x410 | 0 | I2C_CMD_REG | I2C-Ch8 | | +| 0x410 | 1 | I2C_STAT_REG | I2C-Ch8 | | +| 0x414 | 1 | I2C_MUX_SEL_REG | I2C-Ch8 | | +| 0x418 | 1 | I2C_RST_REG | I2C-Ch8 | | +| 0x41C | 1 | SEM_REG | I2C-Ch8 | | +| 0x420 | 1 | I2C_PRSCL_LO_REG | I2C-Ch9 | SWB_1 1) VRM - M2985B (0x4A/0x4B) 2) VRM - M2985B (0x4C/0x4D) 3) VRM - M2985B (0x4E/0x4F) 4) VRM - M2985B (0x50/0x51) 5) VRM - M2985B (0x52/0x53) | +| 0x424 | 1 | I2C_PRSCL_HI_REG | I2C-Ch9 | | +| 0x428 | 1 | I2C_CTRL_REG | I2C-Ch9 | | +| 0x42C | 0 | I2C_TX_REG | I2C-Ch9 | | +| 0x42C | 1 | I2C_RX_REG | I2C-Ch9 | | +| 0x430 | 0 | I2C_CMD_REG | I2C-Ch9 | | +| 0x430 | 1 | I2C_STAT_REG | I2C-Ch9 | | +| 0x434 | 1 | I2C_MUX_SEL_REG | I2C-Ch9 | | +| 0x438 | 1 | I2C_RST_REG | I2C-Ch9 | | +| 0x43C | 1 | SEM_REG | I2C-Ch9 | | +| 0x440 | 1 | I2C_PRSCL_LO_REG | I2C-Ch10 | 1) M0 2ch I2C MUX - TCA9543 (0xE1/0xE0) 2) M0.C0 Clk Buf - 9DBL0452 (0xD6/0xD7) M0.C0 Clk Buf - 9DBL0452 (0xDA/0xDB) 3) M1.C1 Fan Ctrl - MAX31790 (0x40/0x41) Temp Sensor - TMP75 (0x90/0x91) Temp Sensor - TMP75 (0x92/0x93) Temp Sensor - TM432 (0x98/0x99) | +| 0x444 | 1 | I2C_PRSCL_HI_REG | I2C-Ch10 | | +| 0x448 | 1 | I2C_CTRL_REG | I2C-Ch10 | | +| 0x44C | 0 | I2C_TX_REG | I2C-Ch10 | | +| 0x44C | 1 | I2C_RX_REG | I2C-Ch10 | | +| 0x450 | 0 | I2C_CMD_REG | I2C-Ch10 | | +| 0x450 | 1 | I2C_STAT_REG | I2C-Ch10 | | +| 0x454 | 1 | I2C_MUX_SEL_REG | I2C-Ch10 | | +| 0x458 | 1 | I2C_RST_REG | I2C-Ch10 | | +| 0x45C | 1 | SEM_REG | I2C-Ch10 | | +| 0x460 | 1 | I2C_PRSCL_LO_REG | I2C-Ch11 | 1) Fan Ctrl - MAX31790 (0x40/0x41) | +| 0x464 | 1 | I2C_PRSCL_HI_REG | I2C-Ch11 | | +| 0x468 | 1 | I2C_CTRL_REG | I2C-Ch11 | | +| 0x46C | 0 | I2C_TX_REG | I2C-Ch11 | | +| 0x46C | 1 | I2C_RX_REG | I2C-Ch11 | | +| 0x470 | 0 | I2C_CMD_REG | I2C-Ch11 | | +| 0x470 | 1 | I2C_STAT_REG | I2C-Ch11 | | +| 0x474 | 1 | I2C_MUX_SEL_REG | I2C-Ch11 | | +| 0x478 | 1 | I2C_RST_REG | I2C-Ch11 | | +| 0x47C | 1 | SEM_REG | I2C-Ch11 | | +| 0x480 | 1 | I2C_PRSCL_LO_REG | I2C-Ch12 | 1) ADC leakage - ADC128D818 (0x3E/0x3F) | +| 0x484 | 1 | I2C_PRSCL_HI_REG | I2C-Ch12 | | +| 0x488 | 1 | I2C_CTRL_REG | I2C-Ch12 | | +| 0x48C | 0 | I2C_TX_REG | I2C-Ch12 | | +| 0x48C | 1 | I2C_RX_REG | I2C-Ch12 | | +| 0x490 | 0 | I2C_CMD_REG | I2C-Ch12 | | +| 0x490 | 1 | I2C_STAT_REG | I2C-Ch12 | | +| 0x494 | 1 | I2C_MUX_SEL_REG | I2C-Ch12 | | +| 0x498 | 1 | I2C_RST_REG | I2C-Ch12 | | +| 0x49C | 1 | SEM_REG | I2C-Ch12 | | +| 0x4A0 | 1 | I2C_PRSCL_LO_REG | I2C-Ch13 | 1) NFC SM-MFAD4-C02 (0x50/0x51) | +| 0x4A4 | 1 | I2C_PRSCL_HI_REG | I2C-Ch13 | | +| 0x4A8 | 1 | I2C_CTRL_REG | I2C-Ch13 | | +| 0x4AC | 0 | I2C_TX_REG | I2C-Ch13 | | +| 0x4AC | 1 | I2C_RX_REG | I2C-Ch13 | | +| 0x4B0 | 0 | I2C_CMD_REG | I2C-Ch13 | | +| 0x4B0 | 1 | I2C_STAT_REG | I2C-Ch13 | | +| 0x4B4 | 1 | I2C_MUX_SEL_REG | I2C-Ch13 | | +| 0x4B8 | 1 | I2C_RST_REG | I2C-Ch13 | | +| 0x4BC | 1 | SEM_REG | I2C-Ch13 | | +| 0x4C0 | 1 | I2C_PRSCL_LO_REG | I2C-Ch14 | 1) M1 2ch I2C MUX - TCA9543 (0xE1/0xE0) 2) M1.C0 QSFP28.P1 Xcvr (0xA1/0xA0) 3) M1.C1 QSFP28.P2 Xcvr (0xA1/0xA0) | +| 0x4C4 | 1 | I2C_PRSCL_HI_REG | I2C-Ch14 | | +| 0x4C8 | 1 | I2C_CTRL_REG | I2C-Ch14 | | +| 0x4CC | 0 | I2C_TX_REG | I2C-Ch14 | | +| 0x4CC | 1 | I2C_RX_REG | I2C-Ch14 | | +| 0x4D0 | 0 | I2C_CMD_REG | I2C-Ch14 | | +| 0x4D0 | 1 | I2C_STAT_REG | I2C-Ch14 | | +| 0x4D4 | 1 | I2C_MUX_SEL_REG | I2C-Ch14 | | +| 0x4D8 | 1 | I2C_RST_REG | I2C-Ch14 | | +| 0x4DC | 1 | SEM_REG | I2C-Ch14 | | +| 0x4E0 | 1 | I2C_PRSCL_LO_REG | I2C-Ch15 | 1) Fan1 EFUSE - STEF48H28 (0x20/0x21) 2) Fan2 EFUSE - STEF48H28 (0x22/0x23) 3) Fan3 EFUSE - STEF48H28 (0x80/0x81) | +| 0x4E4 | 1 | I2C_PRSCL_HI_REG | I2C-Ch15 | | +| 0x4E8 | 1 | I2C_CTRL_REG | I2C-Ch15 | | +| 0x4EC | 0 | I2C_TX_REG | I2C-Ch15 | | +| 0x4EC | 1 | I2C_RX_REG | I2C-Ch15 | | +| 0x4F0 | 0 | I2C_CMD_REG | I2C-Ch15 | | +| 0x4F0 | 1 | I2C_STAT_REG | I2C-Ch15 | | +| 0x4F4 | 1 | I2C_MUX_SEL_REG | I2C-Ch15 | | +| 0x4F8 | 1 | I2C_RST_REG | I2C-Ch15 | | +| 0x4FC | 1 | SEM_REG | I2C-Ch15 | | +| 0x500 | 1 | I2C_PRSCL_LO_REG | I2C-Ch16 | 1) 1G PHY - I210 Ethernet Controller (0x92/0x93) | +| 0x504 | 1 | I2C_PRSCL_HI_REG | I2C-Ch16 | | +| 0x508 | 1 | I2C_CTRL_REG | I2C-Ch16 | | +| 0x50C | 0 | I2C_TX_REG | I2C-Ch16 | | +| 0x50C | 1 | I2C_RX_REG | I2C-Ch16 | | +| 0x510 | 0 | I2C_CMD_REG | I2C-Ch16 | | +| 0x510 | 1 | I2C_STAT_REG | I2C-Ch16 | | +| 0x514 | 1 | I2C_MUX_SEL_REG | I2C-Ch16 | | +| 0x518 | 1 | I2C_RST_REG | I2C-Ch16 | | +| 0x51C | 1 | SEM_REG | I2C-Ch16 | | +| 0x520 | 1 | I2C_PRSCL_LO_REG | I2C-Ch17 | 1) Chassis EEPROM (0x50/0x51/0x52/0x53) 2) Diag EEPROM (0x57) 3) MGIN CHIP1- (0xB8/0xB9) MGIN CHIP2- (0xBC/0xBD) MGIN CHIP3- (0xC4/0xC5) MGIN CHIP4- (0xC8/0xC9) | +| 0x524 | 1 | I2C_PRSCL_HI_REG | I2C-Ch17 | | +| 0x528 | 1 | I2C_CTRL_REG | I2C-Ch17 | | +| 0x52C | 0 | I2C_TX_REG | I2C-Ch17 | | +| 0x52C | 1 | I2C_RX_REG | I2C-Ch17 | | +| 0x530 | 0 | I2C_CMD_REG | I2C-Ch17 | | +| 0x530 | 1 | I2C_STAT_REG | I2C-Ch17 | | +| 0x534 | 1 | I2C_MUX_SEL_REG | I2C-Ch17 | | +| 0x538 | 1 | I2C_RST_REG | I2C-Ch17 | | +| 0x53C | 1 | SEM_REG | I2C-Ch17 | | +| 0x540 | 144 | RSVD | RSVD | | +| 0x780 | 1 | I2C_PRSCL_LO_REG | VI2C-ICB-Ch0 | Mapped to ICBX_X VI2C_DEV_ID 8'h21 | +| 0x784 | 1 | I2C_PRSCL_HI_REG | VI2C-ICB-Ch0 | 1) PDB Fan Controller | +| 0x788 | 1 | I2C_CTRL_REG | VI2C-ICB-Ch0 | | +| 0x78C | 0 | I2C_TX_REG | VI2C-ICB-Ch0 | | +| 0x78C | 1 | I2C_RX_REG | VI2C-ICB-Ch0 | | +| 0x790 | 0 | I2C_CMD_REG | VI2C-ICB-Ch0 | | +| 0x790 | 1 | I2C_STAT_REG | VI2C-ICB-Ch0 | | +| 0x794 | 1 | I2C_MUX_SEL_REG | VI2C-ICB-Ch0 | | +| 0x798 | 1 | I2C_RST_REG | VI2C-ICB-Ch0 | | +| 0x79C | 1 | RSVD | VI2C-ICB-Ch0 | | +| 0x7A0 | 1 | I2C_PRSCL_LO_REG | VI2C-ICB-Ch1 | Mapped to ICBX_X VI2C_DEV_ID 8'h23 | +| 0x7A4 | 1 | I2C_PRSCL_HI_REG | VI2C-ICB-Ch1 | 1) PDB EEPROM | +| 0x7A8 | 1 | I2C_CTRL_REG | VI2C-ICB-Ch1 | | +| 0x7AC | 0 | I2C_TX_REG | VI2C-ICB-Ch1 | | +| 0x7AC | 1 | I2C_RX_REG | VI2C-ICB-Ch1 | | +| 0x7B0 | 0 | I2C_CMD_REG | VI2C-ICB-Ch1 | | +| 0x7B0 | 1 | I2C_STAT_REG | VI2C-ICB-Ch1 | | +| 0x7B4 | 1 | I2C_MUX_SEL_REG | VI2C-ICB-Ch1 | | +| 0x7B8 | 1 | I2C_RST_REG | VI2C-ICB-Ch1 | | +| 0x7BC | 1 | RSVD | VI2C-ICB-Ch1 | | +| 0x7C0 | 1 | I2C_PRSCL_LO_REG | VI2C-ICB-Ch2 | Mapped to ICBX_X VI2C_DEV_ID 8'h25 | +| 0x7C4 | 1 | I2C_PRSCL_HI_REG | VI2C-ICB-Ch2 | 1) PDB external temperature sensors | +| 0x7C8 | 1 | I2C_CTRL_REG | VI2C-ICB-Ch2 | | +| 0x7CC | 0 | I2C_TX_REG | VI2C-ICB-Ch2 | | +| 0x7CC | 1 | I2C_RX_REG | VI2C-ICB-Ch2 | | +| 0x7D0 | 0 | I2C_CMD_REG | VI2C-ICB-Ch2 | | +| 0x7D0 | 1 | I2C_STAT_REG | VI2C-ICB-Ch2 | | +| 0x7D4 | 1 | I2C_MUX_SEL_REG | VI2C-ICB-Ch2 | | +| 0x7D8 | 1 | I2C_RST_REG | VI2C-ICB-Ch2 | | +| 0x7DC | 1 | RSVD | VI2C-ICB-Ch2 | | +| 0x7E0 | 1 | I2C_PRSCL_LO_REG | VI2C-ICB-Ch3 | Mapped to ICBX_X VI2C_DEV_ID 8'h27 | +| 0x7E4 | 1 | I2C_PRSCL_HI_REG | VI2C-ICB-Ch3 | 1) Hotswap controller | +| 0x7E8 | 1 | I2C_CTRL_REG | VI2C-ICB-Ch3 | | +| 0x7EC | 0 | I2C_TX_REG | VI2C-ICB-Ch3 | | +| 0x7EC | 1 | I2C_RX_REG | VI2C-ICB-Ch3 | | +| 0x7F0 | 0 | I2C_CMD_REG | VI2C-ICB-Ch3 | | +| 0x7F0 | 1 | I2C_STAT_REG | VI2C-ICB-Ch3 | | +| 0x7F4 | 1 | I2C_MUX_SEL_REG | VI2C-ICB-Ch3 | | +| 0x7F8 | 1 | I2C_RST_REG | VI2C-ICB-Ch3 | | +| 0x7FC | 1 | RSVD | VI2C-ICB-Ch3 | | +| 0x800 | 1 | I2C_PRSCL_LO_REG | VI2C-ICB-Ch4 | Mapped to ICBX_X VI2C_DEV_ID 8'h29 | +| 0x804 | 1 | I2C_PRSCL_HI_REG | VI2C-ICB-Ch4 | 1) Power bricks and EFUSE | +| 0x808 | 1 | I2C_CTRL_REG | VI2C-ICB-Ch4 | | +| 0x80C | 0 | I2C_TX_REG | VI2C-ICB-Ch4 | | +| 0x80C | 1 | I2C_RX_REG | VI2C-ICB-Ch4 | | +| 0x810 | 0 | I2C_CMD_REG | VI2C-ICB-Ch4 | | +| 0x810 | 1 | I2C_STAT_REG | VI2C-ICB-Ch4 | | +| 0x814 | 1 | I2C_MUX_SEL_REG | VI2C-ICB-Ch4 | | +| 0x818 | 1 | I2C_RST_REG | VI2C-ICB-Ch4 | | +| 0x81C | 1 | RSVD | VI2C-ICB-Ch4 | | +| 0x820 | 1 | RSVD | RSVD | | + +### SWB — Switch Board + +#### SWB — Function none + +| Offset | DW | Register | Group | Comment | +|---|---|---|---|---| +| 0x000 | 1 | FPGA_REV_ID_REG | GEN & ID | | +| 0x004 | 1 | RSVD | GEN & ID | | +| 0x008 | 1 | RSVD | GEN & ID | | +| 0x00C | 1 | SWB_INFO_REG | GEN & ID | | +| 0x010 | 1 | RSVD | GEN & ID | | +| 0x014 | 11 | RSVD | GEN & ID | | +| 0x040 | 16 | RSVD | GEN & ID | | +| 0x080 | 1 | FPGA_RECONFIG_CTRL_REG | FPGA Reconfig | | +| 0x084 | 1 | FPGA_RECONFIG_STAT_REG | FPGA Reconfig | | +| 0x088 | 6 | RSVD | FPGA Reconfig | | +| 0x0A0 | 1 | RSVD | FPGA Reconfig | | +| 0x0A4 | 1 | RSVD | FPGA Reconfig | | +| 0x0A8 | 6 | RSVD | FPGA Reconfig | | +| 0x0C0 | 1 | SCRTCH_0_REG | Scratchpad | | +| 0x0C4 | 1 | SCRTCH_1_REG | Scratchpad | | +| 0x0C8 | 1 | SCRTCH_2_REG | Scratchpad | | +| 0x0CC | 1 | SCRTCH_3_REG | Scratchpad | | +| 0x0D0 | 12 | RSVD | Scratchpad | | +| 0x100 | 96 | RSVD | MSI INT | | +| 0x280 | 32 | RSVD | Mailbox | | +| 0x300 | 1 | RSVD | Power | | +| 0x304 | 1 | PWR_STAT_REG | Power | | +| 0x308 | 1 | PWR_STAT_PLRTY_REG | Power | | +| 0x30C | 1 | PWR_STAT_EDG_LVL_REG | Power | | +| 0x310 | 1 | PWR_STAT_INT_EN_REG | Power | | +| 0x314 | 1 | PWR_STAT_INT_STAT_REG | Power | | +| 0x318 | 1 | PWR_STAT_INT_CLR_REG | Power | | +| 0x31C | 1 | SEM_REG | Power | | +| 0x320 | 8 | RSVD | Power | | +| 0x340 | 1 | RSVD | Speed Sense | | +| 0x344 | 1 | RSVD | Speed Sense | | +| 0x348 | 14 | RSVD | Speed Sense | | +| 0x380 | 1 | CB_CTRL_REG | CB | | +| 0x384 | 1 | CB_STAT_REG | CB | 384 | +| 0x388 | 1 | CB_STAT_PLRTY_REG | CB | | +| 0x38C | 1 | CB_STAT_EDG_LVL_REG | CB | | +| 0x390 | 1 | CB_STAT_INT_EN_REG | CB | | +| 0x394 | 1 | CB_STAT_INT_STAT_REG | CB | | +| 0x398 | 1 | CB_STAT_INT_CLR_REG | CB | | +| 0x39C | 1 | SEM_REG | CB | | +| 0x3A0 | 8 | RSVD | CB | | +| 0x3C0 | 1 | ASIC_CTRL_REG | ASIC | | +| 0x3C4 | 1 | ASIC_STAT_REG | ASIC | | +| 0x3C8 | 1 | ASIC_STAT_PLRTY_REG | ASIC | | +| 0x3CC | 1 | ASIC_STAT_EDG_LVL_REG | ASIC | | +| 0x3D0 | 1 | ASIC_STAT_INT_EN_REG | ASIC | | +| 0x3D4 | 1 | ASIC_STAT_INT_STAT_REG | ASIC | | +| 0x3D8 | 1 | ASIC_STAT_INT_CLR_REG | ASIC | | +| 0x3DC | 1 | SEM_REG | ASIC | | +| 0x3E0 | 8 | RSVD | ASIC | | +| 0x400 | 1 | RTM_CTRL_REG | Retimer | | +| 0x404 | 1 | RSVD | Retimer | | +| 0x408 | 1 | RSVD | Retimer | | +| 0x40C | 1 | RSVD | Retimer | | +| 0x410 | 1 | RSVD | Retimer | | +| 0x414 | 1 | RSVD | Retimer | | +| 0x418 | 1 | RSVD | Retimer | | +| 0x41C | 1 | RSVD | Retimer | | +| 0x420 | 8 | RSVD | Retimer | | +| 0x440 | 1 | RSVD | Thermal | | +| 0x444 | 1 | THRM_STAT_REG | Thermal | | +| 0x448 | 1 | THRM_STAT_PLRTY_REG | Thermal | | +| 0x44C | 1 | THRM_STAT_EDG_LVL_REG | Thermal | | +| 0x450 | 1 | THRM_STAT_INT_EN_REG | Thermal | | +| 0x454 | 1 | THRM_STAT_INT_STAT_REG | Thermal | | +| 0x458 | 1 | THRM_STAT_INT_CLR_REG | Thermal | | +| 0x45C | 1 | SEM_REG | Thermal | | +| 0x460 | 8 | RSVD | Thermal | | +| 0x480 | 128 | RSVD | RSVD | | +| 0x680 | 1 | RSVD | Other Dev ctrl-stat-int | 680 | +| 0x684 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x688 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x68C | 1 | EN_ACCSS_PRTCTD_REG | Other Dev ctrl-stat-int | | +| 0x690 | 12 | I2C_MUX_RST_REG | Other Dev ctrl-stat-int | | +| 0x6C0 | 1 | SPI_MUX_REG | Other Dev ctrl-stat-int | | +| 0x6C4 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x6C8 | 270 | RSVD | RSVD | | +| 0xB00 | 1 | FLSH_CTRL_REG | Flash Write Protect | | +| 0xB04 | 31 | RSVD | Flash Write Protect | | +| 0xB80 | 32 | RSVD | LED | | +| 0xC00 | 1 | RSVD | Debug & Test | | +| 0xC04 | 1 | RSVD | Debug & Test | | +| 0xC08 | 1 | TND_PWR_CTRL_0_REG | Debug & Test | | +| 0xC0C | 1 | TND_PWR_CTRL_1_REG | Debug & Test | | +| 0xC10 | 1 | TND_PWR_STAT_0_REG | Debug & Test | | +| 0xC14 | 1 | TND_PWR_STAT_1_REG | Debug & Test | | +| 0xC18 | 1 | TND_PWR_STAT_2_REG | Debug & Test | | +| 0xC1C | 1 | TND_PWR_STAT_3_REG | Debug & Test | | +| 0xC20 | 1 | TND_CB_GPIO_CTRL_REG | Debug & Test | | +| 0xC24 | 1 | TND_CB_GPIO_STAT_REG | Debug & Test | | +| 0xC28 | 1 | TND_CB_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC2C | 89 | RSVD | Debug & Test | | +| 0xD90 | 1 | RST_CAUSE_REG | Reset Stat | | +| 0xD94 | 31 | RSVD | Reset Stat | | +| 0xE10 | 56 | RSVD | RSVD | | + +### ICB — PDB / Power Distribution Board + +#### ICB — Function none + +| Offset | DW | Register | Group | Comment | +|---|---|---|---|---| +| 0x000 | 1 | FPGA_REV_ID_REG | GEN & ID | ICB_BP FPGA revision & Id register | +| 0x004 | 1 | RSVD | GEN & ID | | +| 0x008 | 1 | RSVD | GEN & ID | | +| 0x00C | 1 | RSVD | GEN & ID | | +| 0x010 | 28 | RSVD | GEN & ID | | +| 0x080 | 1 | FPGA_RECONFIG_CTRL_REG | FPGA Reconfig | | +| 0x084 | 1 | FPGA_RECONFIG_STAT_REG | FPGA Reconfig | | +| 0x088 | 14 | RSVD | FPGA Reconfig | | +| 0x0C0 | 1 | SCRTCH_0_REG | Scratchpad | | +| 0x0C4 | 1 | SCRTCH_1_REG | Scratchpad | | +| 0x0C8 | 1 | SCRTCH_2_REG | Scratchpad | | +| 0x0CC | 1 | SCRTCH_3_REG | Scratchpad | | +| 0x0D0 | 12 | RSVD | Scratchpad | | +| 0x100 | 96 | RSVD | MSI INT | | +| 0x280 | 32 | RSVD | Mailbox | | +| 0x300 | 1 | PWR_CTRL_REG | Power ctrl-stat-int | | +| 0x304 | 1 | PWR_STAT_REG | Power ctrl-stat-int | | +| 0x308 | 1 | PWR_STAT_PLRTY_REG | Power ctrl-stat-int | | +| 0x30C | 1 | PWR_STAT_EDG_LVL_REG | Power ctrl-stat-int | | +| 0x310 | 1 | PWR_STAT_INT_EN_REG | Power ctrl-stat-int | | +| 0x314 | 1 | PWR_STAT_INT_STAT_REG | Power ctrl-stat-int | | +| 0x318 | 1 | PWR_STAT_INT_CLR_REG | Power ctrl-stat-int | | +| 0x31C | 1 | SEM_REG | Power ctrl-stat-int | | +| 0x320 | 8 | RSVD | Power ctrl-stat-int | | +| 0x340 | 1 | FAN_CTRL_REG | Fan ctrl-stat-int | | +| 0x344 | 1 | FAN_STAT_REG | Fan ctrl-stat-int | | +| 0x348 | 1 | FAN_STAT_PLRTY_REG | Fan ctrl-stat-int | | +| 0x34C | 1 | FAN_STAT_EDG_LVL_REG | Fan ctrl-stat-int | | +| 0x350 | 1 | FAN_STAT_INT_EN_REG | Fan ctrl-stat-int | | +| 0x354 | 1 | FAN_STAT_INT_STAT_REG | Fan ctrl-stat-int | | +| 0x358 | 1 | FAN_STAT_INT_CLR_REG | Fan ctrl-stat-int | | +| 0x35C | 1 | SEM_REG | Fan ctrl-stat-int | | +| 0x360 | 1 | RSVD | Thermal | | +| 0x364 | 1 | THRM_STAT_REG | Thermal | | +| 0x368 | 1 | THRM_STAT_PLRTY_REG | Thermal | | +| 0x36C | 1 | THRM_STAT_EDG_LVL_REG | Thermal | | +| 0x370 | 1 | THRM_STAT_INT_EN_REG | Thermal | | +| 0x374 | 1 | THRM_STAT_INT_STAT_REG | Thermal | | +| 0x378 | 1 | THRM_STAT_INT_CLR_REG | Thermal | | +| 0x37C | 1 | SEM_REG | Thermal | | +| 0x380 | 8 | RSVD | Thermal | | +| 0x3A0 | 184 | RSVD | RSVD | | +| 0x680 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x684 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x688 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x68C | 1 | EN_ACCSS_PRTCTD_REG | Other Dev ctrl-stat-int | | +| 0x690 | 1 | I2C_MUX_RST_REG | Other Dev ctrl-stat-int | | +| 0x694 | 12 | RSVD | Other Dev ctrl-stat-int | | +| 0x6C4 | 1 | RSVD | Other Dev ctrl-stat-int | | +| 0x6C8 | 270 | RSVD | RSVD | | +| 0xB00 | 1 | FLSH_CTRL_REG | Flash Write Protect | | +| 0xB04 | 31 | RSVD | Flash Write Protect | | +| 0xB80 | 1 | LED_SYNC_REG | LED | | +| 0xB84 | 1 | LED_CONFIG_REG | LED | B84 | +| 0xB88 | 1 | LED_CTRL_0_REG | LED | B88 | +| 0xB8C | 1 | RSVD | LED | B8C | +| 0xB90 | 1 | RSVD | LED | B90 | +| 0xB94 | 27 | RSVD | LED | | +| 0xC00 | 1 | RSVD | Debug & Test | | +| 0xC04 | 1 | RSVD | Debug & Test | | +| 0xC08 | 1 | RSVD | Debug & Test | | +| 0xC0C | 1 | RSVD | Debug & Test | | +| 0xC10 | 1 | RSVD | Debug & Test | | +| 0xC14 | 1 | RSVD | Debug & Test | | +| 0xC18 | 1 | RSVD | Debug & Test | | +| 0xC1C | 1 | RSVD | Debug & Test | | +| 0xC20 | 1 | TND_CB_GPIO_CTRL_REG | Debug & Test | | +| 0xC24 | 1 | TND_CB_GPIO_STAT_REG | Debug & Test | | +| 0xC28 | 1 | TND_CB_GPIO_DIR_CTRL_REG | Debug & Test | | +| 0xC2C | 89 | RSVD | Debug & Test | | +| 0xD90 | 1 | RSVD | Reset Stat | | +| 0xD94 | 1 | RSVD | Reset Stat | | +| 0xD98 | 26 | RSVD | RSVD | | +| 0xE00 | 1 | I2C_PRSCL_LO_REG | I2C-Ch0 | 1) PDB Fan Controller | +| 0xE04 | 1 | I2C_PRSCL_HI_REG | I2C-Ch0 | | +| 0xE08 | 1 | I2C_CTRL_REG | I2C-Ch0 | | +| 0xE0C | 0 | I2C_TX_REG | I2C-Ch0 | | +| 0xE0C | 1 | I2C_RX_REG | I2C-Ch0 | | +| 0xE10 | 0 | I2C_CMD_REG | I2C-Ch0 | | +| 0xE10 | 1 | I2C_STAT_REG | I2C-Ch0 | | +| 0xE14 | 1 | I2C_MUX_SEL_REG | I2C-Ch0 | | +| 0xE18 | 1 | I2C_RST_REG | I2C-Ch0 | | +| 0xE1C | 1 | SEM_REG | I2C-Ch0 | | +| 0xE20 | 1 | I2C_PRSCL_LO_REG | I2C-Ch1 | 1) PDB EEPROM | +| 0xE24 | 1 | I2C_PRSCL_HI_REG | I2C-Ch1 | | +| 0xE28 | 1 | I2C_CTRL_REG | I2C-Ch1 | | +| 0xE2C | 0 | I2C_TX_REG | I2C-Ch1 | | +| 0xE2C | 1 | I2C_RX_REG | I2C-Ch1 | | +| 0xE30 | 0 | I2C_CMD_REG | I2C-Ch1 | | +| 0xE30 | 1 | I2C_STAT_REG | I2C-Ch1 | | +| 0xE34 | 1 | I2C_MUX_SEL_REG | I2C-Ch1 | | +| 0xE38 | 1 | I2C_RST_REG | I2C-Ch1 | | +| 0xE3C | 1 | SEM_REG | I2C-Ch1 | | +| 0xE40 | 1 | I2C_PRSCL_LO_REG | I2C-Ch2 | 1) PDB external temperature sensors | +| 0xE44 | 1 | I2C_PRSCL_HI_REG | I2C-Ch2 | | +| 0xE48 | 1 | I2C_CTRL_REG | I2C-Ch2 | | +| 0xE4C | 0 | I2C_TX_REG | I2C-Ch2 | | +| 0xE4C | 1 | I2C_RX_REG | I2C-Ch2 | | +| 0xE50 | 0 | I2C_CMD_REG | I2C-Ch2 | | +| 0xE50 | 1 | I2C_STAT_REG | I2C-Ch2 | | +| 0xE54 | 1 | I2C_MUX_SEL_REG | I2C-Ch2 | | +| 0xE58 | 1 | I2C_RST_REG | I2C-Ch2 | | +| 0xE5C | 1 | SEM_REG | I2C-Ch2 | | +| 0xE60 | 1 | I2C_PRSCL_LO_REG | I2C-Ch3 | 1) Hotswap controller | +| 0xE64 | 1 | I2C_PRSCL_HI_REG | I2C-Ch3 | | +| 0xE68 | 1 | I2C_CTRL_REG | I2C-Ch3 | | +| 0xE6C | 0 | I2C_TX_REG | I2C-Ch3 | | +| 0xE6C | 1 | I2C_RX_REG | I2C-Ch3 | | +| 0xE70 | 0 | I2C_CMD_REG | I2C-Ch3 | | +| 0xE70 | 1 | I2C_STAT_REG | I2C-Ch3 | | +| 0xE74 | 1 | I2C_MUX_SEL_REG | I2C-Ch3 | | +| 0xE78 | 1 | I2C_RST_REG | I2C-Ch3 | | +| 0xE7C | 1 | SEM_REG | I2C-Ch3 | | +| 0xE80 | 1 | I2C_PRSCL_LO_REG | I2C-Ch4 | 1) Power bricks and EFUSE | +| 0xE84 | 1 | I2C_PRSCL_HI_REG | I2C-Ch4 | | +| 0xE88 | 1 | I2C_CTRL_REG | I2C-Ch4 | | +| 0xE8C | 0 | I2C_TX_REG | I2C-Ch4 | | +| 0xE8C | 1 | I2C_RX_REG | I2C-Ch4 | | +| 0xE90 | 0 | I2C_CMD_REG | I2C-Ch4 | | +| 0xE90 | 1 | I2C_STAT_REG | I2C-Ch4 | | +| 0xE94 | 1 | I2C_MUX_SEL_REG | I2C-Ch4 | | +| 0xE98 | 1 | I2C_RST_REG | I2C-Ch4 | | +| 0xE9C | 1 | SEM_REG | I2C-Ch4 | | + +### Common + +#### none — Function none + +| Offset | DW | Register | Group | Comment | +|---|---|---|---|---| +| 0x | | none | none | Start of next device | +| 0x | none | none | none | Start of next device | +| 0x | | none | none | Start of next device | + +--- + +## 4. MSI Interrupt Mapping + +### CB MSI Vector Map + +| Interface | CB Register | Function | MSI Vector (Function.Vector.Bit) | Signal Description | Notes | +|---|---|---|---|---|---| +| Power | PWR_STAT_REG | 0 | 0.0.0 | Power Stat Interrupt | | +| TPM | TPM_STAT_REG | 0 | 0.1.0 | TPM Stat Interrupt | | +| PMC | PMC_STAT_REG | 0 | 0.2.0 | PMCC Stat Interrupt | | +| ICB | ICB_STAT_REG | 0 | 0.3.0 | ICB Stat Interrupt | | +| SWB 0 | SWB_STAT_REG | 0 | 0.4.0 | SWB 0 Stat Interrupt | | +| SWB 1 | SWB_STAT_REG | 0 | 0.5.0 | SWB 1 Stat Interrupt | | +| Thermal | THRM_STAT_REG | 0 | 0.6.0 | Thermal Stat Interrupt | | +| USB | USB_STAT_REG | 0 | 0.7.0 | USB Stat Interrupt | | +| Button | BTC_STAT_REG | 0 | 0.8.0 | Button Stat Interrupt | | +| Leak | LEAK_STAT_REG | 0 | 0.9.0 | Leak Stat Interrupt | | +| NFC | NFC_STAT_REG | 0 | 0.10.0 | NFC Stat Interrupt | | +| Intrusion | INTRD_STAT_REG | 0 | 0.11.0 | Intrusion Stat Interrupt | | +| Battery | BTRY_STAT_REG | 0 | 0.12.0 | Battery Stat Interrupt | | +| Fan | FAN_STAT_REG | 1 | 1.0.0 | Fan Stat Interrupt | | +| Retimer | RTM_STAT_REG | 1 | 1.1.0 | Retimer Stat Interrupt | | +| Ethernet Controller | ETH_CTRLR_STAT_REG | 1 | 1.2.0 | Ethernet Controller Stat Interrupt | | +| 1 | | | 1.3.0 | | | +| 1 | | | 1.4.0 | | | +| 1 | | | 1.5.0 | | | +| | | 1 | 1.6.0 | | | +| | | 1 | 1.7.0 | | | +| User Port Power | USRPRT_PWR_STAT_REG | 1 | 1.8.0 | UserPort Power Stat Interrupt | | +| User Port 0 | USRPRT_0_STAT_REG | 1 | 1.9.0 | UserPort 0 Stat Interrupt | | +| User Port 1 | USRPRT_0_STAT_REG | 1 | 1.10.0 | UserPort 1 Stat Interrupt | | +| 1 | | | 1.11.0 | | | +| SPI Flash Controller | SPI_CMD_STAT_REG | 2 | 2.0.0 | CB SPI Flash Controller Stat Interrupt | | +| VSPI Flash Controller | SPI_CMD_STAT_REG | 2 | 2.0.1 | PMC VSPI Flash Controller Stat Interrupt | | +| VSPI Flash Controller | SPI_CMD_STAT_REG | 2 | 2.0.2 | ICB VSPI Flash Controller Stat Interrupt | | +| VSPI Flash Controller | SPI_CMD_STAT_REG | 2 | 2.0.3 | SWB0 VSPI Flash Controller Stat Interrupt | | +| VSPI Flash Controller | SPI_CMD_STAT_REG | 2 | 2.0.4 | SWB1 VSPI Flash Controller Stat Interrupt | | +| | | 2 | 2.0.5 | | | +| | | 2 | 2.0.6 | | | +| | | 2 | 2.0.7 | | | +| | | 2 | 2.0.8 | | | +| | | 2 | 2.0.9 | | | +| | | 2 | 2.0.10 | | | +| | | 2 | 2.0.11 | | | +| | | 2 | 2.0.12 | | | +| I2C | I2C_STAT_REG | 3 | 3.0.0 | Open core I2C Interrupt Ch0 | | +| I2C | I2C_STAT_REG | 3 | 3.0.1 | Open core I2C Interrupt Ch1 | | +| I2C | I2C_STAT_REG | 3 | 3.0.2 | Open core I2C Interrupt Ch2 | | +| I2C | I2C_STAT_REG | 3 | 3.0.3 | Open core I2C Interrupt Ch3 | | +| I2C | I2C_STAT_REG | 3 | 3.0.4 | Open core I2C Interrupt Ch4 | | +| I2C | I2C_STAT_REG | 3 | 3.0.5 | Open core I2C Interrupt Ch5 | | +| I2C | I2C_STAT_REG | 3 | 3.0.6 | Open core I2C Interrupt Ch6 | | +| I2C | I2C_STAT_REG | 3 | 3.0.7 | Open core I2C Interrupt Ch7 | | +| I2C | I2C_STAT_REG | 3 | 3.0.8 | Open core I2C Interrupt Ch8 | | +| I2C | I2C_STAT_REG | 3 | 3.0.9 | Open core I2C Interrupt Ch9 | | +| I2C | I2C_STAT_REG | 3 | 3.0.10 | Open core I2C Interrupt Ch10 | | +| I2C | I2C_STAT_REG | 3 | 3.0.11 | Open core I2C Interrupt Ch11 | | +| I2C | I2C_STAT_REG | 3 | 3.0.12 | Open core I2C Interrupt Ch12 | | +| I2C | I2C_STAT_REG | 3 | 3.0.13 | Open core I2C Interrupt Ch13 | | +| I2C | I2C_STAT_REG | 3 | 3.0.14 | Open core I2C Interrupt Ch14 | | +| I2C | I2C_STAT_REG | 3 | 3.0.15 | Open core I2C Interrupt Ch15 | | +| I2C | I2C_STAT_REG | 3 | 3.0.16 | Open core I2C Interrupt Ch16 | | +| I2C | I2C_STAT_REG | 3 | 3.0.17 | Open core I2C Interrupt Ch17 | | +| | | 3 | 3.0.18 | | | +| | | 3 | 3.0.19 | | | +| VI2C | I2C_STAT_REG | 3 | 3.0.20 | ICB LSB VI2C Interrupt Ch0 | | +| VI2C | I2C_STAT_REG | 3 | 3.0.21 | ICB LSB VI2C Interrupt Ch1 | | +| VI2C | I2C_STAT_REG | 3 | 3.0.22 | ICB LSB VI2C Interrupt Ch2 | | +| VI2C | I2C_STAT_REG | 3 | 3.0.23 | ICB LSB VI2C Interrupt Ch3 | | +| VI2C | I2C_STAT_REG | 3 | 3.0.24 | ICB LSB VI2C Interrupt Ch4 | | +| | | 3 | 3.0.25 | | | +| | | 3 | 3.0.26 | | | +| 3 | | | 3.0.27 | | | + +### SWB Interrupt Map + +| Interface | CB Register | Interrupt Method | SWB Register | Signal Description | Notes | +|---|---|---|---|---|---| +| Power & Thermal | SWB_STAT_REG [2] #SWB_INT | Pin | PWR_STAT_REG THRM_STAT_REG | | | + +### ICB Interrupt Map + +| Interface | CB Register | Interrupt Method | SWB Register | Signal Description | Notes | +|---|---|---|---|---|---| +| Power & Thermal | ICB_STAT_REG [2] #ICB_INT | Pin | PWR_STAT_REG FAN_STAT_REG THRM_STAT_REG | | | + +--- + +## 5. Register Descriptions + +### MSI Interrupts + +#### Interrupt registers + +- MSI vector number assigned for each interrupt is predefined and not programmable. +- There is a pair of DEV_MSI_PEND_REG and DEV_MSI_INT_EN_REG register for each MSI vector. +- Each device within the function will have a PEND bit in one of the DEV_MSI_PEND_REG registers according to MSI vector number assigned to that device. +- A device will have its PEND bit set when it is requesting service. +- There can be as many as 32 pair of PEND/EN registers (one for each MSI interrupt vector) in a function. The actual number of MSI vectors reserved for each function is currently TBD. +- PEND/EN registers are 32 bit registers but they can be extended to 64 bit if more than 32 interrupt request are assigned to a single MSI (A 64 bit register is composed of two 32-bit registers). +##### DEV_MSI_PEND_REG + +There can be as many as 32 DEV_MSI_PEND_REG registers (one for each MSI interrupt vector) per function. Each device within the function will have a PEND bit in one of the PEND registers. A device will have its PEND bit set when it is requesting service. + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| TBD | | RO | | | +| TBD | | RO | | | + +##### DEV_MSI_INT_EN_REG + +There can be as many as 32 DEV_MSI_INT_EN_REG registers (one for each MSI interrupt vector) per function. The actual number of MSI vectors reserved for each function or device is currently TBD. + +Enables a device to have its interrupt PEND status to trigger a MSI interrupt. + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| TBD | | RW | | | +| TBD | | RW | | | + +#### MSI Generation + +FPGA will trigger MSI interrupt only when (INT_EN [MSI_INDEX] & PEND [MSI_INDEX]) transition from 0 to 1. To avoid missing interrupts SW would make sure that it does not exit the ISR until the condition (INT_EN [MSI_INDEX] & PEND [MSI_INDEX]) is zero. Following examples clarifies how MSI interrupts are generated and serviced by FPGA and SW. + +Scenario 1: Assume at time 0 no interrupt is pending and DEV1-INT is enabled (means its respective bit in DEV_MSI_INT_EN_REG is asserted). At time t1, PEND bit for DEV1-INT transitions from 0 to 1. Since enable bit is already 1, FPGA will detect 01 transition in (INT_EN & PEND) therefore will send MSI to CPU. + +Scenario 2:  Assume at time 0, DEV1-INT is pending but disabled. At time t1 SW set the DEV1-INT enable bit to 1. Since PEND bit is already 1, FPGA will detect 01 transition in (INT_EN & PEND) therefore will send MSI to CPU. + +Scenario 3: Assume at time 0 no interrupt is pending and DEV1-INT and DEV2-INT are enabled (means their respective bits in DEV_MSI_INT_EN_REG are asserted). At time t1, PEND bit for DEV1-INT transitions from 0 to 1. Since enable bit is already 1, FPGA will detect 01 transition in (INT_EN & PEND) therefore will send MSI to CPU. Immediately after sending MSI and before SW can service DEV1-INT, at time t1+e, PEND bit for DEV2-INT transitions from 0 to 1. At time t1+e, (INT_EN & PEND) is already 1 and FPGA will not detect any 01 transition so no new MSI will be generated. At the time SW services the first MSI, it will check the PEND register and find out that DEV1-INT and DEV2-INT is pending and will service both interrupt requests before exiting the ISR. + +Scenario 4: Assume at time 0 no interrupt is pending and DEV1-INT and DEV2-INT are enabled (means their respective bits in DEV_MSI_INT_EN_REG are asserted). At time t1, PEND bit for DEV1-INT transitions from 0 to 1. Since enable bit is already 1, FPGA will detect 01 transition in (INT_EN & PEND) therefore will send MSI to CPU. As part of ISR, SW will read PEND register and find out that Dev1-INT is pending. Before SW can fully service the DEV1-INT and clear the respective PEND bit, at time t2, PEND bit for DEV2-INT transitions from 0 to 1. At time t2, (INT_EN & PEND) is already 1 and FPGA will not detect any 01 transition so no new MSI will be generated. After SW cleared DEV1-INT before exiting the ISR, it will again read PEND register and find out that DEV2-INT is pending. SW will continue with servicing DEV2-INT before exiting the ISR. + +Scenario 5: at Scenario 4, after SW cleared DEV1-INT (INT_EN & PEND transition from 1 to 0), immediately DEV2-INT happens. Before exiting ISR, SW will read the PEND register and detect the DEV2-INT but at the same time FPGA will detect 01 transition in (INT_EN & PEND) and send MSI. In this scenario SW services DEV2-INT as part of first MSI interrupt, therefore when SW process the second MSI it finds no pending INT because DEV2-INT has already been serviced by first MSI. This situation should be managed by SW. + +### LED Control bits + +The status of each LED is defined by an 8-bit register as explained below: + +Bit [0] – 0 off, 1 on + +Bit [1] – 0 orange, 1 green or single color + +Bit [2] – 0 not blink, 1 blink + +Bit [3] – 0 slow blink, 1 fast blink + +Bit [4] – 0 full bright, 1 half bright + +Bit [5] – Reserved + +Bit [7:6] – This bit is reserved unless stated in description + +0 FPGA/SW Ctrl, other values (external control) + +All LED register in this document use above codes to define the status of LED. + +### Common Register Description + +#### FPGA_REV_ID_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** See Description + +Stores Device-ID & Revision Number for FPGA + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| FPGA_ID | 31:16 | RO | See Description | Device Identification,
CB = 0x2001
SWB = 0x2101
ICB = 0x2201 | +| FPGA_REV | 15:0 | RO | 0x0001 | FPGA Code Revision field. Incremented by 1 in each revision.
For lab Release, Rev will start with “1” illustrating beta version. e.g. 0x8001 | + +#### RDND_MGMT_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** 0xCCCC_CCCC + +Redundancy Management Registers + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RDND_MGMT_STAT | 31:0 | RW | 0xCCCC_CCCC | Under SW control | + +#### FUNC_CAP_0_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_3_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 3 | +| MSI_2_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 2 | +| MSI_1_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 1 | +| MSI_0_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 0 | + +#### FUNC_CAP_1_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_7_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 7 | +| MSI_6_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 6 | +| MSI_5_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 5 | +| MSI_4_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 4 | + +#### FUNC_CAP_2_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_11_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 11 | +| MSI_10_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 10 | +| MSI_9_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 9 | +| MSI_8_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 8 | + +#### FUNC_CAP_3_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_15_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 15 | +| MSI_14_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 14 | +| MSI_13_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 13 | +| MSI_12_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 12 | + +#### FUNC_CAP_4_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_19_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 19 | +| MSI_18_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 18 | +| MSI_17_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 17 | +| MSI_16_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 16 | + +#### FUNC_CAP_5_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_23_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 23 | +| MSI_22_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 22 | +| MSI_21_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 21 | +| MSI_20_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 20 | + +#### FUNC_CAP_6_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_27_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 27 | +| MSI_26_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 26 | +| MSI_25_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 25 | +| MSI_24_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 24 | + +#### FUNC_CAP_7_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined per each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MSI_31_INT_NUM | 31:24 | RO | | Illustrates the Number of interrupts that can generate MSI vector 31 | +| MSI_30_INT_NUM | 23:16 | RO | | Illustrates the Number of interrupts that can generate MSI vector 30 | +| MSI_29_INT_NUM | 15:8 | RO | | Illustrates the Number of interrupts that can generate MSI vector 29 | +| MSI_28_INT_NUM | 7:0 | RO | | Illustrates the Number of interrupts that can generate MSI vector 28 | + +#### FUNC_CAP_8_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** Defined for each function of each FPGA. + +Defines the capability of PCIe function + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | | Reserved | +| NUM_OF_PRTS | 7:0 | RO | | Represent the number of I2C ports in function 3. This is inclusive of real I2C ports, Virtual I2C Ports, and reserved I2C ports.
This field is not used in other functions and will be always 0. | + +#### MBOX_n_DATA_REG + +Data will be written in this register only if respective stat bit in MBOX_STAT_REG is showing empty stat. Write in this register will set the respective stat bit in MBOX_STAT_REG. + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0000 + +Mailbox data + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| DATA | 31:0 | RW | 0 | | + +#### MBOX_STAT_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0000 + +Mailbox status + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| MBOX_3_STAT | 3 | W1C | 0 | 1: MBOX_3_DATA_REG is full.
0: MBOX_3_DATA_REG is empty. | +| MBOX_2_STAT | 2 | W1C | 0 | Same as MBOX_3_STAT | +| MBOX_1_STAT | 1 | W1C | 0 | Same as MBOX_3_STAT | +| MBOX_0_STAT | 0 | W1C | 0 | Same as MBOX_3_STAT | + +#### MBOX_STAT_PLRTY_REG + +Defines which level of the MBOX_STAT signal is the condition for triggering the Interrupt. + +STAT_PLRTY_REG is defined once in this document. All other STAT_PLRTY_REG registers’ definition will be similar to this and their bits will follow their respective STAT_REG. + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| MBOX_3_STAT_PLRTY | 3 | RW | 0 | 1: means MBOX_3_STAT hi (1’b1) is the condition for triggering the interrupt. In case of edge interrupt a stat transition from lo to hi (1’b0 to 1’b1) is the condition for triggering the interrupt.
0: means MBOX_3_STAT lo (1’b0) is the condition for triggering the interrupt. In case of edge interrupt a stat transition from hi to lo (1’b1 to 1’b0) is the condition for triggering the interrupt. | +| MBOX_2_STAT_PLRTY | 2 | RW | 0 | Same as MBOX_3_STAT_PLRTY | +| MBOX_1_STAT_PLRTY | 1 | RW | 0 | Same as MBOX_3_STAT_PLRTY | +| MBOX_0_STAT_PLRTY | 0 | RW | 0 | Same as MBOX_3_STAT_PLRTY | + +#### MBOX_STAT_EDG_LVL_REG + +Defines if the level or the transition of the MBOX_STAT signal is the condition for triggering the Interrupt. + +STAT_EDG_LVL_REG is defined once in this document. All other STAT_EDG_LVL_REG registers’ definition will be similar to this and their bits will follow their respective STAT_REG. + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| MBOX_3_STAT_EDG_LVL | 3 | RW | 0 | 1: means the transition (or the edge) of MBOX_3_STAT is the condition for triggering the interrupt.
0: means the level of MBOX_3_STAT is the condition for triggering the interrupt. | +| MBOX_2_STAT_EDG_LVL | 2 | RW | 0 | Same as MBOX_3_STAT_EDG_LVL | +| MBOX_1_STAT_EDG_LVL | 1 | RW | 0 | Same as MBOX_3_STAT_EDG_LVL | +| MBOX_0_STAT_EDG_LVL | 0 | RW | 0 | Same as MBOX_3_STAT_EDG_LVL | + +#### MBOX_STAT_INT_EN_REG + +Enable interrupts for status bits of mailboxes. + +STAT_INT_EN_REG is defined once in this document. All other STAT_INT_EN_REG registers’ definition will be similar to this and their bits will follow their respective STAT_REG. + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| MBOX_3_STAT_EN | 3 | RW | 0 | 1: Enables MBOX_3_STAT to trigger interrupt if interrupt condition is met.
0: Disables MBOX_3_STAT interrupt. | +| MBOX_2_STAT_EN | 2 | RW | 0 | Same as MBOX_3_STAT_EN | +| MBOX_1_STAT_EN | 1 | RW | 0 | Same as MBOX_3_STAT_EN | +| MBOX_0_STAT_EN | 0 | RW | 0 | Same as MBOX_3_STAT_EN | + +#### MBOX_STAT_INT_STAT_REG + +Illustrates current interrupt status of mailboxes. + +STAT_INT_STAT_REG is defined once in this document. All other STAT_INT_STAT_REG registers’ definition will be similar to this and their bits will follow their respective STAT_REG. + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| MBOX_3_INT_STAT | 3 | RO | 0 | 1: MBOX_3 INT is active and requesting service.
0: MBOX_3 INT is inactive. | +| MBOX_2_INT_STAT | 2 | RO | 0 | Same as MBOX_3_INT_STAT | +| MBOX_1_INT_STAT | 1 | RO | 0 | Same as MBOX_3_INT_STAT | +| MBOX_0_INT_STAT | 0 | RO | 0 | Same as MBOX_3_INT_STAT | + +#### MBOX_STAT_INT_CLR_REG + +Write one in this register to clear respective interrupt in MBOX_STAT_INT_STAT_REG. Applicable to Edge Interrupts. + +STAT_INT_CLR_REG is defined once in this document. All other STAT_INT_CLR_REG registers’ definition will be similar to this and their bits will follow their respective STAT_REG. + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| MBOX_3_INT_CLR | 3 | RW | 0 | One in this bit location clears MBOX_3_INT_STAT. This bit resets itself in next clock cycle after a one is written into it, so it will always show 0 if SW attempt to read it. | +| MBOX_2_INT_CLR | 2 | RW | 0 | Same as MBOX_3_INT_CLR | +| MBOX_1_INT_CLR | 1 | RW | 0 | Same as MBOX_3_INT_CLR | +| MBOX_0_INT_CLR | 0 | RW | 0 | Same as MBOX_3_INT_CLR | + +#### SCRTCH_n_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** 0x0000_0000 + +Scratch Pad + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| DATA | 31:0 | RW | 0 | | + +#### SEM_REG + +Here is how SEM_REG works: + +- If the content of this register is zero, then it will allow SW to write any value on that. +- If the content of this register is nonzero, then SW is not allowed to write any value in this register but SW can clear this register by writing zero in it. In other words since this is 8-bit register, SW can clear this register by writing any value which has bits [7:0] = 8’h00. SW can always write zero in this register. +**Card Type:** All · **FPGA Type:** All · **Function:** All · **POR Value:** 0x0000_0000 + +Semaphore + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| DATA | 7:0 | RW | 0 | | + +#### SPI_CMD_STAT_REG + +SW should set only single command bit at a time. If more than one command bits are set, only the command bit in lower bit position will be executed. For example of READ_DW and WRITE_DW commands are set, only READ_DW (which is in lower bit position) is executed. + +**Card Type:** ALL · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0100 + +Instruct FPGA to erase, read from, and write into SPI peripheral. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| INT_EN | 31 | RW | 0 | 1: Interrupt Enabled. | +| RSVD | 30:12 | RO | 0 | Reserved | +| INT | 11 | W1C | 0 | 1: SPI transaction is completed. | +| ILLEGAL_ERASE | 10 | W1C | 0 | 1: ILLEGAL ERASE detected. Trying to erase a protected sector.
In Virtual SPI Reg: Not Used. | +| ILLEGAL_WRITE | 9 | W1C | 0 | 1: ILLEGAL WRITE detected. Trying to write in a protected sector.
In Virtual SPI Reg: Not Used. | +| READY | 8 | RO | 1 | 1: Flash memory controller is ready and can accept new command.
0: Flash memory controller is executing a command and cannot accept new command.
Recommendation: SW should check this bit before initiating a new command. | +| READ_ID | 7 | RW | 0 | 1: Read Device Identification from the memory device
0: No Action
This bit is not used for internal flash access in PMC, ICB-FT and ICB-RDC FPGAs.
In Virtual SPI Reg: Not Used. | +| READ_SILICON_ID | 6 | RW | 0 | Not used in Ridley. Use bit 7 to read silicon ID. | +| READ_STATUS | 5 | RW | 0 | This is to read Status Register-1 from flash.
This bit is used differently in VSPI flash.
In Virtual SPI Flash this bit is W1C.
1: Read Failed
0: Read Successful
In Virtual SPI Reg this bit is not used. | +| PROTECT_SECTOR | 4 | RW | 0 | Not used in Ridley. | +| ERASE_SECTOR | 3 | RW | 0 | 1: Erase a sector specified by SPI_ADD_REG.
0: No Action
In Virtual SPI Reg: Not Used. | +| WRITE_W | 2 | RW | 0 | 1: Write one DW in Flash Memory address specified by SPI_ADD_REG. The data to be written should be stored in SPI_WR_DATA_REG.
0: No Action | +| READ_W | 1 | RW | 0 | 1: Read one DW from address specified by SPI_ADD_REG. The read data will be stored in SPI_RD_DATA_REG.
0: No Action | +| NEW_COMMAND | 0 | RW | 0 | 1: The command specified in Bit1 to 7 is a new command.
0: Command has been executed by FPGA and if there is any command bit set, FPGA will assume it is old command and will ignore it.
To initiate a new command (specified by bit1 to bit7), SW should set NEW_COMMAND bit high. This bit is de-asserted by FPGA after command is executed.
For Virtual SPI, if SW trigger a SPI command and the NEW_COMMAND bit never get cleared by FPGA (due to errors on the LSB bus) then SW can clear NEW_COMMAND bit and initiate another SPI command. In such a condition, | + +#### SPI_ADD_REG + +In SPI controller and in VSPI-Flash this register is used as it is defined in the description field below, but in VSPI-WB the upper 4 bits are used differently. In VSPI_WB, this register is used to specify the address of the register in the remote FPGA. Bits [19:0] are used as register offset (relative address in the respective function). Bits [23:20] are used to specify the function. + +Bits [23:20] = 0x1 and 0x0 specifies function 0. + +Bits [23:20] = 0x2 specifies function 1. + +Bits [23:20] = 0x4 specifies function 2. + +Bits [23:20] = 0x8 specifies function 3. + +Other values for Bits[23:20] are invalid. + +**Card Type:** ALL · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Specifies an address in SPI Peripheral + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:24 | RO | 0 | Reserved | +| ADDR | 23:0 | RW | 0 | This field specifies the word address for READ_DW and WRITE_DW operation. A valid word address should have two LSB bits of zero.
For sector erase command, the address placed in this field can be any valid address in the sector that you can erase. | + +#### SPI_WR_DATA_REG + +**Card Type:** ALL · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Data to be written in SPI Peripheral. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| WR_DATA | 31:0 | RW | 0 | 32-bit data to be written in Configuration Flash Memory. | + +#### SPI_RD_DATA_REG + +**Card Type:** ALL · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Data read from SPI Peripheral + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RD_DATA | 31:0 | RO | 0 | FPGA stores read data from configuration flash memory in this register.
The register content is valid after Read command is executed and will remain valid before the next command starts, so SW is expected to read this register after read command executed before issuing another command. | + +#### SPI_RST_REG + +**Card Type:** ALL · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | | +| LCL_RST | 3:0 | RW | 0 | 0xD: Reset the local SPI controller or local VSPI module.
With reset all registers are initialized by their POR value. All state machines are initialized to their initial state. After successful reset of SPI controller, this register will also be cleared to zero. Any other values other than 0xD will be ignored by FPGA. | + +#### I2C_PRSCL_LO_REG + +Pre-scale value is calculated as: [(input clock HZ) / (5xdesired SCL HZ)] – 1. + +Below values have been calculated based on 75MHZ input clock. + +Pre-scale = 0x88 (136 decimal) for 100KHZ SCL + +Pre-scale = 0x24 (36 decimal) for 400KHZ SCL + +Change the value of the prescale register only when the I2C_MOD_EN bit is cleared. + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_00FF + +This register is used to pre-scale the SCL clock line + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| PRESCALE | 7:0 | RW | 0xFF | Clock Pre scale register lo-byte | + +#### I2C_PRSCL_HI_REG + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_00FF + +This register is used to pre-scale the SCL clock line + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| PRESCALE | 7:0 | RW | 0xFF | Clock Pre scale register hi-byte | + +#### I2C_CTRL_REG + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| I2C_MOD_EN | 7 | RW | 0 | “1” means core is enabled.
“0” means core is disabled. | +| I2C_MOD_INT_EN | 6 | RW | 0 | “1” means interrupt is enabled.
“0” means interrupt is disabled. | +| RSVD | 5:0 | RO | 0 | Reserved | + +#### I2C_TX_REG + +This is Transmit Register during register write operation but it will be Receive Register during register read operation. + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_0000 + +Transmit Data Register + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| DATA_BYTE_TX | 7:0 | WO | 0x0 | Next byte to be transmitted by I2C.
In case of data transfer, bit [0] represents the data’s LSB. In case of a slave address transfer bit [0] represents the RW bit. ‘1’ means reading from slave and ‘0’ means writing to slave. | + +#### I2C_RX_REG + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_0000 + +Receive Data Register + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| DATA_BYTE_RX | 7:0 | RO | 0x00 | Last byte received via I2C | + +#### I2C_CMD_REG + +This is command register during register write operation. During register read it will be status register. + +Command bits [0] and [4:7] are cleared when I2C byte transaction is done or when bus arbitration is lost. + +Prior to setting a command SW has to make sure right values have already been written in pre‐scale, Ctrl, Mux, and TX registers + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| STA | 7 | WO | 0 | generate (repeated) start condition | +| STO | 6 | WO | 0 | generate stop condition | +| RD | 5 | WO | 0 | read from slave | +| WR | 4 | WO | 0 | write to slave | +| ACK | 3 | WO | 0 | when a receiver, sent ACK (ACK = ‘0’) or NACK (ACK = ‘1’) | +| RSVD | 2:1 | RO | 0 | Reserved | +| INT_ACK | 0 | WO | 0 | Interrupt acknowledge. When set, clears a pending interrupt. | + +#### I2C_STAT_REG + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| RX_ACK | 7 | RO | 0 | Received acknowledge from slave.
This flag represents acknowledge from the addressed slave.
‘1’ = No acknowledge received
‘0’ = Acknowledge received | +| BUSY | 6 | RO | 0 | I2C bus busy
‘1’ after START signal detected
‘0’ after STOP signal detected | +| ARB_LOST | 5 | RO | 0 | Arbitration lost.
This bit is set when the core lost arbitration. Arbitration is lost when:
• a STOP signal is detected, but not requested
• The master drives SDA high, but SDA is low. | +| RSVD | 4:2 | RO | 0 | write to slave | +| TIP | 1 | RO | 0 | Transfer in progress
‘1’ when transferring data
‘0’ when transfer complete | +| INT_FLAG | 0 | RO | 0 | This bit is set when an interrupt is pending, which will cause a processor interrupt request if the IEN (INT_EN) bit is set.
The Interrupt Flag is set when:
• one byte transfer has been completed
• arbitration is lost | + +#### I2C_MUX_SEL_REG + +If a single I2C port is used to communicate with multiple I2C devices, then SW needs to set the device number in this register to specify which device it wants to talk to. FPGA will use this register to set the right values for the Enable and Select pins of the external I2C multiplexers. + +If there is no external I2C multiplexer connected to I2C controller, value of this register is simply ignored and has no effect in I2C controller functions. + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | 0 | | +| DEV_SEL | 7:0 | RW | 0 | Specifies the I2C device that needs to be connected to I2C controller. FPGA use this value to set the enable and select pins for the external I2C multiplexer. | + +#### I2C_RST_REG + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 3, none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | | +| LCL_RST | 3:0 | RW | 0 | 0xD: Reset the local I2C controller or local VI2C module.
With reset all registers are initialized by their POR value. All state machines are initialized to their initial state. After successful reset of I2C controller, this register will also cleared to zero.
Any other values other than 0xD will be ignored by FPGA. | + +#### LED_SYNC_REG + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 0, none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | 0 | | +| LED_SYNC | 0 | RW | 0 | This is used to synchronize the LED blinks on all the boards in chassis. SW write 1 in this bit to synchronize the LEDs.
1: Resets blinking status of all the Leds
0: no Action
This bit is automatically cleared by FPGA. | + +#### LED_CONFIG_REG + +**Card Type:** ALL · **FPGA Type:** ALL · **Function:** 0, none · **POR Value:** 0x0003_0705 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:28 | RO | 0 | Reserved | +| LED_TMR_CTRL | 27:24 | RW | 0 | 0x09: Turns of the LED timer
Other values: no effect.
This field is only used at 300 sec after power up or after FPGA reconfiguration.
SW has to write 0x9 in this field within 300 sec after power up (or after FPGA reconfiguration) to illustrate that it is in control otherwise FPGA will change the status of HEALTH LED to Orange Slow blink.
After FPGA changed the status of HEALTH LED, SW still can change the status of the LED by writing in respective LED control bits in LED control register. | +| RSVD | 23:21 | RO | 0 | Reserved | +| FST_BLNK_SPD | 20:16 | RW | 0x3 | The value of this field is used only if LED is in fast blink mode.
0: 100ms
1: 200ms
3: 400ms

31: 3200ms (3.2 sec) | +| RSVD | 15:13 | RO | 0 | | +| SLW_BLNK_SPD | 12:8 | RW | 0x7 | The value of this field is used only if LED is in slow blink mode.
0: 100ms
1: 200ms
3: 400ms

31: 3200ms (3.2 sec) | +| RSVD | 7:4 | RO | 0 | | +| BRGHT_LVL | 3:0 | RW | 0x5 | The value of this field is used only when we put LED in half-bright mode in LED_CTRL_REG.
0: off
1: 10% of full brightness
2: 20% of full brightness
….
9: 90% of full brightness
10 to 15: Full bright | + +#### FPGA_RECONFIG_CTRL_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** 0, none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:9 | RO | All 0s | Reserved | +| SELECT_IMAGE | 8 | RW | 0 | 0: Boot from App1
1: Boot from App2 | +| UPDATE_FIRST_BOOT | 7:4 | RW | 0 | 0xD: Update ‘First Boot’ value in the Flash to the value shown by #SELECT_IMAGE
Any other value: Does nothing.
This field will get cleared by FPGA after command is executed successfully. | +| START_RECONFIG | 3:0 | RW | 0 | 0xD: Start FPGA reconfiguration
Any other value: Does nothing. | + +#### FPGA_RECONFIG_STAT_REG + +**Card Type:** All · **FPGA Type:** All · **Function:** 0 · **POR Value:** 0x0000_0002 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:5 | RO | All 0s | Reserved | +| ERROR_FIRST_BOOT | 4 | RO | 0 | 1: Error in UPDATE_FIRST_BOOT command | +| BUSY | 3 | RO | 0 | FPGA reconfiguration is busy and executing a command. | +| ERROR | 2 | RO | 0 | 0: No Error in FPGA Configuration
1: Error observed in FPGA reconfiguration | +| CURRENT_IMAGE | 1:0 | RO | 10 | 10: App1
11: App2 | + +### CB Registers + +All registers are not protected by default unless specified. + +#### Function 0 + +#### FPGA_REV_ID_REG + +#### FUNC_CAP_0_REG + +#### FPGA_RECONFIG_CTRL_REG + +#### FPGA_RECONFIG_STAT_REG + +#### SCRTCH_n_REG + +#### DEV_MSI_0_PEND_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| MBOX_INT | 0 | RO | 0 | 1: MBOX requires service.
0: no service is requested. | + +#### DEV_MSI_0_INT_EN_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | 0 | Reserved | +| MBOX_INT_EN | 0 | RW | 0 | 1: MBOX interrupt is enabled.
0: MBOX interrupt is disabled. | + +#### PWR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0009 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| PWR_SUICIDE | 31:16 | RW | All 0s | Value of 0xA73D in this register will disable 1Khz signal sent out to the hardware external watchdog and toggle the reconfiguration pin of CB.
This field is used for CB post-ISP update. | +| THERMAL_SUICIDE_SWB_1 | 15:12 | RW | All 0s | 0x6: Force SWB 1 PSSM to enter Thermal Fault state, CB will shutdown all power rails and recovers after 5min.
SW writes to this register when it detects over-temperature event.
Any other value: no effect, FPGA will not take any action. This bit is automatically cleared to 0 after shutdown. | +| THERMAL_SUICIDE_SWB_0 | 11:8 | RW | All 0s | 0x6: Force SWB 0 PSSM to enter Thermal Fault state, CB will shutdown all power rails and recovers after 5min.
SW writes to this register when it detects over-temperature event.
Any other value: no effect, FPGA will not take any action. This bit is automatically cleared to 0 after shutdown. | +| THERMAL_SUICIDE_MAIN | 7:4 | RW | 0x0 | 0x6: Force Main PSSM to enter Thermal Fault state, CB will shutdown all power rails and recovers after 5min.
SW writes to this register when it detects over-temperature event.
Any other value: no effect, FPGA will not take any action. This bit is automatically cleared to 0 after shutdown. | +| EN_ISP_MODE | 3:0 | RW | 0x9 | 0x6: Enter ISP mode.
0x9: Disable ISP mode.
Although any value can be written in this field by SW, FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status.
When enabled, this disable the power sequence logic of CB from monitoring the power good of PMC, SWB and ICB that is invalid when the PMC, SWB or ICB are performing self-reconfiguration. | + +#### PWR_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:11 | RO | All 0s | Reserved | +| SWB_1_ALL_PG | 10 | RO | 1 | 1: Pgood is okay | +| SWB_0_ALL_PG | 9 | RO | 1 | 1: Pgood is okay | +| PDB_ALL_PG | 8 | RO | 1 | 1: Pgood is okay | +| RSVD | 7 | RO | 0 | Reserved | +| SWB1_PWROK | 6 | RO | 0 | Indicates the power sequencing of SWB 1 is completed.
1: Asserted
0: De-asserted | +| SWB0_PWROK | 5 | RO | 0 | Indicates the power sequencing of SWB 0 is completed.
1: Asserted
0: De-asserted | +| CB_PWROK | 4 | RO | 0 | Indicates the power sequencing of Control Board is completed.
1: Asserted
0: De-asserted | +| RSVD | 3:1 | RO | 0 | Reserved | +| PMC_PWR_INT | 0 | RO | 0 | PMC Power interrupt
1: Asserted
0: De-asserted
(signal is buffered from PMC) | + +#### RS232_SPD_SNS_REG + +This register allows the sensing of the console baud rate. A write to this register will reset the counter and arm the speed sense circuit. When a character is sensed, the counter counts to the end of the start bit. At this point an interrupt is set and the count can be read to allow the baud rate to be determined. Upon writing this register back to zero, you clear the interrupt and send the state machine back to the wait for character state. + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +This register allows the sensing of the console baud rate + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:18 | RO | All 0s | Reserved | +| SPEED_SENSE | 17:0 | RW | 0x00000 | Number of clocks the start bit is low. A character with odd ASCII code (e.g. Carriage Return) should be selected for speed sense. | + +#### RS232_CLR_SPD_SNS_REG + +Speed Sense Interrupt will be reset by writing to this register. + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +Clear Speed Sense Interrupt + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:0 | RO | | Write any value to clear the Speed Sense Interrupt | + +#### TPM_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| TPM_INT | 0 | RO | 0 | 1: Request for Service
(signal is buffered from PMC) | + +#### PMC_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:12 | RO | All 0s | Reserved | +| PMC_LSB_RST | 11:8 | RW | 0 | Reset control of PMC LSB
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will reset the PMC LSB port and all related processors.
This Field is automatically cleared by FPGA after reset is issued. | +| RSVD | 7:0 | RO | 0 | Reserved | + +#### PMC_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:28 | RO | All 0s | Reserved | +| LSB_PROC_TYP_ERR | 27 | RO | 0 | One of the processors in LSB port received a packet with an invalid value in type field. | +| LSB_PROC_FATAL_ERR | 26 | RO | 0 | One of the state machines in one of the processors in LSB port has gone momentarily to unknown state. | +| LSB_PROC_EOP_ERR | 25 | RO | 0 | One of the processors in LSB port received a packet without EOP. | +| LSB_PROC_SOP_ERR | 24 | RO | 0 | One of the processors in LSB port received a packet without SOP. | +| RSVD | 23:19 | RO | 0 | Reserved | +| LSB_TX_FATAL_ERR | 18 | RO | 0 | One of the state machines in LSB TX PHY has gone momentarily to unknown state. | +| LSB_TX_EOP_ERR | 17 | RO | 0 | LSB TX PHY received a packet without EOP from one of the processors. | +| LSB_TX_SOP_ERR | 16 | RO | 0 | LSB TX PHY received a packet without SOP from one of the processors. | +| RSVD | 15 | RO | 0 | Reserved | +| LSB_RX_REV_NO_ERR | 14 | RO | 0 | REV of the received packet does not match with the REV_NO of the LSB RX PHY. | +| LSB_RX_UNEXP_ERR | 13 | RO | 0 | Unexpected condition in LSB RX PHY.
1: means RX_BUF is almost full or LSB_RX_PHY_CTRL has received a packet without SOP from DES (deserializer) | +| LSB_RX_SEQNO_ERR | 12 | RO | 0 | LSB RX PHY received a packet from remote party with invalid SEQ no. | +| LSB_RX_DEV_ID_ERR | 11 | RO | 0 | LSB RX PHY received a packet from remote party with invalid DEV-ID. | +| LSB_RX_FATAL_ERR | 10 | RO | 0 | One of the state machines in LSB RX PHY has gone momentarily to unknown state. | +| LSB_RX_LNGTH_ERR | 9 | RO | 0 | LSB RX PHY received a packet from remote party with invalid Length. | +| LSB_RX_CHKSM_ERR | 8 | RO | 0 | LSB RX PHY received a packet from remote party with checksum error. | +| RSVD | 7:0 | RO | 0 | Reserved | + +#### ICB_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:24 | RO | All 0s | Reserved | +| HSC_ENC_LATCH_OFF | 23:21 | RW | 0x0 | Send special Encoded Reset to ICB to hotswap controllers LATCH_OFF signal
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will power OFF system until switch tray removal.
This Field is automatically cleared by FPGA after reset is issued. | +| HSC_ENC_RST | 19:16 | RW | 0x0 | Send special Encoded Reset to ICB to toggle hotswap controllers
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will cycle the system power.
This Field is automatically cleared by FPGA after reset is issued. | +| RSVD | 15:12 | RO | All 0s | Reserved | +| ICB_LSB_RST | 11:8 | RW | 0x0 | Reset control of ICB LSB
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will reset the ICB LSB port and all related processors.
This Field is automatically cleared by FPGA after reset is issued. | +| RSVD | 7:4 | RO | 0 | Reserved | +| ICB_ERST | 3:0 | RW | 0 | Reset control of ICB
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will send encoded reset to the SWB on the respective switch board. The reset will be sent once, when this field is set to 0xD.
This Field is automatically cleared by FPGA after encoded reset is issued. | + +#### ICB_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0002 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:28 | RO | All 0s | Reserved | +| LSB_PROC_TYP_ERR | 27 | RO | 0 | One of the processors in LSB port received a packet with an invalid value in type field. | +| LSB_PROC_FATAL_ERR | 26 | RO | 0 | One of the state machines in one of the processors in LSB port has gone momentarily to unknown state. | +| LSB_PROC_EOP_ERR | 25 | RO | 0 | One of the processors in LSB port received a packet without EOP. | +| LSB_PROC_SOP_ERR | 24 | RO | 0 | One of the processors in LSB port received a packet without SOP. | +| RSVD | 23:19 | RO | 0 | Reserved | +| LSB_TX_FATAL_ERR | 18 | RO | 0 | One of the state machines in LSB TX PHY has gone momentarily to unknown state. | +| LSB_TX_EOP_ERR | 17 | RO | 0 | LSB TX PHY received a packet without EOP from one of the processors. | +| LSB_TX_SOP_ERR | 16 | RO | 0 | LSB TX PHY received a packet without SOP from one of the processors. | +| RSVD | 15 | RO | 0 | Reserved | +| LSB_RX_REV_NO_ERR | 14 | RO | 0 | REV of the received packet does not match with the REV_NO of the LSB RX PHY. | +| LSB_RX_UNEXP_ERR | 13 | RO | 0 | Unexpected condition in LSB RX PHY.
1: means RX_BUF is almost full or LSB_RX_PHY_CTRL has received a packet without SOP from DES (deserializer) | +| LSB_RX_SEQNO_ERR | 12 | RO | 0 | LSB RX PHY received a packet from remote party with invalid SEQ no. | +| LSB_RX_DEV_ID_ERR | 11 | RO | 0 | LSB RX PHY received a packet from remote party with invalid DEV-ID. | +| LSB_RX_FATAL_ERR | 10 | RO | 0 | One of the state machines in LSB RX PHY has gone momentarily to unknown state. | +| LSB_RX_LNGTH_ERR | 9 | RO | 0 | LSB RX PHY received a packet from remote party with invalid Length. | +| LSB_RX_CHKSM_ERR | 8 | RO | 0 | LSB RX PHY received a packet from remote party with checksum error. | +| RSVD | 7:3 | RO | 0 | Reserved | +| ICB_INT | 2 | RO | 0 | INT request of PDB board
1: ICB requests interrupt
0: No interrupt requested
This bit stores the filtered status of the pin | +| ICB_RDY | 1 | RO | 1 | Ready status of ICB FPGA
1: ICB is Ready
0: ICB is Not Ready
This bit stores the filtered status of the pin. | +| RSVD | 1:0 | RO | 0 | Reserved | + +#### SWB_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:12 | RO | All 0s | Reserved | +| SWB_LSB_RST | 11:8 | RW | 0 | Reset control of SWB_FPGA LSB
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will reset the SWB_FPGA LSB port and all related processors.
This Field is automatically cleared by FPGA after reset is issued. | +| SWB_PERST | 7:4 | RW | All 0s | PCIE Reset control of SWB
0xD: Asserted
Any other value: De-asserted
This Field is NOT automatically cleared by FPGA after reset is issued. | +| SWB_ERST | 3:0 | RW | 0 | Reset control of SWB
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will send encoded reset to the SWB on the respective switch board. The reset will be sent once, when this field is set to 0xD.
This Field is automatically cleared by FPGA after encoded reset is issued. | + +#### SWB_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0001 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:28 | RO | All 0s | Reserved | +| LSB_PROC_TYP_ERR | 27 | RO | 0 | One of the processors in LSB port received a packet with an invalid value in type field. | +| LSB_PROC_FATAL_ERR | 26 | RO | 0 | One of the state machines in one of the processors in LSB port has gone momentarily to unknown state. | +| LSB_PROC_EOP_ERR | 25 | RO | 0 | One of the processors in LSB port received a packet without EOP. | +| LSB_PROC_SOP_ERR | 24 | RO | 0 | One of the processors in LSB port received a packet without SOP. | +| RSVD | 23:19 | RO | 0 | Reserved | +| LSB_TX_FATAL_ERR | 18 | RO | 0 | One of the state machines in LSB TX PHY has gone momentarily to unknown state. | +| LSB_TX_EOP_ERR | 17 | RO | 0 | LSB TX PHY received a packet without EOP from one of the processors. | +| LSB_TX_SOP_ERR | 16 | RO | 0 | LSB TX PHY received a packet without SOP from one of the processors. | +| RSVD | 15 | RO | 0 | Reserved | +| LSB_RX_REV_NO_ERR | 14 | RO | 0 | REV of the received packet does not match with the REV_NO of the LSB RX PHY. | +| LSB_RX_UNEXP_ERR | 13 | RO | 0 | Unexpected condition in LSB RX PHY.
1: means RX_BUF is almost full or LSB_RX_PHY_CTRL has received a packet without SOP from DES (deserializer) | +| LSB_RX_SEQNO_ERR | 12 | RO | 0 | LSB RX PHY received a packet from remote party with invalid SEQ no. | +| LSB_RX_DEV_ID_ERR | 11 | RO | 0 | LSB RX PHY received a packet from remote party with invalid DEV-ID. | +| LSB_RX_FATAL_ERR | 10 | RO | 0 | One of the state machines in LSB RX PHY has gone momentarily to unknown state. | +| LSB_RX_LNGTH_ERR | 9 | RO | 0 | LSB RX PHY received a packet from remote party with invalid Length. | +| LSB_RX_CHKSM_ERR | 8 | RO | 0 | LSB RX PHY received a packet from remote party with checksum error. | +| RSVD | 7:3 | RO | 0 | Reserved | +| SWB_INT | 2 | RO | 0 | INT request of switch board
1: SWB requests interrupt
0: No interrupt requested
This bit stores the filtered status of the pin | +| RSVD | 1 | RO | 0 | Reserved | +| SWB_PRSNT | 0 | RO | 1 | Present status of switch board
1: SWB is present
0: SWB is Not Present
This bit stores the filtered status of the pin. | + +#### BMC_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0160 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:9 | RO | All 0s | Reserved | +| BMC_BOOT_SEL | 8 | RW | 1 | Boot selection for BMC
1: SPI flash
0: UART | +| BMC_PWR_EN | 7:4 | RW | 0x6 | Power control of BMC
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | +| BMC_RST | 3:0 | RW | 0x0 | Reset control of BMC
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will reset the BMC module.
This Field is automatically cleared by FPGA after reset is issued. | + +#### BMC_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:5 | RO | All 0s | Reserved | +| BMC_WDT_RST | 4 | RO | 0 | BMC Watchdog reset
1: Asserted
0: De-asserted | +| RSVD | 3:1 | RO | All 0s | Reserved | +| BMC_PRSNT | 0 | RO | 0 | Present status of BMC
1: Present
0: Not present | + +#### THRM_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:7 | RO | All 0s | Reserved | +| TEMP_SNSR_TMP432A_ALERT | 6 | RO | 0 | On-board Temp Sensor (TM432A) alert, monitor location A,B and E (see ES for details)
1: Asserted
0: De-asserted | +| TEMP_SNSR_TMP75_D_ALERT | 5 | RO | 0 | On-board Temp Sensor (TMP75) alert, monitor location D (see ES for details)
1: Asserted
0: De-asserted | +| TEMP_SNSR_TMP75_C_ALERT | 4 | RO | 0 | On-board Temp Sensor (TMP75) alert, monitor location C (see ES for details)
1: Asserted
0: De-asserted | +| RSVD | 3:2 | RO | All 0s | Reserved | +| CPU_EXT_TEMP_SNSR_ALERT | 1 | RO | 0 | CPU External Temp Sensor (TMP461) alert, monitor CPU local, PMC and SSD temperature
1: Asserted
0: De-asserted
(signal is buffered from PMC) | +| CPU_INT_THRM_TRIP | 0 | RO | 0 | CPU over temperature and unconditional shutdown
1: Asserted
0: De-asserted
(signal is buffered from PMC) | + +#### USB_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0006 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | All 0s | Reserved | +| USB_5V_EN | 3:0 | RW | 0x6 | Enable for USB 5V current limit switch
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | + +#### USB_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| USB_VBUS_DET | 1 | RO | 0 | 1: USB VBUS detected
0: USB VBUS not detected
(signal is buffered from PMC) | +| USB_5V_FAULT | 0 | RO | 0 | 1: USB 5V fault is asserted
0: USB 5V fault is not asserted
(signal is buffered from PMC) | + +#### BTN_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| FP_BTN | 0 | RO | 0 | Front Panel button is pressed.
1: Asserted
0: De-asserted | + +#### LEAK_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| LEAK_ALERT | 1 | RO | 0 | Leak ADC module Alert
1: Asserted
0: De-asserted | +| LEAK_ADC_INT | 0 | RO | 0 | Leak ADC module Interrupt
1: Interrupt asserted
0: Interrupt de-asserted | + +#### NFC_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | All 0s | Reserved | +| NFC_EN | 3:0 | RO | 0 | Enable (Wake) signal of NFC module
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | + +#### NFC_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0001 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:3 | RO | All 0s | Reserved | +| NFC_INT | 2 | RO | 0 | INT request of NFC module
1: NFC requests interrupt
0: No interrupt requested
This bit stores the filtered status of the pin | +| RSVD | 1 | RO | 0 | Reserved | +| NFC_PRSNT | 0 | RO | 1 | Present status of NFC module
1: NFC is present
0: NFC is Not Present
This bit stores the filtered status of the pin. | + +#### INTRD_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +Intrusion detection status + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| HANDLE_INT | 1 | RO | 0 | Interrupt of tray service or removal intent
1: Interrupt is asserted
0: Interrupt is not asserted | +| COVER_INT | 0 | RO | 0 | Interrupt of top cover
1: Interrupt is asserted
0: Interrupt is not asserted | + +#### BTRY_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| BTRY_UDV_ALERT | 0 | RO | 0 | Battery Under-voltage alert
1: Asserted
0: De-asserted | + +#### EN_ACCSS_PRTCTD_REG + +This register is to protect critical registers from accidental writes. SW should write 0x8F35_D72C in order to have write access to protected registers. + +**Card Type:** All · **FPGA Type:** PMC · **Function:** None · **POR Value:** 0x0000_0000 + +Enables access to protected registers. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| EN_ACCSS | 31:0 | RW | 0 | 0x8F35_D72C: Enables access to protected registers.
Other Values: Disables access to protected registers. | + +#### UART_MUX_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:26 | RO | All 0s | Reserved | +| SWB1_MUX_SEL | 25:24 | RW | 0x0 | SWB1 MUX select
3: UART Channel 4
2: UART Channel 3
1: UART Channel 2
0: UART Channel 1 | +| RSVD | 23:22 | RO | All 0s | Reserved | +| SWB0_MUX_SEL | 21:20 | RW | 0x0 | SWB0 MUX select
3: UART Channel 4
2: UART Channel 3
1: UART Channel 2
0: UART Channel 1 | +| RSVD | 19:18 | RO | All 0s | Reserved | +| BMC_MUX_SEL | 17:16 | RW | 0x0 | BMC MUX select
2: SWB1
1: SWB0
0: USB Console | +| RSVD | 15:14 | RO | All 0s | Reserved | +| CPU_DBG_MUX_SEL | 13:12 | RW | 0x0 | CPU Debug MUX select
2: SWB1
1: SWB0
0: USB Console | +| RSVD | 11:10 | RO | All 0s | Reserved | +| CPU_CNSL_MUX_SEL | 9:8 | RW | 0x0 | CPU Console MUX select
2: SWB1
1: SWB0
0: USB Console | +| RSVD | 7:5 | RO | All 0s | Reserved | +| USB_CNSL_MUX_SEL | 4:0 | RW | 0x0 | USB Console MUX select
4: SWB1
3: SWB0
2: BMC
1: CPU Debug
0: CPU Console | + +#### I2C_MUX_RST_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** none · **POR Value:** 0x0000_00DD + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| I2C_CH14_MUX_RST | 7:4 | RW | 0xD | Reset control of I2C CH14 MUX
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | +| I2C_CH10_MUX_RST | 3:0 | RW | 0xD | Reset control of I2C CH10 MUX
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | + +#### CPU_INTR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| CPU_INTR_2 | 1 | RW | 0 | Control interrupt 2 to CPU
1: Assert interrupt
0: De-assert interrupt | +| CPU_INTR_1 | 0 | RW | 0 | Control interrupt 1 to CPU
1: Assert interrupt
0: De-assert interrupt | + +#### BMC_JTAG_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +Controls the source to/fom JTAG pins of BMC + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| TDO | 7 | RO | 0 | Input, Connected to BMC TDO pin | +| TDI | 6 | RW | 0 | Output Connected to BMC TDI pin | +| TMS | 5 | RW | 0 | Output Connected to BMC TMS pin | +| TCK | 4 | RW | 0 | Output Connected to BMC TCK pin | +| RSVD | 3:1 | RO | All 0s | Reserved | +| JTAG_SEL | 0 | RW | 0 | Select the source to BMC JTAG
0: On-board JTAG header
1: CB control with bit [6:4] | + +#### SWB_JTAG_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0100 + +Controls the source to/fom JTAG pins of SWB + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:9 | RO | All 0s | Reserved | +| TRST | 8 | RW | 1 | Output Connected to SWB TRST pin | +| TDO | 7 | RO | 0 | Input, Connected to SWB TDO pin | +| TDI | 6 | RW | 0 | Output Connected to SWB TDI pin | +| TMS | 5 | RW | 0 | Output Connected to SWB TMS pin | +| TCK | 4 | RW | 0 | Output Connected to SWB TCK pin | +| RSVD | 3:0 | RO | All 0s | Reserved | + +#### FLSH_CTRL_REG + +This register is clear under two conditions only. + +- Upon assertion of global reset. +- Power cycle +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:12 | RO | All 0s | Reserved | +| PHY2_RETIMER_WP | 11 | RW | 0 | PHY Retimer Write Protect
1: Protected,
Once asserted, cannot be de-asserted by SW. | +| PHY2_I210_CTRLR_SPI_WP | 10 | RW | 0 | PHY I210 Ethernet Controller SPI Write Protect
1: Protected,
Once asserted, cannot be de-asserted by SW. | +| PHY1_84991_WP | 9 | RW | 0 | PHY 84991 Write Protect
1: Protected,
Once asserted, cannot be de-asserted by SW. | +| BMC_EEPRM_WP | 8 | RW | 0 | BMC EEPROM Write Protect
1: Protected,
Once asserted, cannot be de-asserted by SW. | +| RSVD | 7:3 | RO | All 0s | Reserved | +| ZEROIZATION_WP | 2 | RW | 0 | 1: Protected,
Once asserted, cannot be de-asserted by SW.
SW writes into this register bit during boot and use it as a gate for zeroization.  This would block a user from running zeroization (or parts of it) in Service-OS and Product-OS.  It also blocks them clearing a sticky bit. | +| FPGA_FLSH_WP | 1 | RW | 0 | FPGA (CB) Flash Write Protect
1: Protected,
Once asserted, FPGA will not issue any write/erase command to the flash.
Once asserted, cannot be de-asserted by SW. | +| CHSS_EEPRM_WP | 0 | RW | 0 | System Key EEPROM Write Protect
1: Protected,
Once asserted, cannot be de-asserted by SW. | + +#### LED_SYNC_REG + +#### LED_CONFIG_REG + +#### LED_CTRL_0_REG + +For bit definitions please refer to the section “LED Control bits”. + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:24 | RO | All 0s | Reserved | +| UID | 23:16 | RW | 0x0 | Locator LED | +| ALM_STAT | 15:8 | RW | 0x0 | Alarm status LED | +| SYS_STAT | 7:0 | RW | 0x0 | System status LED | + +#### LED_CTRL_1_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| PSU_STAT | 7:0 | RW | 0x0 | Fan status LED | + +#### LED_CTRL_2_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| FAN_STAT | 7:0 | RW | 0x0 | Fan status LED | + +#### LED_CTRL_3_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| LEAK_STAT | 7:0 | RW | 0x0 | LEAK status LED | + +#### LED_CTRL_4_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:16 | RO | All 0s | Reserved | +| PHY_84991_ACT_STAT | 15:8 | RW | 0x0 | PHY 84991 activity status
bit [7:6] option available (see Chapter 5):
00 = SW control
01 = PHY 84991 LED 0 driver
10 = PHY 84991 LED 1 driver
11 = PHY 84991 LED 2 driver | +| PHY_84991_LINK_STAT | 7:0 | RW | 0x0 | PHY 84991 link status
bit [7:6] option available (see Chapter 5):
00 = SW control
01 = PHY 84991 LED 0 driver
10 = PHY 84991 LED 1 driver
11 = PHY 84991 LED 2 driver | + +#### LED_CTRL_5_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:16 | RO | All 0s | Reserved | +| PHY_I210_ACT_STAT | 15:8 | RW | 0x0 | PHY I210 activity status
bit [7:6] option available (see Chapter 5):
00 = SW control
01 = PHY I210 LED 0 driver
10 = PHY I210 LED 1 driver
11 = PHY I210 LED 2 driver | +| PHY_I210_LINK_STAT | 7:0 | RW | 0x0 | PHY I210 link status
bit [7:6] option available (see Chapter 5):
00 = SW control
01 = PHY I210 LED 0 driver
10 = PHY I210 LED 1 driver
11 = PHY I210 LED 2 driver | + +#### WDG_CTRL_REG + +This register will be reset upon CPU POR reset. + +**Card Type:** All · **FPGA Type:** CB · **Function:** none · **POR Value:** 0x3000_0FFF + +Watchdog control register + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| WDG_INT_EN | 31 | RW | 0 | 1: Enables wdog interrupt.
0: Disables wdog interrupt. | +| WDG_EN | 30:27 | RW | 0x6 | 0x6: Enables wdog counter.
0x9: Disables wdog counter.
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous on/off status.
After CPU POR reset is asserted, the wdog counter enable status follows the behavior below:
POR value when the register bit WDG_EN_POR_MSK of TND_CTRL_REG is de-asserted.
Register bit WDG_EN when the WDG_EN_POR_MSK of TND_CTRL_REG is asserted.
CPU POR reset will be asserted if WDG_EN is asserted and WDG_CNTR_VALUE = WDG_LNGTH | +| RSVD | 26:12 | RO | 0 | Reserved | +| WDG_LNGTH | 11:0 | RW | 0xFFF | Number of 100ms ticks before the watchdog triggers.
FPGA will never allow 0x000 to be written in this field. If SW tries write 0x000 in this field, FPGA will write POR value in this register.
Count Time (ms)
0x0 illegal value
0x1 100.0
0x2 200.0
... ... | + +#### WDG_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** none · **POR Value:** 0x0000_0000 + +Watchdog status register + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| WDG_INT | 31 | RO | 0 | 1: Asserted, wdog interrupt occurred.
0: De-asserted, no interrupt yet.
WDG_INT will be asserted if WDG_INT_EN is asserted and WDG_CNTR_VALUE = WDG_LNGTH | +| RSVD | 30:12 | RO | 0 | Reserved | +| WDG_CNTR_VLUE | 11:0 | RO | 0 | Illustrates the current value of wdog counter.
Watchdog counter value will keep incrementing if WDG_EN is asserted.
Watchdog counter will stop incrementing if counter value gets equal to WDG_LNGTH.
Watchdog counter will reset to zero if WDG_EN bit is de-asserted or CPU POR reset is asserted. | + +#### WDG_RST_REG + +Any write to this register will reset the watchdog counter and de-assert the interrupt. + +**Card Type:** All · **FPGA Type:** CB · **Function:** none · **POR Value:** 0x0000_0000 + +Watchdog reset register + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:0 | RO | 0 | Reserved | + +#### TND_CTRL_REG + +#### TND_STAT_REG + +#### TND_PWR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_01FF + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:21 | RO | All 0s | Reserved | +| PSSM_DBG_PIN_OVR | 20 | RW | 0 | Enable override of PSSM for all bits [14:2] below
1: Enable
0: Disable | +| RSVD | 19:17 | RO | 0 | Reserved | +| PSSM_PWR_EN_OVR | 16 | RW | 0 | Enable override of PSSM for all bits [8:0] below
1: Enable
0: Disable | +| RSVD | 15 | RO | 0 | Reserved | +| SWB1_BYPASSBOOT | 14 | RW | 0 | SWB1 Bypass Boot value | +| SWB0_BYPASSBOOT | 13 | RW | 0 | SWB0 Bypass Boot value | +| DBGBOOT | 12 | RW | 0 | Debugboot value | +| RSVD | 11:9 | RO | All 0s | Reserved | +| SWB1_PWREN | 8 | RW | 1 | | +| SWB1_STBYEN | 7 | RW | 1 | | +| SWB0_PWREN | 6 | RW | 1 | | +| SWB0_STBYEN | 5 | RW | 1 | | +| PHY2_1V8_PWREN | 4 | RW | 1 | | +| PHY2_0V8_AVDD_PWREN | 3 | RW | 1 | | +| PHY2_0V8_DVDD_PWREN | 2 | RW | 1 | | +| PHY_V3P3_PWREN | 1 | RW | 1 | | +| CPU_MDL_PWREN | 0 | RW | 1 | Power enable overrides
1: Enable
0: Disable | + +#### TND_PWR_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_01FF + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:19 | RO | All 0s | Reserved | +| DIP_SWB1_BYPASSBOOT | 18 | RO | 0 | SWB1 Bypass Boot DIP switch position | +| DIP_SWB0_BYPASSBOOT | 17 | RO | 0 | SWB0 Bypass Boot DIP switch position | +| DIP_DBGBOOT | 16 | RO | 0 | Debugboot DIP switch position | +| RSVD | 15:9 | RO | All 0s | Reserved | +| SWB1_ALL_PG | 8 | RO | 1 | | +| SWB1_STBY_PG | 7 | RO | 1 | | +| SWB0_ALL_PG | 6 | RO | 1 | | +| SWB0_STBY_PG | 5 | RO | 1 | | +| PHY2_1V8_PG | 4 | RO | 1 | | +| PHY2_0V8_AVDD_PG | 3 | RO | 1 | | +| PHY2_0V8_DVDD_PG | 2 | RO | 1 | | +| PHY_0V8_AVDD_PG | 1 | RO | 1 | | +| CPU_MDL_PG | 0 | RO | 1 | Pgood status | + +#### TND_CLK_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0006_6066 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:20 | RO | All 0s | Reserved | +| BUF2_En1 | 19:16 | RW | 0x6 | Clock Buffer 2 Output Enable 1 | +| BUF2_En0 | 15:12 | RW | 0x6 | Clock Buffer 2 Output Enable 0 | +| RSVD | 11:8 | RO | All 0s | Reserved | +| BUF1_En1 | 7:4 | RW | 0x6 | Clock Buffer 1 Output Enable 1 | +| BUF1_En0 | 3:0 | RW | 0x6 | Clock Buffer 1 Output Enable 0
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | + +#### TND_PMC_GPIO_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:15 | RO | 0 | Reserved | +| GPI_14 | 14 | RW | 0 | | +| GPI_13 | 13 | RW | 0 | | +| GPI_12 | 12 | RW | 0 | | +| GPI_11 | 11 | RW | 0 | | +| GPI_10 | 10 | RW | 0 | | +| GPI_9 | 9 | RW | 0 | | +| GPI_8 | 8 | RW | 0 | | +| GPI_7 | 7 | RW | 0 | | +| GPI_6 | 6 | RW | 0 | | +| GPI_5 | 5 | RW | 0 | 1: Assert GPIO 5
0: De-assert GPIO 5 | +| RSVD | 4:0 | RO | 0 | Reserved | + +#### TND_PMC_GPIO_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:5 | RO | All 0s | Reserved | +| GPO_14 | 14 | RO | 0 | | +| GPO_13 | 13 | RO | 0 | | +| GPO_12 | 12 | RO | 0 | | +| GPO_11 | 11 | RO | 0 | | +| GPO_10 | 10 | RO | 0 | | +| GPO_9 | 9 | RO | 0 | | +| GPO_8 | 8 | RO | 0 | | +| GPO_7 | 7 | RO | 0 | | +| GPO_6 | 6 | RO | 0 | | +| GPO_5 | 5 | RO | 0 | 1: GPIO 5 is asserted
0: GPIO 5 is de-asserted | +| RSVD | 4:0 | RO | All 0s | Reserved | + +#### TND_PMC_GPIO_DIR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:15 | RO | 0 | Reserved | +| GPIO_DIR_14 | 14 | RW | 0 | | +| GPIO_DIR_13 | 13 | RW | 0 | | +| GPIO_DIR_12 | 12 | RW | 0 | | +| GPIO_DIR_11 | 11 | RW | 0 | | +| GPIO_DIR_10 | 10 | RW | 0 | | +| GPIO_DIR_9 | 9 | RW | 0 | | +| GPIO_DIR_8 | 8 | RW | 0 | | +| GPIO_DIR_7 | 7 | RW | 0 | | +| GPIO_DIR_6 | 6 | RW | 0 | | +| GPIO_DIR_5 | 5 | RW | 0 | 1: Indicate GPIO 5 is configured as output and register GPIO_CTRL_REG is used to control this output port value.
0: Indicate GPIO 5 is configured as input and register GPIO_STAT_REG store this input port value. | +| RSVD | 4:0 | RO | 0 | Reserved | + +#### TND_BMC_GPIO_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:7 | RO | 0 | Reserved | +| GPI_6 | 6 | RW | 0 | | +| GPI_5 | 5 | RW | 0 | | +| GPI_4 | 4 | RW | 0 | | +| GPI_3 | 3 | RW | 0 | | +| GPI_2 | 2 | RW | 0 | | +| RSVD | 1 | RO | 0 | Reserved | +| GPI_0 | 0 | RW | 0 | 1: Assert GPIO 0
0: De-assert GPIO 0 | + +#### TND_BMC_GPIO_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:7 | RO | All 0s | Reserved | +| GPO_6 | 6 | RO | 0 | | +| GPO_5 | 5 | RO | 0 | | +| GPO_4 | 4 | RO | 0 | | +| GPO_3 | 3 | RO | 0 | | +| GPO_2 | 2 | RO | 0 | | +| RSVD | 1 | RO | 0 | Reserved | +| GPO_0 | 0 | RO | 0 | 1: GPIO 0 is asserted
0: GPIO 0 is de-asserted | + +#### TND_BMC_GPIO_DIR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:7 | RO | 0 | Reserved | +| GPIO_DIR_6 | 6 | RW | 0 | | +| GPIO_DIR_5 | 5 | RW | 0 | | +| GPIO_DIR_4 | 4 | RW | 0 | | +| GPIO_DIR_3 | 3 | RW | 0 | | +| GPIO_DIR_2 | 2 | RW | 0 | | +| RSVD | 1 | RO | 0 | Reserved | +| GPIO_DIR_0 | 0 | RW | 0 | 1: Indicate GPIO 0 is configured as output and register GPIO_CTRL_REG is used to control this output port value.
0: Indicate GPIO 0 is configured as input and register GPIO_STAT_REG store this input port value. | + +#### TND_SWB_GPIO_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | 0 | Reserved | +| GPI_7 | 7 | RW | 0 | | +| GPI_6 | 6 | RW | 0 | 1: Assert GPIO 6
0: De-assert GPIO 6 | +| RSVD | 5:0 | RO | 0 | Reserved | + +#### TND_SWB_GPIO_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| GPO_7 | 7 | RO | 0 | | +| GPO_6 | 6 | RO | 0 | 1: GPIO 6 is asserted
0: GPIO 6 is de-asserted | +| RSVD | 5:0 | RO | 0 | Reserved | + +#### TND_SWB_GPIO_DIR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | 0 | Reserved | +| GPIO_DIR_7 | 7 | RW | 0 | | +| GPIO_DIR_6 | 6 | RW | 0 | 1: Indicate GPIO 6 is configured as output and register GPIO_CTRL_REG is used to control this output port value.
0: Indicate GPIO 6 is configured as input and register GPIO_STAT_REG store this input port value. | +| RSVD | 5:0 | RO | 0 | Reserved | + +#### TND_ICB_GPIO_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| GPI_3 | 3 | RW | 0 | | +| GPI_2 | 2 | RW | 0 | | +| GPI_1 | 1 | RW | 0 | 1: Assert GPIO 1
0: De-assert GPIO 1 | +| RSVD | 0 | RO | 0 | Reserved | + +#### TND_ICB_GPIO_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | All 0s | Reserved | +| GPO_3 | 3 | RO | 0 | | +| GPO_2 | 2 | RO | 0 | | +| GPO_1 | 1 | RO | 0 | 1: GPIO 1 is asserted
0: GPIO 1 is de-asserted | +| RSVD | 0 | RO | 0 | Reserved | + +#### TND_ICB_GPIO_DIR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 0 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| GPIO_DIR_3 | 3 | RW | 0 | | +| GPIO_DIR_2 | 2 | RW | 0 | | +| GPIO_DIR_1 | 1 | RW | 0 | 1: Indicate GPIO 1 is configured as output and register GPIO_CTRL_REG is used to control this output port value.
0: Indicate GPIO 1 is configured as input and register GPIO_STAT_REG store this input port value. | +| RSVD | 0 | RO | 0 | Reserved | + +#### RST_CAUSE_REG + +This is a protected register. This is sticky and does not get reset under global reset condition. + +**Card Type:** All · **FPGA Type:** CB · **Function:** None · **POR Value:** 0x0000_0001 + +Monitor the main PSSM + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| SW_RST_COOKIES | 31:16 | RW | All 0s | For SW to read and write. | +| RSVD | 15:9 | RO | All 0s | Reserved. | +| CLD_RST | 8 | W1C | 0 | This bit will be set if the System PGOOD is de-sserted from a good state. | +| RSVD | 7:4 | RO | All 0s | Reserved. | +| HW_THERM_RST | 3 | W1C | 0 | This bit will be set if the hardware thermal suicide is caused by CB. | +| WDG_RST | 2 | W1C | 0 | This bit will be set if the CB internal watch dog timer is expired. | +| SW_THERM_RST | 1 | W1C | 0 | This bit will be set when SW asserts thermal suicide by asserting #THERMAL_SUICIDE_MAIN field in PWR_CTRL_REG. | +| PWR_ON_RST | 0 | W1C | 1 | | + +#### RST_CAUSE_SWB_REG + +This is a protected register. This is sticky and does not get reset under global reset condition. + +**Card Type:** All · **FPGA Type:** CB · **Function:** None · **POR Value:** 0x0000_0001 + +Monitor the SWB PSSM + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| SW_RST_COOKIES | 31:16 | RW | All 0s | For SW to read and write. | +| RSVD | 15:9 | RO | All 0s | Reserved. | +| CLD_RST | 8 | W1C | 0 | This bit will be set if the SWB PGOOD is de-sserted from a good state. | +| RSVD | 7:4 | RO | All 0s | Reserved. | +| HW_THERM_RST | 3 | W1C | 0 | This bit will be set if the hardware thermal suicide is caused by SWB. | +| RSVD | 2 | RO | 0 | Reserved. | +| SW_THERM_RST | 1 | W1C | 0 | This bit will be set when SW asserts thermal suicide by asserting #THERMAL_SUICIDE_SWB_ field in PWR_CTRL_REG. | +| PWR_ON_RST | 0 | W1C | 1 | | + +#### + +#### Function 1 + +#### FPGA_REV_ID_REG + +#### FUNC_CAP_0_REG + +#### SCRTCH_n_REG + +#### DEV_MSI_0_PEND_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| MBOX_INT | 0 | RO | 0 | 1: MBOX requires service.
0: no service is requested. | + +#### DEV_MSI_0_INT_EN_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | 0 | Reserved | +| MBOX_INT_EN | 0 | RW | 0 | 1: MBOX interrupt is enabled.
0: MBOX interrupt is disabled. | + +#### FAN_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0666 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:17 | RO | All 0s | Reserved | +| ALL_FAN_FULL_SPD | 16 | RW | 0 | Control all Fans (1,2,3) to run at full speed
1: Full speed
0: Non full speed | +| RSVD | 15:12 | RW | 0x0 | Reserved | +| EFUSE_EN_FAN3 | 11:8 | RW | 0x6 | Enable of Fan3 EFUSE
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | +| EFUSE_EN_FAN2 | 7:4 | RW | 0x6 | Enable of Fan2 EFUSE
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | +| EFUSE_EN_FAN1 | 3:0 | RW | 0x6 | Enable of Fan1 EFUSE
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | + +#### FAN_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:13 | RO | All 0s | Reserved | +| FAN_CTRLR_ALERT | 12 | RO | 0 | Fan controller alert
1: Asserted
0: De-asserted | +| RSVD | 11 | RO | 0 | Reserved | +| ALRT_FAN_3 | 10 | RO | 0 | EFUSE alert of Fan 3
1: Asserted
0: De-asserted | +| ALRT_FAN_2 | 9 | RO | 0 | EFUSE alert of Fan 2
1: Asserted
0: De-asserted | +| ALRT_FAN_1 | 8 | RO | 0 | EFUSE alert of Fan 1
1: Asserted
0: De-asserted | +| RSVD | 7 | RO | 0 | Reserved | +| PG_FAN_3 | 6 | RO | 0 | Power status of Fan 3
1: Ok
0: Not Ok | +| PG_FAN_2 | 5 | RO | 0 | Power status of Fan 2
1: Ok
0: Not Ok | +| PG_FAN_1 | 4 | RO | 0 | Power status of Fan 1
1: Ok
0: Not Ok | +| RSVD | 3 | RO | 0 | Reserved | +| PRSNT_FAN_3 | 2 | RO | 0 | Present status of Fan 3
1: Present
0: Not present
This bit stores the filtered status of the pin. | +| PRSNT_FAN_2 | 1 | RO | 0 | Present status of Fan 2
1: Present
0: Not present
This bit stores the filtered status of the pin. | +| PRSNT_FAN_1 | 0 | RO | 0 | Present status of Fan 1
1: Present
0: Not present
This bit stores the filtered status of the pin. | + +#### RTM_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0001_009D + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:17 | RO | All 0s | Reserved | +| RTM_SERBOOT | 16 | RW | 1 | Enable of Serial Boot of Retimer
1: from SPI ROM
0: from MDIO | +| RSVD | 15:8 | RO | All 0s | Reserved | +| RTM_OSC_EN | 7:4 | RW | 0x9 | Enable of PHY 81381 retimer 156.25MHz clock
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | +| RTM_RST | 3:0 | RW | 0xD | Reset of PHY 81381 retimer
0xD: Asserted
Any other value: de-asserted.
This Field is automatically cleared by FPGA after reset is issued. | + +#### RTM_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| PHY_RTM_INT | 0 | RO | 0 | Interrupt of PHY 813881 retimer
1: Asserted
0: De-asserted | + +#### ETH_CTRLR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:3 | RO | All 0s | Reserved | +| SD_PIN2 | 2 | RW | 0x0 | SW defined output pin2 to I210 controller | +| SD_PIN1 | 1 | RW | 0x0 | SW defined output pin1 to I210 controller | +| SD_PIN0 | 0 | RW | 0x0 | SW defined output pin0 to I210 controller | + +#### ETH_CTRLR_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| I210_WAKE_INT | 1 | RO | 0 | ‘Wake’ signal from I210
1: Asserted
0: De-asserted | +| I210_ALRT_INT | 0 | RO | 0 | Alert from I210
1: Asserted
0: De-asserted | + +#### USRPRT_PWR_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0099 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| USRPRT_EFUSE_EN_P2 | 7:4 | RW | 0x9 | Enable EFUSE for UserPort 2
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | +| USRPRT_EFUSE_EN_P1 | 3:0 | RW | 0x9 | Enable EFUSE for UserPort 1
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | + +#### USRPRT_PWR_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| EFUSE_PG_P2 | 1 | RO | 0 | EFUSE Pgood of UserPort 2 (QSFP)
1: Asserted
0: De-asserted | +| EFUSE_PG_P1 | 0 | RO | 0 | EFUSE Pgood of UserPort 1 (QSFP)
1: Asserted
0: De-asserted | + +#### USRPRT_CTRL_0_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| P2_RST | 1 | RW | 0 | QSFP UserPort 2 Reset | +| P1_RST | 0 | RW | 0 | QSFP UserPort 1 Reset
1: Assert reset
0: De-assert reset | + +#### USRPRT_STAT_0_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| P2_INT | 1 | RO | 0 | QSFP UserPort 2 Interrupt
1: Asserted
0: De-asserted | +| P1_INT | 0 | RO | 0 | QSFP UserPort 1 Interrupt
1: Asserted
0: De-asserted | + +#### USRPRT_CTRL_1_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| P2_LP_MODE | 1 | RW | 0 | QSFP UserPort 2 LP Mode | +| P1_LP_MODE | 0 | RW | 0 | QSFP UserPort 1 LP Mode
1: Assert
0: De-assert | + +#### USRPRT_STAT_1_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| P2_ PRSNT | 1 | RO | 0 | QSFP UserPort 2 Present
1: Asserted
0: De-asserted | +| P1_PRSNT | 0 | RO | 0 | QSFP UserPort 1 Present
1: Asserted
0: De-asserted | + +#### PHY_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 1 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | All 0s | Reserved | +| PHY_RST | 3:0 | RW | 0x0 | PHY 84991 Reset
0xD: Asserted
Any other value: de-asserted.
This Field is automatically cleared by FPGA after reset is issued. | + +#### + +#### Function 2 + +#### FPGA_REV_ID_REG + +#### FUNC_CAP_0_REG + +#### SCRTCH_n_REG + +#### DEV_MSI_0_PEND_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| MBOX_INT | 0 | RO | 0 | 1: MBOX requires service.
0: no service is requested. | + +#### DEV_MSI_0_INT_EN_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | 0 | Reserved | +| MBOX_INT_EN | 0 | RW | 0 | 1: MBOX interrupt is enabled.
0: MBOX interrupt is disabled. | + +#### SPI_CMD_STAT_REG + +#### SPI_ADD_REG + +#### SPI_WR_DATA_REG + +#### SPI_RD_DATA_REG + +#### SPI_RST_REG + +#### GEN_SPI_RD_DATA_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Data read from SPI Peripheral + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RD_DATA | 31:0 | RO | 0 | Data read back from SPI transaction. Number of bits based on #SPI_DATA_WIDTH
The read back data is obtain each time write operation is carried out by writing into the GEN_SPI_WR_DATA_REG. | + +#### GEN_SPI_WR_DATA_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Data to be written into SPI Peripheral. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| WR_DATA | 31:0 | RW | 0 | Data to be written. Number of bits written based on #SPI_DATA_WIDTH
Writing into this register will initiate the Generic SPI Master to send out the SPI transaction to the SPI Slave. | + +#### GEN_SPI_STAT + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0060 + +Status register for Generic SPI Master for SPI interface + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 30:9 | RO | All 0s | Reserved | +| ERR_BIT | 8 | RO | 0 | Indicate overrun error has occur. 1: Transmit overrun error or receive overrun error has occur.
0: No overrun error has occurred.
Recommendation: SW should check this bit before initiating a new command. | +| RRDY | 7 | RO | 0 | Indicate receive ready status.
1: SPI_RD_DATA_REG register contains valid data and is ready to be read.
0: SPI_RD_DATA_REG register does not contain valid data.
Reading the SPI_RD_DATA_REG clears this register to 0. | +| TRRDY | 6 | RO | 1 | Indicate transmit ready status.
1: Transmit shift register is empty.
0: Transmit shift register is not empty.
The SPI_WR_DATA_REG register is able to transmit data into transmit shift register only when this register field is set to empty. | +| TMT | 5 | RO | 1 | Indicate transmit shift register is empty.
1: Transmit shift register is empty.
0: Transmit shift register is not empty.
When the transmit shift register is empty, the next data will be transferred from SPI_WR_DATA_REG register. | +| TOE | 4 | RO | 0 | Indicate transmit overrun error.
1: SPI_WR_DATA_REG register received new data before previous data was removed into the shift register. | +| ROE | 3 | RO | 0 | Indicate receive overrun error.
1: SPI_RD_DATA_REG register received new data before previous data was read.
0: No new data received before previous data was read. | +| RSVD | 2:0 | RO | 0 | Reserved | + +#### GEN_SPI_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Instruct FPGA to select SPI peripheral and enable interrupt request. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:11 | RO | All 0s | Reserved. | +| SSO | 10 | RW | 0 | Control the Chip Select output pin based on the mask provided in SPI_SLV_SEL_REG register. 1: Assert the Chip Select for the SPI slave device
0: De-assert the Chip Select for the SPI slave device.
SPI Master will continue to exchange data frames with correspondent SPI slave when this register field is asserted. | +| RSVD | 9:8 | RO | 0 | Reserved | +| IRRDY | 7 | RW | 0 | Enable interrupt request for receiver ready.
1: Interrupt enabled.
0: Interrupt disabled. | +| RSVD | 6:0 | RO | 0 | Reserved | + +#### GEN_SPI_CFG_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0210 + +Instruct FPGA to configure the SPI Master + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:15 | RO | All 0s | Reserved. | +| SPI_MODE | 14:13 | RW | 00 | Control the SPI mode for the SPI transaction.
00 : Data sampled on rising edge and shifted out on falling edge (Clock polarity and clock phase is low.)
01 : Data sampled on the falling edge and shifted out on rising edge.(Clock polarity is low and clock phase is high)
10 : Data sampled on falling edge and shifted out on rising edge (Clock polarity is high and clock phase is low.)
11 : :Data sampled on rising edge and shifted out on falling edge (Clock polarity is high and clock phase is high.) | +| SPI_SHIFT_BIT | 12 | RW | 0 | Control whether the MSB or LSB bit is shifted out first.
0: MSB bit is shifted out first
1: LSB bit is shifted out first | +| SPI_CHP_SEL_DELAY | 11:8 | RW | 0x2 | Specify the delay based on half of the SPI clock period for the delay to send out the first data after Chip Select pin is asserted.
0x0: 0 SPI clock cycle
0x1: 0.5 SPI clock cycle
0x2: 1 SPI clock cycle
….
0xF: 7.5 SPI clock cycles | +| RSVD | 7 | RO | 0 | Reserved. | +| SPI_CLK_CNT | 6:4 | RW | 001 | The value in this field is the frequency divider of the system clock (75 MHz) to generate the serial clock for the SPI transaction.
000 75Mhz/2 (37.50 MHz)
001 75Mhz/4 (18.75 MHz)
010 75Mhz/6 (12.5 MHz)
011 75Mhz/8 (9.375 MHz)
100 75Mhz/10 (7.5 MHz)
101 75Mhz/12 (6.25 MHz)
110 75Mhz/14 (5.357 MHz)
111 75Mhz/16 (4.686 MHz)
SPI clock frequency in MHz = 75MHz / (2 * (#SPI_CLK_CNT + 1) | +| RSVD | 3:2 | RO | | Reserved. | +| SPI_DATA_WIDTH | 1:0 | RW | 00 | Specify number of bits send per each write or read transaction to the SPI slave.
00: 8 bits
01: 16 bits
10: 24 bits
11: 32 bits | + +#### GEN_SPI_SLV_SEL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Instruct SPI Master to select which SPI slave to send transaction. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| SPI_SLV_SEL | 31: 0 | RW | All 0s | Bit 0: Control the SPI slave 0 enable for SPI master access where 1 is enable and 0 is disable.

Bit 31: Control the SPI slave 0 enable for SPI master access where 1 is enable and 0 is disable. | + +#### MDIO_STAT_CMD_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x8000_0000 + +CPU Control of MDIO Master IP + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| MDIO_STATUS | 31 | RO | 1 | 0: MDIO transaction in progress
1: MDIO transaction completed
It returns the status of the MDIO state machine. Once a CPU write to the MDIO register has taken place, the state machine begins to serialize the command to the transceiver. During this period, the status bit returns 0 every time the CPU reads from the register, and CPU writes will have no effect. As soon as the operation completes and the MDIO state machine has returned to
idle, the status bit returns a one, and the CPU can safely read the data field or write a new command to the MDIO.
This value is only cleared (1'b0) when a CPU MDIO transaction is pending or in progress. Otherwise it is set (1’b1) to represent that the last CPU MDIO transaction completed correctly. | +| RSVD | 30 | RO | 0 | Reserved | +| START | 29:28 | RW | 0 | Indicate the start of an MDIO transaction. These start bits differ between Clause 22 and Clause 45 MDIO. Note: Start bits are transmitted lsb first, so software must program them in reverse order as shown below.
Clause 22
- start sequence 01, program start <= 10
Clause 45
- start sequence 00, program start <= 00 | +| OPCODE | 27:26 | RW | All 0s | Determines the operation to be performed by the Management interface. The available
opcodes differ between Clause 22 and Clause 45 MDIO.
Clause 22 MDIO applies to 10/100/1000 Mbs MACs and
Clause 45 MDIO applies to 10 GIG MACs.
Note: Op-code bits are transmitted lsb first, so software must program them in reverse order as shown below. See long description for details.
Clause 22
IEEE-opcode ASIC.opcode Description
00 00 - Not valid
01 10 - Write
10 01 - Read
11 11 - Not valid
Clause 45
IEEE-opcode ASIC.opcode Description
00 00 Address
01 10 Write
11 11 Read
10 01 Post-read Increment Address | +| PHYAD | 25:21 | RW | All 0s | It indicates which of 32 possible physical devices transceivers attached to this bus is being addressed. | +| REGAD | 20:16 | RW | All 0s | It indicates which of 32 possible registers within the physical device the CPU wishes to read/write. | +| DATA | 15:0 | RW | All 0s | The value in this field corresponds to the 16 bit value defined in the physical layer device data sheet or the 802.3u specification.
On writes to the physical layer device, management would write the value to be sent to the physical layer device in this field while it was writing the opcode and address fields.
On reads from the physical layer device, management will write the opcode and address fields. It will then monitor the status bit. When status bit is set (idle), it knows the data field has the value read from the physical layer device.
Writes to this field are ignored when not idle. Reads of this field may contain invalid data when not idle. | + +#### MDIO_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x00F8_0007 + +General control of MDIO Master IP + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:24 | RO | All 0s | Reserved | +| MDIO_PREAMBLE_CNT | 23:19 | RW | 1F | Programmable preamble for both CPU and MDIO Stack issued MDIO commands.
NOTE: For proper operation with some Phys, this value should be set to 31. | +| RSVD | 18:12 | RO | All 0s | Reserved | +| STACK_EN | 11 | RW | 0 | 1: Enables the MDIO Stack.
0: Disable MDIO Stack. MDIO under CPU control with MDIO_STAT_CMD_REG. | +| RSVD | 10:8 | RO | All 0s | Reserved | +| MDIO_PROG_CLK_DIV | 7:0 | RW | 7 | This register sets the mdio clock divide rate.
Period of clock =
((MDIO_PROG_CLK_DIV + 1)*13.33ns)*2
14 (8’hE) : 2.5 MHz
7 (8’h7) : 4.6875 MHZ
4 (8’h4) : 7.5 MHz
2 (8’h2) : 12.5 MHz
0 (8’h0) : 37.5 MHz | + +#### MDIO_STK_CTRL_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | 0 | Reserved | +| STACK_CMD_START | 0 | RW | 0 | 1: Enables MDIO stack operation
0: Legacy CPU-only operation using MDIO_STAT_CMD_REG.
Note:
Stack will stop executing after the current instruction if #STACK_EN is disabled before #STACK_END_ADD MDIO instruction is reached. #STACK_END_ADD is the address of #STACK_START_ADD + #STACK_NUM_CMDS | + +#### MDIO_STK_ADDR_CONF_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0080 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:19 | RO | 0 | Reserved | +| STACK_PROG_DELAY | 18:14 | RW | All 0s | The number of MDIO clock cycles (MDC) to way in between each MDIO stack command.
(This is provided just in case some PHY has issues with quick back-to-back MDIO transactions.) | +| STACK_NUM_CMDS | 13:7 | RW | 1 | The number of MDIO Stack RAM instructions/entries to execute starting at #STACK_START_ADDR.
(Notes: Reading past the end of the stack is also and END condition) | +| STACK_START_ADDR | 6:0 | RW | All 0s | Starting MDIO instruction in the stack to begin executing when #STACK_CMD_START and #STACK_EN are set | + +#### MDIO_STK_STAT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0003 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | 0 | Reserved | +| STACK_IDLE | 1 | RO | 1 | For DEBUG use only, should not use by SW
Indicates that the MDIO stack has completed its instruction and there are no longer any MDIO commands to be executed. This field will be cleared whenever a new MDIO stack instruction has been issued with a non-zero number of MDIO commands. | +| STACK_CMD_DONE | 0 | RO | 1 | 1: Stack processing done for all MDIO transactions of a given MDIO stack instruction specified in MDIO_STK_ADDR_CONF_REG and started from MDIO_STK_CTRL_REG. It also means the last #STACK_NUM_CMDS number of commands it was instructed to execute have been successfully completed.
0: This value is only cleared when the MDIO Stack has MDIO transactions pending or in progress | + +#### MDIO_STK_RAM_DATA_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +Individual stack value entry for corresponding #STACK_ADDR + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:30 | RO | All 0s | Reserved | +| START | 29:28 | RW | All 0s | See MDIO_STAT_CMD_REG #START | +| OPCODE | 27:26 | RW | All 0s | See MDIO_STAT_CMD_REG #OPCODE | +| PHYAD | 25:21 | RW | All 0s | See MDIO_STAT_CMD_REG #PHYAD | +| REGAD | 20:16 | RW | All 0s | See MDIO_STAT_CMD_REG #REGAD | +| DATA | 15:0 | RW | All 0s | See MDIO_STAT_CMD_REG #DATA | + +#### MDIO_STK_RAM_ADDR_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +MDIO Stack address + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | 0 | Reserved | +| STACK_ADDR | 7:0 | RW | 0 | Indicates address/position of stack that MDIO_STK_RAM_DATA_REG is writing/reading to | + +#### MDIO_STAT_INT_REG + +**Card Type:** All · **FPGA Type:** CB · **Function:** 2 · **POR Value:** 0x0000_0000 + +MDIO Status interrupt + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:6 | RO | 0 | Reserved | +| MDIO_STATUS_INT | 5 | W1C | 0 | Indicates a Single MDIO transaction is completed | +| STK_CMD_DONE_INT | 4 | W1C | 0 | Indicates a new stack of MDIO transactions is done. | +| RSVD | 3:2 | RO | 0 | Reserved | +| MDIO_STATUS_INT_EN | 1 | RW | 0 | Enable Single MDIO interrupt (rising edge of MDIO_STAT_CMD_REG #MDIO_STATUS) | +| STK_CMD_DONE_INT_EN | 0 | RW | 0 | Enable Stack MDIO interrupt (rising edge of MDIO_STK_STAT_REG #STK_CMD_DONE) | + +#### + +#### Function 3 + +#### FPGA_REV_ID_REG + +#### FUNC_CAP_0_REG + +#### SCRTCH_n_REG + +#### DEV_MSI_0_PEND_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 3 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| MBOX_INT | 0 | RO | 0 | 1: MBOX requires service.
0: no service is requested. | + +#### DEV_MSI_0_INT_EN_REG (TBD) + +**Card Type:** All · **FPGA Type:** CB · **Function:** 3 · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | 0 | Reserved | +| MBOX_INT_EN | 0 | RW | 0 | 1: MBOX interrupt is enabled.
0: MBOX interrupt is disabled. | + +#### I2C_PRSCL_LO_REG + +#### I2C_PRSCL_HI_REG + +#### I2C_CTRL_REG + +#### I2C_TX_REG + +#### I2C_RX_REG + +#### I2C_CMD_REG + +#### I2C_STAT_REG + +#### I2C_MUX_SEL_REG + +#### I2C_RST_REG + +#### + +### SWB Registers + +#### FPGA_REV_ID_REG + +#### FPGA_RECONFIG_CTRL_REG + +#### FPGA_RECONFIG_STAT_REG + +#### SCRTCH_n_REG + +#### SWB_INFO_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| TRAY_2_ID | 11:8 | RO | All 0s | Current Tray 2 ID value | +| TRAY_1_ID | 7:4 | RO | All 0s | Current Tray 1 ID value | +| RSVD | 3:1 | RO | All 0s | Reserved | +| SWB_ID | 0 | RO | 0 | Current SWB ID
0: SWB0
1: SWB1 | + +#### PWR_STAT_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| SWB_ALL_PGOK | 16 | RO | 0 | Indicates SWB power sequencing is completed
1: Asserted
0: De-asserted | +| RSVD | 15:1 | RO | All 0s | Reserved | +| TH6_VDD_CORE_VRM_INT | 0 | RO | 0 | TH6 VDD Power Interrupt
1: Asserted
0: De-asserted | + +#### CB_CTRL_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:12 | RO | All 0s | Reserved | +| LSB_RST_SWB | 11:8 | RW | 0 | Reset control of remote LSB
0xD: Asserted
Any other value: de-asserted.
When asserted by SW, will reset the SWB LSB port and all related processors.
This Field is automatically cleared by FPGA after reset is issued. | +| RSVD | 7:0 | RO | 0 | Reserved | + +#### CB_STAT_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:28 | RO | All 0s | Reserved | +| LSB_PROC_TYP_ERR | 27 | RO | 0 | One of the processors in LSB port received a packet with an invalid value in type field. | +| LSB_PROC_FATAL_ERR | 26 | RO | 0 | One of the state machines in one of the processors in LSB port has gone momentarily to unknown state. | +| LSB_PROC_EOP_ERR | 25 | RO | 0 | One of the processors in LSB port received a packet without EOP. | +| LSB_PROC_SOP_ERR | 24 | RO | 0 | One of the processors in LSB port received a packet without SOP. | +| RSVD | 23:19 | RO | 0 | Reserved | +| LSB_TX_FATAL_ERR | 18 | RO | 0 | One of the state machines in LSB TX PHY has gone momentarily to unknown state. | +| LSB_TX_EOP_ERR | 17 | RO | 0 | LSB TX PHY received a packet without EOP from one of the processors. | +| LSB_TX_SOP_ERR | 16 | RO | 0 | LSB TX PHY received a packet without SOP from one of the processors. | +| RSVD | 15 | RO | 0 | Reserved | +| LSB_RX_REV_NO_ERR | 14 | RO | 0 | REV of the received packet does not match with the REV_NO of the LSB RX PHY. | +| LSB_RX_UNEXP_ERR | 13 | RO | 0 | Unexpected condition in LSB RX PHY.
1: means RX_BUF is almost full or LSB_RX_PHY_CTRL has received a packet without SOP from DES (deserializer) | +| LSB_RX_SEQNO_ERR | 12 | RO | 0 | LSB RX PHY received a packet from remote party with invalid SEQ no. | +| LSB_RX_DEV_ID_ERR | 11 | RO | 0 | LSB RX PHY received a packet from remote party with invalid DEV-ID. | +| LSB_RX_FATAL_ERR | 10 | RO | 0 | One of the state machines in LSB RX PHY has gone momentarily to unknown state. | +| LSB_RX_LNGTH_ERR | 9 | RO | 0 | LSB RX PHY received a packet from remote party with invalid Length. | +| LSB_RX_CHKSM_ERR | 8 | RO | 0 | LSB RX PHY received a packet from remote party with checksum error. | +| RSVD | 7:0 | RO | 0 | Reserved | + +#### ASIC_CTRL_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x00DD_03DD + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:24 | RO | All 0s | Reserved | +| M0_CORE_RST | 23:20 | RW | 0xD | M0 Core Reset
0: Asserted
1: De-asserted | +| R8_CORE_RST | 19:16 | RW | 0xD | R8 Core Reset
0: Asserted
1: De-asserted | +| RSVD | 15:14 | RO | All 0s | Reserved | +| TH6_PCIE_LANE | 13:12 | RW | 0x0 | Select the maximum link width of PCIe interface:
0: x1 / x2 / x4 link width
1: x1 link width
2: x1 or x2 link width
3: Reserved | +| RSVD | 11:10 | RO | All 0s | Reserved | +| TH6_PCIE_GEN | 9:8 | RW | 0x3 | Select the operating rate of PCIe interface:
0: Gen1
1: Gen2
2: Gen3
3: Gen4 | +| TH6_PERST | 7:4 | RW | 0xD | TH6 PCIe Reset
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | +| TH6_SYS_RST | 3:0 | RW | 0xD | TH6 System Reset
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | + +#### ASIC_STAT_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| TH6_PHY_LINK_UP | 0 | RO | 0 | TH6 PHY Link status
1: Link is up
0: Link is down | + +#### RTM_CTRL_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_011D + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:9 | RO | All 0s | Reserved | +| RTM_MODESEL | 8 | RW | 1 | Enable of Mode Select of all Retimer (1-56)
1: Shared SPI ROM
0: Single SPI ROM | +| RSVD | 7:5 | RO | All 0s | Reserved | +| RTM_SERBOOT | 4 | RW | 1 | Enable of Serial Boot of all Retimers (1-56)
1: from SPI ROM
0: from MDIO | +| RTM_RST | 3:0 | RW | 0xD | Reset of all Retimers (1-56)
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | + +#### THRM_STAT_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| TH6_TS_HW_OTP_INT | 1 | RO | 0 | TH6 thermal diodes temperature sensor HW OTP shutdown interrupt
1: Asserted
0: De-asserted | +| EXT_TEMPSNSR_ALERT | 0 | RO | 0 | Multiple external temperature sensor alert
1: Asserted
0: De-asserted | + +#### EN_ACCSS_PRTCTD_REG + +This register is to protect critical registers from accidental writes. SW should write 0x8F35_D72C in order to have write access to protected registers. + +**Card Type:** All · **FPGA Type:** PMC · **Function:** None · **POR Value:** 0x0000_0000 + +Enables access to protected registers. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| EN_ACCSS | 31:0 | RW | 0 | 0x8F35_D72C: Enables access to protected registers.
Other Values: Disables access to protected registers. | + +#### I2C_MUX_RST_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| I2C_MUX1_RST | 7:4 | RW | 0x0 | Reset control of I2C MUX which has I2Cs of
CB_FPGA to SWB external temperature sensors.
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | +| I2C_MUX0_RST | 3:0 | RW | 0x0 | Reset control of I2C MUX which has I2Cs of
CB_FPGA to clock gen, EEPROM and tray cartridge
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | + +#### SPI_MUX_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:9 | RO | All 0s | Reserved | +| TH6_SPI_MUX_SEL | 8 | RW | 0 | MUX Select for TH6 SPI flash connection from:
1: SWB FPGA
0: TH6 ASIC | +| RSVD | 7:4 | RO | All 0s | Reserved | +| SWB_SPI_MUX_SEL | 4 | RW | 0 | MUX Select for SWB SPI flash connection from:
1: CB FPGA
0: SWB FPGA | +| RSVD | 3:1 | RO | All 0s | Reserved | +| CB_SPI_MUX_SEL | 0 | RW | 0 | MUX Select for CB SPI connection to:
1: Direct access to SWB SPI Flash
0: Pass-through SWB_FPGA (to access TH6 SPI flash) | + +#### FLSH_CTRL_REG + +This register is clear under two conditions only. + +- Upon assertion of global reset. +- Power cycle +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:13 | RO | All 0s | Reserved | +| RTM_FLSH_WP | 12 | RW | 0 | Retimers Flash Write Protect
1: Protected,
Once asserted, FPGA will not issue any write/erase command to the flash.
Once asserted, cannot be de-asserted by SW. | +| RSVD | 11:9 | RO | All 0s | Reserved | +| TH6_FLSH_WP | 8 | RW | 0 | TH6 Flash Write Protect
1: Protected,
Once asserted, FPGA will not issue any write/erase command to the flash.
Once asserted, cannot be de-asserted by SW. | +| RSVD | 7:5 | RO | All 0s | Reserved | +| DIAG_EEPRM_WP | 4 | RW | 0 | Diagnostic EEPROM Write Protect
1: Protected,
Once asserted, FPGA will not issue any write/erase command to the flash.
Once asserted, cannot be de-asserted by SW. | +| RSVD | 3:2 | RO | All 0s | Reserved | +| FPGA_FLSH_WP | 1 | RW | 0 | FPGA (CB) Flash Write Protect
1: Protected,
Once asserted, FPGA will not issue any write/erase command to the flash.
Once asserted, cannot be de-asserted by SW. | +| RSVD | 0 | RO | 0 | Reserved | + +x + +#### TND_PWR_CTRL_0_REG + +This is a protected register by EN_ACCSS_PRTCTD_REG. + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x001F_FFFF + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:30 | RO | All 0s | Reserved | +| DIPSW_DEBUGBOOT | 29 | RW | 0 | Debug Boot value | +| JMP_3ASTG_BOOT | 28 | RW | 0 | 3AStg Boot value | +| RSVD | 27:25 | RO | All 0s | Reserved | +| PSSM_OVR | 24 | RW | 0 | Enable override of PSSM
1: Enable
0: Disable | +| RSVD | 23:21 | RO | All 0s | Reserved | +| PWREN_PVDD1V2_1 | 20 | RW | 1 | | +| PWREN_PVDD1V2_0 | 19 | RW | 1 | | +| PWREN_PVDD1V8_DUT | 18 | RW | 1 | | +| PWREN_PVDD_MDIO | 17 | RW | 1 | | +| PWREN_P1V8_DVDDIO_4 | 16 | RW | 1 | | +| PWREN_P1V8_DVDDIO_3 | 15 | RW | 1 | | +| PWREN_P1V8_DVDDIO_2 | 14 | RW | 1 | | +| PWREN_P1V8_DVDDIO_1 | 13 | RW | 1 | | +| PWREN_P0V75_DVDD_57 | 12 | RW | 1 | | +| PWREN_P0V75_DVDD_50 | 11 | RW | 1 | | +| PWREN_P0V75_DVDD_43 | 10 | RW | 1 | | +| PWREN_P0V75_DVDD_36 | 9 | RW | 1 | | +| PWREN_P0V75_DVDD_21 | 8 | RW | 1 | | +| PWREN_P0V75_DVDD_14 | 7 | RW | 1 | | +| PWREN_P0V75_DVDD_7 | 6 | RW | 1 | | +| PWREN_P0V75_DVDD_0 | 5 | RW | 1 | | +| PWREN_P1V8 | 4 | | | | +| PWREN_PVDD_3V_SYNTH_LDO_B1 | 3 | RW | 1 | | +| PWREN_PVDD_3V_SYNTH_LDO_A1 | 2 | RW | 1 | | +| PWREN_P3V3 | 1 | RW | 1 | | +| PWREN_P5V_STBY | 0 | RW | 1 | | + +#### TND_PWR_CTRL_1_REG + +This is a protected register by EN_ACCSS_PRTCTD_REG. + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x3FFF_FFFF + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:30 | RO | All 0s | Reserved | +| CLKEN_BOT_TOP_PLL_CLKIN | 29 | RW | 1 | | +| PWREN_PVDD1V2_T3 | 28 | RW | 1 | | +| PWREN_PVDD1V45_3 | 27 | RW | 1 | | +| PWREN_PVDD1V45_2 | 26 | RW | 1 | | +| PWREN_PVDD1V45_1 | 25 | RW | 1 | | +| PWREN_PVDD1V45_0 | 24 | RW | 1 | | +| PWREN_P1V5_CNDR1 | 23 | RW | 1 | | +| PWREN_P1V5_CNDR0 | 22 | RW | 1 | | +| PWREN_PVDD1V5_ANLG | 21 | RW | 1 | | +| PWREN_PVDD_0V9_3 | 20 | RW | 1 | | +| PWREN_PVDD_0V9_2 | 19 | RW | 1 | | +| PWREN_PVDD_0V9_1 | 18 | RW | 1 | | +| PWREN_PVDD_0V9_0 | 17 | RW | 1 | | +| PWREN_PVDD_0V9_ANLG_1 | 16 | RW | 1 | | +| PWREN_PVDD_0V9_ANLG_0 | 15 | RW | 1 | | +| PWREN_PVDD0_8V_T3 | 14 | RW | 1 | | +| PWREN_PVDDA_PHYT3_P3 | 13 | RW | 1 | | +| PWREN_PVDDA_PHYT2_P2 | 12 | RW | 1 | | +| PWREN_PVDDA_PHYT1_P1 | 11 | RW | 1 | | +| PWREN_PVDD0V75_ANLG_1 | 10 | RW | 1 | | +| PWREN_PVDD0V75_ANLG_0 | 9 | RW | 1 | | +| PWREN_PVDD_PHYTILE_7 | 8 | RW | 1 | | +| PWREN_PVDD_PHYTILE_6 | 7 | RW | 1 | | +| PWREN_PVDD_PHYTILE_5 | 6 | RW | 1 | | +| PWREN_PVDD_PHYTILE_4 | 5 | RW | 1 | | +| PWREN_PVDD_PHYTILE_3 | 4 | RW | 1 | | +| PWREN_PVDD_PHYTILE_2 | 3 | RW | 1 | | +| PWREN_PVDD_PHYTILE_1 | 2 | RW | 1 | | +| PWREN_PVDD_PHYTILE_0 | 1 | RW | 1 | | +| PWREN_FM_PVDD_CORE | 0 | RW | 1 | | + +#### TND_PWR_STAT_0_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| PG_P0V75_DVDD_26 | 31 | | | | +| PG_P0V75_DVDD_25 | 30 | | | | +| PG_P0V75_DVDD_24 | 29 | | | | +| PG_P0V75_DVDD_23 | 28 | | | | +| PG_P0V75_DVDD_22 | 27 | | | | +| PG_P0V75_DVDD_21 | 26 | | | | +| PG_P0V75_DVDD_20 | 25 | | | | +| PG_P0V75_DVDD_19 | 24 | | | | +| PG_P0V75_DVDD_18 | 23 | | | | +| PG_P0V75_DVDD_17 | 22 | | | | +| PG_P0V75_DVDD_16 | 21 | | | | +| PG_P0V75_DVDD_15 | 20 | | | | +| PG_P0V75_DVDD_14 | 19 | | | | +| PG_P0V75_DVDD_13 | 18 | | | | +| PG_P0V75_DVDD_12 | 17 | | | | +| PG_P0V75_DVDD_11 | 16 | | | | +| PG_P0V75_DVDD_10 | 15 | | | | +| PG_P0V75_DVDD_9 | 14 | | | | +| PG_P0V75_DVDD_8 | 13 | | | | +| PG_P0V75_DVDD_7 | 12 | | | | +| PG_P0V75_DVDD_6 | 11 | | | | +| PG_P0V75_DVDD_5 | 10 | | | | +| PG_P0V75_DVDD_4 | 9 | | | | +| PG_P0V75_DVDD_3 | 8 | | | | +| PG_P0V75_DVDD_2 | 7 | | | | +| PG_P0V75_DVDD_1 | 6 | | | | +| PG_P0V75_DVDD_0 | 5 | | | | +| PG_P1V8 | 4 | | | | +| PG_PVDD_3V_SYNTH_LDO_B1 | 3 | | | | +| PG_PVDD_3V_SYNTH_LDO_A1 | 2 | | | | +| PG_P3V3 | 1 | | | | +| PG_P5V_STBY | 0 | | | | + +#### TND_PWR_STAT_1_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| PG_P1V8_DVDDIO_3 | 31 | | | | +| PG_P1V8_DVDDIO_2 | 30 | | | | +| PG_P1V8_DVDDIO_1 | 29 | | | | +| PG_P0V75_DVDD_63 | 28 | | | | +| PG_P0V75_DVDD_62 | 27 | | | | +| PG_P0V75_DVDD_61 | 26 | | | | +| PG_P0V75_DVDD_60 | 25 | | | | +| PG_P0V75_DVDD_59 | 24 | | | | +| PG_P0V75_DVDD_58 | 23 | | | | +| PG_P0V75_DVDD_57 | 22 | | | | +| PG_P0V75_DVDD_56 | 21 | | | | +| PG_P0V75_DVDD_55 | 20 | | | | +| PG_P0V75_DVDD_54 | 19 | | | | +| PG_P0V75_DVDD_53 | 18 | | | | +| PG_P0V75_DVDD_52 | 17 | | | | +| PG_P0V75_DVDD_51 | 16 | | | | +| PG_P0V75_DVDD_50 | 15 | | | | +| PG_P0V75_DVDD_49 | 14 | | | | +| PG_P0V75_DVDD_48 | 13 | | | | +| PG_P0V75_DVDD_47 | 12 | | | | +| PG_P0V75_DVDD_46 | 11 | | | | +| PG_P0V75_DVDD_45 | 10 | | | | +| PG_P0V75_DVDD_44 | 9 | | | | +| PG_P0V75_DVDD_43 | 8 | | | | +| PG_P0V75_DVDD_42 | 7 | | | | +| PG_P0V75_DVDD_41 | 6 | | | | +| PG_P0V75_DVDD_40 | 5 | | | | +| PG_P0V75_DVDD_39 | 4 | | | | +| PG_P0V75_DVDD_38 | 3 | | | | +| PG_P0V75_DVDD_37 | 2 | | | | +| PG_P0V75_DVDD_36 | 1 | | | | +| PG_P0V75_DVDD_27 | 0 | | | | + +#### TND_PWR_STAT_2_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| PG_PVDD1V45_2 | 31 | | | | +| PG_PVDD1V45_1 | 30 | | | | +| PG_PVDD1V45_0 | 29 | | | | +| PG_P1V5_CNDR1 | 28 | | | | +| PG_P1V5_CNDR0 | 27 | | | | +| PG_PVDD1V5_ANLG | 26 | | | | +| PG_PVDD_0V9_3 | 25 | | | | +| PG_PVDD_0V9_2 | 24 | | | | +| PG_PVDD_0V9_1 | 23 | | | | +| PG_PVDD_0V9_0 | 22 | | | | +| PG_PVDD_0V9_ANLG_1 | 21 | | | | +| PG_PVDD_0V9_ANLG_0 | 20 | | | | +| PG_PVDD0_8V_T3 | 19 | | | | +| PG_PVDDA_PHYT3_P3 | 18 | | | | +| PG_PVDDA_PHYT2_P2 | 17 | | | | +| PG_PVDDA_PHYT1_P1 | 16 | | | | +| PG_PVDD0V75_ANLG_1 | 15 | | | | +| PG_PVDD0V75_ANLG_0 | 14 | | | | +| PG_PVDD_PHYTILE_7 | 13 | | | | +| PG_PVDD_PHYTILE_6 | 12 | | | | +| PG_PVDD_PHYTILE_5 | 11 | | | | +| PG_PVDD_PHYTILE_4 | 10 | | | | +| PG_PVDD_PHYTILE_3 | 9 | | | | +| PG_PVDD_PHYTILE_2 | 8 | | | | +| PG_PVDD_PHYTILE_1 | 7 | | | | +| PG_PVDD_PHYTILE_0 | 6 | | | | +| PG_FM_PVDD_CORE | 5 | | | | +| PG_PVDD1V2_1 | 4 | | | | +| PG_PVDD1V2_0 | 3 | | | | +| PG_PVDD1V8_DUT | 2 | | | | +| PG_PVDD_MDIO | 1 | | | | +| PG_P1V8_DVDDIO_4 | 0 | | | | + +#### TND_PWR_STAT_3_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| PG_PVDD1V2_T3 | 1 | | | | +| PG_PVDD1V45_3 | 0 | | | | + +#### TND_CB_GPIO_CTRL_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | 0 | Reserved | +| GPI_7 | 7 | RW | 0 | | +| GPI_6 | 6 | RW | 0 | 1: Assert GPIO 6
0: De-assert GPIO 6 | +| RSVD | 5:0 | RO | 0 | Reserved | + +#### TND_CB_GPIO_STAT_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| GPO_7 | 7 | RO | 0 | | +| GPO_6 | 6 | RO | 0 | 1: GPIO 6 is asserted
0: GPIO 6 is de-asserted | +| RSVD | 5:0 | RO | All 0s | Reserved | + +#### TND_CB_GPIO_DIR_CTRL_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | 0 | Reserved | +| GPIO_DIR_7 | 7 | RW | 0 | | +| GPIO_DIR_6 | 6 | RW | 0 | 1: Indicate GPIO 6 is configured as output and register GPIO_CTRL_REG is used to control this output port value.
0: Indicate GPIO 6 is configured as input and register GPIO_STAT_REG store this input port value. | +| RSVD | 5:0 | RO | 0 | Reserved | + +#### RST_CAUSE_REG + +This is a protected register. This is sticky and does not get reset under global reset condition. + +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0001 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| SW_RST_COOKIES | 31:16 | RW | All 0s | For SW to read and write. | +| RSVD | 11:9 | RO | All 0s | Reserved. | +| CLD_RST | 8 | W1C | 0 | This bit will be set if the System PGOOD is de-sserted from a good state. | +| RSVD | 7:1 | RO | All 0s | Reserved. | +| PWR_ON_RST | 0 | W1C | 1 | | + +#### + +### ICB Registers + +#### FPGA_REV_ID_REG + +#### FPGA_RECONFIG_CTRL_REG + +#### FPGA_RECONFIG_STAT_REG + +#### SCRTCH_n_REG + +#### PWR_CTRL_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0000_0099 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| PWR_SUICIDE | 31:16 | RW | All 0s | Value of 0xA73D in this register will disable 1Khz signal sent out to the hardware external watchdog and toggle the reconfiguration pin of ICB.
This field is used for ICB post-ISP update. | +| RSVD | 15:8 | RO | All 0s | Reserved. | +| P12V_VRM_EN_SWB_1 | 7:4 | RW | 0x9 | SWB1 VRM enable
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | +| P12V_VRM_EN_SWB_0 | 3:0 | RW | 0x9 | SWB0 VRM enable
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status. | + +#### PWR_STAT_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0000_00F7 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:21 | RO | All 0s | Reserved | +| ALRT_P50V_FAN_8 | 20 | RO | 0 | | +| ALRT_P50V_FAN_7 | 19 | RO | 0 | | +| ALRT_P50V_FAN_6 | 18 | RO | 0 | | +| ALRT_P50V_FAN_5 | 17 | RO | 0 | | +| ALRT_P50V_FAN_4 | 16 | RO | 0 | Alert from Fan 4
1: Asserted
0: De-asserted | +| RSVD | 15:13 | RO | All 0s | Reserved | +| PG_P50V_FAN_8 | 12 | RO | 0 | | +| PG_P50V_FAN_7 | 11 | RO | 0 | | +| PG_P50V_FAN_6 | 10 | RO | 0 | | +| PG_P50V_FAN_5 | 9 | RO | 0 | | +| PG_P50V_FAN_4 | 8 | RO | 0 | Power status of Fan 4
1: Power is ok | +| ALRT_P50V_HSC_STBY | 7 | RO | 1 | Alert from hotswap controller standby
1: Asserted
0: De-asserted | +| ALRT_P50V_HSC_MAIN | 6 | RO | 1 | Alert from hotswap controller main
1: Asserted
0: De-asserted | +| PRSNT_P50V_HSC_STBY | 5 | RO | 1 | Present status of hotswap controller standby
1: Present
0: Not present | +| PRSNT_P50V_HSC_MAIN | 4 | RO | 1 | Present status hotswap controller main
1: Present
0: Not present | +| RSVD | 3 | RO | 0 | Reserved | +| PG_P50V_HSC_STBY | 2 | RO | 1 | Power status of hotswap controller standby
1: Power is ok | +| PG_P50V_HSC_MAIN | 1 | RO | 1 | Power status of hotswap controller main
1: Power is ok | +| PG_P3V3_STBY | 0 | RO | 1 | Power status of P3V3 Standby power rail
1: Power is ok | + +#### FAN_CTRL_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0006_6666 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:20 | RO | All 0s | Reserved. | +| P50V_EFUSE_EN_FAN_8 | 19:16 | RW | 0x6 | Fan 8 EFUSE enable
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status.
(Exception: this signal will automatically clear when fan is not present) | +| P50V_EFUSE_EN_FAN_7 | 15:12 | RW | 0x6 | Fan 7 EFUSE enable
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status.
(Exception: this signal will automatically clear when fan is not present) | +| P50V_EFUSE_EN_FAN_6 | 11:8 | RW | 0x6 | Fan 6 EFUSE enable
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status.
(Exception: this signal will automatically clear when fan is not present) | +| P50V_EFUSE_EN_FAN_5 | 7:4 | RW | 0x6 | Fan 5 EFUSE enable
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status.
(Exception: this signal will automatically clear when fan is not present) | +| P50V_EFUSE_EN_FAN_4 | 3:0 | RW | 0x6 | Fan 4 EFUSE enable
0x6: Enable
0x9: Disable
Although any value can be written in this field by SW, but FPGA will not take action if the value is not 0x6 or 0x9 and will keep the previous Enable/Disable status.
(Exception: this signal will automatically clear when fan is not present) | + +#### FAN_STAT_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:13 | RO | All 0s | Reserved | +| FAN_FULL_SPD | 12 | RO | 0 | Fan speed status
1: Fan is at full speed
0: Fan is not at full speed
(buffered signal from CB FPGA) | +| RSVD | 11:9 | RO | All 0s | Reserved | +| FAN_CTRLR_INT | 8 | RO | 0 | Interrupt status of fan controller (fan 4-8)
1: Asserted
0: De-asserted | +| RSVD | 7:5 | RO | All 0s | Reserved | +| PRSNT_FAN_8 | 4 | RO | 0 | | +| PRSNT_FAN_7 | 3 | RO | 0 | | +| PRSNT_FAN_6 | 2 | RO | 0 | | +| PRSNT_FAN_5 | 1 | RO | 0 | | +| PRSNT_FAN_4 | 0 | RO | 0 | Fan 4 presence status
1: Present
0: Not present | + +#### THRM_STAT_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:2 | RO | All 0s | Reserved | +| TMP75_ALRT | 1 | RW | 0 | Interrupt from temperature sensor TMP75
1: Asserted
0: De-asserted | +| TMP432_ALRT | 0 | RW | 0 | Interrupt from temperature sensor TMP432
1: Asserted
0: De-asserted | + +#### EN_ACCSS_PRTCTD_REG + +This register is to protect critical registers from accidental writes. SW should write 0x8F35_D72C in order to have write access to protected registers. + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0000_0000 + +Enables access to protected registers. + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| EN_ACCSS | 31:0 | RW | 0 | 0x8F35_D72C: Enables access to protected registers.
Other Values: Disables access to protected registers. | + +#### I2C_MUX_RST_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | All 0s | Reserved | +| I2C_MUX_RST | 3:0 | RW | 0x0 | Reset control of I2C MUX Channel 4 – VRM and Fan EFUSE.
0xD: Asserted
Any other value: de-asserted.
This Field is NOT automatically cleared by FPGA after reset is issued. | + +#### FLSH_CTRL_REG + +This register is clear under two conditions only. + +- Upon assertion of global reset. +- Power cycle +**Card Type:** All · **FPGA Type:** ICB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:1 | RO | All 0s | Reserved | +| FRU_EEPRM_WP | 0 | RW | 0 | FRU EEPROM Write Protect
1: Protected,
Once asserted, cannot be de-asserted by SW. | + +#### LED_SYNC_REG + +#### LED_CONFIG_REG + +#### LED_CTRL_REG + +For bit definitions please refer to the section “LED Control bits”. + +**Card Type:** All · **FPGA Type:** ICB · **Function:** none · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:8 | RO | All 0s | Reserved | +| FAN_ALRT_STAT | 7:0 | RW | 0x0 | Fan Alert LED status | + +#### TND_CB_GPIO_CTRL_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| GPI_3 | 3 | RW | 0 | | +| GPI_2 | 2 | RW | 0 | | +| GPI_1 | 1 | RW | 0 | 1: Assert GPIO 1
0: De-assert GPIO 1 | +| RSVD | 0 | RO | 0 | Reserved | + +#### TND_CB_GPIO_STAT_REG + +**Card Type:** All · **FPGA Type:** SWB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | All 0s | Reserved | +| GPO_3 | 3 | RO | 0 | | +| GPO_2 | 2 | RO | 0 | | +| GPO_1 | 1 | RO | 0 | 1: GPIO 1 is asserted
0: GPIO 1 is de-asserted | +| RSVD | 0 | RO | 0 | Reserved | + +#### TND_CB_GPIO_DIR_CTRL_REG + +**Card Type:** All · **FPGA Type:** ICB · **Function:** None · **POR Value:** 0x0000_0000 + +| Field | Bits | Type | Reset | Description | +|---|---|---|---|---| +| RSVD | 31:4 | RO | 0 | Reserved | +| GPIO_DIR_3 | 3 | RW | 0 | | +| GPIO_DIR_2 | 2 | RW | 0 | | +| GPIO_DIR_1 | 1 | RW | 0 | 1: Indicate GPIO 1 is configured as output and register GPIO_CTRL_REG is used to control this output port value.
0: Indicate GPIO 1 is configured as input and register GPIO_STAT_REG store this input port value. | +| RSVD | 0 | RO | 0 | Reserved | + diff --git a/docs/Blantons_FPGA_Registers_Map_draft.xlsx b/docs/Blantons_FPGA_Registers_Map_draft.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..06169338087e05297a35b6bb15b8058c56193904 GIT binary patch literal 94649 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 z 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 D4RAOr literal 0 HcmV?d00001 diff --git a/docs/Blantons_FPGA_Registers_draft.docx b/docs/Blantons_FPGA_Registers_draft.docx new file mode 100644 index 0000000000000000000000000000000000000000..439ff0f95b20c7e6600d5d99f324f327e1cd3530 GIT binary patch literal 376299 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 z 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%0DyU)p9L)ln) zIgK3-7b@~l6zs85BiG>^?&lbc2RhmsB!b($Q5cH5P!i-pK&5Q1{irF3w4K@ zG+{>5NxzbeJDE9 zp<&gm)EVSCU?)xOVW(dA4}tw28a&;J>SB%O77ZU=HQ2~QaVD+fHo9Yc%5S!-Vw+9` zpcJW?d4h&?WGfFT-raOX;KO&180@X8r9jcVApV#+93Zq3AK8@SVtp+^zq+u0G(y==W8ZEfA^Vzh5I6PNV+N zY8;w~+6r=mmRVBE_4zWWp*N=(A~VYEBxH9M^pUinVPWiEYh5w z9~vVRO3yp018~pWp-yQ|6?JCag@Kp$I~HdW+2G$stzAkAE%CmU-@Z>S-q-0D_8-)p zxPS3DJXkVB;D^o=EYADzWs4L^vV1XRispR?tIZGU&tLX_A@lOg7IoF`5)|EXWb#ZG zd5ZbW6Vl(I#qgP@!KLY^>7Mb=lFw3D8$xtml;LBp{^3#cJ8C<b2{PEg0+@NGhNSYo0(|5N{OhFHSBCM!=oj=C3i%iNWLk;6NcVC*hRvw!| zUd3J-^e{CO(ZinhS?rkkrp^7Vwv=TKMqhP7AUL@c8-L`O5}wpFV@p2z?usT7$P}Z~ zmqk-GWsO717`c~iPr#CJsGfL6O+*1t0@N{szYusqAg1UbX_c%X!f6DJj9&g|T0l3^ zSOWC6(HD*oeyN88T28UrQlFYIr}1lWkF`BaP+(5!Ie`_{v@ zT8Kz^Q92^$8d)9>@X zk5gjip_nggr*T*rUcJ80CsHPeIBU$&sZeepKB4KYcFpN+_m|;T$OUmj1v+_Y4P4ioy|SP(3IXzE zimDi_!D==tB0nqw)Nm1P6OuK;e`ah*H94MqeTIuNq%0!vQN<;0? z*Xm+2O2}#uo=~CjtB;Y86e=?_eQ`hjxOOo`+AoTtob-NXfQ!t#ynN+`HFc!PZvd^G zk)>C#oXT9C~l{GSv)%{fFXpMM@;%FqX-(vl+k_Mnjw%4%urYt5h;rwn`VD@_oK zJXx~%O_3%;hWO$}GRWWv(k2XdLLS0;W5~&#e#hY&dL}qcks_m0&)0Wp0F(?UjBCT# z9nwB<9k|Y}W*}=w2<7W>*mNl|4R)6`db4|)P=p)GZpPmONUPIbp$Vzlhrpf>QwDbC z*f@ehngMlz!(FY9{JaSSg{A_$v6vi6JUufC&6mf@3G7MTxd!fd2nU>0fG%7hBq68- z=1IM78}*{j&vpXqqVChd8J4>mRHnu#>zn!etU%&PwpkwARY$OoVi`?Mjj7XNl3=z{mGk-rrFjl~5$bG302R0g8k^iyJbA#}Aa=+}P8F?{$(n zc#BxyWMo9obF>2*6-GYb++_5>P3-Vb7a>X`)B>|s)EA~cwT$^?<4=26=`Fdy=UcZn zyoNC`--_$0V*vPEk4=y8CdSF?vYJ~oge&&k!-B3(n1&cf3i8VKKyAW7hqETIy6JdI z^4AvAH~$2M%ps#~o!;%4FKk5h{f9+|n{-h}>Ge@LS*r8w~Z&e=evFV-Hos9ua~wzV%{1Ukn8NmWbs$+%x~fUsI;<7T-g5cMch|~h&?zQ zXmx@@+;97n_J^#{r@l?z<1ed=^6?*5m$H-U%b7>xi~5TJ^z?ppeB&4gl3bquw13E( zEvlEV_ET$X>h(XguGjeB1viH6wEDz7gdOfvmCmNPsaeyexUZbkn? zXXiq*7s)@JS-W*bnnyw+*UWV5my8!+r;f?Gh`^^Ml%0)B3?h%BS2x}oT}Q7)WELlf z&)wtn?-3bhl&FyuwQHcT_+o!Y>3>yWM#v`nahEyGOnLq%L0$sCUAv5Wd^md2MIR^J%_RMfdI zK&g|c;dgh(-xqj17%1T+OLHx)2*h!dcluWorfZSkhiaCaVl)ILDlb24( z$Tqy{lWB`afe0W%Gxq7cQHwY8Is(-lyT(T4+-ca}|ZeAjuKtgubQq*o6fw$~nLR!Y0M{)%BtT|w zQ()Dy^z1Y-Z694hy=$7msN_X9;iviQzl1CDQYQkE1WcLUDRzL1n1Is0WAKJaPQm-* z)37K@3x&TdMbRor$iZK8dW??~`*yvIK|W-a<&*3@E_GoN8ZnsrB>T4?(bG@Eqb78OXPdU`B-|Ihr`olU|?8?$AIhxg6TCeT{G7w(vBE{u! zWU-+u3h97F(nZs`zmkx4bE6y1K_Hxjc8Nl@N6|*(QMo9M?w)dloKX`6{<$c-Mv7#r z^IKUb10b~AYwn;t&&?A7MaHvMjuG!2{g2M<$s)rS|IyK;%oWPoR)r0ALTFlT^>57L?wTwUBB; z*r^|raWv~m9Ta0yGaOFT`AfLbhWRir8>q=Dtxt2oZD*WTW8XVWfe>6Df^-AT}GrgN^b18(6mp%-Sep6#*{w99LNr7KM zZ=GfG!BA9CqmzyK;w-`4H4jDQ*LI)R-D%F-C^EjbZ<*<>Q(5hqS*bs|=-7H;cA+R^ zcJW8-@9FP3M|>LB`F3@ms?Jx=W?un;l}GII{xo>qw+0_|?}JnEdA)Kge7`stJYOXd z$#+07{e5*lT3o(X>T~qivgE1ja2MwzT2C{Ra-BM(c@;8v{4p> zKHR{{F1qrUFZ$i|W7^QcKXP1TAKa3z2O^;@1-+kkGQx0%Q%=8HsUVI1%5l>Qx?IMi zVShfCaGW)buq0|(#GHe@0%#E7!OiMmouJUavR9ug4>aE2eDxhxMj2T;7WW|&JF9LC z9+|||0{zgq(c8|H%NtGwXD0J~{U<~HKmxow+x2W%l!sNN&o;IO}h( zQ)8&rOg|HBHLk=?$o6VE=r}R4kNIefW-Yz=@cK8w!!oyBC0Rj_s_< z^K;vU*HBSG;(AQujzugZbZ{M>1cG+%3dDCKN^CKhSx$Td@Vk&<(}!OGepgmG5(T`# z@UUf7ItuE3ExcV0-TNPY*W`N8NNfcDxI$~DByA{Kbf2GUoq@U~A8xGlZsVK`C*hl6 za`_rLgvsJxx+7q~2Y?A&eJbJ(r>h>+%p_Q`?dO=X*Lnd~P6wlAsI<=$oY!IQTQv2N zq~NQ(oS@N;+Q@TuntwVPG1iqZ_#f@q$~%v9-3S#wp{qTC5adG7sUa$+*YzfZ zk$i9L+2Jo#&}w;FE`%gfZ@CSssnuUkql~)^y7(c{vJ&n56i-v+YWr{|HY-=qLk@abiI|G7!+u?V zg|blHU}5?bEofuqxi_#v^tOTELiD?$$tc4Wvaed^UsMfSnaT0~Iy|4*uJvOVlD!QEJ)SpO^ZLqpR<1XD1pqaZuGnnSoFnEoKVNbM1 z7NlMweehH{SsVrf`7Dh{i+IScyM`@`T9(AKq-PD$l!!`qx3jh!4Z9dW-d$)5pHV_Q zj!f%dPut!m~O!m;dH&_|CrW)J$OjD-UerW-plUe^HD%xr9jb` z3!o2wr+vIC z5Z8F6rR^Az(CCVzptI4#;cmBb^>uKlrXjU|mdGQXS)9Km1wDu-=ooRZ4Hqdb?%jvX z9B8zFNx{X^b%&kATLjR-HNG?er3NwUI~;i1epDRB1{=mEzAq(RRdOM85+uGty47(f zDDJW_lCRs7^j-Z0{k|AFij0xo{!*ewX^Fp+^CQEd!n>WVE>y0=XZHtjk)4w!J!zLLElGAy2UBo zE67B4KDdvupVbtbi%zS?A{$`B#I;D+%rfI?Mns_)bxR=`CAtrNGNlf3(g7NbyLKY- zz*>^ivX=C{`zaw6XjEZ=5Wm_G1oT&;p0tatKw9u(=8%2O68i zUce%buvzwv9R2%EBHCurldKUGmc1%OqZgPauhcKnJ&~KKW;g6+68Af#(DJM9afgPm zB}I}9%w%GJKMC19j!FUaZf#smYa_wsJ5^v#SMFHF&=MLa?rbdKE}3WsqQcdHV91|MNQXP!e;CI$4)TYkk<&lm2?93K~7u z>cH!Ng;eDu4kvq4IRG%@GubY-Fm;`lXc42? zY?{c&qSs>dgr!eo zSW^j_aVrPKYQic~X!itkGgY9-dvYDsQpj|3f!ikn6!IAg;-EF0LbVg8whjoLOHq%o zfhuZI3sO=+o5oK+w7N`M#&A~}()8uufXYS7Wi!&vM8FJ#E%ZZ;>@yowmwzw}VncsC zkp`W0Sj0_%pV!~>0>i5yF1c<6DD+m7qN?3fg|*6Q-Al9=ix$xP5GYX<)3PbQNU}qL21VcZKYk#vyS0@8baF4p$n$8 z*|H>bINqALgonPR&ZziFCA2qH?$gG z$+M9w0+)wvEN!t_iW(;6JN2&|30God7LvkpE(bRe^|K{4@W_+xJVv%8$M+sCA;lHh)Oy9zdI^*yH>YF$A$@a`D&)nlEDpfMz112WTC0t+bkM>xC=1wiU**@hf zMl(>xsBkpZw<*9$v_S#RfZP+B&%fG{{s*LlVU8t&X2swOIJA86LtHCKQ9gj^%w_b? zD*x2|;xTiI zJq#JhDB9Y9!#GR#leH|c2nj(MQJ4_vM+iaC;LiO$Z$)*S?wcN*@m=Bjp$ct3!h@5e)Q}w_u zA*C&1IfaG>idGGT*`%RV(#fN`0fkIB&qPGx)He$#a7>sN$9cP425ZA|1iy9N>x~U3 zoY&>&y26>9Zz`B?D zYH)&*FnJNpaMiYr9MKor03tf!O8yz>v)YN$6MX8<+ElC6RSw@=6lr%+|ZL*`4n zLf>h25+JaoKfDP7jMkwcX7}~#)jW!@ibYk%Ac2x{%m-4(K*%F78{zzk*d*l%fxHoa z`~|g9%6eKa$pqiPjceOKzBCg?al`-T+&DB7_XixI5YU3y;*TIwJ<6DUH&Dx>cs7`q zji9>MF4wHvS`UX65Ky^TS(6OF*bwktYbjN)SjLz_#4%)oJhp94gpP0nK8Tuu#m#( z1vid`%t{hq|O!YS+A)QTiYm=61&zMC~xXO>)OYvn0yjD!*{6d$!Y zN9U-zMNa8ySqdlKo+!Yl`*ap2Tkfz^89EVFvgSLPT$n{L^r2(REc_s4-($|(`@XGN zZ-~vJieW#KT#Z6WKKS4_XEANp+JNy2a6Fk`#uf#MxOxr>dXPNq*s11*@N9v>9=KoG zM&1r!7~Xrcj*j5L`}wY*fE>V$K^ ziEnl3O`&+<9A**^f35FdlVNW0O|2C7#snBTLbS?^se0L|M&c2yhwz?uB4tq^VKBSU zqN@MS<#&O~OmvbaIUFjPoa|h*L)>gbwl>V9b2TZ)OnQ?a2__iSVySx>id$N)R|~RC zbj${?-Ex;aShKb$FF2_%icTibILC6Uj!!CBGPLFDY%Y+im&%|CJT)Z=PFV&RBz$h- zrcJzRGBsAO6K#t)s;uzsp{*@jJQ$>;Ls>LhDbK8FG1~k=E^=tp6A&igE#;ym{tl?E z^(D-8yyT%@J|x+Z9*i0(`;CY%eeR<7BY~km+xb@Mx66zKyVPX6;$fkr1|^a1yi9&& zwG9wXEXC@eLjqPC#P1ZmvS!*RUbW}J$I+OEQU-=GDjAo&f>7pU9N6<{A%c+Tu_zwsrj#*&J2}P49 zTsJQFViDjd_0Dw>VZHCa&yfnFJtmq7OS|i$Q)*jFkWd-UOhN83}4<-196vRZ4xQy=j0?IDC1orBT1>8 z0vkjAU0JX+R7OlQ67U?dh5VR;b*TiZ-PS@p$*LPm-c5>=6Nv>9W{j8{RlE_M&kmvYlRd$9<}z?CjAsjv@JB)?RclU++VG3TU|7~dIE}ml`ct+ z`5G4C>wIxJaw-6+yMg27!$9-AYXEy!N8dn?B6OLRI60hS)E)>g{n-r@0Uh>v1tb2o zp=1JU`}WYUnKGJjs&tz8MEzGw-Qm#GFRI*j6Cu-7&r0b~jzJX${mRrqPS|(r+0Ybw zoiFLzm<<@I%gPu3j@-|jPU!oJPdkt2bnb8ywo-&N4^-giB!C=oi}%Zqx7#~*=S;bQ z6>ZpN)cqFJ&Ym3cA2iU2ua6{#31$&;FEU_h`EmL(<*PL~arorp#nJSlDURZ)tE2gl z{vNT5VA>NhMx((y#WU<}K5TFBPI@U8mhb4-&&WiNWqSEp`o$_qKlR)56T8Q@y*N82 zuMgv{yXO}6k)-R3?H9*CoAOb=%n+MifqwDv^Ns-4@OqE(7;&g~qh}!6pIVhfQKV0| zB~I;oa84(u-C_OAIKzkC>%wlO4LnGq<)iy6EwYxSzUkA2wYD2^kBeYYPQ@;0jR0bo zoZ3v(j+z>yyuGr!cKpd4VWL%za?f_M;GQ4uv_%G^pK;-@b0^#23O(ZPdPCp&dDHT9 zSnN}FI=`3?ZN{Z7@R(=KU1xpWS>GQ|O}TvV-{Y$SwxxXk z`sEEbJo7qa*=y+b*}k*HJvIXj^Y%5Fvnq%ADg%O?^C*>v1Z*QYsRPi^q%DG#hX*ct&af}SZ(J<-qic&p;ITxdMdDk5- z%{g0*@$pbHLGQ~e$&o}jrKfUbG#KK3Vu^|Lbb9;YZXEzN@0hs2ERW5w7>#-Qt>UCT zQ&SZQ1lIVnuMf`zvY}~&J8qdy`u5?9<^t>X!%i1X z;HVgY(Z}KmwN$utK&k4<&^dCW&(of&uAsc)LMWbpgOfo?ISeB=D?!pdjX_cL+l3-0 zO7Ws9@aB}~ z&gRuZ@NdWH1^&?4+Opq4K?O-e?c{_On@lk#_+IC6^dF!Bn21#zC*j9udEpo)1u zg?AC!V}Vwl(GlogO$m*9Ee{6jPe>f^`C3`?4oA|$HiG*&Y(BN_j%iv*ZYxGIbBlBG za@)a0hX=9s-kb%zSu$LTt?lxOp5jykJ7f&+Y}oh>wc-^%*(?>u8g=M%kl<9U*v397 zWHY19Ct1~qtwzHqk=*Ly$lRA{&= zenV&yy&Z>;!fr2;Q>2Av7evd2a1ggA<_G5)XBumx6N4drFA2lSMlKM>=ru!U#^4?VSLm~(8hUJHjL3hhBcIpFpJubC8|-AW z4NYgE%U2plmU1MQY2E3r4nA$$<@UD*?-5VyprE?7V$W)93qK|uRWI*P4`lZk3wz+f zf+z2VbDDKS;@uRqQECGh!SPE)3Oey+eLJtawgksW)YX4bfATZX(+izltl6^g! z366o#H=lG`)!45=%)A)Ly8ZP-(r@|xxBs5w>hq7$UHHj=3CA^lpP%dBY${Q|WShTz zwP*41ZpDcCBSw0`4374H{Q6ONalB36ATCXblvIxTlxwhOi zH&wZM_5ZZxt$8-Y12N7q%882hYN(Ub!igmV@tIqH;vwP+lksGVO-* zpuvY3&{c&1->p>{(A6-i4GG^FsPwNaCnOiCYa#L>+H$>lfr)7&*$SZ&>!c_c;PQ^G ze&M9C-?m6o34}49Y2@AtwC;KoOwxT3F484kl;hYA2;j)GP=|YG`c=%qIOhAzh7Z;{ zLsgHie^Z1092Ytnd@o>NM z1-Okp2~tSJZrqvX7?fv$qKKhmmVd|ZW%uZ8Wn0I0%Yx<8_1*8io#}Nw46XA+XXh^M zkN8g9QEvW-1g5viIBFMxF9jbBgg_+vPS62=$M%ltzX!XyYrxB04oNgR`I{!Dz+s&<8Ezbb^ygdAUeq;EjcV;tVG9`>o?^D|jjg}U7 zlFiOTt;)78ZI7u*L7E_DazxYibYoWLf}MJuU&H;tj#S;f)Kdb z!5Sk#GpKT^1nyp4)Q=K*e1e9SlUW2PQKzi6AMeK4Pp`GWPn+RJuB6g9w71aI+VR$# znucP4vJ|E}+1@|la1^dTYT>+J>cw2m7M&$5glDj&vOSt{oG8^HF4ot6YW8io*6;b9 z!$N}tKhvKoJ%=KqrDbkANgV| zm)~UP0w$_Aq3V*Tka%k`2tIiHUE7xsD!=Dd2pc$rgGcB=j_c)*Z(>kI!zx7$X`ah* z*MM4}tQ<`V93mSO4m1O_E<|b7&OjkEZ#`xT#*1OredxP!r~j!*k|W!>l3>fuF)vWgN$XftvSBZUiF!gjinO&o2L3&T~@=DaN4QkLi0F`lqWG8k-c^5XT-<9YT| zODLFerHZ#x{`%^G2u^X^J89Plu`+Co!Yw_w;3JpMQ6-Sd%iZ-uIqA&m@m)ngcAF_; z$umMk|MfDM3c}v^3N2pLF|nIP60}};{I^^`T?4C7BCm{>xdEgHd;k1$8Mzi}B&>TS zD_N~C0a`05jKaQ&F-{WQ$YyE-b^rg9@`7MG&eDg{T+ebC1)Q3nia+?;wv z!L{Tye*(JKx;mn3Uyr?lQ5IgIax>#W{7Wky?Cqm|lQ;E<$U9nl`h76r#rL}~jp^n+ z+CekdC$AzC9hEbwdZh!wri?}IKU1<@zL>2DomSzhCGbfGmn{8w$ccR@U@4*3ez5aW z20CsP^2yk4%YOf0YL&W$J_QSF{@FB%Wx%1oK7a*!)~e3oUt*WVATO}(27{W7Rl>Zi z9t?VSf-s8t&@PXlDwH80)M0QsuK@0IrIrtrmt}Agk3GqGCH)mJ!kIb(eCBq4#1wz_ zJ=fEo@(KO{?uGeMi85=6wpMU^?{^2=>p;$O&1~{TWFDgHWbl}8A6)TuaPf6?`Q}Sw z4SMU15TvpTxgBY03(L-X%^s&TM&&b&xWv*S^U8!m$~(4J*O# z1Tn0TaldQ3ueT8&?J{&X#;M`YXEAD8@3y8sqG{S|Bd#g%U2xKr?b$p#d#+R(pNAmNhX`?l0 z8+!J`GIf_kKl+JT?9;pmfwVB&9vf@4NqZOVYYZlj)Wp_@`0&43N8iIMTV!=?>qu); z2F-d|$S;JZ@&UXoXmwqaP*S~0O^x&5n_ci|;Xkq_9Zr=6oANspTOB_y$0<+t0qA~# zNQQll`aN5Wc(xhvA6`C4i!SLE4<3W_xgM&o{M(IrkGZrCxHLW1-1?4(ti%>^X9A+& zLU{$_b$%oLBNLs4D=!B7MO&W5E$qhQCCro7sHdakwy7|{d=X%0E!ig6dl>vm3o90! z<{R;8%H>SUy1!9*#Q~q*&a2ugxUJhvJ<4!M%)$YMcvjo<^9SFAr6tc$(BN9Y2zTL# zH*?yHDZ_{DnqjK`J#deVULHZ{kJE!*zj5$ho&l3%))7fa{oE1yALI0rGgTiuwv!n4 z<6y)Z;Gz~?XflKhfvw)}{X~KT_*lTG<#?!2ubyeU3)ES%aET*NWN&!Xd4CRQkBpg9 zD1av|uD_8;XLo8Fe19x|(eLr!r+n6I}{i5m1ijEE9+oqMI zAR}Uk<(06QM1kS$&?XK5Ys{vE2ia&0V4G48{ME_ydZP*JS zb!v8e`yM|jEF=Q>vwt`xznOcvJ|?4tUP*6WZ7*{NS5$c0Grb=Rrj*nx>D-N^lq?iE zFOWJ=DX`56b4vyj7DN-XoI?|hR(*KlQxv{*TLBSMJg(D*N0)#_^hEOqOz%|Y&4qDs z&KVqalNCA+_AS;=7Xl4yZ`%;>8>^i!xcE$6;8=knJ!D@Y$v#R#ih(Zw-YL#E)Viea zjw$NXdJ({NKr=6e*I$N{h8~F28u1!4p5j3UeuHa0*)=k4;KOaGI8aa|A_G26uv>nHzz&wzsvm{!~oBOIJ%bIkX2PQ>k^3#|wj{C{c~C)Q(Vjf2vS_)I&t-EXC&-4zWPs6A0wPblbm)`T%!KCKFma#~C)~@F zTJgl$(4OuA=1bJ4so{P zut!k^2PsjeAu42X>Z)6?phTeT__UlZV&_Rb_R(LohlSL!L=k! zk`XyCBsY_rI6XH9QXHxaE7~1&i5E7#Ve<6#`!=$bpY8()l%%Ct`(2&TFV{{1RWG1R zgXG2k!t#0iad7pgK_jW(ey|f)4m~y0N-koQ3^5v_%pyLdd#9qOW9o4ucRKXfwTxL* zo^gEf7<$rbTs)^XzMc^(hsW6H4PYqy^vV2W11ymteAao)e*Us!#nU&tmc16&Zl#@S zq%n@c8qxAzf3GnDk)k|WP#6@oe4Y|KCxyR-`n77P5zKRp-m9oBSfMMrpLTxwt7zBg zsCV)?UMC@m&9<**WrdvO`g_u^uXgXx4==B0+?vR;F?95pvYoi=J;<#c8GI<@W{!NW zzm-dqVkqy@wx8-}R#jY^x}PqzA6_p3e{Hni6VWg^Pg>i%>1V=oQAbEQGBrlM4be^< z9~wcbexaMr4dd5}>e^71pQo2!hMw$ac9vdI=kl*e{-5I~k8!sXzgBm?$@et5?@Q26 z`Ta8k5NiM54B$VluPd_41fvA!aCtdaW!Hm)RY<$K@CT-@TU%q{?+nms7%d@n1`X>S zug5D!nkKBR)3A+~AC0!+Xi2;OL(jiMd!z4ObN!HvM^5j$H*-@lMg18C0CYvC-TVc* zrd09%|3Fu+CptZ-^f41=!)l$mo{Uje)?MV?wh@`FZ=_r=k6p=iZD=oFw@ldV4}v>* z|2CLk(6n?C)wW%TTFu-RF?mN%GEwOjY`Lsi71*q*hd^f7TWN3i#O2GKUm?ATWpG?XG-ZtP(V-ZF46El!2odFB>W*(r(Zg(0pJ zkmnXIEi5si%d&7Wx+zbD6v4PVnAO-3*t}lW{M*ENk5DTk7$XnSCr%+6q-;Fmw|k4p%|?GSy3JXoeWm|0Ie%6!L?q|Jv_B2HqH1KUV-0deWzjQv?k^Bu51zTKmA`{U@G7jg_Z&JyB z*p*%pRNa?6jS@J#+Nc%W%ZjezC&4Gk=8~U?mvq^DJU#qgL9pqOW5Sw=GS?;}=<($* z+^xDUBV6oK#h;Z--fInw0sJ{IT~qwmd7946B#DfhUewYSz5IS!|3Mn*@#Cv`Ctt0a zETNH(f!wfkKNtwAMdv1JGZax^>j9=Ai0`Kh>&vO#1B}hn-Vq->;Tbb=23^M2lxA@b zU8vIp#GKC^#(hJERC0i6vwJi$*-72Y)g_mDJ=2MYe)YJu50kK7oqPH_n7hOvR87j` z!wH+jw3WbQ4J|VD9^+T}uJLl#<`$Z$SqS-qP1k^li@yhU><&d|i*n+5%FsI1*fzyg z4=EanOwKA{fvt48ZzdaMhDP1Y6gX5lp`NCpfWRikT&SnOqg1)h0Kx>#a^%yp?X?d$ zi`r^7Tl`$6sZ=aQp)1Yr#_*L?=~A9Y6_5ByJ|X-67Wx#s(u_hgeF$(gzZw96P1XqI ziVK;W155SnMBLrif}#wXV-eHzQ)Js| z9DSq=hY&Zi+pP-J7HVqubFetz^fEngh4VB}jB5&Xz*kj*FOg6TII`{My2!|=j}S*fr_vLz%9bg4A!Bc&$2}mlOO$l%e50DS7}S=pmivq!>P|zm3(J$ z$n?xvx50zwX;J}mIkE^JP)?ARuuwt%F3Z&gYFrPPl;|Iwy?HR)5Dc-HlKVAC$gkxr*1#Qofg7 zxaNlIj5s%TKHt1Bb$b6{xLvGL-yf@f3cj|)0$)-)>_ojiswmaFfnNoGIo-eJzP4)= zV^qlR{0Rm%zrs~gsJ{j&K*(DDZ|?)Ch9}tRI1n#Z$S#^_#D1t}K`&8s3JpZjR%|iy z%9R9KX-L45|KUIkhY4^tuinZ-_KDp$HsVgYF?>ICeI^H()(?p)Iu=vW(tmp2Dw*G)s`Ll(HJ&;ye<1w5QqhgD_aJXphw(qqu=u#P>=;k zu?e9#GS8qkB2X)tWAaLP}$#wC8z-GTGt!Dre&cHda0L8H9EAqoeKt-k>@)ChF zGz<+vn-S$Oh~F0&$A%&mw67gk0*NdCxf0P)D2QNd&whY=Geyjr?aaEa!%0W(n|Fah z%0RwuKdnjy`g`aQ&VLUj1uKwwERp!9zj9#d1_q)uY(9}z46p)<6-uDFZ5iGo5PhQJM&dsemM20TS#RQ4yb$%a*`|Lu{uP1+kd|G*>Zz=4!}rmhti5 z=4#}h=E{~W6bZK&)tkyBU=|pQIVH>o=5M#th6ex4=B#mTxdntKd)S#&V3DpaltN=& z$Skf)0mr^Z7biM@v0=Oi-_5=l7^_J+kcMrF%;r0s8z4{#N&Iu3p{lomI`if ziaSXX!%OJCV^Jr@03^j{VGw$jh7rW-y%;o;;^J0~UHhS?q^5vGEzF^EHpx=hC7`+l zO+{uoR^u==J(+(e9Cb z9qJy}v6RTh-e-hExrvx%?eV{eA5=jZ2YltX&lftszRT%@KqNu%-Qx6HBegiDiT23d z{YUq%p#`hLLuN{BJD#T)4eHl+CrLKGTN4tikWv?+cpOfGf zdG+$Btt_qo{${l-O{W3z&YwRz)P45Hs$To_suYhl3{Py88^>C z)A5lwee(VOZRsA((MJLqKdg7I%&lKB5R6I;HKfo>jwvbJYk{QMnWR3s?-}-xi2lb} z!Xc{P=}HC7Vq|Mv*l)~c`izJ$n^@Z{0pR630K81?6|45RYCQDke^oe{c}Hp44~pwZ z)WuWpI!h}%PCH#bn59_!Q}=JPPPEI~JG4B-hlCivbcvSQ&}z^fO=Sp4pO!nS@XwO|#V(H& z#bD~nnp1BD>w33neY5^lU)+7-f3JJi-!6Ya0<6RQd?w%j=zeeA%7FDQ@tGuye5Uxa z9{XB!hTa(OQ@O$C{JwQ_^pR|BYiZBOFibjg%)IPd`#oeiyTa4Gg(1Ly%(sFTyEZB1BHCF0Y&mf{TrLgzt7bw6hn5&?_D`wx-|7nIa) z?f{sxecW&@OO79G__%bDq+_O?2Z0`n>my!V13UpM=I7$Pj0R4luMXqMNz}@GP<%9{ zL(i;|c-ZVO?78`h6N?C}LX9*jWx||6k()ivOrvQ+$@#{Fm+|wHqFA@-Qr$Yo%}PLq zsNvqg{Nzv&8y}JFR99-anf)Y`#Xjot2!MwBb_r>k9mK>IiM{_8gv~KE&GLZrT^2!g zj>Taz*@jjP9_IBOtvOyuiOxs96N2JI4&CKHeG3;CI$n;XElZ%lV-|z8Iy81o$gwzm z9<EB<;`RwT$NuoNZ>0d82Na6RZ|L@lX`-;t$h4gi zf=)sAax+XmSgb;CV&86cT`dp}D>%~9p`rsuX~f8WhfN(_Fo)3uc{a-*q=F@=pdn?L$c;xO`?ICQ~_iHoo4Rf zIb{HuSvtc?VO(Ad{CfU1dYRJudIMMlpRdlS-smqy3YTh?*v1{geiOyYl4F5z`w(>? zN5wxhl><|hD{Aqq4D@(fjPjFwoZ^#EphcuUaQru3g%NoEx&yaoTNtI&%Gv1W2Ng!` zxP?FPCsWYzc=CWSxL2M-Tj>&O=8MG z@htFY+d-E8@@YgL7Wb`e$ZZ*l#Ok833>@GLWBp8P#RA8e-7a=so(&zy*+o3R7s!V$|N2o~O{kF&tg` zDa1tc#-)=TnSVQF>sdq%clLH47UM|H8>B7$3NH&soj|?46FsqNampUk^21c9so+P9 zFtTeh8@Dz1T%>9Nx_mfZxVj4rZFCW7^21>Uuav7g!buj|No%o0#w73IL7999o$adqd(5NDV?k^(S z5T-h(rCrT@BoVCB1VUF)EE0nZyE-3n?%V!tm`ID%0JzB(J) z6Z-Qmp08A^^6c%pzkMD*-KM=kVX+Uj0-fkUP2>|UHp+=bW=|!is-6Rwx04)1R`P;w zhw!B@TUOmf;QJx6MPe-QpbC6f#rh20qPU=N$)LDJ)1TTHGogu=0T12A;cp%AGWM{F zuAFwoCDJJ%$!t$?RBa2HDg5ic^xAp^9!mp@8511GqxfK{!)*h|FbK}g7k|^ryyNQ; z@&3c5)q;oX{by6MU~!5p366iWI|r$Eg{m-H9w1-oZ_*&fn2rAU*XzZaa`N>2PN;&L z^d9W*NtO+=DO{-ykx0~#-#&`C{_qwX3V$e)T}G*QlBa(R2~)Ox&ulGUwN>kA_rN%Q zQUart_C&GSf&7KE#JzoF?s(@K#fQT=vs=ZWlO>S$^~utI7B=(uO!Z8DCmSFkZx&PD zlT0EZzeFuMG)tOSU({=MyR6Xa47)W(dQI5LyK&5k4|;Q;->Y%*Q}LZGnz zG-_BnA8`CrMGCU8zTRk~AIV`)v@hx#uGY`=Sn)FxsnttC-rRY6vLdtCo&jb!+40%kkyd+E1~36jYLqJza;Wl8rqcGx=6qx2qV6 zsPfhqmQ3%)-QzjFShKFqxqfettRdC?O?hK`Y&n9ik=NNMM#Q77zIQ%NxNgPU<1cHj z-?3lpn$aamY2Vl1UYu9DesY8(^^!5A&-(k?`y*ysr9UVA8b`(kyZ47#w+Q#1!*yxx zQcp`?HoviO_jM7?dt_44S_AMEW=^uX0-%28Zs&Go*r_IlpmC8~Gb znZhi5uNBPx^qlUBCfbl)gE<$VeOjIxENP0y(P7#Q3U)m$eNU`A+AvsOo#Vk;&%{~R z6C>2CTtC@-#Ff%`Ml$EClX+Y7g)6F@!H-(cG&#J1JUw&soOUv6KY{t>-{yu4I2O1H zx!M2DsQK#+l#twdoF4?=r!$Zz77PN*5Lbe zj8|mQ6?WJ+5-S>ra{D&JHOfTjg&8M~ztx91a|R%UqTp8|ebEbN9`rifnd|p{q%tfm z;CA`?NQaE=A2G0H2&VF@?uW4{txabHTqFJBL%yT!8Qxu?J(^Q_c5r7`8 z?kI+IoX?`Gb_;>W&M^@*6iFb_i(`#{11mV~gm4n*8o@E!Ovt5)Oya}I^{1)+SHQ;O z%&XDM)cgC5x$ds!WU_dFTTL*+l|H0~9xan$UQ@_hz~{v@#gDG5L%XhXkiT)j)nc~F zWs^e#40T<}KHrn|FjG{wjf>fJP`ViN*?&A)L`l)^8Wb=sgv+;FIdEo(`x#Vq;U^>|2b3+>!VP5zU zLN=HyzrSj~@i`;R_tbOcN3P~xe|;~1j~P#8+cO6By)?Ont3Iz2!X$jX*_*v_;STBF zf8LC&X}Hz!$bU}Ba_4ltO;5}c`Tg{o-SptbML?3h$;^h|j@hQTLfziGZr|0tFsH4m zF}ui>XnftX!VygQ;32U2O8sEYnHKc>ZS&!K-f!|Ifkk<7Y|!{~99Jausyp@F-Ag*3Q12EQ)J zdO_X&pj3d0bj&0BRQ6fCwinPUrpdJOVj`SRj_^811=enZDi^u@&Bp#N=AID&-g0Rg ze`Hc%kNcTm743S+jcr%XdonM zI5m zzaJ9~x9XSmorHy`Y^qIj`Cy+{HCr8o?}qm}HAOso9ZCxo&Xxu2VBY<1h_~ACgyRAm zWF8rLIuc*2{;iyN=rN)Dpof*uUQX=vSvrz-VFn#{N+uyH958*NxKB#_T9ejX7VHTb zuntPGXbpy{@jhUX)fai}?jWiQmhC{0rX)yWg*6y&)62rOq4$P4{-OzC>S(;&1ySk| z{*4S;*{eaLR47^U3JsioKWSdC^yc4})iGKhj>-Z*W)W}amN$e#+@5#mZInwCQlZQ3 zV{%Zhc#}8LSkHO$a>wc zJ?+J=p4dbyVIk?|;enne&MQ6#LzctY3ia2Z1@M47x_kKEo@+}*KOn+}Q^}}m1TVc0 zO1XOwKcHi<1A%6QsRIw#Qi+*#WQqwN}^gc_F0g0i}!@6MmxaI!w0o-aG3Z@Oi}Qy%5+? zIW*ViMZ|f;ct0-w**qy3oUxk3jd(wcVO2<4DZwW2x-+A~;WDV-f!s8crkRJB>;#iN zp7%orw_Ns|ki=;4AZTql!FYq%^~CUC3+j3%2qe$HT_BGzwNEZxblSg;*^8vSA~be! zV?U>#ItEr#tb`J4&&0~&IV>?nLw^Xyw~)dCTM^kh1-47rico|1ip_Gh1~x$lG)eDU zqEwjl4hNj$6T#;8lWlK}Mue^nLMZCW=I^Q~c(=(E9v#>@{ z!Zb3C+msv2(B_hX*XK^oLWM-k`ei7>HRY+=drdx{56u7+OS=>!X+xHh;&h!Ana&Qy*=Uw^>2Yd-4t=otahI z`;UDSw@XUgp`w8r4_If&SZ9K5XUVoL?q;*|&e{-l-OEwJ{gE!oN6aksNicwRd{3Vm zFgS=QP!E3Zkk=_&!W)d$UsYDcF{{h!qESJH#I!Ys73Wmri|0bF=4di(ovb5;#B7&j z>?_0|#PAAS9CJ%ftmuK~1keRad3I#-3+CHB+hr&h$07jNL8~gvqG_hXwO=IY>}28* z78S?Emzll3I;(!KC*+tplp&a(EsjBa7dalea;D948+F@UJR8dI2VO9D&guEzR*nD3 z%c=SP1XD>qQ$`kU_sY0W^!Ee6r2VCyQoXEu2Ir!hOS~7#jY)L0$7?!L@VA1jWb6~> zb{aYH5O%}EYibDUpwWxMA<(+DxI@-$k^#$doja38WeD=P^Wdm-=)Rp$8FPP5-0E#< zXe(~DU~Kw}VVW##SpBfTk38L%bpoXA$53`*4N@vLel)cBC`rY;%p1&f20LwQc2GD- zMeue>3dS~7ksrRNp^ddxH_IOw(HHDuK?t?@90zJiL@lv-jSeh#YA)A zN);+MI&Ja8G>4Q2(kU*piFk9F&(xOvUlWFdb+G96j|qFT!YdYmSc3n-^n8|X7<#{Z z(YhNz&IcH2S4(%BF$a&f7V?{;JK>d$R9>=Q2jhb180o-IGkz(tc__MEJWwH@V6brv zFU|{RL>GbEcZW~wrJk#3;Li^~1d4Ej@rX?VxmXNjp_+1>NFl-AFswa1L)q|msnMec zWcIw=ZPC3y`Kr;nWdB;USjdO_br8+RMij$7^cE$N&$17ID206ZF=`MxCU3n*QGG6f z=Sqh5(Zj-%zQT{@oX+PJwQ9vX#Td5-VOm|rnnh!2>BTp-SUA=5H0S5dO8Lqq^SU}g zVwv`YK&EGWTu>WAJfq1$ z$HPb!DZIb77=W~(cCO}g^R%{u4auyP7=PEMTKS%G^^biR2u=zW`QZTv;vZv5Dn%)q zM2hJW#ad9rG6Aj?AX|DCme4;>!ujj6|2d9O1n>4ow)e7fHKV*;B3OcmI60*M27^~3 zo)R%MEtJ3iMkX<*QuR!K@sE7bZHrt}_if;Ic5yp))$<8Te{gjzf^R8ihjnO2To~!R zMB~&x+iE|Lep|q(3O#X+kXzaed@rKQE7a|HfH%H$c_ z$?<4)9G;pcZE;J(*%;E1=c0Eytl)3Ri- zPiV=A>41$w3fob9`MUo)`1mq=WckGf!i2@a7xSbqF4NF*T4jA6ZIXI%Fi7x5tI<@z zDxl;GZ-Z|hHgDwd>?hhv0QAyHmg|*!xpG2q_1a5;>otVS zqL~^wN~FZRNR)EXvY>p0Exsu#fD5czHdlf$ra};m$t*{CFKRl+yNESfEM<}Uxk+<> z6g8?`>v!^w?zYl|>30ZFCE!?(!>W4-BYY<+-Z)_l7761&MUq6gRkG<0LhHp3%nZq; zjd(~8QpYp|k*OzJnj%OT#{lJpNIfwCvZkC~eqU~T0IAO`WtUZ@(QC;P_qtdFh=yb+ zZd6O^E`vM9FF@0a;q7TD%h)1_M45+SK%m{RI-IJCVf_q{GapinBUJnE#2*Dr{48;q zT`Il}Pa(TBIlDmz{nv3fFbAbkNT+j!R~Y7M(gZa>qJ*O!*YGj`l$MU%s8|wD(uNQD zxZ^gI;BIa+*Z{HXw6KGP#!SW>6zsEwcf_SScn)7{>TAh@0Wt~tz1MlxA69qA+_#E>S(@E5U; z%rC<#P>5lM0#j-9pQUI8Em~sIV0;f(Zo2AG`LwbbG6#)Avv#6%hX)uGu0#_8Jt=q( z5X>v@&7}-KW*CHJ0$waH?9EeXp%8IzxeopxEh#;TC}_T>$gn^WKURcsv^!4v8bE3-F>*dcugw}`ZehH>R|RE#101BJVpQPK z`qe=3YC-fDe7%HW#@x4nuIdwezz-5rP?*#1%v@;$3rO;PBe3&c~cbW401MTyQKVDJTHwYf4^KpIf4-2Y?4f?lX+IWpROFz zVL!~$J31bUozcYJMe6DdE}@*zigT}^5%-j=MP$&~L6BOr3Rgs~&m<{Jx?mT#h0}X- zrNu>)nTIdCf|8}bh2i@jeC2oxMzw-F1p7eBR#9gHnS8&)!;m9I*A|cPkV@?T0giw- zScApZF65GOcn`_4vt*YJ=DyeN-`i~Ya*CEnko#p%hQ$DCp}Q48EsV(V8K>{bw5@Ya z_H9_9QMWQQEl0DWjw)vQXb}CPX4%Rcz;9xCtkZ)zXsqIv{J2O2d6hOVCekTH0K0o9 zj-T-@N{5F{%@ij3PDH#R$=_dPhdLlM52ArO0Klz@A6-;X9$58qO5xC~sTS^!2O@8s z50p>`ttRIRs!J0Xwi-nG!HF!OJW)tm7lc0@N7cl{H6S&Gi3DNaQVS!G^Uf~DuaM5( zhXo4<$iS6{kOddp-77&}L7*9=6D@(9K%FM^p>N7tLc#EX@xbl^HadQ@SYwL~@mA3X1X;fytvdTKu7D-VT7D0J~u=*?QegC$#`N-q-c{I{lu_#^T-uLw8E^? zoJ3gSKGcCMttbVo4=~uB`_6hsMM^VHX-rt4ke}$- z0n{rBDblF@ny@fYZ~g`%LVFyk!)ysY8rVORoWL80p0uC%2{6gyNaAObk+aaD%Y$BY zPD{N>sQVLkXo$=QFnr~AlBHJth5Q(iN%o#nl;cEUcO zPY5EoC#mN0eKr63bA`_}!#EcCj-@xRBMIU_gOmyPe1nmWNP+b*nKvP&ABX?P-b+2R zEB3!s)yL#|_@02oSN^7%EKIDaB`Pi4jyn1e?4jhNs*d#0 zH+xf467`LG#Rx}yA4dppwO17C>H;I026v1*co*z?J+7V!1R_N1olE{Xm-!+O&6?64 zKmz&+R|{>%ytXN62S>|Sf;2Vx#%60hAalK-uxSW!?;C$L#?+PsbUuw%rncJa!(k4B zoT=FC-3J)uXMx6p2^EV6P_V6Ae#<`MJCIIkF3y}Ig9rT~% zI|p2~U>1ye1ML#_po*kSa(82)jgzhG?cqv<4*^+Lo$sTP5I>bSWwtT}k0IzD8Mx4RXbg8-^x=I|8%9 z?a)S+&HZ;|Gak`n5n@8;Mtm~S=f9@}7f6kp{B1tZOr|7JCT5kC#(ZLiCp@yJFWvoYe4as`*MM!c@A% z>#7DYoQ@@$e1t}>7QLalDB^D3caclW_zsaf+IF@B%PAc$xG0xgeSp7R2<4{eB+9){ z>UwHzIy1WOZ{`dpBUiT312=8tRG~>R0`|R}#t;qpj6oNMd}2klL&B^Gzl`$0i?w-S zdi5FohUt22PB;hti1JDQthnb~s2)ppJa?)g-IOoY?}azhuf+_?_{|)n!}U8?tHQ1T8fb?TO9E zl`}P+KZRd0>g$B2>ORcC+c|7qCH?wKGgye#hGz2RMthe>NezpcQ~5RL+rn9h8EZmw zC7n4l{0JAezJ$yen=;GM@9-?LwX2cn=wQMf2s?m*&{S~4EETu5Fo3keYp&;WKdHMk zNj9!2fGW+cOC>91wcAm9ZQ+@qBPcoTnjKDO19yR}E#vgmz-i*M6)cDgumuqO$+G9RJyKz{BkiyOF@)V=31_&X&aTky&lCv!jPZWIp1h<Ua`D?n{oM)(~7JYC*-Z4GjPE3H{q()1~Hpan*kU29Iv* zLM7bWS=o9u;Go zPaXdt7PNdS8gfDe1g#-q-QsC+c*JU|6lXEaY7}5|-6k)E`Db79U~l`Ii9*WlO#q3u zHolj-6*=L6_1!B}2hNr#3y94W*hC`-yk=njxW=g|R^ec*sS#Y`K}NE;Xo*C^3!XR6 z04L6`KH`$2kgO&FV{@wnY~8bIihk<`M;FnZ%nHz13E`3XYlm>9vOsyvE+#_@=~4lI z$l~jPLGN$~i;5VwD`%YH9Aj|*kIj3%{=b`d0;~tWfB8oznP3)unq+z<(4<;Y?Gz@t ziZX8l_?hk^&RSbVtxTe5)Pk||^r;U_*bJ!tLVLO(xbdrjn7h28fQQG1R*lcd1a^s} z!T7|U2H3so^&i0f4=Dazn1lS4ERU%ME=upi5UK!y>v~+;lvReazm`dlo#lBz>V%N` z!m;@%0=^BelrkHl$JA%p>)U4FZx4DnVgWsA9L2 zC@N63VC_%>;@u!Iq@XbrR`O^xzgMti14(nr^#?`BNRsd*c#Q$H9#69GIdWp8oNHZR zg@G+_)!Q(26no?9K$f%`v}}$_Aa@y0xsC`Y#0Qru`lS30A_n-mmwKlC+m0Xen{CsJ zXJp79rJ}-k>*Mm@Xd=F(L1LcBS)ZQ#2^bK(2Y+!7t#~psZ0!?Hn%dpYOCQ@$??!@n z(6>Ddu-V16W`FDRK!$NQ#{-4Qj#TK~##jo%!7;{n2QZXxlULrULSJjpy-1KEzlxcn zK!j_@fF|42)GqTX@!72Mo(I~WZk?Y^3Q7RnP<<}*C78^evJ0!8sXx%3d4^4Q>?QZJuAy>3~LrVlZFSn>Dp?j9Hp+&sMEB^%+rI_~WDXjP*HiG*iRQgUtVPsqj;Hks7&oLpr34cc|S{x<@? zAs!+qv0v}b`LMxfyvy$ww=a3Wt1*MFCdJTA2OvpCNiY)EEEg9}dlsMd5tMHy8q}_b zCrqUM(_#O*C6c@Ew?bq5*SiTf;H?ZT{NvwjVIu;x(>ArXuhd$-5}X-zW979q zl8WZn!WYfcR{qwzrOKxwMqmio$?*!;$ZKyV_MXy)2)(j zeG$3-E#NB^;bW{(FS-{%(0`H)^xj>PYtA|DyWFUFGzeuGGarK%I5TZTjaKjytLYxk{`_f0u_RQwvAEtS)r25-)CM zr}OTQ{Qn|vdB(X0$>IApfF{0q-lL{-7F+^K@(#7`8b4OYU9a52%V=xKAwm+(L)89Q zYu{=Cxax8QZTY1$kgQb0fg=4P5g3K_@P(y~0A+dgGZcw6e^N0E4eI>~CoK&J59I-C z+DLZ%IonFHzdu{6mC+=PUp}c&0ODg3FspfUy=K+KR(l6Emiws<>v=bNv(_SRRPF$=$iP)W-{?oJ_D!|7Dou_ z#;@H_h)^17TgkS7qSgC)@j2QC-NGKc1|s_ zOu@4+f;e(L8^a5?TS@++nf5Ucr{m|(!KXj=tNAcx@ zfBS>)!3ML}v4%B$CaiJjW>+yH*9PIo787wvaji#g$^Pxb2w(f9-HR#G`vTpUq))Zn zrnqIbNV5B(#JYIxR?JZpV!dJRKK5ie!APgjdgn3FQ0u*4-tm` z()08zACg4D9wfaAbiPr$S^U^_(Y-hvgUrQiTA^G<_(_35mM)pDd-oLf5&9?pkZsSr z{Mj9XHSbc>SS`Z-@RcE4ch3wIQTifNRnO;_v+KKZ_dEN;SEi1~^Vj3lZ@i{9T6i1M zop5V?G;|DqTQC6GHNgQw628-sr*9a2Vukw$5R>U7T=X^s{SBoh4qrliPpuW3P#3WS zmLNVzD`!On%Yob!Nf+vaBUV&-$?advquKFRj3EApB2b+=a!e__tdb7ihQwmV0+OA} zXCa9m43BxRx;;H*^haR{o1&kP^}n#KSKQIumVQ$zUv7Re9-EsK1U*=yqm!H)=*jOL zFF6Sm16+EhdnMpOY9fg%3c6KS%{263^nN$wwvvaK!bDOF9D_WPdfP?+3NKHU7%YSo zqZ>4FFrUTGd=VB%%GE#EPf)YofH9Tmx*jlB34WGF~rzW!U zEhr;|>YrTAT`?G8$bYSK0Tle`C5HPhN1tY|>q)($PPbUW8M|9^yUu^L`MFXm?`ell zgtgecFAN6+J(QGIw^rh6@Y+wbL6E0XSLtBp==zo07eh3PL)u?s@i(VscAN``+eF?7f-z56#YO( zG%oC18*vI&kE9d`8Z)=YzV_AscpZ?hrARKWk|VCC@89r_dJjrYY+(@nPV>Y*q;o(j z%ood!7zS~u05bOmB?l^n--%D`LzXEZIxxpm&xUu<>+yl^v&83GRaY?Fui?9Va|CR; zb(!-0jRTs3MCqAK83-U2?o^E2AQre(!e7kR;r?hMv216buUilA{wK=Z@BXfO`FnTA zknOdLj&Iwj^~&hkj_32umg(KA8*5U>&KvEQVOFN#e-oilNy><_7;vjEfh|xw?bgQt zQF}*9HC7_M3<4hCi00kX`!WA+m*yAKS3CFpLlklUM7g(Vl%dTR+dH#c`mY?^t)bkG zvsSWWobNkJw%?33CAUAuYWM#f*^d!UxqQ6XHrzf}!zP{L@~3m*74-rd^QZb{OflYg zad(hfP-IVY)%R4UVF^mc( zmEa+(B2DVYuJ+<0LtkmgUJ)`cR^0OJ8BOK45k2{h0KxY&>ziJiV}ei@lwA{lo2!Ph zvo&$|##IDLo&gCO+Cm`x3?oZrOlM5SR-P$ahaimTWvInA{0K=_fL{@}Fs5gW;$gd>QK|vkZ9Z z|G<`QgyZMNId`Iwo~jUp!aZKfrBY%SgGUh9cRkv^CpZJirMI(;Ca0}bU5}aOx@hiA0j1Tt6fK>rw0qQp9}dF zQpAW#Lheug!7J=j{}*0iE)A|MAUZ(<-V|ks%0d!{C#WoO&p6+>L{iq!n<&BnM(7+j z)=6DHn={gWD9u_>Ur6i%DIOWjuUw{cBd%ndUw|Jhl%wGE} z2whfJmEtQ{SC1%bwA1!=ij2OsRbqMt(zhMdkfr}Wc!ircAy86)I!}&jS_u#;Jb6~Z znH55-Qp+V#dC%pdNuZI5WbN|(^@Gwsa2~E2B+Oa1?UY6rv=}=Fk)eZLLmfd~DLr3J z(~xdpwBl+86(oKf6nb3!2~mo!ArNe@Ki~jwa?^G`)NKmLlor?tzJzDb(y<6mZ~#2M zF^}S7{Kx&PLkpI`$JqO>TXW2Y0~-LR+>|^&$2G3r?3yB^y6vItvqq9q8Ldp%O{e8c z*7EUw+#76uCY?$gf8#Oed9C9-dVA@ODurc3YY5K}LcFjD?-f6iU4?E{^mflt+P{vh z-*j_k3Vxb0c}jhmY;Ego`l(*~!FTskV8Vh>x`Ala}5}pQ1ECYBl zS$1Jutz45hjsc{(G_o^*C(|a?3x%_)EZfz3*Q6cI%VB7s@(O7!KA#|lO)RS>i84f! zD%y|~L3vcI1C##y1ss7S6M_6?3OdG}-nm``4==6izhOA4rci()#ty5xf;{b?`Lv#< z^dnQ5*TJCwAO7KAM`kABVviBnn9Gl*NEoKEd1?y6L6@d*0crP=AR; z7RkRTF;w-pR1T69N#!6iN9!*_vl5HWGcbbZi$xA_G$z4_0uBX3BYiL;@+u3Hfr@y9 z0=py??+8T1;EHKBBKekR)?cIFCn z1RR(mh`9wqZG)xP*E9^IEqYt4b(liZchavu?jKQaSvUzsZ5ua)6L+n>H+El_%H>A3 zWfZn)3hSmQZ_txh@NDSb>ZV`!|{ z)xn_M;MKg9j>(fA{7uFEp_!?il)DwTYQgLhG`=@+B0cYB-4`L+Pq+#^c8R8k z$TdcPj(_lK0-7@Bt(Kv46Apuq5$vp#@sXGkQV!Kdlr6my(7>chF*Bl^cGtf`WFq1f zdcR})XDcVq&{Q?z!1kLq=~#SJn@iz^wcXR!i(OqKe+f&}@UGvSF>Ns;9=V|DJ)}I! z)RjsuCq$_Ek(f9-WUgo>#*m1EepadxsC@I+mIh z$`$=lbK}5fr1h_5d_H@Kl=#Ooax3UM;UacLc6PlfbEBUnE|YViFZ{+(a&NL_#oNnc z@cf}SVM&${*l{p&qg5um6}^CB4UIUL$o$7r+jTAToe^+~+j}qyu?CnbQtWP%Qku`g z-dPWg4*?)* z!vfH7N;X{&(0Np4G1Jl3s+)wlFRdvnw-LvGPApXpk4_FpKjeRUwm&k`jS-0!6(o_S zF&Tgx{ucB;-db-mx%lvA@a=`W=@HVW{4-_-=j|3a^e2EgE@d#>2+>B-?EVt* zccN`#hjKDiOVKz(6*GOJyc>U21z~3;_2PJ%(^iF<>NFPA{Z;eS$j`#M=pIaKv>vt_ zp=!C|hg0)kmjb$9e;cF>SNk&#>0KC{by&AgbRzL%98>MGq>odRgfMyC1!yj2v%Me3 znyQ6$q{!% zip4L`n*+*D%CDFIbb!EkWIZ;uC6SEgSgM@AXmcQtcf!uumGOz!MkE;p=SmRGW)v^% zuvxG;VO)wcS`13x`{~83-R>&Z-M?Yu!3v+$KkcQG-bdra*^1|I9_D_o%qQ&ql`D)Fh+E`pTM^!q35ah`EWluFO@Ny@ZXebJCt> zOGwcuk1`(=wX2p=Rh8tiO@>$Jtv>6ocfMX}NE#ZW~~+es|EV;@lLX%1RQo_sm{HV=LbY#Sn=^5tWLv zu?q|YuK(@}1XU1}Cko#Ue9-9+2Cjb(8bK5RtLPP|vf-2@SCZUwY1Yc7>(Du0BkI&t zJ_k+1njNcz>56mK$#AtnX7etMs_s$l83{~OJu!>gTz#GCr_O6lkXmz6RiSmkFEWhp zhp#qk?e&Zh(E=s>dU)i&Q5 zRayB<&-;D%ZEqyER?x2|ZOQ6bM)>hGh5xi(B8#m_rC&F1vPiW~|H(ObiBvf-6dl$1OxjBDhXCx!tQaIFR>Z0zdTqcFKjt>&5!+#lv0uV}DtB zoLI6KLlR%HwD5Ol!PIx_iSymJ1ZUD7kZiaO4(yRC%c`7X>RG4(-G~X@%cq4IBYm_# zDsc=0=t(3pk(r|dYY1@k4pj_LH{ok%DY`n7`}C>t)8lfK&gz_OhwZI>pi|CDMYX;MRm__oAb4 z2$&-vCd9Ncqh zF3kAEfMWa3)fj@^26Tx6=C@db+O|P@FtpK>H&^-YxE@+BZl?_2TYQH+ zZ62lIy8adRLHdIXm;#>xCk%t*z8jl19W4ajK8tp`pZOwUH8xs+wBt&$cmV_&-*5!5 zfU7xLVG-=GaBJ4Fn+umXy!3!u3v8Gx9u-|BXMh?2s5P~t$!d=ndKq?m8TJZ`wKC~x zeyUXd!y0i;{I<&z{UwBZ`E%Ll3d2Eh0dWbz`rRDV=L&z#mf1$iFdTPs@C&gI=EK_W zYwkWF>QK5zW&0D`St#x6Y*|Yz(hzr3GoN8J#_kfl+0X!$pDIDRXp@}2gu4MAf6Y=s z%0eJxtUMqCh3GF*h)@avvUpk^a$8Um(xy;}h>>9-*l@z0rr1*9+zZWsHNZZL&N_#l zp+s_WG^i?-JZ+YYMxLpSk}t6u!L4*k=1TYG)k|WgTvWW}`tNh;tkkFLY5DG9($IL? zA5p~DAv_`IZU{tLPEVG#Q`g+>myKOn%kL+0e27Fa!#4nqDAXV6uM@4}uF9l3${sq* zzFw>cV#Q4l09M9k2@-t(DR$`Shl?eaAWs?wwvvD#vbEALfC-M03x=%%Bo>NjNk&rd zV_|$Mo(YyIcZlD^;E@X;XLRF4GU=@?Y2HV%W1Vo3_dlX?uR*e~)^ zru@ND$-!e1%!&>W8XiqYj|Mj$s&|{YxJ^$OrgtsC*1F9O{7IvL+ZmI^l0|b^J2iSVZoI&->*OPzU&r zHA7_1NpJAYg2%1)6AUtyab;4Km1$oBZy5{U-O>ocq1kBOjpf+^3sB_L3> zR%Ue^A^ye`{))h8j{oCIH4JA!D6(0G{CQ`*Bat%1$KclvC+O}llh^q$&e}T8v|e?j zGuVqTl6dFm3Bhbeo2UxuFBEZ#P9%)}C}M}@w}va^KM7%Cpeh}z5XNK5!NBTu23UvM zrB-n8^CeH@6%LSXLJmJS+NGD50%1$_hGumxPO9!2G9QcMGFFTEwe`Fo>HQwoG?U(7 z9->g4_`#6-l^VGqPB8QItL#+E^>ut3z9E1~2Q=r6aX>A*pfM$8iG02n28H@oV8~a2 ziIAAQz@?N-_!uGYgZvYSS%?e{M&O20y)75`A%H=_;PR{kYO2BE3ZPoZ{Qa3*dmfls zJDbcWtZO$EO~3}E*!PT(m}32aLKk>cI)u}CEERf!{OffK$61P)fJhZ{*h}~dT*hH$ z=pZUcuYcJ>%`&!-NV@<*Jw)jNizF809fk@W|8=hSNdW!?%$1@99wnEfOnnxnSw{aF zQx{voeQ?t9`YiL^JpH2oeZTAs80o|VoCocB`f$J_3iIuc>L{D(4$yDlCzzGEYG;`L z{Bd50bE4RqPMKo(Xxn*jKR*tF~O2^=ouF#02tdpU)dj84l$^oKhZ|^74)3 z2FXac?JdT#Qmn=5&c1)?$H4Vacdq*N_rGxF9R{)KA+XWT=T7#T!S98$eK;3AI(IaQ zj{$0+iu)VX5VPFD8nYOzIDfe*!qosgITX-wDIE%PVx_b{l88C8Z#?Nb3O&yl6rYI3 z1Z%L|9|;kj4+>huDF>n?7l&XhRY(vhJ~g1J+0UOF7AuW5-QQ0spwuk!)YvTQ)ZyHI zbp9v)UzlY2dfH+jV!?U~WNQKFNXTBMA)_QvyHhg8D==cBE0sGCE;f0fV!?2a7Q7y+cvvw+v>7ycGKIaYg#<#@c1iarU1%DipbsF|O9{XHU*-G$v2ZYl;r|nf7M~H-V6(tXX0Jh8 z)C59+`8G01OhocUEx;_3gzhj$t+a4g%;-k$P3x(y4%u#K@5TkRjQRq_Y zvTO7#vy2Ba8DP`#oIj0>NVlziE4#n@sCZ6K6T8#=96l+$IDfI5wn8hp`&@y;j$n-5 zY~wC!4N}%&Z?4mr^~Y4`c%A+-V(FpRB|hbI)n=>84i6Xj!V~y%dgS$!^?PM_9Er() zcjD=LEDLA+XGe>&lB}&>YW3Lj#o42&{PQY>kP3Z%RQ7S@47Z+Oo zV~MWJ84)_Uv4!SC^EVUEda{DlXQNwK0d$L+proG1^X-Gh`=h~U&kGiO4S(8iO{Ry- z+4qTE8{8{GzxsoB(~zcJ{@xFccuN}0n*zs})4X2vykTZ@J96cj%d%E2;#SitRpW8> zn#ZIXRp`f+h;)}#14p`0XRDGj!^ER(nyohfeqw{`*-6f{(Z!U>q+M}?QrPY{9zS@J z6AwqV4Bz*g%VTnaQk^l2$!xAZ)>rfz5t`EF@T=dG;|?AQVhjRr9XG&L-EY!c zQGM3y??V*!%>r9j*QMSk<$B)7iHj&n?m+`T=oD?iMj(R=SNrbGpB76zutmUnCTH?w zzsR2~hwy^;UKaojLMkw+&enJPv3gL4)(WW$+35y8c2DZe5c9IQ=A2z3Yu`jspF>!` zB|VW$ntgwvNOTn)eYiz1Lqsxfz1+G#R0x{Y-xy;q$kTTv3^{iN1Gxz%NvXQ=~MaQQX%^sX`&Ji29 z6R3tSsXGCZFJj5PU&QH4)u>Vf$8EPqGfVd7e(UQaD-_Oi{tGMTUQg;)ejBqYG*(t( zskB)RQwLE!ZS><22c59PvQ)W~>}uJ14v+c=_#vVRzX*FOZE;ZfwSU6Yd2RLZv#>^L z+DD7X*>7HT&4$w#@GBp0EFu25Yxm19vxM*ZJ^s)t5|dcUabdaj2?i~qMQ@_CuEhlO zPjbBR`^3yeg%i6*b&_R{m1Bcsx(KGN@&#D@ch$T*o>~$`Sm68$M5v~$tK z2WLm4ebWP-pqI{7V1$;tN$waVLegc!s^Px$a6WC2r*|fh39YF3K*e_F8n9s?q;{2I zAd(#crlpI>XCyxyDnfse%i&YVO$w$G!W0DKnl$D;*m3@jKMm4Ar`7c;(BkNPP)IHt zKQKsUXCz)6y_l>^Z|%^rAtlH$O|gU05p1;T_Fzbg-P4yzB}rvXvkkMCE_}-QzTJO2 z!;G%G>}8xyfi;brp0e$|t3uX>&7J{ek%0JR3&<)c$c0JYpI2`e z7svQ{dE=ulEFT^|uU;pwi|P;+JU$T=3zV?%=KiENfVUKBq({cykR%l7_XN7=D*iw! z$H%@Wp-xP!EGR_|+-N{o(R3%04BD8d6ynu1!ora@fNTL>ibI9oE{qL?N`Pl|VLk?ygKhl!6dEB-vS%AIB% z-bN^RG?s`eO?@!ppy=&=0HzvOqd8CrDukjM#}Az(9%|`}6+xuPEqKI*+%X452aWG{ zOXA2clL?$kikd2dCPj;4Po;;i8b`mGUVfXL?a;f8r@Moss}e{jtH<5K2|~g%!yzZd zlOxgRypgWIICm*SCDM|}D<&ito8b2q<5K`3BSNp{!1f>pAAzqU6yh11|I5>$JV2Sf zLU&!dObIz%wOg-whQ(`bsSozL-}C!UX#@T5Tct(5=Ork4`Fc{G-~spI0;1X@ z)ZGLFUZ7wyv1En`J@S?{wW;t(ubws1Fm)1_oO zkXi?lrttl6PVHHi){yx^%WDGCiZSH9rc=nGbA~diftA3OBav_`2^E!zvSnZi&NqDHD?-a$ zC~BZ8ahZnqY+ZcX#8;e@8-nehtJ+F9fw)Ie2Z)njSY z;IXO`spqYzbBLrC@p4(dKGtyuNcZpU`&UlzY*E|WA@rT zu`r86Lu7~!W=Qkw625g|t(_mbatRMlafK>QZR_3Y@#~u}Q=YJ=4dw`xWTKShyEke0reVYp>!)f;vNnU|VLoIbhVp5Xe}bm!|C@%e zW&-=FuO2r&=d+uR5zqwj8=08M^A+iO@p#W%(_Vnq7**j#x*LiGt;|u{d2RW6P)WK|#SjSIPqUEz6E(3hBgwM2ur-Q-oux|RxW(lv? z0&!6zJTjONrZVXP1F9&?Vayc*s+?4p+971ag;LWWypllc9SCKQ!|n@3I9h!=7eff(Ng*{E*1L0=@f~u4v&s(vy zbV2tjt~$Li8>HfxU#n?7@kHLRF>|VUyh~=i;z@T7$yC!RSwd$m|EIEDibI{aB zM^VhnABHh&ae8o&&_9mwyWNXGfMV!+!H&wx+h0H)viM&ntL+8GzsWR z{?hi`s5q_A(46Y@?(p&R8Swk$2|$z`oH-m3!bbIcdK$cX+YNpWBD(wJfsL#?H;g4z<-YD|3CCCrn)A%TE0G9XgD>KYpv(WB&qxW$OU~|w#6v_+WPY=a*;I0 zXQ(EC>~r8ar+b)Ph&0VZIhI) zK$3C50fV;vTq&ehP7?1D(u8bVQ(#4T^}BmGy1ktj6f;56L7mCPH`}hUD#DDw z^*0#P7Gl+fw^jmXCWlso6>OC?;=JSKC-)m~t{cZxVtP5_C)Eg zu!GFqk@O!bzcXKttZ{X+$ArGAIaY`&oB1x$GMO6K3MP)Ygi{_eb!VPik5+~%&!@WL zYiGOtC(hx(!a zeb(=-+TPDy=F*4KMRLhaeU???RZvB(Yz#~rJ+Z9^ROM_QNHMK6c}7!3dm`{>KNyR; zfAPxY{?N4JZey2e+NLP9&$@hS%?hbmvrd$)U)Hm0S%w`3`1xhy&AIz&?H;5>)T(Ro zw;$0iy$pnXlfe=Br=TXn z(QZD*;gzYYjCJ=ldN+uS0p79@{V$2v;r>hF z8Vwyyl~P@9cva4P=tvgwV+MtLnaK}eTd@1Itb zwFI+~XWn&&8-fhU5%zpAH}3j~NZcWWDPE+yTn=0R#oCifI#U>fy0wq!}Ihin?(2XWSNO&zC@S8rJ! zK`_7pq(4Z|0I4SeC>wq)AS%@et3oP;gbj8Vm7z$qA_Asd(=8!Q-w(kxFbbSz<+e(5 zNvtpj&$|E8b|`ZD@PT;7Tbb<#{vb2^^QX^6CUhfZ+V8j$Dwfm{$5 zTZdW?9ZgZxK@>>anCL=ToE(9y-ov z2@gdwpEIMv^A?XPF5q?*<}OU+#sy0bq@VnbOP|cCr4oW+z4Ib-e;*#jG7-;qy*P`I zL5WN&=k>1307(dUOX*g)8Ql1d!4{282n72%Pl z9qwO^1vj#BI`JJLn}RUY<)*_8srdkj{S``|ai5Mqt!fnCZUy%NWMq^0g2z<|8#g40>rdyHIG{>m=B>Tr->U*s z2ire;d>l34rXF6O!yS4*`Eho?`Dom~IIw-OcjN6Timu~5W@nS%=eIxqzCQmho3Hao zKE3>Vd_BL+_-*2Pv z9y&c;J*~Xkk4;7^-y_ame)+FX@0TYw|IV*#?)0LvliT~YvhNn2FWLXFi`W6$lvlXY zU;znD=wkU)l0j^;Cz-I9CgYmXCu0e|HDHRk+K&&f#}AMBJx|CFChT2|0^-c@n9udU zh0EK#ydSqGFSqekC$}b1D%bXl5qBs>|4T}A-suBvVR_sy%lmYz5unXaSt^72n=eCS z@UckW{5PQN+wt~b^uHW)Q!pQwJ_8q-v0D2JKi>yqwx;JLgYe3nN1>06q6E+c)@NTT zkOnEks5~)xwU6mXGo$UBQta^Q_5AYS^Qw5E_QmrbnUUA*|A3j+y|2f%S;pS!`29||Y;=;XyAFR3FM2rHB$oH|i2MEU_=NX3SZDIk z#bN!W+;fKHj}|2nymmv;{E2J->gBKB)4;n~>SNWK^Do=55C7UtRg-#gKOb35zOj3r zrhxYU2WwE5O8-Atqby*nA}#qlKh>TU-n4tW#Yy%2VGuBsYf(fEB#C@pvF=1lVcH`- zdG{(eH+t*+WMIA~4qIJ$Xm~-wJh|}Ir5rKp>iYQ47QwCMYOd#4J6M9AEg!x3A7gHY z794->+Ne?csEN0hM}qx}>~)27eFegavGhFl%;)~#3iX;Z&V1|TkYypYOC?3G73cU3 zJ00t2dGv1uQuL~zoP9~|9G1x7ILpoW-d!d?) zJ?^kSyAN)?Vv-F%OB=rS9-j^#rKt(J^eOb?e-6Zw$5v}V5b{ymOt`oD29t@^NpP)J zudaXj;A-TCXwG1Q>_YU|bp+Ak9Sk@``1iG4j<@;#X56I-wwdg2aT=*Uiml`XfgFmh zK=ca>sSUQ-^s5P4xu(dx)iwgt+8ptnU2RH~R2iM6Kk?a-W9W|3SIDJ$PA+4N_b}-1 zININ;=a_-qY4#H(YoNbtJ@C@$&^RHHJOnvdlGxMj>!2Hkb*ZF^&RL{zWZ2|N|5ui@ z0%B-S!_$r4$7AJL%CF1SoBTNL-ijaAP)5gbwv-0}`J}Y#mKRV*ZLHEc-0JL`3bVg1 z*iTg5ROR(5p+_Bc{~w}priopl2}}ONhUU#SY)ge)_@sc^FrOBVjXw5% zt6zAMT2m|QF9)*YqG;Qygm8Ua76+|#fZmm!g#uyIb#JTleNHU`jG?ZV9fHA@`)^eT zOeJ#w$|Ul5&^((pM=yEgvw$X=J8G4NA}zW}U0t$>)W6eT5+JJ|W_D`v1pc@zqR!)b zZ+stA^Wo#+pwidcVZU6se(1rt9P9#ZS6pn-aO75Bfle(yUpIOTIh&t@wlP1k_*_6M zJ?EU3n^=2mYaKFDl%)9O?$%VRtF2Qh(|=9h63}#L^6mkFlR4H&1)DI~d=Hj`8Ja8R z$e6v-1wacgSpFUoC(WWGvUl>^> ztLr@avYI{bfCmlxRU-nOB>d-yt){54T$4497&56&u8#p+z*2ouoV=kR%`Pn#9=J?P zPB=&%4xUO-X5-l2P9G2&4OL$y?P~!M-3Uzzx(qE9QaqlKS?uGYAhFh5XR{X;KSv8q zKghTr#kgPMyA!!(l^9tZdr^6&##_d^+J?*WaE(-r+8^0iho4%KHSzo{PfC_J3&sV@ ze&oQc`dVRoj8`G{Vloij!gmzg@H-XJ_!fmNOM{F z#VZ-iG&6L_P1HhAs|JlBS;Hz-Q=z_uy=cAzQM}UBV3ey(Pt?NCoGw(HmJ$j91@~jt zvSMENAKN${|FPWysDU-s2OtzCjjk6Sy&D55pQpOIf`BTY``ts=6ccT&_8Wre5L#}) zRInGXoCF3f<+ASMP#Kapx0=^Ep%kwqXcM|v$F_^EOmH;y61OlAk|3-6ku#BJC|;4s zQ*Zx^MYF50sxRw!Af|-}tbG1ix}v8GRJ_v7B8Zg?b{=Ls)}g$R+`WPuu;fLKpVJqx z)TzPL{xA=bUfp^2kjgqnlVJm2@%WlA*o~~5+F*$uiUo~GBUcu@eQ%+j`)PQed_iVQYr2q%A?xFK!Iu+Er=gKVV+ z#b&x|w1fu|;Hj8GAdj?Yw?SqSGAR~ZPciThij_v0C9p`hx=406Q49SHsJ zr%)iW71}?42f)czx}Al%M=4Tfx(7n%Viai=EIw@P$pnpajErmCZdN$c%~g5CJ%!Eg zlEH^ZE3Xd!2>x6CMo7ZggOeL#T zjOqV#>e-sC^cI7xl@7;2f)s1r)-nm2bsw{Ag6$pcn zt-KZpQVj@m7|BO*4q}n=y&=XwG)p8Pm5r;zW*Q%Sl$p`%!VF z>Vhw3@R4;3VnJfT^gIt`c|>LrHC&+rqlqwy)hbE=iJkH>EW$`uzbjC7IsyY?qU$&S z4PD$H+LwW=I@1+4goAQ^FBn*wN*Z$KhQ?I5f#SqdHB0_K5yxPIqShqMBMQ_))$<(b zx{I{`;{zU&emtveA)JubX?r|(3gKs9Vq7=nZom9jz+c|r;`;pH(CY4G^^owJk40g) zH&;R|=)tL(4#ieG({xJ5pmswAUXJ&1EP4S|c%_q)Rrp%M?@nM8m&fv}T8^;kQ@=xV z0n&!%)$?M&w!uL$Q=Zxn1$j}6MehjR>X2MU3H_#1XW{1R?yTt=2{f>IscPGW5dWZ* z+gt>Nl6S|34QydSnq$qoJSHzsf@q8>DhvFhux#eqgAKJ_(df^e2__}*zH%N_y6{K_)K(M+5dfzBxy^_%>luV0#=3X8nz#4XxE@^qmEiG&*Zl`|J$SRG zy0r&yw`Be45Y>ImS~p(*OS=63H|gH^eu?JARrRL&)A63P30%|q*V(oEzx2mlFE)8U zZJwm>9?!o1zgf3L>_&^DzLonFBU&ev%Gcxmw@kbsxrsyUPi_yrHr=-f<-k)Wf7F+= zjPgjXk#4yk$#u^b-S*>13Z!>gzM20K@LFc_B&veqH^Ut`9rU{Zo4f9r0AK-{Ki5xz z?Zf}6r>4z`bn~qasx0qBWSjAmNl@&Fmc@A0=WSq!fUg%46wG~8r< z@RLRSJdt2}LnRtCTWbSCvkZlsP_cC&uQ5XO>>a^4$GPI=JSenPlaT0VkKTtXb*~pq zf`fof(DQh3g?J4PN51t^$hMGL4J}n_3vZ$OW~=dh#eT2sb@ZB$PArQ*^9PrifS12) zBk)6y6(Lo04+3QB#){PSYP+|ISMMVY1fQpIM>hYq96x3=SN0d-V5Q8We{FF*!>%Ea z7_D&g)n#@%NGY(FhV?ifJpQ0 z_^dXc!|NEI;}MDMNCCrxsiPZy(dn|f&it4>e|+wnb4zIDQ;FH2+H7r*s)f=(c23Q= zegA7mw;#*l*iqgvUZcVMcN}%{^Wyb<@sks&EiodyJ~W}jxyK*;GiVqos3u(w7XZ8% zZTiDvhNEP9-LU&0`;AhJ+Izv$Sx@aiPS_8JQZoEs&aAI)Jl_b^{mcC)DHtfCe}4T` z7l9&oVgc5QLbH!0;#(y=}8P$Nhn zE;ADjm=NAv*6?>VMA7^EZVNcyss9%J6pv}5zLZiXbdf2RtFfZL_(ESLXM{f>6w&wocLuhi;c-44J8SW zKEkq^MH$#=PTQahx^>;=vgsXFAzLexxJoLhfm1&GLVC`#^r(~? z(kNvjvY`yF@Dj&g?ubRX*E^B2zn>tlBB#n6n{whE3GCP9;1@thNGMRQGWDC+fE-k;87Y49SRx4h z#mR61+3y#rX^X0y`dtuVoq^MGyb79Fy_Pc4$4fRL+&s+bSR*g2`4$h^ncGKSyhmg? zhTkt&=&HVW#7G~8kcOSoof7LGcxqU;-A3pyw_hJWF^vJX(y&;(a3*qutCI3llnAcn z=7R{YvkCV`M@JD0JIJ;UiIWSKlp8&a0Uq2OXk3pfnW{tP7$W%be%ksC1C#?yxPfjv zCOAJIvi+b?HQ^IajDjxVRIgW^dJw-ZCDE3fgZBT1K_#w)jV!0}Y!ux*<+2TbZ}k2C zKraH=&qvW1%CuvJp-Ma+++t{~I|=B&VJL7ktV?m%B1z{qiv9Da@ioy9+z&6qb?T*^ zd_-}*SQ+f)_6=R*+L&z0=@q6{@XCuY7uQ+=-Fa*vW zAM?2GGCUxCHi6ID7yrCB>Xu#(bMca2JLnWYKSHAw&pZE#!2wu<|YOm`SS=kqhc*a8& z*?-TLrQ~+d{};oPArq}gu2Kv4_CB}97>r4hAk4T;pmOEmNLs0QZT!R79}0oi)V z@5-mb8MNa_MMAbuR2mGI5sZiVj}L2_BW%;H*1}3u$cCjn?YAR8d*nIe8kjUI70VFY zZy_{v@o`soq*Mk_w_d;_VgE4T7_mAL$Khc9rDbY01mF5u6jAAVP$;7c4hZ)i?wMkr zR`>{$i*VBFRS)D|Fz&8Y977inCqES<44+|t6R++91r0XCmR(FN!QO~OMolA}R%H{n zS_-sz!|$6;7-;pqkw7VlcBiv)!x4ftX77KmLpq8Crcqv#3@TmTs;TO&^+z?>*kwdIa@eTZI88F2e9 z2d@BJz@xx)!&Bra8M;AGcU`8=Il~a#9&itY;96v8+D|z3oc%R0!Um;jyK9H*ZLoHY zy+5&1yCtLW|K>K}TXs-rI$2-zH~+p@`0!IU8P+Pf8XP6`&%7D`yf=N*ZN4^hZwqa} zC54>8KG7`?mKrM$Cimt%^*gA@Y2v4O@Vk3!zB2z_yYEZWv-Q%#>!KL>W1%ef2bmVV z1+vvR;85kDXf(-3IvFl>B9}I49%ees0NuOf!#Dl;O~>Kvb;INSRAZM|H`r%AUw3#- zY)G>;C0v-kvJmhm5lH) zpE~d8uI6t4Y+4XQ=~A|pAXrIc@h)4NwUA7>Tm3-GeKG>~JIi)+H|B^_mFV$uank>! zX}RXhh@+bpOYH69*CYc2q6x>X+xyGQXx?I(0ANSvJe2P1KPL@gb4 zL^j?nHG-3UnF-Uoq}1WbJ6eYma107qyGVt2e?NvXMZ6LWe4Dc;&YjQMi_>9VpHJVC zywmOnzHbd5W9px6_Xbf4(`7al-Wi`3=zeJax)UWM(WmMix;r!eG_@vff2CW$eZL<* zobO*&mCcVA|E#ty{ z7jk;P{y;5YnzYBq_=OYgkKwv=AdMrcDrq!RI7K1Ip7DYfXdq2~f*ZTib4uX*}bF2!BT?^g<9!GnSWec=F; zBoZVLwo8l-W3iO->LVQT3ZDEUOe`D`-6 zPJvjlwX%M2QJ<)hGgc-6;-@04d5C3RP(LO`JFY3q3Cee#kgdsr#jD2=fjc+A)C6CJt>$T&342vpJ5r)(O?* zzCtH9ogt_Vj)YcU|CcxC?-!s24iGC5&DT9s9wqisnM75grIV%Lf^#A}@8gYDrPjxK zB{yfpQ5<@6xxmK2Mmr6T0_G^*A`cfc@2bI6ojT*WWXiPn_50PbcLySSQe;kIBu1X` zkcAE17Ni6W_{LO;!tbH|m8$l9B6K%6v!L+wVP}v_)8M|}8J*^vk|CG1FO}Y%~c)`|EQya5s<4$J)*+dyF2uJdT4z4 z=uBhNU~;fcC3(x6-Ce7=llSTqngyx`~ zio(@j1)~Jx3{cUQeW^wCSF?{qHxm0In>?ge#GZ7mYX9CIK0NmSEeW;uL7W)`ue_Gp z5=1NeM-_L}w9dOzZ}%#EI};?#pDZko8K=aK&E#=fI~J#FVG=~+bZk1hY6rJw{|`30 zVcjh7Ly>N1YurJ?^~JHGA>JbnZ(z4y%WAWXE!dNnBneYV5v=q2WsOOZ=1=W(LYP(8#R@+lMR{qm20O zPMG@Dx~DAH$k;x8MC&@YV*O6K*`ek}=9J_gefoKQ`X0m(Yv)FC!OY@6(wg%tkpiJA zovcEvnkvV?GBhmetoj&ue25-_ zp5E{T1+0Zp|7_Ugb->66i_53Md%kB7N(mS=thWCf4@D9#GWIlV3mU{|Kf=`&O%5^IE zp5Xm%#sEwOC8!VJf;}Ji))g89DPswCY|o&$F}0L!!*d>5p1;`&f916y5aj8Gy8 zJ>_u`oSAJYOevF}EQLDw4Mtk|Z zi_7%y)j!UXs$$!gq%soK9S37t{miymCT9b2;VbW;n1Z%oK@IdV9UIdh#qZO-HkHKG z59lCB!4wq}_U-wjflPrtBK7qwAz;vESng?GT_T&=9V!4Yb1K1Ce)`J z+`-SO!joZh3B_PT9^4_Ht_aUB#>9{Yi`1`ckU$0%jb6$ncT**AE*zt!RNDgTvfbN} zrYB6wv?_83hpmnDxNequ(fAPk4+zH4MbP=l%xp<;g2~eSfOe2`+@ut|B%-Gvh zh%6%3HQnqg`ma(k9CH3y__h7IZTfCCB^I@GN2>7kyd>&p`Ys9%L%I%$X`Oe@GipGi zzE(W_?C6?rw%_dg!bqZ}slaj#&hqZA=Lr&}@O5FjuFz$D35ZgtrWG#D)pCmPW$h+- z>8F)OR?a->e#ok4!bFZ&gKx<4K}S3~rP7WYq%0}$*eQZVrBf@k_@ME9Yw=8mO-c?* zg-9)_up&O)qBx)yef#l4`=miJ5nQICiT$FpPqkmau`EaBXPATxG zfDDVV4(e5&L!n_1bgkv@NW7_NPQ|u2E=DIH6wV04;RNsD1m#4&yke1>bbekz+%x6W$lOJ9${T3C4-@x;Bm=Whl`AILV`j;4@QY_wyIZNM{BNGWC%|XkyI5d+*igJ zAhH3A7c6$NMkJ#VPbyDX!y=YV!x;?(7k%HBHcep>hFVaL7Z$&H$Dte%S{mQ=pV4@E ze`52_<@>aF68Qf0@#5(5?e@l!O}5B2zNrTqOBAuLw6*8e_2cZ_`zA(2%MmmF+uZ|KUe||T zFaO=Ph@@0)XDBn$MX|rDN!`1O(ogb&2#~n!HMesrpOHm5l zlRIfV7kn4zEIj*6WR99k;gtvqN*6J;^`=z&Kx(bZN5|<5 zD4?hJfWHn??O4-Bp5PQQN?R^QRFnnudICrac24zIpa*a62A>SX|(1he-6yra<-qYr;e*Bg+;oUs2_j)T+cHq@~H@Vv;auPe{*|&`Fv7?l73)YscRjL6Ym8;y{#sg(*K6~2Y}daGD1!C2tUk_=CLtdHynm!*}Toju^JJ{aGSxeGiCXQo@U!+HS|vSJ_;Q&X7u0F zkeUq)pqzH--@%pI8j3VFo}!nncEg1#!~WwQsv<__#;yhP&e;@RyRM=&gxvxobwN9v zm!Od`syc~#OaDJoJ4H*`kad9Eu3(?BD31C$L)kuB4$Dd!V>(u3Rms*PLs3__XRkk(Mf8GSJ9 zhI=5ku7nxR)kZw>Tx)Lg<@?}j`uixLjfz<^J7(UcrJ;cWtJAO8Zk8^UW1`j07R88| zomh*3AO$|9CJI?Rfi&mzQ+<>IAe{eW{kiF+PT_f1a7&!Te#_gg{Iovno<2_fiG~48 z1&x=7sRDTDC~H{Ei=bXT#|||@2G{BJWpes(wK*TH*bHnT2sA0G-FEO)CNb@3T4y_c znz#Z6cVrH*_4Wf`ZmP^%LpJf~MB$Pw*yZ5Y=uR(PtFBY`|7P)u8z{)|*%GC6T8Udf zj@_n1L&~Jhn#3KLL!;(HU8vL@?*2*e`hYopWb12#+#f*A+uDb;K$gVH$iJcVEO&t} zxq5c(p>NQEQabXX4o+)<1OcN2wY6RrfD7o;*K?5y?MU|U3NMqd$D}Z(7leTr6tXQ8 z7^7$FbUa_=HF7{xLyWd8ucukHyG@cr#)!ZHrc(KLhcCP)(Uyb zM7U5TAY7Hc2WZ#H`m!E|1nC}#2rS4NRsTTKz=D3$A-&~Ql|+&UDCk8YQ96`|67Mn9 z_sUXEAj-N{87u9@>Tg=z+moG2Rc%jGbqoE{BM66KM8D@={x+Cmc8QA*+g4!R^APFU zb2OpSqFb+gD=RlCCtNg^YgNjh|74zLvD@;jY$SuvBJBi=Pq@QMib2VyYM-UFqK@TO zJ{o@~AuZ-z$I9L_#tW@uUdD`5QqTa+00u&5C~7ZaT-*xGgs)ZwmCifoC1( zJ2N%Icf_Laa{S+g`=X7C{prNM^`9pD;A>w(o&`6My zr*!3m=!l_g1=hY++|-&+MDHKAHSFHA)6b&j1222~B4AX;V<%Ton8e)3IHrNuB2#H| zA{Lu2>vr~}Pn@n=8yS%C55XYJXxKF~opVH%-z_o98DM)kjLtB|gO(BLok0NdEq9=h zXFoZmtI73jO~KaDbe+B)%pq6+b+`sexn;(gveaKWW^!UEXOIL`OTCK#>^d;}B-AzQ z>`V!gkeOfHln5Frn4g zLtIpQ zn53zeP|`8-L83I5^@MHr0`m@3q%(@1Fc$8V&LXba#jJRO0LxTUl$@)0k1A!LDN{EyOdoeJSJ zPDj+~yGy4a5DroXqa{x4Q0R`2dNLrB;o_LjMZD4yOxuYfi$aK|tN_d%CUiKVVvy@2 zpq_?XQnORd()M%j#SVrxd zC?=^5C(SC`T>$=Z&Nis+Vlq!#7FM{fnT)Y2G{N8#f;U#*NJ-VmQ@W^X#yG#UnSza- z7JtIf?}*!j-k8$0-HNzPx*xkk-hLDZUc%@i1 zAUN4JK|7g69EmY{>7BNgPtV=f%wW%;r@SW zrV9t%j0_q1&Z-ASSv`A`C!=-$3aFvu}uP{x81HIXVxu+xD@orm^iNX&T$MZ8f%SH?|tvwr!`eZQnP0 z@9#U`Ip^N{@7s~KBV#0U&EK4BJ%h)3LBXvfd72)4lsppG==7tNtr_&hs~|f@Hc284 zjW_tC^wiw)Q8`vmT{8V@rR~DcbDbAinL5^ZAL>C7H)eN@*U{&;?{AaAfLj4SIXT~T ze_1X?Oy>G%=Pt5E#2lfa7l z*+~#3rdmtnWJoIpKHo^*_}L!DCzGjqUMS-nKM77dQTQ=fbv$#MWq}%~xSVKC-uo_e z{4r6d{R_gF8(;d4Bq#3MOxh^;d@JWXaTM6GW&9r8f5V$dH_CRuq!qipwgOlpjc}H} zzCZw;BiOVluUK5(s)M&bBi$n3^aZXvJ2S-&4^j`l^NR3kxXZWN#P8@>02N)``uZg@!D@AhWM^jjj;uf1GTTz)aJ;Bznl9F!%OL)L(oBOZt1u|! zZC}9aT{)i+v$BampLiOQ9RVq+v_XmrN@Ca-2&}IF|DQ?e=#?WMOa(G){=2PMG4qz> z5B}I3t;k-dWJ+= z`Nn_tHfj&)Q&7~JNU4Qp3(&2V@K9B{^baSHyXmU1nzTW zVy5lJA{AT}?D`?NO5I9=i5x$F2BHbL8<44uk)_jkeVI`~7F{ej5Ed_kV`laror8Nd z))6FI)7II>-Vx+ob1XxXjrkC_nan)77v0tj1oj*Uh=$f0tnrTo@Q98~S(5+m9dywV5i9ZrGed7__LEA3 z^?_vrY~0$ALrQ50o59XlP9Ygc%997+x@V>anRG>*)R{_!SVhyqQETPIrB!>}OhK`W82I zm_HeJmq27$ETdqY8U(dY!T6l+Ya;-y}X5$4o3zN`!B_D5FG97B>ehOP$c-X*%qT}r8G8@Fq_ zVAX0crESCsQo7mj__bLjq;^K!0?qTLmMU=Tx+tW0>v(IQv~FWC7&mMJV>weVA(R4R zReKGPQ|tH79CGOlj}shK&V{xn8w!=Lj;|L|NVl=uI{FuuXrGTKa@Im%xB3Yba4Wpi zOUdJmS9@C{lekA01%hyv?dsWp1&S!et=b>Z(v)uNEPoV{@oW7a#1*7!efn^f9kj*}PYQ@coB$c>)oX)Xni&7EywRYj0-TeN( zuE5PccyNe`GYVnx&*=s$B)cF4Ul^3lWh2`u{c0`pg+UN^L44>-Pd3F+f{2g@NEx#H zNxp197GG`Q2z7K{;e)(a??jYTK`>4RZy^QH;tm$nG+XTmQK=^j+gcgb0y1U=hgp4vO;|*gW**nUs(HkNL7svQa<~DC4s= zD^14L(9#rE07o(K#79dy&ov%3b!x<&PS%Z%vha#+|NLt!Ax^Dv!M>EBaO*Xh&kauj znL`z-JoT<=M;xx%C>(muK-8P+vaZP64k-tfV^i0YH=!0034p)V_-gzt+iPw{0Cta~ zW&Y|1uUp~FR0yjEKycK!$*2Wm5Na^892!|RdC1=h}g{F01xzl|GJ3mYO{gM zQ3=Ho2b^IcHf?*w`w{mZXzu)l47oo(4zHi)K|mlzv$lQyeB;qP1>h7NqX-cHG;GY> z)Fa+gU=pi@=FGUoo^1x(tQdkNIl0JI@Ix4o>)1fn@In~K*2q%AHPYR1hbUZ-l$bDV zOi>*tMil9w7&6>{hhf4b9@DKtVx=nihN}ga0 z496&!`n;h?TVN>xVPJ@7b@D6yw^D(%gPgfyHJCp#Alh4^D@$pL%%icCs!KXc#WDb$K+ffu9fd z{{AwUdC++(GW$1&!cfc?Y6{xrAOfcczjN$dE(zPeE{6f?@N|2+@Mvgh!#AF7%?&5^ zr#{^W?ez3`-I+X^#m~|%lsR(R{GDlwtjQ@k`^Dqw_3_u|Znx!p7iv8dSN|l>OZy#b zn5k%0cYpf|(F=X!bS`QpH{pBu$JKuLi^t9EUo+O|vG3=MwWH}Fwv0>{tJ6l)dF|8z zM+R7wsvh+ZU44q)OG3w&Bdz+*^ViOI{Os@df2Yg^2Y;o^>pQP6S%|+n7dKp7Uc067 z<#E~`&lcx@N<>y_b_M@_X}#_2M6c|3rdbis&kcuI*pU9wI_?~(?$`Rh-1En>V-!l= zWK(ByJ)0Z#4khVpuQ_I}KY9fX=*%dbWOD~ksmy5z&eJxf(Ik`B;qRZb^-^j86a~EZ zSHL_}CMdJxQv(Q?uN)>j$ysUAr#)CbM-Wp;TqeUi2e$Fs1*fEmm$L7F@U09H=`Tme zt~Uu_(Np=bAeVaH0gnK>pW;f}zO>y#*#~0n`>koqKOZIo8#7)tL)Oom^vJ`TmR5}R zY1Hop1gZ|VyuM1^eR3(+$R#^J9Dhe&;>H9cC4(Op{^6MJX7|(-U?v{vd?{PIU^G#5x!Hakxwgrn++;83^>x;L>_DyS{7B7hW3( z_BnU)g9Jg{+)v?E`|EuO=Gw1d>YCh_i-Z0ZEptK{Iix6q&V$ac=D3O4`6G~s@ZLSk zwLf0@1J7fJAER%Ca}dghm--_I7?3LYmvpyQ|BT5utSznz#*(wE2ofU!A%lqZs-uo4Bz7^QaK&~N4>I8?sZ_X;cmAi3V{ojc)g*fJg zA>J<^K%%U4ct+_&p|iArA|+2I4e&x)o)Dutl!7-tbT^c^)^ zqjI|^mv64`Ru1V4QqoyND0`?Vn-4Nll2_l}4*mCdo!>VXF({h29@1txW1&Ne2fkId z5~J7q<>!O@F^Ylk2By+PV9y-wFQjiv<1q$C$jE~@vE={n_;@e`b9lnYhfXDG`^~b$ z#C1@bq_K3i3Vo>8bhsIbsx2v~2z1XBD5v}%X2nd)1LUI&2zYzY*j19foBxJZ#UJQE zX!a5C&i_EGlKy+Z1h!Z5@6KoMGjv48-BBxW68Yz^iqFnx*?P;dKasdaK7s>*iL>M2 zuFeV`M{3!=9QKS}cUhbS;%1N!@z7v87w9a(!8JkyBPQ`VG(V17#`t`Htiq(j^3H9b z`%<+o`FFr|CIew1+F3%A;sZIWtkbSlrwvS()wsqPGX)zu>f7%D+K~n~0XM$*=BJT} zZ(|Y$v2Z^z-pXTL@Tf?jehaK`%N1fr+Iu-r`Yg`e>5%fQOjaY|S?D-%>gqwr`Bl8Y zmwopug4ke_?;nZOA&j-*n+Yh-nP{Pj7YSkHZ)(@js$WMu;8#_Jkvy4VV7y#!SqVNw z$>r16llAY(FhDb^rNku08-+P^{{u{d;lz{=NTiwoy|oewM;H^-@mMEiwzPey`+;y| zCOt>WaK>y#E8oXXEi^F6_iV{6EQ9^pW$86^(ZTciwl>E?60ozIC1Ti?uJh==^Do*u zl$IVDcp7K#X)IVQE&%>f0pK6utE}SDO*!Hj9pcEzC%u5QG$B)Thj~<9b0~-(NqiKZ zvf_Q*vAp-g;tzk`I`&wrpiK-YW?aP>Mn+Xkp|nb9-r^cdhGvyeuC5(lI1cX@ZC(Uj z)vvYc=y8q&oJRr!1du>Kd>Y5lBvEs%FfO%l0Ey*aA2s{{;x~X=NcX|}Ndj3Vq<;Jc zt&H_j6G27-K_^Nc;Ow`<$=H=gmx&~UX&Uy+z9vs2n3KuM#oiTkf%MqFtvlP&Nzfj- zW_a9BMAE1%I<~>^W+)E&OZOukm>*bgHW)vZIJQ*qJaGHaRuN_Go%moE@eof$v}gcT zz}KU;U;U)0W^n1gl6|5~$RXx9%}1J?Cm?XD{{dk(WJ;Tqf76%1gogF*vY8(SBL{0~ za-ZG7K@33K5^93W2ovG{q?6-o4G4}Y!i*cAgNaBG`(0d>VqPpsqw^;0yF}`Kh--d6GUr&VF=#6;=GK_BV)GX#%SKO=MXn z;ukgY3JL|^$%{?SB}-bf(xbH;bnS|eM5k}1_BVA#Ay!x+EdBX>3Mb6`uEH%Z3hE!? z>Ke)U!RP!mh#$s)nvQ|W3_Z_@zjHVn_PWzU)P*8}khquhfah%E{9zmVCJ_>&tfaEp zA0Td_efE)RyAAEAnJ(+w(iF^Bbci}mqa2!_zal{$>Z=4lA`h9<;|v6zldHq7$Y#V1 zO$`KdrQ{prCyVS;=PgALR_xOSLGU!p#aDDGSd@(-mrw`LnEOJ0SbEBy%MTBUAC*f)exC5NPpx{X>{FY)*(b1P=b1Pzz7T; zOn;(HplhH6K|q*)6Hcaky2Di*?^eVzZplqjOYBQGAqm)CCfFW{995{8qY;%{HOcbv z4VR!F64I+)CLD`}#1KH>&qlm_#QpUFygymC>)?eW|E}^38VCZqx_mdjbW-N@MIxyUaYS@K+6j)VW~@9w#Puu zli+`Qc zs=DRjo-~aNU8UNeSW-W&$Jd@6iIo?vtLiYIM6EjE>=B(gZQG``yO`1nPFM-V( ziK=)doeN)dA}%02T^C!zss+_1{Z`rJsm&Z9lvp)rhgQq{IGKtG-in{r)#f6x+vgJV zmYVtKoAGNXL4fDSD`Ny=#_n1<2s&?QCF5+g_#t$U6fI^0PG35pb9~2MvFKsnc&+>{ z?rPVHUxO}`Fz=M2ghu<4!!65H+>@u~uB|mp#fwnwND(4>ZH6JFp~9;kqA5CE zS^j{;$+_oUk6q0ED|S(5KE+v}@uaW3FO8FZjK(<1mntJ#9ULQSL}ukYQn zUiXcTbdV~Z4gK+IwZjh@UV=yQ$XQt#k)38YZy)C zy2Nl$0#fmzV7{ve2MtL_2mLOr@N@gX^?ZWx#)V8qOkfU!xed6esH+Sb>q{gms%8=o zecQgv)+x(S5RzhYVuWir8%gY}YVKd!wbydiA~Ja<2RA{RpK_H8_hsy;xq|PqlGmcd z>5`Fjli6KM8hGix2-5l3R>+x%F~mq<+dVx#Xx$Ev55doE1J}!f#ukbl=<|3fj9zb* zXMT=u!0_D6gTNrK4jTCDS!Yl`5-?&hh~!>(&Gkp;NG$4H`7L{I74!6F{i8z_#+rZ{ zT06F|rQ37z3^`Lzhk)zm<5u_Hidc5NnszlY#Nn00^6Uc-7cFwk+g#3dv(MrT*8F^# zERu`%iQypJs(e3Jb&>?PA>a~@!2H>4lb|8oBtadE-!X7$>Wqv7QBzH^5u40&&+d>( z3XI8?_NvcnVkgeIuiqBS*FN&YiSwqmmq?5sR$?{Pb1;Lv7Z6blDMo6V5o9;Kf-6>TZiU*Z5T!*qCJA#jg4q3V++Jo$02Hjg z00C~n>yUvd=O-+>YLEI#9VJtq|1yrx+|#33d_*MyMQKt_|022E;}K0>(dpd@4b!K|Hj4eM5~<_L6!` zorP!c2S2aP7I>uPMBiPu()8rd_+M|HSqHVUUQfhvlSiExuAV#?^SaIE#&8y5mP#<7 zD7M8rDrv`4_&RZCPrAl`tPF)a5yI$g+;vX5uXh%jmOsM6-piPR>}{_F&-toXIUkeH z(YKYU)s;>O7@_^t%y+y%-%9=MRc9PX)^C}td=#9}Vo)Y9k=2Rrz{{UJ)>uD7s*3er{a&|F6Ar~y~Ny{dG z9@yiPxfPTl(Ii6~5$6{-XX{eN14}^q%DUZDNZr3SIGbPbn;1#=JR(m)Mg&gxejapX zeU|pS(RY>U0(2$_fAMd!IH0lFj=m)=#>_4H-G&{T^zRuF$})FvrVNtEwPOeCc|WYw z$7e0??^bo+@4Oh3IUb|d;r++9e}g*v4F)fp1YjD66!H#XyW}df8?d|59=6jSHzM3_ zjGC}yU*PZd3d0{RCYk;2?I|6Ti8NLow(HY@JjA&N1xkMt37HBY|HD*Kh;&(s~YGSLg}stsCy5MMpFC z=SX2Ib*m!ou&R|*PLa#-0EbvgZUYroQPD>suA9!TXQVNxDAz}Q17dE4tAMBQJ-R%t z{NWEL&z?6|aj%n|2_S}fcKnQCS{0OzVVI1^qbRr<)HTYed&Be#%9+V4$sKSycm%_t zJT~hP4Sh_(OielvjZ|0JfC0MUM91ib_Ra&Qv^ekqHz;cBLATl|{{EBX&+u@*$ig>F zd)oUlQTQ_F(Xv4~8l;gRRM3+(=HR^0A98)nXA0Veusx_{p>k8r{Nm5N3arQ)2#`X0*w5SMpku6Mv7O(GO5s$jcae zmXWj`B>gh}17)c_kC)C@^VoAxl{6jLoy=t&v)SYIh3=U-xeZLr#_{q;aUc>H&F(Lj zj75Ih(cnfmyfguMaOTG;97w3kSu0Nm?*`&sS#=T+xtzI7xtN_)?_2W=kKJ2f1eY-TKtE6;)uDU1k4XmvYiXNngFx!W?_=aQZ@dL&HU& zb|Dy2r-xC55~-a$Pg^{AQP(L&@oYjX=v+$^zEn>FZoPt-Q3b0F&)1h&=PMY0x*2jT zHa&_UwZL?J`ayY`K6I^oQmjPZ7i(rPEkkPk79Y|>gmyo0f|w9YWxGUPa0Vo``Ae_j zJaU&hLBXd)kBN>8fjmE?ZQQU}B5@lnTcFUGfvU1U19)gZCplfD(M+7&oZ?Op66m1s z{fDX%DOZcfKqw9B$XnWbD2fc#03MMN;1N0K97!X1(_NeSh?|JQd~AtGMn=REaJb9^ zv(>f+sf7mRhO^^^tMXJ2mD#`|vsIXNjdHT9deBAH#q^X1iA}*w_$9woef~++6eeM& zA?Y)Wt{xaRq2k9JGP7TX4>T4ZuWc=VD`#kYQ(Sw7`WQSAJVdCU@D!x1pRkR5q>mXM zcEvh{EHIdlX>ajRI^b?tQ<0C!yeW?{s~}IOl=8*-3uo5eZMx&5rr8I|&bgInrb|A%{UPLYREp z5bw6_CO1L+xfFfDY7f~pgALxMHvHbe{?|1iE(4upk{~yerN?sCHXGBW?OH3|!#JtMk#BNu6u{ zA+MXEf0zm1DLP}haGrDASf>+yU+3bBe>3RWQa8BacoxDMG#GIyzl=i0TbQjNerE#B^DW%;Z1>2d#Drs^t zuY1h@{`%>KNP*F;|Ezm(I(#@ZSIye*S_yG#@AuGIIX#c)H9JGMb$7s!_w(u=l3`vDF6* zz$n){{xa3wD}}$fFlb$NLqxb$c%Oinr7s<1aC=wU%$V69O?jL=)?qPM>f}}i>^|Ms zinj|0H!RB)h^Sa(*3V0QZHU|A+Iw-sY~%`qwFzNB*7PY{Cz8W#VTx|G%J*H@N`{sF z+X-kQ?)OgoYK`7T!SO2rwDC>&hzL$K3&|6{ueX^KYspBHy;bAM@-q>Go}6*rJE=vR z)1jtBQa~&KGzDRAc+i=tDwDo!Ftj?k=va`vSU;zx*(bwF2PCSNFDlKTJudq9^A77k z{?x#EaRX}8SzQS=S8lJ|FA^NXA2-+y+|15xOUlVa<0b1rS#x) zgNfH4aopAih-ZC4K zYre^6V@i$*Ps*u`Y1w@EY+-kkx86~jF$of`3<7ptA7Eh)<-d*5@<2hTGt1&g_*KJ0 zxEX@}RhCqHfXAdr0P6?Qilje}^lj=8ybEabU$gbuOUfSH9GBX$Aciyul&(wl%eq?`0dI$?6L>B=rKlEvo+u8B8_}5ju!n|rXEdY9>d6a zzm-$hd;>)yi%YW5JZt!6zs+I*!sF3oEoEEeSv!Fw&wmwdzx&%_?hl>PnZNN2b!v`c zv1eaHgmE8Zpln;%CGM1Fe8p`#|A-Pn2ds~u%QUqQ1s@#tv@6;@FZ(SPQ@!&sXw>=p zY+$G#!VGmx4PUAG@eUA)vnxIWY8|pp9rEZl*d@Zs&^(wf>4`ml^KvsW_J%uS_MVtN zBm68ug;Wtxh()H+IDMN+HX2A!+sX&aP9N%V6I+g-qb;Jp>@;~Qv|w0aw=(#+Z3MXQ zUX1`>QIqH=kyHWF8;H$bPYM8V&Au~xAQ=8YZ(e;tY+|*8T_ym@{POKDDEX(F2uu;w zVx&Nhd6d0r>t#`QJ3#3oN|G1~xI6F*bIlL(MSo?XPnEfU@XVYPdD@FU>~&y!=Twa# z`ob(sgT*6~WisnMprgH?r^oCPWlSG_K_70)fGd2Xbd^rir8z%r^Z%e_AC5nSyh@L# zSl`G**`le{Y%E$|sH?W0O?dS|m<4{B@cQVh_YER+v;{UIibDK+05#++9~^x1_ZYgo zYD*p$`9X5+=}fFImU&M6v%e*;l=1nDomyEvheQ&pmDL+l4IV9fKDB^s-8@iYc6m;j z{~(5iv`n}ap&eX*xV!{zR<9hDZmP8T0X&>QwP9Q7xj|wHlVsE@MM!{FjkUO`=!sks zB(w7H5S^c|=F~606(x$(*ID&pKPw_Eh9szU6s>E#EKbaPtP$QCp8(ZRQN~aa3cgNO zd7B!jc^~BtF(ECw5{v$qJ-$r*_!m*f<4U9%!yY_FA2khEU)~(mwvNLdSelE>_O89c z*|x4@_mM2|yLVq<9PE>&I-8H7m|Gq#3@E^a=Em};r##Vn*jkAqsG4fy_#fiu*zrmH z6qCeeWgam#e|~#;wqp2j>%<(>>ST2K4p%d$G3(3Gz0-U8jUVotAhZVSrC_;(@@bg0 z_tbH9ep(XT>mA;ygKCritKhPRHkSKyHRsu^;V>x30@;SN^W)!Ok2LIWE9K(g{`M`C zhyL7{ClUA5Q1&(Pt;i%k>E~?EMFITmvO7yMyTn+hr@E(xQ)?i$%XfUlbsnv#%Uc{* zjc?$L7P@A&sIsh$Ey-2Jn{z2^YpGXzEdV2xbTS5jf7P0am^>^`?2ZV|nTXS?AzuZ!4 z|Ga{Lnp9;d-BO^)(LITmsyn>&`QNXV`2b2Wi(7GI@OJVXJ0n>F@}~Rg858yw zAUUG6vcb-hoTh)tj=9NSvcuS2Ollinm!iVJ=B#MPx5f{;O#pok5Xs>{`3QK73M*et zxAvx;xM=T9p{%vzWnNl5Sy*6_peg1QYj@xOpXd_HC`(v361MX1>()}&%0c$b@Q&$HUivE z0i!~3Yi;n2pKk-}Uu&|7aGO59L|7VTSM!hC8<<5J2~CH(IkYN=nN$C04m}T+5et#; za_w;b-aEM#++9c*Vb_GX2f`f!ve63ON#vZXEF-%vP|^S?nq{asqF`$6 zC=+}@atzg&M5_phY_Y?9q)eS2yAHD#O)HOl#&rkHup zF~BK@Cd`*k*dH}*wO)lW1!Q?XqjmpVW}u#`p1Va}mb9qLbnAgULr|gy!K6^Nn>#u1 z9-@FYR8uZJTO6VO0B~M-V_|||b;*R85DKI4s3V9vpMCSub9PF#w1xL{_sqPaN1v8v z1JdXNG;mB&a@X;xBm|Hk1}-`XVd5rC6kQXPuSaDQuRNm^lO6pwzdXoSCwrf$AXvoM zs+M1C#4vZ@pz=-xfj~JC73^}!YQlkInXgI&{c2Mc$*bSIsRKST13r=&slRFqCk(=V zc!n{G@9%Njwc3eTw>G2HD?X!Is)9&&V6uR%zLbAdvDcwdX72r@2Vd<$p-zWquK#5p zX0Xm~IN3xP-Y@q>hN^GdlPCa1e_K_Bld`C8E}#jjT_+#_MYCLX4xE?J^a7oCsZWr1 z+V%O|7YGKtiC@y2^!N+2DEXWg8PKr6IrMZp`81a}W+S6b#`F)LZBP>Ng#&K8T6+=J zwg>$f)0s>Wev=}?$4(-C;85hm(J&KXlvGtP=Y=_#Zg0eHp3`l+z(1XfOMx(aV3lJT zBw^xFhEVTZ0&-t~0H3P>emI~7Z9~+|2^8FabN`_L``~6mHb5~l>i~)2+|5LKbw_zM z=w(|K-3nwROg995*YLH=xf(5b`Z0kF;s;A_3f4iZ*MpcX{4bfKmw()g7Ull^p)Obf zrw5jYMWZqvk)OlIuh&0D@m+F;q;KN)sq3b&@$E_WBS_;z|2Z*_b!6IGWf27}R^|{U zB<1PI8g&Q_p?LaedkZ^Ta6XDk4F)VK9{I0x1oF@@_?06`@V65t{g`a;I~am4LP3{$ z2bO>{p`p2rVnntU>a8JEo8U35cQdY!}*0pK;2o?yQC)##M_A61MJRSgIF-D%Mk zSmZl40Ch>tL?9@fnW#8{wJfNk`$Tf}!~soF)L&J6!_X5wOxS8(!uS~@l&1d&lk<1G z(EDD#Z^rs>>A>|Elnww{CjM`}=&=THvZCNyVQ}Zz4rDoA#^t>WAhN={IBgC4sB3}b zz{NNx;E^LMr?a91QHkSLNg!#X1_|BwYR9N$xY&u&x2S0Z#3ve0_ws83TOUTyJm+;X%dVnppZKW~ZR33A49;~?3FyIo+@Hwx<4Cr)!RaO0@5 zZXvIyPja3<>Bk+p)8&r9dp}d8J79BghAOFuJh$nY1Y47H!8;t^Bee@t5v+=yB0OC9!MVW2#mL6UdalH^EaB0sE0p zN@Fyg`87pS>ggY^d~GUU3^!T3XL@UE_0q|1h?m0_l*dj;G0kqkE3z8ojAtEF{*D&> zbxYI42oVI}dP)PoPglouIW1VwIZ{;I(*g8Ez%_5X&UZ~(*g9c3AeZh}dX)YfIay;~ z9IP)2KX^3jByr5>T`a6bQ~v(_zU$nE5I`F>udgmz4`+3+QAj?oujOO#7s;l!_Asf4 z{(o59ZYr?#{P29ArJZRV@E}EWcJ(iFi z)DGZ&_*z!Se{Y3oDN1QmkS`k=#+Pc;Yc;tWbwIDW{KG6k8X zPL94=z3Yd)k*bKxdR`an@nJ3lLIzGz6f(iw5~dcZ{JOP3T@9-Oxd~RCOE+%Q4%dgP z3z4;cU^ps)N(2IaAYQrgEq{Ul3TKQcqenj3rN6YwoWC;ws7!RYgCA;$Oi=#yxEyz| zbQLW8!JJ=IqN7!g@8lA3MjVAq*Kwt0cZtIGlz04_C`YY%k6>ScN)us;Zlx zh=gFmPfAgkR%~<<@DChbGlLP8b1!!^{AA#d5;3|WNH0Po4k$~wc-7XZ{RT2#z|yhj zF4-O+e;N$@9g@=pv=VQ^42#vx-OFQx)yNl=+7uTIZAMqsx7=TehATqqFO3C!y3GI{ znJvRC+a=gj8aV4OY~$7E04y;D;n{L{&^Ua&4v3j7h`pXbJ0hPADjKwZ zQ(JxQHhsl`&z!xdHD9#0gp!7Wovt`g=#0jX>CvnSWq*okaybR~8jqs}3n zsliL^OwJIT&)P`X6f#JG7ihtNnjj!hGQ6p`1stf&c5eebP)iN&&`jCdZ1=5-z>jy#=u`J}B@Y zqmn|&C9Igx z+PE)ezgZ~ZvG&&-fS5&^{$zm7kuh_2lFsnoY&58?-BY|avl94_K4q-6WoNkEnIKK>ch4`LSd!X)Bu(s( z>2v&%+sT>Z_wI#>d%YT5pIgr$SRSTPpkR+j4csj}tH^c~wEW`v;`fo>cv%>=Pr1_& zK8=Kqk*qQyR>_&>%$9DKwzjF57TXgunLqz+tZ2JGjn#R}Ld?rnoV^-FaCM|D3eD}( zXSzf;pTBPTqMO|x>pd1g_~J02n_UiHxAW-L+TYr!n@u@Lz0`gv$S_3N;PO+|lN>2;3$$47%l+<0ZyQ z@cLLnPLh^U{>*O<*wxTp;X)B*id+M^@>?e!$R=D?y_`PfHq6`%gNNIULzpuC;ss$^ zS3Z}m52E0akTVTQ`WP#5;&Jc&1x3Ntf=_gqeYm&S(+mX!dibh?3Gs*L-!OWGGG8l zBwZjXvbZAu|MlSCn5-d7*T6&4)U~@;`jd_Kjh(MM}9H z6igR7GK>^Wou<-44kPG~+&}a0m0!s-Wd}<^d|Dp0_<#>l$vC5`bMl$WQq+02QGQ&4 zfp-y8I0DPc0zHExA^TyT_tohCA=0MeY&k5sM{$cNMK4ZS5l)1-KR;AN;x7TAQ*C@ky8k(%&)mgt(;7{ zM$qPqZs6F%v~fN^3S;XTa#CqX5Hz(!(y*=ltx)Y)44*-QJ>ZfspmPohkB~UuozG~R z4gR}PPwmFx2!FiNjr{;GRLCu>rw^EiMo$1fZ={!3TG{Ev3#Sg))hPaS@R7}{YZayt z-9VTwvsV=NWZ_3dXWN)aujwVuxHiV74#u=Dd&GVzR<;^vLy7kxf~%{vv-a3pPWY20 z3hg_GHvW?*tB&BuiJj29@~o0#IVOJ|jR3CvSM7@ZIzlEO-_Wgd2=Pe*X;m6*$w4*# zt)8tj(75i^H=wUFCs($gWjqhg&oUlDD4>iNq8j)6Wk{p?{IH?pk{ujnkbq26QKb|N zyyj%OW1n5<@FS)H+-?l`TNK!Oa*|~I(W%KiZVlrfG~y84r5}e z1yu$^DzHpUZ2v}yfKOFw;q6dXRZHv|_#&Xnl7>e*4KKt$@nA>kKQejN2Ec>G#km`; z4daV<%xRu)tjXT(I&k|4-wl4F_>?{U2OZq4vD$;@l%uY7cKf(2+WY8il!h;5qbY4z zJ*t|zeg$(JDKd_!6$a<0{`oza9943*Y|-*^Bq?nn+TvHkpO^8c;6N^XlMe`zk4^}jXu z_HWGvp2SvNIZcQkFQ;jYKUP+5{G}VG6hDGp-QuLCT3(;DqVGV|0A!gDT(YD~SH?dc z68Q~vg{tiOv(O$9fYTwm|B+1CnCb~9G95ojo_pMn5u2saXaNCSWV&W$ra!h5engwJXtojdt;wa%`jp$wN zG%mVjJV!n<3rw9+@m=?1lst+RxDlMU;GHW1x+11(aM#aHS$!SX@3+~K2;h!AV^!@_ ztu$}$D45+v>u^mQ%ohEdL40^u>rd2H*8`_5&$Mm<4GlZ4WW>B+Z;oG~>W&D3MqxPXif@;`P8Mn2J%wy(N%3Od5raNK=_Wl=x@}!9cN44$LHx}oT4uU! zI}F;_R~c{-2k<+50dS2{@;f?^I~kWH6K(a!(W^~~n!_Z5_U_T`TGl%tK+>hKsvwPb zeV;J1)j}D;+6-q}t!^A`)&^{w7|!p0V4z6hXdAABo8hL~0KC@7c$ zxKQew*)-x;c@Z#+f26o%80YcK@KsoIg=C1j0=I!7C&Xy7rSwjNk5D^nOZn-{+j#a$ zpEVj#yA|4m*fG1kdVlwRCgv1pHe}qKO#$y|H7fwT!9kKx8^r7K*)x3I*>s*JZ_H(z z%7Ao$w8=$clv(z7deMe%-*a1%%AYDDHZEtuKDE~HY!vAsV)WTxIg~pjaREA z<^A#Y!M*f?kdIPRdItjwkvvbaJiC4e5k70A(#m$I`-oA4;A8e>2%@VF430#VDxX8< zkbUJ)#YeOe1mSG^&?kDqD=`v0`=Dnq6mI%!44_AdII~X1$-{YHKcXijO(yq)ayeRI zzqt9XT32S^ykr2Dwdt1ZpA+6Hrqi8p_P*3!p*jTi~N;93~5dk{@SB zc*Wg?1Qt{7Lpgcye05yV0-9LcJGscNZngfDdadkmsO%>>M?c7)?=Z$8gT_^*0gWpL zjPI;G#5B%zoZ1$3v5_m*hKX~be1bzt9CdK2U@r=O+ z|7pX5_opW`iSY>CUFRKdO^mGWMUp63uC>-LStS@fN+|u0!HvfIrbvtBck~=kIAfn5 zTpkKzx(HoKGu=|;d`d0$Jet{m#D9cNM^PKJO0$2whh67cK9LS5O0BlqO8+3$FbZ1> zx3IUh|0&M6Q*mV$&xH(@yd0Pky~N4~UqoS*E6fzto>^enMmGmmTT+x;=6M*BilsYW zBuhYn#<8WOlk*2lPpue^gT`fLFFp5s#go1dWzs+UB}cQ8$b9D zL&gG-+v?(g;P*}qIKTC@TY8~k%6hQD?=?m{<9pqF?-Y0yjS$UA%x5e3t?ucYD32&r z2kgh&X^PIrFPACiSi&IG1=kmyp65d-cr3s0n1BU^DaXvx1+y(eG)*Tf+>S)%fmr6Y z9f|+6@|FAb5UzDAX{%8ha2@-O`wp*#FmYGmz-&&d!j9p^Htaz3{e2-T<@8}oF#2gP zYxr$4UvcS22lAuiO&OXtSyt+Ix9?;a#LS{2ZJX$fa3ykpZ&zsB6$M zzsLg&SRN*yU%s(s3T~XM1p#n(5nhZaD44JA9F<>kAM+jph&C?+$ef}u{O=HoipuL` zZ3b$j2wsL2;K~(0>id-4B1G^o0;LE)kcf`C|N+@k1&X$iG;&s z$r^Q0o-qURAE)aI2Hu3hd}9FrBhe0`0sbr)KA*2haTBr56kihMydsOBjlua*pu{-- zC~1iH^u?@+jxbg|=_{z|B(!e?P^$i6{+(2RJr!NK&PTC0M`wx^ZVw-Gai!m?yz^4F_D(au$Tw@ zpVFHX?$`^-60CYWYi-S~SC#s;;qn~b>l+=CQxTHJ2k~`3{X?ytV0uP(7oOrR9c~sv z8~hXo8UGJe?-(6g6KxB|wr$(CZQHh!6Wg|J+qP}<#3y$0^4;6rqu;MRHb(8jsH(Zv zTx(W_9_Rua#)~KkN}~#57HjOde`lhsSsMD=mG{dHZFv);P+-}jd1hE0Cn!li$Bx)K zi{@h>f;KKqmZp$%Z4=SJHYLFV5`@*}*F7;}Y%-%LwLCDGf`+k*2Ik#v=KL5sNb=@0 zCa5;cMk{cH3p<~cbg_~WHKvtL`H9UMhBONk(_W72q5aOR zuwBY=JhNKCLkgy!Yh$O{PW+kFySE;D5j%@M1|LPf{leT*6GPzDL zOWTnSrAqk(vlRyK>(jJGzRS{1b69o;$A8u&d*SiNcH{{ozUx0q*e5+d)=ZvnEVe%$ z*XD|o_!oza-IHPP#wOBkI3P3kI6SeAlbr5LemwTh<>`IAaCja^d&UOptpD2cy&Tgo z`F7vRSI85p@yKMn-+a_XeNXcz+P(H?bsw1v(47u`rp@&nSa?6Y8c$Mw%^up1WIZ?h zJlfX(`(6wgII<`6yLhwroAu3Nni&M{#(KsZDgY`einIyKL!>?B(p>?)-Zrj)IMwx{KfSHfHn-(+Acfonzz6&RnCH6!LUuZg1xP zXL&i0t(KCiU0&xddA(VxH~rd8-85H=p)rM3bRi;)(a@x^Hw+!okY1t6SU}v%K}^^SkH#<*1^7F4X?DGean+`iZSP)!HC4fm&y2h z^g+GkLTyc3y-IuDr_LsX?bf)p4f0&h)H6?q)yJUtlPxuCh3-$Q67nS9&0@1kz4u*5 z$*fisbk^yQGqMVA8MDDCauacAYv-+^tMm&)?-<`A^ef)V+0immD(f@vshhi5@7QLU z#nTkPL)QmxXCfI;`A3C}Plc_jn6LAP2TPd?9|A1UCYkwFg`$l(+!(#!%81e1xT#U1}U zmPC}0zCWT>x2jImB~ctSZ6z>NREW{G>E9#DTU%oTX!x~o9W}f@hbRYPHyFGGZPsM$2gUIjxt*eGO|qTOlv-c+ z{!VMSK3LDaz?(9l4=UHvtjMzG4gQYx(fc6PmAzISBr&C7m3gifwblWI?+#naQ3 z-@IraW}6?(z8bLFoppYFO4$Iv@_6lDX+M5b4Ou>x35tX`n<>q2|C%+JAqQ}56A-q9 zzsow|Rqgpm?zvEhZrb1E}kh-9Ng>cI| z!EgUckH$|jYL_tEfdeMH+JddeS zTJ@=^DHduJk^lr)OAxZN`*DHgfB}hj8;G|oW75-`D+zQS+yV!NAixG}!kK$A=44)C z;rMi^IXYR*simY>4YC9^DO4*%m8qVOWJ`^B&Q>!Z((E6b=^}dt$S9ZfhL{Nvy84Zp z?@$SjDOUv)B)}U$sn7EW?pO;&jb*Loja&2&1SAi^!uQ>Q3HrzM_J}i&4Q{9x`-ibt z$ndE6WeXf_xNy>atdY+xqfnx~)PF~(lh?Pu)+ceP;5EeODBsCAnt*UrDZ=51Hi1_V zsVBVo*-{?7_&?-BZ<%IRKI;-HjGqT2=%1mR9#9#_SQyHkrtNW51a=mkX`qIxn%n}9 ztN4q!GLtdDLX4hHnYu6V_ZFC3Ejfv>Fs+rVBJJ%_mHRoJWk~$|F6Tnu|4=Zof2zNv zNxpS{=-J`*`0{t$k`=t_+&U)^SV9Uz&nZ8CSGdF2^V69h@FsoB{V%9Y^#2c3-bWSa z?VlOK-N@aa+}#mk#&Cl}3u~3pNM@cqWW&z`o1O<|qi5G;usX&t7Y&L)H%Ow#B9QaQ zuDI}J69#LU!BR4X`B$SLM;=evev5at98x?E>(u~d7cY9rN&|qeP-965|5fnL zKL|Cdd{hl2OJ4zv&=ciB96lW`^45&=IZ9X6h|f{(m+P&cAB2uqrHjE6jSLo#v8Dx# zgeR~1e7?IGvj0AH58sSHq~s8tJk(9O)Dngor+%6j!6txsj8a1!Mj>9mpC8ND9}dU- z{S1MX!Zgsl($UNmfuYdC${$tadbm*6BdcIKS&cVbi?qoo3R8`D>@eFFkV~I?C=5Tx zko}YCbM>6OsBE`vSC~CG&HI8UrgN%=6b-M|gJnS1Yq=?8Dz24K;Pm@!wZACI{!gz42sgZr2 z#Gxa90|grnhW#yI77RD$II3*s7*jJet+&S|jNh;zHjn_W_fK4*(uj{&GG+3f0n$ik z&R%rU3vOrqeGZzyaR!b>6>geAN83sHgz1bNbL1q5JPj30gV5;KU)35vVw(y@C4GsN zYIV{8r*5c=?1vy{>Kf=o0wX+7DUj1nV0H`zU8e#$GU%D2h{onihcQwHY*Wq#ddGGb zNF=OgPE%cqRxyJ-rrL172>~^a2N#-fQa!oi0Jte!)h-~TU8>X;4K2x2w$76zplt%U z2`sXZO=txo)gw@R%;jtz@6t|j|EJ?W5PAq44iAow&%iW{u4#wHt_mwh3Ve6)sK~jqu`rBXIN#H1Bb*zv>ZL(QIbJc3j?YeGelYX3g7bB$kjZGAQshoEVF%jW9%Ng_M5Jkryt*Q3Y*g_e5Qr9R!zB|%7$IBNdYjPTvdpH_lC9@p z5ov;Q%a^G*5e}tMlo}pb41s`{g`E3QO?zzf%y49imTP9HR*S|OaHI=6@8whlOvYft zVR?|qrHr4%nUJ)JmOCH6mLvv6p*yE|?I$@Z-R)h;CFzl-WH!AA&;nbP;+92rI+&@K zt-Cp2_tl6#S8n(Y)kMiGF!?<){EMfbmAsdS&z?1S>9ud`yHG(7`hA(yOIPRgU$x}-Rm^W!?i-jP znKfva=qP8XAh}mycYHj4#Q)Ti(J#&gH!Q8Gf#FT%gXE8Pj|eEy?{ZnU(S5kApO0@? zONA}?@Hd@q+zXWiGydd~2C+f}u=v4o=`-Y}V!HxcjqZ#TX!FaXa5q;y3{P*OE0RW#JaT3l3H7lQg?0e(j%CX4_AR=zf6sNT z+0CpDcS@Q*GnC<_-0UBC3arXIQ8W>q6eh!mO3Vqr43W66B;lk|$~eiAbpSzECE?U? zO%Mtzjl^+HeBG_?YJPpgsb(LU%{hTNXFn=^po+_dPZQ3i!He|cxZ6782x6SJlR4`& z0BPkMX>>bp*Yvy@_;q2cWFMHxJApCd5K>AjcGwY&&YnKwl9Wzm9js!T{taLi(;V){ zai$piad`_o_&t4vGq3l>evK9<72y!G@I8KG#I41CXj`KoW{QGOZsykqU>E6DLj5pb(1zZ^(fIfKJ5<2&Qy+a*oNu!Rlixc8^?)%Z<(aqw7;{~y`U zs-`yLQpoO42RlxTJ>EkXR7>?<#`p7Qsm~R^4>nCVf0u%{$-mdEbC|(O+xxA&q&+jN z)x-ZAzNbiVhFmP3Ae=UyQe|{{NUNu0PNqt$S13I&G@ae*#rjjr@+{5hN~v<~3}@lj zG9;Ji+)~i!@B+!rimc!wI=r=2vKnLJJwE^WO^9Q@9+2f$g^!benbYP2Jy+eWsQhEk z!mV0V=M4Ix+_#09YA+e+`SRf2^!Y2`wb$qP@#0xVz5iYC@ds{qBTY`zBI7H4G4^tC zW41+`ax11Diqvikn$GJHM2BN+WAOo}0@JY8$1$nvqsY-cy?ds^-SRs}rg3E5b^tF8 zncWopxs+K6dma1HtYIPySheMu#@1R5I=(y#K@jm^SbgGs8%#*+3Fd~JKh0=D9wr7W z;FWuOnDh|^MQxkSuTpE63e*s%1NY(hKzIsXxcVd5AE1FPlg%TuWW!_%Ec}UN*y?wC zAsGiCKU(%NaNo#|43W&)Y>)wzvu#lXMCshKk7Gt0t;oF!1~LaSS4&4@an*@8(C*J5 zKbS_S1I)%GHD`+JAsM6%0_LuDV%ven!IF#=DhScwd?4AwzuKci-{+v5u8Ui(^XTx~RmF0k*RtH!I_QXSwnL_u`@BwG#_Ag;8{-63LE6 zgr5|KXo_xl{0mv)A2ypD#-N&sr45w^j>jd(40PS?=brSran2tQ$l1l2DT?)ssXClZ zwR&Zd%yPY?$zB6imyJQks*Piq>jhm*#UxvLNM1oMf7Qzc zzo+7+XJNb>^?pw+m{zgk{tzgw=59&>HMk6&z0I!^30C2&oqg{vU@@ZbaR$MC9S*$FqS5tdt&U!eAdCR$`y?q++5^eZiIt&$Wx3)? zaHRl)W=}_SU>I7-I4NSrNNM!!~RpcjR9`-7gr*aV1yVkK^X$YzcC>i^SStzCfZ?TiDtj>x82@y|lWrG-sjtReM3r8J5fdw?8 z*kW_l4Ro~jlK~6jMvn^Pg)#9KR@JCrPN5@~4+`&vpjm0D1h!Xjznb9RB5d#@OlaEO zXODIvlMMW-sniTl*QLJ6_gIV8aqaZBWofnmjY4X@+><(|Y9^r(xK7XjUm^lw_gHtr z5NH1cw{xTxLZjn9hF~J?hU1u`7*A$%AWZ$M#H5)dpfK4h+YQk!lSo0qRaga4NkVME zRsV?P8I|-T*F&RFqPFOX260d)oB*2Tr|D1`O34KueiIF)(FxLLs4lcW*kjj|jFXKC zCmP@os~67!Z5(^yD9+2of-_E&wADhGhpy~wa8%-B=R>h19Th-9l7)otdw~CUr(9&U z7fw}~O;ffTwxU9kpMkpgH^kHI_0b21ip~W*=i~d`3!3_ZX<*x$Yemw)!#E3h4fa;p zzS+^c4B5;hLq}U*p15e6vVqvn;-Nf^&JO?SyyP%Jnk9ziUMlSrjmV<3m=X$PI!h2^ zRdnz(#r|04(B^yAGxdq0)4Qd5tl2_vOG1;SU8b+63EytFn)0lnc2Z;4 z+VZ_uziv`QK%!B@wD8qcIwj)mLmHh;B_qAS-aQ3!c2zZ2VyRG0^t@7HO|3ZJYDQJ; zRJnhY3ON#?C7#M0NWw%y%R?wix$7nRW2j`XR?jpLg$_z3qx`zE#g)Rh$bGC`7E`Wj z`EJ|JoqFm1er)ap=kw7sb~&1%=SE*cC_a#?pk8DKnG{=4(0da1fb`-K4wN9F!(73io-%_sE~E4{AB&OQVh+2nGU%!+=0(HK`9^AjzKz$O;scAt?~8)hW2V46sMx&y1{qv4ssM!?NW+JAu8 ztP6D22`uiGX$!tAu^`^;fJ#MyNKYc*07|k1jMp9G|6)alPdKs$lKX1@vy{pEFD4ZGF!M^&9H0pT_NYh>VRC$rp~D`M&>W|ryM zd?`X1&YW@^8$!=WwEL0B5!CFihpq|&4|#Q7^6HNZ9IF49-Tp>MY49rU6Tj_NFew6# zrlW$nDUnXvz$ASxS8yIpV^$(50#Lz2`tQ~+gEPB86&NfTqt+_I&T*8HI-;l71p$;( zl;GYGTqH5SQ_KKr@f(e-Z8qzu#-&TjQ=oBhLbAp>FvD!Q;hloW-X0WSi_9)Jli0P1 zuCP)p0Q#4%ial*Xm48yyTE2pUwkyFr9I-Ej-jH-PUCZXXXK2iK@%$yJni+%iC-x`l zll&{rwBW+bks_YAEVhh5erhW>pyen_X-Pa|vK4*2gIp^^ z1Xp!?I(gZrr1~WkXRTsw{pCj$GM7|4-b;+0X=Is_LlR`u4#h|e9uo%%MNbL0Irin#-Te32WCoyV} z-%YI;fxz#cl-MTdW@o*P(amrj%oeE$b}PSTHguRvTv-W;3ULurlALGx!Uke1zeS)q zyVuPSDo}TxD#i%*6n`Dm*7dt!_7pCIt^!X;B0xpW+q3Ec{wk1d0P!jisJ+S`TY3y; za3Drw*(<#Xb47GcANY4RhREA5YRv-P)k8yd<)8IIX97c&Wv8AJSKpt&scN4QuNzr* z_y7_}cjXt~(^1Se$|&QH!n4gDVy}30$62+x63yOq!B>8vZI#>>@F4(T@@AzH7}^x&t#$Zcp%A;dT+{gUj4pxJed(qbhJ*VF%{nS z0|yp+A}G?bcScM~KA9DyJb{8a^|YgtI!2k(NnfvXWm$8Fd0AE_#KM8*m$&T;y{6}< zxZ-GSJHpVr`LI4UkoLJjPPxB3y_YMn?=p`*h%yXOvZl%q!-QsfJ* zE^+SeR$yUbckJs1l>dcJr_oe<<RUmRm3Mpm zeBVzs%%7KT+n8YF9q8NGI6PTt|Cb}IYzYjnB4r?52=Lz){QJp7cVG6qCh8S7?|mCPc9cEtO?Ra3 ze;HKH=Dc25v|as929M8~V}q=p=d-J}^F^ZrKt0$$@CSMN_iLZ_GQWzrV%HZ zRf3Xw4;$W-+C5s;kY_RJJ}*wo0PdVMJb4RyIIR83A|(>SWB4Ri0<&3cAH(k?MLc+??H- zz4=*L31XLYQa$l92eO)}s;O;V+qr7#y}!y;)czeto*r|yz*Uad&UVn>cIkT*JGx=; z%$obj!t^2DZYQ{GEtzsCx*o8d&*IVsA69I6mci|0mDmJFAu7QsYi;HvO>PZE-CDX1 zEL2_l^1WXQ)xBZ0;Fx#;Pn!FRP3&?+GO@GU_o}nVS=vdj$1KS0aQeDG4c29yzGVpR zi4%Yg*3GCdNn@cUmjfK+`*lLx|1U9G;KWqB`yVJ=S%)fyq^86a9~z?Uct;UfpN{*_ z_ksyJn~}h6Fq-qCN6#F&ZHI8yA5CsND)b6w79EUPf;3F5L`Rs8nMb6`Bd*M2K|%=? zre=VuE#%L7?MOhR<$MH3b_N8lhX;-n*8HTIvJSQ1@5b@ZQsL?e2vkfUARS{;q$85< z3=Ug1wFuC9aG=8>&=4G_HW8=|r+O<35Vet{$nN6`48~&yX1s=I`c;Wa*r5N2g_vN^ zRXi`W=T;!Fp&Gd2cy(O)Ets5mAV>*5;jIZ$RZ0tN8F;zL!&g_!{tFHp@WQeTGr)4U zuS@b9W}roY2N3~&jVdL{NeKPd6=#?IG_7Pl>K~t313ND07gptdFlI(^JyijOXww1> zs49N4OytF`Dfmt%F=vPgNzHfcSNWmvbUFl-Il0X3=jk6CKh@|^T?`l(Lh#5N(}hdK zm9m0Fk}$hnA(UM=WhHCRV`b3%)Of8EuwWDyqNowHfHz=)9ZIu2MdS=BMy*8MQ(xke zYS3JRaV_hd+!qV3Gt5htYbOLR7`_ehOoZu{kp@1v6wkI><$#z*RHZ-1X>ddRn|R`_RTmM4fY zT&oYacn8WX9GCl4m2(!EbXw-+7kp{pK)%`m z6=%82S|BT}wL+1I!la&BWzQH$9W1#mmQYvJ7Y_gbu%d;;RHv6Srs0#YF^8(289Ifz zJ{YpA_|8FJr*{QTmeQzmsA4I3Rgjjk zBz*_S4F=N(k@0aAmc`EQ{vOl!Hb2}3B3Y_htw7k}P@;m$q8j=dRFEm8#voC0JV37Np_H;4RtjwLo?Ju)xW32?KTxt8No^`w##-xzKA$aI<%uz&qL-B7oT&I^9dj4*pi*00Zo z^m8DxsOdO~BP-L1(Ip;Y&Ue8KQk9K*_N0bWn_zERXJcoeXe~I>E*&NB-U7`yWO9LQj{Abs4t#T4l& zCSA#4AYwAv+-n1B_~#(q0k#j+;P6Y3c3$L3&Q&)KzMD!Ap7tCjO;oE&07Bc2Nq*cZ zWMfV=9i_bkHW)vh265$3nl8RE)#ED1V)@Ya#{v$~KW1gYyAx7WPI#g!uxo`t3bIXE z9PrR}Cg=V!0}U1u1tZ-awg+)7QU!^?q0mAl=R_ASC}!1|7ZzU*>IA$PEdh#P5=^K1 zV-t)l;y{QO*y%|27s!LgD17u^}0=PD)Wa}2jmTFuo)3gg(C>5LnxX}<& zm4N;NI5wyPBBd2)CB1}8AoN>!~;1PI_+`w+te5N*yWNg1?KA#|e%mD8TOILF|Q z|77Mt4-H5T37kcYsHeufVF(j#)tL=Ce%r7X9(1|Nd(x07p>;ipDg9ftYxPA$(4y(O zqB7KMN+tveXn4?=Njh;vkc3s<0?P1!G%`4|eTr%?ORdyD@8K=|X28TV312kuESyUq z$9mOtiAe@W5{0e9#ArroX3bx;#Q^A7kCwa$2Jqi&07Sy>RMEi!Pyoh}@+Rnh3uplX zxL+(59)!r0FqUmv+AKQ~O~OGt8579i@!R{33}}uD7T3z>sf3_`%2lgfYuU3!CUA3h$G` zx(JHF$>5&mDuMe=^GLwmcoABuWrw;FA)a4))+(Mk7fZ7`Mq3otBBVut1RDUNdC(2; z*h30~@|yKM)r53);u8b*}bU++;) zYFm(pXsH5+4^|ofkk+H(FB~fsr(30-A~kvo++V|!6k(Dvf<>G2`vd`vqyLNQe{9Zf zKTyo&Ly!mspr~ZIvf+;Af^gEvwmDw{+hw3c3jl(6HZ4#D`5qNYw<&G$(m z#4RIsH2Z3)LLP+mAhyuVqoI13FA!$sr;*gx_hhc|#g}cN)ECT9S&|Sl46^s7I@@kR zWL~PcLb+r|#$;(4V#RmX#6jy6BA2o`euS=<*6&t1>20wy9r02*ZWDe3B%~EB-UApQ zKxm7~A7mi$-Kms-45jG8E786tYOexM6AkaD}u=VR7H!7%H(#7=uS@ehhheLeY|~8`n;0 z8k3fW;u3x_t!o4S=~444n8z^a(tD)@u#463lK;Tif zAWSjvPLQU1*i2mP)WD#&v0JJM0zui-5-@@V0D-ct0x0Bj$FGOhZyIL;BffZCfsno= zYq!=Y;2`a zHBT=o*w*UM{}x*6K9OF{zu7VB>csnQWho>1;j|j6W8t5)e}_V9CM63^2haMz%Z?;cVl(8)V7~ zF!>|)7ifYFZDN%u+QZS`0a1x)3PP}+go_ipC3iuwG*m-{uN**YY{Qwfl<9?2x{585 zQjXOwkJ?c5nZ~-iufvDC!WLQ*w`d5`aFT;kI^c+-&8JM{AB*5lIE1w9>~>J+0+oOK zVqh5=M1VAaQ8JhI?@|KLi8TH>NAIuwA zbs2&h1J`vDDs)JzwsaxD2X~;CD3*~LOLJn>VUqE_c33zWD`jgpMb0K8A5#+E!h?HF zU;=K93FauQu1C>n5BlmU9o{~1FW&p+$=R>{qrTtb;QnQIe~r~xpMy9lZDKE*|K;XD z7bUkCF+-f2$;AJk-rJ2vq>hBKjo9SipGaFW?+-7C*9zxydWhTjDrUZH3=$qRQ`TW= z;SyVZV`zxmmilFq6d;J(8lZ9n&UUJ6o!>KO@18L+YylyHUs?nJ4|w^C4eDGdHWxP z^Jh&E6o~oxx$?PoI%-Y5t}2)N>1eZ>#q!^{_scG%9 zab4`_J7v7_>G4b?6p$*VkU9*bP+F8ztws}-%IeqCz=q!6?J0y3O(l)kQFd=)R|&w< zheT005+COmlQSWkECLGfvXqWGQp{d+Y5DJlIMq+g5fH)}qH_vXviBQGqt_~C7|1bdsC%jc8J z=hvwxljo!JzW)a}O!Dez*>B)_W(iyf1l4!Qz-~XG`f=99^&#%wzwH!O=5Y9lR}USw zGseEwx4Xw_FJ)Sbt@uwjJ&UoMBL=YZn7sadU1!!=QVvAJzRtlRfAh^&98Lc=|bO^XJdnB*5G(~z3fZk`2J?MyYzb}&QXJ~ z-Y=gHw?A*z@0q^hX4D7KW?;3rYE)y}n~L9O%GE=(9|Hq+&*`4ku*r# zLB((Ya98KMPXBG^*zE1d{CfYFIEtN=r^L32r*9L2jb3bZ(hbw*-G2dW7YFZ&;3j~x z(qvBiSzR`;y3rfKC^(y9H4hb?qs(=nsQrC zd2&r4f@utkqw7wI*#+HPLS;RfJ=2xB^LuA4uuFG13$|Gz%cgC%cvGX{R?4;NaJ^jH zTf7rTA{AtzKX!-K3&97hi%sFRO?t+UlNya zu4-5&QGftUh%ej#7|0zM@S<4&Z)^gAA|pq@i3piu+4?e{=eiSlxaP8*2{Lxc9Gm9N z;3>It4;(r5`cTz!F%gX{CERKRU(#;(7j#0(=7#5~vs4@a zXvvgei92urUb5F!V}ofZTNG5}03%F@jDoqMm+zBc^=tBT{$E^>Sm^a*{s-*p>_6>2 zZtACJdG=cKcoZx>haiS0M48FYr2i-oF;LfQ>9e!rg_yx;3>Sa|2^=3I31*K#6i-(X zgWE|R18r|1fTphordQ}`8Gx;R$!p{6gzj!S1oFjBlIBlRgHdh`*%;&GXHYRKKsp5` zHhQ|EsuAT95yDVuZ1{Q;$hHYD+ES!qG5$7A@a*=n^BwQg-^o1ZjTsZ+>817BrrtC% zbhhCP8qEd_8>v}*X@V7khi5?I&HeV89gDkm>zl6g)txKb(J8E0eHc8ilc3d*@5~a} zq-kGA<1xW#lmjQ~8TLK&U2iNn-DiUSx>vqoC<=&Fp^@kj2Luab^4mp7hfE1_MA1JJ zhs_F{osse4*$K*D$quMh-w#G-`Fc#dEb76^QF8pmirmU=^5?{q|oLK3PaIHyq~ z+jspmjviR+ls0}a7hL`-YuKXR8gi!^aL;-5-@!BP^%Nr$jCXX5z_E-@Cs~-~<*c8m zH2>fc&}&=h`S|81hf)q9pWA@zggia85B@p&_~CwI@O%GP0i<{`Tbj;@JJvA>#C4Haw@^i?8V&xPtW>C*{RIY=<;}qcWt-Y4g(SKCYgp7K*0tx zX2m*qL!E>x(R1^imo&EA<=dI#u1~f!&QH$wMOA?ezcenX zYvVZXENsN+nZwf~o5uH#M~3&KW-Gb7pIoiqTiV3V+6W1X-S?3pUmg!1Em_og*@g*L zrG^|HUuoL(eVsJ@Q(oE8F-Z%9sK&eU%Z967Ih47tXYSYczsDz1e2E{{u>E6GMqO{8 zx2@;)r9Kn)Myu;DIaQpvgkzx$-mMkGg2Lw&V?_f^64(fDcr;Xvn3m`_OuDNzO#jj5 z23OdHDSlw=6Lpo^+Jn2Fy8un=pcG3+;J}mQqoMHB2Hg!zQ&0d zh}3eK?Qe`Yp{bWhSAiG2>Hf~SSB4-Y8e&u^MYOgpMUvoSJ*!TG>FT}n2B<09hTFK# zlH>U{TN17IsHN@}wz;MOqQ%pZ6Tsp-BBa!0uEHr%g8CIkBDb}2KqZ&C=MsGRUY}h0 zuAeFAR>K#1P13B3kP;{j+hH}wO?D#6k~37eF^X7%kI{bKT)6k=YmvTU-JbI8EZrNq z(258dC8(4*Hd;JqeD&SG7TkLL-<+OOb6&G34{b>w8~SA(_@6bQ#N*))B(#@U$^KW3@lf&x6AClnv^K^Pf;R#^=~}7Jl^TEXMS>g)8{moiIn=hH@q5e^6Pz8;=$TClM^sgLv<4I?|=OSKtdUk>OWBdb^in;Uzd;~|djd83EP+bOF7xzjQT%63rheZ1S-WKm zWD`a6-=79cxc?Uf{QD8V%Ro3#fM50vZD*g$hwvNFt8=Uz)k~=6GFg@NR4oAt@RoY= z9|(laD->*7V}Cz=p7c>?vfhZFtt+j~WbERAiSIZnqkmK1nR$3q5os*@H~CP}^#*@1 z^_eJ!0nIM|%J{WHRQaWekDsfLrY?W3dT{Nn<&DlKBVJLLhYy`shwI_}zAJ;@6Q9uY zr_Vc0ULT76-_FBO&(B%ix%E44MvchicG4Og^)OYe6e(4#n4*efGF5?IjK;T{Wkm)u z@+v0vMsYj2kZ~zdcUZ|KJ?oU}2hCi0E{`&uaKyNh{yTQhHvOzRlB_Q5D<-R6d3DE2kH-B3!lF7(62#FncY zH+e&>iRP}En31XFPySz4sotsYQD55*AlRVKUU$zvbR%sHmu*iGGsBpTVECj_lY6rw zI}k@}Vkv`rhr`J$u{%)rX)Nh4l!J2Z4LD?dmxU|B-g53_C6gFMh{LFX!zhn;Z~hL+ z0wxWM1yIW~G%X2HBx)_sa@sBSUO;d? zHt=^+G1W^)wf%lQj(?ZN9)U;{4j?EL#>x2-$u8zNN9&flm9twgaH~jUYIy*ly+8)y zC9SnE<1jG}NY@#cz`%M;z)V=yxNB8IK&6nACFaLFRt`_7A{p0jg>lchd4!B0i%gT{|1xzXwz43k8b~Ne<_?O=usQd zP{3#4_FI2EYdzFkD67kanxZ&tu7R2cv7nYemSc0+(*L42><~XFsO;8q@FR_37kyl2 zhs_`kTM4^`LF*x9uOgQ%GDO!6+bn*vpb7($yFJ)mu1Hg;pTwNLMt8qUbWlX{29Xbt zgn_aoU6$(7wOBFQo5VUC@J!v9d)mI^?;%M47V@h~c`73qC& zBY^tu3r4)?-4?43?GKF2YOJid_5dCB%q`%Rta2vNa4_v{4>#62;I6HM%ab!S0qYVD zfP^fy8}k^=*`HGcfMP{J$+) z^K)t1up#DaLn&?SwRUy2!XbOLYgt%%ZEWR5BoRk6h&7m6Qjt5>Z!`{51KUV3yR_HV zre)WTVSW>_s;jjL%c3NM9go}F`qJPpZ`K?rcAd>4_C$orP!t)0*okZ>b%C%(hH@@+s5Tr^_$c~y21QQfTHF`Z@%DI6tf}mAp_3KV#H}jznnMPB5-MaZ z2PVi0t&^)s%DSX1%?uQ`>62f4~*;`T()ItTCQtj zb64|mC|I(4Iy1zEXE~UnVHLPe35It?^+1j4xI^zCw!)LN4sj9w;1BQCxJ(mr^gu7p z(lHiFBb+s+LOGjd^MN2##@usQsB)F^F&l;Hbf0me7>q`ljix(NJJ#?r_DB0L7`H9{ zUc*eq&OL@>=&sv}85hAu29jGn{1+LwBrk}lvf8=0l;s1o&!yP2^JjE1v`8| zxT~?~{s3L6F#u4!R3OGiM6qra>)`b9(a})ymd!yxsWF?PezX!}t2v+sL5kBq&GZKS z(q;l=AX341Za~0rgZ{eGW4}RpnIO32(Q8t*K5|g!f)(Oe$>kIbdo5jt(FgWuV!#s>@!k~xPEe1Zjq zF5lS;LLv1iqS=_gg~C zNh7vFmikVCa@g+4ZMA;OdW_m9+x=O7XJ036Fj$?t9Z(l=5%L5S2`?y+Q+0a<01GRh*6#{A>gRB1_J zUEgHTdy2#=_gli%B(Cuj*7on&_{8hqZC_6zLv(Dp*n8|OhW=L@SEP2Xo@EIKP+Zzz zc3eoYDhzo3m+t?w7K3g6*IHD)%;bPQNr)2Bcp$|PYL0CAu}dF}iI31y@2serfsn)) zbo))av0!eg!-LdkxlqCV|Vq!bDXssxpem`t)tvBqsCMy{7Fq~ZB_{mdHuzWRGqc{%T| zcW_~cr%1k## z9m`vQ!S9J#o9~}2dFrcwC+?2*8|}4Wl|KG7QGjy_=1{`F6M*M%Wk3@#DtDs*C{Hn- zT)|9y4tx9=cAAfMq0wG|aZ;!=Afpq^OhfK)6d|%o{I>i*jGcpbrCqS*W81cE+qUg= zY}>YN+Z}dnbnK*KC!KW6IsJY2&fK{(v)23p`<(Tjv)|fJ{i^EOc!z}&OxB=8i6O7% zqOr^;6bXLmK!Z@Mq$2zbi6IbSaO1+HsY#3F0d3bz9`1+nO?I|J_W2MWY% zU`bG7#rlVpZYZ61s_SxAcsWCs`oKw*1Aqrnp+?y&i5An6fKIknEcQi;vNq&T=Woxp zvaCfciKZ3U!l`ZE(ufcfu!XRdN+QLG+DPP#6#E#xNQOq=OO_IoFOF=1#EkmI+_D4u z;9UuFRH>;39md6J40?t1b|lQb0g9~@KN^7@%{Hd@Rz+%b%+_g1b_$X7jgAD_gl?g- zCna(;8jJibfg#~Kawp(@eKR$y$jY(6kAOXG64|;0?%xG} zg7LTHWNb8Ex+(KUXqWKK1$&3VMvTv4o*!5M2ZwB}mm}}n6W{jBm>bK*H?(jsh7STi zqs5Es|3XebGJpSa$PBIO|1ab;G^Q*_vU!1bai{pI&yPEW%gJxiaK3i)0@traIpw2` zd;7qzh`A-^N2o08(|<5iS5#ybZ26s;04T%bv;?N#{|7Ps93Q*=zYyX^GDs zM4ylU_ouIW?2E;laa(egr6Ckt{a^0(pAS1J^8cq|G$xB^{=*5Og z_c)Zh<^htLzZ}tFx9wrW<7*(y+*dOF-;Au}C>%JhB&a$#>cIpMDeI^0(ae!dP4UFb zyu{zAO5EWaLd3B3L*XM?&JikenWI`aRZY-}WBsRpk0(^jJ*A{a9U!6_xe9M|f@4wR zwW?T9@xfsm!2yR}EmfZU`OHkRy5vfDoURMRX3WB-PDqhrcA#WBAezqXc~byojSs^v z8_cBEr)icFWB7eqKDL79v!!ITF>;3J0D8OegOl z4A8p=5!=i5fglMIL7B8B%KI5ru#QHVCK;}(1$F-magNP*vkXIFVf+b0X_sK-$R@MppOkk|mUl3(D2G_8}w-i%@Yy)kpF$uvG&>$w9 zxS9cDZp()suAk^+V@D$)45P+ZwrVv-C({2PLbq&hf$Z=UHqIFL-prJ4gX2_f<(MF` zBcg_nky??2GNSm`l*#6yF~_blt#ysZ+x9ztUN>Pi-lR>H5kt8(Ro-WF4}eT=EPP)OWb1Oe~-9mf8QM zaP43Ttp8EC@=L>2$6VA=HYDkKHtqTQ-H1yQAv$<0Zo*EC*vhk4jJ)T_(Aklle+CH{*;B?tU zqMXVkA%vQ^-7w6fehqddn}nE(ATKt=J7p3R39=m`DaAb&$=_D`9kc}Pd=`Htbbsts zJopMeP@$-08zcoY9YJJxEGePnWLic|`-sD+ec6VVb1VyzQxW!pMDon0FFR-+nvT)S>6SA7A2vf^vVhdGL>7khPDH?{>c)zWlTN zvp=2!KE5VoH(C~74i8+;t^7w-fs34PqNT`aiu*8iCe$ofyZ_2#h5}!JJEX|xlnaI8 z$I%VI9j@-j*h$qZIlG&3RjD1|^wp^;eOJqnN)#g2zRHrO%=lIK?H<9}G9b_XX`b)( zH{<$CP5s(UxJ`AT@njKy%u?awN}o3wDol_S3a{pdG;Ja&M3!ba-*loI$=jcJL7p_E zZBxI!@^Ua}oi9%}P?USBJzCUD6yBxuh?H$AF0SECC~%aeQ-P-8(uLrdA_5vpq!_y_1e|q65ZdA}f@T^inSu^F z$2R7z2&Fy|?ZQGVdm~Z7KEgRw4I7CFTaQD^W(>D zM$ICXZ!<7Q13!oj!Ntj?I(8$}gQX4C}3NeBd8=9i|v_K^`2(2oX${E&*m}IT#$|V)KB%U0O zRKg8*o4mP;kyMshQw z{y(Nd$P--1#R_{YM*Rj@jW%9xL<2*~g-cRY^}QpQ;=zz*1k$FWCT)~|pq1vtRS^}H zN4>7Oh4{xR^6f`ff;At~;}PNi$xOfwUe7PS#@*O*+` z2+^$FFv{^JWv;pwy_67SQc&Pb(3kDz1{)iI4HvY$yq_i9eMrndBA3{l5+#Q+nZ*{ zcLNtOaxumxB{<9kfGVywt#q%af6s*nEn>744v%gvux@EFi&WU@Hu3XybIEk@+mER$Of|;$VX?X<1Wm;hiGpD$t|_(`Pg+rXya+0+?5cm#zN2JRbvcKFL0@8Q{U6J zWlLu)$8Zrf{`rp_Ayv_*Q+f8u0kCgr!4p^DLQysGD_jfSzczVnvZ*V7A zy%Q0M&j}1YQKuJ)$Yk?O&HFj5%Ppnvqef^p%&&pD%NM7jNQ;xuf--25gz3X<0}UlI zhRWdM+I1AjKU#rM#~ciJ1~r_yb=X9-VoLflU#f zbz9)XO#Q^wn=?mY?9Ts^=|3W9XfX$1y_hN0R*w>rJX3K(b$_HN;wxhp=1M(i9URQ` z9)<0CI)L%srDzB+Oki;681Y-AKUe7)*JjHby8Lz4S9I|8a1?{r5?r-;%YEK- zx_MbDJWfa6Hd`jmzm3y=1%`VmsfMt66i8a}M{ zhCFro7S8VjI@9b9c@~5#vk<3u7B-flG|^I7p8%!D*Sr4hN^U{SO4y|re`S_t6Uv6z zPQ{vZFv&c$4?<9P^K?n=oKyoPe|c z?-`-smju->@D5HzLMUW4B!)YQ3*4XLKjtuHe1jhT$!eP39}se%R?ucQ zmk>6$iohq}=b$oOx6^CbH&uZjhWmW|vbXcKc;ce?gR~`0Dy#eFhH==Pzb-FLS|t|_ zJuPG{ewj?ACTaSQZH@!XeVwrgSt5GPs}{Zz?*-XTI9rKxz4 zrgh-6;q8ArHNXNgKJfKleuz9P!|*}~pDz5Y))t#^CZvy>IGkzUjyzg{NEbTY8%|q~ z8-x>6!qYuG=q|Z#=atKx7k7?eD!GoNX&Oy!D!OYE&Afg3%j~VPCO(*uB>*R#eiZF6 zYREpT9QY5;K`aoc%_`-&lMlc)WRcF@P8o*HyiLwZA{Hs7c3=aw;EM-zdkD8dTHrym zlH?;~vk44M3LND5i~(|%(pab>)J*)p0L(H1TCsR-@Y0bB;r$g0qdEvg5-@sT6l*1g z1BK>E2D5dmW~2!*EK|Lv-OQL7mOFZDYThFT(Z*iuWg`0^c+ z9M?=AB?_us*QcRZuNhf`b*i`sgD}wc^YdQ{kBRk{!jqP=>9p;l`qBKU`)@55oB{V7 z9|7>vQ-TN0ZoF&V%>wfq$ngmRBXDnpl(?qz?ZOq!T91J}{Cd=$)@0>sH|yDc2=iA$ zrqalsQ2`1S;ES(U|1&*7ZeA!J|APCAy=(|D?5b}kY9rCOuB@G+pwLsuO@kL7&s*s` zl%FGt`mJJagXC(FU*SB2V}DxtF^`GEHozlZ#4Y?sowUu5 zQCY4L1UddbGsA?hIcqCXj^RDhK1v^s&M*7P?rv2RE_8o<{@QCdAUbml7&9oxhJ)7J z_+I4xtw70rfAWn0w3&*)d}o)#+}FJ1g+H*Dcr8g5I$2UwnXJDXKEB@H9=OyZ8x*LD z+Q!6GI~ndv4;83NAo1Q;K-f<0BwS@&ytwM6T*(-!xmf&qdNH@&>pydn`V1*YDX=S6 zp5Kd?=8x}hwqrP@0TT)a+Z&(u^!7kR8qHjppwTnfO;j<^ie!vesD+VSm|-yC5qKbX zqM``E%ijn$&=NK{wZW@AcDMU%SnWXL$~AMLs!(D@>MBVTTzUAc{=h`{If9^<;uu%S zLvuiPNfrPli;(H0T_l-`o7#zg0R^AooD!Uq0c{Vlit+drwsD4)9}kDfUjFXX)BvVGJ{>!d>8J?M<8@*FZpq!9Fd}zXkE)nX`>r^6q!|HVAo=-w6ZDnjuhIfC{&uhYVKGKNof~-uC_oYaQ zhju9va3|)N59QU>$YsuGiahF4T7jhUj$^rL{sD?fRfT+EF)zgpLkLm_A3Gad(L8_9 zgqWvud&`m5YXd2z_H($?Z_e>aN$wXBunOin21sd_o)C&c-nynE2uSH)D0HK-{)W`_ zH*wIn4MiVVTB*`?v2U735~}2wJSdbmzj>XGj7?9!kwyiZ_MDg=ua&N?d7y)3GG&}z zt83wEocObgud_ND5r_N93w;KCMM6h{+zq{_9kans zJAX^?5>!EVDN*{|fK8#_D&g0^#f5o5fF-rFO=`uG*f8a?+q^s6)1FZ7x^kLIaUsB^ zo^xCg6fwL~$?y4eRS^%rcz!;b$dRY)mU579z>gc>rbac}*p#EN9H;RC&kQ2glO?j& z&+nP%Lswcv19QkqbOKA&;u8* zZSrA5&IO2wT|OIcimYj}<5qk)dnfIE-D#z?A}PxLZ&y;CY&vJEBm;^u{V>Kp)#j5P zogBb=u(&;J+{T7AQmXpp_K7^0qs8mi7*r7rR_|J~8j6{XZ_ZiD=p+JYtu5%o;@|d` zhxjc6{RYd*YRQ>GtcPgxX_R_5?l!u8sUor(wMf2QpEMeUBQSz6&YYGA%x&SDX)Hli<0ufJC7veda^)F$ z0?aCE0+E`LM8$}uoPhSVZ6j2aO=(hL@1@`~C}C9qIo>rM+!0NOdqCKJ_8T(|j6I#e zHPkx^r^{{Je#C)Nn|Uvakz2P$RDZaXsI1m`7*lKHao8p~&xWz2BSn2=rw%`_CI4?- zRpZKh!Me-6(MQRL|)Vz9R%huCxoYTF3*I+11KVwICXgM<7f zN%IQ+*g@k8eaf-$Jo~47!>SRsG8sC8{o)T?Onlacdmq0N2W!n&_>OkG9Cx)>@~oe# z2!N)m3hgt^$?Ef7m?QDJRh!r9o-aVzeM&FFMzRX!d^s{c%|FRas;fDC$KS5hz08my z#B00RT%>H*)ND#D7iu&S@}!YwVZ>sJPpE8HuIn_N1(oIlLzTXei=zi^&e3{dp6xOC z0$Os}V|{lXoo+lNL1mm7iYG&21*z7zmW?8XbJMM|c_=46wr28oxnC~^dV038$nr-)`R~U1ejV(IFPnLFH*zwLwtlC?qG2>b4P3 zH1r*bU_Ze3rjk~ZO(Q%R_zbj&<|`o7t^FwlP;NmBFoa7LH7u&%jc8Jx#!ZLjTu^q> z8iQr*c!ia}IbbfEDw!-8h^4i*AtAsZYW?G-B-l9KSPDTwAOAL*tQHRn1xJtzn=ApKNm^1RPq=Y=bW#Elf zHET=pd2A>Ub>;o3r2=Mf;oYNsy~HrBoatxP99%-CFzdL&?f+LaE_D$&lz7n;mRnh{$EhqC z5f&i?;f&v|<7->0C1`SF?}D!32J4p#RmdU!;DGt3RQllgZ>cn^34dQ9Y}yB?R25j| zVxt?rEHOq*)x|i>x`cX$^5jHN|Ig>aTzrfBJ!cO+sL4@W{K9F!Vz1^|TGU8*SOh2l zQ8twn;r$~9Z^o|>1>0x_Ko zZ*>8>wE$>8ifwdbk5wtwzdRi(8wox3#@0~3Kd_xyU^p?7tMu%*;sx-8nn}5Q9l8?J zqiOkzsPD$)TIbykZ}E4GqMlWP!b4Dd{=&nE&xl@!D?8lv_IKLBiHy#Ex$>O^pbp@b zkZs^D7m&?GKSW1h(fBmfB6M!e_LS=YLArC}sN&&_=f+lCc-nI5rtuA%2L0~p#|@B4 ztIOYlU&!?32g@vZ;a)MoZ8St=HQ(L@zNd`*>0o)qOGU<~MvW{_N9F78oAK*0c6&Z; zXlP;o^#j~5e&lIFFqmUXApmhsA!C8L6S|c@0~K~(+np8DjZI~f!xP8eeu|D(X_p*} z3a2N?Ud=&A{w`Td*-(uJDY>Vtfnd^c&`2ZU z(q0*&$68guWSkEXxg%LyG!Nl9c>0gcpnKkXU?`buj#e=ov>jS)_XQfiIWVa7DR6Uw zx{eaQJ#^#*QTa{z5;?Y%2&QTItAUOsUlLu5P#_J4IKwuq+oYJe?odsPw8(*s^f!zJ zztPotJU@58oHx&*^WU&iBC_aXOCxQRk!7V^=#U^Sm+N$Mv=4X!cf%{npuOek0 z50h3A%uqGUJvmPC>QHYxYemM#xG?xlcpcDIZN^NMb7PqMx>R>^(-X)@fh>Y03cS00 za#o2w(3>x`o*R1FXpC;C#IXw^o{MB(%JRaLj^sD&_*$JG-Aq#b>jx-8=e_v+k88DkL=maDuWO9`gun{ba5!x5#3#2l)G`w_P27=2|qCy@7AY1vy>&>WgEzpLwhpDP^-b#J2=sz zK`^;FB!)Di>bfigt6Z4MDxKMRNw_~;*U;>RSvz>zmZez+cD{&44KVI!b&pP0B({_} z3*ep^W6E{O^~=tH{*vmZ@_7lAc}@L{S%3+m3fCrs;hBL~i|~GB@}tV&nszYuLQ;Lm$(ECxBjn_2fKbGI5MKH-M;E6${(?BUK8f465`f;Q{tfE73hlUWz0ei8^S9TN!31N>(M~s8*+(JQW zvQt;EKoi!ugbHnDyy?dK(93%qo2E9V@Fr(n-luB>ypM(9w<=_wnyef@LZAmwMpn#u zw5Ui+5eN3O$Q5VXSLeIuB|v-)E(sKK$ z+Z-0TJPqGCmNP$;CEgxiDZ0)S-ZUBtsC&;FAFs{_ng=EU!N+=6Cac1-25E|$W?3fB z>!i{^^J|k^X1Tc{Bko(JU(7+_3Kc6>rJ$mc&RcrL8!zrk0@&3i!?~o4;`aybjZ0%Q z&!z`b#X`TFSxink66lSNP27mmc{#|@4G?e?H0^{1j}LFtiSDDhfwbR-;*4XYsr42R z>2Y*P-=POq60>{04Bk-oXOOM1)K0ED8q~A&O-z%x(yqL4S!-lHGCz`1idSR9xj&#K{#?~+l=@oA16==}d!dBa26;}JZ5#C?;hYU@~N($qS z2g=&M7#sL*!O{(IB(acCh}ECmv)>EiA(Ty-^;#MQ9ls>S7*59WgAYRt1J#aj~t*i-y&MH@$NVVGsGGE>kh`-sU}4g9;ZxE}+sGGhZ91OMrt zBvlh1)dY#L5!tBUJsUZ3SIq)b>US#{Rgx)4669@AWz(PP{*n$Q4stpS!mF2JQ3XgeYt9E$C`^&)zEPiyk@hxpYh`N``PjD}SJbLj zMTzU^G6FEI05@R3dJ@<-LVmncnX?3c4muvqnT}MX29Y;2f>xQ_e z0$scT)0Q?0;Ct2RqbBxQEWm_*g%H;I9Fi;8)Ju~x2R=YP>d|Cdvc&p|Mv$JX1IqMa z8`j(ao4I9}c@B$UXP^Ze5EVQ2jp(YsS}m?FC|f&a<+vwuPp7fKv0cA!thdWML`+G! zMAhF~za!m9&V-oQ)Wv>}N*#hU!&o^KnO$S}QgO-?jks^?6G=G$<#}rGJ zATHEY*tB?Il+)f&yI<(hJa8S8j7*th3j&E%D7mU68iYIDWLnK|p*oC%YL?ClUCMLf zR#`n2KSCFQszy{-=uEW3q!j_a#4f{(qFn zb%+Ty?*~60t-f{VA;t5fiS{*WL zWoW5c`itRY_ZNmhWny$K!J>NPrd$JzuIolmJJcbk806hG97m*mVbgzzl4MII4OS9@ z7~RfHZcgh{2on=S?NMb}NEC*tcZFr@SnpH8;mC?0Geg@mVaZv_a)Fum9{o7W7$$^J zy0BQ6F9>xN>gFhlqFi&wtg`A=%V{=ojP&JDa5SYvT!hg%S^=X4Ef?!sW4Ia~hC(RW z##NDyZLpnE(oMTk)PdTMmgy&H-Ux(V$tP@klGRe>!$K&8D#42+I*gAvxFpKr}Y1(>cDj!9r7>rmejD>c43`ER9SBCeLZ z#ydsYvZ_8lQ1`aN^-ELrO0OVM_0~QOZcI|ifSMQH8&LITQ9Mzv^#Ed8+)R^`mbPZ2 z?-kv84m2RRi5Q1$5HZ>&2{2>Gk zA3eBp`twvMq{p5R6A3~JCTjyQ?e&fQOlyI1S}7?c*k9Ew)_EHc##+l@KRc*a=ihv`Y_d!pW(P|>)9U?sJ3b( zF%Ly|-&;}$Nps!1|5srV(e-6jE9*fk%sEQ$|CLvR`!tLKm1bKfH%{4}C zby{}v#A^lg6cSsF&O!C%_giwN`k#zdl4yfN_VOacr(d7Qe+gR#&$MU9>@&z z{q0Y&J5d19ZgBsfXct{Muw;zZ(kIbNLf$v=fZ+jkQ+dU-_$6)o#c9?FfKQTbw{Mvbdpkr_Nio1va~T7-A(Nm}DpcKY(=tsp zG}oBpjW4sZKGgGU3vLv-iA!B2Xlok#mi$;kIp>iG$j7taUU{s{zeL1otmZ-|m?4qH z+6|4`bTszb1`S$eKg~$&DOt3$mpQb2Wga9jR=Hb?GEzt3EqWYy8$7Y|wFJU~hlOp6JH{9dg*gS+f#E+PMmpE4D3>U_@4X79df-7 zDABBzOGVCxkEeCZZcdulo+Qb-K{x`TL3G~mdb=_@6K*i|n+tPH0L{JAbqGTHLCMQ* zNyK68$f?iT%d5TX7s>WrdnobGNEZAO78A_|_*L%hoG%0=TWvX8_+1F2Q`)8O7ZyLf zGM`R~2|HfH`7G_YX-c`N`W8vRXp$m$C}SyZhT)ZbG~oC1zi` zgd-SSVid^pTHvfB-P+KS<)ZsGGZDHfZ85(r?%<(UneG7T8!E8q=lCFkMa^u%0R4Qn zJU>Jp&MAh?_p6VO*`}{zn&@4fr6+vh=^_OSBvs#}xd&szopcYnkV>sX0grZBv^ zfn5?IS7(f?vtCF_&B37x-6d~lTbn}(&FaL166e8}Utv#34+SOkNr5!Li zweDbdQl!y*&)=sWokW5XY7Pz-q|5yXJ04*-D{&$dy4y85A2T++q!Gsqk|IQRtj}3; zzDKzPi#uf_^YJ2PIHXz)cR8fyc^oY&GGH^kyMGAmEhc=5?(`c&66X`+G$9N)_H(9x zJ79?Jw(@kIxZgFj*ks)aP_$@?AYAYG{9zyamVmNmz!<97_sk8|nwrAP4c5x3 zodz?hJK`{tLmFX-6b5N}6se6n99JByk~i{L$&F^-TiKYt1Nyb3fQv4qESb~8W{Gk_ z=cYU$qw`Dd*YpF1FdnR!e3qL}e^y=HD$pz*nI#N?jkFy_;h_jJwbbvXwgKSkqlnX{ zaBHs@nY4TU$Vm{+^d3*6t<&VD68EA%fw(?|)!tV|3q9o3=NWkI6#96^0pY%^?`&#O z!>amqH`bu~fl8!M(q>6ye&+t}>bXElW5D9Kyn2v|Y2n*}6%?K%YB=KG25MbwJiW!M z89@it>FutptAK>mQPrGAkzx+|lDk2L)f?OYD&>dYIFsn#Z&0np;}E{r(Ere9&TvX1 zvdzRMmLnaWb<{cH%dDx#@OX*xONVQscN&8SLZJpQI+7nS4N(>gAd?YUQZF;_e}35S z22_>=!%w7M8>MEtuO0Emn!&(#n6^C zozs4Ts=0})Co--7;EJgZcS{80)XQ`v#gc(XWP9GGf-9GZnfT&U#7r4e9xsp+l;1fH zw3?H(u1%A61243JJVo4%J4U?tgo~~$N}x=DL<`Z(XZah^V~TkqO!ZSgc(#tRLdLp% z-KhL_VpWsK6tYd+a|YUC_{8^42P|^4X2qlP{qkbiDl*;e0l|3mUZwx}BO*ul3pkYl zhva=&2D3`!aw8#RVWcpXfhrn)u->QwluEyU<^AD3G}@|Gohi}tr`~<7>oAY4MRtAK5(;OYl)ZuJT)kY4mHRLs?nRq%51!64a z$FcZAH|8bavgLH_Tx@GcTD{WCn3>gnh;RCMBx4wD45dUW-w?L6Jn0<|V7{Wo43-QO z!M4^)u?OG-SHv0bJ&};1pTu*E`jF;vN%K=9GL6Pfn|NUO!1&Z!3n54^`F%blUjmkcvDOG}y=9s%H)tjVL=u)` zjx>Zh9)^Of|JbM5>*wW~y_2ZwiIc5gS22{FpJ(|_)Fk9sG`1#NddPk%V8@y`kwlk? zj+SUr)o6G)AHD(fc~mC>l*NFY%5L811Amt07JHeY}b%phXQ%d>qt z<6GjDfrV*F-k+bnL-$c$+dhJRd}}{wBd`I~N2Bb^g$!i8n!+FAhRQv*l>Ms%F4&Qb zOTFr19Sh77Wo*EC^1hcNSfyqADI{s*+a`)3&;6gv9e?Zy0mBbkIuHflyZC60q)%tbHl^M0EUcJCVGs5Fbg;&ERcW@uJ!P8h0yTy@F6Sy;BRd(+Ll-gAzUZa=wfb* zk>}<5^D7`w&pfjjY$_NGtI!PNb9GL+J7Wc<)a)Hy zW(k#kuTLd**)^A#U=Cv3z4lYle5W}7$9>C}qi){jB4;N@8|maK*b&2cXO6mRA3}@! zz&YpS>RE$iY6EA$F1Mr5i#I>1R;@4nPiqe2lSY+J$qd-l7D>0APPIR5K^?YYeRpmQ z45VY7h$W4A%V1H&d-qEzbp4DCzIA^veudmUe2(my+Y1KhhIuc()#B}6@6*%74)UaQ z(ak~PcGDi@84BC&EdOy`iv49Ee940;>6acgmQPE7d4|&g5sd+VGbR+ODpNZOeJe!) zbOv67p6yHLy8+mJMQ7|elGUS^JdZMHURNA4zYBubbLil}Ef_C`saUv7CJ8!_jUNAE zGDMwCZKwz7b21UJHCt%GeQFP7o!`Jxz4IR(^grT*-L38pmXzxkvQUWxiGIBAqsoo; zD6s>NH{@A>9fo{!#}Mg-DPWGvjc%58q_&Vb$2@?%>aq|RD`n_4G-BTT z;yHW$?(`>0hH#RVF@W=BQ@Lu6kKhb}GmN*iDV^}pi4a^7e;}1IDipmD6^6x!4mURp zpPD;q>qlKRruP*&{g63Z4$+WhPB5{CMKLgHqiov9##uM6fyBB>pC_3iTRgMSV%lhr zYd^M*X+(vNb>IBfn~-a~2XGU%!?p8Ev(9%P`90kZpLQP7P7|4s8V`CESchQ3LF!94 zx7*tBeC2>h$=@!5nWlQ<$F)u-s`jukaA+dCG%XmZM&M%$lVRH{QHmhwq(-8CZvpV4 zRRB`As)XsUg2Ic+jC7?*S%h>nNMc$*auo9jD~W)6@o*Dks)oM>zC<5jXe`l*QI}gf zI6U|@Vg>}L<@<`8cBXLJTn1O!6#Z)HLp&E>Xafm!EAr8aJxMrlog3Mlk2q=YNEtcZ`*Uia&Gupc&eciC zKfU-G7jdv?PvD1p?;x_C*lICOc(Xmj$jxBHm`3DUnpMRd^np{y`h`z4NtRaHAcQR8 zi~A&Y#-KjiBUe!d(sNDd1NWt@aGUF`0=3_GB0>b??&}Eu#2-z!*aS=V$W>>A^jvTF> zj#XR)|L(%IfAmS0HkXMqha_k)y-xC1UV{lG7IxKByHC2ulTEh`&nNyk&Er4sGFyGv zVEO|l)Mcm+rSAG5a!i&2ssjLLElWKx5Q69JaAtZsZBN=4e&202WmYgC)6XerQs8SK zZk($9y)kuUDG}8Q6X6ab_%t}Dl+OZNBv7SIC4)LNH(WE2d23w@x3rZCq^Ob3l5n3X z3o*xmUI4KGx-eCsvCo#?=f8j>)gTS97B8YR2fVxXb@6#90xQ^jO!&;v3nu{jE8|^3 zBbqhlwdFYxdOP-k?YJY3cyER#i@lmz3o*-!d?JiJxu--hqJw(Hl1d3BIa{byg+SH7 ze3VytX-05>TvLlK9(ELT%aC=;HNSSglpA>KZOli-%gwal(iE@6(MgT9%v^H9J$nHP z@+Ozbkm~1+wN1ae%P)UCwd~gYK(X6Cma$+YLt@aFi1U0`oN+!Jg)1Z;tk9qFmwge! zC|D3LQRrLxxn12bLOMsL5_o1q_OCc^3z;b8sM-}(4sESq zI==*|a?sc;J`WXDdT)})GP)DLqm7CB*?mHhClzkqeS5BcpYeC z&1IT#iQr6FDXOOTp$v(kblIe?#dOJ4XLyNhG>?U$)YXKqrB=XiIj;LK8FPS+ zsV<+C7c=IM)OwV6yWIR#y$7x=M%jljRhDIrq21Mp2Frt+l#YmP<7X{`sk+4o`~kVC zzKeTe`?itwu+QMPaqk=m)`zX}^PlN6@I4BK=Z#Mn_jM~SZdOAVJbnPJF%$3A%jVZD zM5wE8*e$gCc0aWstp5qEG|*tbq61apWbBSg^Q?c@Y!qEO@9W^=`4oav`3n;L9YU2E zSb6q)S83b8->v`LNc$XiTCsiSx4>G9jaYf=Duexa*+bxrF=&0W--p2u%q{xT#}DIq%Wx+BuHBED5OA~<5vz7UwL%%B-XT%bI=O^SHA*_&P$;aXczANOd)aQUG(wpv< zsA5{gDv)B0{s#)8Wab7}u4m@Xk7RU-7BpAW^XkZ%U`bWc zyD}Rwqd8Jx^EFwR($&oS`hro#Io+B&0YSREmA$Z`y;UnM%Mb3eugCAn&|!G!duqRA zeogw$^=B?BSL?#*t;1@Hob}O#dgnoig*yAkPpu-dm=gl6Rm{1a_2Hw{2Dok@CD{!M z87TP#fjlfA=gm5M;7|#P4|Rc`le43^RDvwJvx4jw7VlN1_jy;5?43Knfz;4Dv?%8FQOfH^)x9b$CT?QR zPywg!A^wYFd;j8CFqae(_Fyc^)R5>yeWHh%<%gSk1%Pt|+~zP)`k;|&Yg;`#oKR7D zMFEv}#RU*3%v&3D?65y}S=Uz`I;P&*O@W&caM;I2D0syZNeo+mF{hST%R1EZM3{)% z4-;E8f@@Yh=(4gKXe7*0sFbmZ{kOyMOZ8{1{2nXY+nU`8Hs^@M(5BDMTMfLL(jlYp zPT0)8^?{RDNzSK7P0fzu4}0#uzq#xft0uhjbQ~-@F6pqAY#L5Gwf8->n@o}EtUOw(ssVKgF`!#Fv z%}GwoMU0$IJv-h1K3n{=e}w?lWxKg;@?hg#v$b>in}3gBxlSU$FRyOk!LCW}{{5h0 zUcU0|%k4Gwtn2V=qf^%r=ad)TzCFiTm~V{REQ^BYb1}IS=XjfXjQ?r``}Yu%4oTpwB;V`ew|y zce8u`fv{wZ5pk~NZN7prMKORuUF{l0(~I-vy)mG z8$UjEyublF^nSLe@*6pK>7=Y7e_~U{p@9|NGF2n^?Qyj2j-GyJ06xUJ@M1WcYj-+* zIP3~OoZj-lJ-$-19Jz|sQ=O$F)Lr{ zbYl!jbxRfv)a2Br^Jk`a3buhIDrU;<$8O13>$CQ?kQXB(Nof?)q?|f(yotlKET_;M z-XqJiJ{7Tt&r$k9kLKq|Mzc#nvTj1fpE2d&)U%IMfymGJlcy3jCJxtS6=1ISH@m1E zlBT5Wa%ixAWqAdz1>Gmal(G5uJ*#ay-Cm7yk4$0ZT1SgCg4@)jahuaTmc28TdJlU4 zo<(^p=)SSo4d-CO)KyN}Y(&DT27|-C&nsfcB#vn5Q%WhQd}Y_T#IazHBo1y}wZ6`v z*k4HU|AVb}46-cPwuOsbwr$(CZFP0owr#7+wr$(CZQFj;=iK|^eG%W!%vd`j_udg} z4$K@=a|azsOW7OeS9Btbck_v^gl0&jZuzRsenzjIaSl+^*2)qA5qnQc5TWHhdO&UV z%8DJ#zej3omuL8Ah?DXHGM-!4>;*(`%sTIC>?LD0^#d>ZUNfrG-Ja|2?r+B*98Q8% z`t;w}(>y<)9-h|`dHj&0jFgK9kRArg$Yy4lE?E z#@5|?^x2ESDmIi>645&p1XJvWqZz_&R_>;V*%V|p5}&oUL?Fk>KRiX<>mR7;UzFKQ4rY_bxjRZ8ApQp)_EGZ@Ho|D!8tYN2DFm6fb3IZxX zF7W9Zes)l?Je**(tT{xT5^1#5l(_IJ8RZxvf8OF z8za7XX4 zj){cC99rlc@J>3@ijhSfkp>>bj&tOXgrcL0K`y3{_@*rkZ>*$KiQhoatTnpyk)uCk zt!JT;p`UXkzs&^U4z-DAl;&DT-5jYwT-h-CN<{=(Ori3x>P` zC?JtjSs)?%;p;emjb!obU9Df#h&cUfj9s=&Mo4WK>@zfh z8SPTATO^Vb%yO~~HRRUEKDWix5B zbM(=G6pO{p*x&5$&(;}^;H%CaiU1fl!yG7NxbwvB+Ic$KMI!Kr>_gFHsS%ogTlHyy z2{ZO^c(fQ{H1SV&y8ry}F25bW7FSB7a**Ox-F9WubW@j+KQpYueX@Sy{j77WiS_BL z9@Sd*3YodH;FUv*kyC@?Q?0UK-TI>W%=b#+@yWFL^g8bO*hOQ?3NhThYu;Y&uEbtj z0{-Yo*$VOb;(C?tGFV+=UQTAUJ+>7WIKb92hX0TJK!Ie1S=;3jCT)7a{+udJzL<4V z0)BGHlxu(Qy<~!&qg2#?b!Dj&4A%L@x@9{8=@+8@^tJnX6;w4>)5tuo+UZPB{r*Cd zqleK4ijaOmlCQf}e^70Am%TLpju)vuE*+;I(HLQFqVlh0Kwm~jACA`zxH9vJvq5JqQ@G^;DOd!3KjcX6m!d?pcQim|KsCJwVA%o z^B(2r=D!zjHebbM%5MAwu>p$HsaMV%z;hX;b7w3Cm0Tru&UE5C4igo{iM#I|aZnD5 z1?pRw#x0$knuN%pY6A}VZ4S_UJ~)8x zupnOv0#QVX+jsi7sP)|)$ACtvr+#z}&3Rlf$Y_S}h_UCNs6l2h`-8$9mWGa>(V7E( z)Aw?6^C2AaI{@UdkZ1(7leE}~Qltn-v6wbNKoTC%BSCi9OyYj1+8(XYBSe?6r9_4R z(5{%j9OH-OB7V-%+e<8vx!m9_5T_>X@5R51&xDKEkd|&tG5AUu|&=5P1gIgQ5_H1+OmJfP`6rF zwJ4H{af)nGR0xxz|BZ=tf$=NkvhlmM>ZX?4XMQVlxwSvqA1e=P1z}9!2N2^II>Yx8 zGfb`JawedS4sT* zJK663!kdxUq-Scx#k5y6@dzEh9Cjb0!s3qjM*k)QT-)8>x_~&e^5^!rMPgCpVz`Jg+rZ)>+*Y4#+&D z-|lPYchhhY59%vOuk2Vp*^yUd+r`;;ODjgR6fL$4Y^jRKMl%o?VPl^mTTY$v&g)s5 z2j7w9tJ76vBW(Dj1>uQT7P6f}Nzh-bNW;^ zS$=WI>_N4h&d|M&ToU1QHrjr5d;!UPG2N&}1c>@J?$NUZd%IB^Uzaq{u1o;-gCx?9 z!^#?iWHj|9A76HNw&2~!K<8+zll97ORE9opzql}ARZKT)$~3vxBfn^M$^b)Ol`|k# z%5=#Nf&d5RPO?V5zJ4!4fQn|OE`PU@6FvYFW+fwhqH<1zc1y}TKh7RdLK+v&g%K)3PH_9FrKC^4@R!r@?Eml#FT^i~ zuJ3oN=+*0>Oji2|i<3Cg2uQJOw$55)YVt0_~mt-l;=dN?FrAx?v^pNrkxzgL2(d&{K_{z?6FSNpcqzB)E;?yo2o|5)cz z|9qNU2ps%@i?%if7d@(j$09prd9i!ie0psw6Qo1ig>gU z`2y*3t)T@KJPoY!L52oWR}d(M6s%o-u~ge>?{KehkE#OV4?>Xxi1_=KJUoOVhDzn0 zy))L=)iG|n&x#AsexKieR122SboQi6Fe-PKVaDF!x@j_f|6b}z>^EQ2v1fi>tHg5} zo0@Ex%|p01u}JdG_r^y@MKP?t_G&==Wa2Z3kld8&Tq_dU$_3yv02%* zPmnVo>m2PCcuk!7x_H*ODY|nZY>()hig0|c-K$o4?1A@0zE+B}=K?X-?)S9;MU1z)h`I+Q;P8#XzgytkAgTNs^~&bk5gm`$=V`B8|8%^!L1 z&RZDuqzE9W>N`Kq3=r~rblB>};tvI+1Q*QhC<(b*4jqaBj?(u^M$(X!oHWCzo7=@RDW3WJMTuznYw+|MNd+yq^@1bm?ZQttD`6z=q<*pqPSyIn&n8xu$Kkw~A zjPO^J?5U_}g*O20t=B;2IH8j3lxW$?6Z@_Gwqz$ z812S{okv#QpTXb0I?FYN2U_VNaWdP9*x9p_=K3<=HQAx?B##RbG0wVp8*l_59* z1sAz-@MUYNn7;(;J&_A{ti}3Wf_@))0J<p7Aye|3%*W@`p9XSZjk6+grgtz zHsZTDq+Z#WQ^2Pmczv?%8NRL~%ndMSSzuwrsXTU_Zx6CJ=QtaMgpM_~!J>%Fk&jFtYGic|-G3OfO7u8}TkXy^HA3`n^L0)ch6 znO5{Pipa(pC+aDl!`j$hC?9ILb&_74vBn+l7gONSvKX?^uMdZv7?os$jdVm*yB-Sy zfw0Dw>@3F-!Q`8Usmx^SdskQ?S$_F(E(rGVH9_1GfB|OnN(6CAg9}-|?X{rZs6J%9 zjkH@RzOho#Vv^DGXxEAYRW+}vJ(CX2i{jcxTSOhy{3UhB4{J72L+gE~;&Z+JG6}P# zKyOAl-l4Nt4uZ!IZpn`eLortQVd$Rb=RG*w##ViqZX1s5ieAvR+hiNP21|T34rhT` zm;N5E+qz;tXVk&I(-oLklMbeO<1iSDJ+4`81n>h+OcW2$md|rVc<|3?&$sxkuUT%3 z!FHHlY*qPYxUh~`g=|AF#t2`30v`wB4Y~geh#W6Z3=J{k9@2t2F*|Uf3!&&BZ;J2g zg{~iLwS>;Q(lcGf$Jr|h&zo_lCSG%H!Fy0M3rU$kytE4BeSE68(JV9J*g=Ju>$H*t) z_d!-b>QF;3X#YCf{(j5;y@npb+Z1C1C-BS-AqQijl*JQgA?|gcM)$jWu63Lh#2#c2 zye=I#U8<)R=gNrIi3S2dp-@w^5^5$0(~3ZK+Y=IAs50r1|7w&gi(AweoW z{*~3+onQBE1GL>)(p-{ZXk_tb8F&^l?~uUn+NT{6PwjbesUcCfZG*H&=3o^BkC1Kz zsy=Z-sVKlX1*_Lv-^Pt~uOQ|%U#sTH3~#mY8&Tf9 zWV|nm#8vq(pENButkGXV{Bd#$Vx%?4mU*1GxZhz#O zBnrf)&M=#UL*CA6x=gSQIg~zR;jF)AY}G&i019&|MV>2KY8%+xg(*}kgD@7&t2F4% zAIoz!>jUj4E(&Q8d>f(2d6(>iULAJJw*P1!+HmUvoSdtGW7b6GXD7>Zq?}+I!UNG* zeKr2X%I8>mSu)&{1;S(B<=^@4CCr+?@pK_?aLp@R!5ik{4q4dYPCm@D`-?MLn*TlC zG=%5%6PU~1DqM)p6;QW2glz>@9;W5!eXn$MvWJKNC}bZctNl7c$C*uGqNbgdfrPg% z)j*Y9QCEKr^w62nlzJ%kxJ1nSwUA(bBWbnF9`5z3(BpC1Bqg?wz-J zIY^;M7W`1K4>KUZ@dQxZ#SfiscOks3;p7aVfq6cm;j~EqK$LyBC z;P;5tXJ%H&^`pv#{5fSp9QCo~{oCbs)4NA~RGEa$ByyNuWw?xJLZ^W8@mpW`__V-v zAHGMe#j6#l^ zklnJ|Mr`9BjE7_$$#R)+c!IB1b#;En`!+#t>7wI4MmphkZ?8W;m89{-n6O#CAhB~I6T zeDz-!4knUNuc?nmZ35kSS_@*{TYD^+t7#)}UV@Y1p_iW_cNfD;8-wR?O~zV{;Uz@q zXltcPJxd$^fHPqlbd;1t;-$YX)%=rz@l{`g0TWZL9FU-YqdY`3FqWPg4k(jD@i86I zw#@ufLbjRGGMcj;asnQCw@e+=SP7nP6pdBR$5Z}CUp*TwdG{AN-!fEOIc`ITI63y& zt2AiR|3fZ>{q3bfJ84*be^TLa#5v+J*jW08_`$9uz<49;UKr&4c;x+1pGrhtetV+d zBlMzV(xa;6YJ=YV+R zfwb-;992#O!wrSfChDRouaseo3sr7M71fXS>pGuMN5Q0*HVJr!*5Ri;2J;5UW<`0- zcXrF}GbitjpA8QlOB0J{d{0`r#3_>%&o~E7Gm~&GRDyQQ8MhQYK4U zSS@zgucv&0bXJDDAfGn?%p0~5L)m1%PMwr5*2YjztW=p0@F~kz!!r8qu`>6iq4v1; zIWTpr6@|id6KmuF#-@r%TKjvXJu3xE$gSK}{dvzzQgVQz?z6|uy(cUGzf=SB<{#A% zR{3A5AqjFPR9yZNmmKu_dX%PVU0|KOaRCZ|27#KM;@bT0QyqUf#@Yfk*1tVAjNysp z5ge!-E9l>eM$Z4JhFRwSr5c)`3BSmD)*#3L%VBDMTb#;!9URlGwKqNoiE$UlGC?Jp zG3*g2^;S*Kk81t-N%gsmiuWk4@I_XdKc%KKPL`%g^X4z=`n`MnF|3!>nII%Gj2Qqj zX;lZ`jw_Z`5;|)h6+~CL2G7faFXC`5&JPsA&N`cwhzAHEsdM5x!G0|-ATV~a#qf6( zki@toI}vU{5g4e&%p4!*oA%&uRgu7bRBe|q`Ba|(ram5G0IKiP-&8+Y7=mm@jN6JD6(3=C__#@I!u^Dk-KX>Minqw$&|X?5W$~( zyaaH6fd#AqpYL-Yb4O;_Ac~UGi~YmsCsXo+iKEi!DHhO!rA=7^7A+3^5J;^U2Ym7klf^&%mg_D%KGHI~|{1?iXER#NMu}uReJ)5M) z$C}vBo$hx>C%aQ^?Jzj+NykoEyZAE4PIf5f6%H-B@jZm(xkvrSW294ewC!m)!(vN` z<%nZv5u-NkaY}#&`<1@Il1f|>k%iMSh2c^EG1j?9PN?U%CdW<-L^cx=!GVT_aayKL z5m>v^Hd7q~cdS$QOX!8zs^;3-b=8IT1n5!vFZ|K>gu_ViCeUgY3s1~ICy+-ba6h`O zWBy6`I#m1Ts~YewC2UWbU{~W29!0W!T`XubgrGyN7S5uf4uw^K>EQ})!gsU%!U_JR zrSg=(Br6lHcG$MOF1*gR2qcJyvZRHbzC-mF&`ADjTrG2 zGDS8Q^K(Py%1Wlm9>F9Vzp082R7c}3fSq~x`<&=>L`P#PPNcc?s{2wl&iJ(jXY5?! zb*cH(Om3ZB9inA3tIH7@QSf@?aDFa-=L%GSq8c13fXkI!=fHtt9+ha+Cz&`pT0i|pQy9ojxv=HcaWv47hiYjNn5 zP<|`&(p}6&@?J7uAcHAlbC?2{cTvp9ou(n%XQuBADN__vVtu&p5C^(!c{^`i(JLB) zeJlb|xa^j%J_LixIk@!vINE<>>;HbH&&({J8gnS6@zKDWv186`ohN=f42d|n+S4n5 zxMRljN^K^<{rnhOhgyf7Wf$RgObgMWRUu*f8)wId;gdQrUw7E#RFNXCo}q|WV}GIE zOQMbudHo|6peBP7S&E|!4=221mKFd|6pB+^8y^w+wI~%!PtDUBp1c=p{9d#AEVyb< zWe78Yi=Snd8t2LssSha)?^N?KDo_p4->1dgAkBXncwxpI5H&0j|Fnr0_GZH3%i>Bc zzG#m+_{^)WRYotxUd~2k)7cnpNjfeoj*c?pmdIm%rJ9=h>%T8s_(F4)KAIqq@qr*G z3;nG}7=`D?or?K0CxH!9JTxi%TmNjPqm|Ey zBM7aUSd3Ic=@r&zV93;RfQ{`|*IBl)9rRJ= zV1Z?|6$?o%N~61wHOV~tu^6$xl&jH%6h%5em-M2%l_^fdg2vV}5Gh2M70nhwMLYg_}=;?E)g|ls!@5NPq)PCp^uSY$eoK+IHtDH|pEQc+y7s8Q}_V=maKrvN4VB9X?@_naTj*+|i)Ucs2fQB`Cw0bS|2W&5Bi>4^zufc$J`>VV)lK%SCpwwnIEpo_xJ4mKMV5gUmQ>@=GhY-%hEn&s5sE;Fm zR#bX4j3ApkGut6^6CR&v3ns9XF#eCeH{G_~<^-eK$H^T~Ez1O9$R?{mVj& zD|Wr9BFN|#31!ININ9o`bVJ6>PebY9yYBQ=Hm9*nLoM74FilElt5qZ)N1?#_cz$}f4tf;Q``_-Ni?r~8KEF*9 zKFYrnr@p4?e$l3*S%y{vv<~R6HAV|Kos`3lJJwvE7uRnpIQbS_%g#xicmCqwfa1{W z!W38M@yV*gNE|<6MS3Svvh}|Rhq0(R(0)Jb63%O_3X-WWFA(R6`=!MuQv0-6%yc^n z*QDf1C8j&ssS=)oS~ODsbL)q?o-GfdRyM3uh)~_wCQ*3g@y|G21*AIg1(uaALZ?qg zZlqFQU)5f_FB3|J-TVSS=b)KxW=9%(lnbc(#Jz;?qJ!?_fvxo=t(Qq+6%t>P{kbg0 zw1t_MvB5s4s#&o0P<*?q=^vlz`aI$MlL*fRQ)6PugUu0z@uaz^lNfS|{PTti+G$S2 z+RGPQ(zRPz-+_D~{nl+~Pd;?GedAmVr#~I24sp|7pez9R0Q5*fF*#%UL3!`*%nJH; zmbwpck#*lh`~8m#FFWDX>l!dQb|Gu5dVl~hzD>Ux1hp%HCSC8ZWP+>XF?Sd%dyud# za zbUBl2un`O`Xz^@Zb>-)+s`XJ3w8V7fLeVfaG`~8nfimfm-%C72*wZ|XxDXfYan@?k z)|3s^K6n;>&V3ir_7&3e%ZJ?7w+`X^w2}uugRWwgR!i_A^H7756Hu7`MpZg6_ti@2HHH&pnZoe&mvzVJG}lCt-TP#{CpF9dR|j?H zT^+r&73D%_?|2PGchN9`rd&b5c;8KB&@LG`zf zA2^*sk0iUxc)vAGX_ZS50!^pPx3zns?}}4>q3<>y1&kNnHb?|ycj$-C*D#c}*>^P- zzs;ShN8reX8~VB4OUyPl86PRuX#Yes4`sPcgG~!y3h;o+@AFq*vGoApZfMhh zCf;TrEbQf?>>?a{*9|72lykR~tMc|}-Rkd{!ClcTb9-UJyNF#PwO9nDhQff;p_;Ts zZ?@({G3#8DH^3Ji*w@%1O)pDal9bE`*_^XS;5U-Ems$q392SPlz5*lF!J8xMByN!; zUk3WOvJNk<{B5LCDWEo4Kl9fu*o8C}~N^aS{ElKMWMC@mz9&SjgY zBj#b9nJYiM{88{lUVF*MNB@vuAT~Dvq(s7<{1Im?l^pfVLa8=mGMSyZkIj&V!KG7 z{rFSdikw)yQWzb4{?O@p=D7nu?kQcY5tVRX+d)aBjfvvJ<4rMi+P`Uf`u^(IQ9f+L zQ!0q&<2Cg?#-8qAd<$elIx7G9CgMHjabPvMIdLxl88ajaFlWXO&4SG8UL@2 zcAGRd(*POMM;L|=V?|Jg*t4i}+jJD5Rl6sXnn`ikSgTA&nRwQxr1-GIsx$XbMLS7Q zK$$py|C^@0j-@mA;H;+vJ;$C_p`%akT70)I{}q47e686!Oj8hC z9qth%Y#!i|PrS)hde&$%NM6<4G@C#$u-g?_=`0$GgE4movd{UQN+S7_Gj|kKRy$C; zX-mNr+2}+GAq@sr(dW|rOw=3G(*&=pU~=Nl-Qi zn@c5n}=**LXU6{=|V3>R#h7cl1T@QjRx0tVKEPed_pIi)*GC& zo+Pt15h3swVtbSGuA+Rrhhn_Vo&tB+9JRL{qpXTy{_hcHUSSRRo*&-3KyCyG$5Y-n z`pX=7;bfy}sOZ$Sg=!e7WL9UIHxnyc1%#J;wx41)O%@}49k93TRjg7Wf;ZD;UUK?L zZc(*Kbr$@yRI)?M3fb>mPb#j^298?FKE&QK)k`j@5gwgKVe5a?ttH{8jEP?2C^uD;WhL~Vx*d~aa_!rnxWh(N$#ghFN zyqm1d-{%3&Dg`^2(h}cBrgb_-#sH`-?%^S(+)V&VK=(h9=pOcdXWu^_-siXagO691x(wzio0$cI=)^zwFKFeat zIHdfXoN-(5I-YwIUtCLb%X;UX*rS=2A^UpN%4K&>-4$UU{ImkI^ue-?9$(YZOA(>z)kgz>H@NYTloWxVjKZwD>u<~YBD3|QFXO~*?GgX#efGd?=G&nt(c1HAZDzW}k35abrY;X{;6!x_UZ?3%RWKp^5+}qoEBU|&pyTL26 z{dZUW54Ra0TOk zoYqt|Ra)vrpMztT9rth-`P`>;igM@nG}IX2b)2BS5VHRChYZzoFT?!N>9B--_N%I< zrPaD!SGiFT>hwF$Rr#BOD(H7?K~3~;F{N7}gnGl(Ac4A;M77y(F(0}GyNqLg;}D)OMneT-{#h@qlvJmLjpJ=4^NZzby{R+* zrNR8%G!%PzeCRf{Ly=z5Ph3f8%aP*f#PE^FA*`Ok1rFqv{Mvk2F9iBDu8%|65|NWd zH2^Uh;C+-Cs!!9W(&XXSc;uwF54yzWQ)JLW_1?v^2{*1-G47F(S=N1uVQu{C)JTNX z^PQyU&A$pXokB!LGNyrJ)>eQ>AFeU@rLV47>gA+^tsB|80@*(H_&{A*^2sKGfK15Y zApw81vhjcu$3KNzhA!2za7WoB3uuBL zi=?VzSgfe$mO|bkgnxX-_2@_K0dsKBW$~7zr4WYG0sG?_N`V6!EjVZH7&)}SIeMuO z`@KILNp^f+j`=)m2u=Gz<*78umtF?;1X+Th3EPYqWS$MI`GWoI!cVjI_XM1Q@{qs; zIzGiPp+dFX1XQsu0hmy--wR_rS0(@+3$d7Ba^Z=GW&-FvV$F0@ z_R!;43%5Ski9n&EQ*o}8_#jD@oGqL)KfH}|={K~5{?}5%ApIpCT+0w<{Nv`uFAD?% zO&26}g+TGEf*Brq*#sHyIOuRmqr82cfNSHDJEO||y`4edM#lawl!a$@QP{!%guL{v z+E>D>*0E{XiR{LD8Sd6|7d$n6+ut6$Q?VMMnRZD@KaC7!#h#(zXPb9xa8W!o# zMpzT~WBr>Cv%DNc+AN5Pcp2V04P@Q@fxq>7HnJ_0sG#>=Q<2S{QiVO5MgM8>C2lzt z1O8Z&Xdp&DClAP&5D=L(+MuEhx_ZNGxHx#>fjNyu7~Vd}c1w&4v$scj8D%X(H?eKK zm9@C6Nt$++ILuG|XqTBZGyQn*Ep4ULpg=8XNA5Ar5`nI{QunepvGl<399VpjHf$_E zpw(>+6TWvq(zjg=eZ9_(Nt#brP+DdReJyjO6*H`Joj1CyvYIVY5cU5$ma_jrS_ow; zxUcJpE!;jjbv*W4Uq;bJpX|x^pj$sy<@mW{*GxoxB`a3B>arQF+#!YYY2A|3n>Mc# zuWM-Q>f5voW89uAb@iBfqUfMb%>T73z45t>n7z+Mh=Te)s;6Id97Jil|J$4B9hd#D zH?f|-ufmTiM5RZ0R6$TGx~%YeGJo}K>mSgv2`l+y{7>r--{6S=Ai`oWj}MOxd(%r= z@&v3WocPNawl(<=YAv4YYgL`}T2UqU-}XQ5Bj()oWh`m8TDn`=sL~cUL!Il#4$T^V zA`10#C2j}bWh;$@RuTZoNU7}lY5?}FaiOB(FVs)q?t|9hUh)glxi;PLf|&>ZZLFR; zhKj~36eVXUg2L%e^w&Cmi>tb(txNdK@*-&Aedn8q|aI7-Ti@A zgph}>hkQZdh?oDtR|rz~4Y!KM_!j3Xh8_#fo#BHApEf!xG1{9Xgy0WlS=vT^QW$fv zbU>YLQa?&P{H&qrAIUApB1MXAa}}=h5pioMNtaHmQ(ZK;?6T^T>Y!J z-QII?|0&NR&Ur_#?6zp<3(k{?e=VB)u1`atnXA)g0U&{?>0GtoIXXc)*Hv7D@~=KsN3er02@W3@J82oT8h>r2s50T72-%tuI|sV=H1 zO@n>(np|K(5Rmo3gVL?wS_Qx0kd4V8=VOWkB<$fh?`t?6sEDMI^XP@?tYKT#cnnkh zIio#pK2CE&vd#x4>r0MRD{%sF&5JQ4FEhM2*?7fHfm>LP(Vk6?f<<?$(&MZmYW8CDT`Gv#9Vfi%{7hNE5fU(d)qzOhOXi5ZrxS(5F|ZyvHmZv zs(Usz)uy~<6l>cd&g>Vu++(cIG2L=3 z%IF5@MTL3r*f;rPg*s=xl)&9m)W%1b$UzRdF&V=5lq!VCOOEa61sSaE%?U15W({bS z<$qj*9h3#^OOEmu3`iYY^6%RW^+F|gNOONn?T)FkO>BY%7ocV6#Q@#81tFD&>9c}_ zzdd~_xqUmJKLrWTiKwYBwhkXa@Od7puJ7PACK~IEiCJ? z`k5obS?)X;FH~c}iK6sMR&qekSCQ`K9WQxSNW0M9Rl~?3()?IG7@qgC04_S~geeD; z$h4F)mDj6g;E5-fN8`tg${`nQk zv@ZZL1nobTX`A|r@>6`toFJorZ`j3MpG{i<`mGrePzYohaju;j%g${ z1lx^DzoS%1NBwvZ*897o_2@Y?*NvQ(XO#)Ip}|6KW6Ft@bh0C=C3Q+)ynGM0&v0WS z9ptl0XCwQBt#9Pz*u!x`)Wgb3t~8g8&NpV4D%fLh=97HJP~-JW$<}t{fjB8+#NL)e zc52b%sGO{n!;|OXEP;*AR46H^gKES(Q`G~-F?y4Cb{a(qt(72$`|c{dQ;ss4H*Ss- zS9bLByj4y%X2V9-e*_dx-sFIbet|z4v&F7MjtwWqm+`s1Tb&t9CAyyb6IA}>vfXD- zcY1C(LlsRZFR4~7AOQ}hwz|*YD~V&jN+(i@6^V3Ed&4JKkd2|3k5v8`mhOo;{2_0vinZPpL4mjrpCmwmUd%zu!cAZEUVl|JIeE!lP5oF94jDo@)e$JGZ< zkM`Z$&I$R-FR~je#Y?N8+DCqXUx;1bQL-_%MjaMV*I>VREicHEJKk)VtN%=&Q~BX> zrV2t+TXHZQN4iu8-h*ZIKhNjb(~VWk^z^baH8x@!np#wPg{R94Rl&@p=L)5i>Hwnf zZ&RM+2LFLdIgSn?A6F*T?ea+p!L+y1-MYKw9D?8wKVBTMhX*PVMn zI(x4o5X064r^8y|m1}dk&1UIrVzWN~B=K%E)rHjgpO*zp>zC4qAm9`5uhUT~vn4Rm zQcU~k9|DH;+KVoN?yN9^OxC80d?2%wW+s5p`aQk1{M{5~VDU{gl&RzF=VCHwL(zin zyCKyWag5kLlswu_BhofjfKum@giSQ# zUfnnRnk<9A0vbiKI2wqMGx!_w{ft>d?@RGK|g#<#tomgbV)%I9=W zss{cujb3)MbU3XFX;2nHB{&+yih%mlaUTRCijBw;%AMV;55c%8EaE_{DH@nFe#lIsn46t?>x)|Q6e-2}I$DaNb_mV0w?Kh{q42u6A!t_!ZM5OQCrLupvr)i3;-%j!RWfi#N}4Acs%kN&-2$H(>E`IVvpVI4lAUgQLwatqI7{i+K< zwZpBji7tX1_ZG3mo+sLF$ZS&FmO0g?rF1C9Fd0Ms{L*N^wbN2h3Fi^fRFIhdM_Njx zh2?az(!qU61$BPw^G3>^9BFq0bh{gtto5tNdww;R21PpwZ1P>(Cuu|1{uSx_hKoFxD6sI3(B%0&<*yBg?t>bTSm~KA%*3` zZQe9zQ`Ml6Y%MlCI7P&IM#5@Zj);xthQBe#GXsFJF~{A{E>C4vE;&F{SZP&tx&pje zI^J!vZIbtfkt-hA^ny_cvu1zqumd{PG84d%hA?&;7n_L?=1g_&dEXxxGR;9@b`Ph< zt6=S|v|;kp88htvlq0BQ3Sp-;h-d|A$vrvd=oZLmm|irZoi zKDy`u6lUef!y?;rTSqgw5lf(}?@Y{D_%YSjnp!3{Ry++M?o1ej?{4^hzK8;uxR0hL zoUE81>e`xR{HTzbpXDta&cvjs8~=x`w~UHpX|_OdcN?6>-QC^Y-CYNFcXxMp26uOd z0S33h9R?r#^*Q(Z?z-=-_p4WRudd3DetJ% z`mJ@cf;%|(t3whCT{Y7kQp6D=2H2wgiwcuF3sMcI4o zKvu=^Om8G$OJZ?lSIY4Ro0ke9T(J_|WKe_*uvqF855rn0M9xMLeo#a_b$Cf$0?`kj zg4YAeME3ibk0f?**)%}CKaHbyg%`X1ui607uEj+jY{-DF5|7C*Gr=EIYwp{MDhjb_ zeG!z~S%3RPZScw3agnMGwy+bOP@IRDAn11dD}GF$G+0Xx-@>o&Jp~^$oWk%nE+7PW z89&I4z$mNw?BZkll}HdJV7awr5@OB$UbM^CD&nf^Z$h=}Q_iXH^gd{CgvhYC$4(Ji zckRYq>j~hvY1+Ns;Lx*pfF47$S~y3>k;ka}oB-vH$rN8q!2q`l*KKvq)VBd zV5V?r;^@MfZyF?5&=@1kc8E%15XNL-XD~{MGMy_z7ov!2!llDcO2BSjl!fQj70{K{ zA=Ny@9>fUyPov^$1iVE!4O~c!++(?`YN_NT0mceTe&&?*J0>MhtK#)cC@d!Apm#!$ zRlcnWTN7XyQHkzpZ>S)>{k}*;g7yIJuhR}CZM#K}S54KB65#@CTUZNf;_t0L-1Hc^UEL+~5pkSjz&c&)$3WQpy(tg5n2>VKWp>b`5SA2OL@uzqOW?+FCIT!Wbc$S5`NFG5|3tDoTZgRRWetA zRa_{{Ne+!kO+tl;sNCfMn6uQULa=0G{iNoOJXA@<=TI5v=f*tCM!B_CQ!cIH+x-sE zXB~KUU?X{#l+Ik7Y3miI9R{yAoFv!EmG|Dd-kEdB#(zyXBb5qOb`3lZ7QzH9c zZ~GI>`V?$mC+$2hcwYL;J^!RYcH-6#59sKApcuZn2-6N|p5+2K?e+XhQ1)qg<{mmcbbpNyY!?WNR4mrYtXeEYai~P~& z55WKz(ZL*cb;~lkIJDTu0`savoEU2cw#UAwFKi2zh4-_;-iMQl+rQ(@#gF$$5v^rY z%}UTMpXp!&DwuRvKYWVmEtD^*x(W9zr!H_-{7U@7SnqTO)ypxz_Q0+llLI<%vJvb4 zYB$Yo<*0_Y>#rX;?l-YNC*#WSsqcgJ&!BlU^!EdonQ6C+A@m3gg$??p@V(%)sC5{o z<}Vl$6q-t=p!i(2``pvl-<0|K*B32+H#_U^!P?YhEahmOyMb+`t-WYzkNf8;KvWoE zUg~?N0%nukt$Ad-KoY-jgYS>ex!Po8VCHl^3(}+aeCZGScVKD0lRQxL<-!f>-*yX0 zl@Q#%UEXiq8{S+ET%J>{o@fx$!OBk-JHq%PZ)LmKVyMsoOtn3>;J6!NJnzCaI@^eu zd)kbkTD*frxRuzl!F3C%8Z`3l_~3G1rnu2>Gj(TzSa}cRCW7=wQaE#QP>PgiY`@F$ zo6cPxzRZ2*%mm46W2nZ;<`OiJHkj^MkEuu!pVR1KG>{$+FbqxNIg=I1Ug7ZKg@Yc^ z&IZXx#){O+Y+%En!?3Orfys!@c4hZ~4u#^cZ95(th!qZCW1?oxU1n2kyFUp^gj9Tb zcIvz&xbFRSY|8wQ(&Q18vuxgbcgm)R)?;9DhfmKr(8NN=nr_0O{jK?Xb-8Iy2u?TP zJK)a+^QfZ(h_lbP+rxz^VtO^~^Z0=U+#31|w)*n8?8k%IrO=aSo!&&*@&pul975o=%+s2X^XGz7k%Pn0qdlTG6n#0r z9<&q20oSF>90dI_Ky2?6F2W53Qb!J03zCgWh1iPOa+!E1ZL|eJy>PT8f~GWb1K&CN_X>q9!nbDZ&Od!@? z3RVzlQB+w2Q?ZNQPG>4=2W*7}NPA_)>0s);7b^U|=gI<{?9H(Wk^CABaj73!z4gcSvf zvVL402rGFeDESa2IT&P;FvqnGI^cJ)T$HDm;{njd#k}3RUo`#1mJ`)(cY}vEbl5&B zdhmmH)(iy0!tj_aQi8^o{!n2y@F#)I{N=oz{~xejyo>b4(97+x1^qqe*N5xtTl?qb zbB=hxaRa~ea^iJ-XZFK3;PvVH08y+kK|_!w9Cdb|iPi#&{9i30bkA9O{m^ z!6qA9yWAsbey{us$j|4YdN+w$n|KPsH4=ihYs%F_>x!uIc)@h+6EryCkA#TF501G~ zasU`o=?IL0tU;`rx523-nV7C3zh~V4FQgYnp(L0B*4Zj^vY?#zc>&USmcHC)P`M zL<81eXI?F?TwYt-P;DKEAIBgyAFr4kHet&H`3Kfhc?H6WY1+UeP`O0@K88t=HFqqO z8QKOh1~WdU1tqP?I%eu!$1y(NdpG9rhM2RO=#Vcb7`(73`0@*9gcp zf9d?9&0DBR{^!_+Fes-avl&pTdjQEvWZcCfZ4hz%CpUf_LJF0fxU?_xqSQRX;5^&S3# zi_cd&0CX-pDn0Ix1;(0|kP^CKzEvq({R;abS=D`I#YOn5uz&dJ^=3qZ_5CPpffd(9 zXC$RBv77S;cvF@tBJY3eb`}Ns%YL3V%L!S@~w~rpJ$Qjz46mO>OEDPeQNizYJ ze4h{x@8&|gEVxJ|&CZ4Uko7bmj}gU9-U{9pEU-jTJED$y$*VgYQ7qyN-5;drhK((a z?`k~a!;$A9_4S*xnkyw253-VnQY|R{uq0kA)jX)UoRmtq-X$!-BW3Wks2_XoUcWdX zAa_pEfm;6iYbU4Ta{@!((>E`UC_1qp)1*ljso3P^`Q#OfeeZthN0O)X3#W9y2t!fkVN>0yQ}l3VM?46u%Vr{Vn=-ibbwey)Vx=nBgD3Adi{L z8H`O!acb(G2%{1uc$=QrPq-~Js9d!+s+-|Pr@Pfh(Yy_6X3I~dcwU)V%tcWnt-uLV zmp9}ck{M()wP6ZFz^HlJ{v68hhQdvnh82EaWQb|YEhdGb;*3linT4E#nA5u&Bo($} zh9JI)WhEAuL{;2zEN{pJ49ZLXK22uj_3CT>qEK};3V|T~r40mi4W?nJWu;L#w;iO= zAeS)IJkgGKmO|9v=-PGCl}q_)j(|+}mtaYJc(2m6f?M@wkPf z({UjUW3%Mq!j>5HdTk{wY>iHZLBc5! zKx!9(QZ7{Nyu(ZZTrF`*vwb@5?JTj03az?E883DspFLiEYc62NE-bTJ!VBQR7L8fX zghuly32g#75-U+Od~O7p8cWfLHsWM*p{&^hmPj2m)1O!kii<*n3mK;b+D-vBIQv$#x2 zyiCdb?8xA)a2i^w)|NVD@7Y{p;p~K7-29p>ZP1nF-AgcXOVfQf4SCHf;pq-Dy}1_RjucsjjjWc2lI2r6fSJ zhXiVb?5EgNvO0e~!LYzUYX|1hTu;5QYoRI|+_!2`JZLwS{2+w|DsLr%+CZ5FGL6Lj zl~61w&3uvLS3`Ct@L;i$OxWZ-jA-5%6ZlN(K?E!0d@E$W^k^pUJ*N-9z|gFRoAKc| zKdKrG{oei=i8&_k;lT{!zDg2;gVO2o`q`YF*M^h&w}qp=Cg`qxyY{QDN?FmeNIgQx zsv*kU0=i-hw@nVy&E-2$#XtS`dA^QtmW{TM7+AZ?3MRCT(%p*sh3~O!nRz!?;HT#g znZlXY$RjbZ4SDk*LOdV+Bgc)xYpqkL8^vhKYu z18|Pz(^t>1GR21EINYBFtgl9y)g@~CcMfLvB~9pLL%ew}k&`nmp;PwXwJRV$U+xIueY*^CqD0 zY3s2Dev{Gdt+l0M`&cw0dla|k>K>h1+u<#0E2*wT#wciM=g^xnNefLiuegFf;O;g~ z?p3_tdZ$d)05ezSSKHF&63y^rVQr3Zi4eTb40~Li@q`Vc!gW)gUg*H&vZM3*AEV95 zsA>gX|B z!zwRraGE8;y^{sIzK(nf&9XU{EyK^p_mb@Rf?(`H`+C~ZS7W}*`RI&?T(5)_L;E|!>$qoyJtCf)2}sK+wP=BdCRB~0k&N;`OSo5o z@S0qk|3e5}DXvO;1oUCg0b_*g?LYllDe{}wkeAG;rRXr^Yr5X06b+m>af(RQHb?83 zLv?KvM@peeMNF#3X;o_!D2rC}zXjgZ9MUQ%e@?)w8<+Q$=5z$*rw%PnYkYS@X@si{ zUfW1+4X)VLcEUB`w-81`vE?^GEEOwVWIzP0NJOeXT88AOfbtytGBtXx=2nL(qe_6E z1`kx#rB4M9!%xULkVC^Mt+V5g;B-7*N0J~d#dawN&0UAJ?0Uo<$TD!IU{wp_alW8i z9Y|`ZjBS*m?PK6F14#WIg8e%M+=08h-XEP~Iu2+W5gT0={imCn4?akIr9>ND2Y7=i zD^L<}>g2(lSm1O{nG*m`EJLmBx5xp{%~r)l>?2N7zfHQG{g8X%6im{o$08X46_WNxt+ ze?W9V6!W!c!lX)RvXIcTGRuT(O_KLNE{AP?M zPxy2Y5ShSzx=P+`jr;2nOt-NWPMkKSY2-;V>Kp$;@B6P%fZyeWA@f7#Rpunp0a<%4 zKK$TY6W$g3<1mTmb<2YV)f7B>c`VwnwQ)3}Tn8$8ykv|Q0lWZ}&~ceI6MWo2sz>Yj zpC-DFW1gsC5;cQtNc1_=ID1Xf)9EIo3`!^E;ZWpQ==EYmqD6SdjXz1MC{zfIKT`Xl z5T3P$>)1Ab{}V18(bs>(p~j5{4b4IM5hf6pa1sFDOO_j;@TEo9;}9WB^=3&sWnDB&Ui7M2QhRx{y{1`rGnhYxw*v zq~-#dT?ulMWnPA80vPK4QKHW)m4KB(DHK&5{P!v)rcG_mN8fw@S8(=;w=-^4NIf(ed<-E&?i>S} zQ`-EJXeTom>h)&WN*U3^@q&lEz2#$6ljwAUeZ<@895vs=kn!VK2H+&EpZX|qmB(VP8s=&e&*xu$IfMX ztj^@(2B%yq>5jo?J0F|D+^qdGDR~A{A@oBJ5*N zC5Uw36t19+2a$}L)458;< z|AhxOU~3k!)I}Geb`OJ^y9{L|o)kk>{EQWAjIK2bOR@^IM>$s;tU^SRVrfhuv?a@` zoQeNcW(21t&4+CyX*BLDR%H#`>HrDpei=?cJQ-SXI3a2W76N}LMU}!rLTghKg80ur z@sSl-l(X-{0|1;1wsQt6Grc!IoEC{k*I z#w&W@*Cywq>7uQgVP_0|oMYGH%1P2+W|_^RRc}(q0tOlsV&PDTSp9bhp3>DnL?Tqh z$rMBc!Z0KvgvhK?U3>gfT7`~M%D`%Grc~g1%ecwHN>cO6Vb~JH=QhX`h1E#a04g)q zN*)y!Ap{egbr84KHe{tfp!T*} zLx<~e?1z{Rv0lngMm(Z!r<~@?2FU5jkEgPtpa=2<;-V`bBCa6IpajbS%R-n|6jw#j zvN%lZ>!~<}aBL~7#aTwUv_<4r6#l^!ilxlX{uWOU9gaBP!c#s!JU#lt=oPISB>1Qx z%mR-eM=7sub_T8b+Wj(+fa)M{sVoV}pwekaA+_}{|3ff70tv=6co{?sVGP!jpDWQp zqLcK)KOB8x8lS{sLgh;A`2`maS_tKJKbmiS36X!T_BGcZ^=}0qjC>*Y$5OmxU8P&G zWieW`OVi#+&pO%L-CTSB#WBSt2`z4T7BpP)CHVgUD#zY4_mfEJH|R}nlSO>oT~73T zm|UQ))awCt4Hz?Ctg*QY`_|txe13iK829>ky^73xH*qQRT_ofCl3OzZWylHEx_l$o zaq4(=VKJl@v8iKM0#47?s5f^kjAtj00fYEtTgG&qAA$OgS7-YTjd!Pc{TY5w?!Yf> zo2@|C*=baZj#RW)=Qy_M7f){dz>J!MBbEBrtE2QJdEZCp^QYI$JxA~h;BJ#=#pg}LWa?ywutF*kBiE?iQ(NzX_0HAbhJIcf5n)?D0Vdm%hv z^TFizF2g{-GU#Vre1L3F^VRO1(>71FFK*FiIW14esV_c0iyAr(7CyeI8jSGvC$ppD zx69wy2uc@RTuBU#8}5!T1OHrryCX-}OLulS%5@vm$ys*g>g-z@nDA zfl2)zDd-IbrRgcM&xYT5JAFOd<7o<9J94UfJMh~Kcsj1YNSjJC^abhh%*Pd7*R|;p zeBDMuqw>D%6?8^6%K1C_KXlr&7rQ>sj2<&qjq4H05NTaAQ!4JJM-qN9&narBbG}^V z`9z(V1{n4O{Dj-r$-KVdA8knc5PEW=D#y1rDVI&KhT=VLf$j#*#CPrR@#~W36KpJW ztpP&7G|I4@{S6ROz)17ct@yGL^sOSOz7Afk`L@=wm-M=Q z4K3dP`f>Rv5Vk^0y?=2exK0*7BR#F>*NlH=u-|lVCTdxkpkh5IndSvzl}Q%pCXNJ+ z&TBVKBSeJ;kI-7vvX>qaObO+9z-(R~Us{yAHa}vq7Og}a#TYt#wq{Aby-_gs{o=Sv zb2j9pJ{z1x$Nzqex;C43c2`BhY0n{JjLI(xVT^ISq~BdnO($&*kwW#dcJ?b$Mu>PZ zwH;3;ylAStyD`5e&&6iwmsIph|BI}IHWprRwF;K&oi5D+ah~rKcf{nAPTu?WG`aFo z9pgxH<~dg0I^)v;Ue?1O!R_7}E@JXIt5GsU@lvI(5!=~GWz?`Wns#oY+^r)XZq%S; z<>|>Q1Li2cotGw8=ksBox9eHZn&DBLx_pcvbG_2dPSxxuTe$8N9zT`ic%;@&i%e%SY2g?==%|0ALIVUli)G5 zRe7QN_~f9nFf4v@u%}g7sWPgDC1yJFhxTgrifzjA`JD6D>)3-@ZlBNdjs^k>+Hs1V z^#MZ&fZTApdpqI2G8S|jN9fxBouOCTS*GJ8)G(#u_$qzO!P%W7d-mJv(qXk7LskE$ z=IehWja@FLtiHH6bjk8{!-Bj1rVQ^nvan4OU0RS27tht6>rV>ql1fRCh1x$KDQ^gjc z=%pR$BKqx^9loam%dK?z9?HnyMbwA<(t-hcD1$Gn%MXvko@)h|jAz{Ugp~aohy7O8 z!kCL)<@4I!LqoNUMN}kVYeu}5euiz`G!8FiDEZdp?!OZ>e{TF6aco^EzNG5h`0amj z>Ny;1F17i9I>a8hcIv=xrH6D<{9e(YTa9z{k2vPpfrm3QB_2*q?FJDK3D2na?a*Y{ zctc`yz4Nua^Xf18d2$Mo|0dhHOuG?iB@=fRRbxUVwnnwz$Y$>D@!CUOL40Xi{0U~P z`6wTRl1rn%SOq@hP>zlCQZ0!0u!Yjj`a=N9x<0PPYaq^8*|>gD+|liu(3)c0Kbc23 z;Dokm_Gl0m5Eff!u$j8NR%XUF*qM!aCR~Tz(%eQ8hMCG@YcR$&bf*!@muC`IMXqVv-1r*3J3$9@Jr{K_Ncz{88T`b06@a};@f0JA} zO2!Ac1oN>#Y&>cW5-<=}0~Xe3Db$j#^XV zS?b@@0jdzr|D!@Q63L7^(=3n;3BQS0cGb4GhduZu8VoL?Yy2m$@RbpQConRmMazwx?;3hbK+Ad{C=mM}Rdw zEy3y)B<_Gg0RZ#E)$d+<^^Bi@O#$*3ek5)z;*w5vywd%f#CB(;s*#v$x-0}y02sOA6XEwE!UMyj+f$q3Dy7qR$c9GZ;mU4q6BALq* zNFqdp*$IP?)d!J{9~dY}x(O)3bxN@T$D@o0FqSQoNRpxp~QZp!#J0bRZ6 zU!B7qH$p|XNaVj%IH$WGq6&ZhjUx;FF@%c^wpXHE&YT>I+bucdIlH-I0V)IV{R>Sd z))9+f3{uJph6Y0<081pI9L?;V7NixAA<#otAR6bLJ&P8x)SdSj@Zflpcl~jD_eA`h zrr+%he}ve@tSYLe)Fp;QmN2F1GgJT(265X_bLNg+iAjbGksJ|01?yTEoao+~3Qv|0 zl1TQ$3K1q~e}O8LDVc7ur6!J;NeO)PAWbSlIa3P;9FT{eD0KTr`W7%{Bsw+Z)}Jq& z&|IKd=2?h^kr2odjZGgF4IV8Cymg#uW}24r>!feBo|nG=B)AnKY&!ET!-jxFtUX=| zgLAT%X=yepfJnIoLfk2b zSn>D{BAhra5?tG?+FXpCUXJJWD(2s!37dy0yj0!hiHL-T0`$=8pv6k3G~b4bi{KDc zzBOB1&-}fsKomP6BKSrlPmHvf9uVA+x)wS2G#Aq1h7xTMdC~h#sBo4|Hk>aSdl|)d zKbH!v1qWGNVW=1&1QqBiAyh3Y1(>!o)Pq>uyS)>g%QC;_hAxK2`opFt0G;Rys>p(H zeuWQ(xtSuRplnpc|6w=(dy4&t;ii3AFjhWxc?Mu+H+zCjzFnw(t~Q-C{I4LMn(?n7o?G#cAWqhCRidD|=H$R4 zwE;{*efc*D)kOysQb*UVt2W<6z2!Z2`(tIv?2(TR8prJM{RVg27!`-KmA)|v3o7M5 ze#FLQqT|{zpo`ESXEr6s^&eOAta@h9kw?*b!tCf{U&W6Tm$_eAV{R7b{&?LypT}L6 zb7Ot!-^cn=x~qKZ;2J#h0lBqJyRp1kC%={{E4<$%?~@q*mJExhTS}VT_6^0IGPLfs zS@`BjvaZw{_{%T7xYUv4J=w!^hQNjbq9e~Od{&B)i8z?8s)5*n*zSlXvkn)kMbTxQCh78UuE%0d5>kBM*$EWm_4Zt$PycMWRQ?jia3*#^hSXm3z z4%O1)Tr|bD9qWV-g8}pc7w)L6`S4uXLHg)Q+-}dY*lV8#9Kq?cuZa22i`NPJ>?j6O z3p>oJh}X`g?OGR81K+0R4Aa_so>p~#!BHGkj=TwZjsgu98cam^(8xCZUpo|%Pk2ep zQj&>@xiBu%05hJ+! z90^9%&lU*xKo0_Z;h*Bj+Nxo}R?F$ZphDH)WKxj}fb42`+M=J?7_;a3^NzFY3EevL z=T4-7*%>f2G_GTcag-wfmUxjkc!{UNwbZ`N48Uuo6XDUpN8a~u4Fp&A-$sj`(xzF9 zcKZ9@-jA0A&pUDei)^qM)@3kDMY^&=L3ZeA1EJ!G5J7hfbjwDQOla3>Oh)%B+cTiB zsmRFWVs)O8p&{9GkYB4&t^NMLJ3!c(4{mrq1IOFLw;T(@kmHJnHk zy6~_KXV+^c{wl`f*`)7ikkYYul=P_N|FAq_k%f!Vk;c&PB~Wz zzN7|l_R-tiopgeKiqx#Tr7P2RaPF-!#MO?5_LQGhAA=)`+I+0S6kuXNUrTkbYO??* z-qkAi+)!*6U{=Stt@Ccxsl;bU^}Pl;{XkezySf5F6i<6$<(={&&dm{`xFtb|WsPPt zefr-?)rwyQPU_91yu7}oTsuTj30_Gvkw=3 z`FDGpZ-1RVUhq>5>xjK?OO8ag`!GEWlMfXFx;Q)xe+X{%zIp173qnc%kTyfdS!K!|YmQ}G`N25W~u$h{)ql#onXFPy=1^_Z-%htWBX+Sb!a|O1Z{vJ zFEf5`9IvQlK=W=Noqx_78!gcvi>;fkfUXvtGgb?8^4!^3uPaw<3n16v7CnBf&FQmx&>$j*cc2UGSwktV~Ig z9J$1zO3k>bpJnh;W_&$b{@2TG`>k0}n*Yyl(~XZCiibQ$Ub*}Nzu)c-UjB*GLJXZQ z92+3wCH^NLmlX-?nzAr_-MK0DKfc@Vn5C0TT?8LT{PN70$&n+DPAM)UAIO=-AiaR& zIdD*7U4Sed<7G3S!azY)H-|7RoGFJpax8=jInG4Ym8cto3?^neAZH~_h)t8ODs3Ey zjbj4tqmck*eI1I;t&ZGdvVldmXECL{@t_E}XLpE)(9X3=IxVTEfkxvaKobiWYmA@1 zyaz+G1BM3?$cz;yU`TvBr-`Lxk<2jF_6bOW@!^b~VQ(y?1ZaHfxbKsfW^aT`vfFO*|&a7gitTrOfMl`CCKp~&}QXRxtwF_)f(snXJkz<*fE>va)y7qvE2D2pPC zYz}S>LJXaEtg#J2EWHVSKm)o06HY(1dflhv5HKBd`ZQ{E+>;TIE8>iG|L=c>K4bD$ zuCStRthZ)SlyxSU)KuXA^Gm*HjaA-CNaqVYY5td2F zfUaP1WM7F4D)tFR;$mpiep6ZBtQGSB6@S65#`Bj~bDe%d(0p*fmqP zzxK}lhM~Q(Jo;En8-BY0uqYvMwRb(I&ZR-r6UML_1*CMnB5D=TACQ+8cTGxG$Ekv{ ztD9!3U`X&;+aA!95v>zxV;CB%fNP_GH7c7mYKc*wwD&)uHK-BFqJS-kMn}7ak~`IR z!i>*lB?B#YwJYg+at0R-O$#_CS%Vdd@$xg&DHEGS_Ye3nSwa@&?G}u(FccBkq9U48 zO<@>nzjj6um;^METO5V{0>}o#-u|eYAKx8rRuX&vE;#QQY&CYEFBC4Y!C7JG42jvg zpcF1#CeX:)1gMU`upk1$Aw+1Nfp2vwzRD!@o3mJOkk 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
#DH98xcC7hfI_QN_tL9nQ-9Km%Y1^ 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 pwS?>=>?zIWNV`=QKTfKD1=IqEG_o6 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�fwEfhv!}FnhuA<6f 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 JRJLF5{vU_F74ZN7 literal 0 HcmV?d00001 diff --git a/publish/.gitkeep b/publish/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/secret/README.md b/secret/README.md new file mode 100644 index 0000000..1910c58 --- /dev/null +++ b/secret/README.md @@ -0,0 +1,35 @@ +# secret/ — 本機 / 現場敏感資料 + +這個資料夾集中放**不能進 git** 的東西:DUT console 帳密、per-unit 的 PCIe BDF 覆寫、 +COM port 設定、客戶提供但未公開的附件。 + +## Committed vs Ignored + +`.gitignore` 規則是 `secret/*` 搭配 `!secret/README.md` / `!secret/*.example` / `!secret/.gitkeep`。 + +| 檔案 | 狀態 | 說明 | +|------|------|------| +| `README.md` | ✅ committed | 本說明 | +| `config_secret.ttl.example` | ✅ committed | 帳密範本,敏感欄位一律 `__CHANGE_ME__` | +| `config_secret.ttl` | 🚫 ignored | **實際** DUT 帳密,由 `config.ttl` include | +| `dut_bdf.ttl` / `*.local.*` | 🚫 ignored | per-unit 的 PCIe BDF / COM port 覆寫 | +| `*.pem` / `*.key` / `*.env` | 🚫 ignored | 憑證、金鑰 | +| 客戶未公開附件 | 🚫 ignored | schematic、內部 spec 草稿等 | + +## 第一次使用 + +```bash +cp secret/config_secret.ttl.example secret/config_secret.ttl +# 編輯 secret/config_secret.ttl,把 __CHANGE_ME__ 換成實際帳密 +``` + +Tera Term 端把整包 `src/Script_ABC_Blanton/` 複製到工作目錄時,**一併把 +`secret/config_secret.ttl` 放到 `src/Script_ABC_Blanton/` 同層**(`config.ttl` 以相對路徑 include)。 +現場機器上的那份不要再複製回 repo。 + +## 鐵則 + +- 🔒 **commit 前先 grep 一次**:`git grep -nE 'password|passwd|PaSsWoRd' -- . ':!secret'` + 應該只找得到變數名與 placeholder,不該出現真值。 +- 🔒 `.example` 檔內敏感欄位一律寫 `__CHANGE_ME__`,不留 `your_password` 這種半吊子 placeholder。 +- 🔒 本 repo 含客戶 NDA 資料,**只推 `nas` + `gitea`,絕不推 GitHub**。 diff --git a/secret/config_secret.ttl.example b/secret/config_secret.ttl.example new file mode 100644 index 0000000..63546d3 --- /dev/null +++ b/secret/config_secret.ttl.example @@ -0,0 +1,24 @@ +; ============================================================================= +; config_secret.ttl.example -- DUT credentials (NOT in git) +; ============================================================================= +; Usage: +; 1. cp secret/config_secret.ttl.example secret/config_secret.ttl +; 2. Replace every __CHANGE_ME__ below with the real value. +; 3. Put config_secret.ttl next to config.ttl in the Tera Term working dir. +; +; config.ttl includes this file; 1_Blanton_Script_A.ttl must use the variables +; below instead of a literal password: +; +; sendln dut_user +; wait "Password:" +; sendln dut_password +; +; NEVER commit the filled-in config_secret.ttl. +; ============================================================================= + +; --- SONiC console login --- +dut_user = "__CHANGE_ME__" +dut_password = "__CHANGE_ME__" + +; --- Optional: root password, if 'sudo -i' prompts on this unit --- +dut_root_password = "__CHANGE_ME__" diff --git a/src/Script_ABC_Blanton/1_Blanton_Script_A.ttl b/src/Script_ABC_Blanton/1_Blanton_Script_A.ttl new file mode 100644 index 0000000..e33102e --- /dev/null +++ b/src/Script_ABC_Blanton/1_Blanton_Script_A.ttl @@ -0,0 +1,95 @@ +; ============================================================================= +; Script A for Blanton +; Version : V1.0.1 +; Date : 2026-08-14 +; Author : ETWen +; ============================================================================= +; Version History: +; V1.0.0 2026-08-13 Initial Version +; V1.0.1 2026-08-14 Add CLEAR PCIE Error +; ============================================================================= +include "config.ttl" + +flushrecv +;================================================================ +; Log File Creation +;================================================================ +gettime str_starttime "%Y%m%d-%H%M%S" +getdir mdir + +if EN_log = 1 then + sprintf2 filename '%s\Logs\%s_%s_%s.log' mdir project_name strTestcase str_starttime + logopen filename 0 1 1 1 +endif + +; ========== Root Login ========== +wait prompt_login +sendln "admin" +wait "Password:" +sendln "YourPaSsWoRd" +wait prompt_sonic +sendln "sudo -i" + +; ========== Pre Setting ========== +; Make log directory +wait prompt_sonic_root +sendln "mkdir ./logs" + +; Setting System Time +getdate datestr +gettime timestr +sprintf2 cmd 'sudo date -s "%s %s"' datestr timestr +sendln cmd + +; ========== Load Shell Script ========== +wait prompt_sonic_root +sendln "source ~/Blanton_Script/blanton_fpga_pcimem.sh" +wait prompt_sonic_root +sendln "source ~/Blanton_Script/blanton_cb_i2c.sh" +wait prompt_sonic_root +sendln "source ~/Blanton_Script/blanton_icb_vi2c.sh" +wait prompt_sonic_root +sendln "source ~/Blanton_Script/blanton_pwr_data.sh" +wait prompt_sonic_root +sendln "source ~/Blanton_Script/LTC2980_Margin_Script/margin.sh" + +; ========== CLEAR PCIE Error ========== +include "utils/show_pcie_error_reg_TH6_SWB0.ttl" +include "utils/show_pcie_error_reg_TH6_SWB1.ttl" +include "utils/show_pcie_error_reg_FPGA.ttl" +include "utils/show_pcie_error_reg_BMC.ttl" +include "utils/show_pcie_error_reg_DDR.ttl" +include "utils/show_pcie_error_reg_I210.ttl" +include "utils/show_pcie_error_reg_SSD.ttl" + + +; ========== Check PCIE tree + PCIE link status + GET PCIE bandwidth Test ========== +include "utils/pcie_bus.ttl" + +; ========== Check History ========== + ;wait prompt_sonic_root + ;sendln "command" + +; ========== Check Margin ========== +if EN_Margin = 1 then + include "utils/show_margin_status.ttl" +endif + +; ========== Set and Read PMON Settings ========== +include "utils/setup_pmon.ttl" + +; ========== TAKE DATA ========== +include "utils/show_dmesg.ttl" +wait prompt_sonic_root + +;include "utils/xxx.ttl" +;wait prompt_sonic_root +;flushrecv + +; ========== TRAFFIC-SETUP-STAGE ========== + ;sendln "command" + + +sendln "" +wait prompt_sonic_root +messagebox 'Start Script B' 'Script A DONE' \ No newline at end of file diff --git a/src/Script_ABC_Blanton/2_Blanton_Script_B.ttl b/src/Script_ABC_Blanton/2_Blanton_Script_B.ttl new file mode 100644 index 0000000..8fa1455 --- /dev/null +++ b/src/Script_ABC_Blanton/2_Blanton_Script_B.ttl @@ -0,0 +1,74 @@ +; ============================================================================= +; Script B for Blanton +; Version : V1.0.1 +; Date : 2026-08-14 +; Author : ETWen +; ============================================================================= +; Version History: +; V1.0.0 2026-08-13 Initial Version +; V1.0.1 2026-08-14 Add AMD CPU STRESS TEST +; ============================================================================= +include "config.ttl" + +flushrecv +logwrite ''#13#10 +logwrite '#####################################'#13#10 +logwrite 'ScriptB START'#13#10 +logwrite '#####################################'#13#10 +pause 1 + +; ========== CLEAR EVENT ========== + ;wait prompt_sonic_root + ;sendln "command" + +; ========== AMD CPU STRESS TEST ========== +wait prompt_sonic_root +sendln 'chmod +x ~/hammer/tools/amd/mlucas-avx2' +wait prompt_sonic_root +sendln "~/hammer/tools/amd/mlucas-avx2 -s l -cpu 0:15 > ~/hammer/tools/amd/mlucas_amm_log 2>&1 &" + +; ========== DDR MEMORY STRESS TEST ========== +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_mem.py &" +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_mem.py &" +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_mem.py &" +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_mem.py &" +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_mem.py &" + +; ========== I2C, LSB and PCIE read with unlimited loop ========== +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_hhmd.py &" + +; ========== SSD read/write ========== +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_ssd.py &" + +; ========== PCIe CPU <- PCIe -> ASIC by dumping portStatus ========== +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_pcie.py &" + +; ========== USB read/write ========== +wait prompt_sonic_root +sendln "python ~/hammer/tools/stress_usb.py &" + +; ========== SHOW Background job ========== +wait prompt_sonic_root +sendln "jobs" + +; ========== Take one round of eye measurement on uplink ports ========== + +; ========== Get data every 10mins ========== +while 1 + wait prompt_sonic_root + sendln "show platform fan" + wait prompt_sonic_root + sendln "show platform temperature" + ; ========== Check Margin ========== + if EN_Margin = 1 then + include "utils/show_margin_status.ttl" + endif +endwhile \ No newline at end of file diff --git a/src/Script_ABC_Blanton/3_Blanton_Script_C.ttl b/src/Script_ABC_Blanton/3_Blanton_Script_C.ttl new file mode 100644 index 0000000..2cd3285 --- /dev/null +++ b/src/Script_ABC_Blanton/3_Blanton_Script_C.ttl @@ -0,0 +1,46 @@ +; ============================================================================= +; Script B for Blanton +; Version : V1.0.1 +; Date : 2026-08-14 +; Author : ETWen +; ============================================================================= +; Version History: +; V1.0.0 2026-08-13 Initial Version +; V1.0.1 2026-08-14 Add Check PCIE error counters,CHECK Stress results +; ============================================================================= +include "config.ttl" + +flushrecv +logwrite ''#13#10 +logwrite '#####################################'#13#10 +logwrite 'ScriptC START'#13#10 +logwrite '#####################################'#13#10 +pause 1 + +; ========== Kill Process ========== +include "utils/kill_all_process.ttl" +; ========== TAKE DATA ========== +include "utils/setup_pmon.ttl" +include "utils/show_dmesg.ttl" + +; ========== Check PCIE error counters ========== +include "utils/show_pcie_error_reg_TH6_SWB0.ttl" +include "utils/show_pcie_error_reg_TH6_SWB1.ttl" +include "utils/show_pcie_error_reg_FPGA.ttl" +include "utils/show_pcie_error_reg_BMC.ttl" +include "utils/show_pcie_error_reg_DDR.ttl" +include "utils/show_pcie_error_reg_I210.ttl" +include "utils/show_pcie_error_reg_SSD.ttl" + +; ========== CHECK Stress results ========== +wait prompt_sonic_root +sendln "cat ~/hammer/tools/amd/mlucas_amm_log" +wait prompt_sonic_root +sendln "cat ~/hammer/tools/log.stress_ssd" + +; ========== CHECK Traffic counters ========== + ;wait prompt_sonic_root + ;sendln "command" + + +messagebox 'GOOD JOB! Test Case DONE' 'teraterm' \ No newline at end of file diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/README.md b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/README.md new file mode 100644 index 0000000..5b64157 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/README.md @@ -0,0 +1,184 @@ +# LTC2980 Margin Script + +透過 PMBus (`i2cset` / `i2cget`) 控制 LTC2980 多通道電壓 Margin 測試工具。 +**一個 `.conf` = 一顆 LTC2980**(= 2 × LTC2977,每 address 8 channel,共 CH0~CH15)。 + +## Key Features + +| 函數 | 說明 | +|------|------| +| `margin_init ` | source `settings/.conf` 載入該顆 LTC2980 的設定 | +| `margin_status [ch]` | 讀取 CH0~CH15 全部或指定 channel 的 Vout + 偏差% | +| `margin_set ` | 三合一:寫值 + 切 operation + 讀回驗證 | +| `margin_set_value ` | 只寫 HIGH/LOW/OV/UV 暫存器 | +| `margin_operation ` | 只切 OPERATION register | +| `margin_apply_profile ` | 批次套用 profile(套用在當前載入的 LTC2980) | +| `margin_save` | 寫入 NVM(當前 LTC2980 的兩個 LTC2977 都寫) | +| `margin_debug [on\|off]` | 開關 debug 模式(不帶參數則 toggle) | +| `margin_log [on\|off]` | 開關 log 記錄(不帶參數則 toggle,預設開啟) | + +## Setup Steps + +```bash +# 1. 將此資料夾 scp 到目標 Linux 環境 +scp -r LTC2980_Margin_Script user@target:/path/to/ + +# 2. SSH 進入目標機器 +ssh user@target + +# 3. 載入工具 +cd ./LTC2980_Margin_Script +source margin.sh + +# 4. 初始化(指定要操作的 LTC2980) +margin_init Blanton_CB_CONN13 +``` + +## 可用 settings + +| .conf 名稱 | 對應板/接頭 | +|------------|-------------| +| `Blanton_CB_CONN13` | CB 板 CONN13 | +| `Blanton_SWB0_CONN13` | SWB0 板 CONN13 | +| `Blanton_SWB0_CONN14` | SWB0 板 CONN14 | +| `Blanton_SWB0_CONN15` | SWB0 板 CONN15 | +| `Blanton_SWB0_CONN16` | SWB0 板 CONN16 | +| `Blanton_SWB1_CONN13` | SWB1 板 CONN13 | +| `Blanton_SWB1_CONN14` | SWB1 板 CONN14 | +| `Blanton_SWB1_CONN15` | SWB1 板 CONN15 | +| `Blanton_SWB1_CONN16` | SWB1 板 CONN16 | + +## 使用範例 + +```bash +# 載入某顆 LTC2980 +margin_init Blanton_SWB0_CONN14 + +# 查看所有 channel 狀態(0~15) +margin_status + +# 查看單一 channel +margin_status 3 + +# 設定 margin(寫值 + 切 operation + 讀回驗證) +margin_set 0 high 8 # ch0 margin high 8% +margin_set 5 low 5 # ch5 margin low 5% +margin_set 3 nominal 8 # ch3 回標稱值 + +# 只切 operation(不改 margin 值) +margin_operation 0 high +margin_operation 0 nominal + +# 批次套用 profile(套在當前載入的 LTC2980) +margin_apply_profile profiles/comboA.conf +margin_apply_profile profiles/comboB.conf +margin_apply_profile profiles/all_off.conf + +# 切換到另一顆 LTC2980 +margin_init Blanton_SWB1_CONN16 +margin_apply_profile profiles/comboA.conf + +# 儲存到 NVM(斷電後保留) +margin_save +``` + +## 一次掃所有 LTC2980 + +`script/margin_status_all.sh` 依序對多顆 LTC2980 跑 `margin_init` + `margin_status`, +讀完一顆切下一顆。 + +```bash +source script/margin_status_all.sh +``` + +要改掃描範圍,編 script 頂端的 `BOARDS` 陣列即可: + +```bash +BOARDS=( + "Blanton_CB_CONN13" + "Blanton_SWB0_CONN13" + # ... 註解掉或刪掉不想跑的那行 +) +``` + +## 一次套 profile 到所有 LTC2980 + +`script/margin_apply_profile_all.sh` 對多顆 LTC2980 依 `BOARDS[i]` 配對 +`PROFILES[i]` 套用 profile(預設全部 `comboA`)。 + +```bash +source script/margin_apply_profile_all.sh +``` + +編 script 頂端兩個陣列換不同 profile 給不同板: + +```bash +BOARDS=( + "Blanton_CB_CONN13" + "Blanton_SWB0_CONN13" + ... +) + +PROFILES=( + "comboA" # Blanton_CB_CONN13 + "comboB" # Blanton_SWB0_CONN13 ← 改成 comboB + ... +) +``` + +`PROFILES` 寫名字即可(不含路徑跟 `.conf`),script 會自動展開成 +`profiles/.conf`。兩個陣列長度不一致會直接報錯。 + +## 一次把所有 LTC2980 寫入 NVM + +`script/margin_save_all.sh` 對 `BOARDS` 列出的每顆 LTC2980 跑 `margin_save`。 + +> ⚠️ `margin_save` 會把當前 margin / OV / UV 設定**永久寫入 NVM**, +> 斷電後保留。執行前先用 `margin_status_all.sh` 確認狀態正確。 + +```bash +source script/margin_save_all.sh +``` + +要改寫哪幾顆,編 script 頂端的 `BOARDS` 陣列即可(同前述)。 + +## Operation 對應 + +| 參數 | PMBus 0x01 值 | 說明 | +|------|---------------|------| +| `high` | 0xA8 | Margin high | +| `low` | 0x98 | Margin low | +| `nominal` | 0x80 | 回到標稱值 | +| `off` | 0x00 | 關閉輸出 | + +## Channel 編號規則 + +每個 .conf 內 channel 編號 0~15(per LTC2980 本地化): + +- `ch / 8` → CHIPS 陣列索引(0=低位 LTC2977 address,1=高位 LTC2977 address) +- `ch % 8` → LTC2977 page(0x00~0x07) + +## 設定檔 + +- `settings/*.conf` — 一顆 LTC2980 的 channel 定義(Vnom、Net、I2C address × 2、PRE/POST cmd) +- `profiles/*.conf` — 通用 16-ch 批次操作組合 +- `script/*.sh` — 多顆 LTC2980 批次操作(如 `margin_status_all.sh`) +- `logs/` — 操作 log,`source margin.sh` 時自動建立:主 log(摘要)+ detail log(完整輸出)。主 log 帶 `(detail Line:N)` 可跳轉 +- `margin_debug on` / `margin_debug off` / `margin_debug`(toggle)— 開關 debug 模式,印出所有 i2c 指令 +- `margin_log on` / `margin_log off` / `margin_log`(toggle)— 開關 log 記錄(預設開啟) +- `margin_init` 支援 TAB 補全,自動列出 `settings/` 中可用的 .conf 名稱 + +## PRE/POST 執行時機 + +`CHIP_PRE_CMD[0]` / `CHIP_POST_CMD[0]`(mux 切換等指令)由 `_pre_enter_own` / +`_pre_exit` 在**每個 public 函數的最外層**各跑一次: + +``` +margin_status: margin_apply_profile: + [PRE] (一次) [PRE] (一次) + CH0~CH15 i2c ops margin_set CH0, CH1, ... (各自不再 PRE) + [POST] (一次) [POST] (一次) +``` + +巢狀呼叫(`margin_apply_profile → margin_set → margin_set_value/operation/read_vout`) +透過全域旗標 `_PRE_SCOPE` 判斷是否已在 scope 內,內層直接跳過 PRE/POST。 diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_cb_i2c.sh b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_cb_i2c.sh new file mode 100644 index 0000000..296a9b5 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_cb_i2c.sh @@ -0,0 +1,444 @@ +#!/usr/bin/env bash +# ============================================================================= +# blanton_cb_i2c.sh -- CB FPGA (F3) I2C / PMBus over the OpenCores I2C master +# ============================================================================= +# Version History: +# V0.1.0 2026-06-16 CB sibling of blanton_icb_i2c.sh. Same OpenCores I2C +# handshake, but the I2C block lives in CB FPGA *Function 3* +# register space (base 0x300, stride 0x20, Ch0..Ch17), and +# is reached via cb_fpga 3 (direct PCIe BAR -> .3/resource0). +# ============================================================================= +# +# IMPORTANT (vs the hand-written cb_fpga.md pcimem commands): +# * The CB I2C channels are on PCI **Function 3**, so the sysfs file is +# .../0000:02:00.3/resource0 (NOT .0). cb_fpga 3 uses FUNCT3_RES for this. +# * This tool uses **Repeated START** for reads (write reg pointer with WR only, +# no STOP, then Sr + slave|R) so it works for the SMBus/PMBus parts (VRM, +# EFUSE) as well as plain register parts. STOP+START only works for the latter. +# * Slave addresses are 7-bit here. The spec lists 8-bit pairs (e.g. MAX31790 +# "0x40/0x41" -> 7-bit 0x20; TCA9546 "0xE8/0xE9" -> 7-bit 0x74). Divide by 2. +# +# CB FPGA F3 I2C channels (base 0x300, stride 0x20) -- 7-bit addrs in (...): +# Ch0 0x300 SWB_0: TCA9546 mux (0x74), M0.C0 temp sensor, ... +# Ch1 0x320 SWB_1: TCA9546 mux (0x74), ... +# Ch2 0x340 SWB_0: SWB_FPGA (0x40), IO Exp PCA9555 (0x24), ... +# Ch3 0x360 SWB_1: SWB_FPGA (0x40), PCA9555 (0x24), ... +# Ch4 0x380 SWB_0: M1 TCA9546 mux (0x74), Clk Gen SI5..., ... +# Ch5 0x3A0 SWB_1: M1 TCA9546 mux (0x74), ... +# Ch6 0x3C0 SWB_0: VRM M29816 (0x20), VRM M2985B (0x21), ... [PMBus] +# Ch7 0x3E0 SWB_1: VRM M29816 (0x20), VRM M2985B (0x21), ... [PMBus] +# Ch8 0x400 SWB_0: VRM M2985B (0x25), M2985B (0x26), ... [PMBus] +# Ch9 0x420 SWB_1: VRM M2985B (0x25), M2985B (0x26), ... [PMBus] +# Ch10 0x440 M0 TCA9543 mux (0x70), M0.C0 Clk Buf 9DBL0452, ... +# Ch11 0x460 Fan Ctrl MAX31790 (0x20) +# Ch12 0x480 ADC leakage ADC128D818 (0x1F) +# Ch13 0x4A0 NFC SM-MFAD4-C02 (0x28) +# Ch14 0x4C0 M1 TCA9543 mux (0x70), M1.C0 QSFP28.P1 xcvr, ... +# Ch15 0x4E0 Fan1/2 EFUSE STEF48H28 (0x10/0x11), ... [PMBus-ish] +# Ch16 0x500 1G PHY I210 Ethernet ctrlr (0x49) +# Ch17 0x520 Chassis EEPROM (0x28..0x29), Diag EEPROM (0x2B), ... +# (slave 7-bit addrs derived from the 8-bit pairs in the register map; verify +# against the device datasheet / your board before driving writes.) +# +# Per-channel register layout (offset from channel base): +# +0x00 I2C_PRSCL_LO +0x04 I2C_PRSCL_HI +0x08 I2C_CTRL (bit7 MOD_EN) +# +0x0C I2C_TX(W)/I2C_RX(R) +0x10 I2C_CMD(W)/I2C_STAT(R) +# +0x14 I2C_MUX_SEL +0x18 I2C_RST (0xD) +0x1C SEM +# CMD : STA=0x80 STO=0x40 RD=0x20 WR=0x10 ACK=0x08(1=NACK) IACK=0x01 +# STAT: RX_ACK=0x80(1=NACK) BUSY=0x40 ARB_LOST=0x20 TIP=0x02 INT_FLAG=0x01 +# Prescale = (in_clk/(5*scl))-1 @75MHz: 0x88=100kHz, 0x24=400kHz +# +# Usage: +# source blanton_fpga_pcimem.sh # provides cb_fpga / fpga_debug +# source blanton_cb_i2c.sh +# cb_i2c_init 11 # Ch11 (Fan Ctrl) @100kHz +# cb_i2c_scan 11 +# cb_i2c_read 11 0x20 0x01 1 # MAX31790 (7-bit 0x20) reg 0x01 +# cb_pmbus_read 6 0x20 0x8B 2 # Ch6 VRM READ_VOUT +# ============================================================================= + +# --- Pull in the register-access backend (cb_fpga) if not present ----------- +if ! declare -F cb_fpga >/dev/null 2>&1; then + _CBI2C_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" + if [ -n "$_CBI2C_DIR" ] && [ -f "$_CBI2C_DIR/blanton_fpga_pcimem.sh" ]; then + # shellcheck source=/dev/null + source "$_CBI2C_DIR/blanton_fpga_pcimem.sh" + else + echo -e "[\033[33mWARN\033[0m] blanton_cb_i2c.sh: cb_fpga() not found." >&2 + echo " source blanton_fpga_pcimem.sh first (provides cb_fpga)." >&2 + fi +fi + +# === CB I2C geometry ========================================================= +CBI2C_FN=3 # CB PCI Function hosting the I2C block +CBI2C_BASE=0x300 # channel 0 base offset (relative to F3 resource0) +CBI2C_CH_STRIDE=0x20 +CBI2C_CH_MAX=17 + +# Per-channel register offsets +_CBI2C_PRSCL_LO=0x00 +_CBI2C_PRSCL_HI=0x04 +_CBI2C_CTRL=0x08 +_CBI2C_TX=0x0C +_CBI2C_RX=0x0C +_CBI2C_CMD=0x10 +_CBI2C_STAT=0x10 +_CBI2C_MUX_SEL=0x14 +_CBI2C_RST=0x18 +_CBI2C_SEM=0x1C + +# I2C_CTRL_REG / CMD / STAT bits +_CBI2C_EN=0x80 +_CBI2C_STA=0x80 +_CBI2C_STO=0x40 +_CBI2C_RD=0x20 +_CBI2C_WR=0x10 +_CBI2C_NACK=0x08 +_CBI2C_RXACK=0x80 +_CBI2C_TIP=0x02 +_CBI2C_RST_VAL=0xD + +# Defaults +CB_I2C_PRESCALE_LO="${CB_I2C_PRESCALE_LO:-0x88}" # 100 kHz @ 75 MHz +CB_I2C_PRESCALE_HI="${CB_I2C_PRESCALE_HI:-0x00}" +CB_I2C_AUTO_INIT="${CB_I2C_AUTO_INIT:-1}" +CB_I2C_TIP_POLL_MAX="${CB_I2C_TIP_POLL_MAX:-100}" + +# --- External I2C-mux RESET control (verified on COM34, 2026-06-16) ---------- +# The TCA9543 muxes on CH10 (M0) and CH14 (M1) have an FPGA-driven, active-low +# RESET line. On power-up / FPGA reload the FPGA holds them in reset, so 0x70 +# does NOT ACK on the root bus and all downstream legs are unreachable. +# +# The control is a GLOBAL register in CB FPGA *Function 0*, offset 0x7D4 +# (I2C_MUX_RST_REG) -- NOT the per-channel I2C_MUX_SEL_REG (+0x14) which is a +# device-select and does nothing to the RESET pin. Per bit: 1 = release, +# 0 = hold-in-reset. Observed default 0xDD (bit1=CH10 mux, bit5=CH14 mux held). +# Writing 0xFF releases all external muxes (normal operating state). This value +# is volatile and is lost on the next power cycle / FPGA reload. +CBI2C_MUX_RST_FN="${CBI2C_MUX_RST_FN:-0}" +CBI2C_MUX_RST_OFF="${CBI2C_MUX_RST_OFF:-0x7D4}" + +# Channels whose root bus carries an external mux that hangs off the RESET reg. +# CH10/CH14 = TCA9543; CH0/1/4/5 = TCA9546 (SWB/M1) per the channel map above. +CBI2C_MUX_CHANNELS="${CBI2C_MUX_CHANNELS:-0 1 4 5 10 14}" + +# Auto-release external mux RESET before scanning / mux-writing a mux channel. +CB_I2C_AUTO_MUX_RST="${CB_I2C_AUTO_MUX_RST:-1}" + +# --- Single FPGA register read/write via cb_fpga [data] ---------- +# _cbi2c_reg [data] data present = write, absent = read (echo hex) +_cbi2c_reg() { + local off="$1" data="${2:-}" + if [ -n "$data" ]; then cb_fpga "$CBI2C_FN" "$off" "$data"; else cb_fpga "$CBI2C_FN" "$off"; fi +} + +# Channel base absolute offset +_cbi2c_chan_base() { + local ch="$1" + if (( ch < 0 || ch > CBI2C_CH_MAX )); then + echo "blanton_cb_i2c: ch must be 0..$CBI2C_CH_MAX" >&2; return 1 + fi + printf '0x%X' $(( CBI2C_BASE + ch * CBI2C_CH_STRIDE )) +} + +# Normalize a register read-back to a number string ("0x...." -> 0x....) +_cbi2c_num() { local v="$1"; [[ "$v" =~ (0[xX][0-9a-fA-F]+) ]] && echo "${BASH_REMATCH[1]}" || echo "0"; } + +# Write CMD then poll STAT (same offset) until TIP clears; echo final status hex +_cbi2c_cmd_wait() { + local cmd_off="$1" cmd_val="$2" i status + _cbi2c_reg "$cmd_off" "$cmd_val" >/dev/null + for (( i=0; i&2 + printf '0x%X' "${status:-0}"; return 1 +} + +# Check RX_ACK in status (bit7). 0 = ACK, 1 = NACK -> return 1 +_cbi2c_check_ack() { + local status; status=$(_cbi2c_num "$1") + (( (status & _CBI2C_RXACK) != 0 )) && return 1 || return 0 +} + +# === Public: init / reset / semaphore / mux-sel ============================= + +# cb_i2c_init [prescale_lo] [prescale_hi] +cb_i2c_init() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_init [prescale_lo] [prescale_hi]"; return 1; } + local ch="$1" lo="${2:-$CB_I2C_PRESCALE_LO}" hi="${3:-$CB_I2C_PRESCALE_HI}" base + base=$(_cbi2c_chan_base "$ch") || return 1 + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_CTRL)))" 0x00 >/dev/null # disable + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_PRSCL_LO)))" "$lo" >/dev/null + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_PRSCL_HI)))" "$hi" >/dev/null + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_CTRL)))" "$_CBI2C_EN" >/dev/null # enable + return 0 +} + +# cb_i2c_reset +cb_i2c_reset() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_reset "; return 1; } + local ch="$1" base; base=$(_cbi2c_chan_base "$ch") || return 1 + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_RST)))" "$_CBI2C_RST_VAL" >/dev/null + echo " [RST] ch=$ch local I2C controller reset (0xD)" +} + +# cb_i2c_sem [status|acquire [val]|release] +cb_i2c_sem() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_sem [status|acquire [val]|release]"; return 1; } + local ch="$1" act="${2:-status}" base off cur + base=$(_cbi2c_chan_base "$ch") || return 1 + off=$(printf '0x%X' $((base + _CBI2C_SEM))) + case "$act" in + status) + cur=$(_cbi2c_num "$(_cbi2c_reg "$off")") + (( (cur & 0xFF) == 0 )) && echo " [SEM] ch=$ch free (0x00)" \ + || printf ' [SEM] ch=%s held (0x%02X)\n' "$ch" $((cur & 0xFF)) ;; + acquire) + local val="${3:-0x01}" + cur=$(_cbi2c_num "$(_cbi2c_reg "$off")") + if (( (cur & 0xFF) != 0 )); then + printf ' [SEM] ch=%s already held (0x%02X) -- not acquired\n' "$ch" $((cur & 0xFF)); return 1 + fi + _cbi2c_reg "$off" "$val" >/dev/null + cur=$(_cbi2c_num "$(_cbi2c_reg "$off")") + (( (cur & 0xFF) != 0 )) && printf ' [SEM] ch=%s acquired (0x%02X)\n' "$ch" $((cur & 0xFF)) \ + || { echo " [SEM] ch=$ch acquire failed"; return 1; } ;; + release) + _cbi2c_reg "$off" 0x00 >/dev/null; echo " [SEM] ch=$ch released (0x00)" ;; + *) echo "Usage: cb_i2c_sem [status|acquire [val]|release]"; return 1 ;; + esac +} + +# cb_i2c_muxsel -- write I2C_MUX_SEL_REG (FPGA drives ext mux pins) +cb_i2c_muxsel() { + [[ $# -lt 2 ]] && { echo "Usage: cb_i2c_muxsel "; return 1; } + local ch="$1" sel="$2" base; base=$(_cbi2c_chan_base "$ch") || return 1 + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_MUX_SEL)))" "$sel" >/dev/null + printf ' [MUXSEL] ch=%s DEV_SEL <= 0x%02X\n' "$ch" $((sel & 0xFF)) +} + +# cb_i2c_mux_reset_release -- de-assert ALL external mux RESET lines (F0 0x7D4 <= 0xFF) +# Global, not per-channel. Volatile: lost on power cycle / FPGA reload. +cb_i2c_mux_reset_release() { + cb_fpga "$CBI2C_MUX_RST_FN" "$CBI2C_MUX_RST_OFF" 0xFF >/dev/null + local rb; rb=$(_cbi2c_num "$(cb_fpga "$CBI2C_MUX_RST_FN" "$CBI2C_MUX_RST_OFF")") + printf ' [MUX-RST] I2C_MUX_RST_REG (F%s %s) <= 0xFF (all external muxes released, readback %s)\n' \ + "$CBI2C_MUX_RST_FN" "$CBI2C_MUX_RST_OFF" "$rb" +} + +# _cbi2c_is_mux_channel -- 0 (true) if ch is in CBI2C_MUX_CHANNELS +_cbi2c_is_mux_channel() { + local ch="$1" c + for c in $CBI2C_MUX_CHANNELS; do [[ "$c" == "$ch" ]] && return 0; done + return 1 +} + +# _cbi2c_auto_mux_rst -- release external mux RESET if ch is a mux channel +_cbi2c_auto_mux_rst() { + [[ "$CB_I2C_AUTO_MUX_RST" == "1" ]] || return 0 + _cbi2c_is_mux_channel "$1" || return 0 + cb_i2c_mux_reset_release +} + +# === Core transfers (Repeated START, SMBus/PMBus compatible) ================= + +# _cbi2c_xfer_read echoes space-separated hex bytes +_cbi2c_xfer_read() { + local ch="$1" slave="$2" reg="$3" n="$4" base tx cmd rx status i last cmdv val out="" + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + rx=$(printf '0x%X' $((base + _CBI2C_RX))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (W) 0x$(printf %02X "$slave")" >&2; return 1; } + + _cbi2c_reg "$tx" "$(printf '0x%X' $((reg & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR)))") # WR only, no STOP + _cbi2c_check_ack "$status" || { echo "ERR: NACK on reg 0x$(printf %02X "$reg")" >&2; return 1; } + + _cbi2c_reg "$tx" "$(printf '0x%X' $(( ((slave << 1) | 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") # Repeated START + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (R) 0x$(printf %02X "$slave")" >&2; return 1; } + + for (( i=0; i/dev/null + val=$(_cbi2c_num "$(_cbi2c_reg "$rx")") + out+="$(printf '0x%02X ' $((val & 0xFF)))" + done + echo "${out% }" +} + +# _cbi2c_xfer_write [byte...] +_cbi2c_xfer_write() { + local ch="$1" slave="$2" reg="$3"; shift 3 + local base tx cmd status b last cmdv n=$# idx=0 + [[ $n -lt 1 ]] && { echo "ERR: no data bytes" >&2; return 1; } + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (W) 0x$(printf %02X "$slave")" >&2; return 1; } + + _cbi2c_reg "$tx" "$(printf '0x%X' $((reg & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on reg 0x$(printf %02X "$reg")" >&2; return 1; } + + for b in "$@"; do + idx=$((idx+1)); last=$(( idx == n )) + _cbi2c_reg "$tx" "$(printf '0x%X' $(( $((b)) & 0xFF )))" >/dev/null + if (( last )); then cmdv=$(( _CBI2C_WR | _CBI2C_STO )); else cmdv=$(( _CBI2C_WR )); fi + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' "$cmdv")") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on data byte #$idx" >&2; return 1; } + done + return 0 +} + +# _cbi2c_xfer_cmd_only -- START+W, cmd byte, STOP (no data) +_cbi2c_xfer_cmd_only() { + local ch="$1" slave="$2" cc="$3" base tx cmd status + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (W) 0x$(printf %02X "$slave")" >&2; return 1; } + _cbi2c_reg "$tx" "$(printf '0x%X' $((cc & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR | _CBI2C_STO)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on cmd 0x$(printf %02X "$cc")" >&2; return 1; } + return 0 +} + +# === Public: generic I2C ===================================================== + +# cb_i2c_read [nbytes] +cb_i2c_read() { + [[ $# -lt 3 ]] && { echo "Usage: cb_i2c_read [nbytes]"; return 1; } + local ch="$1" slave=$(( $2 )) reg=$(( $3 )) n="${4:-1}" bytes + bytes=$(_cbi2c_xfer_read "$ch" "$slave" "$reg" "$n") || return 1 + printf ' [I2C-R] ch=%s slave=0x%02X reg=0x%02X => [%s]\n' "$ch" "$slave" "$reg" "$bytes" +} + +# cb_i2c_write [byte...] +cb_i2c_write() { + [[ $# -lt 4 ]] && { echo "Usage: cb_i2c_write [byte...]"; return 1; } + local ch="$1" slave=$(( $2 )) reg=$(( $3 )); shift 3 + _cbi2c_xfer_write "$ch" "$slave" "$reg" "$@" || return 1 + printf ' [I2C-W] ch=%s slave=0x%02X reg=0x%02X <= [%s]\n' "$ch" "$slave" "$reg" "$*" +} + +# cb_i2c_muxwrite -- raw 1-byte write, no reg (TCA954x) +cb_i2c_muxwrite() { + [[ $# -lt 3 ]] && { echo "Usage: cb_i2c_muxwrite "; return 1; } + local ch="$1" slave=$(( $2 )) val=$(( $3 )) base tx cmd status + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + _cbi2c_auto_mux_rst "$ch" + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on mux addr 0x$(printf %02X "$slave")" >&2; return 1; } + _cbi2c_reg "$tx" "$(printf '0x%X' $((val & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR | _CBI2C_STO)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on mux ctrl byte" >&2; return 1; } + printf ' [MUX-W] ch=%s mux=0x%02X <= 0x%02X\n' "$ch" "$slave" "$val" +} + +# cb_i2c_scan -- probe 0x08..0x77, report slaves that ACK +cb_i2c_scan() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_scan "; return 1; } + local ch="$1" base tx cmd a status found="" + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + cb_i2c_init "$ch" >/dev/null + _cbi2c_auto_mux_rst "$ch" + for (( a=0x08; a<=0x77; a++ )); do + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (a << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR | _CBI2C_STO)))") + _cbi2c_check_ack "$status" && found+="$(printf '0x%02X ' "$a")" + done + [[ -n "$found" ]] && echo " [SCAN] ch=$ch found: ${found% }" || echo " [SCAN] ch=$ch no devices" +} + +# === Public: PMBus (== SMBus; command code + Repeated START read) ============ + +# cb_pmbus_read [nbytes] (default 2 bytes, LSB first) +cb_pmbus_read() { + [[ $# -lt 3 ]] && { echo "Usage: cb_pmbus_read [nbytes]"; return 1; } + local ch="$1" slave=$(( $2 )) cc=$(( $3 )) n="${4:-2}" bytes + bytes=$(_cbi2c_xfer_read "$ch" "$slave" "$cc" "$n") || return 1 + if [[ "$n" == "2" ]]; then + local b0 b1 word; b0=$(( $(echo "$bytes" | awk '{print $1}') )); b1=$(( $(echo "$bytes" | awk '{print $2}') )) + word=$(( b0 | (b1 << 8) )) + printf ' [PMB-R] ch=%s slave=0x%02X cmd=0x%02X => 0x%04X raw=[%s] linear16=%s\n' \ + "$ch" "$slave" "$cc" "$word" "$bytes" "$(cb_pmbus_linear16 "$word")" + else + printf ' [PMB-R] ch=%s slave=0x%02X cmd=0x%02X => [%s]\n' "$ch" "$slave" "$cc" "$bytes" + fi +} + +# cb_pmbus_write [data byte...] (no byte = send-byte) +cb_pmbus_write() { + [[ $# -lt 3 ]] && { echo "Usage: cb_pmbus_write [data byte...]"; return 1; } + local ch="$1" slave=$(( $2 )) cc=$(( $3 )); shift 3 + if [[ $# -eq 0 ]]; then + _cbi2c_xfer_cmd_only "$ch" "$slave" "$cc" || return 1 + printf ' [PMB-W] ch=%s slave=0x%02X cmd=0x%02X <= (send-byte)\n' "$ch" "$slave" "$cc"; return 0 + fi + _cbi2c_xfer_write "$ch" "$slave" "$cc" "$@" || return 1 + printf ' [PMB-W] ch=%s slave=0x%02X cmd=0x%02X <= [%s]\n' "$ch" "$slave" "$cc" "$*" +} + +# cb_pmbus_linear16 +cb_pmbus_linear16() { + local word=$(( $1 & 0xFFFF )) + awk -v w="$word" 'BEGIN{ + e=int(w/2048)%32; if(e>15)e-=32; + m=w%2048; if(m>1023)m-=2048; + printf "%.4f", m * (2.0 ^ e); + }' +} + +# === Help ==================================================================== +blanton_cb_i2c_help() { + echo -e "\033[1mblanton_cb_i2c.sh - CB FPGA (F3) I2C / PMBus over OpenCores I2C master\033[0m" + echo "" + echo -e " Backend: \033[36mcb_fpga $CBI2C_FN\033[0m (direct PCIe BAR -> .3/resource0), base 0x300, Ch0..$CBI2C_CH_MAX" + echo "" + echo -e "\033[1mSetup\033[0m" + echo -e " \033[33mcb_i2c_init\033[0m [pre_lo] [pre_hi] prescale + enable (def 0x88/0x00 = 100kHz)" + echo -e " \033[33mcb_i2c_reset\033[0m LCL_RST=0xD" + echo -e " \033[33mcb_i2c_sem\033[0m [status|acquire [v]|release]" + echo -e " \033[33mcb_i2c_muxsel\033[0m write I2C_MUX_SEL_REG" + echo -e " \033[33mcb_i2c_mux_reset_release\033[0m de-assert ALL ext mux RESET (F0 0x7D4<=0xFF)" + echo "" + echo -e "\033[1mGeneric I2C\033[0m" + echo -e " \033[33mcb_i2c_scan\033[0m " + echo -e " \033[33mcb_i2c_read\033[0m [nbytes]" + echo -e " \033[33mcb_i2c_write\033[0m [byte...]" + echo -e " \033[33mcb_i2c_muxwrite\033[0m raw 1-byte (TCA954x)" + echo "" + echo -e "\033[1mPMBus / SMBus\033[0m" + echo -e " \033[33mcb_pmbus_read\033[0m [nbytes] (def 2, LE word + linear16)" + echo -e " \033[33mcb_pmbus_write\033[0m [byte...]" + echo -e " \033[33mcb_pmbus_linear16\033[0m " + echo "" + echo -e " Slave = 7-bit (tool shifts). Spec lists 8-bit pairs -> divide by 2." + echo -e " \033[33mfpga_debug on\033[0m to see every underlying pcimem command." +} + +blanton_cb_i2c_help diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_fpga_pcimem.sh b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_fpga_pcimem.sh new file mode 100644 index 0000000..ca21689 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/blanton_fpga_pcimem.sh @@ -0,0 +1,270 @@ +#!/usr/bin/env bash +# ============================================================================= +# blanton_fpga_pcimem.sh -- pcimem backend, sysfs resource file + relative offset +# ============================================================================= +# Version History: +# V1.3.0 2026-06-12 pcimem variant (SONiC hardware). memtool variant: blanton_fpga_memtool.sh +# Version number kept in sync with blanton_fpga_memtool.sh +# V1.4.0 2026-06-15 Fix: VSPI window bases pointed at the VSPI-Flash block +# (0x340/0x380/0x3C0/0x400, config-flash channel) so register +# reads returned 0; corrected to the VSPI register block +# (PMC 0x640 / ICB 0x680 / SWB0 0x6C0 / SWB1 0x700) +# Add: _vspi_fnwarn guard - warns when PMC/ICB/SWB are called with +# cb_fpga-style " " (a read turning into a write) +# Change: suppress pcimem write stdout noise (mmap/Written lines) +# Docs: comments/help translated to English (ASCII-only for SONiC console) +# V1.4.1 2026-06-23 Fix: BDF in example auto-detect was wrong (02:00 vs 04:00); corrected to match the lspci example. +# ============================================================================= +# +# SONiC hardware has no memtool / devmem, but it has pcimem. pcimem mmaps the PCI +# sysfs resource file directly and takes "resource file + offset relative to BAR +# start", not an absolute physical address. +# +# pcimem { sysfile } { offset } [ type*count [ data ] ] +# sysfile : sysfs file for the pci resource (e.g. .../resource0) +# offset : offset into pci memory region +# type : [b]yte, [h]alfword, [w]ord, [d]ouble-word +# *count : number of items (w*100 dump 100 words) +# data : data to be written +# +# This tool always accesses as word (w, 32-bit). +# +# After sourcing this file the following functions are available: +# cb_fpga [data] +# pmc_fpga [data] +# icb_fpga [data] +# swb0_fpga [data] +# swb1_fpga [data] +# +# data present = write, absent = read. +# Usage: source blanton_fpga_pcimem.sh + +# === CB FPGA PCIe resource file (sysfs) === +# Use lspci -D to find the BDF (domain:bus:dev.fn); resource0 is the sysfs mapping of BAR0. +# e.g. lspci -Dnn | grep -i fpga -> 0000:02:00.0 ... +# memtool variant fills in the BAR value; pcimem variant fills in the resource file +# path instead (offset becomes relative to BAR). +FUNCT0_RES=/sys/bus/pci/devices/0000:04:00.0/resource0 +FUNCT1_RES=/sys/bus/pci/devices/0000:04:00.1/resource0 +FUNCT2_RES=/sys/bus/pci/devices/0000:04:00.2/resource0 +FUNCT3_RES=/sys/bus/pci/devices/0000:04:00.3/resource0 + +# Auto-detect example (uncomment to use; needs the FPGA's BDF prefix): +# _BDF=0000:02:00 +# FUNCT0_RES=/sys/bus/pci/devices/${_BDF}.0/resource0 +# FUNCT1_RES=/sys/bus/pci/devices/${_BDF}.1/resource0 +# FUNCT2_RES=/sys/bus/pci/devices/${_BDF}.2/resource0 +# FUNCT3_RES=/sys/bus/pci/devices/${_BDF}.3/resource0 + +# === VSPI window base offset (relative to CB Function 2 resource0 start) === +# NOTE: CB.F2 has TWO near-identical VSPI register blocks (see spec register map): +# - VSPI-Flash-* @ 0x340/0x380/0x3C0/0x400 -> accesses the remote FPGA's CONFIG FLASH +# - VSPI-* @ 0x640/0x680/0x6C0/0x700 -> accesses the remote FPGA's REGISTERS +# This tool reads/writes remote registers, so it uses the VSPI-* block (0x640+). +# The VSPI-Flash bases are kept below (commented) in case flash access is needed later. +VSPI_PMC_BASE=0x640 +VSPI_ICB_BASE=0x680 +VSPI_SWB0_BASE=0x6C0 +VSPI_SWB1_BASE=0x700 + +# VSPI-Flash window bases (config-flash access, not register access): +# VSPI_FLASH_PMC_BASE=0x340 +# VSPI_FLASH_ICB_BASE=0x380 +# VSPI_FLASH_SWB0_BASE=0x3C0 +# VSPI_FLASH_SWB1_BASE=0x400 + +# === VSPI protocol constants === +_VSPI_CMD_STAT=0x00 +_VSPI_ADDR=0x04 +_VSPI_WR_DATA=0x08 +_VSPI_RD_DATA=0x0C +_VSPI_NEW_CMD=0x01 +_VSPI_READ_W=0x02 +_VSPI_WRITE_W=0x04 +_VSPI_READY_MASK=0x100 +_VSPI_POLL_MAX=200 + +# === pcimem command === +PCIMEM_CMD="${PCIMEM_CMD:-pcimem}" + +# === Debug mode (1=print commands AND execute, 0=execute only) === +DEBUG_MODE=${DEBUG_MODE:-0} + +fpga_debug() { + if [ "${1:-}" = "on" ]; then DEBUG_MODE=1 + elif [ "${1:-}" = "off" ]; then DEBUG_MODE=0 + else [ "$DEBUG_MODE" = "0" ] && DEBUG_MODE=1 || DEBUG_MODE=0; fi + echo -e "[\033[34mINFO\033[0m] DEBUG_MODE=$DEBUG_MODE" +} + +# Wrapper: debug mode prints command (to stderr) AND executes, normal mode executes only. +# On read, returns the parsed hex value (stripping pcimem's mmap noise). +# Usage: _pcimem [data] (data present = write, absent = read) +_pcimem() { + local sysfile="$1" offset="$2" data="${3:-}" + if [[ -n "$data" ]]; then + [ "$DEBUG_MODE" = "1" ] && \ + echo -e "\033[90m[DEBG] $PCIMEM_CMD $sysfile $offset w $data\033[0m" >&2 + # Write output (opened / Target offset / mmap / Written...readback) is never + # parsed -> drop stdout noise; keep stderr so real errors still surface. + $PCIMEM_CMD "$sysfile" "$offset" w "$data" >/dev/null + else + [ "$DEBUG_MODE" = "1" ] && \ + echo -e "\033[90m[DEBG] $PCIMEM_CMD $sysfile $offset w\033[0m" >&2 + # pcimem read prints mmap info + "Value at offset ...: 0xXXXX"; + # take the last 0x... token as the actual read-back value. + $PCIMEM_CMD "$sysfile" "$offset" w | grep -oiE '0x[0-9a-f]+' | tail -1 + fi +} + +# --- Internal VSPI helpers (all hang off CB Function 2's resource0) --- + +_vspi_read() { + local win_off="$1" remote_offset="$2" + local cmd_off add_off rd_off addr_val status i + + cmd_off=$(printf '0x%X' $(( win_off + _VSPI_CMD_STAT ))) + add_off=$(printf '0x%X' $(( win_off + _VSPI_ADDR ))) + rd_off=$(printf '0x%X' $(( win_off + _VSPI_RD_DATA ))) + addr_val=$(printf '0x%08X' $(( (0x0 << 20) | (remote_offset & 0xFFFFF) ))) + + _pcimem "$FUNCT2_RES" "$add_off" "$addr_val" + _pcimem "$FUNCT2_RES" "$cmd_off" $(printf '0x%X' $(( _VSPI_NEW_CMD | _VSPI_READ_W ))) + + for (( i=0; i<_VSPI_POLL_MAX; i++ )); do + status=$(_pcimem "$FUNCT2_RES" "$cmd_off") + if (( ( ${status:-0} & _VSPI_READY_MASK) != 0 )); then + _pcimem "$FUNCT2_RES" "$rd_off" + return 0 + fi + done + echo "ERROR: VSPI read timeout @ offset $remote_offset" >&2 + return 1 +} + +_vspi_write() { + local win_off="$1" remote_offset="$2" data="$3" + local cmd_off add_off wr_off addr_val status i + + cmd_off=$(printf '0x%X' $(( win_off + _VSPI_CMD_STAT ))) + add_off=$(printf '0x%X' $(( win_off + _VSPI_ADDR ))) + wr_off=$(printf '0x%X' $(( win_off + _VSPI_WR_DATA ))) + addr_val=$(printf '0x%08X' $(( (0x0 << 20) | (remote_offset & 0xFFFFF) ))) + + _pcimem "$FUNCT2_RES" "$wr_off" "$data" + _pcimem "$FUNCT2_RES" "$add_off" "$addr_val" + _pcimem "$FUNCT2_RES" "$cmd_off" $(printf '0x%X' $(( _VSPI_NEW_CMD | _VSPI_WRITE_W ))) + + for (( i=0; i<_VSPI_POLL_MAX; i++ )); do + status=$(_pcimem "$FUNCT2_RES" "$cmd_off") + if (( ( ${status:-0} & _VSPI_READY_MASK) != 0 )); then + return 0 + fi + done + echo "ERROR: VSPI write timeout @ offset $remote_offset" >&2 + return 1 +} + +# Guard: PMC/ICB/SWB are single-function; signature is [data], NO fn arg. +# Common pitfall: using cb_fpga's " " form -> 2nd arg becomes data, a read +# turns into a write. If addr is 0~3 (looks like fn) AND data is given, warn and +# confirm; on a non-tty (script) just warn, don't block. +# Usage: _vspi_fnwarn non-zero return = cancel +_vspi_fnwarn() { + local name="$1" addr="$2" data="$3" + [[ -z "$data" ]] && return 0 # read, nothing to warn + case "$addr" in + 0|1|2|3|0x0|0x1|0x2|0x3|0x00|0x01|0x02|0x03) ;; # looks like fn, warn below + *) return 0 ;; # normal offset, allow + esac + echo -e "[\033[33mWARN\033[0m] $name has no fn arg; signature is [data] (NOT cb_fpga's )." >&2 + echo -e " This will WRITE $data to PMC/ICB/SWB offset $addr." >&2 + echo -e " To READ offset $addr, pass a single arg: $name $addr" >&2 + if [ -t 0 ]; then + local ans + read -r -p " Proceed with write anyway? [y/N] " ans + case "$ans" in + y|Y|yes|YES) return 0 ;; + *) echo " Cancelled." >&2; return 1 ;; + esac + fi + return 0 +} + +# === Public functions === + +cb_fpga() { + if [[ $# -lt 2 ]]; then + echo "Usage: cb_fpga [data]"; return 1 + fi + local fn="$1" addr="$2" data="${3:-}" res + case "$fn" in + 0) res=$FUNCT0_RES ;; 1) res=$FUNCT1_RES ;; + 2) res=$FUNCT2_RES ;; 3) res=$FUNCT3_RES ;; + *) echo "cb_fpga: fn must be 0-3" >&2; return 1 ;; + esac + # pcimem offset is relative to BAR start; do not add BAR. + if [[ -z "$data" ]]; then + _pcimem "$res" "$addr" + else + _pcimem "$res" "$addr" "$data" + fi +} + +pmc_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: pmc_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn pmc_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_PMC_BASE" "$addr" + else _vspi_write "$VSPI_PMC_BASE" "$addr" "$data"; fi +} + +icb_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: icb_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn icb_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_ICB_BASE" "$addr" + else _vspi_write "$VSPI_ICB_BASE" "$addr" "$data"; fi +} + +swb0_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: swb0_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn swb0_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_SWB0_BASE" "$addr" + else _vspi_write "$VSPI_SWB0_BASE" "$addr" "$data"; fi +} + +swb1_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: swb1_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn swb1_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_SWB1_BASE" "$addr" + else _vspi_write "$VSPI_SWB1_BASE" "$addr" "$data"; fi +} + +blanton_fpga_help() { + echo -e "\033[1mblanton_fpga (pcimem) - FPGA Register Access Tool\033[0m" + echo "" + echo -e "\033[1mUsage:\033[0m" + echo -e " \033[33mcb_fpga\033[0m [data] CB FPGA direct (sysfs resource0)" + echo -e " \033[33mpmc_fpga\033[0m [data] PMC FPGA via VSPI" + echo -e " \033[33micb_fpga\033[0m [data] ICB FPGA via VSPI" + echo -e " \033[33mswb0_fpga\033[0m [data] SWB0 FPGA via VSPI" + echo -e " \033[33mswb1_fpga\033[0m [data] SWB1 FPGA via VSPI" + echo -e " \033[33mfpga_debug\033[0m on|off Toggle debug mode (print commands and execute)" + echo "" + echo -e " Omit [data] to \033[32mread\033[0m, provide [data] to \033[31mwrite\033[0m." + echo -e " Backend: \033[36mpcimem\033[0m (sysfs resource file + relative offset)." + echo -e " Run \033[33mblanton_fpga_help\033[0m to show this message again." +} + +blanton_fpga_help diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/logs/.gitkeep b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/logs/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/margin.sh b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/margin.sh new file mode 100644 index 0000000..3e5ab4c --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/margin.sh @@ -0,0 +1,493 @@ +#!/bin/bash +# Blanton Margin Tool - Shell version (CB: i2cset/i2cget | SWB: cb_pmbus_* via FPGA) +# Usage: source margin.sh; margin_init; margin_status +# +# ============================================================================= +# Version Control +# ----------------------------------------------------------------------------- +# v2.5.0 SWB margin support via a per-conf TRANSPORT layer. The SWB margin +# boards are ALSO LTC2980 (2x LTC2977) -- same chip as CB -- just reached +# through the CB FPGA F3 I2C master instead of a native bus. So the whole +# stack above the wire (PAGE, LINEAR16 x8192, VNOM margin) is identical; +# only the wire op changes. A .conf sets: +# TRANSPORT="swb" CB_I2C_CH=<6|7|8|9> +# and i2cset/i2cget are swapped for cb_pmbus_write/cb_pmbus_read (from the +# bundled blanton_cb_i2c.sh + blanton_fpga_pcimem.sh) on that FPGA channel. +# The LTC2977 addresses stay in CHIPS; the bus field is unused for swb. +# TRANSPORT unset -> "i2c", so existing CB confs are unchanged. +# v2.4.0 Auto-enable channel before margining: clear ON_OFF_CONFIG use_control +# (0x02=0x1a) so OPERATION can turn the channel on and soft-connect the +# servo DAC. Fixes "STATUS_WORD OFF=1, Vout won't move" on rails the +# LTC2980 does not sequence (externally enabled, e.g. MPQ8625 always-on). +# margin_set does NOT block for servo settle — confirm final voltages +# with margin_status afterwards. RAM-only; reverts on power cycle. +# v2.3.1 Fix: LINEAR16 hex->dec parsing (SONiC busybox/mawk ignores "0x") +# v2.3.0 Logging system, TAB completion, colored output +# v2.2.0 margin_debug toggle + colored log output +# v2.1.0 Batch scripts for status / apply_profile / save across boards +# v2.0.0 Per-LTC2980 .conf, Script Channel mapping, scoped PRE/POST (breaking) +# v1.2.0 Per-chip PRE/POST command hooks +# v1.1.0 Replace i2cexec with i2cset/i2cget, rename to LTC2980 +# v1.0.0 Initial release - LTC2977 PMBus margin test tool +# ============================================================================= + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SETTINGS_DIR="$SCRIPT_DIR/settings" +PROFILES_DIR="$SCRIPT_DIR/profiles" +LOGS_DIR="$SCRIPT_DIR/logs" + +# --- Ensure logs directory exists --- +mkdir -p "$LOGS_DIR" + +# --- Global state --- +PART_NUMBER="" +CHIPS=() +DEBUG_MODE=0 +LOG_MODE=1 + +# Transport backend, selected per-conf (a .conf sets TRANSPORT): +# "i2c" (default) - LTC2980 on the CPU I2C bus via i2cset/i2cget +# "swb" - the SAME LTC2980 margin board, but reached through the CB +# FPGA F3 I2C master via cb_pmbus_read/cb_pmbus_write. The +# LTC2977 addresses stay in CHIPS; CB_I2C_CH picks the FPGA +# I2C channel (6/7/8/9). Everything above the wire (PAGE, +# LINEAR16 x8192, VNOM margin) is identical to the i2c path. +TRANSPORT="i2c" +CB_I2C_CH="" + +# Channel enable for margining. Rails the LTC2980 does not sequence (externally +# enabled, e.g. an always-on MPQ8625 buck) sit with STATUS_WORD OFF=1 and won't +# margin, because the servo DAC never soft-connects. Writing ON_OFF_CONFIG (0x02) +# to clear use_control lets a following OPERATION command turn the channel on so +# the DAC connects and servos to the margin target. Change is RAM-only and reverts +# on power cycle (never STORE_USER_ALL during a test). Set MARGIN_AUTO_ENABLE=0 to +# keep the stored ON_OFF_CONFIG untouched. +MARGIN_AUTO_ENABLE=1 +ONOFF_ENABLE_VALUE="0x1a" # controlled_on=1, use_pmbus=1, use_control=0, b1=1 +# Short pause after OPERATION so the write registers; NOT a full servo settle. +# margin_set returns immediately (does not block per channel) — the DAC soft-connect +# + servo ramp takes a few seconds, so confirm final voltages yourself with +# margin_status after all channels are set. Bump this if you want margin_set's own +# read-back to reflect the settled value. +MARGIN_SETTLE="0.3" +_BUS="" +_ADDR="" +_PRE_SCOPE="" # set while inside a PRE/POST wrapped operation; prevents nested re-entry +_LOG_FILE="" +_LOG_DETAIL_FILE="" +_LOG_DETAIL_LINE=0 + +# --- Logging helper --- +_ts() { + date "+%Y-%m-%d %H:%M:%S.%3N" +} + +_log() { + [ "$LOG_MODE" = "0" ] && return + [ -z "$_LOG_FILE" ] && return + echo -e "[$(_ts)] $*" >> "$_LOG_FILE" +} + +_log_detail() { + [ "$LOG_MODE" = "0" ] && return + [ -z "$_LOG_DETAIL_FILE" ] && return + (( _LOG_DETAIL_LINE++ )) + echo "[$(_ts)] $*" >> "$_LOG_DETAIL_FILE" +} + +_log_label() { + [ "$LOG_MODE" = "0" ] && return + local label=$1 + (( _LOG_DETAIL_LINE++ )) + echo "[$(_ts)] --- $label ---" >> "$_LOG_DETAIL_FILE" + _log "$label \033[90m(detail Line:${_LOG_DETAIL_LINE})\033[0m" +} + +_log_start_session() { + _log "--- margin_init: $PART_NUMBER ---" +} + +# --- Toggle log mode --- +margin_log() { + if [ "${1:-}" = "on" ]; then + LOG_MODE=1 + elif [ "${1:-}" = "off" ]; then + LOG_MODE=0 + else + [ "$LOG_MODE" = "0" ] && LOG_MODE=1 || LOG_MODE=0 + fi + echo -e "[\033[34mINFO\033[0m] LOG_MODE=$LOG_MODE" +} + +# --- Toggle debug mode --- +margin_debug() { + if [ "${1:-}" = "on" ]; then + DEBUG_MODE=1 + elif [ "${1:-}" = "off" ]; then + DEBUG_MODE=0 + else + [ "$DEBUG_MODE" = "0" ] && DEBUG_MODE=1 || DEBUG_MODE=0 + fi + echo -e "[\033[34mINFO\033[0m] DEBUG_MODE=$DEBUG_MODE" +} + +# --- Init: load setting by name --- +margin_init() { + if [ -z "$1" ]; then + echo -e "[\033[31mERRO\033[0m] Usage: margin_init " + return 1 + fi + PART_NUMBER="$1" + echo "Part Number: $PART_NUMBER" + + local setting_file="$SETTINGS_DIR/${PART_NUMBER}.conf" + if [ ! -f "$setting_file" ]; then + echo -e "[\033[31mERRO\033[0m] Setting file not found: $setting_file" + return 1 + fi + TRANSPORT="i2c"; CB_I2C_CH="" # reset before sourcing; swb confs override + source "$setting_file" + TRANSPORT="${TRANSPORT:-i2c}" # a blank TRANSPORT="" in a .conf means i2c + echo -e "[\033[34mINFO\033[0m] Loaded setting: $setting_file (transport=$TRANSPORT)" + + # SWB rails need the cb_pmbus_* backend; source it on demand. + if [ "$TRANSPORT" = "swb" ] && ! declare -F cb_pmbus_read >/dev/null 2>&1; then + if [ -f "$SCRIPT_DIR/blanton_cb_i2c.sh" ]; then + # shellcheck source=/dev/null + source "$SCRIPT_DIR/blanton_cb_i2c.sh" + else + echo -e "[\033[31mERRO\033[0m] TRANSPORT=swb but blanton_cb_i2c.sh not found in $SCRIPT_DIR" + return 1 + fi + fi + _log_start_session +} + +# --- Tab completion for margin_init --- +_margin_init_completions() { + [ "$COMP_CWORD" -ne 1 ] && return + local cur="${COMP_WORDS[COMP_CWORD]}" + local names=$(ls "$SETTINGS_DIR"/*.conf 2>/dev/null | xargs -n1 basename | sed 's/\.conf$//') + COMPREPLY=($(compgen -W "$names" -- "$cur")) +} +complete -F _margin_init_completions margin_init + +# --- PRE/POST scope helpers --- +# PRE/POST run once at the outermost public-function entry/exit. +# Nested calls (e.g. margin_apply_profile -> margin_set -> margin_read_vout) +# see _PRE_SCOPE already set and skip, so the mux only switches once. +_run_cmds() { + local cmds=$1 label=$2 + [ -z "$cmds" ] && return + IFS=';' read -ra _cmds <<< "$cmds" + for _cmd in "${_cmds[@]}"; do + _cmd=$(echo "$_cmd" | xargs) + [ -z "$_cmd" ] && continue + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[36m$label $_cmd\033[0m" + eval "$_cmd" >/dev/null 2>&1 + done +} + +# Returns 0 (true) if caller owns the scope and must call _pre_exit on the way out. +_pre_enter_own() { + if [ -z "$_PRE_SCOPE" ]; then + _PRE_SCOPE=1 + _run_cmds "${CHIP_PRE_CMD[0]}" "[PRE]" + return 0 + fi + return 1 +} + +_pre_exit() { + _run_cmds "${CHIP_POST_CMD[0]}" "[POST]" + _PRE_SCOPE="" +} + +# --- Helper: set _BUS and _ADDR from channel number --- +# Both transports use CHIPS (LTC2977 addresses). For swb the bus field is unused +# (the FPGA I2C channel comes from CB_I2C_CH); _ADDR is the PMBus slave. +_get_chip() { + local chip_idx=$(( $1 / 8 )) + IFS=':' read -r _BUS _ADDR <<< "${CHIPS[$chip_idx]}" +} + +# --- Helper: get page (channel within LTC2977, 0x00~0x07) --- +_get_page() { + printf "0x%02x" $(( $1 % 8 )) +} + +# --- I2C low-level helpers (use _BUS/_ADDR set by _get_chip) --- +# TRANSPORT=swb swaps the i2cset/i2cget wire op for cb_pmbus_* on CB_I2C_CH. +# PAGE is written the same way on both (PMBus command 0x00). +_open_page() { + if [ "$TRANSPORT" = "swb" ]; then + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] cb_pmbus_write $CB_I2C_CH $_ADDR 0x00 $1\033[0m" + cb_pmbus_write "$CB_I2C_CH" "$_ADDR" 0x00 "$1" >/dev/null 2>&1 + return + fi + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] i2cset -y $_BUS $_ADDR 0x00 $1 b\033[0m" + i2cset -y "$_BUS" "$_ADDR" 0x00 "$1" b >/dev/null 2>&1 +} + +# Write a 16-bit word (LINEAR16, little-endian: lo byte first). +_i2c_write_word() { + local reg=$1 lo=$2 hi=$3 + if [ "$TRANSPORT" = "swb" ]; then + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] cb_pmbus_write $CB_I2C_CH $_ADDR $reg $lo $hi\033[0m" + cb_pmbus_write "$CB_I2C_CH" "$_ADDR" "$reg" "$lo" "$hi" >/dev/null 2>&1 + return + fi + local word=$(( (hi << 8) | lo )) + local word_hex=$(printf "0x%04x" "$word") + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] i2cset -y $_BUS $_ADDR $reg $word_hex w\033[0m" + i2cset -y "$_BUS" "$_ADDR" "$reg" "$word" w >/dev/null 2>&1 +} + +_i2c_write_byte() { + if [ "$TRANSPORT" = "swb" ]; then + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] cb_pmbus_write $CB_I2C_CH $_ADDR $1 $2\033[0m" + cb_pmbus_write "$CB_I2C_CH" "$_ADDR" "$1" "$2" >/dev/null 2>&1 + return + fi + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] i2cset -y $_BUS $_ADDR $1 $2 b\033[0m" + i2cset -y "$_BUS" "$_ADDR" "$1" "$2" b >/dev/null 2>&1 +} + +# Read a 16-bit word; echoes "0xXXXX". For swb, parse cb_pmbus_read's "=> 0xXXXX". +_i2c_read_word() { + if [ "$TRANSPORT" = "swb" ]; then + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] cb_pmbus_read $CB_I2C_CH $_ADDR $1 2\033[0m" >&2 + local out word + out=$(cb_pmbus_read "$CB_I2C_CH" "$_ADDR" "$1" 2 2>/dev/null) + # cb_pmbus_read prints "... => 0xXXXX raw=[...] ..."; take the word after "=>". + word=$(printf '%s' "$out" | awk -F'=> ' 'NF>1{print $2}' | awk '{print $1}') + [[ "$word" =~ ^0[xX][0-9a-fA-F]+$ ]] || word="0x0000" + echo "$word" + return + fi + [ "$DEBUG_MODE" = "1" ] && echo -e "\033[90m[DEBG] i2cget -y $_BUS $_ADDR $1 w\033[0m" >&2 + local result + result=$(i2cget -y "$_BUS" "$_ADDR" "$1" w 2>/dev/null) + if [ -z "$result" ]; then + echo "0x0000" + else + echo "$result" + fi +} + +# --- Enable current channel for margining (clear ON_OFF_CONFIG use_control) --- +# Assumes _get_chip + _open_page already ran (uses current _BUS/_ADDR/page). +# Lets a subsequent OPERATION command turn the channel on so the servo DAC +# soft-connects; without this, rails the LTC2980 doesn't sequence stay OFF and +# margining has no effect. RAM-only; a power cycle restores the stored value. +_enable_channel() { + _i2c_write_byte 0x02 "$ONOFF_ENABLE_VALUE" +} + +# --- Helper: decimal to LINEAR16 (returns "lo hi" hex strings) --- +_dec_to_lin16() { + local value=$1 + if [ "$value" = "0" ]; then + echo "0x00 0x00" + return + fi + local raw=$(awk "BEGIN { printf \"%04X\", int($value * 8192) }") + local hi=${raw:0:2} + local lo=${raw:2:2} + echo "0x${lo} 0x${hi}" +} + +# --- Helper: LINEAR16 word to decimal voltage --- +# i2cget returns a hex string like "0x9fc2". SONiC's awk (busybox/mawk) does NOT +# parse a "0x" prefix in arithmetic and treats it as 0, so convert hex -> decimal +# with bash arithmetic $(( )) first, then feed the decimal to awk. +_lin16_to_dec() { + local raw_word=$(( ${1:-0} )) + awk "BEGIN { printf \"%.4f\", $raw_word / 8192.0 }" +} + +# --- Read Vout for a channel --- +margin_read_vout() { + local ch=$1 + local vnom_var="CH${ch}_VNOM" + local net_var="CH${ch}_NET" + local vnom=${!vnom_var} + local net=${!net_var} + + if [ "$vnom" = "-" ] || [ -z "$vnom" ]; then + printf "CH %2d: Channel not used\n" "$ch" + LAST_VOUT="0" + return + fi + + local _own=0 + _pre_enter_own && _own=1 + + _get_chip "$ch" + _open_page "$(_get_page "$ch")" + local raw + raw=$(_i2c_read_word 0x8b) + local vout=$(_lin16_to_dec "$raw") + + local pct + pct=$(awk "BEGIN { printf \"%+.3f\", ($vout - $vnom) / $vnom * 100 }") + local _line + printf -v _line "CH %2d: Vnom = %.3f, Vout = %s (%s%%). Net - %s" "$ch" "$vnom" "$vout" "$pct" "$net" + echo "$_line" + _log_detail "$_line" + LAST_VOUT="$vout" + + [ "$_own" = "1" ] && _pre_exit +} + +# --- Status: read all or specific channel --- +margin_status() { + local ch_in=${1:-all} + echo "-------------" + echo "[$PART_NUMBER] Channel status" + echo "-------------" + _log_label "margin_status [$PART_NUMBER] ch=$ch_in" + + local _own=0 + _pre_enter_own && _own=1 + + if [ "$ch_in" = "all" ]; then + for i in $(seq 0 15); do + local vnom_var="CH${i}_VNOM" + [ -n "${!vnom_var}" ] && margin_read_vout "$i" + done + else + margin_read_vout "$ch_in" + fi + + [ "$_own" = "1" ] && _pre_exit +} + +# --- Set margin value (write high/low + OV/UV) --- +margin_set_value() { + local ch=$1 vnom=$2 change=$3 ovuv=${4:-2} + + local high_val low_val ov_val uv_val + high_val=$(_dec_to_lin16 "$(awk "BEGIN { print $vnom * (1 + $change/100) }")") + low_val=$(_dec_to_lin16 "$(awk "BEGIN { print $vnom * (1 - $change/100) }")") + ov_val=$(_dec_to_lin16 "$(awk "BEGIN { print $vnom * (1 + ($change+$ovuv)/100) }")") + uv_val=$(_dec_to_lin16 "$(awk "BEGIN { print $vnom * (1 - ($change+$ovuv)/100) }")") + + local _own=0 + _pre_enter_own && _own=1 + + _get_chip "$ch" + _open_page "$(_get_page "$ch")" + + local hi lo + read lo hi <<< $high_val + _i2c_write_word 0x25 "$lo" "$hi" + read lo hi <<< $low_val + _i2c_write_word 0x26 "$lo" "$hi" + read lo hi <<< $ov_val + _i2c_write_word 0x40 "$lo" "$hi" + read lo hi <<< $uv_val + _i2c_write_word 0x44 "$lo" "$hi" + + [ "$_own" = "1" ] && _pre_exit +} + +# --- Set operation register --- +margin_operation() { + local ch=$1 op=$2 + + local op_val + case "$op" in + high) op_val=0xa8 ;; + low) op_val=0x98 ;; + nominal) op_val=0x80 ;; + off) op_val=0x00 ;; + *) echo -e "[\033[31mERRO\033[0m] invalid operation '$op'"; return 1 ;; + esac + + local _own=0 + _pre_enter_own && _own=1 + + _get_chip "$ch" + _open_page "$(_get_page "$ch")" + # Let OPERATION turn the channel on (soft-connect DAC) even on rails the + # LTC2980 does not sequence; skip when turning the channel off. + [ "$MARGIN_AUTO_ENABLE" = "1" ] && [ "$op" != "off" ] && _enable_channel + _i2c_write_byte 0x01 "$op_val" + sleep "$MARGIN_SETTLE" + + [ "$_own" = "1" ] && _pre_exit +} + +# --- Set: combined set_value + operation + verify --- +margin_set() { + local ch=$1 op=$2 change=$3 + local vnom_var="CH${ch}_VNOM" + local vnom=${!vnom_var} + + if [ "$vnom" = "-" ] || [ -z "$vnom" ]; then + printf "CH %2d: Channel not used\n" "$ch" + return + fi + + local _own=0 + _pre_enter_own && _own=1 + + margin_set_value "$ch" "$vnom" "$change" + margin_operation "$ch" "$op" + margin_read_vout "$ch" + local _line + printf -v _line "CH %2d: Set %s %s%% done (Vout=%s)" "$ch" "$op" "$change" "$LAST_VOUT" + echo "$_line" + _log_detail "$_line" + _log "$(printf 'margin_set CH%2d %-7s %3s%% Vout=%-8s' $ch $op $change $LAST_VOUT)\033[90m(detail Line:${_LOG_DETAIL_LINE})\033[0m" + + [ "$_own" = "1" ] && _pre_exit +} + +# --- Apply a margin profile file --- +margin_apply_profile() { + local profile=${1:-"$PROFILES_DIR/${PART_NUMBER}_default.conf"} + if [ ! -f "$profile" ]; then + echo -e "[\033[31mERRO\033[0m] Profile not found: $profile" + return 1 + fi + echo "Applying profile: $profile" + _log_label "margin_apply_profile [$PART_NUMBER] $profile" + source "$profile" + + local _own=0 + _pre_enter_own && _own=1 + + for entry in "${PROFILE_CHANNELS[@]}"; do + local ch op change + IFS=':' read -r ch op change <<< "$entry" + margin_set "$ch" "$op" "$change" + done + + [ "$_own" = "1" ] && _pre_exit +} + +# --- Save to NVM --- +margin_save() { + local _own=0 + _pre_enter_own && _own=1 + + for chip in "${CHIPS[@]}"; do + IFS=':' read -r _BUS _ADDR <<< "$chip" + _i2c_write_byte 0x15 0x00 + done + echo "Change Saved (${#CHIPS[@]} chips)" + _log_label "margin_save $PART_NUMBER (${#CHIPS[@]} chips)" + + [ "$_own" = "1" ] && _pre_exit +} + +if [ -z "$_LOG_FILE" ]; then + _LOG_FILE="$LOGS_DIR/margin_$(date '+%Y%m%d_%H%M%S').log" + _LOG_DETAIL_FILE="${_LOG_FILE%.log}_detail.log" + _log "=== Session start ===" + _log "Detail log: $_LOG_DETAIL_FILE" +fi + +echo -e "[\033[34mINFO\033[0m] LTC2980 Margin Tool loaded. Run 'margin_init' to start." diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/all_off.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/all_off.conf new file mode 100644 index 0000000..1c6e6b3 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/all_off.conf @@ -0,0 +1,22 @@ +# Profile: all_off - 全部回 nominal +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" + +PROFILE_CHANNELS=( + "0:nominal:8" + "1:nominal:8" + "2:nominal:8" + "3:nominal:8" + "4:nominal:8" + "5:nominal:8" + "6:nominal:8" + "7:nominal:8" + "8:nominal:8" + "9:nominal:8" + "10:nominal:8" + "11:nominal:8" + "12:nominal:8" + "13:nominal:8" + "14:nominal:8" + "15:nominal:8" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboA.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboA.conf new file mode 100644 index 0000000..5889fec --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboA.conf @@ -0,0 +1,22 @@ +# Profile: comboA - alternating high/low (even=high, odd=low) +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" + +PROFILE_CHANNELS=( + "0:high:8" + "1:low:8" + "2:high:8" + "3:low:8" + "4:high:8" + "5:low:8" + "6:high:8" + "7:low:8" + "8:high:8" + "9:low:8" + "10:high:8" + "11:low:8" + "12:high:8" + "13:low:8" + "14:high:8" + "15:low:8" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboB.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboB.conf new file mode 100644 index 0000000..a765610 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/comboB.conf @@ -0,0 +1,22 @@ +# Profile: comboB - inverse of comboA (even=low, odd=high) +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" + +PROFILE_CHANNELS=( + "0:low:8" + "1:high:8" + "2:low:8" + "3:high:8" + "4:low:8" + "5:high:8" + "6:low:8" + "7:high:8" + "8:low:8" + "9:high:8" + "10:low:8" + "11:high:8" + "12:low:8" + "13:high:8" + "14:low:8" + "15:high:8" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high3.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high3.conf new file mode 100644 index 0000000..f386642 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high3.conf @@ -0,0 +1,22 @@ +# Profile: combo_high3 - 全部 channel margin high +3% +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" + +PROFILE_CHANNELS=( + "0:high:3" + "1:high:3" + "2:high:3" + "3:high:3" + "4:high:3" + "5:high:3" + "6:high:3" + "7:high:3" + "8:high:3" + "9:high:3" + "10:high:3" + "11:high:3" + "12:high:3" + "13:high:3" + "14:high:3" + "15:high:3" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high5.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high5.conf new file mode 100644 index 0000000..f69df0f --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_high5.conf @@ -0,0 +1,22 @@ +# Profile: combo_high - 全部 channel margin high +5% +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" + +PROFILE_CHANNELS=( + "0:high:5" + "1:high:5" + "2:high:5" + "3:high:5" + "4:high:5" + "5:high:5" + "6:high:5" + "7:high:5" + "8:high:5" + "9:high:5" + "10:high:5" + "11:high:5" + "12:high:5" + "13:high:5" + "14:high:5" + "15:high:5" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low3.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low3.conf new file mode 100644 index 0000000..18717f3 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low3.conf @@ -0,0 +1,22 @@ +# Profile: combo_low3 - 全部 channel margin low -3% +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" + +PROFILE_CHANNELS=( + "0:low:3" + "1:low:3" + "2:low:3" + "3:low:3" + "4:low:3" + "5:low:3" + "6:low:3" + "7:low:3" + "8:low:3" + "9:low:3" + "10:low:3" + "11:low:3" + "12:low:3" + "13:low:3" + "14:low:3" + "15:low:3" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low5.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low5.conf new file mode 100644 index 0000000..54fc7c9 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_low5.conf @@ -0,0 +1,22 @@ +# Profile: combo_low - 全部 channel margin low -5% +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" + +PROFILE_CHANNELS=( + "0:low:5" + "1:low:5" + "2:low:5" + "3:low:5" + "4:low:5" + "5:low:5" + "6:low:5" + "7:low:5" + "8:low:5" + "9:low:5" + "10:low:5" + "11:low:5" + "12:low:5" + "13:low:5" + "14:low:5" + "15:low:5" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_normal.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_normal.conf new file mode 100644 index 0000000..3da4768 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/profiles/combo_normal.conf @@ -0,0 +1,23 @@ +# Profile: combo_normal - 全部 channel 回 nominal(標稱值) +# Applied to whichever LTC2980 is currently loaded via margin_init +# Format: "channel:operation:change_percent" +# nominal 時 operation=0x80,輸出跟隨 VOUT_COMMAND;change_percent 不影響輸出 + +PROFILE_CHANNELS=( + "0:nominal:5" + "1:nominal:5" + "2:nominal:5" + "3:nominal:5" + "4:nominal:5" + "5:nominal:5" + "6:nominal:5" + "7:nominal:5" + "8:nominal:5" + "9:nominal:5" + "10:nominal:5" + "11:nominal:5" + "12:nominal:5" + "13:nominal:5" + "14:nominal:5" + "15:nominal:5" +) diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_apply_profile_all.sh b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_apply_profile_all.sh new file mode 100644 index 0000000..11b393c --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_apply_profile_all.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Apply a margin profile to every LTC2980 in BOARDS. +# BOARDS[i] 對應 PROFILES[i],兩個陣列長度必須一樣。 +# Usage: +# source script/margin_apply_profile_all.sh + +# --- Edit this list --- +BOARDS=( + "Blanton_CB_CONN13" + "Blanton_SWB0_CONN13" + "Blanton_SWB0_CONN14" + "Blanton_SWB0_CONN15" + "Blanton_SWB0_CONN16" + "Blanton_SWB1_CONN13" + "Blanton_SWB1_CONN14" + "Blanton_SWB1_CONN15" + "Blanton_SWB1_CONN16" +) + +# 對應的 profile 名稱(不含路徑與 .conf 副檔名),預設全部 comboA +PROFILES=( + "comboA" # Blanton_CB_CONN13 + "comboA" # Blanton_SWB0_CONN13 + "comboA" # Blanton_SWB0_CONN14 + "comboA" # Blanton_SWB0_CONN15 + "comboA" # Blanton_SWB0_CONN16 + "comboA" # Blanton_SWB1_CONN13 + "comboA" # Blanton_SWB1_CONN14 + "comboA" # Blanton_SWB1_CONN15 + "comboA" # Blanton_SWB1_CONN16 +) + +# --- Source margin.sh if not already loaded --- +_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +[ -z "$(type -t margin_init)" ] && source "$_SCRIPT_DIR/../margin.sh" + +# --- Sanity check --- +if [ ${#BOARDS[@]} -ne ${#PROFILES[@]} ]; then + echo "ERROR: BOARDS (${#BOARDS[@]}) and PROFILES (${#PROFILES[@]}) length mismatch" + return 1 2>/dev/null || exit 1 +fi + +# --- Iterate --- +for i in "${!BOARDS[@]}"; do + board="${BOARDS[$i]}" + profile="${PROFILES[$i]}" + margin_init "$board" || continue + margin_apply_profile "$PROFILES_DIR/${profile}.conf" + echo "" +done diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_save_all.sh b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_save_all.sh new file mode 100644 index 0000000..c34249a --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_save_all.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# Run margin_save on every LTC2980 in BOARDS. +# +# ⚠️ margin_save 會把目前的 margin / OV / UV 設定**永久寫入 NVM**, +# 斷電後仍保留。執行前請務必先 margin_status 確認各 channel 狀態正確。 +# +# Usage: +# source script/margin_save_all.sh + +# --- Edit this list --- +BOARDS=( + "Blanton_CB_CONN13" + "Blanton_SWB0_CONN13" + "Blanton_SWB0_CONN14" + "Blanton_SWB0_CONN15" + "Blanton_SWB0_CONN16" + "Blanton_SWB1_CONN13" + "Blanton_SWB1_CONN14" + "Blanton_SWB1_CONN15" + "Blanton_SWB1_CONN16" +) + +# --- Source margin.sh if not already loaded --- +_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +[ -z "$(type -t margin_init)" ] && source "$_SCRIPT_DIR/../margin.sh" + +# --- Iterate --- +for board in "${BOARDS[@]}"; do + margin_init "$board" || continue + margin_save + echo "" +done diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_status_all.sh b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_status_all.sh new file mode 100644 index 0000000..9434ff5 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/script/margin_status_all.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Run margin_status across every Blanton LTC2980 listed in BOARDS. +# Edit BOARDS to include / exclude / reorder which .conf files to iterate. +# Usage: +# source script/margin_status_all.sh + +# --- Edit this list --- +BOARDS=( + "Blanton_CB_CONN13" + "Blanton_SWB0_CONN13" + "Blanton_SWB0_CONN14" + "Blanton_SWB0_CONN15" + "Blanton_SWB0_CONN16" + "Blanton_SWB1_CONN13" + "Blanton_SWB1_CONN14" + "Blanton_SWB1_CONN15" + "Blanton_SWB1_CONN16" +) + +# --- Source margin.sh if not already loaded --- +_SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +[ -z "$(type -t margin_init)" ] && source "$_SCRIPT_DIR/../margin.sh" + +# --- Iterate --- +for board in "${BOARDS[@]}"; do + margin_init "$board" || continue + margin_status + echo "" +done diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_CB_CONN13.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_CB_CONN13.conf new file mode 100644 index 0000000..478d899 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_CB_CONN13.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- Transport (blank = i2c): CB's LTC2980 is on the native I2C bus, driven by +# i2cset/i2cget. Only SWB boards set TRANSPORT="swb" + CB_I2C_CH=<6|7|8|9>. --- +TRANSPORT="" +CB_I2C_CH= + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: CB (CONN13) + "4:0x5C" # CH0 ~ CH7 + "4:0x5E" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # CB CONN13 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # CB CONN13 (lo) +) + +# ============================================================ +# chip1: CB (CONN13) +# ============================================================ +CH0_VNOM="5.0"; CH0_NET="V5P0_ALW" +CH1_VNOM="3.3"; CH1_NET="V3P3_ALW" +CH2_VNOM="0.75"; CH2_NET="PWR_VDD_MISC_ALW" +CH3_VNOM="1.8"; CH3_NET="V1P8_ALW" +CH4_VNOM="1.1"; CH4_NET="PWR_APU_VDDIO_SUS" +CH5_VNOM="0.75"; CH5_NET="PWR_VDD_MISC_RUN" +CH6_VNOM="0.78"; CH6_NET="PWR_APU_VDD_MEM_RUN" +CH7_VNOM="0.8"; CH7_NET="V0P8_PHY2_DVDD" +CH8_VNOM="0.8"; CH8_NET="V0P8_AVDD" +CH9_VNOM="0.8"; CH9_NET="V0P8_PHY" +CH10_VNOM="1.8"; CH10_NET="V1P8_FPGA" +CH11_VNOM="2.5"; CH11_NET="V2P5_FPGA" +CH12_VNOM="1.1"; CH12_NET="V1P1_FPGA" +CH13_VNOM="5.0"; CH13_NET="P5V_STBY" +CH14_VNOM="3.3"; CH14_NET="P3V3_STBY" +CH15_VNOM="0.8"; CH15_NET="V0P8_PHY2_AVDD" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN13.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN13.conf new file mode 100644 index 0000000..2f8665d --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN13.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=6 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB0 (CONN13) + "0:0x5C" # CH0 ~ CH7 + "0:0x5E" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB0 CONN13 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB0 CONN13 (lo) +) + +# ============================================================ +# chip1: SWB0 (CONN13) +# ============================================================ +CH0_VNOM="0.75"; CH0_NET="P0V75_DVDD_47" +CH1_VNOM="0.75"; CH1_NET="P0V75_AVDD_47" +CH2_VNOM="1.5"; CH2_NET="P1V5_AVDD_47" +CH3_VNOM="0.9"; CH3_NET="P0V9_AVDD_47" +CH4_VNOM="1.8"; CH4_NET="P1V8_1" +CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A3" +CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B1" +CH7_VNOM="1.8"; CH7_NET="P1V8_3" +CH8_VNOM="1.8"; CH8_NET="P1V8_DVDDIO_3" +CH9_VNOM="0.75"; CH9_NET="P0V75_DVDD_39" +CH10_VNOM="0.75"; CH10_NET="P0V75_AVDD_39" +CH11_VNOM="1.5"; CH11_NET="P1V5_AVDD_39" +CH12_VNOM="0.9"; CH12_NET="P0V9_AVDD_39" +CH13_VNOM="1.5"; CH13_NET="PVDD1V5_2" +CH14_VNOM="1.8"; CH14_NET="PVDD1V8_DUT" +CH15_VNOM="1.2"; CH15_NET="PVDD_MDIO" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN14.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN14.conf new file mode 100644 index 0000000..77b9545 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN14.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=8 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB0 (CONN14) + "0:0x5E" # CH0 ~ CH7 + "0:0x5F" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB0 CONN14 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB0 CONN14 (lo) +) + +# ============================================================ +# chip1: SWB0 (CONN14) +# ============================================================ +CH0_VNOM="0.75"; CH0_NET="P0V75_AVDD_7" +CH1_VNOM="1.5"; CH1_NET="P1V5_AVDD_7" +CH2_VNOM="0.9"; CH2_NET="P0V9_AVDD_7" +CH3_VNOM="1.8"; CH3_NET="P1V8_5" +CH4_VNOM="1.8"; CH4_NET="P1V8_2" +CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_B2" +CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_A2" +CH7_VNOM="3.3"; CH7_NET="PVDD3_3V_SYNTH_LDO_A1" +CH8_VNOM="1.5"; CH8_NET="PVDD1V5_TSC" +CH9_VNOM="1.5"; CH9_NET="PVDD1V5_ANLG" +CH10_VNOM="-"; CH10_NET="NC" +CH11_VNOM="-"; CH11_NET="NC" +CH12_VNOM="1.5"; CH12_NET="PVDD1V5_1" +CH13_VNOM="-"; CH13_NET="NC" +CH14_VNOM="1.8"; CH14_NET="P1V8_DVDDIO_1" +CH15_VNOM="0.75"; CH15_NET="P0V75_DVDD_7" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN15.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN15.conf new file mode 100644 index 0000000..256e2e2 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN15.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=6 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB0 (CONN15) + "0:0x62" # CH0 ~ CH7 + "0:0x63" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB0 CONN15 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB0 CONN15 (lo) +) + +# ============================================================ +# chip1: SWB0 (CONN15) +# ============================================================ +CH0_VNOM="1.5"; CH0_NET="P1V5_AVDD_55" +CH1_VNOM="0.9"; CH1_NET="P0V9_AVDD_55" +CH2_VNOM="0.75"; CH2_NET="P0V75_DVDD_63" +CH3_VNOM="0.75"; CH3_NET="P0V75_AVDD_63" +CH4_VNOM="1.5"; CH4_NET="P1V5_AVDD_63" +CH5_VNOM="0.9"; CH5_NET="P0V9_AVDD_63" +CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B3" +CH7_VNOM="1.5"; CH7_NET="PVDD1V5_3" +CH8_VNOM="0.85"; CH8_NET="P0V85_STBY" +CH9_VNOM="1.8"; CH9_NET="P1V8_STBY" +CH10_VNOM="-"; CH10_NET="NC" +CH11_VNOM="3.3"; CH11_NET="P3V3_STBY" +CH12_VNOM="0.9"; CH12_NET="PVDD0V9_2" +CH13_VNOM="0.75"; CH13_NET="P0V75_DVDD_55" +CH14_VNOM="0.75"; CH14_NET="P0V75_AVDD_55" +CH15_VNOM="1.8"; CH15_NET="P1V8_DVDDIO_4" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN16.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN16.conf new file mode 100644 index 0000000..09c6da5 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB0_CONN16.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=8 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB0 (CONN16) + "0:0x64" # CH0 ~ CH7 + "0:0x65" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB0 CONN16 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB0 CONN16 (lo) +) + +# ============================================================ +# chip1: SWB0 (CONN16) +# ============================================================ +CH0_VNOM="1.5"; CH0_NET="PVDD1V5_0" +CH1_VNOM="1.8"; CH1_NET="P1V8_4" +CH2_VNOM="3.3"; CH2_NET="PVDD3_3V_SYNTH_LDO_B5" +CH3_VNOM="3.3"; CH3_NET="PVDD3_3V_SYNTH_LDO_A5" +CH4_VNOM="3.3"; CH4_NET="PVDD3_3V_SYNTH_LDO_B4" +CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A4" +CH6_VNOM="3.3"; CH6_NET="P3V3" +CH7_VNOM="0.8"; CH7_NET="PVDD0_8V_T3" +CH8_VNOM="0.75"; CH8_NET="P0V75_DVDD_1" +CH9_VNOM="0.75"; CH9_NET="P0V75_AVDD_1" +CH10_VNOM="1.5"; CH10_NET="P1V5_AVDD_1" +CH11_VNOM="0.9"; CH11_NET="P0V9_AVDD_1" +CH12_VNOM="0.9"; CH12_NET="PVDD0V9_0" +CH13_VNOM="0.9"; CH13_NET="PVDD0V9_1" +CH14_VNOM="0.9"; CH14_NET="PVDD0V9_3" +CH15_VNOM="1.2"; CH15_NET="PVDD1V2_T3" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN13.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN13.conf new file mode 100644 index 0000000..c414909 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN13.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=7 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB1 (CONN13) + "1:0x5C" # CH0 ~ CH7 + "1:0x5D" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB1 CONN13 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB1 CONN13 (lo) +) + +# ============================================================ +# chip1: SWB1 (CONN13) +# ============================================================ +CH0_VNOM="0.75"; CH0_NET="P0V75_DVDD_47" +CH1_VNOM="0.75"; CH1_NET="P0V75_AVDD_47" +CH2_VNOM="1.5"; CH2_NET="P1V5_AVDD_47" +CH3_VNOM="0.9"; CH3_NET="P0V9_AVDD_47" +CH4_VNOM="1.8"; CH4_NET="P1V8_1" +CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A3" +CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B1" +CH7_VNOM="1.8"; CH7_NET="P1V8_3" +CH8_VNOM="1.8"; CH8_NET="P1V8_DVDDIO_3" +CH9_VNOM="0.75"; CH9_NET="P0V75_DVDD_39" +CH10_VNOM="0.75"; CH10_NET="P0V75_AVDD_39" +CH11_VNOM="1.5"; CH11_NET="P1V5_AVDD_39" +CH12_VNOM="0.9"; CH12_NET="P0V9_AVDD_39" +CH13_VNOM="1.5"; CH13_NET="PVDD1V5_2" +CH14_VNOM="1.8"; CH14_NET="PVDD1V8_DUT" +CH15_VNOM="1.2"; CH15_NET="PVDD_MDIO" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN14.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN14.conf new file mode 100644 index 0000000..b85fdc4 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN14.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=9 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB1 (CONN14) + "1:0x5E" # CH0 ~ CH7 + "1:0x5F" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB1 CONN14 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB1 CONN14 (lo) +) + +# ============================================================ +# chip1: SWB1 (CONN14) +# ============================================================ +CH0_VNOM="0.75"; CH0_NET="P0V75_AVDD_7" +CH1_VNOM="1.5"; CH1_NET="P1V5_AVDD_7" +CH2_VNOM="0.9"; CH2_NET="P0V9_AVDD_7" +CH3_VNOM="1.8"; CH3_NET="P1V8_5" +CH4_VNOM="1.8"; CH4_NET="P1V8_2" +CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_B2" +CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_A2" +CH7_VNOM="3.3"; CH7_NET="PVDD3_3V_SYNTH_LDO_A1" +CH8_VNOM="1.5"; CH8_NET="PVDD1V5_TSC" +CH9_VNOM="1.5"; CH9_NET="PVDD1V5_ANLG" +CH10_VNOM="-"; CH10_NET="NC" +CH11_VNOM="-"; CH11_NET="NC" +CH12_VNOM="1.5"; CH12_NET="PVDD1V5_1" +CH13_VNOM="-"; CH13_NET="NC" +CH14_VNOM="1.8"; CH14_NET="P1V8_DVDDIO_1" +CH15_VNOM="0.75"; CH15_NET="P0V75_DVDD_7" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN15.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN15.conf new file mode 100644 index 0000000..97eef1b --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN15.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=7 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB1 (CONN15) + "1:0x62" # CH0 ~ CH7 + "1:0x63" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB1 CONN15 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB1 CONN15 (lo) +) + +# ============================================================ +# chip1: SWB1 (CONN15) +# ============================================================ +CH0_VNOM="1.5"; CH0_NET="P1V5_AVDD_55" +CH1_VNOM="0.9"; CH1_NET="P0V9_AVDD_55" +CH2_VNOM="0.75"; CH2_NET="P0V75_DVDD_63" +CH3_VNOM="0.75"; CH3_NET="P0V75_AVDD_63" +CH4_VNOM="1.5"; CH4_NET="P1V5_AVDD_63" +CH5_VNOM="0.9"; CH5_NET="P0V9_AVDD_63" +CH6_VNOM="3.3"; CH6_NET="PVDD3_3V_SYNTH_LDO_B3" +CH7_VNOM="1.5"; CH7_NET="PVDD1V5_3" +CH8_VNOM="0.85"; CH8_NET="P0V85_STBY" +CH9_VNOM="1.8"; CH9_NET="P1V8_STBY" +CH10_VNOM="-"; CH10_NET="NC" +CH11_VNOM="3.3"; CH11_NET="P3V3_STBY" +CH12_VNOM="0.9"; CH12_NET="PVDD0V9_2" +CH13_VNOM="0.75"; CH13_NET="P0V75_DVDD_55" +CH14_VNOM="0.75"; CH14_NET="P0V75_AVDD_55" +CH15_VNOM="1.8"; CH15_NET="P1V8_DVDDIO_4" diff --git a/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN16.conf b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN16.conf new file mode 100644 index 0000000..a620a77 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings/Blanton_SWB1_CONN16.conf @@ -0,0 +1,52 @@ +# Blanton Channel Settings +# Format: CH_VNOM=voltage CH_NET=net_name +# +# Channel numbering (Script Channel, per Blanton_Margin_List): +# ch_global / 8 -> CHIPS index (0~17) +# ch_global % 8 -> page within LTC2977 (0~7) +# One LTC2980 = two LTC2977 (8ch each), controlled via 2 I2C addresses. + +# --- SWB transport (added): this LTC2980 sits behind the CB FPGA F3 I2C; reach +# it with cb_pmbus, not i2cset. CB_I2C_CH = FPGA I2C channel for this CONN. --- +TRANSPORT="swb" +CB_I2C_CH=9 + +# --- I2C Configuration --- + +# Format: "bus:address" (8 channels per entry / per LTC2977) +CHIPS=( + # chip1: SWB1 (CONN16) + "1:0x64" # CH0 ~ CH7 + "1:0x65" # CH8 ~ CH15 +) + +# Pre-commands to run before accessing each chip (empty = none) +# Multiple commands separated by ; +CHIP_PRE_CMD=( + "" # SWB1 CONN16 (lo) +) + +# Post-commands to run after accessing each chip (optional, empty = none) +CHIP_POST_CMD=( + "" # SWB1 CONN16 (lo) +) + +# ============================================================ +# chip1: SWB1 (CONN16) +# ============================================================ +CH0_VNOM="1.5"; CH0_NET="PVDD1V5_0" +CH1_VNOM="1.8"; CH1_NET="P1V8_4" +CH2_VNOM="3.3"; CH2_NET="PVDD3_3V_SYNTH_LDO_B5" +CH3_VNOM="3.3"; CH3_NET="PVDD3_3V_SYNTH_LDO_A5" +CH4_VNOM="3.3"; CH4_NET="PVDD3_3V_SYNTH_LDO_B4" +CH5_VNOM="3.3"; CH5_NET="PVDD3_3V_SYNTH_LDO_A4" +CH6_VNOM="3.3"; CH6_NET="P3V3" +CH7_VNOM="0.8"; CH7_NET="PVDD0_8V_T3" +CH8_VNOM="0.75"; CH8_NET="P0V75_DVDD_1" +CH9_VNOM="0.75"; CH9_NET="P0V75_AVDD_1" +CH10_VNOM="1.5"; CH10_NET="P1V5_AVDD_1" +CH11_VNOM="0.9"; CH11_NET="P0V9_AVDD_1" +CH12_VNOM="0.9"; CH12_NET="PVDD0V9_0" +CH13_VNOM="0.9"; CH13_NET="PVDD0V9_1" +CH14_VNOM="0.9"; CH14_NET="PVDD0V9_3" +CH15_VNOM="1.2"; CH15_NET="PVDD1V2_T3" diff --git a/src/Script_ABC_Blanton/Blanton_Script/blanton_cb_i2c.sh b/src/Script_ABC_Blanton/Blanton_Script/blanton_cb_i2c.sh new file mode 100644 index 0000000..c4e5d0f --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/blanton_cb_i2c.sh @@ -0,0 +1,444 @@ +#!/usr/bin/env bash +# ============================================================================= +# blanton_cb_i2c.sh -- CB FPGA (F3) I2C / PMBus over the OpenCores I2C master +# ============================================================================= +# Version History: +# V0.1.0 2026-06-16 CB sibling of blanton_icb_i2c.sh. Same OpenCores I2C +# handshake, but the I2C block lives in CB FPGA *Function 3* +# register space (base 0x300, stride 0x20, Ch0..Ch17), and +# is reached via cb_fpga 3 (direct PCIe BAR -> .3/resource0). +# ============================================================================= +# +# IMPORTANT (vs the hand-written cb_fpga.md pcimem commands): +# * The CB I2C channels are on PCI **Function 3**, so the sysfs file is +# .../0000:02:00.3/resource0 (NOT .0). cb_fpga 3 uses FUNCT3_RES for this. +# * This tool uses **Repeated START** for reads (write reg pointer with WR only, +# no STOP, then Sr + slave|R) so it works for the SMBus/PMBus parts (VRM, +# EFUSE) as well as plain register parts. STOP+START only works for the latter. +# * Slave addresses are 7-bit here. The spec lists 8-bit pairs (e.g. MAX31790 +# "0x40/0x41" -> 7-bit 0x20; TCA9546 "0xE8/0xE9" -> 7-bit 0x74). Divide by 2. +# +# CB FPGA F3 I2C channels (base 0x300, stride 0x20) -- 7-bit addrs in (...): +# Ch0 0x300 SWB_0: TCA9546 mux (0x74), M0.C0 temp sensor, ... +# Ch1 0x320 SWB_1: TCA9546 mux (0x74), ... +# Ch2 0x340 SWB_0: SWB_FPGA (0x40), IO Exp PCA9555 (0x24), ... +# Ch3 0x360 SWB_1: SWB_FPGA (0x40), PCA9555 (0x24), ... +# Ch4 0x380 SWB_0: M1 TCA9546 mux (0x74), Clk Gen SI5..., ... +# Ch5 0x3A0 SWB_1: M1 TCA9546 mux (0x74), ... +# Ch6 0x3C0 SWB_0: VRM M29816 (0x20), VRM M2985B (0x21), ... [PMBus] +# Ch7 0x3E0 SWB_1: VRM M29816 (0x20), VRM M2985B (0x21), ... [PMBus] +# Ch8 0x400 SWB_0: VRM M2985B (0x25), M2985B (0x26), ... [PMBus] +# Ch9 0x420 SWB_1: VRM M2985B (0x25), M2985B (0x26), ... [PMBus] +# Ch10 0x440 M0 TCA9543 mux (0x70), M0.C0 Clk Buf 9DBL0452, ... +# Ch11 0x460 Fan Ctrl MAX31790 (0x20) +# Ch12 0x480 ADC leakage ADC128D818 (0x1F) +# Ch13 0x4A0 NFC SM-MFAD4-C02 (0x28) +# Ch14 0x4C0 M1 TCA9543 mux (0x70), M1.C0 QSFP28.P1 xcvr, ... +# Ch15 0x4E0 Fan1/2 EFUSE STEF48H28 (0x10/0x11), ... [PMBus-ish] +# Ch16 0x500 1G PHY I210 Ethernet ctrlr (0x49) +# Ch17 0x520 Chassis EEPROM (0x28..0x29), Diag EEPROM (0x2B), ... +# (slave 7-bit addrs derived from the 8-bit pairs in the register map; verify +# against the device datasheet / your board before driving writes.) +# +# Per-channel register layout (offset from channel base): +# +0x00 I2C_PRSCL_LO +0x04 I2C_PRSCL_HI +0x08 I2C_CTRL (bit7 MOD_EN) +# +0x0C I2C_TX(W)/I2C_RX(R) +0x10 I2C_CMD(W)/I2C_STAT(R) +# +0x14 I2C_MUX_SEL +0x18 I2C_RST (0xD) +0x1C SEM +# CMD : STA=0x80 STO=0x40 RD=0x20 WR=0x10 ACK=0x08(1=NACK) IACK=0x01 +# STAT: RX_ACK=0x80(1=NACK) BUSY=0x40 ARB_LOST=0x20 TIP=0x02 INT_FLAG=0x01 +# Prescale = (in_clk/(5*scl))-1 @75MHz: 0x88=100kHz, 0x24=400kHz +# +# Usage: +# source blanton_fpga_pcimem.sh # provides cb_fpga / fpga_debug +# source blanton_cb_i2c.sh +# cb_i2c_init 11 # Ch11 (Fan Ctrl) @100kHz +# cb_i2c_scan 11 +# cb_i2c_read 11 0x20 0x01 1 # MAX31790 (7-bit 0x20) reg 0x01 +# cb_pmbus_read 6 0x20 0x8B 2 # Ch6 VRM READ_VOUT +# ============================================================================= + +# --- Pull in the register-access backend (cb_fpga) if not present ----------- +if ! declare -F cb_fpga >/dev/null 2>&1; then + _CBI2C_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" + if [ -n "$_CBI2C_DIR" ] && [ -f "$_CBI2C_DIR/blanton_fpga_pcimem.sh" ]; then + # shellcheck source=/dev/null + source "$_CBI2C_DIR/blanton_fpga_pcimem.sh" + else + echo -e "[\033[33mWARN\033[0m] blanton_cb_i2c.sh: cb_fpga() not found." >&2 + echo " source blanton_fpga_pcimem.sh first (provides cb_fpga)." >&2 + fi +fi + +# === CB I2C geometry ========================================================= +CBI2C_FN=3 # CB PCI Function hosting the I2C block +CBI2C_BASE=0x300 # channel 0 base offset (relative to F3 resource0) +CBI2C_CH_STRIDE=0x20 +CBI2C_CH_MAX=17 + +# Per-channel register offsets +_CBI2C_PRSCL_LO=0x00 +_CBI2C_PRSCL_HI=0x04 +_CBI2C_CTRL=0x08 +_CBI2C_TX=0x0C +_CBI2C_RX=0x0C +_CBI2C_CMD=0x10 +_CBI2C_STAT=0x10 +_CBI2C_MUX_SEL=0x14 +_CBI2C_RST=0x18 +_CBI2C_SEM=0x1C + +# I2C_CTRL_REG / CMD / STAT bits +_CBI2C_EN=0x80 +_CBI2C_STA=0x80 +_CBI2C_STO=0x40 +_CBI2C_RD=0x20 +_CBI2C_WR=0x10 +_CBI2C_NACK=0x08 +_CBI2C_RXACK=0x80 +_CBI2C_TIP=0x02 +_CBI2C_RST_VAL=0xD + +# Defaults +CB_I2C_PRESCALE_LO="${CB_I2C_PRESCALE_LO:-0x88}" # 100 kHz @ 75 MHz +CB_I2C_PRESCALE_HI="${CB_I2C_PRESCALE_HI:-0x00}" +CB_I2C_AUTO_INIT="${CB_I2C_AUTO_INIT:-1}" +CB_I2C_TIP_POLL_MAX="${CB_I2C_TIP_POLL_MAX:-100}" + +# --- External I2C-mux RESET control (verified on COM34, 2026-06-16) ---------- +# The TCA9543 muxes on CH10 (M0) and CH14 (M1) have an FPGA-driven, active-low +# RESET line. On power-up / FPGA reload the FPGA holds them in reset, so 0x70 +# does NOT ACK on the root bus and all downstream legs are unreachable. +# +# The control is a GLOBAL register in CB FPGA *Function 0*, offset 0x7D4 +# (I2C_MUX_RST_REG) -- NOT the per-channel I2C_MUX_SEL_REG (+0x14) which is a +# device-select and does nothing to the RESET pin. Per bit: 1 = release, +# 0 = hold-in-reset. Observed default 0xDD (bit1=CH10 mux, bit5=CH14 mux held). +# Writing 0xFF releases all external muxes (normal operating state). This value +# is volatile and is lost on the next power cycle / FPGA reload. +CBI2C_MUX_RST_FN="${CBI2C_MUX_RST_FN:-0}" +CBI2C_MUX_RST_OFF="${CBI2C_MUX_RST_OFF:-0x7D4}" + +# Channels whose root bus carries an external mux that hangs off the RESET reg. +# CH10/CH14 = TCA9543; CH0/1/4/5 = TCA9546 (SWB/M1) per the channel map above. +CBI2C_MUX_CHANNELS="${CBI2C_MUX_CHANNELS:-0 1 4 5 10 14}" + +# Auto-release external mux RESET before scanning / mux-writing a mux channel. +CB_I2C_AUTO_MUX_RST="${CB_I2C_AUTO_MUX_RST:-1}" + +# --- Single FPGA register read/write via cb_fpga [data] ---------- +# _cbi2c_reg [data] data present = write, absent = read (echo hex) +_cbi2c_reg() { + local off="$1" data="${2:-}" + if [ -n "$data" ]; then cb_fpga "$CBI2C_FN" "$off" "$data"; else cb_fpga "$CBI2C_FN" "$off"; fi +} + +# Channel base absolute offset +_cbi2c_chan_base() { + local ch="$1" + if (( ch < 0 || ch > CBI2C_CH_MAX )); then + echo "blanton_cb_i2c: ch must be 0..$CBI2C_CH_MAX" >&2; return 1 + fi + printf '0x%X' $(( CBI2C_BASE + ch * CBI2C_CH_STRIDE )) +} + +# Normalize a register read-back to a number string ("0x...." -> 0x....) +_cbi2c_num() { local v="$1"; [[ "$v" =~ (0[xX][0-9a-fA-F]+) ]] && echo "${BASH_REMATCH[1]}" || echo "0"; } + +# Write CMD then poll STAT (same offset) until TIP clears; echo final status hex +_cbi2c_cmd_wait() { + local cmd_off="$1" cmd_val="$2" i status + _cbi2c_reg "$cmd_off" "$cmd_val" >/dev/null + for (( i=0; i&2 + printf '0x%X' "${status:-0}"; return 1 +} + +# Check RX_ACK in status (bit7). 0 = ACK, 1 = NACK -> return 1 +_cbi2c_check_ack() { + local status; status=$(_cbi2c_num "$1") + (( (status & _CBI2C_RXACK) != 0 )) && return 1 || return 0 +} + +# === Public: init / reset / semaphore / mux-sel ============================= + +# cb_i2c_init [prescale_lo] [prescale_hi] +cb_i2c_init() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_init [prescale_lo] [prescale_hi]"; return 1; } + local ch="$1" lo="${2:-$CB_I2C_PRESCALE_LO}" hi="${3:-$CB_I2C_PRESCALE_HI}" base + base=$(_cbi2c_chan_base "$ch") || return 1 + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_CTRL)))" 0x00 >/dev/null # disable + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_PRSCL_LO)))" "$lo" >/dev/null + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_PRSCL_HI)))" "$hi" >/dev/null + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_CTRL)))" "$_CBI2C_EN" >/dev/null # enable + return 0 +} + +# cb_i2c_reset +cb_i2c_reset() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_reset "; return 1; } + local ch="$1" base; base=$(_cbi2c_chan_base "$ch") || return 1 + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_RST)))" "$_CBI2C_RST_VAL" >/dev/null + echo " [RST] ch=$ch local I2C controller reset (0xD)" +} + +# cb_i2c_sem [status|acquire [val]|release] +cb_i2c_sem() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_sem [status|acquire [val]|release]"; return 1; } + local ch="$1" act="${2:-status}" base off cur + base=$(_cbi2c_chan_base "$ch") || return 1 + off=$(printf '0x%X' $((base + _CBI2C_SEM))) + case "$act" in + status) + cur=$(_cbi2c_num "$(_cbi2c_reg "$off")") + (( (cur & 0xFF) == 0 )) && echo " [SEM] ch=$ch free (0x00)" \ + || printf ' [SEM] ch=%s held (0x%02X)\n' "$ch" $((cur & 0xFF)) ;; + acquire) + local val="${3:-0x01}" + cur=$(_cbi2c_num "$(_cbi2c_reg "$off")") + if (( (cur & 0xFF) != 0 )); then + printf ' [SEM] ch=%s already held (0x%02X) -- not acquired\n' "$ch" $((cur & 0xFF)); return 1 + fi + _cbi2c_reg "$off" "$val" >/dev/null + cur=$(_cbi2c_num "$(_cbi2c_reg "$off")") + (( (cur & 0xFF) != 0 )) && printf ' [SEM] ch=%s acquired (0x%02X)\n' "$ch" $((cur & 0xFF)) \ + || { echo " [SEM] ch=$ch acquire failed"; return 1; } ;; + release) + _cbi2c_reg "$off" 0x00 >/dev/null; echo " [SEM] ch=$ch released (0x00)" ;; + *) echo "Usage: cb_i2c_sem [status|acquire [val]|release]"; return 1 ;; + esac +} + +# cb_i2c_muxsel -- write I2C_MUX_SEL_REG (FPGA drives ext mux pins) +cb_i2c_muxsel() { + [[ $# -lt 2 ]] && { echo "Usage: cb_i2c_muxsel "; return 1; } + local ch="$1" sel="$2" base; base=$(_cbi2c_chan_base "$ch") || return 1 + _cbi2c_reg "$(printf '0x%X' $((base + _CBI2C_MUX_SEL)))" "$sel" >/dev/null + printf ' [MUXSEL] ch=%s DEV_SEL <= 0x%02X\n' "$ch" $((sel & 0xFF)) +} + +# cb_i2c_mux_reset_release -- de-assert ALL external mux RESET lines (F0 0x7D4 <= 0xFF) +# Global, not per-channel. Volatile: lost on power cycle / FPGA reload. +cb_i2c_mux_reset_release() { + cb_fpga "$CBI2C_MUX_RST_FN" "$CBI2C_MUX_RST_OFF" 0xFF >/dev/null + local rb; rb=$(_cbi2c_num "$(cb_fpga "$CBI2C_MUX_RST_FN" "$CBI2C_MUX_RST_OFF")") + printf ' [MUX-RST] I2C_MUX_RST_REG (F%s %s) <= 0xFF (all external muxes released, readback %s)\n' \ + "$CBI2C_MUX_RST_FN" "$CBI2C_MUX_RST_OFF" "$rb" +} + +# _cbi2c_is_mux_channel -- 0 (true) if ch is in CBI2C_MUX_CHANNELS +_cbi2c_is_mux_channel() { + local ch="$1" c + for c in $CBI2C_MUX_CHANNELS; do [[ "$c" == "$ch" ]] && return 0; done + return 1 +} + +# _cbi2c_auto_mux_rst -- release external mux RESET if ch is a mux channel +_cbi2c_auto_mux_rst() { + [[ "$CB_I2C_AUTO_MUX_RST" == "1" ]] || return 0 + _cbi2c_is_mux_channel "$1" || return 0 + cb_i2c_mux_reset_release +} + +# === Core transfers (Repeated START, SMBus/PMBus compatible) ================= + +# _cbi2c_xfer_read echoes space-separated hex bytes +_cbi2c_xfer_read() { + local ch="$1" slave="$2" reg="$3" n="$4" base tx cmd rx status i last cmdv val out="" + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + rx=$(printf '0x%X' $((base + _CBI2C_RX))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (W) 0x$(printf %02X "$slave")" >&2; return 1; } + + _cbi2c_reg "$tx" "$(printf '0x%X' $((reg & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR)))") # WR only, no STOP + _cbi2c_check_ack "$status" || { echo "ERR: NACK on reg 0x$(printf %02X "$reg")" >&2; return 1; } + + _cbi2c_reg "$tx" "$(printf '0x%X' $(( ((slave << 1) | 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") # Repeated START + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (R) 0x$(printf %02X "$slave")" >&2; return 1; } + + for (( i=0; i/dev/null + val=$(_cbi2c_num "$(_cbi2c_reg "$rx")") + out+="$(printf '0x%02X ' $((val & 0xFF)))" + done + echo "${out% }" +} + +# _cbi2c_xfer_write [byte...] +_cbi2c_xfer_write() { + local ch="$1" slave="$2" reg="$3"; shift 3 + local base tx cmd status b last cmdv n=$# idx=0 + [[ $n -lt 1 ]] && { echo "ERR: no data bytes" >&2; return 1; } + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (W) 0x$(printf %02X "$slave")" >&2; return 1; } + + _cbi2c_reg "$tx" "$(printf '0x%X' $((reg & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on reg 0x$(printf %02X "$reg")" >&2; return 1; } + + for b in "$@"; do + idx=$((idx+1)); last=$(( idx == n )) + _cbi2c_reg "$tx" "$(printf '0x%X' $(( $((b)) & 0xFF )))" >/dev/null + if (( last )); then cmdv=$(( _CBI2C_WR | _CBI2C_STO )); else cmdv=$(( _CBI2C_WR )); fi + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' "$cmdv")") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on data byte #$idx" >&2; return 1; } + done + return 0 +} + +# _cbi2c_xfer_cmd_only -- START+W, cmd byte, STOP (no data) +_cbi2c_xfer_cmd_only() { + local ch="$1" slave="$2" cc="$3" base tx cmd status + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on slave addr (W) 0x$(printf %02X "$slave")" >&2; return 1; } + _cbi2c_reg "$tx" "$(printf '0x%X' $((cc & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR | _CBI2C_STO)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on cmd 0x$(printf %02X "$cc")" >&2; return 1; } + return 0 +} + +# === Public: generic I2C ===================================================== + +# cb_i2c_read [nbytes] +cb_i2c_read() { + [[ $# -lt 3 ]] && { echo "Usage: cb_i2c_read [nbytes]"; return 1; } + local ch="$1" slave=$(( $2 )) reg=$(( $3 )) n="${4:-1}" bytes + bytes=$(_cbi2c_xfer_read "$ch" "$slave" "$reg" "$n") || return 1 + printf ' [I2C-R] ch=%s slave=0x%02X reg=0x%02X => [%s]\n' "$ch" "$slave" "$reg" "$bytes" +} + +# cb_i2c_write [byte...] +cb_i2c_write() { + [[ $# -lt 4 ]] && { echo "Usage: cb_i2c_write [byte...]"; return 1; } + local ch="$1" slave=$(( $2 )) reg=$(( $3 )); shift 3 + _cbi2c_xfer_write "$ch" "$slave" "$reg" "$@" || return 1 + printf ' [I2C-W] ch=%s slave=0x%02X reg=0x%02X <= [%s]\n' "$ch" "$slave" "$reg" "$*" +} + +# cb_i2c_muxwrite -- raw 1-byte write, no reg (TCA954x) +cb_i2c_muxwrite() { + [[ $# -lt 3 ]] && { echo "Usage: cb_i2c_muxwrite "; return 1; } + local ch="$1" slave=$(( $2 )) val=$(( $3 )) base tx cmd status + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + [[ "$CB_I2C_AUTO_INIT" == "1" ]] && cb_i2c_init "$ch" >/dev/null + _cbi2c_auto_mux_rst "$ch" + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (slave << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on mux addr 0x$(printf %02X "$slave")" >&2; return 1; } + _cbi2c_reg "$tx" "$(printf '0x%X' $((val & 0xFF)))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_WR | _CBI2C_STO)))") + _cbi2c_check_ack "$status" || { echo "ERR: NACK on mux ctrl byte" >&2; return 1; } + printf ' [MUX-W] ch=%s mux=0x%02X <= 0x%02X\n' "$ch" "$slave" "$val" +} + +# cb_i2c_scan -- probe 0x08..0x77, report slaves that ACK +cb_i2c_scan() { + [[ $# -lt 1 ]] && { echo "Usage: cb_i2c_scan "; return 1; } + local ch="$1" base tx cmd a status found="" + base=$(_cbi2c_chan_base "$ch") || return 1 + tx=$(printf '0x%X' $((base + _CBI2C_TX))) + cmd=$(printf '0x%X' $((base + _CBI2C_CMD))) + cb_i2c_init "$ch" >/dev/null + _cbi2c_auto_mux_rst "$ch" + for (( a=0x08; a<=0x77; a++ )); do + _cbi2c_reg "$tx" "$(printf '0x%X' $(( (a << 1) & 0xFF )))" >/dev/null + status=$(_cbi2c_cmd_wait "$cmd" "$(printf '0x%X' $((_CBI2C_STA | _CBI2C_WR | _CBI2C_STO)))") + _cbi2c_check_ack "$status" && found+="$(printf '0x%02X ' "$a")" + done + [[ -n "$found" ]] && echo " [SCAN] ch=$ch found: ${found% }" || echo " [SCAN] ch=$ch no devices" +} + +# === Public: PMBus (== SMBus; command code + Repeated START read) ============ + +# cb_pmbus_read [nbytes] (default 2 bytes, LSB first) +cb_pmbus_read() { + [[ $# -lt 3 ]] && { echo "Usage: cb_pmbus_read [nbytes]"; return 1; } + local ch="$1" slave=$(( $2 )) cc=$(( $3 )) n="${4:-2}" bytes + bytes=$(_cbi2c_xfer_read "$ch" "$slave" "$cc" "$n") || return 1 + if [[ "$n" == "2" ]]; then + local b0 b1 word; b0=$(( $(echo "$bytes" | awk '{print $1}') )); b1=$(( $(echo "$bytes" | awk '{print $2}') )) + word=$(( b0 | (b1 << 8) )) + printf ' [PMB-R] ch=%s slave=0x%02X cmd=0x%02X => 0x%04X raw=[%s] linear16=%s\n' \ + "$ch" "$slave" "$cc" "$word" "$bytes" "$(cb_pmbus_linear16 "$word")" + else + printf ' [PMB-R] ch=%s slave=0x%02X cmd=0x%02X => [%s]\n' "$ch" "$slave" "$cc" "$bytes" + fi +} + +# cb_pmbus_write [data byte...] (no byte = send-byte) +cb_pmbus_write() { + [[ $# -lt 3 ]] && { echo "Usage: cb_pmbus_write [data byte...]"; return 1; } + local ch="$1" slave=$(( $2 )) cc=$(( $3 )); shift 3 + if [[ $# -eq 0 ]]; then + _cbi2c_xfer_cmd_only "$ch" "$slave" "$cc" || return 1 + printf ' [PMB-W] ch=%s slave=0x%02X cmd=0x%02X <= (send-byte)\n' "$ch" "$slave" "$cc"; return 0 + fi + _cbi2c_xfer_write "$ch" "$slave" "$cc" "$@" || return 1 + printf ' [PMB-W] ch=%s slave=0x%02X cmd=0x%02X <= [%s]\n' "$ch" "$slave" "$cc" "$*" +} + +# cb_pmbus_linear16 +cb_pmbus_linear16() { + local word=$(( $1 & 0xFFFF )) + awk -v w="$word" 'BEGIN{ + e=int(w/2048)%32; if(e>15)e-=32; + m=w%2048; if(m>1023)m-=2048; + printf "%.4f", m * (2.0 ^ e); + }' +} + +# === Help ==================================================================== +blanton_cb_i2c_help() { + echo -e "\033[1mblanton_cb_i2c.sh - CB FPGA (F3) I2C / PMBus over OpenCores I2C master\033[0m" + echo "" + echo -e " Backend: \033[36mcb_fpga $CBI2C_FN\033[0m (direct PCIe BAR -> .3/resource0), base 0x300, Ch0..$CBI2C_CH_MAX" + echo "" + echo -e "\033[1mSetup\033[0m" + echo -e " \033[33mcb_i2c_init\033[0m [pre_lo] [pre_hi] prescale + enable (def 0x88/0x00 = 100kHz)" + echo -e " \033[33mcb_i2c_reset\033[0m LCL_RST=0xD" + echo -e " \033[33mcb_i2c_sem\033[0m [status|acquire [v]|release]" + echo -e " \033[33mcb_i2c_muxsel\033[0m write I2C_MUX_SEL_REG" + echo -e " \033[33mcb_i2c_mux_reset_release\033[0m de-assert ALL ext mux RESET (F0 0x7D4<=0xFF)" + echo "" + echo -e "\033[1mGeneric I2C\033[0m" + echo -e " \033[33mcb_i2c_scan\033[0m " + echo -e " \033[33mcb_i2c_read\033[0m [nbytes]" + echo -e " \033[33mcb_i2c_write\033[0m [byte...]" + echo -e " \033[33mcb_i2c_muxwrite\033[0m raw 1-byte (TCA954x)" + echo "" + echo -e "\033[1mPMBus / SMBus\033[0m" + echo -e " \033[33mcb_pmbus_read\033[0m [nbytes] (def 2, LE word + linear16)" + echo -e " \033[33mcb_pmbus_write\033[0m [byte...]" + echo -e " \033[33mcb_pmbus_linear16\033[0m " + echo "" + echo -e " Slave = 7-bit (tool shifts). Spec lists 8-bit pairs -> divide by 2." + echo -e " \033[33mfpga_debug on\033[0m to see every underlying pcimem command." +} + +blanton_cb_i2c_help diff --git a/src/Script_ABC_Blanton/Blanton_Script/blanton_fpga_pcimem.sh b/src/Script_ABC_Blanton/Blanton_Script/blanton_fpga_pcimem.sh new file mode 100644 index 0000000..12d8d77 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/blanton_fpga_pcimem.sh @@ -0,0 +1,277 @@ +#!/usr/bin/env bash +# ============================================================================= +# blanton_fpga_pcimem.sh -- pcimem backend, sysfs resource file + relative offset +# ============================================================================= +# Version History: +# V1.3.0 2026-06-12 pcimem variant (SONiC hardware). memtool variant: blanton_fpga_memtool.sh +# Version number kept in sync with blanton_fpga_memtool.sh +# V1.4.0 2026-06-15 Fix: VSPI window bases pointed at the VSPI-Flash block +# (0x340/0x380/0x3C0/0x400, config-flash channel) so register +# reads returned 0; corrected to the VSPI register block +# (PMC 0x640 / ICB 0x680 / SWB0 0x6C0 / SWB1 0x700) +# Add: _vspi_fnwarn guard - warns when PMC/ICB/SWB are called with +# cb_fpga-style " " (a read turning into a write) +# Change: suppress pcimem write stdout noise (mmap/Written lines) +# Docs: comments/help translated to English (ASCII-only for SONiC console) +# V1.4.1 2026-06-23 Fix: BDF in example auto-detect was wrong (02:00 vs 04:00); corrected to match the lspci example. +# V1.4.2 2026-08-10 Change: FUNCT0..3_RES BDF updated 0000:04:00.x -> 0000:03:00.x (current unit's enumeration). +# V1.4.3 2026-08-12 Change: FUNCT0..3_RES BDF updated 0000:03:00.x -> 0000:05:00.x (current unit's enumeration). +# V1.4.4 2026-08-12 Change: FUNCT0..3_RES BDF back to 0000:03:00.x for the DUT on COM36. +# NOTE: this BDF is per-unit. Check with +# lspci -Dnn | grep -i fpga or +# ls -d /sys/bus/pci/devices/0000:*:00.3 +# and edit the four lines below if it differs. +# ============================================================================= +# +# SONiC hardware has no memtool / devmem, but it has pcimem. pcimem mmaps the PCI +# sysfs resource file directly and takes "resource file + offset relative to BAR +# start", not an absolute physical address. +# +# pcimem { sysfile } { offset } [ type*count [ data ] ] +# sysfile : sysfs file for the pci resource (e.g. .../resource0) +# offset : offset into pci memory region +# type : [b]yte, [h]alfword, [w]ord, [d]ouble-word +# *count : number of items (w*100 dump 100 words) +# data : data to be written +# +# This tool always accesses as word (w, 32-bit). +# +# After sourcing this file the following functions are available: +# cb_fpga [data] +# pmc_fpga [data] +# icb_fpga [data] +# swb0_fpga [data] +# swb1_fpga [data] +# +# data present = write, absent = read. +# Usage: source blanton_fpga_pcimem.sh + +# === CB FPGA PCIe resource file (sysfs) === +# Use lspci -D to find the BDF (domain:bus:dev.fn); resource0 is the sysfs mapping of BAR0. +# e.g. lspci -Dnn | grep -i fpga -> 0000:02:00.0 ... +# memtool variant fills in the BAR value; pcimem variant fills in the resource file +# path instead (offset becomes relative to BAR). +FUNCT0_RES=/sys/bus/pci/devices/0000:03:00.0/resource0 +FUNCT1_RES=/sys/bus/pci/devices/0000:03:00.1/resource0 +FUNCT2_RES=/sys/bus/pci/devices/0000:03:00.2/resource0 +FUNCT3_RES=/sys/bus/pci/devices/0000:03:00.3/resource0 + +# Auto-detect example (uncomment to use; needs the FPGA's BDF prefix): +# _BDF=0000:02:00 +# FUNCT0_RES=/sys/bus/pci/devices/${_BDF}.0/resource0 +# FUNCT1_RES=/sys/bus/pci/devices/${_BDF}.1/resource0 +# FUNCT2_RES=/sys/bus/pci/devices/${_BDF}.2/resource0 +# FUNCT3_RES=/sys/bus/pci/devices/${_BDF}.3/resource0 + +# === VSPI window base offset (relative to CB Function 2 resource0 start) === +# NOTE: CB.F2 has TWO near-identical VSPI register blocks (see spec register map): +# - VSPI-Flash-* @ 0x340/0x380/0x3C0/0x400 -> accesses the remote FPGA's CONFIG FLASH +# - VSPI-* @ 0x640/0x680/0x6C0/0x700 -> accesses the remote FPGA's REGISTERS +# This tool reads/writes remote registers, so it uses the VSPI-* block (0x640+). +# The VSPI-Flash bases are kept below (commented) in case flash access is needed later. +VSPI_PMC_BASE=0x640 +VSPI_ICB_BASE=0x680 +VSPI_SWB0_BASE=0x6C0 +VSPI_SWB1_BASE=0x700 + +# VSPI-Flash window bases (config-flash access, not register access): +# VSPI_FLASH_PMC_BASE=0x340 +# VSPI_FLASH_ICB_BASE=0x380 +# VSPI_FLASH_SWB0_BASE=0x3C0 +# VSPI_FLASH_SWB1_BASE=0x400 + +# === VSPI protocol constants === +_VSPI_CMD_STAT=0x00 +_VSPI_ADDR=0x04 +_VSPI_WR_DATA=0x08 +_VSPI_RD_DATA=0x0C +_VSPI_NEW_CMD=0x01 +_VSPI_READ_W=0x02 +_VSPI_WRITE_W=0x04 +_VSPI_READY_MASK=0x100 +_VSPI_POLL_MAX=200 + +# === pcimem command === +PCIMEM_CMD="${PCIMEM_CMD:-pcimem}" + +# === Debug mode (1=print commands AND execute, 0=execute only) === +DEBUG_MODE=${DEBUG_MODE:-0} + +fpga_debug() { + if [ "${1:-}" = "on" ]; then DEBUG_MODE=1 + elif [ "${1:-}" = "off" ]; then DEBUG_MODE=0 + else [ "$DEBUG_MODE" = "0" ] && DEBUG_MODE=1 || DEBUG_MODE=0; fi + echo -e "[\033[34mINFO\033[0m] DEBUG_MODE=$DEBUG_MODE" +} + +# Wrapper: debug mode prints command (to stderr) AND executes, normal mode executes only. +# On read, returns the parsed hex value (stripping pcimem's mmap noise). +# Usage: _pcimem [data] (data present = write, absent = read) +_pcimem() { + local sysfile="$1" offset="$2" data="${3:-}" + if [[ -n "$data" ]]; then + [ "$DEBUG_MODE" = "1" ] && \ + echo -e "\033[90m[DEBG] $PCIMEM_CMD $sysfile $offset w $data\033[0m" >&2 + # Write output (opened / Target offset / mmap / Written...readback) is never + # parsed -> drop stdout noise; keep stderr so real errors still surface. + $PCIMEM_CMD "$sysfile" "$offset" w "$data" >/dev/null + else + [ "$DEBUG_MODE" = "1" ] && \ + echo -e "\033[90m[DEBG] $PCIMEM_CMD $sysfile $offset w\033[0m" >&2 + # pcimem read prints mmap info + "Value at offset ...: 0xXXXX"; + # take the last 0x... token as the actual read-back value. + $PCIMEM_CMD "$sysfile" "$offset" w | grep -oiE '0x[0-9a-f]+' | tail -1 + fi +} + +# --- Internal VSPI helpers (all hang off CB Function 2's resource0) --- + +_vspi_read() { + local win_off="$1" remote_offset="$2" + local cmd_off add_off rd_off addr_val status i + + cmd_off=$(printf '0x%X' $(( win_off + _VSPI_CMD_STAT ))) + add_off=$(printf '0x%X' $(( win_off + _VSPI_ADDR ))) + rd_off=$(printf '0x%X' $(( win_off + _VSPI_RD_DATA ))) + addr_val=$(printf '0x%08X' $(( (0x0 << 20) | (remote_offset & 0xFFFFF) ))) + + _pcimem "$FUNCT2_RES" "$add_off" "$addr_val" + _pcimem "$FUNCT2_RES" "$cmd_off" $(printf '0x%X' $(( _VSPI_NEW_CMD | _VSPI_READ_W ))) + + for (( i=0; i<_VSPI_POLL_MAX; i++ )); do + status=$(_pcimem "$FUNCT2_RES" "$cmd_off") + if (( ( ${status:-0} & _VSPI_READY_MASK) != 0 )); then + _pcimem "$FUNCT2_RES" "$rd_off" + return 0 + fi + done + echo "ERROR: VSPI read timeout @ offset $remote_offset" >&2 + return 1 +} + +_vspi_write() { + local win_off="$1" remote_offset="$2" data="$3" + local cmd_off add_off wr_off addr_val status i + + cmd_off=$(printf '0x%X' $(( win_off + _VSPI_CMD_STAT ))) + add_off=$(printf '0x%X' $(( win_off + _VSPI_ADDR ))) + wr_off=$(printf '0x%X' $(( win_off + _VSPI_WR_DATA ))) + addr_val=$(printf '0x%08X' $(( (0x0 << 20) | (remote_offset & 0xFFFFF) ))) + + _pcimem "$FUNCT2_RES" "$wr_off" "$data" + _pcimem "$FUNCT2_RES" "$add_off" "$addr_val" + _pcimem "$FUNCT2_RES" "$cmd_off" $(printf '0x%X' $(( _VSPI_NEW_CMD | _VSPI_WRITE_W ))) + + for (( i=0; i<_VSPI_POLL_MAX; i++ )); do + status=$(_pcimem "$FUNCT2_RES" "$cmd_off") + if (( ( ${status:-0} & _VSPI_READY_MASK) != 0 )); then + return 0 + fi + done + echo "ERROR: VSPI write timeout @ offset $remote_offset" >&2 + return 1 +} + +# Guard: PMC/ICB/SWB are single-function; signature is [data], NO fn arg. +# Common pitfall: using cb_fpga's " " form -> 2nd arg becomes data, a read +# turns into a write. If addr is 0~3 (looks like fn) AND data is given, warn and +# confirm; on a non-tty (script) just warn, don't block. +# Usage: _vspi_fnwarn non-zero return = cancel +_vspi_fnwarn() { + local name="$1" addr="$2" data="$3" + [[ -z "$data" ]] && return 0 # read, nothing to warn + case "$addr" in + 0|1|2|3|0x0|0x1|0x2|0x3|0x00|0x01|0x02|0x03) ;; # looks like fn, warn below + *) return 0 ;; # normal offset, allow + esac + echo -e "[\033[33mWARN\033[0m] $name has no fn arg; signature is [data] (NOT cb_fpga's )." >&2 + echo -e " This will WRITE $data to PMC/ICB/SWB offset $addr." >&2 + echo -e " To READ offset $addr, pass a single arg: $name $addr" >&2 + if [ -t 0 ]; then + local ans + read -r -p " Proceed with write anyway? [y/N] " ans + case "$ans" in + y|Y|yes|YES) return 0 ;; + *) echo " Cancelled." >&2; return 1 ;; + esac + fi + return 0 +} + +# === Public functions === + +cb_fpga() { + if [[ $# -lt 2 ]]; then + echo "Usage: cb_fpga [data]"; return 1 + fi + local fn="$1" addr="$2" data="${3:-}" res + case "$fn" in + 0) res=$FUNCT0_RES ;; 1) res=$FUNCT1_RES ;; + 2) res=$FUNCT2_RES ;; 3) res=$FUNCT3_RES ;; + *) echo "cb_fpga: fn must be 0-3" >&2; return 1 ;; + esac + # pcimem offset is relative to BAR start; do not add BAR. + if [[ -z "$data" ]]; then + _pcimem "$res" "$addr" + else + _pcimem "$res" "$addr" "$data" + fi +} + +pmc_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: pmc_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn pmc_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_PMC_BASE" "$addr" + else _vspi_write "$VSPI_PMC_BASE" "$addr" "$data"; fi +} + +icb_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: icb_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn icb_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_ICB_BASE" "$addr" + else _vspi_write "$VSPI_ICB_BASE" "$addr" "$data"; fi +} + +swb0_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: swb0_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn swb0_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_SWB0_BASE" "$addr" + else _vspi_write "$VSPI_SWB0_BASE" "$addr" "$data"; fi +} + +swb1_fpga() { + if [[ $# -lt 1 ]]; then + echo "Usage: swb1_fpga [data]"; return 1 + fi + local addr="$1" data="${2:-}" + _vspi_fnwarn swb1_fpga "$addr" "$data" || return 1 + if [[ -z "$data" ]]; then _vspi_read "$VSPI_SWB1_BASE" "$addr" + else _vspi_write "$VSPI_SWB1_BASE" "$addr" "$data"; fi +} + +blanton_fpga_help() { + echo -e "\033[1mblanton_fpga (pcimem) - FPGA Register Access Tool\033[0m" + echo "" + echo -e "\033[1mUsage:\033[0m" + echo -e " \033[33mcb_fpga\033[0m [data] CB FPGA direct (sysfs resource0)" + echo -e " \033[33mpmc_fpga\033[0m [data] PMC FPGA via VSPI" + echo -e " \033[33micb_fpga\033[0m [data] ICB FPGA via VSPI" + echo -e " \033[33mswb0_fpga\033[0m [data] SWB0 FPGA via VSPI" + echo -e " \033[33mswb1_fpga\033[0m [data] SWB1 FPGA via VSPI" + echo -e " \033[33mfpga_debug\033[0m on|off Toggle debug mode (print commands and execute)" + echo "" + echo -e " Omit [data] to \033[32mread\033[0m, provide [data] to \033[31mwrite\033[0m." + echo -e " Backend: \033[36mpcimem\033[0m (sysfs resource file + relative offset)." + echo -e " Run \033[33mblanton_fpga_help\033[0m to show this message again." +} + +blanton_fpga_help diff --git a/src/Script_ABC_Blanton/Blanton_Script/blanton_icb_vi2c.sh b/src/Script_ABC_Blanton/Blanton_Script/blanton_icb_vi2c.sh new file mode 100644 index 0000000..b36a17e --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/blanton_icb_vi2c.sh @@ -0,0 +1,167 @@ +#!/usr/bin/env bash +# ===================================================================== +# blanton_icb_vi2c.sh V0.1.0 2026-08-10 +# ICB (PDB) I2C through the CB FPGA **VI2C** proxy blocks in CB PCI +# Function 3. Direct BAR access (cb_fpga 3 ) - NO VSPI bridge, so +# this is ~1 pcimem call per register instead of 3+, i.e. much faster +# than blanton_icb_i2c.sh which walks CB F2's VSPI-ICB window. +# +# CB F3 VI2C-ICB channels (stride 0x20), per the FPGA register map: +# Ch0 0x780 VI2C_DEV_ID 0x21 PDB Fan Controller +# Ch1 0x7A0 VI2C_DEV_ID 0x23 PDB EEPROM (FRU) +# Ch2 0x7C0 VI2C_DEV_ID 0x25 PDB external temp sensors +# Ch3 0x7E0 VI2C_DEV_ID 0x27 Hotswap controller [PMBus] +# Ch4 0x800 VI2C_DEV_ID 0x29 Power bricks + EFUSE [PMBus] +# These are the SAME physical buses as ICB I2C Ch0..Ch4 (ICB 0xE00+), +# so a scan here must match blanton_icb_i2c.sh's scan. +# +# Why use this instead of blanton_icb_i2c.sh for data access (DUT 2026-08-10): +# VSPI access is ~18 ms/register -> ~50 ms between I2C byte phases, which +# trips the SMBus 25-35 ms timeout on the Ch2/Ch3/Ch4 devices (they NACK +# the register pointer). CB F3 VI2C is ~3.3 ms/register and stays inside +# the timeout, so all 5 channels are fully usable here. +# Measured: full 5-channel scan 9.4 s here vs 34.0 s over VSPI. +# +# Per-ch: +00 PRSCL_LO +04 PRSCL_HI +08 CTRL(b7 MOD_EN) +# +0C TX/RX +10 CMD/STAT +14 MUX_SEL +18 RST(0xD) +# +1C RSVD <-- VI2C has NO SEM_REG (unlike the native I2C blocks) +# CMD : STA=0x80 STO=0x40 RD=0x20 WR=0x10 ACK=0x08(1=NACK) INT_ACK=0x01 +# STAT: RX_ACK=0x80(1=NACK) BUSY=0x40 ARB_LOST=0x20 TIP=0x02 INT_FLAG=0x01 +# Slave addrs are 7-bit (spec quotes 8-bit pairs -> divide by 2). +# Usage: source blanton_fpga_pcimem.sh ; source blanton_icb_vi2c.sh +# vi2c_scan_all +# ===================================================================== +if ! declare -F cb_fpga >/dev/null 2>&1; then + _VD="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" + [ -f "$_VD/blanton_fpga_pcimem.sh" ] && . "$_VD/blanton_fpga_pcimem.sh" +fi +VI2C_FN=3; VI2C_BASE=0x780; VI2C_STRIDE=0x20; VI2C_CH_MAX=4 +V_EN=0x80; V_STA=0x80; V_STO=0x40; V_RD=0x20; V_WR=0x10; V_NAK=0x08 +V_RXACK=0x80; V_TIP=0x02 +VI2C_PRE_LO=${VI2C_PRE_LO:-0x88}; VI2C_PRE_HI=${VI2C_PRE_HI:-0x00} +VI2C_POLL=${VI2C_POLL:-50} +VI2C_SCAN_FROM=${VI2C_SCAN_FROM:-0x08}; VI2C_SCAN_TO=${VI2C_SCAN_TO:-0x77} +VI2C_CH_DESC=("Fan Controller" "EEPROM/FRU" "Temp sensors" \ + "Hotswap ctrlr" "Power bricks+EFUSE") +VI2C_DEV_ID=(0x21 0x23 0x25 0x27 0x29) + +# --- low level (direct CB F3 BAR access) ---------------------------- +_vr(){ if [ -n "${2:-}" ]; then cb_fpga $VI2C_FN "$1" "$2"; else cb_fpga $VI2C_FN "$1"; fi; } +_vnum(){ [[ "$1" =~ (0[xX][0-9a-fA-F]+) ]] && echo "${BASH_REMATCH[1]}" || echo 0; } +_vbase(){ local c=$1 + if (( c<0 || c>VI2C_CH_MAX )); then echo "ch must be 0..$VI2C_CH_MAX" >&2; return 1; fi + printf '0x%X' $(( VI2C_BASE + c*VI2C_STRIDE )); } +_vwait(){ local o=$1 v=$2 i s + _vr "$o" "$v" >/dev/null + for ((i=0;i&2; printf '0x%X' "${s:-0}"; return 1; } +_vack(){ local s; s=$(_vnum "$1"); (( (s & V_RXACK)!=0 )) && return 1 || return 0; } + +vi2c_init(){ local c=$1 b + b=$(_vbase "$c") || return 1 + _vr $(printf '0x%X' $((b+0x08))) 0x00 >/dev/null + _vr $(printf '0x%X' $((b+0x00))) "${2:-$VI2C_PRE_LO}" >/dev/null + _vr $(printf '0x%X' $((b+0x04))) "${3:-$VI2C_PRE_HI}" >/dev/null + _vr $(printf '0x%X' $((b+0x08))) $V_EN >/dev/null; } +vi2c_reset(){ local c=$1 b; b=$(_vbase "$c") || return 1 + _vr $(printf '0x%X' $((b+0x18))) 0xD >/dev/null; echo " [RST] vi2c ch$c LCL_RST=0xD"; } +vi2c_muxsel(){ local c=$1 b; b=$(_vbase "$c") || return 1 + _vr $(printf '0x%X' $((b+0x14))) "$2" >/dev/null + printf ' [MUXSEL] vi2c ch%s DEV_SEL <= %s\n' "$c" "$2"; } +vi2c_dump(){ [ $# -lt 1 ] && { echo "Usage: vi2c_dump "; return 1; } + local c=$1 b o nm i + b=$(_vbase "$c") || return 1 + nm=(PRSCL_LO PRSCL_HI CTRL RX STAT MUX_SEL RST RSVD); i=0 + printf ' [REGS] vi2c ch%s base=%s (CB F%s)\n' "$c" "$b" "$VI2C_FN" + for o in 0x00 0x04 0x08 0x0C 0x10 0x14 0x18 0x1C; do + printf ' +%s %-9s = %s\n' "$o" "${nm[$i]}" "$(_vnum "$(_vr $(printf '0x%X' $((b+o))))")" + i=$((i+1)) + done; } + +# --- transfers (Repeated START, SMBus/PMBus safe) ------------------- +_vrd(){ local c=$1 s=$2 r=$3 n=$4 b tx cm i st v out="" + b=$(_vbase "$c") || return 1 + tx=$(printf '0x%X' $((b+0x0C))); cm=$(printf '0x%X' $((b+0x10))) + vi2c_init "$c" + _vr $tx $(printf '0x%X' $(( (s<<1) & 0xFF ))) >/dev/null + st=$(_vwait $cm $(printf '0x%X' $((V_STA|V_WR)))); _vack "$st" || { echo "NACK slave-W 0x$(printf %02X $s)" >&2; return 1; } + _vr $tx $(printf '0x%X' $((r & 0xFF))) >/dev/null + st=$(_vwait $cm $(printf '0x%X' $((V_WR)))); _vack "$st" || { echo "NACK reg 0x$(printf %02X $r)" >&2; return 1; } + _vr $tx $(printf '0x%X' $(( ((s<<1)|1) & 0xFF ))) >/dev/null + st=$(_vwait $cm $(printf '0x%X' $((V_STA|V_WR)))); _vack "$st" || { echo "NACK slave-R 0x$(printf %02X $s)" >&2; return 1; } + for ((i=0;i/dev/null + else _vwait $cm $(printf '0x%X' $((V_RD))) >/dev/null; fi + v=$(_vnum "$(_vr $tx)"); out+="$(printf '0x%02X ' $((v & 0xFF)))" + done + echo "${out% }"; } +_vwr(){ local c=$1 s=$2 r=$3; shift 3 + local b tx cm st x n=$# k=0 cv + (( n<1 )) && { echo "no data bytes" >&2; return 1; } + b=$(_vbase "$c") || return 1 + tx=$(printf '0x%X' $((b+0x0C))); cm=$(printf '0x%X' $((b+0x10))) + vi2c_init "$c" + _vr $tx $(printf '0x%X' $(( (s<<1) & 0xFF ))) >/dev/null + st=$(_vwait $cm $(printf '0x%X' $((V_STA|V_WR)))); _vack "$st" || { echo "NACK slave-W" >&2; return 1; } + _vr $tx $(printf '0x%X' $((r & 0xFF))) >/dev/null + st=$(_vwait $cm $(printf '0x%X' $((V_WR)))); _vack "$st" || { echo "NACK reg" >&2; return 1; } + for x in "$@"; do k=$((k+1)) + _vr $tx $(printf '0x%X' $(( $((x)) & 0xFF ))) >/dev/null + if (( k==n )); then cv=$((V_WR|V_STO)); else cv=$((V_WR)); fi + st=$(_vwait $cm $(printf '0x%X' $cv)); _vack "$st" || { echo "NACK data#$k" >&2; return 1; } + done; } + +# --- public --------------------------------------------------------- +vi2c_read(){ [ $# -lt 3 ] && { echo "Usage: vi2c_read [n]"; return 1; } + local o; o=$(_vrd "$1" $(( $2 )) $(( $3 )) "${4:-1}") || return 1 + printf ' [VI2C-R] ch%s slave=0x%02X reg=0x%02X => [%s]\n' "$1" $(( $2 )) $(( $3 )) "$o"; } +vi2c_write(){ [ $# -lt 4 ] && { echo "Usage: vi2c_write ..."; return 1; } + local c=$1 s=$(( $2 )) r=$(( $3 )); shift 3 + _vwr "$c" "$s" "$r" "$@" || return 1 + printf ' [VI2C-W] ch%s slave=0x%02X reg=0x%02X <= [%s]\n' "$c" "$s" "$r" "$*"; } +vi2c_pmbus_read(){ [ $# -lt 3 ] && { echo "Usage: vi2c_pmbus_read [n]"; return 1; } + local o n=${4:-2}; o=$(_vrd "$1" $(( $2 )) $(( $3 )) "$n") || return 1 + if [ "$n" = 2 ]; then local b0 b1 w + b0=$(( $(echo "$o" | awk '{print $1}') )); b1=$(( $(echo "$o" | awk '{print $2}') )) + w=$(( b0 | (b1<<8) )) + printf ' [VPMB-R] ch%s slave=0x%02X cmd=0x%02X => 0x%04X raw=[%s] lin16=%s\n' \ + "$1" $(( $2 )) $(( $3 )) "$w" "$o" "$(vi2c_lin16 $w)" + else printf ' [VPMB-R] ch%s slave=0x%02X cmd=0x%02X => [%s]\n' "$1" $(( $2 )) $(( $3 )) "$o"; fi; } +vi2c_lin16(){ awk -v w=$(( $1 & 0xFFFF )) 'BEGIN{e=int(w/2048)%32;if(e>15)e-=32;m=w%2048;if(m>1023)m-=2048;printf "%.4f",m*(2.0^e)}'; } + +# --- scan ----------------------------------------------------------- +vi2c_scan(){ [ $# -lt 1 ] && { echo "Usage: vi2c_scan "; return 1; } + local c=$1 b tx cm a st f="" + b=$(_vbase "$c") || return 1 + tx=$(printf '0x%X' $((b+0x0C))); cm=$(printf '0x%X' $((b+0x10))) + vi2c_init "$c" + for (( a=$((VI2C_SCAN_FROM)); a<=$((VI2C_SCAN_TO)); a++ )); do + _vr $tx $(printf '0x%X' $(( (a<<1) & 0xFF ))) >/dev/null + st=$(_vwait $cm $(printf '0x%X' $((V_STA|V_WR|V_STO)))) || continue + _vack "$st" && f+="$(printf '0x%02X ' $a)" + done + printf ' Ch%-2s %-20s : %s\n' "$c" "${VI2C_CH_DESC[$c]}" "${f:-(none)}"; } +vi2c_scan_all(){ local c list="$*" + [ -z "$list" ] && list="0 1 2 3 4" + echo "=== ICB VI2C scan via CB F$VI2C_FN direct BAR, base $VI2C_BASE ===" + printf ' range 0x%02X..0x%02X (7-bit), prescale %s/%s\n' \ + $((VI2C_SCAN_FROM)) $((VI2C_SCAN_TO)) "$VI2C_PRE_LO" "$VI2C_PRE_HI" + for c in $list; do vi2c_scan "$c"; done; } +vi2c_help(){ + echo "blanton_icb_vi2c.sh - ICB(PDB) I2C via CB F$VI2C_FN VI2C proxy (direct BAR, no VSPI)" + local i + for i in 0 1 2 3 4; do + printf ' Ch%-2s 0x%X DEV_ID %s %s\n' $i $((VI2C_BASE+i*VI2C_STRIDE)) "${VI2C_DEV_ID[$i]}" "${VI2C_CH_DESC[$i]}" + done + echo " vi2c_scan_all [ch...] scan all VI2C-ICB channels" + echo " vi2c_scan vi2c_dump " + echo " vi2c_init [pre_lo] [pre_hi] vi2c_reset " + echo " vi2c_read [n]" + echo " vi2c_write ..." + echo " vi2c_pmbus_read [n] vi2c_lin16 " + echo " vi2c_muxsel (VI2C has no SEM_REG)" + echo " env: VI2C_SCAN_FROM VI2C_SCAN_TO VI2C_PRE_LO VI2C_PRE_HI VI2C_POLL" + echo " Same buses as blanton_icb_i2c.sh Ch0..Ch4 - scans should match."; } +vi2c_help diff --git a/src/Script_ABC_Blanton/Blanton_Script/blanton_pwr_data.sh b/src/Script_ABC_Blanton/Blanton_Script/blanton_pwr_data.sh new file mode 100644 index 0000000..b12019d --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/blanton_pwr_data.sh @@ -0,0 +1,653 @@ +#!/usr/bin/env bash +# ============================================================================= +# blanton_pwr_data.sh -- SWB VRM rail monitor (Vin / Vout / Iout / Temp) +# ============================================================================= +# Version History: +# V1.0.0 2026-08-12 Initial. Reads every SWB VRM rail over the CB FPGA F3 +# I2C master (blanton_cb_i2c.sh) and prints an aligned +# table. Rail map + conversions from PWR_Data.xlsx. +# +# Two xlsx conversions were CORRECTED after measuring the +# real parts on COM39 (see _pwr_vout_* below): +# * MP2985B Vout: xlsx said "(data + 49) / 1mV". The +# "+49" offset is wrong -- it is plain 1mV/LSB. Proof: +# PVDD_0V75_ANLG_0 read 750 (0.750V) and PVDD1V5_CNDR0 +# read 1501 (1.501V), which match their net names +# exactly with no offset (+49 would give 0.799/1.550). +# * MP29816 Vout: xlsx said "/5mV". The LSB is not fixed +# -- it is selected by MFR_VOUT_SCALE_LOOP (0x29) +# bits[12:10]. This unit reads 0x0820 -> code 2 -> +# 2.5mV/LSB, so READ_VOUT 314 = 0.785V (VOUT_COMMAND +# 320 = 0.800V nominal). 5mV would give 1.57V. The +# resolution is now read from the chip at runtime. +# * xlsx Vin "divide by 32,33,34...49" is an Excel +# autofill artifact; the divisor is 32 (31.25mV/LSB) +# for every part. +# V1.1.0 2026-08-12 Add: "pwr_data pdb" - PDB power bricks + EFUSE, reached +# over ICB VI2C ch4 behind the 0x72 mux, channel 0 +# (blanton_icb_vi2c.sh backend, CB F3 direct BAR). +# Add: ARB_LOST-aware retry on the VI2C path. On the first +# DUT (COM39) ICB ch4 lost arbitration on every other +# transaction for any 7-bit addr >= 0x40, and vi2c_scan +# reported those failures as devices because it only tests +# RX_ACK and ignores ARB_LOST (STAT bit5). A true-ACK scan +# showed ch4 really had only 0x1A and 0x26 - the 0x72 mux +# never ACKed, so 0x60..0x63 were unreachable. Suspected +# board issue, so the PDB table here is written to spec and +# is NOT yet verified against working bricks. +# Change: missing-value placeholder is now "NA" everywhere. +# Add: PDB values are rejected as NA when the word reads +# 0xFFFF (floating bus, not data) or falls outside a +# plausibility window. Without this the broken ch4 bus +# printed Vin=12124160 V and Vout=65.5350 V, which look +# like readings; a wrong number is worse than NA. Limits +# are PDB_VIN_MAX / PDB_VOUT_MAX / PDB_IOUT_ABS_MAX / +# PDB_TEMP_MIN / PDB_TEMP_MAX, and PDB_REJECT_FFFF=0 +# disables the all-ones check. +# !! PDB CONVERSIONS ARE UNVERIFIED !! PWR_Data.xlsx has no PDB sheet and no +# brick responded on the first DUT, so the PDB rows use generic PMBus +# decoding (SLINEAR11 for Vin/Iout/Temp, LINEAR16 with the exponent taken +# from VOUT_MODE for Vout, direct format falls back to 1mV/LSB). Once a +# brick answers, run "pwr_pdb_id" to get MFR_ID/MFR_MODEL and check the +# numbers against the datasheet before trusting them. +# V1.2.0 2026-08-12 Verified against working bricks on the COM36 DUT, where the +# 0x72 mux DOES respond and 0x60..0x63 answer. Findings: +# * VOUT_MODE = 0x40 (direct) -> Vout is 1 mV/LSB, giving +# 1.212..1.220 V, consistent with the "I2C_PDB_VRM" net +# name on that mux leg. Vout is now trusted. +# * READ_VIN (0x88) is NOT a real input reading: it tracks +# READ_VOUT within 1 LSB per device (0x60 1217/1218, +# 0x61 1219/1220, 0x62 1212/1212, 0x63 1217/1217) and does +# not read alike across bricks sharing one input rail. +# Reported NA unless PDB_TRUST_VIN=1. +# * READ_TEMPERATURE_1 (0x8D), 0x8E and STATUS_BYTE (0x78) +# all return 0xFFFF and STATUS_WORD (0x79) = 0x0002 = CML +# fault, i.e. a partial command set. Temp is NA. +# * MFR_ID/MFR_MODEL return one byte then float (0x4D 'M', +# 0x59 'Y'), so they are not block reads here. +# Fix: presence is now a true-ACK probe and every value is read +# independently. Previously a failed Vin read aborted the whole +# row, so one unsupported register blanked Vout and Iout too. +# ============================================================================= +# +# Usage: +# source blanton_pwr_data.sh +# pwr_data # SWB0 (default) +# pwr_data swb1 # SWB1 (same map, I2C channel +1) +# pwr_data pdb # PDB power bricks + EFUSE (ICB VI2C ch4, mux 0x72 ch0) +# pwr_data all # all three +# pwr_pdb_id # read MFR_ID / MFR_MODEL of whatever answers on the PDB +# pwr_data_help +# +# Requires blanton_cb_i2c.sh + blanton_fpga_pcimem.sh in the same directory +# (auto-sourced below). "pwr_data pdb" additionally needs blanton_icb_vi2c.sh, +# which is sourced on demand. +# +# Register / conversion summary (PMBus, page written to 0x00 first): +# Vin 0x88 bits[9:0] * 31.25mV (page 0 -- Vin is the shared input) +# Vout 0x8B MP29816 : bits[11:0] * MFR_VOUT_SCALE_LOOP resolution +# MP2985B : bits[11:0] * 1mV +# Iout 0x8C SLINEAR11 (MP29816 lands on 2A/LSB, MP2985B on 0.0625A/LSB) +# Temp 0x8D MP29816 : SLINEAR11 ; MP2985B : bits[10:0] two's complement degC +# ============================================================================= + +# --- Pull in the I2C/PMBus backend if not already present -------------------- +_PWR_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" +if ! declare -F cb_pmbus_read >/dev/null 2>&1; then + if [ -n "$_PWR_DIR" ] && [ -f "$_PWR_DIR/blanton_cb_i2c.sh" ]; then + # shellcheck source=/dev/null + source "$_PWR_DIR/blanton_cb_i2c.sh" >/dev/null + else + echo -e "[\033[33mWARN\033[0m] blanton_pwr_data.sh: cb_pmbus_read() not found." >&2 + echo " source blanton_cb_i2c.sh first." >&2 + fi +fi + +# === PMBus command codes ===================================================== +_PWR_PAGE=0x00 +_PWR_VIN=0x88 +_PWR_VOUT=0x8B +_PWR_IOUT=0x8C +_PWR_TEMP=0x8D +_PWR_MFR_VOUT_SCALE_LOOP=0x29 # MP29816 only: bits[12:10] = Vout LSB select + +# === Rail map (from PWR_Data.xlsx) =========================================== +# One entry per rail: "location:vrm:ch:slave:page:netname" +# ch = "I2C CH SWB0" column. SWB1 is the same map with ch+1 (7/9). +# page = value written to PMBus PAGE (0x00) before Vout/Iout/Temp. +# Vin is always read from page 0 (shared input rail). +PWR_RAILS=( + "PU2:MP29816:6:0x20:0x00:PVDD_CORE" + "PU105:MP2985B:6:0x21:0x00:PVDD_PHYTILE_P2" + "PU105:MP2985B:6:0x21:0x01:PVDD_PHYTILE_P3" + "PU102:MP2985B:6:0x22:0x00:PVDD_PHYTILE_P0" + "PU102:MP2985B:6:0x22:0x01:PVDD_PHYTILE_P1" + "PU114:MP2985B:6:0x25:0x00:PVDD_0V9_ANLG_0" + "PU114:MP2985B:6:0x25:0x01:PVDD_0V75_ANLG_0" + "PU122:MP2985B:6:0x27:0x00:PVDDA_PHYT0_P0" + "PU122:MP2985B:6:0x27:0x01:PVDDA_PHYT1_P1" + "PU142:MP2985B:6:0x29:0x00:PVDD1V5_CNDR0" + "PU142:MP2985B:6:0x29:0x01:PVDD1V5_CNDR1" + "PU108:MP2985B:8:0x23:0x00:PVDD_PHYTILE_P4" + "PU108:MP2985B:8:0x23:0x01:PVDD_PHYTILE_P5" + "PU111:MP2985B:8:0x24:0x00:PVDD_PHYTILE_P6" + "PU111:MP2985B:8:0x24:0x01:PVDD_PHYTILE_P7" + "PU118:MP2985B:8:0x26:0x00:PVDD_0V9_ANLG_1" + "PU118:MP2985B:8:0x26:0x01:PVDD_0V75_ANLG_1" + "PU127:MP2985B:8:0x28:0x00:PVDDA_PHYT2_P2" + "PU127:MP2985B:8:0x28:0x01:PVDDA_PHYT3_P3" +) + +# I2C channel offset per board: SWB0 uses the map as-is, SWB1 is +1. +_pwr_board_offset() { + case "$(echo "${1:-swb0}" | tr 'A-Z' 'a-z')" in + swb0|0) echo 0 ;; + swb1|1) echo 1 ;; + *) return 1 ;; + esac +} + +# === Missing-value placeholder ================================================ +PWR_NA="${PWR_NA:-NA}" + +# === PDB: power bricks + EFUSE =============================================== +# Path: CB F3 VI2C ch4 (== ICB I2C ch4, "Power bricks + EFUSE") -> external +# TCA954x mux at 7-bit 0x72 -> mux channel 0 -> the bricks. +# The VI2C path is used rather than the VSPI path (blanton_icb_i2c.sh) because +# VSPI costs ~18 ms per register, which puts ~50 ms between I2C byte phases and +# trips the 25-35 ms SMBus timeout on these PMBus parts. VI2C is ~3.3 ms. +PDB_VI2C_CH="${PDB_VI2C_CH:-4}" +PDB_MUX_ADDR="${PDB_MUX_ADDR:-0x72}" +PDB_MUX_SEL="${PDB_MUX_SEL:-0x01}" # TCA954x control byte: bit0 = channel 0 +PDB_RETRY="${PDB_RETRY:-3}" # retries per transfer (ARB_LOST recovery) + +# A floating I2C bus reads back all ones, so a 0xFFFF word is treated as "no +# data" instead of being decoded - otherwise it prints as a perfectly +# reasonable-looking 65.535 V / -0.5 A. Set 0 to decode it anyway. +PDB_REJECT_FFFF="${PDB_REJECT_FFFF:-1}" + +# The bricks alias READ_VIN (0x88) to the READ_VOUT measurement, so Vin is +# reported as NA by default rather than printing a wrong number. See the note in +# _pwr_read_pdb_rail for the measurement that shows this. Set to 1 to decode it. +PDB_TRUST_VIN="${PDB_TRUST_VIN:-0}" + +# Plausibility window; anything outside prints NA. Measured need: on the first +# DUT the contended ch4 bus produced words that decoded to 12124160 V, and a +# wrong number is worse than no number on a bring-up tool. +PDB_VIN_MAX="${PDB_VIN_MAX:-100}" +PDB_VOUT_MAX="${PDB_VOUT_MAX:-60}" +PDB_IOUT_ABS_MAX="${PDB_IOUT_ABS_MAX:-500}" +PDB_TEMP_MIN="${PDB_TEMP_MIN:--55}" +PDB_TEMP_MAX="${PDB_TEMP_MAX:-150}" + +# One entry per device: "location:model:slave:page:netname" +# page "-" = do not write PMBus PAGE (these are single-output parts) +PDB_RAILS=( + "PDB:BRICK:0x60:-:PDB_BRICK_0" + "PDB:BRICK:0x61:-:PDB_BRICK_1" + "PDB:BRICK:0x62:-:PDB_BRICK_2" + "PDB:BRICK:0x63:-:PDB_BRICK_3" + "PDB:EFUSE:0x26:-:PDB_EFUSE" +) + +_PWR_VI2C_ARBLOST=0x20 # VI2C STAT bit5 + +# === Debug =================================================================== +PWR_DEBUG=${PWR_DEBUG:-0} +pwr_debug() { + if [ "${1:-}" = "on" ]; then PWR_DEBUG=1 + elif [ "${1:-}" = "off" ]; then PWR_DEBUG=0 + else [ "$PWR_DEBUG" = "0" ] && PWR_DEBUG=1 || PWR_DEBUG=0; fi + echo -e "[\033[34mINFO\033[0m] PWR_DEBUG=$PWR_DEBUG" +} + +# === Low-level: read one 16-bit PMBus word, echo it as a decimal ============= +# _pwr_rd16 -> decimal word on stdout, non-zero on NACK +_pwr_rd16() { + local ch="$1" slave=$(( $2 )) reg="$3" bytes lo hi + bytes=$(_cbi2c_xfer_read "$ch" "$slave" "$(( $reg ))" 2 2>/dev/null) || return 1 + lo=$(printf '%s' "$bytes" | awk '{print $1}') + hi=$(printf '%s' "$bytes" | awk '{print $2}') + [ -z "$lo" ] || [ -z "$hi" ] && return 1 + local w=$(( ( $(( hi )) << 8 ) | $(( lo )) )) + [ "$PWR_DEBUG" = "1" ] && printf '\033[90m[DEBG] ch=%s slave=0x%02X reg=%s -> 0x%04X\033[0m\n' \ + "$ch" "$slave" "$reg" "$w" >&2 + echo "$w" +} + +# _pwr_set_page +_pwr_set_page() { + cb_pmbus_write "$1" "$2" "$_PWR_PAGE" "$3" >/dev/null 2>&1 +} + +# === Format decoders ========================================================= + +# SLINEAR11: bits[15:11] = signed exponent, bits[10:0] = signed mantissa +_pwr_l11() { + local w=$(( $1 & 0xFFFF )) + local e=$(( (w >> 11) & 0x1F )) + local m=$(( w & 0x7FF )) + (( e > 15 )) && e=$(( e - 32 )) + (( m > 1023 )) && m=$(( m - 2048 )) + awk -v m="$m" -v e="$e" 'BEGIN { printf "%.3f", m * (2.0 ^ e) }' +} + +# Signed 11-bit two's complement (bits[10:0]) -> integer +_pwr_s11() { + local m=$(( $1 & 0x7FF )) + (( m > 1023 )) && m=$(( m - 2048 )) + echo "$m" +} + +# Vin: bits[9:0] * 31.25mV (identical to xlsx "/32" and to "Linear11 *31.25mV") +_pwr_vin() { + awk -v c="$(( $1 & 0x3FF ))" 'BEGIN { printf "%.3f", c * 0.03125 }' +} + +# MP29816 Vout LSB (volts) from MFR_VOUT_SCALE_LOOP bits[12:10]. +# Cached per ch:slave so the table costs one extra read per MP29816, not per row. +declare -A _PWR_RES_CACHE 2>/dev/null +_pwr_mp29816_res() { + local ch="$1" slave="$2" key="$ch:$slave" w code + if [ -n "${_PWR_RES_CACHE[$key]}" ]; then echo "${_PWR_RES_CACHE[$key]}"; return 0; fi + w=$(_pwr_rd16 "$ch" "$slave" "$_PWR_MFR_VOUT_SCALE_LOOP") || return 1 + code=$(( (w >> 10) & 0x7 )) + local res + case "$code" in + 0) res=0.00625 ;; # 6.25 mV/LSB + 1) res=0.005 ;; # 5 mV/LSB + 2) res=0.0025 ;; # 2.5 mV/LSB + 3) res=0.002 ;; # 2 mV/LSB + 4) res=0.001 ;; # 1 mV/LSB + 5) res=0.00390625 ;; # 3.90625mV/LSB + 6) res=0.001953125 ;; # 1.953125 mV/LSB + 7) res=0.0009765625 ;; # 0.9765625 mV/LSB + *) return 1 ;; + esac + _PWR_RES_CACHE[$key]="$res" + echo "$res" +} + +# === Per-rail read =========================================================== +# Fills _PWR_VIN_V / _PWR_VOUT_V / _PWR_IOUT_A / _PWR_TEMP_C ("n/a" on failure) +_pwr_read_rail() { + local vrm="$1" ch="$2" slave="$3" page="$4" w res + _PWR_VIN_V="$PWR_NA"; _PWR_VOUT_V="$PWR_NA"; _PWR_IOUT_A="$PWR_NA"; _PWR_TEMP_C="$PWR_NA" + + # --- Vin: always page 0 (shared input rail) --- + _pwr_set_page "$ch" "$slave" 0x00 + if w=$(_pwr_rd16 "$ch" "$slave" "$_PWR_VIN"); then + _PWR_VIN_V=$(_pwr_vin "$w") + else + return 1 # slave did not ACK at all -> leave the whole row n/a + fi + + # --- Vout / Iout / Temp: on the rail's own page --- + _pwr_set_page "$ch" "$slave" "$page" + + if w=$(_pwr_rd16 "$ch" "$slave" "$_PWR_VOUT"); then + if [ "$vrm" = "MP29816" ]; then + res=$(_pwr_mp29816_res "$ch" "$slave") || res=0.0025 + _PWR_VOUT_V=$(awk -v c="$(( w & 0xFFF ))" -v r="$res" 'BEGIN { printf "%.4f", c * r }') + else + # MP2985B: direct, 1mV/LSB (no offset -- see header note) + _PWR_VOUT_V=$(awk -v c="$(( w & 0xFFF ))" 'BEGIN { printf "%.4f", c / 1000.0 }') + fi + fi + + w=$(_pwr_rd16 "$ch" "$slave" "$_PWR_IOUT") && _PWR_IOUT_A=$(_pwr_l11 "$w") + + if w=$(_pwr_rd16 "$ch" "$slave" "$_PWR_TEMP"); then + if [ "$vrm" = "MP29816" ]; then + _PWR_TEMP_C=$(printf '%.1f' "$(_pwr_l11 "$w")") + else + _PWR_TEMP_C=$(printf '%.1f' "$(_pwr_s11 "$w")") + fi + fi + return 0 +} + +# === PDB backend: ICB VI2C ch4, ARB_LOST-aware ================================ +# blanton_icb_vi2c.sh supplies _vbase/_vr/_vwait/_vnum/_vrd/_vwr/vi2c_init and +# the V_* bit constants. Sourced on demand so plain SWB use does not need it. +_pwr_vi2c_ready() { + declare -F vi2c_init >/dev/null 2>&1 && return 0 + if [ -n "$_PWR_DIR" ] && [ -f "$_PWR_DIR/blanton_icb_vi2c.sh" ]; then + # shellcheck source=/dev/null + source "$_PWR_DIR/blanton_icb_vi2c.sh" >/dev/null + fi + declare -F vi2c_init >/dev/null 2>&1 && return 0 + echo -e "[\033[31mERRO\033[0m] blanton_icb_vi2c.sh not found in ${_PWR_DIR:-.} - needed for 'pwr_data pdb'" >&2 + return 1 +} + +# ARB_LOST on this bus hits roughly every other transaction, and it makes the +# address-phase RX_ACK meaningless, so every transfer is retried. +# _pwr_pdb_rd16 -> decimal word +_pwr_pdb_rd16() { + local slave="$1" reg="$2" try bytes lo hi w + for (( try=0; try/dev/null) || continue + lo=$(printf '%s' "$bytes" | awk '{print $1}') + hi=$(printf '%s' "$bytes" | awk '{print $2}') + if [ -n "$lo" ] && [ -n "$hi" ]; then + w=$(( ( $(( hi )) << 8 ) | $(( lo )) )) + [ "$PWR_DEBUG" = "1" ] && printf '\033[90m[DEBG] pdb slave=0x%02X reg=0x%02X -> 0x%04X\033[0m\n' \ + "$(( slave ))" "$(( reg ))" "$w" >&2 + # All ones = nothing drove SDA; not real data. + if [ "$PDB_REJECT_FFFF" = "1" ] && (( w == 0xFFFF )); then continue; fi + echo "$w"; return 0 + fi + done + return 1 +} + +# _pwr_pdb_rd8 -> decimal byte +_pwr_pdb_rd8() { + local slave="$1" reg="$2" try bytes b0 + for (( try=0; try/dev/null) || continue + b0=$(printf '%s' "$bytes" | awk '{print $1}') + if [ -n "$b0" ]; then + local v=$(( $(( b0 )) & 0xFF )) + if [ "$PDB_REJECT_FFFF" = "1" ] && (( v == 0xFF )); then continue; fi + echo "$v"; return 0 + fi + done + return 1 +} + +# Raw 1-byte read of the mux control register (a TCA954x takes no register +# pointer). Echoes the control byte as a decimal. +_pwr_pdb_mux_read() { + local ch="$PDB_VI2C_CH" s=$(( PDB_MUX_ADDR )) b tx cm st v + b=$(_vbase "$ch") || return 1 + tx=$(printf '0x%X' $(( b + 0x0C ))) + cm=$(printf '0x%X' $(( b + 0x10 ))) + _vr "$tx" "$(printf '0x%X' $(( ((s << 1) | 1) & 0xFF )))" >/dev/null + st=$(_vwait "$cm" "$(printf '0x%X' $(( V_STA | V_WR )))") + (( ( $(( st )) & (_PWR_VI2C_ARBLOST | V_RXACK) ) != 0 )) && return 1 + _vwait "$cm" "$(printf '0x%X' $(( V_RD | V_NAK | V_STO )))" >/dev/null + v=$(_vnum "$(_vr "$tx")") + echo $(( v & 0xFF )) +} + +# Point the mux at channel 0 and confirm by reading the control byte back. +# A TCA954x accepts exactly ONE byte and NACKs anything after it, which is why +# vi2c_write (register pointer + data = 2 bytes) cannot be used here. +_pwr_pdb_mux_open() { + local ch="$PDB_VI2C_CH" s=$(( PDB_MUX_ADDR )) v=$(( PDB_MUX_SEL )) + local b tx cm st try rb + b=$(_vbase "$ch") || return 1 + tx=$(printf '0x%X' $(( b + 0x0C ))) + cm=$(printf '0x%X' $(( b + 0x10 ))) + for (( try=0; try/dev/null + st=$(_vwait "$cm" "$(printf '0x%X' $(( V_STA | V_WR )))") + _vr "$tx" "$(printf '0x%X' $(( v & 0xFF )))" >/dev/null + st=$(_vwait "$cm" "$(printf '0x%X' $(( V_WR | V_STO )))") + (( ( $(( st )) & (_PWR_VI2C_ARBLOST | V_RXACK) ) != 0 )) && continue + rb=$(_pwr_pdb_mux_read) || continue + if (( rb == (v & 0xFF) )); then + [ "$PWR_DEBUG" = "1" ] && printf '\033[90m[DEBG] mux 0x%02X <= 0x%02X (readback 0x%02X)\033[0m\n' \ + "$s" $(( v & 0xFF )) "$rb" >&2 + return 0 + fi + done + return 1 +} + +# VOUT_MODE (0x20): bits[7:5] = mode, bits[4:0] = parameter. +# 000 LINEAR -> exponent is bits[4:0], signed 5-bit (Vout = raw * 2^exp) +# 010 DIRECT -> needs the COEFFICIENTS command; falls back to 1 mV/LSB +# Cached per slave. Echoes "linear " or "direct". +declare -A _PWR_VMODE_CACHE 2>/dev/null +_pwr_pdb_vout_mode() { + local slave="$1" key="$slave" w mode exp r + if [ -n "${_PWR_VMODE_CACHE[$key]}" ]; then echo "${_PWR_VMODE_CACHE[$key]}"; return 0; fi + w=$(_pwr_pdb_rd8 "$slave" 0x20) || return 1 + mode=$(( (w >> 5) & 0x7 )) + exp=$(( w & 0x1F )); (( exp > 15 )) && exp=$(( exp - 32 )) + case "$mode" in + 0) r="linear $exp" ;; + 2) r="direct" ;; + *) r="direct" ;; + esac + _PWR_VMODE_CACHE[$key]="$r" + echo "$r" +} + +# True-ACK presence probe. vi2c_scan only tests RX_ACK and mistakes ARB_LOST for +# a device, so presence is checked here with STA|WR|STO and ARB_LOST rejected. +_pwr_pdb_present() { + local slave=$(( $1 )) ch="$PDB_VI2C_CH" b tx cm st s try + b=$(_vbase "$ch") || return 1 + tx=$(printf '0x%X' $(( b + 0x0C ))) + cm=$(printf '0x%X' $(( b + 0x10 ))) + for (( try=0; try/dev/null + st=$(_vwait "$cm" "$(printf '0x%X' $(( V_STA | V_WR | V_STO )))") + s=$(( st )) + (( (s & _PWR_VI2C_ARBLOST) == 0 )) && break + done + (( (s & _PWR_VI2C_ARBLOST) == 0 && (s & V_RXACK) == 0 )) +} + +# Echo the value if it falls inside [min,max], otherwise fail. +_pwr_sane() { + awk -v v="$1" -v lo="$2" -v hi="$3" \ + 'BEGIN { if (v+0 >= lo+0 && v+0 <= hi+0) { print v; exit 0 } exit 1 }' +} + +# Fills _PWR_* for one PDB device. Generic PMBus decoding - see header warning. +# Every value is read independently: these parts implement a partial command set +# (READ_TEMPERATURE_1 answers 0xFFFF and STATUS_WORD reports a CML fault), so one +# unsupported register must not blank the whole row. +_pwr_read_pdb_rail() { + local model="$1" slave="$2" page="$3" w mode exp v + _PWR_VIN_V="$PWR_NA"; _PWR_VOUT_V="$PWR_NA"; _PWR_IOUT_A="$PWR_NA"; _PWR_TEMP_C="$PWR_NA" + + _pwr_pdb_present "$slave" || return 1 + + [ "$page" != "-" ] && _vwr "$PDB_VI2C_CH" "$(( slave ))" 0x00 "$page" >/dev/null 2>&1 + + # Vin is deliberately NOT reported for the bricks. Measured on COM36: + # READ_VIN (0x88) tracks READ_VOUT (0x8B) to within 1 LSB on each device + # (0x60 1217/1218, 0x61 1219/1220, 0x62 1212/1212, 0x63 1217/1217) and does + # not behave like the shared input rail it would have to be, so 0x88 is + # aliased to the Vout measurement rather than a real input reading. + # Set PDB_TRUST_VIN=1 to decode it anyway. + if [ "$PDB_TRUST_VIN" = "1" ] && w=$(_pwr_pdb_rd16 "$slave" "$_PWR_VIN"); then + v=$(_pwr_l11 "$w") && _PWR_VIN_V=$(_pwr_sane "$v" 0 "$PDB_VIN_MAX") || _PWR_VIN_V="$PWR_NA" + fi + + if w=$(_pwr_pdb_rd16 "$slave" "$_PWR_VOUT"); then + mode=$(_pwr_pdb_vout_mode "$slave") || mode="direct" + case "$mode" in + linear*) + exp="${mode#linear }" + v=$(awk -v c="$(( w & 0xFFFF ))" -v e="$exp" 'BEGIN { printf "%.4f", c * (2.0 ^ e) }') ;; + *) v=$(awk -v c="$(( w & 0xFFFF ))" 'BEGIN { printf "%.4f", c / 1000.0 }') ;; + esac + _PWR_VOUT_V=$(_pwr_sane "$v" 0 "$PDB_VOUT_MAX") || _PWR_VOUT_V="$PWR_NA" + fi + + if w=$(_pwr_pdb_rd16 "$slave" "$_PWR_IOUT"); then + v=$(_pwr_l11 "$w") + _PWR_IOUT_A=$(_pwr_sane "$v" "-$PDB_IOUT_ABS_MAX" "$PDB_IOUT_ABS_MAX") || _PWR_IOUT_A="$PWR_NA" + fi + + if w=$(_pwr_pdb_rd16 "$slave" "$_PWR_TEMP"); then + v=$(_pwr_l11 "$w") + if v=$(_pwr_sane "$v" "$PDB_TEMP_MIN" "$PDB_TEMP_MAX"); then + _PWR_TEMP_C=$(printf '%.1f' "$v") + else + _PWR_TEMP_C="$PWR_NA" + fi + fi + return 0 +} + +# === Shared table chrome ===================================================== +_pwr_table_header() { + echo "==== $1 ====" + printf "%-4s %-9s %-8s %-7s %-3s %-17s %9s %9s %9s %8s\n" \ + "No." "Location" "VRM" "SlaveID" "Pg" "Netname" "Vin(V)" "Vout(V)" "Iout(A)" "Temp(C)" + printf '%s\n' "-------------------------------------------------------------------------------------------------" +} + +# === Public: pwr_data pdb ==================================================== +pwr_data_pdb() { + _pwr_vi2c_ready || return 1 + local muxok=0 + _pwr_pdb_mux_open && muxok=1 + + _pwr_table_header "PDB" + local n=0 entry loc model slave page net pgshow + for entry in "${PDB_RAILS[@]}"; do + IFS=':' read -r loc model slave page net <<< "$entry" + n=$(( n + 1 )) + if [ "$page" = "-" ]; then pgshow="-"; else pgshow="$(( page ))"; fi + _pwr_read_pdb_rail "$model" "$slave" "$page" + printf "%-4s %-9s %-8s %-7s %-3s %-17s %9s %9s %9s %8s\n" \ + "$n" "$loc" "$model" "$slave" "$pgshow" "$net" \ + "$_PWR_VIN_V" "$_PWR_VOUT_V" "$_PWR_IOUT_A" "$_PWR_TEMP_C" + done + + if [ "$muxok" != "1" ]; then + echo -e "[\033[33mWARN\033[0m] mux $PDB_MUX_ADDR on ICB ch$PDB_VI2C_CH did not answer, so the brick" + echo " leg was never opened and 0x60..0x63 read as $PWR_NA." + echo " Run 'pwr_pdb_bus' to tell 'absent' from 'bus losing arbitration'." + fi + return 0 +} + +# True-ACK scan of the PDB bus. vi2c_scan / icb_i2c_scan only test RX_ACK and +# ignore ARB_LOST (STAT bit5), so on a contended bus they report arbitration +# failures as devices. This retries on ARB_LOST and lists the two cases apart. +pwr_pdb_bus() { + _pwr_vi2c_ready || return 1 + local ch="$PDB_VI2C_CH" b tx cm a st s try found="" arb="" rb + b=$(_vbase "$ch") || return 1 + tx=$(printf '0x%X' $(( b + 0x0C ))) + cm=$(printf '0x%X' $(( b + 0x10 ))) + vi2c_init "$ch" + for (( a=0x08; a<=0x77; a++ )); do + for (( try=0; try/dev/null + st=$(_vwait "$cm" "$(printf '0x%X' $(( V_STA | V_WR | V_STO )))") + s=$(( st )) + (( (s & _PWR_VI2C_ARBLOST) == 0 )) && break + done + if (( (s & _PWR_VI2C_ARBLOST) != 0 )); then + arb+="$(printf '0x%02X ' "$a")" + elif (( (s & V_RXACK) == 0 )); then + found+="$(printf '0x%02X ' "$a")" + fi + done + echo " [PDB-BUS] ICB ch$ch true ACK : ${found:-(none)}" + [ -n "$arb" ] && echo " [PDB-BUS] persistent ARB_LOST : ${arb% }" + if rb=$(_pwr_pdb_mux_read); then + printf ' [PDB-BUS] mux %s ctrl : 0x%02X\n' "$PDB_MUX_ADDR" "$rb" + else + echo " [PDB-BUS] mux $PDB_MUX_ADDR ctrl : no response" + fi +} + +# Identify whatever answers on the PDB bus: MFR_ID (0x99) / MFR_MODEL (0x9A) are +# PMBus block reads (first byte = length), VOUT_MODE (0x20) is a single byte. +# Needed to pin down the real conversions, which are generic guesses until then. +pwr_pdb_id() { + _pwr_vi2c_ready || return 1 + _pwr_pdb_mux_open >/dev/null 2>&1 + local entry loc model slave page net r bytes x v asc + for entry in "${PDB_RAILS[@]}"; do + IFS=':' read -r loc model slave page net <<< "$entry" + printf ' %-16s %s\n' "$net" "$slave" + for r in 0x99 0x9A; do + bytes=$(_vrd "$PDB_VI2C_CH" "$(( slave ))" "$(( r ))" 12 2>/dev/null) \ + || bytes=$(_vrd "$PDB_VI2C_CH" "$(( slave ))" "$(( r ))" 12 2>/dev/null) + if [ -n "$bytes" ]; then + asc="" + for x in $bytes; do + v=$(( x )) + if (( v >= 0x20 && v < 0x7F )); then asc+=$(printf '%b' "\\x$(printf '%02x' "$v")"); else asc+="."; fi + done + printf ' %s raw=[%s]\n' "$r" "$bytes" + printf ' %s asc="%s"\n' "$r" "$asc" + else + printf ' %s : no response\n' "$r" + fi + done + if v=$(_pwr_pdb_rd8 "$slave" 0x20); then + printf ' 0x20 VOUT_MODE=0x%02X -> %s\n' "$v" "$(_pwr_pdb_vout_mode "$slave")" + else + echo " 0x20 VOUT_MODE : no response" + fi + done +} + +# === Public: pwr_data [swb0|swb1|pdb|all] ==================================== +pwr_data() { + local board + board="$(echo "${1:-swb0}" | tr 'A-Z' 'a-z')" + case "$board" in + all) pwr_data swb0; echo ""; pwr_data swb1; echo ""; pwr_data pdb; return ;; + pdb) pwr_data_pdb; return ;; + esac + + local off + off=$(_pwr_board_offset "$board") || { + echo -e "[\033[31mERRO\033[0m] Usage: pwr_data [swb0|swb1|pdb|all]"; return 1; } + local tag="SWB${off}" + + if ! declare -F cb_pmbus_read >/dev/null 2>&1; then + echo -e "[\033[31mERRO\033[0m] cb_pmbus_read() missing - source blanton_cb_i2c.sh"; return 1 + fi + + # Init each I2C channel once and disable per-transfer auto-init: the table is + # ~80 PMBus transactions and every init costs 4 more pcimem calls. + local _save_auto="$CB_I2C_AUTO_INIT" chans="" c seen + for entry in "${PWR_RAILS[@]}"; do + IFS=':' read -r _ _ c _ _ _ <<< "$entry" + c=$(( c + off )) + seen=0; for x in $chans; do [ "$x" = "$c" ] && seen=1; done + [ "$seen" = "0" ] && chans="$chans $c" + done + for c in $chans; do cb_i2c_init "$c" >/dev/null; done + CB_I2C_AUTO_INIT=0 + + _pwr_table_header "$tag" + + local n=0 loc vrm ch slave page net + for entry in "${PWR_RAILS[@]}"; do + IFS=':' read -r loc vrm ch slave page net <<< "$entry" + ch=$(( ch + off )) + n=$(( n + 1 )) + _pwr_read_rail "$vrm" "$ch" "$slave" "$page" + printf "%-4s %-9s %-8s %-7s %-3s %-17s %9s %9s %9s %8s\n" \ + "$n" "$loc" "$vrm" "$slave" "$(( page ))" "$net" \ + "$_PWR_VIN_V" "$_PWR_VOUT_V" "$_PWR_IOUT_A" "$_PWR_TEMP_C" + done + + CB_I2C_AUTO_INIT="${_save_auto:-1}" + return 0 +} + +# === Help ==================================================================== +pwr_data_help() { + echo -e "\033[1mblanton_pwr_data.sh - SWB / PDB power rail monitor\033[0m" + echo "" + echo -e " \033[33mpwr_data\033[0m [swb0|swb1|pdb|all] read Vin/Vout/Iout/Temp for every rail" + echo -e " \033[33mpwr_pdb_bus\033[0m true-ACK scan of the PDB bus (rejects ARB_LOST)" + echo -e " \033[33mpwr_pdb_id\033[0m MFR_ID / MFR_MODEL / VOUT_MODE of the PDB parts" + echo -e " \033[33mpwr_debug\033[0m on|off show each PMBus word read" + echo "" + echo -e " SWB: \033[36mcb_pmbus_*\033[0m on CB F3 I2C. SWB0 = ch 6/8, SWB1 = ch 7/9." + echo -e " PDB: \033[36mVI2C\033[0m ICB ch$PDB_VI2C_CH -> mux $PDB_MUX_ADDR ch0 -> bricks 0x60..0x63 + EFUSE 0x26." + echo -e " Anything that does not answer prints \033[90m$PWR_NA\033[0m." + echo -e " \033[33mPDB conversions are generic PMBus and NOT yet verified\033[0m - see the file header." +} + +pwr_data_help diff --git a/src/Script_ABC_Blanton/Blanton_Script/blanton_temp_sensor.sh b/src/Script_ABC_Blanton/Blanton_Script/blanton_temp_sensor.sh new file mode 100644 index 0000000..9b809a6 --- /dev/null +++ b/src/Script_ABC_Blanton/Blanton_Script/blanton_temp_sensor.sh @@ -0,0 +1,225 @@ +#!/usr/bin/env bash +# ============================================================================= +# blanton_temp_sensor.sh -- Blanton CB + ICB(PDB) temperature sensor reader +# ============================================================================= +# V0.1.0 2026-08-11 Reads every board temp sensor through the existing I2C +# helpers and converts the raw registers to degC. +# +# Topology (verified on DUT COM37, 2026-08-11): +# +# CB : CB FPGA F3 I2C **Ch10** -> TCA9543 mux @0x70 (FPGA drives its RESET, +# released by cb_i2c_mux_reset_release / F0 0x7D4 <= 0xFF). +# mux ctrl 0x01 = leg0 = TEMP bus : TMP75 0x48, TMP75 0x49, TMP432 0x4C +# mux ctrl 0x02 = leg1 = DEBUG bus : PCIe fanout buf 0x6B/0x6D + hdr +# NOTE: CB_tree.png draws DEBUG on the upper leg and TEMP on the lower +# one; on real HW the TEMP devices answer with ctrl=0x01 (leg0). +# Backend: blanton_cb_i2c.sh (cb_i2c_read / cb_i2c_muxwrite) +# +# ICB : ICB(PDB) I2C **Ch2**, no mux : TMP75 U8 0x48, TMP75 U33 0x49, +# TMP432 U29 0x4C +# Backend: blanton_icb_vi2c.sh (CB F3 VI2C proxy, vi2c_read). +# Do NOT use blanton_icb_i2c.sh here: VSPI is ~18 ms/register, which +# trips the SMBus 25-35 ms timeout and the sensors NACK the pointer. +# +# Conversion (datasheets in this folder): +# TMP75 (SBOS288J) : reg 0x00, 2 bytes, 12-bit left-justified two's +# complement -> T = (raw16 >> 4) * 0.0625 +# TMP432 (SBOS441I) : local hi 0x00 / lo 0x29 (2-byte read from 0x00) +# remote1 hi 0x01 / lo 0x10 +# remote2 hi 0x23 / lo 0x24 +# T = (raw16 >> 4) * 0.0625, minus 64 when CONFIG1(0x03) +# bit2 RANGE = 1 (extended -64..191C mode) +# ID: 0xFD = 0x32 (device), 0xFE = 0x55 (TI) +# open-diode status: 0x1B bit1 R2OPEN / bit0 R1OPEN +# +# Usage: +# ./blanton_temp_sensor.sh # CB + ICB, one pass +# ./blanton_temp_sensor.sh -r # also show TMP432 remote1/remote2 +# ./blanton_temp_sensor.sh -c | -i # CB only / ICB only +# ./blanton_temp_sensor.sh -n 10 -t 5 # 10 passes, 5 s apart (-n 0 = forever) +# source blanton_temp_sensor.sh ; temp_all ; temp_cb ; temp_icb +# ============================================================================= + +# --- pull in the I2C backends ------------------------------------------------ +_TS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd)" +_ts_need() { + local fn="$1" file="$2" + declare -F "$fn" >/dev/null 2>&1 && return 0 + if [ -f "$_TS_DIR/$file" ]; then + # shellcheck source=/dev/null + source "$_TS_DIR/$file" >/dev/null 2>&1 + fi + declare -F "$fn" >/dev/null 2>&1 && return 0 + echo "[ERR] blanton_temp_sensor.sh: $fn() missing (need $file)" >&2 + return 1 +} +_ts_need cb_fpga blanton_fpga_pcimem.sh || true +_ts_need _cbi2c_xfer_read blanton_cb_i2c.sh || true +_ts_need _vrd blanton_icb_vi2c.sh || true + +# --- geometry / device tables ------------------------------------------------ +TS_CB_CH="${TS_CB_CH:-10}" # CB FPGA F3 I2C channel with the temp bus +TS_CB_MUX="${TS_CB_MUX:-0x70}" # TCA9543 on that channel +TS_CB_MUX_TEMP="${TS_CB_MUX_TEMP:-0x01}" # leg0 = temp sensors +TS_ICB_CH="${TS_ICB_CH:-2}" # ICB VI2C channel with the temp bus + +# "<7-bit addr>:" in the order they are printed +TS_CB_LIST="${TS_CB_LIST:-0x48:TMP75 0x49:TMP75 0x4C:TMP432}" +TS_ICB_LIST="${TS_ICB_LIST:-0x48:TMP75 0x49:TMP75 0x4C:TMP432}" + +# TMP432 register pointers +_TS432_LOCAL=0x00 +_TS432_REM1=0x01 +_TS432_REM2=0x23 +_TS432_CFG1=0x03 +_TS432_OPEN=0x1B + +# ============================================================================= +# conversion helpers +# ============================================================================= +# _ts_word -> decimal 16-bit word +_ts_word() { echo $(( ( $(($1)) & 0xFF ) << 8 | ( $(($2)) & 0xFF ) )); } + +# _ts_c12 mode: signed | offset64 +# signed : 12-bit two's complement (TMP75, TMP432 std range >=0) +# offset64 : TMP432 extended range, value - 64 +_ts_c12() { + awk -v w="$1" -v m="$2" 'BEGIN{ + r = int(w/16); + if (m == "offset64") { printf "%.1f", r*0.0625 - 64.0; } + else { if (r >= 2048) r -= 4096; printf "%.1f", r*0.0625; } + }' +} + +# _ts_fmt