Lines Matching refs:falcon
30 struct nvkm_falcon *falcon = (void *)subdev; in nvkm_falcon_intr() local
31 u32 dispatch = nv_ro32(falcon, 0x01c); in nvkm_falcon_intr()
32 u32 intr = nv_ro32(falcon, 0x008) & dispatch & ~(dispatch >> 16); in nvkm_falcon_intr()
35 nv_debug(falcon, "ucode halted\n"); in nvkm_falcon_intr()
36 nv_wo32(falcon, 0x004, 0x00000010); in nvkm_falcon_intr()
41 nv_error(falcon, "unhandled intr 0x%08x\n", intr); in nvkm_falcon_intr()
42 nv_wo32(falcon, 0x004, intr); in nvkm_falcon_intr()
49 struct nvkm_falcon *falcon = (void *)object; in _nvkm_falcon_rd32() local
50 return nv_rd32(falcon, falcon->addr + addr); in _nvkm_falcon_rd32()
56 struct nvkm_falcon *falcon = (void *)object; in _nvkm_falcon_wr32() local
57 nv_wr32(falcon, falcon->addr + addr, data); in _nvkm_falcon_wr32()
74 struct nvkm_falcon *falcon = (void *)object; in _nvkm_falcon_init() local
81 ret = nvkm_engine_init(&falcon->base); in _nvkm_falcon_init()
87 falcon->version = 0; in _nvkm_falcon_init()
88 falcon->secret = (falcon->addr == 0x087000) ? 1 : 0; in _nvkm_falcon_init()
90 caps = nv_ro32(falcon, 0x12c); in _nvkm_falcon_init()
91 falcon->version = (caps & 0x0000000f); in _nvkm_falcon_init()
92 falcon->secret = (caps & 0x00000030) >> 4; in _nvkm_falcon_init()
95 caps = nv_ro32(falcon, 0x108); in _nvkm_falcon_init()
96 falcon->code.limit = (caps & 0x000001ff) << 8; in _nvkm_falcon_init()
97 falcon->data.limit = (caps & 0x0003fe00) >> 1; in _nvkm_falcon_init()
99 nv_debug(falcon, "falcon version: %d\n", falcon->version); in _nvkm_falcon_init()
100 nv_debug(falcon, "secret level: %d\n", falcon->secret); in _nvkm_falcon_init()
101 nv_debug(falcon, "code limit: %d\n", falcon->code.limit); in _nvkm_falcon_init()
102 nv_debug(falcon, "data limit: %d\n", falcon->data.limit); in _nvkm_falcon_init()
105 if (falcon->secret && falcon->version < 4) { in _nvkm_falcon_init()
106 if (!falcon->version) in _nvkm_falcon_init()
107 nv_wait(falcon, 0x008, 0x00000010, 0x00000010); in _nvkm_falcon_init()
109 nv_wait(falcon, 0x180, 0x80000000, 0); in _nvkm_falcon_init()
110 nv_wo32(falcon, 0x004, 0x00000010); in _nvkm_falcon_init()
114 nv_wo32(falcon, 0x014, 0xffffffff); in _nvkm_falcon_init()
119 if (!falcon->code.data) { in _nvkm_falcon_init()
121 device->chipset, falcon->addr >> 12); in _nvkm_falcon_init()
125 falcon->code.data = vmemdup(fw->data, fw->size); in _nvkm_falcon_init()
126 falcon->code.size = fw->size; in _nvkm_falcon_init()
127 falcon->data.data = NULL; in _nvkm_falcon_init()
128 falcon->data.size = 0; in _nvkm_falcon_init()
132 falcon->external = true; in _nvkm_falcon_init()
138 if (!falcon->code.data) { in _nvkm_falcon_init()
140 device->chipset, falcon->addr >> 12); in _nvkm_falcon_init()
144 nv_error(falcon, "unable to load firmware data\n"); in _nvkm_falcon_init()
148 falcon->data.data = vmemdup(fw->data, fw->size); in _nvkm_falcon_init()
149 falcon->data.size = fw->size; in _nvkm_falcon_init()
151 if (!falcon->data.data) in _nvkm_falcon_init()
155 device->chipset, falcon->addr >> 12); in _nvkm_falcon_init()
159 nv_error(falcon, "unable to load firmware code\n"); in _nvkm_falcon_init()
163 falcon->code.data = vmemdup(fw->data, fw->size); in _nvkm_falcon_init()
164 falcon->code.size = fw->size; in _nvkm_falcon_init()
166 if (!falcon->code.data) in _nvkm_falcon_init()
170 nv_debug(falcon, "firmware: %s (%s)\n", name, falcon->data.data ? in _nvkm_falcon_init()
174 if (!falcon->data.data && !falcon->core) { in _nvkm_falcon_init()
175 ret = nvkm_gpuobj_new(object->parent, NULL, falcon->code.size, in _nvkm_falcon_init()
176 256, 0, &falcon->core); in _nvkm_falcon_init()
178 nv_error(falcon, "core allocation failed, %d\n", ret); in _nvkm_falcon_init()
182 for (i = 0; i < falcon->code.size; i += 4) in _nvkm_falcon_init()
183 nv_wo32(falcon->core, i, falcon->code.data[i / 4]); in _nvkm_falcon_init()
187 if (falcon->core) { in _nvkm_falcon_init()
189 nv_wo32(falcon, 0x618, 0x04000000); in _nvkm_falcon_init()
191 nv_wo32(falcon, 0x618, 0x00000114); in _nvkm_falcon_init()
192 nv_wo32(falcon, 0x11c, 0); in _nvkm_falcon_init()
193 nv_wo32(falcon, 0x110, falcon->core->addr >> 8); in _nvkm_falcon_init()
194 nv_wo32(falcon, 0x114, 0); in _nvkm_falcon_init()
195 nv_wo32(falcon, 0x118, 0x00006610); in _nvkm_falcon_init()
197 if (falcon->code.size > falcon->code.limit || in _nvkm_falcon_init()
198 falcon->data.size > falcon->data.limit) { in _nvkm_falcon_init()
199 nv_error(falcon, "ucode exceeds falcon limit(s)\n"); in _nvkm_falcon_init()
203 if (falcon->version < 3) { in _nvkm_falcon_init()
204 nv_wo32(falcon, 0xff8, 0x00100000); in _nvkm_falcon_init()
205 for (i = 0; i < falcon->code.size / 4; i++) in _nvkm_falcon_init()
206 nv_wo32(falcon, 0xff4, falcon->code.data[i]); in _nvkm_falcon_init()
208 nv_wo32(falcon, 0x180, 0x01000000); in _nvkm_falcon_init()
209 for (i = 0; i < falcon->code.size / 4; i++) { in _nvkm_falcon_init()
211 nv_wo32(falcon, 0x188, i >> 6); in _nvkm_falcon_init()
212 nv_wo32(falcon, 0x184, falcon->code.data[i]); in _nvkm_falcon_init()
218 if (falcon->version < 3) { in _nvkm_falcon_init()
219 nv_wo32(falcon, 0xff8, 0x00000000); in _nvkm_falcon_init()
220 for (i = 0; !falcon->core && i < falcon->data.size / 4; i++) in _nvkm_falcon_init()
221 nv_wo32(falcon, 0xff4, falcon->data.data[i]); in _nvkm_falcon_init()
222 for (; i < falcon->data.limit; i += 4) in _nvkm_falcon_init()
223 nv_wo32(falcon, 0xff4, 0x00000000); in _nvkm_falcon_init()
225 nv_wo32(falcon, 0x1c0, 0x01000000); in _nvkm_falcon_init()
226 for (i = 0; !falcon->core && i < falcon->data.size / 4; i++) in _nvkm_falcon_init()
227 nv_wo32(falcon, 0x1c4, falcon->data.data[i]); in _nvkm_falcon_init()
228 for (; i < falcon->data.limit / 4; i++) in _nvkm_falcon_init()
229 nv_wo32(falcon, 0x1c4, 0x00000000); in _nvkm_falcon_init()
233 nv_wo32(falcon, 0x10c, 0x00000001); /* BLOCK_ON_FIFO */ in _nvkm_falcon_init()
234 nv_wo32(falcon, 0x104, 0x00000000); /* ENTRY */ in _nvkm_falcon_init()
235 nv_wo32(falcon, 0x100, 0x00000002); /* TRIGGER */ in _nvkm_falcon_init()
236 nv_wo32(falcon, 0x048, 0x00000003); /* FIFO | CHSW */ in _nvkm_falcon_init()
243 struct nvkm_falcon *falcon = (void *)object; in _nvkm_falcon_fini() local
246 nvkm_gpuobj_ref(NULL, &falcon->core); in _nvkm_falcon_fini()
247 if (falcon->external) { in _nvkm_falcon_fini()
248 vfree(falcon->data.data); in _nvkm_falcon_fini()
249 vfree(falcon->code.data); in _nvkm_falcon_fini()
250 falcon->code.data = NULL; in _nvkm_falcon_fini()
254 nv_mo32(falcon, 0x048, 0x00000003, 0x00000000); in _nvkm_falcon_fini()
255 nv_wo32(falcon, 0x014, 0xffffffff); in _nvkm_falcon_fini()
257 return nvkm_engine_fini(&falcon->base, suspend); in _nvkm_falcon_fini()
266 struct nvkm_falcon *falcon; in nvkm_falcon_create_() local
271 falcon = *pobject; in nvkm_falcon_create_()
275 falcon->addr = addr; in nvkm_falcon_create_()