Commit | Line | Data |
---|---|---|
fb3e9c61 BS |
1 | /* |
2 | * Copyright 2016 Red Hat Inc. | |
3 | * | |
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: | |
10 | * | |
11 | * The above copyright notice and this permission notice shall be included in | |
12 | * all copies or substantial portions of the Software. | |
13 | * | |
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. | |
21 | * | |
22 | * Authors: Ben Skeggs <bskeggs@redhat.com> | |
23 | */ | |
24 | #include "priv.h" | |
25 | ||
26 | static int | |
27 | gk104_top_oneinit(struct nvkm_top *top) | |
28 | { | |
29 | struct nvkm_subdev *subdev = &top->subdev; | |
30 | struct nvkm_device *device = subdev->device; | |
31 | struct nvkm_top_device *info = NULL; | |
51012a39 | 32 | u32 data, type, inst; |
fb3e9c61 BS |
33 | int i; |
34 | ||
35 | for (i = 0; i < 64; i++) { | |
36 | if (!info) { | |
37 | if (!(info = nvkm_top_device_new(top))) | |
38 | return -ENOMEM; | |
39 | type = ~0; | |
51012a39 | 40 | inst = 0; |
fb3e9c61 BS |
41 | } |
42 | ||
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 */ | |
47 | continue; | |
48 | case 0x00000001: /* DATA */ | |
51012a39 | 49 | inst = (data & 0x3c000000) >> 26; |
fb3e9c61 BS |
50 | info->addr = (data & 0x00fff000); |
51 | info->fault = (data & 0x000000f8) >> 3; | |
52 | break; | |
53 | case 0x00000002: /* ENUM */ | |
54 | if (data & 0x00000020) | |
55 | info->engine = (data & 0x3c000000) >> 26; | |
56 | if (data & 0x00000010) | |
57 | info->runlist = (data & 0x01e00000) >> 21; | |
58 | if (data & 0x00000008) | |
59 | info->intr = (data & 0x000f8000) >> 15; | |
60 | if (data & 0x00000004) | |
61 | info->reset = (data & 0x00003e00) >> 9; | |
62 | break; | |
63 | case 0x00000003: /* ENGINE_TYPE */ | |
64 | type = (data & 0x7ffffffc) >> 2; | |
65 | break; | |
66 | } | |
67 | ||
68 | if (data & 0x80000000) | |
69 | continue; | |
70 | ||
71 | /* Translate engine type to NVKM engine identifier. */ | |
51012a39 BS |
72 | #define A_(A) if (inst == 0) info->index = NVKM_ENGINE_##A |
73 | #define B_(A) if (inst + NVKM_ENGINE_##A##0 < NVKM_ENGINE_##A##_LAST + 1) \ | |
74 | info->index = NVKM_ENGINE_##A##0 + inst | |
fb3e9c61 | 75 | switch (type) { |
51012a39 BS |
76 | case 0x00000000: A_(GR ); break; |
77 | case 0x00000001: A_(CE0 ); break; | |
78 | case 0x00000002: A_(CE1 ); break; | |
79 | case 0x00000003: A_(CE2 ); break; | |
80 | case 0x00000008: A_(MSPDEC); break; | |
81 | case 0x00000009: A_(MSPPP ); break; | |
82 | case 0x0000000a: A_(MSVLD ); break; | |
83 | case 0x0000000b: A_(MSENC ); break; | |
84 | case 0x0000000c: A_(VIC ); break; | |
85 | case 0x0000000d: A_(SEC ); break; | |
86 | case 0x0000000e: B_(NVENC ); break; | |
87 | case 0x0000000f: A_(NVENC1); break; | |
88 | case 0x00000010: A_(NVDEC ); break; | |
89 | case 0x00000013: B_(CE ); break; | |
fb3e9c61 BS |
90 | break; |
91 | default: | |
92 | break; | |
93 | } | |
94 | ||
51012a39 BS |
95 | nvkm_debug(subdev, "%02x.%d (%8s): addr %06x fault %2d " |
96 | "engine %2d runlist %2d intr %2d " | |
97 | "reset %2d\n", type, inst, | |
fb3e9c61 BS |
98 | info->index == NVKM_SUBDEV_NR ? NULL : |
99 | nvkm_subdev_name[info->index], | |
100 | info->addr, info->fault, info->engine, info->runlist, | |
101 | info->intr, info->reset); | |
102 | info = NULL; | |
103 | } | |
104 | ||
105 | return 0; | |
106 | } | |
107 | ||
108 | static const struct nvkm_top_func | |
109 | gk104_top = { | |
110 | .oneinit = gk104_top_oneinit, | |
111 | }; | |
112 | ||
113 | int | |
114 | gk104_top_new(struct nvkm_device *device, int index, struct nvkm_top **ptop) | |
115 | { | |
116 | return nvkm_top_new_(&gk104_top, device, index, ptop); | |
117 | } |