Linux Audio

Check our new training course

Loading...
v6.13.7
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2016, Zodiac Inflight Innovations
   4 * Copyright (c) 2007-2016, Synaptics Incorporated
   5 * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
   6 * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
   7 */
   8
   9#include <linux/bitops.h>
  10#include <linux/kernel.h>
  11#include <linux/rmi.h>
  12#include <linux/firmware.h>
  13#include <linux/delay.h>
  14#include <linux/slab.h>
  15#include <linux/jiffies.h>
  16#include <linux/unaligned.h>
  17
  18#include "rmi_driver.h"
  19#include "rmi_f34.h"
  20
  21static int rmi_f34v7_read_flash_status(struct f34_data *f34)
  22{
  23	u8 status;
  24	u8 command;
  25	int ret;
  26
  27	ret = rmi_read_block(f34->fn->rmi_dev,
  28			f34->fn->fd.data_base_addr + V7_FLASH_STATUS_OFFSET,
  29			&status,
  30			sizeof(status));
  31	if (ret < 0) {
  32		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
  33			"%s: Error %d reading flash status\n", __func__, ret);
  34		return ret;
  35	}
  36
  37	f34->v7.in_bl_mode = status >> 7;
  38	f34->v7.flash_status = status & 0x1f;
  39
  40	if (f34->v7.flash_status != 0x00) {
  41		dev_err(&f34->fn->dev, "%s: status=%d, command=0x%02x\n",
  42			__func__, f34->v7.flash_status, f34->v7.command);
  43	}
  44
  45	ret = rmi_read_block(f34->fn->rmi_dev,
  46			f34->fn->fd.data_base_addr + V7_COMMAND_OFFSET,
  47			&command,
  48			sizeof(command));
  49	if (ret < 0) {
  50		dev_err(&f34->fn->dev, "%s: Failed to read flash command\n",
  51			__func__);
  52		return ret;
  53	}
  54
  55	f34->v7.command = command;
  56
  57	return 0;
  58}
  59
  60static int rmi_f34v7_wait_for_idle(struct f34_data *f34, int timeout_ms)
  61{
  62	unsigned long timeout;
  63
  64	timeout = msecs_to_jiffies(timeout_ms);
  65
  66	if (!wait_for_completion_timeout(&f34->v7.cmd_done, timeout)) {
  67		dev_warn(&f34->fn->dev, "%s: Timed out waiting for idle status\n",
  68			 __func__);
  69		return -ETIMEDOUT;
  70	}
  71
  72	return 0;
  73}
  74
  75static int rmi_f34v7_check_command_status(struct f34_data *f34, int timeout_ms)
  76{
  77	int ret;
  78
  79	ret = rmi_f34v7_wait_for_idle(f34, timeout_ms);
  80	if (ret < 0)
  81		return ret;
  82
  83	ret = rmi_f34v7_read_flash_status(f34);
  84	if (ret < 0)
  85		return ret;
  86
  87	if (f34->v7.flash_status != 0x00)
  88		return -EIO;
  89
  90	return 0;
  91}
  92
  93static int rmi_f34v7_write_command_single_transaction(struct f34_data *f34,
  94						      u8 cmd)
  95{
  96	int ret;
  97	u8 base;
  98	struct f34v7_data_1_5 data_1_5;
  99
 100	base = f34->fn->fd.data_base_addr;
 101
 102	memset(&data_1_5, 0, sizeof(data_1_5));
 103
 104	switch (cmd) {
 105	case v7_CMD_ERASE_ALL:
 106		data_1_5.partition_id = CORE_CODE_PARTITION;
 107		data_1_5.command = CMD_V7_ERASE_AP;
 108		break;
 109	case v7_CMD_ERASE_UI_FIRMWARE:
 110		data_1_5.partition_id = CORE_CODE_PARTITION;
 111		data_1_5.command = CMD_V7_ERASE;
 112		break;
 113	case v7_CMD_ERASE_BL_CONFIG:
 114		data_1_5.partition_id = GLOBAL_PARAMETERS_PARTITION;
 115		data_1_5.command = CMD_V7_ERASE;
 116		break;
 117	case v7_CMD_ERASE_UI_CONFIG:
 118		data_1_5.partition_id = CORE_CONFIG_PARTITION;
 119		data_1_5.command = CMD_V7_ERASE;
 120		break;
 121	case v7_CMD_ERASE_DISP_CONFIG:
 122		data_1_5.partition_id = DISPLAY_CONFIG_PARTITION;
 123		data_1_5.command = CMD_V7_ERASE;
 124		break;
 125	case v7_CMD_ERASE_FLASH_CONFIG:
 126		data_1_5.partition_id = FLASH_CONFIG_PARTITION;
 127		data_1_5.command = CMD_V7_ERASE;
 128		break;
 129	case v7_CMD_ERASE_GUEST_CODE:
 130		data_1_5.partition_id = GUEST_CODE_PARTITION;
 131		data_1_5.command = CMD_V7_ERASE;
 132		break;
 133	case v7_CMD_ENABLE_FLASH_PROG:
 134		data_1_5.partition_id = BOOTLOADER_PARTITION;
 135		data_1_5.command = CMD_V7_ENTER_BL;
 136		break;
 137	}
 138
 139	data_1_5.payload[0] = f34->bootloader_id[0];
 140	data_1_5.payload[1] = f34->bootloader_id[1];
 141
 142	ret = rmi_write_block(f34->fn->rmi_dev,
 143			base + V7_PARTITION_ID_OFFSET,
 144			&data_1_5, sizeof(data_1_5));
 145	if (ret < 0) {
 146		dev_err(&f34->fn->dev,
 147			"%s: Failed to write single transaction command\n",
 148			__func__);
 149		return ret;
 150	}
 151
 152	return 0;
 153}
 154
 155static int rmi_f34v7_write_command(struct f34_data *f34, u8 cmd)
 156{
 157	int ret;
 158	u8 base;
 159	u8 command;
 160
 161	base = f34->fn->fd.data_base_addr;
 162
 163	switch (cmd) {
 164	case v7_CMD_WRITE_FW:
 165	case v7_CMD_WRITE_CONFIG:
 166	case v7_CMD_WRITE_GUEST_CODE:
 167		command = CMD_V7_WRITE;
 168		break;
 169	case v7_CMD_READ_CONFIG:
 170		command = CMD_V7_READ;
 171		break;
 172	case v7_CMD_ERASE_ALL:
 173		command = CMD_V7_ERASE_AP;
 174		break;
 175	case v7_CMD_ERASE_UI_FIRMWARE:
 176	case v7_CMD_ERASE_BL_CONFIG:
 177	case v7_CMD_ERASE_UI_CONFIG:
 178	case v7_CMD_ERASE_DISP_CONFIG:
 179	case v7_CMD_ERASE_FLASH_CONFIG:
 180	case v7_CMD_ERASE_GUEST_CODE:
 181		command = CMD_V7_ERASE;
 182		break;
 183	case v7_CMD_ENABLE_FLASH_PROG:
 184		command = CMD_V7_ENTER_BL;
 185		break;
 186	default:
 187		dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n",
 188			__func__, cmd);
 189		return -EINVAL;
 190	}
 191
 192	f34->v7.command = command;
 193
 194	switch (cmd) {
 195	case v7_CMD_ERASE_ALL:
 196	case v7_CMD_ERASE_UI_FIRMWARE:
 197	case v7_CMD_ERASE_BL_CONFIG:
 198	case v7_CMD_ERASE_UI_CONFIG:
 199	case v7_CMD_ERASE_DISP_CONFIG:
 200	case v7_CMD_ERASE_FLASH_CONFIG:
 201	case v7_CMD_ERASE_GUEST_CODE:
 202	case v7_CMD_ENABLE_FLASH_PROG:
 203		ret = rmi_f34v7_write_command_single_transaction(f34, cmd);
 204		if (ret < 0)
 205			return ret;
 206		else
 207			return 0;
 208	default:
 209		break;
 210	}
 211
 212	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: writing cmd %02X\n",
 213		__func__, command);
 214
 215	ret = rmi_write_block(f34->fn->rmi_dev,
 216			base + V7_COMMAND_OFFSET,
 217			&command, sizeof(command));
 218	if (ret < 0) {
 219		dev_err(&f34->fn->dev, "%s: Failed to write flash command\n",
 220			__func__);
 221		return ret;
 222	}
 223
 224	return 0;
 225}
 226
 227static int rmi_f34v7_write_partition_id(struct f34_data *f34, u8 cmd)
 228{
 229	int ret;
 230	u8 base;
 231	u8 partition;
 232
 233	base = f34->fn->fd.data_base_addr;
 234
 235	switch (cmd) {
 236	case v7_CMD_WRITE_FW:
 237		partition = CORE_CODE_PARTITION;
 238		break;
 239	case v7_CMD_WRITE_CONFIG:
 240	case v7_CMD_READ_CONFIG:
 241		if (f34->v7.config_area == v7_UI_CONFIG_AREA)
 242			partition = CORE_CONFIG_PARTITION;
 243		else if (f34->v7.config_area == v7_DP_CONFIG_AREA)
 244			partition = DISPLAY_CONFIG_PARTITION;
 245		else if (f34->v7.config_area == v7_PM_CONFIG_AREA)
 246			partition = GUEST_SERIALIZATION_PARTITION;
 247		else if (f34->v7.config_area == v7_BL_CONFIG_AREA)
 248			partition = GLOBAL_PARAMETERS_PARTITION;
 249		else if (f34->v7.config_area == v7_FLASH_CONFIG_AREA)
 250			partition = FLASH_CONFIG_PARTITION;
 251		break;
 252	case v7_CMD_WRITE_GUEST_CODE:
 253		partition = GUEST_CODE_PARTITION;
 254		break;
 255	case v7_CMD_ERASE_ALL:
 256		partition = CORE_CODE_PARTITION;
 257		break;
 258	case v7_CMD_ERASE_BL_CONFIG:
 259		partition = GLOBAL_PARAMETERS_PARTITION;
 260		break;
 261	case v7_CMD_ERASE_UI_CONFIG:
 262		partition = CORE_CONFIG_PARTITION;
 263		break;
 264	case v7_CMD_ERASE_DISP_CONFIG:
 265		partition = DISPLAY_CONFIG_PARTITION;
 266		break;
 267	case v7_CMD_ERASE_FLASH_CONFIG:
 268		partition = FLASH_CONFIG_PARTITION;
 269		break;
 270	case v7_CMD_ERASE_GUEST_CODE:
 271		partition = GUEST_CODE_PARTITION;
 272		break;
 273	case v7_CMD_ENABLE_FLASH_PROG:
 274		partition = BOOTLOADER_PARTITION;
 275		break;
 276	default:
 277		dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n",
 278			__func__, cmd);
 279		return -EINVAL;
 280	}
 281
 282	ret = rmi_write_block(f34->fn->rmi_dev,
 283			base + V7_PARTITION_ID_OFFSET,
 284			&partition, sizeof(partition));
 285	if (ret < 0) {
 286		dev_err(&f34->fn->dev, "%s: Failed to write partition ID\n",
 287			__func__);
 288		return ret;
 289	}
 290
 291	return 0;
 292}
 293
 294static int rmi_f34v7_read_partition_table(struct f34_data *f34)
 295{
 296	int ret;
 297	unsigned long timeout;
 298	u8 base;
 299	__le16 length;
 300	u16 block_number = 0;
 301
 302	base = f34->fn->fd.data_base_addr;
 303
 304	f34->v7.config_area = v7_FLASH_CONFIG_AREA;
 305
 306	ret = rmi_f34v7_write_partition_id(f34, v7_CMD_READ_CONFIG);
 307	if (ret < 0)
 308		return ret;
 309
 310	ret = rmi_write_block(f34->fn->rmi_dev,
 311			base + V7_BLOCK_NUMBER_OFFSET,
 312			&block_number, sizeof(block_number));
 313	if (ret < 0) {
 314		dev_err(&f34->fn->dev, "%s: Failed to write block number\n",
 315			__func__);
 316		return ret;
 317	}
 318
 319	put_unaligned_le16(f34->v7.flash_config_length, &length);
 320
 321	ret = rmi_write_block(f34->fn->rmi_dev,
 322			base + V7_TRANSFER_LENGTH_OFFSET,
 323			&length, sizeof(length));
 324	if (ret < 0) {
 325		dev_err(&f34->fn->dev, "%s: Failed to write transfer length\n",
 326			__func__);
 327		return ret;
 328	}
 329
 330	init_completion(&f34->v7.cmd_done);
 331
 332	ret = rmi_f34v7_write_command(f34, v7_CMD_READ_CONFIG);
 333	if (ret < 0) {
 334		dev_err(&f34->fn->dev, "%s: Failed to write command\n",
 335			__func__);
 336		return ret;
 337	}
 338
 339	/*
 340	 * rmi_f34v7_check_command_status() can't be used here, as this
 341	 * function is called before IRQs are available
 342	 */
 343	timeout = msecs_to_jiffies(F34_WRITE_WAIT_MS);
 344	while (time_before(jiffies, timeout)) {
 345		usleep_range(5000, 6000);
 346		rmi_f34v7_read_flash_status(f34);
 347
 348		if (f34->v7.command == v7_CMD_IDLE &&
 349		    f34->v7.flash_status == 0x00) {
 350			break;
 351		}
 352	}
 353
 354	ret = rmi_read_block(f34->fn->rmi_dev,
 355			base + V7_PAYLOAD_OFFSET,
 356			f34->v7.read_config_buf,
 357			f34->v7.partition_table_bytes);
 358	if (ret < 0) {
 359		dev_err(&f34->fn->dev, "%s: Failed to read block data\n",
 360			__func__);
 361		return ret;
 362	}
 363
 364	return 0;
 365}
 366
 367static void rmi_f34v7_parse_partition_table(struct f34_data *f34,
 368					    const void *partition_table,
 369					    struct block_count *blkcount,
 370					    struct physical_address *phyaddr)
 371{
 372	int i;
 373	int index;
 374	u16 partition_length;
 375	u16 physical_address;
 376	const struct partition_table *ptable;
 377
 378	for (i = 0; i < f34->v7.partitions; i++) {
 379		index = i * 8 + 2;
 380		ptable = partition_table + index;
 381		partition_length = le16_to_cpu(ptable->partition_length);
 382		physical_address = le16_to_cpu(ptable->start_physical_address);
 383		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 384			"%s: Partition entry %d: %*ph\n",
 385			__func__, i, sizeof(struct partition_table), ptable);
 386		switch (ptable->partition_id & 0x1f) {
 387		case CORE_CODE_PARTITION:
 388			blkcount->ui_firmware = partition_length;
 389			phyaddr->ui_firmware = physical_address;
 390			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 391				"%s: Core code block count: %d\n",
 392				__func__, blkcount->ui_firmware);
 393			break;
 394		case CORE_CONFIG_PARTITION:
 395			blkcount->ui_config = partition_length;
 396			phyaddr->ui_config = physical_address;
 397			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 398				"%s: Core config block count: %d\n",
 399				__func__, blkcount->ui_config);
 400			break;
 401		case DISPLAY_CONFIG_PARTITION:
 402			blkcount->dp_config = partition_length;
 403			phyaddr->dp_config = physical_address;
 404			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 405				"%s: Display config block count: %d\n",
 406				__func__, blkcount->dp_config);
 407			break;
 408		case FLASH_CONFIG_PARTITION:
 409			blkcount->fl_config = partition_length;
 410			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 411				"%s: Flash config block count: %d\n",
 412				__func__, blkcount->fl_config);
 413			break;
 414		case GUEST_CODE_PARTITION:
 415			blkcount->guest_code = partition_length;
 416			phyaddr->guest_code = physical_address;
 417			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 418				"%s: Guest code block count: %d\n",
 419				__func__, blkcount->guest_code);
 420			break;
 421		case GUEST_SERIALIZATION_PARTITION:
 422			blkcount->pm_config = partition_length;
 423			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 424				"%s: Guest serialization block count: %d\n",
 425				__func__, blkcount->pm_config);
 426			break;
 427		case GLOBAL_PARAMETERS_PARTITION:
 428			blkcount->bl_config = partition_length;
 429			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 430				"%s: Global parameters block count: %d\n",
 431				__func__, blkcount->bl_config);
 432			break;
 433		case DEVICE_CONFIG_PARTITION:
 434			blkcount->lockdown = partition_length;
 435			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 436				"%s: Device config block count: %d\n",
 437				__func__, blkcount->lockdown);
 438			break;
 439		}
 440	}
 441}
 442
 443static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34)
 444{
 445	int ret;
 446	u8 base;
 447	int offset;
 448	u8 query_0;
 449	struct f34v7_query_1_7 query_1_7;
 450
 451	base = f34->fn->fd.query_base_addr;
 452
 453	ret = rmi_read_block(f34->fn->rmi_dev,
 454			base,
 455			&query_0,
 456			sizeof(query_0));
 457	if (ret < 0) {
 458		dev_err(&f34->fn->dev,
 459			"%s: Failed to read query 0\n", __func__);
 460		return ret;
 461	}
 462
 463	offset = (query_0 & 0x7) + 1;
 464
 465	ret = rmi_read_block(f34->fn->rmi_dev,
 466			base + offset,
 467			&query_1_7,
 468			sizeof(query_1_7));
 469	if (ret < 0) {
 470		dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n",
 471			__func__);
 472		return ret;
 473	}
 474
 475	f34->bootloader_id[0] = query_1_7.bl_minor_revision;
 476	f34->bootloader_id[1] = query_1_7.bl_major_revision;
 477
 478	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Bootloader V%d.%d\n",
 479		f34->bootloader_id[1], f34->bootloader_id[0]);
 480
 481	return 0;
 482}
 483
 484static int rmi_f34v7_read_queries(struct f34_data *f34)
 485{
 486	int ret;
 487	int i;
 488	u8 base;
 489	int offset;
 490	u8 *ptable;
 491	u8 query_0;
 492	struct f34v7_query_1_7 query_1_7;
 493
 494	base = f34->fn->fd.query_base_addr;
 495
 496	ret = rmi_read_block(f34->fn->rmi_dev,
 497			base,
 498			&query_0,
 499			sizeof(query_0));
 500	if (ret < 0) {
 501		dev_err(&f34->fn->dev,
 502			"%s: Failed to read query 0\n", __func__);
 503		return ret;
 504	}
 505
 506	offset = (query_0 & 0x07) + 1;
 507
 508	ret = rmi_read_block(f34->fn->rmi_dev,
 509			base + offset,
 510			&query_1_7,
 511			sizeof(query_1_7));
 512	if (ret < 0) {
 513		dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n",
 514			__func__);
 515		return ret;
 516	}
 517
 518	f34->bootloader_id[0] = query_1_7.bl_minor_revision;
 519	f34->bootloader_id[1] = query_1_7.bl_major_revision;
 520
 521	f34->v7.block_size = le16_to_cpu(query_1_7.block_size);
 522	f34->v7.flash_config_length =
 523			le16_to_cpu(query_1_7.flash_config_length);
 524	f34->v7.payload_length = le16_to_cpu(query_1_7.payload_length);
 525
 526	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.block_size = %d\n",
 527		 __func__, f34->v7.block_size);
 528
 529	f34->v7.has_display_cfg = query_1_7.partition_support[1] & HAS_DISP_CFG;
 530	f34->v7.has_guest_code =
 531			query_1_7.partition_support[1] & HAS_GUEST_CODE;
 532
 533	if (query_0 & HAS_CONFIG_ID) {
 534		u8 f34_ctrl[CONFIG_ID_SIZE];
 535
 536		ret = rmi_read_block(f34->fn->rmi_dev,
 537				f34->fn->fd.control_base_addr,
 538				f34_ctrl,
 539				sizeof(f34_ctrl));
 540		if (ret)
 541			return ret;
 542
 543		/* Eat leading zeros */
 544		for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++)
 545			/* Empty */;
 546
 547		snprintf(f34->configuration_id, sizeof(f34->configuration_id),
 548			 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i);
 549
 550		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n",
 551			f34->configuration_id);
 552	}
 553
 554	f34->v7.partitions = 0;
 555	for (i = 0; i < sizeof(query_1_7.partition_support); i++)
 556		f34->v7.partitions += hweight8(query_1_7.partition_support[i]);
 557
 558	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n",
 559		__func__, sizeof(query_1_7.partition_support),
 560		query_1_7.partition_support);
 561
 562
 563	f34->v7.partition_table_bytes = f34->v7.partitions * 8 + 2;
 564
 565	f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev,
 566			f34->v7.partition_table_bytes,
 567			GFP_KERNEL);
 568	if (!f34->v7.read_config_buf) {
 569		f34->v7.read_config_buf_size = 0;
 570		return -ENOMEM;
 571	}
 572
 573	f34->v7.read_config_buf_size = f34->v7.partition_table_bytes;
 574	ptable = f34->v7.read_config_buf;
 575
 576	ret = rmi_f34v7_read_partition_table(f34);
 577	if (ret < 0) {
 578		dev_err(&f34->fn->dev, "%s: Failed to read partition table\n",
 579				__func__);
 580		return ret;
 581	}
 582
 583	rmi_f34v7_parse_partition_table(f34, ptable,
 584					&f34->v7.blkcount, &f34->v7.phyaddr);
 585
 586	return 0;
 587}
 588
 589static int rmi_f34v7_check_bl_config_size(struct f34_data *f34)
 590{
 591	u16 block_count;
 592
 593	block_count = f34->v7.img.bl_config.size / f34->v7.block_size;
 594	f34->update_size += block_count;
 595
 596	if (block_count != f34->v7.blkcount.bl_config) {
 597		dev_err(&f34->fn->dev, "Bootloader config size mismatch\n");
 598		return -EINVAL;
 599	}
 600
 601	return 0;
 602}
 603
 604static int rmi_f34v7_erase_all(struct f34_data *f34)
 605{
 606	int ret;
 607
 608	dev_info(&f34->fn->dev, "Erasing firmware...\n");
 609
 610	init_completion(&f34->v7.cmd_done);
 611
 612	ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_ALL);
 613	if (ret < 0)
 614		return ret;
 615
 616	ret = rmi_f34v7_check_command_status(f34, F34_ERASE_WAIT_MS);
 617	if (ret < 0)
 618		return ret;
 619
 620	return 0;
 621}
 622
 623static int rmi_f34v7_read_blocks(struct f34_data *f34,
 624				 u16 block_cnt, u8 command)
 625{
 626	int ret;
 627	u8 base;
 628	__le16 length;
 629	u16 transfer;
 630	u16 max_transfer;
 631	u16 remaining = block_cnt;
 632	u16 block_number = 0;
 633	u16 index = 0;
 634
 635	base = f34->fn->fd.data_base_addr;
 636
 637	ret = rmi_f34v7_write_partition_id(f34, command);
 638	if (ret < 0)
 639		return ret;
 640
 641	ret = rmi_write_block(f34->fn->rmi_dev,
 642			base + V7_BLOCK_NUMBER_OFFSET,
 643			&block_number, sizeof(block_number));
 644	if (ret < 0) {
 645		dev_err(&f34->fn->dev, "%s: Failed to write block number\n",
 646			__func__);
 647		return ret;
 648	}
 649
 650	max_transfer = min(f34->v7.payload_length,
 651			   (u16)(PAGE_SIZE / f34->v7.block_size));
 652
 653	do {
 654		transfer = min(remaining, max_transfer);
 655		put_unaligned_le16(transfer, &length);
 656
 657		ret = rmi_write_block(f34->fn->rmi_dev,
 658				base + V7_TRANSFER_LENGTH_OFFSET,
 659				&length, sizeof(length));
 660		if (ret < 0) {
 661			dev_err(&f34->fn->dev,
 662				"%s: Write transfer length fail (%d remaining)\n",
 663				__func__, remaining);
 664			return ret;
 665		}
 666
 667		init_completion(&f34->v7.cmd_done);
 668
 669		ret = rmi_f34v7_write_command(f34, command);
 670		if (ret < 0)
 671			return ret;
 672
 673		ret = rmi_f34v7_check_command_status(f34, F34_ENABLE_WAIT_MS);
 674		if (ret < 0)
 675			return ret;
 676
 677		ret = rmi_read_block(f34->fn->rmi_dev,
 678				base + V7_PAYLOAD_OFFSET,
 679				&f34->v7.read_config_buf[index],
 680				transfer * f34->v7.block_size);
 681		if (ret < 0) {
 682			dev_err(&f34->fn->dev,
 683				"%s: Read block failed (%d blks remaining)\n",
 684				__func__, remaining);
 685			return ret;
 686		}
 687
 688		index += (transfer * f34->v7.block_size);
 689		remaining -= transfer;
 690	} while (remaining);
 691
 692	return 0;
 693}
 694
 695static int rmi_f34v7_write_f34v7_blocks(struct f34_data *f34,
 696					const void *block_ptr, u16 block_cnt,
 697					u8 command)
 698{
 699	int ret;
 700	u8 base;
 701	__le16 length;
 702	u16 transfer;
 703	u16 max_transfer;
 704	u16 remaining = block_cnt;
 705	u16 block_number = 0;
 706
 707	base = f34->fn->fd.data_base_addr;
 708
 709	ret = rmi_f34v7_write_partition_id(f34, command);
 710	if (ret < 0)
 711		return ret;
 712
 713	ret = rmi_write_block(f34->fn->rmi_dev,
 714			base + V7_BLOCK_NUMBER_OFFSET,
 715			&block_number, sizeof(block_number));
 716	if (ret < 0) {
 717		dev_err(&f34->fn->dev, "%s: Failed to write block number\n",
 718			__func__);
 719		return ret;
 720	}
 721
 722	if (f34->v7.payload_length > (PAGE_SIZE / f34->v7.block_size))
 723		max_transfer = PAGE_SIZE / f34->v7.block_size;
 724	else
 725		max_transfer = f34->v7.payload_length;
 726
 727	do {
 728		transfer = min(remaining, max_transfer);
 729		put_unaligned_le16(transfer, &length);
 730
 731		init_completion(&f34->v7.cmd_done);
 732
 733		ret = rmi_write_block(f34->fn->rmi_dev,
 734				base + V7_TRANSFER_LENGTH_OFFSET,
 735				&length, sizeof(length));
 736		if (ret < 0) {
 737			dev_err(&f34->fn->dev,
 738				"%s: Write transfer length fail (%d remaining)\n",
 739				__func__, remaining);
 740			return ret;
 741		}
 742
 743		ret = rmi_f34v7_write_command(f34, command);
 744		if (ret < 0)
 745			return ret;
 746
 747		ret = rmi_write_block(f34->fn->rmi_dev,
 748				base + V7_PAYLOAD_OFFSET,
 749				block_ptr, transfer * f34->v7.block_size);
 750		if (ret < 0) {
 751			dev_err(&f34->fn->dev,
 752				"%s: Failed writing data (%d blks remaining)\n",
 753				__func__, remaining);
 754			return ret;
 755		}
 756
 757		ret = rmi_f34v7_check_command_status(f34, F34_ENABLE_WAIT_MS);
 758		if (ret < 0)
 759			return ret;
 760
 761		block_ptr += (transfer * f34->v7.block_size);
 762		remaining -= transfer;
 763		f34->update_progress += transfer;
 764		f34->update_status = (f34->update_progress * 100) /
 765				     f34->update_size;
 766	} while (remaining);
 767
 768	return 0;
 769}
 770
 771static int rmi_f34v7_write_config(struct f34_data *f34)
 772{
 773	return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.config_data,
 774					    f34->v7.config_block_count,
 775					    v7_CMD_WRITE_CONFIG);
 776}
 777
 778static int rmi_f34v7_write_ui_config(struct f34_data *f34)
 779{
 780	f34->v7.config_area = v7_UI_CONFIG_AREA;
 781	f34->v7.config_data = f34->v7.img.ui_config.data;
 782	f34->v7.config_size = f34->v7.img.ui_config.size;
 783	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 784
 785	return rmi_f34v7_write_config(f34);
 786}
 787
 788static int rmi_f34v7_write_dp_config(struct f34_data *f34)
 789{
 790	f34->v7.config_area = v7_DP_CONFIG_AREA;
 791	f34->v7.config_data = f34->v7.img.dp_config.data;
 792	f34->v7.config_size = f34->v7.img.dp_config.size;
 793	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 794
 795	return rmi_f34v7_write_config(f34);
 796}
 797
 798static int rmi_f34v7_write_guest_code(struct f34_data *f34)
 799{
 800	return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.guest_code.data,
 801					    f34->v7.img.guest_code.size /
 802							f34->v7.block_size,
 803					    v7_CMD_WRITE_GUEST_CODE);
 804}
 805
 806static int rmi_f34v7_write_flash_config(struct f34_data *f34)
 807{
 808	int ret;
 809
 810	f34->v7.config_area = v7_FLASH_CONFIG_AREA;
 811	f34->v7.config_data = f34->v7.img.fl_config.data;
 812	f34->v7.config_size = f34->v7.img.fl_config.size;
 813	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 814
 815	if (f34->v7.config_block_count != f34->v7.blkcount.fl_config) {
 816		dev_err(&f34->fn->dev, "%s: Flash config size mismatch\n",
 817			__func__);
 818		return -EINVAL;
 819	}
 820
 821	init_completion(&f34->v7.cmd_done);
 822
 823	ret = rmi_f34v7_write_config(f34);
 824	if (ret < 0)
 825		return ret;
 826
 827	return 0;
 828}
 829
 830static int rmi_f34v7_write_partition_table(struct f34_data *f34)
 831{
 832	u16 block_count;
 833	int ret;
 834
 835	block_count = f34->v7.blkcount.bl_config;
 836	f34->v7.config_area = v7_BL_CONFIG_AREA;
 837	f34->v7.config_size = f34->v7.block_size * block_count;
 838	devm_kfree(&f34->fn->dev, f34->v7.read_config_buf);
 839	f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev,
 840					       f34->v7.config_size, GFP_KERNEL);
 841	if (!f34->v7.read_config_buf) {
 842		f34->v7.read_config_buf_size = 0;
 843		return -ENOMEM;
 844	}
 845
 846	f34->v7.read_config_buf_size = f34->v7.config_size;
 847
 848	ret = rmi_f34v7_read_blocks(f34, block_count, v7_CMD_READ_CONFIG);
 849	if (ret < 0)
 850		return ret;
 851
 852	ret = rmi_f34v7_write_flash_config(f34);
 853	if (ret < 0)
 854		return ret;
 855
 856	f34->v7.config_area = v7_BL_CONFIG_AREA;
 857	f34->v7.config_data = f34->v7.read_config_buf;
 858	f34->v7.config_size = f34->v7.img.bl_config.size;
 859	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 860
 861	ret = rmi_f34v7_write_config(f34);
 862	if (ret < 0)
 863		return ret;
 864
 865	return 0;
 866}
 867
 868static int rmi_f34v7_write_firmware(struct f34_data *f34)
 869{
 870	u16 blk_count;
 871
 872	blk_count = f34->v7.img.ui_firmware.size / f34->v7.block_size;
 873
 874	return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.ui_firmware.data,
 875					    blk_count, v7_CMD_WRITE_FW);
 876}
 877
 878static void rmi_f34v7_parse_img_header_10_bl_container(struct f34_data *f34,
 879						       const void *image)
 880{
 881	int i;
 882	int num_of_containers;
 883	unsigned int addr;
 884	unsigned int container_id;
 885	unsigned int length;
 886	const void *content;
 887	const struct container_descriptor *descriptor;
 888
 889	num_of_containers = f34->v7.img.bootloader.size / 4 - 1;
 890
 891	for (i = 1; i <= num_of_containers; i++) {
 892		addr = get_unaligned_le32(f34->v7.img.bootloader.data + i * 4);
 893		descriptor = image + addr;
 894		container_id = le16_to_cpu(descriptor->container_id);
 895		content = image + le32_to_cpu(descriptor->content_address);
 896		length = le32_to_cpu(descriptor->content_length);
 897		switch (container_id) {
 898		case BL_CONFIG_CONTAINER:
 899		case GLOBAL_PARAMETERS_CONTAINER:
 900			f34->v7.img.bl_config.data = content;
 901			f34->v7.img.bl_config.size = length;
 902			break;
 903		case BL_LOCKDOWN_INFO_CONTAINER:
 904		case DEVICE_CONFIG_CONTAINER:
 905			f34->v7.img.lockdown.data = content;
 906			f34->v7.img.lockdown.size = length;
 907			break;
 908		default:
 909			break;
 910		}
 911	}
 912}
 913
 914static void rmi_f34v7_parse_image_header_10(struct f34_data *f34)
 915{
 916	unsigned int i;
 917	unsigned int num_of_containers;
 918	unsigned int addr;
 919	unsigned int offset;
 920	unsigned int container_id;
 921	unsigned int length;
 922	const void *image = f34->v7.image;
 923	const u8 *content;
 924	const struct container_descriptor *descriptor;
 925	const struct image_header_10 *header = image;
 926
 927	f34->v7.img.checksum = le32_to_cpu(header->checksum);
 928
 929	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.img.checksum=%X\n",
 930		__func__, f34->v7.img.checksum);
 931
 932	/* address of top level container */
 933	offset = le32_to_cpu(header->top_level_container_start_addr);
 934	descriptor = image + offset;
 935
 936	/* address of top level container content */
 937	offset = le32_to_cpu(descriptor->content_address);
 938	num_of_containers = le32_to_cpu(descriptor->content_length) / 4;
 939
 940	for (i = 0; i < num_of_containers; i++) {
 941		addr = get_unaligned_le32(image + offset);
 942		offset += 4;
 943		descriptor = image + addr;
 944		container_id = le16_to_cpu(descriptor->container_id);
 945		content = image + le32_to_cpu(descriptor->content_address);
 946		length = le32_to_cpu(descriptor->content_length);
 947
 948		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 949			"%s: container_id=%d, length=%d\n", __func__,
 950			container_id, length);
 951
 952		switch (container_id) {
 953		case UI_CONTAINER:
 954		case CORE_CODE_CONTAINER:
 955			f34->v7.img.ui_firmware.data = content;
 956			f34->v7.img.ui_firmware.size = length;
 957			break;
 958		case UI_CONFIG_CONTAINER:
 959		case CORE_CONFIG_CONTAINER:
 960			f34->v7.img.ui_config.data = content;
 961			f34->v7.img.ui_config.size = length;
 962			break;
 963		case BL_CONTAINER:
 964			f34->v7.img.bl_version = *content;
 965			f34->v7.img.bootloader.data = content;
 966			f34->v7.img.bootloader.size = length;
 967			rmi_f34v7_parse_img_header_10_bl_container(f34, image);
 968			break;
 969		case GUEST_CODE_CONTAINER:
 970			f34->v7.img.contains_guest_code = true;
 971			f34->v7.img.guest_code.data = content;
 972			f34->v7.img.guest_code.size = length;
 973			break;
 974		case DISPLAY_CONFIG_CONTAINER:
 975			f34->v7.img.contains_display_cfg = true;
 976			f34->v7.img.dp_config.data = content;
 977			f34->v7.img.dp_config.size = length;
 978			break;
 979		case FLASH_CONFIG_CONTAINER:
 980			f34->v7.img.contains_flash_config = true;
 981			f34->v7.img.fl_config.data = content;
 982			f34->v7.img.fl_config.size = length;
 983			break;
 984		case GENERAL_INFORMATION_CONTAINER:
 985			f34->v7.img.contains_firmware_id = true;
 986			f34->v7.img.firmware_id =
 987				get_unaligned_le32(content + 4);
 988			break;
 989		default:
 990			break;
 991		}
 992	}
 993}
 994
 995static int rmi_f34v7_parse_image_info(struct f34_data *f34)
 996{
 997	const struct image_header_10 *header = f34->v7.image;
 998
 999	memset(&f34->v7.img, 0x00, sizeof(f34->v7.img));
1000
1001	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
1002		"%s: header->major_header_version = %d\n",
1003		__func__, header->major_header_version);
1004
1005	switch (header->major_header_version) {
1006	case IMAGE_HEADER_VERSION_10:
1007		rmi_f34v7_parse_image_header_10(f34);
1008		break;
1009	default:
1010		dev_err(&f34->fn->dev, "Unsupported image file format %02X\n",
1011			header->major_header_version);
1012		return -EINVAL;
1013	}
1014
1015	if (!f34->v7.img.contains_flash_config) {
1016		dev_err(&f34->fn->dev, "%s: No flash config in fw image\n",
1017			__func__);
1018		return -EINVAL;
1019	}
1020
1021	rmi_f34v7_parse_partition_table(f34, f34->v7.img.fl_config.data,
1022			&f34->v7.img.blkcount, &f34->v7.img.phyaddr);
1023
1024	return 0;
1025}
1026
1027int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw)
1028{
1029	int ret;
1030
1031	f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev,
1032					       f34->fn->irq_mask);
1033
1034	rmi_f34v7_read_queries_bl_version(f34);
1035
1036	f34->v7.image = fw->data;
1037	f34->update_progress = 0;
1038	f34->update_size = 0;
1039
1040	ret = rmi_f34v7_parse_image_info(f34);
1041	if (ret < 0)
1042		return ret;
1043
1044	ret = rmi_f34v7_check_bl_config_size(f34);
1045	if (ret < 0)
1046		return ret;
1047
1048	ret = rmi_f34v7_erase_all(f34);
1049	if (ret < 0)
1050		return ret;
1051
1052	ret = rmi_f34v7_write_partition_table(f34);
1053	if (ret < 0)
1054		return ret;
1055	dev_info(&f34->fn->dev, "%s: Partition table programmed\n", __func__);
1056
1057	/*
1058	 * Reset to reload partition table - as the previous firmware has been
1059	 * erased, we remain in bootloader mode.
1060	 */
1061	ret = rmi_scan_pdt(f34->fn->rmi_dev, NULL, rmi_initial_reset);
1062	if (ret < 0)
1063		dev_warn(&f34->fn->dev, "RMI reset failed!\n");
1064
1065	dev_info(&f34->fn->dev, "Writing firmware (%d bytes)...\n",
1066		 f34->v7.img.ui_firmware.size);
1067
1068	ret = rmi_f34v7_write_firmware(f34);
1069	if (ret < 0)
1070		return ret;
1071
1072	dev_info(&f34->fn->dev, "Writing config (%d bytes)...\n",
1073		 f34->v7.img.ui_config.size);
1074
1075	f34->v7.config_area = v7_UI_CONFIG_AREA;
1076	ret = rmi_f34v7_write_ui_config(f34);
1077	if (ret < 0)
1078		return ret;
1079
1080	if (f34->v7.has_display_cfg && f34->v7.img.contains_display_cfg) {
1081		dev_info(&f34->fn->dev, "Writing display config...\n");
1082
1083		ret = rmi_f34v7_write_dp_config(f34);
1084		if (ret < 0)
1085			return ret;
1086	}
1087
1088	if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) {
1089		dev_info(&f34->fn->dev, "Writing guest code...\n");
1090
1091		ret = rmi_f34v7_write_guest_code(f34);
1092		if (ret < 0)
1093			return ret;
1094	}
1095
1096	return 0;
1097}
1098
1099static int rmi_f34v7_enter_flash_prog(struct f34_data *f34)
1100{
1101	int ret;
1102
1103	f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, f34->fn->irq_mask);
1104
1105	ret = rmi_f34v7_read_flash_status(f34);
1106	if (ret < 0)
1107		return ret;
1108
1109	if (f34->v7.in_bl_mode) {
1110		dev_info(&f34->fn->dev, "%s: Device in bootloader mode\n",
1111			 __func__);
1112		return 0;
1113	}
1114
1115	init_completion(&f34->v7.cmd_done);
1116
1117	ret = rmi_f34v7_write_command(f34, v7_CMD_ENABLE_FLASH_PROG);
1118	if (ret < 0)
1119		return ret;
1120
1121	ret = rmi_f34v7_check_command_status(f34, F34_ENABLE_WAIT_MS);
1122	if (ret < 0)
1123		return ret;
1124
1125	return 0;
1126}
1127
1128int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw)
1129{
1130	int ret = 0;
1131
1132	f34->v7.config_area = v7_UI_CONFIG_AREA;
1133	f34->v7.image = fw->data;
1134
1135	ret = rmi_f34v7_parse_image_info(f34);
1136	if (ret < 0)
1137		return ret;
1138
1139	dev_info(&f34->fn->dev, "Firmware image OK\n");
1140
1141	return rmi_f34v7_enter_flash_prog(f34);
1142}
1143
1144int rmi_f34v7_probe(struct f34_data *f34)
1145{
1146	int ret;
1147
1148	/* Read bootloader version */
1149	ret = rmi_read_block(f34->fn->rmi_dev,
1150			f34->fn->fd.query_base_addr + V7_BOOTLOADER_ID_OFFSET,
1151			f34->bootloader_id,
1152			sizeof(f34->bootloader_id));
1153	if (ret < 0) {
1154		dev_err(&f34->fn->dev, "%s: Failed to read bootloader ID\n",
1155			__func__);
1156		return ret;
1157	}
1158
1159	if (f34->bootloader_id[1] == '5') {
1160		f34->bl_version = 5;
1161	} else if (f34->bootloader_id[1] == '6') {
1162		f34->bl_version = 6;
1163	} else if (f34->bootloader_id[1] == 7) {
1164		f34->bl_version = 7;
1165	} else if (f34->bootloader_id[1] == 8) {
1166		f34->bl_version = 8;
1167	} else {
1168		dev_err(&f34->fn->dev,
1169			"%s: Unrecognized bootloader version: %d (%c) %d (%c)\n",
1170			__func__,
1171			f34->bootloader_id[0], f34->bootloader_id[0],
1172			f34->bootloader_id[1], f34->bootloader_id[1]);
1173		return -EINVAL;
1174	}
1175
1176	memset(&f34->v7.blkcount, 0x00, sizeof(f34->v7.blkcount));
1177	memset(&f34->v7.phyaddr, 0x00, sizeof(f34->v7.phyaddr));
1178
1179	init_completion(&f34->v7.cmd_done);
1180
1181	ret = rmi_f34v7_read_queries(f34);
1182	if (ret < 0)
1183		return ret;
1184
1185	return 0;
1186}
v6.8
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2016, Zodiac Inflight Innovations
   4 * Copyright (c) 2007-2016, Synaptics Incorporated
   5 * Copyright (C) 2012 Alexandra Chin <alexandra.chin@tw.synaptics.com>
   6 * Copyright (C) 2012 Scott Lin <scott.lin@tw.synaptics.com>
   7 */
   8
   9#include <linux/bitops.h>
  10#include <linux/kernel.h>
  11#include <linux/rmi.h>
  12#include <linux/firmware.h>
  13#include <linux/delay.h>
  14#include <linux/slab.h>
  15#include <linux/jiffies.h>
  16#include <asm/unaligned.h>
  17
  18#include "rmi_driver.h"
  19#include "rmi_f34.h"
  20
  21static int rmi_f34v7_read_flash_status(struct f34_data *f34)
  22{
  23	u8 status;
  24	u8 command;
  25	int ret;
  26
  27	ret = rmi_read_block(f34->fn->rmi_dev,
  28			f34->fn->fd.data_base_addr + V7_FLASH_STATUS_OFFSET,
  29			&status,
  30			sizeof(status));
  31	if (ret < 0) {
  32		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
  33			"%s: Error %d reading flash status\n", __func__, ret);
  34		return ret;
  35	}
  36
  37	f34->v7.in_bl_mode = status >> 7;
  38	f34->v7.flash_status = status & 0x1f;
  39
  40	if (f34->v7.flash_status != 0x00) {
  41		dev_err(&f34->fn->dev, "%s: status=%d, command=0x%02x\n",
  42			__func__, f34->v7.flash_status, f34->v7.command);
  43	}
  44
  45	ret = rmi_read_block(f34->fn->rmi_dev,
  46			f34->fn->fd.data_base_addr + V7_COMMAND_OFFSET,
  47			&command,
  48			sizeof(command));
  49	if (ret < 0) {
  50		dev_err(&f34->fn->dev, "%s: Failed to read flash command\n",
  51			__func__);
  52		return ret;
  53	}
  54
  55	f34->v7.command = command;
  56
  57	return 0;
  58}
  59
  60static int rmi_f34v7_wait_for_idle(struct f34_data *f34, int timeout_ms)
  61{
  62	unsigned long timeout;
  63
  64	timeout = msecs_to_jiffies(timeout_ms);
  65
  66	if (!wait_for_completion_timeout(&f34->v7.cmd_done, timeout)) {
  67		dev_warn(&f34->fn->dev, "%s: Timed out waiting for idle status\n",
  68			 __func__);
  69		return -ETIMEDOUT;
  70	}
  71
  72	return 0;
  73}
  74
  75static int rmi_f34v7_check_command_status(struct f34_data *f34, int timeout_ms)
  76{
  77	int ret;
  78
  79	ret = rmi_f34v7_wait_for_idle(f34, timeout_ms);
  80	if (ret < 0)
  81		return ret;
  82
  83	ret = rmi_f34v7_read_flash_status(f34);
  84	if (ret < 0)
  85		return ret;
  86
  87	if (f34->v7.flash_status != 0x00)
  88		return -EIO;
  89
  90	return 0;
  91}
  92
  93static int rmi_f34v7_write_command_single_transaction(struct f34_data *f34,
  94						      u8 cmd)
  95{
  96	int ret;
  97	u8 base;
  98	struct f34v7_data_1_5 data_1_5;
  99
 100	base = f34->fn->fd.data_base_addr;
 101
 102	memset(&data_1_5, 0, sizeof(data_1_5));
 103
 104	switch (cmd) {
 105	case v7_CMD_ERASE_ALL:
 106		data_1_5.partition_id = CORE_CODE_PARTITION;
 107		data_1_5.command = CMD_V7_ERASE_AP;
 108		break;
 109	case v7_CMD_ERASE_UI_FIRMWARE:
 110		data_1_5.partition_id = CORE_CODE_PARTITION;
 111		data_1_5.command = CMD_V7_ERASE;
 112		break;
 113	case v7_CMD_ERASE_BL_CONFIG:
 114		data_1_5.partition_id = GLOBAL_PARAMETERS_PARTITION;
 115		data_1_5.command = CMD_V7_ERASE;
 116		break;
 117	case v7_CMD_ERASE_UI_CONFIG:
 118		data_1_5.partition_id = CORE_CONFIG_PARTITION;
 119		data_1_5.command = CMD_V7_ERASE;
 120		break;
 121	case v7_CMD_ERASE_DISP_CONFIG:
 122		data_1_5.partition_id = DISPLAY_CONFIG_PARTITION;
 123		data_1_5.command = CMD_V7_ERASE;
 124		break;
 125	case v7_CMD_ERASE_FLASH_CONFIG:
 126		data_1_5.partition_id = FLASH_CONFIG_PARTITION;
 127		data_1_5.command = CMD_V7_ERASE;
 128		break;
 129	case v7_CMD_ERASE_GUEST_CODE:
 130		data_1_5.partition_id = GUEST_CODE_PARTITION;
 131		data_1_5.command = CMD_V7_ERASE;
 132		break;
 133	case v7_CMD_ENABLE_FLASH_PROG:
 134		data_1_5.partition_id = BOOTLOADER_PARTITION;
 135		data_1_5.command = CMD_V7_ENTER_BL;
 136		break;
 137	}
 138
 139	data_1_5.payload[0] = f34->bootloader_id[0];
 140	data_1_5.payload[1] = f34->bootloader_id[1];
 141
 142	ret = rmi_write_block(f34->fn->rmi_dev,
 143			base + V7_PARTITION_ID_OFFSET,
 144			&data_1_5, sizeof(data_1_5));
 145	if (ret < 0) {
 146		dev_err(&f34->fn->dev,
 147			"%s: Failed to write single transaction command\n",
 148			__func__);
 149		return ret;
 150	}
 151
 152	return 0;
 153}
 154
 155static int rmi_f34v7_write_command(struct f34_data *f34, u8 cmd)
 156{
 157	int ret;
 158	u8 base;
 159	u8 command;
 160
 161	base = f34->fn->fd.data_base_addr;
 162
 163	switch (cmd) {
 164	case v7_CMD_WRITE_FW:
 165	case v7_CMD_WRITE_CONFIG:
 166	case v7_CMD_WRITE_GUEST_CODE:
 167		command = CMD_V7_WRITE;
 168		break;
 169	case v7_CMD_READ_CONFIG:
 170		command = CMD_V7_READ;
 171		break;
 172	case v7_CMD_ERASE_ALL:
 173		command = CMD_V7_ERASE_AP;
 174		break;
 175	case v7_CMD_ERASE_UI_FIRMWARE:
 176	case v7_CMD_ERASE_BL_CONFIG:
 177	case v7_CMD_ERASE_UI_CONFIG:
 178	case v7_CMD_ERASE_DISP_CONFIG:
 179	case v7_CMD_ERASE_FLASH_CONFIG:
 180	case v7_CMD_ERASE_GUEST_CODE:
 181		command = CMD_V7_ERASE;
 182		break;
 183	case v7_CMD_ENABLE_FLASH_PROG:
 184		command = CMD_V7_ENTER_BL;
 185		break;
 186	default:
 187		dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n",
 188			__func__, cmd);
 189		return -EINVAL;
 190	}
 191
 192	f34->v7.command = command;
 193
 194	switch (cmd) {
 195	case v7_CMD_ERASE_ALL:
 196	case v7_CMD_ERASE_UI_FIRMWARE:
 197	case v7_CMD_ERASE_BL_CONFIG:
 198	case v7_CMD_ERASE_UI_CONFIG:
 199	case v7_CMD_ERASE_DISP_CONFIG:
 200	case v7_CMD_ERASE_FLASH_CONFIG:
 201	case v7_CMD_ERASE_GUEST_CODE:
 202	case v7_CMD_ENABLE_FLASH_PROG:
 203		ret = rmi_f34v7_write_command_single_transaction(f34, cmd);
 204		if (ret < 0)
 205			return ret;
 206		else
 207			return 0;
 208	default:
 209		break;
 210	}
 211
 212	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: writing cmd %02X\n",
 213		__func__, command);
 214
 215	ret = rmi_write_block(f34->fn->rmi_dev,
 216			base + V7_COMMAND_OFFSET,
 217			&command, sizeof(command));
 218	if (ret < 0) {
 219		dev_err(&f34->fn->dev, "%s: Failed to write flash command\n",
 220			__func__);
 221		return ret;
 222	}
 223
 224	return 0;
 225}
 226
 227static int rmi_f34v7_write_partition_id(struct f34_data *f34, u8 cmd)
 228{
 229	int ret;
 230	u8 base;
 231	u8 partition;
 232
 233	base = f34->fn->fd.data_base_addr;
 234
 235	switch (cmd) {
 236	case v7_CMD_WRITE_FW:
 237		partition = CORE_CODE_PARTITION;
 238		break;
 239	case v7_CMD_WRITE_CONFIG:
 240	case v7_CMD_READ_CONFIG:
 241		if (f34->v7.config_area == v7_UI_CONFIG_AREA)
 242			partition = CORE_CONFIG_PARTITION;
 243		else if (f34->v7.config_area == v7_DP_CONFIG_AREA)
 244			partition = DISPLAY_CONFIG_PARTITION;
 245		else if (f34->v7.config_area == v7_PM_CONFIG_AREA)
 246			partition = GUEST_SERIALIZATION_PARTITION;
 247		else if (f34->v7.config_area == v7_BL_CONFIG_AREA)
 248			partition = GLOBAL_PARAMETERS_PARTITION;
 249		else if (f34->v7.config_area == v7_FLASH_CONFIG_AREA)
 250			partition = FLASH_CONFIG_PARTITION;
 251		break;
 252	case v7_CMD_WRITE_GUEST_CODE:
 253		partition = GUEST_CODE_PARTITION;
 254		break;
 255	case v7_CMD_ERASE_ALL:
 256		partition = CORE_CODE_PARTITION;
 257		break;
 258	case v7_CMD_ERASE_BL_CONFIG:
 259		partition = GLOBAL_PARAMETERS_PARTITION;
 260		break;
 261	case v7_CMD_ERASE_UI_CONFIG:
 262		partition = CORE_CONFIG_PARTITION;
 263		break;
 264	case v7_CMD_ERASE_DISP_CONFIG:
 265		partition = DISPLAY_CONFIG_PARTITION;
 266		break;
 267	case v7_CMD_ERASE_FLASH_CONFIG:
 268		partition = FLASH_CONFIG_PARTITION;
 269		break;
 270	case v7_CMD_ERASE_GUEST_CODE:
 271		partition = GUEST_CODE_PARTITION;
 272		break;
 273	case v7_CMD_ENABLE_FLASH_PROG:
 274		partition = BOOTLOADER_PARTITION;
 275		break;
 276	default:
 277		dev_err(&f34->fn->dev, "%s: Invalid command 0x%02x\n",
 278			__func__, cmd);
 279		return -EINVAL;
 280	}
 281
 282	ret = rmi_write_block(f34->fn->rmi_dev,
 283			base + V7_PARTITION_ID_OFFSET,
 284			&partition, sizeof(partition));
 285	if (ret < 0) {
 286		dev_err(&f34->fn->dev, "%s: Failed to write partition ID\n",
 287			__func__);
 288		return ret;
 289	}
 290
 291	return 0;
 292}
 293
 294static int rmi_f34v7_read_partition_table(struct f34_data *f34)
 295{
 296	int ret;
 297	unsigned long timeout;
 298	u8 base;
 299	__le16 length;
 300	u16 block_number = 0;
 301
 302	base = f34->fn->fd.data_base_addr;
 303
 304	f34->v7.config_area = v7_FLASH_CONFIG_AREA;
 305
 306	ret = rmi_f34v7_write_partition_id(f34, v7_CMD_READ_CONFIG);
 307	if (ret < 0)
 308		return ret;
 309
 310	ret = rmi_write_block(f34->fn->rmi_dev,
 311			base + V7_BLOCK_NUMBER_OFFSET,
 312			&block_number, sizeof(block_number));
 313	if (ret < 0) {
 314		dev_err(&f34->fn->dev, "%s: Failed to write block number\n",
 315			__func__);
 316		return ret;
 317	}
 318
 319	put_unaligned_le16(f34->v7.flash_config_length, &length);
 320
 321	ret = rmi_write_block(f34->fn->rmi_dev,
 322			base + V7_TRANSFER_LENGTH_OFFSET,
 323			&length, sizeof(length));
 324	if (ret < 0) {
 325		dev_err(&f34->fn->dev, "%s: Failed to write transfer length\n",
 326			__func__);
 327		return ret;
 328	}
 329
 330	init_completion(&f34->v7.cmd_done);
 331
 332	ret = rmi_f34v7_write_command(f34, v7_CMD_READ_CONFIG);
 333	if (ret < 0) {
 334		dev_err(&f34->fn->dev, "%s: Failed to write command\n",
 335			__func__);
 336		return ret;
 337	}
 338
 339	/*
 340	 * rmi_f34v7_check_command_status() can't be used here, as this
 341	 * function is called before IRQs are available
 342	 */
 343	timeout = msecs_to_jiffies(F34_WRITE_WAIT_MS);
 344	while (time_before(jiffies, timeout)) {
 345		usleep_range(5000, 6000);
 346		rmi_f34v7_read_flash_status(f34);
 347
 348		if (f34->v7.command == v7_CMD_IDLE &&
 349		    f34->v7.flash_status == 0x00) {
 350			break;
 351		}
 352	}
 353
 354	ret = rmi_read_block(f34->fn->rmi_dev,
 355			base + V7_PAYLOAD_OFFSET,
 356			f34->v7.read_config_buf,
 357			f34->v7.partition_table_bytes);
 358	if (ret < 0) {
 359		dev_err(&f34->fn->dev, "%s: Failed to read block data\n",
 360			__func__);
 361		return ret;
 362	}
 363
 364	return 0;
 365}
 366
 367static void rmi_f34v7_parse_partition_table(struct f34_data *f34,
 368					    const void *partition_table,
 369					    struct block_count *blkcount,
 370					    struct physical_address *phyaddr)
 371{
 372	int i;
 373	int index;
 374	u16 partition_length;
 375	u16 physical_address;
 376	const struct partition_table *ptable;
 377
 378	for (i = 0; i < f34->v7.partitions; i++) {
 379		index = i * 8 + 2;
 380		ptable = partition_table + index;
 381		partition_length = le16_to_cpu(ptable->partition_length);
 382		physical_address = le16_to_cpu(ptable->start_physical_address);
 383		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 384			"%s: Partition entry %d: %*ph\n",
 385			__func__, i, sizeof(struct partition_table), ptable);
 386		switch (ptable->partition_id & 0x1f) {
 387		case CORE_CODE_PARTITION:
 388			blkcount->ui_firmware = partition_length;
 389			phyaddr->ui_firmware = physical_address;
 390			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 391				"%s: Core code block count: %d\n",
 392				__func__, blkcount->ui_firmware);
 393			break;
 394		case CORE_CONFIG_PARTITION:
 395			blkcount->ui_config = partition_length;
 396			phyaddr->ui_config = physical_address;
 397			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 398				"%s: Core config block count: %d\n",
 399				__func__, blkcount->ui_config);
 400			break;
 401		case DISPLAY_CONFIG_PARTITION:
 402			blkcount->dp_config = partition_length;
 403			phyaddr->dp_config = physical_address;
 404			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 405				"%s: Display config block count: %d\n",
 406				__func__, blkcount->dp_config);
 407			break;
 408		case FLASH_CONFIG_PARTITION:
 409			blkcount->fl_config = partition_length;
 410			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 411				"%s: Flash config block count: %d\n",
 412				__func__, blkcount->fl_config);
 413			break;
 414		case GUEST_CODE_PARTITION:
 415			blkcount->guest_code = partition_length;
 416			phyaddr->guest_code = physical_address;
 417			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 418				"%s: Guest code block count: %d\n",
 419				__func__, blkcount->guest_code);
 420			break;
 421		case GUEST_SERIALIZATION_PARTITION:
 422			blkcount->pm_config = partition_length;
 423			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 424				"%s: Guest serialization block count: %d\n",
 425				__func__, blkcount->pm_config);
 426			break;
 427		case GLOBAL_PARAMETERS_PARTITION:
 428			blkcount->bl_config = partition_length;
 429			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 430				"%s: Global parameters block count: %d\n",
 431				__func__, blkcount->bl_config);
 432			break;
 433		case DEVICE_CONFIG_PARTITION:
 434			blkcount->lockdown = partition_length;
 435			rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 436				"%s: Device config block count: %d\n",
 437				__func__, blkcount->lockdown);
 438			break;
 439		}
 440	}
 441}
 442
 443static int rmi_f34v7_read_queries_bl_version(struct f34_data *f34)
 444{
 445	int ret;
 446	u8 base;
 447	int offset;
 448	u8 query_0;
 449	struct f34v7_query_1_7 query_1_7;
 450
 451	base = f34->fn->fd.query_base_addr;
 452
 453	ret = rmi_read_block(f34->fn->rmi_dev,
 454			base,
 455			&query_0,
 456			sizeof(query_0));
 457	if (ret < 0) {
 458		dev_err(&f34->fn->dev,
 459			"%s: Failed to read query 0\n", __func__);
 460		return ret;
 461	}
 462
 463	offset = (query_0 & 0x7) + 1;
 464
 465	ret = rmi_read_block(f34->fn->rmi_dev,
 466			base + offset,
 467			&query_1_7,
 468			sizeof(query_1_7));
 469	if (ret < 0) {
 470		dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n",
 471			__func__);
 472		return ret;
 473	}
 474
 475	f34->bootloader_id[0] = query_1_7.bl_minor_revision;
 476	f34->bootloader_id[1] = query_1_7.bl_major_revision;
 477
 478	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Bootloader V%d.%d\n",
 479		f34->bootloader_id[1], f34->bootloader_id[0]);
 480
 481	return 0;
 482}
 483
 484static int rmi_f34v7_read_queries(struct f34_data *f34)
 485{
 486	int ret;
 487	int i;
 488	u8 base;
 489	int offset;
 490	u8 *ptable;
 491	u8 query_0;
 492	struct f34v7_query_1_7 query_1_7;
 493
 494	base = f34->fn->fd.query_base_addr;
 495
 496	ret = rmi_read_block(f34->fn->rmi_dev,
 497			base,
 498			&query_0,
 499			sizeof(query_0));
 500	if (ret < 0) {
 501		dev_err(&f34->fn->dev,
 502			"%s: Failed to read query 0\n", __func__);
 503		return ret;
 504	}
 505
 506	offset = (query_0 & 0x07) + 1;
 507
 508	ret = rmi_read_block(f34->fn->rmi_dev,
 509			base + offset,
 510			&query_1_7,
 511			sizeof(query_1_7));
 512	if (ret < 0) {
 513		dev_err(&f34->fn->dev, "%s: Failed to read queries 1 to 7\n",
 514			__func__);
 515		return ret;
 516	}
 517
 518	f34->bootloader_id[0] = query_1_7.bl_minor_revision;
 519	f34->bootloader_id[1] = query_1_7.bl_major_revision;
 520
 521	f34->v7.block_size = le16_to_cpu(query_1_7.block_size);
 522	f34->v7.flash_config_length =
 523			le16_to_cpu(query_1_7.flash_config_length);
 524	f34->v7.payload_length = le16_to_cpu(query_1_7.payload_length);
 525
 526	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.block_size = %d\n",
 527		 __func__, f34->v7.block_size);
 528
 529	f34->v7.has_display_cfg = query_1_7.partition_support[1] & HAS_DISP_CFG;
 530	f34->v7.has_guest_code =
 531			query_1_7.partition_support[1] & HAS_GUEST_CODE;
 532
 533	if (query_0 & HAS_CONFIG_ID) {
 534		u8 f34_ctrl[CONFIG_ID_SIZE];
 535
 536		ret = rmi_read_block(f34->fn->rmi_dev,
 537				f34->fn->fd.control_base_addr,
 538				f34_ctrl,
 539				sizeof(f34_ctrl));
 540		if (ret)
 541			return ret;
 542
 543		/* Eat leading zeros */
 544		for (i = 0; i < sizeof(f34_ctrl) - 1 && !f34_ctrl[i]; i++)
 545			/* Empty */;
 546
 547		snprintf(f34->configuration_id, sizeof(f34->configuration_id),
 548			 "%*phN", (int)sizeof(f34_ctrl) - i, f34_ctrl + i);
 549
 550		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "Configuration ID: %s\n",
 551			f34->configuration_id);
 552	}
 553
 554	f34->v7.partitions = 0;
 555	for (i = 0; i < sizeof(query_1_7.partition_support); i++)
 556		f34->v7.partitions += hweight8(query_1_7.partition_support[i]);
 557
 558	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: Supported partitions: %*ph\n",
 559		__func__, sizeof(query_1_7.partition_support),
 560		query_1_7.partition_support);
 561
 562
 563	f34->v7.partition_table_bytes = f34->v7.partitions * 8 + 2;
 564
 565	f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev,
 566			f34->v7.partition_table_bytes,
 567			GFP_KERNEL);
 568	if (!f34->v7.read_config_buf) {
 569		f34->v7.read_config_buf_size = 0;
 570		return -ENOMEM;
 571	}
 572
 573	f34->v7.read_config_buf_size = f34->v7.partition_table_bytes;
 574	ptable = f34->v7.read_config_buf;
 575
 576	ret = rmi_f34v7_read_partition_table(f34);
 577	if (ret < 0) {
 578		dev_err(&f34->fn->dev, "%s: Failed to read partition table\n",
 579				__func__);
 580		return ret;
 581	}
 582
 583	rmi_f34v7_parse_partition_table(f34, ptable,
 584					&f34->v7.blkcount, &f34->v7.phyaddr);
 585
 586	return 0;
 587}
 588
 589static int rmi_f34v7_check_bl_config_size(struct f34_data *f34)
 590{
 591	u16 block_count;
 592
 593	block_count = f34->v7.img.bl_config.size / f34->v7.block_size;
 594	f34->update_size += block_count;
 595
 596	if (block_count != f34->v7.blkcount.bl_config) {
 597		dev_err(&f34->fn->dev, "Bootloader config size mismatch\n");
 598		return -EINVAL;
 599	}
 600
 601	return 0;
 602}
 603
 604static int rmi_f34v7_erase_all(struct f34_data *f34)
 605{
 606	int ret;
 607
 608	dev_info(&f34->fn->dev, "Erasing firmware...\n");
 609
 610	init_completion(&f34->v7.cmd_done);
 611
 612	ret = rmi_f34v7_write_command(f34, v7_CMD_ERASE_ALL);
 613	if (ret < 0)
 614		return ret;
 615
 616	ret = rmi_f34v7_check_command_status(f34, F34_ERASE_WAIT_MS);
 617	if (ret < 0)
 618		return ret;
 619
 620	return 0;
 621}
 622
 623static int rmi_f34v7_read_blocks(struct f34_data *f34,
 624				 u16 block_cnt, u8 command)
 625{
 626	int ret;
 627	u8 base;
 628	__le16 length;
 629	u16 transfer;
 630	u16 max_transfer;
 631	u16 remaining = block_cnt;
 632	u16 block_number = 0;
 633	u16 index = 0;
 634
 635	base = f34->fn->fd.data_base_addr;
 636
 637	ret = rmi_f34v7_write_partition_id(f34, command);
 638	if (ret < 0)
 639		return ret;
 640
 641	ret = rmi_write_block(f34->fn->rmi_dev,
 642			base + V7_BLOCK_NUMBER_OFFSET,
 643			&block_number, sizeof(block_number));
 644	if (ret < 0) {
 645		dev_err(&f34->fn->dev, "%s: Failed to write block number\n",
 646			__func__);
 647		return ret;
 648	}
 649
 650	max_transfer = min(f34->v7.payload_length,
 651			   (u16)(PAGE_SIZE / f34->v7.block_size));
 652
 653	do {
 654		transfer = min(remaining, max_transfer);
 655		put_unaligned_le16(transfer, &length);
 656
 657		ret = rmi_write_block(f34->fn->rmi_dev,
 658				base + V7_TRANSFER_LENGTH_OFFSET,
 659				&length, sizeof(length));
 660		if (ret < 0) {
 661			dev_err(&f34->fn->dev,
 662				"%s: Write transfer length fail (%d remaining)\n",
 663				__func__, remaining);
 664			return ret;
 665		}
 666
 667		init_completion(&f34->v7.cmd_done);
 668
 669		ret = rmi_f34v7_write_command(f34, command);
 670		if (ret < 0)
 671			return ret;
 672
 673		ret = rmi_f34v7_check_command_status(f34, F34_ENABLE_WAIT_MS);
 674		if (ret < 0)
 675			return ret;
 676
 677		ret = rmi_read_block(f34->fn->rmi_dev,
 678				base + V7_PAYLOAD_OFFSET,
 679				&f34->v7.read_config_buf[index],
 680				transfer * f34->v7.block_size);
 681		if (ret < 0) {
 682			dev_err(&f34->fn->dev,
 683				"%s: Read block failed (%d blks remaining)\n",
 684				__func__, remaining);
 685			return ret;
 686		}
 687
 688		index += (transfer * f34->v7.block_size);
 689		remaining -= transfer;
 690	} while (remaining);
 691
 692	return 0;
 693}
 694
 695static int rmi_f34v7_write_f34v7_blocks(struct f34_data *f34,
 696					const void *block_ptr, u16 block_cnt,
 697					u8 command)
 698{
 699	int ret;
 700	u8 base;
 701	__le16 length;
 702	u16 transfer;
 703	u16 max_transfer;
 704	u16 remaining = block_cnt;
 705	u16 block_number = 0;
 706
 707	base = f34->fn->fd.data_base_addr;
 708
 709	ret = rmi_f34v7_write_partition_id(f34, command);
 710	if (ret < 0)
 711		return ret;
 712
 713	ret = rmi_write_block(f34->fn->rmi_dev,
 714			base + V7_BLOCK_NUMBER_OFFSET,
 715			&block_number, sizeof(block_number));
 716	if (ret < 0) {
 717		dev_err(&f34->fn->dev, "%s: Failed to write block number\n",
 718			__func__);
 719		return ret;
 720	}
 721
 722	if (f34->v7.payload_length > (PAGE_SIZE / f34->v7.block_size))
 723		max_transfer = PAGE_SIZE / f34->v7.block_size;
 724	else
 725		max_transfer = f34->v7.payload_length;
 726
 727	do {
 728		transfer = min(remaining, max_transfer);
 729		put_unaligned_le16(transfer, &length);
 730
 731		init_completion(&f34->v7.cmd_done);
 732
 733		ret = rmi_write_block(f34->fn->rmi_dev,
 734				base + V7_TRANSFER_LENGTH_OFFSET,
 735				&length, sizeof(length));
 736		if (ret < 0) {
 737			dev_err(&f34->fn->dev,
 738				"%s: Write transfer length fail (%d remaining)\n",
 739				__func__, remaining);
 740			return ret;
 741		}
 742
 743		ret = rmi_f34v7_write_command(f34, command);
 744		if (ret < 0)
 745			return ret;
 746
 747		ret = rmi_write_block(f34->fn->rmi_dev,
 748				base + V7_PAYLOAD_OFFSET,
 749				block_ptr, transfer * f34->v7.block_size);
 750		if (ret < 0) {
 751			dev_err(&f34->fn->dev,
 752				"%s: Failed writing data (%d blks remaining)\n",
 753				__func__, remaining);
 754			return ret;
 755		}
 756
 757		ret = rmi_f34v7_check_command_status(f34, F34_ENABLE_WAIT_MS);
 758		if (ret < 0)
 759			return ret;
 760
 761		block_ptr += (transfer * f34->v7.block_size);
 762		remaining -= transfer;
 763		f34->update_progress += transfer;
 764		f34->update_status = (f34->update_progress * 100) /
 765				     f34->update_size;
 766	} while (remaining);
 767
 768	return 0;
 769}
 770
 771static int rmi_f34v7_write_config(struct f34_data *f34)
 772{
 773	return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.config_data,
 774					    f34->v7.config_block_count,
 775					    v7_CMD_WRITE_CONFIG);
 776}
 777
 778static int rmi_f34v7_write_ui_config(struct f34_data *f34)
 779{
 780	f34->v7.config_area = v7_UI_CONFIG_AREA;
 781	f34->v7.config_data = f34->v7.img.ui_config.data;
 782	f34->v7.config_size = f34->v7.img.ui_config.size;
 783	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 784
 785	return rmi_f34v7_write_config(f34);
 786}
 787
 788static int rmi_f34v7_write_dp_config(struct f34_data *f34)
 789{
 790	f34->v7.config_area = v7_DP_CONFIG_AREA;
 791	f34->v7.config_data = f34->v7.img.dp_config.data;
 792	f34->v7.config_size = f34->v7.img.dp_config.size;
 793	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 794
 795	return rmi_f34v7_write_config(f34);
 796}
 797
 798static int rmi_f34v7_write_guest_code(struct f34_data *f34)
 799{
 800	return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.guest_code.data,
 801					    f34->v7.img.guest_code.size /
 802							f34->v7.block_size,
 803					    v7_CMD_WRITE_GUEST_CODE);
 804}
 805
 806static int rmi_f34v7_write_flash_config(struct f34_data *f34)
 807{
 808	int ret;
 809
 810	f34->v7.config_area = v7_FLASH_CONFIG_AREA;
 811	f34->v7.config_data = f34->v7.img.fl_config.data;
 812	f34->v7.config_size = f34->v7.img.fl_config.size;
 813	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 814
 815	if (f34->v7.config_block_count != f34->v7.blkcount.fl_config) {
 816		dev_err(&f34->fn->dev, "%s: Flash config size mismatch\n",
 817			__func__);
 818		return -EINVAL;
 819	}
 820
 821	init_completion(&f34->v7.cmd_done);
 822
 823	ret = rmi_f34v7_write_config(f34);
 824	if (ret < 0)
 825		return ret;
 826
 827	return 0;
 828}
 829
 830static int rmi_f34v7_write_partition_table(struct f34_data *f34)
 831{
 832	u16 block_count;
 833	int ret;
 834
 835	block_count = f34->v7.blkcount.bl_config;
 836	f34->v7.config_area = v7_BL_CONFIG_AREA;
 837	f34->v7.config_size = f34->v7.block_size * block_count;
 838	devm_kfree(&f34->fn->dev, f34->v7.read_config_buf);
 839	f34->v7.read_config_buf = devm_kzalloc(&f34->fn->dev,
 840					       f34->v7.config_size, GFP_KERNEL);
 841	if (!f34->v7.read_config_buf) {
 842		f34->v7.read_config_buf_size = 0;
 843		return -ENOMEM;
 844	}
 845
 846	f34->v7.read_config_buf_size = f34->v7.config_size;
 847
 848	ret = rmi_f34v7_read_blocks(f34, block_count, v7_CMD_READ_CONFIG);
 849	if (ret < 0)
 850		return ret;
 851
 852	ret = rmi_f34v7_write_flash_config(f34);
 853	if (ret < 0)
 854		return ret;
 855
 856	f34->v7.config_area = v7_BL_CONFIG_AREA;
 857	f34->v7.config_data = f34->v7.read_config_buf;
 858	f34->v7.config_size = f34->v7.img.bl_config.size;
 859	f34->v7.config_block_count = f34->v7.config_size / f34->v7.block_size;
 860
 861	ret = rmi_f34v7_write_config(f34);
 862	if (ret < 0)
 863		return ret;
 864
 865	return 0;
 866}
 867
 868static int rmi_f34v7_write_firmware(struct f34_data *f34)
 869{
 870	u16 blk_count;
 871
 872	blk_count = f34->v7.img.ui_firmware.size / f34->v7.block_size;
 873
 874	return rmi_f34v7_write_f34v7_blocks(f34, f34->v7.img.ui_firmware.data,
 875					    blk_count, v7_CMD_WRITE_FW);
 876}
 877
 878static void rmi_f34v7_parse_img_header_10_bl_container(struct f34_data *f34,
 879						       const void *image)
 880{
 881	int i;
 882	int num_of_containers;
 883	unsigned int addr;
 884	unsigned int container_id;
 885	unsigned int length;
 886	const void *content;
 887	const struct container_descriptor *descriptor;
 888
 889	num_of_containers = f34->v7.img.bootloader.size / 4 - 1;
 890
 891	for (i = 1; i <= num_of_containers; i++) {
 892		addr = get_unaligned_le32(f34->v7.img.bootloader.data + i * 4);
 893		descriptor = image + addr;
 894		container_id = le16_to_cpu(descriptor->container_id);
 895		content = image + le32_to_cpu(descriptor->content_address);
 896		length = le32_to_cpu(descriptor->content_length);
 897		switch (container_id) {
 898		case BL_CONFIG_CONTAINER:
 899		case GLOBAL_PARAMETERS_CONTAINER:
 900			f34->v7.img.bl_config.data = content;
 901			f34->v7.img.bl_config.size = length;
 902			break;
 903		case BL_LOCKDOWN_INFO_CONTAINER:
 904		case DEVICE_CONFIG_CONTAINER:
 905			f34->v7.img.lockdown.data = content;
 906			f34->v7.img.lockdown.size = length;
 907			break;
 908		default:
 909			break;
 910		}
 911	}
 912}
 913
 914static void rmi_f34v7_parse_image_header_10(struct f34_data *f34)
 915{
 916	unsigned int i;
 917	unsigned int num_of_containers;
 918	unsigned int addr;
 919	unsigned int offset;
 920	unsigned int container_id;
 921	unsigned int length;
 922	const void *image = f34->v7.image;
 923	const u8 *content;
 924	const struct container_descriptor *descriptor;
 925	const struct image_header_10 *header = image;
 926
 927	f34->v7.img.checksum = le32_to_cpu(header->checksum);
 928
 929	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev, "%s: f34->v7.img.checksum=%X\n",
 930		__func__, f34->v7.img.checksum);
 931
 932	/* address of top level container */
 933	offset = le32_to_cpu(header->top_level_container_start_addr);
 934	descriptor = image + offset;
 935
 936	/* address of top level container content */
 937	offset = le32_to_cpu(descriptor->content_address);
 938	num_of_containers = le32_to_cpu(descriptor->content_length) / 4;
 939
 940	for (i = 0; i < num_of_containers; i++) {
 941		addr = get_unaligned_le32(image + offset);
 942		offset += 4;
 943		descriptor = image + addr;
 944		container_id = le16_to_cpu(descriptor->container_id);
 945		content = image + le32_to_cpu(descriptor->content_address);
 946		length = le32_to_cpu(descriptor->content_length);
 947
 948		rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
 949			"%s: container_id=%d, length=%d\n", __func__,
 950			container_id, length);
 951
 952		switch (container_id) {
 953		case UI_CONTAINER:
 954		case CORE_CODE_CONTAINER:
 955			f34->v7.img.ui_firmware.data = content;
 956			f34->v7.img.ui_firmware.size = length;
 957			break;
 958		case UI_CONFIG_CONTAINER:
 959		case CORE_CONFIG_CONTAINER:
 960			f34->v7.img.ui_config.data = content;
 961			f34->v7.img.ui_config.size = length;
 962			break;
 963		case BL_CONTAINER:
 964			f34->v7.img.bl_version = *content;
 965			f34->v7.img.bootloader.data = content;
 966			f34->v7.img.bootloader.size = length;
 967			rmi_f34v7_parse_img_header_10_bl_container(f34, image);
 968			break;
 969		case GUEST_CODE_CONTAINER:
 970			f34->v7.img.contains_guest_code = true;
 971			f34->v7.img.guest_code.data = content;
 972			f34->v7.img.guest_code.size = length;
 973			break;
 974		case DISPLAY_CONFIG_CONTAINER:
 975			f34->v7.img.contains_display_cfg = true;
 976			f34->v7.img.dp_config.data = content;
 977			f34->v7.img.dp_config.size = length;
 978			break;
 979		case FLASH_CONFIG_CONTAINER:
 980			f34->v7.img.contains_flash_config = true;
 981			f34->v7.img.fl_config.data = content;
 982			f34->v7.img.fl_config.size = length;
 983			break;
 984		case GENERAL_INFORMATION_CONTAINER:
 985			f34->v7.img.contains_firmware_id = true;
 986			f34->v7.img.firmware_id =
 987				get_unaligned_le32(content + 4);
 988			break;
 989		default:
 990			break;
 991		}
 992	}
 993}
 994
 995static int rmi_f34v7_parse_image_info(struct f34_data *f34)
 996{
 997	const struct image_header_10 *header = f34->v7.image;
 998
 999	memset(&f34->v7.img, 0x00, sizeof(f34->v7.img));
1000
1001	rmi_dbg(RMI_DEBUG_FN, &f34->fn->dev,
1002		"%s: header->major_header_version = %d\n",
1003		__func__, header->major_header_version);
1004
1005	switch (header->major_header_version) {
1006	case IMAGE_HEADER_VERSION_10:
1007		rmi_f34v7_parse_image_header_10(f34);
1008		break;
1009	default:
1010		dev_err(&f34->fn->dev, "Unsupported image file format %02X\n",
1011			header->major_header_version);
1012		return -EINVAL;
1013	}
1014
1015	if (!f34->v7.img.contains_flash_config) {
1016		dev_err(&f34->fn->dev, "%s: No flash config in fw image\n",
1017			__func__);
1018		return -EINVAL;
1019	}
1020
1021	rmi_f34v7_parse_partition_table(f34, f34->v7.img.fl_config.data,
1022			&f34->v7.img.blkcount, &f34->v7.img.phyaddr);
1023
1024	return 0;
1025}
1026
1027int rmi_f34v7_do_reflash(struct f34_data *f34, const struct firmware *fw)
1028{
1029	int ret;
1030
1031	f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev,
1032					       f34->fn->irq_mask);
1033
1034	rmi_f34v7_read_queries_bl_version(f34);
1035
1036	f34->v7.image = fw->data;
1037	f34->update_progress = 0;
1038	f34->update_size = 0;
1039
1040	ret = rmi_f34v7_parse_image_info(f34);
1041	if (ret < 0)
1042		return ret;
1043
1044	ret = rmi_f34v7_check_bl_config_size(f34);
1045	if (ret < 0)
1046		return ret;
1047
1048	ret = rmi_f34v7_erase_all(f34);
1049	if (ret < 0)
1050		return ret;
1051
1052	ret = rmi_f34v7_write_partition_table(f34);
1053	if (ret < 0)
1054		return ret;
1055	dev_info(&f34->fn->dev, "%s: Partition table programmed\n", __func__);
1056
1057	/*
1058	 * Reset to reload partition table - as the previous firmware has been
1059	 * erased, we remain in bootloader mode.
1060	 */
1061	ret = rmi_scan_pdt(f34->fn->rmi_dev, NULL, rmi_initial_reset);
1062	if (ret < 0)
1063		dev_warn(&f34->fn->dev, "RMI reset failed!\n");
1064
1065	dev_info(&f34->fn->dev, "Writing firmware (%d bytes)...\n",
1066		 f34->v7.img.ui_firmware.size);
1067
1068	ret = rmi_f34v7_write_firmware(f34);
1069	if (ret < 0)
1070		return ret;
1071
1072	dev_info(&f34->fn->dev, "Writing config (%d bytes)...\n",
1073		 f34->v7.img.ui_config.size);
1074
1075	f34->v7.config_area = v7_UI_CONFIG_AREA;
1076	ret = rmi_f34v7_write_ui_config(f34);
1077	if (ret < 0)
1078		return ret;
1079
1080	if (f34->v7.has_display_cfg && f34->v7.img.contains_display_cfg) {
1081		dev_info(&f34->fn->dev, "Writing display config...\n");
1082
1083		ret = rmi_f34v7_write_dp_config(f34);
1084		if (ret < 0)
1085			return ret;
1086	}
1087
1088	if (f34->v7.has_guest_code && f34->v7.img.contains_guest_code) {
1089		dev_info(&f34->fn->dev, "Writing guest code...\n");
1090
1091		ret = rmi_f34v7_write_guest_code(f34);
1092		if (ret < 0)
1093			return ret;
1094	}
1095
1096	return 0;
1097}
1098
1099static int rmi_f34v7_enter_flash_prog(struct f34_data *f34)
1100{
1101	int ret;
1102
1103	f34->fn->rmi_dev->driver->set_irq_bits(f34->fn->rmi_dev, f34->fn->irq_mask);
1104
1105	ret = rmi_f34v7_read_flash_status(f34);
1106	if (ret < 0)
1107		return ret;
1108
1109	if (f34->v7.in_bl_mode) {
1110		dev_info(&f34->fn->dev, "%s: Device in bootloader mode\n",
1111			 __func__);
1112		return 0;
1113	}
1114
1115	init_completion(&f34->v7.cmd_done);
1116
1117	ret = rmi_f34v7_write_command(f34, v7_CMD_ENABLE_FLASH_PROG);
1118	if (ret < 0)
1119		return ret;
1120
1121	ret = rmi_f34v7_check_command_status(f34, F34_ENABLE_WAIT_MS);
1122	if (ret < 0)
1123		return ret;
1124
1125	return 0;
1126}
1127
1128int rmi_f34v7_start_reflash(struct f34_data *f34, const struct firmware *fw)
1129{
1130	int ret = 0;
1131
1132	f34->v7.config_area = v7_UI_CONFIG_AREA;
1133	f34->v7.image = fw->data;
1134
1135	ret = rmi_f34v7_parse_image_info(f34);
1136	if (ret < 0)
1137		return ret;
1138
1139	dev_info(&f34->fn->dev, "Firmware image OK\n");
1140
1141	return rmi_f34v7_enter_flash_prog(f34);
1142}
1143
1144int rmi_f34v7_probe(struct f34_data *f34)
1145{
1146	int ret;
1147
1148	/* Read bootloader version */
1149	ret = rmi_read_block(f34->fn->rmi_dev,
1150			f34->fn->fd.query_base_addr + V7_BOOTLOADER_ID_OFFSET,
1151			f34->bootloader_id,
1152			sizeof(f34->bootloader_id));
1153	if (ret < 0) {
1154		dev_err(&f34->fn->dev, "%s: Failed to read bootloader ID\n",
1155			__func__);
1156		return ret;
1157	}
1158
1159	if (f34->bootloader_id[1] == '5') {
1160		f34->bl_version = 5;
1161	} else if (f34->bootloader_id[1] == '6') {
1162		f34->bl_version = 6;
1163	} else if (f34->bootloader_id[1] == 7) {
1164		f34->bl_version = 7;
1165	} else if (f34->bootloader_id[1] == 8) {
1166		f34->bl_version = 8;
1167	} else {
1168		dev_err(&f34->fn->dev,
1169			"%s: Unrecognized bootloader version: %d (%c) %d (%c)\n",
1170			__func__,
1171			f34->bootloader_id[0], f34->bootloader_id[0],
1172			f34->bootloader_id[1], f34->bootloader_id[1]);
1173		return -EINVAL;
1174	}
1175
1176	memset(&f34->v7.blkcount, 0x00, sizeof(f34->v7.blkcount));
1177	memset(&f34->v7.phyaddr, 0x00, sizeof(f34->v7.phyaddr));
1178
1179	init_completion(&f34->v7.cmd_done);
1180
1181	ret = rmi_f34v7_read_queries(f34);
1182	if (ret < 0)
1183		return ret;
1184
1185	return 0;
1186}