xref: /linux/include/linux/firmware/qcom/qcom_tzmem.h (revision c771600c6af14749609b49565ffb4cac2959710d)
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