resource: Add memory resource driver 74/270274/4
authorSung-hun Kim <sfoon.kim@samsung.com>
Thu, 27 Jan 2022 08:27:30 +0000 (17:27 +0900)
committerChanwoo Choi <cw00.choi@samsung.com>
Thu, 27 Jan 2022 09:32:46 +0000 (18:32 +0900)
Change-Id: I74291dac952a7cba3a7c56038081215cb05b7adb
Signed-off-by: Sung-hun Kim <sfoon.kim@samsung.com>
CMakeLists.txt
include/monitor/monitor.h
src/resource/resource-memory.c [new file with mode: 0644]

index 0d8de97..24425eb 100644 (file)
@@ -41,6 +41,7 @@ SET(SRCS
        src/resource/resource-cpu.c
        src/resource/resource-bus.c
        src/resource/resource-gpu.c
+       src/resource/resource-memory.c
 )
 
 INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
index 8da5bda..d658d76 100644 (file)
@@ -68,10 +68,9 @@ enum monitor_data_type {
 #define GPU_TEMPERATURE                        (PASS_RESOURCE_GPU_ID << RESOURCE_TYPE_SHIFT | 6)
 
 #define MEMORY_TOTAL                   (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 0)
-#define MEMORY_FREE                    (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 1)
-#define MEMORY_USED                    (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 2)
-#define MEMORY_AVAILABLE               (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 3)
-#define MEMORY_FAULT_AROUND_BYTES      (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 4)
+#define MEMORY_AVAILABLE               (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 1)
+#define MEMORY_FREE                    (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 2)
+#define MEMORY_FAULT_AROUND_BYTES      (PASS_RESOURCE_MEMORY_ID << RESOURCE_TYPE_SHIFT | 3)
 
 #define BATTERY_CAPACITY               (PASS_RESOURCE_BATTERY_ID << RESOURCE_TYPE_SHIFT | 0)
 #define BATTERY_CHARGING_STATUS                (PASS_RESOURCE_BATTERY_ID << RESOURCE_TYPE_SHIFT | 1)
diff --git a/src/resource/resource-memory.c b/src/resource/resource-memory.c
new file mode 100644 (file)
index 0000000..3d62be4
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * PASS (Power Aware System Service) - CPU Resource Driver
+ *
+ * Copyright (c) 2022 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       resource-memory.c
+ * @brief      TBD
+ * @ingroup    TBD
+ */
+
+#include <glib.h>
+
+#include <hal/hal-power.h>
+
+#include <util/common.h>
+#include <util/log.h>
+#include <util/resource.h>
+
+#include <monitor/monitor.h>
+
+#define PROC_MEM_INFO_PATH "/proc/meminfo"
+#define PROC_MEM_INFO_MEM_TOTAL "MemTotal"
+#define PROC_MEM_INFO_MEM_AVAILABLE "MemAvailable"
+#define PROC_MEM_INFO_MEM_FREE "MemFree"
+
+static int __memory_read_val_from_proc_node(const char *key)
+{
+       int ret = -EINVAL;
+       char buf[BUFF_MAX];
+       char str[BUFF_MAX];
+       FILE *fp = NULL;
+
+       fp = fopen(PROC_MEM_INFO_PATH, "r");
+       if (!fp)
+               return -EIO;
+
+       while (fgets(buf, BUFF_MAX, fp)) {
+               if (!strncmp(buf, key, strlen(key))) {
+                       sscanf(buf, "%s %d", str, &ret);
+                       break;
+               }
+       }
+       fclose(fp);
+
+       return ret;
+}
+
+static inline int memory_read_val_from_proc_node(uint32_t val_id)
+{
+       switch (val_id) {
+       case MEMORY_TOTAL:
+               return __memory_read_val_from_proc_node(PROC_MEM_INFO_MEM_TOTAL);
+       case MEMORY_AVAILABLE:
+               return __memory_read_val_from_proc_node(PROC_MEM_INFO_MEM_AVAILABLE);
+       case MEMORY_FREE:
+               return __memory_read_val_from_proc_node(PROC_MEM_INFO_MEM_FREE);
+       }
+       return -EINVAL;
+}
+
+static int memory_get_total_memory(const struct resource *res,
+                               const struct resource_attribute *attr,
+                               char *buf, void *user_data)
+{
+       int val;
+
+       if (!res || !attr || !buf)
+               return -EINVAL;
+
+       val = memory_read_val_from_proc_node(attr->id);
+       if (val < 0)
+               return -EINVAL;
+
+       return sprintf(buf, "%d", val);
+}
+
+static int memory_get_available_memory(const struct resource *res,
+                               const struct resource_attribute *attr,
+                               char *buf, void *user_data)
+{
+       int val;
+
+       if (!res || !attr || !buf)
+               return -EINVAL;
+
+       val = memory_read_val_from_proc_node(attr->id);
+       if (val < 0)
+               return -EINVAL;
+
+       return sprintf(buf, "%d", val);
+}
+
+static int memory_get_free_memory(const struct resource *res,
+                               const struct resource_attribute *attr,
+                               char *buf, void *user_data)
+{
+       int val;
+
+       if (!res || !attr || !buf)
+               return -EINVAL;
+
+       val = memory_read_val_from_proc_node(attr->id);
+       if (val < 0)
+               return -EINVAL;
+
+       return sprintf(buf, "%d", val);
+}
+
+static const struct resource_attribute memory_attrs[] = {
+       {
+               .name   = "MEMORY_TOTAL",
+               .id     = MEMORY_TOTAL,
+               .type   = DATA_TYPE_INT,
+               .ops    = {
+                       .get = memory_get_total_memory,
+               },
+       }, {
+               .name   = "MEMORY_AVAILABLE",
+               .id     = MEMORY_AVAILABLE,
+               .type   = DATA_TYPE_INT,
+               .ops    = {
+                       .get = memory_get_available_memory,
+               },
+       }, {
+               .name   = "MEMORY_FREE",
+               .id     = MEMORY_FREE,
+               .type   = DATA_TYPE_INT,
+               .ops    = {
+                       .get = memory_get_free_memory,
+               }
+       },
+};
+
+static const struct resource_driver cpu_resource_driver = {
+       .name           = "MEMORY",
+       .type           = PASS_RESOURCE_MEMORY_ID,
+       .attrs          = memory_attrs,
+       .num_attrs      = ARRAY_SIZE(memory_attrs),
+};
+RESOURCE_DRIVER_REGISTER(&cpu_resource_driver)