From eaea4935881e70ac25529ba3168238c62ce386d9 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 15 Dec 2020 15:21:52 +0900 Subject: [PATCH 01/16] pass: resmon: Fix memory leak of udev instance In order to fix the memory leak, call udev_device_unref when error happen. Change-Id: Ic5919eeb07c34e564bf5ad7cf357ff8ae35c2733 Signed-off-by: Chanwoo Choi --- src/pass/pass-resmon.c | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/pass/pass-resmon.c b/src/pass/pass-resmon.c index b81a868..dab9f00 100644 --- a/src/pass/pass-resmon.c +++ b/src/pass/pass-resmon.c @@ -468,13 +468,7 @@ static gboolean resmon_uevent_func(gint fd, GIOCondition cond, void *data) if (!dev) return G_SOURCE_CONTINUE; - dev = udev_device_ref(dev); - if (!dev) { - _E("failed to refer uevent device " \ - "(res_name:%s, src_type: 0x%x)\n", - res->config_data.res_name, monitor->src_type); - return G_SOURCE_CONTINUE; - } + udev_device_ref(dev); /* Collect resource data according to enum resmon_src_type */ if (monitor->ops && monitor->ops->uevent_handler) { @@ -483,7 +477,7 @@ static gboolean resmon_uevent_func(gint fd, GIOCondition cond, void *data) _E("failed to invoke uevent_handler " \ "(res_name:%s, src_type: 0x%x)\n", res->config_data.res_name, monitor->src_type); - return G_SOURCE_CONTINUE; + goto out; } } @@ -494,10 +488,11 @@ static gboolean resmon_uevent_func(gint fd, GIOCondition cond, void *data) _E("failed to invoke user_func " \ "(res_name:%s, src_type: 0x%x)\n", res->config_data.res_name, monitor->src_type); - return G_SOURCE_CONTINUE; + goto out; } } +out: udev_device_unref(dev); return G_SOURCE_CONTINUE; -- 2.7.4 From 5c6f41ca4f0072f0349edadce148241ff636039d Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 22 Dec 2020 16:09:00 +0900 Subject: [PATCH 02/16] pass: resmon: Fix memory leak of udev_monitor instance In order to fix the memory leak, jump exception handling code when error happen. Change-Id: I0b288b602d61cab6ebdce3c5e53ff808e0b2d001 Signed-off-by: Chanwoo Choi --- src/pass/pass-resmon.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pass/pass-resmon.c b/src/pass/pass-resmon.c index dab9f00..faf7fc7 100644 --- a/src/pass/pass-resmon.c +++ b/src/pass/pass-resmon.c @@ -531,7 +531,8 @@ static int resmon_uevent_add(struct resmon *monitor) _E("failed to add filter due to subsystem/devtype are NULL " \ "(res_name:%s, src_type: 0x%x)\n", res->config_data.res_name, monitor->src_type); - return -EINVAL; + ret = -EINVAL; + goto err_udev_monitor; } /* Update the kernel's subsystem and devtype for filtering */ -- 2.7.4 From 469051e30f8207d2067b8354de3bb226cd62dc4e Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Wed, 6 Jan 2021 13:55:33 +0900 Subject: [PATCH 03/16] pass: hal: Replace HAL interface with hal-api-power Tizen 6.5 provides new HAL API layer to make tizen porting easy. Power HAL API (hal-api-power) provides HAL C API for controlling the h/w resources such as CPU/GPU/Memory Bus/Memory devices and provides HAL interface for HAL backend developer for using Tizen platform on new h/w device. PASS daemon just calls the Power HAL API without handling the HAL backend anymore. Describe the detailed changes as following: 1. Remove self-defined HAL functions and don't open HAL backend library directly. Instead, use hal-api-power to control the h/w resources. PASS deamon doesn't need to handle the HAL backend library anymore. 2. Remove pass-hal-devel package because of moving HAL interface defintion (src/hal/hal.h) into hal-api-power (hal-power-interface.h). 3. Change the open path of pass configuration files. - /etc/pass/ -> /hal/etc/pass/ Change-Id: I73a1c29c7af000335021faac62157b5342065682 Signed-off-by: Chanwoo Choi --- CMakeLists.txt | 11 +- include/pass/hal/hal.h | 245 --------------- packaging/pass.spec | 21 +- src/hal/CMakeLists.txt | 15 - src/hal/hal-log.h | 29 -- src/hal/hal.c | 92 ------ src/pass/pass-hal.c | 502 +++++------------------------- src/pass/pass-hal.h | 4 +- src/pass/pass-parser.c | 2 +- src/pass/pass-resmon.c | 2 +- src/pass/pass-thermal.c | 2 +- src/pass/pass.c | 2 +- systemd/{pass.service => pass.service.in} | 1 + unittest/CMakeLists.txt | 14 +- unittest/pass_haltests.cpp | 2 +- 15 files changed, 106 insertions(+), 838 deletions(-) delete mode 100644 include/pass/hal/hal.h delete mode 100755 src/hal/CMakeLists.txt delete mode 100644 src/hal/hal-log.h delete mode 100644 src/hal/hal.c rename systemd/{pass.service => pass.service.in} (84%) diff --git a/CMakeLists.txt b/CMakeLists.txt index a069f15..d8f2591 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,6 @@ PROJECT(pass C) SET(EXEC_PREFIX "${CMAKE_INSTALL_PREFIX}/bin") SET(INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}") SET(VERSION 0.1.0) -SET(PASS_HAL_NAME pass-hal-devel) SET(SRCS src/pass/pass.c @@ -25,7 +24,6 @@ SET(SRCS src/pmqos/pmqos-parser.c src/thermal/thermal.c src/thermal/thermal-parser.c - src/hal/hal.c src/core/common.c src/core/config-parser.c src/core/device-notifier.c @@ -52,6 +50,8 @@ SET(PKG_MODULES gio-unix-2.0 libudev libsystemd + hal-api-common + hal-api-power ) INCLUDE(FindPkgConfig) @@ -65,6 +65,7 @@ SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -fvisibility=hidden -fPIE") SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} -g -fno-omit-frame-pointer -finstrument-functions") SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS} -lrt") SET(CMAKE_EXE_LINKER_FLAGS "-pie") +SET(LIBDIR ${CMAKE_LIBDIR_PREFIX}) ADD_DEFINITIONS("-DLOG_TAG=\"PASS\"") ADD_DEFINITIONS("-DPREFIX=\"${CMAKE_INSTALL_PREFIX}\"") @@ -94,23 +95,21 @@ ADD_CUSTOM_COMMAND( COMMENT "Generating GDBus stub for thermal interface") ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) -TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} "-ldl" "-lm") +TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl -lm) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/${PROJECT_NAME}.conf DESTINATION /etc/dbus-1/system.d) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-pmqos.conf DESTINATION /etc/pass) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-thermal.conf DESTINATION /etc/pass) +CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/systemd/${PROJECT_NAME}.service.in ${CMAKE_SOURCE_DIR}/systemd/${PROJECT_NAME}.service @ONLY) INSTALL(FILES ${CMAKE_SOURCE_DIR}/systemd/org.tizen.system.pass.service DESTINATION /usr/share/dbus-1/system-services) INSTALL(FILES ${CMAKE_SOURCE_DIR}/systemd/org.tizen.system.thermal.service DESTINATION /usr/share/dbus-1/system-services) CONFIGURE_FILE(${PROJECT_NAME}.pc.in ${PROJECT_NAME}.pc @ONLY) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) -CONFIGURE_FILE(${PASS_HAL_NAME}.pc.in ${PASS_HAL_NAME}.pc @ONLY) -INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PASS_HAL_NAME}.pc DESTINATION ${LIB_INSTALL_DIR}/pkgconfig) INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/systemd/ DESTINATION lib/systemd/system FILES_MATCHING PATTERN "*.service" ) -ADD_SUBDIRECTORY(src/hal) ADD_SUBDIRECTORY(unittest) diff --git a/include/pass/hal/hal.h b/include/pass/hal/hal.h deleted file mode 100644 index 3e41493..0000000 --- a/include/pass/hal/hal.h +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _PASS_HAL_H_ -#define _PASS_HAL_H_ - -#include -#include -#include - -#define BUFF_MAX 255 - -#define MAKE_4B_CODE_4(A, B, C, D) \ - ((((A) & 0xff) << 24) | (((B) & 0xff) << 16) | \ - (((C) & 0xff) << 8) | (((D) & 0xff))) -#define MAKE_TAG_CONSTANT(A, B, C, D) MAKE_4B_CODE_4(A, B, C, D) - -#define HAL_INFO_TAG MAKE_TAG_CONSTANT('P', 'A', 'S', 'S') - -/* Symbolic name of the HAL info (PASS HAL Info) */ -#define HAL_INFO_SYM PassHalInfo - -#define PASS_RESOURCE_UNKNOWN 0 -#define PASS_RESOURCE_CPU_ID 1 -#define PASS_RESOURCE_BUS_ID 2 -#define PASS_RESOURCE_GPU_ID 3 -#define PASS_RESOURCE_MEMORY_ID 4 -#define PASS_RESOURCE_NONSTANDARD_ID 99 - -#define PASS_RESOURCE_CPU_NAME "cpu" -#define PASS_RESOURCE_BUS_NAME "bus" -#define PASS_RESOURCE_GPU_NAME "gpu" -#define PASS_RESOURCE_MEMORY_NAME "memory" -#define PASS_RESOURCE_NONSTANDARD_NAME "nonstandard" - -/** - * Define the common structure - */ - -struct pass_resource_common; - -/* - * pass_resource_info - Define the information structure for the resource. - * - * @magic : magic must be initialized to HAL_INFO_TAG - * @hal_version : HAL version - * @device_version: device version - * @id : device id, can have the following value. - * - PASS_RESOURCE_CPU_ID - * - PASS_RESOURCE_BUS_ID - * - PASS_RESOURCE_GPU_ID - * - PASS_RESOURCE_MEMORY_ID - * - PASS_RESOURCE_NONSTANDARD_ID - * @name : device name, can have the following value. - * - PASS_RESOURCE_CPU_NAME - * - PASS_RESOURCE_BUS_NAME - * - PASS_RESOURCE_GPU_NAME - * - PASS_RESOURCE_MEMORY_NAME - * - PASS_RESOURCE_NONSTANDARD_NAME - * @dso : module's dso - * @resourced[] : reserved for future use - * @open : function pointer to open device - * @close : function pointer to close device - */ -struct pass_resource_info { - uint32_t magic; - uint16_t hal_version; - uint16_t device_version; - const int id; - const char *name; - void *dso; - uint32_t reserved[8]; - - int (*open)(char *res_name, struct pass_resource_info *info, - struct pass_resource_common **common); - int (*close)(char *res_name, struct pass_resource_common *common); -}; - -struct pass_resource_common { - /* indicate to this device information structure */ - struct pass_resource_info *info; -}; - -/* - * Define the ops (operations) structure which are used on specific resource. - */ -struct pass_resource_dvfs_ops { - /* Get and set the current governor. */ - int (*get_curr_governor)(char *res_name, char *governor); - int (*set_curr_governor)(char *res_name, char *governor); - - int (*get_avail_governor)(char *res_name, char **avail_governor); - - /* Get the current frequency. */ - int (*get_curr_freq)(char *res_name); - - /* Get and set the minimum frequency. */ - int (*get_min_freq)(char *res_name); - int (*set_min_freq)(char *res_name, int freq); - - /* Get and set the maximum frequency. */ - int (*get_max_freq)(char *res_name); - int (*set_max_freq)(char *res_name, int freq); - - /* Get the minimum/maximum frequency which can be set to resource. */ - int (*get_available_min_freq)(char *res_name); - int (*get_available_max_freq)(char *res_name); - - /* Get and set the up_threshold to support boosting. */ - int (*get_up_threshold)(char *res_name); - int (*set_up_threshold)(char *res_name, int up_threshold); - - /* Get the load_table of each resource to estimate the system load. */ - int (*get_load_table)(char *name, void *pass_cpu_load_table); -}; - -struct pass_resource_hotplug_ops { - /* Get and set the online status of resource. */ - int (*get_online_state)(char *res_name, int cpu); - int (*set_online_state)(char *res_name, int cpu, int on); - /* Get and set the minimum number of online CPUs */ - int (*get_online_min_num) (char *res_name); - int (*set_online_min_num) (char *res_name, int min_num); - /* Get and set the maximum number of online CPUs */ - int (*get_online_max_num) (char *res_name); - int (*set_online_max_num) (char *res_name, int max_num); -}; - -struct pass_resource_tmu_ops { - /* Get the current temperature of resource. */ - int (*get_temp)(char *res_thermal_name); - - /* Get the policy of thermal management unit. */ - int (*get_policy)(char *res_thermal_name, char *policy); -}; - -/* - * Define the resource structure for CPU H/W. - * - * @common : common resource structure. - * @dvfs : function lists for the DVFS (Dynamic Volt. & Freq. Scaling). - * @tmu : function lists for the TMU (Thermal Management Unit). - * @hotplug : function lists for the CPU on/off. - */ -struct pass_resource_cpu { - struct pass_resource_common common; - - struct pass_resource_dvfs_ops dvfs; - struct pass_resource_tmu_ops tmu; - struct pass_resource_hotplug_ops hotplug; -}; - -/* - * Define the resource structure for Memory Bus H/W. - * - * @common : common resource structure. - * @dvfs : function lists for the DVFS (Dynamic Volt. & Freq. Scaling). - * @tmu : function lists for the TMU (Thermal Management Unit). - */ -struct pass_resource_bus { - struct pass_resource_common common; - - struct pass_resource_dvfs_ops dvfs; - struct pass_resource_tmu_ops tmu; -}; - -/* - * Define the resource structure for GPU H/W. - * - * @common : common resource structure. - * @dvfs : function lists for the DVFS (Dynamic Volt. & Freq. Scaling). - * @tmu : function lists for the TMU (Thermal Management Unit). - */ -struct pass_resource_gpu { - struct pass_resource_common common; - - struct pass_resource_dvfs_ops dvfs; - struct pass_resource_tmu_ops tmu; -}; - -/* - * Define the resource structure for Memory H/W. - * - * @common : common resource structure. - */ -struct pass_resource_memory { - struct pass_resource_common common; - - /* Get and set the /sys/kernel/debug/fault_around_bytes */ - int (*get_fault_around_bytes)(char *res_name); - int (*set_fault_around_bytes)(char *res_name, int fault_around_bytes); -}; - -/* - * Define the resource structure for nonstandard H/W. - * - * Following function is Deprecated. (Not recommended for use) - * @set_pmqos_data : function to bypass the scenario data to HAL. - * - * This structure indicates the nonstandard H/W which doesn't have - * the official supported framework (e.g., cpufreq, devfreq and so on) - * in Linux Kernel. But, the specific device might be controlled - * according to PMQoS scenario or other cases. - */ -struct pass_resource_nonstandard { - struct pass_resource_common common; - - /* - * NOTE: It is not propper method. But PASS must need to keep - * the backwards compatibility, set the PMQoS's data from - * platform to hal. So, It is not recommended to use it. - * - * This function will be removed after finding the proper method. - */ - int (*set_pmqos_data)(char *res_name, void *data); -}; - -int pass_get_hal_info(const char *id, const struct pass_resource_info **info); - -/** - * Structure define of HAL info module - * - * All HAL module should be use below define to make a specific - * structure for Tizen HAL. pass_get_resource_info function - * will load a pass_resource_data structure by using TizenHwInfo name - * at runtime. TizenHwInfo means Tizen Hardware Info. - */ -#define HAL_MODULE_STRUCTURE \ - __attribute__ ((visibility("default"))) \ - struct pass_resource_info HAL_INFO_SYM - -#endif /* _PASS_HAL_H_ */ diff --git a/packaging/pass.spec b/packaging/pass.spec index 89d837b..9e16a7a 100644 --- a/packaging/pass.spec +++ b/packaging/pass.spec @@ -1,7 +1,6 @@ %define _unpackaged_files_terminate_build 0 %define daemon_name pass -%define hal_name pass-hal-devel %define haltest_name pass-haltests %define unittest_name pass-unittest @@ -13,7 +12,6 @@ Group: System/Kernel License: Apache-2.0 Source0: %{name}-%{version}.tar.gz Source1: %{name}.manifest -Source2: %{hal_name}.manifest BuildRequires: cmake BuildRequires: pkgconfig(dlog) @@ -24,6 +22,8 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gmock) BuildRequires: pkgconfig(libudev) BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(hal-api-common) +BuildRequires: pkgconfig(hal-api-power) %description PASS (Power-Aware System Service) @@ -35,14 +35,6 @@ Group: main %description %{daemon_name} PASS systemd daemon. -%package -n %{hal_name} -Summary: PASS HAL Header files -Group: Development/Library -Requires: pass = %{version}-%{release} - -%description -n %{hal_name} -Header files required to build pass-hal packages for specific boards. - %package -n %{haltest_name} Summary: PASS HAL test package with gtest Group: Development/Tools @@ -65,11 +57,11 @@ PASS unit test package with gtest %cmake . \ -DTZ_SYS_ETC=%TZ_SYS_ETC \ -DCMAKE_INSTALL_PREFIX=%{_prefix} \ + -DCMAKE_LIBDIR_PREFIX=%{_libdir} \ #eol %build cp %{SOURCE1} . -cp %{SOURCE2} . make %{?jobs:-j%jobs} %install @@ -106,13 +98,6 @@ systemctl daemon-reload %{_datadir}/dbus-1/system-services/org.tizen.system.pass.service %{_datadir}/dbus-1/system-services/org.tizen.system.thermal.service -%files -n %{hal_name} -%defattr(-,root,root,-) -%manifest %{hal_name}.manifest -%{_includedir}/%{daemon_name}/hal.h -%{_includedir}/%{daemon_name}/hal-log.h -%{_libdir}/pkgconfig/%{hal_name}.pc - %files -n %{haltest_name} %defattr(-,root,root,-) %{_bindir}/pass_haltests diff --git a/src/hal/CMakeLists.txt b/src/hal/CMakeLists.txt deleted file mode 100755 index c0f1fbc..0000000 --- a/src/hal/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) -PROJECT(pass-hal-devel C) - -SET(HAL_HEADERS - ../../include/pass/hal/hal.h - hal-log.h -) - -INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs REQUIRED - dlog) - -FOREACH(hheader ${HAL_HEADERS}) - INSTALL(FILES ${hheader} DESTINATION ${INCLUDEDIR}) -ENDFOREACH(hheader) diff --git a/src/hal/hal-log.h b/src/hal/hal-log.h deleted file mode 100644 index 4b43f61..0000000 --- a/src/hal/hal-log.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * PASS (Power Aware System Service) - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __HAL_LOG_H__ -#define __HAL_LOG_H__ - -#include - -#define _D(fmt, arg...) do { SLOGD(fmt, ##arg); } while (0) -#define _I(fmt, arg...) do { SLOGI(fmt, ##arg); } while (0) -#define _W(fmt, arg...) do { SLOGW(fmt, ##arg); } while (0) -#define _E(fmt, arg...) do { SLOGE(fmt, ##arg); } while (0) - -#endif /* __HAL_LOG_H__ */ diff --git a/src/hal/hal.c b/src/hal/hal.c deleted file mode 100644 index 0b2cffa..0000000 --- a/src/hal/hal.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * PASS (Power Aware System Service) HAL - * - * Copyright (c) 2017 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the License); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @file hal.c - * @brief Provide a helper function to load shared library, like cpu.so - * /gpu.so/bus.so etc, from HAL (Hardware Abstract Layer) - * package according to the type of h/w resource. - * @ingroup COM_POWER_MGNT - */ - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "hal-log.h" - -#ifndef EXPORT -#define EXPORT __attribute__ ((visibility("default"))) -#endif - -#ifndef LIBPATH -#error LIBPATH is not defined. -#endif - -#define MODULE_PATH LIBPATH"/pass" - -#define STRINGIZE2(s) #s -#define STRINGIZE(s) STRINGIZE2(s) - -EXPORT -int pass_get_hal_info(const char *name, const struct pass_resource_info **info) -{ - char path[PATH_MAX]; - void *handle; - struct pass_resource_info *it; - - if (!info || !name) - return -EINVAL; - - /* Load module */ - snprintf(path, sizeof(path), "%s/%s.so", MODULE_PATH, name); - handle = dlopen(path, RTLD_NOW); - if (!handle) { - _E("fail to open module : %s", dlerror()); - goto error; - } - - it = dlsym(handle, STRINGIZE(HAL_INFO_SYM)); - if (!it) { - _E("fail to find symbol : %s", dlerror()); - goto error; - } - - /* Check id */ - if (strncmp(name, it->name, strlen(name)) != 0) { - _E("fail to match name : name(%s), it->name(%s)", name, - it->name); - goto error; - } - - it->dso = handle; - *info = it; - return 0; - -error: - if (handle) - dlclose(handle); - - return -ENOENT; -} diff --git a/src/pass/pass-hal.c b/src/pass/pass-hal.c index 0ba680f..f2229f7 100644 --- a/src/pass/pass-hal.c +++ b/src/pass/pass-hal.c @@ -38,64 +38,6 @@ #include "pass.h" #include "pass-hal.h" -static struct pass_resource_dvfs_ops *get_dvfs(struct pass_resource *res, - int res_type) -{ - struct pass_resource_dvfs_ops *dvfs = NULL; - - switch (res_type) { - case PASS_RESOURCE_CPU_ID: - dvfs = &(res->hal.cpu->dvfs); - break; - case PASS_RESOURCE_BUS_ID: - dvfs = &(res->hal.bus->dvfs); - break; - case PASS_RESOURCE_GPU_ID: - dvfs = &(res->hal.gpu->dvfs); - break; - } - - return dvfs; -} - -static struct pass_resource_tmu_ops *get_tmu(struct pass_resource *res, - int res_type) -{ - struct pass_resource_tmu_ops *tmu = NULL; - - switch (res_type) { - case PASS_RESOURCE_CPU_ID: - tmu = &(res->hal.cpu->tmu); - break; - case PASS_RESOURCE_BUS_ID: - tmu = &(res->hal.bus->tmu); - break; - case PASS_RESOURCE_GPU_ID: - tmu = &(res->hal.gpu->tmu); - break; - } - - return tmu; -} - -static struct pass_resource_hotplug_ops *get_hotplug(struct pass_resource *res, - int res_type) -{ - struct pass_resource_hotplug_ops *hotplug = NULL; - - switch (res_type) { - case PASS_RESOURCE_CPU_ID: - hotplug = &(res->hal.cpu->hotplug); - break; - case PASS_RESOURCE_BUS_ID: - case PASS_RESOURCE_GPU_ID: - hotplug = NULL; - break; - } - - return hotplug; -} - /** * @brief Get the current governor for DVFS(Dynamic Voltage and Frequency * Scaling) resource @@ -104,23 +46,16 @@ static struct pass_resource_hotplug_ops *get_hotplug(struct pass_resource *res, * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_curr_governor(struct pass_resource *res, char *governor) { - struct pass_resource_dvfs_ops *dvfs; - if (!res || !governor) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->get_curr_governor) - return -ENODEV; - - return dvfs->get_curr_governor(res->config_data.res_name, governor); + return hal_power_dvfs_get_curr_governor(res->config_data.res_type, + res->config_data.res_name, + governor); } /** @@ -131,23 +66,16 @@ int pass_hal_get_curr_governor(struct pass_resource *res, char *governor) * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_curr_governor(struct pass_resource *res, char *governor) { - struct pass_resource_dvfs_ops *dvfs; - if (!res || !governor) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->set_curr_governor) - return -ENODEV; - - return dvfs->set_curr_governor(res->config_data.res_name, governor); + return hal_power_dvfs_set_curr_governor(res->config_data.res_type, + res->config_data.res_name, + governor); } /** @@ -157,23 +85,15 @@ int pass_hal_set_curr_governor(struct pass_resource *res, char *governor) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_curr_freq(struct pass_resource *res) { - struct pass_resource_dvfs_ops *dvfs; - if (!res) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->get_curr_freq) - return -ENODEV; - - return dvfs->get_curr_freq(res->config_data.res_name); + return hal_power_dvfs_get_curr_freq(res->config_data.res_type, + res->config_data.res_name); } /** @@ -183,23 +103,15 @@ int pass_hal_get_curr_freq(struct pass_resource *res) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_min_freq(struct pass_resource *res) { - struct pass_resource_dvfs_ops *dvfs; - if (!res) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->get_min_freq) - return -ENODEV; - - return dvfs->get_min_freq(res->config_data.res_name); + return hal_power_dvfs_get_min_freq(res->config_data.res_type, + res->config_data.res_name); } /** @@ -210,23 +122,16 @@ int pass_hal_get_min_freq(struct pass_resource *res) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_min_freq(struct pass_resource *res, int freq) { - struct pass_resource_dvfs_ops *dvfs; - if (!res || freq < 0) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->set_min_freq) - return -ENODEV; - - return dvfs->set_min_freq(res->config_data.res_name, freq); + return hal_power_dvfs_set_min_freq(res->config_data.res_type, + res->config_data.res_name, + freq); } /** @@ -236,23 +141,15 @@ int pass_hal_set_min_freq(struct pass_resource *res, int freq) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_max_freq(struct pass_resource *res) { - struct pass_resource_dvfs_ops *dvfs; - if (!res) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->get_max_freq) - return -ENODEV; - - return dvfs->get_max_freq(res->config_data.res_name); + return hal_power_dvfs_get_max_freq(res->config_data.res_type, + res->config_data.res_name); } /** @@ -263,23 +160,16 @@ int pass_hal_get_max_freq(struct pass_resource *res) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_max_freq(struct pass_resource *res, int freq) { - struct pass_resource_dvfs_ops *dvfs; - if (!res || freq < 0) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->set_max_freq) - return -ENODEV; - - return dvfs->set_max_freq(res->config_data.res_name, freq); + return hal_power_dvfs_set_max_freq(res->config_data.res_type, + res->config_data.res_name, + freq); } /** @@ -289,23 +179,15 @@ int pass_hal_set_max_freq(struct pass_resource *res, int freq) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_available_min_freq(struct pass_resource *res) { - struct pass_resource_dvfs_ops *dvfs; - if (!res) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->get_available_min_freq) - return -ENODEV; - - return dvfs->get_available_min_freq(res->config_data.res_name); + return hal_power_dvfs_get_available_min_freq(res->config_data.res_type, + res->config_data.res_name); } /** @@ -315,23 +197,15 @@ int pass_hal_get_available_min_freq(struct pass_resource *res) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_available_max_freq(struct pass_resource *res) { - struct pass_resource_dvfs_ops *dvfs; - if (!res) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->get_available_max_freq) - return -ENODEV; - - return dvfs->get_available_max_freq(res->config_data.res_name); + return hal_power_dvfs_get_available_max_freq(res->config_data.res_type, + res->config_data.res_name); } /** @@ -341,23 +215,15 @@ int pass_hal_get_available_max_freq(struct pass_resource *res) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_up_threshold(struct pass_resource *res) { - struct pass_resource_dvfs_ops *dvfs; - if (!res) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->get_up_threshold) - return -ENODEV; - - return dvfs->get_up_threshold(res->config_data.res_name); + return hal_power_dvfs_get_up_threshold(res->config_data.res_type, + res->config_data.res_name); } /** @@ -368,23 +234,16 @@ int pass_hal_get_up_threshold(struct pass_resource *res) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_up_threshold(struct pass_resource *res, int up_threshold) { - struct pass_resource_dvfs_ops *dvfs; - if (!res || up_threshold < 0) return -EINVAL; - dvfs = get_dvfs(res, res->config_data.res_type); - if (!dvfs) - return -EPERM; - - if (!dvfs->set_up_threshold) - return -ENODEV; - - return dvfs->set_up_threshold(res->config_data.res_name, up_threshold); + return hal_power_dvfs_set_up_threshold(res->config_data.res_type, + res->config_data.res_name, + up_threshold); } /** @@ -394,23 +253,16 @@ int pass_hal_set_up_threshold(struct pass_resource *res, int up_threshold) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_online_state(struct pass_resource *res, int cpu) { - struct pass_resource_hotplug_ops *hotplug; - if (!res || cpu < 0) return -EINVAL; - hotplug = get_hotplug(res, res->config_data.res_type); - if (!hotplug) - return -EPERM; - - if (!hotplug->get_online_state) - return -ENODEV; - - return hotplug->get_online_state(res->config_data.res_name, cpu); + return hal_power_hotplug_get_online_state(res->config_data.res_type, + res->config_data.res_name, + cpu); } /** @@ -421,23 +273,16 @@ int pass_hal_get_online_state(struct pass_resource *res, int cpu) * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_online_state(struct pass_resource *res, int cpu, int on) { - struct pass_resource_hotplug_ops *hotplug; - if (!res || cpu < 0 || on < 0) return -EINVAL; - hotplug = get_hotplug(res, res->config_data.res_type); - if (!hotplug) - return -EPERM; - - if (!hotplug->set_online_state) - return -ENODEV; - - return hotplug->set_online_state(res->config_data.res_name, cpu, on); + return hal_power_hotplug_set_online_state(res->config_data.res_type, + res->config_data.res_name, + cpu, on); } /** @@ -446,23 +291,15 @@ int pass_hal_set_online_state(struct pass_resource *res, int cpu, int on) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_online_min_num(struct pass_resource *res) { - struct pass_resource_hotplug_ops *hotplug; - if (!res) return -EINVAL; - hotplug = get_hotplug(res, res->config_data.res_type); - if (!hotplug) - return -EPERM; - - if (!hotplug->get_online_min_num) - return -ENODEV; - - return hotplug->get_online_min_num(res->config_data.res_name); + return hal_power_hotplug_get_online_min_num(res->config_data.res_type, + res->config_data.res_name); } /** @@ -472,23 +309,16 @@ int pass_hal_get_online_min_num(struct pass_resource *res) * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_online_min_num(struct pass_resource *res, int num) { - struct pass_resource_hotplug_ops *hotplug; - if ((!res) || (num < 0)) return -EINVAL; - hotplug = get_hotplug(res, res->config_data.res_type); - if (!hotplug) - return -EPERM; - - if (!hotplug->set_online_min_num) - return -ENODEV; - - return hotplug->set_online_min_num(res->config_data.res_name, num); + return hal_power_hotplug_set_online_min_num(res->config_data.res_type, + res->config_data.res_name, + num); } /** @@ -497,23 +327,15 @@ int pass_hal_set_online_min_num(struct pass_resource *res, int num) * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_online_max_num(struct pass_resource *res) { - struct pass_resource_hotplug_ops *hotplug; - if (!res) return -EINVAL; - hotplug = get_hotplug(res, res->config_data.res_type); - if (!hotplug) - return -EPERM; - - if (!hotplug->get_online_max_num) - return -ENODEV; - - return hotplug->get_online_max_num(res->config_data.res_name); + return hal_power_hotplug_get_online_max_num(res->config_data.res_type, + res->config_data.res_name); } /** @@ -523,23 +345,16 @@ int pass_hal_get_online_max_num(struct pass_resource *res) * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_online_max_num(struct pass_resource *res, int num) { - struct pass_resource_hotplug_ops *hotplug; - if ((!res) || (num < 0)) return -EINVAL; - hotplug = get_hotplug(res, res->config_data.res_type); - if (!hotplug) - return -EPERM; - - if (!hotplug->set_online_max_num) - return -ENODEV; - - return hotplug->set_online_max_num(res->config_data.res_name, num); + return hal_power_hotplug_set_online_max_num(res->config_data.res_type, + res->config_data.res_name, + num); } /** @@ -548,27 +363,19 @@ int pass_hal_set_online_max_num(struct pass_resource *res, int num) * @return @c integer (both positive and negative are possible) on success * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_temp(struct pass_resource *res) { - struct pass_resource_tmu_ops *tmu; - if (!res) return -EINVAL; - tmu = get_tmu(res, res->config_data.res_type); - if (!tmu) - return -EPERM; - - if (!tmu->get_temp) - return -ENODEV; - /* * In the case of the HAL TMU ops, res_thermal_name is used * as the first argument instead of res_name. */ - return tmu->get_temp(res->config_data.res_thermal_name); + return hal_power_thermal_get_temp(res->config_data.res_type, + res->config_data.res_thermal_name); } /** @@ -578,27 +385,20 @@ int pass_hal_get_temp(struct pass_resource *res) * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_tmu_policy(struct pass_resource *res, char *policy) { - struct pass_resource_tmu_ops *tmu; - if (!res || !policy) return -EINVAL; - tmu = get_tmu(res, res->config_data.res_type); - if (!tmu) - return -EPERM; - - if (!tmu->get_policy) - return -ENODEV; - /* * In the case of the HAL TMU ops, res_thermal_name is used * as the first argument instead of res_name. */ - return tmu->get_policy(res->config_data.res_thermal_name, policy); + return hal_power_thermal_get_policy(res->config_data.res_type, + res->config_data.res_thermal_name, + policy); } /** @@ -609,28 +409,17 @@ int pass_hal_get_tmu_policy(struct pass_resource *res, char *policy) * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_fault_around_bytes(struct pass_resource *res, int fault_around_bytes) { - struct pass_resource_memory *memory; - if (!res) return -EINVAL; - switch (res->config_data.res_type) { - case PASS_RESOURCE_MEMORY_ID: - memory = res->hal.memory; - break; - default: - return -EPERM; - } - - if (!memory->set_fault_around_bytes) - return -ENODEV; - - return memory->set_fault_around_bytes(res->config_data.res_name, fault_around_bytes); + return hal_power_memory_set_fault_around_bytes(res->config_data.res_type, + res->config_data.res_name, + fault_around_bytes); } /** @@ -639,27 +428,15 @@ int pass_hal_set_fault_around_bytes(struct pass_resource *res, * @return @c positive integer on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_get_fault_around_bytes(struct pass_resource *res) { - struct pass_resource_memory *memory; - if (!res) return -EINVAL; - switch (res->config_data.res_type) { - case PASS_RESOURCE_MEMORY_ID: - memory = res->hal.memory; - break; - default: - return -EPERM; - } - - if (!memory->get_fault_around_bytes) - return -ENODEV; - - return memory->get_fault_around_bytes(res->config_data.res_name); + return hal_power_memory_get_fault_around_bytes(res->config_data.res_type, + res->config_data.res_name); } /** @@ -668,27 +445,15 @@ int pass_hal_get_fault_around_bytes(struct pass_resource *res) * @return @c 0 on success, otherwise error value * @retval -22 Invalid argument (-EINVAL) * @retval -1 Operation not permitted (-EPERM) - * @retval -19 Operation not supported (-ENODEV) + * @retval -19 Operation not supported (-ENOTSUP) */ int pass_hal_set_pmqos_data(struct pass_resource *res, void *data) { - struct pass_resource_nonstandard *nonstandard = NULL; - if (!res || !data) return -EINVAL; - switch (res->config_data.res_type) { - case PASS_RESOURCE_NONSTANDARD_ID: - nonstandard = (res->hal.nonstandard); - break; - default: - return -EPERM; - } - - if (!nonstandard->set_pmqos_data) - return -ENODEV; - - return nonstandard->set_pmqos_data(res->config_data.res_name, data); + return hal_power_misc_set_pmqos_data(res->config_data.res_type, + res->config_data.res_name, data); } /** @@ -990,79 +755,10 @@ int pass_hal_restore_initdata(struct pass_resource *res) */ int pass_hal_get_resource(struct pass_resource *res) { - struct pass_resource_info *info; - const char *name; - int ret; - if (!res) return -EINVAL; - switch (res->config_data.res_type) { - case PASS_RESOURCE_CPU_ID: - name = PASS_RESOURCE_CPU_NAME; - break; - case PASS_RESOURCE_BUS_ID: - name = PASS_RESOURCE_BUS_NAME; - break; - case PASS_RESOURCE_GPU_ID: - name = PASS_RESOURCE_GPU_NAME; - break; - case PASS_RESOURCE_MEMORY_ID: - name = PASS_RESOURCE_MEMORY_NAME; - break; - case PASS_RESOURCE_NONSTANDARD_ID: - name = PASS_RESOURCE_NONSTANDARD_NAME; - break; - default: - _E("Unsupported resource type (type: %d)\n", - res->config_data.res_type); - return -EINVAL; - }; - - ret = pass_get_hal_info(name, - (const struct pass_resource_info **)&info); - if (ret < 0) { - _E("Failed to get %s.so for '%s' resource\n", - name, res->config_data.res_name); - return -EINVAL; - } - - if (!info->open || !info->close) { - _E("Failed to get functions of %s.so for '%s' resource\n", - name, res->config_data.res_name); - return -EPERM; - } - - switch (res->config_data.res_type) { - case PASS_RESOURCE_CPU_ID: - ret = info->open(res->config_data.res_name, info, - (struct pass_resource_common**)&res->hal.cpu); - break; - case PASS_RESOURCE_BUS_ID: - ret = info->open(res->config_data.res_name, info, - (struct pass_resource_common**)&res->hal.bus); - break; - case PASS_RESOURCE_GPU_ID: - ret = info->open(res->config_data.res_name, info, - (struct pass_resource_common**)&res->hal.gpu); - break; - case PASS_RESOURCE_MEMORY_ID: - ret = info->open(res->config_data.res_name, info, - (struct pass_resource_common**)&res->hal.memory); - break; - case PASS_RESOURCE_NONSTANDARD_ID: - ret = info->open(res->config_data.res_name, info, - (struct pass_resource_common**)&res->hal.nonstandard); - break; - }; - - if (ret < 0) { - _E("Failed to open %s.so for '%s' resource\n", - name, res->config_data.res_name); - return -EINVAL; - } - - return 0; + return hal_power_get_backend(res->config_data.res_type); } /** @@ -1073,48 +769,8 @@ int pass_hal_get_resource(struct pass_resource *res) */ int pass_hal_put_resource(struct pass_resource *res) { - struct pass_resource_common *common; - struct pass_resource_info *info; - int ret; - if (!res) return -EINVAL; - switch (res->config_data.res_type) { - case PASS_RESOURCE_CPU_ID: - common = (struct pass_resource_common*)res->hal.cpu; - info = res->hal.cpu->common.info; - ret = info->close(res->config_data.res_name, common); - break; - case PASS_RESOURCE_BUS_ID: - common = (struct pass_resource_common*)res->hal.bus; - info = res->hal.bus->common.info; - ret = info->close(res->config_data.res_name, common); - break; - case PASS_RESOURCE_GPU_ID: - common = (struct pass_resource_common*)res->hal.gpu; - info = res->hal.gpu->common.info; - ret = info->close(res->config_data.res_name, common); - break; - case PASS_RESOURCE_MEMORY_ID: - common = (struct pass_resource_common*)res->hal.memory; - info = res->hal.memory->common.info; - ret = info->close(res->config_data.res_name, common); - break; - case PASS_RESOURCE_NONSTANDARD_ID: - common = (struct pass_resource_common*)res->hal.nonstandard; - info = res->hal.nonstandard->common.info; - ret = info->close(res->config_data.res_name, common); - break; - default: - return -EINVAL; - }; - - if (ret < 0) { - _E("Failed to close %s.so for '%s' resource\n", - info->name, res->config_data.res_name); - return -EINVAL; - } - - return 0; + return hal_power_put_backend(); } diff --git a/src/pass/pass-hal.h b/src/pass/pass-hal.h index 6329602..43b45e3 100644 --- a/src/pass/pass-hal.h +++ b/src/pass/pass-hal.h @@ -31,7 +31,9 @@ #ifndef __PASS_HAL__ #define __PASS_HAL__ -#include +#include + +struct pass_resource; /*** * Functions for all H/W resources diff --git a/src/pass/pass-parser.c b/src/pass/pass-parser.c index 38c6392..dac9724 100644 --- a/src/pass/pass-parser.c +++ b/src/pass/pass-parser.c @@ -40,7 +40,7 @@ #include #include -#include +#include #include "pass.h" diff --git a/src/pass/pass-resmon.c b/src/pass/pass-resmon.c index faf7fc7..8c42e08 100644 --- a/src/pass/pass-resmon.c +++ b/src/pass/pass-resmon.c @@ -40,7 +40,7 @@ #include #include -#include +#include #include "pass.h" #include "pass-hal.h" diff --git a/src/pass/pass-thermal.c b/src/pass/pass-thermal.c index fc3b088..5ef9eb3 100644 --- a/src/pass/pass-thermal.c +++ b/src/pass/pass-thermal.c @@ -26,8 +26,8 @@ */ #include -#include #include +#include #include "pass.h" #include "pass-rescon.h" diff --git a/src/pass/pass.c b/src/pass/pass.c index 764df84..ae9592f 100644 --- a/src/pass/pass.c +++ b/src/pass/pass.c @@ -42,7 +42,7 @@ #include "pass-parser.h" #include "pass-hal.h" -#define PASS_CONF_PATH "/etc/pass/pass.conf" +#define PASS_CONF_PATH "/hal/etc/pass/pass.conf" /** * @brief Specify the supported modules according to the type of h/w diff --git a/systemd/pass.service b/systemd/pass.service.in similarity index 84% rename from systemd/pass.service rename to systemd/pass.service.in index 13b8bcf..a774f5f 100644 --- a/systemd/pass.service +++ b/systemd/pass.service.in @@ -10,6 +10,7 @@ RestartSec=0 KillSignal=SIGUSR1 User=system_fw Group=system_fw +Environment=LD_LIBRARY_PATH=@LIBDIR@/hal [Install] WantedBy=delayed.target diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 99c5bdc..7aeae05 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -1,7 +1,6 @@ PROJECT(pass C CXX) -SET(SRCS ${CMAKE_SOURCE_DIR}/src/hal/hal.c - ${CMAKE_SOURCE_DIR}/src/pass/pass-hal.c +SET(SRCS ${CMAKE_SOURCE_DIR}/src/pass/pass-hal.c ${CMAKE_SOURCE_DIR}/src/pass/pass-parser.c ${CMAKE_SOURCE_DIR}/src/core/common.c ${CMAKE_SOURCE_DIR}/src/core/config-parser.c @@ -13,7 +12,14 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/src/pass) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include) INCLUDE(FindPkgConfig) -pkg_check_modules(gtest_pkgs REQUIRED glib-2.0 gio-2.0 gmock dlog) +pkg_check_modules(gtest_pkgs REQUIRED + glib-2.0 + gio-2.0 + gmock + dlog + hal-api-common + hal-api-power +) FOREACH(flag ${gtest_pkgs_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") @@ -29,6 +35,6 @@ FOREACH(src ${sources}) GET_FILENAME_COMPONENT(src_name ${src} NAME_WE) MESSAGE("${src_name}") ADD_EXECUTABLE(${src_name} ${SRCS} ${src}) - TARGET_LINK_LIBRARIES(${src_name} ${gtest_LDFLAGS} ${gtest_pkgs_LDFLAGS} -ldl) + TARGET_LINK_LIBRARIES(${src_name} ${gtest_LDFLAGS} ${gtest_pkgs_LDFLAGS} -ldl -L${LIBDIR}/hal) INSTALL(TARGETS ${src_name} DESTINATION bin) ENDFOREACH() diff --git a/unittest/pass_haltests.cpp b/unittest/pass_haltests.cpp index de98ee0..3cb6f7b 100644 --- a/unittest/pass_haltests.cpp +++ b/unittest/pass_haltests.cpp @@ -57,7 +57,7 @@ TEST_F(PowerMgntHalTest, GetResourceConfig_HandlesValidInput) { int ret = 0; unsigned int i; - char path[] = "/etc/pass/pass.conf"; + char path[] = "/hal/etc/pass/pass.conf"; /* Stop PASS daemon before HAL testing */ ret = system("/bin/systemctl stop pass.service"); -- 2.7.4 From 38271a8ac002d0b7330876d7237bf22aee82edce Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 19 Jan 2021 10:59:40 +0900 Subject: [PATCH 04/16] pass: Remove hal-api-common dependency /etc/ld.so.conf.d/libhal-api.conf contains the '/usr/lib/hal and /usr/lib64/hal' path for loading the shard library. So that PASS daemon doesn't need to specify the dependency of hal-api-common. Change-Id: I56a254f9d4baa3c5f252c99fdf4f4e7bdb0f5307 Signed-off-by: Chanwoo Choi --- CMakeLists.txt | 1 - packaging/pass.spec | 1 - systemd/pass.service.in | 1 - unittest/CMakeLists.txt | 1 - 4 files changed, 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d8f2591..9f5c08a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,7 +50,6 @@ SET(PKG_MODULES gio-unix-2.0 libudev libsystemd - hal-api-common hal-api-power ) diff --git a/packaging/pass.spec b/packaging/pass.spec index 9e16a7a..b822c33 100644 --- a/packaging/pass.spec +++ b/packaging/pass.spec @@ -22,7 +22,6 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gmock) BuildRequires: pkgconfig(libudev) BuildRequires: pkgconfig(libsystemd) -BuildRequires: pkgconfig(hal-api-common) BuildRequires: pkgconfig(hal-api-power) %description diff --git a/systemd/pass.service.in b/systemd/pass.service.in index a774f5f..13b8bcf 100644 --- a/systemd/pass.service.in +++ b/systemd/pass.service.in @@ -10,7 +10,6 @@ RestartSec=0 KillSignal=SIGUSR1 User=system_fw Group=system_fw -Environment=LD_LIBRARY_PATH=@LIBDIR@/hal [Install] WantedBy=delayed.target diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 7aeae05..e2d13d4 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -17,7 +17,6 @@ pkg_check_modules(gtest_pkgs REQUIRED gio-2.0 gmock dlog - hal-api-common hal-api-power ) -- 2.7.4 From ba5072765a6f2ef6b618a07482499bd3ff7e331f Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Tue, 26 Jan 2021 10:03:35 +0900 Subject: [PATCH 05/16] PASS v1.2.0 - Changes from v1.1.0 1. Use hal-api-power (/platform/hal/api/power) instead of loading the HAL backend library directly. Change-Id: I53d30b334e307f3320346114a61d45889e59a104 Signed-off-by: Chanwoo Choi --- packaging/pass.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pass.spec b/packaging/pass.spec index b822c33..cab50e1 100644 --- a/packaging/pass.spec +++ b/packaging/pass.spec @@ -6,7 +6,7 @@ Name: %{daemon_name} Summary: Power Aware System Service -Version: 1.1.0 +Version: 1.2.0 Release: 1 Group: System/Kernel License: Apache-2.0 -- 2.7.4 From dcf1429f0eaf1f38dd205eb53e574a55d32ab3bb Mon Sep 17 00:00:00 2001 From: Seung-Woo Kim Date: Fri, 29 Jan 2021 18:21:15 +0900 Subject: [PATCH 06/16] pass: resmon: Fix memory leak of udev_monitor in error path The resmon_uevent_add() has memory leak in error path. Fix the memory leak. Change-Id: I53c07b891b888cd1bdd596f872dd204f620d5b7c Signed-off-by: Seung-Woo Kim --- src/pass/pass-resmon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pass/pass-resmon.c b/src/pass/pass-resmon.c index 8c42e08..24c8acc 100644 --- a/src/pass/pass-resmon.c +++ b/src/pass/pass-resmon.c @@ -586,7 +586,7 @@ static int resmon_uevent_add(struct resmon *monitor) _E("failed to invoke .init of resmon source " \ "(res_name:%s, src_type: 0x%x)\n", res->config_data.res_name, monitor->src_type); - return ret; + goto err_udev_monitor_fd; } } -- 2.7.4 From abdc072a244a1ca230b0530ae7a367c64b2d6647 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Mon, 1 Feb 2021 10:32:35 +0900 Subject: [PATCH 07/16] pass: rescon: Handle -ENOTSUP error instad of -ENODEV The Power HAL API (hal-api-power) uses the -ENOTSUP error when HAL function is not implemented instead of -ENODEV error. So that handle -ENOTSUP error instad of -ENODEV Change-Id: I7637f78d76e2350d95091cf216757b1ce53416e4 Signed-off-by: Chanwoo Choi --- src/pass/pass-rescon.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pass/pass-rescon.c b/src/pass/pass-rescon.c index be4e06d..cb934e2 100644 --- a/src/pass/pass-rescon.c +++ b/src/pass/pass-rescon.c @@ -177,10 +177,10 @@ static int rescon_update(struct pass_resource *res) limit_min_cpu = limit_max_cpu; ret = pass_hal_set_online_min_num(res, limit_min_cpu); - if (ret == -EPERM || ret == -ENODEV) { + if (ret == -EPERM || ret == -ENOTSUP) { /* * If -EPERM, function is not supported according to - * h/w resource type. And if -ENODEV, function is not + * h/w resource type. And if -ENOTSUP, function is not * implemented on HAL package. It means that this * function is not necessary on two error case * when calling the HAL functions. @@ -194,7 +194,7 @@ static int rescon_update(struct pass_resource *res) } ret = pass_hal_set_online_max_num(res, limit_max_cpu); - if (ret == -EPERM || ret == -ENODEV) { + if (ret == -EPERM || ret == -ENOTSUP) { ; } else if (ret < 0) { _W("failed to set the maximum number of cpu(%d) of %s", @@ -207,7 +207,7 @@ static int rescon_update(struct pass_resource *res) ret = pass_hal_set_online_state(res, res->config_data.cpu + i, (i < limit_min_cpu) ? 1 : 0); - if (ret == -EPERM || ret == -ENODEV) { + if (ret == -EPERM || ret == -ENOTSUP) { ; } else if (ret < 0) { _W("failed to turn %s of cpu%d of %s", -- 2.7.4 From 8166d6e26633b3f6ac137844ec80e6811594c709 Mon Sep 17 00:00:00 2001 From: lokilee73 Date: Thu, 4 Feb 2021 12:57:45 +0900 Subject: [PATCH 08/16] pmqos: add AppLaunchHome and HomeScreen Two scenarios are added to support C# APIs. ex) DevicePmQosAppLaunchHome DevicePmQosHomeScreen Change-Id: I93ffd4fb0f2e91b00ba3fdaeb7b14b00a4eaa444 Signed-off-by: lokilee73 --- scripts/pass-pmqos.conf | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/pass-pmqos.conf b/scripts/pass-pmqos.conf index c616e62..3dc3332 100644 --- a/scripts/pass-pmqos.conf +++ b/scripts/pass-pmqos.conf @@ -2,7 +2,7 @@ # set to "yes" scenario_support (Default value is no) # set scenario_num to be tested scenario_support=yes -scenario_num=3 +scenario_num=5 # describe the scenario section as follows #[Scenario0] @@ -23,3 +23,13 @@ support=yes [Scenario2] name=Doze support=yes + +[Scenario3] +name=AppLaunchHome +max_duration_ms=3000 +support=yes + +[Scenario4] +name=HomeScreen +max_duration_ms=3000 +support=yes \ No newline at end of file -- 2.7.4 From 01ad94bded43fc7f2ce29c5d141fe604c7f2e484 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Mon, 1 Feb 2021 13:43:51 +0900 Subject: [PATCH 09/16] pass: unittest: Change install path and test file name Change install path and test file name. Tizen 6.5 requires the install and naming format as '/usr/bin/hal/[module name]-haltests'. [Detailed changes] - /usr/bin/pass_haltests -> /usr/bin/hal/power-haltests - /usr/bin/pass_gtest -> /usr/bin/pass-unittests And replace -ENODEV with -ENOTSUP because hal-api-power uses the more correct error value of -ENOTSUP. Change-Id: Ia2c8fd772d10e8b55db4dc66d9ee4f6d2be511e4 Signed-off-by: Chanwoo Choi --- packaging/pass.spec | 4 +- unittest/CMakeLists.txt | 21 +++++---- unittest/{pass_gtest.cpp => pass-unittests.cpp} | 0 unittest/{pass_haltests.cpp => power-haltests.cpp} | 54 +++++++++++----------- 4 files changed, 42 insertions(+), 37 deletions(-) rename unittest/{pass_gtest.cpp => pass-unittests.cpp} (100%) rename unittest/{pass_haltests.cpp => power-haltests.cpp} (86%) diff --git a/packaging/pass.spec b/packaging/pass.spec index cab50e1..6f2f77d 100644 --- a/packaging/pass.spec +++ b/packaging/pass.spec @@ -99,8 +99,8 @@ systemctl daemon-reload %files -n %{haltest_name} %defattr(-,root,root,-) -%{_bindir}/pass_haltests +%{_bindir}/hal/power-haltests %files -n %{unittest_name} %defattr(-,root,root,-) -%{_bindir}/pass_gtest +%{_bindir}/pass-unittests diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index e2d13d4..bf34e78 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -29,11 +29,16 @@ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_CFLAGS}") SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed -pie") -aux_source_directory(. sources) -FOREACH(src ${sources}) - GET_FILENAME_COMPONENT(src_name ${src} NAME_WE) - MESSAGE("${src_name}") - ADD_EXECUTABLE(${src_name} ${SRCS} ${src}) - TARGET_LINK_LIBRARIES(${src_name} ${gtest_LDFLAGS} ${gtest_pkgs_LDFLAGS} -ldl -L${LIBDIR}/hal) - INSTALL(TARGETS ${src_name} DESTINATION bin) -ENDFOREACH() +SET(src ${CMAKE_SOURCE_DIR}/unittest/power-haltests.cpp) +GET_FILENAME_COMPONENT(src_name ${src} NAME_WE) +MESSAGE("${src_name}") +ADD_EXECUTABLE(${src_name} ${SRCS} ${src}) +TARGET_LINK_LIBRARIES(${src_name} ${gtest_LDFLAGS} ${gtest_pkgs_LDFLAGS} -ldl -L${LIBDIR}/hal) +INSTALL(TARGETS ${src_name} DESTINATION /usr/bin/hal) + +SET(src ${CMAKE_SOURCE_DIR}/unittest/pass-unittests.cpp) +GET_FILENAME_COMPONENT(src_name ${src} NAME_WE) +MESSAGE("${src_name}") +ADD_EXECUTABLE(${src_name} ${SRCS} ${src}) +TARGET_LINK_LIBRARIES(${src_name} ${gtest_LDFLAGS} ${gtest_pkgs_LDFLAGS} -ldl -L${LIBDIR}/hal) +INSTALL(TARGETS ${src_name} DESTINATION /usr/bin/) diff --git a/unittest/pass_gtest.cpp b/unittest/pass-unittests.cpp similarity index 100% rename from unittest/pass_gtest.cpp rename to unittest/pass-unittests.cpp diff --git a/unittest/pass_haltests.cpp b/unittest/power-haltests.cpp similarity index 86% rename from unittest/pass_haltests.cpp rename to unittest/power-haltests.cpp index 3cb6f7b..47b7a30 100644 --- a/unittest/pass_haltests.cpp +++ b/unittest/power-haltests.cpp @@ -26,7 +26,7 @@ extern "C" { using namespace std; -class PowerMgntHalTest : public testing::Test { +class PowerHaltest : public testing::Test { public: virtual void SetUp() {} virtual void TearDown() {} @@ -39,12 +39,12 @@ static int haltest_is_failed(struct pass_resource *res, int ret) char *res_name = res->config_data.res_name; /* * If -EPERM, function is not supported according to h/w resource type. - * And if -ENODEV, function is not implemented on hal package. + * And if -ENOTSUP, function is not implemented on hal package. * It means that this function is not necessary on two error case * when calling the HAL functions. */ if (ret < 0) { - if (ret == -EPERM || ret == -ENODEV) + if (ret == -EPERM || ret == -ENOTSUP) return 0; cout << "Failed to test HAL of '" << res_name << "'" << endl; @@ -53,7 +53,7 @@ static int haltest_is_failed(struct pass_resource *res, int ret) return 0; } -TEST_F(PowerMgntHalTest, GetResourceConfig_HandlesValidInput) +TEST_F(PowerHaltest, GetResourceConfig_HandlesValidInput) { int ret = 0; unsigned int i; @@ -76,7 +76,7 @@ TEST_F(PowerMgntHalTest, GetResourceConfig_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetCurrGovernor_HandlesValidInput) +TEST_F(PowerHaltest, GetCurrGovernor_HandlesValidInput) { int ret = 0; unsigned int i; @@ -92,7 +92,7 @@ TEST_F(PowerMgntHalTest, GetCurrGovernor_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetCurrGovernor_HandlesValidInput) +TEST_F(PowerHaltest, SetCurrGovernor_HandlesValidInput) { int ret = 0; unsigned int i; @@ -113,7 +113,7 @@ TEST_F(PowerMgntHalTest, SetCurrGovernor_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetCurrFreq_HandlesValidInput) +TEST_F(PowerHaltest, GetCurrFreq_HandlesValidInput) { int ret = 0; unsigned int i; @@ -128,7 +128,7 @@ TEST_F(PowerMgntHalTest, GetCurrFreq_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetMinFreq_HandlesValidInput) +TEST_F(PowerHaltest, GetMinFreq_HandlesValidInput) { int ret = 0; unsigned int i; @@ -143,7 +143,7 @@ TEST_F(PowerMgntHalTest, GetMinFreq_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetMinFreq_HandlesValidInput) +TEST_F(PowerHaltest, SetMinFreq_HandlesValidInput) { int ret = 0; int min_freq = 0; @@ -166,7 +166,7 @@ TEST_F(PowerMgntHalTest, SetMinFreq_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetMaxFreq_HandlesValidInput) +TEST_F(PowerHaltest, GetMaxFreq_HandlesValidInput) { int ret = 0; unsigned int i; @@ -181,7 +181,7 @@ TEST_F(PowerMgntHalTest, GetMaxFreq_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetMaxFreq_HandlesValidInput) +TEST_F(PowerHaltest, SetMaxFreq_HandlesValidInput) { int ret = 0; int max_freq = 0; @@ -204,7 +204,7 @@ TEST_F(PowerMgntHalTest, SetMaxFreq_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetAvailableMinFreq_HandlesValidInput) +TEST_F(PowerHaltest, GetAvailableMinFreq_HandlesValidInput) { int ret = 0; unsigned int i; @@ -219,7 +219,7 @@ TEST_F(PowerMgntHalTest, GetAvailableMinFreq_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetAvailableMaxFreq_HandlesValidInput) +TEST_F(PowerHaltest, GetAvailableMaxFreq_HandlesValidInput) { int ret = 0; unsigned int i; @@ -235,7 +235,7 @@ TEST_F(PowerMgntHalTest, GetAvailableMaxFreq_HandlesValidInput) } -TEST_F(PowerMgntHalTest, GetUpThreshold_HandlesValidInput) +TEST_F(PowerHaltest, GetUpThreshold_HandlesValidInput) { int ret = 0; unsigned int i; @@ -250,7 +250,7 @@ TEST_F(PowerMgntHalTest, GetUpThreshold_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetUpThreshold_HandlesValidInput) +TEST_F(PowerHaltest, SetUpThreshold_HandlesValidInput) { int ret = 0; int up_threshold = 0; @@ -273,7 +273,7 @@ TEST_F(PowerMgntHalTest, SetUpThreshold_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetTemperature_HandlesValidInput) +TEST_F(PowerHaltest, GetTemperature_HandlesValidInput) { int ret = 0; unsigned int i; @@ -288,7 +288,7 @@ TEST_F(PowerMgntHalTest, GetTemperature_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetTmuPolicy_HandlesValidInput) +TEST_F(PowerHaltest, GetTmuPolicy_HandlesValidInput) { int ret = 0; unsigned int i; @@ -304,7 +304,7 @@ TEST_F(PowerMgntHalTest, GetTmuPolicy_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetOnlineState_HandlesValidInput) +TEST_F(PowerHaltest, GetOnlineState_HandlesValidInput) { int ret = 0; unsigned int i, j; @@ -325,7 +325,7 @@ TEST_F(PowerMgntHalTest, GetOnlineState_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetOnlineState_HandlesValidInput) +TEST_F(PowerHaltest, SetOnlineState_HandlesValidInput) { int ret = 0; int online_state = 0; @@ -351,7 +351,7 @@ TEST_F(PowerMgntHalTest, SetOnlineState_HandlesValidInput) } -TEST_F(PowerMgntHalTest, GetOnlineMinNum_HandlesValidInput) +TEST_F(PowerHaltest, GetOnlineMinNum_HandlesValidInput) { int ret = 0; unsigned int i; @@ -366,7 +366,7 @@ TEST_F(PowerMgntHalTest, GetOnlineMinNum_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetOnlineMinNum_HandlesValidInput) +TEST_F(PowerHaltest, SetOnlineMinNum_HandlesValidInput) { int ret = 0; int online_min_num = 0; @@ -389,7 +389,7 @@ TEST_F(PowerMgntHalTest, SetOnlineMinNum_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetOnlineMaxNum_HandlesValidInput) +TEST_F(PowerHaltest, GetOnlineMaxNum_HandlesValidInput) { int ret = 0; unsigned int i; @@ -404,7 +404,7 @@ TEST_F(PowerMgntHalTest, GetOnlineMaxNum_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetOnlineMaxNum_HandlesValidInput) +TEST_F(PowerHaltest, SetOnlineMaxNum_HandlesValidInput) { int ret = 0; int online_max_num = 0; @@ -427,7 +427,7 @@ TEST_F(PowerMgntHalTest, SetOnlineMaxNum_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, GetFaultAroundBytes_HandlesValidInput) +TEST_F(PowerHaltest, GetFaultAroundBytes_HandlesValidInput) { int ret = 0; unsigned int i; @@ -442,7 +442,7 @@ TEST_F(PowerMgntHalTest, GetFaultAroundBytes_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetFaultAroundBytes_HandlesValidInput) +TEST_F(PowerHaltest, SetFaultAroundBytes_HandlesValidInput) { int ret = 0; int fault_around_bytes = 0; @@ -465,7 +465,7 @@ TEST_F(PowerMgntHalTest, SetFaultAroundBytes_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, SetPmqosData_HandlesValidInput) +TEST_F(PowerHaltest, SetPmqosData_HandlesValidInput) { int ret = 0; unsigned int i; @@ -481,7 +481,7 @@ TEST_F(PowerMgntHalTest, SetPmqosData_HandlesValidInput) } } -TEST_F(PowerMgntHalTest, PutResourceConfig_HandlesValidInput) +TEST_F(PowerHaltest, PutResourceConfig_HandlesValidInput) { int ret = 0; unsigned int i; -- 2.7.4 From 7aa237a0c030256ac6ca99e5d10fcb29edd96ff0 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Wed, 3 Mar 2021 12:56:18 +0900 Subject: [PATCH 10/16] pass: pmqos: Add new Performance mode Add new 'Performance' mode in order to support the highest performance. There are always requirements to test the device with high-performance. Change-Id: I5d2eadefeedd8d0d56e08f37c68fd0664c2ffb8b Signed-off-by: Chanwoo Choi --- scripts/pass-pmqos.conf | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/pass-pmqos.conf b/scripts/pass-pmqos.conf index 3dc3332..4a4259a 100644 --- a/scripts/pass-pmqos.conf +++ b/scripts/pass-pmqos.conf @@ -2,7 +2,7 @@ # set to "yes" scenario_support (Default value is no) # set scenario_num to be tested scenario_support=yes -scenario_num=5 +scenario_num=6 # describe the scenario section as follows #[Scenario0] @@ -32,4 +32,8 @@ support=yes [Scenario4] name=HomeScreen max_duration_ms=3000 -support=yes \ No newline at end of file +support=yes + +[Scenario5] +name=Performance +support=yes -- 2.7.4 From dac64c780db5c517f3a9c42ebbe3d98813c59c74 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 17 Jun 2021 10:59:01 +0900 Subject: [PATCH 11/16] pass: rescon: Add missing lock for scenario_level_list scenario_level_list variables should be protected by mutext. So thath add missing lock for scenario_level_list Change-Id: Ib4590fd3b76e3e9f6953234cbb1f7b21c7af7520 Signed-off-by: Chanwoo Choi --- src/pass/pass-rescon.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pass/pass-rescon.c b/src/pass/pass-rescon.c index cb934e2..79d3a1a 100644 --- a/src/pass/pass-rescon.c +++ b/src/pass/pass-rescon.c @@ -516,9 +516,12 @@ int pass_rescon_init(struct pass_resource *res) res->config_data.default_max_level = rescon->max_level; /* Initialize g_list of scenario_level */ - rescon->scenario_level_list = NULL; g_mutex_init(&rescon->scenario_level_mutex); + g_mutex_lock(&rescon->scenario_level_mutex); + rescon->scenario_level_list = NULL; + g_mutex_unlock(&rescon->scenario_level_mutex); + /* * Save the current data of h/w resource. The saved data * will be used for restoring the h/w resource on exit(). @@ -592,8 +595,11 @@ int pass_rescon_exit(struct pass_resource *res) rescon->init_level = 0; /* Free g_list of scenario_level */ + g_mutex_lock(&rescon->scenario_level_mutex); g_list_free(rescon->scenario_level_list); rescon->scenario_level_list = NULL; + g_mutex_unlock(&rescon->scenario_level_mutex); + g_mutex_clear(&rescon->scenario_level_mutex); rescon->state = PASS_OFF; -- 2.7.4 From 327b5661f2e66d9f2ecc3bc75f814e562781f1af Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 17 Jun 2021 16:23:14 +0900 Subject: [PATCH 12/16] scripts: dbus: Allow root to use core d-bus interface Allow 'root' to use core d-bus interface provided by PASS. The 'root' have to control all d-bus interface without any restrictions. Change-Id: Ie322e426cbc945209cd9188ffa642444ce69880a Signed-off-by: Chanwoo Choi --- scripts/pass.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/pass.conf b/scripts/pass.conf index b96f2af..abfdfdd 100644 --- a/scripts/pass.conf +++ b/scripts/pass.conf @@ -3,6 +3,8 @@ + -- 2.7.4 From 085a28368ba8df42b437b5e2844fbd35909fc267 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 17 Jun 2021 16:34:01 +0900 Subject: [PATCH 13/16] unittest: Replace system command with dbus signal system() command causes the security issue. So that fix issue to replace system command with dbus signal. Change-Id: I83843697c9b64bd1c14fc54d1e9773dcfbdc5a3b Signed-off-by: Chanwoo Choi --- unittest/pass-unittests.cpp | 9 +++++--- unittest/power-haltests.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/unittest/pass-unittests.cpp b/unittest/pass-unittests.cpp index 9dd723e..5711c01 100644 --- a/unittest/pass-unittests.cpp +++ b/unittest/pass-unittests.cpp @@ -228,13 +228,16 @@ TEST_F(PowerMgntTest, RestartsPowerMgntService) { gint32 ret; - ret = system("/bin/systemctl start pass.service"); + ret = pass_test_method_call(DBUS_CORE_PATH, DBUS_CORE_INTERFACE, + "start", NULL); ASSERT_EQ(ret, 0) << "PassServiceStart Failed"; - ret = system("/bin/systemctl stop pass.service"); + ret = pass_test_method_call(DBUS_CORE_PATH, DBUS_CORE_INTERFACE, + "stop", NULL); ASSERT_EQ(ret, 0) << "PassServiceStop Failed"; - ret = system("/bin/systemctl start pass.service"); + ret = pass_test_method_call(DBUS_CORE_PATH, DBUS_CORE_INTERFACE, + "start", NULL); ASSERT_EQ(ret, 0) << "PassServiceStart Failed"; } diff --git a/unittest/power-haltests.cpp b/unittest/power-haltests.cpp index 47b7a30..8e475e5 100644 --- a/unittest/power-haltests.cpp +++ b/unittest/power-haltests.cpp @@ -17,7 +17,9 @@ #include #include +#include #include +#include extern "C" { #include "pass-hal.h" @@ -53,6 +55,54 @@ static int haltest_is_failed(struct pass_resource *res, int ret) return 0; } +static gint32 pass_test_method_call(const gchar *path, const gchar *intf, + const gchar *method, GVariant *body) +{ + const gchar *type; + GVariant *ret; + GError *err = NULL; + GDBusMessage *msg, *reply; + GDBusConnection *conn; + gint32 r; + + conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err); + if (err) + return -1; + + msg = g_dbus_message_new_method_call(DBUS_PASS_BUS_NAME, path, + intf, method); + if (!msg) + return -1; + + if (body) + g_dbus_message_set_body(msg, body); + + reply = g_dbus_connection_send_message_with_reply_sync(conn, msg, + G_DBUS_SEND_MESSAGE_FLAGS_NONE, + G_MAXINT, NULL, NULL, &err); + if (err) { + g_object_unref(msg); + g_clear_error(&err); + return -1; + } + + ret = g_variant_get_child_value(g_dbus_message_get_body(reply), 0); + type = g_variant_get_type_string(ret); + if (type[0] == 'i') + r = g_variant_get_int32(ret); + else + r = -1; + + g_variant_unref(ret); + + g_dbus_connection_flush(conn, NULL, NULL, NULL); + g_object_unref(msg); + g_object_unref(reply); + g_clear_error(&err); + + return r; +} + TEST_F(PowerHaltest, GetResourceConfig_HandlesValidInput) { int ret = 0; @@ -60,7 +110,8 @@ TEST_F(PowerHaltest, GetResourceConfig_HandlesValidInput) char path[] = "/hal/etc/pass/pass.conf"; /* Stop PASS daemon before HAL testing */ - ret = system("/bin/systemctl stop pass.service"); + ret = pass_test_method_call(DBUS_CORE_PATH, DBUS_CORE_INTERFACE, + "stop", NULL); ASSERT_EQ(ret, 0) << "PassServiceStop Failed"; ret = pass_parser_get_resource_config(&g_pass, path); @@ -497,7 +548,8 @@ TEST_F(PowerHaltest, PutResourceConfig_HandlesValidInput) } /* Restart PASS daemon before HAL testing */ - ret = system("/bin/systemctl start pass.service"); + ret = pass_test_method_call(DBUS_CORE_PATH, DBUS_CORE_INTERFACE, + "start", NULL); ASSERT_EQ(ret, 0) << "PassServiceStart Failed"; } -- 2.7.4 From 3364431b71ad3d0c38b7c5971bd7647869a4c49a Mon Sep 17 00:00:00 2001 From: INSUN PYO Date: Wed, 21 Jul 2021 10:05:55 +0900 Subject: [PATCH 14/16] pass: resmon: Remove unused code Change-Id: I0e4f5e61fe5ed0ab8a58ec69c02f0115b16a247f Signed-off-by: INSUN PYO --- src/pass/pass-resmon.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/pass/pass-resmon.c b/src/pass/pass-resmon.c index 24c8acc..aa4852e 100644 --- a/src/pass/pass-resmon.c +++ b/src/pass/pass-resmon.c @@ -498,8 +498,6 @@ out: return G_SOURCE_CONTINUE; } -#define UDEV_MONITOR_SIZE (128 * 1024) - /** * @brief Add an uevent-based resource monitor. * @param [in] monitor Instance of a resource monitor -- 2.7.4 From 45f5c07684b5346e9f79660a2c640d7cff6746f7 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 29 Jul 2021 21:38:13 +0900 Subject: [PATCH 15/16] pmqos: Convert pass-pmqos.conf format to json to improve readability The legacy pass-pmqos.conf file format is not better on side of readability. So that change the configuration file format to json style to improve readability. Change-Id: I4898d431b1d0f8bc3b50b1d1ea764c87992cdf6c Signed-off-by: Chanwoo Choi --- CMakeLists.txt | 3 +- include/pass/common.h | 12 ++- packaging/pass.spec | 3 +- scripts/pass-pmqos.conf | 39 ---------- scripts/pass-pmqos.json | 24 ++++++ src/core/common.c | 46 ++++++++++- src/pmqos/pmqos-parser.c | 193 +++++++++++++++++++---------------------------- src/pmqos/pmqos.c | 4 +- unittest/CMakeLists.txt | 1 + 9 files changed, 160 insertions(+), 165 deletions(-) delete mode 100644 scripts/pass-pmqos.conf create mode 100644 scripts/pass-pmqos.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f5c08a..6bd9240 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ SET(PKG_MODULES gio-unix-2.0 libudev libsystemd + json-c hal-api-power ) @@ -97,7 +98,7 @@ ADD_EXECUTABLE(${PROJECT_NAME} ${SRCS}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl -lm) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/${PROJECT_NAME}.conf DESTINATION /etc/dbus-1/system.d) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-pmqos.conf DESTINATION /etc/pass) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-pmqos.json DESTINATION /etc/pass) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-thermal.conf DESTINATION /etc/pass) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/systemd/${PROJECT_NAME}.service.in ${CMAKE_SOURCE_DIR}/systemd/${PROJECT_NAME}.service @ONLY) INSTALL(FILES ${CMAKE_SOURCE_DIR}/systemd/org.tizen.system.pass.service DESTINATION /usr/share/dbus-1/system-services) diff --git a/include/pass/common.h b/include/pass/common.h index 3bef731..851212c 100644 --- a/include/pass/common.h +++ b/include/pass/common.h @@ -26,6 +26,9 @@ #include #include +#include +#include + typedef unsigned int uint32; typedef unsigned long long uint64; @@ -90,6 +93,11 @@ typedef unsigned long long uint64; #define USEC_TO_MSEC(x) ((double)x/1000) #endif -int sys_get_str(char *fname, char *str); -int sys_strtol(char *str); +int sys_get_str(const char *fname, char *str); +int sys_strtol(const char *str); + +const char *get_string_from_object(json_object *obj, const char *key); +const int get_int_from_object(json_object *obj, const char *key); +const double get_double_from_object(json_object *obj, const char *key); +const int get_boolean_from_object(json_object *obj, const char *key); #endif /* __CORE_COMMON_H__ */ diff --git a/packaging/pass.spec b/packaging/pass.spec index 6f2f77d..b1fd8a0 100644 --- a/packaging/pass.spec +++ b/packaging/pass.spec @@ -22,6 +22,7 @@ BuildRequires: pkgconfig(glib-2.0) BuildRequires: pkgconfig(gmock) BuildRequires: pkgconfig(libudev) BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(json-c) BuildRequires: pkgconfig(hal-api-power) %description @@ -89,7 +90,7 @@ systemctl daemon-reload %manifest %{name}.manifest %license LICENSE %config %{_sysconfdir}/dbus-1/system.d/%{daemon_name}.conf -%config %{_sysconfdir}/pass/pass-pmqos.conf +%config %{_sysconfdir}/pass/pass-pmqos.json %config %{_sysconfdir}/pass/pass-thermal.conf %{_bindir}/%{daemon_name} %{_unitdir}/delayed.target.wants/%{daemon_name}.service diff --git a/scripts/pass-pmqos.conf b/scripts/pass-pmqos.conf deleted file mode 100644 index 4a4259a..0000000 --- a/scripts/pass-pmqos.conf +++ /dev/null @@ -1,39 +0,0 @@ -[PassScenario] -# set to "yes" scenario_support (Default value is no) -# set scenario_num to be tested -scenario_support=yes -scenario_num=6 - -# describe the scenario section as follows -#[Scenario0] -#[Mandatory properties] -# name=AppLaunch # (dbus method name) -# support=yes -#[Optional properties] -# max_duration_ms=3000 # (unit:millisecond, max dururation is 3000ms) -[Scenario0] -name=AppLaunch -max_duration_ms=3000 -support=yes - -[Scenario1] -name=UltraPowerSaving -support=yes - -[Scenario2] -name=Doze -support=yes - -[Scenario3] -name=AppLaunchHome -max_duration_ms=3000 -support=yes - -[Scenario4] -name=HomeScreen -max_duration_ms=3000 -support=yes - -[Scenario5] -name=Performance -support=yes diff --git a/scripts/pass-pmqos.json b/scripts/pass-pmqos.json new file mode 100644 index 0000000..34f1032 --- /dev/null +++ b/scripts/pass-pmqos.json @@ -0,0 +1,24 @@ +{ + "pmqos_support" : true, + "pmqos_scenario_list" : + [ + { + "name" : "AppLaunch", + "max_duration_ms" : 3000, + "support" : true + }, { + "name" : "AppLaunchHome", + "max_duration_ms" : 3000, + "support" : true + }, { + "name" : "UltraPowerSaving", + "support" : true + }, { + "name" : "Doze", + "support" : true + }, { + "name" : "Performance", + "support" : true + } + ] +} diff --git a/src/core/common.c b/src/core/common.c index bf1a81b..66fe952 100644 --- a/src/core/common.c +++ b/src/core/common.c @@ -40,7 +40,7 @@ #define BUFF_MAX 255 -static int sys_read_buf(char *file, char *buf) +static int sys_read_buf(const char *file, char *buf) { int fd; int r; @@ -61,7 +61,7 @@ static int sys_read_buf(char *file, char *buf) return ret; } -int sys_get_str(char *fname, char *str) +int sys_get_str(const char *fname, char *str) { char buf[BUFF_MAX] = {0}; @@ -73,7 +73,7 @@ int sys_get_str(char *fname, char *str) return -1; } -int sys_strtol(char *str) +int sys_strtol(const char *str) { long value; @@ -83,3 +83,43 @@ int sys_strtol(char *str) return (int)value; } + +const char *get_string_from_object(json_object *obj, const char *key) +{ + json_object *tmp = NULL; + + if (!json_object_object_get_ex(obj, key, &tmp)) + return NULL; + + return json_object_get_string(tmp); +} + +const int get_int_from_object(json_object *obj, const char *key) +{ + json_object *tmp = NULL; + + if (!json_object_object_get_ex(obj, key, &tmp)) + return -EINVAL; + + return json_object_get_int(tmp); +} + +const double get_double_from_object(json_object *obj, const char *key) +{ + json_object *tmp = NULL; + + if (!json_object_object_get_ex(obj, key, &tmp)) + return -EINVAL; + + return json_object_get_double(tmp); +} + +const int get_boolean_from_object(json_object *obj, const char *key) +{ + json_object *tmp = NULL; + + if (!json_object_object_get_ex(obj, key, &tmp)) + return -EINVAL; + + return (int)json_object_get_boolean(tmp); +} diff --git a/src/pmqos/pmqos-parser.c b/src/pmqos/pmqos-parser.c index 3e8ee97..d0fec49 100644 --- a/src/pmqos/pmqos-parser.c +++ b/src/pmqos/pmqos-parser.c @@ -34,98 +34,42 @@ #include #include +#include +#include + #include #include -#include #include "pmqos.h" -#define MAX_NUM_OF_SCENARIOS 255 - -static bool is_supported(const char *value) -{ - assert(value); - - if (MATCH(value, "yes")) - return true; - return false; -} - /** * @brief Parse scenario section to get a scenario information * for PMQoS(Power Management Quality of Service). - * @param [in] result Parsed raw data from configuration - * @param [in] user_data Instance for each scenario - * @param [in] index Index of each scenario + * @param [in] obj Instance of json_object for each scenario + * @param [in] scenario Instance for each scenario * @return @c 0 on success, otherwise error value */ -static int pmqos_parse_scenario(struct parse_result *result, void *user_data, unsigned int index) +static int pmqos_parse_scenario(json_object *obj, struct scenario *scenario) { - struct pmqos_scenario *scenarios = (struct pmqos_scenario *)user_data; - - assert(result); - assert(result->section && result->name && result->value); - - /* Parse 'PassScenario' section */ - if (MATCH(result->section, "PassScenario")) { - if (MATCH(result->name, "scenario_support")) - scenarios->support = is_supported(result->value); - else if (MATCH(result->name, "scenario_num")) { - int num; - - num = sys_strtol(result->value); - if (num < 0) - return num; - - if (num > MAX_NUM_OF_SCENARIOS) - return -EINVAL; - - if (num > 0) { - scenarios->list = calloc(num, - sizeof(struct scenario)); - if (!scenarios->list) { - _E("failed to allocate memory for scenario"); - return -errno; - } - - scenarios->num = num; - } - } + const char *name; + int max_duration_ms; + int support; + + /* Get property values */ + name = get_string_from_object(obj, "name"); + max_duration_ms = get_int_from_object(obj, "max_duration_ms"); + support = get_boolean_from_object(obj, "support"); + + /* Check the mandatory property values are valid or not */ + if (!name) { + _E("Failed to get 'name' property of scenario section\n"); + return -EINVAL; } - /* Do not support pmqos scenario */ - if (!scenarios->support) - return 0; - - /* Do not have pmqos scenario */ - if (!scenarios->num) - return 0; - - /* No item to parse */ - if (index >= scenarios->num) - return 0; - - /* Parse 'Scenario' section */ - if (MATCH(result->name, "name")) - snprintf(scenarios->list[index].name, strlen(result->value) + 1, - "%s", result->value); - else if (MATCH(result->name, "support")) - scenarios->list[index].support = is_supported(result->value); - else if (MATCH(result->name, "max_duration_ms")) { - int max_duration_ms = sys_strtol(result->value); - - if (max_duration_ms < 0) { - _E("failed to parse max_duration_ms property (%d)\n", - max_duration_ms); - return -EINVAL; - } - - /* - * If maximum duration is zero, it measn that this scenario is - * mode without any maximum duration. - */ - scenarios->list[index].max_duration_ms = max_duration_ms; - } + /* Initialize config_data from property values of confiugartion file */ + snprintf(scenario->name, strlen(name) + 1, "%s", name); + scenario->max_duration_ms = (max_duration_ms < 0) ? 0 : max_duration_ms; + scenario->support = (support < 0) ? 1 : support; return 0; } @@ -134,49 +78,56 @@ static int pmqos_parse_scenario(struct parse_result *result, void *user_data, un * @brief Parse configuration to get information of supported scenarios * for PMQoS(Power Management Quality of Service) such as * AppLaunch, UltraPowerSaving. - * @param [in] result Parsed raw data from configuration - * @param [in] user_data Instance for each scenario + * @param [in] obj Instance of json_object of thermal configuration file + * @param [in] scenarios Instance for all scenarios * @return @c 0 on success, otherwise error value */ -static int pmqos_load_config(struct parse_result *result, void *user_data) +static int pmqos_load_config(json_object *obj, struct pmqos_scenario *scenarios) { - struct pmqos_scenario *scenarios = (struct pmqos_scenario *)user_data; - char name[NAME_MAX]; - int ret; - static int index; - - if (!result) - return 0; - - if (!result->section || !result->name || !result->value) + int pmqos_support; + json_object *pmqos_scenario_list = NULL; + int num_scenarios = 0, ret, i; + + /* Get property values */ + pmqos_support = get_boolean_from_object(obj, "pmqos_support"); + if (json_object_object_get_ex(obj, "pmqos_scenario_list", + &pmqos_scenario_list)) + num_scenarios = json_object_array_length(pmqos_scenario_list); + + /* Check the mandatory property values are valid or not */ + if (pmqos_support <= 0 || num_scenarios <= 0) { + _I("Disable PMQOS module\n"); return 0; + } - /* Parsing 'PassScenario' section */ - if (MATCH(result->section, "PassScenario")) { - ret = pmqos_parse_scenario(result, user_data, -1); - if (ret < 0) { - _E("failed to parse [PassScenario] section : %d", ret); - return ret; - } - goto out; + /* Initialize config_data from property values of confiugartion file */ + scenarios->support = pmqos_support; + scenarios->list = calloc(num_scenarios, sizeof(struct scenario)); + if (!scenarios->list) { + _E("failed to allocate memory for scenario"); + return -ENOMEM; } + scenarios->num = num_scenarios; - /* Parsing 'Scenario' section */ - for (index = 0; index < scenarios->num; ++index) { - snprintf(name, sizeof(name), "Scenario%d", index); - - if (MATCH(result->section, name)) { - ret = pmqos_parse_scenario(result, user_data, index); - if (ret < 0) { - _E("failed to parse [Scenario%d] section : %d", index, ret); - return ret; - } - goto out; + for (i = 0; i < scenarios->num ; i++) { + json_object *scenario_obj + = json_object_array_get_idx(pmqos_scenario_list, i); + struct scenario *scenario = &(scenarios->list[i]); + + ret = pmqos_parse_scenario(scenario_obj, scenario); + if (ret < 0) { + _E("cannot parse 'pmqos.scenario%d' section\n", i); + goto err; } } -out: return 0; +err: + free(scenarios->list); + scenarios->list = NULL; + scenarios->num = 0; + + return ret; } /** @@ -209,16 +160,24 @@ int pmqos_put_scenario(struct pmqos_scenario *scenarios) int pmqos_get_scenario(const char *path, struct pmqos_scenario *scenarios) { int ret; + json_object *obj = NULL; /* Initialize the variables before parsing the pass-pmqos.conf */ scenarios->num = 0; - /* get configuration file */ - ret = config_parse(path, pmqos_load_config, scenarios); - if (ret < 0) { - pmqos_put_scenario(scenarios); - return ret; + /* Parse configuration file */ + obj = json_object_from_file(path); + if (!obj) { + _E("Failed to get json_object from %s (%s)\n", + path, json_util_get_last_err()); + return -EINVAL; } - return 0; + ret = pmqos_load_config(obj, scenarios); + if (ret < 0) + pmqos_put_scenario(scenarios); + + json_object_put(obj); + + return ret; } diff --git a/src/pmqos/pmqos.c b/src/pmqos/pmqos.c index eb40199..ec64276 100644 --- a/src/pmqos/pmqos.c +++ b/src/pmqos/pmqos.c @@ -39,7 +39,7 @@ #include "pmqos.h" -#define PMQOS_CONF_PATH "/etc/pass/pass-pmqos.conf" +#define PMQOS_JSON_PATH "/etc/pass/pass-pmqos.json" #define MILLISECONDS(tv) ((tv.tv_sec)*1000 + (tv.tv_nsec)/1000000) #define DELTA(a, b) (MILLISECONDS(a) - MILLISECONDS(b)) @@ -520,7 +520,7 @@ static int pmqos_init_done(void *data, void *user_data) if (!g_pmqos) return -ENOMEM; - ret = pmqos_get_scenario(PMQOS_CONF_PATH, g_pmqos); + ret = pmqos_get_scenario(PMQOS_JSON_PATH, g_pmqos); if (ret < 0) { _E("failed to get PMQoS scenario\n"); return ret; diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index bf34e78..12a56db 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -17,6 +17,7 @@ pkg_check_modules(gtest_pkgs REQUIRED gio-2.0 gmock dlog + json-c hal-api-power ) -- 2.7.4 From 3d8374d30debda17f4068213d20a18c9ed4710d9 Mon Sep 17 00:00:00 2001 From: Chanwoo Choi Date: Thu, 29 Jul 2021 21:44:15 +0900 Subject: [PATCH 16/16] thermal: Convert pass-thermal.conf format to json to improve readability The legacy pass-thermal.conf file format is not better on side of readability. So that change the configuration file format to json style to improve readability. Change-Id: I228559fbc348b097284263a6bd8c57c1b2e6fa37 Signed-off-by: Chanwoo Choi --- CMakeLists.txt | 2 +- packaging/pass.spec | 2 +- scripts/pass-thermal.conf | 25 ------- scripts/pass-thermal.json | 19 +++++ src/thermal/thermal-parser.c | 167 ++++++++++++++++++------------------------- src/thermal/thermal.c | 4 +- 6 files changed, 92 insertions(+), 127 deletions(-) delete mode 100644 scripts/pass-thermal.conf create mode 100644 scripts/pass-thermal.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bd9240..be26532 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,7 @@ TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${pkgs_LDFLAGS} -ldl -lm) INSTALL(TARGETS ${PROJECT_NAME} DESTINATION bin) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/${PROJECT_NAME}.conf DESTINATION /etc/dbus-1/system.d) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-pmqos.json DESTINATION /etc/pass) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-thermal.conf DESTINATION /etc/pass) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/scripts/pass-thermal.json DESTINATION /etc/pass) CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/systemd/${PROJECT_NAME}.service.in ${CMAKE_SOURCE_DIR}/systemd/${PROJECT_NAME}.service @ONLY) INSTALL(FILES ${CMAKE_SOURCE_DIR}/systemd/org.tizen.system.pass.service DESTINATION /usr/share/dbus-1/system-services) INSTALL(FILES ${CMAKE_SOURCE_DIR}/systemd/org.tizen.system.thermal.service DESTINATION /usr/share/dbus-1/system-services) diff --git a/packaging/pass.spec b/packaging/pass.spec index b1fd8a0..3856fc3 100644 --- a/packaging/pass.spec +++ b/packaging/pass.spec @@ -91,7 +91,7 @@ systemctl daemon-reload %license LICENSE %config %{_sysconfdir}/dbus-1/system.d/%{daemon_name}.conf %config %{_sysconfdir}/pass/pass-pmqos.json -%config %{_sysconfdir}/pass/pass-thermal.conf +%config %{_sysconfdir}/pass/pass-thermal.json %{_bindir}/%{daemon_name} %{_unitdir}/delayed.target.wants/%{daemon_name}.service %{_unitdir}/%{daemon_name}.service diff --git a/scripts/pass-thermal.conf b/scripts/pass-thermal.conf deleted file mode 100644 index f15ad2c..0000000 --- a/scripts/pass-thermal.conf +++ /dev/null @@ -1,25 +0,0 @@ -[thermal] -# set to "yes" thermal_support (Default value is no) -# set thermal_number_of_scenario to be tested -thermal_support=yes -thermal_number_of_scenario=4 - -# describe the scenario section as follows -#[Scenario0] -#name=Release -#support=yes -[thermal.scenario0] -name=Release -support=yes - -[thermal.scenario1] -name=Warning -support=yes - -[thermal.scenario2] -name=LimitAction -support=yes - -[thermal.scenario3] -name=Shutdown -support=yes diff --git a/scripts/pass-thermal.json b/scripts/pass-thermal.json new file mode 100644 index 0000000..83fe051 --- /dev/null +++ b/scripts/pass-thermal.json @@ -0,0 +1,19 @@ +{ + "thermal_support" : true, + "thermal_scenario_list" : + [ + { + "name" : "Release", + "support" : true + }, { + "name" : "Warning", + "support" : true + }, { + "name" : "LimitAction", + "support" : true + }, { + "name" : "Shutdown", + "support" : true + } + ] +} diff --git a/src/thermal/thermal-parser.c b/src/thermal/thermal-parser.c index 58df42e..8a4a9f0 100644 --- a/src/thermal/thermal-parser.c +++ b/src/thermal/thermal-parser.c @@ -37,76 +37,34 @@ #include #include -#include #include "thermal.h" -#define MAX_NUM_OF_SCENARIOS 255 - -static bool is_supported(const char *value) -{ - assert(value); - - if (MATCH(value, "yes")) - return true; - return false; -} - /** * @brief Parse scenario section to get a scenario information * for Thermal Monitor. - * @param [in] result Parsed raw data from configuration - * @param [in] user_data Instance for each scenario - * @param [in] index Index of each scenario + * @param [in] obj Instance of json_object for each scenario + * @param [in] scenario Instance for each scenario * @return @c 0 on success, otherwise error value */ -static int thermal_parse_scenario(struct parse_result *result, void *user_data, - unsigned int index) +static int thermal_parse_scenario(json_object *obj, struct scenario *scenario) { - struct thermal_scenario *scenarios = (struct thermal_scenario *)user_data; - - assert(result); - assert(result->section && result->name && result->value); - - /* Parse 'thermal' section */ - if (MATCH(result->section, "thermal")) { - if (MATCH(result->name, "thermal_support")) - scenarios->support = is_supported(result->value); - else if (MATCH(result->name, "thermal_number_of_scenario")) { - int num; - - num = sys_strtol(result->value); - if (num < 0) - return num; - - if (num > MAX_NUM_OF_SCENARIOS) - return -EINVAL; - - if (num > 0) { - scenarios->list = calloc(num, - sizeof(struct scenario)); - if (!scenarios->list) { - _E("failed to allocate scenario memory"); - return -errno; - } - - scenarios->num = num; - } - } - } + const char *name; + int support; - if (!scenarios->support || !scenarios->num) - return 0; + /* Get property values */ + name = get_string_from_object(obj, "name"); + support = get_boolean_from_object(obj, "support"); - if (index >= scenarios->num) - return 0; + /* Check the mandatory property values are valid or not */ + if (!name) { + _E("Failed to get 'name' property of scenario section\n"); + return -EINVAL; + } - /* Parse 'Scenario' section */ - if (MATCH(result->name, "name")) - snprintf(scenarios->list[index].name, - strlen(result->value) + 1, "%s", result->value); - else if (MATCH(result->name, "support")) - scenarios->list[index].support = is_supported(result->value); + /* Initialize config_data from property values of confiugartion file */ + snprintf(scenario->name, strlen(name) + 1, "%s", name); + scenario->support = (support < 0) ? 1 : support; return 0; } @@ -114,51 +72,56 @@ static int thermal_parse_scenario(struct parse_result *result, void *user_data, /** * @brief Parse configuration to get information of supported scenarios * for Thermal Monitor such as Release, Warning. - * @param [in] result Parsed raw data from configuration - * @param [in] user_data Instance for each scenario + * @param [in] obj Instance of json_object of thermal configuration file + * @param [in] scenarios Instance for all scenarios * @return @c 0 on success, otherwise error value */ -static int thermal_load_config(struct parse_result *result, void *user_data) +static int thermal_load_config(json_object *obj, struct thermal_scenario *scenarios) { - struct thermal_scenario *scenarios - = (struct thermal_scenario *)user_data; - char name[NAME_MAX]; - int ret; - static int index; - - if (!result) - return 0; - - if (!result->section || !result->name || !result->value) + int thermal_support; + json_object *thermal_scenario_list = NULL; + int num_scenarios = 0, ret, i; + + /* Get property values */ + thermal_support = get_boolean_from_object(obj, "thermal_support"); + if (json_object_object_get_ex(obj, "thermal_scenario_list", + &thermal_scenario_list)) + num_scenarios = json_object_array_length(thermal_scenario_list); + + /* Check the mandatory property values are valid or not */ + if (thermal_support <= 0 || num_scenarios <= 0) { + _I("Disable thermal module\n"); return 0; + } - /* Parsing 'thermal' section */ - if (MATCH(result->section, "thermal")) { - ret = thermal_parse_scenario(result, user_data, -1); - if (ret < 0) { - _E("failed to parse [thermal] section : %d", ret); - return ret; - } - goto out; + /* Initialize config_data from property values of confiugartion file */ + scenarios->support = thermal_support; + scenarios->list = calloc(num_scenarios, sizeof(struct scenario)); + if (!scenarios->list) { + _E("failed to allocate memory for scenario"); + return -ENOMEM; } + scenarios->num = num_scenarios; - /* Parsing 'thermal.scenario' section */ - for (index = 0; index < scenarios->num; ++index) { - snprintf(name, sizeof(name), "thermal.scenario%d", index); - - if (MATCH(result->section, name)) { - ret = thermal_parse_scenario(result, user_data, index); - if (ret < 0) { - _E("failed to parse [thermal.scenario%d] section : %d", - index, ret); - return ret; - } - goto out; + for (i = 0; i < scenarios->num ; i++) { + json_object *scenario_obj + = json_object_array_get_idx(thermal_scenario_list, i); + struct scenario *scenario = &(scenarios->list[i]); + + ret = thermal_parse_scenario(scenario_obj, scenario); + if (ret < 0) { + _E("cannot parse 'thermal.scenario%d' section\n", i); + goto err; } } -out: return 0; +err: + free(scenarios->list); + scenarios->list = NULL; + scenarios->num = 0; + + return ret; } /** @@ -189,16 +152,24 @@ int thermal_put_scenario(struct thermal_scenario *scenarios) int thermal_get_scenario(const char *path, struct thermal_scenario *scenarios) { int ret; + json_object *obj = NULL; /* Initialize the variables before parsing the pass-thermal.conf */ scenarios->num = 0; - /* get configuration file */ - ret = config_parse(path, thermal_load_config, scenarios); - if (ret < 0) { - thermal_put_scenario(scenarios); - return ret; + /* Parse configuration file */ + obj = json_object_from_file(path); + if (!obj) { + _E("Failed to get json_object from %s (%s)\n", + path, json_util_get_last_err()); + return -EINVAL; } - return 0; + ret = thermal_load_config(obj, scenarios); + if (ret < 0) + thermal_put_scenario(scenarios); + + json_object_put(obj); + + return ret; } diff --git a/src/thermal/thermal.c b/src/thermal/thermal.c index 4d43fd2..cca20dc 100644 --- a/src/thermal/thermal.c +++ b/src/thermal/thermal.c @@ -38,7 +38,7 @@ #include "thermal.h" -#define THERMAL_CONF_PATH "/etc/pass/pass-thermal.conf" +#define THERMAL_JSON_PATH "/etc/pass/pass-thermal.json" /** * @brief Global instance indicating the Thermal Monitor D-Bus interface @@ -116,7 +116,7 @@ static int thermal_init_done(void *data, void *user_data) return -ENOMEM; } - ret = thermal_get_scenario(THERMAL_CONF_PATH, g_thermal); + ret = thermal_get_scenario(THERMAL_JSON_PATH, g_thermal); if (ret < 0) { _E("failed to get Thermal Monitor scenario\n"); free(g_thermal); -- 2.7.4