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

dce110_timing_generator.h (9630B)


      1/*
      2 * Copyright 2012-15 Advanced Micro Devices, Inc.
      3 *
      4 * Permission is hereby granted, free of charge, to any person obtaining a
      5 * copy of this software and associated documentation files (the "Software"),
      6 * to deal in the Software without restriction, including without limitation
      7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8 *  and/or sell copies of the Software, and to permit persons to whom the
      9 * Software is furnished to do so, subject to the following conditions:
     10 *
     11 * The above copyright notice and this permission notice shall be included in
     12 * all copies or substantial portions of the Software.
     13 *
     14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     20 * OTHER DEALINGS IN THE SOFTWARE.
     21 *
     22 * Authors: AMD
     23 *
     24 */
     25
     26#ifndef __DC_TIMING_GENERATOR_DCE110_H__
     27#define __DC_TIMING_GENERATOR_DCE110_H__
     28
     29#include "timing_generator.h"
     30#include "../include/grph_object_id.h"
     31
     32/* GSL Sync related values */
     33
     34/* In VSync mode, after 4 units of time, master pipe will generate
     35 * flip_ready signal */
     36#define VFLIP_READY_DELAY 4
     37/* In HSync mode, after 2 units of time, master pipe will generate
     38 * flip_ready signal */
     39#define HFLIP_READY_DELAY 2
     40/* 6 lines delay between forcing flip and checking all pipes ready */
     41#define HFLIP_CHECK_DELAY 6
     42/* 3 lines before end of frame */
     43#define FLIP_READY_BACK_LOOKUP 3
     44
     45/* Trigger Source Select - ASIC-defendant, actual values for the
     46 * register programming */
     47enum trigger_source_select {
     48	TRIGGER_SOURCE_SELECT_LOGIC_ZERO = 0,
     49	TRIGGER_SOURCE_SELECT_CRTC_VSYNCA = 1,
     50	TRIGGER_SOURCE_SELECT_CRTC_HSYNCA = 2,
     51	TRIGGER_SOURCE_SELECT_CRTC_VSYNCB = 3,
     52	TRIGGER_SOURCE_SELECT_CRTC_HSYNCB = 4,
     53	TRIGGER_SOURCE_SELECT_GENERICF = 5,
     54	TRIGGER_SOURCE_SELECT_GENERICE = 6,
     55	TRIGGER_SOURCE_SELECT_VSYNCA = 7,
     56	TRIGGER_SOURCE_SELECT_HSYNCA = 8,
     57	TRIGGER_SOURCE_SELECT_VSYNCB = 9,
     58	TRIGGER_SOURCE_SELECT_HSYNCB = 10,
     59	TRIGGER_SOURCE_SELECT_HPD1 = 11,
     60	TRIGGER_SOURCE_SELECT_HPD2 = 12,
     61	TRIGGER_SOURCE_SELECT_GENERICD = 13,
     62	TRIGGER_SOURCE_SELECT_GENERICC = 14,
     63	TRIGGER_SOURCE_SELECT_VIDEO_CAPTURE = 15,
     64	TRIGGER_SOURCE_SELECT_GSL_GROUP0 = 16,
     65	TRIGGER_SOURCE_SELECT_GSL_GROUP1 = 17,
     66	TRIGGER_SOURCE_SELECT_GSL_GROUP2 = 18,
     67	TRIGGER_SOURCE_SELECT_BLONY = 19,
     68	TRIGGER_SOURCE_SELECT_GENERICA = 20,
     69	TRIGGER_SOURCE_SELECT_GENERICB = 21,
     70	TRIGGER_SOURCE_SELECT_GSL_ALLOW_FLIP = 22,
     71	TRIGGER_SOURCE_SELECT_MANUAL_TRIGGER = 23
     72};
     73
     74/* Trigger Source Select - ASIC-dependant, actual values for the
     75 * register programming */
     76enum trigger_polarity_select {
     77	TRIGGER_POLARITY_SELECT_LOGIC_ZERO = 0,
     78	TRIGGER_POLARITY_SELECT_CRTC = 1,
     79	TRIGGER_POLARITY_SELECT_GENERICA = 2,
     80	TRIGGER_POLARITY_SELECT_GENERICB = 3,
     81	TRIGGER_POLARITY_SELECT_HSYNCA = 4,
     82	TRIGGER_POLARITY_SELECT_HSYNCB = 5,
     83	TRIGGER_POLARITY_SELECT_VIDEO_CAPTURE = 6,
     84	TRIGGER_POLARITY_SELECT_GENERICC = 7
     85};
     86
     87
     88struct dce110_timing_generator_offsets {
     89	int32_t crtc;
     90	int32_t dcp;
     91
     92	/* DCE80 use only */
     93	int32_t dmif;
     94};
     95
     96struct dce110_timing_generator {
     97	struct timing_generator base;
     98	struct dce110_timing_generator_offsets offsets;
     99	struct dce110_timing_generator_offsets derived_offsets;
    100
    101	enum controller_id controller_id;
    102
    103	uint32_t max_h_total;
    104	uint32_t max_v_total;
    105
    106	uint32_t min_h_blank;
    107	uint32_t min_h_front_porch;
    108	uint32_t min_h_back_porch;
    109
    110	/* DCE 12 */
    111	uint32_t min_h_sync_width;
    112	uint32_t min_v_sync_width;
    113	uint32_t min_v_blank;
    114
    115};
    116
    117#define DCE110TG_FROM_TG(tg)\
    118	container_of(tg, struct dce110_timing_generator, base)
    119
    120void dce110_timing_generator_construct(
    121	struct dce110_timing_generator *tg,
    122	struct dc_context *ctx,
    123	uint32_t instance,
    124	const struct dce110_timing_generator_offsets *offsets);
    125
    126/* determine if given timing can be supported by TG */
    127bool dce110_timing_generator_validate_timing(
    128	struct timing_generator *tg,
    129	const struct dc_crtc_timing *timing,
    130	enum signal_type signal);
    131
    132/******** HW programming ************/
    133
    134/* Program timing generator with given timing */
    135bool dce110_timing_generator_program_timing_generator(
    136	struct timing_generator *tg,
    137	const struct dc_crtc_timing *dc_crtc_timing);
    138
    139/* Disable/Enable Timing Generator */
    140bool dce110_timing_generator_enable_crtc(struct timing_generator *tg);
    141bool dce110_timing_generator_disable_crtc(struct timing_generator *tg);
    142
    143void dce110_timing_generator_set_early_control(
    144		struct timing_generator *tg,
    145		uint32_t early_cntl);
    146
    147/**************** TG current status ******************/
    148
    149/* return the current frame counter. Used by Linux kernel DRM */
    150uint32_t dce110_timing_generator_get_vblank_counter(
    151		struct timing_generator *tg);
    152
    153void dce110_timing_generator_get_position(
    154	struct timing_generator *tg,
    155	struct crtc_position *position);
    156
    157/* return true if TG counter is moving. false if TG is stopped */
    158bool dce110_timing_generator_is_counter_moving(struct timing_generator *tg);
    159
    160/* wait until TG is in beginning of vertical blank region */
    161void dce110_timing_generator_wait_for_vblank(struct timing_generator *tg);
    162
    163/* wait until TG is in beginning of active region */
    164void dce110_timing_generator_wait_for_vactive(struct timing_generator *tg);
    165
    166/*********** Timing Generator Synchronization routines ****/
    167
    168/* Setups Global Swap Lock group, TimingServer or TimingClient*/
    169void dce110_timing_generator_setup_global_swap_lock(
    170	struct timing_generator *tg,
    171	const struct dcp_gsl_params *gsl_params);
    172
    173/* Clear all the register writes done by setup_global_swap_lock */
    174void dce110_timing_generator_tear_down_global_swap_lock(
    175	struct timing_generator *tg);
    176
    177/* Reset crtc position on master VSync */
    178void dce110_timing_generator_enable_crtc_reset(
    179	struct timing_generator *tg,
    180	int source,
    181	struct crtc_trigger_info *crtc_tp);
    182
    183/* Reset slave controllers on master VSync */
    184void dce110_timing_generator_enable_reset_trigger(
    185	struct timing_generator *tg,
    186	int source);
    187
    188/* disabling trigger-reset */
    189void dce110_timing_generator_disable_reset_trigger(
    190	struct timing_generator *tg);
    191
    192/* Checks whether CRTC triggered reset occurred */
    193bool dce110_timing_generator_did_triggered_reset_occur(
    194	struct timing_generator *tg);
    195
    196/******** Stuff to move to other virtual HW objects *****************/
    197/* Move to enable accelerated mode */
    198void dce110_timing_generator_disable_vga(struct timing_generator *tg);
    199/* TODO: Should we move it to transform */
    200/* Fully program CRTC timing in timing generator */
    201void dce110_timing_generator_program_blanking(
    202	struct timing_generator *tg,
    203	const struct dc_crtc_timing *timing);
    204
    205/* TODO: Should we move it to opp? */
    206/* Combine with below and move YUV/RGB color conversion to SW layer */
    207void dce110_timing_generator_program_blank_color(
    208	struct timing_generator *tg,
    209	const struct tg_color *black_color);
    210/* Combine with above and move YUV/RGB color conversion to SW layer */
    211void dce110_timing_generator_set_overscan_color_black(
    212	struct timing_generator *tg,
    213	const struct tg_color *color);
    214void dce110_timing_generator_color_space_to_black_color(
    215		enum dc_color_space colorspace,
    216	struct tg_color *black_color);
    217/*************** End-of-move ********************/
    218
    219/* Not called yet */
    220void dce110_timing_generator_set_test_pattern(
    221	struct timing_generator *tg,
    222	/* TODO: replace 'controller_dp_test_pattern' by 'test_pattern_mode'
    223	 * because this is not DP-specific (which is probably somewhere in DP
    224	 * encoder) */
    225	enum controller_dp_test_pattern test_pattern,
    226	enum dc_color_depth color_depth);
    227
    228void dce110_timing_generator_set_drr(
    229	struct timing_generator *tg,
    230	const struct drr_params *params);
    231
    232void dce110_timing_generator_set_static_screen_control(
    233	struct timing_generator *tg,
    234	uint32_t event_triggers,
    235	uint32_t num_frames);
    236
    237void dce110_timing_generator_get_crtc_scanoutpos(
    238	struct timing_generator *tg,
    239	uint32_t *v_blank_start,
    240	uint32_t *v_blank_end,
    241	uint32_t *h_position,
    242	uint32_t *v_position);
    243
    244void dce110_timing_generator_enable_advanced_request(
    245	struct timing_generator *tg,
    246	bool enable,
    247	const struct dc_crtc_timing *timing);
    248
    249void dce110_timing_generator_set_lock_master(struct timing_generator *tg,
    250		bool lock);
    251
    252void dce110_tg_program_blank_color(struct timing_generator *tg,
    253	const struct tg_color *black_color);
    254
    255void dce110_tg_set_overscan_color(struct timing_generator *tg,
    256	const struct tg_color *overscan_color);
    257
    258void dce110_tg_program_timing(struct timing_generator *tg,
    259	const struct dc_crtc_timing *timing,
    260	int vready_offset,
    261	int vstartup_start,
    262	int vupdate_offset,
    263	int vupdate_width,
    264	const enum signal_type signal,
    265	bool use_vbios);
    266
    267bool dce110_tg_is_blanked(struct timing_generator *tg);
    268
    269void dce110_tg_set_blank(struct timing_generator *tg,
    270		bool enable_blanking);
    271
    272bool dce110_tg_validate_timing(struct timing_generator *tg,
    273	const struct dc_crtc_timing *timing);
    274
    275void dce110_tg_wait_for_state(struct timing_generator *tg,
    276	enum crtc_state state);
    277
    278void dce110_tg_set_colors(struct timing_generator *tg,
    279	const struct tg_color *blank_color,
    280	const struct tg_color *overscan_color);
    281
    282bool dce110_arm_vert_intr(
    283		struct timing_generator *tg, uint8_t width);
    284
    285bool dce110_configure_crc(struct timing_generator *tg,
    286			  const struct crc_params *params);
    287
    288bool dce110_get_crc(struct timing_generator *tg,
    289		    uint32_t *r_cr, uint32_t *g_y, uint32_t *b_cb);
    290
    291#endif /* __DC_TIMING_GENERATOR_DCE110_H__ */