mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-17 09:41:09 +02:00
Pull drm updates from Dave Airlie:
"Highlights:
- amdgpu support for lots of new IP blocks which means newer GPUs
- xe has a lot of SR-IOV and SVM improvements
- lots of intel display refactoring across i915/xe
- msm has more support for gen8 platforms
- Given up on kgdb/kms integration, it's too hard on modern hw
core:
- drop kgdb support
- replace system workqueue with percpu
- account for property blobs in memcg
- MAINTAINERS updates for xe + buddy
rust:
- Fix documentation for Registration constructors
- Use pin_init::zeroed() for fops initialization
- Annotate DRM helpers with __rust_helper
- Improve safety documentation for gem::Object::new()
- Update AlwaysRefCounted imports
- mm: Prevent integer overflow in page_align()
atomic:
- add drm_device pointer to drm_private_obj
- introduce gamma/degamma LUT size check
buddy:
- fix free_trees memory leak
- prevent BUG_ON
bridge:
- introduce drm_bridge_unplug/enter/exit
- add connector argument to .hpd_notify
- lots of recounting conversions
- convert rockchip inno hdmi to bridge
- lontium-lt9611uxc: switch to HDMI audio helpers
- dw-hdmi-qp: add support for HPD-less setups
- Algoltek AG6311 support
panels:
- edp: CSW MNE007QB3-1, AUO B140HAN06.4, AUO B140QAX01.H
- st75751: add SPI support
- Sitronix ST7920, Samsung LTL106HL02
- LG LH546WF1-ED01, HannStar HSD156J
- BOE NV130WUM-T08
- Innolux G150XGE-L05
- Anbernic RG-DS
dma-buf:
- improve sg_table debugging
- add tracepoints
- call clear_page instead of memset
- start to introduce cgroup memory accounting in heaps
- remove sysfs stats
dma-fence:
- add new helpers
dp:
- mst: avoid oob access with vcpi=0
hdmi:
- limit infoframes exposure to userspace
gem:
- reduce page table overhead with THP
- fix leak in drm_gem_get_unmapped_area
gpuvm:
- API sanitation for rust bindings
sched:
- introduce new helpers
panic:
- report invalid panic modes
- add kunit tests
i915/xe display:
- Expose sharpness only if num_scalers is >= 2
- Add initial Xe3P_LPD for NVL
- BMG FBC support
- Add MTL+ platforms to support dpll framework
_ fix DIMM_S DRM decoding on ICL
- Return to using AUX interrupts
- PSR/Panel replay refactoring
- use consolidation HDMI tables
- Xe3_LPD CD2X dividier changes
xe:
- vfio: add vfio_pci for intel GPU
- multi queue support
- dynamic pagemaps and multi-device SVM
- expose temp attribs in hwmon
- NO_COMPRESSION bo flag
- expose MERT OA unit
- sysfs survivability refactor
- SRIOV PF: add MERT support
- enable SR-IOV VF migration
- Enable I2C/NVM on Crescent Island
- Xe3p page reclaimation support
- introduce SRIOV scheduler groups
- add SoC remappt support in system controller
- insert compiler barriers in GuC code
- define NVL GuC firmware
- handle GT resume failure
- fix drm scheduler layering violations
- enable GSC loading and PXP for PTL
- disable GuC Power DCC strategy on PTL
- unregister drm device on probe error
i915:
- move to kernel standard fault injection
- bump recommended GuC version for DG2 and MTL
amdgpu:
- SMUIO 15.x, PSP 15.x support
- IH 6.1.1/7.1 support
- MMHUB 3.4/4.2 support
- GC 11.5.4/12.1 support
- SDMA 6.1.4/7.1/7.11.4 support
- JPEG 5.3 support
- UserQ updates
- GC 9 gfx queue reset support
- TTM memory ops parallelization
- convert legacy logging to new helpers
- DC analog fixes
amdkfd:
- GC 11.5.4/12.1 suppport
- SDMA 6.1.4/7.1 support
- per context support
- increase kfd process hash table
- Reserved SDMA rework
radeon:
- convert legacy logging to new helpers
- use devm for i2c adapters
msm:
- GPU
- Document a612/RGMU dt bindings
- UBWC 6.0 support (for A840 / Kaanapali)
- a225 support
- DPU:
- Switch to use virtual planes by default
- Fix DSI CMD panels on DPU 3.x
- Rewrite format handling to remove intermediate representation
- Fix watchdog on DPU 8.x+
- Fix TE / Vsync source setting on DPU 8.x+
- Add 3D_Mux on SC7280
- Kaanapali platform support
- Fix UBWC register programming
- Make RM reserve DSPP-enabled mixers for CRTCs with LMs
- Gamma correction support
- DP:
- Enable support for eDP 1.4+ link rate tables
- Fix MDSS1 DP indices on SA8775P, making them to work
- Fix msm_dp_ctrl_config_msa() to work with LLVM 20
- DSI:
- Document QCS8300 as compatible with SA8775P
- Kaanapali platform support
- DSI PHY:
- switch to divider_determine_rate()
- MDP5:
- Drop support for MSM8998, SDM660 and SDM630 (switch over to DPU)
- MDSS:
- Kaanapali platform support
- Fixed UBWC register programming
nova-core:
- Prepare for Turing support. This includes parsing and handling
Turing-specific firmware headers and sections as well as a Turing
Falcon HAL implementation
- Get rid of the Result<impl PinInit<T, E>> anti-pattern
- Relocate initializer-specific code into the appropriate initializer
- Use CStr::from_bytes_until_nul() to remove custom helpers
- Improve handling of unexpected firmware values
- Clean up redundant debug prints
- Replace c_str!() with native Rust C-string literals
- Update nova-core task list
nova:
- Align GEM object size to system page size
tyr:
- Use generated uAPI bindings for GpuInfo
- Replace manual sleeps with read_poll_timeout()
- Replace c_str!() with native Rust C-string literals
- Suppress warnings for unread fields
- Fix incorrect register name in print statement
nouveau:
- fix big page table support races in PTE management
- improve reclocking on tegra 186+
amdxdna:
- fix suspend race conditions
- improve handling of zero tail pointers
- fix cu_idx overwritten during command setup
- enable hardware context priority
- remove NPU2 support
- update message buffer allocation requirements
- update firmware version check
ast:
- support imported cursor buffers
- big endian fixes
etnaviv:
- add PPU flop reset support
imagination:
- add AM62P support
- introduce hw version checks
ivpu:
- implement warm boot flow
panfrost:
- add bo sync ioctl
- add GPU_PM_RT support for RZ/G3E SoC
panthor:
- add bo sync ioctl
- enable timestamp propagation
- scheduler robustness improvements
- VM termination fixes
- huge page support
rockchip:
- RK3368 HDMI Support
- get rid of atomic_check fixups
- RK3506 support
- RK3576/RK3588 improved HPD handling
rz-du:
- RZ/V2H(P) MIPI-DSI Support
v3d:
- fix DMA segment size
- convert to new logging helpers
mediatek:
- move DP training to hotplug thread
- convert logging to new helpers
- add support for HS speed DSI
- Genio 510/700/1200-EVK, Radxa NIO-12L HDMI support
atmel-hlcdc:
- switch to drmm resource
- support nomodeset
- use newer helpers
hisilicon:
- fix various DP bugs
renesas:
- fix kernel panic on reboot
exynos:
- fix vidi_connection_ioctl using wrong device
- fix vidi_connection deref user ptr
- fix concurrency regression with vidi_context
vkms:
- add configfs support for display configuration
* tag 'drm-next-2026-02-11' of https://gitlab.freedesktop.org/drm/kernel: (1610 commits)
drm/xe/pm: Disable D3Cold for BMG only on specific platforms
drm/xe: Fix kerneldoc for xe_tlb_inval_job_alloc_dep
drm/xe: Fix kerneldoc for xe_gt_tlb_inval_init_early
drm/xe: Fix kerneldoc for xe_migrate_exec_queue
drm/xe/query: Fix topology query pointer advance
drm/xe/guc: Fix kernel-doc warning in GuC scheduler ABI header
drm/xe/guc: Fix CFI violation in debugfs access.
accel/amdxdna: Move RPM resume into job run function
accel/amdxdna: Fix incorrect DPM level after suspend/resume
nouveau/vmm: start tracking if the LPT PTE is valid. (v6)
nouveau/vmm: increase size of vmm pte tracker struct to u32 (v2)
nouveau/vmm: rewrite pte tracker using a struct and bitfields.
accel/amdxdna: Fix incorrect error code returned for failed chain command
accel/amdxdna: Remove hardware context status
drm/bridge: imx8qxp-pixel-combiner: Fix bailout for imx8qxp_pc_bridge_probe()
drm/panel: ilitek-ili9882t: Remove duplicate initializers in tianma_il79900a_dsc
drm/i915/display: fix the pixel normalization handling for xe3p_lpd
drm/exynos: vidi: use ctx->lock to protect struct vidi_context member variables related to memory alloc/free
drm/exynos: vidi: fix to avoid directly dereferencing user pointer
drm/exynos: vidi: use priv->vidi_dev for ctx lookup in vidi_connection_ioctl()
...
738 lines
26 KiB
C
738 lines
26 KiB
C
/*
|
|
* linux/include/linux/console.h
|
|
*
|
|
* Copyright (C) 1993 Hamish Macdonald
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Changed:
|
|
* 10-Mar-94: Arno Griffioen: Conversion for vt100 emulator port from PC LINUX
|
|
*/
|
|
|
|
#ifndef _LINUX_CONSOLE_H_
|
|
#define _LINUX_CONSOLE_H_ 1
|
|
|
|
#include <linux/atomic.h>
|
|
#include <linux/bits.h>
|
|
#include <linux/irq_work.h>
|
|
#include <linux/rculist.h>
|
|
#include <linux/rcuwait.h>
|
|
#include <linux/smp.h>
|
|
#include <linux/types.h>
|
|
#include <linux/vesa.h>
|
|
|
|
struct vc_data;
|
|
struct console_font_op;
|
|
struct console_font;
|
|
struct module;
|
|
struct tty_struct;
|
|
struct notifier_block;
|
|
|
|
enum con_scroll {
|
|
SM_UP,
|
|
SM_DOWN,
|
|
};
|
|
|
|
enum vc_intensity;
|
|
|
|
/**
|
|
* struct consw - callbacks for consoles
|
|
*
|
|
* @owner: the module to get references of when this console is used
|
|
* @con_startup: set up the console and return its name (like VGA, EGA, ...)
|
|
* @con_init: initialize the console on @vc. @init is true for the very first
|
|
* call on this @vc.
|
|
* @con_deinit: deinitialize the console from @vc.
|
|
* @con_clear: erase @count characters at [@x, @y] on @vc. @count >= 1.
|
|
* @con_putc: emit one character with attributes @ca to [@x, @y] on @vc.
|
|
* (optional -- @con_putcs would be called instead)
|
|
* @con_putcs: emit @count characters with attributes @s to [@x, @y] on @vc.
|
|
* @con_cursor: enable/disable cursor depending on @enable
|
|
* @con_scroll: move lines from @top to @bottom in direction @dir by @lines.
|
|
* Return true if no generic handling should be done.
|
|
* Invoked by csi_M and printing to the console.
|
|
* @con_switch: notifier about the console switch; it is supposed to return
|
|
* true if a redraw is needed.
|
|
* @con_blank: blank/unblank the console. The target mode is passed in @blank.
|
|
* @mode_switch is set if changing from/to text/graphics. The hook
|
|
* is supposed to return true if a redraw is needed.
|
|
* @con_font_set: set console @vc font to @font with height @vpitch. @flags can
|
|
* be %KD_FONT_FLAG_DONT_RECALC. (optional)
|
|
* @con_font_get: fetch the current font on @vc of height @vpitch into @font.
|
|
* (optional)
|
|
* @con_font_default: set default font on @vc. @name can be %NULL or font name
|
|
* to search for. @font can be filled back. (optional)
|
|
* @con_resize: resize the @vc console to @width x @height. @from_user is true
|
|
* when this change comes from the user space.
|
|
* @con_set_palette: sets the palette of the console @vc to @table (optional)
|
|
* @con_scrolldelta: the contents of the console should be scrolled by @lines.
|
|
* Invoked by user. (optional)
|
|
* @con_set_origin: set origin (see &vc_data::vc_origin) of the @vc. If not
|
|
* provided or returns false, the origin is set to
|
|
* @vc->vc_screenbuf. (optional)
|
|
* @con_save_screen: save screen content into @vc->vc_screenbuf. Called e.g.
|
|
* upon entering graphics. (optional)
|
|
* @con_build_attr: build attributes based on @color, @intensity and other
|
|
* parameters. The result is used for both normal and erase
|
|
* characters. (optional)
|
|
* @con_invert_region: invert a region of length @count on @vc starting at @p.
|
|
* (optional)
|
|
*/
|
|
struct consw {
|
|
struct module *owner;
|
|
const char *(*con_startup)(void);
|
|
void (*con_init)(struct vc_data *vc, bool init);
|
|
void (*con_deinit)(struct vc_data *vc);
|
|
void (*con_clear)(struct vc_data *vc, unsigned int y,
|
|
unsigned int x, unsigned int count);
|
|
void (*con_putc)(struct vc_data *vc, u16 ca, unsigned int y,
|
|
unsigned int x);
|
|
void (*con_putcs)(struct vc_data *vc, const u16 *s,
|
|
unsigned int count, unsigned int ypos,
|
|
unsigned int xpos);
|
|
void (*con_cursor)(struct vc_data *vc, bool enable);
|
|
bool (*con_scroll)(struct vc_data *vc, unsigned int top,
|
|
unsigned int bottom, enum con_scroll dir,
|
|
unsigned int lines);
|
|
bool (*con_switch)(struct vc_data *vc);
|
|
bool (*con_blank)(struct vc_data *vc, enum vesa_blank_mode blank,
|
|
bool mode_switch);
|
|
int (*con_font_set)(struct vc_data *vc,
|
|
const struct console_font *font,
|
|
unsigned int vpitch, unsigned int flags);
|
|
int (*con_font_get)(struct vc_data *vc, struct console_font *font,
|
|
unsigned int vpitch);
|
|
int (*con_font_default)(struct vc_data *vc,
|
|
struct console_font *font, const char *name);
|
|
int (*con_resize)(struct vc_data *vc, unsigned int width,
|
|
unsigned int height, bool from_user);
|
|
void (*con_set_palette)(struct vc_data *vc,
|
|
const unsigned char *table);
|
|
void (*con_scrolldelta)(struct vc_data *vc, int lines);
|
|
bool (*con_set_origin)(struct vc_data *vc);
|
|
void (*con_save_screen)(struct vc_data *vc);
|
|
u8 (*con_build_attr)(struct vc_data *vc, u8 color,
|
|
enum vc_intensity intensity,
|
|
bool blink, bool underline, bool reverse, bool italic);
|
|
void (*con_invert_region)(struct vc_data *vc, u16 *p, int count);
|
|
};
|
|
|
|
extern const struct consw *conswitchp;
|
|
|
|
extern const struct consw dummy_con; /* dummy console buffer */
|
|
extern const struct consw vga_con; /* VGA text console */
|
|
extern const struct consw newport_con; /* SGI Newport console */
|
|
|
|
struct screen_info;
|
|
#ifdef CONFIG_VGA_CONSOLE
|
|
void vgacon_register_screen(struct screen_info *si);
|
|
#else
|
|
static inline void vgacon_register_screen(struct screen_info *si) { }
|
|
#endif
|
|
|
|
int con_is_bound(const struct consw *csw);
|
|
int do_unregister_con_driver(const struct consw *csw);
|
|
int do_take_over_console(const struct consw *sw, int first, int last, int deflt);
|
|
void give_up_console(const struct consw *sw);
|
|
#ifdef CONFIG_VT
|
|
void con_debug_enter(struct vc_data *vc);
|
|
void con_debug_leave(void);
|
|
#else
|
|
static inline void con_debug_enter(struct vc_data *vc) { }
|
|
static inline void con_debug_leave(void) { }
|
|
#endif
|
|
|
|
/*
|
|
* The interface for a console, or any other device that wants to capture
|
|
* console messages (printer driver?)
|
|
*/
|
|
|
|
/**
|
|
* enum cons_flags - General console flags
|
|
* @CON_PRINTBUFFER: Used by newly registered consoles to avoid duplicate
|
|
* output of messages that were already shown by boot
|
|
* consoles or read by userspace via syslog() syscall.
|
|
* @CON_CONSDEV: Indicates that the console driver is backing
|
|
* /dev/console.
|
|
* @CON_ENABLED: Indicates if a console is allowed to print records. If
|
|
* false, the console also will not advance to later
|
|
* records.
|
|
* @CON_BOOT: Marks the console driver as early console driver which
|
|
* is used during boot before the real driver becomes
|
|
* available. It will be automatically unregistered
|
|
* when the real console driver is registered unless
|
|
* "keep_bootcon" parameter is used.
|
|
* @CON_ANYTIME: A misnomed historical flag which tells the core code
|
|
* that the legacy @console::write callback can be invoked
|
|
* on a CPU which is marked OFFLINE. That is misleading as
|
|
* it suggests that there is no contextual limit for
|
|
* invoking the callback. The original motivation was
|
|
* readiness of the per-CPU areas.
|
|
* @CON_BRL: Indicates a braille device which is exempt from
|
|
* receiving the printk spam for obvious reasons.
|
|
* @CON_EXTENDED: The console supports the extended output format of
|
|
* /dev/kmesg which requires a larger output buffer.
|
|
* @CON_SUSPENDED: Indicates if a console is suspended. If true, the
|
|
* printing callbacks must not be called.
|
|
* @CON_NBCON: Console can operate outside of the legacy style console_lock
|
|
* constraints.
|
|
* @CON_NBCON_ATOMIC_UNSAFE: The write_atomic() callback is not safe and is
|
|
* therefore only used by nbcon_atomic_flush_unsafe().
|
|
*/
|
|
enum cons_flags {
|
|
CON_PRINTBUFFER = BIT(0),
|
|
CON_CONSDEV = BIT(1),
|
|
CON_ENABLED = BIT(2),
|
|
CON_BOOT = BIT(3),
|
|
CON_ANYTIME = BIT(4),
|
|
CON_BRL = BIT(5),
|
|
CON_EXTENDED = BIT(6),
|
|
CON_SUSPENDED = BIT(7),
|
|
CON_NBCON = BIT(8),
|
|
CON_NBCON_ATOMIC_UNSAFE = BIT(9),
|
|
};
|
|
|
|
/**
|
|
* struct nbcon_state - console state for nbcon consoles
|
|
* @atom: Compound of the state fields for atomic operations
|
|
*
|
|
* @req_prio: The priority of a handover request
|
|
* @prio: The priority of the current owner
|
|
* @unsafe: Console is busy in a non takeover region
|
|
* @unsafe_takeover: A hostile takeover in an unsafe state happened in the
|
|
* past. The console cannot be safe until re-initialized.
|
|
* @cpu: The CPU on which the owner runs
|
|
*
|
|
* To be used for reading and preparing of the value stored in the nbcon
|
|
* state variable @console::nbcon_state.
|
|
*
|
|
* The @prio and @req_prio fields are particularly important to allow
|
|
* spin-waiting to timeout and give up without the risk of a waiter being
|
|
* assigned the lock after giving up.
|
|
*/
|
|
struct nbcon_state {
|
|
union {
|
|
unsigned int atom;
|
|
struct {
|
|
unsigned int prio : 2;
|
|
unsigned int req_prio : 2;
|
|
unsigned int unsafe : 1;
|
|
unsigned int unsafe_takeover : 1;
|
|
unsigned int cpu : 24;
|
|
};
|
|
};
|
|
};
|
|
|
|
/*
|
|
* The nbcon_state struct is used to easily create and interpret values that
|
|
* are stored in the @console::nbcon_state variable. Ensure this struct stays
|
|
* within the size boundaries of the atomic variable's underlying type in
|
|
* order to avoid any accidental truncation.
|
|
*/
|
|
static_assert(sizeof(struct nbcon_state) <= sizeof(int));
|
|
|
|
/**
|
|
* enum nbcon_prio - console owner priority for nbcon consoles
|
|
* @NBCON_PRIO_NONE: Unused
|
|
* @NBCON_PRIO_NORMAL: Normal (non-emergency) usage
|
|
* @NBCON_PRIO_EMERGENCY: Emergency output (WARN/OOPS...)
|
|
* @NBCON_PRIO_PANIC: Panic output
|
|
* @NBCON_PRIO_MAX: The number of priority levels
|
|
*
|
|
* A higher priority context can takeover the console when it is
|
|
* in the safe state. The final attempt to flush consoles in panic()
|
|
* can be allowed to do so even in an unsafe state (Hope and pray).
|
|
*/
|
|
enum nbcon_prio {
|
|
NBCON_PRIO_NONE = 0,
|
|
NBCON_PRIO_NORMAL,
|
|
NBCON_PRIO_EMERGENCY,
|
|
NBCON_PRIO_PANIC,
|
|
NBCON_PRIO_MAX,
|
|
};
|
|
|
|
struct console;
|
|
struct printk_buffers;
|
|
|
|
/**
|
|
* struct nbcon_context - Context for console acquire/release
|
|
* @console: The associated console
|
|
* @spinwait_max_us: Limit for spin-wait acquire
|
|
* @prio: Priority of the context
|
|
* @allow_unsafe_takeover: Allow performing takeover even if unsafe. Can
|
|
* be used only with NBCON_PRIO_PANIC @prio. It
|
|
* might cause a system freeze when the console
|
|
* is used later.
|
|
* @backlog: Ringbuffer has pending records
|
|
* @pbufs: Pointer to the text buffer for this context
|
|
* @seq: The sequence number to print for this context
|
|
*/
|
|
struct nbcon_context {
|
|
/* members set by caller */
|
|
struct console *console;
|
|
unsigned int spinwait_max_us;
|
|
enum nbcon_prio prio;
|
|
unsigned int allow_unsafe_takeover : 1;
|
|
|
|
/* members set by emit */
|
|
unsigned int backlog : 1;
|
|
|
|
/* members set by acquire */
|
|
struct printk_buffers *pbufs;
|
|
u64 seq;
|
|
};
|
|
|
|
/**
|
|
* struct nbcon_write_context - Context handed to the nbcon write callbacks
|
|
* @ctxt: The core console context
|
|
* @outbuf: Pointer to the text buffer for output
|
|
* @len: Length to write
|
|
* @unsafe_takeover: If a hostile takeover in an unsafe state has occurred
|
|
*/
|
|
struct nbcon_write_context {
|
|
struct nbcon_context __private ctxt;
|
|
char *outbuf;
|
|
unsigned int len;
|
|
bool unsafe_takeover;
|
|
};
|
|
|
|
/**
|
|
* struct console - The console descriptor structure
|
|
* @name: The name of the console driver
|
|
* @write: Legacy write callback to output messages (Optional)
|
|
* @read: Read callback for console input (Optional)
|
|
* @device: The underlying TTY device driver (Optional)
|
|
* @unblank: Callback to unblank the console (Optional)
|
|
* @setup: Callback for initializing the console (Optional)
|
|
* @exit: Callback for teardown of the console (Optional)
|
|
* @match: Callback for matching a console (Optional)
|
|
* @flags: Console flags. See enum cons_flags
|
|
* @index: Console index, e.g. port number
|
|
* @cflag: TTY control mode flags
|
|
* @ispeed: TTY input speed
|
|
* @ospeed: TTY output speed
|
|
* @seq: Sequence number of the next ringbuffer record to print
|
|
* @dropped: Number of unreported dropped ringbuffer records
|
|
* @data: Driver private data
|
|
* @node: hlist node for the console list
|
|
*
|
|
* @nbcon_state: State for nbcon consoles
|
|
* @nbcon_seq: Sequence number of the next record for nbcon to print
|
|
* @nbcon_device_ctxt: Context available for non-printing operations
|
|
* @nbcon_prev_seq: Seq num the previous nbcon owner was assigned to print
|
|
* @pbufs: Pointer to nbcon private buffer
|
|
* @kthread: Printer kthread for this console
|
|
* @rcuwait: RCU-safe wait object for @kthread waking
|
|
* @irq_work: Defer @kthread waking to IRQ work context
|
|
*/
|
|
struct console {
|
|
char name[16];
|
|
void (*write)(struct console *co, const char *s, unsigned int count);
|
|
int (*read)(struct console *co, char *s, unsigned int count);
|
|
struct tty_driver *(*device)(struct console *co, int *index);
|
|
void (*unblank)(void);
|
|
int (*setup)(struct console *co, char *options);
|
|
int (*exit)(struct console *co);
|
|
int (*match)(struct console *co, char *name, int idx, char *options);
|
|
short flags;
|
|
short index;
|
|
int cflag;
|
|
uint ispeed;
|
|
uint ospeed;
|
|
u64 seq;
|
|
unsigned long dropped;
|
|
void *data;
|
|
struct hlist_node node;
|
|
|
|
/* nbcon console specific members */
|
|
|
|
/**
|
|
* @write_atomic:
|
|
*
|
|
* NBCON callback to write out text in any context. (Optional)
|
|
*
|
|
* This callback is called with the console already acquired. However,
|
|
* a higher priority context is allowed to take it over by default.
|
|
*
|
|
* The callback must call nbcon_enter_unsafe() and nbcon_exit_unsafe()
|
|
* around any code where the takeover is not safe, for example, when
|
|
* manipulating the serial port registers.
|
|
*
|
|
* nbcon_enter_unsafe() will fail if the context has lost the console
|
|
* ownership in the meantime. In this case, the callback is no longer
|
|
* allowed to go forward. It must back out immediately and carefully.
|
|
* The buffer content is also no longer trusted since it no longer
|
|
* belongs to the context.
|
|
*
|
|
* The callback should allow the takeover whenever it is safe. It
|
|
* increases the chance to see messages when the system is in trouble.
|
|
* If the driver must reacquire ownership in order to finalize or
|
|
* revert hardware changes, nbcon_reacquire_nobuf() can be used.
|
|
* However, on reacquire the buffer content is no longer available. A
|
|
* reacquire cannot be used to resume printing.
|
|
*
|
|
* The callback can be called from any context (including NMI).
|
|
* Therefore it must avoid usage of any locking and instead rely
|
|
* on the console ownership for synchronization.
|
|
*/
|
|
void (*write_atomic)(struct console *con, struct nbcon_write_context *wctxt);
|
|
|
|
/**
|
|
* @write_thread:
|
|
*
|
|
* NBCON callback to write out text in task context.
|
|
*
|
|
* This callback must be called only in task context with both
|
|
* device_lock() and the nbcon console acquired with
|
|
* NBCON_PRIO_NORMAL.
|
|
*
|
|
* The same rules for console ownership verification and unsafe
|
|
* sections handling applies as with write_atomic().
|
|
*
|
|
* The console ownership handling is necessary for synchronization
|
|
* against write_atomic() which is synchronized only via the context.
|
|
*
|
|
* The device_lock() provides the primary serialization for operations
|
|
* on the device. It might be as relaxed (mutex)[*] or as tight
|
|
* (disabled preemption and interrupts) as needed. It allows
|
|
* the kthread to operate in the least restrictive mode[**].
|
|
*
|
|
* [*] Standalone nbcon_context_try_acquire() is not safe with
|
|
* the preemption enabled, see nbcon_owner_matches(). But it
|
|
* can be safe when always called in the preemptive context
|
|
* under the device_lock().
|
|
*
|
|
* [**] The device_lock() makes sure that nbcon_context_try_acquire()
|
|
* would never need to spin which is important especially with
|
|
* PREEMPT_RT.
|
|
*/
|
|
void (*write_thread)(struct console *con, struct nbcon_write_context *wctxt);
|
|
|
|
/**
|
|
* @device_lock:
|
|
*
|
|
* NBCON callback to begin synchronization with driver code.
|
|
*
|
|
* Console drivers typically must deal with access to the hardware
|
|
* via user input/output (such as an interactive login shell) and
|
|
* output of kernel messages via printk() calls. This callback is
|
|
* called by the printk-subsystem whenever it needs to synchronize
|
|
* with hardware access by the driver. It should be implemented to
|
|
* use whatever synchronization mechanism the driver is using for
|
|
* itself (for example, the port lock for uart serial consoles).
|
|
*
|
|
* The callback is always called from task context. It may use any
|
|
* synchronization method required by the driver.
|
|
*
|
|
* IMPORTANT: The callback MUST disable migration. The console driver
|
|
* may be using a synchronization mechanism that already takes
|
|
* care of this (such as spinlocks). Otherwise this function must
|
|
* explicitly call migrate_disable().
|
|
*
|
|
* The flags argument is provided as a convenience to the driver. It
|
|
* will be passed again to device_unlock(). It can be ignored if the
|
|
* driver does not need it.
|
|
*/
|
|
void (*device_lock)(struct console *con, unsigned long *flags);
|
|
|
|
/**
|
|
* @device_unlock:
|
|
*
|
|
* NBCON callback to finish synchronization with driver code.
|
|
*
|
|
* It is the counterpart to device_lock().
|
|
*
|
|
* This callback is always called from task context. It must
|
|
* appropriately re-enable migration (depending on how device_lock()
|
|
* disabled migration).
|
|
*
|
|
* The flags argument is the value of the same variable that was
|
|
* passed to device_lock().
|
|
*/
|
|
void (*device_unlock)(struct console *con, unsigned long flags);
|
|
|
|
atomic_t __private nbcon_state;
|
|
atomic_long_t __private nbcon_seq;
|
|
struct nbcon_context __private nbcon_device_ctxt;
|
|
atomic_long_t __private nbcon_prev_seq;
|
|
|
|
struct printk_buffers *pbufs;
|
|
struct task_struct *kthread;
|
|
struct rcuwait rcuwait;
|
|
struct irq_work irq_work;
|
|
};
|
|
|
|
#ifdef CONFIG_LOCKDEP
|
|
extern void lockdep_assert_console_list_lock_held(void);
|
|
#else
|
|
static inline void lockdep_assert_console_list_lock_held(void)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
|
extern bool console_srcu_read_lock_is_held(void);
|
|
#else
|
|
static inline bool console_srcu_read_lock_is_held(void)
|
|
{
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
extern int console_srcu_read_lock(void);
|
|
extern void console_srcu_read_unlock(int cookie);
|
|
|
|
extern void console_list_lock(void);
|
|
extern void console_list_unlock(void);
|
|
|
|
extern struct hlist_head console_list;
|
|
|
|
/**
|
|
* console_srcu_read_flags - Locklessly read flags of a possibly registered
|
|
* console
|
|
* @con: struct console pointer of console to read flags from
|
|
*
|
|
* Locklessly reading @con->flags provides a consistent read value because
|
|
* there is at most one CPU modifying @con->flags and that CPU is using only
|
|
* read-modify-write operations to do so.
|
|
*
|
|
* Requires console_srcu_read_lock to be held, which implies that @con might
|
|
* be a registered console. The purpose of holding console_srcu_read_lock is
|
|
* to guarantee that the console state is valid (CON_SUSPENDED/CON_ENABLED)
|
|
* and that no exit/cleanup routines will run if the console is currently
|
|
* undergoing unregistration.
|
|
*
|
|
* If the caller is holding the console_list_lock or it is _certain_ that
|
|
* @con is not and will not become registered, the caller may read
|
|
* @con->flags directly instead.
|
|
*
|
|
* Context: Any context.
|
|
* Return: The current value of the @con->flags field.
|
|
*/
|
|
static inline short console_srcu_read_flags(const struct console *con)
|
|
{
|
|
WARN_ON_ONCE(!console_srcu_read_lock_is_held());
|
|
|
|
/*
|
|
* The READ_ONCE() matches the WRITE_ONCE() when @flags are modified
|
|
* for registered consoles with console_srcu_write_flags().
|
|
*/
|
|
return data_race(READ_ONCE(con->flags));
|
|
}
|
|
|
|
/**
|
|
* console_srcu_write_flags - Write flags for a registered console
|
|
* @con: struct console pointer of console to write flags to
|
|
* @flags: new flags value to write
|
|
*
|
|
* Only use this function to write flags for registered consoles. It
|
|
* requires holding the console_list_lock.
|
|
*
|
|
* Context: Any context.
|
|
*/
|
|
static inline void console_srcu_write_flags(struct console *con, short flags)
|
|
{
|
|
lockdep_assert_console_list_lock_held();
|
|
|
|
/* This matches the READ_ONCE() in console_srcu_read_flags(). */
|
|
WRITE_ONCE(con->flags, flags);
|
|
}
|
|
|
|
/* Variant of console_is_registered() when the console_list_lock is held. */
|
|
static inline bool console_is_registered_locked(const struct console *con)
|
|
{
|
|
lockdep_assert_console_list_lock_held();
|
|
return !hlist_unhashed(&con->node);
|
|
}
|
|
|
|
/*
|
|
* console_is_registered - Check if the console is registered
|
|
* @con: struct console pointer of console to check
|
|
*
|
|
* Context: Process context. May sleep while acquiring console list lock.
|
|
* Return: true if the console is in the console list, otherwise false.
|
|
*
|
|
* If false is returned for a console that was previously registered, it
|
|
* can be assumed that the console's unregistration is fully completed,
|
|
* including the exit() callback after console list removal.
|
|
*/
|
|
static inline bool console_is_registered(const struct console *con)
|
|
{
|
|
bool ret;
|
|
|
|
console_list_lock();
|
|
ret = console_is_registered_locked(con);
|
|
console_list_unlock();
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* for_each_console_srcu() - Iterator over registered consoles
|
|
* @con: struct console pointer used as loop cursor
|
|
*
|
|
* Although SRCU guarantees the console list will be consistent, the
|
|
* struct console fields may be updated by other CPUs while iterating.
|
|
*
|
|
* Requires console_srcu_read_lock to be held. Can be invoked from
|
|
* any context.
|
|
*/
|
|
#define for_each_console_srcu(con) \
|
|
hlist_for_each_entry_srcu(con, &console_list, node, \
|
|
console_srcu_read_lock_is_held())
|
|
|
|
/**
|
|
* for_each_console() - Iterator over registered consoles
|
|
* @con: struct console pointer used as loop cursor
|
|
*
|
|
* The console list and the &console.flags are immutable while iterating.
|
|
*
|
|
* Requires console_list_lock to be held.
|
|
*/
|
|
#define for_each_console(con) \
|
|
lockdep_assert_console_list_lock_held(); \
|
|
hlist_for_each_entry(con, &console_list, node)
|
|
|
|
#ifdef CONFIG_PRINTK
|
|
extern void nbcon_cpu_emergency_enter(void);
|
|
extern void nbcon_cpu_emergency_exit(void);
|
|
extern bool nbcon_can_proceed(struct nbcon_write_context *wctxt);
|
|
extern void nbcon_write_context_set_buf(struct nbcon_write_context *wctxt,
|
|
char *buf, unsigned int len);
|
|
extern bool nbcon_enter_unsafe(struct nbcon_write_context *wctxt);
|
|
extern bool nbcon_exit_unsafe(struct nbcon_write_context *wctxt);
|
|
extern void nbcon_reacquire_nobuf(struct nbcon_write_context *wctxt);
|
|
extern bool nbcon_allow_unsafe_takeover(void);
|
|
extern bool nbcon_kdb_try_acquire(struct console *con,
|
|
struct nbcon_write_context *wctxt);
|
|
extern void nbcon_kdb_release(struct nbcon_write_context *wctxt);
|
|
|
|
/*
|
|
* Check if the given console is currently capable and allowed to print
|
|
* records. Note that this function does not consider the current context,
|
|
* which can also play a role in deciding if @con can be used to print
|
|
* records.
|
|
*/
|
|
static inline bool console_is_usable(struct console *con, short flags, bool use_atomic)
|
|
{
|
|
if (!(flags & CON_ENABLED))
|
|
return false;
|
|
|
|
if ((flags & CON_SUSPENDED))
|
|
return false;
|
|
|
|
if (flags & CON_NBCON) {
|
|
if (use_atomic) {
|
|
/* The write_atomic() callback is optional. */
|
|
if (!con->write_atomic)
|
|
return false;
|
|
|
|
/*
|
|
* An unsafe write_atomic() callback is only usable
|
|
* when unsafe takeovers are allowed.
|
|
*/
|
|
if ((flags & CON_NBCON_ATOMIC_UNSAFE) && !nbcon_allow_unsafe_takeover())
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* For the !use_atomic case, @printk_kthreads_running is not
|
|
* checked because the write_thread() callback is also used
|
|
* via the legacy loop when the printer threads are not
|
|
* available.
|
|
*/
|
|
} else {
|
|
if (!con->write)
|
|
return false;
|
|
}
|
|
|
|
/*
|
|
* Console drivers may assume that per-cpu resources have been
|
|
* allocated. So unless they're explicitly marked as being able to
|
|
* cope (CON_ANYTIME) don't call them until this CPU is officially up.
|
|
*/
|
|
if (!cpu_online(raw_smp_processor_id()) && !(flags & CON_ANYTIME))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
#else
|
|
static inline void nbcon_cpu_emergency_enter(void) { }
|
|
static inline void nbcon_cpu_emergency_exit(void) { }
|
|
static inline bool nbcon_can_proceed(struct nbcon_write_context *wctxt) { return false; }
|
|
static inline void nbcon_write_context_set_buf(struct nbcon_write_context *wctxt,
|
|
char *buf, unsigned int len) { }
|
|
static inline bool nbcon_enter_unsafe(struct nbcon_write_context *wctxt) { return false; }
|
|
static inline bool nbcon_exit_unsafe(struct nbcon_write_context *wctxt) { return false; }
|
|
static inline void nbcon_reacquire_nobuf(struct nbcon_write_context *wctxt) { }
|
|
static inline bool nbcon_kdb_try_acquire(struct console *con,
|
|
struct nbcon_write_context *wctxt) { return false; }
|
|
static inline void nbcon_kdb_release(struct nbcon_write_context *wctxt) { }
|
|
static inline bool console_is_usable(struct console *con, short flags,
|
|
bool use_atomic) { return false; }
|
|
#endif
|
|
|
|
extern int console_set_on_cmdline;
|
|
extern struct console *early_console;
|
|
|
|
enum con_flush_mode {
|
|
CONSOLE_FLUSH_PENDING,
|
|
CONSOLE_REPLAY_ALL,
|
|
};
|
|
|
|
extern int add_preferred_console(const char *name, const short idx, char *options);
|
|
extern void console_force_preferred_locked(struct console *con);
|
|
extern void register_console(struct console *);
|
|
extern int unregister_console(struct console *);
|
|
extern void console_lock(void);
|
|
extern int console_trylock(void);
|
|
extern void console_unlock(void);
|
|
extern void console_conditional_schedule(void);
|
|
extern void console_unblank(void);
|
|
extern void console_flush_on_panic(enum con_flush_mode mode);
|
|
extern struct tty_driver *console_device(int *);
|
|
extern void console_suspend(struct console *);
|
|
extern void console_resume(struct console *);
|
|
extern int is_console_locked(void);
|
|
extern int braille_register_console(struct console *, int index,
|
|
char *console_options, char *braille_options);
|
|
extern int braille_unregister_console(struct console *);
|
|
#ifdef CONFIG_TTY
|
|
extern void console_sysfs_notify(void);
|
|
#else
|
|
static inline void console_sysfs_notify(void)
|
|
{ }
|
|
#endif
|
|
extern bool console_suspend_enabled;
|
|
|
|
/* Suspend and resume console messages over PM events */
|
|
extern void console_suspend_all(void);
|
|
extern void console_resume_all(void);
|
|
|
|
int mda_console_init(void);
|
|
|
|
void vcs_make_sysfs(int index);
|
|
void vcs_remove_sysfs(int index);
|
|
|
|
/* Some debug stub to catch some of the obvious races in the VT code */
|
|
#define WARN_CONSOLE_UNLOCKED() \
|
|
WARN_ON(!atomic_read(&ignore_console_lock_warning) && \
|
|
!is_console_locked() && !oops_in_progress)
|
|
/*
|
|
* Increment ignore_console_lock_warning if you need to quiet
|
|
* WARN_CONSOLE_UNLOCKED() for debugging purposes.
|
|
*/
|
|
extern atomic_t ignore_console_lock_warning;
|
|
|
|
DEFINE_LOCK_GUARD_0(console_lock, console_lock(), console_unlock());
|
|
|
|
extern void console_init(void);
|
|
|
|
/* For deferred console takeover */
|
|
void dummycon_register_output_notifier(struct notifier_block *nb);
|
|
void dummycon_unregister_output_notifier(struct notifier_block *nb);
|
|
|
|
#endif /* _LINUX_CONSOLE_H */
|