diff options
author | Arto Merilainen <amerilainen@nvidia.com> | 2014-04-09 08:04:33 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:09:05 -0400 |
commit | 38de7b64757cd683ec367b44976eda6bf41fb8c7 (patch) | |
tree | c7cb391039b8a7978f921ce3d8c1f81f09e07f10 /drivers/gpu/nvgpu/gk20a/ltc_gk20a.c | |
parent | 2c615d68b835697f1c77dcb4f069ce5a84abd3d6 (diff) |
gpu: nvgpu: Add CBC clean and invalidate
Bug 1409151
Change-Id: I232af159d402f818cf972498d721c3b57846ce74
Signed-off-by: Arto Merilainen <amerilainen@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/ltc_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/ltc_gk20a.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c b/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c index 8450f664..74475d7a 100644 --- a/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/ltc_gk20a.c | |||
@@ -108,10 +108,12 @@ static int gk20a_ltc_init_comptags(struct gk20a *g, struct gr_gk20a *gr) | |||
108 | return 0; | 108 | return 0; |
109 | } | 109 | } |
110 | 110 | ||
111 | static int gk20a_ltc_clear_comptags(struct gk20a *g, u32 min, u32 max) | 111 | static int gk20a_ltc_cbc_ctrl(struct gk20a *g, enum gk20a_cbc_op op, |
112 | u32 min, u32 max) | ||
112 | { | 113 | { |
114 | int err = 0; | ||
113 | struct gr_gk20a *gr = &g->gr; | 115 | struct gr_gk20a *gr = &g->gr; |
114 | u32 fbp, slice, ctrl1, val; | 116 | u32 fbp, slice, ctrl1, val, hw_op = 0; |
115 | unsigned long end_jiffies = jiffies + | 117 | unsigned long end_jiffies = jiffies + |
116 | msecs_to_jiffies(gk20a_get_gr_idle_timeout(g)); | 118 | msecs_to_jiffies(gk20a_get_gr_idle_timeout(g)); |
117 | u32 delay = GR_IDLE_CHECK_DEFAULT; | 119 | u32 delay = GR_IDLE_CHECK_DEFAULT; |
@@ -124,13 +126,24 @@ static int gk20a_ltc_clear_comptags(struct gk20a *g, u32 min, u32 max) | |||
124 | if (gr->compbit_store.size == 0) | 126 | if (gr->compbit_store.size == 0) |
125 | return 0; | 127 | return 0; |
126 | 128 | ||
127 | gk20a_writel(g, ltc_ltcs_ltss_cbc_ctrl2_r(), | 129 | mutex_lock(&g->mm.l2_op_lock); |
128 | ltc_ltcs_ltss_cbc_ctrl2_clear_lower_bound_f(min)); | 130 | |
129 | gk20a_writel(g, ltc_ltcs_ltss_cbc_ctrl3_r(), | 131 | if (op == gk20a_cbc_op_clear) { |
130 | ltc_ltcs_ltss_cbc_ctrl3_clear_upper_bound_f(max)); | 132 | gk20a_writel(g, ltc_ltcs_ltss_cbc_ctrl2_r(), |
133 | ltc_ltcs_ltss_cbc_ctrl2_clear_lower_bound_f(min)); | ||
134 | gk20a_writel(g, ltc_ltcs_ltss_cbc_ctrl3_r(), | ||
135 | ltc_ltcs_ltss_cbc_ctrl3_clear_upper_bound_f(max)); | ||
136 | hw_op = ltc_ltcs_ltss_cbc_ctrl1_clear_active_f(); | ||
137 | } else if (op == gk20a_cbc_op_clean) { | ||
138 | hw_op = ltc_ltcs_ltss_cbc_ctrl1_clean_active_f(); | ||
139 | } else if (op == gk20a_cbc_op_invalidate) { | ||
140 | hw_op = ltc_ltcs_ltss_cbc_ctrl1_invalidate_active_f(); | ||
141 | } else { | ||
142 | BUG_ON(1); | ||
143 | } | ||
144 | |||
131 | gk20a_writel(g, ltc_ltcs_ltss_cbc_ctrl1_r(), | 145 | gk20a_writel(g, ltc_ltcs_ltss_cbc_ctrl1_r(), |
132 | gk20a_readl(g, ltc_ltcs_ltss_cbc_ctrl1_r()) | | 146 | gk20a_readl(g, ltc_ltcs_ltss_cbc_ctrl1_r()) | hw_op); |
133 | ltc_ltcs_ltss_cbc_ctrl1_clear_active_f()); | ||
134 | 147 | ||
135 | for (fbp = 0; fbp < gr->num_fbps; fbp++) { | 148 | for (fbp = 0; fbp < gr->num_fbps; fbp++) { |
136 | for (slice = 0; slice < slices_per_fbp; slice++) { | 149 | for (slice = 0; slice < slices_per_fbp; slice++) { |
@@ -143,8 +156,7 @@ static int gk20a_ltc_clear_comptags(struct gk20a *g, u32 min, u32 max) | |||
143 | 156 | ||
144 | do { | 157 | do { |
145 | val = gk20a_readl(g, ctrl1); | 158 | val = gk20a_readl(g, ctrl1); |
146 | if (ltc_ltcs_ltss_cbc_ctrl1_clear_v(val) != | 159 | if (!(val & hw_op)) |
147 | ltc_ltcs_ltss_cbc_ctrl1_clear_active_v()) | ||
148 | break; | 160 | break; |
149 | 161 | ||
150 | usleep_range(delay, delay * 2); | 162 | usleep_range(delay, delay * 2); |
@@ -157,11 +169,13 @@ static int gk20a_ltc_clear_comptags(struct gk20a *g, u32 min, u32 max) | |||
157 | if (!time_before(jiffies, end_jiffies)) { | 169 | if (!time_before(jiffies, end_jiffies)) { |
158 | gk20a_err(dev_from_gk20a(g), | 170 | gk20a_err(dev_from_gk20a(g), |
159 | "comp tag clear timeout\n"); | 171 | "comp tag clear timeout\n"); |
160 | return -EBUSY; | 172 | err = -EBUSY; |
173 | goto out; | ||
161 | } | 174 | } |
162 | } | 175 | } |
163 | } | 176 | } |
164 | 177 | out: | |
178 | mutex_unlock(&g->mm.l2_op_lock); | ||
165 | return 0; | 179 | return 0; |
166 | } | 180 | } |
167 | 181 | ||
@@ -200,7 +214,7 @@ void gk20a_init_ltc(struct gpu_ops *gops) | |||
200 | gops->ltc.determine_L2_size_bytes = gk20a_determine_L2_size_bytes; | 214 | gops->ltc.determine_L2_size_bytes = gk20a_determine_L2_size_bytes; |
201 | gops->ltc.set_max_ways_evict_last = gk20a_ltc_set_max_ways_evict_last; | 215 | gops->ltc.set_max_ways_evict_last = gk20a_ltc_set_max_ways_evict_last; |
202 | gops->ltc.init_comptags = gk20a_ltc_init_comptags; | 216 | gops->ltc.init_comptags = gk20a_ltc_init_comptags; |
203 | gops->ltc.clear_comptags = gk20a_ltc_clear_comptags; | 217 | gops->ltc.cbc_ctrl = gk20a_ltc_cbc_ctrl; |
204 | gops->ltc.set_zbc_color_entry = gk20a_ltc_set_zbc_color_entry; | 218 | gops->ltc.set_zbc_color_entry = gk20a_ltc_set_zbc_color_entry; |
205 | gops->ltc.set_zbc_depth_entry = gk20a_ltc_set_zbc_depth_entry; | 219 | gops->ltc.set_zbc_depth_entry = gk20a_ltc_set_zbc_depth_entry; |
206 | gops->ltc.clear_zbc_color_entry = gk20a_ltc_clear_zbc_color_entry; | 220 | gops->ltc.clear_zbc_color_entry = gk20a_ltc_clear_zbc_color_entry; |