linux/include/media/cec.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * cec - HDMI Consumer Electronics Control support header
   4 *
   5 * Copyright 2016 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
   6 */
   7
   8#ifndef _MEDIA_CEC_H
   9#define _MEDIA_CEC_H
  10
  11#include <linux/poll.h>
  12#include <linux/fs.h>
  13#include <linux/debugfs.h>
  14#include <linux/device.h>
  15#include <linux/cdev.h>
  16#include <linux/kthread.h>
  17#include <linux/timer.h>
  18#include <linux/cec-funcs.h>
  19#include <media/rc-core.h>
  20
  21/* CEC_ADAP_G_CONNECTOR_INFO is available */
  22#define CEC_CAP_CONNECTOR_INFO  (1 << 8)
  23
  24#define CEC_CAP_DEFAULTS (CEC_CAP_LOG_ADDRS | CEC_CAP_TRANSMIT | \
  25                          CEC_CAP_PASSTHROUGH | CEC_CAP_RC)
  26
  27/**
  28 * struct cec_devnode - cec device node
  29 * @dev:        cec device
  30 * @cdev:       cec character device
  31 * @minor:      device node minor number
  32 * @registered: the device was correctly registered
  33 * @unregistered: the device was unregistered
  34 * @fhs_lock:   lock to control access to the filehandle list
  35 * @fhs:        the list of open filehandles (cec_fh)
  36 *
  37 * This structure represents a cec-related device node.
  38 *
  39 * The @parent is a physical device. It must be set by core or device drivers
  40 * before registering the node.
  41 */
  42struct cec_devnode {
  43        /* sysfs */
  44        struct device dev;
  45        struct cdev cdev;
  46
  47        /* device info */
  48        int minor;
  49        bool registered;
  50        bool unregistered;
  51        struct list_head fhs;
  52        struct mutex lock;
  53};
  54
  55struct cec_adapter;
  56struct cec_data;
  57struct cec_pin;
  58struct cec_notifier;
  59
  60struct cec_data {
  61        struct list_head list;
  62        struct list_head xfer_list;
  63        struct cec_adapter *adap;
  64        struct cec_msg msg;
  65        struct cec_fh *fh;
  66        struct delayed_work work;
  67        struct completion c;
  68        u8 attempts;
  69        bool blocking;
  70        bool completed;
  71};
  72
  73struct cec_msg_entry {
  74        struct list_head        list;
  75        struct cec_msg          msg;
  76};
  77
  78struct cec_event_entry {
  79        struct list_head        list;
  80        struct cec_event        ev;
  81};
  82
  83#define CEC_NUM_CORE_EVENTS 2
  84#define CEC_NUM_EVENTS CEC_EVENT_PIN_5V_HIGH
  85
  86struct cec_fh {
  87        struct list_head        list;
  88        struct list_head        xfer_list;
  89        struct cec_adapter      *adap;
  90        u8                      mode_initiator;
  91        u8                      mode_follower;
  92
  93        /* Events */
  94        wait_queue_head_t       wait;
  95        struct mutex            lock;
  96        struct list_head        events[CEC_NUM_EVENTS]; /* queued events */
  97        u16                     queued_events[CEC_NUM_EVENTS];
  98        unsigned int            total_queued_events;
  99        struct cec_event_entry  core_events[CEC_NUM_CORE_EVENTS];
 100        struct list_head        msgs; /* queued messages */
 101        unsigned int            queued_msgs;
 102};
 103
 104#define CEC_SIGNAL_FREE_TIME_RETRY              3
 105#define CEC_SIGNAL_FREE_TIME_NEW_INITIATOR      5
 106#define CEC_SIGNAL_FREE_TIME_NEXT_XFER          7
 107
 108/* The nominal data bit period is 2.4 ms */
 109#define CEC_FREE_TIME_TO_USEC(ft)               ((ft) * 2400)
 110
 111struct cec_adap_ops {
 112        /* Low-level callbacks */
 113        int (*adap_enable)(struct cec_adapter *adap, bool enable);
 114        int (*adap_monitor_all_enable)(struct cec_adapter *adap, bool enable);
 115        int (*adap_monitor_pin_enable)(struct cec_adapter *adap, bool enable);
 116        int (*adap_log_addr)(struct cec_adapter *adap, u8 logical_addr);
 117        int (*adap_transmit)(struct cec_adapter *adap, u8 attempts,
 118                             u32 signal_free_time, struct cec_msg *msg);
 119        void (*adap_status)(struct cec_adapter *adap, struct seq_file *file);
 120        void (*adap_free)(struct cec_adapter *adap);
 121
 122        /* Error injection callbacks */
 123        int (*error_inj_show)(struct cec_adapter *adap, struct seq_file *sf);
 124        bool (*error_inj_parse_line)(struct cec_adapter *adap, char *line);
 125
 126        /* High-level CEC message callback */
 127        int (*received)(struct cec_adapter *adap, struct cec_msg *msg);
 128};
 129
 130/*
 131 * The minimum message length you can receive (excepting poll messages) is 2.
 132 * With a transfer rate of at most 36 bytes per second this makes 18 messages
 133 * per second worst case.
 134 *
 135 * We queue at most 3 seconds worth of received messages. The CEC specification
 136 * requires that messages are replied to within a second, so 3 seconds should
 137 * give more than enough margin. Since most messages are actually more than 2
 138 * bytes, this is in practice a lot more than 3 seconds.
 139 */
 140#define CEC_MAX_MSG_RX_QUEUE_SZ         (18 * 3)
 141
 142/*
 143 * The transmit queue is limited to 1 second worth of messages (worst case).
 144 * Messages can be transmitted by userspace and kernel space. But for both it
 145 * makes no sense to have a lot of messages queued up. One second seems
 146 * reasonable.
 147 */
 148#define CEC_MAX_MSG_TX_QUEUE_SZ         (18 * 1)
 149
 150/**
 151 * struct cec_drm_connector_info - tells which drm connector is
 152 * associated with the CEC adapter.
 153 * @card_no: drm card number
 154 * @connector_id: drm connector ID
 155 */
 156struct cec_drm_connector_info {
 157        __u32 card_no;
 158        __u32 connector_id;
 159};
 160
 161#define CEC_CONNECTOR_TYPE_NO_CONNECTOR 0
 162#define CEC_CONNECTOR_TYPE_DRM          1
 163
 164/**
 165 * struct cec_connector_info - tells if and which connector is
 166 * associated with the CEC adapter.
 167 * @type: connector type (if any)
 168 * @drm: drm connector info
 169 */
 170struct cec_connector_info {
 171        __u32 type;
 172        union {
 173                struct cec_drm_connector_info drm;
 174                __u32 raw[16];
 175        };
 176};
 177
 178struct cec_adapter {
 179        struct module *owner;
 180        char name[32];
 181        struct cec_devnode devnode;
 182        struct mutex lock;
 183        struct rc_dev *rc;
 184
 185        struct list_head transmit_queue;
 186        unsigned int transmit_queue_sz;
 187        struct list_head wait_queue;
 188        struct cec_data *transmitting;
 189        bool transmit_in_progress;
 190
 191        struct task_struct *kthread_config;
 192        struct completion config_completion;
 193
 194        struct task_struct *kthread;
 195        wait_queue_head_t kthread_waitq;
 196        wait_queue_head_t waitq;
 197
 198        const struct cec_adap_ops *ops;
 199        void *priv;
 200        u32 capabilities;
 201        u8 available_log_addrs;
 202
 203        u16 phys_addr;
 204        bool needs_hpd;
 205        bool is_configuring;
 206        bool is_configured;
 207        bool cec_pin_is_high;
 208        u8 last_initiator;
 209        u32 monitor_all_cnt;
 210        u32 monitor_pin_cnt;
 211        u32 follower_cnt;
 212        struct cec_fh *cec_follower;
 213        struct cec_fh *cec_initiator;
 214        bool passthrough;
 215        struct cec_log_addrs log_addrs;
 216        struct cec_connector_info conn_info;
 217
 218        u32 tx_timeouts;
 219
 220#ifdef CONFIG_CEC_NOTIFIER
 221        struct cec_notifier *notifier;
 222#endif
 223#ifdef CONFIG_CEC_PIN
 224        struct cec_pin *pin;
 225#endif
 226
 227        struct dentry *cec_dir;
 228        struct dentry *status_file;
 229        struct dentry *error_inj_file;
 230
 231        u16 phys_addrs[15];
 232        u32 sequence;
 233
 234        char input_phys[32];
 235};
 236
 237static inline void *cec_get_drvdata(const struct cec_adapter *adap)
 238{
 239        return adap->priv;
 240}
 241
 242static inline bool cec_has_log_addr(const struct cec_adapter *adap, u8 log_addr)
 243{
 244        return adap->log_addrs.log_addr_mask & (1 << log_addr);
 245}
 246
 247static inline bool cec_is_sink(const struct cec_adapter *adap)
 248{
 249        return adap->phys_addr == 0;
 250}
 251
 252/**
 253 * cec_is_registered() - is the CEC adapter registered?
 254 *
 255 * @adap:       the CEC adapter, may be NULL.
 256 *
 257 * Return: true if the adapter is registered, false otherwise.
 258 */
 259static inline bool cec_is_registered(const struct cec_adapter *adap)
 260{
 261        return adap && adap->devnode.registered;
 262}
 263
 264#define cec_phys_addr_exp(pa) \
 265        ((pa) >> 12), ((pa) >> 8) & 0xf, ((pa) >> 4) & 0xf, (pa) & 0xf
 266
 267struct edid;
 268struct drm_connector;
 269
 270#if IS_REACHABLE(CONFIG_CEC_CORE)
 271struct cec_adapter *cec_allocate_adapter(const struct cec_adap_ops *ops,
 272                void *priv, const char *name, u32 caps, u8 available_las);
 273int cec_register_adapter(struct cec_adapter *adap, struct device *parent);
 274void cec_unregister_adapter(struct cec_adapter *adap);
 275void cec_delete_adapter(struct cec_adapter *adap);
 276
 277int cec_s_log_addrs(struct cec_adapter *adap, struct cec_log_addrs *log_addrs,
 278                    bool block);
 279void cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr,
 280                     bool block);
 281void cec_s_phys_addr_from_edid(struct cec_adapter *adap,
 282                               const struct edid *edid);
 283void cec_s_conn_info(struct cec_adapter *adap,
 284                     const struct cec_connector_info *conn_info);
 285int cec_transmit_msg(struct cec_adapter *adap, struct cec_msg *msg,
 286                     bool block);
 287
 288/* Called by the adapter */
 289void cec_transmit_done_ts(struct cec_adapter *adap, u8 status,
 290                          u8 arb_lost_cnt, u8 nack_cnt, u8 low_drive_cnt,
 291                          u8 error_cnt, ktime_t ts);
 292
 293static inline void cec_transmit_done(struct cec_adapter *adap, u8 status,
 294                                     u8 arb_lost_cnt, u8 nack_cnt,
 295                                     u8 low_drive_cnt, u8 error_cnt)
 296{
 297        cec_transmit_done_ts(adap, status, arb_lost_cnt, nack_cnt,
 298                             low_drive_cnt, error_cnt, ktime_get());
 299}
 300/*
 301 * Simplified version of cec_transmit_done for hardware that doesn't retry
 302 * failed transmits. So this is always just one attempt in which case
 303 * the status is sufficient.
 304 */
 305void cec_transmit_attempt_done_ts(struct cec_adapter *adap,
 306                                  u8 status, ktime_t ts);
 307
 308static inline void cec_transmit_attempt_done(struct cec_adapter *adap,
 309                                             u8 status)
 310{
 311        cec_transmit_attempt_done_ts(adap, status, ktime_get());
 312}
 313
 314void cec_received_msg_ts(struct cec_adapter *adap,
 315                         struct cec_msg *msg, ktime_t ts);
 316
 317static inline void cec_received_msg(struct cec_adapter *adap,
 318                                    struct cec_msg *msg)
 319{
 320        cec_received_msg_ts(adap, msg, ktime_get());
 321}
 322
 323/**
 324 * cec_queue_pin_cec_event() - queue a CEC pin event with a given timestamp.
 325 *
 326 * @adap:       pointer to the cec adapter
 327 * @is_high:    when true the CEC pin is high, otherwise it is low
 328 * @dropped_events: when true some events were dropped
 329 * @ts:         the timestamp for this event
 330 *
 331 */
 332void cec_queue_pin_cec_event(struct cec_adapter *adap, bool is_high,
 333                             bool dropped_events, ktime_t ts);
 334
 335/**
 336 * cec_queue_pin_hpd_event() - queue a pin event with a given timestamp.
 337 *
 338 * @adap:       pointer to the cec adapter
 339 * @is_high:    when true the HPD pin is high, otherwise it is low
 340 * @ts:         the timestamp for this event
 341 *
 342 */
 343void cec_queue_pin_hpd_event(struct cec_adapter *adap, bool is_high, ktime_t ts);
 344
 345/**
 346 * cec_queue_pin_5v_event() - queue a pin event with a given timestamp.
 347 *
 348 * @adap:       pointer to the cec adapter
 349 * @is_high:    when true the 5V pin is high, otherwise it is low
 350 * @ts:         the timestamp for this event
 351 *
 352 */
 353void cec_queue_pin_5v_event(struct cec_adapter *adap, bool is_high, ktime_t ts);
 354
 355/**
 356 * cec_get_edid_phys_addr() - find and return the physical address
 357 *
 358 * @edid:       pointer to the EDID data
 359 * @size:       size in bytes of the EDID data
 360 * @offset:     If not %NULL then the location of the physical address
 361 *              bytes in the EDID will be returned here. This is set to 0
 362 *              if there is no physical address found.
 363 *
 364 * Return: the physical address or CEC_PHYS_ADDR_INVALID if there is none.
 365 */
 366u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
 367                           unsigned int *offset);
 368
 369void cec_fill_conn_info_from_drm(struct cec_connector_info *conn_info,
 370                                 const struct drm_connector *connector);
 371
 372#else
 373
 374static inline int cec_register_adapter(struct cec_adapter *adap,
 375                                       struct device *parent)
 376{
 377        return 0;
 378}
 379
 380static inline void cec_unregister_adapter(struct cec_adapter *adap)
 381{
 382}
 383
 384static inline void cec_delete_adapter(struct cec_adapter *adap)
 385{
 386}
 387
 388static inline void cec_s_phys_addr(struct cec_adapter *adap, u16 phys_addr,
 389                                   bool block)
 390{
 391}
 392
 393static inline void cec_s_phys_addr_from_edid(struct cec_adapter *adap,
 394                                             const struct edid *edid)
 395{
 396}
 397
 398static inline u16 cec_get_edid_phys_addr(const u8 *edid, unsigned int size,
 399                                         unsigned int *offset)
 400{
 401        if (offset)
 402                *offset = 0;
 403        return CEC_PHYS_ADDR_INVALID;
 404}
 405
 406static inline void cec_s_conn_info(struct cec_adapter *adap,
 407                                   const struct cec_connector_info *conn_info)
 408{
 409}
 410
 411static inline void
 412cec_fill_conn_info_from_drm(struct cec_connector_info *conn_info,
 413                            const struct drm_connector *connector)
 414{
 415        memset(conn_info, 0, sizeof(*conn_info));
 416}
 417
 418#endif
 419
 420#if IS_REACHABLE(CONFIG_CEC_CORE) && IS_ENABLED(CONFIG_CEC_NOTIFIER)
 421
 422/**
 423 * cec_notifier_register - register a callback with the notifier
 424 * @n: the CEC notifier
 425 * @adap: the CEC adapter, passed as argument to the callback function
 426 * @callback: the callback function
 427 */
 428void cec_notifier_register(struct cec_notifier *n,
 429                           struct cec_adapter *adap,
 430                           void (*callback)(struct cec_adapter *adap, u16 pa));
 431
 432/**
 433 * cec_notifier_unregister - unregister the callback from the notifier.
 434 * @n: the CEC notifier
 435 */
 436void cec_notifier_unregister(struct cec_notifier *n);
 437
 438/**
 439 * cec_register_cec_notifier - register the notifier with the cec adapter.
 440 * @adap: the CEC adapter
 441 * @notifier: the CEC notifier
 442 */
 443void cec_register_cec_notifier(struct cec_adapter *adap,
 444                               struct cec_notifier *notifier);
 445
 446#else
 447
 448static inline void
 449cec_notifier_register(struct cec_notifier *n,
 450                      struct cec_adapter *adap,
 451                      void (*callback)(struct cec_adapter *adap, u16 pa))
 452{
 453}
 454
 455static inline void cec_notifier_unregister(struct cec_notifier *n)
 456{
 457}
 458
 459static inline void cec_register_cec_notifier(struct cec_adapter *adap,
 460                                             struct cec_notifier *notifier)
 461{
 462}
 463
 464#endif
 465
 466/**
 467 * cec_phys_addr_invalidate() - set the physical address to INVALID
 468 *
 469 * @adap:       the CEC adapter
 470 *
 471 * This is a simple helper function to invalidate the physical
 472 * address.
 473 */
 474static inline void cec_phys_addr_invalidate(struct cec_adapter *adap)
 475{
 476        cec_s_phys_addr(adap, CEC_PHYS_ADDR_INVALID, false);
 477}
 478
 479/**
 480 * cec_get_edid_spa_location() - find location of the Source Physical Address
 481 *
 482 * @edid: the EDID
 483 * @size: the size of the EDID
 484 *
 485 * This EDID is expected to be a CEA-861 compliant, which means that there are
 486 * at least two blocks and one or more of the extensions blocks are CEA-861
 487 * blocks.
 488 *
 489 * The returned location is guaranteed to be <= size-2.
 490 *
 491 * This is an inline function since it is used by both CEC and V4L2.
 492 * Ideally this would go in a module shared by both, but it is overkill to do
 493 * that for just a single function.
 494 */
 495static inline unsigned int cec_get_edid_spa_location(const u8 *edid,
 496                                                     unsigned int size)
 497{
 498        unsigned int blocks = size / 128;
 499        unsigned int block;
 500        u8 d;
 501
 502        /* Sanity check: at least 2 blocks and a multiple of the block size */
 503        if (blocks < 2 || size % 128)
 504                return 0;
 505
 506        /*
 507         * If there are fewer extension blocks than the size, then update
 508         * 'blocks'. It is allowed to have more extension blocks than the size,
 509         * since some hardware can only read e.g. 256 bytes of the EDID, even
 510         * though more blocks are present. The first CEA-861 extension block
 511         * should normally be in block 1 anyway.
 512         */
 513        if (edid[0x7e] + 1 < blocks)
 514                blocks = edid[0x7e] + 1;
 515
 516        for (block = 1; block < blocks; block++) {
 517                unsigned int offset = block * 128;
 518
 519                /* Skip any non-CEA-861 extension blocks */
 520                if (edid[offset] != 0x02 || edid[offset + 1] != 0x03)
 521                        continue;
 522
 523                /* search Vendor Specific Data Block (tag 3) */
 524                d = edid[offset + 2] & 0x7f;
 525                /* Check if there are Data Blocks */
 526                if (d <= 4)
 527                        continue;
 528                if (d > 4) {
 529                        unsigned int i = offset + 4;
 530                        unsigned int end = offset + d;
 531
 532                        /* Note: 'end' is always < 'size' */
 533                        do {
 534                                u8 tag = edid[i] >> 5;
 535                                u8 len = edid[i] & 0x1f;
 536
 537                                if (tag == 3 && len >= 5 && i + len <= end &&
 538                                    edid[i + 1] == 0x03 &&
 539                                    edid[i + 2] == 0x0c &&
 540                                    edid[i + 3] == 0x00)
 541                                        return i + 4;
 542                                i += len + 1;
 543                        } while (i < end);
 544                }
 545        }
 546        return 0;
 547}
 548
 549#endif /* _MEDIA_CEC_H */
 550