18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * The On Chip Memory (OCMEM) allocator allows various clients to allocate
48c2ecf20Sopenharmony_ci * memory from OCMEM based on performance, latency and power requirements.
58c2ecf20Sopenharmony_ci * This is typically used by the GPU, camera/video, and audio components on
68c2ecf20Sopenharmony_ci * some Snapdragon SoCs.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Copyright (C) 2019 Brian Masney <masneyb@onstation.org>
98c2ecf20Sopenharmony_ci * Copyright (C) 2015 Red Hat. Author: Rob Clark <robdclark@gmail.com>
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/device.h>
138c2ecf20Sopenharmony_ci#include <linux/err.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#ifndef __OCMEM_H__
168c2ecf20Sopenharmony_ci#define __OCMEM_H__
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cienum ocmem_client {
198c2ecf20Sopenharmony_ci	/* GMEM clients */
208c2ecf20Sopenharmony_ci	OCMEM_GRAPHICS = 0x0,
218c2ecf20Sopenharmony_ci	/*
228c2ecf20Sopenharmony_ci	 * TODO add more once ocmem_allocate() is clever enough to
238c2ecf20Sopenharmony_ci	 * deal with multiple clients.
248c2ecf20Sopenharmony_ci	 */
258c2ecf20Sopenharmony_ci	OCMEM_CLIENT_MAX,
268c2ecf20Sopenharmony_ci};
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistruct ocmem;
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistruct ocmem_buf {
318c2ecf20Sopenharmony_ci	unsigned long offset;
328c2ecf20Sopenharmony_ci	unsigned long addr;
338c2ecf20Sopenharmony_ci	unsigned long len;
348c2ecf20Sopenharmony_ci};
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_QCOM_OCMEM)
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistruct ocmem *of_get_ocmem(struct device *dev);
398c2ecf20Sopenharmony_cistruct ocmem_buf *ocmem_allocate(struct ocmem *ocmem, enum ocmem_client client,
408c2ecf20Sopenharmony_ci				 unsigned long size);
418c2ecf20Sopenharmony_civoid ocmem_free(struct ocmem *ocmem, enum ocmem_client client,
428c2ecf20Sopenharmony_ci		struct ocmem_buf *buf);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci#else /* IS_ENABLED(CONFIG_QCOM_OCMEM) */
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistatic inline struct ocmem *of_get_ocmem(struct device *dev)
478c2ecf20Sopenharmony_ci{
488c2ecf20Sopenharmony_ci	return ERR_PTR(-ENODEV);
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cistatic inline struct ocmem_buf *ocmem_allocate(struct ocmem *ocmem,
528c2ecf20Sopenharmony_ci					       enum ocmem_client client,
538c2ecf20Sopenharmony_ci					       unsigned long size)
548c2ecf20Sopenharmony_ci{
558c2ecf20Sopenharmony_ci	return ERR_PTR(-ENODEV);
568c2ecf20Sopenharmony_ci}
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cistatic inline void ocmem_free(struct ocmem *ocmem, enum ocmem_client client,
598c2ecf20Sopenharmony_ci			      struct ocmem_buf *buf)
608c2ecf20Sopenharmony_ci{
618c2ecf20Sopenharmony_ci}
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci#endif /* IS_ENABLED(CONFIG_QCOM_OCMEM) */
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci#endif /* __OCMEM_H__ */
66