1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * The On Chip Memory (OCMEM) allocator allows various clients to allocate 4 * memory from OCMEM based on performance, latency and power requirements. 5 * This is typically used by the GPU, camera/video, and audio components on 6 * some Snapdragon SoCs. 7 * 8 * Copyright (C) 2019 Brian Masney <masneyb@onstation.org> 9 * Copyright (C) 2015 Red Hat. Author: Rob Clark <robdclark@gmail.com> 10 */ 11 12 #include <linux/device.h> 13 #include <linux/err.h> 14 15 #ifndef __OCMEM_H__ 16 #define __OCMEM_H__ 17 18 enum ocmem_client { 19 /* GMEM clients */ 20 OCMEM_GRAPHICS = 0x0, 21 /* 22 * TODO add more once ocmem_allocate() is clever enough to 23 * deal with multiple clients. 24 */ 25 OCMEM_CLIENT_MAX, 26 }; 27 28 struct ocmem; 29 30 struct ocmem_buf { 31 unsigned long offset; 32 unsigned long addr; 33 unsigned long len; 34 }; 35 36 #if IS_ENABLED(CONFIG_QCOM_OCMEM) 37 38 struct ocmem *of_get_ocmem(struct device *dev); 39 struct ocmem_buf *ocmem_allocate(struct ocmem *ocmem, enum ocmem_client client, 40 unsigned long size); 41 void ocmem_free(struct ocmem *ocmem, enum ocmem_client client, 42 struct ocmem_buf *buf); 43 44 #else /* IS_ENABLED(CONFIG_QCOM_OCMEM) */ 45 46 static inline struct ocmem *of_get_ocmem(struct device *dev) 47 { 48 return ERR_PTR(-ENODEV); 49 } 50 51 static inline struct ocmem_buf *ocmem_allocate(struct ocmem *ocmem, 52 enum ocmem_client client, 53 unsigned long size) 54 { 55 return ERR_PTR(-ENODEV); 56 } 57 58 static inline void ocmem_free(struct ocmem *ocmem, enum ocmem_client client, 59 struct ocmem_buf *buf) 60 { 61 } 62 63 #endif /* IS_ENABLED(CONFIG_QCOM_OCMEM) */ 64 65 #endif /* __OCMEM_H__ */ 66