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