msm_kernel_lxc.bzl 8.6 KB

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