diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2017-04-14 15:06:39 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-04-19 15:16:02 -0400 |
commit | a9c66768db400a82575a82ecddec71f1d3fd4aba (patch) | |
tree | 3b83db70149515fc21c9d700f68bbcf0fb4e58b4 /drivers/gpu/nvgpu/gk20a | |
parent | 7eb59ff8d334e9980e21bac50b4680855bd8237f (diff) |
gpu: nvgpu: Add abstraction for firmware loading
Add nvgpu_firmware data structure, and return it instead of Linux
struct firmare from nvgpu_request_firmware. Also add abstraction
for releasing firmware: nvgpu_release_firmware.
JIRA NVGPU-16
Change-Id: I6dae8262957c0d4506f710289e3a43a6c1729fc7
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/1463538
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/cde_gk20a.c | 20 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c | 9 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 16 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | 8 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/pmu_gk20a.h | 4 |
5 files changed, 30 insertions, 27 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c index 2187e833..18432c55 100644 --- a/drivers/gpu/nvgpu/gk20a/cde_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/cde_gk20a.c | |||
@@ -17,7 +17,6 @@ | |||
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
20 | #include <linux/firmware.h> | ||
21 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
22 | #include <linux/debugfs.h> | 21 | #include <linux/debugfs.h> |
23 | #include <linux/dma-buf.h> | 22 | #include <linux/dma-buf.h> |
@@ -30,6 +29,7 @@ | |||
30 | #include <nvgpu/kmem.h> | 29 | #include <nvgpu/kmem.h> |
31 | #include <nvgpu/log.h> | 30 | #include <nvgpu/log.h> |
32 | #include <nvgpu/bug.h> | 31 | #include <nvgpu/bug.h> |
32 | #include <nvgpu/firmware.h> | ||
33 | 33 | ||
34 | #include "gk20a.h" | 34 | #include "gk20a.h" |
35 | #include "channel_gk20a.h" | 35 | #include "channel_gk20a.h" |
@@ -226,7 +226,7 @@ out: | |||
226 | } | 226 | } |
227 | 227 | ||
228 | static int gk20a_init_cde_buf(struct gk20a_cde_ctx *cde_ctx, | 228 | static int gk20a_init_cde_buf(struct gk20a_cde_ctx *cde_ctx, |
229 | const struct firmware *img, | 229 | struct nvgpu_firmware *img, |
230 | struct gk20a_cde_hdr_buf *buf) | 230 | struct gk20a_cde_hdr_buf *buf) |
231 | { | 231 | { |
232 | struct nvgpu_mem *mem; | 232 | struct nvgpu_mem *mem; |
@@ -314,7 +314,7 @@ static int gk20a_replace_data(struct gk20a_cde_ctx *cde_ctx, void *target, | |||
314 | } | 314 | } |
315 | 315 | ||
316 | static int gk20a_init_cde_replace(struct gk20a_cde_ctx *cde_ctx, | 316 | static int gk20a_init_cde_replace(struct gk20a_cde_ctx *cde_ctx, |
317 | const struct firmware *img, | 317 | struct nvgpu_firmware *img, |
318 | struct gk20a_cde_hdr_replace *replace) | 318 | struct gk20a_cde_hdr_replace *replace) |
319 | { | 319 | { |
320 | struct nvgpu_mem *source_mem; | 320 | struct nvgpu_mem *source_mem; |
@@ -454,7 +454,7 @@ static int gk20a_cde_patch_params(struct gk20a_cde_ctx *cde_ctx) | |||
454 | } | 454 | } |
455 | 455 | ||
456 | static int gk20a_init_cde_param(struct gk20a_cde_ctx *cde_ctx, | 456 | static int gk20a_init_cde_param(struct gk20a_cde_ctx *cde_ctx, |
457 | const struct firmware *img, | 457 | struct nvgpu_firmware *img, |
458 | struct gk20a_cde_hdr_param *param) | 458 | struct gk20a_cde_hdr_param *param) |
459 | { | 459 | { |
460 | struct nvgpu_mem *target_mem; | 460 | struct nvgpu_mem *target_mem; |
@@ -497,7 +497,7 @@ static int gk20a_init_cde_param(struct gk20a_cde_ctx *cde_ctx, | |||
497 | } | 497 | } |
498 | 498 | ||
499 | static int gk20a_init_cde_required_class(struct gk20a_cde_ctx *cde_ctx, | 499 | static int gk20a_init_cde_required_class(struct gk20a_cde_ctx *cde_ctx, |
500 | const struct firmware *img, | 500 | struct nvgpu_firmware *img, |
501 | u32 required_class) | 501 | u32 required_class) |
502 | { | 502 | { |
503 | struct gk20a *g = cde_ctx->g; | 503 | struct gk20a *g = cde_ctx->g; |
@@ -521,7 +521,7 @@ static int gk20a_init_cde_required_class(struct gk20a_cde_ctx *cde_ctx, | |||
521 | } | 521 | } |
522 | 522 | ||
523 | static int gk20a_init_cde_command(struct gk20a_cde_ctx *cde_ctx, | 523 | static int gk20a_init_cde_command(struct gk20a_cde_ctx *cde_ctx, |
524 | const struct firmware *img, | 524 | struct nvgpu_firmware *img, |
525 | u32 op, | 525 | u32 op, |
526 | struct gk20a_cde_cmd_elem *cmd_elem, | 526 | struct gk20a_cde_cmd_elem *cmd_elem, |
527 | u32 num_elems) | 527 | u32 num_elems) |
@@ -622,7 +622,7 @@ static int gk20a_cde_pack_cmdbufs(struct gk20a_cde_ctx *cde_ctx) | |||
622 | } | 622 | } |
623 | 623 | ||
624 | static int gk20a_init_cde_img(struct gk20a_cde_ctx *cde_ctx, | 624 | static int gk20a_init_cde_img(struct gk20a_cde_ctx *cde_ctx, |
625 | const struct firmware *img) | 625 | struct nvgpu_firmware *img) |
626 | { | 626 | { |
627 | struct gk20a *g = cde_ctx->g; | 627 | struct gk20a *g = cde_ctx->g; |
628 | struct gk20a_cde_app *cde_app = &cde_ctx->g->cde_app; | 628 | struct gk20a_cde_app *cde_app = &cde_ctx->g->cde_app; |
@@ -1202,7 +1202,7 @@ __releases(&cde_app->mutex) | |||
1202 | static int gk20a_cde_load(struct gk20a_cde_ctx *cde_ctx) | 1202 | static int gk20a_cde_load(struct gk20a_cde_ctx *cde_ctx) |
1203 | { | 1203 | { |
1204 | struct gk20a *g = cde_ctx->g; | 1204 | struct gk20a *g = cde_ctx->g; |
1205 | const struct firmware *img; | 1205 | struct nvgpu_firmware *img; |
1206 | struct channel_gk20a *ch; | 1206 | struct channel_gk20a *ch; |
1207 | struct gr_gk20a *gr = &g->gr; | 1207 | struct gr_gk20a *gr = &g->gr; |
1208 | int err = 0; | 1208 | int err = 0; |
@@ -1265,7 +1265,7 @@ static int gk20a_cde_load(struct gk20a_cde_ctx *cde_ctx) | |||
1265 | } | 1265 | } |
1266 | 1266 | ||
1267 | /* initialisation done */ | 1267 | /* initialisation done */ |
1268 | release_firmware(img); | 1268 | nvgpu_release_firmware(g, img); |
1269 | 1269 | ||
1270 | return 0; | 1270 | return 0; |
1271 | 1271 | ||
@@ -1276,7 +1276,7 @@ err_alloc_gpfifo: | |||
1276 | gk20a_vm_put(ch->vm); | 1276 | gk20a_vm_put(ch->vm); |
1277 | err_commit_va: | 1277 | err_commit_va: |
1278 | err_get_gk20a_channel: | 1278 | err_get_gk20a_channel: |
1279 | release_firmware(img); | 1279 | nvgpu_release_firmware(g, img); |
1280 | nvgpu_err(g, "cde: couldn't initialise buffer converter: %d", err); | 1280 | nvgpu_err(g, "cde: couldn't initialise buffer converter: %d", err); |
1281 | return err; | 1281 | return err; |
1282 | } | 1282 | } |
diff --git a/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c index 712359e1..3c6d8924 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_ctx_gk20a.c | |||
@@ -19,11 +19,10 @@ | |||
19 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | 19 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/firmware.h> | ||
23 | |||
24 | #include <nvgpu/nvgpu_common.h> | 22 | #include <nvgpu/nvgpu_common.h> |
25 | #include <nvgpu/kmem.h> | 23 | #include <nvgpu/kmem.h> |
26 | #include <nvgpu/log.h> | 24 | #include <nvgpu/log.h> |
25 | #include <nvgpu/firmware.h> | ||
27 | 26 | ||
28 | #include "gk20a.h" | 27 | #include "gk20a.h" |
29 | #include "gr_ctx_gk20a.h" | 28 | #include "gr_ctx_gk20a.h" |
@@ -112,7 +111,7 @@ static bool gr_gk20a_is_firmware_defined(void) | |||
112 | 111 | ||
113 | static int gr_gk20a_init_ctx_vars_fw(struct gk20a *g, struct gr_gk20a *gr) | 112 | static int gr_gk20a_init_ctx_vars_fw(struct gk20a *g, struct gr_gk20a *gr) |
114 | { | 113 | { |
115 | const struct firmware *netlist_fw; | 114 | struct nvgpu_firmware *netlist_fw; |
116 | struct netlist_image *netlist = NULL; | 115 | struct netlist_image *netlist = NULL; |
117 | char name[MAX_NETLIST_NAME]; | 116 | char name[MAX_NETLIST_NAME]; |
118 | u32 i, major_v = ~0, major_v_hw, netlist_num; | 117 | u32 i, major_v = ~0, major_v_hw, netlist_num; |
@@ -392,7 +391,7 @@ static int gr_gk20a_init_ctx_vars_fw(struct gk20a *g, struct gr_gk20a *gr) | |||
392 | g->gr.ctx_vars.valid = true; | 391 | g->gr.ctx_vars.valid = true; |
393 | g->gr.netlist = net; | 392 | g->gr.netlist = net; |
394 | 393 | ||
395 | release_firmware(netlist_fw); | 394 | nvgpu_release_firmware(g, netlist_fw); |
396 | gk20a_dbg_fn("done"); | 395 | gk20a_dbg_fn("done"); |
397 | goto done; | 396 | goto done; |
398 | 397 | ||
@@ -427,7 +426,7 @@ clean_up: | |||
427 | nvgpu_kfree(g, g->gr.ctx_vars.ctxsw_regs.perf_pma.l); | 426 | nvgpu_kfree(g, g->gr.ctx_vars.ctxsw_regs.perf_pma.l); |
428 | nvgpu_kfree(g, g->gr.ctx_vars.ctxsw_regs.pm_rop.l); | 427 | nvgpu_kfree(g, g->gr.ctx_vars.ctxsw_regs.pm_rop.l); |
429 | nvgpu_kfree(g, g->gr.ctx_vars.ctxsw_regs.pm_ucgpc.l); | 428 | nvgpu_kfree(g, g->gr.ctx_vars.ctxsw_regs.pm_ucgpc.l); |
430 | release_firmware(netlist_fw); | 429 | nvgpu_release_firmware(g, netlist_fw); |
431 | err = -ENOENT; | 430 | err = -ENOENT; |
432 | } | 431 | } |
433 | 432 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index a4419885..0e787356 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |||
@@ -17,7 +17,6 @@ | |||
17 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | 17 | * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | #include <linux/firmware.h> | ||
21 | #include <trace/events/gk20a.h> | 20 | #include <trace/events/gk20a.h> |
22 | 21 | ||
23 | #include <nvgpu/dma.h> | 22 | #include <nvgpu/dma.h> |
@@ -28,6 +27,7 @@ | |||
28 | #include <nvgpu/bsearch.h> | 27 | #include <nvgpu/bsearch.h> |
29 | #include <nvgpu/sort.h> | 28 | #include <nvgpu/sort.h> |
30 | #include <nvgpu/bug.h> | 29 | #include <nvgpu/bug.h> |
30 | #include <nvgpu/firmware.h> | ||
31 | 31 | ||
32 | #include "gk20a.h" | 32 | #include "gk20a.h" |
33 | #include "kind_gk20a.h" | 33 | #include "kind_gk20a.h" |
@@ -2272,8 +2272,8 @@ int gr_gk20a_init_ctxsw_ucode(struct gk20a *g) | |||
2272 | struct vm_gk20a *vm = &mm->pmu.vm; | 2272 | struct vm_gk20a *vm = &mm->pmu.vm; |
2273 | struct gk20a_ctxsw_bootloader_desc *fecs_boot_desc; | 2273 | struct gk20a_ctxsw_bootloader_desc *fecs_boot_desc; |
2274 | struct gk20a_ctxsw_bootloader_desc *gpccs_boot_desc; | 2274 | struct gk20a_ctxsw_bootloader_desc *gpccs_boot_desc; |
2275 | const struct firmware *fecs_fw; | 2275 | struct nvgpu_firmware *fecs_fw; |
2276 | const struct firmware *gpccs_fw; | 2276 | struct nvgpu_firmware *gpccs_fw; |
2277 | u32 *fecs_boot_image; | 2277 | u32 *fecs_boot_image; |
2278 | u32 *gpccs_boot_image; | 2278 | u32 *gpccs_boot_image; |
2279 | struct gk20a_ctxsw_ucode_info *ucode_info = &g->ctxsw_ucode_info; | 2279 | struct gk20a_ctxsw_ucode_info *ucode_info = &g->ctxsw_ucode_info; |
@@ -2292,7 +2292,7 @@ int gr_gk20a_init_ctxsw_ucode(struct gk20a *g) | |||
2292 | 2292 | ||
2293 | gpccs_fw = nvgpu_request_firmware(g, GK20A_GPCCS_UCODE_IMAGE, 0); | 2293 | gpccs_fw = nvgpu_request_firmware(g, GK20A_GPCCS_UCODE_IMAGE, 0); |
2294 | if (!gpccs_fw) { | 2294 | if (!gpccs_fw) { |
2295 | release_firmware(fecs_fw); | 2295 | nvgpu_release_firmware(g, fecs_fw); |
2296 | nvgpu_err(g, "failed to load gpccs ucode!!"); | 2296 | nvgpu_err(g, "failed to load gpccs ucode!!"); |
2297 | return -ENOENT; | 2297 | return -ENOENT; |
2298 | } | 2298 | } |
@@ -2321,7 +2321,7 @@ int gr_gk20a_init_ctxsw_ucode(struct gk20a *g) | |||
2321 | g->gr.ctx_vars.ucode.fecs.inst.l, | 2321 | g->gr.ctx_vars.ucode.fecs.inst.l, |
2322 | g->gr.ctx_vars.ucode.fecs.data.l); | 2322 | g->gr.ctx_vars.ucode.fecs.data.l); |
2323 | 2323 | ||
2324 | release_firmware(fecs_fw); | 2324 | nvgpu_release_firmware(g, fecs_fw); |
2325 | fecs_fw = NULL; | 2325 | fecs_fw = NULL; |
2326 | 2326 | ||
2327 | gr_gk20a_copy_ctxsw_ucode_segments(g, &ucode_info->surface_desc, | 2327 | gr_gk20a_copy_ctxsw_ucode_segments(g, &ucode_info->surface_desc, |
@@ -2330,7 +2330,7 @@ int gr_gk20a_init_ctxsw_ucode(struct gk20a *g) | |||
2330 | g->gr.ctx_vars.ucode.gpccs.inst.l, | 2330 | g->gr.ctx_vars.ucode.gpccs.inst.l, |
2331 | g->gr.ctx_vars.ucode.gpccs.data.l); | 2331 | g->gr.ctx_vars.ucode.gpccs.data.l); |
2332 | 2332 | ||
2333 | release_firmware(gpccs_fw); | 2333 | nvgpu_release_firmware(g, gpccs_fw); |
2334 | gpccs_fw = NULL; | 2334 | gpccs_fw = NULL; |
2335 | 2335 | ||
2336 | err = gr_gk20a_init_ctxsw_ucode_vaspace(g); | 2336 | err = gr_gk20a_init_ctxsw_ucode_vaspace(g); |
@@ -2345,9 +2345,9 @@ int gr_gk20a_init_ctxsw_ucode(struct gk20a *g) | |||
2345 | ucode_info->surface_desc.size, gk20a_mem_flag_none); | 2345 | ucode_info->surface_desc.size, gk20a_mem_flag_none); |
2346 | nvgpu_dma_free(g, &ucode_info->surface_desc); | 2346 | nvgpu_dma_free(g, &ucode_info->surface_desc); |
2347 | 2347 | ||
2348 | release_firmware(gpccs_fw); | 2348 | nvgpu_release_firmware(g, gpccs_fw); |
2349 | gpccs_fw = NULL; | 2349 | gpccs_fw = NULL; |
2350 | release_firmware(fecs_fw); | 2350 | nvgpu_release_firmware(g, fecs_fw); |
2351 | fecs_fw = NULL; | 2351 | fecs_fw = NULL; |
2352 | 2352 | ||
2353 | return err; | 2353 | return err; |
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c index 49b9e78d..0ca8851f 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |||
@@ -16,7 +16,6 @@ | |||
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | #include <linux/firmware.h> | ||
20 | #include <linux/module.h> | 19 | #include <linux/module.h> |
21 | #include <linux/debugfs.h> | 20 | #include <linux/debugfs.h> |
22 | #include <linux/uaccess.h> | 21 | #include <linux/uaccess.h> |
@@ -27,6 +26,7 @@ | |||
27 | #include <nvgpu/dma.h> | 26 | #include <nvgpu/dma.h> |
28 | #include <nvgpu/log.h> | 27 | #include <nvgpu/log.h> |
29 | #include <nvgpu/bug.h> | 28 | #include <nvgpu/bug.h> |
29 | #include <nvgpu/firmware.h> | ||
30 | 30 | ||
31 | #include "gk20a.h" | 31 | #include "gk20a.h" |
32 | #include "gr_gk20a.h" | 32 | #include "gr_gk20a.h" |
@@ -3099,12 +3099,14 @@ static int pmu_queue_close(struct pmu_gk20a *pmu, | |||
3099 | 3099 | ||
3100 | void gk20a_remove_pmu_support(struct pmu_gk20a *pmu) | 3100 | void gk20a_remove_pmu_support(struct pmu_gk20a *pmu) |
3101 | { | 3101 | { |
3102 | struct gk20a *g = gk20a_from_pmu(pmu); | ||
3103 | |||
3102 | gk20a_dbg_fn(""); | 3104 | gk20a_dbg_fn(""); |
3103 | 3105 | ||
3104 | if (nvgpu_alloc_initialized(&pmu->dmem)) | 3106 | if (nvgpu_alloc_initialized(&pmu->dmem)) |
3105 | nvgpu_alloc_destroy(&pmu->dmem); | 3107 | nvgpu_alloc_destroy(&pmu->dmem); |
3106 | 3108 | ||
3107 | release_firmware(pmu->fw); | 3109 | nvgpu_release_firmware(g, pmu->fw); |
3108 | 3110 | ||
3109 | nvgpu_mutex_destroy(&pmu->elpg_mutex); | 3111 | nvgpu_mutex_destroy(&pmu->elpg_mutex); |
3110 | nvgpu_mutex_destroy(&pmu->pg_mutex); | 3112 | nvgpu_mutex_destroy(&pmu->pg_mutex); |
@@ -3157,7 +3159,7 @@ static int gk20a_prepare_ucode(struct gk20a *g) | |||
3157 | return gk20a_init_pmu(pmu); | 3159 | return gk20a_init_pmu(pmu); |
3158 | 3160 | ||
3159 | err_release_fw: | 3161 | err_release_fw: |
3160 | release_firmware(pmu->fw); | 3162 | nvgpu_release_firmware(g, pmu->fw); |
3161 | pmu->fw = NULL; | 3163 | pmu->fw = NULL; |
3162 | 3164 | ||
3163 | return err; | 3165 | return err; |
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h index 84161304..e7a8b7c2 100644 --- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.h | |||
@@ -25,6 +25,8 @@ | |||
25 | #include <nvgpu/flcnif_cmn.h> | 25 | #include <nvgpu/flcnif_cmn.h> |
26 | #include <nvgpu/pmuif/nvgpu_gpmu_cmdif.h> | 26 | #include <nvgpu/pmuif/nvgpu_gpmu_cmdif.h> |
27 | 27 | ||
28 | struct nvgpu_firmware; | ||
29 | |||
28 | /* defined by pmu hw spec */ | 30 | /* defined by pmu hw spec */ |
29 | #define GK20A_PMU_VA_SIZE (512 * 1024 * 1024) | 31 | #define GK20A_PMU_VA_SIZE (512 * 1024 * 1024) |
30 | #define GK20A_PMU_UCODE_SIZE_MAX (256 * 1024) | 32 | #define GK20A_PMU_UCODE_SIZE_MAX (256 * 1024) |
@@ -394,7 +396,7 @@ struct pmu_gk20a { | |||
394 | u32 aelpg_param[5]; | 396 | u32 aelpg_param[5]; |
395 | u32 override_done; | 397 | u32 override_done; |
396 | 398 | ||
397 | const struct firmware *fw; | 399 | struct nvgpu_firmware *fw; |
398 | }; | 400 | }; |
399 | 401 | ||
400 | int gk20a_init_pmu_support(struct gk20a *g); | 402 | int gk20a_init_pmu_support(struct gk20a *g); |