diff --git a/CMakeLists.txt b/CMakeLists.txt index 3982e42..cf864df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -105,6 +105,7 @@ add_custom_target(busybox-build DEPENDS ${BUSYBOX_BIN}) # ── initramfs source tree ──────────────────────────────────────────────────── set(WORKLOADS_OUTPUT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../output/workloads) set(MODEL_OUTPUT_ROOT ${WORKLOADS_OUTPUT_DIR}/src/ModelTest/e2e/models/archs/buckyball) +set(MODEL_LAYOUT_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../src/ModelTest/e2e/models/archs/buckyball) set(INSTALL_WORKLOADS_SCRIPT ${KERNEL_DIR}/scripts/install-workloads.sh) set(INSTALL_MODEL_SCRIPT ${KERNEL_DIR}/scripts/install-model.sh) set(EXTRACT_TOML_TESTS_SCRIPT ${KERNEL_DIR}/scripts/extract_toml_tests.py) @@ -130,51 +131,75 @@ endif() set(MODEL_INIT "") if(BUCKYBALL_KERNEL_MODEL) if(BUCKYBALL_KERNEL_MODEL STREQUAL "bert") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/Bert) + set(MODEL_LAYOUT_NAME Bert) set(MODEL_RUN_BINARY buddy-buckyball-bert-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "deepseekr1") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/DeepSeekR1) + set(MODEL_LAYOUT_NAME DeepSeekR1) set(MODEL_RUN_BINARY buddy-buckyball-deepseekr1-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "gemma4") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/Gemma4) + set(MODEL_LAYOUT_NAME Gemma4) set(MODEL_RUN_BINARY buddy-buckyball-gemma4-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "lenet") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/LeNet) + set(MODEL_LAYOUT_NAME LeNet) set(MODEL_RUN_BINARY buddy-buckyball-lenet-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "llama2") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/llama2) + set(MODEL_LAYOUT_NAME llama2) set(MODEL_RUN_BINARY buddy-buckyball-llama2-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "mobilenet") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/MobileNetV3) + set(MODEL_LAYOUT_NAME MobileNetV3) set(MODEL_RUN_BINARY buddy-buckyball-mobilenetv3-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "qwen3") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/Qwen3) + set(MODEL_LAYOUT_NAME Qwen3) set(MODEL_RUN_BINARY buddy-buckyball-qwen3-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "resnet") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/ResNet18) + set(MODEL_LAYOUT_NAME ResNet18) set(MODEL_RUN_BINARY buddy-buckyball-resnet-run) - elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "stablediffusion") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/StableDiffusion) - set(MODEL_RUN_BINARY buddy-buckyball-stablediffusion-run) + elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "stable-diffusion" OR + BUCKYBALL_KERNEL_MODEL STREQUAL "stablediffusion") + set(MODEL_LAYOUT_NAME StableDiffusion) + set(MODEL_RUN_BINARY buddy-buckyball-stable-diffusion-run) elseif(BUCKYBALL_KERNEL_MODEL STREQUAL "yolo") - set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/YOLO26) + set(MODEL_LAYOUT_NAME YOLO26) set(MODEL_RUN_BINARY buddy-buckyball-yolo26-run) else() message(FATAL_ERROR "Unknown BUCKYBALL_KERNEL_MODEL='${BUCKYBALL_KERNEL_MODEL}'. " "Valid models: bert, deepseekr1, gemma4, lenet, llama2, mobilenet, " - "qwen3, resnet, stablediffusion, yolo") + "qwen3, resnet, stable-diffusion, yolo") endif() + # ModelTest outputs are namespaced by compiler chip, for example + # archs/buckyball/pebble/LeNet. Resolve the chip from the source layout so + # stale outputs in the former chip-less directory can never be packaged. + file(GLOB MODEL_LAYOUT_CANDIDATES LIST_DIRECTORIES true + "${MODEL_LAYOUT_ROOT}/*/${MODEL_LAYOUT_NAME}") + list(FILTER MODEL_LAYOUT_CANDIDATES INCLUDE REGEX "/${MODEL_LAYOUT_NAME}$") + list(LENGTH MODEL_LAYOUT_CANDIDATES MODEL_LAYOUT_COUNT) + if(MODEL_LAYOUT_COUNT EQUAL 0) + message(FATAL_ERROR + "No Buckyball chip layout found for model ${BUCKYBALL_KERNEL_MODEL}: " + "${MODEL_LAYOUT_ROOT}/*/${MODEL_LAYOUT_NAME}") + elseif(NOT MODEL_LAYOUT_COUNT EQUAL 1) + message(FATAL_ERROR + "Model ${BUCKYBALL_KERNEL_MODEL} has multiple Buckyball chip layouts: " + "${MODEL_LAYOUT_CANDIDATES}. Kernel model packaging requires exactly one.") + endif() + list(GET MODEL_LAYOUT_CANDIDATES 0 MODEL_LAYOUT_DIR) + get_filename_component(MODEL_CHIP_DIR ${MODEL_LAYOUT_DIR} DIRECTORY) + get_filename_component(MODEL_CHIP ${MODEL_CHIP_DIR} NAME) + set(MODEL_OUTPUT_DIR ${MODEL_OUTPUT_ROOT}/${MODEL_CHIP}/${MODEL_LAYOUT_NAME}) + message(STATUS + "Buckyball kernel model: ${BUCKYBALL_KERNEL_MODEL} on chip ${MODEL_CHIP}") + if(NOT EXISTS ${MODEL_OUTPUT_DIR}) message(FATAL_ERROR "Model output directory not found: ${MODEL_OUTPUT_DIR}. " - "Run `bbdev workload --build '--model ${BUCKYBALL_KERNEL_MODEL}'` first.") + "Run `bbdev workload --build '--chip ${MODEL_CHIP} --model ${BUCKYBALL_KERNEL_MODEL}'` first.") endif() if(NOT EXISTS ${MODEL_OUTPUT_DIR}/${MODEL_RUN_BINARY}) message(FATAL_ERROR "Model run binary not found: ${MODEL_OUTPUT_DIR}/${MODEL_RUN_BINARY}. " - "Run `bbdev workload --build '--model ${BUCKYBALL_KERNEL_MODEL}'` first.") + "Run `bbdev workload --build '--chip ${MODEL_CHIP} --model ${BUCKYBALL_KERNEL_MODEL}'` first.") endif() if(NOT BUCKYBALL_KERNEL_INTERACTIVE) diff --git a/README.md b/README.md index 5f1b854..626facf 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ Memory Layout: 0x80000000 : OpenSBI fw_payload.bin ├─ 0x80000000: OpenSBI (M-mode, ~256KB) └─ 0x80200000: Linux Image (S-mode, with initramfs) + 0x8FE00000 : DTB staging area (top 2MB of the first 256MB RAM window) Boot Flow: 1. BootROM (M-mode) @ 0x10040 diff --git a/opensbi-platform/buckyball/platform.c b/opensbi-platform/buckyball/platform.c index 4409a41..eb7ff50 100644 --- a/opensbi-platform/buckyball/platform.c +++ b/opensbi-platform/buckyball/platform.c @@ -47,7 +47,7 @@ #define BUCKYBALL_MTIMER_FREQ 10000000 #define BUCKYBALL_SIM_EXIT_SUCCESS 0 #define BUCKYBALL_SIM_EXIT_FAILURE 1 -#define BUCKYBALL_DTB_STAGING_ADDR 0x88000000UL +#define BUCKYBALL_DTB_STAGING_ADDR 0x8FE00000UL // This Enable rdtime and rdcycle (in original opensbi its only rdtime, we eable // rdcylce to do performance counting) #define BUCKYBALL_SCOUNTEREN_CY_TM 0x03UL