162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2007-2016, Synaptics Incorporated 462306a36Sopenharmony_ci * Copyright (C) 2016 Zodiac Inflight Innovations 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef _RMI_F34_H 862306a36Sopenharmony_ci#define _RMI_F34_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* F34 image file offsets. */ 1162306a36Sopenharmony_ci#define F34_FW_IMAGE_OFFSET 0x100 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* F34 register offsets. */ 1462306a36Sopenharmony_ci#define F34_BLOCK_DATA_OFFSET 2 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* F34 commands */ 1762306a36Sopenharmony_ci#define F34_WRITE_FW_BLOCK 0x2 1862306a36Sopenharmony_ci#define F34_ERASE_ALL 0x3 1962306a36Sopenharmony_ci#define F34_READ_CONFIG_BLOCK 0x5 2062306a36Sopenharmony_ci#define F34_WRITE_CONFIG_BLOCK 0x6 2162306a36Sopenharmony_ci#define F34_ERASE_CONFIG 0x7 2262306a36Sopenharmony_ci#define F34_ENABLE_FLASH_PROG 0xf 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define F34_STATUS_IN_PROGRESS 0xff 2562306a36Sopenharmony_ci#define F34_STATUS_IDLE 0x80 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define F34_IDLE_WAIT_MS 500 2862306a36Sopenharmony_ci#define F34_ENABLE_WAIT_MS 300 2962306a36Sopenharmony_ci#define F34_ERASE_WAIT_MS 5000 3062306a36Sopenharmony_ci#define F34_WRITE_WAIT_MS 3000 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define F34_BOOTLOADER_ID_LEN 2 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci/* F34 V7 defines */ 3562306a36Sopenharmony_ci#define V7_FLASH_STATUS_OFFSET 0 3662306a36Sopenharmony_ci#define V7_PARTITION_ID_OFFSET 1 3762306a36Sopenharmony_ci#define V7_BLOCK_NUMBER_OFFSET 2 3862306a36Sopenharmony_ci#define V7_TRANSFER_LENGTH_OFFSET 3 3962306a36Sopenharmony_ci#define V7_COMMAND_OFFSET 4 4062306a36Sopenharmony_ci#define V7_PAYLOAD_OFFSET 5 4162306a36Sopenharmony_ci#define V7_BOOTLOADER_ID_OFFSET 1 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci#define IMAGE_HEADER_VERSION_10 0x10 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#define CONFIG_ID_SIZE 32 4662306a36Sopenharmony_ci#define PRODUCT_ID_SIZE 10 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#define HAS_BSR BIT(5) 5062306a36Sopenharmony_ci#define HAS_CONFIG_ID BIT(3) 5162306a36Sopenharmony_ci#define HAS_GUEST_CODE BIT(6) 5262306a36Sopenharmony_ci#define HAS_DISP_CFG BIT(5) 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci/* F34 V7 commands */ 5562306a36Sopenharmony_ci#define CMD_V7_IDLE 0 5662306a36Sopenharmony_ci#define CMD_V7_ENTER_BL 1 5762306a36Sopenharmony_ci#define CMD_V7_READ 2 5862306a36Sopenharmony_ci#define CMD_V7_WRITE 3 5962306a36Sopenharmony_ci#define CMD_V7_ERASE 4 6062306a36Sopenharmony_ci#define CMD_V7_ERASE_AP 5 6162306a36Sopenharmony_ci#define CMD_V7_SENSOR_ID 6 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#define v7_CMD_IDLE 0 6462306a36Sopenharmony_ci#define v7_CMD_WRITE_FW 1 6562306a36Sopenharmony_ci#define v7_CMD_WRITE_CONFIG 2 6662306a36Sopenharmony_ci#define v7_CMD_WRITE_LOCKDOWN 3 6762306a36Sopenharmony_ci#define v7_CMD_WRITE_GUEST_CODE 4 6862306a36Sopenharmony_ci#define v7_CMD_READ_CONFIG 5 6962306a36Sopenharmony_ci#define v7_CMD_ERASE_ALL 6 7062306a36Sopenharmony_ci#define v7_CMD_ERASE_UI_FIRMWARE 7 7162306a36Sopenharmony_ci#define v7_CMD_ERASE_UI_CONFIG 8 7262306a36Sopenharmony_ci#define v7_CMD_ERASE_BL_CONFIG 9 7362306a36Sopenharmony_ci#define v7_CMD_ERASE_DISP_CONFIG 10 7462306a36Sopenharmony_ci#define v7_CMD_ERASE_FLASH_CONFIG 11 7562306a36Sopenharmony_ci#define v7_CMD_ERASE_GUEST_CODE 12 7662306a36Sopenharmony_ci#define v7_CMD_ENABLE_FLASH_PROG 13 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#define v7_UI_CONFIG_AREA 0 7962306a36Sopenharmony_ci#define v7_PM_CONFIG_AREA 1 8062306a36Sopenharmony_ci#define v7_BL_CONFIG_AREA 2 8162306a36Sopenharmony_ci#define v7_DP_CONFIG_AREA 3 8262306a36Sopenharmony_ci#define v7_FLASH_CONFIG_AREA 4 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* F34 V7 partition IDs */ 8562306a36Sopenharmony_ci#define BOOTLOADER_PARTITION 1 8662306a36Sopenharmony_ci#define DEVICE_CONFIG_PARTITION 2 8762306a36Sopenharmony_ci#define FLASH_CONFIG_PARTITION 3 8862306a36Sopenharmony_ci#define MANUFACTURING_BLOCK_PARTITION 4 8962306a36Sopenharmony_ci#define GUEST_SERIALIZATION_PARTITION 5 9062306a36Sopenharmony_ci#define GLOBAL_PARAMETERS_PARTITION 6 9162306a36Sopenharmony_ci#define CORE_CODE_PARTITION 7 9262306a36Sopenharmony_ci#define CORE_CONFIG_PARTITION 8 9362306a36Sopenharmony_ci#define GUEST_CODE_PARTITION 9 9462306a36Sopenharmony_ci#define DISPLAY_CONFIG_PARTITION 10 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* F34 V7 container IDs */ 9762306a36Sopenharmony_ci#define TOP_LEVEL_CONTAINER 0 9862306a36Sopenharmony_ci#define UI_CONTAINER 1 9962306a36Sopenharmony_ci#define UI_CONFIG_CONTAINER 2 10062306a36Sopenharmony_ci#define BL_CONTAINER 3 10162306a36Sopenharmony_ci#define BL_IMAGE_CONTAINER 4 10262306a36Sopenharmony_ci#define BL_CONFIG_CONTAINER 5 10362306a36Sopenharmony_ci#define BL_LOCKDOWN_INFO_CONTAINER 6 10462306a36Sopenharmony_ci#define PERMANENT_CONFIG_CONTAINER 7 10562306a36Sopenharmony_ci#define GUEST_CODE_CONTAINER 8 10662306a36Sopenharmony_ci#define BL_PROTOCOL_DESCRIPTOR_CONTAINER 9 10762306a36Sopenharmony_ci#define UI_PROTOCOL_DESCRIPTOR_CONTAINER 10 10862306a36Sopenharmony_ci#define RMI_SELF_DISCOVERY_CONTAINER 11 10962306a36Sopenharmony_ci#define RMI_PAGE_CONTENT_CONTAINER 12 11062306a36Sopenharmony_ci#define GENERAL_INFORMATION_CONTAINER 13 11162306a36Sopenharmony_ci#define DEVICE_CONFIG_CONTAINER 14 11262306a36Sopenharmony_ci#define FLASH_CONFIG_CONTAINER 15 11362306a36Sopenharmony_ci#define GUEST_SERIALIZATION_CONTAINER 16 11462306a36Sopenharmony_ci#define GLOBAL_PARAMETERS_CONTAINER 17 11562306a36Sopenharmony_ci#define CORE_CODE_CONTAINER 18 11662306a36Sopenharmony_ci#define CORE_CONFIG_CONTAINER 19 11762306a36Sopenharmony_ci#define DISPLAY_CONFIG_CONTAINER 20 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct f34v7_query_1_7 { 12062306a36Sopenharmony_ci u8 bl_minor_revision; /* query 1 */ 12162306a36Sopenharmony_ci u8 bl_major_revision; 12262306a36Sopenharmony_ci __le32 bl_fw_id; /* query 2 */ 12362306a36Sopenharmony_ci u8 minimum_write_size; /* query 3 */ 12462306a36Sopenharmony_ci __le16 block_size; 12562306a36Sopenharmony_ci __le16 flash_page_size; 12662306a36Sopenharmony_ci __le16 adjustable_partition_area_size; /* query 4 */ 12762306a36Sopenharmony_ci __le16 flash_config_length; /* query 5 */ 12862306a36Sopenharmony_ci __le16 payload_length; /* query 6 */ 12962306a36Sopenharmony_ci u8 partition_support[4]; /* query 7 */ 13062306a36Sopenharmony_ci} __packed; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistruct f34v7_data_1_5 { 13362306a36Sopenharmony_ci u8 partition_id; 13462306a36Sopenharmony_ci __le16 block_offset; 13562306a36Sopenharmony_ci __le16 transfer_length; 13662306a36Sopenharmony_ci u8 command; 13762306a36Sopenharmony_ci u8 payload[2]; 13862306a36Sopenharmony_ci} __packed; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistruct block_data { 14162306a36Sopenharmony_ci const void *data; 14262306a36Sopenharmony_ci int size; 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_cistruct partition_table { 14662306a36Sopenharmony_ci u8 partition_id; 14762306a36Sopenharmony_ci u8 byte_1_reserved; 14862306a36Sopenharmony_ci __le16 partition_length; 14962306a36Sopenharmony_ci __le16 start_physical_address; 15062306a36Sopenharmony_ci __le16 partition_properties; 15162306a36Sopenharmony_ci} __packed; 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistruct physical_address { 15462306a36Sopenharmony_ci u16 ui_firmware; 15562306a36Sopenharmony_ci u16 ui_config; 15662306a36Sopenharmony_ci u16 dp_config; 15762306a36Sopenharmony_ci u16 guest_code; 15862306a36Sopenharmony_ci}; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_cistruct container_descriptor { 16162306a36Sopenharmony_ci __le32 content_checksum; 16262306a36Sopenharmony_ci __le16 container_id; 16362306a36Sopenharmony_ci u8 minor_version; 16462306a36Sopenharmony_ci u8 major_version; 16562306a36Sopenharmony_ci u8 reserved_08; 16662306a36Sopenharmony_ci u8 reserved_09; 16762306a36Sopenharmony_ci u8 reserved_0a; 16862306a36Sopenharmony_ci u8 reserved_0b; 16962306a36Sopenharmony_ci u8 container_option_flags[4]; 17062306a36Sopenharmony_ci __le32 content_options_length; 17162306a36Sopenharmony_ci __le32 content_options_address; 17262306a36Sopenharmony_ci __le32 content_length; 17362306a36Sopenharmony_ci __le32 content_address; 17462306a36Sopenharmony_ci} __packed; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistruct block_count { 17762306a36Sopenharmony_ci u16 ui_firmware; 17862306a36Sopenharmony_ci u16 ui_config; 17962306a36Sopenharmony_ci u16 dp_config; 18062306a36Sopenharmony_ci u16 fl_config; 18162306a36Sopenharmony_ci u16 pm_config; 18262306a36Sopenharmony_ci u16 bl_config; 18362306a36Sopenharmony_ci u16 lockdown; 18462306a36Sopenharmony_ci u16 guest_code; 18562306a36Sopenharmony_ci}; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_cistruct image_header_10 { 18862306a36Sopenharmony_ci __le32 checksum; 18962306a36Sopenharmony_ci u8 reserved_04; 19062306a36Sopenharmony_ci u8 reserved_05; 19162306a36Sopenharmony_ci u8 minor_header_version; 19262306a36Sopenharmony_ci u8 major_header_version; 19362306a36Sopenharmony_ci u8 reserved_08; 19462306a36Sopenharmony_ci u8 reserved_09; 19562306a36Sopenharmony_ci u8 reserved_0a; 19662306a36Sopenharmony_ci u8 reserved_0b; 19762306a36Sopenharmony_ci __le32 top_level_container_start_addr; 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistruct image_metadata { 20162306a36Sopenharmony_ci bool contains_firmware_id; 20262306a36Sopenharmony_ci bool contains_bootloader; 20362306a36Sopenharmony_ci bool contains_display_cfg; 20462306a36Sopenharmony_ci bool contains_guest_code; 20562306a36Sopenharmony_ci bool contains_flash_config; 20662306a36Sopenharmony_ci unsigned int firmware_id; 20762306a36Sopenharmony_ci unsigned int checksum; 20862306a36Sopenharmony_ci unsigned int bootloader_size; 20962306a36Sopenharmony_ci unsigned int display_cfg_offset; 21062306a36Sopenharmony_ci unsigned char bl_version; 21162306a36Sopenharmony_ci unsigned char product_id[PRODUCT_ID_SIZE + 1]; 21262306a36Sopenharmony_ci unsigned char cstmr_product_id[PRODUCT_ID_SIZE + 1]; 21362306a36Sopenharmony_ci struct block_data bootloader; 21462306a36Sopenharmony_ci struct block_data ui_firmware; 21562306a36Sopenharmony_ci struct block_data ui_config; 21662306a36Sopenharmony_ci struct block_data dp_config; 21762306a36Sopenharmony_ci struct block_data fl_config; 21862306a36Sopenharmony_ci struct block_data bl_config; 21962306a36Sopenharmony_ci struct block_data guest_code; 22062306a36Sopenharmony_ci struct block_data lockdown; 22162306a36Sopenharmony_ci struct block_count blkcount; 22262306a36Sopenharmony_ci struct physical_address phyaddr; 22362306a36Sopenharmony_ci}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_cistruct rmi_f34_firmware { 22662306a36Sopenharmony_ci __le32 checksum; 22762306a36Sopenharmony_ci u8 pad1[3]; 22862306a36Sopenharmony_ci u8 bootloader_version; 22962306a36Sopenharmony_ci __le32 image_size; 23062306a36Sopenharmony_ci __le32 config_size; 23162306a36Sopenharmony_ci u8 product_id[10]; 23262306a36Sopenharmony_ci u8 product_info[2]; 23362306a36Sopenharmony_ci u8 pad2[228]; 23462306a36Sopenharmony_ci u8 data[]; 23562306a36Sopenharmony_ci}; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_cistruct f34v5_data { 23862306a36Sopenharmony_ci u16 block_size; 23962306a36Sopenharmony_ci u16 fw_blocks; 24062306a36Sopenharmony_ci u16 config_blocks; 24162306a36Sopenharmony_ci u16 ctrl_address; 24262306a36Sopenharmony_ci u8 status; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci struct completion cmd_done; 24562306a36Sopenharmony_ci struct mutex flash_mutex; 24662306a36Sopenharmony_ci}; 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_cistruct f34v7_data { 24962306a36Sopenharmony_ci bool has_display_cfg; 25062306a36Sopenharmony_ci bool has_guest_code; 25162306a36Sopenharmony_ci bool in_bl_mode; 25262306a36Sopenharmony_ci u8 *read_config_buf; 25362306a36Sopenharmony_ci size_t read_config_buf_size; 25462306a36Sopenharmony_ci u8 command; 25562306a36Sopenharmony_ci u8 flash_status; 25662306a36Sopenharmony_ci u16 block_size; 25762306a36Sopenharmony_ci u16 config_block_count; 25862306a36Sopenharmony_ci u16 config_size; 25962306a36Sopenharmony_ci u16 config_area; 26062306a36Sopenharmony_ci u16 flash_config_length; 26162306a36Sopenharmony_ci u16 payload_length; 26262306a36Sopenharmony_ci u8 partitions; 26362306a36Sopenharmony_ci u16 partition_table_bytes; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci struct block_count blkcount; 26662306a36Sopenharmony_ci struct physical_address phyaddr; 26762306a36Sopenharmony_ci struct image_metadata img; 26862306a36Sopenharmony_ci 26962306a36Sopenharmony_ci const void *config_data; 27062306a36Sopenharmony_ci const void *image; 27162306a36Sopenharmony_ci struct completion cmd_done; 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistruct f34_data { 27562306a36Sopenharmony_ci struct rmi_function *fn; 27662306a36Sopenharmony_ci 27762306a36Sopenharmony_ci u8 bl_version; 27862306a36Sopenharmony_ci unsigned char bootloader_id[5]; 27962306a36Sopenharmony_ci unsigned char configuration_id[CONFIG_ID_SIZE*2 + 1]; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci int update_status; 28262306a36Sopenharmony_ci int update_progress; 28362306a36Sopenharmony_ci int update_size; 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci union { 28662306a36Sopenharmony_ci struct f34v5_data v5; 28762306a36Sopenharmony_ci struct f34v7_data v7; 28862306a36Sopenharmony_ci }; 28962306a36Sopenharmony_ci}; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ciint rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw); 29262306a36Sopenharmony_ciint rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw); 29362306a36Sopenharmony_ciint rmi_f34v7_probe(struct f34_data *f34); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci#endif /* _RMI_F34_H */ 296