/* * tegra_dc_ext_kernel.h: tegra dc ext kernel module interface. * * Copyright (c) 2016-2018, NVIDIA CORPORATION, All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that 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. * */ #ifndef VIDEO_DC_EXT_KERNEL_H #define VIDEO_DC_EXT_KERNEL_H #include #include #define DC_N_WINDOWS 6 struct tegra_dc; struct nvmap_handle_ref; #define TEGRA_WIN_FLAG_ENABLED (1 << 0) #define TEGRA_WIN_FLAG_BLEND_PREMULT (1 << 1) #define TEGRA_WIN_FLAG_BLEND_COVERAGE (1 << 2) #define TEGRA_WIN_FLAG_INVERT_H (1 << 3) #define TEGRA_WIN_FLAG_INVERT_V (1 << 4) #define TEGRA_WIN_FLAG_TILED (1 << 5) #define TEGRA_WIN_FLAG_H_FILTER (1 << 6) #define TEGRA_WIN_FLAG_V_FILTER (1 << 7) #define TEGRA_WIN_FLAG_BLOCKLINEAR (1 << 8) #define TEGRA_WIN_FLAG_SCAN_COLUMN (1 << 9) #define TEGRA_WIN_FLAG_INTERLACE (1 << 10) #define TEGRA_WIN_FLAG_FB (1 << 11) #define TEGRA_WIN_FLAG_INPUT_RANGE_MASK (3 << 12) #define TEGRA_WIN_FLAG_INPUT_RANGE_FULL (0 << 12) #define TEGRA_WIN_FLAG_INPUT_RANGE_LIMITED (1 << 12) #define TEGRA_WIN_FLAG_INPUT_RANGE_BYPASS (2 << 12) #define TEGRA_WIN_FLAG_CS_MASK (7 << 14) #define TEGRA_WIN_FLAG_CS_NONE (0 << 14) #define TEGRA_WIN_FLAG_CS_REC601 (1 << 14) #define TEGRA_WIN_FLAG_CS_REC709 (2 << 14) #define TEGRA_WIN_FLAG_CS_REC2020 (4 << 14) #define TEGRA_WIN_FLAG_DEGAMMA_MASK (15 << 17) #define TEGRA_WIN_FLAG_DEGAMMA_DEFAULT (0 << 17) /* driver selects */ #define TEGRA_WIN_FLAG_DEGAMMA_NONE (1 << 17) #define TEGRA_WIN_FLAG_DEGAMMA_SRGB (2 << 17) #define TEGRA_WIN_FLAG_DEGAMMA_YUV_8_10 (4 << 17) #define TEGRA_WIN_FLAG_DEGAMMA_YUV_12 (8 << 17) #define TEGRA_WIN_FLAG_BLEND_ADD (1 << 21) #define TEGRA_WIN_FLAG_INVALID (1 << 31) /* window does not exist. */ #define TEGRA_WIN_BLEND_FLAGS_MASK \ (TEGRA_WIN_FLAG_BLEND_PREMULT | \ TEGRA_WIN_FLAG_BLEND_COVERAGE | \ TEGRA_WIN_FLAG_BLEND_ADD) /* CSC struct for nvdisplay */ struct tegra_dc_nvdisp_win_csc { u32 r2r; u32 g2r; u32 b2r; u32 const2r; u32 r2g; u32 g2g; u32 b2g; u32 const2g; u32 r2b; u32 g2b; u32 b2b; u32 const2b; u32 csc_enable; }; /* CSC struct for T210 */ struct tegra_dc_win_csc { unsigned short yof; unsigned short kyrgb; unsigned short kur; unsigned short kvr; unsigned short kug; unsigned short kvg; unsigned short kub; unsigned short kvb; }; /* palette lookup table (T210)*/ struct tegra_dc_lut { u8 r[256]; u8 g[256]; u8 b[256]; }; /* lut table for nvdisplay */ struct tegra_dc_nvdisp_lut { u64 *rgb; dma_addr_t phy_addr; size_t size; }; struct tegra_dc_win_cached_settings { bool clamp_before_blend; bool color_expand_enable; }; struct tegra_dc_win { u8 idx; u8 ppflags; /* see TEGRA_WIN_PPFLAG* */ u8 global_alpha; u32 fmt; u32 flags; void *virt_addr; dma_addr_t phys_addr; dma_addr_t phys_addr_u; dma_addr_t phys_addr_v; /* field 2 starting address */ dma_addr_t phys_addr2; dma_addr_t phys_addr_u2; dma_addr_t phys_addr_v2; unsigned stride; unsigned stride_uv; fixed20_12 x; fixed20_12 y; fixed20_12 w; fixed20_12 h; unsigned out_x; unsigned out_y; unsigned out_w; unsigned out_h; unsigned z; struct tegra_dc_win_cached_settings cached_settings; struct tegra_dc_nvdisp_win_csc nvdisp_win_csc; bool force_user_csc; bool force_user_degamma; struct tegra_dc_win_csc win_csc; bool csc_dirty; int dirty; int underflows; struct tegra_dc *dc; struct nvmap_handle_ref *cur_handle; unsigned bandwidth; unsigned new_bandwidth; struct tegra_dc_lut lut; struct tegra_dc_nvdisp_lut nvdisp_lut; u8 block_height_log2; struct { dma_addr_t cde_addr; unsigned offset_x; unsigned offset_y; u32 zbc_color; unsigned ctb_entry; } cde; struct { u32 id; u32 min; u32 max; } syncpt; bool is_scaler_coeff_set; bool color_expand_enable; bool clamp_before_blend; /* Used only on Nvdisplay */ bool precomp_caps_read; u32 precomp_capc; u32 precomp_cape; }; struct tegra_dc *tegra_dc_get_dc(unsigned idx); #ifdef CONFIG_TEGRA_ISOMGR int tegra_dc_bandwidth_negotiate_bw(struct tegra_dc *dc, struct tegra_dc_win *windows[], int n); #endif int tegra_dc_get_numof_dispheads(void); int tegra_dc_get_numof_dispwindows(void); int tegra_dc_get_numof_dispsors(void); /* needed by tegra-throughput */ int tegra_dc_set_flip_callback(void (*callback)(void)); int tegra_dc_unset_flip_callback(void); int tegra_dc_get_panel_sync_rate(void); /* needed by tegra-mods */ unsigned long tegra_dc_readl_exported(struct tegra_dc *, unsigned long); void tegra_dc_writel_exported(struct tegra_dc *, unsigned long, unsigned long); /* Forward Declaration. Please see below for structure details */ struct tegra_dc_client; /* * tegra_dc_notify_dc_enabled_event - callback function to notify client * when dc is enabled. * @disp_id: logical id represented by suffix to fb device, i.e. 0 for * fb0, 1 for fb1 etc. * @usr_ctx: Any user context if present. * * Return: void */ typedef void (*tegra_dc_notify_dc_enabled_event)(int disp_id, void *usr_ctx); /* * tegra_dc_notify_dc_disabled_event- callback function to notify client * when dc is disabled. * @disp_id: logical id represented by suffix to fb device, i.e. 0 for * fb0, 1 for fb1 etc. * @usr_ctx: Any user context if present. * * Return: void */ typedef void (*tegra_dc_notify_dc_disabled_event)(int disp_id, void *usr_ctx); /* * tegra_dc_notify_modeset_event - callback function to notify the * client when modeset occurs. * @disp_id: logical id represented by suffix to fb device, i.e. 0 for * fb0, 1 for fb1 etc. * @usr_ctx: Any user context if present. */ typedef void (*tegra_dc_notify_modeset_event)(int disp_id, void *usr_ctx); /* * tegra_dc_get_max_lines() - Get the base address of a head * @disp_id: logical id represented by suffix to fb device, i.e. 0 for * fb0, 1 for fb1 etc. * * Return : v_total for the current display if successful else an error value. */ int tegra_dc_get_max_lines(int disp_id); /* * tegra_dc_get_addr_info() - Get the base address of a head * @disp_id: logical id represented by suffix to fb device, i.e. 0 for * fb0, 1 for fb1 etc. * @res : ptr to resource info to be filled by dc driver. * * Return : 0 if successful else an error value. */ int tegra_dc_get_addr_info(int disp_id, struct resource *res); /* * tegra_dc_register_client() - used by clients to register to dc driver * @client : pointer to client's data * * Return: 0 if no errors else corresponding error value. */ int tegra_dc_register_client(struct tegra_dc_client *client); /* * tegra_dc_unregister_client() - used by clients to unregister to dc driver * @client : pointer to client's data * * Return: 0 if no errors else corresponding error value. */ int tegra_dc_unregister_client(struct tegra_dc_client *client); /* * enum tegra_dc_client_cllbck_event_type - defines all the supported events * on which a dc_client can request a callback * @NOTIFY_DC_ENABLED_EVENT : when dc is enabled * @NOTIFY_DC_DISABLED_EVENT : when dc is disabled * @NOTIFY_MODESET_EVENT : when a modeset occurs * @MAX_EVENT : max no. of supported events. */ enum tegra_dc_client_cllbck_event_type { NOTIFY_DC_ENABLED_EVENT, NOTIFY_DC_DISABLED_EVENT, NOTIFY_MODESET_EVENT, MAX_EVENT }; /* * struct tegra_dc_client_callbck_data - data structure to be used by dc * clients for registering callback functions. * @callback_type : states the type of callback function. * @reserved0 : reserved for future pointer. * @reserved1 : reserved for future use (data_type of the future pointer above) * @callback_fn : ptr to the callback function. * * This is meant to be scalable and backward compatible in future if we plan to * extend the number of callback functions rather than going of fixed array or * list of callback functions. */ struct tegra_dc_client_callbck_data { u32 callback_type; u64 reserved0; u32 reserved1; void *callback_fn; }; /* * struct tegra_dc_client - structure to be used by external clients * registering with dc driver for notifications. */ struct tegra_dc_client { /* * @disp_id: Used to specify the head to which the client has * registered to receive notifications. To be filled by the client. * This particularly is the fb#id of the head and not the hardware id * for the heads. */ int disp_id; /* * @client_id: Allocated by dc driver to keep track of regsitered * clients per head. */ int client_id; /* * @user_ctx: Stores any context provided by the client. */ void *usr_ctx; /* * @nr_callbacks: Used to specify the number of callback functions * the client wants to register for. */ int nr_callbacks; /* * @callback_data: Points to the callback data that has info regarding * the callback fucntions registered by the client. */ struct tegra_dc_client_callbck_data *callback_data; }; #endif