Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
202 changes: 81 additions & 121 deletions extensions/gateway-dk-ask.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
# Copyright (c) 2026 Mono Technologies Inc.
#
# NXP ASK (Application Solutions Kit) extension for LS1046A
# Builds and installs: kernel modules (CDX, FCI, auto-bridge),
# userspace tools (fmlib, fmc, libfci, libcli, dpa-app, cmm),
# Integrates kernel modules (CDX, FCI, auto-bridge, sfp-led, lp5812) in-tree
# and builds userspace tools (fmlib, fmc, libfci, libcli, dpa-app, cmm),
# patched system libraries, and configuration files.
#
# All ASK sources, patches, and configs come from the ASK repo.
Expand All @@ -15,7 +15,7 @@
# Source repos and refs (pinned to match Yocto)
# For local testing: set ASK_REPO="file:///path/to/ASK" — the Docker mount hook below handles it
declare -g ASK_REPO="https://github.com/we-are-mono/ASK.git"
declare -g ASK_BRANCH="tag:mt-6.12.49-2.2.0"
declare -g ASK_BRANCH="commit:44883f88b26478fa2c9beea81702023cbc057f94"
declare -g FMLIB_REPO="https://github.com/nxp-qoriq/fmlib.git"
declare -g FMLIB_COMMIT="7a58ecaf0d90d71d6b78d3ac7998282a472c4394"
declare -g FMC_REPO="https://github.com/nxp-qoriq/fmc.git"
Expand Down Expand Up @@ -66,17 +66,77 @@ function post_family_config__ask_fetch_repo() {
declare -g ASK_CACHE_DIR="${SRC}/cache/sources/ask-repo"
}

