/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2016 MediaTek Inc. * Author: Andrew-CT Chen */ #ifndef _MTK_VPU_H #define _MTK_VPU_H #include /** * VPU (video processor unit) is a tiny processor controlling video hardware * related to video codec, scaling and color format converting. * VPU interfaces with other blocks by share memory and interrupt. **/ typedef void (*ipi_handler_t) (const void *data, unsigned int len, void *priv); /** * enum ipi_id - the id of inter-processor interrupt * * @IPI_VPU_INIT: The interrupt from vpu is to notfiy kernel * VPU initialization completed. * IPI_VPU_INIT is sent from VPU when firmware is * loaded. AP doesn't need to send IPI_VPU_INIT * command to VPU. * For other IPI below, AP should send the request * to VPU to trigger the interrupt. * @IPI_VDEC_H264: The interrupt from vpu is to notify kernel to * handle H264 vidoe decoder job, and vice versa. * Decode output format is always MT21 no matter what * the input format is. * @IPI_VDEC_VP8: The interrupt from is to notify kernel to * handle VP8 video decoder job, and vice versa. * Decode output format is always MT21 no matter what * the input format is. * @IPI_VDEC_VP9: The interrupt from vpu is to notify kernel to * handle VP9 video decoder job, and vice versa. * Decode output format is always MT21 no matter what * the input format is. * @IPI_VENC_H264: The interrupt from vpu is to notify kernel to * handle H264 video encoder job, and vice versa. * @IPI_VENC_VP8: The interrupt fro vpu is to notify kernel to * handle VP8 video encoder job,, and vice versa. * @IPI_MDP: The interrupt from vpu is to notify kernel to * handle MDP (Media Data Path) job, and vice versa. * @IPI_MAX: The maximum IPI number */ enum ipi_id { IPI_VPU_INIT = 0, IPI_VDEC_H264, IPI_VDEC_VP8, IPI_VDEC_VP9, IPI_VENC_H264, IPI_VENC_VP8, IPI_MDP, IPI_MAX, }; /** * enum rst_id - reset id to register reset function for VPU watchdog timeout * * @VPU_RST_ENC: encoder reset id * @VPU_RST_DEC: decoder reset id * @VPU_RST_MDP: MDP (Media Data Path) reset id * @VPU_RST_MAX: maximum reset id */ enum rst_id { VPU_RST_ENC, VPU_RST_DEC, VPU_RST_MDP, VPU_RST_MAX, }; /** * vpu_ipi_register - register an ipi function * * @pdev: VPU platform device * @id: IPI ID * @handler: IPI handler * @name: IPI name * @priv: private data for IPI handler * * Register an ipi function to receive ipi interrupt from VPU. * * Return: Return 0 if ipi registers successfully, otherwise it is failed. */ int vpu_ipi_register(struct platform_device *pdev, enum ipi_id id, ipi_handler_t handler, const char *name, void *priv); /** * vpu_ipi_send - send data from AP to vpu. * * @pdev: VPU platform device * @id: IPI ID * @buf: the data buffer * @len: the data buffer length * * This function is thread-safe. When this function returns, * VPU has received the data and starts the processing. * When the processing completes, IPI handler registered * by vpu_ipi_register will be called in interrupt context. * * Return: Return 0 if sending data successfully, otherwise it is failed. **/ int vpu_ipi_send(struct platform_device *pdev, enum ipi_id id, void *buf, unsigned int len); /** * vpu_get_plat_device - get VPU's platform device * * @pdev: the platform device of the module requesting VPU platform * device for using VPU API. * * Return: Return NULL if it is failed. * otherwise it is VPU's platform device **/ struct platform_device *vpu_get_plat_device(struct platform_device *pdev); /** * vpu_wdt_reg_handler - register a VPU watchdog handler * * @pdev: VPU platform device * @vpu_wdt_reset_func: the callback reset function * @private_data: the private data for reset function * @rst_id: reset id * * Register a handler performing own tasks when vpu reset by watchdog * * Return: Return 0 if the handler is added successfully, * otherwise it is failed. * **/ int vpu_wdt_reg_handler(struct platform_device *pdev, void vpu_wdt_reset_func(void *), void *priv, enum rst_id id); /** * vpu_get_vdec_hw_capa - get video decoder hardware capability * * @pdev: VPU platform device * * Return: video decoder hardware capability **/ unsigned int vpu_get_vdec_hw_capa(struct platform_device *pdev); /** * vpu_get_venc_hw_capa - get video encoder hardware capability * * @pdev: VPU platform device * * Return: video encoder hardware capability **/ unsigned int vpu_get_venc_hw_capa(struct platform_device *pdev); /** * vpu_load_firmware - download VPU firmware and boot it * * @pdev: VPU platform device * * Return: Return 0 if downloading firmware successfully, * otherwise it is failed **/ int vpu_load_firmware(struct platform_device *pdev); /** * vpu_mapping_dm_addr - Mapping DTCM/DMEM to kernel virtual address * * @pdev: VPU platform device * @dmem_addr: VPU's data memory address * * Mapping the VPU's DTCM (Data Tightly-Coupled Memory) / * DMEM (Data Extended Memory) memory address to * kernel virtual address. * * Return: Return ERR_PTR(-EINVAL) if mapping failed, * otherwise the mapped kernel virtual address **/ void *vpu_mapping_dm_addr(struct platform_device *pdev, u32 dtcm_dmem_addr); #endif /* _MTK_VPU_H */