forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-04 1543e317f1da31b75942316931e8f491a8920811
kernel/drivers/gpu/drm/nouveau/nvkm/engine/fifo/gk104.c
....@@ -149,16 +149,41 @@
149149 }
150150
151151 void
152
-gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl)
152
+gk104_fifo_runlist_commit(struct gk104_fifo *fifo, int runl,
153
+ struct nvkm_memory *mem, int nr)
154
+{
155
+ struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
156
+ struct nvkm_device *device = subdev->device;
157
+ int target;
158
+
159
+ switch (nvkm_memory_target(mem)) {
160
+ case NVKM_MEM_TARGET_VRAM: target = 0; break;
161
+ case NVKM_MEM_TARGET_NCOH: target = 3; break;
162
+ default:
163
+ WARN_ON(1);
164
+ return;
165
+ }
166
+
167
+ nvkm_wr32(device, 0x002270, (nvkm_memory_addr(mem) >> 12) |
168
+ (target << 28));
169
+ nvkm_wr32(device, 0x002274, (runl << 20) | nr);
170
+
171
+ if (nvkm_msec(device, 2000,
172
+ if (!(nvkm_rd32(device, 0x002284 + (runl * 0x08)) & 0x00100000))
173
+ break;
174
+ ) < 0)
175
+ nvkm_error(subdev, "runlist %d update timeout\n", runl);
176
+}
177
+
178
+void
179
+gk104_fifo_runlist_update(struct gk104_fifo *fifo, int runl)
153180 {
154181 const struct gk104_fifo_runlist_func *func = fifo->func->runlist;
155182 struct gk104_fifo_chan *chan;
156183 struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
157
- struct nvkm_device *device = subdev->device;
158184 struct nvkm_memory *mem;
159185 struct nvkm_fifo_cgrp *cgrp;
160186 int nr = 0;
161
- int target;
162187
163188 mutex_lock(&subdev->mutex);
164189 mem = fifo->runlist[runl].mem[fifo->runlist[runl].next];
....@@ -177,24 +202,7 @@
177202 }
178203 nvkm_done(mem);
179204
180
- switch (nvkm_memory_target(mem)) {
181
- case NVKM_MEM_TARGET_VRAM: target = 0; break;
182
- case NVKM_MEM_TARGET_NCOH: target = 3; break;
183
- default:
184
- WARN_ON(1);
185
- goto unlock;
186
- }
187
-
188
- nvkm_wr32(device, 0x002270, (nvkm_memory_addr(mem) >> 12) |
189
- (target << 28));
190
- nvkm_wr32(device, 0x002274, (runl << 20) | nr);
191
-
192
- if (nvkm_msec(device, 2000,
193
- if (!(nvkm_rd32(device, 0x002284 + (runl * 0x08)) & 0x00100000))
194
- break;
195
- ) < 0)
196
- nvkm_error(subdev, "runlist %d update timeout\n", runl);
197
-unlock:
205
+ func->commit(fifo, runl, mem, nr);
198206 mutex_unlock(&subdev->mutex);
199207 }
200208
....@@ -238,6 +246,29 @@
238246 gk104_fifo_runlist = {
239247 .size = 8,
240248 .chan = gk104_fifo_runlist_chan,
249
+ .commit = gk104_fifo_runlist_commit,
250
+};
251
+
252
+void
253
+gk104_fifo_pbdma_init(struct gk104_fifo *fifo)
254
+{
255
+ struct nvkm_device *device = fifo->base.engine.subdev.device;
256
+ nvkm_wr32(device, 0x000204, (1 << fifo->pbdma_nr) - 1);
257
+}
258
+
259
+int
260
+gk104_fifo_pbdma_nr(struct gk104_fifo *fifo)
261
+{
262
+ struct nvkm_device *device = fifo->base.engine.subdev.device;
263
+ /* Determine number of PBDMAs by checking valid enable bits. */
264
+ nvkm_wr32(device, 0x000204, 0xffffffff);
265
+ return hweight32(nvkm_rd32(device, 0x000204));
266
+}
267
+
268
+const struct gk104_fifo_pbdma_func
269
+gk104_fifo_pbdma = {
270
+ .nr = gk104_fifo_pbdma_nr,
271
+ .init = gk104_fifo_pbdma_init,
241272 };
242273
243274 static void
....@@ -267,7 +298,7 @@
267298 }
268299
269300 for (todo = runm; runl = __ffs(todo), todo; todo &= ~BIT(runl))
270
- gk104_fifo_runlist_commit(fifo, runl);
301
+ gk104_fifo_runlist_update(fifo, runl);
271302
272303 nvkm_wr32(device, 0x00262c, runm);
273304 nvkm_mask(device, 0x002630, runm, 0x00000000);
....@@ -456,10 +487,10 @@
456487 if (ee && ee->data2) {
457488 switch (ee->data2) {
458489 case NVKM_SUBDEV_BAR:
459
- nvkm_mask(device, 0x001704, 0x00000000, 0x00000000);
490
+ nvkm_bar_bar1_reset(device);
460491 break;
461492 case NVKM_SUBDEV_INSTMEM:
462
- nvkm_mask(device, 0x001714, 0x00000000, 0x00000000);
493
+ nvkm_bar_bar2_reset(device);
463494 break;
464495 case NVKM_ENGINE_IFB:
465496 nvkm_mask(device, 0x001718, 0x00000000, 0x00000000);
....@@ -613,31 +644,6 @@
613644 struct nvkm_device *device = subdev->device;
614645 u32 stat = nvkm_rd32(device, 0x00259c);
615646 nvkm_error(subdev, "DROPPED_MMU_FAULT %08x\n", stat);
616
-}
617
-
618
-static void
619
-gk104_fifo_intr_fault(struct gk104_fifo *fifo, int unit)
620
-{
621
- struct nvkm_subdev *subdev = &fifo->base.engine.subdev;
622
- struct nvkm_device *device = subdev->device;
623
- u32 inst = nvkm_rd32(device, 0x002800 + (unit * 0x10));
624
- u32 valo = nvkm_rd32(device, 0x002804 + (unit * 0x10));
625
- u32 vahi = nvkm_rd32(device, 0x002808 + (unit * 0x10));
626
- u32 type = nvkm_rd32(device, 0x00280c + (unit * 0x10));
627
- struct nvkm_fault_data info;
628
-
629
- info.inst = (u64)inst << 12;
630
- info.addr = ((u64)vahi << 32) | valo;
631
- info.time = 0;
632
- info.engine = unit;
633
- info.valid = 1;
634
- info.gpc = (type & 0x1f000000) >> 24;
635
- info.client = (type & 0x00001f00) >> 8;
636
- info.access = (type & 0x00000080) >> 7;
637
- info.hub = (type & 0x00000040) >> 6;
638
- info.reason = (type & 0x000000ff);
639
-
640
- nvkm_fifo_fault(&fifo->base, &info);
641647 }
642648
643649 static const struct nvkm_bitfield gk104_fifo_pbdma_intr_0[] = {
....@@ -818,7 +824,7 @@
818824 u32 mask = nvkm_rd32(device, 0x00259c);
819825 while (mask) {
820826 u32 unit = __ffs(mask);
821
- gk104_fifo_intr_fault(fifo, unit);
827
+ fifo->func->intr.fault(&fifo->base, unit);
822828 nvkm_wr32(device, 0x00259c, (1 << unit));
823829 mask &= ~(1 << unit);
824830 }
....@@ -904,9 +910,7 @@
904910 enum nvkm_devidx engidx;
905911 u32 *map;
906912
907
- /* Determine number of PBDMAs by checking valid enable bits. */
908
- nvkm_wr32(device, 0x000204, 0xffffffff);
909
- fifo->pbdma_nr = hweight32(nvkm_rd32(device, 0x000204));
913
+ fifo->pbdma_nr = fifo->func->pbdma->nr(fifo);
910914 nvkm_debug(subdev, "%d PBDMA(s)\n", fifo->pbdma_nr);
911915
912916 /* Read PBDMA->runlist(s) mapping from HW. */
....@@ -978,7 +982,7 @@
978982 int i;
979983
980984 /* Enable PBDMAs. */
981
- nvkm_wr32(device, 0x000204, (1 << fifo->pbdma_nr) - 1);
985
+ fifo->func->pbdma->init(fifo);
982986
983987 /* PBDMA[n] */
984988 for (i = 0; i < fifo->pbdma_nr; i++) {
....@@ -995,8 +999,8 @@
995999
9961000 nvkm_wr32(device, 0x002254, 0x10000000 | fifo->user.bar->addr >> 12);
9971001
998
- if (fifo->func->init_pbdma_timeout)
999
- fifo->func->init_pbdma_timeout(fifo);
1002
+ if (fifo->func->pbdma->init_timeout)
1003
+ fifo->func->pbdma->init_timeout(fifo);
10001004
10011005 nvkm_wr32(device, 0x002100, 0xffffffff);
10021006 nvkm_wr32(device, 0x002140, 0x7fffffff);
....@@ -1175,6 +1179,8 @@
11751179
11761180 static const struct gk104_fifo_func
11771181 gk104_fifo = {
1182
+ .intr.fault = gf100_fifo_intr_fault,
1183
+ .pbdma = &gk104_fifo_pbdma,
11781184 .fault.access = gk104_fifo_fault_access,
11791185 .fault.engine = gk104_fifo_fault_engine,
11801186 .fault.reason = gk104_fifo_fault_reason,