summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c51
1 files changed, 3 insertions, 48 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index 7fe25190..ce965992 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -104,51 +104,6 @@ static void printtrace(struct nvgpu_pmu *pmu)
104 nvgpu_kfree(g, tracebuffer); 104 nvgpu_kfree(g, tracebuffer);
105} 105}
106 106
107
108void pmu_copy_from_dmem(struct nvgpu_pmu *pmu,
109 u32 src, u8 *dst, u32 size, u8 port)
110{
111 struct gk20a *g = gk20a_from_pmu(pmu);
112 u32 i, words, bytes;
113 u32 data, addr_mask;
114 u32 *dst_u32 = (u32*)dst;
115
116 if (size == 0) {
117 nvgpu_err(g, "size is zero");
118 return;
119 }
120
121 if (src & 0x3) {
122 nvgpu_err(g, "src (0x%08x) not 4-byte aligned", src);
123 return;
124 }
125
126 nvgpu_mutex_acquire(&pmu->pmu_copy_lock);
127
128 words = size >> 2;
129 bytes = size & 0x3;
130
131 addr_mask = pwr_falcon_dmemc_offs_m() |
132 pwr_falcon_dmemc_blk_m();
133
134 src &= addr_mask;
135
136 gk20a_writel(g, pwr_falcon_dmemc_r(port),
137 src | pwr_falcon_dmemc_aincr_f(1));
138
139 for (i = 0; i < words; i++)
140 dst_u32[i] = gk20a_readl(g, pwr_falcon_dmemd_r(port));
141
142 if (bytes > 0) {
143 data = gk20a_readl(g, pwr_falcon_dmemd_r(port));
144 for (i = 0; i < bytes; i++) {
145 dst[(words << 2) + i] = ((u8 *)&data)[i];
146 }
147 }
148 nvgpu_mutex_release(&pmu->pmu_copy_lock);
149 return;
150}
151
152void pmu_copy_to_dmem(struct nvgpu_pmu *pmu, 107void pmu_copy_to_dmem(struct nvgpu_pmu *pmu,
153 u32 dst, u8 *src, u32 size, u8 port) 108 u32 dst, u8 *src, u32 size, u8 port)
154{ 109{
@@ -812,7 +767,7 @@ void pmu_dump_elpg_stats(struct nvgpu_pmu *pmu)
812 struct gk20a *g = gk20a_from_pmu(pmu); 767 struct gk20a *g = gk20a_from_pmu(pmu);
813 struct pmu_pg_stats stats; 768 struct pmu_pg_stats stats;
814 769
815 pmu_copy_from_dmem(pmu, 770 nvgpu_flcn_copy_from_dmem(pmu->flcn,
816 pmu->stat_dmem_offset[PMU_PG_ELPG_ENGINE_ID_GRAPHICS], 771 pmu->stat_dmem_offset[PMU_PG_ELPG_ENGINE_ID_GRAPHICS],
817 (u8 *)&stats, sizeof(struct pmu_pg_stats), 0); 772 (u8 *)&stats, sizeof(struct pmu_pg_stats), 0);
818 773
@@ -845,7 +800,7 @@ void pmu_dump_elpg_stats(struct nvgpu_pmu *pmu)
845 Turn on PG_DEBUG in ucode and locate symbol "ElpgLog" offset 800 Turn on PG_DEBUG in ucode and locate symbol "ElpgLog" offset
846 in .nm file, e.g. 0x1000066c. use 0x66c. 801 in .nm file, e.g. 0x1000066c. use 0x66c.
847 u32 i, val[20]; 802 u32 i, val[20];
848 pmu_copy_from_dmem(pmu, 0x66c, 803 nvgpu_flcn_copy_from_dmem(pmu->flcn, 0x66c,
849 (u8 *)val, sizeof(val), 0); 804 (u8 *)val, sizeof(val), 0);
850 gk20a_dbg_pmu("elpg log begin"); 805 gk20a_dbg_pmu("elpg log begin");
851 for (i = 0; i < 20; i++) 806 for (i = 0; i < 20; i++)
@@ -1150,7 +1105,7 @@ void gk20a_pmu_elpg_statistics(struct gk20a *g, u32 pg_engine_id,
1150 struct nvgpu_pmu *pmu = &g->pmu; 1105 struct nvgpu_pmu *pmu = &g->pmu;
1151 struct pmu_pg_stats stats; 1106 struct pmu_pg_stats stats;
1152 1107
1153 pmu_copy_from_dmem(pmu, 1108 nvgpu_flcn_copy_from_dmem(pmu->flcn,
1154 pmu->stat_dmem_offset[pg_engine_id], 1109 pmu->stat_dmem_offset[pg_engine_id],
1155 (u8 *)&stats, sizeof(struct pmu_pg_stats), 0); 1110 (u8 *)&stats, sizeof(struct pmu_pg_stats), 0);
1156 1111