1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2016 MediaTek Inc. 4 * Author: Andrew-CT Chen <andrew-ct.chen@mediatek.com> 5 */ 6 7 #ifndef _MTK_VPU_H 8 #define _MTK_VPU_H 9 10 #include <linux/platform_device.h> 11 12 /** 13 * VPU (video processor unit) is a tiny processor controlling video hardware 14 * related to video codec, scaling and color format converting. 15 * VPU interfaces with other blocks by share memory and interrupt. 16 **/ 17 18 typedef void (*ipi_handler_t) (const void *data, 19 unsigned int len, 20 void *priv); 21 22 /** 23 * enum ipi_id - the id of inter-processor interrupt 24 * 25 * @IPI_VPU_INIT: The interrupt from vpu is to notfiy kernel 26 * VPU initialization completed. 27 * IPI_VPU_INIT is sent from VPU when firmware is 28 * loaded. AP doesn't need to send IPI_VPU_INIT 29 * command to VPU. 30 * For other IPI below, AP should send the request 31 * to VPU to trigger the interrupt. 32 * @IPI_VDEC_H264: The interrupt from vpu is to notify kernel to 33 * handle H264 vidoe decoder job, and vice versa. 34 * Decode output format is always MT21 no matter what 35 * the input format is. 36 * @IPI_VDEC_VP8: The interrupt from is to notify kernel to 37 * handle VP8 video decoder job, and vice versa. 38 * Decode output format is always MT21 no matter what 39 * the input format is. 40 * @IPI_VDEC_VP9: The interrupt from vpu is to notify kernel to 41 * handle VP9 video decoder job, and vice versa. 42 * Decode output format is always MT21 no matter what 43 * the input format is. 44 * @IPI_VENC_H264: The interrupt from vpu is to notify kernel to 45 * handle H264 video encoder job, and vice versa. 46 * @IPI_VENC_VP8: The interrupt fro vpu is to notify kernel to 47 * handle VP8 video encoder job,, and vice versa. 48 * @IPI_MDP: The interrupt from vpu is to notify kernel to 49 * handle MDP (Media Data Path) job, and vice versa. 50 * @IPI_MAX: The maximum IPI number 51 */ 52 53 enum ipi_id { 54 IPI_VPU_INIT = 0, 55 IPI_VDEC_H264, 56 IPI_VDEC_VP8, 57 IPI_VDEC_VP9, 58 IPI_VENC_H264, 59 IPI_VENC_VP8, 60 IPI_MDP, 61 IPI_MAX, 62 }; 63 64 /** 65 * enum rst_id - reset id to register reset function for VPU watchdog timeout 66 * 67 * @VPU_RST_ENC: encoder reset id 68 * @VPU_RST_DEC: decoder reset id 69 * @VPU_RST_MDP: MDP (Media Data Path) reset id 70 * @VPU_RST_MAX: maximum reset id 71 */ 72 enum rst_id { 73 VPU_RST_ENC, 74 VPU_RST_DEC, 75 VPU_RST_MDP, 76 VPU_RST_MAX, 77 }; 78 79 /** 80 * vpu_ipi_register - register an ipi function 81 * 82 * @pdev: VPU platform device 83 * @id: IPI ID 84 * @handler: IPI handler 85 * @name: IPI name 86 * @priv: private data for IPI handler 87 * 88 * Register an ipi function to receive ipi interrupt from VPU. 89 * 90 * Return: Return 0 if ipi registers successfully, otherwise it is failed. 91 */ 92 int vpu_ipi_register(struct platform_device *pdev, enum ipi_id id, 93 ipi_handler_t handler, const char *name, void *priv); 94 95 /** 96 * vpu_ipi_send - send data from AP to vpu. 97 * 98 * @pdev: VPU platform device 99 * @id: IPI ID 100 * @buf: the data buffer 101 * @len: the data buffer length 102 * 103 * This function is thread-safe. When this function returns, 104 * VPU has received the data and starts the processing. 105 * When the processing completes, IPI handler registered 106 * by vpu_ipi_register will be called in interrupt context. 107 * 108 * Return: Return 0 if sending data successfully, otherwise it is failed. 109 **/ 110 int vpu_ipi_send(struct platform_device *pdev, 111 enum ipi_id id, void *buf, 112 unsigned int len); 113 114 /** 115 * vpu_get_plat_device - get VPU's platform device 116 * 117 * @pdev: the platform device of the module requesting VPU platform 118 * device for using VPU API. 119 * 120 * Return: Return NULL if it is failed. 121 * otherwise it is VPU's platform device 122 **/ 123 struct platform_device *vpu_get_plat_device(struct platform_device *pdev); 124 125 /** 126 * vpu_wdt_reg_handler - register a VPU watchdog handler 127 * 128 * @pdev: VPU platform device 129 * @vpu_wdt_reset_func: the callback reset function 130 * @private_data: the private data for reset function 131 * @rst_id: reset id 132 * 133 * Register a handler performing own tasks when vpu reset by watchdog 134 * 135 * Return: Return 0 if the handler is added successfully, 136 * otherwise it is failed. 137 * 138 **/ 139 int vpu_wdt_reg_handler(struct platform_device *pdev, 140 void vpu_wdt_reset_func(void *), 141 void *priv, enum rst_id id); 142 143 /** 144 * vpu_get_vdec_hw_capa - get video decoder hardware capability 145 * 146 * @pdev: VPU platform device 147 * 148 * Return: video decoder hardware capability 149 **/ 150 unsigned int vpu_get_vdec_hw_capa(struct platform_device *pdev); 151 152 /** 153 * vpu_get_venc_hw_capa - get video encoder hardware capability 154 * 155 * @pdev: VPU platform device 156 * 157 * Return: video encoder hardware capability 158 **/ 159 unsigned int vpu_get_venc_hw_capa(struct platform_device *pdev); 160 161 /** 162 * vpu_load_firmware - download VPU firmware and boot it 163 * 164 * @pdev: VPU platform device 165 * 166 * Return: Return 0 if downloading firmware successfully, 167 * otherwise it is failed 168 **/ 169 int vpu_load_firmware(struct platform_device *pdev); 170 171 /** 172 * vpu_mapping_dm_addr - Mapping DTCM/DMEM to kernel virtual address 173 * 174 * @pdev: VPU platform device 175 * @dmem_addr: VPU's data memory address 176 * 177 * Mapping the VPU's DTCM (Data Tightly-Coupled Memory) / 178 * DMEM (Data Extended Memory) memory address to 179 * kernel virtual address. 180 * 181 * Return: Return ERR_PTR(-EINVAL) if mapping failed, 182 * otherwise the mapped kernel virtual address 183 **/ 184 void *vpu_mapping_dm_addr(struct platform_device *pdev, 185 u32 dtcm_dmem_addr); 186 #endif /* _MTK_VPU_H */ 187