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

fsi-master-ast-cf.c (37929B)


      1// SPDX-License-Identifier: GPL-2.0+
      2// Copyright 2018 IBM Corp
      3/*
      4 * A FSI master controller, using a simple GPIO bit-banging interface
      5 */
      6
      7#include <linux/crc4.h>
      8#include <linux/delay.h>
      9#include <linux/device.h>
     10#include <linux/fsi.h>
     11#include <linux/gpio/consumer.h>
     12#include <linux/io.h>
     13#include <linux/irqflags.h>
     14#include <linux/module.h>
     15#include <linux/of.h>
     16#include <linux/platform_device.h>
     17#include <linux/slab.h>
     18#include <linux/regmap.h>
     19#include <linux/firmware.h>
     20#include <linux/gpio/aspeed.h>
     21#include <linux/mfd/syscon.h>
     22#include <linux/of_address.h>
     23#include <linux/genalloc.h>
     24
     25#include "fsi-master.h"
     26#include "cf-fsi-fw.h"
     27
     28#define FW_FILE_NAME	"cf-fsi-fw.bin"
     29
     30/* Common SCU based coprocessor control registers */
     31#define SCU_COPRO_CTRL			0x100
     32#define   SCU_COPRO_RESET			0x00000002
     33#define   SCU_COPRO_CLK_EN			0x00000001
     34
     35/* AST2500 specific ones */
     36#define SCU_2500_COPRO_SEG0		0x104
     37#define SCU_2500_COPRO_SEG1		0x108
     38#define SCU_2500_COPRO_SEG2		0x10c
     39#define SCU_2500_COPRO_SEG3		0x110
     40#define SCU_2500_COPRO_SEG4		0x114
     41#define SCU_2500_COPRO_SEG5		0x118
     42#define SCU_2500_COPRO_SEG6		0x11c
     43#define SCU_2500_COPRO_SEG7		0x120
     44#define SCU_2500_COPRO_SEG8		0x124
     45#define   SCU_2500_COPRO_SEG_SWAP		0x00000001
     46#define SCU_2500_COPRO_CACHE_CTL	0x128
     47#define   SCU_2500_COPRO_CACHE_EN		0x00000001
     48#define   SCU_2500_COPRO_SEG0_CACHE_EN		0x00000002
     49#define   SCU_2500_COPRO_SEG1_CACHE_EN		0x00000004
     50#define   SCU_2500_COPRO_SEG2_CACHE_EN		0x00000008
     51#define   SCU_2500_COPRO_SEG3_CACHE_EN		0x00000010
     52#define   SCU_2500_COPRO_SEG4_CACHE_EN		0x00000020
     53#define   SCU_2500_COPRO_SEG5_CACHE_EN		0x00000040
     54#define   SCU_2500_COPRO_SEG6_CACHE_EN		0x00000080
     55#define   SCU_2500_COPRO_SEG7_CACHE_EN		0x00000100
     56#define   SCU_2500_COPRO_SEG8_CACHE_EN		0x00000200
     57
     58#define SCU_2400_COPRO_SEG0		0x104
     59#define SCU_2400_COPRO_SEG2		0x108
     60#define SCU_2400_COPRO_SEG4		0x10c
     61#define SCU_2400_COPRO_SEG6		0x110
     62#define SCU_2400_COPRO_SEG8		0x114
     63#define   SCU_2400_COPRO_SEG_SWAP		0x80000000
     64#define SCU_2400_COPRO_CACHE_CTL	0x118
     65#define   SCU_2400_COPRO_CACHE_EN		0x00000001
     66#define   SCU_2400_COPRO_SEG0_CACHE_EN		0x00000002
     67#define   SCU_2400_COPRO_SEG2_CACHE_EN		0x00000004
     68#define   SCU_2400_COPRO_SEG4_CACHE_EN		0x00000008
     69#define   SCU_2400_COPRO_SEG6_CACHE_EN		0x00000010
     70#define   SCU_2400_COPRO_SEG8_CACHE_EN		0x00000020
     71
     72/* CVIC registers */
     73#define CVIC_EN_REG			0x10
     74#define CVIC_TRIG_REG			0x18
     75
     76/*
     77 * System register base address (needed for configuring the
     78 * coldfire maps)
     79 */
     80#define SYSREG_BASE			0x1e600000
     81
     82/* Amount of SRAM required */
     83#define SRAM_SIZE			0x1000
     84
     85#define LAST_ADDR_INVALID		0x1
     86
     87struct fsi_master_acf {
     88	struct fsi_master	master;
     89	struct device		*dev;
     90	struct regmap		*scu;
     91	struct mutex		lock;	/* mutex for command ordering */
     92	struct gpio_desc	*gpio_clk;
     93	struct gpio_desc	*gpio_data;
     94	struct gpio_desc	*gpio_trans;	/* Voltage translator */
     95	struct gpio_desc	*gpio_enable;	/* FSI enable */
     96	struct gpio_desc	*gpio_mux;	/* Mux control */
     97	uint16_t		gpio_clk_vreg;
     98	uint16_t		gpio_clk_dreg;
     99	uint16_t       		gpio_dat_vreg;
    100	uint16_t       		gpio_dat_dreg;
    101	uint16_t       		gpio_tra_vreg;
    102	uint16_t       		gpio_tra_dreg;
    103	uint8_t			gpio_clk_bit;
    104	uint8_t			gpio_dat_bit;
    105	uint8_t			gpio_tra_bit;
    106	uint32_t		cf_mem_addr;
    107	size_t			cf_mem_size;
    108	void __iomem		*cf_mem;
    109	void __iomem		*cvic;
    110	struct gen_pool		*sram_pool;
    111	void __iomem		*sram;
    112	bool			is_ast2500;
    113	bool			external_mode;
    114	bool			trace_enabled;
    115	uint32_t		last_addr;
    116	uint8_t			t_send_delay;
    117	uint8_t			t_echo_delay;
    118	uint32_t		cvic_sw_irq;
    119};
    120#define to_fsi_master_acf(m) container_of(m, struct fsi_master_acf, master)
    121
    122struct fsi_msg {
    123	uint64_t	msg;
    124	uint8_t		bits;
    125};
    126
    127#define CREATE_TRACE_POINTS
    128#include <trace/events/fsi_master_ast_cf.h>
    129
    130static void msg_push_bits(struct fsi_msg *msg, uint64_t data, int bits)
    131{
    132	msg->msg <<= bits;
    133	msg->msg |= data & ((1ull << bits) - 1);
    134	msg->bits += bits;
    135}
    136
    137static void msg_push_crc(struct fsi_msg *msg)
    138{
    139	uint8_t crc;
    140	int top;
    141
    142	top = msg->bits & 0x3;
    143
    144	/* start bit, and any non-aligned top bits */
    145	crc = crc4(0, 1 << top | msg->msg >> (msg->bits - top), top + 1);
    146
    147	/* aligned bits */
    148	crc = crc4(crc, msg->msg, msg->bits - top);
    149
    150	msg_push_bits(msg, crc, 4);
    151}
    152
    153static void msg_finish_cmd(struct fsi_msg *cmd)
    154{
    155	/* Left align message */
    156	cmd->msg <<= (64 - cmd->bits);
    157}
    158
    159static bool check_same_address(struct fsi_master_acf *master, int id,
    160			       uint32_t addr)
    161{
    162	/* this will also handle LAST_ADDR_INVALID */
    163	return master->last_addr == (((id & 0x3) << 21) | (addr & ~0x3));
    164}
    165
    166static bool check_relative_address(struct fsi_master_acf *master, int id,
    167				   uint32_t addr, uint32_t *rel_addrp)
    168{
    169	uint32_t last_addr = master->last_addr;
    170	int32_t rel_addr;
    171
    172	if (last_addr == LAST_ADDR_INVALID)
    173		return false;
    174
    175	/* We may be in 23-bit addressing mode, which uses the id as the
    176	 * top two address bits. So, if we're referencing a different ID,
    177	 * use absolute addresses.
    178	 */
    179	if (((last_addr >> 21) & 0x3) != id)
    180		return false;
    181
    182	/* remove the top two bits from any 23-bit addressing */
    183	last_addr &= (1 << 21) - 1;
    184
    185	/* We know that the addresses are limited to 21 bits, so this won't
    186	 * overflow the signed rel_addr */
    187	rel_addr = addr - last_addr;
    188	if (rel_addr > 255 || rel_addr < -256)
    189		return false;
    190
    191	*rel_addrp = (uint32_t)rel_addr;
    192
    193	return true;
    194}
    195
    196static void last_address_update(struct fsi_master_acf *master,
    197				int id, bool valid, uint32_t addr)
    198{
    199	if (!valid)
    200		master->last_addr = LAST_ADDR_INVALID;
    201	else
    202		master->last_addr = ((id & 0x3) << 21) | (addr & ~0x3);
    203}
    204
    205/*
    206 * Encode an Absolute/Relative/Same Address command
    207 */
    208static void build_ar_command(struct fsi_master_acf *master,
    209			     struct fsi_msg *cmd, uint8_t id,
    210			     uint32_t addr, size_t size,
    211			     const void *data)
    212{
    213	int i, addr_bits, opcode_bits;
    214	bool write = !!data;
    215	uint8_t ds, opcode;
    216	uint32_t rel_addr;
    217
    218	cmd->bits = 0;
    219	cmd->msg = 0;
    220
    221	/* we have 21 bits of address max */
    222	addr &= ((1 << 21) - 1);
    223
    224	/* cmd opcodes are variable length - SAME_AR is only two bits */
    225	opcode_bits = 3;
    226
    227	if (check_same_address(master, id, addr)) {
    228		/* we still address the byte offset within the word */
    229		addr_bits = 2;
    230		opcode_bits = 2;
    231		opcode = FSI_CMD_SAME_AR;
    232		trace_fsi_master_acf_cmd_same_addr(master);
    233
    234	} else if (check_relative_address(master, id, addr, &rel_addr)) {
    235		/* 8 bits plus sign */
    236		addr_bits = 9;
    237		addr = rel_addr;
    238		opcode = FSI_CMD_REL_AR;
    239		trace_fsi_master_acf_cmd_rel_addr(master, rel_addr);
    240
    241	} else {
    242		addr_bits = 21;
    243		opcode = FSI_CMD_ABS_AR;
    244		trace_fsi_master_acf_cmd_abs_addr(master, addr);
    245	}
    246
    247	/*
    248	 * The read/write size is encoded in the lower bits of the address
    249	 * (as it must be naturally-aligned), and the following ds bit.
    250	 *
    251	 *	size	addr:1	addr:0	ds
    252	 *	1	x	x	0
    253	 *	2	x	0	1
    254	 *	4	0	1	1
    255	 *
    256	 */
    257	ds = size > 1 ? 1 : 0;
    258	addr &= ~(size - 1);
    259	if (size == 4)
    260		addr |= 1;
    261
    262	msg_push_bits(cmd, id, 2);
    263	msg_push_bits(cmd, opcode, opcode_bits);
    264	msg_push_bits(cmd, write ? 0 : 1, 1);
    265	msg_push_bits(cmd, addr, addr_bits);
    266	msg_push_bits(cmd, ds, 1);
    267	for (i = 0; write && i < size; i++)
    268		msg_push_bits(cmd, ((uint8_t *)data)[i], 8);
    269
    270	msg_push_crc(cmd);
    271	msg_finish_cmd(cmd);
    272}
    273
    274static void build_dpoll_command(struct fsi_msg *cmd, uint8_t slave_id)
    275{
    276	cmd->bits = 0;
    277	cmd->msg = 0;
    278
    279	msg_push_bits(cmd, slave_id, 2);
    280	msg_push_bits(cmd, FSI_CMD_DPOLL, 3);
    281	msg_push_crc(cmd);
    282	msg_finish_cmd(cmd);
    283}
    284
    285static void build_epoll_command(struct fsi_msg *cmd, uint8_t slave_id)
    286{
    287	cmd->bits = 0;
    288	cmd->msg = 0;
    289
    290	msg_push_bits(cmd, slave_id, 2);
    291	msg_push_bits(cmd, FSI_CMD_EPOLL, 3);
    292	msg_push_crc(cmd);
    293	msg_finish_cmd(cmd);
    294}
    295
    296static void build_term_command(struct fsi_msg *cmd, uint8_t slave_id)
    297{
    298	cmd->bits = 0;
    299	cmd->msg = 0;
    300
    301	msg_push_bits(cmd, slave_id, 2);
    302	msg_push_bits(cmd, FSI_CMD_TERM, 6);
    303	msg_push_crc(cmd);
    304	msg_finish_cmd(cmd);
    305}
    306
    307static int do_copro_command(struct fsi_master_acf *master, uint32_t op)
    308{
    309	uint32_t timeout = 10000000;
    310	uint8_t stat;
    311
    312	trace_fsi_master_acf_copro_command(master, op);
    313
    314	/* Send command */
    315	iowrite32be(op, master->sram + CMD_STAT_REG);
    316
    317	/* Ring doorbell if any */
    318	if (master->cvic)
    319		iowrite32(0x2, master->cvic + CVIC_TRIG_REG);
    320
    321	/* Wait for status to indicate completion (or error) */
    322	do {
    323		if (timeout-- == 0) {
    324			dev_warn(master->dev,
    325				 "Timeout waiting for coprocessor completion\n");
    326			return -ETIMEDOUT;
    327		}
    328		stat = ioread8(master->sram + CMD_STAT_REG);
    329	} while(stat < STAT_COMPLETE || stat == 0xff);
    330
    331	if (stat == STAT_COMPLETE)
    332		return 0;
    333	switch(stat) {
    334	case STAT_ERR_INVAL_CMD:
    335		return -EINVAL;
    336	case STAT_ERR_INVAL_IRQ:
    337		return -EIO;
    338	case STAT_ERR_MTOE:
    339		return -ESHUTDOWN;
    340	}
    341	return -ENXIO;
    342}
    343
    344static int clock_zeros(struct fsi_master_acf *master, int count)
    345{
    346	while (count) {
    347		int rc, lcnt = min(count, 255);
    348
    349		rc = do_copro_command(master,
    350				      CMD_IDLE_CLOCKS | (lcnt << CMD_REG_CLEN_SHIFT));
    351		if (rc)
    352			return rc;
    353		count -= lcnt;
    354	}
    355	return 0;
    356}
    357
    358static int send_request(struct fsi_master_acf *master, struct fsi_msg *cmd,
    359			unsigned int resp_bits)
    360{
    361	uint32_t op;
    362
    363	trace_fsi_master_acf_send_request(master, cmd, resp_bits);
    364
    365	/* Store message into SRAM */
    366	iowrite32be((cmd->msg >> 32), master->sram + CMD_DATA);
    367	iowrite32be((cmd->msg & 0xffffffff), master->sram + CMD_DATA + 4);
    368
    369	op = CMD_COMMAND;
    370	op |= cmd->bits << CMD_REG_CLEN_SHIFT;
    371	if (resp_bits)
    372		op |= resp_bits << CMD_REG_RLEN_SHIFT;
    373
    374	return do_copro_command(master, op);
    375}
    376
    377static int read_copro_response(struct fsi_master_acf *master, uint8_t size,
    378			       uint32_t *response, u8 *tag)
    379{
    380	uint8_t rtag = ioread8(master->sram + STAT_RTAG) & 0xf;
    381	uint8_t rcrc = ioread8(master->sram + STAT_RCRC) & 0xf;
    382	uint32_t rdata = 0;
    383	uint32_t crc;
    384	uint8_t ack;
    385
    386	*tag = ack = rtag & 3;
    387
    388	/* we have a whole message now; check CRC */
    389	crc = crc4(0, 1, 1);
    390	crc = crc4(crc, rtag, 4);
    391	if (ack == FSI_RESP_ACK && size) {
    392		rdata = ioread32be(master->sram + RSP_DATA);
    393		crc = crc4(crc, rdata, size);
    394		if (response)
    395			*response = rdata;
    396	}
    397	crc = crc4(crc, rcrc, 4);
    398
    399	trace_fsi_master_acf_copro_response(master, rtag, rcrc, rdata, crc == 0);
    400
    401	if (crc) {
    402		/*
    403		 * Check if it's all 1's or all 0's, that probably means
    404		 * the host is off
    405		 */
    406		if ((rtag == 0xf && rcrc == 0xf) || (rtag == 0 && rcrc == 0))
    407			return -ENODEV;
    408		dev_dbg(master->dev, "Bad response CRC !\n");
    409		return -EAGAIN;
    410	}
    411	return 0;
    412}
    413
    414static int send_term(struct fsi_master_acf *master, uint8_t slave)
    415{
    416	struct fsi_msg cmd;
    417	uint8_t tag;
    418	int rc;
    419
    420	build_term_command(&cmd, slave);
    421
    422	rc = send_request(master, &cmd, 0);
    423	if (rc) {
    424		dev_warn(master->dev, "Error %d sending term\n", rc);
    425		return rc;
    426	}
    427
    428	rc = read_copro_response(master, 0, NULL, &tag);
    429	if (rc < 0) {
    430		dev_err(master->dev,
    431				"TERM failed; lost communication with slave\n");
    432		return -EIO;
    433	} else if (tag != FSI_RESP_ACK) {
    434		dev_err(master->dev, "TERM failed; response %d\n", tag);
    435		return -EIO;
    436	}
    437	return 0;
    438}
    439
    440static void dump_ucode_trace(struct fsi_master_acf *master)
    441{
    442	char trbuf[52];
    443	char *p;
    444	int i;
    445
    446	dev_dbg(master->dev,
    447		"CMDSTAT:%08x RTAG=%02x RCRC=%02x RDATA=%02x #INT=%08x\n",
    448		ioread32be(master->sram + CMD_STAT_REG),
    449		ioread8(master->sram + STAT_RTAG),
    450		ioread8(master->sram + STAT_RCRC),
    451		ioread32be(master->sram + RSP_DATA),
    452		ioread32be(master->sram + INT_CNT));
    453
    454	for (i = 0; i < 512; i++) {
    455		uint8_t v;
    456		if ((i % 16) == 0)
    457			p = trbuf;
    458		v = ioread8(master->sram + TRACEBUF + i);
    459		p += sprintf(p, "%02x ", v);
    460		if (((i % 16) == 15) || v == TR_END)
    461			dev_dbg(master->dev, "%s\n", trbuf);
    462		if (v == TR_END)
    463			break;
    464	}
    465}
    466
    467static int handle_response(struct fsi_master_acf *master,
    468			   uint8_t slave, uint8_t size, void *data)
    469{
    470	int busy_count = 0, rc;
    471	int crc_err_retries = 0;
    472	struct fsi_msg cmd;
    473	uint32_t response;
    474	uint8_t tag;
    475retry:
    476	rc = read_copro_response(master, size, &response, &tag);
    477
    478	/* Handle retries on CRC errors */
    479	if (rc == -EAGAIN) {
    480		/* Too many retries ? */
    481		if (crc_err_retries++ > FSI_CRC_ERR_RETRIES) {
    482			/*
    483			 * Pass it up as a -EIO otherwise upper level will retry
    484			 * the whole command which isn't what we want here.
    485			 */
    486			rc = -EIO;
    487			goto bail;
    488		}
    489		trace_fsi_master_acf_crc_rsp_error(master, crc_err_retries);
    490		if (master->trace_enabled)
    491			dump_ucode_trace(master);
    492		rc = clock_zeros(master, FSI_MASTER_EPOLL_CLOCKS);
    493		if (rc) {
    494			dev_warn(master->dev,
    495				 "Error %d clocking zeros for E_POLL\n", rc);
    496			return rc;
    497		}
    498		build_epoll_command(&cmd, slave);
    499		rc = send_request(master, &cmd, size);
    500		if (rc) {
    501			dev_warn(master->dev, "Error %d sending E_POLL\n", rc);
    502			return -EIO;
    503		}
    504		goto retry;
    505	}
    506	if (rc)
    507		return rc;
    508
    509	switch (tag) {
    510	case FSI_RESP_ACK:
    511		if (size && data) {
    512			if (size == 32)
    513				*(__be32 *)data = cpu_to_be32(response);
    514			else if (size == 16)
    515				*(__be16 *)data = cpu_to_be16(response);
    516			else
    517				*(u8 *)data = response;
    518		}
    519		break;
    520	case FSI_RESP_BUSY:
    521		/*
    522		 * Its necessary to clock slave before issuing
    523		 * d-poll, not indicated in the hardware protocol
    524		 * spec. < 20 clocks causes slave to hang, 21 ok.
    525		 */
    526		dev_dbg(master->dev, "Busy, retrying...\n");
    527		if (master->trace_enabled)
    528			dump_ucode_trace(master);
    529		rc = clock_zeros(master, FSI_MASTER_DPOLL_CLOCKS);
    530		if (rc) {
    531			dev_warn(master->dev,
    532				 "Error %d clocking zeros for D_POLL\n", rc);
    533			break;
    534		}
    535		if (busy_count++ < FSI_MASTER_MAX_BUSY) {
    536			build_dpoll_command(&cmd, slave);
    537			rc = send_request(master, &cmd, size);
    538			if (rc) {
    539				dev_warn(master->dev, "Error %d sending D_POLL\n", rc);
    540				break;
    541			}
    542			goto retry;
    543		}
    544		dev_dbg(master->dev,
    545			"ERR slave is stuck in busy state, issuing TERM\n");
    546		send_term(master, slave);
    547		rc = -EIO;
    548		break;
    549
    550	case FSI_RESP_ERRA:
    551		dev_dbg(master->dev, "ERRA received\n");
    552		if (master->trace_enabled)
    553			dump_ucode_trace(master);
    554		rc = -EIO;
    555		break;
    556	case FSI_RESP_ERRC:
    557		dev_dbg(master->dev, "ERRC received\n");
    558		if (master->trace_enabled)
    559			dump_ucode_trace(master);
    560		rc = -EAGAIN;
    561		break;
    562	}
    563 bail:
    564	if (busy_count > 0) {
    565		trace_fsi_master_acf_poll_response_busy(master, busy_count);
    566	}
    567
    568	return rc;
    569}
    570
    571static int fsi_master_acf_xfer(struct fsi_master_acf *master, uint8_t slave,
    572			       struct fsi_msg *cmd, size_t resp_len, void *resp)
    573{
    574	int rc = -EAGAIN, retries = 0;
    575
    576	resp_len <<= 3;
    577	while ((retries++) < FSI_CRC_ERR_RETRIES) {
    578		rc = send_request(master, cmd, resp_len);
    579		if (rc) {
    580			if (rc != -ESHUTDOWN)
    581				dev_warn(master->dev, "Error %d sending command\n", rc);
    582			break;
    583		}
    584		rc = handle_response(master, slave, resp_len, resp);
    585		if (rc != -EAGAIN)
    586			break;
    587		rc = -EIO;
    588		dev_dbg(master->dev, "ECRC retry %d\n", retries);
    589
    590		/* Pace it a bit before retry */
    591		msleep(1);
    592	}
    593
    594	return rc;
    595}
    596
    597static int fsi_master_acf_read(struct fsi_master *_master, int link,
    598			       uint8_t id, uint32_t addr, void *val,
    599			       size_t size)
    600{
    601	struct fsi_master_acf *master = to_fsi_master_acf(_master);
    602	struct fsi_msg cmd;
    603	int rc;
    604
    605	if (link != 0)
    606		return -ENODEV;
    607
    608	mutex_lock(&master->lock);
    609	dev_dbg(master->dev, "read id %d addr %x size %zd\n", id, addr, size);
    610	build_ar_command(master, &cmd, id, addr, size, NULL);
    611	rc = fsi_master_acf_xfer(master, id, &cmd, size, val);
    612	last_address_update(master, id, rc == 0, addr);
    613	if (rc)
    614		dev_dbg(master->dev, "read id %d addr 0x%08x err: %d\n",
    615			id, addr, rc);
    616	mutex_unlock(&master->lock);
    617
    618	return rc;
    619}
    620
    621static int fsi_master_acf_write(struct fsi_master *_master, int link,
    622				uint8_t id, uint32_t addr, const void *val,
    623				size_t size)
    624{
    625	struct fsi_master_acf *master = to_fsi_master_acf(_master);
    626	struct fsi_msg cmd;
    627	int rc;
    628
    629	if (link != 0)
    630		return -ENODEV;
    631
    632	mutex_lock(&master->lock);
    633	build_ar_command(master, &cmd, id, addr, size, val);
    634	dev_dbg(master->dev, "write id %d addr %x size %zd raw_data: %08x\n",
    635		id, addr, size, *(uint32_t *)val);
    636	rc = fsi_master_acf_xfer(master, id, &cmd, 0, NULL);
    637	last_address_update(master, id, rc == 0, addr);
    638	if (rc)
    639		dev_dbg(master->dev, "write id %d addr 0x%08x err: %d\n",
    640			id, addr, rc);
    641	mutex_unlock(&master->lock);
    642
    643	return rc;
    644}
    645
    646static int fsi_master_acf_term(struct fsi_master *_master,
    647			       int link, uint8_t id)
    648{
    649	struct fsi_master_acf *master = to_fsi_master_acf(_master);
    650	struct fsi_msg cmd;
    651	int rc;
    652
    653	if (link != 0)
    654		return -ENODEV;
    655
    656	mutex_lock(&master->lock);
    657	build_term_command(&cmd, id);
    658	dev_dbg(master->dev, "term id %d\n", id);
    659	rc = fsi_master_acf_xfer(master, id, &cmd, 0, NULL);
    660	last_address_update(master, id, false, 0);
    661	mutex_unlock(&master->lock);
    662
    663	return rc;
    664}
    665
    666static int fsi_master_acf_break(struct fsi_master *_master, int link)
    667{
    668	struct fsi_master_acf *master = to_fsi_master_acf(_master);
    669	int rc;
    670
    671	if (link != 0)
    672		return -ENODEV;
    673
    674	mutex_lock(&master->lock);
    675	if (master->external_mode) {
    676		mutex_unlock(&master->lock);
    677		return -EBUSY;
    678	}
    679	dev_dbg(master->dev, "sending BREAK\n");
    680	rc = do_copro_command(master, CMD_BREAK);
    681	last_address_update(master, 0, false, 0);
    682	mutex_unlock(&master->lock);
    683
    684	/* Wait for logic reset to take effect */
    685	udelay(200);
    686
    687	return rc;
    688}
    689
    690static void reset_cf(struct fsi_master_acf *master)
    691{
    692	regmap_write(master->scu, SCU_COPRO_CTRL, SCU_COPRO_RESET);
    693	usleep_range(20,20);
    694	regmap_write(master->scu, SCU_COPRO_CTRL, 0);
    695	usleep_range(20,20);
    696}
    697
    698static void start_cf(struct fsi_master_acf *master)
    699{
    700	regmap_write(master->scu, SCU_COPRO_CTRL, SCU_COPRO_CLK_EN);
    701}
    702
    703static void setup_ast2500_cf_maps(struct fsi_master_acf *master)
    704{
    705	/*
    706	 * Note about byteswap setting: the bus is wired backwards,
    707	 * so setting the byteswap bit actually makes the ColdFire
    708	 * work "normally" for a BE processor, ie, put the MSB in
    709	 * the lowest address byte.
    710	 *
    711	 * We thus need to set the bit for our main memory which
    712	 * contains our program code. We create two mappings for
    713	 * the register, one with each setting.
    714	 *
    715	 * Segments 2 and 3 has a "swapped" mapping (BE)
    716	 * and 6 and 7 have a non-swapped mapping (LE) which allows
    717	 * us to avoid byteswapping register accesses since the
    718	 * registers are all LE.
    719	 */
    720
    721	/* Setup segment 0 to our memory region */
    722	regmap_write(master->scu, SCU_2500_COPRO_SEG0, master->cf_mem_addr |
    723		     SCU_2500_COPRO_SEG_SWAP);
    724
    725	/* Segments 2 and 3 to sysregs with byteswap (for SRAM) */
    726	regmap_write(master->scu, SCU_2500_COPRO_SEG2, SYSREG_BASE |
    727		     SCU_2500_COPRO_SEG_SWAP);
    728	regmap_write(master->scu, SCU_2500_COPRO_SEG3, SYSREG_BASE | 0x100000 |
    729		     SCU_2500_COPRO_SEG_SWAP);
    730
    731	/* And segment 6 and 7 to sysregs no byteswap */
    732	regmap_write(master->scu, SCU_2500_COPRO_SEG6, SYSREG_BASE);
    733	regmap_write(master->scu, SCU_2500_COPRO_SEG7, SYSREG_BASE | 0x100000);
    734
    735	/* Memory cachable, regs and SRAM not cachable */
    736	regmap_write(master->scu, SCU_2500_COPRO_CACHE_CTL,
    737		     SCU_2500_COPRO_SEG0_CACHE_EN | SCU_2500_COPRO_CACHE_EN);
    738}
    739
    740static void setup_ast2400_cf_maps(struct fsi_master_acf *master)
    741{
    742	/* Setup segment 0 to our memory region */
    743	regmap_write(master->scu, SCU_2400_COPRO_SEG0, master->cf_mem_addr |
    744		     SCU_2400_COPRO_SEG_SWAP);
    745
    746	/* Segments 2 to sysregs with byteswap (for SRAM) */
    747	regmap_write(master->scu, SCU_2400_COPRO_SEG2, SYSREG_BASE |
    748		     SCU_2400_COPRO_SEG_SWAP);
    749
    750	/* And segment 6 to sysregs no byteswap */
    751	regmap_write(master->scu, SCU_2400_COPRO_SEG6, SYSREG_BASE);
    752
    753	/* Memory cachable, regs and SRAM not cachable */
    754	regmap_write(master->scu, SCU_2400_COPRO_CACHE_CTL,
    755		     SCU_2400_COPRO_SEG0_CACHE_EN | SCU_2400_COPRO_CACHE_EN);
    756}
    757
    758static void setup_common_fw_config(struct fsi_master_acf *master,
    759				   void __iomem *base)
    760{
    761	iowrite16be(master->gpio_clk_vreg, base + HDR_CLOCK_GPIO_VADDR);
    762	iowrite16be(master->gpio_clk_dreg, base + HDR_CLOCK_GPIO_DADDR);
    763	iowrite16be(master->gpio_dat_vreg, base + HDR_DATA_GPIO_VADDR);
    764	iowrite16be(master->gpio_dat_dreg, base + HDR_DATA_GPIO_DADDR);
    765	iowrite16be(master->gpio_tra_vreg, base + HDR_TRANS_GPIO_VADDR);
    766	iowrite16be(master->gpio_tra_dreg, base + HDR_TRANS_GPIO_DADDR);
    767	iowrite8(master->gpio_clk_bit, base + HDR_CLOCK_GPIO_BIT);
    768	iowrite8(master->gpio_dat_bit, base + HDR_DATA_GPIO_BIT);
    769	iowrite8(master->gpio_tra_bit, base + HDR_TRANS_GPIO_BIT);
    770}
    771
    772static void setup_ast2500_fw_config(struct fsi_master_acf *master)
    773{
    774	void __iomem *base = master->cf_mem + HDR_OFFSET;
    775
    776	setup_common_fw_config(master, base);
    777	iowrite32be(FW_CONTROL_USE_STOP, base + HDR_FW_CONTROL);
    778}
    779
    780static void setup_ast2400_fw_config(struct fsi_master_acf *master)
    781{
    782	void __iomem *base = master->cf_mem + HDR_OFFSET;
    783
    784	setup_common_fw_config(master, base);
    785	iowrite32be(FW_CONTROL_CONT_CLOCK|FW_CONTROL_DUMMY_RD, base + HDR_FW_CONTROL);
    786}
    787
    788static int setup_gpios_for_copro(struct fsi_master_acf *master)
    789{
    790
    791	int rc;
    792
    793	/* This aren't under ColdFire control, just set them up appropriately */
    794	gpiod_direction_output(master->gpio_mux, 1);
    795	gpiod_direction_output(master->gpio_enable, 1);
    796
    797	/* Those are under ColdFire control, let it configure them */
    798	rc = aspeed_gpio_copro_grab_gpio(master->gpio_clk, &master->gpio_clk_vreg,
    799					 &master->gpio_clk_dreg, &master->gpio_clk_bit);
    800	if (rc) {
    801		dev_err(master->dev, "failed to assign clock gpio to coprocessor\n");
    802		return rc;
    803	}
    804	rc = aspeed_gpio_copro_grab_gpio(master->gpio_data, &master->gpio_dat_vreg,
    805					 &master->gpio_dat_dreg, &master->gpio_dat_bit);
    806	if (rc) {
    807		dev_err(master->dev, "failed to assign data gpio to coprocessor\n");
    808		aspeed_gpio_copro_release_gpio(master->gpio_clk);
    809		return rc;
    810	}
    811	rc = aspeed_gpio_copro_grab_gpio(master->gpio_trans, &master->gpio_tra_vreg,
    812					 &master->gpio_tra_dreg, &master->gpio_tra_bit);
    813	if (rc) {
    814		dev_err(master->dev, "failed to assign trans gpio to coprocessor\n");
    815		aspeed_gpio_copro_release_gpio(master->gpio_clk);
    816		aspeed_gpio_copro_release_gpio(master->gpio_data);
    817		return rc;
    818	}
    819	return 0;
    820}
    821
    822static void release_copro_gpios(struct fsi_master_acf *master)
    823{
    824	aspeed_gpio_copro_release_gpio(master->gpio_clk);
    825	aspeed_gpio_copro_release_gpio(master->gpio_data);
    826	aspeed_gpio_copro_release_gpio(master->gpio_trans);
    827}
    828
    829static int load_copro_firmware(struct fsi_master_acf *master)
    830{
    831	const struct firmware *fw;
    832	uint16_t sig = 0, wanted_sig;
    833	const u8 *data;
    834	size_t size = 0;
    835	int rc;
    836
    837	/* Get the binary */
    838	rc = request_firmware(&fw, FW_FILE_NAME, master->dev);
    839	if (rc) {
    840		dev_err(
    841			master->dev, "Error %d to load firmware '%s' !\n",
    842			rc, FW_FILE_NAME);
    843		return rc;
    844	}
    845
    846	/* Which image do we want ? (shared vs. split clock/data GPIOs) */
    847	if (master->gpio_clk_vreg == master->gpio_dat_vreg)
    848		wanted_sig = SYS_SIG_SHARED;
    849	else
    850		wanted_sig = SYS_SIG_SPLIT;
    851	dev_dbg(master->dev, "Looking for image sig %04x\n", wanted_sig);
    852
    853	/* Try to find it */
    854	for (data = fw->data; data < (fw->data + fw->size);) {
    855		sig = be16_to_cpup((__be16 *)(data + HDR_OFFSET + HDR_SYS_SIG));
    856		size = be32_to_cpup((__be32 *)(data + HDR_OFFSET + HDR_FW_SIZE));
    857		if (sig == wanted_sig)
    858			break;
    859		data += size;
    860	}
    861	if (sig != wanted_sig) {
    862		dev_err(master->dev, "Failed to locate image sig %04x in FW blob\n",
    863			wanted_sig);
    864		rc = -ENODEV;
    865		goto release_fw;
    866	}
    867	if (size > master->cf_mem_size) {
    868		dev_err(master->dev, "FW size (%zd) bigger than memory reserve (%zd)\n",
    869			fw->size, master->cf_mem_size);
    870		rc = -ENOMEM;
    871	} else {
    872		memcpy_toio(master->cf_mem, data, size);
    873	}
    874
    875release_fw:
    876	release_firmware(fw);
    877	return rc;
    878}
    879
    880static int check_firmware_image(struct fsi_master_acf *master)
    881{
    882	uint32_t fw_vers, fw_api, fw_options;
    883
    884	fw_vers = ioread16be(master->cf_mem + HDR_OFFSET + HDR_FW_VERS);
    885	fw_api = ioread16be(master->cf_mem + HDR_OFFSET + HDR_API_VERS);
    886	fw_options = ioread32be(master->cf_mem + HDR_OFFSET + HDR_FW_OPTIONS);
    887	master->trace_enabled = !!(fw_options & FW_OPTION_TRACE_EN);
    888
    889	/* Check version and signature */
    890	dev_info(master->dev, "ColdFire initialized, firmware v%d API v%d.%d (trace %s)\n",
    891		 fw_vers, fw_api >> 8, fw_api & 0xff,
    892		 master->trace_enabled ? "enabled" : "disabled");
    893
    894	if ((fw_api >> 8) != API_VERSION_MAJ) {
    895		dev_err(master->dev, "Unsupported coprocessor API version !\n");
    896		return -ENODEV;
    897	}
    898
    899	return 0;
    900}
    901
    902static int copro_enable_sw_irq(struct fsi_master_acf *master)
    903{
    904	int timeout;
    905	uint32_t val;
    906
    907	/*
    908	 * Enable coprocessor interrupt input. I've had problems getting the
    909	 * value to stick, so try in a loop
    910	 */
    911	for (timeout = 0; timeout < 10; timeout++) {
    912		iowrite32(0x2, master->cvic + CVIC_EN_REG);
    913		val = ioread32(master->cvic + CVIC_EN_REG);
    914		if (val & 2)
    915			break;
    916		msleep(1);
    917	}
    918	if (!(val & 2)) {
    919		dev_err(master->dev, "Failed to enable coprocessor interrupt !\n");
    920		return -ENODEV;
    921	}
    922	return 0;
    923}
    924
    925static int fsi_master_acf_setup(struct fsi_master_acf *master)
    926{
    927	int timeout, rc;
    928	uint32_t val;
    929
    930	/* Make sure the ColdFire is stopped  */
    931	reset_cf(master);
    932
    933	/*
    934	 * Clear SRAM. This needs to happen before we setup the GPIOs
    935	 * as we might start trying to arbitrate as soon as that happens.
    936	 */
    937	memset_io(master->sram, 0, SRAM_SIZE);
    938
    939	/* Configure GPIOs */
    940	rc = setup_gpios_for_copro(master);
    941	if (rc)
    942		return rc;
    943
    944	/* Load the firmware into the reserved memory */
    945	rc = load_copro_firmware(master);
    946	if (rc)
    947		return rc;
    948
    949	/* Read signature and check versions */
    950	rc = check_firmware_image(master);
    951	if (rc)
    952		return rc;
    953
    954	/* Setup coldfire memory map */
    955	if (master->is_ast2500) {
    956		setup_ast2500_cf_maps(master);
    957		setup_ast2500_fw_config(master);
    958	} else {
    959		setup_ast2400_cf_maps(master);
    960		setup_ast2400_fw_config(master);
    961	}
    962
    963	/* Start the ColdFire */
    964	start_cf(master);
    965
    966	/* Wait for status register to indicate command completion
    967	 * which signals the initialization is complete
    968	 */
    969	for (timeout = 0; timeout < 10; timeout++) {
    970		val = ioread8(master->sram + CF_STARTED);
    971		if (val)
    972			break;
    973		msleep(1);
    974	}
    975	if (!val) {
    976		dev_err(master->dev, "Coprocessor startup timeout !\n");
    977		rc = -ENODEV;
    978		goto err;
    979	}
    980
    981	/* Configure echo & send delay */
    982	iowrite8(master->t_send_delay, master->sram + SEND_DLY_REG);
    983	iowrite8(master->t_echo_delay, master->sram + ECHO_DLY_REG);
    984
    985	/* Enable SW interrupt to copro if any */
    986	if (master->cvic) {
    987		rc = copro_enable_sw_irq(master);
    988		if (rc)
    989			goto err;
    990	}
    991	return 0;
    992 err:
    993	/* An error occurred, don't leave the coprocessor running */
    994	reset_cf(master);
    995
    996	/* Release the GPIOs */
    997	release_copro_gpios(master);
    998
    999	return rc;
   1000}
   1001
   1002
   1003static void fsi_master_acf_terminate(struct fsi_master_acf *master)
   1004{
   1005	unsigned long flags;
   1006
   1007	/*
   1008	 * A GPIO arbitration requestion could come in while this is
   1009	 * happening. To avoid problems, we disable interrupts so it
   1010	 * cannot preempt us on this CPU
   1011	 */
   1012
   1013	local_irq_save(flags);
   1014
   1015	/* Stop the coprocessor */
   1016	reset_cf(master);
   1017
   1018	/* We mark the copro not-started */
   1019	iowrite32(0, master->sram + CF_STARTED);
   1020
   1021	/* We mark the ARB register as having given up arbitration to
   1022	 * deal with a potential race with the arbitration request
   1023	 */
   1024	iowrite8(ARB_ARM_ACK, master->sram + ARB_REG);
   1025
   1026	local_irq_restore(flags);
   1027
   1028	/* Return the GPIOs to the ARM */
   1029	release_copro_gpios(master);
   1030}
   1031
   1032static void fsi_master_acf_setup_external(struct fsi_master_acf *master)
   1033{
   1034	/* Setup GPIOs for external FSI master (FSP box) */
   1035	gpiod_direction_output(master->gpio_mux, 0);
   1036	gpiod_direction_output(master->gpio_trans, 0);
   1037	gpiod_direction_output(master->gpio_enable, 1);
   1038	gpiod_direction_input(master->gpio_clk);
   1039	gpiod_direction_input(master->gpio_data);
   1040}
   1041
   1042static int fsi_master_acf_link_enable(struct fsi_master *_master, int link,
   1043				      bool enable)
   1044{
   1045	struct fsi_master_acf *master = to_fsi_master_acf(_master);
   1046	int rc = -EBUSY;
   1047
   1048	if (link != 0)
   1049		return -ENODEV;
   1050
   1051	mutex_lock(&master->lock);
   1052	if (!master->external_mode) {
   1053		gpiod_set_value(master->gpio_enable, enable ? 1 : 0);
   1054		rc = 0;
   1055	}
   1056	mutex_unlock(&master->lock);
   1057
   1058	return rc;
   1059}
   1060
   1061static int fsi_master_acf_link_config(struct fsi_master *_master, int link,
   1062				      u8 t_send_delay, u8 t_echo_delay)
   1063{
   1064	struct fsi_master_acf *master = to_fsi_master_acf(_master);
   1065
   1066	if (link != 0)
   1067		return -ENODEV;
   1068
   1069	mutex_lock(&master->lock);
   1070	master->t_send_delay = t_send_delay;
   1071	master->t_echo_delay = t_echo_delay;
   1072	dev_dbg(master->dev, "Changing delays: send=%d echo=%d\n",
   1073		t_send_delay, t_echo_delay);
   1074	iowrite8(master->t_send_delay, master->sram + SEND_DLY_REG);
   1075	iowrite8(master->t_echo_delay, master->sram + ECHO_DLY_REG);
   1076	mutex_unlock(&master->lock);
   1077
   1078	return 0;
   1079}
   1080
   1081static ssize_t external_mode_show(struct device *dev,
   1082				  struct device_attribute *attr, char *buf)
   1083{
   1084	struct fsi_master_acf *master = dev_get_drvdata(dev);
   1085
   1086	return snprintf(buf, PAGE_SIZE - 1, "%u\n",
   1087			master->external_mode ? 1 : 0);
   1088}
   1089
   1090static ssize_t external_mode_store(struct device *dev,
   1091		struct device_attribute *attr, const char *buf, size_t count)
   1092{
   1093	struct fsi_master_acf *master = dev_get_drvdata(dev);
   1094	unsigned long val;
   1095	bool external_mode;
   1096	int err;
   1097
   1098	err = kstrtoul(buf, 0, &val);
   1099	if (err)
   1100		return err;
   1101
   1102	external_mode = !!val;
   1103
   1104	mutex_lock(&master->lock);
   1105
   1106	if (external_mode == master->external_mode) {
   1107		mutex_unlock(&master->lock);
   1108		return count;
   1109	}
   1110
   1111	master->external_mode = external_mode;
   1112	if (master->external_mode) {
   1113		fsi_master_acf_terminate(master);
   1114		fsi_master_acf_setup_external(master);
   1115	} else
   1116		fsi_master_acf_setup(master);
   1117
   1118	mutex_unlock(&master->lock);
   1119
   1120	fsi_master_rescan(&master->master);
   1121
   1122	return count;
   1123}
   1124
   1125static DEVICE_ATTR(external_mode, 0664,
   1126		external_mode_show, external_mode_store);
   1127
   1128static int fsi_master_acf_gpio_request(void *data)
   1129{
   1130	struct fsi_master_acf *master = data;
   1131	int timeout;
   1132	u8 val;
   1133
   1134	/* Note: This doesn't require holding out mutex */
   1135
   1136	/* Write reqest */
   1137	iowrite8(ARB_ARM_REQ, master->sram + ARB_REG);
   1138
   1139	/*
   1140	 * There is a race (which does happen at boot time) when we get an
   1141	 * arbitration request as we are either about to or just starting
   1142	 * the coprocessor.
   1143	 *
   1144	 * To handle it, we first check if we are running. If not yet we
   1145	 * check whether the copro is started in the SCU.
   1146	 *
   1147	 * If it's not started, we can basically just assume we have arbitration
   1148	 * and return. Otherwise, we wait normally expecting for the arbitration
   1149	 * to eventually complete.
   1150	 */
   1151	if (ioread32(master->sram + CF_STARTED) == 0) {
   1152		unsigned int reg = 0;
   1153
   1154		regmap_read(master->scu, SCU_COPRO_CTRL, &reg);
   1155		if (!(reg & SCU_COPRO_CLK_EN))
   1156			return 0;
   1157	}
   1158
   1159	/* Ring doorbell if any */
   1160	if (master->cvic)
   1161		iowrite32(0x2, master->cvic + CVIC_TRIG_REG);
   1162
   1163	for (timeout = 0; timeout < 10000; timeout++) {
   1164		val = ioread8(master->sram + ARB_REG);
   1165		if (val != ARB_ARM_REQ)
   1166			break;
   1167		udelay(1);
   1168	}
   1169
   1170	/* If it failed, override anyway */
   1171	if (val != ARB_ARM_ACK)
   1172		dev_warn(master->dev, "GPIO request arbitration timeout\n");
   1173
   1174	return 0;
   1175}
   1176
   1177static int fsi_master_acf_gpio_release(void *data)
   1178{
   1179	struct fsi_master_acf *master = data;
   1180
   1181	/* Write release */
   1182	iowrite8(0, master->sram + ARB_REG);
   1183
   1184	/* Ring doorbell if any */
   1185	if (master->cvic)
   1186		iowrite32(0x2, master->cvic + CVIC_TRIG_REG);
   1187
   1188	return 0;
   1189}
   1190
   1191static void fsi_master_acf_release(struct device *dev)
   1192{
   1193	struct fsi_master_acf *master = to_fsi_master_acf(dev_to_fsi_master(dev));
   1194
   1195	/* Cleanup, stop coprocessor */
   1196	mutex_lock(&master->lock);
   1197	fsi_master_acf_terminate(master);
   1198	aspeed_gpio_copro_set_ops(NULL, NULL);
   1199	mutex_unlock(&master->lock);
   1200
   1201	/* Free resources */
   1202	gen_pool_free(master->sram_pool, (unsigned long)master->sram, SRAM_SIZE);
   1203	of_node_put(dev_of_node(master->dev));
   1204
   1205	kfree(master);
   1206}
   1207
   1208static const struct aspeed_gpio_copro_ops fsi_master_acf_gpio_ops = {
   1209	.request_access = fsi_master_acf_gpio_request,
   1210	.release_access = fsi_master_acf_gpio_release,
   1211};
   1212
   1213static int fsi_master_acf_probe(struct platform_device *pdev)
   1214{
   1215	struct device_node *np, *mnode = dev_of_node(&pdev->dev);
   1216	struct genpool_data_fixed gpdf;
   1217	struct fsi_master_acf *master;
   1218	struct gpio_desc *gpio;
   1219	struct resource res;
   1220	uint32_t cf_mem_align;
   1221	int rc;
   1222
   1223	master = kzalloc(sizeof(*master), GFP_KERNEL);
   1224	if (!master)
   1225		return -ENOMEM;
   1226
   1227	master->dev = &pdev->dev;
   1228	master->master.dev.parent = master->dev;
   1229	master->last_addr = LAST_ADDR_INVALID;
   1230
   1231	/* AST2400 vs. AST2500 */
   1232	master->is_ast2500 = of_device_is_compatible(mnode, "aspeed,ast2500-cf-fsi-master");
   1233
   1234	/* Grab the SCU, we'll need to access it to configure the coprocessor */
   1235	if (master->is_ast2500)
   1236		master->scu = syscon_regmap_lookup_by_compatible("aspeed,ast2500-scu");
   1237	else
   1238		master->scu = syscon_regmap_lookup_by_compatible("aspeed,ast2400-scu");
   1239	if (IS_ERR(master->scu)) {
   1240		dev_err(&pdev->dev, "failed to find SCU regmap\n");
   1241		rc = PTR_ERR(master->scu);
   1242		goto err_free;
   1243	}
   1244
   1245	/* Grab all the GPIOs we need */
   1246	gpio = devm_gpiod_get(&pdev->dev, "clock", 0);
   1247	if (IS_ERR(gpio)) {
   1248		dev_err(&pdev->dev, "failed to get clock gpio\n");
   1249		rc = PTR_ERR(gpio);
   1250		goto err_free;
   1251	}
   1252	master->gpio_clk = gpio;
   1253
   1254	gpio = devm_gpiod_get(&pdev->dev, "data", 0);
   1255	if (IS_ERR(gpio)) {
   1256		dev_err(&pdev->dev, "failed to get data gpio\n");
   1257		rc = PTR_ERR(gpio);
   1258		goto err_free;
   1259	}
   1260	master->gpio_data = gpio;
   1261
   1262	/* Optional GPIOs */
   1263	gpio = devm_gpiod_get_optional(&pdev->dev, "trans", 0);
   1264	if (IS_ERR(gpio)) {
   1265		dev_err(&pdev->dev, "failed to get trans gpio\n");
   1266		rc = PTR_ERR(gpio);
   1267		goto err_free;
   1268	}
   1269	master->gpio_trans = gpio;
   1270
   1271	gpio = devm_gpiod_get_optional(&pdev->dev, "enable", 0);
   1272	if (IS_ERR(gpio)) {
   1273		dev_err(&pdev->dev, "failed to get enable gpio\n");
   1274		rc = PTR_ERR(gpio);
   1275		goto err_free;
   1276	}
   1277	master->gpio_enable = gpio;
   1278
   1279	gpio = devm_gpiod_get_optional(&pdev->dev, "mux", 0);
   1280	if (IS_ERR(gpio)) {
   1281		dev_err(&pdev->dev, "failed to get mux gpio\n");
   1282		rc = PTR_ERR(gpio);
   1283		goto err_free;
   1284	}
   1285	master->gpio_mux = gpio;
   1286
   1287	/* Grab the reserved memory region (use DMA API instead ?) */
   1288	np = of_parse_phandle(mnode, "memory-region", 0);
   1289	if (!np) {
   1290		dev_err(&pdev->dev, "Didn't find reserved memory\n");
   1291		rc = -EINVAL;
   1292		goto err_free;
   1293	}
   1294	rc = of_address_to_resource(np, 0, &res);
   1295	of_node_put(np);
   1296	if (rc) {
   1297		dev_err(&pdev->dev, "Couldn't address to resource for reserved memory\n");
   1298		rc = -ENOMEM;
   1299		goto err_free;
   1300	}
   1301	master->cf_mem_size = resource_size(&res);
   1302	master->cf_mem_addr = (uint32_t)res.start;
   1303	cf_mem_align = master->is_ast2500 ? 0x00100000 : 0x00200000;
   1304	if (master->cf_mem_addr & (cf_mem_align - 1)) {
   1305		dev_err(&pdev->dev, "Reserved memory has insufficient alignment\n");
   1306		rc = -ENOMEM;
   1307		goto err_free;
   1308	}
   1309	master->cf_mem = devm_ioremap_resource(&pdev->dev, &res);
   1310 	if (IS_ERR(master->cf_mem)) {
   1311		rc = PTR_ERR(master->cf_mem);
   1312 		goto err_free;
   1313	}
   1314	dev_dbg(&pdev->dev, "DRAM allocation @%x\n", master->cf_mem_addr);
   1315
   1316	/* AST2500 has a SW interrupt to the coprocessor */
   1317	if (master->is_ast2500) {
   1318		/* Grab the CVIC (ColdFire interrupts controller) */
   1319		np = of_parse_phandle(mnode, "aspeed,cvic", 0);
   1320		if (!np) {
   1321			dev_err(&pdev->dev, "Didn't find CVIC\n");
   1322			rc = -EINVAL;
   1323			goto err_free;
   1324		}
   1325		master->cvic = devm_of_iomap(&pdev->dev, np, 0, NULL);
   1326		if (IS_ERR(master->cvic)) {
   1327			rc = PTR_ERR(master->cvic);
   1328			dev_err(&pdev->dev, "Error %d mapping CVIC\n", rc);
   1329			goto err_free;
   1330		}
   1331		rc = of_property_read_u32(np, "copro-sw-interrupts",
   1332					  &master->cvic_sw_irq);
   1333		if (rc) {
   1334			dev_err(&pdev->dev, "Can't find coprocessor SW interrupt\n");
   1335			goto err_free;
   1336		}
   1337	}
   1338
   1339	/* Grab the SRAM */
   1340	master->sram_pool = of_gen_pool_get(dev_of_node(&pdev->dev), "aspeed,sram", 0);
   1341	if (!master->sram_pool) {
   1342		rc = -ENODEV;
   1343		dev_err(&pdev->dev, "Can't find sram pool\n");
   1344		goto err_free;
   1345	}
   1346
   1347	/* Current microcode only deals with fixed location in SRAM */
   1348	gpdf.offset = 0;
   1349	master->sram = (void __iomem *)gen_pool_alloc_algo(master->sram_pool, SRAM_SIZE,
   1350							   gen_pool_fixed_alloc, &gpdf);
   1351	if (!master->sram) {
   1352		rc = -ENOMEM;
   1353		dev_err(&pdev->dev, "Failed to allocate sram from pool\n");
   1354		goto err_free;
   1355	}
   1356	dev_dbg(&pdev->dev, "SRAM allocation @%lx\n",
   1357		(unsigned long)gen_pool_virt_to_phys(master->sram_pool,
   1358						     (unsigned long)master->sram));
   1359
   1360	/*
   1361	 * Hookup with the GPIO driver for arbitration of GPIO banks
   1362	 * ownership.
   1363	 */
   1364	aspeed_gpio_copro_set_ops(&fsi_master_acf_gpio_ops, master);
   1365
   1366	/* Default FSI command delays */
   1367	master->t_send_delay = FSI_SEND_DELAY_CLOCKS;
   1368	master->t_echo_delay = FSI_ECHO_DELAY_CLOCKS;
   1369	master->master.n_links = 1;
   1370	if (master->is_ast2500)
   1371		master->master.flags = FSI_MASTER_FLAG_SWCLOCK;
   1372	master->master.read = fsi_master_acf_read;
   1373	master->master.write = fsi_master_acf_write;
   1374	master->master.term = fsi_master_acf_term;
   1375	master->master.send_break = fsi_master_acf_break;
   1376	master->master.link_enable = fsi_master_acf_link_enable;
   1377	master->master.link_config = fsi_master_acf_link_config;
   1378	master->master.dev.of_node = of_node_get(dev_of_node(master->dev));
   1379	master->master.dev.release = fsi_master_acf_release;
   1380	platform_set_drvdata(pdev, master);
   1381	mutex_init(&master->lock);
   1382
   1383	mutex_lock(&master->lock);
   1384	rc = fsi_master_acf_setup(master);
   1385	mutex_unlock(&master->lock);
   1386	if (rc)
   1387		goto release_of_dev;
   1388
   1389	rc = device_create_file(&pdev->dev, &dev_attr_external_mode);
   1390	if (rc)
   1391		goto stop_copro;
   1392
   1393	rc = fsi_master_register(&master->master);
   1394	if (!rc)
   1395		return 0;
   1396
   1397	device_remove_file(master->dev, &dev_attr_external_mode);
   1398	put_device(&master->master.dev);
   1399	return rc;
   1400
   1401 stop_copro:
   1402	fsi_master_acf_terminate(master);
   1403 release_of_dev:
   1404	aspeed_gpio_copro_set_ops(NULL, NULL);
   1405	gen_pool_free(master->sram_pool, (unsigned long)master->sram, SRAM_SIZE);
   1406	of_node_put(dev_of_node(master->dev));
   1407 err_free:
   1408	kfree(master);
   1409	return rc;
   1410}
   1411
   1412
   1413static int fsi_master_acf_remove(struct platform_device *pdev)
   1414{
   1415	struct fsi_master_acf *master = platform_get_drvdata(pdev);
   1416
   1417	device_remove_file(master->dev, &dev_attr_external_mode);
   1418
   1419	fsi_master_unregister(&master->master);
   1420
   1421	return 0;
   1422}
   1423
   1424static const struct of_device_id fsi_master_acf_match[] = {
   1425	{ .compatible = "aspeed,ast2400-cf-fsi-master" },
   1426	{ .compatible = "aspeed,ast2500-cf-fsi-master" },
   1427	{ },
   1428};
   1429MODULE_DEVICE_TABLE(of, fsi_master_acf_match);
   1430
   1431static struct platform_driver fsi_master_acf = {
   1432	.driver = {
   1433		.name		= "fsi-master-acf",
   1434		.of_match_table	= fsi_master_acf_match,
   1435	},
   1436	.probe	= fsi_master_acf_probe,
   1437	.remove = fsi_master_acf_remove,
   1438};
   1439
   1440module_platform_driver(fsi_master_acf);
   1441MODULE_LICENSE("GPL");