1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 /* 3 * Rockchip HDCP Host Library driver 4 * 5 * Copyright (C) 2022 Rockchip Electronics Co., Ltd 6 */ 7 8 #ifndef _DW_HDCP_HOST_LIB_DRIVER_LINUX_IF_H_ 9 #define _DW_HDCP_HOST_LIB_DRIVER_LINUX_IF_H_ 10 11 #include <linux/ioctl.h> 12 #include <linux/types.h> 13 14 #define HL_DRIVER_ALLOCATE_DYNAMIC_MEM 0xffffffff 15 /* hl_drv_ioctl numbers */ 16 enum { 17 HL_DRV_NR_MIN = 0x10, 18 HL_DRV_NR_INIT, 19 HL_DRV_NR_MEMINFO, 20 HL_DRV_NR_LOAD_CODE, 21 HL_DRV_NR_READ_DATA, 22 HL_DRV_NR_WRITE_DATA, 23 HL_DRV_NR_MEMSET_DATA, 24 HL_DRV_NR_READ_HPI, 25 HL_DRV_NR_WRITE_HPI, 26 27 RK_DRV_NR_GET_STATUS, 28 RK_DRV_NR_RESET, 29 30 HL_DRV_NR_MAX 31 }; 32 33 /* 34 * HL_DRV_IOC_INIT: associate file descriptor with the indicated memory. This 35 * must be called before any other hl_drv_ioctl on the file descriptor. 36 * 37 * - hpi_base = base address of HPI registers. 38 * - code_base = base address of firmware memory (0 to allocate internally) 39 * - data_base = base address of data memory (0 to allocate internally) 40 * - code_len, data_len = length of firmware and data memory, respectively. 41 */ 42 #define HL_DRV_IOC_INIT _IOW('H', HL_DRV_NR_INIT, struct hl_drv_ioc_meminfo) 43 44 /* 45 * HL_DRV_IOC_MEMINFO: retrieve memory information from file descriptor. 46 * 47 * Fills out the meminfo struct, returning the values passed to HL_DRV_IOC_INIT 48 * except that the actual base addresses of internal allocations (if any) are 49 * reported. 50 */ 51 #define HL_DRV_IOC_MEMINFO _IOR('H', HL_DRV_NR_MEMINFO, struct hl_drv_ioc_meminfo) 52 53 struct hl_drv_ioc_meminfo { 54 __u32 hpi_base; 55 __u32 code_base; 56 __u32 code_size; 57 __u32 data_base; 58 __u32 data_size; 59 }; 60 61 /* 62 * HL_DRV_IOC_LOAD_CODE: write the provided buffer to the firmware memory. 63 * 64 * - len = number of bytes in data buffer 65 * - data = data to write to firmware memory. 66 * 67 * This can only be done once (successfully). Subsequent attempts will 68 * return -EBUSY. 69 */ 70 #define HL_DRV_IOC_LOAD_CODE _IOW('H', HL_DRV_NR_LOAD_CODE, struct hl_drv_ioc_code) 71 72 struct hl_drv_ioc_code { 73 __u32 len; 74 __u8 data[]; 75 }; 76 77 /* 78 * HL_DRV_IOC_READ_DATA: copy from data memory. 79 * HL_DRV_IOC_WRITE_DATA: copy to data memory. 80 * 81 * - offset = start copying at this byte offset into the data memory. 82 * - len = number of bytes to copy. 83 * - data = for write, buffer containing data to copy. 84 * for read, buffer to which read data will be written. 85 * 86 */ 87 #define HL_DRV_IOC_READ_DATA _IOWR('H', HL_DRV_NR_READ_DATA, struct hl_drv_ioc_data) 88 #define HL_DRV_IOC_WRITE_DATA _IOW('H', HL_DRV_NR_WRITE_DATA, struct hl_drv_ioc_data) 89 90 /* 91 * HL_DRV_IOC_MEMSET_DATA: initialize data memory. 92 * 93 * - offset = start initializatoin at this byte offset into the data memory. 94 * - len = number of bytes to set. 95 * - data[0] = byte value to write to all indicated memory locations. 96 */ 97 #define HL_DRV_IOC_MEMSET_DATA _IOW('H', HL_DRV_NR_MEMSET_DATA, struct hl_drv_ioc_data) 98 99 struct hl_drv_ioc_data { 100 __u32 offset; 101 __u32 len; 102 __u8 data[]; 103 }; 104 105 /* 106 * HL_DRV_IOC_READ_HPI: read HPI register. 107 * HL_DRV_IOC_WRITE_HPI: write HPI register. 108 * 109 * - offset = byte offset of HPI register to access. 110 * - value = for write, value to write. 111 * for read, location to which result is stored. 112 */ 113 #define HL_DRV_IOC_READ_HPI _IOWR('H', HL_DRV_NR_READ_HPI, struct hl_drv_ioc_hpi_reg) 114 #define HL_DRV_IOC_WRITE_HPI _IOW('H', HL_DRV_NR_WRITE_HPI, struct hl_drv_ioc_hpi_reg) 115 116 struct hl_drv_ioc_hpi_reg { 117 __u32 offset; 118 __u32 value; 119 }; 120 121 #define RK_DRV_IOC_GET_STATUS _IOR('H', RK_DRV_NR_GET_STATUS, struct hl_drv_ioc_status) 122 123 struct hl_drv_ioc_status { 124 __u32 connected_status; 125 __u32 booted_status; 126 }; 127 128 #define RK_DRV_IOC_RESET _IOR('H', RK_DRV_NR_RESET, __u32) 129 130 #endif /* _DW_HDCP_HOST_LIB_DRIVER_LINUX_IF_H_ */ 131