cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

octeon_console.c (25547B)


      1/**********************************************************************
      2 * Author: Cavium, Inc.
      3 *
      4 * Contact: support@cavium.com
      5 *          Please include "LiquidIO" in the subject.
      6 *
      7 * Copyright (c) 2003-2016 Cavium, Inc.
      8 *
      9 * This file is free software; you can redistribute it and/or modify
     10 * it under the terms of the GNU General Public License, Version 2, as
     11 * published by the Free Software Foundation.
     12 *
     13 * This file is distributed in the hope that it will be useful, but
     14 * AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty
     15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
     16 * NONINFRINGEMENT.  See the GNU General Public License for more details.
     17 ***********************************************************************/
     18/*
     19 * @file octeon_console.c
     20 */
     21#include <linux/moduleparam.h>
     22#include <linux/pci.h>
     23#include <linux/netdevice.h>
     24#include <linux/crc32.h>
     25#include "liquidio_common.h"
     26#include "octeon_droq.h"
     27#include "octeon_iq.h"
     28#include "response_manager.h"
     29#include "octeon_device.h"
     30#include "liquidio_image.h"
     31#include "octeon_mem_ops.h"
     32
     33static void octeon_remote_lock(void);
     34static void octeon_remote_unlock(void);
     35static u64 cvmx_bootmem_phy_named_block_find(struct octeon_device *oct,
     36					     const char *name,
     37					     u32 flags);
     38static int octeon_console_read(struct octeon_device *oct, u32 console_num,
     39			       char *buffer, u32 buf_size);
     40
     41#define BOOTLOADER_PCI_READ_BUFFER_DATA_ADDR    0x0006c008
     42#define BOOTLOADER_PCI_READ_BUFFER_LEN_ADDR     0x0006c004
     43#define BOOTLOADER_PCI_READ_BUFFER_OWNER_ADDR   0x0006c000
     44#define BOOTLOADER_PCI_READ_DESC_ADDR           0x0006c100
     45#define BOOTLOADER_PCI_WRITE_BUFFER_STR_LEN     248
     46
     47#define OCTEON_PCI_IO_BUF_OWNER_OCTEON    0x00000001
     48#define OCTEON_PCI_IO_BUF_OWNER_HOST      0x00000002
     49
     50/** Can change without breaking ABI */
     51#define CVMX_BOOTMEM_NUM_NAMED_BLOCKS 64
     52
     53/** minimum alignment of bootmem alloced blocks */
     54#define CVMX_BOOTMEM_ALIGNMENT_SIZE     (16ull)
     55
     56/** CVMX bootmem descriptor major version */
     57#define CVMX_BOOTMEM_DESC_MAJ_VER   3
     58/* CVMX bootmem descriptor minor version */
     59#define CVMX_BOOTMEM_DESC_MIN_VER   0
     60
     61/* Current versions */
     62#define OCTEON_PCI_CONSOLE_MAJOR_VERSION    1
     63#define OCTEON_PCI_CONSOLE_MINOR_VERSION    0
     64#define OCTEON_PCI_CONSOLE_BLOCK_NAME   "__pci_console"
     65#define OCTEON_CONSOLE_POLL_INTERVAL_MS  100    /* 10 times per second */
     66
     67/* First three members of cvmx_bootmem_desc are left in original
     68 * positions for backwards compatibility.
     69 * Assumes big endian target
     70 */
     71struct cvmx_bootmem_desc {
     72	/** spinlock to control access to list */
     73	u32 lock;
     74
     75	/** flags for indicating various conditions */
     76	u32 flags;
     77
     78	u64 head_addr;
     79
     80	/** incremented changed when incompatible changes made */
     81	u32 major_version;
     82
     83	/** incremented changed when compatible changes made,
     84	 *  reset to zero when major incremented
     85	 */
     86	u32 minor_version;
     87
     88	u64 app_data_addr;
     89	u64 app_data_size;
     90
     91	/** number of elements in named blocks array */
     92	u32 nb_num_blocks;
     93
     94	/** length of name array in bootmem blocks */
     95	u32 named_block_name_len;
     96
     97	/** address of named memory block descriptors */
     98	u64 named_block_array_addr;
     99};
    100
    101/* Structure that defines a single console.
    102 *
    103 * Note: when read_index == write_index, the buffer is empty.
    104 * The actual usable size of each console is console_buf_size -1;
    105 */
    106struct octeon_pci_console {
    107	u64 input_base_addr;
    108	u32 input_read_index;
    109	u32 input_write_index;
    110	u64 output_base_addr;
    111	u32 output_read_index;
    112	u32 output_write_index;
    113	u32 lock;
    114	u32 buf_size;
    115};
    116
    117/* This is the main container structure that contains all the information
    118 * about all PCI consoles.  The address of this structure is passed to various
    119 * routines that operation on PCI consoles.
    120 */
    121struct octeon_pci_console_desc {
    122	u32 major_version;
    123	u32 minor_version;
    124	u32 lock;
    125	u32 flags;
    126	u32 num_consoles;
    127	u32 pad;
    128	/* must be 64 bit aligned here... */
    129	/* Array of addresses of octeon_pci_console structures */
    130	u64 console_addr_array[];
    131	/* Implicit storage for console_addr_array */
    132};
    133
    134/*
    135 * This function is the implementation of the get macros defined
    136 * for individual structure members. The argument are generated
    137 * by the macros inorder to read only the needed memory.
    138 *
    139 * @param oct    Pointer to current octeon device
    140 * @param base   64bit physical address of the complete structure
    141 * @param offset Offset from the beginning of the structure to the member being
    142 *               accessed.
    143 * @param size   Size of the structure member.
    144 *
    145 * @return Value of the structure member promoted into a u64.
    146 */
    147static inline u64 __cvmx_bootmem_desc_get(struct octeon_device *oct,
    148					  u64 base,
    149					  u32 offset,
    150					  u32 size)
    151{
    152	base = (1ull << 63) | (base + offset);
    153	switch (size) {
    154	case 4:
    155		return octeon_read_device_mem32(oct, base);
    156	case 8:
    157		return octeon_read_device_mem64(oct, base);
    158	default:
    159		return 0;
    160	}
    161}
    162
    163/*
    164 * This function retrieves the string name of a named block. It is
    165 * more complicated than a simple memcpy() since the named block
    166 * descriptor may not be directly accessible.
    167 *
    168 * @param addr   Physical address of the named block descriptor
    169 * @param str    String to receive the named block string name
    170 * @param len    Length of the string buffer, which must match the length
    171 *               stored in the bootmem descriptor.
    172 */
    173static void CVMX_BOOTMEM_NAMED_GET_NAME(struct octeon_device *oct,
    174					u64 addr,
    175					char *str,
    176					u32 len)
    177{
    178	addr += offsetof(struct cvmx_bootmem_named_block_desc, name);
    179	octeon_pci_read_core_mem(oct, addr, (u8 *)str, len);
    180	str[len] = 0;
    181}
    182
    183/* See header file for descriptions of functions */
    184
    185/*
    186 * Check the version information on the bootmem descriptor
    187 *
    188 * @param exact_match
    189 *               Exact major version to check against. A zero means
    190 *               check that the version supports named blocks.
    191 *
    192 * @return Zero if the version is correct. Negative if the version is
    193 *         incorrect. Failures also cause a message to be displayed.
    194 */
    195static int __cvmx_bootmem_check_version(struct octeon_device *oct,
    196					u32 exact_match)
    197{
    198	u32 major_version;
    199	u32 minor_version;
    200
    201	if (!oct->bootmem_desc_addr)
    202		oct->bootmem_desc_addr =
    203			octeon_read_device_mem64(oct,
    204						 BOOTLOADER_PCI_READ_DESC_ADDR);
    205	major_version = (u32)__cvmx_bootmem_desc_get(
    206			oct, oct->bootmem_desc_addr,
    207			offsetof(struct cvmx_bootmem_desc, major_version),
    208			sizeof_field(struct cvmx_bootmem_desc, major_version));
    209	minor_version = (u32)__cvmx_bootmem_desc_get(
    210			oct, oct->bootmem_desc_addr,
    211			offsetof(struct cvmx_bootmem_desc, minor_version),
    212			sizeof_field(struct cvmx_bootmem_desc, minor_version));
    213
    214	dev_dbg(&oct->pci_dev->dev, "%s: major_version=%d\n", __func__,
    215		major_version);
    216	if ((major_version > 3) ||
    217	    (exact_match && major_version != exact_match)) {
    218		dev_err(&oct->pci_dev->dev, "bootmem ver mismatch %d.%d addr:0x%llx\n",
    219			major_version, minor_version,
    220			(long long)oct->bootmem_desc_addr);
    221		return -1;
    222	} else {
    223		return 0;
    224	}
    225}
    226
    227static const struct cvmx_bootmem_named_block_desc
    228*__cvmx_bootmem_find_named_block_flags(struct octeon_device *oct,
    229					const char *name, u32 flags)
    230{
    231	struct cvmx_bootmem_named_block_desc *desc =
    232		&oct->bootmem_named_block_desc;
    233	u64 named_addr = cvmx_bootmem_phy_named_block_find(oct, name, flags);
    234
    235	if (named_addr) {
    236		desc->base_addr = __cvmx_bootmem_desc_get(
    237				oct, named_addr,
    238				offsetof(struct cvmx_bootmem_named_block_desc,
    239					 base_addr),
    240				sizeof_field(
    241					struct cvmx_bootmem_named_block_desc,
    242					base_addr));
    243		desc->size = __cvmx_bootmem_desc_get(oct, named_addr,
    244				offsetof(struct cvmx_bootmem_named_block_desc,
    245					 size),
    246				sizeof_field(
    247					struct cvmx_bootmem_named_block_desc,
    248					size));
    249
    250		strncpy(desc->name, name, sizeof(desc->name));
    251		desc->name[sizeof(desc->name) - 1] = 0;
    252		return &oct->bootmem_named_block_desc;
    253	} else {
    254		return NULL;
    255	}
    256}
    257
    258static u64 cvmx_bootmem_phy_named_block_find(struct octeon_device *oct,
    259					     const char *name,
    260					     u32 flags)
    261{
    262	u64 result = 0;
    263
    264	if (!__cvmx_bootmem_check_version(oct, 3)) {
    265		u32 i;
    266
    267		u64 named_block_array_addr = __cvmx_bootmem_desc_get(
    268					oct, oct->bootmem_desc_addr,
    269					offsetof(struct cvmx_bootmem_desc,
    270						 named_block_array_addr),
    271					sizeof_field(struct cvmx_bootmem_desc,
    272						     named_block_array_addr));
    273		u32 num_blocks = (u32)__cvmx_bootmem_desc_get(
    274					oct, oct->bootmem_desc_addr,
    275					offsetof(struct cvmx_bootmem_desc,
    276						 nb_num_blocks),
    277					sizeof_field(struct cvmx_bootmem_desc,
    278						     nb_num_blocks));
    279
    280		u32 name_length = (u32)__cvmx_bootmem_desc_get(
    281					oct, oct->bootmem_desc_addr,
    282					offsetof(struct cvmx_bootmem_desc,
    283						 named_block_name_len),
    284					sizeof_field(struct cvmx_bootmem_desc,
    285						     named_block_name_len));
    286
    287		u64 named_addr = named_block_array_addr;
    288
    289		for (i = 0; i < num_blocks; i++) {
    290			u64 named_size = __cvmx_bootmem_desc_get(
    291					oct, named_addr,
    292					 offsetof(
    293					struct cvmx_bootmem_named_block_desc,
    294					size),
    295					 sizeof_field(
    296					struct cvmx_bootmem_named_block_desc,
    297					size));
    298
    299			if (name && named_size) {
    300				char *name_tmp =
    301					kmalloc(name_length + 1, GFP_KERNEL);
    302				if (!name_tmp)
    303					break;
    304
    305				CVMX_BOOTMEM_NAMED_GET_NAME(oct, named_addr,
    306							    name_tmp,
    307							    name_length);
    308				if (!strncmp(name, name_tmp, name_length)) {
    309					result = named_addr;
    310					kfree(name_tmp);
    311					break;
    312				}
    313				kfree(name_tmp);
    314			} else if (!name && !named_size) {
    315				result = named_addr;
    316				break;
    317			}
    318
    319			named_addr +=
    320				sizeof(struct cvmx_bootmem_named_block_desc);
    321		}
    322	}
    323	return result;
    324}
    325
    326/*
    327 * Find a named block on the remote Octeon
    328 *
    329 * @param name      Name of block to find
    330 * @param base_addr Address the block is at (OUTPUT)
    331 * @param size      The size of the block (OUTPUT)
    332 *
    333 * @return Zero on success, One on failure.
    334 */
    335static int octeon_named_block_find(struct octeon_device *oct, const char *name,
    336				   u64 *base_addr, u64 *size)
    337{
    338	const struct cvmx_bootmem_named_block_desc *named_block;
    339
    340	octeon_remote_lock();
    341	named_block = __cvmx_bootmem_find_named_block_flags(oct, name, 0);
    342	octeon_remote_unlock();
    343	if (named_block) {
    344		*base_addr = named_block->base_addr;
    345		*size = named_block->size;
    346		return 0;
    347	}
    348	return 1;
    349}
    350
    351static void octeon_remote_lock(void)
    352{
    353	/* fill this in if any sharing is needed */
    354}
    355
    356static void octeon_remote_unlock(void)
    357{
    358	/* fill this in if any sharing is needed */
    359}
    360
    361int octeon_console_send_cmd(struct octeon_device *oct, char *cmd_str,
    362			    u32 wait_hundredths)
    363{
    364	u32 len = (u32)strlen(cmd_str);
    365
    366	dev_dbg(&oct->pci_dev->dev, "sending \"%s\" to bootloader\n", cmd_str);
    367
    368	if (len > BOOTLOADER_PCI_WRITE_BUFFER_STR_LEN - 1) {
    369		dev_err(&oct->pci_dev->dev, "Command string too long, max length is: %d\n",
    370			BOOTLOADER_PCI_WRITE_BUFFER_STR_LEN - 1);
    371		return -1;
    372	}
    373
    374	if (octeon_wait_for_bootloader(oct, wait_hundredths) != 0) {
    375		dev_err(&oct->pci_dev->dev, "Bootloader not ready for command.\n");
    376		return -1;
    377	}
    378
    379	/* Write command to bootloader */
    380	octeon_remote_lock();
    381	octeon_pci_write_core_mem(oct, BOOTLOADER_PCI_READ_BUFFER_DATA_ADDR,
    382				  (u8 *)cmd_str, len);
    383	octeon_write_device_mem32(oct, BOOTLOADER_PCI_READ_BUFFER_LEN_ADDR,
    384				  len);
    385	octeon_write_device_mem32(oct, BOOTLOADER_PCI_READ_BUFFER_OWNER_ADDR,
    386				  OCTEON_PCI_IO_BUF_OWNER_OCTEON);
    387
    388	/* Bootloader should accept command very quickly
    389	 * if it really was ready
    390	 */
    391	if (octeon_wait_for_bootloader(oct, 200) != 0) {
    392		octeon_remote_unlock();
    393		dev_err(&oct->pci_dev->dev, "Bootloader did not accept command.\n");
    394		return -1;
    395	}
    396	octeon_remote_unlock();
    397	return 0;
    398}
    399
    400int octeon_wait_for_bootloader(struct octeon_device *oct,
    401			       u32 wait_time_hundredths)
    402{
    403	dev_dbg(&oct->pci_dev->dev, "waiting %d0 ms for bootloader\n",
    404		wait_time_hundredths);
    405
    406	if (octeon_mem_access_ok(oct))
    407		return -1;
    408
    409	while (wait_time_hundredths > 0 &&
    410	       octeon_read_device_mem32(oct,
    411					BOOTLOADER_PCI_READ_BUFFER_OWNER_ADDR)
    412	       != OCTEON_PCI_IO_BUF_OWNER_HOST) {
    413		if (--wait_time_hundredths <= 0)
    414			return -1;
    415		schedule_timeout_uninterruptible(HZ / 100);
    416	}
    417	return 0;
    418}
    419
    420static void octeon_console_handle_result(struct octeon_device *oct,
    421					 size_t console_num)
    422{
    423	struct octeon_console *console;
    424
    425	console = &oct->console[console_num];
    426
    427	console->waiting = 0;
    428}
    429
    430static char console_buffer[OCTEON_CONSOLE_MAX_READ_BYTES];
    431
    432static void output_console_line(struct octeon_device *oct,
    433				struct octeon_console *console,
    434				size_t console_num,
    435				char *console_buffer,
    436				s32 bytes_read)
    437{
    438	char *line;
    439	s32 i;
    440	size_t len;
    441
    442	line = console_buffer;
    443	for (i = 0; i < bytes_read; i++) {
    444		/* Output a line at a time, prefixed */
    445		if (console_buffer[i] == '\n') {
    446			console_buffer[i] = '\0';
    447			/* We need to output 'line', prefaced by 'leftover'.
    448			 * However, it is possible we're being called to
    449			 * output 'leftover' by itself (in the case of nothing
    450			 * having been read from the console).
    451			 *
    452			 * To avoid duplication, check for this condition.
    453			 */
    454			if (console->leftover[0] &&
    455			    (line != console->leftover)) {
    456				if (console->print)
    457					(*console->print)(oct, (u32)console_num,
    458							  console->leftover,
    459							  line);
    460				console->leftover[0] = '\0';
    461			} else {
    462				if (console->print)
    463					(*console->print)(oct, (u32)console_num,
    464							  line, NULL);
    465			}
    466			line = &console_buffer[i + 1];
    467		}
    468	}
    469
    470	/* Save off any leftovers */
    471	if (line != &console_buffer[bytes_read]) {
    472		console_buffer[bytes_read] = '\0';
    473		len = strlen(console->leftover);
    474		strncpy(&console->leftover[len], line,
    475			sizeof(console->leftover) - len);
    476	}
    477}
    478
    479static void check_console(struct work_struct *work)
    480{
    481	s32 bytes_read, tries, total_read;
    482	size_t len;
    483	struct octeon_console *console;
    484	struct cavium_wk *wk = (struct cavium_wk *)work;
    485	struct octeon_device *oct = (struct octeon_device *)wk->ctxptr;
    486	u32 console_num = (u32)wk->ctxul;
    487	u32 delay;
    488
    489	console = &oct->console[console_num];
    490	tries = 0;
    491	total_read = 0;
    492
    493	do {
    494		/* Take console output regardless of whether it will
    495		 * be logged
    496		 */
    497		bytes_read =
    498			octeon_console_read(oct, console_num, console_buffer,
    499					    sizeof(console_buffer) - 1);
    500		if (bytes_read > 0) {
    501			total_read += bytes_read;
    502			if (console->waiting)
    503				octeon_console_handle_result(oct, console_num);
    504			if (console->print) {
    505				output_console_line(oct, console, console_num,
    506						    console_buffer, bytes_read);
    507			}
    508		} else if (bytes_read < 0) {
    509			dev_err(&oct->pci_dev->dev, "Error reading console %u, ret=%d\n",
    510				console_num, bytes_read);
    511		}
    512
    513		tries++;
    514	} while ((bytes_read > 0) && (tries < 16));
    515
    516	/* If nothing is read after polling the console,
    517	 * output any leftovers if any
    518	 */
    519	if (console->print && (total_read == 0) &&
    520	    (console->leftover[0])) {
    521		/* append '\n' as terminator for 'output_console_line' */
    522		len = strlen(console->leftover);
    523		console->leftover[len] = '\n';
    524		output_console_line(oct, console, console_num,
    525				    console->leftover, (s32)(len + 1));
    526		console->leftover[0] = '\0';
    527	}
    528
    529	delay = OCTEON_CONSOLE_POLL_INTERVAL_MS;
    530
    531	schedule_delayed_work(&wk->work, msecs_to_jiffies(delay));
    532}
    533
    534int octeon_init_consoles(struct octeon_device *oct)
    535{
    536	int ret = 0;
    537	u64 addr, size;
    538
    539	ret = octeon_mem_access_ok(oct);
    540	if (ret) {
    541		dev_err(&oct->pci_dev->dev, "Memory access not okay'\n");
    542		return ret;
    543	}
    544
    545	ret = octeon_named_block_find(oct, OCTEON_PCI_CONSOLE_BLOCK_NAME, &addr,
    546				      &size);
    547	if (ret) {
    548		dev_err(&oct->pci_dev->dev, "Could not find console '%s'\n",
    549			OCTEON_PCI_CONSOLE_BLOCK_NAME);
    550		return ret;
    551	}
    552
    553	/* Dedicate one of Octeon's BAR1 index registers to create a static
    554	 * mapping to a region of Octeon DRAM that contains the PCI console
    555	 * named block.
    556	 */
    557	oct->console_nb_info.bar1_index = BAR1_INDEX_STATIC_MAP;
    558	oct->fn_list.bar1_idx_setup(oct, addr, oct->console_nb_info.bar1_index,
    559				    true);
    560	oct->console_nb_info.dram_region_base = addr
    561		& ~(OCTEON_BAR1_ENTRY_SIZE - 1ULL);
    562
    563	/* num_consoles > 0, is an indication that the consoles
    564	 * are accessible
    565	 */
    566	oct->num_consoles = octeon_read_device_mem32(oct,
    567		addr + offsetof(struct octeon_pci_console_desc,
    568			num_consoles));
    569	oct->console_desc_addr = addr;
    570
    571	dev_dbg(&oct->pci_dev->dev, "Initialized consoles. %d available\n",
    572		oct->num_consoles);
    573
    574	return ret;
    575}
    576
    577static void octeon_get_uboot_version(struct octeon_device *oct)
    578{
    579	s32 bytes_read, tries, total_read;
    580	struct octeon_console *console;
    581	u32 console_num = 0;
    582	char *uboot_ver;
    583	char *buf;
    584	char *p;
    585
    586#define OCTEON_UBOOT_VER_BUF_SIZE 512
    587	buf = kmalloc(OCTEON_UBOOT_VER_BUF_SIZE, GFP_KERNEL);
    588	if (!buf)
    589		return;
    590
    591	if (octeon_console_send_cmd(oct, "setenv stdout pci\n", 50)) {
    592		kfree(buf);
    593		return;
    594	}
    595
    596	if (octeon_console_send_cmd(oct, "version\n", 1)) {
    597		kfree(buf);
    598		return;
    599	}
    600
    601	console = &oct->console[console_num];
    602	tries = 0;
    603	total_read = 0;
    604
    605	do {
    606		/* Take console output regardless of whether it will
    607		 * be logged
    608		 */
    609		bytes_read =
    610			octeon_console_read(oct,
    611					    console_num, buf + total_read,
    612					    OCTEON_UBOOT_VER_BUF_SIZE - 1 -
    613					    total_read);
    614		if (bytes_read > 0) {
    615			buf[bytes_read] = '\0';
    616
    617			total_read += bytes_read;
    618			if (console->waiting)
    619				octeon_console_handle_result(oct, console_num);
    620		} else if (bytes_read < 0) {
    621			dev_err(&oct->pci_dev->dev, "Error reading console %u, ret=%d\n",
    622				console_num, bytes_read);
    623		}
    624
    625		tries++;
    626	} while ((bytes_read > 0) && (tries < 16));
    627
    628	/* If nothing is read after polling the console,
    629	 * output any leftovers if any
    630	 */
    631	if ((total_read == 0) && (console->leftover[0])) {
    632		dev_dbg(&oct->pci_dev->dev, "%u: %s\n",
    633			console_num, console->leftover);
    634		console->leftover[0] = '\0';
    635	}
    636
    637	buf[OCTEON_UBOOT_VER_BUF_SIZE - 1] = '\0';
    638
    639	uboot_ver = strstr(buf, "U-Boot");
    640	if (uboot_ver) {
    641		p = strstr(uboot_ver, "mips");
    642		if (p) {
    643			p--;
    644			*p = '\0';
    645			dev_info(&oct->pci_dev->dev, "%s\n", uboot_ver);
    646		}
    647	}
    648
    649	kfree(buf);
    650	octeon_console_send_cmd(oct, "setenv stdout serial\n", 50);
    651}
    652
    653int octeon_add_console(struct octeon_device *oct, u32 console_num,
    654		       char *dbg_enb)
    655{
    656	int ret = 0;
    657	u32 delay;
    658	u64 coreaddr;
    659	struct delayed_work *work;
    660	struct octeon_console *console;
    661
    662	if (console_num >= oct->num_consoles) {
    663		dev_err(&oct->pci_dev->dev,
    664			"trying to read from console number %d when only 0 to %d exist\n",
    665			console_num, oct->num_consoles);
    666	} else {
    667		console = &oct->console[console_num];
    668
    669		console->waiting = 0;
    670
    671		coreaddr = oct->console_desc_addr + console_num * 8 +
    672			offsetof(struct octeon_pci_console_desc,
    673				 console_addr_array);
    674		console->addr = octeon_read_device_mem64(oct, coreaddr);
    675		coreaddr = console->addr + offsetof(struct octeon_pci_console,
    676						    buf_size);
    677		console->buffer_size = octeon_read_device_mem32(oct, coreaddr);
    678		coreaddr = console->addr + offsetof(struct octeon_pci_console,
    679						    input_base_addr);
    680		console->input_base_addr =
    681			octeon_read_device_mem64(oct, coreaddr);
    682		coreaddr = console->addr + offsetof(struct octeon_pci_console,
    683						    output_base_addr);
    684		console->output_base_addr =
    685			octeon_read_device_mem64(oct, coreaddr);
    686		console->leftover[0] = '\0';
    687
    688		work = &oct->console_poll_work[console_num].work;
    689
    690		octeon_get_uboot_version(oct);
    691
    692		INIT_DELAYED_WORK(work, check_console);
    693		oct->console_poll_work[console_num].ctxptr = (void *)oct;
    694		oct->console_poll_work[console_num].ctxul = console_num;
    695		delay = OCTEON_CONSOLE_POLL_INTERVAL_MS;
    696		schedule_delayed_work(work, msecs_to_jiffies(delay));
    697
    698		/* an empty string means use default debug console enablement */
    699		if (dbg_enb && !dbg_enb[0])
    700			dbg_enb = "setenv pci_console_active 1";
    701		if (dbg_enb)
    702			ret = octeon_console_send_cmd(oct, dbg_enb, 2000);
    703
    704		console->active = 1;
    705	}
    706
    707	return ret;
    708}
    709
    710/*
    711 * Removes all consoles
    712 *
    713 * @param oct         octeon device
    714 */
    715void octeon_remove_consoles(struct octeon_device *oct)
    716{
    717	u32 i;
    718	struct octeon_console *console;
    719
    720	for (i = 0; i < oct->num_consoles; i++) {
    721		console = &oct->console[i];
    722
    723		if (!console->active)
    724			continue;
    725
    726		cancel_delayed_work_sync(&oct->console_poll_work[i].
    727						work);
    728		console->addr = 0;
    729		console->buffer_size = 0;
    730		console->input_base_addr = 0;
    731		console->output_base_addr = 0;
    732	}
    733
    734	oct->num_consoles = 0;
    735}
    736
    737static inline int octeon_console_free_bytes(u32 buffer_size,
    738					    u32 wr_idx,
    739					    u32 rd_idx)
    740{
    741	if (rd_idx >= buffer_size || wr_idx >= buffer_size)
    742		return -1;
    743
    744	return ((buffer_size - 1) - (wr_idx - rd_idx)) % buffer_size;
    745}
    746
    747static inline int octeon_console_avail_bytes(u32 buffer_size,
    748					     u32 wr_idx,
    749					     u32 rd_idx)
    750{
    751	if (rd_idx >= buffer_size || wr_idx >= buffer_size)
    752		return -1;
    753
    754	return buffer_size - 1 -
    755	       octeon_console_free_bytes(buffer_size, wr_idx, rd_idx);
    756}
    757
    758static int octeon_console_read(struct octeon_device *oct, u32 console_num,
    759			       char *buffer, u32 buf_size)
    760{
    761	int bytes_to_read;
    762	u32 rd_idx, wr_idx;
    763	struct octeon_console *console;
    764
    765	if (console_num >= oct->num_consoles) {
    766		dev_err(&oct->pci_dev->dev, "Attempted to read from disabled console %d\n",
    767			console_num);
    768		return 0;
    769	}
    770
    771	console = &oct->console[console_num];
    772
    773	/* Check to see if any data is available.
    774	 * Maybe optimize this with 64-bit read.
    775	 */
    776	rd_idx = octeon_read_device_mem32(oct, console->addr +
    777		offsetof(struct octeon_pci_console, output_read_index));
    778	wr_idx = octeon_read_device_mem32(oct, console->addr +
    779		offsetof(struct octeon_pci_console, output_write_index));
    780
    781	bytes_to_read = octeon_console_avail_bytes(console->buffer_size,
    782						   wr_idx, rd_idx);
    783	if (bytes_to_read <= 0)
    784		return bytes_to_read;
    785
    786	bytes_to_read = min_t(s32, bytes_to_read, buf_size);
    787
    788	/* Check to see if what we want to read is not contiguous, and limit
    789	 * ourselves to the contiguous block
    790	 */
    791	if (rd_idx + bytes_to_read >= console->buffer_size)
    792		bytes_to_read = console->buffer_size - rd_idx;
    793
    794	octeon_pci_read_core_mem(oct, console->output_base_addr + rd_idx,
    795				 (u8 *)buffer, bytes_to_read);
    796	octeon_write_device_mem32(oct, console->addr +
    797				  offsetof(struct octeon_pci_console,
    798					   output_read_index),
    799				  (rd_idx + bytes_to_read) %
    800				  console->buffer_size);
    801
    802	return bytes_to_read;
    803}
    804
    805#define FBUF_SIZE	(4 * 1024 * 1024)
    806#define MAX_BOOTTIME_SIZE    80
    807
    808int octeon_download_firmware(struct octeon_device *oct, const u8 *data,
    809			     size_t size)
    810{
    811	struct octeon_firmware_file_header *h;
    812	char boottime[MAX_BOOTTIME_SIZE];
    813	struct timespec64 ts;
    814	u32 crc32_result;
    815	u64 load_addr;
    816	u32 image_len;
    817	int ret = 0;
    818	u32 i, rem;
    819
    820	if (size < sizeof(struct octeon_firmware_file_header)) {
    821		dev_err(&oct->pci_dev->dev, "Firmware file too small (%d < %d).\n",
    822			(u32)size,
    823			(u32)sizeof(struct octeon_firmware_file_header));
    824		return -EINVAL;
    825	}
    826
    827	h = (struct octeon_firmware_file_header *)data;
    828
    829	if (be32_to_cpu(h->magic) != LIO_NIC_MAGIC) {
    830		dev_err(&oct->pci_dev->dev, "Unrecognized firmware file.\n");
    831		return -EINVAL;
    832	}
    833
    834	crc32_result = crc32((unsigned int)~0, data,
    835			     sizeof(struct octeon_firmware_file_header) -
    836			     sizeof(u32)) ^ ~0U;
    837	if (crc32_result != be32_to_cpu(h->crc32)) {
    838		dev_err(&oct->pci_dev->dev, "Firmware CRC mismatch (0x%08x != 0x%08x).\n",
    839			crc32_result, be32_to_cpu(h->crc32));
    840		return -EINVAL;
    841	}
    842
    843	if (memcmp(LIQUIDIO_BASE_VERSION, h->version,
    844		   strlen(LIQUIDIO_BASE_VERSION))) {
    845		dev_err(&oct->pci_dev->dev, "Unmatched firmware version. Expected %s.x, got %s.\n",
    846			LIQUIDIO_BASE_VERSION,
    847			h->version);
    848		return -EINVAL;
    849	}
    850
    851	if (be32_to_cpu(h->num_images) > LIO_MAX_IMAGES) {
    852		dev_err(&oct->pci_dev->dev, "Too many images in firmware file (%d).\n",
    853			be32_to_cpu(h->num_images));
    854		return -EINVAL;
    855	}
    856
    857	dev_info(&oct->pci_dev->dev, "Firmware version: %s\n", h->version);
    858	snprintf(oct->fw_info.liquidio_firmware_version, 32, "LIQUIDIO: %s",
    859		 h->version);
    860
    861	data += sizeof(struct octeon_firmware_file_header);
    862
    863	dev_info(&oct->pci_dev->dev, "%s: Loading %d images\n", __func__,
    864		 be32_to_cpu(h->num_images));
    865	/* load all images */
    866	for (i = 0; i < be32_to_cpu(h->num_images); i++) {
    867		load_addr = be64_to_cpu(h->desc[i].addr);
    868		image_len = be32_to_cpu(h->desc[i].len);
    869
    870		dev_info(&oct->pci_dev->dev, "Loading firmware %d at %llx\n",
    871			 image_len, load_addr);
    872
    873		/* Write in 4MB chunks*/
    874		rem = image_len;
    875
    876		while (rem) {
    877			if (rem < FBUF_SIZE)
    878				size = rem;
    879			else
    880				size = FBUF_SIZE;
    881
    882			/* download the image */
    883			octeon_pci_write_core_mem(oct, load_addr, data, (u32)size);
    884
    885			data += size;
    886			rem -= (u32)size;
    887			load_addr += size;
    888		}
    889	}
    890
    891	/* Pass date and time information to NIC at the time of loading
    892	 * firmware and periodically update the host time to NIC firmware.
    893	 * This is to make NIC firmware use the same time reference as Host,
    894	 * so that it is easy to correlate logs from firmware and host for
    895	 * debugging.
    896	 *
    897	 * Octeon always uses UTC time. so timezone information is not sent.
    898	 */
    899	ktime_get_real_ts64(&ts);
    900	ret = snprintf(boottime, MAX_BOOTTIME_SIZE,
    901		       " time_sec=%lld time_nsec=%ld",
    902		       (s64)ts.tv_sec, ts.tv_nsec);
    903	if ((sizeof(h->bootcmd) - strnlen(h->bootcmd, sizeof(h->bootcmd))) <
    904		ret) {
    905		dev_err(&oct->pci_dev->dev, "Boot command buffer too small\n");
    906		return -EINVAL;
    907	}
    908	strncat(h->bootcmd, boottime,
    909		sizeof(h->bootcmd) - strnlen(h->bootcmd, sizeof(h->bootcmd)));
    910
    911	dev_info(&oct->pci_dev->dev, "Writing boot command: %s\n",
    912		 h->bootcmd);
    913
    914	/* Invoke the bootcmd */
    915	ret = octeon_console_send_cmd(oct, h->bootcmd, 50);
    916	if (ret)
    917		dev_info(&oct->pci_dev->dev, "Boot command send failed\n");
    918
    919	return ret;
    920}