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

cec.h (41892B)


      1/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-3-Clause) */
      2/*
      3 * cec - HDMI Consumer Electronics Control public header
      4 *
      5 * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
      6 */
      7
      8#ifndef _CEC_UAPI_H
      9#define _CEC_UAPI_H
     10
     11#include <linux/types.h>
     12#include <linux/string.h>
     13
     14#define CEC_MAX_MSG_SIZE	16
     15
     16/**
     17 * struct cec_msg - CEC message structure.
     18 * @tx_ts:	Timestamp in nanoseconds using CLOCK_MONOTONIC. Set by the
     19 *		driver when the message transmission has finished.
     20 * @rx_ts:	Timestamp in nanoseconds using CLOCK_MONOTONIC. Set by the
     21 *		driver when the message was received.
     22 * @len:	Length in bytes of the message.
     23 * @timeout:	The timeout (in ms) that is used to timeout CEC_RECEIVE.
     24 *		Set to 0 if you want to wait forever. This timeout can also be
     25 *		used with CEC_TRANSMIT as the timeout for waiting for a reply.
     26 *		If 0, then it will use a 1 second timeout instead of waiting
     27 *		forever as is done with CEC_RECEIVE.
     28 * @sequence:	The framework assigns a sequence number to messages that are
     29 *		sent. This can be used to track replies to previously sent
     30 *		messages.
     31 * @flags:	Set to 0.
     32 * @msg:	The message payload.
     33 * @reply:	This field is ignored with CEC_RECEIVE and is only used by
     34 *		CEC_TRANSMIT. If non-zero, then wait for a reply with this
     35 *		opcode. Set to CEC_MSG_FEATURE_ABORT if you want to wait for
     36 *		a possible ABORT reply. If there was an error when sending the
     37 *		msg or FeatureAbort was returned, then reply is set to 0.
     38 *		If reply is non-zero upon return, then len/msg are set to
     39 *		the received message.
     40 *		If reply is zero upon return and status has the
     41 *		CEC_TX_STATUS_FEATURE_ABORT bit set, then len/msg are set to
     42 *		the received feature abort message.
     43 *		If reply is zero upon return and status has the
     44 *		CEC_TX_STATUS_MAX_RETRIES bit set, then no reply was seen at
     45 *		all. If reply is non-zero for CEC_TRANSMIT and the message is a
     46 *		broadcast, then -EINVAL is returned.
     47 *		if reply is non-zero, then timeout is set to 1000 (the required
     48 *		maximum response time).
     49 * @rx_status:	The message receive status bits. Set by the driver.
     50 * @tx_status:	The message transmit status bits. Set by the driver.
     51 * @tx_arb_lost_cnt: The number of 'Arbitration Lost' events. Set by the driver.
     52 * @tx_nack_cnt: The number of 'Not Acknowledged' events. Set by the driver.
     53 * @tx_low_drive_cnt: The number of 'Low Drive Detected' events. Set by the
     54 *		driver.
     55 * @tx_error_cnt: The number of 'Error' events. Set by the driver.
     56 */
     57struct cec_msg {
     58	__u64 tx_ts;
     59	__u64 rx_ts;
     60	__u32 len;
     61	__u32 timeout;
     62	__u32 sequence;
     63	__u32 flags;
     64	__u8 msg[CEC_MAX_MSG_SIZE];
     65	__u8 reply;
     66	__u8 rx_status;
     67	__u8 tx_status;
     68	__u8 tx_arb_lost_cnt;
     69	__u8 tx_nack_cnt;
     70	__u8 tx_low_drive_cnt;
     71	__u8 tx_error_cnt;
     72};
     73
     74/**
     75 * cec_msg_initiator - return the initiator's logical address.
     76 * @msg:	the message structure
     77 */
     78static inline __u8 cec_msg_initiator(const struct cec_msg *msg)
     79{
     80	return msg->msg[0] >> 4;
     81}
     82
     83/**
     84 * cec_msg_destination - return the destination's logical address.
     85 * @msg:	the message structure
     86 */
     87static inline __u8 cec_msg_destination(const struct cec_msg *msg)
     88{
     89	return msg->msg[0] & 0xf;
     90}
     91
     92/**
     93 * cec_msg_opcode - return the opcode of the message, -1 for poll
     94 * @msg:	the message structure
     95 */
     96static inline int cec_msg_opcode(const struct cec_msg *msg)
     97{
     98	return msg->len > 1 ? msg->msg[1] : -1;
     99}
    100
    101/**
    102 * cec_msg_is_broadcast - return true if this is a broadcast message.
    103 * @msg:	the message structure
    104 */
    105static inline int cec_msg_is_broadcast(const struct cec_msg *msg)
    106{
    107	return (msg->msg[0] & 0xf) == 0xf;
    108}
    109
    110/**
    111 * cec_msg_init - initialize the message structure.
    112 * @msg:	the message structure
    113 * @initiator:	the logical address of the initiator
    114 * @destination:the logical address of the destination (0xf for broadcast)
    115 *
    116 * The whole structure is zeroed, the len field is set to 1 (i.e. a poll
    117 * message) and the initiator and destination are filled in.
    118 */
    119static inline void cec_msg_init(struct cec_msg *msg,
    120				__u8 initiator, __u8 destination)
    121{
    122	memset(msg, 0, sizeof(*msg));
    123	msg->msg[0] = (initiator << 4) | destination;
    124	msg->len = 1;
    125}
    126
    127/**
    128 * cec_msg_set_reply_to - fill in destination/initiator in a reply message.
    129 * @msg:	the message structure for the reply
    130 * @orig:	the original message structure
    131 *
    132 * Set the msg destination to the orig initiator and the msg initiator to the
    133 * orig destination. Note that msg and orig may be the same pointer, in which
    134 * case the change is done in place.
    135 */
    136static inline void cec_msg_set_reply_to(struct cec_msg *msg,
    137					struct cec_msg *orig)
    138{
    139	/* The destination becomes the initiator and vice versa */
    140	msg->msg[0] = (cec_msg_destination(orig) << 4) |
    141		      cec_msg_initiator(orig);
    142	msg->reply = msg->timeout = 0;
    143}
    144
    145/**
    146 * cec_msg_recv_is_tx_result - return true if this message contains the
    147 *			       result of an earlier non-blocking transmit
    148 * @msg:	the message structure from CEC_RECEIVE
    149 */
    150static inline int cec_msg_recv_is_tx_result(const struct cec_msg *msg)
    151{
    152	return msg->sequence && msg->tx_status && !msg->rx_status;
    153}
    154
    155/**
    156 * cec_msg_recv_is_rx_result - return true if this message contains the
    157 *			       reply of an earlier non-blocking transmit
    158 * @msg:	the message structure from CEC_RECEIVE
    159 */
    160static inline int cec_msg_recv_is_rx_result(const struct cec_msg *msg)
    161{
    162	return msg->sequence && !msg->tx_status && msg->rx_status;
    163}
    164
    165/* cec_msg flags field */
    166#define CEC_MSG_FL_REPLY_TO_FOLLOWERS	(1 << 0)
    167#define CEC_MSG_FL_RAW			(1 << 1)
    168
    169/* cec_msg tx/rx_status field */
    170#define CEC_TX_STATUS_OK		(1 << 0)
    171#define CEC_TX_STATUS_ARB_LOST		(1 << 1)
    172#define CEC_TX_STATUS_NACK		(1 << 2)
    173#define CEC_TX_STATUS_LOW_DRIVE		(1 << 3)
    174#define CEC_TX_STATUS_ERROR		(1 << 4)
    175#define CEC_TX_STATUS_MAX_RETRIES	(1 << 5)
    176#define CEC_TX_STATUS_ABORTED		(1 << 6)
    177#define CEC_TX_STATUS_TIMEOUT		(1 << 7)
    178
    179#define CEC_RX_STATUS_OK		(1 << 0)
    180#define CEC_RX_STATUS_TIMEOUT		(1 << 1)
    181#define CEC_RX_STATUS_FEATURE_ABORT	(1 << 2)
    182#define CEC_RX_STATUS_ABORTED		(1 << 3)
    183
    184static inline int cec_msg_status_is_ok(const struct cec_msg *msg)
    185{
    186	if (msg->tx_status && !(msg->tx_status & CEC_TX_STATUS_OK))
    187		return 0;
    188	if (msg->rx_status && !(msg->rx_status & CEC_RX_STATUS_OK))
    189		return 0;
    190	if (!msg->tx_status && !msg->rx_status)
    191		return 0;
    192	return !(msg->rx_status & CEC_RX_STATUS_FEATURE_ABORT);
    193}
    194
    195#define CEC_LOG_ADDR_INVALID		0xff
    196#define CEC_PHYS_ADDR_INVALID		0xffff
    197
    198/*
    199 * The maximum number of logical addresses one device can be assigned to.
    200 * The CEC 2.0 spec allows for only 2 logical addresses at the moment. The
    201 * Analog Devices CEC hardware supports 3. So let's go wild and go for 4.
    202 */
    203#define CEC_MAX_LOG_ADDRS 4
    204
    205/* The logical addresses defined by CEC 2.0 */
    206#define CEC_LOG_ADDR_TV			0
    207#define CEC_LOG_ADDR_RECORD_1		1
    208#define CEC_LOG_ADDR_RECORD_2		2
    209#define CEC_LOG_ADDR_TUNER_1		3
    210#define CEC_LOG_ADDR_PLAYBACK_1		4
    211#define CEC_LOG_ADDR_AUDIOSYSTEM	5
    212#define CEC_LOG_ADDR_TUNER_2		6
    213#define CEC_LOG_ADDR_TUNER_3		7
    214#define CEC_LOG_ADDR_PLAYBACK_2		8
    215#define CEC_LOG_ADDR_RECORD_3		9
    216#define CEC_LOG_ADDR_TUNER_4		10
    217#define CEC_LOG_ADDR_PLAYBACK_3		11
    218#define CEC_LOG_ADDR_BACKUP_1		12
    219#define CEC_LOG_ADDR_BACKUP_2		13
    220#define CEC_LOG_ADDR_SPECIFIC		14
    221#define CEC_LOG_ADDR_UNREGISTERED	15 /* as initiator address */
    222#define CEC_LOG_ADDR_BROADCAST		15 /* as destination address */
    223
    224/* The logical address types that the CEC device wants to claim */
    225#define CEC_LOG_ADDR_TYPE_TV		0
    226#define CEC_LOG_ADDR_TYPE_RECORD	1
    227#define CEC_LOG_ADDR_TYPE_TUNER		2
    228#define CEC_LOG_ADDR_TYPE_PLAYBACK	3
    229#define CEC_LOG_ADDR_TYPE_AUDIOSYSTEM	4
    230#define CEC_LOG_ADDR_TYPE_SPECIFIC	5
    231#define CEC_LOG_ADDR_TYPE_UNREGISTERED	6
    232/*
    233 * Switches should use UNREGISTERED.
    234 * Processors should use SPECIFIC.
    235 */
    236
    237#define CEC_LOG_ADDR_MASK_TV		(1 << CEC_LOG_ADDR_TV)
    238#define CEC_LOG_ADDR_MASK_RECORD	((1 << CEC_LOG_ADDR_RECORD_1) | \
    239					 (1 << CEC_LOG_ADDR_RECORD_2) | \
    240					 (1 << CEC_LOG_ADDR_RECORD_3))
    241#define CEC_LOG_ADDR_MASK_TUNER		((1 << CEC_LOG_ADDR_TUNER_1) | \
    242					 (1 << CEC_LOG_ADDR_TUNER_2) | \
    243					 (1 << CEC_LOG_ADDR_TUNER_3) | \
    244					 (1 << CEC_LOG_ADDR_TUNER_4))
    245#define CEC_LOG_ADDR_MASK_PLAYBACK	((1 << CEC_LOG_ADDR_PLAYBACK_1) | \
    246					 (1 << CEC_LOG_ADDR_PLAYBACK_2) | \
    247					 (1 << CEC_LOG_ADDR_PLAYBACK_3))
    248#define CEC_LOG_ADDR_MASK_AUDIOSYSTEM	(1 << CEC_LOG_ADDR_AUDIOSYSTEM)
    249#define CEC_LOG_ADDR_MASK_BACKUP	((1 << CEC_LOG_ADDR_BACKUP_1) | \
    250					 (1 << CEC_LOG_ADDR_BACKUP_2))
    251#define CEC_LOG_ADDR_MASK_SPECIFIC	(1 << CEC_LOG_ADDR_SPECIFIC)
    252#define CEC_LOG_ADDR_MASK_UNREGISTERED	(1 << CEC_LOG_ADDR_UNREGISTERED)
    253
    254static inline int cec_has_tv(__u16 log_addr_mask)
    255{
    256	return log_addr_mask & CEC_LOG_ADDR_MASK_TV;
    257}
    258
    259static inline int cec_has_record(__u16 log_addr_mask)
    260{
    261	return log_addr_mask & CEC_LOG_ADDR_MASK_RECORD;
    262}
    263
    264static inline int cec_has_tuner(__u16 log_addr_mask)
    265{
    266	return log_addr_mask & CEC_LOG_ADDR_MASK_TUNER;
    267}
    268
    269static inline int cec_has_playback(__u16 log_addr_mask)
    270{
    271	return log_addr_mask & CEC_LOG_ADDR_MASK_PLAYBACK;
    272}
    273
    274static inline int cec_has_audiosystem(__u16 log_addr_mask)
    275{
    276	return log_addr_mask & CEC_LOG_ADDR_MASK_AUDIOSYSTEM;
    277}
    278
    279static inline int cec_has_backup(__u16 log_addr_mask)
    280{
    281	return log_addr_mask & CEC_LOG_ADDR_MASK_BACKUP;
    282}
    283
    284static inline int cec_has_specific(__u16 log_addr_mask)
    285{
    286	return log_addr_mask & CEC_LOG_ADDR_MASK_SPECIFIC;
    287}
    288
    289static inline int cec_is_unregistered(__u16 log_addr_mask)
    290{
    291	return log_addr_mask & CEC_LOG_ADDR_MASK_UNREGISTERED;
    292}
    293
    294static inline int cec_is_unconfigured(__u16 log_addr_mask)
    295{
    296	return log_addr_mask == 0;
    297}
    298
    299/*
    300 * Use this if there is no vendor ID (CEC_G_VENDOR_ID) or if the vendor ID
    301 * should be disabled (CEC_S_VENDOR_ID)
    302 */
    303#define CEC_VENDOR_ID_NONE		0xffffffff
    304
    305/* The message handling modes */
    306/* Modes for initiator */
    307#define CEC_MODE_NO_INITIATOR		(0x0 << 0)
    308#define CEC_MODE_INITIATOR		(0x1 << 0)
    309#define CEC_MODE_EXCL_INITIATOR		(0x2 << 0)
    310#define CEC_MODE_INITIATOR_MSK		0x0f
    311
    312/* Modes for follower */
    313#define CEC_MODE_NO_FOLLOWER		(0x0 << 4)
    314#define CEC_MODE_FOLLOWER		(0x1 << 4)
    315#define CEC_MODE_EXCL_FOLLOWER		(0x2 << 4)
    316#define CEC_MODE_EXCL_FOLLOWER_PASSTHRU	(0x3 << 4)
    317#define CEC_MODE_MONITOR_PIN		(0xd << 4)
    318#define CEC_MODE_MONITOR		(0xe << 4)
    319#define CEC_MODE_MONITOR_ALL		(0xf << 4)
    320#define CEC_MODE_FOLLOWER_MSK		0xf0
    321
    322/* Userspace has to configure the physical address */
    323#define CEC_CAP_PHYS_ADDR	(1 << 0)
    324/* Userspace has to configure the logical addresses */
    325#define CEC_CAP_LOG_ADDRS	(1 << 1)
    326/* Userspace can transmit messages (and thus become follower as well) */
    327#define CEC_CAP_TRANSMIT	(1 << 2)
    328/*
    329 * Passthrough all messages instead of processing them.
    330 */
    331#define CEC_CAP_PASSTHROUGH	(1 << 3)
    332/* Supports remote control */
    333#define CEC_CAP_RC		(1 << 4)
    334/* Hardware can monitor all messages, not just directed and broadcast. */
    335#define CEC_CAP_MONITOR_ALL	(1 << 5)
    336/* Hardware can use CEC only if the HDMI HPD pin is high. */
    337#define CEC_CAP_NEEDS_HPD	(1 << 6)
    338/* Hardware can monitor CEC pin transitions */
    339#define CEC_CAP_MONITOR_PIN	(1 << 7)
    340/* CEC_ADAP_G_CONNECTOR_INFO is available */
    341#define CEC_CAP_CONNECTOR_INFO	(1 << 8)
    342
    343/**
    344 * struct cec_caps - CEC capabilities structure.
    345 * @driver: name of the CEC device driver.
    346 * @name: name of the CEC device. @driver + @name must be unique.
    347 * @available_log_addrs: number of available logical addresses.
    348 * @capabilities: capabilities of the CEC adapter.
    349 * @version: version of the CEC adapter framework.
    350 */
    351struct cec_caps {
    352	char driver[32];
    353	char name[32];
    354	__u32 available_log_addrs;
    355	__u32 capabilities;
    356	__u32 version;
    357};
    358
    359/**
    360 * struct cec_log_addrs - CEC logical addresses structure.
    361 * @log_addr: the claimed logical addresses. Set by the driver.
    362 * @log_addr_mask: current logical address mask. Set by the driver.
    363 * @cec_version: the CEC version that the adapter should implement. Set by the
    364 *	caller.
    365 * @num_log_addrs: how many logical addresses should be claimed. Set by the
    366 *	caller.
    367 * @vendor_id: the vendor ID of the device. Set by the caller.
    368 * @flags: flags.
    369 * @osd_name: the OSD name of the device. Set by the caller.
    370 * @primary_device_type: the primary device type for each logical address.
    371 *	Set by the caller.
    372 * @log_addr_type: the logical address types. Set by the caller.
    373 * @all_device_types: CEC 2.0: all device types represented by the logical
    374 *	address. Set by the caller.
    375 * @features:	CEC 2.0: The logical address features. Set by the caller.
    376 */
    377struct cec_log_addrs {
    378	__u8 log_addr[CEC_MAX_LOG_ADDRS];
    379	__u16 log_addr_mask;
    380	__u8 cec_version;
    381	__u8 num_log_addrs;
    382	__u32 vendor_id;
    383	__u32 flags;
    384	char osd_name[15];
    385	__u8 primary_device_type[CEC_MAX_LOG_ADDRS];
    386	__u8 log_addr_type[CEC_MAX_LOG_ADDRS];
    387
    388	/* CEC 2.0 */
    389	__u8 all_device_types[CEC_MAX_LOG_ADDRS];
    390	__u8 features[CEC_MAX_LOG_ADDRS][12];
    391};
    392
    393/* Allow a fallback to unregistered */
    394#define CEC_LOG_ADDRS_FL_ALLOW_UNREG_FALLBACK	(1 << 0)
    395/* Passthrough RC messages to the input subsystem */
    396#define CEC_LOG_ADDRS_FL_ALLOW_RC_PASSTHRU	(1 << 1)
    397/* CDC-Only device: supports only CDC messages */
    398#define CEC_LOG_ADDRS_FL_CDC_ONLY		(1 << 2)
    399
    400/**
    401 * struct cec_drm_connector_info - tells which drm connector is
    402 * associated with the CEC adapter.
    403 * @card_no: drm card number
    404 * @connector_id: drm connector ID
    405 */
    406struct cec_drm_connector_info {
    407	__u32 card_no;
    408	__u32 connector_id;
    409};
    410
    411#define CEC_CONNECTOR_TYPE_NO_CONNECTOR	0
    412#define CEC_CONNECTOR_TYPE_DRM		1
    413
    414/**
    415 * struct cec_connector_info - tells if and which connector is
    416 * associated with the CEC adapter.
    417 * @type: connector type (if any)
    418 * @drm: drm connector info
    419 * @raw: array to pad the union
    420 */
    421struct cec_connector_info {
    422	__u32 type;
    423	union {
    424		struct cec_drm_connector_info drm;
    425		__u32 raw[16];
    426	};
    427};
    428
    429/* Events */
    430
    431/* Event that occurs when the adapter state changes */
    432#define CEC_EVENT_STATE_CHANGE		1
    433/*
    434 * This event is sent when messages are lost because the application
    435 * didn't empty the message queue in time
    436 */
    437#define CEC_EVENT_LOST_MSGS		2
    438#define CEC_EVENT_PIN_CEC_LOW		3
    439#define CEC_EVENT_PIN_CEC_HIGH		4
    440#define CEC_EVENT_PIN_HPD_LOW		5
    441#define CEC_EVENT_PIN_HPD_HIGH		6
    442#define CEC_EVENT_PIN_5V_LOW		7
    443#define CEC_EVENT_PIN_5V_HIGH		8
    444
    445#define CEC_EVENT_FL_INITIAL_STATE	(1 << 0)
    446#define CEC_EVENT_FL_DROPPED_EVENTS	(1 << 1)
    447
    448/**
    449 * struct cec_event_state_change - used when the CEC adapter changes state.
    450 * @phys_addr: the current physical address
    451 * @log_addr_mask: the current logical address mask
    452 * @have_conn_info: if non-zero, then HDMI connector information is available.
    453 *	This field is only valid if CEC_CAP_CONNECTOR_INFO is set. If that
    454 *	capability is set and @have_conn_info is zero, then that indicates
    455 *	that the HDMI connector device is not instantiated, either because
    456 *	the HDMI driver is still configuring the device or because the HDMI
    457 *	device was unbound.
    458 */
    459struct cec_event_state_change {
    460	__u16 phys_addr;
    461	__u16 log_addr_mask;
    462	__u16 have_conn_info;
    463};
    464
    465/**
    466 * struct cec_event_lost_msgs - tells you how many messages were lost.
    467 * @lost_msgs: how many messages were lost.
    468 */
    469struct cec_event_lost_msgs {
    470	__u32 lost_msgs;
    471};
    472
    473/**
    474 * struct cec_event - CEC event structure
    475 * @ts: the timestamp of when the event was sent.
    476 * @event: the event.
    477 * @flags: event flags.
    478 * @state_change: the event payload for CEC_EVENT_STATE_CHANGE.
    479 * @lost_msgs: the event payload for CEC_EVENT_LOST_MSGS.
    480 * @raw: array to pad the union.
    481 */
    482struct cec_event {
    483	__u64 ts;
    484	__u32 event;
    485	__u32 flags;
    486	union {
    487		struct cec_event_state_change state_change;
    488		struct cec_event_lost_msgs lost_msgs;
    489		__u32 raw[16];
    490	};
    491};
    492
    493/* ioctls */
    494
    495/* Adapter capabilities */
    496#define CEC_ADAP_G_CAPS		_IOWR('a',  0, struct cec_caps)
    497
    498/*
    499 * phys_addr is either 0 (if this is the CEC root device)
    500 * or a valid physical address obtained from the sink's EDID
    501 * as read by this CEC device (if this is a source device)
    502 * or a physical address obtained and modified from a sink
    503 * EDID and used for a sink CEC device.
    504 * If nothing is connected, then phys_addr is 0xffff.
    505 * See HDMI 1.4b, section 8.7 (Physical Address).
    506 *
    507 * The CEC_ADAP_S_PHYS_ADDR ioctl may not be available if that is handled
    508 * internally.
    509 */
    510#define CEC_ADAP_G_PHYS_ADDR	_IOR('a',  1, __u16)
    511#define CEC_ADAP_S_PHYS_ADDR	_IOW('a',  2, __u16)
    512
    513/*
    514 * Configure the CEC adapter. It sets the device type and which
    515 * logical types it will try to claim. It will return which
    516 * logical addresses it could actually claim.
    517 * An error is returned if the adapter is disabled or if there
    518 * is no physical address assigned.
    519 */
    520
    521#define CEC_ADAP_G_LOG_ADDRS	_IOR('a',  3, struct cec_log_addrs)
    522#define CEC_ADAP_S_LOG_ADDRS	_IOWR('a',  4, struct cec_log_addrs)
    523
    524/* Transmit/receive a CEC command */
    525#define CEC_TRANSMIT		_IOWR('a',  5, struct cec_msg)
    526#define CEC_RECEIVE		_IOWR('a',  6, struct cec_msg)
    527
    528/* Dequeue CEC events */
    529#define CEC_DQEVENT		_IOWR('a',  7, struct cec_event)
    530
    531/*
    532 * Get and set the message handling mode for this filehandle.
    533 */
    534#define CEC_G_MODE		_IOR('a',  8, __u32)
    535#define CEC_S_MODE		_IOW('a',  9, __u32)
    536
    537/* Get the connector info */
    538#define CEC_ADAP_G_CONNECTOR_INFO _IOR('a',  10, struct cec_connector_info)
    539
    540/*
    541 * The remainder of this header defines all CEC messages and operands.
    542 * The format matters since it the cec-ctl utility parses it to generate
    543 * code for implementing all these messages.
    544 *
    545 * Comments ending with 'Feature' group messages for each feature.
    546 * If messages are part of multiple features, then the "Has also"
    547 * comment is used to list the previously defined messages that are
    548 * supported by the feature.
    549 *
    550 * Before operands are defined a comment is added that gives the
    551 * name of the operand and in brackets the variable name of the
    552 * corresponding argument in the cec-funcs.h function.
    553 */
    554
    555/* Messages */
    556
    557/* One Touch Play Feature */
    558#define CEC_MSG_ACTIVE_SOURCE				0x82
    559#define CEC_MSG_IMAGE_VIEW_ON				0x04
    560#define CEC_MSG_TEXT_VIEW_ON				0x0d
    561
    562
    563/* Routing Control Feature */
    564
    565/*
    566 * Has also:
    567 *	CEC_MSG_ACTIVE_SOURCE
    568 */
    569
    570#define CEC_MSG_INACTIVE_SOURCE				0x9d
    571#define CEC_MSG_REQUEST_ACTIVE_SOURCE			0x85
    572#define CEC_MSG_ROUTING_CHANGE				0x80
    573#define CEC_MSG_ROUTING_INFORMATION			0x81
    574#define CEC_MSG_SET_STREAM_PATH				0x86
    575
    576
    577/* Standby Feature */
    578#define CEC_MSG_STANDBY					0x36
    579
    580
    581/* One Touch Record Feature */
    582#define CEC_MSG_RECORD_OFF				0x0b
    583#define CEC_MSG_RECORD_ON				0x09
    584/* Record Source Type Operand (rec_src_type) */
    585#define CEC_OP_RECORD_SRC_OWN				1
    586#define CEC_OP_RECORD_SRC_DIGITAL			2
    587#define CEC_OP_RECORD_SRC_ANALOG			3
    588#define CEC_OP_RECORD_SRC_EXT_PLUG			4
    589#define CEC_OP_RECORD_SRC_EXT_PHYS_ADDR			5
    590/* Service Identification Method Operand (service_id_method) */
    591#define CEC_OP_SERVICE_ID_METHOD_BY_DIG_ID		0
    592#define CEC_OP_SERVICE_ID_METHOD_BY_CHANNEL		1
    593/* Digital Service Broadcast System Operand (dig_bcast_system) */
    594#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_GEN	0x00
    595#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_GEN	0x01
    596#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_GEN		0x02
    597#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_BS		0x08
    598#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_CS		0x09
    599#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ARIB_T		0x0a
    600#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_CABLE	0x10
    601#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_SAT	0x11
    602#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_ATSC_T		0x12
    603#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_C		0x18
    604#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S		0x19
    605#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_S2		0x1a
    606#define CEC_OP_DIG_SERVICE_BCAST_SYSTEM_DVB_T		0x1b
    607/* Analogue Broadcast Type Operand (ana_bcast_type) */
    608#define CEC_OP_ANA_BCAST_TYPE_CABLE			0
    609#define CEC_OP_ANA_BCAST_TYPE_SATELLITE			1
    610#define CEC_OP_ANA_BCAST_TYPE_TERRESTRIAL		2
    611/* Broadcast System Operand (bcast_system) */
    612#define CEC_OP_BCAST_SYSTEM_PAL_BG			0x00
    613#define CEC_OP_BCAST_SYSTEM_SECAM_LQ			0x01 /* SECAM L' */
    614#define CEC_OP_BCAST_SYSTEM_PAL_M			0x02
    615#define CEC_OP_BCAST_SYSTEM_NTSC_M			0x03
    616#define CEC_OP_BCAST_SYSTEM_PAL_I			0x04
    617#define CEC_OP_BCAST_SYSTEM_SECAM_DK			0x05
    618#define CEC_OP_BCAST_SYSTEM_SECAM_BG			0x06
    619#define CEC_OP_BCAST_SYSTEM_SECAM_L			0x07
    620#define CEC_OP_BCAST_SYSTEM_PAL_DK			0x08
    621#define CEC_OP_BCAST_SYSTEM_OTHER			0x1f
    622/* Channel Number Format Operand (channel_number_fmt) */
    623#define CEC_OP_CHANNEL_NUMBER_FMT_1_PART		0x01
    624#define CEC_OP_CHANNEL_NUMBER_FMT_2_PART		0x02
    625
    626#define CEC_MSG_RECORD_STATUS				0x0a
    627/* Record Status Operand (rec_status) */
    628#define CEC_OP_RECORD_STATUS_CUR_SRC			0x01
    629#define CEC_OP_RECORD_STATUS_DIG_SERVICE		0x02
    630#define CEC_OP_RECORD_STATUS_ANA_SERVICE		0x03
    631#define CEC_OP_RECORD_STATUS_EXT_INPUT			0x04
    632#define CEC_OP_RECORD_STATUS_NO_DIG_SERVICE		0x05
    633#define CEC_OP_RECORD_STATUS_NO_ANA_SERVICE		0x06
    634#define CEC_OP_RECORD_STATUS_NO_SERVICE			0x07
    635#define CEC_OP_RECORD_STATUS_INVALID_EXT_PLUG		0x09
    636#define CEC_OP_RECORD_STATUS_INVALID_EXT_PHYS_ADDR	0x0a
    637#define CEC_OP_RECORD_STATUS_UNSUP_CA			0x0b
    638#define CEC_OP_RECORD_STATUS_NO_CA_ENTITLEMENTS		0x0c
    639#define CEC_OP_RECORD_STATUS_CANT_COPY_SRC		0x0d
    640#define CEC_OP_RECORD_STATUS_NO_MORE_COPIES		0x0e
    641#define CEC_OP_RECORD_STATUS_NO_MEDIA			0x10
    642#define CEC_OP_RECORD_STATUS_PLAYING			0x11
    643#define CEC_OP_RECORD_STATUS_ALREADY_RECORDING		0x12
    644#define CEC_OP_RECORD_STATUS_MEDIA_PROT			0x13
    645#define CEC_OP_RECORD_STATUS_NO_SIGNAL			0x14
    646#define CEC_OP_RECORD_STATUS_MEDIA_PROBLEM		0x15
    647#define CEC_OP_RECORD_STATUS_NO_SPACE			0x16
    648#define CEC_OP_RECORD_STATUS_PARENTAL_LOCK		0x17
    649#define CEC_OP_RECORD_STATUS_TERMINATED_OK		0x1a
    650#define CEC_OP_RECORD_STATUS_ALREADY_TERM		0x1b
    651#define CEC_OP_RECORD_STATUS_OTHER			0x1f
    652
    653#define CEC_MSG_RECORD_TV_SCREEN			0x0f
    654
    655
    656/* Timer Programming Feature */
    657#define CEC_MSG_CLEAR_ANALOGUE_TIMER			0x33
    658/* Recording Sequence Operand (recording_seq) */
    659#define CEC_OP_REC_SEQ_SUNDAY				0x01
    660#define CEC_OP_REC_SEQ_MONDAY				0x02
    661#define CEC_OP_REC_SEQ_TUESDAY				0x04
    662#define CEC_OP_REC_SEQ_WEDNESDAY			0x08
    663#define CEC_OP_REC_SEQ_THURSDAY				0x10
    664#define CEC_OP_REC_SEQ_FRIDAY				0x20
    665#define CEC_OP_REC_SEQ_SATURDAY				0x40
    666#define CEC_OP_REC_SEQ_ONCE_ONLY			0x00
    667
    668#define CEC_MSG_CLEAR_DIGITAL_TIMER			0x99
    669
    670#define CEC_MSG_CLEAR_EXT_TIMER				0xa1
    671/* External Source Specifier Operand (ext_src_spec) */
    672#define CEC_OP_EXT_SRC_PLUG				0x04
    673#define CEC_OP_EXT_SRC_PHYS_ADDR			0x05
    674
    675#define CEC_MSG_SET_ANALOGUE_TIMER			0x34
    676#define CEC_MSG_SET_DIGITAL_TIMER			0x97
    677#define CEC_MSG_SET_EXT_TIMER				0xa2
    678
    679#define CEC_MSG_SET_TIMER_PROGRAM_TITLE			0x67
    680#define CEC_MSG_TIMER_CLEARED_STATUS			0x43
    681/* Timer Cleared Status Data Operand (timer_cleared_status) */
    682#define CEC_OP_TIMER_CLR_STAT_RECORDING			0x00
    683#define CEC_OP_TIMER_CLR_STAT_NO_MATCHING		0x01
    684#define CEC_OP_TIMER_CLR_STAT_NO_INFO			0x02
    685#define CEC_OP_TIMER_CLR_STAT_CLEARED			0x80
    686
    687#define CEC_MSG_TIMER_STATUS				0x35
    688/* Timer Overlap Warning Operand (timer_overlap_warning) */
    689#define CEC_OP_TIMER_OVERLAP_WARNING_NO_OVERLAP		0
    690#define CEC_OP_TIMER_OVERLAP_WARNING_OVERLAP		1
    691/* Media Info Operand (media_info) */
    692#define CEC_OP_MEDIA_INFO_UNPROT_MEDIA			0
    693#define CEC_OP_MEDIA_INFO_PROT_MEDIA			1
    694#define CEC_OP_MEDIA_INFO_NO_MEDIA			2
    695/* Programmed Indicator Operand (prog_indicator) */
    696#define CEC_OP_PROG_IND_NOT_PROGRAMMED			0
    697#define CEC_OP_PROG_IND_PROGRAMMED			1
    698/* Programmed Info Operand (prog_info) */
    699#define CEC_OP_PROG_INFO_ENOUGH_SPACE			0x08
    700#define CEC_OP_PROG_INFO_NOT_ENOUGH_SPACE		0x09
    701#define CEC_OP_PROG_INFO_MIGHT_NOT_BE_ENOUGH_SPACE	0x0b
    702#define CEC_OP_PROG_INFO_NONE_AVAILABLE			0x0a
    703/* Not Programmed Error Info Operand (prog_error) */
    704#define CEC_OP_PROG_ERROR_NO_FREE_TIMER			0x01
    705#define CEC_OP_PROG_ERROR_DATE_OUT_OF_RANGE		0x02
    706#define CEC_OP_PROG_ERROR_REC_SEQ_ERROR			0x03
    707#define CEC_OP_PROG_ERROR_INV_EXT_PLUG			0x04
    708#define CEC_OP_PROG_ERROR_INV_EXT_PHYS_ADDR		0x05
    709#define CEC_OP_PROG_ERROR_CA_UNSUPP			0x06
    710#define CEC_OP_PROG_ERROR_INSUF_CA_ENTITLEMENTS		0x07
    711#define CEC_OP_PROG_ERROR_RESOLUTION_UNSUPP		0x08
    712#define CEC_OP_PROG_ERROR_PARENTAL_LOCK			0x09
    713#define CEC_OP_PROG_ERROR_CLOCK_FAILURE			0x0a
    714#define CEC_OP_PROG_ERROR_DUPLICATE			0x0e
    715
    716
    717/* System Information Feature */
    718#define CEC_MSG_CEC_VERSION				0x9e
    719/* CEC Version Operand (cec_version) */
    720#define CEC_OP_CEC_VERSION_1_3A				4
    721#define CEC_OP_CEC_VERSION_1_4				5
    722#define CEC_OP_CEC_VERSION_2_0				6
    723
    724#define CEC_MSG_GET_CEC_VERSION				0x9f
    725#define CEC_MSG_GIVE_PHYSICAL_ADDR			0x83
    726#define CEC_MSG_GET_MENU_LANGUAGE			0x91
    727#define CEC_MSG_REPORT_PHYSICAL_ADDR			0x84
    728/* Primary Device Type Operand (prim_devtype) */
    729#define CEC_OP_PRIM_DEVTYPE_TV				0
    730#define CEC_OP_PRIM_DEVTYPE_RECORD			1
    731#define CEC_OP_PRIM_DEVTYPE_TUNER			3
    732#define CEC_OP_PRIM_DEVTYPE_PLAYBACK			4
    733#define CEC_OP_PRIM_DEVTYPE_AUDIOSYSTEM			5
    734#define CEC_OP_PRIM_DEVTYPE_SWITCH			6
    735#define CEC_OP_PRIM_DEVTYPE_PROCESSOR			7
    736
    737#define CEC_MSG_SET_MENU_LANGUAGE			0x32
    738#define CEC_MSG_REPORT_FEATURES				0xa6	/* HDMI 2.0 */
    739/* All Device Types Operand (all_device_types) */
    740#define CEC_OP_ALL_DEVTYPE_TV				0x80
    741#define CEC_OP_ALL_DEVTYPE_RECORD			0x40
    742#define CEC_OP_ALL_DEVTYPE_TUNER			0x20
    743#define CEC_OP_ALL_DEVTYPE_PLAYBACK			0x10
    744#define CEC_OP_ALL_DEVTYPE_AUDIOSYSTEM			0x08
    745#define CEC_OP_ALL_DEVTYPE_SWITCH			0x04
    746/*
    747 * And if you wondering what happened to PROCESSOR devices: those should
    748 * be mapped to a SWITCH.
    749 */
    750
    751/* Valid for RC Profile and Device Feature operands */
    752#define CEC_OP_FEAT_EXT					0x80	/* Extension bit */
    753/* RC Profile Operand (rc_profile) */
    754#define CEC_OP_FEAT_RC_TV_PROFILE_NONE			0x00
    755#define CEC_OP_FEAT_RC_TV_PROFILE_1			0x02
    756#define CEC_OP_FEAT_RC_TV_PROFILE_2			0x06
    757#define CEC_OP_FEAT_RC_TV_PROFILE_3			0x0a
    758#define CEC_OP_FEAT_RC_TV_PROFILE_4			0x0e
    759#define CEC_OP_FEAT_RC_SRC_HAS_DEV_ROOT_MENU		0x50
    760#define CEC_OP_FEAT_RC_SRC_HAS_DEV_SETUP_MENU		0x48
    761#define CEC_OP_FEAT_RC_SRC_HAS_CONTENTS_MENU		0x44
    762#define CEC_OP_FEAT_RC_SRC_HAS_MEDIA_TOP_MENU		0x42
    763#define CEC_OP_FEAT_RC_SRC_HAS_MEDIA_CONTEXT_MENU	0x41
    764/* Device Feature Operand (dev_features) */
    765#define CEC_OP_FEAT_DEV_HAS_RECORD_TV_SCREEN		0x40
    766#define CEC_OP_FEAT_DEV_HAS_SET_OSD_STRING		0x20
    767#define CEC_OP_FEAT_DEV_HAS_DECK_CONTROL		0x10
    768#define CEC_OP_FEAT_DEV_HAS_SET_AUDIO_RATE		0x08
    769#define CEC_OP_FEAT_DEV_SINK_HAS_ARC_TX			0x04
    770#define CEC_OP_FEAT_DEV_SOURCE_HAS_ARC_RX		0x02
    771
    772#define CEC_MSG_GIVE_FEATURES				0xa5	/* HDMI 2.0 */
    773
    774
    775/* Deck Control Feature */
    776#define CEC_MSG_DECK_CONTROL				0x42
    777/* Deck Control Mode Operand (deck_control_mode) */
    778#define CEC_OP_DECK_CTL_MODE_SKIP_FWD			1
    779#define CEC_OP_DECK_CTL_MODE_SKIP_REV			2
    780#define CEC_OP_DECK_CTL_MODE_STOP			3
    781#define CEC_OP_DECK_CTL_MODE_EJECT			4
    782
    783#define CEC_MSG_DECK_STATUS				0x1b
    784/* Deck Info Operand (deck_info) */
    785#define CEC_OP_DECK_INFO_PLAY				0x11
    786#define CEC_OP_DECK_INFO_RECORD				0x12
    787#define CEC_OP_DECK_INFO_PLAY_REV			0x13
    788#define CEC_OP_DECK_INFO_STILL				0x14
    789#define CEC_OP_DECK_INFO_SLOW				0x15
    790#define CEC_OP_DECK_INFO_SLOW_REV			0x16
    791#define CEC_OP_DECK_INFO_FAST_FWD			0x17
    792#define CEC_OP_DECK_INFO_FAST_REV			0x18
    793#define CEC_OP_DECK_INFO_NO_MEDIA			0x19
    794#define CEC_OP_DECK_INFO_STOP				0x1a
    795#define CEC_OP_DECK_INFO_SKIP_FWD			0x1b
    796#define CEC_OP_DECK_INFO_SKIP_REV			0x1c
    797#define CEC_OP_DECK_INFO_INDEX_SEARCH_FWD		0x1d
    798#define CEC_OP_DECK_INFO_INDEX_SEARCH_REV		0x1e
    799#define CEC_OP_DECK_INFO_OTHER				0x1f
    800
    801#define CEC_MSG_GIVE_DECK_STATUS			0x1a
    802/* Status Request Operand (status_req) */
    803#define CEC_OP_STATUS_REQ_ON				1
    804#define CEC_OP_STATUS_REQ_OFF				2
    805#define CEC_OP_STATUS_REQ_ONCE				3
    806
    807#define CEC_MSG_PLAY					0x41
    808/* Play Mode Operand (play_mode) */
    809#define CEC_OP_PLAY_MODE_PLAY_FWD			0x24
    810#define CEC_OP_PLAY_MODE_PLAY_REV			0x20
    811#define CEC_OP_PLAY_MODE_PLAY_STILL			0x25
    812#define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MIN		0x05
    813#define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MED		0x06
    814#define CEC_OP_PLAY_MODE_PLAY_FAST_FWD_MAX		0x07
    815#define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MIN		0x09
    816#define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MED		0x0a
    817#define CEC_OP_PLAY_MODE_PLAY_FAST_REV_MAX		0x0b
    818#define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MIN		0x15
    819#define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MED		0x16
    820#define CEC_OP_PLAY_MODE_PLAY_SLOW_FWD_MAX		0x17
    821#define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MIN		0x19
    822#define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MED		0x1a
    823#define CEC_OP_PLAY_MODE_PLAY_SLOW_REV_MAX		0x1b
    824
    825
    826/* Tuner Control Feature */
    827#define CEC_MSG_GIVE_TUNER_DEVICE_STATUS		0x08
    828#define CEC_MSG_SELECT_ANALOGUE_SERVICE			0x92
    829#define CEC_MSG_SELECT_DIGITAL_SERVICE			0x93
    830#define CEC_MSG_TUNER_DEVICE_STATUS			0x07
    831/* Recording Flag Operand (rec_flag) */
    832#define CEC_OP_REC_FLAG_NOT_USED			0
    833#define CEC_OP_REC_FLAG_USED				1
    834/* Tuner Display Info Operand (tuner_display_info) */
    835#define CEC_OP_TUNER_DISPLAY_INFO_DIGITAL		0
    836#define CEC_OP_TUNER_DISPLAY_INFO_NONE			1
    837#define CEC_OP_TUNER_DISPLAY_INFO_ANALOGUE		2
    838
    839#define CEC_MSG_TUNER_STEP_DECREMENT			0x06
    840#define CEC_MSG_TUNER_STEP_INCREMENT			0x05
    841
    842
    843/* Vendor Specific Commands Feature */
    844
    845/*
    846 * Has also:
    847 *	CEC_MSG_CEC_VERSION
    848 *	CEC_MSG_GET_CEC_VERSION
    849 */
    850#define CEC_MSG_DEVICE_VENDOR_ID			0x87
    851#define CEC_MSG_GIVE_DEVICE_VENDOR_ID			0x8c
    852#define CEC_MSG_VENDOR_COMMAND				0x89
    853#define CEC_MSG_VENDOR_COMMAND_WITH_ID			0xa0
    854#define CEC_MSG_VENDOR_REMOTE_BUTTON_DOWN		0x8a
    855#define CEC_MSG_VENDOR_REMOTE_BUTTON_UP			0x8b
    856
    857
    858/* OSD Display Feature */
    859#define CEC_MSG_SET_OSD_STRING				0x64
    860/* Display Control Operand (disp_ctl) */
    861#define CEC_OP_DISP_CTL_DEFAULT				0x00
    862#define CEC_OP_DISP_CTL_UNTIL_CLEARED			0x40
    863#define CEC_OP_DISP_CTL_CLEAR				0x80
    864
    865
    866/* Device OSD Transfer Feature */
    867#define CEC_MSG_GIVE_OSD_NAME				0x46
    868#define CEC_MSG_SET_OSD_NAME				0x47
    869
    870
    871/* Device Menu Control Feature */
    872#define CEC_MSG_MENU_REQUEST				0x8d
    873/* Menu Request Type Operand (menu_req) */
    874#define CEC_OP_MENU_REQUEST_ACTIVATE			0x00
    875#define CEC_OP_MENU_REQUEST_DEACTIVATE			0x01
    876#define CEC_OP_MENU_REQUEST_QUERY			0x02
    877
    878#define CEC_MSG_MENU_STATUS				0x8e
    879/* Menu State Operand (menu_state) */
    880#define CEC_OP_MENU_STATE_ACTIVATED			0x00
    881#define CEC_OP_MENU_STATE_DEACTIVATED			0x01
    882
    883#define CEC_MSG_USER_CONTROL_PRESSED			0x44
    884/* UI Command Operand (ui_cmd) */
    885#define CEC_OP_UI_CMD_SELECT				0x00
    886#define CEC_OP_UI_CMD_UP				0x01
    887#define CEC_OP_UI_CMD_DOWN				0x02
    888#define CEC_OP_UI_CMD_LEFT				0x03
    889#define CEC_OP_UI_CMD_RIGHT				0x04
    890#define CEC_OP_UI_CMD_RIGHT_UP				0x05
    891#define CEC_OP_UI_CMD_RIGHT_DOWN			0x06
    892#define CEC_OP_UI_CMD_LEFT_UP				0x07
    893#define CEC_OP_UI_CMD_LEFT_DOWN				0x08
    894#define CEC_OP_UI_CMD_DEVICE_ROOT_MENU			0x09
    895#define CEC_OP_UI_CMD_DEVICE_SETUP_MENU			0x0a
    896#define CEC_OP_UI_CMD_CONTENTS_MENU			0x0b
    897#define CEC_OP_UI_CMD_FAVORITE_MENU			0x0c
    898#define CEC_OP_UI_CMD_BACK				0x0d
    899#define CEC_OP_UI_CMD_MEDIA_TOP_MENU			0x10
    900#define CEC_OP_UI_CMD_MEDIA_CONTEXT_SENSITIVE_MENU	0x11
    901#define CEC_OP_UI_CMD_NUMBER_ENTRY_MODE			0x1d
    902#define CEC_OP_UI_CMD_NUMBER_11				0x1e
    903#define CEC_OP_UI_CMD_NUMBER_12				0x1f
    904#define CEC_OP_UI_CMD_NUMBER_0_OR_NUMBER_10		0x20
    905#define CEC_OP_UI_CMD_NUMBER_1				0x21
    906#define CEC_OP_UI_CMD_NUMBER_2				0x22
    907#define CEC_OP_UI_CMD_NUMBER_3				0x23
    908#define CEC_OP_UI_CMD_NUMBER_4				0x24
    909#define CEC_OP_UI_CMD_NUMBER_5				0x25
    910#define CEC_OP_UI_CMD_NUMBER_6				0x26
    911#define CEC_OP_UI_CMD_NUMBER_7				0x27
    912#define CEC_OP_UI_CMD_NUMBER_8				0x28
    913#define CEC_OP_UI_CMD_NUMBER_9				0x29
    914#define CEC_OP_UI_CMD_DOT				0x2a
    915#define CEC_OP_UI_CMD_ENTER				0x2b
    916#define CEC_OP_UI_CMD_CLEAR				0x2c
    917#define CEC_OP_UI_CMD_NEXT_FAVORITE			0x2f
    918#define CEC_OP_UI_CMD_CHANNEL_UP			0x30
    919#define CEC_OP_UI_CMD_CHANNEL_DOWN			0x31
    920#define CEC_OP_UI_CMD_PREVIOUS_CHANNEL			0x32
    921#define CEC_OP_UI_CMD_SOUND_SELECT			0x33
    922#define CEC_OP_UI_CMD_INPUT_SELECT			0x34
    923#define CEC_OP_UI_CMD_DISPLAY_INFORMATION		0x35
    924#define CEC_OP_UI_CMD_HELP				0x36
    925#define CEC_OP_UI_CMD_PAGE_UP				0x37
    926#define CEC_OP_UI_CMD_PAGE_DOWN				0x38
    927#define CEC_OP_UI_CMD_POWER				0x40
    928#define CEC_OP_UI_CMD_VOLUME_UP				0x41
    929#define CEC_OP_UI_CMD_VOLUME_DOWN			0x42
    930#define CEC_OP_UI_CMD_MUTE				0x43
    931#define CEC_OP_UI_CMD_PLAY				0x44
    932#define CEC_OP_UI_CMD_STOP				0x45
    933#define CEC_OP_UI_CMD_PAUSE				0x46
    934#define CEC_OP_UI_CMD_RECORD				0x47
    935#define CEC_OP_UI_CMD_REWIND				0x48
    936#define CEC_OP_UI_CMD_FAST_FORWARD			0x49
    937#define CEC_OP_UI_CMD_EJECT				0x4a
    938#define CEC_OP_UI_CMD_SKIP_FORWARD			0x4b
    939#define CEC_OP_UI_CMD_SKIP_BACKWARD			0x4c
    940#define CEC_OP_UI_CMD_STOP_RECORD			0x4d
    941#define CEC_OP_UI_CMD_PAUSE_RECORD			0x4e
    942#define CEC_OP_UI_CMD_ANGLE				0x50
    943#define CEC_OP_UI_CMD_SUB_PICTURE			0x51
    944#define CEC_OP_UI_CMD_VIDEO_ON_DEMAND			0x52
    945#define CEC_OP_UI_CMD_ELECTRONIC_PROGRAM_GUIDE		0x53
    946#define CEC_OP_UI_CMD_TIMER_PROGRAMMING			0x54
    947#define CEC_OP_UI_CMD_INITIAL_CONFIGURATION		0x55
    948#define CEC_OP_UI_CMD_SELECT_BROADCAST_TYPE		0x56
    949#define CEC_OP_UI_CMD_SELECT_SOUND_PRESENTATION		0x57
    950#define CEC_OP_UI_CMD_AUDIO_DESCRIPTION			0x58
    951#define CEC_OP_UI_CMD_INTERNET				0x59
    952#define CEC_OP_UI_CMD_3D_MODE				0x5a
    953#define CEC_OP_UI_CMD_PLAY_FUNCTION			0x60
    954#define CEC_OP_UI_CMD_PAUSE_PLAY_FUNCTION		0x61
    955#define CEC_OP_UI_CMD_RECORD_FUNCTION			0x62
    956#define CEC_OP_UI_CMD_PAUSE_RECORD_FUNCTION		0x63
    957#define CEC_OP_UI_CMD_STOP_FUNCTION			0x64
    958#define CEC_OP_UI_CMD_MUTE_FUNCTION			0x65
    959#define CEC_OP_UI_CMD_RESTORE_VOLUME_FUNCTION		0x66
    960#define CEC_OP_UI_CMD_TUNE_FUNCTION			0x67
    961#define CEC_OP_UI_CMD_SELECT_MEDIA_FUNCTION		0x68
    962#define CEC_OP_UI_CMD_SELECT_AV_INPUT_FUNCTION		0x69
    963#define CEC_OP_UI_CMD_SELECT_AUDIO_INPUT_FUNCTION	0x6a
    964#define CEC_OP_UI_CMD_POWER_TOGGLE_FUNCTION		0x6b
    965#define CEC_OP_UI_CMD_POWER_OFF_FUNCTION		0x6c
    966#define CEC_OP_UI_CMD_POWER_ON_FUNCTION			0x6d
    967#define CEC_OP_UI_CMD_F1_BLUE				0x71
    968#define CEC_OP_UI_CMD_F2_RED				0x72
    969#define CEC_OP_UI_CMD_F3_GREEN				0x73
    970#define CEC_OP_UI_CMD_F4_YELLOW				0x74
    971#define CEC_OP_UI_CMD_F5				0x75
    972#define CEC_OP_UI_CMD_DATA				0x76
    973/* UI Broadcast Type Operand (ui_bcast_type) */
    974#define CEC_OP_UI_BCAST_TYPE_TOGGLE_ALL			0x00
    975#define CEC_OP_UI_BCAST_TYPE_TOGGLE_DIG_ANA		0x01
    976#define CEC_OP_UI_BCAST_TYPE_ANALOGUE			0x10
    977#define CEC_OP_UI_BCAST_TYPE_ANALOGUE_T			0x20
    978#define CEC_OP_UI_BCAST_TYPE_ANALOGUE_CABLE		0x30
    979#define CEC_OP_UI_BCAST_TYPE_ANALOGUE_SAT		0x40
    980#define CEC_OP_UI_BCAST_TYPE_DIGITAL			0x50
    981#define CEC_OP_UI_BCAST_TYPE_DIGITAL_T			0x60
    982#define CEC_OP_UI_BCAST_TYPE_DIGITAL_CABLE		0x70
    983#define CEC_OP_UI_BCAST_TYPE_DIGITAL_SAT		0x80
    984#define CEC_OP_UI_BCAST_TYPE_DIGITAL_COM_SAT		0x90
    985#define CEC_OP_UI_BCAST_TYPE_DIGITAL_COM_SAT2		0x91
    986#define CEC_OP_UI_BCAST_TYPE_IP				0xa0
    987/* UI Sound Presentation Control Operand (ui_snd_pres_ctl) */
    988#define CEC_OP_UI_SND_PRES_CTL_DUAL_MONO		0x10
    989#define CEC_OP_UI_SND_PRES_CTL_KARAOKE			0x20
    990#define CEC_OP_UI_SND_PRES_CTL_DOWNMIX			0x80
    991#define CEC_OP_UI_SND_PRES_CTL_REVERB			0x90
    992#define CEC_OP_UI_SND_PRES_CTL_EQUALIZER		0xa0
    993#define CEC_OP_UI_SND_PRES_CTL_BASS_UP			0xb1
    994#define CEC_OP_UI_SND_PRES_CTL_BASS_NEUTRAL		0xb2
    995#define CEC_OP_UI_SND_PRES_CTL_BASS_DOWN		0xb3
    996#define CEC_OP_UI_SND_PRES_CTL_TREBLE_UP		0xc1
    997#define CEC_OP_UI_SND_PRES_CTL_TREBLE_NEUTRAL		0xc2
    998#define CEC_OP_UI_SND_PRES_CTL_TREBLE_DOWN		0xc3
    999
   1000#define CEC_MSG_USER_CONTROL_RELEASED			0x45
   1001
   1002
   1003/* Remote Control Passthrough Feature */
   1004
   1005/*
   1006 * Has also:
   1007 *	CEC_MSG_USER_CONTROL_PRESSED
   1008 *	CEC_MSG_USER_CONTROL_RELEASED
   1009 */
   1010
   1011
   1012/* Power Status Feature */
   1013#define CEC_MSG_GIVE_DEVICE_POWER_STATUS		0x8f
   1014#define CEC_MSG_REPORT_POWER_STATUS			0x90
   1015/* Power Status Operand (pwr_state) */
   1016#define CEC_OP_POWER_STATUS_ON				0
   1017#define CEC_OP_POWER_STATUS_STANDBY			1
   1018#define CEC_OP_POWER_STATUS_TO_ON			2
   1019#define CEC_OP_POWER_STATUS_TO_STANDBY			3
   1020
   1021
   1022/* General Protocol Messages */
   1023#define CEC_MSG_FEATURE_ABORT				0x00
   1024/* Abort Reason Operand (reason) */
   1025#define CEC_OP_ABORT_UNRECOGNIZED_OP			0
   1026#define CEC_OP_ABORT_INCORRECT_MODE			1
   1027#define CEC_OP_ABORT_NO_SOURCE				2
   1028#define CEC_OP_ABORT_INVALID_OP				3
   1029#define CEC_OP_ABORT_REFUSED				4
   1030#define CEC_OP_ABORT_UNDETERMINED			5
   1031
   1032#define CEC_MSG_ABORT					0xff
   1033
   1034
   1035/* System Audio Control Feature */
   1036
   1037/*
   1038 * Has also:
   1039 *	CEC_MSG_USER_CONTROL_PRESSED
   1040 *	CEC_MSG_USER_CONTROL_RELEASED
   1041 */
   1042#define CEC_MSG_GIVE_AUDIO_STATUS			0x71
   1043#define CEC_MSG_GIVE_SYSTEM_AUDIO_MODE_STATUS		0x7d
   1044#define CEC_MSG_REPORT_AUDIO_STATUS			0x7a
   1045/* Audio Mute Status Operand (aud_mute_status) */
   1046#define CEC_OP_AUD_MUTE_STATUS_OFF			0
   1047#define CEC_OP_AUD_MUTE_STATUS_ON			1
   1048
   1049#define CEC_MSG_REPORT_SHORT_AUDIO_DESCRIPTOR		0xa3
   1050#define CEC_MSG_REQUEST_SHORT_AUDIO_DESCRIPTOR		0xa4
   1051#define CEC_MSG_SET_SYSTEM_AUDIO_MODE			0x72
   1052/* System Audio Status Operand (sys_aud_status) */
   1053#define CEC_OP_SYS_AUD_STATUS_OFF			0
   1054#define CEC_OP_SYS_AUD_STATUS_ON			1
   1055
   1056#define CEC_MSG_SYSTEM_AUDIO_MODE_REQUEST		0x70
   1057#define CEC_MSG_SYSTEM_AUDIO_MODE_STATUS		0x7e
   1058/* Audio Format ID Operand (audio_format_id) */
   1059#define CEC_OP_AUD_FMT_ID_CEA861			0
   1060#define CEC_OP_AUD_FMT_ID_CEA861_CXT			1
   1061
   1062
   1063/* Audio Rate Control Feature */
   1064#define CEC_MSG_SET_AUDIO_RATE				0x9a
   1065/* Audio Rate Operand (audio_rate) */
   1066#define CEC_OP_AUD_RATE_OFF				0
   1067#define CEC_OP_AUD_RATE_WIDE_STD			1
   1068#define CEC_OP_AUD_RATE_WIDE_FAST			2
   1069#define CEC_OP_AUD_RATE_WIDE_SLOW			3
   1070#define CEC_OP_AUD_RATE_NARROW_STD			4
   1071#define CEC_OP_AUD_RATE_NARROW_FAST			5
   1072#define CEC_OP_AUD_RATE_NARROW_SLOW			6
   1073
   1074
   1075/* Audio Return Channel Control Feature */
   1076#define CEC_MSG_INITIATE_ARC				0xc0
   1077#define CEC_MSG_REPORT_ARC_INITIATED			0xc1
   1078#define CEC_MSG_REPORT_ARC_TERMINATED			0xc2
   1079#define CEC_MSG_REQUEST_ARC_INITIATION			0xc3
   1080#define CEC_MSG_REQUEST_ARC_TERMINATION			0xc4
   1081#define CEC_MSG_TERMINATE_ARC				0xc5
   1082
   1083
   1084/* Dynamic Audio Lipsync Feature */
   1085/* Only for CEC 2.0 and up */
   1086#define CEC_MSG_REQUEST_CURRENT_LATENCY			0xa7
   1087#define CEC_MSG_REPORT_CURRENT_LATENCY			0xa8
   1088/* Low Latency Mode Operand (low_latency_mode) */
   1089#define CEC_OP_LOW_LATENCY_MODE_OFF			0
   1090#define CEC_OP_LOW_LATENCY_MODE_ON			1
   1091/* Audio Output Compensated Operand (audio_out_compensated) */
   1092#define CEC_OP_AUD_OUT_COMPENSATED_NA			0
   1093#define CEC_OP_AUD_OUT_COMPENSATED_DELAY		1
   1094#define CEC_OP_AUD_OUT_COMPENSATED_NO_DELAY		2
   1095#define CEC_OP_AUD_OUT_COMPENSATED_PARTIAL_DELAY	3
   1096
   1097
   1098/* Capability Discovery and Control Feature */
   1099#define CEC_MSG_CDC_MESSAGE				0xf8
   1100/* Ethernet-over-HDMI: nobody ever does this... */
   1101#define CEC_MSG_CDC_HEC_INQUIRE_STATE			0x00
   1102#define CEC_MSG_CDC_HEC_REPORT_STATE			0x01
   1103/* HEC Functionality State Operand (hec_func_state) */
   1104#define CEC_OP_HEC_FUNC_STATE_NOT_SUPPORTED		0
   1105#define CEC_OP_HEC_FUNC_STATE_INACTIVE			1
   1106#define CEC_OP_HEC_FUNC_STATE_ACTIVE			2
   1107#define CEC_OP_HEC_FUNC_STATE_ACTIVATION_FIELD		3
   1108/* Host Functionality State Operand (host_func_state) */
   1109#define CEC_OP_HOST_FUNC_STATE_NOT_SUPPORTED		0
   1110#define CEC_OP_HOST_FUNC_STATE_INACTIVE			1
   1111#define CEC_OP_HOST_FUNC_STATE_ACTIVE			2
   1112/* ENC Functionality State Operand (enc_func_state) */
   1113#define CEC_OP_ENC_FUNC_STATE_EXT_CON_NOT_SUPPORTED	0
   1114#define CEC_OP_ENC_FUNC_STATE_EXT_CON_INACTIVE		1
   1115#define CEC_OP_ENC_FUNC_STATE_EXT_CON_ACTIVE		2
   1116/* CDC Error Code Operand (cdc_errcode) */
   1117#define CEC_OP_CDC_ERROR_CODE_NONE			0
   1118#define CEC_OP_CDC_ERROR_CODE_CAP_UNSUPPORTED		1
   1119#define CEC_OP_CDC_ERROR_CODE_WRONG_STATE		2
   1120#define CEC_OP_CDC_ERROR_CODE_OTHER			3
   1121/* HEC Support Operand (hec_support) */
   1122#define CEC_OP_HEC_SUPPORT_NO				0
   1123#define CEC_OP_HEC_SUPPORT_YES				1
   1124/* HEC Activation Operand (hec_activation) */
   1125#define CEC_OP_HEC_ACTIVATION_ON			0
   1126#define CEC_OP_HEC_ACTIVATION_OFF			1
   1127
   1128#define CEC_MSG_CDC_HEC_SET_STATE_ADJACENT		0x02
   1129#define CEC_MSG_CDC_HEC_SET_STATE			0x03
   1130/* HEC Set State Operand (hec_set_state) */
   1131#define CEC_OP_HEC_SET_STATE_DEACTIVATE			0
   1132#define CEC_OP_HEC_SET_STATE_ACTIVATE			1
   1133
   1134#define CEC_MSG_CDC_HEC_REQUEST_DEACTIVATION		0x04
   1135#define CEC_MSG_CDC_HEC_NOTIFY_ALIVE			0x05
   1136#define CEC_MSG_CDC_HEC_DISCOVER			0x06
   1137/* Hotplug Detect messages */
   1138#define CEC_MSG_CDC_HPD_SET_STATE			0x10
   1139/* HPD State Operand (hpd_state) */
   1140#define CEC_OP_HPD_STATE_CP_EDID_DISABLE		0
   1141#define CEC_OP_HPD_STATE_CP_EDID_ENABLE			1
   1142#define CEC_OP_HPD_STATE_CP_EDID_DISABLE_ENABLE		2
   1143#define CEC_OP_HPD_STATE_EDID_DISABLE			3
   1144#define CEC_OP_HPD_STATE_EDID_ENABLE			4
   1145#define CEC_OP_HPD_STATE_EDID_DISABLE_ENABLE		5
   1146#define CEC_MSG_CDC_HPD_REPORT_STATE			0x11
   1147/* HPD Error Code Operand (hpd_error) */
   1148#define CEC_OP_HPD_ERROR_NONE				0
   1149#define CEC_OP_HPD_ERROR_INITIATOR_NOT_CAPABLE		1
   1150#define CEC_OP_HPD_ERROR_INITIATOR_WRONG_STATE		2
   1151#define CEC_OP_HPD_ERROR_OTHER				3
   1152#define CEC_OP_HPD_ERROR_NONE_NO_VIDEO			4
   1153
   1154/* End of Messages */
   1155
   1156/* Helper functions to identify the 'special' CEC devices */
   1157
   1158static inline int cec_is_2nd_tv(const struct cec_log_addrs *las)
   1159{
   1160	/*
   1161	 * It is a second TV if the logical address is 14 or 15 and the
   1162	 * primary device type is a TV.
   1163	 */
   1164	return las->num_log_addrs &&
   1165	       las->log_addr[0] >= CEC_LOG_ADDR_SPECIFIC &&
   1166	       las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_TV;
   1167}
   1168
   1169static inline int cec_is_processor(const struct cec_log_addrs *las)
   1170{
   1171	/*
   1172	 * It is a processor if the logical address is 12-15 and the
   1173	 * primary device type is a Processor.
   1174	 */
   1175	return las->num_log_addrs &&
   1176	       las->log_addr[0] >= CEC_LOG_ADDR_BACKUP_1 &&
   1177	       las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_PROCESSOR;
   1178}
   1179
   1180static inline int cec_is_switch(const struct cec_log_addrs *las)
   1181{
   1182	/*
   1183	 * It is a switch if the logical address is 15 and the
   1184	 * primary device type is a Switch and the CDC-Only flag is not set.
   1185	 */
   1186	return las->num_log_addrs == 1 &&
   1187	       las->log_addr[0] == CEC_LOG_ADDR_UNREGISTERED &&
   1188	       las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_SWITCH &&
   1189	       !(las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY);
   1190}
   1191
   1192static inline int cec_is_cdc_only(const struct cec_log_addrs *las)
   1193{
   1194	/*
   1195	 * It is a CDC-only device if the logical address is 15 and the
   1196	 * primary device type is a Switch and the CDC-Only flag is set.
   1197	 */
   1198	return las->num_log_addrs == 1 &&
   1199	       las->log_addr[0] == CEC_LOG_ADDR_UNREGISTERED &&
   1200	       las->primary_device_type[0] == CEC_OP_PRIM_DEVTYPE_SWITCH &&
   1201	       (las->flags & CEC_LOG_ADDRS_FL_CDC_ONLY);
   1202}
   1203
   1204#endif