summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/boardobj
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/boardobj')
-rw-r--r--drivers/gpu/nvgpu/boardobj/boardobjgrp.c52
-rw-r--r--drivers/gpu/nvgpu/boardobj/boardobjgrp.h13
2 files changed, 65 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c
index 577acda3..43928ac1 100644
--- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.c
+++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.c
@@ -254,6 +254,58 @@ static u32 boardobjgrp_pmustatusinstget_stub(struct gk20a *g,
254 return -EINVAL; 254 return -EINVAL;
255} 255}
256 256
257u32 boardobjgrp_pmudatainit_legacy(struct gk20a *g,
258 struct boardobjgrp *pboardobjgrp,
259 struct nv_pmu_boardobjgrp_super *pboardobjgrppmu)
260{
261 u32 status = 0;
262 struct boardobj *pboardobj = NULL;
263 struct nv_pmu_boardobj *ppmudata = NULL;
264 u8 index;
265
266 gk20a_dbg_info("");
267
268 if (pboardobjgrp == NULL)
269 return -EINVAL;
270 if (pboardobjgrppmu == NULL)
271 return -EINVAL;
272
273 boardobjgrpe32hdrset((struct nv_pmu_boardobjgrp *)pboardobjgrppmu,
274 pboardobjgrp->objmask);
275
276 BOARDOBJGRP_FOR_EACH_INDEX_IN_MASK(32, index, pboardobjgrp->objmask) {
277 /* Obtain pointer to the current instance of the Object from the Group */
278 pboardobj = pboardobjgrp->objgetbyidx(pboardobjgrp, index);
279 if (NULL == pboardobj) {
280 gk20a_err(dev_from_gk20a(g),
281 "could not get object instance");
282 status = -EINVAL;
283 goto boardobjgrppmudatainit_legacy_done;
284 }
285
286 status = pboardobjgrp->pmudatainstget(g,
287 (struct nv_pmu_boardobjgrp *)pboardobjgrppmu,
288 &ppmudata, index);
289 if (status) {
290 gk20a_err(dev_from_gk20a(g),
291 "could not get object instance");
292 goto boardobjgrppmudatainit_legacy_done;
293 }
294
295 /* Initialize the PMU Data */
296 status = pboardobj->pmudatainit(g, pboardobj, ppmudata);
297 if (status) {
298 gk20a_err(dev_from_gk20a(g),
299 "could not parse pmu for device %d", index);
300 goto boardobjgrppmudatainit_legacy_done;
301 }
302 }
303 BOARDOBJGRP_FOR_EACH_INDEX_IN_MASK_END
304
305boardobjgrppmudatainit_legacy_done:
306 gk20a_dbg_info(" Done");
307 return status;
308}
257 309
258u32 boardobjgrp_pmudatainit_super(struct gk20a *g, struct boardobjgrp 310u32 boardobjgrp_pmudatainit_super(struct gk20a *g, struct boardobjgrp
259 *pboardobjgrp, struct nv_pmu_boardobjgrp_super *pboardobjgrppmu) 311 *pboardobjgrp, struct nv_pmu_boardobjgrp_super *pboardobjgrppmu)
diff --git a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h
index 6527bbdc..7baa5bea 100644
--- a/drivers/gpu/nvgpu/boardobj/boardobjgrp.h
+++ b/drivers/gpu/nvgpu/boardobj/boardobjgrp.h
@@ -254,6 +254,19 @@ struct boardobjgrp {
254#define BOARDOBJGRP_FOR_EACH(_pgrp, _ptype, _pobj, _index) \ 254#define BOARDOBJGRP_FOR_EACH(_pgrp, _ptype, _pobj, _index) \
255 BOARDOBJGRP_ITERATOR(_pgrp, _ptype, _pobj, _index, NULL) 255 BOARDOBJGRP_ITERATOR(_pgrp, _ptype, _pobj, _index, NULL)
256 256
257#define BOARDOBJGRP_FOR_EACH_INDEX_IN_MASK(mask_width, index, mask) \
258{ \
259 u##mask_width lcl_msk = (u##mask_width)(mask); \
260 for (index = 0; lcl_msk != 0; index++, lcl_msk >>= 1) { \
261 if (((u##mask_width)((u64)1) & lcl_msk) == 0) { \
262 continue; \
263 }
264
265#define BOARDOBJGRP_FOR_EACH_INDEX_IN_MASK_END \
266 } \
267}
268
269
257/*! 270/*!
258* Invalid UNIT_ID. Used to indicate that the implementing class has not set 271* Invalid UNIT_ID. Used to indicate that the implementing class has not set
259* @ref BOARDOBJGRP::unitId and, thus, certain BOARDOBJGRP PMU interfaces are 272* @ref BOARDOBJGRP::unitId and, thus, certain BOARDOBJGRP PMU interfaces are