diff options
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobj.c | 9 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobj.h | 10 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobjgrp.c | 4 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/boardobj/boardobjgrp.h | 9 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/linux/driver_common.c | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/common/pmu/pmu_fw.c | 15 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 3 |
7 files changed, 52 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/boardobj/boardobj.c b/drivers/gpu/nvgpu/boardobj/boardobj.c index c0646eb4..f9be6981 100644 --- a/drivers/gpu/nvgpu/boardobj/boardobj.c +++ b/drivers/gpu/nvgpu/boardobj/boardobj.c | |||
@@ -41,6 +41,7 @@ u32 boardobj_construct_super(struct gk20a *g, struct boardobj **ppboardobj, | |||
41 | *ppboardobj = nvgpu_kzalloc(g, size); | 41 | *ppboardobj = nvgpu_kzalloc(g, size); |
42 | if (*ppboardobj == NULL) | 42 | if (*ppboardobj == NULL) |
43 | return -ENOMEM; | 43 | return -ENOMEM; |
44 | (*ppboardobj)->allocated = true; | ||
44 | } | 45 | } |
45 | 46 | ||
46 | pboardobj = *ppboardobj; | 47 | pboardobj = *ppboardobj; |
@@ -53,6 +54,8 @@ u32 boardobj_construct_super(struct gk20a *g, struct boardobj **ppboardobj, | |||
53 | pboardobj->destruct = boardobj_destruct_super; | 54 | pboardobj->destruct = boardobj_destruct_super; |
54 | pboardobj->pmudatainit = boardobj_pmudatainit_super; | 55 | pboardobj->pmudatainit = boardobj_pmudatainit_super; |
55 | 56 | ||
57 | nvgpu_list_add(&pboardobj->node, &g->boardobj_head); | ||
58 | |||
56 | return 0; | 59 | return 0; |
57 | } | 60 | } |
58 | 61 | ||
@@ -61,7 +64,11 @@ u32 boardobj_destruct_super(struct boardobj *pboardobj) | |||
61 | gk20a_dbg_info(""); | 64 | gk20a_dbg_info(""); |
62 | if (pboardobj == NULL) | 65 | if (pboardobj == NULL) |
63 | return -EINVAL; | 66 | return -EINVAL; |
64 | nvgpu_kfree(pboardobj->g, pboardobj); | 67 | |
68 | nvgpu_list_del(&pboardobj->node); | ||
69 | if (pboardobj->allocated) | ||
70 | nvgpu_kfree(pboardobj->g, pboardobj); | ||
71 | |||
65 | return 0; | 72 | return 0; |
66 | } | 73 | } |
67 | 74 | ||
diff --git a/drivers/gpu/nvgpu/boardobj/boardobj.h b/drivers/gpu/nvgpu/boardobj/boardobj.h index 5c1b4b81..a433fda8 100644 --- a/drivers/gpu/nvgpu/boardobj/boardobj.h +++ b/drivers/gpu/nvgpu/boardobj/boardobj.h | |||
@@ -71,6 +71,8 @@ struct boardobj { | |||
71 | 71 | ||
72 | u8 type; /*type of the device*/ | 72 | u8 type; /*type of the device*/ |
73 | u8 idx; /*index of boardobj within in its group*/ | 73 | u8 idx; /*index of boardobj within in its group*/ |
74 | /* true if allocated in constructor. destructor should free */ | ||
75 | u8 allocated; | ||
74 | u32 type_mask; /*mask of types this boardobjimplements*/ | 76 | u32 type_mask; /*mask of types this boardobjimplements*/ |
75 | boardobj_implements *implements; | 77 | boardobj_implements *implements; |
76 | boardobj_destruct *destruct; | 78 | boardobj_destruct *destruct; |
@@ -79,6 +81,7 @@ struct boardobj { | |||
79 | * that inherit from BOARDOBJ | 81 | * that inherit from BOARDOBJ |
80 | */ | 82 | */ |
81 | boardobj_pmudatainit *pmudatainit; | 83 | boardobj_pmudatainit *pmudatainit; |
84 | struct nvgpu_list_node node; | ||
82 | }; | 85 | }; |
83 | 86 | ||
84 | boardobj_construct boardobj_construct_super; | 87 | boardobj_construct boardobj_construct_super; |
@@ -89,4 +92,11 @@ boardobj_pmudatainit boardobj_pmudatainit_super; | |||
89 | #define BOARDOBJ_GET_TYPE(pobj) (((struct boardobj *)(pobj))->type) | 92 | #define BOARDOBJ_GET_TYPE(pobj) (((struct boardobj *)(pobj))->type) |
90 | #define BOARDOBJ_GET_IDX(pobj) (((struct boardobj *)(pobj))->idx) | 93 | #define BOARDOBJ_GET_IDX(pobj) (((struct boardobj *)(pobj))->idx) |
91 | 94 | ||
95 | static inline struct boardobj * | ||
96 | boardobj_from_node(struct nvgpu_list_node *node) | ||
97 | { | ||
98 | return (struct boardobj *) | ||
99 | ((uintptr_t)node - offsetof(struct boardobj, node)); | ||
100 | }; | ||
101 | |||
92 | #endif | 102 | #endif |
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c index 66c87e08..caed11e9 100644 --- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c +++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c | |||
@@ -86,6 +86,8 @@ u32 boardobjgrp_construct_super(struct gk20a *g, struct boardobjgrp *pboardobjgr | |||
86 | pboardobjgrp->objmaxidx = CTRL_BOARDOBJ_IDX_INVALID; | 86 | pboardobjgrp->objmaxidx = CTRL_BOARDOBJ_IDX_INVALID; |
87 | pboardobjgrp->bconstructed = true; | 87 | pboardobjgrp->bconstructed = true; |
88 | 88 | ||
89 | nvgpu_list_add(&pboardobjgrp->node, &g->boardobjgrp_head); | ||
90 | |||
89 | return 0; | 91 | return 0; |
90 | } | 92 | } |
91 | 93 | ||
@@ -144,6 +146,8 @@ u32 boardobjgrp_destruct_super(struct boardobjgrp *pboardobjgrp) | |||
144 | if (status == 0) | 146 | if (status == 0) |
145 | status = stat; | 147 | status = stat; |
146 | 148 | ||
149 | nvgpu_list_del(&pboardobjgrp->node); | ||
150 | |||
147 | pboardobjgrp->bconstructed = false; | 151 | pboardobjgrp->bconstructed = false; |
148 | 152 | ||
149 | return status; | 153 | return status; |
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h index 14d7c1bb..32e92ae0 100644 --- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h +++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h | |||
@@ -199,6 +199,7 @@ struct boardobjgrp { | |||
199 | 199 | ||
200 | boardobjgrp_pmudatainstget *pmudatainstget; | 200 | boardobjgrp_pmudatainstget *pmudatainstget; |
201 | boardobjgrp_pmustatusinstget *pmustatusinstget; | 201 | boardobjgrp_pmustatusinstget *pmustatusinstget; |
202 | struct nvgpu_list_node node; | ||
202 | }; | 203 | }; |
203 | 204 | ||
204 | /* | 205 | /* |
@@ -404,4 +405,12 @@ void boardobjgrpe32hdrset(struct nv_pmu_boardobjgrp *hdr, u32 objmask); | |||
404 | idx += 1; \ | 405 | idx += 1; \ |
405 | (n32) = idx; \ | 406 | (n32) = idx; \ |
406 | } | 407 | } |
408 | |||
409 | static inline struct boardobjgrp * | ||
410 | boardobjgrp_from_node(struct nvgpu_list_node *node) | ||
411 | { | ||
412 | return (struct boardobjgrp *) | ||
413 | ((uintptr_t)node - offsetof(struct boardobjgrp, node)); | ||
414 | }; | ||
415 | |||
407 | #endif | 416 | #endif |
diff --git a/drivers/gpu/nvgpu/common/linux/driver_common.c b/drivers/gpu/nvgpu/common/linux/driver_common.c index 0dd0d62c..1c6002de 100644 --- a/drivers/gpu/nvgpu/common/linux/driver_common.c +++ b/drivers/gpu/nvgpu/common/linux/driver_common.c | |||
@@ -67,6 +67,9 @@ static void nvgpu_init_vars(struct gk20a *g) | |||
67 | nvgpu_raw_spinlock_init(&g->pending_sema_waits_lock); | 67 | nvgpu_raw_spinlock_init(&g->pending_sema_waits_lock); |
68 | 68 | ||
69 | nvgpu_init_list_node(&g->profiler_objects); | 69 | nvgpu_init_list_node(&g->profiler_objects); |
70 | |||
71 | nvgpu_init_list_node(&g->boardobj_head); | ||
72 | nvgpu_init_list_node(&g->boardobjgrp_head); | ||
70 | } | 73 | } |
71 | 74 | ||
72 | static void nvgpu_init_timeout(struct gk20a *g) | 75 | static void nvgpu_init_timeout(struct gk20a *g) |
diff --git a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c index 20eadb50..654fde21 100644 --- a/drivers/gpu/nvgpu/common/pmu/pmu_fw.c +++ b/drivers/gpu/nvgpu/common/pmu/pmu_fw.c | |||
@@ -29,6 +29,9 @@ | |||
29 | 29 | ||
30 | #include "gk20a/gk20a.h" | 30 | #include "gk20a/gk20a.h" |
31 | 31 | ||
32 | #include "boardobj/boardobj.h" | ||
33 | #include "boardobj/boardobjgrp.h" | ||
34 | |||
32 | /* PMU NS UCODE IMG */ | 35 | /* PMU NS UCODE IMG */ |
33 | #define NVGPU_PMU_NS_UCODE_IMAGE "gpmu_ucode.bin" | 36 | #define NVGPU_PMU_NS_UCODE_IMAGE "gpmu_ucode.bin" |
34 | 37 | ||
@@ -2228,12 +2231,24 @@ static void nvgpu_remove_pmu_support(struct nvgpu_pmu *pmu) | |||
2228 | struct gk20a *g = gk20a_from_pmu(pmu); | 2231 | struct gk20a *g = gk20a_from_pmu(pmu); |
2229 | struct mm_gk20a *mm = &g->mm; | 2232 | struct mm_gk20a *mm = &g->mm; |
2230 | struct vm_gk20a *vm = mm->pmu.vm; | 2233 | struct vm_gk20a *vm = mm->pmu.vm; |
2234 | struct boardobj *pboardobj, *pboardobj_tmp; | ||
2235 | struct boardobjgrp *pboardobjgrp, *pboardobjgrp_tmp; | ||
2231 | 2236 | ||
2232 | nvgpu_log_fn(g, " "); | 2237 | nvgpu_log_fn(g, " "); |
2233 | 2238 | ||
2234 | if (nvgpu_alloc_initialized(&pmu->dmem)) | 2239 | if (nvgpu_alloc_initialized(&pmu->dmem)) |
2235 | nvgpu_alloc_destroy(&pmu->dmem); | 2240 | nvgpu_alloc_destroy(&pmu->dmem); |
2236 | 2241 | ||
2242 | nvgpu_list_for_each_entry_safe(pboardobjgrp, pboardobjgrp_tmp, | ||
2243 | &g->boardobjgrp_head, boardobjgrp, node) { | ||
2244 | pboardobjgrp->destruct(pboardobjgrp); | ||
2245 | } | ||
2246 | |||
2247 | nvgpu_list_for_each_entry_safe(pboardobj, pboardobj_tmp, | ||
2248 | &g->boardobj_head, boardobj, node) { | ||
2249 | pboardobj->destruct(pboardobj); | ||
2250 | } | ||
2251 | |||
2237 | if (pmu->fw) | 2252 | if (pmu->fw) |
2238 | nvgpu_release_firmware(g, pmu->fw); | 2253 | nvgpu_release_firmware(g, pmu->fw); |
2239 | 2254 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 5b22d1a4..365c7252 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -1295,6 +1295,9 @@ struct gk20a { | |||
1295 | u32 syncpt_size; | 1295 | u32 syncpt_size; |
1296 | #endif | 1296 | #endif |
1297 | struct nvgpu_mem syncpt_mem; | 1297 | struct nvgpu_mem syncpt_mem; |
1298 | |||
1299 | struct nvgpu_list_node boardobj_head; | ||
1300 | struct nvgpu_list_node boardobjgrp_head; | ||
1298 | }; | 1301 | }; |
1299 | 1302 | ||
1300 | static inline unsigned long gk20a_get_gr_idle_timeout(struct gk20a *g) | 1303 | static inline unsigned long gk20a_get_gr_idle_timeout(struct gk20a *g) |