콘텐츠로 이동

펌웨어 업데이트(rbln-flash)

rbln-flash는 RBLN NPU의 펌웨어를 업데이트하는 명령줄 도구로, 여러 장치를 병렬로 업데이트할 수 있습니다.

두 가지 업데이트 모드를 제공합니다:

  • CP 펌웨어 업데이트: CP(Command Processor) 펌웨어를 업데이트합니다.
  • MCU(SMC) 펌웨어 업데이트: SMC(System Management Controller) 펌웨어를 업데이트합니다.

Info

업데이트하는 동안 장치를 사용할 수 없습니다. 업데이트 전에 모든 워크로드를 중지하고, rbln-smd를 중지한 뒤 rebellions 드라이버를 언로드해야 합니다. 필요한 명령은 rbln-flash 실행 전에 정리되어 있습니다.

빠른 시작

CP 펌웨어 업데이트(디렉터리 모드, 모든 장치)

$ sudo systemctl stop rbln-smd.service
$ sudo modprobe -r rebellions

$ sudo rbln-flash --cp -d <DIR_PATH> -s all

$ sudo modprobe rebellions
$ sudo systemctl start rbln-smd.service

$ rbln-smi -q -qd npu,name,device,fw_ver

모든 장치의 fw_ver 열에 새 펌웨어 버전이 표시되는지 확인합니다.

주요 개념 및 용어

업데이트 선택

  • 업데이트 모드(Update mode): CP(--cp) 또는 MCU(SMC)(--mcu).
  • 이미지 소스(Image source): 단일 펌웨어 이미지 파일(-f) 또는 펌웨어 디렉터리(-d).
  • 대상(Targets): PCI BDF(bus/device/function)로 지정한 단일 장치(예: -s 01:00.0) 또는 모든 장치(-s all).

플래그 구문과 제약 사항(예: "--cp와 --mcu 중 하나만 지정")은 명령어 참조에서 확인할 수 있습니다.

명령어 참조

rbln-flash 실행 전

사전 조건

패키지가 이미 설치되어 있고 드라이버가 로드된 상태라면, rbln-smd를 중지하고 rebellions 드라이버를 언로드합니다.

$ sudo systemctl stop rbln-smd.service
$ sudo modprobe -r rebellions

업데이트 후

새 펌웨어는 다음과 같이 적용됩니다:

  • Rebel100™: rbln-flash가 업데이트한 장치를 각각 리셋하고, 정상 부팅을 확인한 뒤 SUCCESS를 보고합니다. MCU 업데이트에서는 장치가 새 SMC 펌웨어 버전으로 동작하는지도 확인합니다.
  • ATOM™: rebellions 드라이버를 다시 로드하면 새 펌웨어가 적용됩니다.

드라이버를 로드하고 rbln-smd를 다시 시작한 뒤 CP 펌웨어 버전을 확인합니다:

$ sudo modprobe rebellions
$ sudo systemctl start rbln-smd.service
$ rbln-smi -q -qd npu,name,device,fw_ver

모든 장치의 fw_ver 열에 새 버전이 표시되는지 확인합니다. rbln-smi는 CP 펌웨어 버전을 보여 주며, SMC 펌웨어 버전은 보여 주지 않습니다.

Note

Rebel100™을 업데이트했거나 RBLN-CA22의 MCU를 업데이트했다면, rbln-flash는 종료하면서 PCI 장치를 다시 스캔하고 이때 rebellions 드라이버가 자동으로 로드될 수 있습니다. CP 업데이트 직후 MCU를 업데이트하는 경우처럼 rbln-flash를 다시 실행하기 전에는 lsmod | grep rebellions로 드라이버가 로드되어 있는지 확인하고, 목록에 있으면 언로드해야 합니다. 언로드하지 않으면 240(-EBUSY)으로 종료합니다.

기본 사용법

$ sudo rbln-flash --cp -f <FILE_PATH> -s <PCI_ADDR | all>
$ sudo rbln-flash --cp -d <DIR_PATH> -s <PCI_ADDR | all>

$ sudo rbln-flash --mcu -f <FILE_PATH> -s <PCI_ADDR | all>
$ sudo rbln-flash --mcu -d <DIR_PATH> -s <PCI_ADDR | all>

옵션

