184f5a7b6SBartosz Golaszewski /* SPDX-License-Identifier: GPL-2.0-only */ 284f5a7b6SBartosz Golaszewski /* 384f5a7b6SBartosz Golaszewski * Copyright (C) 2023-2024 Linaro Ltd. 484f5a7b6SBartosz Golaszewski */ 584f5a7b6SBartosz Golaszewski 684f5a7b6SBartosz Golaszewski #ifndef __QCOM_TZMEM_H 784f5a7b6SBartosz Golaszewski #define __QCOM_TZMEM_H 884f5a7b6SBartosz Golaszewski 984f5a7b6SBartosz Golaszewski #include <linux/cleanup.h> 1084f5a7b6SBartosz Golaszewski #include <linux/gfp.h> 1184f5a7b6SBartosz Golaszewski #include <linux/types.h> 1284f5a7b6SBartosz Golaszewski 1384f5a7b6SBartosz Golaszewski struct device; 1484f5a7b6SBartosz Golaszewski struct qcom_tzmem_pool; 1584f5a7b6SBartosz Golaszewski 1684f5a7b6SBartosz Golaszewski /** 1784f5a7b6SBartosz Golaszewski * enum qcom_tzmem_policy - Policy for pool growth. 1884f5a7b6SBartosz Golaszewski */ 1984f5a7b6SBartosz Golaszewski enum qcom_tzmem_policy { 2084f5a7b6SBartosz Golaszewski /**< Static pool, never grow above initial size. */ 2184f5a7b6SBartosz Golaszewski QCOM_TZMEM_POLICY_STATIC = 1, 2284f5a7b6SBartosz Golaszewski /**< When out of memory, add increment * current size of memory. */ 2384f5a7b6SBartosz Golaszewski QCOM_TZMEM_POLICY_MULTIPLIER, 2484f5a7b6SBartosz Golaszewski /**< When out of memory add as much as is needed until max_size. */ 2584f5a7b6SBartosz Golaszewski QCOM_TZMEM_POLICY_ON_DEMAND, 2684f5a7b6SBartosz Golaszewski }; 2784f5a7b6SBartosz Golaszewski 2884f5a7b6SBartosz Golaszewski /** 2984f5a7b6SBartosz Golaszewski * struct qcom_tzmem_pool_config - TZ memory pool configuration. 3084f5a7b6SBartosz Golaszewski * @initial_size: Number of bytes to allocate for the pool during its creation. 3184f5a7b6SBartosz Golaszewski * @policy: Pool size growth policy. 3284f5a7b6SBartosz Golaszewski * @increment: Used with policies that allow pool growth. 3384f5a7b6SBartosz Golaszewski * @max_size: Size above which the pool will never grow. 3484f5a7b6SBartosz Golaszewski */ 3584f5a7b6SBartosz Golaszewski struct qcom_tzmem_pool_config { 3684f5a7b6SBartosz Golaszewski size_t initial_size; 3784f5a7b6SBartosz Golaszewski enum qcom_tzmem_policy policy; 3884f5a7b6SBartosz Golaszewski size_t increment; 3984f5a7b6SBartosz Golaszewski size_t max_size; 4084f5a7b6SBartosz Golaszewski }; 4184f5a7b6SBartosz Golaszewski 4284f5a7b6SBartosz Golaszewski struct qcom_tzmem_pool * 4384f5a7b6SBartosz Golaszewski qcom_tzmem_pool_new(const struct qcom_tzmem_pool_config *config); 4484f5a7b6SBartosz Golaszewski void qcom_tzmem_pool_free(struct qcom_tzmem_pool *pool); 4584f5a7b6SBartosz Golaszewski struct qcom_tzmem_pool * 4684f5a7b6SBartosz Golaszewski devm_qcom_tzmem_pool_new(struct device *dev, 4784f5a7b6SBartosz Golaszewski const struct qcom_tzmem_pool_config *config); 4884f5a7b6SBartosz Golaszewski 4984f5a7b6SBartosz Golaszewski void *qcom_tzmem_alloc(struct qcom_tzmem_pool *pool, size_t size, gfp_t gfp); 5084f5a7b6SBartosz Golaszewski void qcom_tzmem_free(void *ptr); 5184f5a7b6SBartosz Golaszewski 5284f5a7b6SBartosz Golaszewski DEFINE_FREE(qcom_tzmem, void *, if (_T) qcom_tzmem_free(_T)) 5384f5a7b6SBartosz Golaszewski 5484f5a7b6SBartosz Golaszewski phys_addr_t qcom_tzmem_to_phys(void *ptr); 5584f5a7b6SBartosz Golaszewski 5684f5a7b6SBartosz Golaszewski #endif /* __QCOM_TZMEM */ 57