| /* |
| * Copyright (C) 2018 MediaTek Inc. |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| * See http://www.gnu.org/licenses/gpl-2.0.html for more details. |
| */ |
| |
| #ifndef UFS_MTK_IOCTL_H__ |
| #define UFS_MTK_IOCTL_H__ |
| |
| #include <linux/types.h> |
| |
| /* |
| * IOCTL opcode for ufs ffu has the following opcode after |
| * Following the last SCSI IOCTL opcode. |
| */ |
| #define UFS_IOCTL_QUERY 0x5388 /* Query descriptors, attr/flags */ |
| #define UFS_IOCTL_FFU 0x5389 /* Do firmware upgrade */ |
| #define UFS_IOCTL_GET_FW_VER 0x5390 /* Query production revision level */ |
| #define UFS_IOCTL_RPMB 0x5391 /* For RPMB access */ |
| |
| #if defined(CONFIG_UFSFEATURE) |
| #define UFSFEATURE_QUERY_OPCODE 0x5500 |
| #endif |
| |
| #define UFS_IOCTL_FFU_MAX_FW_SIZE_BYTES (512L * 1024) |
| #define UFS_IOCTL_FFU_MAX_FW_VER_BYTES (4) |
| #define UFS_IOCTL_FFU_MAX_FW_VER_STRING_DESCR_BYTES (10) |
| |
| struct ufs_ioctl_query_data { |
| /* |
| * User should select one of the opcode defined in "enum query_opcode". |
| * Please check include/uapi/scsi/ufs/ufs.h for the definition of it. |
| * Note that only UPIU_QUERY_OPCODE_READ_DESC, |
| * UPIU_QUERY_OPCODE_READ_ATTR & UPIU_QUERY_OPCODE_READ_FLAG are |
| * supported as of now. All other query_opcode would be considered |
| * invalid. |
| * As of now only read query operations are supported. |
| */ |
| __u32 opcode; |
| /* |
| * User should select one of the idn from "enum flag_idn" or "enum |
| * attr_idn" or "enum desc_idn" based on whether opcode above is |
| * attribute, flag or descriptor. |
| * Please check include/uapi/scsi/ufs/ufs.h for the definition of it. |
| */ |
| __u8 idn; |
| __u8 idx; |
| /* |
| * User should specify the size of the buffer (buffer[0] below) where |
| * it wants to read the query data (attribute/flag/descriptor). |
| * As we might end up reading less data then what is specified in |
| * buf_size. So we are updating buf_size to what exactly we have read. |
| */ |
| __u16 buf_byte; |
| /* |
| * placeholder for the start of the data buffer where kernel will copy |
| * the query data (attribute/flag/descriptor) read from the UFS device |
| * Note: |
| * For Read Attribute you will have to allocate 4 bytes |
| * For Read Flag you will have to allocate 1 byte |
| */ |
| __u8 *buf_ptr; |
| }; |
| |
| struct ufs_ioctl_query_data_hpb { |
| /* |
| * User should select one of the opcode defined in "enum query_opcode". |
| * Please check include/uapi/scsi/ufs/ufs.h for the definition of it. |
| * Note that only UPIU_QUERY_OPCODE_READ_DESC, |
| * UPIU_QUERY_OPCODE_READ_ATTR & UPIU_QUERY_OPCODE_READ_FLAG are |
| * supported as of now. All other query_opcode would be considered |
| * invalid. |
| * As of now only read query operations are supported. |
| */ |
| __u32 opcode; |
| /* |
| * User should select one of the idn from "enum flag_idn" or "enum |
| * attr_idn" or "enum desc_idn" based on whether opcode above is |
| * attribute, flag or descriptor. |
| * Please check include/uapi/scsi/ufs/ufs.h for the definition of it. |
| */ |
| __u8 idn; |
| /* |
| * User should specify the size of the buffer (buffer[0] below) where |
| * it wants to read the query data (attribute/flag/descriptor). |
| * As we might end up reading less data then what is specified in |
| * buf_size. So we are updating buf_size to what exactly we have read. |
| */ |
| __u16 buf_size; |
| /* |
| * placeholder for the start of the data buffer where kernel will copy |
| * the query data (attribute/flag/descriptor) read from the UFS device |
| * Note: |
| * For Read Attribute you will have to allocate 4 bytes |
| * For Read Flag you will have to allocate 1 byte |
| */ |
| __u8 buffer[0]; |
| }; |
| |
| /** |
| * struct ufs_ioctl_ffu - used to transfer data to and from user via ioctl |
| * @buf_size: number of allocated bytes/data size on return |
| * @buf_ptr: data location |
| */ |
| struct ufs_ioctl_ffu_data { |
| /* |
| * User should specify the size of the buffer (buf_ptr below) where |
| * it wants to transfer firmware image. |
| * |
| * Note: use __u32 here because FFU data may exceed 64 KB |
| * (limit of __u16). |
| */ |
| __u32 buf_byte; |
| |
| /* |
| * placeholder for the start address of the data buffer where kernel |
| * will copy |
| * the data. |
| */ |
| __u8 *buf_ptr; |
| }; |
| |
| /** |
| * struct ufs_ioctl_ffu - used to transfer data to and from user via ioctl |
| * @buf_size: number of allocated bytes/data size on return |
| * @buf_ptr: data location |
| */ |
| struct ufs_ioctl_query_fw_ver_data { |
| /* |
| * User should specify the size of the buffer (buf_ptr below) where |
| * it wants to read firmware version data. |
| */ |
| __u16 buf_byte; |
| |
| /* |
| * placeholder for the start address of the data buffer where kernel |
| * will copy |
| * the data. |
| */ |
| __u8 *buf_ptr; |
| }; |
| |
| #endif /* UFS_MTK_IOCTL_H__ */ |
| |