옵션 설명 예시
--cp CP(Command Processor)의 펌웨어를 업데이트합니다. --cp -f image.gpt
--mcu MCU(SMC)의 펌웨어를 업데이트합니다. --mcu -f smc_fw.bin
-d, --dir <DIR_PATH> 업데이트할 이미지가 들어 있는 디렉터리입니다. -d /lib/firmware/3.0/
-f, --file <FILE_PATH> 업데이트할 단일 이미지의 전체 경로입니다. -f /lib/firmware/3.0/image.bin
-s, --pci_addr <PCI_ADDR | all> 업데이트 대상 장치입니다. lspci에 표시되는 BB:DD.F 형식(예: 01:00.0)으로 지정하거나, all로 모든 장치를 선택합니다. -s 01:00.0 | -s all
-l, --logfile <LOG_PATH> 상세 업데이트 로그를 저장할 파일 경로입니다. 생략하면 로그를 표준 출력(stdout)으로만 출력합니다. -l update.log
-h, --help 도움말을 표시하고 종료합니다. --help
--version 버전 정보를 표시하고 종료합니다. --version

Note

  • --cp와 --mcu 중 하나만 지정합니다.
  • -d와 -f 중 하나만 지정합니다.

디렉터리 모드 바이너리 요구 사항

-d를 사용하면 디렉터리에 다음 이름 그대로의 펌웨어 파일이 있어야 합니다:

구성 요소 필수 파일명
ATOM-CP(RBLN-CA25) atom-cp-secure.bin
ATOM-CP(그 밖의 ATOM™ 카드) atom-cp.bin
ATOM-SMC atom-smc.bin
REBEL-CP rebel-q-cp.bin
REBEL-SMC rebel-smc.bin

감지한 장치 플랫폼, 카드, 업데이트 모드(--cp 또는 --mcu)에 따라 파일을 선택합니다. 첫 번째로 감지한 장치를 기준으로 파일 하나를 고르고, 이 파일을 모든 대상 장치에 씁니다. RBLN-CA25와 다른 ATOM™ 카드가 함께 있는 호스트에서는 -s <PCI_ADDR>로 카드를 하나씩 지정해 업데이트해야 합니다.

반환 코드

다음 종료 코드를 반환합니다:

종료 코드 의미
0 모든 장치의 업데이트에 성공했습니다.
1 ~ 128 업데이트에 실패한 장치 수입니다.
129 ~ 255 장치를 업데이트하기 전에 실행을 중단했습니다. 음수 Linux errno 값을 반환하며, 셸에는 256 - errno로 표시됩니다.

자주 발생하는 오류 종료 코드:

종료 코드 errno 원인
255 -1 root 권한으로 실행하지 않았거나(-EPERM) 펌웨어 파일이 없습니다. sudo로 실행하고 파일 경로를 확인합니다.
240 -EBUSY rebellions 드라이버가 아직 로드되어 있습니다. 먼저 언로드합니다.
237 -ENODEV 일치하는 장치를 찾지 못했습니다. -s 값을 확인합니다.
234 -EINVAL 옵션 조합 또는 펌웨어 이미지가 유효하지 않습니다. 플래그와 이미지 파일을 확인합니다.

스크립트 작성 예제는 CLI 예제 → 종료 코드 처리에서 확인할 수 있습니다.

실패 시 펌웨어 로그

장치가 FAILED 또는 TIMEOUT을 보고하면 rbln-flash는 장치 측 펌웨어 로그를 현재 작업 디렉터리에 자동으로 저장합니다. 이 로그로 장치별 업데이트 실패 원인을 진단할 수 있습니다.

파일명 규칙

fwlog_<DOMAIN>:<BUS>:<SLOT>.<FUNC>.txt

예: fwlog_0000:01:00.0.txt, fwlog_0000:02:00.0.txt.

동작

  • 결과가 FAILED 또는 TIMEOUT인 장치의 로그만 저장합니다.
  • 현재 작업 디렉터리에 저장합니다.
  • 같은 이름의 파일이 이미 있으면 덮어씁니다.

Note

fwlog_<BDF>.txt는 -l, --logfile 옵션과 별개입니다. -l은 호스트 측 업데이트 진행 로그를 기록하고, fwlog_<BDF>.txt는 장치 측 펌웨어 진단 로그입니다.

CLI 예제

펌웨어 업데이트 워크플로우

요약

파일 경로로 특정 장치의 CP 펌웨어를 업데이트합니다.

명령어

Command
$ sudo rbln-flash --cp -f /PATH/image.bin -s 01:00.0

출력(예시)

Result summary (example)
==== Firmware Update Results ====
0000:01:00.0 : SUCCESS [O]
=================================

요약

디렉터리 경로로 모든 장치의 CP 펌웨어를 업데이트합니다.

명령어

Command
$ sudo rbln-flash --cp -d /PATH/ -s all

출력(예시)

