Files
retroSoC/app/ports/linux/smoke/start.S
T
maksyuki 50b7c47916 Merge branch 'feat/sw' into dev
# Conflicts:
#	Makefile
#	README.md
#	app/README.md
#	app/apps/hp_boot/main.c
#	configs/README.md
#	dependencies/dependencies.lock.json
#	publications/datasheets/sections/architecture.typ
#	publications/datasheets/sections/boot-bundle-format.typ
#	publications/datasheets/sections/linux-runtime.typ
#	publications/datasheets/sections/overview.typ
#	publications/datasheets/system-reference.json
#	publications/software_reference.py
#	scripts/build_hp_smoke.py
#	scripts/run_flow.py
2026-09-26 16:28:39 +08:00

436 lines
11 KiB
ArmAsm

.section .text.start
.global _start
.type _start, @function
.equ UART1_BASE, 0x10018000
.equ UART_BAUD_INT, 0x00
.equ UART_BAUD_FRAC, 0x04
.equ UART_LINE_CTRL, 0x08
.equ UART_CTRL, 0x0c
.equ UART_TXDATA, 0x10
.equ UART_STATUS, 0x18
.equ UART_FIFO_CTRL, 0x20
.equ UART_ERROR, 0x30
.equ UART_INTR_ENABLE, 0x38
.equ UART_TX_FULL, 0x20
.equ MAILBOX_BASE, 0x10019000
.equ HP_EVENT, 0x20
.equ HP_ARG0, 0x24
.equ HP_SEQUENCE, 0x28
.equ HP_DOORBELL, 0x2c
.equ HP_READY_ARG, 0x4c4e5801
.equ LP_COMMAND, 0x10
.equ LP_ARG0, 0x14
.equ LP_SEQUENCE, 0x18
.equ HP_GA2D_START, 0x47413250
.equ HP_GA2D_ARG, 0x47413244
.equ HP_GA2D_PASS, 2
.equ HP_GA2D_FAIL, 3
.equ HP_GA2D_CACHE, 4
.equ HP_GA2D_CACHE_ARG, 0x43424f4b
.equ GA2D_BASE, 0x10012000
.equ GA2D_COMMAND, 0x10
.equ GA2D_STATUS, 0x14
.equ GA2D_IRQ_STATE, 0x18
.equ GA2D_ERROR_STATUS, 0x24
.equ GA2D_JOB_CONFIG, 0x30
.equ GA2D_GLOBAL_ALPHA, 0x34
.equ GA2D_COLOR, 0x38
.equ GA2D_SIZE, 0x3c
.equ GA2D_FG_ADDRESS, 0x40
.equ GA2D_FG_PITCH, 0x44
.equ GA2D_FG_FORMAT, 0x48
.equ GA2D_BG_ADDRESS, 0x4c
.equ GA2D_BG_PITCH, 0x50
.equ GA2D_BG_FORMAT, 0x54
.equ GA2D_DST_ADDRESS, 0x58
.equ GA2D_DST_PITCH, 0x5c
.equ GA2D_DST_FORMAT, 0x60
.equ RESOURCE_CTRL_BASE, 0x2000a000
.equ RESOURCE_CACHE_CONTROL, 0x10
.equ GA2D_WIDTH, 8
.equ GA2D_PITCH, 64
.equ GA2D_SIZE_VALUE, 0x00010008
.equ GA2D_XRGB8888, 2
.equ GA2D_WAIT_POLLS, 0x00100000
_start:
la sp, _stack_top
la t0, _bss_start
la t1, _bss_end
clear_bss:
bgeu t0, t1, bss_cleared
sw zero, 0(t0)
addi t0, t0, 4
j clear_bss
bss_cleared:
li t0, UART1_BASE
sw zero, UART_CTRL(t0)
li t1, 3
sw t1, UART_FIFO_CTRL(t0)
li t1, 0x7f
sw t1, UART_ERROR(t0)
sw zero, UART_INTR_ENABLE(t0)
li t1, 78
sw t1, UART_BAUD_INT(t0)
li t1, 32
sw t1, UART_BAUD_FRAC(t0)
li t1, 3
sw t1, UART_LINE_CTRL(t0)
sw t1, UART_CTRL(t0)
la a0, hp_message
write_character:
lbu a1, 0(a0)
beqz a1, publish_ready
wait_tx_space:
lwu a2, UART_STATUS(t0)
andi a2, a2, UART_TX_FULL
bnez a2, wait_tx_space
sw a1, UART_TXDATA(t0)
addi a0, a0, 1
j write_character
publish_ready:
li t0, MAILBOX_BASE
li t1, 1
sw t1, HP_EVENT(t0)
li t1, HP_READY_ARG
sw t1, HP_ARG0(t0)
li t1, 1
sw t1, HP_SEQUENCE(t0)
fence w, w
sw t1, HP_DOORBELL(t0)
wait_start_command:
li s1, GA2D_WAIT_POLLS
wait_start_command_loop:
li t0, MAILBOX_BASE
lwu t1, LP_SEQUENCE(t0)
li t2, 1
bne t1, t2, wait_start_command_next
lwu t1, LP_COMMAND(t0)
li t2, HP_GA2D_START
bne t1, t2, wait_start_command_next
lwu t1, LP_ARG0(t0)
li t2, HP_GA2D_ARG
beq t1, t2, start_ga2d
wait_start_command_next:
addi s1, s1, -1
bnez s1, wait_start_command_loop
j publish_ga2d_fail
start_ga2d:
jal ra, prepare_shared_lines
jal ra, clean_shared_lines
jal ra, ga2d_fill
beqz a0, publish_ga2d_fail
jal ra, invalidate_shared_lines
jal ra, check_fill
beqz a0, publish_ga2d_fail
la a0, hp_destination_line
li a1, 0xc7c7c7c7
li a2, 16
jal ra, fill_words
jal ra, clean_shared_lines
jal ra, ga2d_copy
beqz a0, publish_ga2d_fail
jal ra, invalidate_shared_lines
jal ra, check_copy
beqz a0, publish_ga2d_fail
#ifdef RS_NPU_P5_ACCEPTANCE
call rs_hp_npu_acceptance
beqz a0, publish_ga2d_fail
#endif
#ifdef RS_NPU_P6_ACCEPTANCE
call rs_hp_npu_p6_acceptance
beqz a0, publish_ga2d_fail
#endif
publish_ga2d_pass:
li t0, MAILBOX_BASE
li t1, HP_GA2D_PASS
sw t1, HP_EVENT(t0)
li t1, HP_GA2D_ARG
sw t1, HP_ARG0(t0)
li t1, 2
sw t1, HP_SEQUENCE(t0)
fence w, w
sw t1, HP_DOORBELL(t0)
wait_cache_request:
li s1, GA2D_WAIT_POLLS
wait_cache_request_loop:
li t0, RESOURCE_CTRL_BASE
lwu t1, RESOURCE_CACHE_CONTROL(t0)
andi t1, t1, 2
bnez t1, clean_cache_request
addi s1, s1, -1
bnez s1, wait_cache_request_loop
j publish_cache_fail
clean_cache_request:
jal ra, clean_invalidate_shared_lines
#ifdef RS_NPU_P5_ACCEPTANCE
call rs_hp_npu_cache_clean
#endif
#ifdef RS_NPU_P6_ACCEPTANCE
call rs_hp_npu_p6_cache_clean
#endif
li t0, MAILBOX_BASE
li t1, HP_GA2D_CACHE
sw t1, HP_EVENT(t0)
li t1, HP_GA2D_CACHE_ARG
sw t1, HP_ARG0(t0)
li t1, 3
sw t1, HP_SEQUENCE(t0)
fence w, w
sw t1, HP_DOORBELL(t0)
j halt
publish_cache_fail:
li t0, MAILBOX_BASE
li t1, HP_GA2D_FAIL
sw t1, HP_EVENT(t0)
li t1, 0xdead0002
sw t1, HP_ARG0(t0)
li t1, 3
sw t1, HP_SEQUENCE(t0)
fence w, w
sw t1, HP_DOORBELL(t0)
j halt
publish_ga2d_fail:
li t0, MAILBOX_BASE
li t1, HP_GA2D_FAIL
sw t1, HP_EVENT(t0)
li t1, 0xdead0001
sw t1, HP_ARG0(t0)
li t1, 2
sw t1, HP_SEQUENCE(t0)
fence w, w
sw t1, HP_DOORBELL(t0)
halt:
j halt
fill_words:
sw a1, 0(a0)
addi a0, a0, 4
addi a2, a2, -1
bnez a2, fill_words
ret
prepare_shared_lines:
mv s0, ra
la a0, hp_source_guard
li a1, 0xa5a5a5a5
li a2, 16
jal ra, fill_words
la a0, hp_destination_guard
li a1, 0xd3d3d3d3
li a2, 16
jal ra, fill_words
la a0, hp_source_line
li a1, 0xa5a5a5a5
li a2, 16
jal ra, fill_words
la a0, hp_destination_line
li a1, 0xc7c7c7c7
li a2, 16
jal ra, fill_words
la t0, hp_source_line
li t1, 0x10203040
li t2, 0x01020304
li t3, 8
prepare_source_data:
sw t1, 0(t0)
add t1, t1, t2
addi t0, t0, 4
addi t3, t3, -1
bnez t3, prepare_source_data
mv ra, s0
ret
clean_shared_lines:
la a0, hp_source_guard
cbo.clean 0(a0)
la a0, hp_source_line
cbo.clean 0(a0)
la a0, hp_destination_line
cbo.clean 0(a0)
la a0, hp_destination_guard
cbo.clean 0(a0)
fence rw, rw
ret
invalidate_shared_lines:
la a0, hp_source_guard
cbo.inval 0(a0)
la a0, hp_source_line
cbo.inval 0(a0)
la a0, hp_destination_line
cbo.inval 0(a0)
la a0, hp_destination_guard
cbo.inval 0(a0)
fence r, r
ret
clean_invalidate_shared_lines:
mv s0, ra
jal ra, clean_shared_lines
jal ra, invalidate_shared_lines
mv ra, s0
ret
ga2d_fill:
li t0, GA2D_BASE
li t1, 7
sw t1, GA2D_IRQ_STATE(t0)
li t1, 1
sw t1, GA2D_ERROR_STATUS(t0)
sw zero, GA2D_JOB_CONFIG(t0)
sw zero, GA2D_GLOBAL_ALPHA(t0)
li t1, 0x80123456
sw t1, GA2D_COLOR(t0)
li t1, GA2D_SIZE_VALUE
sw t1, GA2D_SIZE(t0)
sw zero, GA2D_FG_ADDRESS(t0)
sw zero, GA2D_FG_PITCH(t0)
sw zero, GA2D_FG_FORMAT(t0)
sw zero, GA2D_BG_ADDRESS(t0)
sw zero, GA2D_BG_PITCH(t0)
sw zero, GA2D_BG_FORMAT(t0)
la t1, hp_destination_line
sw t1, GA2D_DST_ADDRESS(t0)
li t1, GA2D_PITCH
sw t1, GA2D_DST_PITCH(t0)
li t1, GA2D_XRGB8888
sw t1, GA2D_DST_FORMAT(t0)
fence rw, rw
li t1, 1
sw t1, GA2D_COMMAND(t0)
j ga2d_wait
ga2d_copy:
li t0, GA2D_BASE
li t1, 7
sw t1, GA2D_IRQ_STATE(t0)
li t1, 1
sw t1, GA2D_ERROR_STATUS(t0)
li t1, 1
sw t1, GA2D_JOB_CONFIG(t0)
sw zero, GA2D_GLOBAL_ALPHA(t0)
sw zero, GA2D_COLOR(t0)
li t1, GA2D_SIZE_VALUE
sw t1, GA2D_SIZE(t0)
la t1, hp_source_line
sw t1, GA2D_FG_ADDRESS(t0)
li t1, GA2D_PITCH
sw t1, GA2D_FG_PITCH(t0)
li t1, GA2D_XRGB8888
sw t1, GA2D_FG_FORMAT(t0)
sw zero, GA2D_BG_ADDRESS(t0)
sw zero, GA2D_BG_PITCH(t0)
sw zero, GA2D_BG_FORMAT(t0)
la t1, hp_destination_line
sw t1, GA2D_DST_ADDRESS(t0)
li t1, GA2D_PITCH
sw t1, GA2D_DST_PITCH(t0)
li t1, GA2D_XRGB8888
sw t1, GA2D_DST_FORMAT(t0)
fence rw, rw
li t1, 1
sw t1, GA2D_COMMAND(t0)
ga2d_wait:
li t1, GA2D_WAIT_POLLS
ga2d_wait_loop:
lwu t2, GA2D_STATUS(t0)
andi t3, t2, 0x60
bnez t3, ga2d_wait_failed
andi t3, t2, 0x10
beqz t3, ga2d_wait_next
andi t3, t2, 0x03
bnez t3, ga2d_wait_next
li a0, 1
ret
ga2d_wait_next:
addi t1, t1, -1
bnez t1, ga2d_wait_loop
ga2d_wait_failed:
li a0, 0
ret
check_fill:
la t0, hp_destination_line
li t1, 0xff123456
li t2, 8
check_fill_pixels:
lwu t3, 0(t0)
bne t3, t1, check_failed
addi t0, t0, 4
addi t2, t2, -1
bnez t2, check_fill_pixels
lwu t3, 0(t0)
li t1, 0xc7c7c7c7
bne t3, t1, check_failed
la t0, hp_destination_guard
lwu t3, 0(t0)
li t1, 0xd3d3d3d3
bne t3, t1, check_failed
li a0, 1
ret
check_copy:
la t0, hp_source_line
la t1, hp_destination_line
li t2, 8
check_copy_pixels:
lwu t3, 0(t0)
lwu t4, 0(t1)
bne t3, t4, check_failed
addi t0, t0, 4
addi t1, t1, 4
addi t2, t2, -1
bnez t2, check_copy_pixels
lwu t3, 0(t1)
li t4, 0xc7c7c7c7
bne t3, t4, check_failed
la t0, hp_source_guard
lwu t3, 0(t0)
li t4, 0xa5a5a5a5
bne t3, t4, check_failed
la t0, hp_destination_guard
lwu t3, 0(t0)
li t4, 0xd3d3d3d3
bne t3, t4, check_failed
li a0, 1
ret
check_failed:
li a0, 0
ret
.section .rodata
hp_message:
.asciz "HP_SMOKE_READY\n"
.balign 64
hp_source_guard:
.space 64
.balign 64
hp_source_line:
.space 64
.balign 64
hp_destination_line:
.space 64
.balign 64
hp_destination_guard:
.space 64