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

8250.h (9258B)


      1/* SPDX-License-Identifier: GPL-2.0+ */
      2/*
      3 *  Driver for 8250/16550-type serial ports
      4 *
      5 *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
      6 *
      7 *  Copyright (C) 2001 Russell King.
      8 */
      9
     10#include <linux/bits.h>
     11#include <linux/serial_8250.h>
     12#include <linux/serial_reg.h>
     13#include <linux/dmaengine.h>
     14
     15#include "../serial_mctrl_gpio.h"
     16
     17struct uart_8250_dma {
     18	int (*tx_dma)(struct uart_8250_port *p);
     19	int (*rx_dma)(struct uart_8250_port *p);
     20	void (*prepare_tx_dma)(struct uart_8250_port *p);
     21	void (*prepare_rx_dma)(struct uart_8250_port *p);
     22
     23	/* Filter function */
     24	dma_filter_fn		fn;
     25	/* Parameter to the filter function */
     26	void			*rx_param;
     27	void			*tx_param;
     28
     29	struct dma_slave_config	rxconf;
     30	struct dma_slave_config	txconf;
     31
     32	struct dma_chan		*rxchan;
     33	struct dma_chan		*txchan;
     34
     35	/* Device address base for DMA operations */
     36	phys_addr_t		rx_dma_addr;
     37	phys_addr_t		tx_dma_addr;
     38
     39	/* DMA address of the buffer in memory */
     40	dma_addr_t		rx_addr;
     41	dma_addr_t		tx_addr;
     42
     43	dma_cookie_t		rx_cookie;
     44	dma_cookie_t		tx_cookie;
     45
     46	void			*rx_buf;
     47
     48	size_t			rx_size;
     49	size_t			tx_size;
     50
     51	unsigned char		tx_running;
     52	unsigned char		tx_err;
     53	unsigned char		rx_running;
     54};
     55
     56struct old_serial_port {
     57	unsigned int uart;
     58	unsigned int baud_base;
     59	unsigned int port;
     60	unsigned int irq;
     61	upf_t        flags;
     62	unsigned char io_type;
     63	unsigned char __iomem *iomem_base;
     64	unsigned short iomem_reg_shift;
     65};
     66
     67struct serial8250_config {
     68	const char	*name;
     69	unsigned short	fifo_size;
     70	unsigned short	tx_loadsz;
     71	unsigned char	fcr;
     72	unsigned char	rxtrig_bytes[UART_FCR_R_TRIG_MAX_STATE];
     73	unsigned int	flags;
     74};
     75
     76#define UART_CAP_FIFO	BIT(8)	/* UART has FIFO */
     77#define UART_CAP_EFR	BIT(9)	/* UART has EFR */
     78#define UART_CAP_SLEEP	BIT(10)	/* UART has IER sleep */
     79#define UART_CAP_AFE	BIT(11)	/* MCR-based hw flow control */
     80#define UART_CAP_UUE	BIT(12)	/* UART needs IER bit 6 set (Xscale) */
     81#define UART_CAP_RTOIE	BIT(13)	/* UART needs IER bit 4 set (Xscale, Tegra) */
     82#define UART_CAP_HFIFO	BIT(14)	/* UART has a "hidden" FIFO */
     83#define UART_CAP_RPM	BIT(15)	/* Runtime PM is active while idle */
     84#define UART_CAP_IRDA	BIT(16)	/* UART supports IrDA line discipline */
     85#define UART_CAP_MINI	BIT(17)	/* Mini UART on BCM283X family lacks:
     86					 * STOP PARITY EPAR SPAR WLEN5 WLEN6
     87					 */
     88#define UART_CAP_NOTEMT	BIT(18)	/* UART without interrupt on TEMT available */
     89
     90#define UART_BUG_QUOT	BIT(0)	/* UART has buggy quot LSB */
     91#define UART_BUG_TXEN	BIT(1)	/* UART has buggy TX IIR status */
     92#define UART_BUG_NOMSR	BIT(2)	/* UART has buggy MSR status bits (Au1x00) */
     93#define UART_BUG_THRE	BIT(3)	/* UART has buggy THRE reassertion */
     94#define UART_BUG_PARITY	BIT(4)	/* UART mishandles parity if FIFO enabled */
     95#define UART_BUG_TXRACE	BIT(5)	/* UART Tx fails to set remote DR */
     96
     97
     98#ifdef CONFIG_SERIAL_8250_SHARE_IRQ
     99#define SERIAL8250_SHARE_IRQS 1
    100#else
    101#define SERIAL8250_SHARE_IRQS 0
    102#endif
    103
    104#define SERIAL8250_PORT_FLAGS(_base, _irq, _flags)		\
    105	{							\
    106		.iobase		= _base,			\
    107		.irq		= _irq,				\
    108		.uartclk	= 1843200,			\
    109		.iotype		= UPIO_PORT,			\
    110		.flags		= UPF_BOOT_AUTOCONF | (_flags),	\
    111	}
    112
    113#define SERIAL8250_PORT(_base, _irq) SERIAL8250_PORT_FLAGS(_base, _irq, 0)
    114
    115
    116static inline int serial_in(struct uart_8250_port *up, int offset)
    117{
    118	return up->port.serial_in(&up->port, offset);
    119}
    120
    121static inline void serial_out(struct uart_8250_port *up, int offset, int value)
    122{
    123	up->port.serial_out(&up->port, offset, value);
    124}
    125
    126/*
    127 * For the 16C950
    128 */
    129static void serial_icr_write(struct uart_8250_port *up, int offset, int value)
    130{
    131	serial_out(up, UART_SCR, offset);
    132	serial_out(up, UART_ICR, value);
    133}
    134
    135static unsigned int __maybe_unused serial_icr_read(struct uart_8250_port *up,
    136						   int offset)
    137{
    138	unsigned int value;
    139
    140	serial_icr_write(up, UART_ACR, up->acr | UART_ACR_ICRRD);
    141	serial_out(up, UART_SCR, offset);
    142	value = serial_in(up, UART_ICR);
    143	serial_icr_write(up, UART_ACR, up->acr);
    144
    145	return value;
    146}
    147
    148void serial8250_clear_and_reinit_fifos(struct uart_8250_port *p);
    149
    150static inline int serial_dl_read(struct uart_8250_port *up)
    151{
    152	return up->dl_read(up);
    153}
    154
    155static inline void serial_dl_write(struct uart_8250_port *up, int value)
    156{
    157	up->dl_write(up, value);
    158}
    159
    160static inline bool serial8250_set_THRI(struct uart_8250_port *up)
    161{
    162	if (up->ier & UART_IER_THRI)
    163		return false;
    164	up->ier |= UART_IER_THRI;
    165	serial_out(up, UART_IER, up->ier);
    166	return true;
    167}
    168
    169static inline bool serial8250_clear_THRI(struct uart_8250_port *up)
    170{
    171	if (!(up->ier & UART_IER_THRI))
    172		return false;
    173	up->ier &= ~UART_IER_THRI;
    174	serial_out(up, UART_IER, up->ier);
    175	return true;
    176}
    177
    178struct uart_8250_port *serial8250_get_port(int line);
    179
    180void serial8250_rpm_get(struct uart_8250_port *p);
    181void serial8250_rpm_put(struct uart_8250_port *p);
    182
    183void serial8250_rpm_get_tx(struct uart_8250_port *p);
    184void serial8250_rpm_put_tx(struct uart_8250_port *p);
    185
    186int serial8250_em485_config(struct uart_port *port, struct serial_rs485 *rs485);
    187void serial8250_em485_start_tx(struct uart_8250_port *p);
    188void serial8250_em485_stop_tx(struct uart_8250_port *p);
    189void serial8250_em485_destroy(struct uart_8250_port *p);
    190
    191/* MCR <-> TIOCM conversion */
    192static inline int serial8250_TIOCM_to_MCR(int tiocm)
    193{
    194	int mcr = 0;
    195
    196	if (tiocm & TIOCM_RTS)
    197		mcr |= UART_MCR_RTS;
    198	if (tiocm & TIOCM_DTR)
    199		mcr |= UART_MCR_DTR;
    200	if (tiocm & TIOCM_OUT1)
    201		mcr |= UART_MCR_OUT1;
    202	if (tiocm & TIOCM_OUT2)
    203		mcr |= UART_MCR_OUT2;
    204	if (tiocm & TIOCM_LOOP)
    205		mcr |= UART_MCR_LOOP;
    206
    207	return mcr;
    208}
    209
    210static inline int serial8250_MCR_to_TIOCM(int mcr)
    211{
    212	int tiocm = 0;
    213
    214	if (mcr & UART_MCR_RTS)
    215		tiocm |= TIOCM_RTS;
    216	if (mcr & UART_MCR_DTR)
    217		tiocm |= TIOCM_DTR;
    218	if (mcr & UART_MCR_OUT1)
    219		tiocm |= TIOCM_OUT1;
    220	if (mcr & UART_MCR_OUT2)
    221		tiocm |= TIOCM_OUT2;
    222	if (mcr & UART_MCR_LOOP)
    223		tiocm |= TIOCM_LOOP;
    224
    225	return tiocm;
    226}
    227
    228/* MSR <-> TIOCM conversion */
    229static inline int serial8250_MSR_to_TIOCM(int msr)
    230{
    231	int tiocm = 0;
    232
    233	if (msr & UART_MSR_DCD)
    234		tiocm |= TIOCM_CAR;
    235	if (msr & UART_MSR_RI)
    236		tiocm |= TIOCM_RNG;
    237	if (msr & UART_MSR_DSR)
    238		tiocm |= TIOCM_DSR;
    239	if (msr & UART_MSR_CTS)
    240		tiocm |= TIOCM_CTS;
    241
    242	return tiocm;
    243}
    244
    245static inline void serial8250_out_MCR(struct uart_8250_port *up, int value)
    246{
    247	serial_out(up, UART_MCR, value);
    248
    249	if (up->gpios)
    250		mctrl_gpio_set(up->gpios, serial8250_MCR_to_TIOCM(value));
    251}
    252
    253static inline int serial8250_in_MCR(struct uart_8250_port *up)
    254{
    255	int mctrl;
    256
    257	mctrl = serial_in(up, UART_MCR);
    258
    259	if (up->gpios) {
    260		unsigned int mctrl_gpio = 0;
    261
    262		mctrl_gpio = mctrl_gpio_get_outputs(up->gpios, &mctrl_gpio);
    263		mctrl |= serial8250_TIOCM_to_MCR(mctrl_gpio);
    264	}
    265
    266	return mctrl;
    267}
    268
    269bool alpha_jensen(void);
    270void alpha_jensen_set_mctrl(struct uart_port *port, unsigned int mctrl);
    271
    272#ifdef CONFIG_SERIAL_8250_PNP
    273int serial8250_pnp_init(void);
    274void serial8250_pnp_exit(void);
    275#else
    276static inline int serial8250_pnp_init(void) { return 0; }
    277static inline void serial8250_pnp_exit(void) { }
    278#endif
    279
    280#ifdef CONFIG_SERIAL_8250_FINTEK
    281int fintek_8250_probe(struct uart_8250_port *uart);
    282#else
    283static inline int fintek_8250_probe(struct uart_8250_port *uart) { return 0; }
    284#endif
    285
    286#ifdef CONFIG_ARCH_OMAP1
    287#include <linux/soc/ti/omap1-soc.h>
    288static inline int is_omap1_8250(struct uart_8250_port *pt)
    289{
    290	int res;
    291
    292	switch (pt->port.mapbase) {
    293	case OMAP1_UART1_BASE:
    294	case OMAP1_UART2_BASE:
    295	case OMAP1_UART3_BASE:
    296		res = 1;
    297		break;
    298	default:
    299		res = 0;
    300		break;
    301	}
    302
    303	return res;
    304}
    305
    306static inline int is_omap1510_8250(struct uart_8250_port *pt)
    307{
    308	if (!cpu_is_omap1510())
    309		return 0;
    310
    311	return is_omap1_8250(pt);
    312}
    313#else
    314static inline int is_omap1_8250(struct uart_8250_port *pt)
    315{
    316	return 0;
    317}
    318static inline int is_omap1510_8250(struct uart_8250_port *pt)
    319{
    320	return 0;
    321}
    322#endif
    323
    324#ifdef CONFIG_SERIAL_8250_DMA
    325extern int serial8250_tx_dma(struct uart_8250_port *);
    326extern int serial8250_rx_dma(struct uart_8250_port *);
    327extern void serial8250_rx_dma_flush(struct uart_8250_port *);
    328extern int serial8250_request_dma(struct uart_8250_port *);
    329extern void serial8250_release_dma(struct uart_8250_port *);
    330
    331static inline void serial8250_do_prepare_tx_dma(struct uart_8250_port *p)
    332{
    333	struct uart_8250_dma *dma = p->dma;
    334
    335	if (dma->prepare_tx_dma)
    336		dma->prepare_tx_dma(p);
    337}
    338
    339static inline void serial8250_do_prepare_rx_dma(struct uart_8250_port *p)
    340{
    341	struct uart_8250_dma *dma = p->dma;
    342
    343	if (dma->prepare_rx_dma)
    344		dma->prepare_rx_dma(p);
    345}
    346#else
    347static inline int serial8250_tx_dma(struct uart_8250_port *p)
    348{
    349	return -1;
    350}
    351static inline int serial8250_rx_dma(struct uart_8250_port *p)
    352{
    353	return -1;
    354}
    355static inline void serial8250_rx_dma_flush(struct uart_8250_port *p) { }
    356static inline int serial8250_request_dma(struct uart_8250_port *p)
    357{
    358	return -1;
    359}
    360static inline void serial8250_release_dma(struct uart_8250_port *p) { }
    361#endif
    362
    363static inline int ns16550a_goto_highspeed(struct uart_8250_port *up)
    364{
    365	unsigned char status;
    366
    367	status = serial_in(up, 0x04); /* EXCR2 */
    368#define PRESL(x) ((x) & 0x30)
    369	if (PRESL(status) == 0x10) {
    370		/* already in high speed mode */
    371		return 0;
    372	} else {
    373		status &= ~0xB0; /* Disable LOCK, mask out PRESL[01] */
    374		status |= 0x10;  /* 1.625 divisor for baud_base --> 921600 */
    375		serial_out(up, 0x04, status);
    376	}
    377	return 1;
    378}
    379
    380static inline int serial_index(struct uart_port *port)
    381{
    382	return port->minor - 64;
    383}