Result summary (example)
==== Firmware Update Results ====
0000:01:00.0 : SUCCESS [O]
0000:02:00.0 : FAILED [X]
0000:03:00.0 : TIMEOUT [...]
=================================
2 device(s) failed to update.
Firmware logs have been saved to fwlog_<BDF>.txt for each failed device.
Please check the firmware logs, reset the device, and retry the update.

요약

파일 경로로 특정 장치의 MCU 펌웨어를 업데이트합니다.

명령어

Command
$ sudo rbln-flash --mcu -f /PATH/image.bin -s 01:00.0

출력(예시)

Result summary (example)
==== Firmware Update Results ====
0000:01:00.0 : SUCCESS [O]
=================================

요약

디렉터리 경로로 모든 장치의 MCU 펌웨어를 업데이트합니다.

명령어

Command
$ sudo rbln-flash --mcu -d /PATH/ -s all

출력(예시)

Result summary (example)
==== Firmware Update Results ====
0000:01:00.0 : SUCCESS [O]
0000:02:00.0 : FAILED [X]
0000:03:00.0 : TIMEOUT [...]
=================================
2 device(s) failed to update.
Firmware logs have been saved to fwlog_<BDF>.txt for each failed device.
Please check the firmware logs, reset the device, and retry the update.

요약

펌웨어를 업데이트하고 상세 로그를 파일에 기록합니다.

명령어

Command
$ sudo rbln-flash --cp -d /PATH/ -s all -l update.log

출력(예시)

Result summary + logfile (example)
==== Firmware Update Results ====
0000:01:00.0 : SUCCESS [O]
0000:02:00.0 : FAILED [X]
0000:03:00.0 : TIMEOUT [...]
=================================
2 device(s) failed to update.
Firmware logs have been saved to fwlog_<BDF>.txt for each failed device.
Please check the firmware logs, reset the device, and retry the update.

로그를 update.log에 기록하고 표준 출력으로도 출력합니다.

종료 코드 처리

스크립트나 CI에서 rbln-flash 종료 코드를 확인하는 예제입니다:

Example
sudo rbln-flash --cp -d /PATH -s all
ret=$?

if [ $ret -eq 0 ]; then
  echo "All devices updated successfully!"
elif [ $ret -le 128 ]; then
  echo "$ret device(s) failed to update."
else
  echo "Error occurred: errno $((256 - ret))"
fi

문제 해결

드라이버를 언로드할 수 없음

  • 데몬 중지: sudo systemctl stop rbln-smd.service
  • 드라이버 언로드: sudo modprobe -r rebellions
  • 모듈이 계속 사용 중이면 무엇이 사용하고 있는지 확인합니다. lsmod | grep rebellions의 Used by 열에 사용 카운트가 표시되고, sudo lsof /dev/rbln*는 장치를 열고 있는 프로세스를 보여 줍니다. 해당 프로세스를 중지한 뒤 드라이버를 다시 언로드합니다.
  • 이전 업데이트 후 드라이버가 자동으로 다시 로드되었다면 다음 실행 전에 언로드합니다(업데이트 후 참조).

디렉터리 모드 실패

일부 장치 업데이트 실패

  • 반환 코드를 확인합니다(명령어 참조 → 반환 코드 참조).
  • --logfile을 지정해 다시 실행하고 로그에서 장치별 오류를 확인합니다.
  • 현재 디렉터리에 자동으로 생성된 fwlog_<BDF>.txt 파일에서 장치 측 진단 로그를 확인합니다(실패 시 펌웨어 로그 참조).
  • 로그를 확인한 후 실패한 장치를 리셋하고 업데이트를 다시 시도합니다.

참고 사항

  • 선택한 모든 장치의 펌웨어를 병렬로 업데이트합니다.
  • 각 장치는 SUCCESS, FAILED, TIMEOUT 중 하나로 결과를 보고합니다.
  • 장치가 실패하거나 시간 초과되면 장치별 펌웨어 로그 파일(fwlog_<BDF>.txt)을 현재 작업 디렉터리에 자동으로 기록합니다. 자세한 내용은 실패 시 펌웨어 로그에서 확인할 수 있습니다.
  • 펌웨어 이미지가 대상 업데이트 모드(--cp 또는 --mcu)와 맞는지 확인해야 합니다.
  • 업데이트가 중단되거나 유효하지 않은 이미지를 사용하면 장치가 오동작할 수 있습니다. 업데이트가 중단되면 같은 rbln-flash 명령을 다시 실행합니다. 그래도 업데이트에 실패하거나 장치가 감지되지 않으면 문의 페이지를 통해 기술 지원에 연락하시기 바랍니다.
  • -l을 지정하면 로그를 파일에 기록하고 표준 출력으로도 출력합니다. 생략하면 표준 출력으로만 출력합니다.

관련 문서