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

mips_ejtag_fdc.c (36006B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * TTY driver for MIPS EJTAG Fast Debug Channels.
      4 *
      5 * Copyright (C) 2007-2015 Imagination Technologies Ltd
      6 */
      7
      8#include <linux/atomic.h>
      9#include <linux/bitops.h>
     10#include <linux/completion.h>
     11#include <linux/console.h>
     12#include <linux/delay.h>
     13#include <linux/export.h>
     14#include <linux/init.h>
     15#include <linux/interrupt.h>
     16#include <linux/kernel.h>
     17#include <linux/kgdb.h>
     18#include <linux/kthread.h>
     19#include <linux/sched.h>
     20#include <linux/serial.h>
     21#include <linux/serial_core.h>
     22#include <linux/slab.h>
     23#include <linux/spinlock.h>
     24#include <linux/string.h>
     25#include <linux/timer.h>
     26#include <linux/tty.h>
     27#include <linux/tty_driver.h>
     28#include <linux/tty_flip.h>
     29#include <linux/uaccess.h>
     30
     31#include <asm/cdmm.h>
     32#include <asm/irq.h>
     33
     34/* Register offsets */
     35#define REG_FDACSR	0x00	/* FDC Access Control and Status Register */
     36#define REG_FDCFG	0x08	/* FDC Configuration Register */
     37#define REG_FDSTAT	0x10	/* FDC Status Register */
     38#define REG_FDRX	0x18	/* FDC Receive Register */
     39#define REG_FDTX(N)	(0x20+0x8*(N))	/* FDC Transmit Register n (0..15) */
     40
     41/* Register fields */
     42
     43#define REG_FDCFG_TXINTTHRES_SHIFT	18
     44#define REG_FDCFG_TXINTTHRES		(0x3 << REG_FDCFG_TXINTTHRES_SHIFT)
     45#define REG_FDCFG_TXINTTHRES_DISABLED	(0x0 << REG_FDCFG_TXINTTHRES_SHIFT)
     46#define REG_FDCFG_TXINTTHRES_EMPTY	(0x1 << REG_FDCFG_TXINTTHRES_SHIFT)
     47#define REG_FDCFG_TXINTTHRES_NOTFULL	(0x2 << REG_FDCFG_TXINTTHRES_SHIFT)
     48#define REG_FDCFG_TXINTTHRES_NEAREMPTY	(0x3 << REG_FDCFG_TXINTTHRES_SHIFT)
     49#define REG_FDCFG_RXINTTHRES_SHIFT	16
     50#define REG_FDCFG_RXINTTHRES		(0x3 << REG_FDCFG_RXINTTHRES_SHIFT)
     51#define REG_FDCFG_RXINTTHRES_DISABLED	(0x0 << REG_FDCFG_RXINTTHRES_SHIFT)
     52#define REG_FDCFG_RXINTTHRES_FULL	(0x1 << REG_FDCFG_RXINTTHRES_SHIFT)
     53#define REG_FDCFG_RXINTTHRES_NOTEMPTY	(0x2 << REG_FDCFG_RXINTTHRES_SHIFT)
     54#define REG_FDCFG_RXINTTHRES_NEARFULL	(0x3 << REG_FDCFG_RXINTTHRES_SHIFT)
     55#define REG_FDCFG_TXFIFOSIZE_SHIFT	8
     56#define REG_FDCFG_TXFIFOSIZE		(0xff << REG_FDCFG_TXFIFOSIZE_SHIFT)
     57#define REG_FDCFG_RXFIFOSIZE_SHIFT	0
     58#define REG_FDCFG_RXFIFOSIZE		(0xff << REG_FDCFG_RXFIFOSIZE_SHIFT)
     59
     60#define REG_FDSTAT_TXCOUNT_SHIFT	24
     61#define REG_FDSTAT_TXCOUNT		(0xff << REG_FDSTAT_TXCOUNT_SHIFT)
     62#define REG_FDSTAT_RXCOUNT_SHIFT	16
     63#define REG_FDSTAT_RXCOUNT		(0xff << REG_FDSTAT_RXCOUNT_SHIFT)
     64#define REG_FDSTAT_RXCHAN_SHIFT		4
     65#define REG_FDSTAT_RXCHAN		(0xf << REG_FDSTAT_RXCHAN_SHIFT)
     66#define REG_FDSTAT_RXE			BIT(3)	/* Rx Empty */
     67#define REG_FDSTAT_RXF			BIT(2)	/* Rx Full */
     68#define REG_FDSTAT_TXE			BIT(1)	/* Tx Empty */
     69#define REG_FDSTAT_TXF			BIT(0)	/* Tx Full */
     70
     71/* Default channel for the early console */
     72#define CONSOLE_CHANNEL      1
     73
     74#define NUM_TTY_CHANNELS     16
     75
     76#define RX_BUF_SIZE 1024
     77
     78/*
     79 * When the IRQ is unavailable, the FDC state must be polled for incoming data
     80 * and space becoming available in TX FIFO.
     81 */
     82#define FDC_TTY_POLL (HZ / 50)
     83
     84struct mips_ejtag_fdc_tty;
     85
     86/**
     87 * struct mips_ejtag_fdc_tty_port - Wrapper struct for FDC tty_port.
     88 * @port:		TTY port data
     89 * @driver:		TTY driver.
     90 * @rx_lock:		Lock for rx_buf.
     91 *			This protects between the hard interrupt and user
     92 *			context. It's also held during read SWITCH operations.
     93 * @rx_buf:		Read buffer.
     94 * @xmit_lock:		Lock for xmit_*, and port.xmit_buf.
     95 *			This protects between user context and kernel thread.
     96 *			It is used from chars_in_buffer()/write_room() TTY
     97 *			callbacks which are used during wait operations, so a
     98 *			mutex is unsuitable.
     99 * @xmit_cnt:		Size of xmit buffer contents.
    100 * @xmit_head:		Head of xmit buffer where data is written.
    101 * @xmit_tail:		Tail of xmit buffer where data is read.
    102 * @xmit_empty:		Completion for xmit buffer being empty.
    103 */
    104struct mips_ejtag_fdc_tty_port {
    105	struct tty_port			 port;
    106	struct mips_ejtag_fdc_tty	*driver;
    107	raw_spinlock_t			 rx_lock;
    108	void				*rx_buf;
    109	spinlock_t			 xmit_lock;
    110	unsigned int			 xmit_cnt;
    111	unsigned int			 xmit_head;
    112	unsigned int			 xmit_tail;
    113	struct completion		 xmit_empty;
    114};
    115
    116/**
    117 * struct mips_ejtag_fdc_tty - Driver data for FDC as a whole.
    118 * @dev:		FDC device (for dev_*() logging).
    119 * @driver:		TTY driver.
    120 * @cpu:		CPU number for this FDC.
    121 * @fdc_name:		FDC name (not for base of channel names).
    122 * @driver_name:	Base of driver name.
    123 * @ports:		Per-channel data.
    124 * @waitqueue:		Wait queue for waiting for TX data, or for space in TX
    125 *			FIFO.
    126 * @lock:		Lock to protect FDCFG (interrupt enable).
    127 * @thread:		KThread for writing out data to FDC.
    128 * @reg:		FDC registers.
    129 * @tx_fifo:		TX FIFO size.
    130 * @xmit_size:		Size of each port's xmit buffer.
    131 * @xmit_total:		Total number of bytes (from all ports) to transmit.
    132 * @xmit_next:		Next port number to transmit from (round robin).
    133 * @xmit_full:		Indicates TX FIFO is full, we're waiting for space.
    134 * @irq:		IRQ number (negative if no IRQ).
    135 * @removing:		Indicates the device is being removed and @poll_timer
    136 *			should not be restarted.
    137 * @poll_timer:		Timer for polling for interrupt events when @irq < 0.
    138 * @sysrq_pressed:	Whether the magic sysrq key combination has been
    139 *			detected. See mips_ejtag_fdc_handle().
    140 */
    141struct mips_ejtag_fdc_tty {
    142	struct device			*dev;
    143	struct tty_driver		*driver;
    144	unsigned int			 cpu;
    145	char				 fdc_name[16];
    146	char				 driver_name[16];
    147	struct mips_ejtag_fdc_tty_port	 ports[NUM_TTY_CHANNELS];
    148	wait_queue_head_t		 waitqueue;
    149	raw_spinlock_t			 lock;
    150	struct task_struct		*thread;
    151
    152	void __iomem			*reg;
    153	u8				 tx_fifo;
    154
    155	unsigned int			 xmit_size;
    156	atomic_t			 xmit_total;
    157	unsigned int			 xmit_next;
    158	bool				 xmit_full;
    159
    160	int				 irq;
    161	bool				 removing;
    162	struct timer_list		 poll_timer;
    163
    164#ifdef CONFIG_MAGIC_SYSRQ
    165	bool				 sysrq_pressed;
    166#endif
    167};
    168
    169/* Hardware access */
    170
    171static inline void mips_ejtag_fdc_write(struct mips_ejtag_fdc_tty *priv,
    172					unsigned int offs, unsigned int data)
    173{
    174	__raw_writel(data, priv->reg + offs);
    175}
    176
    177static inline unsigned int mips_ejtag_fdc_read(struct mips_ejtag_fdc_tty *priv,
    178					       unsigned int offs)
    179{
    180	return __raw_readl(priv->reg + offs);
    181}
    182
    183/* Encoding of byte stream in FDC words */
    184
    185/**
    186 * struct fdc_word - FDC word encoding some number of bytes of data.
    187 * @word:		Raw FDC word.
    188 * @bytes:		Number of bytes encoded by @word.
    189 */
    190struct fdc_word {
    191	u32		word;
    192	unsigned int	bytes;
    193};
    194
    195/*
    196 * This is a compact encoding which allows every 1 byte, 2 byte, and 3 byte
    197 * sequence to be encoded in a single word, while allowing the majority of 4
    198 * byte sequences (including all ASCII and common binary data) to be encoded in
    199 * a single word too.
    200 *    _______________________ _____________
    201 *   |       FDC Word        |             |
    202 *   |31-24|23-16|15-8 | 7-0 |    Bytes    |
    203 *   |_____|_____|_____|_____|_____________|
    204 *   |     |     |     |     |             |
    205 *   |0x80 |0x80 |0x80 |  WW | WW          |
    206 *   |0x81 |0x81 |  XX |  WW | WW XX       |
    207 *   |0x82 |  YY |  XX |  WW | WW XX YY    |
    208 *   |  ZZ |  YY |  XX |  WW | WW XX YY ZZ |
    209 *   |_____|_____|_____|_____|_____________|
    210 *
    211 * Note that the 4-byte encoding can only be used where none of the other 3
    212 * encodings match, otherwise it must fall back to the 3 byte encoding.
    213 */
    214
    215/* ranges >= 1 && sizes[0] >= 1 */
    216static struct fdc_word mips_ejtag_fdc_encode(const char **ptrs,
    217					     unsigned int *sizes,
    218					     unsigned int ranges)
    219{
    220	struct fdc_word word = { 0, 0 };
    221	const char **ptrs_end = ptrs + ranges;
    222
    223	for (; ptrs < ptrs_end; ++ptrs) {
    224		const char *ptr = *(ptrs++);
    225		const char *end = ptr + *(sizes++);
    226
    227		for (; ptr < end; ++ptr) {
    228			word.word |= (u8)*ptr << (8*word.bytes);
    229			++word.bytes;
    230			if (word.bytes == 4)
    231				goto done;
    232		}
    233	}
    234done:
    235	/* Choose the appropriate encoding */
    236	switch (word.bytes) {
    237	case 4:
    238		/* 4 byte encoding, but don't match the 1-3 byte encodings */
    239		if ((word.word >> 8) != 0x808080 &&
    240		    (word.word >> 16) != 0x8181 &&
    241		    (word.word >> 24) != 0x82)
    242			break;
    243		/* Fall back to a 3 byte encoding */
    244		word.bytes = 3;
    245		word.word &= 0x00ffffff;
    246		fallthrough;
    247	case 3:
    248		/* 3 byte encoding */
    249		word.word |= 0x82000000;
    250		break;
    251	case 2:
    252		/* 2 byte encoding */
    253		word.word |= 0x81810000;
    254		break;
    255	case 1:
    256		/* 1 byte encoding */
    257		word.word |= 0x80808000;
    258		break;
    259	}
    260	return word;
    261}
    262
    263static unsigned int mips_ejtag_fdc_decode(u32 word, char *buf)
    264{
    265	buf[0] = (u8)word;
    266	word >>= 8;
    267	if (word == 0x808080)
    268		return 1;
    269	buf[1] = (u8)word;
    270	word >>= 8;
    271	if (word == 0x8181)
    272		return 2;
    273	buf[2] = (u8)word;
    274	word >>= 8;
    275	if (word == 0x82)
    276		return 3;
    277	buf[3] = (u8)word;
    278	return 4;
    279}
    280
    281/* Console operations */
    282
    283/**
    284 * struct mips_ejtag_fdc_console - Wrapper struct for FDC consoles.
    285 * @cons:		Console object.
    286 * @tty_drv:		TTY driver associated with this console.
    287 * @lock:		Lock to protect concurrent access to other fields.
    288 *			This is raw because it may be used very early.
    289 * @initialised:	Whether the console is initialised.
    290 * @regs:		Registers base address for each CPU.
    291 */
    292struct mips_ejtag_fdc_console {
    293	struct console		 cons;
    294	struct tty_driver	*tty_drv;
    295	raw_spinlock_t		 lock;
    296	bool			 initialised;
    297	void __iomem		*regs[NR_CPUS];
    298};
    299
    300/* Low level console write shared by early console and normal console */
    301static void mips_ejtag_fdc_console_write(struct console *c, const char *s,
    302					 unsigned int count)
    303{
    304	struct mips_ejtag_fdc_console *cons =
    305		container_of(c, struct mips_ejtag_fdc_console, cons);
    306	void __iomem *regs;
    307	struct fdc_word word;
    308	unsigned long flags;
    309	unsigned int i, buf_len, cpu;
    310	bool done_cr = false;
    311	char buf[4];
    312	const char *buf_ptr = buf;
    313	/* Number of bytes of input data encoded up to each byte in buf */
    314	u8 inc[4];
    315
    316	local_irq_save(flags);
    317	cpu = smp_processor_id();
    318	regs = cons->regs[cpu];
    319	/* First console output on this CPU? */
    320	if (!regs) {
    321		regs = mips_cdmm_early_probe(0xfd);
    322		cons->regs[cpu] = regs;
    323	}
    324	/* Already tried and failed to find FDC on this CPU? */
    325	if (IS_ERR(regs))
    326		goto out;
    327	while (count) {
    328		/*
    329		 * Copy the next few characters to a buffer so we can inject
    330		 * carriage returns before newlines.
    331		 */
    332		for (buf_len = 0, i = 0; buf_len < 4 && i < count; ++buf_len) {
    333			if (s[i] == '\n' && !done_cr) {
    334				buf[buf_len] = '\r';
    335				done_cr = true;
    336			} else {
    337				buf[buf_len] = s[i];
    338				done_cr = false;
    339				++i;
    340			}
    341			inc[buf_len] = i;
    342		}
    343		word = mips_ejtag_fdc_encode(&buf_ptr, &buf_len, 1);
    344		count -= inc[word.bytes - 1];
    345		s += inc[word.bytes - 1];
    346
    347		/* Busy wait until there's space in fifo */
    348		while (__raw_readl(regs + REG_FDSTAT) & REG_FDSTAT_TXF)
    349			;
    350		__raw_writel(word.word, regs + REG_FDTX(c->index));
    351	}
    352out:
    353	local_irq_restore(flags);
    354}
    355
    356static struct tty_driver *mips_ejtag_fdc_console_device(struct console *c,
    357							int *index)
    358{
    359	struct mips_ejtag_fdc_console *cons =
    360		container_of(c, struct mips_ejtag_fdc_console, cons);
    361
    362	*index = c->index;
    363	return cons->tty_drv;
    364}
    365
    366/* Initialise an FDC console (early or normal */
    367static int __init mips_ejtag_fdc_console_init(struct mips_ejtag_fdc_console *c)
    368{
    369	void __iomem *regs;
    370	unsigned long flags;
    371	int ret = 0;
    372
    373	raw_spin_lock_irqsave(&c->lock, flags);
    374	/* Don't init twice */
    375	if (c->initialised)
    376		goto out;
    377	/* Look for the FDC device */
    378	regs = mips_cdmm_early_probe(0xfd);
    379	if (IS_ERR(regs)) {
    380		ret = PTR_ERR(regs);
    381		goto out;
    382	}
    383
    384	c->initialised = true;
    385	c->regs[smp_processor_id()] = regs;
    386	register_console(&c->cons);
    387out:
    388	raw_spin_unlock_irqrestore(&c->lock, flags);
    389	return ret;
    390}
    391
    392static struct mips_ejtag_fdc_console mips_ejtag_fdc_con = {
    393	.cons	= {
    394		.name	= "fdc",
    395		.write	= mips_ejtag_fdc_console_write,
    396		.device	= mips_ejtag_fdc_console_device,
    397		.flags	= CON_PRINTBUFFER,
    398		.index	= -1,
    399	},
    400	.lock	= __RAW_SPIN_LOCK_UNLOCKED(mips_ejtag_fdc_con.lock),
    401};
    402
    403/* TTY RX/TX operations */
    404
    405/**
    406 * mips_ejtag_fdc_put_chan() - Write out a block of channel data.
    407 * @priv:	Pointer to driver private data.
    408 * @chan:	Channel number.
    409 *
    410 * Write a single block of data out to the debug adapter. If the circular buffer
    411 * is wrapped then only the first block is written.
    412 *
    413 * Returns:	The number of bytes that were written.
    414 */
    415static unsigned int mips_ejtag_fdc_put_chan(struct mips_ejtag_fdc_tty *priv,
    416					    unsigned int chan)
    417{
    418	struct mips_ejtag_fdc_tty_port *dport;
    419	struct tty_struct *tty;
    420	const char *ptrs[2];
    421	unsigned int sizes[2] = { 0 };
    422	struct fdc_word word = { .bytes = 0 };
    423	unsigned long flags;
    424
    425	dport = &priv->ports[chan];
    426	spin_lock(&dport->xmit_lock);
    427	if (dport->xmit_cnt) {
    428		ptrs[0] = dport->port.xmit_buf + dport->xmit_tail;
    429		sizes[0] = min_t(unsigned int,
    430				 priv->xmit_size - dport->xmit_tail,
    431				 dport->xmit_cnt);
    432		ptrs[1] = dport->port.xmit_buf;
    433		sizes[1] = dport->xmit_cnt - sizes[0];
    434		word = mips_ejtag_fdc_encode(ptrs, sizes, 1 + !!sizes[1]);
    435
    436		dev_dbg(priv->dev, "%s%u: out %08x: \"%*pE%*pE\"\n",
    437			priv->driver_name, chan, word.word,
    438			min_t(int, word.bytes, sizes[0]), ptrs[0],
    439			max_t(int, 0, word.bytes - sizes[0]), ptrs[1]);
    440
    441		local_irq_save(flags);
    442		/* Maybe we raced with the console and TX FIFO is full */
    443		if (mips_ejtag_fdc_read(priv, REG_FDSTAT) & REG_FDSTAT_TXF)
    444			word.bytes = 0;
    445		else
    446			mips_ejtag_fdc_write(priv, REG_FDTX(chan), word.word);
    447		local_irq_restore(flags);
    448
    449		dport->xmit_cnt -= word.bytes;
    450		if (!dport->xmit_cnt) {
    451			/* Reset pointers to avoid wraps */
    452			dport->xmit_head = 0;
    453			dport->xmit_tail = 0;
    454			complete(&dport->xmit_empty);
    455		} else {
    456			dport->xmit_tail += word.bytes;
    457			if (dport->xmit_tail >= priv->xmit_size)
    458				dport->xmit_tail -= priv->xmit_size;
    459		}
    460		atomic_sub(word.bytes, &priv->xmit_total);
    461	}
    462	spin_unlock(&dport->xmit_lock);
    463
    464	/* If we've made more data available, wake up tty */
    465	if (sizes[0] && word.bytes) {
    466		tty = tty_port_tty_get(&dport->port);
    467		if (tty) {
    468			tty_wakeup(tty);
    469			tty_kref_put(tty);
    470		}
    471	}
    472
    473	return word.bytes;
    474}
    475
    476/**
    477 * mips_ejtag_fdc_put() - Kernel thread to write out channel data to FDC.
    478 * @arg:	Driver pointer.
    479 *
    480 * This kernel thread runs while @priv->xmit_total != 0, and round robins the
    481 * channels writing out blocks of buffered data to the FDC TX FIFO.
    482 */
    483static int mips_ejtag_fdc_put(void *arg)
    484{
    485	struct mips_ejtag_fdc_tty *priv = arg;
    486	struct mips_ejtag_fdc_tty_port *dport;
    487	unsigned int ret;
    488	u32 cfg;
    489
    490	__set_current_state(TASK_RUNNING);
    491	while (!kthread_should_stop()) {
    492		/* Wait for data to actually write */
    493		wait_event_interruptible(priv->waitqueue,
    494					 atomic_read(&priv->xmit_total) ||
    495					 kthread_should_stop());
    496		if (kthread_should_stop())
    497			break;
    498
    499		/* Wait for TX FIFO space to write data */
    500		raw_spin_lock_irq(&priv->lock);
    501		if (mips_ejtag_fdc_read(priv, REG_FDSTAT) & REG_FDSTAT_TXF) {
    502			priv->xmit_full = true;
    503			if (priv->irq >= 0) {
    504				/* Enable TX interrupt */
    505				cfg = mips_ejtag_fdc_read(priv, REG_FDCFG);
    506				cfg &= ~REG_FDCFG_TXINTTHRES;
    507				cfg |= REG_FDCFG_TXINTTHRES_NOTFULL;
    508				mips_ejtag_fdc_write(priv, REG_FDCFG, cfg);
    509			}
    510		}
    511		raw_spin_unlock_irq(&priv->lock);
    512		wait_event_interruptible(priv->waitqueue,
    513					 !(mips_ejtag_fdc_read(priv, REG_FDSTAT)
    514					   & REG_FDSTAT_TXF) ||
    515					 kthread_should_stop());
    516		if (kthread_should_stop())
    517			break;
    518
    519		/* Find next channel with data to output */
    520		for (;;) {
    521			dport = &priv->ports[priv->xmit_next];
    522			spin_lock(&dport->xmit_lock);
    523			ret = dport->xmit_cnt;
    524			spin_unlock(&dport->xmit_lock);
    525			if (ret)
    526				break;
    527			/* Round robin */
    528			++priv->xmit_next;
    529			if (priv->xmit_next >= NUM_TTY_CHANNELS)
    530				priv->xmit_next = 0;
    531		}
    532
    533		/* Try writing data to the chosen channel */
    534		ret = mips_ejtag_fdc_put_chan(priv, priv->xmit_next);
    535
    536		/*
    537		 * If anything was output, move on to the next channel so as not
    538		 * to starve other channels.
    539		 */
    540		if (ret) {
    541			++priv->xmit_next;
    542			if (priv->xmit_next >= NUM_TTY_CHANNELS)
    543				priv->xmit_next = 0;
    544		}
    545	}
    546
    547	return 0;
    548}
    549
    550/**
    551 * mips_ejtag_fdc_handle() - Handle FDC events.
    552 * @priv:	Pointer to driver private data.
    553 *
    554 * Handle FDC events, such as new incoming data which needs draining out of the
    555 * RX FIFO and feeding into the appropriate TTY ports, and space becoming
    556 * available in the TX FIFO which would allow more data to be written out.
    557 */
    558static void mips_ejtag_fdc_handle(struct mips_ejtag_fdc_tty *priv)
    559{
    560	struct mips_ejtag_fdc_tty_port *dport;
    561	unsigned int stat, channel, data, cfg, i, flipped;
    562	int len;
    563	char buf[4];
    564
    565	for (;;) {
    566		/* Find which channel the next FDC word is destined for */
    567		stat = mips_ejtag_fdc_read(priv, REG_FDSTAT);
    568		if (stat & REG_FDSTAT_RXE)
    569			break;
    570		channel = (stat & REG_FDSTAT_RXCHAN) >> REG_FDSTAT_RXCHAN_SHIFT;
    571		dport = &priv->ports[channel];
    572
    573		/* Read out the FDC word, decode it, and pass to tty layer */
    574		raw_spin_lock(&dport->rx_lock);
    575		data = mips_ejtag_fdc_read(priv, REG_FDRX);
    576
    577		len = mips_ejtag_fdc_decode(data, buf);
    578		dev_dbg(priv->dev, "%s%u: in  %08x: \"%*pE\"\n",
    579			priv->driver_name, channel, data, len, buf);
    580
    581		flipped = 0;
    582		for (i = 0; i < len; ++i) {
    583#ifdef CONFIG_MAGIC_SYSRQ
    584#ifdef CONFIG_MIPS_EJTAG_FDC_KGDB
    585			/* Support just Ctrl+C with KGDB channel */
    586			if (channel == CONFIG_MIPS_EJTAG_FDC_KGDB_CHAN) {
    587				if (buf[i] == '\x03') { /* ^C */
    588					handle_sysrq('g');
    589					continue;
    590				}
    591			}
    592#endif
    593			/* Support Ctrl+O for console channel */
    594			if (channel == mips_ejtag_fdc_con.cons.index) {
    595				if (buf[i] == '\x0f') {	/* ^O */
    596					priv->sysrq_pressed =
    597						!priv->sysrq_pressed;
    598					if (priv->sysrq_pressed)
    599						continue;
    600				} else if (priv->sysrq_pressed) {
    601					handle_sysrq(buf[i]);
    602					priv->sysrq_pressed = false;
    603					continue;
    604				}
    605			}
    606#endif /* CONFIG_MAGIC_SYSRQ */
    607
    608			/* Check the port isn't being shut down */
    609			if (!dport->rx_buf)
    610				continue;
    611
    612			flipped += tty_insert_flip_char(&dport->port, buf[i],
    613							TTY_NORMAL);
    614		}
    615		if (flipped)
    616			tty_flip_buffer_push(&dport->port);
    617
    618		raw_spin_unlock(&dport->rx_lock);
    619	}
    620
    621	/* If TX FIFO no longer full we may be able to write more data */
    622	raw_spin_lock(&priv->lock);
    623	if (priv->xmit_full && !(stat & REG_FDSTAT_TXF)) {
    624		priv->xmit_full = false;
    625
    626		/* Disable TX interrupt */
    627		cfg = mips_ejtag_fdc_read(priv, REG_FDCFG);
    628		cfg &= ~REG_FDCFG_TXINTTHRES;
    629		cfg |= REG_FDCFG_TXINTTHRES_DISABLED;
    630		mips_ejtag_fdc_write(priv, REG_FDCFG, cfg);
    631
    632		/* Wait the kthread so it can try writing more data */
    633		wake_up_interruptible(&priv->waitqueue);
    634	}
    635	raw_spin_unlock(&priv->lock);
    636}
    637
    638/**
    639 * mips_ejtag_fdc_isr() - Interrupt handler.
    640 * @irq:	IRQ number.
    641 * @dev_id:	Pointer to driver private data.
    642 *
    643 * This is the interrupt handler, used when interrupts are enabled.
    644 *
    645 * It simply triggers the common FDC handler code.
    646 *
    647 * Returns:	IRQ_HANDLED if an FDC interrupt was pending.
    648 *		IRQ_NONE otherwise.
    649 */
    650static irqreturn_t mips_ejtag_fdc_isr(int irq, void *dev_id)
    651{
    652	struct mips_ejtag_fdc_tty *priv = dev_id;
    653
    654	/*
    655	 * We're not using proper per-cpu IRQs, so we must be careful not to
    656	 * handle IRQs on CPUs we're not interested in.
    657	 *
    658	 * Ideally proper per-cpu IRQ handlers could be used, but that doesn't
    659	 * fit well with the whole sharing of the main CPU IRQ lines. When we
    660	 * have something with a GIC that routes the FDC IRQs (i.e. no sharing
    661	 * between handlers) then support could be added more easily.
    662	 */
    663	if (smp_processor_id() != priv->cpu)
    664		return IRQ_NONE;
    665
    666	/* If no FDC interrupt pending, it wasn't for us */
    667	if (!(read_c0_cause() & CAUSEF_FDCI))
    668		return IRQ_NONE;
    669
    670	mips_ejtag_fdc_handle(priv);
    671	return IRQ_HANDLED;
    672}
    673
    674/**
    675 * mips_ejtag_fdc_tty_timer() - Poll FDC for incoming data.
    676 * @opaque:	Pointer to driver private data.
    677 *
    678 * This is the timer handler for when interrupts are disabled and polling the
    679 * FDC state is required.
    680 *
    681 * It simply triggers the common FDC handler code and arranges for further
    682 * polling.
    683 */
    684static void mips_ejtag_fdc_tty_timer(struct timer_list *t)
    685{
    686	struct mips_ejtag_fdc_tty *priv = from_timer(priv, t, poll_timer);
    687
    688	mips_ejtag_fdc_handle(priv);
    689	if (!priv->removing)
    690		mod_timer(&priv->poll_timer, jiffies + FDC_TTY_POLL);
    691}
    692
    693/* TTY Port operations */
    694
    695static int mips_ejtag_fdc_tty_port_activate(struct tty_port *port,
    696					    struct tty_struct *tty)
    697{
    698	struct mips_ejtag_fdc_tty_port *dport =
    699		container_of(port, struct mips_ejtag_fdc_tty_port, port);
    700	void *rx_buf;
    701
    702	/* Allocate the buffer we use for writing data */
    703	if (tty_port_alloc_xmit_buf(port) < 0)
    704		goto err;
    705
    706	/* Allocate the buffer we use for reading data */
    707	rx_buf = kzalloc(RX_BUF_SIZE, GFP_KERNEL);
    708	if (!rx_buf)
    709		goto err_free_xmit;
    710
    711	raw_spin_lock_irq(&dport->rx_lock);
    712	dport->rx_buf = rx_buf;
    713	raw_spin_unlock_irq(&dport->rx_lock);
    714
    715	return 0;
    716err_free_xmit:
    717	tty_port_free_xmit_buf(port);
    718err:
    719	return -ENOMEM;
    720}
    721
    722static void mips_ejtag_fdc_tty_port_shutdown(struct tty_port *port)
    723{
    724	struct mips_ejtag_fdc_tty_port *dport =
    725		container_of(port, struct mips_ejtag_fdc_tty_port, port);
    726	struct mips_ejtag_fdc_tty *priv = dport->driver;
    727	void *rx_buf;
    728	unsigned int count;
    729
    730	spin_lock(&dport->xmit_lock);
    731	count = dport->xmit_cnt;
    732	spin_unlock(&dport->xmit_lock);
    733	if (count) {
    734		/*
    735		 * There's still data to write out, so wake and wait for the
    736		 * writer thread to drain the buffer.
    737		 */
    738		wake_up_interruptible(&priv->waitqueue);
    739		wait_for_completion(&dport->xmit_empty);
    740	}
    741
    742	/* Null the read buffer (timer could still be running!) */
    743	raw_spin_lock_irq(&dport->rx_lock);
    744	rx_buf = dport->rx_buf;
    745	dport->rx_buf = NULL;
    746	raw_spin_unlock_irq(&dport->rx_lock);
    747	/* Free the read buffer */
    748	kfree(rx_buf);
    749
    750	/* Free the write buffer */
    751	tty_port_free_xmit_buf(port);
    752}
    753
    754static const struct tty_port_operations mips_ejtag_fdc_tty_port_ops = {
    755	.activate	= mips_ejtag_fdc_tty_port_activate,
    756	.shutdown	= mips_ejtag_fdc_tty_port_shutdown,
    757};
    758
    759/* TTY operations */
    760
    761static int mips_ejtag_fdc_tty_install(struct tty_driver *driver,
    762				      struct tty_struct *tty)
    763{
    764	struct mips_ejtag_fdc_tty *priv = driver->driver_state;
    765
    766	tty->driver_data = &priv->ports[tty->index];
    767	return tty_port_install(&priv->ports[tty->index].port, driver, tty);
    768}
    769
    770static int mips_ejtag_fdc_tty_open(struct tty_struct *tty, struct file *filp)
    771{
    772	return tty_port_open(tty->port, tty, filp);
    773}
    774
    775static void mips_ejtag_fdc_tty_close(struct tty_struct *tty, struct file *filp)
    776{
    777	return tty_port_close(tty->port, tty, filp);
    778}
    779
    780static void mips_ejtag_fdc_tty_hangup(struct tty_struct *tty)
    781{
    782	struct mips_ejtag_fdc_tty_port *dport = tty->driver_data;
    783	struct mips_ejtag_fdc_tty *priv = dport->driver;
    784
    785	/* Drop any data in the xmit buffer */
    786	spin_lock(&dport->xmit_lock);
    787	if (dport->xmit_cnt) {
    788		atomic_sub(dport->xmit_cnt, &priv->xmit_total);
    789		dport->xmit_cnt = 0;
    790		dport->xmit_head = 0;
    791		dport->xmit_tail = 0;
    792		complete(&dport->xmit_empty);
    793	}
    794	spin_unlock(&dport->xmit_lock);
    795
    796	tty_port_hangup(tty->port);
    797}
    798
    799static int mips_ejtag_fdc_tty_write(struct tty_struct *tty,
    800				    const unsigned char *buf, int total)
    801{
    802	int count, block;
    803	struct mips_ejtag_fdc_tty_port *dport = tty->driver_data;
    804	struct mips_ejtag_fdc_tty *priv = dport->driver;
    805
    806	/*
    807	 * Write to output buffer.
    808	 *
    809	 * The reason that we asynchronously write the buffer is because if we
    810	 * were to write the buffer synchronously then because the channels are
    811	 * per-CPU the buffer would be written to the channel of whatever CPU
    812	 * we're running on.
    813	 *
    814	 * What we actually want to happen is have all input and output done on
    815	 * one CPU.
    816	 */
    817	spin_lock(&dport->xmit_lock);
    818	/* Work out how many bytes we can write to the xmit buffer */
    819	total = min(total, (int)(priv->xmit_size - dport->xmit_cnt));
    820	atomic_add(total, &priv->xmit_total);
    821	dport->xmit_cnt += total;
    822	/* Write the actual bytes (may need splitting if it wraps) */
    823	for (count = total; count; count -= block) {
    824		block = min(count, (int)(priv->xmit_size - dport->xmit_head));
    825		memcpy(dport->port.xmit_buf + dport->xmit_head, buf, block);
    826		dport->xmit_head += block;
    827		if (dport->xmit_head >= priv->xmit_size)
    828			dport->xmit_head -= priv->xmit_size;
    829		buf += block;
    830	}
    831	count = dport->xmit_cnt;
    832	/* Xmit buffer no longer empty? */
    833	if (count)
    834		reinit_completion(&dport->xmit_empty);
    835	spin_unlock(&dport->xmit_lock);
    836
    837	/* Wake up the kthread */
    838	if (total)
    839		wake_up_interruptible(&priv->waitqueue);
    840	return total;
    841}
    842
    843static unsigned int mips_ejtag_fdc_tty_write_room(struct tty_struct *tty)
    844{
    845	struct mips_ejtag_fdc_tty_port *dport = tty->driver_data;
    846	struct mips_ejtag_fdc_tty *priv = dport->driver;
    847	unsigned int room;
    848
    849	/* Report the space in the xmit buffer */
    850	spin_lock(&dport->xmit_lock);
    851	room = priv->xmit_size - dport->xmit_cnt;
    852	spin_unlock(&dport->xmit_lock);
    853
    854	return room;
    855}
    856
    857static unsigned int mips_ejtag_fdc_tty_chars_in_buffer(struct tty_struct *tty)
    858{
    859	struct mips_ejtag_fdc_tty_port *dport = tty->driver_data;
    860	unsigned int chars;
    861
    862	/* Report the number of bytes in the xmit buffer */
    863	spin_lock(&dport->xmit_lock);
    864	chars = dport->xmit_cnt;
    865	spin_unlock(&dport->xmit_lock);
    866
    867	return chars;
    868}
    869
    870static const struct tty_operations mips_ejtag_fdc_tty_ops = {
    871	.install		= mips_ejtag_fdc_tty_install,
    872	.open			= mips_ejtag_fdc_tty_open,
    873	.close			= mips_ejtag_fdc_tty_close,
    874	.hangup			= mips_ejtag_fdc_tty_hangup,
    875	.write			= mips_ejtag_fdc_tty_write,
    876	.write_room		= mips_ejtag_fdc_tty_write_room,
    877	.chars_in_buffer	= mips_ejtag_fdc_tty_chars_in_buffer,
    878};
    879
    880int __weak get_c0_fdc_int(void)
    881{
    882	return -1;
    883}
    884
    885static int mips_ejtag_fdc_tty_probe(struct mips_cdmm_device *dev)
    886{
    887	int ret, nport;
    888	struct mips_ejtag_fdc_tty_port *dport;
    889	struct mips_ejtag_fdc_tty *priv;
    890	struct tty_driver *driver;
    891	unsigned int cfg, tx_fifo;
    892
    893	priv = devm_kzalloc(&dev->dev, sizeof(*priv), GFP_KERNEL);
    894	if (!priv)
    895		return -ENOMEM;
    896	priv->cpu = dev->cpu;
    897	priv->dev = &dev->dev;
    898	mips_cdmm_set_drvdata(dev, priv);
    899	atomic_set(&priv->xmit_total, 0);
    900	raw_spin_lock_init(&priv->lock);
    901
    902	priv->reg = devm_ioremap(priv->dev, dev->res.start,
    903					 resource_size(&dev->res));
    904	if (!priv->reg) {
    905		dev_err(priv->dev, "ioremap failed for resource %pR\n",
    906			&dev->res);
    907		return -ENOMEM;
    908	}
    909
    910	cfg = mips_ejtag_fdc_read(priv, REG_FDCFG);
    911	tx_fifo = (cfg & REG_FDCFG_TXFIFOSIZE) >> REG_FDCFG_TXFIFOSIZE_SHIFT;
    912	/* Disable interrupts */
    913	cfg &= ~(REG_FDCFG_TXINTTHRES | REG_FDCFG_RXINTTHRES);
    914	cfg |= REG_FDCFG_TXINTTHRES_DISABLED;
    915	cfg |= REG_FDCFG_RXINTTHRES_DISABLED;
    916	mips_ejtag_fdc_write(priv, REG_FDCFG, cfg);
    917
    918	/* Make each port's xmit FIFO big enough to fill FDC TX FIFO */
    919	priv->xmit_size = min(tx_fifo * 4, (unsigned int)SERIAL_XMIT_SIZE);
    920
    921	driver = tty_alloc_driver(NUM_TTY_CHANNELS, TTY_DRIVER_REAL_RAW);
    922	if (IS_ERR(driver))
    923		return PTR_ERR(driver);
    924	priv->driver = driver;
    925
    926	driver->driver_name = "ejtag_fdc";
    927	snprintf(priv->fdc_name, sizeof(priv->fdc_name), "ttyFDC%u", dev->cpu);
    928	snprintf(priv->driver_name, sizeof(priv->driver_name), "%sc",
    929		 priv->fdc_name);
    930	driver->name = priv->driver_name;
    931	driver->major = 0; /* Auto-allocate */
    932	driver->minor_start = 0;
    933	driver->type = TTY_DRIVER_TYPE_SERIAL;
    934	driver->subtype = SERIAL_TYPE_NORMAL;
    935	driver->init_termios = tty_std_termios;
    936	driver->init_termios.c_cflag |= CLOCAL;
    937	driver->driver_state = priv;
    938
    939	tty_set_operations(driver, &mips_ejtag_fdc_tty_ops);
    940	for (nport = 0; nport < NUM_TTY_CHANNELS; nport++) {
    941		dport = &priv->ports[nport];
    942		dport->driver = priv;
    943		tty_port_init(&dport->port);
    944		dport->port.ops = &mips_ejtag_fdc_tty_port_ops;
    945		raw_spin_lock_init(&dport->rx_lock);
    946		spin_lock_init(&dport->xmit_lock);
    947		/* The xmit buffer starts empty, i.e. completely written */
    948		init_completion(&dport->xmit_empty);
    949		complete(&dport->xmit_empty);
    950	}
    951
    952	/* Set up the console */
    953	mips_ejtag_fdc_con.regs[dev->cpu] = priv->reg;
    954	if (dev->cpu == 0)
    955		mips_ejtag_fdc_con.tty_drv = driver;
    956
    957	init_waitqueue_head(&priv->waitqueue);
    958	/*
    959	 * Bind the writer thread to the right CPU so it can't migrate.
    960	 * The channels are per-CPU and we want all channel I/O to be on a
    961	 * single predictable CPU.
    962	 */
    963	priv->thread = kthread_run_on_cpu(mips_ejtag_fdc_put, priv,
    964					  dev->cpu, "ttyFDC/%u");
    965	if (IS_ERR(priv->thread)) {
    966		ret = PTR_ERR(priv->thread);
    967		dev_err(priv->dev, "Couldn't create kthread (%d)\n", ret);
    968		goto err_destroy_ports;
    969	}
    970
    971	/* Look for an FDC IRQ */
    972	priv->irq = get_c0_fdc_int();
    973
    974	/* Try requesting the IRQ */
    975	if (priv->irq >= 0) {
    976		/*
    977		 * IRQF_SHARED, IRQF_COND_SUSPEND: The FDC IRQ may be shared with
    978		 * other local interrupts such as the timer which sets
    979		 * IRQF_TIMER (including IRQF_NO_SUSPEND).
    980		 *
    981		 * IRQF_NO_THREAD: The FDC IRQ isn't individually maskable so it
    982		 * cannot be deferred and handled by a thread on RT kernels. For
    983		 * this reason any spinlocks used from the ISR are raw.
    984		 */
    985		ret = devm_request_irq(priv->dev, priv->irq, mips_ejtag_fdc_isr,
    986				       IRQF_PERCPU | IRQF_SHARED |
    987				       IRQF_NO_THREAD | IRQF_COND_SUSPEND,
    988				       priv->fdc_name, priv);
    989		if (ret)
    990			priv->irq = -1;
    991	}
    992	if (priv->irq >= 0) {
    993		/* IRQ is usable, enable RX interrupt */
    994		raw_spin_lock_irq(&priv->lock);
    995		cfg = mips_ejtag_fdc_read(priv, REG_FDCFG);
    996		cfg &= ~REG_FDCFG_RXINTTHRES;
    997		cfg |= REG_FDCFG_RXINTTHRES_NOTEMPTY;
    998		mips_ejtag_fdc_write(priv, REG_FDCFG, cfg);
    999		raw_spin_unlock_irq(&priv->lock);
   1000	} else {
   1001		/* If we didn't get an usable IRQ, poll instead */
   1002		timer_setup(&priv->poll_timer, mips_ejtag_fdc_tty_timer,
   1003			    TIMER_PINNED);
   1004		priv->poll_timer.expires = jiffies + FDC_TTY_POLL;
   1005		/*
   1006		 * Always attach the timer to the right CPU. The channels are
   1007		 * per-CPU so all polling should be from a single CPU.
   1008		 */
   1009		add_timer_on(&priv->poll_timer, dev->cpu);
   1010
   1011		dev_info(priv->dev, "No usable IRQ, polling enabled\n");
   1012	}
   1013
   1014	ret = tty_register_driver(driver);
   1015	if (ret < 0) {
   1016		dev_err(priv->dev, "Couldn't install tty driver (%d)\n", ret);
   1017		goto err_stop_irq;
   1018	}
   1019
   1020	return 0;
   1021
   1022err_stop_irq:
   1023	if (priv->irq >= 0) {
   1024		raw_spin_lock_irq(&priv->lock);
   1025		cfg = mips_ejtag_fdc_read(priv, REG_FDCFG);
   1026		/* Disable interrupts */
   1027		cfg &= ~(REG_FDCFG_TXINTTHRES | REG_FDCFG_RXINTTHRES);
   1028		cfg |= REG_FDCFG_TXINTTHRES_DISABLED;
   1029		cfg |= REG_FDCFG_RXINTTHRES_DISABLED;
   1030		mips_ejtag_fdc_write(priv, REG_FDCFG, cfg);
   1031		raw_spin_unlock_irq(&priv->lock);
   1032	} else {
   1033		priv->removing = true;
   1034		del_timer_sync(&priv->poll_timer);
   1035	}
   1036	kthread_stop(priv->thread);
   1037err_destroy_ports:
   1038	if (dev->cpu == 0)
   1039		mips_ejtag_fdc_con.tty_drv = NULL;
   1040	for (nport = 0; nport < NUM_TTY_CHANNELS; nport++) {
   1041		dport = &priv->ports[nport];
   1042		tty_port_destroy(&dport->port);
   1043	}
   1044	tty_driver_kref_put(priv->driver);
   1045	return ret;
   1046}
   1047
   1048static int mips_ejtag_fdc_tty_cpu_down(struct mips_cdmm_device *dev)
   1049{
   1050	struct mips_ejtag_fdc_tty *priv = mips_cdmm_get_drvdata(dev);
   1051	unsigned int cfg;
   1052
   1053	if (priv->irq >= 0) {
   1054		raw_spin_lock_irq(&priv->lock);
   1055		cfg = mips_ejtag_fdc_read(priv, REG_FDCFG);
   1056		/* Disable interrupts */
   1057		cfg &= ~(REG_FDCFG_TXINTTHRES | REG_FDCFG_RXINTTHRES);
   1058		cfg |= REG_FDCFG_TXINTTHRES_DISABLED;
   1059		cfg |= REG_FDCFG_RXINTTHRES_DISABLED;
   1060		mips_ejtag_fdc_write(priv, REG_FDCFG, cfg);
   1061		raw_spin_unlock_irq(&priv->lock);
   1062	} else {
   1063		priv->removing = true;
   1064		del_timer_sync(&priv->poll_timer);
   1065	}
   1066	kthread_stop(priv->thread);
   1067
   1068	return 0;
   1069}
   1070
   1071static int mips_ejtag_fdc_tty_cpu_up(struct mips_cdmm_device *dev)
   1072{
   1073	struct mips_ejtag_fdc_tty *priv = mips_cdmm_get_drvdata(dev);
   1074	unsigned int cfg;
   1075	int ret = 0;
   1076
   1077	if (priv->irq >= 0) {
   1078		/*
   1079		 * IRQ is usable, enable RX interrupt
   1080		 * This must be before kthread is restarted, as kthread may
   1081		 * enable TX interrupt.
   1082		 */
   1083		raw_spin_lock_irq(&priv->lock);
   1084		cfg = mips_ejtag_fdc_read(priv, REG_FDCFG);
   1085		cfg &= ~(REG_FDCFG_TXINTTHRES | REG_FDCFG_RXINTTHRES);
   1086		cfg |= REG_FDCFG_TXINTTHRES_DISABLED;
   1087		cfg |= REG_FDCFG_RXINTTHRES_NOTEMPTY;
   1088		mips_ejtag_fdc_write(priv, REG_FDCFG, cfg);
   1089		raw_spin_unlock_irq(&priv->lock);
   1090	} else {
   1091		/* Restart poll timer */
   1092		priv->removing = false;
   1093		add_timer_on(&priv->poll_timer, dev->cpu);
   1094	}
   1095
   1096	/* Restart the kthread */
   1097	/* Bind it back to the right CPU and set it off */
   1098	priv->thread = kthread_run_on_cpu(mips_ejtag_fdc_put, priv,
   1099					  dev->cpu, "ttyFDC/%u");
   1100	if (IS_ERR(priv->thread)) {
   1101		ret = PTR_ERR(priv->thread);
   1102		dev_err(priv->dev, "Couldn't re-create kthread (%d)\n", ret);
   1103		goto out;
   1104	}
   1105out:
   1106	return ret;
   1107}
   1108
   1109static const struct mips_cdmm_device_id mips_ejtag_fdc_tty_ids[] = {
   1110	{ .type = 0xfd },
   1111	{ }
   1112};
   1113
   1114static struct mips_cdmm_driver mips_ejtag_fdc_tty_driver = {
   1115	.drv		= {
   1116		.name	= "mips_ejtag_fdc",
   1117	},
   1118	.probe		= mips_ejtag_fdc_tty_probe,
   1119	.cpu_down	= mips_ejtag_fdc_tty_cpu_down,
   1120	.cpu_up		= mips_ejtag_fdc_tty_cpu_up,
   1121	.id_table	= mips_ejtag_fdc_tty_ids,
   1122};
   1123builtin_mips_cdmm_driver(mips_ejtag_fdc_tty_driver);
   1124
   1125static int __init mips_ejtag_fdc_init_console(void)
   1126{
   1127	return mips_ejtag_fdc_console_init(&mips_ejtag_fdc_con);
   1128}
   1129console_initcall(mips_ejtag_fdc_init_console);
   1130
   1131#ifdef CONFIG_MIPS_EJTAG_FDC_EARLYCON
   1132static struct mips_ejtag_fdc_console mips_ejtag_fdc_earlycon = {
   1133	.cons	= {
   1134		.name	= "early_fdc",
   1135		.write	= mips_ejtag_fdc_console_write,
   1136		.flags	= CON_PRINTBUFFER | CON_BOOT,
   1137		.index	= CONSOLE_CHANNEL,
   1138	},
   1139	.lock	= __RAW_SPIN_LOCK_UNLOCKED(mips_ejtag_fdc_earlycon.lock),
   1140};
   1141
   1142int __init setup_early_fdc_console(void)
   1143{
   1144	return mips_ejtag_fdc_console_init(&mips_ejtag_fdc_earlycon);
   1145}
   1146#endif
   1147
   1148#ifdef CONFIG_MIPS_EJTAG_FDC_KGDB
   1149
   1150/* read buffer to allow decompaction */
   1151static unsigned int kgdbfdc_rbuflen;
   1152static unsigned int kgdbfdc_rpos;
   1153static char kgdbfdc_rbuf[4];
   1154
   1155/* write buffer to allow compaction */
   1156static unsigned int kgdbfdc_wbuflen;
   1157static char kgdbfdc_wbuf[4];
   1158
   1159static void __iomem *kgdbfdc_setup(void)
   1160{
   1161	void __iomem *regs;
   1162	unsigned int cpu;
   1163
   1164	/* Find address, piggy backing off console percpu regs */
   1165	cpu = smp_processor_id();
   1166	regs = mips_ejtag_fdc_con.regs[cpu];
   1167	/* First console output on this CPU? */
   1168	if (!regs) {
   1169		regs = mips_cdmm_early_probe(0xfd);
   1170		mips_ejtag_fdc_con.regs[cpu] = regs;
   1171	}
   1172	/* Already tried and failed to find FDC on this CPU? */
   1173	if (IS_ERR(regs))
   1174		return regs;
   1175
   1176	return regs;
   1177}
   1178
   1179/* read a character from the read buffer, filling from FDC RX FIFO */
   1180static int kgdbfdc_read_char(void)
   1181{
   1182	unsigned int stat, channel, data;
   1183	void __iomem *regs;
   1184
   1185	/* No more data, try and read another FDC word from RX FIFO */
   1186	if (kgdbfdc_rpos >= kgdbfdc_rbuflen) {
   1187		kgdbfdc_rpos = 0;
   1188		kgdbfdc_rbuflen = 0;
   1189
   1190		regs = kgdbfdc_setup();
   1191		if (IS_ERR(regs))
   1192			return NO_POLL_CHAR;
   1193
   1194		/* Read next word from KGDB channel */
   1195		do {
   1196			stat = __raw_readl(regs + REG_FDSTAT);
   1197
   1198			/* No data waiting? */
   1199			if (stat & REG_FDSTAT_RXE)
   1200				return NO_POLL_CHAR;
   1201
   1202			/* Read next word */
   1203			channel = (stat & REG_FDSTAT_RXCHAN) >>
   1204					REG_FDSTAT_RXCHAN_SHIFT;
   1205			data = __raw_readl(regs + REG_FDRX);
   1206		} while (channel != CONFIG_MIPS_EJTAG_FDC_KGDB_CHAN);
   1207
   1208		/* Decode into rbuf */
   1209		kgdbfdc_rbuflen = mips_ejtag_fdc_decode(data, kgdbfdc_rbuf);
   1210	}
   1211	pr_devel("kgdbfdc r %c\n", kgdbfdc_rbuf[kgdbfdc_rpos]);
   1212	return kgdbfdc_rbuf[kgdbfdc_rpos++];
   1213}
   1214
   1215/* push an FDC word from write buffer to TX FIFO */
   1216static void kgdbfdc_push_one(void)
   1217{
   1218	const char *bufs[1] = { kgdbfdc_wbuf };
   1219	struct fdc_word word;
   1220	void __iomem *regs;
   1221	unsigned int i;
   1222
   1223	/* Construct a word from any data in buffer */
   1224	word = mips_ejtag_fdc_encode(bufs, &kgdbfdc_wbuflen, 1);
   1225	/* Relocate any remaining data to beginnning of buffer */
   1226	kgdbfdc_wbuflen -= word.bytes;
   1227	for (i = 0; i < kgdbfdc_wbuflen; ++i)
   1228		kgdbfdc_wbuf[i] = kgdbfdc_wbuf[i + word.bytes];
   1229
   1230	regs = kgdbfdc_setup();
   1231	if (IS_ERR(regs))
   1232		return;
   1233
   1234	/* Busy wait until there's space in fifo */
   1235	while (__raw_readl(regs + REG_FDSTAT) & REG_FDSTAT_TXF)
   1236		;
   1237	__raw_writel(word.word,
   1238		     regs + REG_FDTX(CONFIG_MIPS_EJTAG_FDC_KGDB_CHAN));
   1239}
   1240
   1241/* flush the whole write buffer to the TX FIFO */
   1242static void kgdbfdc_flush(void)
   1243{
   1244	while (kgdbfdc_wbuflen)
   1245		kgdbfdc_push_one();
   1246}
   1247
   1248/* write a character into the write buffer, writing out if full */
   1249static void kgdbfdc_write_char(u8 chr)
   1250{
   1251	pr_devel("kgdbfdc w %c\n", chr);
   1252	kgdbfdc_wbuf[kgdbfdc_wbuflen++] = chr;
   1253	if (kgdbfdc_wbuflen >= sizeof(kgdbfdc_wbuf))
   1254		kgdbfdc_push_one();
   1255}
   1256
   1257static struct kgdb_io kgdbfdc_io_ops = {
   1258	.name		= "kgdbfdc",
   1259	.read_char	= kgdbfdc_read_char,
   1260	.write_char	= kgdbfdc_write_char,
   1261	.flush		= kgdbfdc_flush,
   1262};
   1263
   1264static int __init kgdbfdc_init(void)
   1265{
   1266	kgdb_register_io_module(&kgdbfdc_io_ops);
   1267	return 0;
   1268}
   1269early_initcall(kgdbfdc_init);
   1270#endif