pass: hal: Replace HAL interface with hal-api-power 55/251355/5
authorChanwoo Choi <cw00.choi@samsung.com>
Wed, 6 Jan 2021 04:55:33 +0000 (13:55 +0900)
committerYunmi Ha <yunmi.ha@samsung.com>
Wed, 13 Jan 2021 08:26:10 +0000 (17:26 +0900)
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 <cw00.choi@samsung.com>
15 files changed:
CMakeLists.txt
include/pass/hal/hal.h [deleted file]
packaging/pass.spec
src/hal/CMakeLists.txt [deleted file]
src/hal/hal-log.h [deleted file]
src/hal/hal.c [deleted file]
src/pass/pass-hal.c
src/pass/pass-hal.h
src/pass/pass-parser.c
src/pass/pass-resmon.c
src/pass/pass-thermal.c
src/pass/pass.c
systemd/pass.service.in [moved from systemd/pass.service with 84% similarity]
unittest/CMakeLists.txt
unittest/pass_haltests.cpp

index a069f15..d8f2591 100644 (file)
@@ -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 (file)
index 3e41493..0000000
+++ /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 <stdio.h>
-#include <stdint.h>
-#include <stdbool.h>
-
-#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_ */
index 89d837b..9e16a7a 100644 (file)
@@ -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 (executable)
index c0f1fbc..0000000
+++ /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 (file)
index 4b43f61..0000000
+++ /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 <dlog.h>
-
-#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 (file)
index 0b2cffa..0000000
+++ /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 <stdio.h>
-#include <unistd.h>
-#include <errno.h>
-#include <dlfcn.h>
-#include <string.h>
-#include <errno.h>
-#include <linux/limits.h>
-
-#include <pass/hal/hal.h>
-
-#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;
-}
index 0ba680f..f2229f7 100644 (file)
 #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();
 }
index 6329602..43b45e3 100644 (file)
@@ -31,7 +31,9 @@
 #ifndef __PASS_HAL__
 #define __PASS_HAL__
 
-#include <pass/hal/hal.h>
+#include <hal/hal-power.h>
+
+struct pass_resource;
 
 /***
  * Functions for all H/W resources
index 38c6392..dac9724 100644 (file)
@@ -40,7 +40,7 @@
 
 #include <pass/common.h>
 #include <pass/config-parser.h>
-#include <pass/hal/hal.h>
+#include <pass/pass-hal.h>
 
 #include "pass.h"
 
index faf7fc7..8c42e08 100644 (file)
@@ -40,7 +40,7 @@
 #include <libudev.h>
 
 #include <pass/log.h>
-#include <pass/hal/hal.h>
+#include <pass/pass-hal.h>
 
 #include "pass.h"
 #include "pass-hal.h"
index fc3b088..5ef9eb3 100644 (file)
@@ -26,8 +26,8 @@
  */
 
 #include <pass/log.h>
-#include <pass/hal/hal.h>
 #include <pass/device-notifier.h>
+#include <pass/pass-hal.h>
 
 #include "pass.h"
 #include "pass-rescon.h"
index 764df84..ae9592f 100644 (file)
@@ -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
similarity index 84%
rename from systemd/pass.service
rename to systemd/pass.service.in
index 13b8bcf..a774f5f 100644 (file)
@@ -10,6 +10,7 @@ RestartSec=0
 KillSignal=SIGUSR1
 User=system_fw
 Group=system_fw
+Environment=LD_LIBRARY_PATH=@LIBDIR@/hal
 
 [Install]
 WantedBy=delayed.target
index 99c5bdc..7aeae05 100644 (file)
@@ -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()
index de98ee0..3cb6f7b 100644 (file)
@@ -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");