.. | .. |
---|
22 | 22 | #include "core.h" |
---|
23 | 23 | #include "head.h" |
---|
24 | 24 | |
---|
| 25 | +#include <nvif/push507c.h> |
---|
| 26 | +#include <nvif/timer.h> |
---|
| 27 | + |
---|
| 28 | +#include <nvhw/class/cl907d.h> |
---|
| 29 | + |
---|
| 30 | +#include "nouveau_bo.h" |
---|
| 31 | + |
---|
| 32 | +int |
---|
| 33 | +core907d_caps_init(struct nouveau_drm *drm, struct nv50_disp *disp) |
---|
| 34 | +{ |
---|
| 35 | + struct nv50_core *core = disp->core; |
---|
| 36 | + struct nouveau_bo *bo = disp->sync; |
---|
| 37 | + s64 time; |
---|
| 38 | + int ret; |
---|
| 39 | + |
---|
| 40 | + NVBO_WR32(bo, NV50_DISP_CORE_NTFY, NV907D_CORE_NOTIFIER_3, CAPABILITIES_4, |
---|
| 41 | + NVDEF(NV907D_CORE_NOTIFIER_3, CAPABILITIES_4, DONE, FALSE)); |
---|
| 42 | + |
---|
| 43 | + ret = core507d_read_caps(disp); |
---|
| 44 | + if (ret < 0) |
---|
| 45 | + return ret; |
---|
| 46 | + |
---|
| 47 | + time = nvif_msec(core->chan.base.device, 2000ULL, |
---|
| 48 | + if (NVBO_TD32(bo, NV50_DISP_CORE_NTFY, |
---|
| 49 | + NV907D_CORE_NOTIFIER_3, CAPABILITIES_4, DONE, ==, TRUE)) |
---|
| 50 | + break; |
---|
| 51 | + usleep_range(1, 2); |
---|
| 52 | + ); |
---|
| 53 | + if (time < 0) |
---|
| 54 | + NV_ERROR(drm, "core caps notifier timeout\n"); |
---|
| 55 | + |
---|
| 56 | + return 0; |
---|
| 57 | +} |
---|
| 58 | + |
---|
25 | 59 | static const struct nv50_core_func |
---|
26 | 60 | core907d = { |
---|
27 | 61 | .init = core507d_init, |
---|
28 | 62 | .ntfy_init = core507d_ntfy_init, |
---|
| 63 | + .caps_init = core907d_caps_init, |
---|
29 | 64 | .ntfy_wait_done = core507d_ntfy_wait_done, |
---|
30 | 65 | .update = core507d_update, |
---|
31 | 66 | .head = &head907d, |
---|
| 67 | +#if IS_ENABLED(CONFIG_DEBUG_FS) |
---|
| 68 | + .crc = &crc907d, |
---|
| 69 | +#endif |
---|
32 | 70 | .dac = &dac907d, |
---|
33 | 71 | .sor = &sor907d, |
---|
34 | 72 | }; |
---|