aesop-4330 보드관련 질문답변 게시판입니다. 최대 업로드 가능한 용량은 20MByte 입니다.
사용중에 성능이 떨어졌다는 느낌이 있어,
top 명령으로 확인해 보니, CPU Core 1개에 대한 정보만 나오더군요..
리부팅하니 정상으로 돌아왔지만요..
다시 재현이 안돼 원인 파악하기가 어려운데,
어떤 경우에 위와 같이 CPU 코어가 사용되지 않는 상태로 변하는 걸까요?
이걸 모니터링해서 대처를 해야할 거 같은데,
별도의 체크방법이 있나요?
** CPU0 만 동작하고 있을때의 top 명령 화면 **
CPU0: 80.0% usr 0.0% sys 0.0% nic 20.0% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 0.85 0.86 0.91 2/60 3038
** CPU0 만 동작하고 있을때의 Booting 로그 일부 **
[ 0.000000] Calibrating delay loop... 1987.37 BogoMIPS (lpj=9936896)
[ 0.060000] pid_max: default: 32768 minimum: 301
[ 0.060000] Mount-cache hash table entries: 512
[ 0.060000] Initializing cgroup subsys debug
[ 0.060000] Initializing cgroup subsys cpuacct
[ 0.060000] Initializing cgroup subsys memory
[ 0.060000] Initializing cgroup subsys freezer
[ 0.060000] CPU: Testing write buffer coherency: ok
[ 0.060000] CPU0: thread -1, cpu 0, socket 10, mpidr 80000a00
[ 0.060000] Setting up static identity map for 0x40596700 - 0x40596758
[ 0.060000] L310 cache controller enabled
[ 0.060000] l2x0: 16 ways, CACHE_ID 0x4100c4c8, AUX_CTRL 0x70070001, Cache size: 1048576 B
[ 1.120000] CPU1: failed to boot: -38
[ 2.160000] CPU2: failed to boot: -38
[ 3.200000] CPU3: failed to boot: -38
[ 3.200000] Brought up 1 CPUs
[ 3.200000] SMP: Total of 1 processors activated (1987.37 BogoMIPS).
[ 3.200000] devtmpfs: initialized
[ 3.200000] pwm: max = 68750000 hz
[ 3.200000] dummy:
[ 3.200000] NET: Registered protocol family 16
** 정상 동작하고 있을때의 top 명령 화면 **
CPU0: 42.8% usr 14.2% sys 0.0% nic 42.8% idle 0.0% io 0.0% irq 0.0% sirq
CPU1: 0.0% usr 0.0% sys 0.0% nic 100% idle 0.0% io 0.0% irq 0.0% sirq
CPU2: 0.0% usr 0.0% sys 0.0% nic 100% idle 0.0% io 0.0% irq 0.0% sirq
CPU3: 0.0% usr 0.0% sys 0.0% nic 100% idle 0.0% io 0.0% irq 0.0% sirq
Load average: 0.13 0.03 0.01 2/76 189
** 정상 동작하고 있을때의 Booting 로그 일부 **
[ 0.000000] Calibrating delay loop... 1987.37 BogoMIPS (lpj=9936896)
[ 0.060000] pid_max: default: 32768 minimum: 301
[ 0.060000] Mount-cache hash table entries: 512
[ 0.060000] Initializing cgroup subsys debug
[ 0.060000] Initializing cgroup subsys cpuacct
[ 0.060000] Initializing cgroup subsys memory
[ 0.060000] Initializing cgroup subsys freezer
[ 0.060000] CPU: Testing write buffer coherency: ok
[ 0.060000] CPU0: thread -1, cpu 0, socket 10, mpidr 80000a00
[ 0.060000] Setting up static identity map for 0x40596700 - 0x40596758
[ 0.060000] L310 cache controller enabled
[ 0.060000] l2x0: 16 ways, CACHE_ID 0x4100c4c8, AUX_CTRL 0x70070001, Cache size: 1048576 B
[ 0.120000] CPU1: Booted secondary processor
[ 0.180000] CPU1: thread -1, cpu 1, socket 10, mpidr 80000a01
[ 0.180000] CPU1: Unknown IPI message 0x1
[ 0.220000] CPU2: Booted secondary processor
[ 0.280000] CPU2: thread -1, cpu 2, socket 10, mpidr 80000a02
[ 0.280000] CPU2: Unknown IPI message 0x1
[ 0.320000] CPU3: Booted secondary processor
[ 0.380000] CPU3: thread -1, cpu 3, socket 10, mpidr 80000a03
[ 0.380000] CPU3: Unknown IPI message 0x1
[ 0.380000] Brought up 4 CPUs
[ 0.380000] SMP: Total of 4 processors activated (7969.17 BogoMIPS).
[ 0.380000] devtmpfs: initialized
[ 0.380000] pwm: max = 68750000 hz
[ 0.380000] dummy:
[ 0.380000] NET: Registered protocol family 16
boot fail 이 발생했을 때, delay 된 시간을 보면 pen_release 변수가 업데이트 되지 못해 발생되는 boot fail 현상으로 보이네요. AP 마다 코드가 다르겠지만 보통 이런 경우는 core의 power up sequence나 wakeup sequence에 문제가 있는 경우가 대부분입니다. boot 되는 cpu에 cpu_up()이 요청되면 core booting 후 pen_release 변수가 업데이트 되는데, 이 값이 1초간 업데이트 되지 않으면 boot fail이 발생합니다. power를 on 하라고 했는데, power on이 되지 않았거나, power 는 on 이 되었는데, boot code 어딘가에 문제가 발생해서 cpu가 올라오지 못하는 경우일 확률이 높습니다.
윗분 말씀처럼 secondary cpu 들에 대한 booting sequence 에 문제가 있네요..
nxp4330 smp 부팅시퀀스에 대한 정보가 없어, 소스상으로 추정해보면,
boot_secondary() 함수가 3번 호출되면서 세컨 CPU들 3개를 부팅시켜주는데,
RTC쪽에 있는 스크래치 레지스터에 세컨 CPU들의 entry point 인 __secondary_startup 의
physical 주소를 써주더군요.
정상적일때는, 세컨 CPU들이 그 주소로 들어가서 무한루프를 돌고 있다가,
pen_release 변수가 자신의 id 값과 일치하면 루프를 빠져나와 부팅 완료하면서,
다시 pen_release 를 '-1' 로 해주면 성공입니다.
boot_secondary() 함수안에 있는 boot_second_core() 나
각 CPU 에 gic를 통한 soft irq를 발생시키는 부분은 현재로선 의미없는 동작이고,
커널 부팅 전에 스크래치 레지스터에 유효한 값만 남아 있으면 정상동작합니다.
즉, 꺼져있던 상태에서 켰거나,
동작중이었다면 파워오프후 (레지스터값이 사라질 정도후) 다시 파워를 켜서 부팅하면
항상 1개 CPU로 만 부팅되고,
(나머지 3개는 entry point 가 유효하지 않아 abort 상태일걸로 추정)
이상태에서 리셋 버튼을 눌러 부팅시키면 (레지스터에 이전 부팅과정에서 쓴 값이 남아 있어)
4개 CPU로 정상 부팅됩니다.
임시방편으로 u-boot 에서 스크래치레지스터에 __secondary_startup 주소를 써주고
커널 부팅시키면 됩니다.
제대로 하려면 entry point 값이 정상 설정된 이후 power up 되어 대기하다가, pen_release 에 의해
부팅진행하는 거겠지요..
현재 u-boot가 spi flash 안에 있는거 같은데,
u-boot 업데이트시키는 방법좀 알려주시기 바랍니다.
잘못시도했다가 부팅도 안되게 될까봐서요..
secondboot 퓨징 방법입니다.
u-boot 프롬프트 상에서 fastboot 를 입력하시고 호스트 컴퓨터 상에서
$ sudo fastboot flash 2ndboot pyrope_2ndboot_pyrus_spi.img
라고 입력하시면 됩니다.
usb 케이블이 mini usb 포트에 연결되어 있어야 하고
주의하실 점은 반드시 spi 용 바이너리를 확인하시고 퓨징하세요.
x86????
아니면 어떤???