223 lines
6.5 KiB
C
223 lines
6.5 KiB
C
/*
|
|
* drivers/video/tegra/dc/dc_common.h
|
|
*
|
|
* Copyright (c) 2017-2019, NVIDIA CORPORATION, All rights reserved.
|
|
* Author: Arun Swain <arswain@nvidia.com>
|
|
*
|
|
* 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 __DRIVERS_VIDEO_TEGRA_DC_DC_COMMON_H__
|
|
#define __DRIVERS_VIDEO_TEGRA_DC_DC_COMMON_H__
|
|
|
|
#include <uapi/video/tegra_dc_ext.h>
|
|
|
|
/* Flags for tegra_dc_common */
|
|
|
|
/**
|
|
* @DC_COMMON_JOB_SUBMITTED - Used by dc_common to keep track
|
|
* of a submitted job. For frame/flip locks, in the presence
|
|
* of multiple heads, the host1x job needs to be submitted
|
|
* only once. This flag is use track the same.
|
|
*/
|
|
#define DC_COMMON_JOB_SUBMITTED 0x00
|
|
|
|
/**
|
|
* @DC_COMMON_ERROR_CHECK_REQ- Used by dc_common to keep track
|
|
* of checking errors. For flip lock, mulitple frame_end
|
|
* interrupts are received but the check for error is only when
|
|
* this flag is set.
|
|
*/
|
|
#define DC_COMMON_ERROR_CHECK_REQ 0x01
|
|
|
|
/**
|
|
* @LOCK_TYPE_FRAME - Used by tegradc heads to request for
|
|
* FRAME LOCK.
|
|
*/
|
|
#define LOCK_TYPE_FRAME (1<<0)
|
|
/**
|
|
* @LOCK_TYPE_FLIP - Used by tegradc heads to request for
|
|
* FLIP LOCK.
|
|
*/
|
|
#define LOCK_TYPE_FLIP (1<<1)
|
|
/**
|
|
* struct bit_mapped_data - Used by dc_common to store head-specific
|
|
* data in a bit-mapped format.
|
|
*/
|
|
struct bit_mapped_data {
|
|
/**
|
|
* @gen_act_read_result: Used to keep track of the result of
|
|
* general_act_request promotion at frame_end for multiple
|
|
* heads.
|
|
*/
|
|
ulong gen_act_read_result;
|
|
/**
|
|
* @fr_lck_req_rcvd
|
|
*/
|
|
ulong fr_lck_req_rcvd;
|
|
/**
|
|
* @fl_lck_req_rcvd: Used to keep track of received request for
|
|
* flip lock from mulitple heads.
|
|
*/
|
|
ulong fl_lck_req_rcvd;
|
|
/**
|
|
* @fl_lck_req_completed: Used to keep track of completed request for
|
|
* flip lock from mulitple heads.
|
|
*/
|
|
ulong fl_lck_req_completed;
|
|
};
|
|
|
|
/**
|
|
* struct tegra_dc_common- The main struct used by dc_common platform
|
|
* driver. Stored as the private_data in dc_common platform device.
|
|
*/
|
|
struct tegra_dc_common {
|
|
/**
|
|
* @flags: Used by dc_comon to track of the various results and
|
|
* requests received for multiple heads. Please see above for
|
|
* description of each of them.
|
|
*/
|
|
ulong flags;
|
|
/**
|
|
* @base: Used by dc_common to store the base address of display
|
|
* controller/Nvdisplay. Read from device tree.
|
|
*/
|
|
void __iomem *base;
|
|
/**
|
|
* @cpuvaddr: Used by dc_common to store the virtual address of
|
|
* memory chunk allocated for dma. This is used to write cmds
|
|
* later on to be accessed by host1x h/w via dma.
|
|
*/
|
|
u32 *cpuvaddr;
|
|
/**
|
|
* @syncpt_id: Used for host-managed syncpt for notifying dc_common
|
|
* after job submission. Immediate syncpt incr is used for this
|
|
* purpose.
|
|
*/
|
|
int syncpt_id;
|
|
/**
|
|
* @valid_heads: A bit-mapped variable used to store all the
|
|
* heads that are being used for frame-lock. Default value is
|
|
* being taken from device tree. Each bit set corresponds to
|
|
* the head_id being used for frame-lock.
|
|
*/
|
|
ulong valid_heads;
|
|
/**
|
|
* @lock: Used by dc_common for operating on shared variables
|
|
* amongst multiple heads to avoid multiple heads running
|
|
* through the critical section simultaneously.
|
|
*/
|
|
struct mutex lock;
|
|
/**
|
|
* @heads_locked: Used by dc_common to make sure that the
|
|
* participating heads are frame-locked before taking in
|
|
* requests for flip-lock. Required as a safety back-up for
|
|
* cases where we can't guarantee the probe order(tegradc
|
|
* and dc_common).
|
|
*/
|
|
bool heads_locked;
|
|
/**
|
|
* @dev: Points to device struct in platform_device.
|
|
*/
|
|
struct device *dev;
|
|
/**
|
|
* @dma_handle: Stores the dma-address to be used by nvhost for
|
|
* accessing the commands/opcodes programmed by dc_common.
|
|
*/
|
|
dma_addr_t dma_handle;
|
|
/**
|
|
* @job: Pointer to the job-handle allocated by nvhost which is
|
|
* used to submit jobs from dc_common.
|
|
*/
|
|
struct nvhost_job *job;
|
|
/**
|
|
* @pdev: Points the platform_device for dc_common.
|
|
*/
|
|
struct platform_device *pdev;
|
|
/**
|
|
* @channel: Points to the channel mapped by nvhost for job
|
|
* submission.
|
|
*/
|
|
struct nvhost_channel *channel;
|
|
/**
|
|
* @head_data: Stores data related to multiple heads. Please
|
|
* see above for detailed description.
|
|
*/
|
|
struct bit_mapped_data head_data;
|
|
/**
|
|
* @upd_val: Stores value to be programmed to DC_CMD_STATE_CONTROL
|
|
* register during job submission for flip lock. Mulitple heads can
|
|
* have different values to be written to the regsiter. Could have
|
|
* reused dsp_cmd_reg_val here but there can be flip requests while
|
|
* the frame lock job submisssion is pending.
|
|
*/
|
|
ulong *upd_val;
|
|
/**
|
|
* @dsp_cmd_reg_val: Stores value to be programmed for frame lock
|
|
* to DC_CMD_STATE_CONTROL register during job submission.
|
|
* Mulitple heads can have different values to be written to the
|
|
* regsiter.
|
|
*/
|
|
ulong *dsp_cmd_reg_val;
|
|
/**
|
|
* @prgrm_reg_reqs_wq: wait queue for all the requests received
|
|
* to program DC_CMD_STATE_CONTROL register.
|
|
*/
|
|
wait_queue_head_t prgrm_reg_reqs_wq;
|
|
/**
|
|
* @imp_table: Holds platform data of IHUB settings for all
|
|
* windows and heads.
|
|
*/
|
|
struct nvdisp_imp_table *imp_table;
|
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
struct dentry *debugdir;
|
|
#endif
|
|
};
|
|
|
|
/**
|
|
* struct tegra_dc_common_platform_data- This is used to store dc_common
|
|
* specific data from the device tree.
|
|
* @valid_heads: Same usage as valid_heads in tegra_dc_common.
|
|
* @imp_table: IMP platform data.
|
|
* Please see above for details.
|
|
*/
|
|
struct tegra_dc_common_platform_data {
|
|
u8 valid_heads;
|
|
struct nvdisp_imp_table *imp_table;
|
|
};
|
|
|
|
/*
|
|
* Functions prototype here. Descriptions could be found in dc_common.c
|
|
* file.
|
|
*/
|
|
struct tegra_dc_common_platform_data
|
|
*of_dc_common_parse_platform_data(struct platform_device *pdev);
|
|
|
|
int tegra_dc_common_sync_flips(struct tegra_dc *dc, ulong val, ulong reg);
|
|
|
|
int tegra_dc_common_sync_frames(struct tegra_dc *dc, ulong dsp_cmd_reg,
|
|
ulong dsp_cmd_state_access_reg, ulong dsp_cmd_reg_val);
|
|
|
|
int tegra_dc_common_handle_flip_lock_error(struct tegra_dc *dc);
|
|
|
|
int tegra_dc_common_get_frm_lock_params(
|
|
struct tegra_dc_ext_control_frm_lck_params *params);
|
|
|
|
int tegra_dc_common_set_frm_lock_params(
|
|
struct tegra_dc_ext_control_frm_lck_params *params);
|
|
|
|
struct nvdisp_imp_table
|
|
*tegra_dc_common_get_imp_table(void);
|
|
|
|
bool tegra_dc_common_probe_status(void);
|
|
#endif
|