/* * drivers/video/tegra/host/vi/vi_notify.h * * Tegra Graphics Host VI * * Copyright (c) 2015-2017 NVIDIA Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __TEGRA_VI_NOTIFY_H__ #define __TEGRA_VI_NOTIFY_H__ #include #define VI_NOTIFY_MAX_VI_CHANS (12) /* make sure that status entries always power of 2 */ #define VI_NOTIFY_STATUS_ENTRIES (1 << 7) struct vi_notify_msg { u32 tag; /* LSB=1 */ u32 stamp; u32 data; u32 reserve; }; #define VI_NOTIFY_TAG_VALID(tag) ((tag) & 1) #define VI_NOTIFY_TAG_TAG(tag) (((tag) >> 1) & 0x7f) #define VI_NOTIFY_TAG_CHANNEL(tag) (((tag) >> 8) & 0xff) #define VI_NOTIFY_TAG_FRAME(tag) (((tag) >> 16) & 0xffff) /* NOTE: vi_capture_status structure should match with * the one declared in RTCPU vi-notifier FW driver. */ struct vi_capture_status { u8 st; /* source stream from CSI block */ u8 vc; /* CSI virtual channel */ u16 frame; /* frame id */ u32 status; /* capture status */ u64 sof_ts; /* timestamp of START_OF_FRAME */ u64 eof_ts; /* timestamp of END_OF_FRAME */ u32 data; /* error data from vi notify module in VI */ u32 capture_id; /* identifier of associated capture request */ }; #define CAPTURE_STATUS_UNKNOWN0 #define CAPTURE_STATUS_SUCCESS1 #define CAPTURE_STATUS_CSIMUX_FRAME2 #define CAPTURE_STATUS_CSIMUX_STREAM3 #define CAPTURE_STATUS_CHANSEL_FAULT4 #define CAPTURE_STATUS_CHANSEL_FAULT_FE5 #define CAPTURE_STATUS_CHANSEL_COLLISION6 #define CAPTURE_STATUS_CHANSEL_SHORT_FRAME7 #define CAPTURE_STATUS_ATOMP_PACKER_OVERFLOW8 #define CAPTURE_STATUS_ATOMP_FRAME_TRUNCATED9 #define CAPTURE_STATUS_ATOMP_FRAME_TOSSED10 #define CAPTURE_STATUS_ISPBUF_FIFO_OVERFLOW11 #define CAPTURE_STATUS_SYNC_FAILURE12 #define CAPTURE_STATUS_NOTIFIER_BACKEND_DOWN13 struct vi_notify_dev; struct vi_notify_driver { struct module *owner; int (*probe)(struct device *, struct vi_notify_dev *); void (*remove)(struct device *); int (*runtime_get)(struct device *); void (*runtime_put)(struct device *); int (*classify)(struct device *, u32); int (*set_syncpts)(struct device *, u8, const u32[3]); int (*enable_reports)(struct device *dev, u8 ch, u8 st, u8 vc, const u32 ids[3]); void (*reset_channel)(struct device *, u8); bool (*has_notifier_backend)(struct device *); int (*get_capture_status)(struct device *, unsigned, u64, struct vi_capture_status *); }; void vi_notify_dev_error(struct vi_notify_dev *); void vi_notify_dev_report(struct vi_notify_dev *, u8, const struct vi_capture_status *); void vi_notify_dev_recv(struct vi_notify_dev *, const struct vi_notify_msg *); int vi_notify_register(struct vi_notify_driver *, struct device *, u8); void vi_notify_unregister(struct vi_notify_driver *, struct device *); struct vi_notify_channel; typedef void (*vi_notify_status_callback)(struct vi_notify_channel *, const struct vi_capture_status *, void *); typedef void (*vi_notify_error_callback)(void *); struct tegra_vi4_syncpts_req { u32 syncpt_ids[3]; u8 stream; u8 vc; u16 pad; }; struct vi_notify_channel { struct vi_notify_dev *vnd; atomic_t ign_mask; wait_queue_head_t readq; struct mutex read_lock; struct rcu_head rcu; atomic_t overruns; atomic_t errors; atomic_t report; DECLARE_KFIFO(fifo, struct vi_notify_msg, 128); struct vi_capture_status status; vi_notify_status_callback notify_cb; vi_notify_error_callback error_cb; void *client_data; }; /* internal vi_notify_channel API for kernel vi-mode driver */ int vi_notify_channel_set_ign_mask(struct vi_notify_channel *, u32); int vi_notify_channel_set_syncpts(unsigned, struct vi_notify_channel *, struct tegra_vi4_syncpts_req *); int vi_notify_channel_enable_reports(unsigned channel, struct vi_notify_channel *, struct tegra_vi4_syncpts_req *); int vi_notify_channel_reset(unsigned channel, struct vi_notify_channel *, struct tegra_vi4_syncpts_req *); struct vi_notify_channel *vi_notify_channel_open(unsigned channel); int vi_notify_channel_close(unsigned, struct vi_notify_channel *); void vi_notify_channel_set_notify_funcs(struct vi_notify_channel *, vi_notify_status_callback, vi_notify_error_callback, void *); int vi_notify_get_capture_status(struct vi_notify_channel *, unsigned, u64, struct vi_capture_status *); #endif