From 0bef7129bf21a971f288e6d7b0b19b88cc7a54aa Mon Sep 17 00:00:00 2001 From: Sankalp Negi Date: Thu, 4 May 2023 02:38:55 -0700 Subject: [PATCH] build: Initial bazel support for gen4auto targets Add the changes required to build gen4auto targets via bazel build system. Change-Id: I5a2ecc0c7f5d7dbab831790219dd5d1c1e89ecd8 Signed-off-by: Sankalp Negi --- build.config.msm.auto | 25 ++++ build.config.msm.gen4auto | 35 +++++ build.targets | 1 + gen4auto.bzl | 24 ++++ msm_kernel_qx.bzl | 276 ++++++++++++++++++++++++++++++++++++++ msm_platforms.bzl | 2 + target_variants.bzl | 16 ++- 7 files changed, 378 insertions(+), 1 deletion(-) create mode 100644 build.config.msm.auto create mode 100644 build.config.msm.gen4auto create mode 100644 gen4auto.bzl create mode 100644 msm_kernel_qx.bzl diff --git a/build.config.msm.auto b/build.config.msm.auto new file mode 100644 index 000000000000..65bd6118398e --- /dev/null +++ b/build.config.msm.auto @@ -0,0 +1,25 @@ +################################################################################ + +# boot image macros +BUILD_BOOT_IMG=1 + +# Common MSM configuration for building non-GKI-based kernels +DEFCONFIG="generic_auto_defconfig" + +function build_defconfig_fragments() { + if [[ "${VARIANT}" =~ ^(perf_defconfig|debug_defconfig)$ ]]; then + apply_defconfig_fragment ${KERNEL_DIR}/arch/${ARCH}/configs/vendor/${MSM_ARCH}.config vendor/${MSM_ARCH}_defconfig + + if [ "${VARIANT}" = perf_defconfig ]; then + return + fi + + apply_defconfig_fragment ${KERNEL_DIR}/arch/${ARCH}/configs/vendor/${MSM_ARCH}_debug.config vendor/${MSM_ARCH}-debug_defconfig + else + echo "Variant '${VARIANT}' unsupported" + exit 1 + fi +} + +build_defconfig_fragments + diff --git a/build.config.msm.gen4auto b/build.config.msm.gen4auto new file mode 100644 index 000000000000..8f31612086f7 --- /dev/null +++ b/build.config.msm.gen4auto @@ -0,0 +1,35 @@ +################################################################################ +## Inheriting configs from ACK +. ${ROOT_DIR}/common/build.config.common +. ${ROOT_DIR}/common/build.config.aarch64 + +################################################################################ +## Variant setup +MSM_ARCH=gen4auto +VARIANTS=(perf_defconfig debug_defconfig) +[ -z "${VARIANT}" ] && VARIANT=debug_defconfig + +if [ -e "${ROOT_DIR}/msm-kernel" -a "${KERNEL_DIR}" = "common" ]; then + KERNEL_DIR="msm-kernel" +fi + +ABL_SRC=bootable/bootloader/edk2 +BOOT_IMAGE_HEADER_VERSION=2 +BASE_ADDRESS=0x80000000 +PAGE_SIZE=4096 +DTB_IMG_CREATE=1 +SKIP_VENDOR_BOOT=1 +PREFERRED_USERSPACE=le +TRIM_UNUSED_MODULES=1 +TARGET_HAS_SEPARATE_RD=1 + +[ -z "${DT_OVERLAY_SUPPORT}" ] && DT_OVERLAY_SUPPORT=1 + +if [ "${KERNEL_CMDLINE_CONSOLE_AUTO}" != "0" ]; then + KERNEL_CMDLINE+=' console=ttyMSM0,115200n8 earlycon=qcom_geni,0xa8c000 qcom_geni_serial.con_enabled=1 loglevel=8 ' +fi + +################################################################################ +## Inheriting MSM configs +. ${KERNEL_DIR}/build.config.msm.common +. ${KERNEL_DIR}/build.config.msm.auto diff --git a/build.targets b/build.targets index 7dc5fdee5c4d..565e626eac1f 100644 --- a/build.targets +++ b/build.targets @@ -6,3 +6,4 @@ build.config.msm.kalama.vm build.config.msm.pineapple.allyes build.config.msm.blair build.config.msm.gen3auto +build.config.msm.gen4auto diff --git a/gen4auto.bzl b/gen4auto.bzl new file mode 100644 index 000000000000..1adfe0a5e639 --- /dev/null +++ b/gen4auto.bzl @@ -0,0 +1,24 @@ +load(":target_variants.bzl", "qx_variants") +load(":msm_kernel_qx.bzl", "define_msm_qx") +load(":image_opts.bzl", "boot_image_opts") + +target_name = "gen4auto" + +def define_gen4auto(): + _gen4auto_qx_in_tree_modules = [ + # keep sorted + ] + + for variant in qx_variants: + mod_list = _gen4auto_qx_in_tree_modules + + define_msm_qx( + msm_target = target_name, + variant = variant, + defconfig = "build.config.msm.auto", + in_tree_module_list = mod_list, + boot_image_opts = boot_image_opts( + boot_image_header_version = 2, + base_address = 0x80000000, + page_size = 4096), + ) diff --git a/msm_kernel_qx.bzl b/msm_kernel_qx.bzl new file mode 100644 index 000000000000..be326b7a6a44 --- /dev/null +++ b/msm_kernel_qx.bzl @@ -0,0 +1,276 @@ +load("//build/bazel_common_rules/dist:dist.bzl", "copy_to_dist_dir") +load("//build/bazel_common_rules/test_mappings:test_mappings.bzl", "test_mappings_dist") +load("//build/kernel/kleaf:constants.bzl", "aarch64_outs") +load( + "//build/kernel/kleaf:kernel.bzl", + "kernel_build", + "kernel_build_config", + "kernel_compile_commands", + "kernel_images", + "kernel_modules_install", + "merged_kernel_uapi_headers", +) +load( + "//build:msm_kernel_extensions.bzl", + "define_extras", + "get_build_config_fragments", + "get_dtb_list", + "get_dtbo_list", + "get_dtstree", + "get_vendor_ramdisk_binaries", +) +load(":msm_common.bzl", "define_top_level_config", "gen_config_without_source_lines", "get_out_dir") +load(":msm_dtc.bzl", "define_dtc_dist") +load(":msm_abl.bzl", "define_abl_dist") +load(":image_opts.bzl", "boot_image_opts") +load(":target_variants.bzl", "qx_variants") + +def _define_build_config( + msm_target, + target, + variant, + defconfig, + boot_image_opts = boot_image_opts(), + build_config_fragments = []): + """Creates a kernel_build_config for an MSM target + + Creates a `kernel_build_config` for input to a `kernel_build` rule. + + Args: + msm_target: name of target platform (e.g. "kalama") + variant: variant of kernel to build (e.g. "gki") + """ + + gen_config_command = """ + cat << 'EOF' > "$@" +KERNEL_DIR="msm-kernel" +SOC_NAME="monaco_auto" +VARIANTS=(%s) +MSM_ARCH=%s +VARIANT=%s +ABL_SRC=bootable/bootloader/edk2 +BOOT_IMAGE_HEADER_VERSION=%d +BASE_ADDRESS=0x%X +PAGE_SIZE=%d +TARGET_HAS_SEPARATE_RD=1 +PREFERRED_USERSPACE=qx +BUILD_BOOT_IMG=1 +SKIP_UNPACKING_RAMDISK=1 +BUILD_INITRAMFS=1 +[ -z "$${DT_OVERLAY_SUPPORT}" ] && DT_OVERLAY_SUPPORT=1 +KERNEL_VENDOR_CMDLINE+=' console=hvc0 earlycon=hvc0 hvc_dcc.enable=1 loglevel=8 nokaslr printk.devkmsg=on root=/dev/ram0 rw rootwait' +EOF + """ % ( + " ".join([v.replace("-", "_") for v in qx_variants]), # VARIANTS + msm_target.replace("-", "_"), + variant.replace("-", "_"), + boot_image_opts.boot_image_header_version, + boot_image_opts.base_address, + boot_image_opts.page_size, + ) + + # Generate the build config + native.genrule( + name = "{}_build_config_bazel".format(target), + srcs = [], + outs = ["build.config.msm.{}.generated".format(target)], + cmd_bash = gen_config_command, + ) + + top_level_config = define_top_level_config(target) + common_config = gen_config_without_source_lines("build.config.common", target) + + # Concatenate build config fragments to form the final config + kernel_build_config( + name = "{}_build_config".format(target), + srcs = [ + # do not sort + top_level_config, + "build.config.constants", + common_config, + "build.config.aarch64", + ":{}_build_config_bazel".format(target), + ] + [fragment for fragment in build_config_fragments] + [ + "build.config.msm.common", + defconfig, + ], + ) + +def _define_kernel_build( + target, + in_tree_module_list, + dtb_list, + dtbo_list, + dtstree): + """Creates a `kernel_build` and other associated definitions + + This is where the main kernel build target is created (e.g. `//msm-kernel:kalama_gki`). + Many other rules will take this `kernel_build` as an input. + + Args: + target: name of main Bazel target (e.g. `kalama_gki`) + in_tree_module_list: list of in-tree modules + dtb_list: device tree blobs expected to be built + dtbo_list: device tree overlay blobs expected to be built + """ + out_list = [".config", "Module.symvers"] + + if dtb_list: + out_list += dtb_list + if dtbo_list: + out_list += dtbo_list + + # Add basic kernel outputs + out_list += aarch64_outs + + # LE builds don't build compressed, so remove from list + out_list.remove("Image.lz4") + out_list.remove("Image.gz") + + kernel_build( + name = target, + module_outs = in_tree_module_list, + outs = out_list, + build_config = ":{}_build_config".format(target), + dtstree = dtstree, + kmi_symbol_list = None, + additional_kmi_symbol_lists = None, + abi_definition = None, + visibility = ["//visibility:public"], + ) + + kernel_modules_install( + name = "{}_modules_install".format(target), + kernel_build = ":{}".format(target), + ) + + + merged_kernel_uapi_headers( + name = "{}_merged_kernel_uapi_headers".format(target), + kernel_build = ":{}".format(target), + ) + + kernel_compile_commands( + name = "{}_compile_commands".format(target), + kernel_build = ":{}".format(target), + ) + + +def _define_kernel_dist(target, msm_target, variant): + """Creates distribution targets for kernel builds + + When Bazel builds everything, the outputs end up buried in `bazel-bin`. + These rules are used to copy the build artifacts to `out/msm-kernel-/dist/` + with proper permissions, etc. + + Args: + target: name of main Bazel target (e.g. `kalama_gki`) + """ + + dist_dir = get_out_dir(msm_target, variant) + "/dist" + qx_target = msm_target.split("-")[0]; + + msm_dist_targets = [ + # do not sort + ":{}".format(target), + ":{}_images".format(target), + ":{}_merged_kernel_uapi_headers".format(target), + ":{}_build_config".format(target), + ] + + copy_to_dist_dir( + name = "{}_dist".format(target), + data = msm_dist_targets, + dist_dir = dist_dir, + flat = True, + wipe_dist_dir = True, + allow_duplicate_filenames = True, + mode_overrides = { + # do not sort + "**/*.elf": "755", + "**/vmlinux": "755", + "**/Image": "755", + "**/*.dtb*": "755", + "**/LinuxLoader*": "755", + "**/*": "644", + }, + log = "info", + ) + + native.alias( + name = "{}_test_mapping".format(target), + actual = ":{}_dist".format(target), + ) + + test_mappings_dist( + name = "{}_test_mapping_dist".format(target), + dist_dir = dist_dir, + ) + +def define_msm_qx( + msm_target, + variant, + defconfig, + in_tree_module_list, + boot_image_opts = boot_image_opts()): + """Top-level kernel build definition macro for an MSM platform + + Args: + msm_target: name of target platform (e.g. "gen4auto") + variant: variant of kernel to build (e.g. "perf-defconfig") + in_tree_module_list: list of in-tree modules + boot_image_header_version: boot image header version (for `boot.img`) + base_address: edk2 base address + page_size: kernel page size + super_image_size: size of super image partition + lz4_ramdisk: whether to use an lz4-compressed ramdisk + """ + + if not variant in qx_variants: + fail("{} not defined in target_variants.bzl qx_variants!".format(variant)) + + # Enforce format of "//msm-kernel:target-foo_variant-bar" (underscore is the delimeter + # between target and variant) + target = msm_target.replace("_", "-") + "_" + variant.replace("_", "-") + qx_target = msm_target.split("-")[0]; + + dtb_list = get_dtb_list(qx_target) + dtbo_list = get_dtbo_list(qx_target) + dtstree = get_dtstree(qx_target) + vendor_ramdisk_binaries = ["//prebuilts/qcom_boot_artifacts:le-initrd.gz"] + build_config_fragments = get_build_config_fragments(qx_target) + + _define_build_config( + qx_target, + target, + variant, + defconfig, + boot_image_opts = boot_image_opts, + build_config_fragments = build_config_fragments, + ) + + _define_kernel_build( + target, + in_tree_module_list, + dtb_list, + dtbo_list, + dtstree, + ) + + kernel_images( + name = "{}_images".format(target), + kernel_modules_install = ":{}_modules_install".format(target), + kernel_build = ":{}".format(target), + build_boot = True, + build_dtbo = True if dtbo_list else False, + build_initramfs = True, + dtbo_srcs = [":{}/".format(target) + d for d in dtbo_list] if dtbo_list else None, + vendor_ramdisk_binaries = vendor_ramdisk_binaries, + boot_image_outs = ["boot.img"], + ) + + _define_kernel_dist(target, msm_target, variant) + + define_abl_dist(target, msm_target, variant) + + define_dtc_dist(target, msm_target, variant) diff --git a/msm_platforms.bzl b/msm_platforms.bzl index c492ef8c180d..258679bd81e0 100644 --- a/msm_platforms.bzl +++ b/msm_platforms.bzl @@ -1,5 +1,6 @@ load(":gen3auto.bzl", "define_gen3auto") load(":autogvm.bzl", "define_autogvm") +load(":gen4auto.bzl", "define_gen4auto") load(":pineapple.bzl", "define_pineapple") load(":pineapple_tuivm.bzl", "define_pineapple_tuivm") load(":pineapple_oemvm.bzl", "define_pineapple_oemvm") @@ -14,6 +15,7 @@ def define_msm_platforms(): define_signing_keys() define_gen3auto() define_autogvm() + define_gen4auto() define_pineapple() define_pineapple_tuivm() define_pineapple_oemvm() diff --git a/target_variants.bzl b/target_variants.bzl index 56f3c0b6aa94..c011efac3098 100644 --- a/target_variants.bzl +++ b/target_variants.bzl @@ -12,6 +12,17 @@ la_variants = [ "gki", ] +qx_variants = [ + # keep sorted + "debug-defconfig", + "perf-defconfig", +] + +qx_targets = [ + # keep sorted + "gen4auto", +] + le_targets = [ # keep sorted "pineapple-allyes", @@ -45,8 +56,11 @@ def get_all_la_variants(): def get_all_le_variants(): return [(t, v) for t in le_targets for v in le_variants] +def get_all_qx_variants(): + return [(t, v) for t in qx_targets for v in qx_variants] + def get_all_vm_variants(): return [(t, v) for t in vm_targets for v in vm_variants] def get_all_variants(): - return get_all_la_variants() + get_all_le_variants() + get_all_vm_variants() + return get_all_la_variants() + get_all_le_variants() + get_all_qx_variants() + get_all_vm_variants()