# Ensure kernel headers are available for module builds
function extension_finish_config__ask_enable_headers() {
# Post-config setup: enable kernel headers (userspace builds need FMAN UAPI headers)
# and derive multiarch triplet from KERNEL_COMPILER (set by arch config)
function extension_finish_config__ask_setup() {
declare -g INSTALL_HEADERS="yes"
# Derive multiarch triplet here (not at source time) — KERNEL_COMPILER is set by arch config
[[ -z "${KERNEL_COMPILER}" ]] && exit_with_error "ASK extension: KERNEL_COMPILER is not set, cannot derive host triplet"
declare -g ASK_HOST_TRIPLET="${KERNEL_COMPILER%-}"
display_alert "ASK extension" "enabling kernel headers for module builds" "info"
}

# Host build dependencies — kernel module cross-compilation only needs the kernel source tree
# (libxml2-dev, libtclap-dev, libpcap-dev, pkg-config are installed in-chroot for userspace builds)
# Copy ASK kernel module sources into the kernel tree and enable them in Kconfig.
# Runs during custom_kernel_config — AFTER patching (which does git reset + git clean),
# but BEFORE olddefconfig parses Kconfig. kernel_copy_extra_sources runs too early
# (files get wiped by git clean from CLEAN_LEVEL=make-kernel).
function custom_kernel_config__ask_modules() {
# Invalidate kernel cache when ASK source changes (same pattern as Khadas meson-s4t7)
kernel_config_modifying_hashes+=("ask_modules=${ASK_BRANCH}")

# Skip file operations during config-dump-json and version calculation
[[ ! -f .config ]] && return 0

display_alert "ASK extension" "copying ASK module sources into kernel tree" "info"

local ask_drv="${kernel_work_dir}/drivers/net/ethernet/freescale/ask"
local bsp_dir="${SRC}/packages/bsp/gateway-dk"

# Copy module sources and Kbuild files from ASK cache
# (Kbuild files coexist with old Makefiles — kbuild prefers Kbuild when both exist)
mkdir -p "${ask_drv}"
cp -a "${ASK_CACHE_DIR}/${ASK_CDX_DIR}" "${ask_drv}/cdx"
cp -a "${ASK_CACHE_DIR}/${ASK_FCI_DIR}" "${ask_drv}/fci"
cp -a "${ASK_CACHE_DIR}/${ASK_AUTOBRIDGE_DIR}" "${ask_drv}/auto_bridge"

# Parent Kconfig and Makefile from ASK repo
cp "${ASK_CACHE_DIR}/Kconfig" "${ask_drv}/Kconfig"
cp "${ASK_CACHE_DIR}/Kbuild.mk" "${ask_drv}/Makefile"

# Board-specific modules (not part of ASK repo — from Armbian BSP)
if [[ "${BOARD}" == "gateway-dk" ]]; then
mkdir -p "${ask_drv}/sfp_led" "${ask_drv}/leds_lp5812"
cp "${bsp_dir}/sfp-led.c" "${ask_drv}/sfp_led/"
cp "${bsp_dir}/sfp-led.Kbuild" "${ask_drv}/sfp_led/Kbuild"
cp "${bsp_dir}/leds-lp5812.c" "${ask_drv}/leds_lp5812/"
cp "${bsp_dir}/leds-lp5812.h" "${ask_drv}/leds_lp5812/"
cp "${bsp_dir}/leds-lp5812.Kbuild" "${ask_drv}/leds_lp5812/Kbuild"

# Add board-specific entries to ASK Kconfig and Makefile
patch -p1 -d "${ask_drv}" < "${bsp_dir}/ask-kconfig-board-modules.patch"
echo 'obj-$(CONFIG_ASK_SFP_LED) += sfp_led/' >> "${ask_drv}/Makefile"
echo 'obj-$(CONFIG_ASK_LEDS_LP5812) += leds_lp5812/' >> "${ask_drv}/Makefile"
fi

# Wire into parent freescale Kconfig and Makefile
local fsl_dir="${kernel_work_dir}/drivers/net/ethernet/freescale"
if ! grep -q 'source.*ask/Kconfig' "${fsl_dir}/Kconfig" 2>/dev/null; then
sed -i '/endif.*NET_VENDOR_FREESCALE/i source "drivers/net/ethernet/freescale/ask/Kconfig"' "${fsl_dir}/Kconfig"
fi
if ! grep -q 'ask/' "${fsl_dir}/Makefile" 2>/dev/null; then
echo 'obj-y += ask/' >> "${fsl_dir}/Makefile"
fi

display_alert "ASK extension" "ASK module sources and Kbuild files placed in kernel tree" "info"

# Enable ASK modules in kernel config (opts_m array, same pattern as meson64_common.inc)
opts_y+=("CONFIG_NXP_ASK")
opts_m+=("CONFIG_ASK_CDX")
opts_m+=("CONFIG_ASK_FCI")
opts_m+=("CONFIG_ASK_AUTO_BRIDGE")
if [[ "${BOARD}" == "gateway-dk" ]]; then
opts_m+=("CONFIG_ASK_SFP_LED")
opts_m+=("CONFIG_ASK_LEDS_LP5812")
fi
}

# Copy ASK kernel patch to userpatches (gitignored) so it's applied during kernel build.
# userpatches/ is the Armbian-standard location for extension-provided patches — the build
Expand All @@ -93,104 +153,10 @@ function post_family_config__ask_kernel_patch() {
display_alert "ASK extension" "ASK kernel patch staged in userpatches" "info"
}

function cleanup_ask_module_builddir() {
[[ -n "${ASK_MODULE_BUILDDIR}" && -d "${ASK_MODULE_BUILDDIR}" ]] && rm -rf "${ASK_MODULE_BUILDDIR}" || true
}

# Build kernel modules after kernel debs are installed in chroot
function post_install_kernel_debs__build_ask_modules() {
[[ "${INSTALL_HEADERS}" != "yes" ]] && return 0

display_alert "ASK extension" "building kernel modules (host cross-compile)" "info"

declare -g ASK_KERNEL_VER
ASK_KERNEL_VER=$(ls -1v "${SDCARD}/lib/modules/" | tail -1)
[[ -z "${ASK_KERNEL_VER}" ]] && exit_with_error "No kernel version found in ${SDCARD}/lib/modules/"
local kernel_ver="${ASK_KERNEL_VER}"

# Full kernel source tree (needed for CDX — it includes ncsw_config.mk from the FMAN driver)
local ksrc="${SRC}/cache/sources/linux-kernel-worktree/${KERNEL_MAJOR_MINOR}__${LINUXFAMILY}__${ARCH}"
[[ -d "${ksrc}" ]] || exit_with_error "Kernel source tree not found at ${ksrc}"

local cross="${KERNEL_COMPILER}"
local bsp_dir="${SRC}/packages/bsp/gateway-dk"
local builddir
builddir=$(mktemp -d)
declare -g ASK_MODULE_BUILDDIR="${builddir}"
add_cleanup_handler cleanup_ask_module_builddir

# Copy ASK module sources to build dir
cp -a "${ASK_CACHE_DIR}/${ASK_CDX_DIR}" "${builddir}/cdx"
cp -a "${ASK_CACHE_DIR}/${ASK_FCI_DIR}" "${builddir}/fci"
cp -a "${ASK_CACHE_DIR}/${ASK_AUTOBRIDGE_DIR}" "${builddir}/auto-bridge"

# Build CDX module (cross-compile on host against full kernel source)
# NXP ASK uses LS1043A as the DPAA1 platform ID for all DPAA1 SoCs (LS1043A/LS1046A)
display_alert "ASK extension" "building CDX kernel module" "info"
make -C "${builddir}/cdx" \
KERNELDIR="${ksrc}" ARCH=arm64 CROSS_COMPILE="${cross}" PLATFORM=LS1043A \
CFG_FLAGS="-DSEC_PROFILE_SUPPORT -DVLAN_FILTER -DWIFI_ENABLE -DENABLE_EGRESS_QOS" \
|| exit_with_error "CDX module build failed"

# Build FCI module (depends on CDX Module.symvers)
display_alert "ASK extension" "building FCI kernel module" "info"
make -C "${builddir}/fci" \
KERNEL_SOURCE="${ksrc}" ARCH=arm64 CROSS_COMPILE="${cross}" BOARD_ARCH=arm64 \
KBUILD_EXTRA_SYMBOLS="${builddir}/cdx/Module.symvers" \
|| exit_with_error "FCI module build failed"

# Build auto-bridge module (uses its own Makefile which adds -I for br_private.h)
display_alert "ASK extension" "building auto-bridge kernel module" "info"
make -C "${builddir}/auto-bridge" \
KERNEL_SOURCE="${ksrc}" CROSS_COMPILE="${cross}" PLATFORM=LS1043A ENABLE_VLAN_FILTER=y \
|| exit_with_error "auto-bridge module build failed"

# Board-specific modules (gateway-dk only)
if [[ "${BOARD}" == "gateway-dk" ]]; then
# SFP-LED: GPIO-based SFP port LED control
display_alert "ASK extension" "building SFP-LED kernel module" "info"
mkdir -p "${builddir}/sfp-led"
cp "${bsp_dir}/sfp-led.c" "${builddir}/sfp-led/"
cp "${bsp_dir}/sfp-led.mk" "${builddir}/sfp-led/Makefile"
pushd "${builddir}/sfp-led"
make KERNEL_SRC="${ksrc}" ARCH=arm64 CROSS_COMPILE="${cross}" \
|| exit_with_error "SFP-LED module build failed"
popd

# LP5812: TI 4x3 LED matrix controller (not yet in mainline, targeting 6.19+)
display_alert "ASK extension" "building LP5812 LED driver" "info"
mkdir -p "${builddir}/lp5812"
cp "${bsp_dir}/leds-lp5812.c" "${builddir}/lp5812/"
cp "${bsp_dir}/leds-lp5812.h" "${builddir}/lp5812/"
cp "${bsp_dir}/leds-lp5812.mk" "${builddir}/lp5812/Makefile"
pushd "${builddir}/lp5812"
make KERNEL_SRC="${ksrc}" ARCH=arm64 CROSS_COMPILE="${cross}" \
|| exit_with_error "LP5812 module build failed"
popd
fi

# Stage built modules for the combined .deb (packaged later in userspace phase)
display_alert "ASK extension" "staging kernel modules for packaging" "info"
declare -g ASK_MODULE_STAGING="${SRC}/cache/sources/ask-module-staging"
rm -rf "${ASK_MODULE_STAGING}"
mkdir -p "${ASK_MODULE_STAGING}"

cp "${builddir}/cdx/cdx.ko" "${ASK_MODULE_STAGING}/"
cp "${builddir}/fci/fci.ko" "${ASK_MODULE_STAGING}/"
cp "${builddir}/auto-bridge/auto_bridge.ko" "${ASK_MODULE_STAGING}/"
[[ -f "${builddir}/sfp-led/sfp-led.ko" ]] && cp "${builddir}/sfp-led/sfp-led.ko" "${ASK_MODULE_STAGING}/"
[[ -f "${builddir}/lp5812/leds-lp5812.ko" ]] && cp "${builddir}/lp5812/leds-lp5812.ko" "${ASK_MODULE_STAGING}/"

# Also install directly into rootfs so they're available during the rest of the build
mkdir -p "${SDCARD}/lib/modules/${kernel_ver}/extra"
cp "${ASK_MODULE_STAGING}"/*.ko "${SDCARD}/lib/modules/${kernel_ver}/extra/"
chroot_sdcard "depmod -a ${kernel_ver}" || exit_with_error "depmod failed"
# Install module autoload config (modules are in the kernel .deb, just need the load list)
function post_install_kernel_debs__ask_module_autoload() {
cp "${ASK_CACHE_DIR}/config/ask-modules.conf" "${SDCARD}/etc/modules-load.d/"

# Clean up build dir
rm -rf "${builddir}"

display_alert "ASK extension" "kernel modules built and staged" "info"
}

# Copy patches into chroot before patched library builds (runs before build_ask_userspace)
Expand All @@ -215,7 +181,9 @@ function pre_customize_image__000_prepare_ask_patches() {
function pre_customize_image__001_build_ask_userspace() {
display_alert "ASK extension" "building userspace components" "info"

local kernel_ver="${ASK_KERNEL_VER}"
local kernel_ver
kernel_ver=$(ls -1v "${SDCARD}/lib/modules/" | tail -1)
[[ -z "${kernel_ver}" ]] && exit_with_error "No kernel version found in ${SDCARD}/lib/modules/"
local kdir="/usr/src/linux-headers-${kernel_ver}"

# Install build dependencies in chroot
Expand Down Expand Up @@ -348,20 +316,13 @@ function pre_customize_image__001_build_ask_userspace() {
# Cleanup build sources
rm -rf "${SDCARD}/tmp/ask-userspace" "${SDCARD}/tmp/ask-patches"

# --- Package everything as a single gateway-dk-ask .deb ---
display_alert "ASK extension" "packaging combined ASK .deb" "info"
# --- Package ASK userspace as a .deb (kernel modules are in linux-image .deb) ---
display_alert "ASK extension" "packaging ASK userspace .deb" "info"
local pkgname="gateway-dk-ask"
local pkgdir
pkgdir=$(mktemp -d)
mkdir -p "${pkgdir}/DEBIAN"

# Kernel modules (staged during post_install_kernel_debs phase)
local moddir="${pkgdir}/lib/modules/${kernel_ver}/extra"
mkdir -p "${moddir}" "${pkgdir}/etc/modules-load.d"
cp "${ASK_MODULE_STAGING}"/*.ko "${moddir}/"
cp "${ASK_CACHE_DIR}/config/ask-modules.conf" "${pkgdir}/etc/modules-load.d/"
rm -rf "${ASK_MODULE_STAGING}"

# Snapshot userspace files into package tree
local -a ask_files=(
usr/bin/fmc
Expand Down Expand Up @@ -414,15 +375,15 @@ Section: net
Priority: optional
Maintainer: Mono Technologies <support@mono.si>
Depends: linux-image-${BRANCH}-${LINUXFAMILY} (>= ${kernel_ver}), libxml2, libpcap0.8
Description: NXP ASK hardware offloading for Mono Gateway DK
Kernel modules (CDX, FCI, auto-bridge, sfp-led, leds-lp5812) and
userspace tools (fmlib, fmc, libfci, libcli, dpa-app, cmm) for
NXP ASK data-plane acceleration on the LS1046A Gateway DK.
Description: NXP ASK hardware offloading userspace for Mono Gateway DK
Userspace tools (fmlib, fmc, libfci, libcli, dpa-app, cmm) and configuration
for NXP ASK data-plane acceleration on the LS1046A Gateway DK.
Kernel modules (CDX, FCI, auto-bridge, sfp-led, leds-lp5812) are in the
linux-image package.
EOF

cat > "${pkgdir}/DEBIAN/postinst" << EOF
#!/bin/bash
depmod -a ${kernel_ver}
systemctl daemon-reload || true
ldconfig || true
# Enable CMM service on OTA install (guarded by ConditionPathExists=/dev/cdx_ctrl at runtime)
Expand All @@ -442,7 +403,6 @@ EOF

cat > "${pkgdir}/DEBIAN/postrm" << EOF
#!/bin/bash
depmod -a ${kernel_ver} || true
ldconfig || true
systemctl daemon-reload || true
if [ "\$1" = "remove" ] || [ "\$1" = "purge" ]; then
Expand Down
19 changes: 19 additions & 0 deletions packages/bsp/gateway-dk/ask-kconfig-board-modules.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
--- a/Kconfig
+++ b/Kconfig
@@ -27,4 +27,16 @@ config ASK_AUTO_BRIDGE
help
Automatic bridge offloading with VLAN filter support.

+config ASK_SFP_LED
+ tristate "SFP port LED driver (Mono Gateway DK)"
+ depends on LEDS_CLASS && I2C
+ help
+ GPIO-based SFP port link/activity LED control for Mono Gateway DK.
+
+config ASK_LEDS_LP5812
+ tristate "TI LP5812 LED matrix driver (Mono Gateway DK)"
+ depends on LEDS_CLASS && I2C
+ help
+ TI LP5812 4x3 LED matrix controller driver.
+
endif # NXP_ASK
2 changes: 2 additions & 0 deletions packages/bsp/gateway-dk/leds-lp5812.Kbuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ccflags-y += -I$(src)
obj-$(CONFIG_ASK_LEDS_LP5812) += leds-lp5812.o
12 changes: 0 additions & 12 deletions packages/bsp/gateway-dk/leds-lp5812.mk

This file was deleted.

1 change: 1 addition & 0 deletions packages/bsp/gateway-dk/sfp-led.Kbuild
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
obj-$(CONFIG_ASK_SFP_LED) += sfp-led.o
10 changes: 0 additions & 10 deletions packages/bsp/gateway-dk/sfp-led.mk

This file was deleted.

Loading