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

serial_8250.h (6627B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 *  linux/include/linux/serial_8250.h
      4 *
      5 *  Copyright (C) 2004 Russell King
      6 */
      7#ifndef _LINUX_SERIAL_8250_H
      8#define _LINUX_SERIAL_8250_H
      9
     10#include <linux/serial_core.h>
     11#include <linux/serial_reg.h>
     12#include <linux/platform_device.h>
     13
     14/*
     15 * This is the platform device platform_data structure
     16 */
     17struct plat_serial8250_port {
     18	unsigned long	iobase;		/* io base address */
     19	void __iomem	*membase;	/* ioremap cookie or NULL */
     20	resource_size_t	mapbase;	/* resource base */
     21	unsigned int	irq;		/* interrupt number */
     22	unsigned long	irqflags;	/* request_irq flags */
     23	unsigned int	uartclk;	/* UART clock rate */
     24	void            *private_data;
     25	unsigned char	regshift;	/* register shift */
     26	unsigned char	iotype;		/* UPIO_* */
     27	unsigned char	hub6;
     28	unsigned char	has_sysrq;	/* supports magic SysRq */
     29	upf_t		flags;		/* UPF_* flags */
     30	unsigned int	type;		/* If UPF_FIXED_TYPE */
     31	unsigned int	(*serial_in)(struct uart_port *, int);
     32	void		(*serial_out)(struct uart_port *, int, int);
     33	void		(*set_termios)(struct uart_port *,
     34			               struct ktermios *new,
     35			               struct ktermios *old);
     36	void		(*set_ldisc)(struct uart_port *,
     37				     struct ktermios *);
     38	unsigned int	(*get_mctrl)(struct uart_port *);
     39	int		(*handle_irq)(struct uart_port *);
     40	void		(*pm)(struct uart_port *, unsigned int state,
     41			      unsigned old);
     42	void		(*handle_break)(struct uart_port *);
     43};
     44
     45/*
     46 * Allocate 8250 platform device IDs.  Nothing is implied by
     47 * the numbering here, except for the legacy entry being -1.
     48 */
     49enum {
     50	PLAT8250_DEV_LEGACY = -1,
     51	PLAT8250_DEV_PLATFORM,
     52	PLAT8250_DEV_PLATFORM1,
     53	PLAT8250_DEV_PLATFORM2,
     54	PLAT8250_DEV_FOURPORT,
     55	PLAT8250_DEV_ACCENT,
     56	PLAT8250_DEV_BOCA,
     57	PLAT8250_DEV_EXAR_ST16C554,
     58	PLAT8250_DEV_HUB6,
     59	PLAT8250_DEV_AU1X00,
     60	PLAT8250_DEV_SM501,
     61};
     62
     63struct uart_8250_dma;
     64struct uart_8250_port;
     65
     66/**
     67 * 8250 core driver operations
     68 *
     69 * @setup_irq()		Setup irq handling. The universal 8250 driver links this
     70 *			port to the irq chain. Other drivers may @request_irq().
     71 * @release_irq()	Undo irq handling. The universal 8250 driver unlinks
     72 *			the port from the irq chain.
     73 */
     74struct uart_8250_ops {
     75	int		(*setup_irq)(struct uart_8250_port *);
     76	void		(*release_irq)(struct uart_8250_port *);
     77};
     78
     79struct uart_8250_em485 {
     80	struct hrtimer		start_tx_timer; /* "rs485 start tx" timer */
     81	struct hrtimer		stop_tx_timer;  /* "rs485 stop tx" timer */
     82	struct hrtimer		*active_timer;  /* pointer to active timer */
     83	struct uart_8250_port	*port;          /* for hrtimer callbacks */
     84	unsigned int		tx_stopped:1;	/* tx is currently stopped */
     85};
     86
     87/*
     88 * This should be used by drivers which want to register
     89 * their own 8250 ports without registering their own
     90 * platform device.  Using these will make your driver
     91 * dependent on the 8250 driver.
     92 */
     93
     94struct uart_8250_port {
     95	struct uart_port	port;
     96	struct timer_list	timer;		/* "no irq" timer */
     97	struct list_head	list;		/* ports on this IRQ */
     98	u32			capabilities;	/* port capabilities */
     99	unsigned short		bugs;		/* port bugs */
    100	bool			fifo_bug;	/* min RX trigger if enabled */
    101	unsigned int		tx_loadsz;	/* transmit fifo load size */
    102	unsigned char		acr;
    103	unsigned char		fcr;
    104	unsigned char		ier;
    105	unsigned char		lcr;
    106	unsigned char		mcr;
    107	unsigned char		cur_iotype;	/* Running I/O type */
    108	unsigned int		rpm_tx_active;
    109	unsigned char		canary;		/* non-zero during system sleep
    110						 *   if no_console_suspend
    111						 */
    112	unsigned char		probe;
    113	struct mctrl_gpios	*gpios;
    114#define UART_PROBE_RSA	(1 << 0)
    115
    116	/*
    117	 * Some bits in registers are cleared on a read, so they must
    118	 * be saved whenever the register is read but the bits will not
    119	 * be immediately processed.
    120	 */
    121#define LSR_SAVE_FLAGS UART_LSR_BRK_ERROR_BITS
    122	unsigned char		lsr_saved_flags;
    123#define MSR_SAVE_FLAGS UART_MSR_ANY_DELTA
    124	unsigned char		msr_saved_flags;
    125
    126	struct uart_8250_dma	*dma;
    127	const struct uart_8250_ops *ops;
    128
    129	/* 8250 specific callbacks */
    130	int			(*dl_read)(struct uart_8250_port *);
    131	void			(*dl_write)(struct uart_8250_port *, int);
    132
    133	struct uart_8250_em485 *em485;
    134	void			(*rs485_start_tx)(struct uart_8250_port *);
    135	void			(*rs485_stop_tx)(struct uart_8250_port *);
    136
    137	/* Serial port overrun backoff */
    138	struct delayed_work overrun_backoff;
    139	u32 overrun_backoff_time_ms;
    140};
    141
    142static inline struct uart_8250_port *up_to_u8250p(struct uart_port *up)
    143{
    144	return container_of(up, struct uart_8250_port, port);
    145}
    146
    147int serial8250_register_8250_port(const struct uart_8250_port *);
    148void serial8250_unregister_port(int line);
    149void serial8250_suspend_port(int line);
    150void serial8250_resume_port(int line);
    151
    152extern int early_serial_setup(struct uart_port *port);
    153
    154extern int early_serial8250_setup(struct earlycon_device *device,
    155					 const char *options);
    156extern void serial8250_update_uartclk(struct uart_port *port,
    157				      unsigned int uartclk);
    158extern void serial8250_do_set_termios(struct uart_port *port,
    159		struct ktermios *termios, struct ktermios *old);
    160extern void serial8250_do_set_ldisc(struct uart_port *port,
    161				    struct ktermios *termios);
    162extern unsigned int serial8250_do_get_mctrl(struct uart_port *port);
    163extern int serial8250_do_startup(struct uart_port *port);
    164extern void serial8250_do_shutdown(struct uart_port *port);
    165extern void serial8250_do_pm(struct uart_port *port, unsigned int state,
    166			     unsigned int oldstate);
    167extern void serial8250_do_set_mctrl(struct uart_port *port, unsigned int mctrl);
    168extern void serial8250_do_set_divisor(struct uart_port *port, unsigned int baud,
    169				      unsigned int quot,
    170				      unsigned int quot_frac);
    171extern int fsl8250_handle_irq(struct uart_port *port);
    172int serial8250_handle_irq(struct uart_port *port, unsigned int iir);
    173unsigned char serial8250_rx_chars(struct uart_8250_port *up, unsigned char lsr);
    174void serial8250_read_char(struct uart_8250_port *up, unsigned char lsr);
    175void serial8250_tx_chars(struct uart_8250_port *up);
    176unsigned int serial8250_modem_status(struct uart_8250_port *up);
    177void serial8250_init_port(struct uart_8250_port *up);
    178void serial8250_set_defaults(struct uart_8250_port *up);
    179void serial8250_console_write(struct uart_8250_port *up, const char *s,
    180			      unsigned int count);
    181int serial8250_console_setup(struct uart_port *port, char *options, bool probe);
    182int serial8250_console_exit(struct uart_port *port);
    183
    184extern void serial8250_set_isa_configurator(void (*v)
    185					(int port, struct uart_port *up,
    186						u32 *capabilities));
    187
    188#ifdef CONFIG_SERIAL_8250_RT288X
    189unsigned int au_serial_in(struct uart_port *p, int offset);
    190void au_serial_out(struct uart_port *p, int offset, int value);
    191#endif
    192
    193#endif