/* * PASS (Power Aware System Service) - Memory 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 #include #include #include #include #include #include #define PROC_MEM_INFO_MEM_AVAILABLE "MemAvailable" #define PROC_MEM_INFO_MEM_FREE "MemFree" #define PROC_MEM_INFO_BUFFER "Buffers" #define PROC_MEM_INFO_CACHED "Cached" #define PROC_MEM_INFO_CMA_FREE "CmaFree" #define PROC_MEM_INFO_SWAP_FREE "SwapFree" static int memory_get_cma_total(u_int64_t *val) { static u_int64_t cma_total = 0; int ret; if (!cma_total) { ret = kernel_get_memory_info("CmaTotal", &cma_total); if (ret < 0) { _E("failed to get system CMA total memory\n"); return -EINVAL; } } *val = cma_total; return 0; } static int memory_get_swap_total(u_int64_t *val) { static u_int64_t swap_total = 0; int ret; if (!swap_total) { ret = kernel_get_memory_info("SwapTotal", &swap_total); if (ret < 0) { _E("failed to get system SWAP total memory\n"); return -EINVAL; } } *val = swap_total; return 0; } static int memory_get_memory_info(int resource_id, const struct syscommon_resman_resource_attribute *attr, void *data) { u_int64_t *val = (u_int64_t *)data; int ret; if (resource_id < 0 || !attr || !data) return -EINVAL; switch (attr->id) { case MEMORY_ATTR_TOTAL: ret = kernel_get_memory_total(val); break; case MEMORY_ATTR_AVAILABLE: ret = kernel_get_memory_info(PROC_MEM_INFO_MEM_AVAILABLE, val); break; case MEMORY_ATTR_FREE: ret = kernel_get_memory_info(PROC_MEM_INFO_MEM_FREE, val); break; case MEMORY_ATTR_BUFFER: ret = kernel_get_memory_info(PROC_MEM_INFO_BUFFER, val); break; case MEMORY_ATTR_CACHED: ret = kernel_get_memory_info(PROC_MEM_INFO_CACHED, val); break; case MEMORY_ATTR_CMA_TOTAL: ret = memory_get_cma_total(val); break; case MEMORY_ATTR_CMA_FREE: ret = kernel_get_memory_info(PROC_MEM_INFO_CMA_FREE, val); break; case MEMORY_ATTR_SWAP_TOTAL: ret = memory_get_swap_total(val); break; case MEMORY_ATTR_SWAP_FREE: ret = kernel_get_memory_info(PROC_MEM_INFO_SWAP_FREE, val); break; default: _E("wrong memory resource attribute\n"); ret = -EINVAL; } if (ret < 0) return -EINVAL; return 0; } static const struct syscommon_resman_resource_attribute memory_attrs[] = { { .name = "MEMORY_ATTR_TOTAL", .id = MEMORY_ATTR_TOTAL, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, }, }, { .name = "MEMORY_ATTR_AVAILABLE", .id = MEMORY_ATTR_AVAILABLE, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, }, }, { .name = "MEMORY_ATTR_FREE", .id = MEMORY_ATTR_FREE, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, } }, { .name = "MEMORY_ATTR_BUFFER", .id = MEMORY_ATTR_BUFFER, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, } }, { .name = "MEMORY_ATTR_CACHED", .id = MEMORY_ATTR_CACHED, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, } }, { .name = "MEMORY_ATTR_CMA_TOTAL", .id = MEMORY_ATTR_CMA_TOTAL, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, } }, { .name = "MEMORY_ATTR_CMA_FREE", .id = MEMORY_ATTR_CMA_FREE, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, } }, { .name = "MEMORY_ATTR_SWAP_TOTAL", .id = MEMORY_ATTR_SWAP_TOTAL, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, } }, { .name = "MEMORY_ATTR_SWAP_FREE", .id = MEMORY_ATTR_SWAP_FREE, .type = SYSCOMMON_RESMAN_DATA_TYPE_UINT64, .flag = SYSCOMMON_RESMAN_RESOURCE_ATTR_FLAG_PUBLIC, .ops = { .get = memory_get_memory_info, } }, }; static const struct syscommon_resman_resource_driver memory_resource_driver = { .name = "MEMORY", .type = RESOURCE_TYPE_MEMORY, .flag = SYSCOMMON_RESMAN_RESOURCE_DRIVER_FLAG_COUNT_ONLY_ONE, .attrs = memory_attrs, .num_attrs = ARRAY_SIZE(memory_attrs), }; SYSCOMMON_RESMAN_RESOURCE_DRIVER_REGISTER(&memory_resource_driver)