2 * Copyright 2016 Red Hat Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
22 * Authors: Ben Skeggs <bskeggs@redhat.com>
27 gk104_top_oneinit(struct nvkm_top
*top
)
29 struct nvkm_subdev
*subdev
= &top
->subdev
;
30 struct nvkm_device
*device
= subdev
->device
;
31 struct nvkm_top_device
*info
= NULL
;
35 for (i
= 0; i
< 64; i
++) {
37 if (!(info
= nvkm_top_device_new(top
)))
43 data
= nvkm_rd32(device
, 0x022700 + (i
* 0x04));
44 nvkm_trace(subdev
, "%02x: %08x\n", i
, data
);
45 switch (data
& 0x00000003) {
46 case 0x00000000: /* NOT_VALID */
48 case 0x00000001: /* DATA */
49 inst
= (data
& 0x3c000000) >> 26;
50 info
->addr
= (data
& 0x00fff000);
51 if (data
& 0x00000004)
52 info
->fault
= (data
& 0x000003f8) >> 3;
54 case 0x00000002: /* ENUM */
55 if (data
& 0x00000020)
56 info
->engine
= (data
& 0x3c000000) >> 26;
57 if (data
& 0x00000010)
58 info
->runlist
= (data
& 0x01e00000) >> 21;
59 if (data
& 0x00000008)
60 info
->intr
= (data
& 0x000f8000) >> 15;
61 if (data
& 0x00000004)
62 info
->reset
= (data
& 0x00003e00) >> 9;
64 case 0x00000003: /* ENGINE_TYPE */
65 type
= (data
& 0x7ffffffc) >> 2;
69 if (data
& 0x80000000)
72 /* Translate engine type to NVKM engine identifier. */
73 #define A_(A) if (inst == 0) info->index = NVKM_ENGINE_##A
74 #define B_(A) if (inst + NVKM_ENGINE_##A##0 < NVKM_ENGINE_##A##_LAST + 1) \
75 info->index = NVKM_ENGINE_##A##0 + inst
76 #define C_(A) if (inst == 0) info->index = NVKM_SUBDEV_##A
78 case 0x00000000: A_(GR
); break;
79 case 0x00000001: A_(CE0
); break;
80 case 0x00000002: A_(CE1
); break;
81 case 0x00000003: A_(CE2
); break;
82 case 0x00000008: A_(MSPDEC
); break;
83 case 0x00000009: A_(MSPPP
); break;
84 case 0x0000000a: A_(MSVLD
); break;
85 case 0x0000000b: A_(MSENC
); break;
86 case 0x0000000c: A_(VIC
); break;
87 case 0x0000000d: A_(SEC2
); break;
88 case 0x0000000e: B_(NVENC
); break;
89 case 0x0000000f: A_(NVENC1
); break;
90 case 0x00000010: B_(NVDEC
); break;
91 case 0x00000013: B_(CE
); break;
92 case 0x00000014: C_(GSP
); break;
97 nvkm_debug(subdev
, "%02x.%d (%8s): addr %06x fault %2d "
98 "engine %2d runlist %2d intr %2d "
99 "reset %2d\n", type
, inst
,
100 info
->index
== NVKM_SUBDEV_NR
? NULL
:
101 nvkm_subdev_name
[info
->index
],
102 info
->addr
, info
->fault
, info
->engine
, info
->runlist
,
103 info
->intr
, info
->reset
);
110 static const struct nvkm_top_func
112 .oneinit
= gk104_top_oneinit
,
116 gk104_top_new(struct nvkm_device
*device
, int index
, struct nvkm_top
**ptop
)
118 return nvkm_top_new_(&gk104_top
, device
, index
, ptop
);