diff --git a/vendor/qcom/opensource/bt-kernel/Makefile b/vendor/qcom/opensource/bt-kernel/Makefile index 51cbbaea9..1312a2fcf 100644 --- a/vendor/qcom/opensource/bt-kernel/Makefile +++ b/vendor/qcom/opensource/bt-kernel/Makefile @@ -5,8 +5,11 @@ M=$(PWD) BT_ROOT=$(KERNEL_SRC)/$(M) KBUILD_OPTIONS+= BT_ROOT=$(BT_ROOT) +KBUILD_OPTIONS += CONFIG_MSM_BT_POWER=m +KBUILD_OPTIONS += CONFIG_BTFM_SLIM=m +KBUILD_OPTIONS += CONFIG_I2C_RTC6226_QCA=m KBUILD_EXTRA_SYMBOLS=$(call intermediates-dir-for,DLKM,wlan-platform-module-symvers)/Module.symvers -KBUILD_EXTRA_SYMBOLS=$(OUT_DIR)/vendor/qcom/wlan/platform/Module.symvers +KBUILD_EXTRA_SYMBOLS=$(M)/../wlan/platform/Module.symvers ccflags-y += -I$(BT_ROOT)/../wlan/platform/inc all: diff --git a/vendor/qcom/opensource/datarmnet-ext/aps/Makefile b/vendor/qcom/opensource/datarmnet-ext/aps/Makefile index 3b150c8cd..974149f2d 100644 --- a/vendor/qcom/opensource/datarmnet-ext/aps/Makefile +++ b/vendor/qcom/opensource/datarmnet-ext/aps/Makefile @@ -1,5 +1,8 @@ #By default build for CLD RMNET_APS_SELECT := CONFIG_RMNET_APS=m +DATARMNET_CORE_PATH=datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_ROOT=$(KERNEL_SRC)/$(M)/../../datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_INC_DIR=$(KERNEL_SRC)/$(M)/../../datarmnet/core/ KBUILD_OPTIONS += $(RMNET_APS_SELECT) KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers @@ -7,7 +10,7 @@ KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers M ?= $(shell pwd) all: - $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) + $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS=$(KBUILD_EXTRA_SYMBOLS) modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install diff --git a/vendor/qcom/opensource/datarmnet-ext/offload/Makefile b/vendor/qcom/opensource/datarmnet-ext/offload/Makefile index d9e9d4255..cb682380b 100644 --- a/vendor/qcom/opensource/datarmnet-ext/offload/Makefile +++ b/vendor/qcom/opensource/datarmnet-ext/offload/Makefile @@ -1,5 +1,8 @@ #By default build for CLD RMNET_OFFLOAD_SELECT := CONFIG_RMNET_OFFLOAD=m +DATARMNET_CORE_PATH=datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_ROOT=$(KERNEL_SRC)/$(M)/../../datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_INC_DIR=$(KERNEL_SRC)/$(M)/../../datarmnet/core/ KBUILD_OPTIONS += $(RMNET_OFFLOAD_SELECT) KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers @@ -7,7 +10,7 @@ KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers M ?= $(shell pwd) all: - $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) $(KBUILD_EXTRA_SYMBOLS) + $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS=$(KBUILD_EXTRA_SYMBOLS) modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install diff --git a/vendor/qcom/opensource/datarmnet-ext/perf/Makefile b/vendor/qcom/opensource/datarmnet-ext/perf/Makefile index 33b7f2caa..5931618d2 100644 --- a/vendor/qcom/opensource/datarmnet-ext/perf/Makefile +++ b/vendor/qcom/opensource/datarmnet-ext/perf/Makefile @@ -1,6 +1,11 @@ #By default build for CLD RMNET_PERF_SELECT := CONFIG_RMNET_PERF=m +DATARMNET_CORE_PATH=datarmnet/core +DATARMNET_SHS_PATH=datarmnet-ext/shs KBUILD_OPTIONS += $(RMNET_PERF_SELECT) +KBUILD_OPTIONS += RMNET_CORE_ROOT=$(KERNEL_SRC)/$(M)/../../datarmnet/core +KBUILD_OPTIONS += RMNET_SHS_PATH=$(KERNEL_SRC)/$(M)/../../shs +KBUILD_OPTIONS += RMNET_CORE_INC_DIR=$(KERNEL_SRC)/$(M)/../../datarmnet/core/ KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers KBUILD_EXTRA_SYMBOLS += $(M)/../../$(DATARMNET_SHS_PATH)/Module.symvers @@ -8,7 +13,7 @@ KBUILD_EXTRA_SYMBOLS += $(M)/../../$(DATARMNET_SHS_PATH)/Module.symvers M ?= $(shell pwd) all: - $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) $(KBUILD_EXTRA_SYMBOLS) + $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS=$(KBUILD_EXTRA_SYMBOLS) modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install diff --git a/vendor/qcom/opensource/datarmnet-ext/perf_tether/Makefile b/vendor/qcom/opensource/datarmnet-ext/perf_tether/Makefile index 4a9ebcd98..daa7a1298 100644 --- a/vendor/qcom/opensource/datarmnet-ext/perf_tether/Makefile +++ b/vendor/qcom/opensource/datarmnet-ext/perf_tether/Makefile @@ -1,13 +1,17 @@ #By default build for CLD RMNET_PERF_TETHER_SELECT := CONFIG_RMNET_PERF_TETHER=m +DATARMNET_CORE_PATH=datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_ROOT=$(KERNEL_SRC)/$(M)/../../datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_INC_DIR=$(KERNEL_SRC)/$(M)/../../datarmnet/core/ KBUILD_OPTIONS += $(RMNET_PERF_TETHER_SELECT) KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers +KBUILD_EXTRA_SYMBOLS += $(M)/../shs/Module.symvers M ?= $(shell pwd) all: - $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) $(KBUILD_EXTRA_SYMBOLS) + $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS=$(KBUILD_EXTRA_SYMBOLS) modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install diff --git a/vendor/qcom/opensource/datarmnet-ext/sch/Makefile b/vendor/qcom/opensource/datarmnet-ext/sch/Makefile index b8749ce73..abfa69f24 100644 --- a/vendor/qcom/opensource/datarmnet-ext/sch/Makefile +++ b/vendor/qcom/opensource/datarmnet-ext/sch/Makefile @@ -1,5 +1,7 @@ #By default build for CLD RMNET_SCH_SELECT := CONFIG_RMNET_SCH=m +KBUILD_OPTIONS += RMNET_CORE_ROOT=$(KERNEL_SRC)/$(M)/../../datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_INC_DIR=$(KERNEL_SRC)/$(M)/../../datarmnet/core/ KBUILD_OPTIONS += $(RMNET_SCH_SELECT) KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any diff --git a/vendor/qcom/opensource/datarmnet-ext/shs/Makefile b/vendor/qcom/opensource/datarmnet-ext/shs/Makefile index 37be58516..7d70f76ca 100644 --- a/vendor/qcom/opensource/datarmnet-ext/shs/Makefile +++ b/vendor/qcom/opensource/datarmnet-ext/shs/Makefile @@ -1,12 +1,15 @@ KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build KBUILD_OPTIONS := RMNET_SHS_ROOT=$(PWD) +DATARMNET_CORE_PATH=datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_ROOT=$(KERNEL_SRC)/$(M)/../../datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_INC_DIR=$(KERNEL_SRC)/$(M)/../../datarmnet/core/ KBUILD_OPTIONS += MODNAME?=rmnet_shs KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers M ?= $(shell pwd) all: - $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) $(KBUILD_EXTRA_SYMBOLS) + $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS=$(KBUILD_EXTRA_SYMBOLS) modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install diff --git a/vendor/qcom/opensource/datarmnet-ext/wlan/Makefile b/vendor/qcom/opensource/datarmnet-ext/wlan/Makefile index 16ab5a0f9..699a89bc5 100644 --- a/vendor/qcom/opensource/datarmnet-ext/wlan/Makefile +++ b/vendor/qcom/opensource/datarmnet-ext/wlan/Makefile @@ -1,5 +1,8 @@ #By default build for CLD RMNET_WLAN_SELECT := CONFIG_RMNET_WLAN=m +DATARMNET_CORE_PATH=datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_ROOT=$(KERNEL_SRC)/$(M)/../../datarmnet/core +KBUILD_OPTIONS += RMNET_CORE_INC_DIR=$(KERNEL_SRC)/$(M)/../../datarmnet/core/ KBUILD_OPTIONS += $(RMNET_WLAN_SELECT) KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers @@ -7,7 +10,7 @@ KBUILD_EXTRA_SYMBOLS := $(M)/../../$(DATARMNET_CORE_PATH)/Module.symvers M ?= $(shell pwd) all: - $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) $(KBUILD_EXTRA_SYMBOLS) + $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS) KBUILD_EXTRA_SYMBOLS=$(KBUILD_EXTRA_SYMBOLS) modules_install: $(MAKE) INSTALL_MOD_STRIP=1 -C $(KERNEL_SRC) M=$(M) modules_install diff --git a/vendor/qcom/opensource/graphics-kernel/config/gki_kalama.conf b/vendor/qcom/opensource/graphics-kernel/config/gki_kalama.conf index f12a8d64f..76c38ec02 100644 --- a/vendor/qcom/opensource/graphics-kernel/config/gki_kalama.conf +++ b/vendor/qcom/opensource/graphics-kernel/config/gki_kalama.conf @@ -1,3 +1,4 @@ +CONFIG_QCOM_KGSL = m CONFIG_DEVFREQ_GOV_QCOM_ADRENO_TZ = y CONFIG_DEVFREQ_GOV_QCOM_GPUBW_MON = y CONFIG_QCOM_KGSL_IDLE_TIMEOUT = 80 diff --git a/vendor/qcom/opensource/mmrm-driver/test/Kbuild b/vendor/qcom/opensource/mmrm-driver/test/Kbuild new file mode 100644 index 000000000..44273bed5 --- /dev/null +++ b/vendor/qcom/opensource/mmrm-driver/test/Kbuild @@ -0,0 +1,4 @@ +ifdef CONFIG_MSM_MMRM +obj-m := mmrm_test_module.o +mmrm_test_module-objs := mmrm_test.o mmrm_test_internal.o +endif diff --git a/vendor/qcom/opensource/mmrm-driver/test/mmrm_test.c b/vendor/qcom/opensource/mmrm-driver/test/mmrm_test.c new file mode 100644 index 000000000..8951c159b --- /dev/null +++ b/vendor/qcom/opensource/mmrm-driver/test/mmrm_test.c @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2021, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define pr_fmt(fmt) "mmrm_test: " fmt + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "mmrm_test_internal.h" + +#define MODULE_NAME "mmrm_test" + +enum PLATFORM_SOC_ID { + SOC_ID_LAHAINA = 415, /* LAHAINA */ + SOC_ID_WAIPIO = 457, /* WAIPIO */ + SOC_ID_KAILUA = 519, /* KAILUA */ +}; + + +struct mmrm_test_platform_resources { + struct platform_device *pdev; + struct clock_rate *clk_rate_tbl; + u32 count; +}; + +struct mmrm_test_driver_data { + struct mmrm_test_platform_resources clk_res; +}; + +static struct mmrm_test_driver_data *test_drv_data = (void *) -EPROBE_DEFER; +int mmrm_load_mmrm_test_table( + struct mmrm_test_platform_resources *dt_res) +{ + int rc = 0, num_clock_names = 0, c = 0; + struct platform_device *pdev = dt_res->pdev; + int entry_offset = 0; + struct clock_rate *clk_rate; + + num_clock_names = of_property_count_strings(pdev->dev.of_node, + "clock-names"); + if (num_clock_names <= 0) { + dt_res->count = 0; + goto err_load_corner_tbl; + } + pr_info("%s: count =%d\n", __func__, num_clock_names); + + dt_res->clk_rate_tbl = devm_kzalloc(&pdev->dev, + sizeof(*dt_res->clk_rate_tbl) * num_clock_names, GFP_KERNEL); + + if (!dt_res->clk_rate_tbl) { + rc = -ENOMEM; + goto err_load_corner_tbl; + } + dt_res->count = num_clock_names; + + clk_rate = dt_res->clk_rate_tbl; + for (c = 0; c < num_clock_names; c++, clk_rate++) { + of_property_read_string_index(pdev->dev.of_node, + "clock-names", c, &clk_rate->name); + } + + clk_rate = dt_res->clk_rate_tbl; + for (c = 0; c < num_clock_names; c++, entry_offset += 7, clk_rate++) { + of_property_read_u32_index(pdev->dev.of_node, + "clock_rates", entry_offset, &clk_rate->domain); + + of_property_read_u32_index(pdev->dev.of_node, + "clock_rates", entry_offset+1, &clk_rate->id); + + of_property_read_u32_index(pdev->dev.of_node, + "clock_rates", entry_offset+2, &clk_rate->clk_rates[0]); + + of_property_read_u32_index(pdev->dev.of_node, + "clock_rates", entry_offset+3, &clk_rate->clk_rates[1]); + + of_property_read_u32_index(pdev->dev.of_node, + "clock_rates", entry_offset+4, &clk_rate->clk_rates[2]); + + of_property_read_u32_index(pdev->dev.of_node, + "clock_rates", entry_offset+5, &clk_rate->clk_rates[3]); + + of_property_read_u32_index(pdev->dev.of_node, + "clock_rates", entry_offset+6, &clk_rate->clk_rates[4]); + } + + /* print clock rate tables */ + + clk_rate = dt_res->clk_rate_tbl; + for (c = 0; c < num_clock_names; c++, clk_rate++) { + pr_info("clock name:%s, %d, %d, %d, %d, %d, %d, %d\n", clk_rate->name, + clk_rate->domain, clk_rate->id, + clk_rate->clk_rates[0], clk_rate->clk_rates[1], + clk_rate->clk_rates[2], clk_rate->clk_rates[3], + clk_rate->clk_rates[4]); + } + + return 0; + +err_load_corner_tbl: + return rc; +} + +struct clock_rate *find_clk_by_name(const char *name) +{ + int i; + struct mmrm_test_platform_resources *res = &test_drv_data->clk_res; + struct clock_rate *p = res->clk_rate_tbl; + + for (i=0; i < res->count; i++, p++) + { + if (strcmp(name, p->name) == 0) + return p; + } + return NULL; +} + +struct clock_rate *get_nth_clock(int nth) +{ + struct mmrm_test_platform_resources *res = &test_drv_data->clk_res; + + if (nth >= res->count) + return NULL; + + return &(res->clk_rate_tbl[nth]); +} + +int mmrm_test_read_platform_resources(struct platform_device *pdev) +{ + int rc = 0; + + pr_info("%s: mmrm_test_read_platform_resources =%p test_drv_data:%p\n", + __func__, pdev, test_drv_data); + + if (pdev == NULL || pdev->dev.of_node == NULL) { + rc = -EINVAL; + goto exit; + } + + if (test_drv_data == (void *) -EPROBE_DEFER) { + pr_info("%s: mmrm_test_read_platform_resources\n", __func__); + goto exit; + } + + rc = mmrm_load_mmrm_test_table(&test_drv_data->clk_res); + if (rc) { + goto exit; + } +exit: + return rc; +} + +static int mmrm_test_probe(struct platform_device *pdev) +{ + bool is_mmrm_supported = false; + int soc_id; + int rc; + + // Check if of_node is found + if (!of_device_is_compatible(pdev->dev.of_node, "qcom,msm-mmrm-test")) { + dev_info(&pdev->dev, "No compatible device node\n"); + return 1; + } + + is_mmrm_supported = mmrm_client_check_scaling_supported(MMRM_CLIENT_CLOCK, 0); + if (!is_mmrm_supported) { + pr_info("%s: MMRM not supported on %s\n", __func__, socinfo_get_id_string()); + return 0; + } + + test_drv_data = kzalloc(sizeof(*test_drv_data), GFP_KERNEL); + if (!test_drv_data) { + rc = -ENOMEM; + goto err_no_mem; + } + test_drv_data->clk_res.pdev = pdev; + dev_set_drvdata(&pdev->dev, test_drv_data); + + rc = mmrm_test_read_platform_resources(pdev); + if (rc) { + pr_info("%s: unable to read platform resources for mmrm\n", + __func__); + goto err_read; + } + dev_info(&pdev->dev, "%s: Validating mmrm on target: %s\n", __func__, socinfo_get_id_string()); + + // Get socid to get known mmrm configurations + soc_id = socinfo_get_id(); + switch (soc_id) { + case SOC_ID_LAHAINA: /* LAHAINA */ + test_mmrm_client(pdev, MMRM_TEST_LAHAINA, MMRM_TEST_LAHAINA_NUM_CLK_CLIENTS); +// test_mmrm_concurrent_client_cases(pdev, all_lahaina_testcases); + break; + case SOC_ID_WAIPIO: /* WAIPIO */ + test_mmrm_client(pdev, MMRM_TEST_WAIPIO, MMRM_TEST_WAIPIO_NUM_CLK_CLIENTS); + test_mmrm_concurrent_client_cases(pdev, waipio_testcases, waipio_testcases_count); + test_mmrm_switch_volt_corner_client_testcases(pdev, waipio_cornercase_testcases, waipio_cornercase_testcases_count); + break; + case SOC_ID_KAILUA: /* KAILUA */ + test_mmrm_client(pdev, MMRM_TEST_KAILUA, MMRM_TEST_KAILUA_NUM_CLK_CLIENTS); + test_mmrm_concurrent_client_cases(pdev, waipio_testcases, waipio_testcases_count); + test_mmrm_switch_volt_corner_client_testcases(pdev, waipio_cornercase_testcases, waipio_cornercase_testcases_count); + break; + default: + pr_info("%s: Not supported for soc_id %d [Target %s]\n", + __func__, + soc_id, + socinfo_get_id_string()); + return -ENODEV; + } + +err_no_mem: +err_read: + return 0; +} + +int mmrm_test_remove(struct platform_device *pdev) { + int rc = 0; + + if (!pdev) { + rc = -EINVAL; + goto err_exit; + } + + test_drv_data = dev_get_drvdata(&pdev->dev); + if (!test_drv_data) { + rc = -EINVAL; + goto err_exit; + } + + if (test_drv_data->clk_res.clk_rate_tbl) + kfree(test_drv_data->clk_res.clk_rate_tbl); + + dev_set_drvdata(&pdev->dev, NULL); + + kfree(test_drv_data); + test_drv_data = (void *) -EPROBE_DEFER; + +err_exit: + return rc; +} + +static const struct of_device_id mmrm_test_dt_match[] = { + {.compatible = "qcom,msm-mmrm-test"}, {} // empty +}; + +static struct platform_driver mmrm_test_driver = { + .probe = mmrm_test_probe, + .remove = mmrm_test_remove, + .driver = { + .name = MODULE_NAME, + .owner = THIS_MODULE, + .of_match_table = mmrm_test_dt_match, + }, +}; + +static int __init mmrm_test_init(void) +{ + int rc = 0; + rc = platform_driver_register(&mmrm_test_driver); + if (rc) { + pr_info("%s: failed to register platform driver\n", __func__); + } + return rc; +} +module_init(mmrm_test_init); + +static void __exit mmrm_test_exit(void) +{ + platform_driver_unregister(&mmrm_test_driver); +} +module_exit(mmrm_test_exit); + +MODULE_DESCRIPTION("MMRM TEST"); +MODULE_LICENSE("GPL v2"); diff --git a/vendor/qcom/opensource/mmrm-driver/test/mmrm_test_internal.c b/vendor/qcom/opensource/mmrm-driver/test/mmrm_test_internal.c new file mode 100644 index 000000000..e2ab54a8f --- /dev/null +++ b/vendor/qcom/opensource/mmrm-driver/test/mmrm_test_internal.c @@ -0,0 +1,1006 @@ +/* + * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define pr_fmt(fmt) "mmrm_test: " fmt + +#include +#include + +#include "mmrm_test_internal.h" + +#define MMRM_TEST_MAX_CLK_CLIENTS 30 +#define MMRM_TEST_NUM_CASES 3 + +enum mmrm_test_result { + TEST_MMRM_SUCCESS = 0, + TEST_MMRM_FAIL_REGISTER, + TEST_MMRM_FAIL_SETVALUE, + TEST_MMRM_FAIL_CLKGET, +}; + +struct mmrm_test_clk_client { + struct mmrm_clk_client_desc clk_client_desc; + unsigned long clk_rate[MMRM_TEST_VDD_LEVEL_MAX]; + struct mmrm_client *client; +}; + +static int test_mmrm_client_callback(struct mmrm_client_notifier_data *notifier_data) +{ + // TODO: Test callback here + return 0; +} + +static struct mmrm_client *test_mmrm_client_register(struct mmrm_client_desc *desc) +{ + struct mmrm_client *client; + + if (!desc) { + pr_info("%s: Invalid input\n", __func__); + return NULL; + } + + pr_info("%s: domain(%d) cid(%d) name(%s) type(%d) pri(%d) pvt(%p) " + "notifier(%p)\n", + __func__, + desc->client_info.desc.client_domain, + desc->client_info.desc.client_id, + desc->client_info.desc.name, + desc->client_type, + desc->priority, + desc->pvt_data, + desc->notifier_callback_fn); + + pr_info("%s: Registering mmrm client %s\n", __func__, desc->client_info.desc.name); + client = mmrm_client_register(desc); + if (client == NULL) { + pr_info("%s: Failed to register mmrm client %s\n", + __func__, + desc->client_info.desc.name); + return NULL; + } + pr_info("%s: cuid(%d)\n", __func__, client->client_uid); + return client; +} + +static int test_mmrm_client_deregister(struct mmrm_client *client) +{ + int rc; + + if (!client) { + pr_info("%s: Invalid input\n", __func__); + return -EINVAL; + } + + pr_info("%s: cuid(%d) Deregistering mmrm client\n", __func__, client->client_uid); + rc = mmrm_client_deregister(client); + if (rc != 0) { + pr_info("%s: cuid(%d) Failed to deregister mmrm client with %d\n", + __func__, + client->client_uid, + rc); + return rc; + } + return rc; +} + +static int test_mmrm_client_set_value( + struct mmrm_client *client, struct mmrm_client_data *client_data, unsigned long val) +{ + int rc; + + if (!client || !client_data) { + pr_info("%s: Invalid input\n", __func__); + return -EINVAL; + } + + pr_info("%s: cuid(%d) Setting value(%d) for mmrm client\n", + __func__, + client->client_uid, + val); + rc = mmrm_client_set_value(client, client_data, val); + if (rc != 0) { + pr_info("%s: cuid(%d) Failed to set value(%d) for mmrm client with %d\n", + __func__, + client->client_uid, + val, + rc); + return rc; + } + return rc; +} + +static int test_mmrm_client_get_value(struct mmrm_client *client, struct mmrm_client_res_value *val) +{ + int rc; + + if (!client || !val) { + pr_info("%s: Invalid input\n", __func__); + return -EINVAL; + } + + pr_info("%s: cuid(%d) Getting value for mmrm client\n", __func__, client->client_uid); + rc = mmrm_client_get_value(client, val); + if (rc != 0) { + pr_info("%s: cuid(%d) Failed to get value for mmrm client with %d\n", + __func__, + client->client_uid, + rc); + return rc; + } + pr_info("%s: cuid(%d) min(%d) cur(%d) max(%d)\n", + __func__, + client->client_uid, + val->min, + val->cur, + val->max); + return rc; +} + +void test_mmrm_client(struct platform_device *pdev, int index, int count) +{ + struct clk *clk; // clk struct + struct mmrm_client *client; // mmrm client + struct mmrm_client_data client_data; // mmrm client data + struct mmrm_client_res_value res_val; // mmrm get_val + int level; // mmrm set_val + unsigned long val; // mmrm set_val + struct clock_rate *p_clk_res; + struct mmrm_clk_client_desc *clk_desc; + struct mmrm_client_desc desc; + + int i, pass_count; + int rc = 0, rc2 = 0; + + pr_info("%s: Running individual client tests\n", __func__); + + // Run nominal test for each individual clock source + for (i = 0, pass_count = 0; i < count; i++) { + // Create callback used to pass resource data to client + struct mmrm_client_notifier_data notifier_data = { + MMRM_CLIENT_RESOURCE_VALUE_CHANGE, // cb_type + {{0, 0}}, // cb_data (old_val, new_val) + NULL}; // pvt_data + + // Create client descriptor + p_clk_res = get_nth_clock(i); + if (p_clk_res == NULL) + break; + + desc.client_type = MMRM_CLIENT_CLOCK; + desc.priority = MMRM_CLIENT_PRIOR_HIGH; + desc.pvt_data = notifier_data.pvt_data; + desc.notifier_callback_fn = test_mmrm_client_callback; + + clk_desc = &desc.client_info.desc; + clk_desc->client_domain = p_clk_res->domain; + clk_desc->client_id = p_clk_res->id; + strlcpy((char *)clk_desc->name, p_clk_res->name, sizeof(clk_desc->name)); + + // Get clk + clk = clk_get(&pdev->dev, (const char *)&desc.client_info.desc.name); + if (IS_ERR_OR_NULL(clk)) { + pr_info("%s: Failed clk_get for %s\n", + __func__, + desc.client_info.desc.name); + rc = -EINVAL; + goto err_clk; + } + desc.client_info.desc.clk = clk; + pr_info("%s: clk(%pK)\n", __func__, clk); + + // Register client + client = test_mmrm_client_register(&desc); + if (client == NULL) { + rc = -EINVAL; + goto err_register; + } + + // Set values (Use reserve only) + client_data = (struct mmrm_client_data){1, MMRM_CLIENT_DATA_FLAG_RESERVE_ONLY}; + for (level = 0; level < MMRM_TEST_VDD_LEVEL_MAX; level++) { + val = p_clk_res->clk_rates[level]; + + rc = test_mmrm_client_set_value(client, &client_data, val); + if (rc != 0) + goto err_setval; + } + + // Get value + rc = test_mmrm_client_get_value(client, &res_val); + if (rc != 0) + goto err_getval; + + err_setval: + err_getval: + + // Reset clk rate + test_mmrm_client_set_value(client, &client_data, 0); + + // Deregister client + rc2 = test_mmrm_client_deregister(client); + if (rc2 != 0) + goto err_deregister; + + err_clk: + err_register: + err_deregister: + + if ((rc == 0) && (rc2 == 0)) + pass_count++; + + if (clk) + clk_put(clk); + } + + pr_info("%s: Finish individual client tests (pass / total): (%d / %d)\n", + __func__, pass_count, count); +} + +#define get_csid_id(n) (37) +#define get_ife0_id(n) (51) +#define get_ife1_id(n) (55) +#define get_ife2_id(n) (59) + +// for camera ife/ipe/bps at nom +// display mdss_mdp/dp_tx0 at nom +// video/cvp at nom +// all camera +cvp at nom +// all camera +cvp + mdss_mdp at nom +// all camera + cvp +mdss_mdp +video at nom +// all camera at nom + mdp/cvp/video svsl1 +// mdp at svsl1 + video at nom : voltage corner scaling + +// mdp at svsl1 + video at svsl1 + cvp at svsl1 + camera at nom + + +// for camera ife/ipe/bps at nom +// +static test_case_info_t test_case_1[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// display mdss_mdp/dptx0 at nom +// +// +// +static test_case_info_t test_case_2[] = { + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"disp_cc_mdss_dptx0_link_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// video/cvp at nom +// +static test_case_info_t test_case_3[] = { + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// all camera +cvp at nom +// +static test_case_info_t test_case_4[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_jpeg_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_icp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cphy_rx_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi2phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi4phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi5phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_cci_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cci_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_slow_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_fast_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + + +// all camera +cvp + mdss_mdp at nom +// +static test_case_info_t test_case_5[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_jpeg_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_icp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cphy_rx_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi2phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi4phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi5phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_cci_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cci_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_slow_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_fast_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// all camera + cvp +mdss_mdp +video at nom +// +static test_case_info_t test_case_6[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_jpeg_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_icp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cphy_rx_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi2phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi4phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi5phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_cci_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cci_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_slow_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_fast_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// all camera at nom + mdp/cvp/video svsl1 +// +static test_case_info_t test_case_7[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_jpeg_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_icp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cphy_rx_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi2phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi4phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi5phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_cci_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cci_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_slow_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_fast_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// mdp at svsl1 + video at nom : voltage corner scaling +// +// +// +static test_case_info_t test_case_8[] = { + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// ife0, ife1 (lowsvs) + ipe (svs) + bps (nom) + mdp (svsl1) + eva (svsl1) + vid (svsl1) +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (lowsvs) + vid (lowsvs) +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (lowsvs) + vid (svs) +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (nom) + vid (lowsvs) +// ife0, ife1, ife2 (svs) + ipe (nom) + bps (nom) + sbi (svs) + mdp (svsl1) + eva (svs) + vid (lowsvs) +// ife0, ife1 (svs) , ife2 (lowsvs) + +// sfe0 (svs) + sfe1(svs) + ipe (nom) + bps (nom) + sbi (svs) + mdp (svsl1) + eva (lowsvs) +// ife0, ife1 (svs) + ipe (nom) + bps (nom) + sbi (svs) + mdp (svsl1) + eva (svs) + vid (svs) +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (lowsvs) + vid (lowsvs) +// ife0, ife1 (lowsvs) + ipe (svs) + bps (nom) + mdp (svsl1) + eva (svsl1) + vid (svsl1) + +static test_case_info_t test_case_11[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (lowsvs) + vid (lowsvs) +static test_case_info_t test_case_12[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (lowsvs) + vid (svs) +static test_case_info_t test_case_13[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + + +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (nom) + vid (lowsvs) +static test_case_info_t test_case_14[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// ife0, ife1, ife2 (svs) + ipe (nom) + bps (nom) + sbi (svs) + mdp (svsl1) + eva (svs) + vid (lowsvs) +static test_case_info_t test_case_15[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// ife0, ife1 (svs) , ife2 (lowsvs) + sfe0 (svs) + sfe1(svs) + ipe (nom) + +// bps (nom) + sbi (svs) + mdp (svsl1) + eva (lowsvs) +static test_case_info_t test_case_16[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// ife0, ife1 (svs) + ipe (nom) + bps (nom) + sbi (svs) + mdp (svsl1) + eva (svs) + vid (svs) +static test_case_info_t test_case_17[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// ife0, ife1 (lowsvs) + ipe (nom) + bps (nom) + sbi (lowsvs) + mdp (svsl1) + eva (lowsvs) + vid (lowsvs) +static test_case_info_t test_case_18[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// throttle display +// vid(nom) + eva (nom) +mdp (nom) + bps(nom) + ipe(nom) +sfe0(nom) + sfe1(nom) +camnoc(nom) + ife0(nom) + csid0(nom)+ ife1(nom) + csid1(nom) + ife2(lowsvs) +// +// +static test_case_info_t test_case_19[] = { + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// throttle video +// vid(nom) + eva (nom) +mdp (nom) + bps(nom) + ipe(nom) +sfe0(nom) + sfe1(nom) +camnoc(nom) + ife0(nom) + csid0(nom)+ ife1(nom) + csid1(nom) + ife2(svs) +// +// +static test_case_info_t test_case_20[] = { + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// throttle ipe +// vid(nom) + eva (nom) +mdp (nom) + bps(nom) + ipe(nom) +sfe0(nom) + sfe1(nom) +camnoc(nom) + ife0(nom) + csid0(nom)+ ife1(nom) + csid1(nom) + ife2(svs) +// +// + +static test_case_info_t test_case_21[] = { + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// Reinstate throttled client. Moved below clients to LOW SVS to make sufficient available power +// for throttled client to reinstate +static test_case_info_t test_case_22[] = { + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// all camera +cam_cc_csid + cvp at nom +// + +static test_case_info_t test_case_9[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 0, 3}, + + {"cam_cc_jpeg_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_icp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cphy_rx_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi2phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi4phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi5phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_cci_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cci_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_slow_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_fast_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +// all camera at nom + cam_cc_csid + mdp/cvp/video svsl1 +// +static test_case_info_t test_case_10[] = { + {"cam_cc_ife_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_2_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_sfe_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ife_lite_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_ipe_nps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_bps_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 0, 3}, + + {"cam_cc_jpeg_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_camnoc_axi_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_icp_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cphy_rx_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_csi0phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi1phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi2phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi3phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi4phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_csi5phytimer_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"cam_cc_cci_0_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_cci_1_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_slow_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + {"cam_cc_fast_ahb_clk_src", MMRM_TEST_VDD_LEVEL_NOM}, + + {"video_cc_mvs1_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"disp_cc_mdss_mdp_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + {"video_cc_mvs0_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +test_case_info_t *waipio_testcases[] = { + test_case_1, + test_case_2, + test_case_3, + test_case_4, + test_case_5, + test_case_6, + test_case_7, + test_case_8, + test_case_9, + test_case_10, + test_case_11, + test_case_12, + test_case_13, + test_case_14, + test_case_15, + test_case_16, + test_case_17, + test_case_18, + test_case_19, + test_case_20, + test_case_21, + test_case_22, +}; + +int waipio_testcases_count = sizeof(waipio_testcases)/sizeof(waipio_testcases[0]); + +static test_case_info_t cornercases_1 [] = { + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 1, 3}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 1, 2}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 1, 1}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 1, 2}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 1, 3}, + + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +static test_case_info_t cornercases_2 [] = { + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS, 1, 3}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_LOW_SVS, 1, 2}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1, 1, 1}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 1, 2}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_NOM, 1, 3}, + {"cam_cc_csid_clk_src", MMRM_TEST_VDD_LEVEL_SVS_L1, 1, 1}, + {"", MMRM_TEST_VDD_LEVEL_MAX} +}; + +test_case_info_t *waipio_cornercase_testcases [] = { + cornercases_1, + cornercases_2, +}; + +int waipio_cornercase_testcases_count = sizeof(waipio_cornercase_testcases)/sizeof(waipio_cornercase_testcases[0]); + +int test_mmrm_testcase_client_register(struct platform_device *pdev, + test_case_info_t *pcase) +{ + struct clk *clk; + int rc = TEST_MMRM_SUCCESS; + // Create client descriptor + struct mmrm_client_desc desc = { + MMRM_CLIENT_CLOCK, // client type + {}, // clock client descriptor + MMRM_CLIENT_PRIOR_HIGH, // client priority + NULL, // pvt_data + test_mmrm_client_callback // callback fn + }; + + desc.client_info.desc.client_domain = pcase->client_domain; + desc.client_info.desc.client_id = pcase->client_id; + strlcpy((char *)(desc.client_info.desc.name), pcase->name, + MMRM_CLK_CLIENT_NAME_SIZE); + + // Get clk + clk = clk_get(&pdev->dev, (const char *)&desc.client_info.desc.name); + if (IS_ERR_OR_NULL(clk)) { + pr_info("%s: domain(%d) client_id(%d) name(%s) Failed clk_get\n", + __func__, desc.client_info.desc.client_domain, + desc.client_info.desc.client_id, desc.client_info.desc.name); + rc = -TEST_MMRM_FAIL_CLKGET; + goto err_clk; + } + desc.client_info.desc.clk = clk; + + // Register client + pcase->client = test_mmrm_client_register(&desc); + +err_clk: + return rc; +} + +int test_mmrm_run_one_case(struct platform_device *pdev, + test_case_info_t *pcase) +{ + struct mmrm_client_data client_data; + unsigned long val; + test_case_info_t *p = pcase; + int rc = TEST_MMRM_SUCCESS; + + client_data = (struct mmrm_client_data){0, MMRM_CLIENT_DATA_FLAG_RESERVE_ONLY}; + + while (p->vdd_level != MMRM_TEST_VDD_LEVEL_MAX) { + val = p->clk_rate[p->vdd_level]; + rc = test_mmrm_testcase_client_register(pdev, p); + if ((rc != TEST_MMRM_SUCCESS) || (IS_ERR_OR_NULL(p->client))) { + pr_info("%s: client(%s) fail register\n", __func__, + p->name); + rc = -TEST_MMRM_FAIL_REGISTER; + break; + } + + if (p->num_hw_blocks == 0) { + client_data.num_hw_blocks = 1; + } else { + client_data.num_hw_blocks = p->num_hw_blocks; + } + + pr_info("%s: domain:%d csid:%d num_hw_block:%d\n", + __func__, + p->client_domain, + p->client_id, + client_data.num_hw_blocks); + + if (test_mmrm_client_set_value(p->client, &client_data, val) != 0) { + rc = -TEST_MMRM_FAIL_SETVALUE; + break; + } + + p++; + } + + p = pcase; + while (p->vdd_level != MMRM_TEST_VDD_LEVEL_MAX) { + if (!IS_ERR_OR_NULL(p->client)) { + test_mmrm_client_set_value(p->client, &client_data, 0); + test_mmrm_client_deregister(p->client); + } + p++; + } + + return rc; +} + +int test_mmrm_populate_testcase(struct platform_device *pdev, + test_case_info_t **pcase, int count) +{ + int i; + test_case_info_t **p = pcase, *ptr; + struct clock_rate *p_clk_rate; + + if (pcase[0]->client_id != 0) + return 0; + + for (i=0; i < count; i++, p++) { + ptr = *p; + while (ptr->vdd_level != MMRM_TEST_VDD_LEVEL_MAX) { + p_clk_rate = find_clk_by_name(ptr->name); + if (p_clk_rate != NULL) { + ptr->client_domain = p_clk_rate->domain; + ptr->client_id = p_clk_rate->id; + memcpy(ptr->clk_rate, p_clk_rate->clk_rates, sizeof(ptr->clk_rate)); + + if (ptr->num_hw_blocks == 0) + ptr->num_hw_blocks = 1; + } + ptr++; + } + } + return i; +} + +void test_mmrm_concurrent_client_cases(struct platform_device *pdev, + test_case_info_t **testcases, int count) +{ + test_case_info_t **p = testcases; + int i; + int size, rc, pass = 0; + int *result_ptr; + + pr_info("%s: Started\n", __func__); + + size = sizeof(int) * count; + + test_mmrm_populate_testcase(pdev, testcases, count); + + result_ptr = kzalloc(size, GFP_KERNEL); + if (IS_ERR_OR_NULL(result_ptr)) { + pr_info("%s: failed to allocate memory for concurrent client test\n", + __func__); + goto err_fail_alloc_result_ptr; + } + + p = testcases; + for (i = 0; i < count; i++, p++) { + pr_info("%s: testcase: %d -----\n", __func__, i); + rc = test_mmrm_run_one_case(pdev, *p); + result_ptr[i] = rc; + if (rc == TEST_MMRM_SUCCESS) + pass++; + } + + pr_info("%s: Finish concurrent client tests (pass / total): (%d / %d)\n", + __func__, pass, count); + + for (i = 0; i < count; i++) { + if (result_ptr[i] != TEST_MMRM_SUCCESS) + pr_info("%s: Failed client test# %d reason %d\n", + __func__, i, result_ptr[i]); + } + kfree(result_ptr); + +err_fail_alloc_result_ptr: + ; + +} + +void test_mmrm_switch_volt_corner_client_testcases(struct platform_device *pdev, + test_case_info_t **testcases, int count) +{ + test_case_info_t **p = testcases; + int i; + int size, rc, pass = 0; + int *result_ptr; + + pr_info("%s: Started\n", __func__); + + size = sizeof(int) * count; + + test_mmrm_populate_testcase(pdev, testcases, count); + + result_ptr = kzalloc(size, GFP_KERNEL); + if (IS_ERR_OR_NULL(result_ptr)) { + pr_info("%s: failed to allocate memory for concurrent client test\n", + __func__); + goto err_fail_alloc_result_ptr; + } + + p = testcases; + for (i = 0; i < count; i++, p++) { + pr_info("%s: switch volt corner testcase: %d -----\n", __func__, i); + rc = test_mmrm_run_one_case(pdev, *p); + result_ptr[i] = rc; + if (rc == TEST_MMRM_SUCCESS) + pass++; + } + + pr_info("%s: Finish switch volt corner client tests (pass / total): (%d / %d)\n", + __func__, pass, count); + + for (i = 0; i < count; i++) { + if (result_ptr[i] != TEST_MMRM_SUCCESS) + pr_info("%s: Failed client test# %d reason %d\n", + __func__, i, result_ptr[i]); + } + kfree(result_ptr); + +err_fail_alloc_result_ptr: + ; + +} + diff --git a/vendor/qcom/opensource/mmrm-driver/test/mmrm_test_internal.h b/vendor/qcom/opensource/mmrm-driver/test/mmrm_test_internal.h new file mode 100644 index 000000000..313b165d9 --- /dev/null +++ b/vendor/qcom/opensource/mmrm-driver/test/mmrm_test_internal.h @@ -0,0 +1,82 @@ +/* + * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef TEST_MMRM_TEST_INTERNAL_H_ +#define TEST_MMRM_TEST_INTERNAL_H_ + +#include +#include + +#define MMRM_TEST_LAHAINA 0 +#define MMRM_TEST_LAHAINA_NUM_CLK_CLIENTS 23 +#define MMRM_TEST_WAIPIO 1 +#define MMRM_TEST_WAIPIO_NUM_CLK_CLIENTS 28 +#define MMRM_TEST_KAILUA 2 +#define MMRM_TEST_KAILUA_NUM_CLK_CLIENTS 32 + +struct mmrm_test_desc { + struct mmrm_test_clk_client *clk_client; + u32 clk_rate_id; +}; + +#define MMRM_SYSFS_ENTRY_MAX_LEN PAGE_SIZE + +enum mmrm_vdd_level { + MMRM_TEST_VDD_LEVEL_LOW_SVS=0, + MMRM_TEST_VDD_LEVEL_SVS, + MMRM_TEST_VDD_LEVEL_SVS_L1, + MMRM_TEST_VDD_LEVEL_NOM, + MMRM_TEST_VDD_LEVEL_TURBO, + MMRM_TEST_VDD_LEVEL_MAX +}; + +struct clock_rate { + const char *name; + u32 domain; + u32 id; + u32 clk_rates[MMRM_TEST_VDD_LEVEL_MAX]; +}; + +extern struct mmrm_test_desc *waipio_all_testcases[]; +extern int waipio_all_testcases_count; + +typedef struct test_case_info_s { + const char name[MMRM_CLK_CLIENT_NAME_SIZE]; + int vdd_level; + u32 flags; + u32 num_hw_blocks; + u32 client_domain; + u32 client_id; + u32 clk_rate[MMRM_TEST_VDD_LEVEL_MAX]; + struct mmrm_client *client; +} test_case_info_t; + +extern test_case_info_t *waipio_testcases[]; +extern int waipio_testcases_count; + +extern test_case_info_t *waipio_cornercase_testcases []; +extern int waipio_cornercase_testcases_count; + +extern struct mmrm_test *all_lahaina_testcases[]; + +void test_mmrm_client(struct platform_device *pdev, int index, int count); +void test_mmrm_single_client_cases(struct platform_device *pdev, + int index, int count); +void test_mmrm_concurrent_client_cases(struct platform_device *pdev, + test_case_info_t **testcases, int count); +struct clock_rate *find_clk_by_name(const char *name); +struct clock_rate *get_nth_clock(int nth); +void test_mmrm_switch_volt_corner_client_testcases(struct platform_device *pdev, + test_case_info_t **testcases, int count); + +#endif // TEST_MMRM_TEST_INTERNAL_H_ diff --git a/vendor/qcom/opensource/video-driver/Makefile b/vendor/qcom/opensource/video-driver/Makefile index 92b3f7f07..640ce5693 100644 --- a/vendor/qcom/opensource/video-driver/Makefile +++ b/vendor/qcom/opensource/video-driver/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only -KBUILD_OPTIONS+= VIDEO_ROOT=$(KERNEL_SRC)/$(M) +VIDEO_ROOT = $(KERNEL_SRC)/$(M) +KBUILD_OPTIONS+= VIDEO_ROOT=$(VIDEO_ROOT) VIDEO_COMPILE_TIME = $(shell date) VIDEO_COMPILE_BY = $(shell whoami | sed 's/\\/\\\\/') diff --git a/vendor/qcom/opensource/wlan/qcacld-3.0/Kbuild b/vendor/qcom/opensource/wlan/qcacld-3.0/Kbuild index 3b9fb83bd..60eb08937 100755 --- a/vendor/qcom/opensource/wlan/qcacld-3.0/Kbuild +++ b/vendor/qcom/opensource/wlan/qcacld-3.0/Kbuild @@ -25,7 +25,7 @@ CONFIG_QCA_CLD_WLAN_PROFILE ?= $(WLAN_PROFILE) DEVNAME ?= wlan WLAN_PLATFORM_INC ?= $(WLAN_ROOT)/../platform/inc -ifeq ($(KERNEL_BUILD), n) +ifeq ($(KERNEL_BUILD), y) ifneq ($(ANDROID_BUILD_TOP),) ANDROID_BUILD_TOP_REL := $(shell python -c "import os.path; print(os.path.relpath('$(ANDROID_BUILD_TOP)'))") override WLAN_ROOT := $(ANDROID_BUILD_TOP_REL)/$(WLAN_ROOT) @@ -3301,6 +3301,7 @@ INCS += $(COAP_WMI_INC) ccflags-y += $(INCS) cppflags-y += -DANI_OS_TYPE_ANDROID=6 \ + -D__ANDROID_COMMON_KERNEL__ \ -Wall\ -Werror\ -D__linux__ diff --git a/vendor/qcom/opensource/wlan/qcacld-3.0/Makefile b/vendor/qcom/opensource/wlan/qcacld-3.0/Makefile index 32910a3ac..97911023f 100644 --- a/vendor/qcom/opensource/wlan/qcacld-3.0/Makefile +++ b/vendor/qcom/opensource/wlan/qcacld-3.0/Makefile @@ -12,23 +12,36 @@ KERNEL_SRC ?= /lib/modules/$(shell uname -r)/build M ?= $(shell pwd) ifeq ($(WLAN_ROOT),) -# WLAN_ROOT must contain an absolute path (i.e. not a relative path) -KBUILD_OPTIONS := WLAN_ROOT=$(shell cd $(KERNEL_SRC); readlink -e $(M)) - -# MODNAME should be qca_cld3_wlan for helium based wear target -ifeq (qca_cld3, $(WLAN_WEAR_CHIPSET)) -KBUILD_OPTIONS += MODNAME?=$(WLAN_WEAR_CHIPSET)_wlan -else -KBUILD_OPTIONS += MODNAME?=wlan +KBUILD_OPTIONS += \ + WLAN_ROOT=$(KERNEL_SRC)/$(M) \ + WLAN_PLATFORM_ROOT=$(KERNEL_SRC)/$(M)/../platform \ + WLAN_COMMON_ROOT=cmn \ + WLAN_COMMON_INC=$(KERNEL_SRC)/$(M)/cmn \ + WLAN_FW_API=$(KERNEL_SRC)/$(M)/../fw-api \ + CONFIG_QCA_CLD_WLAN=m \ + CONFIG_CNSS_OUT_OF_TREE=y \ + CONFIG_CNSS_KIWI_V2=y \ + CONFIG_CNSS2=m \ + CONFIG_CNSS2_QMI=y \ + CONFIG_CNSS_QMI_SVC=m \ + CONFIG_CNSS_PLAT_IPC_QMI_SVC=m \ + CONFIG_CNSS_GENL=m \ + CONFIG_WCNSS_MEM_PRE_ALLOC=m \ + CONFIG_CNSS_UTILS=m \ + CONFIG_CNSS_HW_SECURE_DISABLE=y \ + CONFIG_BUS_AUTO_SUSPEND=y \ + CONFIG_BUILD_TAG=n \ + WLAN_PROFILE=kiwi_v2 \ + DYNAMIC_SINGLE_CHIP=kiwi_v2 \ + MODNAME=qca_cld3_kiwi_v2 \ + DEVNAME=kiwi_v2 \ + BOARD_PLATFORM=kalama \ + WLAN_CTRL_NAME=wlan endif -#By default build for CLD -WLAN_SELECT := CONFIG_QCA_CLD_WLAN=m -KBUILD_OPTIONS += CONFIG_QCA_WIFI_ISOC=0 -KBUILD_OPTIONS += CONFIG_QCA_WIFI_2_0=1 -KBUILD_OPTIONS += $(WLAN_SELECT) +KBUILD_OPTIONS += KBUILD_EXTRA_SYMBOLS=$(M)/../platform/Module.symvers KBUILD_OPTIONS += $(KBUILD_EXTRA) # Extra config if any -endif + all: $(MAKE) -C $(KERNEL_SRC) M=$(M) modules $(KBUILD_OPTIONS)