| .. | .. |
|---|
| 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 | }; |
|---|