From 6624a5c4539fc5143987ae4b70163eec26f93fe6 Mon Sep 17 00:00:00 2001 From: Varsha Suresh Date: Wed, 7 Dec 2022 11:19:11 -0800 Subject: [PATCH] mm-drivers: disp: Add support for Bazel build system - add support to build mm-drivers module using DDK framework for pineapple - add macro that makes it easy to register new modules Change-Id: I704bbe946f4d1053a85bfb122408c201b0f155b2 Signed-off-by: Varsha Suresh --- BUILD.bazel | 36 ++++++++++++++++ mm_module_build.bzl | 103 ++++++++++++++++++++++++++++++++++++++++++++ mm_modules.bzl | 44 +++++++++++++++++++ target.bzl | 16 +++++++ 4 files changed, 199 insertions(+) create mode 100644 BUILD.bazel create mode 100644 mm_module_build.bzl create mode 100644 mm_modules.bzl create mode 100644 target.bzl diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000000..77944804ce --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,36 @@ +load("//build/kernel/kleaf:kernel.bzl", "ddk_headers") + +package( + default_visibility = [ + "//visibility:public"], +) + +ddk_headers( + name = "mm_drivers_configs", + hdrs = glob([ + "config/*.h"]), + includes = ["config"] +) + +ddk_headers( + name = "hw_fence_headers", + hdrs = glob([ + "hw_fence/include/*.h"]), + includes = ["hw_fence/include"] +) + +ddk_headers( + name = "sync_fence_uapi_headers", + hdrs = glob([ + "sync_fence/include/uapi/sync_fence/*.h", + "sync_fence/include/*.h"]), + includes = ["sync_fence/include"] +) + +ddk_headers( + name = "mm_drivers_headers", + hdrs = [":mm_drivers_configs", ":hw_fence_headers", ":sync_fence_uapi_headers"] +) + +load(":target.bzl", "define_pineapple") +define_pineapple() \ No newline at end of file diff --git a/mm_module_build.bzl b/mm_module_build.bzl new file mode 100644 index 0000000000..dc708705b5 --- /dev/null +++ b/mm_module_build.bzl @@ -0,0 +1,103 @@ +load("//build/kernel/kleaf:kernel.bzl", "ddk_module","ddk_submodule") +load("//build/bazel_common_rules/dist:dist.bzl", "copy_to_dist_dir") +load("//msm-kernel:target_variants.bzl", "get_all_variants") + +def _register_module_to_map(module_map, name, path, config_option, srcs, config_srcs, deps): + processed_config_srcs = {} + + for config_src_name in config_srcs: + config_src = config_srcs[config_src_name] + + if type(config_src) == "list": + processed_config_srcs[config_src_name] = {True: config_src} + else: + processed_config_srcs[config_src_name] = config_src + + module = struct( + name = name, + path = path, + srcs = srcs, + config_srcs = processed_config_srcs, + config_option = config_option, + deps = deps, + ) + + module_map[name] = module + +def _get_config_choices(map, options): + choices = [] + for option in map: + choices.extend(map[option].get(option in options,[])) + return choices + +def _get_kernel_build_options(modules, config_options): + all_options = {option: True for option in config_options} + all_options = all_options | {module.config_option: True for module in modules if module.config_option} + return all_options + +def _get_kernel_build_module_srcs(module, options, formatter): + srcs = module.srcs + _get_config_choices(module.config_srcs, options) + print("-",module.name,",",module.config_option,",srcs =",srcs) + module_path = "{}/".format(module.path) if module.path else "" + return ["{}{}".format(module_path, formatter(src)) for src in srcs] + +def _get_kernel_build_module_deps(module, options, formatter): + return [formatter(dep) for dep in module.deps] + +def mm_driver_module_entry(hdrs = []): + module_map = {} + + def register(name, path = None, config_option = None, srcs = [], config_srcs = {}, deps =[]): + _register_module_to_map(module_map, name, path, config_option, srcs, config_srcs, deps) + return struct( + register = register, + get = module_map.get, + hdrs = hdrs, + module_map = module_map + ) + +def define_target_variant_modules(target, variant, registry, modules, config_options = []): + kernel_build = "{}_{}".format(target, variant) + kernel_build_label = "//msm-kernel:{}".format(kernel_build) + modules = [registry.get(module_name) for module_name in modules] + options = _get_kernel_build_options(modules, config_options) + build_print = lambda message : print("{}: {}".format(kernel_build, message)) + formatter = lambda s : s.replace("%b", kernel_build).replace("%t", target) + headers = ["//msm-kernel:all_headers"] + registry.hdrs + all_module_rules = [] + + for module in modules: + rule_name = "{}_{}".format(kernel_build, module.name) + module_srcs = _get_kernel_build_module_srcs(module, options, formatter) + + if not module_srcs: + continue + + ddk_submodule( + name = rule_name, + srcs = module_srcs, + out = "{}.ko".format(module.name), + deps = headers + _get_kernel_build_module_deps(module, options, formatter), + local_defines = options.keys(), + ) + all_module_rules.append(rule_name) + + ddk_module( + name = "{}_mm_drivers".format(kernel_build), + kernel_build = kernel_build_label, + deps = all_module_rules, + ) + copy_to_dist_dir( + name = "{}_mm_drivers_dist".format(kernel_build), + data = [":{}_mm_drivers".format(kernel_build)], + dist_dir = "out/target/product/{}/dlkm/lib/modules".format(target), + flat = True, + wipe_dist_dir = False, + allow_duplicate_filenames = False, + mode_overrides = {"**/*": "644"}, + log = "info", + ) + +def define_consolidate_gki_modules(target, registry, modules, config_options = []): + for (targets, variant) in get_all_variants(): + define_target_variant_modules(targets, variant, registry, modules, config_options) \ No newline at end of file diff --git a/mm_modules.bzl b/mm_modules.bzl new file mode 100644 index 0000000000..ef8b175e79 --- /dev/null +++ b/mm_modules.bzl @@ -0,0 +1,44 @@ +load(":mm_module_build.bzl", "mm_driver_module_entry") + +HW_FENCE_PATH = "hw_fence" +MSM_EXT_DISPLAY_PATH = "msm_ext_display" +SYNC_FENCE_PATH = "sync_fence" + +mm_driver_modules = mm_driver_module_entry([":mm_drivers_headers"]) +module_entry = mm_driver_modules.register + +#--------------- MM-DRIVERS MODULES ------------------ + +module_entry( + name = "hw_fence", + path = HW_FENCE_PATH + "/src", + config_option = "CONFIG_QTI_HW_FENCE", + config_srcs = { + "CONFIG_DEBUG_FS" : [ + "hw_fence_ioctl.c", + ] + }, + srcs = ["hw_fence_drv_debug.c", + "hw_fence_drv_ipc.c", + "hw_fence_drv_priv.c", + "hw_fence_drv_utils.c", + "msm_hw_fence.c", + "msm_hw_fence_synx_translation.c"], + deps =[ + "//vendor/qcom/opensource/synx-kernel:synx_headers" + ] +) + +module_entry( + name = "msm_ext_display", + path = MSM_EXT_DISPLAY_PATH + "/src", + config_option = "CONFIG_MSM_EXT_DISPLAY", + srcs = ["msm_ext_display.c"], +) + +module_entry( + name = "sync_fence", + path = SYNC_FENCE_PATH + "/src", + config_option = "CONFIG_QCOM_SPEC_SYNC", + srcs = ["qcom_sync_file.c"], +) \ No newline at end of file diff --git a/target.bzl b/target.bzl new file mode 100644 index 0000000000..6d63bab3c8 --- /dev/null +++ b/target.bzl @@ -0,0 +1,16 @@ +load(":mm_modules.bzl", "mm_driver_modules") +load(":mm_module_build.bzl", "define_consolidate_gki_modules") + +def define_pineapple(): + define_consolidate_gki_modules( + target = "pineapple", + registry = mm_driver_modules, + modules = [ + "hw_fence", + "msm_ext_display", + "sync_fence", + ], + config_options = [ + "CONFIG_DEBUG_FS", + ], +) \ No newline at end of file