coreboot-kgpe-d16/src/drivers/spi/spiconsole.c
Furquan Shaikh c28984d9ea spi: Clean up SPI flash driver interface
RW flag was added to spi_slave structure to get around a requirement on
some AMD flash controllers that need to group together all spi volatile
operations (write/erase). This rw flag is not a property or attribute of
the SPI slave or controller. Thus, instead of saving it in spi_slave
structure, clean up the SPI flash driver interface. This allows
chipsets/mainboards (that require volatile operations to be grouped) to
indicate beginning and end of such grouped operations.

New user APIs are added to allow users to perform probe, read, write,
erase, volatile group begin and end operations. Callbacks defined in
spi_flash structure are expected to be used only by the SPI flash
driver. Any chipset that requires grouping of volatile operations can
select the newly added Kconfig option SPI_FLASH_HAS_VOLATILE_GROUP and
define callbacks for chipset_volatile_group_{begin,end}.

spi_claim_bus/spi_release_bus calls have been removed from the SPI flash
chip drivers which end up calling do_spi_flash_cmd since it already has
required calls for claiming and releasing SPI bus before performing a
read/write operation.

BUG=None
BRANCH=None
TEST=Compiles successfully.

Change-Id: Idfc052e82ec15b6c9fa874cee7a61bd06e923fbf
Signed-off-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-on: https://review.coreboot.org/17462
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
2016-11-22 17:32:09 +01:00

66 lines
2 KiB
C

/*
* This file is part of the coreboot project.
*
* Copyright 2015 Google Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <spi-generic.h>
#include <spi_flash.h>
#include <console/spi.h>
void spiconsole_init(void) {
spi_init();
return;
}
/*
* The EM100 'hyper terminal' specification defines a header of 9 characters.
* Because of this, devices with a spi_crop_chunk of less than 10 characters
* can't be supported by this standard.
*
* To add support in romstage, the static struct here and the ones used by
* spi_xfer will need to be modified - removed, or mapped into cbmem.
*
* Because the Dediprog software expects strings, not single characters, and
* because of the header overhead, this builds up a buffer to send.
*/
void spiconsole_tx_byte(unsigned char c) {
static struct em100_msg msg = {
.header.spi_command = EM100_DEDICATED_CMD,
.header.em100_command = EM100_UFIFO_CMD,
.header.msg_signature = EM100_MSG_SIGNATURE,
.header.msg_type = EM100_MSG_ASCII,
.header.msg_length = 0
};
/* Verify the spi buffer is big enough to send even a single byte */
if (spi_crop_chunk(0,MAX_MSG_LENGTH) <
sizeof(struct em100_msg_header) + 1)
return;
msg.data[msg.header.msg_length] = c;
msg.header.msg_length++;
/* Send the data on newline or when the max spi length is reached */
if (c == '\n' || (sizeof(struct em100_msg_header) +
msg.header.msg_length == spi_crop_chunk(0,
MAX_MSG_LENGTH))) {
struct spi_slave spi = { };
spi_xfer(&spi, &msg, sizeof(struct em100_msg_header) +
msg.header.msg_length, NULL, 0);
msg.header.msg_length = 0;
}
return;
}