diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk_mclk.c | 48 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk_mclk.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.c | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gp106/pmu_gp106.c | 1 |
5 files changed, 42 insertions, 12 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk_mclk.c b/drivers/gpu/nvgpu/clk/clk_mclk.c index 16852b5e..f973a696 100644 --- a/drivers/gpu/nvgpu/clk/clk_mclk.c +++ b/drivers/gpu/nvgpu/clk/clk_mclk.c | |||
@@ -2174,20 +2174,33 @@ done: | |||
2174 | return status; | 2174 | return status; |
2175 | } | 2175 | } |
2176 | 2176 | ||
2177 | void clk_mclkseq_deinit_mclk_gddr5(struct gk20a *g) | ||
2178 | { | ||
2179 | struct clk_mclk_state *mclk = &g->clk_pmu.clk_mclk; | ||
2180 | |||
2181 | nvgpu_mutex_destroy(&mclk->data_lock); | ||
2182 | nvgpu_mutex_destroy(&mclk->mclk_lock); | ||
2183 | } | ||
2184 | |||
2177 | int clk_mclkseq_init_mclk_gddr5(struct gk20a *g) | 2185 | int clk_mclkseq_init_mclk_gddr5(struct gk20a *g) |
2178 | { | 2186 | { |
2179 | struct clk_mclk_state *mclk; | 2187 | struct clk_mclk_state *mclk; |
2180 | int status; | 2188 | int status; |
2181 | struct clk_set_info *p5_info; | 2189 | struct clk_set_info *p5_info; |
2182 | struct clk_set_info *p0_info; | 2190 | struct clk_set_info *p0_info; |
2183 | 2191 | int err; | |
2184 | 2192 | ||
2185 | gk20a_dbg_fn(""); | 2193 | gk20a_dbg_fn(""); |
2186 | 2194 | ||
2187 | mclk = &g->clk_pmu.clk_mclk; | 2195 | mclk = &g->clk_pmu.clk_mclk; |
2188 | 2196 | ||
2189 | nvgpu_mutex_init(&mclk->mclk_lock); | 2197 | err = nvgpu_mutex_init(&mclk->mclk_lock); |
2190 | nvgpu_mutex_init(&mclk->data_lock); | 2198 | if (err) |
2199 | return err; | ||
2200 | |||
2201 | err = nvgpu_mutex_init(&mclk->data_lock); | ||
2202 | if (err) | ||
2203 | goto fail_mclk_mutex; | ||
2191 | 2204 | ||
2192 | /* FBPA gain WAR */ | 2205 | /* FBPA gain WAR */ |
2193 | gk20a_writel(g, fb_fbpa_fbio_iref_byte_rx_ctrl_r(), 0x22222222); | 2206 | gk20a_writel(g, fb_fbpa_fbio_iref_byte_rx_ctrl_r(), 0x22222222); |
@@ -2196,32 +2209,37 @@ int clk_mclkseq_init_mclk_gddr5(struct gk20a *g) | |||
2196 | 2209 | ||
2197 | /* Parse VBIOS */ | 2210 | /* Parse VBIOS */ |
2198 | status = mclk_get_memclk_table(g); | 2211 | status = mclk_get_memclk_table(g); |
2199 | if (status < 0) | 2212 | if (status < 0) { |
2200 | return status; | 2213 | err = status; |
2214 | goto fail_data_mutex; | ||
2215 | } | ||
2201 | 2216 | ||
2202 | /* Load RAM pattern */ | 2217 | /* Load RAM pattern */ |
2203 | mclk_memory_load_training_pattern(g); | 2218 | mclk_memory_load_training_pattern(g); |
2204 | 2219 | ||
2205 | p5_info = pstate_get_clk_set_info(g, | 2220 | p5_info = pstate_get_clk_set_info(g, |
2206 | CTRL_PERF_PSTATE_P5, clkwhich_mclk); | 2221 | CTRL_PERF_PSTATE_P5, clkwhich_mclk); |
2207 | if (!p5_info) | 2222 | if (!p5_info) { |
2208 | return -EINVAL; | 2223 | err = -EINVAL; |
2224 | goto fail_data_mutex; | ||
2225 | } | ||
2209 | 2226 | ||
2210 | p0_info = pstate_get_clk_set_info(g, | 2227 | p0_info = pstate_get_clk_set_info(g, |
2211 | CTRL_PERF_PSTATE_P0, clkwhich_mclk); | 2228 | CTRL_PERF_PSTATE_P0, clkwhich_mclk); |
2212 | if (!p0_info) | 2229 | if (!p0_info) { |
2213 | return -EINVAL; | 2230 | err = -EINVAL; |
2214 | 2231 | goto fail_data_mutex; | |
2232 | } | ||
2215 | 2233 | ||
2216 | mclk->p5_min = p5_info->min_mhz; | 2234 | mclk->p5_min = p5_info->min_mhz; |
2217 | mclk->p0_min = p0_info->min_mhz; | 2235 | mclk->p0_min = p0_info->min_mhz; |
2218 | 2236 | ||
2219 | |||
2220 | mclk->vreg_buf = nvgpu_kcalloc(g, VREG_COUNT, sizeof(u32)); | 2237 | mclk->vreg_buf = nvgpu_kcalloc(g, VREG_COUNT, sizeof(u32)); |
2221 | if (!mclk->vreg_buf) { | 2238 | if (!mclk->vreg_buf) { |
2222 | gk20a_err(dev_from_gk20a(g), | 2239 | gk20a_err(dev_from_gk20a(g), |
2223 | "unable to allocate memory for VREG"); | 2240 | "unable to allocate memory for VREG"); |
2224 | return -ENOMEM; | 2241 | err = -ENOMEM; |
2242 | goto fail_data_mutex; | ||
2225 | } | 2243 | } |
2226 | 2244 | ||
2227 | #ifdef CONFIG_DEBUG_FS | 2245 | #ifdef CONFIG_DEBUG_FS |
@@ -2235,6 +2253,12 @@ int clk_mclkseq_init_mclk_gddr5(struct gk20a *g) | |||
2235 | mclk->init = true; | 2253 | mclk->init = true; |
2236 | 2254 | ||
2237 | return 0; | 2255 | return 0; |
2256 | |||
2257 | fail_data_mutex: | ||
2258 | nvgpu_mutex_destroy(&mclk->data_lock); | ||
2259 | fail_mclk_mutex: | ||
2260 | nvgpu_mutex_destroy(&mclk->mclk_lock); | ||
2261 | return err; | ||
2238 | } | 2262 | } |
2239 | 2263 | ||
2240 | int clk_mclkseq_change_mclk_gddr5(struct gk20a *g, u16 val) | 2264 | int clk_mclkseq_change_mclk_gddr5(struct gk20a *g, u16 val) |
diff --git a/drivers/gpu/nvgpu/clk/clk_mclk.h b/drivers/gpu/nvgpu/clk/clk_mclk.h index 731f289d..64eee5ac 100644 --- a/drivers/gpu/nvgpu/clk/clk_mclk.h +++ b/drivers/gpu/nvgpu/clk/clk_mclk.h | |||
@@ -47,6 +47,7 @@ struct clk_mclk_state { | |||
47 | }; | 47 | }; |
48 | 48 | ||
49 | int clk_mclkseq_init_mclk_gddr5(struct gk20a *g); | 49 | int clk_mclkseq_init_mclk_gddr5(struct gk20a *g); |
50 | void clk_mclkseq_deinit_mclk_gddr5(struct gk20a *g); | ||
50 | int clk_mclkseq_change_mclk_gddr5(struct gk20a *g, u16 val); | 51 | int clk_mclkseq_change_mclk_gddr5(struct gk20a *g, u16 val); |
51 | 52 | ||
52 | #endif | 53 | #endif |
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.c b/drivers/gpu/nvgpu/gk20a/gk20a.c index 4ed7251a..aae3072a 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gk20a.c | |||
@@ -452,6 +452,9 @@ static int gk20a_pm_prepare_poweroff(struct device *dev) | |||
452 | ret |= gk20a_mm_suspend(g); | 452 | ret |= gk20a_mm_suspend(g); |
453 | ret |= gk20a_fifo_suspend(g); | 453 | ret |= gk20a_fifo_suspend(g); |
454 | 454 | ||
455 | if (g->ops.pmu.mclk_deinit) | ||
456 | g->ops.pmu.mclk_deinit(g); | ||
457 | |||
455 | /* Disable GPCPLL */ | 458 | /* Disable GPCPLL */ |
456 | if (g->ops.clk.suspend_clk_support) | 459 | if (g->ops.clk.suspend_clk_support) |
457 | ret |= g->ops.clk.suspend_clk_support(g); | 460 | ret |= g->ops.clk.suspend_clk_support(g); |
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 951c8267..e3dad962 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -699,6 +699,7 @@ struct gpu_ops { | |||
699 | int (*flcn_populate_bl_dmem_desc)(struct gk20a *g, | 699 | int (*flcn_populate_bl_dmem_desc)(struct gk20a *g, |
700 | void *lsfm, u32 *p_bl_gen_desc_size, u32 falconid); | 700 | void *lsfm, u32 *p_bl_gen_desc_size, u32 falconid); |
701 | int (*mclk_init)(struct gk20a *g); | 701 | int (*mclk_init)(struct gk20a *g); |
702 | void (*mclk_deinit)(struct gk20a *g); | ||
702 | u32 lspmuwprinitdone; | 703 | u32 lspmuwprinitdone; |
703 | u32 lsfloadedfalconid; | 704 | u32 lsfloadedfalconid; |
704 | bool fecsbootstrapdone; | 705 | bool fecsbootstrapdone; |
diff --git a/drivers/gpu/nvgpu/gp106/pmu_gp106.c b/drivers/gpu/nvgpu/gp106/pmu_gp106.c index bb9c63ca..a2eef6ff 100644 --- a/drivers/gpu/nvgpu/gp106/pmu_gp106.c +++ b/drivers/gpu/nvgpu/gp106/pmu_gp106.c | |||
@@ -439,6 +439,7 @@ void gp106_init_pmu_ops(struct gpu_ops *gops) | |||
439 | gops->pmu.dump_secure_fuses = NULL; | 439 | gops->pmu.dump_secure_fuses = NULL; |
440 | gops->pmu.reset = gp106_falcon_reset; | 440 | gops->pmu.reset = gp106_falcon_reset; |
441 | gops->pmu.mclk_init = clk_mclkseq_init_mclk_gddr5; | 441 | gops->pmu.mclk_init = clk_mclkseq_init_mclk_gddr5; |
442 | gops->pmu.mclk_deinit = clk_mclkseq_deinit_mclk_gddr5; | ||
442 | gops->pmu.is_pmu_supported = gp106_is_pmu_supported; | 443 | gops->pmu.is_pmu_supported = gp106_is_pmu_supported; |
443 | 444 | ||
444 | gk20a_dbg_fn("done"); | 445 | gk20a_dbg_fn("done"); |