diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 20c1db3..68417ee 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -120,6 +120,7 @@ Blanton_TTL_Script/ │ ├── Blantons_FPGA_Registers_draft.docx # 同上,客戶原始 docx │ ├── Blantons_FPGA_Registers_Map_draft.xlsx │ ├── Blantons_PCIe_AER_and_DDR_EDAC_checks.pdf # AER / EDAC 檢查點依據 +│ ├── LTC2980_channel_map.csv # 9 個 settings/*.conf 合併:Board,CONN,Ch,NetName,Vnom(144 列) │ ├── TTL_Script_Blanton_Status_20260814.xlsx │ └── TTL_Script_Blanton_Status_20260817.xlsx # ⭐ 最新:三支腳本逐項 Status(OK / On-Going + Owner) │ @@ -127,9 +128,13 @@ Blanton_TTL_Script/ │ ├── bcm_mibpair_report_V1.1.0.py # 離線解析 drivshell log → per-pair TX/RX + PASS/FAIL │ ├── traffic_loopback_vlan_setting.txt # bcmcmd VLAN 30..137 建立 + 成對 pbm(cdN <-> cdN+32) │ ├── traffic_loopback_start.txt # bcmcmd tx 100 length=512 VLantag= -│ └── traffic_loopback_vlan_remove.txt # bcmcmd vlan remove pbm=... -│ # ↑ 三份為手動貼上用的原始指令表, -│ # blanton_traffic_linespeed.sh 是其 bash 版 +│ ├── traffic_loopback_vlan_remove.txt # bcmcmd vlan remove pbm=... +│ │ # ↑ 三份為手動貼上用的原始指令表, +│ │ # blanton_traffic_linespeed.sh 是其 bash 版 +│ ├── 100G_PRBS.txt # 100G PRBS 原始指令(port_prbs_monitor.sh 的來源) +│ ├── TR518.txt # 內建封包測試 tr 518(Scenario=6 Profile=2)— 尚未腳本化 +│ ├── fan_ctrl.txt # MAX31790 unbind/bind + fan-speed-control.sh 30 +│ └── gen_channel_map.sh # settings/*.conf → docs/LTC2980_channel_map.csv(需 gawk) │ ├── secret/ # 🚫 gitignored — DUT 密碼、per-unit BDF、COM 設定 │ ├── README.md # ✅ committed — 用途索引 @@ -246,6 +251,16 @@ Channel 定址:`ch / 8` → `CHIPS[]` index,`ch % 8` → LTC2977 PMBus PAGE > 同一顆 LTC2980 的兩個位址**相差 2**(7-bit,由規格書 8-bit 配對除以 2 而來),不是 1。 > 兩張板共用一條通道,所以同通道上的位址必須互斥 —— 上表兩組(`0x5C/0x5E` 與 `0x62/0x64`)不重疊。 +**全通道 net / 電壓對照:`docs/LTC2980_channel_map.csv`**(9 個 `.conf` × 16ch = 144 列, +欄位 `Board,CONN,Ch,NetName,Vnom`)。查「某個 net 在哪片哪個 channel」比翻 9 個 `.conf` 快。 +CSV 是產出物,不是正本 —— 改完 `.conf` 用 `./tools/gen_channel_map.sh` 重產,別手改 CSV。 +兩件從表上看得出來、改 `.conf` 時要記得的事: + +- **SWB0 與 SWB1 的 net / 電壓完全相同**,差別只在 `CHIPS[]` 的 bus(`0:` vs `1:`)與 `CB_I2C_CH`。 + 也就是說有兩份會各自漂移的重複資料 —— 改了 SWB0 沒改 SWB1,不會有任何東西擋你。 +- **8 個 NC 通道**(SWB0/1 CONN14 的 CH10/CH11/CH13、CONN15 的 CH10)在 CSV 裡以 + `NC` / `-` 原樣保留,不是漏掉;濾掉它們會讓 page 編號對不上。 + ### 3. `profiles/*.conf` — 16-ch 批次 margin 組合 ```bash @@ -600,9 +615,11 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值, - [x] 壓力層改用平台的 `bgctl`(`memtester` / `qfx5252-stress-ssd` / `qfx5252-stress-usb`), 取代 `~/hammer/tools/stress_*.py`;Script B 以 `jobs` + `bgctl list` 兩者並列確認 - [ ] `bgctl list` 之後加數量驗證,不符時 `messagebox` 提示(目前只印出來給人看) + **← V1.0.10 起 `bgctl list` + `jobs` 改為每輪都印,中途死掉的 job 看得到,但仍要靠人眼比對** - [ ] soak 迴圈改為「每輪先 `date`、跑完 `pause <間隔>`」, 把 `EN_LoopInterval`(預設 600 秒 = 10 min)放進 `config.ttl`,兌現 Status 表的「Get data every 10mins」 - **← 目前 `while 1` 仍無 `pause`,實際間隔取決於指令執行時間,不是 10 分鐘** + **← V1.0.10 已補上 `pause 60`(迴圈不再全速空轉),但 60 秒是寫死的、也還沒有每輪 `date`; + 距 Status 表的 10 分鐘仍有差距,故本項未結** - [x] soak 每輪補 `show platform psustatus` / `voltage` / `current` —— 迴圈已改為 `include "utils/setup_pmon.ttl"`,九項全收 - [ ] 補 `; ========== CLEAR EVENT ==========`(Status 表 ScriptB #1,Owner: Alan) @@ -735,6 +752,13 @@ margin status、全部 VRM 軌的 Vin/Vout/Iout/Temp、CB + ICB 溫感讀值, - **風扇確認提示是無限等待**:`wait "Set all configured fan channels to"` 之後才 `sendln "y"`; 若該版 `fan-speed-control.sh` 不再詢問(或字串改了),這個 `wait` 會永遠等下去,Script A 停在那裡 且不報錯。加個 `timeout` + 分支會比較保險(記得還原 `timeout = 0`)。 +- **TR518 內建封包測試尚未腳本化**:`tools/TR518.txt` 記下了 `tr 518 Scenario=6 Profile=2 Count=260 + PktSize=324 PortList=1-259,270-565` 這組指令(含 `port all lb=mac` + `l2 learn off` 前置), + 目前只能手貼。它與 `blanton_traffic_linespeed` 是兩條互斥的打流路線(都會動 loopback 與 L2 學習), + 要腳本化的話得先決定兩者怎麼共存,不能同時跑。 +- **`settings/` 裡 SWB0 與 SWB1 是兩份相同的資料**:8 個 `.conf` 中,SWB1 的四個除了 `CHIPS[]` 的 + bus 與 `CB_I2C_CH` 之外,net name 與 `VNOM` 與 SWB0 逐欄相同(見 `docs/LTC2980_channel_map.csv`)。 + 改一邊忘了改另一邊不會有任何警告。可考慮改成「共用 net 定義 + 各自的 transport 覆寫」兩層檔案。 - **Script C 沒有倒出 `mgmt_ping.log`**:C 會 `stop` 管理網路監控並印 `ip -s link show`, 但沒有 `cat ~/Blanton_Script/log/mgmt_ping.log`,所以整個 soak 期間累積的 per-leg `RESULT` 留在 DUT 上、沒進 master log。Script A 那輪基線有 `cat`。 diff --git a/CLAUDE.md b/CLAUDE.md index a35a63b..4a216ca 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9,13 +9,14 @@ DUT 端的取數能力由一組 **bash 工具庫** 提供(CB FPGA `pcimem` → 完整架構見 [ARCHITECTURE.md](ARCHITECTURE.md)。 -**目前狀態(2026-08-26)**:Script A 為 **V1.0.9**(A 集中記錄 A/B/C 三支的變更)。涵蓋 +**目前狀態(2026-08-27)**:Script A 為 **V1.0.10**(A 集中記錄 A/B/C 三支的變更)。涵蓋 PCIe AER / DDR EDAC / PMON+TPM / 電壓 margin(9 顆 LTC2980)/ SWB loopback 線速流量 / 10G+1G 管理網路 ping / BMC DDR 與 USB / NVMe 健康,壓力層走平台的 `bgctl`。 switch unit 數量由 `config.ttl` 的 `SWB_UNIT0` / `SWB_UNIT1` 宣告,風扇轉速由 `FAN_SPEED` 指定。 測試 job log 收在 DUT 的 `/host/hw-eval/jobs/`,Script C 結束時掛好 USB 再帶時戳複製到 `/mnt/usb/`。 100G PRBS(`port_prbs_monitor.sh`)已隨包交付,但 **A/B/C 的呼叫仍註解掉**,還在 bring-up。 -最後一次發布是 **V1.0.5**;SWB 的 I2C 通道與位址已於 2026-08-19 上機驗證。 +Script B 的 soak 迴圈每輪印 `bgctl list` + `jobs`,並 `pause 60`(V1.0.10 之前完全沒有 pause)。 +最後一次發布是 **V1.0.9**;SWB 的 I2C 通道與位址已於 2026-08-19 上機驗證。 交付用 `./publish/publish.sh` 打包。 ## 技術棧 @@ -106,6 +107,11 @@ bgctl run /usr/sbin/memtester 1G 100 bgctl list bgctl stop --all ; bgctl reset --yes +# ── 通道對照表(開發機上跑,改完 settings/*.conf 一定要重產)── +./tools/gen_channel_map.sh # → docs/LTC2980_channel_map.csv(144 列) +./tools/gen_channel_map.sh - # 只印到 stdout +# ⚠️ 需要 gawk(用到 3 參數的 match());mawk 會直接擋下並提示 + # ── 各工具的 help ─────────────────────────────────── blanton_fpga_help ; blanton_cb_i2c_help ; vi2c_help temp_sensor_help ; pwr_data_help ; blanton_traffic_linespeed_help @@ -222,10 +228,13 @@ Tera Term 連 COM port (115200-8-N-1) ## 資料夾說明 - `src/Script_ABC_Blanton/` — 可執行內容(Tera Term 工作目錄;內含要 scp 到 DUT 的 `Blanton_Script/`) -- `docs/` — 客戶 FPGA 規格、AER/EDAC 檢查依據、逐項 Status 表(最新為 `*_20260817.xlsx`) +- `docs/` — 客戶 FPGA 規格、AER/EDAC 檢查依據、逐項 Status 表(最新為 `*_20260817.xlsx`)、 + `LTC2980_channel_map.csv`(9 個 `settings/*.conf` 合併成 Board,CONN,Ch,NetName,Vnom 144 列, + 查 net 對應哪片哪個 channel 用;**改 `.conf` 後要重跑產生**) - `tools/` — Host / 離線端:`bcm_mibpair_report_V1.1.0.py`(drivshell log → per-pair 報表)、 `traffic_loopback_*.txt`(bcmcmd 原始指令表,`blanton_traffic_linespeed.sh` 是其 bash 版, - **改 loopback 線路時兩邊要同步**) + **改 loopback 線路時兩邊要同步**)、`100G_PRBS.txt` / `TR518.txt` / `fan_ctrl.txt` + (上機手貼用的原始指令;PRBS 已有 `.sh`,TR518 尚未腳本化) - `publish/` — `publish.sh`(打包工具,**進 git**)+ `Script_ABC_Blanton_/` 產出(**gitignored**) - `secret/` — 🚫 gitignored(除 `README.md` 與 `*.example`):DUT 帳密、per-unit BDF 覆寫、COM 設定 - `For_AI/` — 🚫 gitignored:AI 協作素材(波形截圖、草稿筆記) diff --git a/docs/LTC2980_channel_map.csv b/docs/LTC2980_channel_map.csv new file mode 100644 index 0000000..ec7c721 --- /dev/null +++ b/docs/LTC2980_channel_map.csv @@ -0,0 +1,145 @@ +Board,CONN,Ch,NetName,Vnom +CB,CONN13,CH0,V5P0_ALW,5.0 +CB,CONN13,CH1,V3P3_ALW,3.3 +CB,CONN13,CH2,PWR_VDD_MISC_ALW,0.75 +CB,CONN13,CH3,V1P8_ALW,1.8 +CB,CONN13,CH4,PWR_APU_VDDIO_SUS,1.1 +CB,CONN13,CH5,PWR_VDD_MISC_RUN,0.75 +CB,CONN13,CH6,PWR_APU_VDD_MEM_RUN,0.78 +CB,CONN13,CH7,V0P8_PHY2_DVDD,0.8 +CB,CONN13,CH8,V0P8_AVDD,0.8 +CB,CONN13,CH9,V0P8_PHY,0.8 +CB,CONN13,CH10,V1P8_FPGA,1.8 +CB,CONN13,CH11,V2P5_FPGA,2.5 +CB,CONN13,CH12,V1P1_FPGA,1.1 +CB,CONN13,CH13,P5V_STBY,5.0 +CB,CONN13,CH14,P3V3_STBY,3.3 +CB,CONN13,CH15,V0P8_PHY2_AVDD,0.8 +SWB0,CONN13,CH0,P0V75_DVDD_47,0.75 +SWB0,CONN13,CH1,P0V75_AVDD_47,0.75 +SWB0,CONN13,CH2,P1V5_AVDD_47,1.5 +SWB0,CONN13,CH3,P0V9_AVDD_47,0.9 +SWB0,CONN13,CH4,P1V8_1,1.8 +SWB0,CONN13,CH5,PVDD3_3V_SYNTH_LDO_A3,3.3 +SWB0,CONN13,CH6,PVDD3_3V_SYNTH_LDO_B1,3.3 +SWB0,CONN13,CH7,P1V8_3,1.8 +SWB0,CONN13,CH8,P1V8_DVDDIO_3,1.8 +SWB0,CONN13,CH9,P0V75_DVDD_39,0.75 +SWB0,CONN13,CH10,P0V75_AVDD_39,0.75 +SWB0,CONN13,CH11,P1V5_AVDD_39,1.5 +SWB0,CONN13,CH12,P0V9_AVDD_39,0.9 +SWB0,CONN13,CH13,PVDD1V5_2,1.5 +SWB0,CONN13,CH14,PVDD1V8_DUT,1.8 +SWB0,CONN13,CH15,PVDD_MDIO,1.2 +SWB0,CONN14,CH0,P0V75_AVDD_7,0.75 +SWB0,CONN14,CH1,P1V5_AVDD_7,1.5 +SWB0,CONN14,CH2,P0V9_AVDD_7,0.9 +SWB0,CONN14,CH3,P1V8_5,1.8 +SWB0,CONN14,CH4,P1V8_2,1.8 +SWB0,CONN14,CH5,PVDD3_3V_SYNTH_LDO_B2,3.3 +SWB0,CONN14,CH6,PVDD3_3V_SYNTH_LDO_A2,3.3 +SWB0,CONN14,CH7,PVDD3_3V_SYNTH_LDO_A1,3.3 +SWB0,CONN14,CH8,PVDD1V5_TSC,1.5 +SWB0,CONN14,CH9,PVDD1V5_ANLG,1.5 +SWB0,CONN14,CH10,NC,- +SWB0,CONN14,CH11,NC,- +SWB0,CONN14,CH12,PVDD1V5_1,1.5 +SWB0,CONN14,CH13,NC,- +SWB0,CONN14,CH14,P1V8_DVDDIO_1,1.8 +SWB0,CONN14,CH15,P0V75_DVDD_7,0.75 +SWB0,CONN15,CH0,P1V5_AVDD_55,1.5 +SWB0,CONN15,CH1,P0V9_AVDD_55,0.9 +SWB0,CONN15,CH2,P0V75_DVDD_63,0.75 +SWB0,CONN15,CH3,P0V75_AVDD_63,0.75 +SWB0,CONN15,CH4,P1V5_AVDD_63,1.5 +SWB0,CONN15,CH5,P0V9_AVDD_63,0.9 +SWB0,CONN15,CH6,PVDD3_3V_SYNTH_LDO_B3,3.3 +SWB0,CONN15,CH7,PVDD1V5_3,1.5 +SWB0,CONN15,CH8,P0V85_STBY,0.85 +SWB0,CONN15,CH9,P1V8_STBY,1.8 +SWB0,CONN15,CH10,NC,- +SWB0,CONN15,CH11,P3V3_STBY,3.3 +SWB0,CONN15,CH12,PVDD0V9_2,0.9 +SWB0,CONN15,CH13,P0V75_DVDD_55,0.75 +SWB0,CONN15,CH14,P0V75_AVDD_55,0.75 +SWB0,CONN15,CH15,P1V8_DVDDIO_4,1.8 +SWB0,CONN16,CH0,PVDD1V5_0,1.5 +SWB0,CONN16,CH1,P1V8_4,1.8 +SWB0,CONN16,CH2,PVDD3_3V_SYNTH_LDO_B5,3.3 +SWB0,CONN16,CH3,PVDD3_3V_SYNTH_LDO_A5,3.3 +SWB0,CONN16,CH4,PVDD3_3V_SYNTH_LDO_B4,3.3 +SWB0,CONN16,CH5,PVDD3_3V_SYNTH_LDO_A4,3.3 +SWB0,CONN16,CH6,P3V3,3.3 +SWB0,CONN16,CH7,PVDD0_8V_T3,0.8 +SWB0,CONN16,CH8,P0V75_DVDD_1,0.75 +SWB0,CONN16,CH9,P0V75_AVDD_1,0.75 +SWB0,CONN16,CH10,P1V5_AVDD_1,1.5 +SWB0,CONN16,CH11,P0V9_AVDD_1,0.9 +SWB0,CONN16,CH12,PVDD0V9_0,0.9 +SWB0,CONN16,CH13,PVDD0V9_1,0.9 +SWB0,CONN16,CH14,PVDD0V9_3,0.9 +SWB0,CONN16,CH15,PVDD1V2_T3,1.2 +SWB1,CONN13,CH0,P0V75_DVDD_47,0.75 +SWB1,CONN13,CH1,P0V75_AVDD_47,0.75 +SWB1,CONN13,CH2,P1V5_AVDD_47,1.5 +SWB1,CONN13,CH3,P0V9_AVDD_47,0.9 +SWB1,CONN13,CH4,P1V8_1,1.8 +SWB1,CONN13,CH5,PVDD3_3V_SYNTH_LDO_A3,3.3 +SWB1,CONN13,CH6,PVDD3_3V_SYNTH_LDO_B1,3.3 +SWB1,CONN13,CH7,P1V8_3,1.8 +SWB1,CONN13,CH8,P1V8_DVDDIO_3,1.8 +SWB1,CONN13,CH9,P0V75_DVDD_39,0.75 +SWB1,CONN13,CH10,P0V75_AVDD_39,0.75 +SWB1,CONN13,CH11,P1V5_AVDD_39,1.5 +SWB1,CONN13,CH12,P0V9_AVDD_39,0.9 +SWB1,CONN13,CH13,PVDD1V5_2,1.5 +SWB1,CONN13,CH14,PVDD1V8_DUT,1.8 +SWB1,CONN13,CH15,PVDD_MDIO,1.2 +SWB1,CONN14,CH0,P0V75_AVDD_7,0.75 +SWB1,CONN14,CH1,P1V5_AVDD_7,1.5 +SWB1,CONN14,CH2,P0V9_AVDD_7,0.9 +SWB1,CONN14,CH3,P1V8_5,1.8 +SWB1,CONN14,CH4,P1V8_2,1.8 +SWB1,CONN14,CH5,PVDD3_3V_SYNTH_LDO_B2,3.3 +SWB1,CONN14,CH6,PVDD3_3V_SYNTH_LDO_A2,3.3 +SWB1,CONN14,CH7,PVDD3_3V_SYNTH_LDO_A1,3.3 +SWB1,CONN14,CH8,PVDD1V5_TSC,1.5 +SWB1,CONN14,CH9,PVDD1V5_ANLG,1.5 +SWB1,CONN14,CH10,NC,- +SWB1,CONN14,CH11,NC,- +SWB1,CONN14,CH12,PVDD1V5_1,1.5 +SWB1,CONN14,CH13,NC,- +SWB1,CONN14,CH14,P1V8_DVDDIO_1,1.8 +SWB1,CONN14,CH15,P0V75_DVDD_7,0.75 +SWB1,CONN15,CH0,P1V5_AVDD_55,1.5 +SWB1,CONN15,CH1,P0V9_AVDD_55,0.9 +SWB1,CONN15,CH2,P0V75_DVDD_63,0.75 +SWB1,CONN15,CH3,P0V75_AVDD_63,0.75 +SWB1,CONN15,CH4,P1V5_AVDD_63,1.5 +SWB1,CONN15,CH5,P0V9_AVDD_63,0.9 +SWB1,CONN15,CH6,PVDD3_3V_SYNTH_LDO_B3,3.3 +SWB1,CONN15,CH7,PVDD1V5_3,1.5 +SWB1,CONN15,CH8,P0V85_STBY,0.85 +SWB1,CONN15,CH9,P1V8_STBY,1.8 +SWB1,CONN15,CH10,NC,- +SWB1,CONN15,CH11,P3V3_STBY,3.3 +SWB1,CONN15,CH12,PVDD0V9_2,0.9 +SWB1,CONN15,CH13,P0V75_DVDD_55,0.75 +SWB1,CONN15,CH14,P0V75_AVDD_55,0.75 +SWB1,CONN15,CH15,P1V8_DVDDIO_4,1.8 +SWB1,CONN16,CH0,PVDD1V5_0,1.5 +SWB1,CONN16,CH1,P1V8_4,1.8 +SWB1,CONN16,CH2,PVDD3_3V_SYNTH_LDO_B5,3.3 +SWB1,CONN16,CH3,PVDD3_3V_SYNTH_LDO_A5,3.3 +SWB1,CONN16,CH4,PVDD3_3V_SYNTH_LDO_B4,3.3 +SWB1,CONN16,CH5,PVDD3_3V_SYNTH_LDO_A4,3.3 +SWB1,CONN16,CH6,P3V3,3.3 +SWB1,CONN16,CH7,PVDD0_8V_T3,0.8 +SWB1,CONN16,CH8,P0V75_DVDD_1,0.75 +SWB1,CONN16,CH9,P0V75_AVDD_1,0.75 +SWB1,CONN16,CH10,P1V5_AVDD_1,1.5 +SWB1,CONN16,CH11,P0V9_AVDD_1,0.9 +SWB1,CONN16,CH12,PVDD0V9_0,0.9 +SWB1,CONN16,CH13,PVDD0V9_1,0.9 +SWB1,CONN16,CH14,PVDD0V9_3,0.9 +SWB1,CONN16,CH15,PVDD1V2_T3,1.2 diff --git a/docs/release-notes/v1.0.10.md b/docs/release-notes/v1.0.10.md new file mode 100644 index 0000000..ec4fa74 --- /dev/null +++ b/docs/release-notes/v1.0.10.md @@ -0,0 +1,56 @@ +# v1.0.10 — The soak loop stops spinning flat out, and shows you what is still running + +## ✨ New features + +**Every soak round now reports the background jobs** +* Script B's monitoring loop prints `bgctl list` (platform jobs) and `jobs` (the login shell's own background jobs) on every pass, right after the platform data. A stress job that dies three hours into an overnight soak now shows up as a shorter list on the next round, instead of only being noticed at the end — or not at all. +* The two lists answer different questions and are both worth having: `bgctl` knows about the platform's job runner, `jobs` knows about anything the macro backgrounded in that shell. + +**A single table for all 144 margin channels** +* `docs/LTC2980_channel_map.csv` flattens the nine `settings/*.conf` files into one sheet — `Board,CONN,Ch,NetName,Vnom` — so "which board and channel is `PVDD1V5_TSC` on?" is one search instead of opening nine files. +* `tools/gen_channel_map.sh` regenerates it. **The CSV is output, not source**: edit the `.conf` files and re-run the script, never the other way round. +* Unused channels stay in the table as `NC` / `-` rather than being dropped, because the channel number is also the PMBus page (`ch / 8` picks the chip, `ch % 8` picks the page) — filtering the gaps out would shift everything after them. + +**The bench command lists that these scripts came from** +* `tools/100G_PRBS.txt`, `tools/TR518.txt` and `tools/fan_ctrl.txt` join the existing `traffic_loopback_*.txt` set: the raw `bcmcmd` / sysfs sequences, kept in the form you can paste into a console when a script is misbehaving and you want to drive the hardware directly. + +## 🐛 Bug fixes + +**The soak loop ran as fast as the DUT could answer** +* `while 1` had no pause at all, so each round started the moment the previous one finished. Over a long soak that means constant console traffic and a log full of near-identical samples taken seconds apart. The loop now ends each round with `pause 60`. +* Note the gap this leaves: the Status sheet asks for a 10-minute sampling interval, and 60 seconds is still hard-coded rather than configurable. This makes the loop sane, it does not finish the job. + +**A comment promised a cadence the code never had** +* The loop was labelled `Get data every 10mins` while running with no delay whatsoever. It now says what it does. + +## 📦 Downloads + +| File | Contents | +|---|---| +| `Script_ABC_Blanton_V1.0.10.zip` | The full Tera Term working directory, including `Blanton_Script/` to copy onto the DUT | + +**After copying to the DUT:** + +```bash +chmod +x ~/Blanton_Script/*.sh # see below +grep -rlU $'\r' ~/Blanton_Script # expect no output +``` + +`mgmt_ping_monitor.sh` and `port_prbs_monitor.sh` launch their workers through `bash`, so those two run without the execute bit. `bmc_monitor.sh` and `usb_target.sh` still need it, and neither git (mode 100644) nor a Windows/USB copy carries it. Without the `chmod`, `start` fails with `Permission denied` and the later `cat` finds nothing: **the section ends up empty and nothing reports an error.** + +## ⚠️ Before you run + +* **Declare the switch population.** `SWB_UNIT0` / `SWB_UNIT1` in `config.ttl` say which switch units this DUT has; traffic and the readiness gate both follow them. +* **Set `FAN_SPEED`.** It is applied at the start of every run. +* **Management connectivity is in use, not preserved.** Both management NICs are up and pinging — drive the run from the serial console. +* **PRBS is still not wired into the macros.** Run `port_prbs_monitor.sh` by hand if you want it; the calls in A/B/C remain commented out, unchanged from v1.0.9. +* **TR518 and the loopback traffic test cannot both run.** `tools/TR518.txt` sets `port all lb=mac` and `l2 learn off` across the whole unit, which is the same hardware `blanton_traffic_linespeed` is using. Pick one. +* **Two settings persist to `config_db.json`** and survive a reboot: LLDP is left disabled and the 100G uplinks are left configured. Restore them before the DUT moves on. + +## 🔗 Links + +* [ARCHITECTURE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/ARCHITECTURE.md) — test flow, data models, constraints +* [CLAUDE.md](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/CLAUDE.md) — commands and the bench gotchas +* [LTC2980_channel_map.csv](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/src/branch/main/docs/LTC2980_channel_map.csv) — all 144 margin channels + +**Full changelog:** [V1.0.9...V1.0.10](https://etgit.et-wen.com/etwen/Blanton_TTL_Script/compare/V1.0.9...V1.0.10) diff --git a/src/Script_ABC_Blanton/1_Blanton_Script_A.ttl b/src/Script_ABC_Blanton/1_Blanton_Script_A.ttl index 86c6a66..55c7280 100644 --- a/src/Script_ABC_Blanton/1_Blanton_Script_A.ttl +++ b/src/Script_ABC_Blanton/1_Blanton_Script_A.ttl @@ -1,7 +1,7 @@ ; ============================================================================= ; Script A for Blanton -; Version : V1.0.9 -; Date : 2026-08-26 +; Version : V1.0.10 +; Date : 2026-08-27 ; Author : ETWen ; ============================================================================= ; Version History: @@ -65,6 +65,15 @@ ; ScriptA/B/C Job log path /host/hw-eval/current/jobs -> /host/hw-eval/jobs ; ScriptC Mount the USB (usb_target.sh) before copying the job logs ; ScriptC Reorder results: stress logs, then MGMT ping, then 100G status +; V1.0.10 2026-08-27 ScriptB Monitor loop lists the background jobs every round +; + bgctl list - platform jobs +; + jobs - shell jobs of the login shell +; + pause 60 - the loop used to run with no pause at all +; docs/LTC2980_channel_map.csv Channel / net / Vnom map built from settings/*.conf +; tools/gen_channel_map.sh Regenerates that CSV - the CSV is output, not source +; tools/100G_PRBS.txt Bench command references, kept for hand-run debug +; tools/TR518.txt TR518 = built-in packet test (swutil / bcmcmd tr 518) +; tools/fan_ctrl.txt MAX31790 rebind + fan-speed-control.sh ; ============================================================================= include "config.ttl" diff --git a/src/Script_ABC_Blanton/2_Blanton_Script_B.ttl b/src/Script_ABC_Blanton/2_Blanton_Script_B.ttl index cb147ae..a62d545 100644 --- a/src/Script_ABC_Blanton/2_Blanton_Script_B.ttl +++ b/src/Script_ABC_Blanton/2_Blanton_Script_B.ttl @@ -161,11 +161,16 @@ endif -; ========== Get data every 10mins ========== +; ========== Monitor loop: platform data + background jobs (pause 60s per round) ========== while 1 include "utils/setup_pmon.ttl" + wait prompt_sonic_root + sendln "bgctl list" + wait prompt_sonic_root + sendln "jobs" ; ========== Check Margin ========== if EN_Margin = 1 then include "utils/show_margin_status.ttl" endif -endwhile \ No newline at end of file + pause 60 +endwhile diff --git a/tools/100G_PRBS.txt b/tools/100G_PRBS.txt new file mode 100644 index 0000000..ed319b5 --- /dev/null +++ b/tools/100G_PRBS.txt @@ -0,0 +1,63 @@ + + +echo PORTS0=$(bcmcmd -n 0 -c ps | grep -w up | wc -l) +echo PORTS0=$(bcmcmd -n 1 -c ps | grep -w up | wc -l) + +show interfaces status Ethernet513,Ethernet514 + + +//100G Port 513 +sudo sfputil lpmode off Ethernet513 +bcmcmd -n 0 -c 'dsh -c "phy diag 268 prbs set p=3"' +bcmcmd -n 0 -c 'dsh -c "phy diag 268 prbsstat STArt Interval=5"' + +bcmcmd -n 0 -c 'dsh -c "phy diag 268 prbs get"' +bcmcmd -n 0 -c 'dsh -c "phydiag 268 prbsstat Ber"' + +bcmcmd -n 0 -c 'dsh -c "phydiag 268 prbsstat STOp"' +bcmcmd -n 0 -c 'dsh -c "phydiag 268 prbs clear"' + + +//100G Port 514 +sudo sfputil lpmode off Ethernet514 +bcmcmd -n 1 -c 'dsh -c "phy diag 268 prbs set p=3"' +bcmcmd -n 1 -c 'dsh -c "phy diag 268 prbsstat STArt Interval=5"' +bcmcmd -n 1 -c 'dsh -c "phy diag 268 prbs get"' +bcmcmd -n 1 -c 'dsh -c "phydiag 268 prbsstat Ber"' +bcmcmd -n 1 -c 'dsh -c "phydiag 268 prbsstat STOp"' +bcmcmd -n 1 -c 'dsh -c "phydiag 268 prbs clear"' + + + + + +//100G Port 513 +sudo sfputil lpmode off Ethernet513 +sudo sfputil lpmode off Ethernet514 + +bcmcmd -n 0 -c 'dsh -c "phy diag 268 prbs set p=3"' +sleep 1 +bcmcmd -n 1 -c 'dsh -c "phy diag 268 prbs set p=3"' + +bcmcmd -n 0 -c 'dsh -c "phy diag 268 prbsstat STArt Interval=5"' +sleep 1 +bcmcmd -n 1 -c 'dsh -c "phy diag 268 prbsstat STArt Interval=5"' + +bcmcmd -n 0 -c 'dsh -c "phy diag 268 prbs get"' +sleep 1 +bcmcmd -n 1 -c 'dsh -c "phy diag 268 prbs get"' + +bcmcmd -n 0 -c 'dsh -c "phydiag 268 prbsstat Ber"' +sleep 1 +bcmcmd -n 1 -c 'dsh -c "phydiag 268 prbsstat Ber"' + +bcmcmd -n 0 -c 'dsh -c "phydiag 268 prbsstat STOp"' +sleep 1 +bcmcmd -n 1 -c 'dsh -c "phydiag 268 prbsstat STOp"' + +bcmcmd -n 0 -c 'dsh -c "phydiag 268 prbs clear"' +sleep 1 +bcmcmd -n 1 -c 'dsh -c "phydiag 268 prbs clear"' + + + diff --git a/tools/TR518.txt b/tools/TR518.txt new file mode 100644 index 0000000..bc2f2eb --- /dev/null +++ b/tools/TR518.txt @@ -0,0 +1,32 @@ +bcmcmd -n 0 -c '*:port all lb=mac' +bcmcmd -n 0 -c '*:l2 learn off' +bcmcmd -n 0 -c '*:dsh -c "test mode nr=yes"' +bcmcmd -n 0 -c '*:dsh -c "tr 518 Scenario=6 Profile=2 Count=260 PktSize=324 PortList=1-259,270-565 rm=ext CheckLinkTime=20 CheckDataTime=200 testphase=2"' + +bcmcmd -n 1 -c "*:port all lb=mac" +bcmcmd -n 1 -c "*:l2 learn off" +bcmcmd -n 1 -c "*:dsh -c 'test mode nr=yes'" +bcmcmd -n 1 -c "*:dsh -c 'tr 518 Scenario=6 Profile=2 Count=260 PktSize=324 PortList=1-259,270-565 rm=ext CheckLinkTime=20 CheckDataTime=200 testphase=2'" + + +bcmcmd -n 0 -c "*:port all lb=mac" +sleep 1 +bcmcmd -n 1 -c "*:port all lb=mac" +sleep 1 +bcmcmd -n 0 -c "*:l2 learn off" +sleep 1 +bcmcmd -n 1 -c "*:l2 learn off" +sleep 1 +bcmcmd -n 0 -c "*:dsh -c 'test mode nr=yes'" +sleep 1 +bcmcmd -n 1 -c "*:dsh -c 'test mode nr=yes'" +sleep 1 +bcmcmd -n 0 -c "*:dsh -c 'tr 518 Scenario=6 Profile=2 Count=260 PktSize=324 PortList=1-259,270-565 rm=ext CheckLinkTime=20 CheckDataTime=200 testphase=2'" +sleep 1 +bcmcmd -n 1 -c "*:dsh -c 'tr 518 Scenario=6 Profile=2 Count=260 PktSize=324 PortList=1-259,270-565 rm=ext CheckLinkTime=20 CheckDataTime=200 testphase=2'" +sleep 1 + + +root@(none):/usr/local/bin# swutil *:l2 learn off +root@(none):/usr/local/bin# swutil *:dsh -c \"test mode nr=yes\" +root@(none):/usr/local/bin# swutil *:dsh -c \"tr 518 Scenario=6 Profile=2 Count=260 PktSize=324 PortList=1-259,270-565 rm=ext CheckLinkTime=20 CheckDataTime=200 testphase=2" \ No newline at end of file diff --git a/tools/fan_ctrl.txt b/tools/fan_ctrl.txt new file mode 100644 index 0000000..c5ce749 --- /dev/null +++ b/tools/fan_ctrl.txt @@ -0,0 +1,7 @@ +echo 18-0020 > /sys/bus/i2c/drivers/max31790/unbind +sleep .5 +echo 18-0020 > /sys/bus/i2c/drivers/max31790/bind +echo 25-0020 > /sys/bus/i2c/drivers/max31790/unbind +sleep .5 +echo 25-0020 > /sys/bus/i2c/drivers/max31790/bind +fan-speed-control.sh 30 diff --git a/tools/gen_channel_map.sh b/tools/gen_channel_map.sh new file mode 100644 index 0000000..f4f3f30 --- /dev/null +++ b/tools/gen_channel_map.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# ============================================================================= +# gen_channel_map.sh - Build docs/LTC2980_channel_map.csv from settings/*.conf +# Version : V1.0.0 +# Date : 2026-08-27 +# Author : ETWen +# ============================================================================= +# Runs on the DEV machine, not the DUT. Reads every LTC2980 margin settings +# file and flattens CH_VNOM / CH_NET into one CSV: +# +# Board,CONN,Ch,NetName,Vnom +# CB,CONN13,CH0,V5P0_ALW,5.0 +# +# NC channels keep their literal NC / "-" so the page numbering still lines up +# (ch/8 -> CHIPS[] index, ch%8 -> LTC2977 PAGE). Do not filter them out. +# +# Usage: +# tools/gen_channel_map.sh # write docs/LTC2980_channel_map.csv +# tools/gen_channel_map.sh - # write to stdout +# ============================================================================= +set -eu + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +SET_DIR="${REPO_ROOT}/src/Script_ABC_Blanton/Blanton_Script/LTC2980_Margin_Script/settings" +OUT="${1:-${REPO_ROOT}/docs/LTC2980_channel_map.csv}" + +[ -d "${SET_DIR}" ] || { echo "settings dir not found: ${SET_DIR}" >&2; exit 1; } + +# 3-argument match(str, regex, array) is a gawk extension. Under mawk it is a +# syntax error at best and an empty CSV at worst - fail loudly instead. +awk 'BEGIN { if (match("a", /a/, m) != 1) exit 1 }' 2>/dev/null \ + || { echo "need gawk (3-arg match); this awk is: $(awk --version 2>&1 | head -1)" >&2; exit 1; } + +gen() { + printf 'Board,CONN,Ch,NetName,Vnom\n' + # CB first, then SWB0/SWB1 CONN13..CONN16 - matches the physical walk order. + for f in "${SET_DIR}"/Blanton_CB_CONN*.conf \ + "${SET_DIR}"/Blanton_SWB0_CONN*.conf \ + "${SET_DIR}"/Blanton_SWB1_CONN*.conf ; do + [ -f "${f}" ] || continue + base="$(basename "${f}" .conf)" # Blanton_SWB0_CONN13 + board="$(echo "${base}" | cut -d_ -f2)" # SWB0 + conn="$(echo "${base}" | cut -d_ -f3)" # CONN13 + + # .conf files are LF per .gitattributes, but strip CR anyway - a stray + # CR would land inside the net name and travel into the CSV unseen. + sed 's/\r$//' "${f}" | awk -v b="${board}" -v c="${conn}" ' + match($0, /^CH([0-9]+)_VNOM="([^"]*)"[^"]*CH[0-9]+_NET="([^"]*)"/, m) { + printf "%s,%s,CH%s,%s,%s\n", b, c, m[1], m[3], m[2] + }' + done +} + +if [ "${OUT}" = "-" ]; then + gen +else + gen > "${OUT}" + echo "wrote ${OUT} ($(($(wc -l < "${OUT}") - 1)) channels)" +fi