646 lines
20 KiB
C
646 lines
20 KiB
C
|
/*
|
||
|
* arch/arm/mach-tegra/la_priv.h
|
||
|
*
|
||
|
* Copyright (C) 2012-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 _MACH_TEGRA_LA_PRIV_H_
|
||
|
#define _MACH_TEGRA_LA_PRIV_H_
|
||
|
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A_LOW_SHIFT 0
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A_LOW_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A_LOW_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A_HIGH_SHIFT 16
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A_HIGH_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0A_HIGH_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB_LOW_SHIFT 0
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB_LOW_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB_LOW_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB_HIGH_SHIFT 16
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB_HIGH_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0AB_HIGH_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B_LOW_SHIFT 0
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B_LOW_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B_LOW_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B_HIGH_SHIFT 16
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B_HIGH_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0B_HIGH_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB_LOW_SHIFT 0
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB_LOW_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB_LOW_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB_HIGH_SHIFT 16
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB_HIGH_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0BB_HIGH_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C_LOW_SHIFT 0
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C_LOW_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C_LOW_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C_HIGH_SHIFT 16
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C_HIGH_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0C_HIGH_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB_LOW_SHIFT 0
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB_LOW_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB_LOW_SHIFT)
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB_HIGH_SHIFT 16
|
||
|
#define MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB_HIGH_MASK \
|
||
|
(0xff << MC_SCALED_LATENCY_ALLOWANCE_DISPLAY0CB_HIGH_SHIFT)
|
||
|
|
||
|
#define EMEM_PTSA_RATE_WIDTH 12
|
||
|
#define MAX_DDA_RATE 0xfff
|
||
|
|
||
|
#define LA_FP_FACTOR 1000U
|
||
|
#define LA_REAL_TO_FP(val) ((val) * LA_FP_FACTOR)
|
||
|
#define LA_FP_TO_REAL(val) ((val) / LA_FP_FACTOR)
|
||
|
#define LA_ADDITIONAL_FP_FACTOR 10U
|
||
|
#define LA_FP_TO_FPA(val) ((val) * LA_ADDITIONAL_FP_FACTOR)
|
||
|
#define LA_FPA_TO_FP(val) ((val) / LA_ADDITIONAL_FP_FACTOR)
|
||
|
#define LA_FPA_TO_REAL(val) ((val) / LA_FP_FACTOR / \
|
||
|
LA_ADDITIONAL_FP_FACTOR)
|
||
|
#define LA_REAL_TO_FPA(val) ((val) * LA_FP_FACTOR * \
|
||
|
LA_ADDITIONAL_FP_FACTOR)
|
||
|
|
||
|
#define MASK(x) \
|
||
|
((0xFFFFFFFFUL >> (31 - (1 ? x) + (0 ? x))) << (0 ? x))
|
||
|
#define SHIFT(x) \
|
||
|
(0 ? x)
|
||
|
#define ID(id) \
|
||
|
TEGRA_LA_##id
|
||
|
|
||
|
#define VALIDATE_ID(id, p) \
|
||
|
do { \
|
||
|
if (id >= TEGRA_LA_MAX_ID || (p)->id_to_index[(id)] == 0xFFFF) { \
|
||
|
WARN_ONCE(1, "%s: invalid Id=%d", __func__, (id)); \
|
||
|
return -EINVAL; \
|
||
|
} \
|
||
|
BUG_ON((p)->la_info_array[(p)->id_to_index[(id)]].id != (id)); \
|
||
|
} while (0)
|
||
|
|
||
|
#define VALIDATE_BW(bw_in_mbps) \
|
||
|
do { \
|
||
|
if (bw_in_mbps >= 4096) \
|
||
|
return -EINVAL; \
|
||
|
} while (0)
|
||
|
|
||
|
#define VALIDATE_THRESHOLDS(tl, tm, th) \
|
||
|
do { \
|
||
|
if ((tl) > 100 || (tm) > 100 || (th) > 100) \
|
||
|
return -EINVAL; \
|
||
|
} while (0)
|
||
|
|
||
|
#define LAST_DISP_CLIENT_ID ID(DISPLAYD)
|
||
|
#define NUM_DISP_CLIENTS (LAST_DISP_CLIENT_ID - FIRST_DISP_CLIENT_ID + 1)
|
||
|
#define DISP_CLIENT_ID(id) (ID(id) - FIRST_DISP_CLIENT_ID)
|
||
|
|
||
|
#define FIRST_CAMERA_CLIENT_ID ID(VI_W)
|
||
|
#define LAST_CAMERA_CLIENT_ID ID(ISP_WBB)
|
||
|
#define NUM_CAMERA_CLIENTS (LAST_CAMERA_CLIENT_ID - \
|
||
|
FIRST_CAMERA_CLIENT_ID + \
|
||
|
1)
|
||
|
#define CAMERA_IDX(id) (ID(id) - FIRST_CAMERA_CLIENT_ID)
|
||
|
#define CAMERA_LA_IDX(id) (id - FIRST_CAMERA_CLIENT_ID)
|
||
|
#define AGG_CAMERA_ID(id) TEGRA_LA_AGG_CAMERA_##id
|
||
|
|
||
|
#define MC_LA_MAX_VALUE 255U
|
||
|
#define MC_PTSA_MIN_DEFAULT_MASK 0x3f
|
||
|
#define MC_PTSA_MAX_DEFAULT_MASK 0x3f
|
||
|
#define MC_PTSA_RATE_DEFAULT_MASK 0xfff
|
||
|
|
||
|
#define LA_USEC_TO_NSEC_FACTOR 1000
|
||
|
#define LA_HZ_TO_MHZ_FACTOR 1000000
|
||
|
|
||
|
/*
|
||
|
* Setup macro for la_client_info array.
|
||
|
*/
|
||
|
#define LA(f, e, a, r, i, ss, la, clk) \
|
||
|
{ \
|
||
|
.fifo_size_in_atoms = f, \
|
||
|
.expiration_in_ns = e, \
|
||
|
.reg_addr = MC_LATENCY_ALLOWANCE_ ## a, \
|
||
|
.mask = MASK(r), \
|
||
|
.shift = SHIFT(r), \
|
||
|
.id = ID(i), \
|
||
|
.name = __stringify(i), \
|
||
|
.scaling_supported = ss, \
|
||
|
.init_la = la, \
|
||
|
.la_ref_clk_mhz = clk \
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* Several macros for initializing and accessing/modifying the PTSA registers.
|
||
|
*/
|
||
|
#define MC_SET_INIT_PTSA(p, client, min, max) \
|
||
|
do { \
|
||
|
(p)->client ## _ptsa_min = (unsigned int)(min) & \
|
||
|
MC_PTSA_MIN_DEFAULT_MASK; \
|
||
|
(p)->client ## _ptsa_max = (unsigned int)(max) & \
|
||
|
MC_PTSA_MAX_DEFAULT_MASK; \
|
||
|
} while (0)
|
||
|
|
||
|
#define READ_PTSA_MIN_MAX(p, field, reg) \
|
||
|
do { \
|
||
|
(p)->field ##_ptsa_min = mc_readl(MC_ ## reg ## _PTSA_MIN); \
|
||
|
(p)->field ##_ptsa_max = mc_readl(MC_ ## reg ## _PTSA_MAX); \
|
||
|
} while (0)
|
||
|
#define READ_PTSA_MIN_MAX_RATE(p, field, reg) \
|
||
|
do { \
|
||
|
(p)->field ##_ptsa_min = mc_readl(MC_ ## reg ## _PTSA_MIN); \
|
||
|
(p)->field ##_ptsa_max = mc_readl(MC_ ## reg ## _PTSA_MAX); \
|
||
|
(p)->field ##_ptsa_rate = mc_readl(MC_ ## reg ## _PTSA_RATE); \
|
||
|
} while (0)
|
||
|
|
||
|
#define WRITE_PTSA_MIN_MAX(p, field, reg) \
|
||
|
do { \
|
||
|
mc_writel((p)->field ##_ptsa_min, MC_ ## reg ## _PTSA_MIN); \
|
||
|
mc_writel((p)->field ##_ptsa_max, MC_ ## reg ## _PTSA_MAX); \
|
||
|
} while (0)
|
||
|
#define WRITE_PTSA_MIN_MAX_RATE(p, field, reg) \
|
||
|
do { \
|
||
|
mc_writel((p)->field ##_ptsa_min, MC_ ## reg ## _PTSA_MIN); \
|
||
|
mc_writel((p)->field ##_ptsa_max, MC_ ## reg ## _PTSA_MAX); \
|
||
|
mc_writel((p)->field ##_ptsa_rate, MC_ ## reg ## _PTSA_RATE); \
|
||
|
} while (0)
|
||
|
|
||
|
/*
|
||
|
* Some common functions for both t12x and t21x.
|
||
|
*/
|
||
|
struct la_client_info;
|
||
|
void program_la(struct la_client_info *ci, int la);
|
||
|
void program_scaled_la_t21x(struct la_client_info *ci, int la);
|
||
|
int la_suspend(void);
|
||
|
void la_resume(void);
|
||
|
|
||
|
/*
|
||
|
* Note about fixed point arithmetic:
|
||
|
* ----------------------------------
|
||
|
* This file contains fixed point values and arithmetic due to the need to use
|
||
|
* floating point values. All fixed point values have the "_fp" or "_FP" suffix
|
||
|
* in their name. Macros used to convert between real and fixed point values are
|
||
|
* listed below:
|
||
|
* - LA_FP_FACTOR
|
||
|
* - LA_REAL_TO_FP(val)
|
||
|
* - LA_FP_TO_REAL(val)
|
||
|
*
|
||
|
* Some scenarios require additional accuracy than what can be provided with
|
||
|
* T12X_LA_FP_FACTOR. For these special cases we use the following additional
|
||
|
* fixed point factor:- T12X_LA_ADDITIONAL_FP_FACTOR. Fixed point values which
|
||
|
* use the addtional fixed point factor have a suffix of "_fpa" or "_FPA" in
|
||
|
* their name. Macros used to convert between fpa values and other forms (i.e.
|
||
|
* fp and real) are as follows:
|
||
|
* - LA_FP_TO_FPA(val)
|
||
|
* - LA_FPA_TO_FP(val)
|
||
|
* - LA_FPA_TO_REAL(val)
|
||
|
* - LA_REAL_TO_FPA(val)
|
||
|
*/
|
||
|
|
||
|
static inline unsigned int la_real_to_fp(unsigned int val)
|
||
|
{
|
||
|
return val * LA_FP_FACTOR;
|
||
|
}
|
||
|
|
||
|
static inline unsigned int la_fp_to_real(unsigned int val)
|
||
|
{
|
||
|
return val / LA_FP_FACTOR;
|
||
|
}
|
||
|
|
||
|
static inline bool is_display_client(enum tegra_la_id id)
|
||
|
{
|
||
|
return ((id >= FIRST_DISP_CLIENT_ID) && (id <= LAST_DISP_CLIENT_ID));
|
||
|
}
|
||
|
|
||
|
static inline bool is_camera_client(enum tegra_la_id id)
|
||
|
{
|
||
|
return ((id >= FIRST_CAMERA_CLIENT_ID) &&
|
||
|
(id <= LAST_CAMERA_CLIENT_ID));
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* TODO: this doesn't actually return an FP per se. It returns a value suitable
|
||
|
* for placing in the DDA register fields; therefor this function needs
|
||
|
* renaming.
|
||
|
*/
|
||
|
static inline unsigned int __fraction2dda_fp(unsigned int fraction_fpa,
|
||
|
unsigned int div,
|
||
|
unsigned int mask)
|
||
|
{
|
||
|
unsigned int dda = 0;
|
||
|
int i = 0;
|
||
|
unsigned int r = 0;
|
||
|
|
||
|
fraction_fpa /= div;
|
||
|
|
||
|
for (i = 0; i < EMEM_PTSA_RATE_WIDTH; i++) {
|
||
|
fraction_fpa *= 2;
|
||
|
r = LA_FPA_TO_REAL(fraction_fpa);
|
||
|
dda = (dda << 1) | (unsigned int)(r);
|
||
|
fraction_fpa -= LA_REAL_TO_FPA(r);
|
||
|
}
|
||
|
if (fraction_fpa > 0) {
|
||
|
/* Do not round up if the calculated dda is at the mask value
|
||
|
already, it will overflow */
|
||
|
if (dda != mask)
|
||
|
dda++; /* to round up dda value */
|
||
|
}
|
||
|
|
||
|
return min(dda, (unsigned int)MAX_DDA_RATE);
|
||
|
}
|
||
|
|
||
|
static inline unsigned int fraction2dda_fp(unsigned int fraction_fp,
|
||
|
unsigned int div,
|
||
|
unsigned int mask) {
|
||
|
unsigned int fraction_fpa = LA_FP_TO_FPA(fraction_fp);
|
||
|
|
||
|
return __fraction2dda_fp(fraction_fpa, div, mask);
|
||
|
}
|
||
|
|
||
|
#define ENABLE_LA_DEBUG 0
|
||
|
#define la_debug(fmt, ...) \
|
||
|
do { \
|
||
|
if (ENABLE_LA_DEBUG) \
|
||
|
pr_info("la_debug: " fmt, ##__VA_ARGS__); \
|
||
|
} while (0)
|
||
|
|
||
|
/* The following enum defines IDs for aggregated camera clients. In some cases
|
||
|
we have to deal with groups of camera clients rather than individual
|
||
|
clients. */
|
||
|
enum agg_camera_client_id {
|
||
|
TEGRA_LA_AGG_CAMERA_VE = 0,
|
||
|
TEGRA_LA_AGG_CAMERA_VE2,
|
||
|
TEGRA_LA_AGG_CAMERA_ISP,
|
||
|
TEGRA_LA_AGG_CAMERA_NUM_CLIENTS
|
||
|
};
|
||
|
|
||
|
enum la_client_type {
|
||
|
TEGRA_LA_DYNAMIC_READ_CLIENT,
|
||
|
TEGRA_LA_CONSTANT_READ_CLIENT,
|
||
|
TEGRA_LA_DISPLAY_READ_CLIENT,
|
||
|
TEGRA_LA_WRITE_CLIENT,
|
||
|
TEGRA_LA_HUB_READ_CLIENT,
|
||
|
TEGRA_LA_HUB_WRITE_CLIENT,
|
||
|
TEGRA_LA_CPU_READ_CLIENT,
|
||
|
TEGRA_LA_CIFLL_WRITE_CLIENT,
|
||
|
TEGRA_LA_WCAM_WRITE_CLIENT,
|
||
|
TEGRA_LA_NVLRHP_READ_CLIENT,
|
||
|
TEGRA_LA_GPU_READ_CLIENT,
|
||
|
TEGRA_LA_NUM_CLIENT_TYPES
|
||
|
};
|
||
|
|
||
|
enum la_traffic_type {
|
||
|
TEGRA_LA_HISO,
|
||
|
TEGRA_LA_SISO,
|
||
|
TEGRA_LA_NISO
|
||
|
};
|
||
|
|
||
|
struct la_client_info {
|
||
|
enum la_client_type client_type;
|
||
|
unsigned int fifo_size_in_atoms;
|
||
|
unsigned int expiration_in_ns; /* worst case expiration value */
|
||
|
unsigned int reg_addr;
|
||
|
unsigned long mask;
|
||
|
unsigned long shift;
|
||
|
enum tegra_la_id id;
|
||
|
char *name;
|
||
|
bool scaling_supported;
|
||
|
unsigned int min_scaling_ratio;
|
||
|
unsigned int init_la; /* initial la to set for client */
|
||
|
unsigned int la_set;
|
||
|
unsigned int la_ref_clk_mhz;
|
||
|
};
|
||
|
|
||
|
struct agg_camera_client_info {
|
||
|
unsigned int bw_fp;
|
||
|
unsigned int frac_fp;
|
||
|
unsigned int ptsa_min;
|
||
|
unsigned int ptsa_max;
|
||
|
bool is_hiso;
|
||
|
};
|
||
|
|
||
|
struct la_scaling_info {
|
||
|
unsigned int threshold_low;
|
||
|
unsigned int threshold_mid;
|
||
|
unsigned int threshold_high;
|
||
|
int scaling_ref_count;
|
||
|
int actual_la_to_set;
|
||
|
int la_set;
|
||
|
};
|
||
|
|
||
|
struct la_scaling_reg_info {
|
||
|
enum tegra_la_id id;
|
||
|
void *tl_reg_addr;
|
||
|
unsigned int tl_mask;
|
||
|
unsigned int tl_shift;
|
||
|
void *tm_reg_addr;
|
||
|
unsigned int tm_mask;
|
||
|
unsigned int tm_shift;
|
||
|
void *th_reg_addr;
|
||
|
unsigned int th_mask;
|
||
|
unsigned int th_shift;
|
||
|
};
|
||
|
|
||
|
struct ptsa_info {
|
||
|
unsigned int dis_ptsa_rate;
|
||
|
unsigned int dis_ptsa_min;
|
||
|
unsigned int dis_ptsa_max;
|
||
|
enum la_traffic_type dis_traffic_type;
|
||
|
unsigned int disb_ptsa_rate;
|
||
|
unsigned int disb_ptsa_min;
|
||
|
unsigned int disb_ptsa_max;
|
||
|
enum la_traffic_type disb_traffic_type;
|
||
|
unsigned int ve_ptsa_rate;
|
||
|
unsigned int ve_ptsa_min;
|
||
|
unsigned int ve_ptsa_max;
|
||
|
enum la_traffic_type ve_traffic_type;
|
||
|
unsigned int ve2_ptsa_rate;
|
||
|
unsigned int ve2_ptsa_min;
|
||
|
unsigned int ve2_ptsa_max;
|
||
|
enum la_traffic_type ve2_traffic_type;
|
||
|
unsigned int ring2_ptsa_rate;
|
||
|
unsigned int ring2_ptsa_min;
|
||
|
unsigned int ring2_ptsa_max;
|
||
|
enum la_traffic_type ring2_traffic_type;
|
||
|
unsigned int bbc_ptsa_rate;
|
||
|
unsigned int bbc_ptsa_min;
|
||
|
unsigned int bbc_ptsa_max;
|
||
|
enum la_traffic_type bbc_traffic_type;
|
||
|
unsigned int mpcorer_ptsa_rate;
|
||
|
unsigned int mpcorer_ptsa_min;
|
||
|
unsigned int mpcorer_ptsa_max;
|
||
|
enum la_traffic_type mpcorer_traffic_type;
|
||
|
unsigned int ftop_ptsa_min;
|
||
|
unsigned int ftop_ptsa_max;
|
||
|
unsigned int ftop_ptsa_rate;
|
||
|
enum la_traffic_type ftop_traffic_type;
|
||
|
unsigned int smmu_ptsa_rate;
|
||
|
unsigned int smmu_ptsa_min;
|
||
|
unsigned int smmu_ptsa_max;
|
||
|
enum la_traffic_type smmu_traffic_type;
|
||
|
unsigned int ring1_ptsa_rate;
|
||
|
unsigned int ring1_ptsa_min;
|
||
|
unsigned int ring1_ptsa_max;
|
||
|
enum la_traffic_type ring1_traffic_type;
|
||
|
|
||
|
unsigned int dis_extra_snap_level;
|
||
|
unsigned int heg_extra_snap_level;
|
||
|
unsigned int ptsa_grant_dec;
|
||
|
unsigned int bbcll_earb_cfg;
|
||
|
|
||
|
unsigned int isp_ptsa_rate;
|
||
|
unsigned int isp_ptsa_min;
|
||
|
unsigned int isp_ptsa_max;
|
||
|
enum la_traffic_type isp_traffic_type;
|
||
|
unsigned int a9avppc_ptsa_min;
|
||
|
unsigned int a9avppc_ptsa_max;
|
||
|
enum la_traffic_type a9avppc_traffic_type;
|
||
|
unsigned int avp_ptsa_min;
|
||
|
unsigned int avp_ptsa_max;
|
||
|
enum la_traffic_type avp_traffic_type;
|
||
|
unsigned int mse_ptsa_rate;
|
||
|
unsigned int mse_ptsa_min;
|
||
|
unsigned int mse_ptsa_max;
|
||
|
enum la_traffic_type mse_traffic_type;
|
||
|
unsigned int gk_ptsa_rate;
|
||
|
unsigned int gk_ptsa_min;
|
||
|
unsigned int gk_ptsa_max;
|
||
|
enum la_traffic_type gk_traffic_type;
|
||
|
unsigned int vicpc_ptsa_rate;
|
||
|
unsigned int vicpc_ptsa_min;
|
||
|
unsigned int vicpc_ptsa_max;
|
||
|
enum la_traffic_type vicpc_traffic_type;
|
||
|
unsigned int apb_ptsa_rate;
|
||
|
unsigned int apb_ptsa_min;
|
||
|
unsigned int apb_ptsa_max;
|
||
|
enum la_traffic_type apb_traffic_type;
|
||
|
unsigned int pcx_ptsa_rate;
|
||
|
unsigned int pcx_ptsa_min;
|
||
|
unsigned int pcx_ptsa_max;
|
||
|
enum la_traffic_type pcx_traffic_type;
|
||
|
unsigned int host_ptsa_rate;
|
||
|
unsigned int host_ptsa_min;
|
||
|
unsigned int host_ptsa_max;
|
||
|
enum la_traffic_type host_traffic_type;
|
||
|
unsigned int ahb_ptsa_min;
|
||
|
unsigned int ahb_ptsa_max;
|
||
|
enum la_traffic_type ahb_traffic_type;
|
||
|
unsigned int sax_ptsa_rate;
|
||
|
unsigned int sax_ptsa_min;
|
||
|
unsigned int sax_ptsa_max;
|
||
|
enum la_traffic_type sax_traffic_type;
|
||
|
unsigned int aud_ptsa_rate;
|
||
|
unsigned int aud_ptsa_min;
|
||
|
unsigned int aud_ptsa_max;
|
||
|
enum la_traffic_type aud_traffic_type;
|
||
|
unsigned int sd_ptsa_rate;
|
||
|
unsigned int sd_ptsa_min;
|
||
|
unsigned int sd_ptsa_max;
|
||
|
enum la_traffic_type sd_traffic_type;
|
||
|
unsigned int usbx_ptsa_rate;
|
||
|
unsigned int usbx_ptsa_min;
|
||
|
unsigned int usbx_ptsa_max;
|
||
|
enum la_traffic_type usbx_traffic_type;
|
||
|
unsigned int usbd_ptsa_rate;
|
||
|
unsigned int usbd_ptsa_min;
|
||
|
unsigned int usbd_ptsa_max;
|
||
|
enum la_traffic_type usbd_traffic_type;
|
||
|
|
||
|
/* Tegra12x */
|
||
|
unsigned int r0_dis_ptsa_min;
|
||
|
unsigned int r0_dis_ptsa_max;
|
||
|
enum la_traffic_type r0_dis_traffic_type;
|
||
|
unsigned int r0_disb_ptsa_min;
|
||
|
unsigned int r0_disb_ptsa_max;
|
||
|
enum la_traffic_type r0_disb_traffic_type;
|
||
|
unsigned int vd_ptsa_min;
|
||
|
unsigned int vd_ptsa_max;
|
||
|
enum la_traffic_type vd_traffic_type;
|
||
|
|
||
|
/* Tegra18x */
|
||
|
unsigned int aondmapc_ptsa_rate;
|
||
|
unsigned int aondmapc_ptsa_min;
|
||
|
unsigned int aondmapc_ptsa_max;
|
||
|
enum la_traffic_type aondmapc_traffic_type;
|
||
|
unsigned int aonpc_ptsa_rate;
|
||
|
unsigned int aonpc_ptsa_min;
|
||
|
unsigned int aonpc_ptsa_max;
|
||
|
enum la_traffic_type aonpc_traffic_type;
|
||
|
unsigned int apedmapc_ptsa_rate;
|
||
|
unsigned int apedmapc_ptsa_min;
|
||
|
unsigned int apedmapc_ptsa_max;
|
||
|
enum la_traffic_type apedmapc_traffic_type;
|
||
|
unsigned int bpmpdmapc_ptsa_rate;
|
||
|
unsigned int bpmpdmapc_ptsa_min;
|
||
|
unsigned int bpmpdmapc_ptsa_max;
|
||
|
enum la_traffic_type bpmpdmapc_traffic_type;
|
||
|
unsigned int bpmppc_ptsa_rate;
|
||
|
unsigned int bpmppc_ptsa_min;
|
||
|
unsigned int bpmppc_ptsa_max;
|
||
|
enum la_traffic_type bpmppc_traffic_type;
|
||
|
unsigned int dfd_ptsa_rate;
|
||
|
unsigned int dfd_ptsa_min;
|
||
|
unsigned int dfd_ptsa_max;
|
||
|
enum la_traffic_type dfd_traffic_type;
|
||
|
unsigned int eqospc_ptsa_rate;
|
||
|
unsigned int eqospc_ptsa_min;
|
||
|
unsigned int eqospc_ptsa_max;
|
||
|
enum la_traffic_type eqospc_traffic_type;
|
||
|
unsigned int hdapc_ptsa_rate;
|
||
|
unsigned int hdapc_ptsa_min;
|
||
|
unsigned int hdapc_ptsa_max;
|
||
|
enum la_traffic_type hdapc_traffic_type;
|
||
|
unsigned int mll_mpcorer_ptsa_rate;
|
||
|
unsigned int mll_mpcorer_ptsa_min;
|
||
|
unsigned int mll_mpcorer_ptsa_max;
|
||
|
enum la_traffic_type mll_mpcorer_traffic_type;
|
||
|
unsigned int mse2_ptsa_rate;
|
||
|
unsigned int mse2_ptsa_min;
|
||
|
unsigned int mse2_ptsa_max;
|
||
|
enum la_traffic_type mse2_traffic_type;
|
||
|
unsigned int nic_ptsa_rate;
|
||
|
unsigned int nic_ptsa_min;
|
||
|
unsigned int nic_ptsa_max;
|
||
|
enum la_traffic_type nic_traffic_type;
|
||
|
unsigned int nvd_ptsa_rate;
|
||
|
unsigned int nvd_ptsa_min;
|
||
|
unsigned int nvd_ptsa_max;
|
||
|
enum la_traffic_type nvd_traffic_type;
|
||
|
unsigned int nvd3_ptsa_rate;
|
||
|
unsigned int nvd3_ptsa_min;
|
||
|
unsigned int nvd3_ptsa_max;
|
||
|
enum la_traffic_type nvd3_traffic_type;
|
||
|
unsigned int roc_dma_r_ptsa_rate;
|
||
|
unsigned int roc_dma_r_ptsa_min;
|
||
|
unsigned int roc_dma_r_ptsa_max;
|
||
|
enum la_traffic_type roc_dma_r_traffic_type;
|
||
|
unsigned int ring1_rd_b_ptsa_rate;
|
||
|
unsigned int ring1_rd_b_ptsa_min;
|
||
|
unsigned int ring1_rd_b_ptsa_max;
|
||
|
enum la_traffic_type ring1_rd_b_traffic_type;
|
||
|
unsigned int ring1_rd_nb_ptsa_rate;
|
||
|
unsigned int ring1_rd_nb_ptsa_min;
|
||
|
unsigned int ring1_rd_nb_ptsa_max;
|
||
|
enum la_traffic_type ring1_rd_nb_traffic_type;
|
||
|
unsigned int ring1_wr_b_ptsa_rate;
|
||
|
unsigned int ring1_wr_b_ptsa_min;
|
||
|
unsigned int ring1_wr_b_ptsa_max;
|
||
|
enum la_traffic_type ring1_wr_b_traffic_type;
|
||
|
unsigned int ring1_wr_nb_ptsa_rate;
|
||
|
unsigned int ring1_wr_nb_ptsa_min;
|
||
|
unsigned int ring1_wr_nb_ptsa_max;
|
||
|
enum la_traffic_type ring1_wr_nb_traffic_type;
|
||
|
unsigned int scedmapc_ptsa_rate;
|
||
|
unsigned int scedmapc_ptsa_min;
|
||
|
unsigned int scedmapc_ptsa_max;
|
||
|
enum la_traffic_type scedmapc_traffic_type;
|
||
|
unsigned int scepc_ptsa_rate;
|
||
|
unsigned int scepc_ptsa_min;
|
||
|
unsigned int scepc_ptsa_max;
|
||
|
enum la_traffic_type scepc_traffic_type;
|
||
|
unsigned int sdm_ptsa_rate;
|
||
|
unsigned int sdm_ptsa_min;
|
||
|
unsigned int sdm_ptsa_max;
|
||
|
enum la_traffic_type sdm_traffic_type;
|
||
|
unsigned int sdm1_ptsa_rate;
|
||
|
unsigned int sdm1_ptsa_min;
|
||
|
unsigned int sdm1_ptsa_max;
|
||
|
enum la_traffic_type sdm1_traffic_type;
|
||
|
unsigned int ufshcpc_ptsa_rate;
|
||
|
unsigned int ufshcpc_ptsa_min;
|
||
|
unsigned int ufshcpc_ptsa_max;
|
||
|
enum la_traffic_type ufshcpc_traffic_type;
|
||
|
unsigned int vicpc3_ptsa_rate;
|
||
|
unsigned int vicpc3_ptsa_min;
|
||
|
unsigned int vicpc3_ptsa_max;
|
||
|
enum la_traffic_type vicpc3_traffic_type;
|
||
|
|
||
|
/* Tegra21x */
|
||
|
unsigned int jpg_ptsa_rate;
|
||
|
unsigned int jpg_ptsa_min;
|
||
|
unsigned int jpg_ptsa_max;
|
||
|
enum la_traffic_type jpg_traffic_type;
|
||
|
unsigned int gk2_ptsa_rate;
|
||
|
unsigned int gk2_ptsa_min;
|
||
|
unsigned int gk2_ptsa_max;
|
||
|
enum la_traffic_type gk2_traffic_type;
|
||
|
};
|
||
|
|
||
|
|
||
|
struct la_chip_specific {
|
||
|
int ns_per_tick;
|
||
|
int atom_size;
|
||
|
int la_max_value;
|
||
|
spinlock_t lock;
|
||
|
int la_info_array_size;
|
||
|
struct la_client_info *la_info_array;
|
||
|
unsigned short id_to_index[ID(MAX_ID) + 1];
|
||
|
unsigned int disp_bw_array[NUM_DISP_CLIENTS];
|
||
|
struct disp_client disp_clients[NUM_DISP_CLIENTS];
|
||
|
unsigned int bbc_bw_array[ID(BBCLLR) - ID(BBCR) + 1];
|
||
|
unsigned int camera_bw_array[NUM_CAMERA_CLIENTS];
|
||
|
struct agg_camera_client_info
|
||
|
agg_camera_array[TEGRA_LA_AGG_CAMERA_NUM_CLIENTS];
|
||
|
struct la_scaling_info scaling_info[ID(MAX_ID)];
|
||
|
int la_scaling_enable_count;
|
||
|
struct dentry *latency_debug_dir;
|
||
|
struct ptsa_info ptsa_info;
|
||
|
bool disable_la;
|
||
|
bool disable_ptsa;
|
||
|
struct la_to_dc_params la_params;
|
||
|
bool disable_disp_ptsa;
|
||
|
bool disable_bbc_ptsa;
|
||
|
|
||
|
void (*init_ptsa)(void);
|
||
|
void (*update_display_ptsa_rate)(unsigned int *disp_bw_array);
|
||
|
int (*update_camera_ptsa_rate)(enum tegra_la_id id,
|
||
|
unsigned int bw_mbps,
|
||
|
int is_hiso);
|
||
|
int (*set_disp_la)(enum tegra_la_id id,
|
||
|
unsigned long emc_freq_hz,
|
||
|
unsigned int bw_mbps,
|
||
|
struct dc_to_la_params disp_params);
|
||
|
int (*check_disp_la)(enum tegra_la_id id,
|
||
|
unsigned long emc_freq_hz,
|
||
|
unsigned int bw_mbps,
|
||
|
struct dc_to_la_params disp_params);
|
||
|
int (*set_init_la)(enum tegra_la_id id, unsigned int bw_mbps);
|
||
|
int (*set_dynamic_la)(enum tegra_la_id id, unsigned int bw_mbps);
|
||
|
int (*enable_la_scaling)(enum tegra_la_id id,
|
||
|
unsigned int threshold_low,
|
||
|
unsigned int threshold_mid,
|
||
|
unsigned int threshold_high);
|
||
|
void (*disable_la_scaling)(enum tegra_la_id id);
|
||
|
void (*save_ptsa)(void);
|
||
|
void (*program_ptsa)(void);
|
||
|
void (*save_non_la_ptsa)(void);
|
||
|
void (*program_non_la_ptsa)(void);
|
||
|
int (*suspend)(void);
|
||
|
void (*resume)(void);
|
||
|
void (*mc_pcie_init)(void);
|
||
|
void (*la_cleanup)(void);
|
||
|
};
|
||
|
|
||
|
|
||
|
void tegra_la_get_t3_specific(struct la_chip_specific *cs);
|
||
|
void tegra_la_get_t14x_specific(struct la_chip_specific *cs);
|
||
|
void tegra_la_get_t11x_specific(struct la_chip_specific *cs);
|
||
|
void tegra_la_get_t12x_specific(struct la_chip_specific *cs);
|
||
|
void tegra_la_get_t21x_specific(struct la_chip_specific *cs);
|
||
|
#ifdef CONFIG_ARCH_TEGRA_18x_SOC
|
||
|
void tegra_la_get_t18x_specific(struct la_chip_specific *cs);
|
||
|
#else
|
||
|
static inline void tegra_la_get_t18x_specific(struct la_chip_specific *cs) {}
|
||
|
#endif
|
||
|
#ifdef CONFIG_ARCH_TEGRA_19x_SOC
|
||
|
void tegra_la_get_t19x_specific(struct la_chip_specific *cs);
|
||
|
#else
|
||
|
static inline void tegra_la_get_t19x_specific(struct la_chip_specific *cs) {}
|
||
|
#endif
|
||
|
|
||
|
#endif /* _MACH_TEGRA_LA_PRIV_H_ */
|