summaryrefslogtreecommitdiff
path: root/drivers/thermal/tegra/soctherm.h
blob: 70501e73d586230d3caca8dea0966afd7f23142a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (c) 2014-2016, 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 __DRIVERS_THERMAL_TEGRA_SOCTHERM_H
#define __DRIVERS_THERMAL_TEGRA_SOCTHERM_H

#define THERMCTL_LEVEL0_GROUP_CPU               0x0
#define THERMCTL_LEVEL0_GROUP_GPU		0x4
#define THERMCTL_LEVEL0_GROUP_MEM		0x8
#define THERMCTL_LEVEL0_GROUP_TSENSE		0xc

#define SENSOR_CONFIG2                          8
#define SENSOR_CONFIG2_THERMA_MASK		(0xffff << 16)
#define SENSOR_CONFIG2_THERMA_SHIFT		16
#define SENSOR_CONFIG2_THERMB_MASK		0xffff
#define SENSOR_CONFIG2_THERMB_SHIFT		0

#define THERMCTL_THERMTRIP_CTL			0x80
/* BITs are defined in device file */

#define THERMCTL_INTR_ENABLE			0x88
#define THERMCTL_INTR_DISABLE			0x8c
#define TH_INTR_UP_DN_EN			0x3
#define THERM_IRQ_MEM_MASK			(TH_INTR_UP_DN_EN << 24)
#define THERM_IRQ_GPU_MASK			(TH_INTR_UP_DN_EN << 16)
#define THERM_IRQ_CPU_MASK			(TH_INTR_UP_DN_EN << 8)
#define THERM_IRQ_TSENSE_MASK			(TH_INTR_UP_DN_EN << 0)

#define SENSOR_PDIV				0x1c0
#define SENSOR_PDIV_CPU_MASK			(0xf << 12)
#define SENSOR_PDIV_GPU_MASK			(0xf << 8)
#define SENSOR_PDIV_MEM_MASK			(0xf << 4)
#define SENSOR_PDIV_PLLX_MASK			(0xf << 0)

#define SENSOR_HOTSPOT_OFF			0x1c4
#define SENSOR_HOTSPOT_CPU_MASK			(0xff << 16)
#define SENSOR_HOTSPOT_GPU_MASK			(0xff << 8)
#define SENSOR_HOTSPOT_MEM_MASK			(0xff << 0)

#define SENSOR_TEMP1				0x1c8
#define SENSOR_TEMP1_CPU_TEMP_MASK		(0xffff << 16)
#define SENSOR_TEMP1_GPU_TEMP_MASK		0xffff
#define SENSOR_TEMP2				0x1cc
#define SENSOR_TEMP2_MEM_TEMP_MASK		(0xffff << 16)
#define SENSOR_TEMP2_PLLX_TEMP_MASK		0xffff

/**
 * struct tegra_tsensor_group - SOC_THERM sensor group data
 * @name: short name of the temperature sensor group
 * @id: numeric ID of the temperature sensor group
 * @sensor_temp_offset: offset of the SENSOR_TEMP* register
 * @sensor_temp_mask: bit mask for this sensor group in SENSOR_TEMP* register
 * @pdiv: the sensor count post-divider to use during runtime
 * @pdiv_ate: the sensor count post-divider used during automated test
 * @pdiv_mask: register bitfield mask for the PDIV field for this sensor
 * @pllx_hotspot_diff: hotspot offset from the PLLX sensor, must be 0 for
    PLLX sensor group
 * @pllx_hotspot_mask: register bitfield mask for the HOTSPOT field
 */
struct tegra_tsensor_group {
	const char *name;
	u8 id;
	u16 sensor_temp_offset;
	u32 sensor_temp_mask;
	u32 pdiv, pdiv_ate, pdiv_mask;
	u32 pllx_hotspot_diff, pllx_hotspot_mask;
	u32 thermtrip_enable_mask;
	u32 thermtrip_any_en_mask;
	u32 thermtrip_threshold_mask;
	u32 thermctl_isr_mask;
	u16 thermctl_lvl0_offset;
	u32 thermctl_lvl0_up_thresh_mask;
	u32 thermctl_lvl0_dn_thresh_mask;
};

struct tegra_tsensor_configuration {
	u32 tall, tiddq_en, ten_count, pdiv, pdiv_ate, tsample, tsample_ate;
};

struct tegra_tsensor {
	const char *name;
	const u32 base;
	const struct tegra_tsensor_configuration *config;
	const u32 calib_fuse_offset;
	/*
	 * Correction values used to modify values read from
	 * calibration fuses
	 */
	const s32 fuse_corr_alpha, fuse_corr_beta;
	const struct tegra_tsensor_group *group;
};

struct tsensor_group_thermtrips {
	u8 id;
	u32 temp;
};

struct tegra_soctherm_fuse {
	u32 fuse_base_cp_mask, fuse_base_cp_shift;
	u32 fuse_base_ft_mask, fuse_base_ft_shift;
	u32 fuse_shift_ft_mask, fuse_shift_ft_shift;
	u32 fuse_spare_realignment;
};

struct tsensor_shared_calib {
	u32 base_cp, base_ft;
	u32 actual_temp_cp, actual_temp_ft;
};

struct tegra_soctherm_soc {
	const struct tegra_tsensor *tsensors;
	const unsigned int num_tsensors;
	const struct tegra_tsensor_group **ttgs;
	const unsigned int num_ttgs;
	const struct tegra_soctherm_fuse *tfuse;
	const int thresh_grain;
	const unsigned int bptt;
	const bool use_ccroc;
	struct tsensor_group_thermtrips *thermtrips;
};

int tegra_calc_shared_calib(const struct tegra_soctherm_fuse *tfuse,
			    struct tsensor_shared_calib *shared);
int tegra_calc_tsensor_calib(const struct tegra_tsensor *sensor,
			     const struct tsensor_shared_calib *shared,
			     u32 *calib);

#ifdef CONFIG_ARCH_TEGRA_124_SOC
extern const struct tegra_soctherm_soc tegra124_soctherm;
#endif

#ifdef CONFIG_ARCH_TEGRA_132_SOC
extern const struct tegra_soctherm_soc tegra132_soctherm;
#endif

#ifdef CONFIG_ARCH_TEGRA_210_SOC
extern const struct tegra_soctherm_soc tegra210_soctherm;
#endif

#endif