root/drivers/input/rmi4/rmi_f34.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Copyright (c) 2007-2016, Synaptics Incorporated
   4  * Copyright (C) 2016 Zodiac Inflight Innovations
   5  */
   6 
   7 #ifndef _RMI_F34_H
   8 #define _RMI_F34_H
   9 
  10 /* F34 image file offsets. */
  11 #define F34_FW_IMAGE_OFFSET     0x100
  12 
  13 /* F34 register offsets. */
  14 #define F34_BLOCK_DATA_OFFSET   2
  15 
  16 /* F34 commands */
  17 #define F34_WRITE_FW_BLOCK      0x2
  18 #define F34_ERASE_ALL           0x3
  19 #define F34_READ_CONFIG_BLOCK   0x5
  20 #define F34_WRITE_CONFIG_BLOCK  0x6
  21 #define F34_ERASE_CONFIG        0x7
  22 #define F34_ENABLE_FLASH_PROG   0xf
  23 
  24 #define F34_STATUS_IN_PROGRESS  0xff
  25 #define F34_STATUS_IDLE         0x80
  26 
  27 #define F34_IDLE_WAIT_MS        500
  28 #define F34_ENABLE_WAIT_MS      300
  29 #define F34_ERASE_WAIT_MS       5000
  30 #define F34_WRITE_WAIT_MS       3000
  31 
  32 #define F34_BOOTLOADER_ID_LEN   2
  33 
  34 /* F34 V7 defines */
  35 #define V7_FLASH_STATUS_OFFSET          0
  36 #define V7_PARTITION_ID_OFFSET          1
  37 #define V7_BLOCK_NUMBER_OFFSET          2
  38 #define V7_TRANSFER_LENGTH_OFFSET       3
  39 #define V7_COMMAND_OFFSET               4
  40 #define V7_PAYLOAD_OFFSET               5
  41 #define V7_BOOTLOADER_ID_OFFSET         1
  42 
  43 #define IMAGE_HEADER_VERSION_10         0x10
  44 
  45 #define CONFIG_ID_SIZE                  32
  46 #define PRODUCT_ID_SIZE                 10
  47 
  48 
  49 #define HAS_BSR                         BIT(5)
  50 #define HAS_CONFIG_ID                   BIT(3)
  51 #define HAS_GUEST_CODE                  BIT(6)
  52 #define HAS_DISP_CFG                    BIT(5)
  53 
  54 /* F34 V7 commands */
  55 #define CMD_V7_IDLE                     0
  56 #define CMD_V7_ENTER_BL                 1
  57 #define CMD_V7_READ                     2
  58 #define CMD_V7_WRITE                    3
  59 #define CMD_V7_ERASE                    4
  60 #define CMD_V7_ERASE_AP                 5
  61 #define CMD_V7_SENSOR_ID                6
  62 
  63 #define v7_CMD_IDLE                     0
  64 #define v7_CMD_WRITE_FW                 1
  65 #define v7_CMD_WRITE_CONFIG             2
  66 #define v7_CMD_WRITE_LOCKDOWN           3
  67 #define v7_CMD_WRITE_GUEST_CODE         4
  68 #define v7_CMD_READ_CONFIG              5
  69 #define v7_CMD_ERASE_ALL                6
  70 #define v7_CMD_ERASE_UI_FIRMWARE        7
  71 #define v7_CMD_ERASE_UI_CONFIG          8
  72 #define v7_CMD_ERASE_BL_CONFIG          9
  73 #define v7_CMD_ERASE_DISP_CONFIG        10
  74 #define v7_CMD_ERASE_FLASH_CONFIG       11
  75 #define v7_CMD_ERASE_GUEST_CODE         12
  76 #define v7_CMD_ENABLE_FLASH_PROG        13
  77 
  78 #define v7_UI_CONFIG_AREA               0
  79 #define v7_PM_CONFIG_AREA               1
  80 #define v7_BL_CONFIG_AREA               2
  81 #define v7_DP_CONFIG_AREA               3
  82 #define v7_FLASH_CONFIG_AREA            4
  83 
  84 /* F34 V7 partition IDs */
  85 #define BOOTLOADER_PARTITION            1
  86 #define DEVICE_CONFIG_PARTITION         2
  87 #define FLASH_CONFIG_PARTITION          3
  88 #define MANUFACTURING_BLOCK_PARTITION   4
  89 #define GUEST_SERIALIZATION_PARTITION   5
  90 #define GLOBAL_PARAMETERS_PARTITION     6
  91 #define CORE_CODE_PARTITION             7
  92 #define CORE_CONFIG_PARTITION           8
  93 #define GUEST_CODE_PARTITION            9
  94 #define DISPLAY_CONFIG_PARTITION        10
  95 
  96 /* F34 V7 container IDs */
  97 #define TOP_LEVEL_CONTAINER                     0
  98 #define UI_CONTAINER                            1
  99 #define UI_CONFIG_CONTAINER                     2
 100 #define BL_CONTAINER                            3
 101 #define BL_IMAGE_CONTAINER                      4
 102 #define BL_CONFIG_CONTAINER                     5
 103 #define BL_LOCKDOWN_INFO_CONTAINER              6
 104 #define PERMANENT_CONFIG_CONTAINER              7
 105 #define GUEST_CODE_CONTAINER                    8
 106 #define BL_PROTOCOL_DESCRIPTOR_CONTAINER        9
 107 #define UI_PROTOCOL_DESCRIPTOR_CONTAINER        10
 108 #define RMI_SELF_DISCOVERY_CONTAINER            11
 109 #define RMI_PAGE_CONTENT_CONTAINER              12
 110 #define GENERAL_INFORMATION_CONTAINER           13
 111 #define DEVICE_CONFIG_CONTAINER                 14
 112 #define FLASH_CONFIG_CONTAINER                  15
 113 #define GUEST_SERIALIZATION_CONTAINER           16
 114 #define GLOBAL_PARAMETERS_CONTAINER             17
 115 #define CORE_CODE_CONTAINER                     18
 116 #define CORE_CONFIG_CONTAINER                   19
 117 #define DISPLAY_CONFIG_CONTAINER                20
 118 
 119 struct f34v7_query_1_7 {
 120         u8 bl_minor_revision;                   /* query 1 */
 121         u8 bl_major_revision;
 122         __le32 bl_fw_id;                        /* query 2 */
 123         u8 minimum_write_size;                  /* query 3 */
 124         __le16 block_size;
 125         __le16 flash_page_size;
 126         __le16 adjustable_partition_area_size;  /* query 4 */
 127         __le16 flash_config_length;             /* query 5 */
 128         __le16 payload_length;                  /* query 6 */
 129         u8 partition_support[4];                /* query 7 */
 130 } __packed;
 131 
 132 struct f34v7_data_1_5 {
 133         u8 partition_id;
 134         __le16 block_offset;
 135         __le16 transfer_length;
 136         u8 command;
 137         u8 payload[2];
 138 } __packed;
 139 
 140 struct block_data {
 141         const void *data;
 142         int size;
 143 };
 144 
 145 struct partition_table {
 146         u8 partition_id;
 147         u8 byte_1_reserved;
 148         __le16 partition_length;
 149         __le16 start_physical_address;
 150         __le16 partition_properties;
 151 } __packed;
 152 
 153 struct physical_address {
 154         u16 ui_firmware;
 155         u16 ui_config;
 156         u16 dp_config;
 157         u16 guest_code;
 158 };
 159 
 160 struct container_descriptor {
 161         __le32 content_checksum;
 162         __le16 container_id;
 163         u8 minor_version;
 164         u8 major_version;
 165         u8 reserved_08;
 166         u8 reserved_09;
 167         u8 reserved_0a;
 168         u8 reserved_0b;
 169         u8 container_option_flags[4];
 170         __le32 content_options_length;
 171         __le32 content_options_address;
 172         __le32 content_length;
 173         __le32 content_address;
 174 } __packed;
 175 
 176 struct block_count {
 177         u16 ui_firmware;
 178         u16 ui_config;
 179         u16 dp_config;
 180         u16 fl_config;
 181         u16 pm_config;
 182         u16 bl_config;
 183         u16 lockdown;
 184         u16 guest_code;
 185 };
 186 
 187 struct image_header_10 {
 188         __le32 checksum;
 189         u8 reserved_04;
 190         u8 reserved_05;
 191         u8 minor_header_version;
 192         u8 major_header_version;
 193         u8 reserved_08;
 194         u8 reserved_09;
 195         u8 reserved_0a;
 196         u8 reserved_0b;
 197         __le32 top_level_container_start_addr;
 198 };
 199 
 200 struct image_metadata {
 201         bool contains_firmware_id;
 202         bool contains_bootloader;
 203         bool contains_display_cfg;
 204         bool contains_guest_code;
 205         bool contains_flash_config;
 206         unsigned int firmware_id;
 207         unsigned int checksum;
 208         unsigned int bootloader_size;
 209         unsigned int display_cfg_offset;
 210         unsigned char bl_version;
 211         unsigned char product_id[PRODUCT_ID_SIZE + 1];
 212         unsigned char cstmr_product_id[PRODUCT_ID_SIZE + 1];
 213         struct block_data bootloader;
 214         struct block_data ui_firmware;
 215         struct block_data ui_config;
 216         struct block_data dp_config;
 217         struct block_data fl_config;
 218         struct block_data bl_config;
 219         struct block_data guest_code;
 220         struct block_data lockdown;
 221         struct block_count blkcount;
 222         struct physical_address phyaddr;
 223 };
 224 
 225 struct register_offset {
 226         u8 properties;
 227         u8 properties_2;
 228         u8 block_size;
 229         u8 block_count;
 230         u8 gc_block_count;
 231         u8 flash_status;
 232         u8 partition_id;
 233         u8 block_number;
 234         u8 transfer_length;
 235         u8 flash_cmd;
 236         u8 payload;
 237 };
 238 
 239 struct rmi_f34_firmware {
 240         __le32 checksum;
 241         u8 pad1[3];
 242         u8 bootloader_version;
 243         __le32 image_size;
 244         __le32 config_size;
 245         u8 product_id[10];
 246         u8 product_info[2];
 247         u8 pad2[228];
 248         u8 data[];
 249 };
 250 
 251 struct f34v5_data {
 252         u16 block_size;
 253         u16 fw_blocks;
 254         u16 config_blocks;
 255         u16 ctrl_address;
 256         u8 status;
 257 
 258         struct completion cmd_done;
 259         struct mutex flash_mutex;
 260 };
 261 
 262 struct f34v7_data {
 263         bool has_display_cfg;
 264         bool has_guest_code;
 265         bool force_update;
 266         bool in_bl_mode;
 267         u8 *read_config_buf;
 268         size_t read_config_buf_size;
 269         u8 command;
 270         u8 flash_status;
 271         u16 block_size;
 272         u16 config_block_count;
 273         u16 config_size;
 274         u16 config_area;
 275         u16 flash_config_length;
 276         u16 payload_length;
 277         u8 partitions;
 278         u16 partition_table_bytes;
 279         bool new_partition_table;
 280 
 281         struct register_offset off;
 282         struct block_count blkcount;
 283         struct physical_address phyaddr;
 284         struct image_metadata img;
 285 
 286         const void *config_data;
 287         const void *image;
 288         struct completion cmd_done;
 289 };
 290 
 291 struct f34_data {
 292         struct rmi_function *fn;
 293 
 294         u8 bl_version;
 295         unsigned char bootloader_id[5];
 296         unsigned char configuration_id[CONFIG_ID_SIZE*2 + 1];
 297 
 298         int update_status;
 299         int update_progress;
 300         int update_size;
 301 
 302         union {
 303                 struct f34v5_data v5;
 304                 struct f34v7_data v7;
 305         };
 306 };
 307 
 308 int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw);
 309 int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw);
 310 int rmi_f34v7_probe(struct f34_data *f34);
 311 
 312 #endif /* _RMI_F34_H */

/* [<][>][^][v][top][bottom][index][help] */