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

rc-core-priv.h (9214B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Remote Controller core raw events header
      4 *
      5 * Copyright (C) 2010 by Mauro Carvalho Chehab
      6 */
      7
      8#ifndef _RC_CORE_PRIV
      9#define _RC_CORE_PRIV
     10
     11#define	RC_DEV_MAX		256
     12/* Define the max number of pulse/space transitions to buffer */
     13#define	MAX_IR_EVENT_SIZE	512
     14
     15#include <linux/slab.h>
     16#include <uapi/linux/bpf.h>
     17#include <media/rc-core.h>
     18
     19/**
     20 * rc_open - Opens a RC device
     21 *
     22 * @rdev: pointer to struct rc_dev.
     23 */
     24int rc_open(struct rc_dev *rdev);
     25
     26/**
     27 * rc_close - Closes a RC device
     28 *
     29 * @rdev: pointer to struct rc_dev.
     30 */
     31void rc_close(struct rc_dev *rdev);
     32
     33struct ir_raw_handler {
     34	struct list_head list;
     35
     36	u64 protocols; /* which are handled by this handler */
     37	int (*decode)(struct rc_dev *dev, struct ir_raw_event event);
     38	int (*encode)(enum rc_proto protocol, u32 scancode,
     39		      struct ir_raw_event *events, unsigned int max);
     40	u32 carrier;
     41	u32 min_timeout;
     42
     43	/* These two should only be used by the mce kbd decoder */
     44	int (*raw_register)(struct rc_dev *dev);
     45	int (*raw_unregister)(struct rc_dev *dev);
     46};
     47
     48struct ir_raw_event_ctrl {
     49	struct list_head		list;		/* to keep track of raw clients */
     50	struct task_struct		*thread;
     51	/* fifo for the pulse/space durations */
     52	DECLARE_KFIFO(kfifo, struct ir_raw_event, MAX_IR_EVENT_SIZE);
     53	ktime_t				last_event;	/* when last event occurred */
     54	struct rc_dev			*dev;		/* pointer to the parent rc_dev */
     55	/* handle delayed ir_raw_event_store_edge processing */
     56	spinlock_t			edge_spinlock;
     57	struct timer_list		edge_handle;
     58
     59	/* raw decoder state follows */
     60	struct ir_raw_event prev_ev;
     61	struct ir_raw_event this_ev;
     62
     63#ifdef CONFIG_BPF_LIRC_MODE2
     64	u32				bpf_sample;
     65	struct bpf_prog_array __rcu	*progs;
     66#endif
     67#if IS_ENABLED(CONFIG_IR_NEC_DECODER)
     68	struct nec_dec {
     69		int state;
     70		unsigned count;
     71		u32 bits;
     72		bool is_nec_x;
     73		bool necx_repeat;
     74	} nec;
     75#endif
     76#if IS_ENABLED(CONFIG_IR_RC5_DECODER)
     77	struct rc5_dec {
     78		int state;
     79		u32 bits;
     80		unsigned count;
     81		bool is_rc5x;
     82	} rc5;
     83#endif
     84#if IS_ENABLED(CONFIG_IR_RC6_DECODER)
     85	struct rc6_dec {
     86		int state;
     87		u8 header;
     88		u32 body;
     89		bool toggle;
     90		unsigned count;
     91		unsigned wanted_bits;
     92	} rc6;
     93#endif
     94#if IS_ENABLED(CONFIG_IR_SONY_DECODER)
     95	struct sony_dec {
     96		int state;
     97		u32 bits;
     98		unsigned count;
     99	} sony;
    100#endif
    101#if IS_ENABLED(CONFIG_IR_JVC_DECODER)
    102	struct jvc_dec {
    103		int state;
    104		u16 bits;
    105		u16 old_bits;
    106		unsigned count;
    107		bool first;
    108		bool toggle;
    109	} jvc;
    110#endif
    111#if IS_ENABLED(CONFIG_IR_SANYO_DECODER)
    112	struct sanyo_dec {
    113		int state;
    114		unsigned count;
    115		u64 bits;
    116	} sanyo;
    117#endif
    118#if IS_ENABLED(CONFIG_IR_SHARP_DECODER)
    119	struct sharp_dec {
    120		int state;
    121		unsigned count;
    122		u32 bits;
    123		unsigned int pulse_len;
    124	} sharp;
    125#endif
    126#if IS_ENABLED(CONFIG_IR_MCE_KBD_DECODER)
    127	struct mce_kbd_dec {
    128		/* locks key up timer */
    129		spinlock_t keylock;
    130		struct timer_list rx_timeout;
    131		int state;
    132		u8 header;
    133		u32 body;
    134		unsigned count;
    135		unsigned wanted_bits;
    136	} mce_kbd;
    137#endif
    138#if IS_ENABLED(CONFIG_IR_XMP_DECODER)
    139	struct xmp_dec {
    140		int state;
    141		unsigned count;
    142		u32 durations[16];
    143	} xmp;
    144#endif
    145#if IS_ENABLED(CONFIG_IR_IMON_DECODER)
    146	struct imon_dec {
    147		int state;
    148		int count;
    149		int last_chk;
    150		unsigned int bits;
    151		bool stick_keyboard;
    152	} imon;
    153#endif
    154#if IS_ENABLED(CONFIG_IR_RCMM_DECODER)
    155	struct rcmm_dec {
    156		int state;
    157		unsigned int count;
    158		u32 bits;
    159	} rcmm;
    160#endif
    161};
    162
    163/* Mutex for locking raw IR processing and handler change */
    164extern struct mutex ir_raw_handler_lock;
    165
    166/* macros for IR decoders */
    167static inline bool geq_margin(unsigned d1, unsigned d2, unsigned margin)
    168{
    169	return d1 > (d2 - margin);
    170}
    171
    172static inline bool eq_margin(unsigned d1, unsigned d2, unsigned margin)
    173{
    174	return ((d1 > (d2 - margin)) && (d1 < (d2 + margin)));
    175}
    176
    177static inline bool is_transition(struct ir_raw_event *x, struct ir_raw_event *y)
    178{
    179	return x->pulse != y->pulse;
    180}
    181
    182static inline void decrease_duration(struct ir_raw_event *ev, unsigned duration)
    183{
    184	if (duration > ev->duration)
    185		ev->duration = 0;
    186	else
    187		ev->duration -= duration;
    188}
    189
    190/* Returns true if event is normal pulse/space event */
    191static inline bool is_timing_event(struct ir_raw_event ev)
    192{
    193	return !ev.carrier_report && !ev.overflow;
    194}
    195
    196#define TO_STR(is_pulse)		((is_pulse) ? "pulse" : "space")
    197
    198/* functions for IR encoders */
    199bool rc_validate_scancode(enum rc_proto proto, u32 scancode);
    200
    201static inline void init_ir_raw_event_duration(struct ir_raw_event *ev,
    202					      unsigned int pulse,
    203					      u32 duration)
    204{
    205	*ev = (struct ir_raw_event) {
    206		.duration = duration,
    207		.pulse = pulse
    208	};
    209}
    210
    211/**
    212 * struct ir_raw_timings_manchester - Manchester coding timings
    213 * @leader_pulse:	duration of leader pulse (if any) 0 if continuing
    214 *			existing signal
    215 * @leader_space:	duration of leader space (if any)
    216 * @clock:		duration of each pulse/space in ns
    217 * @invert:		if set clock logic is inverted
    218 *			(0 = space + pulse, 1 = pulse + space)
    219 * @trailer_space:	duration of trailer space in ns
    220 */
    221struct ir_raw_timings_manchester {
    222	unsigned int leader_pulse;
    223	unsigned int leader_space;
    224	unsigned int clock;
    225	unsigned int invert:1;
    226	unsigned int trailer_space;
    227};
    228
    229int ir_raw_gen_manchester(struct ir_raw_event **ev, unsigned int max,
    230			  const struct ir_raw_timings_manchester *timings,
    231			  unsigned int n, u64 data);
    232
    233/**
    234 * ir_raw_gen_pulse_space() - generate pulse and space raw events.
    235 * @ev:			Pointer to pointer to next free raw event.
    236 *			Will be incremented for each raw event written.
    237 * @max:		Pointer to number of raw events available in buffer.
    238 *			Will be decremented for each raw event written.
    239 * @pulse_width:	Width of pulse in ns.
    240 * @space_width:	Width of space in ns.
    241 *
    242 * Returns:	0 on success.
    243 *		-ENOBUFS if there isn't enough buffer space to write both raw
    244 *		events. In this case @max events will have been written.
    245 */
    246static inline int ir_raw_gen_pulse_space(struct ir_raw_event **ev,
    247					 unsigned int *max,
    248					 unsigned int pulse_width,
    249					 unsigned int space_width)
    250{
    251	if (!*max)
    252		return -ENOBUFS;
    253	init_ir_raw_event_duration((*ev)++, 1, pulse_width);
    254	if (!--*max)
    255		return -ENOBUFS;
    256	init_ir_raw_event_duration((*ev)++, 0, space_width);
    257	--*max;
    258	return 0;
    259}
    260
    261/**
    262 * struct ir_raw_timings_pd - pulse-distance modulation timings
    263 * @header_pulse:	duration of header pulse in ns (0 for none)
    264 * @header_space:	duration of header space in ns
    265 * @bit_pulse:		duration of bit pulse in ns
    266 * @bit_space:		duration of bit space (for logic 0 and 1) in ns
    267 * @trailer_pulse:	duration of trailer pulse in ns
    268 * @trailer_space:	duration of trailer space in ns
    269 * @msb_first:		1 if most significant bit is sent first
    270 */
    271struct ir_raw_timings_pd {
    272	unsigned int header_pulse;
    273	unsigned int header_space;
    274	unsigned int bit_pulse;
    275	unsigned int bit_space[2];
    276	unsigned int trailer_pulse;
    277	unsigned int trailer_space;
    278	unsigned int msb_first:1;
    279};
    280
    281int ir_raw_gen_pd(struct ir_raw_event **ev, unsigned int max,
    282		  const struct ir_raw_timings_pd *timings,
    283		  unsigned int n, u64 data);
    284
    285/**
    286 * struct ir_raw_timings_pl - pulse-length modulation timings
    287 * @header_pulse:	duration of header pulse in ns (0 for none)
    288 * @bit_space:		duration of bit space in ns
    289 * @bit_pulse:		duration of bit pulse (for logic 0 and 1) in ns
    290 * @trailer_space:	duration of trailer space in ns
    291 * @msb_first:		1 if most significant bit is sent first
    292 */
    293struct ir_raw_timings_pl {
    294	unsigned int header_pulse;
    295	unsigned int bit_space;
    296	unsigned int bit_pulse[2];
    297	unsigned int trailer_space;
    298	unsigned int msb_first:1;
    299};
    300
    301int ir_raw_gen_pl(struct ir_raw_event **ev, unsigned int max,
    302		  const struct ir_raw_timings_pl *timings,
    303		  unsigned int n, u64 data);
    304
    305/*
    306 * Routines from rc-raw.c to be used internally and by decoders
    307 */
    308u64 ir_raw_get_allowed_protocols(void);
    309int ir_raw_event_prepare(struct rc_dev *dev);
    310int ir_raw_event_register(struct rc_dev *dev);
    311void ir_raw_event_free(struct rc_dev *dev);
    312void ir_raw_event_unregister(struct rc_dev *dev);
    313int ir_raw_handler_register(struct ir_raw_handler *ir_raw_handler);
    314void ir_raw_handler_unregister(struct ir_raw_handler *ir_raw_handler);
    315void ir_raw_load_modules(u64 *protocols);
    316void ir_raw_init(void);
    317
    318/*
    319 * lirc interface
    320 */
    321#ifdef CONFIG_LIRC
    322int lirc_dev_init(void);
    323void lirc_dev_exit(void);
    324void lirc_raw_event(struct rc_dev *dev, struct ir_raw_event ev);
    325void lirc_scancode_event(struct rc_dev *dev, struct lirc_scancode *lsc);
    326int lirc_register(struct rc_dev *dev);
    327void lirc_unregister(struct rc_dev *dev);
    328struct rc_dev *rc_dev_get_from_fd(int fd);
    329#else
    330static inline int lirc_dev_init(void) { return 0; }
    331static inline void lirc_dev_exit(void) {}
    332static inline void lirc_raw_event(struct rc_dev *dev,
    333				  struct ir_raw_event ev) { }
    334static inline void lirc_scancode_event(struct rc_dev *dev,
    335				       struct lirc_scancode *lsc) { }
    336static inline int lirc_register(struct rc_dev *dev) { return 0; }
    337static inline void lirc_unregister(struct rc_dev *dev) { }
    338#endif
    339
    340/*
    341 * bpf interface
    342 */
    343#ifdef CONFIG_BPF_LIRC_MODE2
    344void lirc_bpf_free(struct rc_dev *dev);
    345void lirc_bpf_run(struct rc_dev *dev, u32 sample);
    346#else
    347static inline void lirc_bpf_free(struct rc_dev *dev) { }
    348static inline void lirc_bpf_run(struct rc_dev *dev, u32 sample) { }
    349#endif
    350
    351#endif /* _RC_CORE_PRIV */