msm_kernel_le.bzl 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. load("//build/bazel_common_rules/dist:dist.bzl", "copy_to_dist_dir")
  2. load("//build/kernel/kleaf:constants.bzl", "aarch64_outs")
  3. load(
  4. "//build/kernel/kleaf:kernel.bzl",
  5. "kernel_build",
  6. "kernel_build_config",
  7. "kernel_compile_commands",
  8. "kernel_images",
  9. "kernel_modules_install",
  10. "merged_kernel_uapi_headers",
  11. )
  12. load(
  13. "//build:msm_kernel_extensions.bzl",
  14. "define_extras",
  15. "get_build_config_fragments",
  16. "get_dtb_list",
  17. "get_dtbo_list",
  18. "get_dtstree",
  19. "get_vendor_ramdisk_binaries",
  20. )
  21. load("@bazel_skylib//rules:write_file.bzl", "write_file")
  22. load(":msm_common.bzl", "define_top_level_config", "gen_config_without_source_lines", "get_out_dir")
  23. load(":msm_dtc.bzl", "define_dtc_dist")
  24. load(":msm_abl.bzl", "define_abl_dist")
  25. load(":image_opts.bzl", "boot_image_opts")
  26. load(":target_variants.bzl", "le_variants")
  27. load(":allyes_images.bzl", "gen_allyes_files")
  28. def _define_build_config(
  29. msm_target,
  30. target,
  31. variant,
  32. defconfig,
  33. boot_image_opts = boot_image_opts(),
  34. build_config_fragments = []):
  35. """Creates a kernel_build_config for an MSM target
  36. Creates a `kernel_build_config` for input to a `kernel_build` rule.
  37. Args:
  38. msm_target: name of target platform (e.g. "kalama")
  39. variant: variant of kernel to build (e.g. "gki")
  40. """
  41. # keep earlycon addr in earlycon cmdline param only when provided explicitly in target's bazel file
  42. # otherwise, rely on stdout-path
  43. earlycon_param = "={}".format(boot_image_opts.earlycon_addr) if boot_image_opts.earlycon_addr != None else ""
  44. earlycon_param = "earlycon" + earlycon_param
  45. write_file(
  46. name = "{}_build_config_bazel".format(target),
  47. out = "build.config.msm.{}.generated".format(target),
  48. content = [
  49. 'KERNEL_DIR="msm-kernel"',
  50. "VARIANTS=({})".format(" ".join([v.replace("-", "_") for v in le_variants])),
  51. "MSM_ARCH={}".format(msm_target.replace("-", "_")),
  52. "VARIANT={}".format(variant.replace("-", "_")),
  53. "ABL_SRC=bootable/bootloader/edk2",
  54. "BOOT_IMAGE_HEADER_VERSION={}".format(boot_image_opts.boot_image_header_version),
  55. "BASE_ADDRESS=0x%X" % boot_image_opts.base_address,
  56. "PAGE_SIZE={}".format(boot_image_opts.page_size),
  57. "TARGET_HAS_SEPARATE_RD=1",
  58. "PREFERRED_USERSPACE=le",
  59. "BUILD_BOOT_IMG=1",
  60. "SKIP_UNPACKING_RAMDISK=1",
  61. "BUILD_INITRAMFS=1",
  62. '[ -z "$DT_OVERLAY_SUPPORT" ] && DT_OVERLAY_SUPPORT=1',
  63. '[ "$KERNEL_CMDLINE_CONSOLE_AUTO" != "0" ] && KERNEL_VENDOR_CMDLINE+=\' console=ttyMSM0,115200n8 {} qcom_geni_serial.con_enabled=1 \''.format(earlycon_param),
  64. "", # Needed for newline at end of file
  65. ],
  66. )
  67. top_level_config = define_top_level_config(target)
  68. common_config = gen_config_without_source_lines("build.config.common", target)
  69. # Concatenate build config fragments to form the final config
  70. kernel_build_config(
  71. name = "{}_build_config".format(target),
  72. srcs = [
  73. # do not sort
  74. top_level_config,
  75. "build.config.constants",
  76. common_config,
  77. "build.config.aarch64",
  78. ":{}_build_config_bazel".format(target),
  79. ] + [fragment for fragment in build_config_fragments] + [
  80. "build.config.msm.common",
  81. defconfig,
  82. ],
  83. )
  84. def _define_kernel_build(
  85. target,
  86. in_tree_module_list,
  87. dtb_list,
  88. dtbo_list,
  89. dtstree):
  90. """Creates a `kernel_build` and other associated definitions
  91. This is where the main kernel build target is created (e.g. `//msm-kernel:kalama_gki`).
  92. Many other rules will take this `kernel_build` as an input.
  93. Args:
  94. target: name of main Bazel target (e.g. `kalama_gki`)
  95. in_tree_module_list: list of in-tree modules
  96. dtb_list: device tree blobs expected to be built
  97. dtbo_list: device tree overlay blobs expected to be built
  98. """
  99. out_list = [".config", "Module.symvers"]
  100. if dtb_list:
  101. out_list += dtb_list
  102. if dtbo_list:
  103. out_list += dtbo_list
  104. # Add basic kernel outputs
  105. out_list += aarch64_outs
  106. # LE builds don't build compressed, so remove from list
  107. out_list.remove("Image.lz4")
  108. out_list.remove("Image.gz")
  109. kernel_build(
  110. name = target,
  111. module_outs = in_tree_module_list,
  112. outs = out_list,
  113. build_config = ":{}_build_config".format(target),
  114. dtstree = dtstree,
  115. kmi_symbol_list = None,
  116. additional_kmi_symbol_lists = None,
  117. abi_definition = None,
  118. visibility = ["//visibility:public"],
  119. )
  120. kernel_modules_install(
  121. name = "{}_modules_install".format(target),
  122. kernel_build = ":{}".format(target),
  123. )
  124. merged_kernel_uapi_headers(
  125. name = "{}_merged_kernel_uapi_headers".format(target),
  126. kernel_build = ":{}".format(target),
  127. )
  128. kernel_compile_commands(
  129. name = "{}_compile_commands".format(target),
  130. kernel_build = ":{}".format(target),
  131. )
  132. def _define_kernel_dist(target, msm_target, variant):
  133. """Creates distribution targets for kernel builds
  134. When Bazel builds everything, the outputs end up buried in `bazel-bin`.
  135. These rules are used to copy the build artifacts to `out/msm-kernel-<target>/dist/`
  136. with proper permissions, etc.
  137. Args:
  138. target: name of main Bazel target (e.g. `kalama_gki`)
  139. """
  140. dist_dir = get_out_dir(msm_target, variant) + "/dist"
  141. le_target = msm_target.split("-")[0]
  142. msm_dist_targets = [
  143. # do not sort
  144. ":{}".format(target),
  145. ":{}_images".format(target),
  146. ":{}_merged_kernel_uapi_headers".format(target),
  147. ":{}_build_config".format(target),
  148. ":{}_dummy_files".format(le_target),
  149. ":{}_avb_sign_boot_image".format(target),
  150. "//msm-kernel:{}_super_image".format(le_target + "_gki"),
  151. ]
  152. copy_to_dist_dir(
  153. name = "{}_dist".format(target),
  154. data = msm_dist_targets,
  155. dist_dir = dist_dir,
  156. flat = True,
  157. wipe_dist_dir = True,
  158. allow_duplicate_filenames = True,
  159. mode_overrides = {
  160. # do not sort
  161. "**/*.elf": "755",
  162. "**/vmlinux": "755",
  163. "**/Image": "755",
  164. "**/*.dtb*": "755",
  165. "**/LinuxLoader*": "755",
  166. "**/*": "644",
  167. },
  168. log = "info",
  169. )
  170. def define_msm_le(
  171. msm_target,
  172. variant,
  173. defconfig,
  174. in_tree_module_list,
  175. boot_image_opts = boot_image_opts()):
  176. """Top-level kernel build definition macro for an MSM platform
  177. Args:
  178. msm_target: name of target platform (e.g. "pineapple.allyes")
  179. variant: variant of kernel to build (e.g. "gki")
  180. in_tree_module_list: list of in-tree modules
  181. boot_image_header_version: boot image header version (for `boot.img`)
  182. base_address: edk2 base address
  183. page_size: kernel page size
  184. super_image_size: size of super image partition
  185. lz4_ramdisk: whether to use an lz4-compressed ramdisk
  186. """
  187. if not variant in le_variants:
  188. fail("{} not defined in target_variants.bzl le_variants!".format(variant))
  189. # Enforce format of "//msm-kernel:target-foo_variant-bar" (underscore is the delimeter
  190. # between target and variant)
  191. target = msm_target.replace("_", "-") + "_" + variant.replace("_", "-")
  192. le_target = msm_target.split("-")[0]
  193. dtb_list = get_dtb_list(le_target)
  194. dtbo_list = get_dtbo_list(le_target)
  195. dtstree = get_dtstree(le_target)
  196. vendor_ramdisk_binaries = get_vendor_ramdisk_binaries(target, flavor = "le")
  197. build_config_fragments = get_build_config_fragments(le_target)
  198. _define_build_config(
  199. le_target,
  200. target,
  201. variant,
  202. defconfig,
  203. boot_image_opts = boot_image_opts,
  204. build_config_fragments = build_config_fragments,
  205. )
  206. _define_kernel_build(
  207. target,
  208. in_tree_module_list,
  209. dtb_list,
  210. dtbo_list,
  211. dtstree,
  212. )
  213. kernel_images(
  214. name = "{}_images".format(target),
  215. kernel_modules_install = ":{}_modules_install".format(target),
  216. kernel_build = ":{}".format(target),
  217. build_boot = True,
  218. build_dtbo = True if dtbo_list else False,
  219. build_initramfs = True,
  220. dtbo_srcs = [":{}/".format(target) + d for d in dtbo_list] if dtbo_list else None,
  221. vendor_ramdisk_binaries = vendor_ramdisk_binaries,
  222. boot_image_outs = ["boot.img"],
  223. )
  224. _define_kernel_dist(target, msm_target, variant)
  225. define_abl_dist(target, msm_target, variant)
  226. define_dtc_dist(target, msm_target, variant)
  227. gen_allyes_files(le_target, target)
  228. define_extras(target)