153e0a3e7SBen Skeggs /* 253e0a3e7SBen Skeggs * Copyright 2018 Red Hat Inc. 353e0a3e7SBen Skeggs * 453e0a3e7SBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a 553e0a3e7SBen Skeggs * copy of this software and associated documentation files (the "Software"), 653e0a3e7SBen Skeggs * to deal in the Software without restriction, including without limitation 753e0a3e7SBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense, 853e0a3e7SBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the 953e0a3e7SBen Skeggs * Software is furnished to do so, subject to the following conditions: 1053e0a3e7SBen Skeggs * 1153e0a3e7SBen Skeggs * The above copyright notice and this permission notice shall be included in 1253e0a3e7SBen Skeggs * all copies or substantial portions of the Software. 1353e0a3e7SBen Skeggs * 1453e0a3e7SBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1553e0a3e7SBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1653e0a3e7SBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1753e0a3e7SBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 1853e0a3e7SBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 1953e0a3e7SBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 2053e0a3e7SBen Skeggs * OTHER DEALINGS IN THE SOFTWARE. 2153e0a3e7SBen Skeggs */ 2253e0a3e7SBen Skeggs #include "ovly.h" 232ce7f386SBen Skeggs #include "atom.h" 2453e0a3e7SBen Skeggs 2553e0a3e7SBen Skeggs #include <nouveau_bo.h> 2653e0a3e7SBen Skeggs 276d6e11e2SBen Skeggs #include <nvif/push507c.h> 28ed3d1489SBen Skeggs #include <nvif/timer.h> 29ed3d1489SBen Skeggs 306d6e11e2SBen Skeggs static int 312ce7f386SBen Skeggs ovly827e_image_set(struct nv50_wndw *wndw, struct nv50_wndw_atom *asyw) 322ce7f386SBen Skeggs { 336d6e11e2SBen Skeggs struct nvif_push *push = wndw->wndw.push; 346d6e11e2SBen Skeggs int ret; 356d6e11e2SBen Skeggs 366d6e11e2SBen Skeggs if ((ret = PUSH_WAIT(push, 12))) 376d6e11e2SBen Skeggs return ret; 386d6e11e2SBen Skeggs 396d6e11e2SBen Skeggs PUSH_NVSQ(push, NV827E, 0x0084, asyw->image.interval << 4); 406d6e11e2SBen Skeggs PUSH_NVSQ(push, NV827E, 0x00c0, asyw->image.handle[0]); 416d6e11e2SBen Skeggs PUSH_NVSQ(push, NV827E, 0x0100, 0x00000002); 426d6e11e2SBen Skeggs PUSH_NVSQ(push, NV827E, 0x0800, asyw->image.offset[0] >> 8); 436d6e11e2SBen Skeggs PUSH_NVSQ(push, NV827E, 0x0808, asyw->image.h << 16 | asyw->image.w, 446d6e11e2SBen Skeggs 0x080c, asyw->image.layout << 20 | 452ce7f386SBen Skeggs (asyw->image.pitch[0] >> 8) << 8 | 462ce7f386SBen Skeggs asyw->image.blocks[0] << 8 | 476d6e11e2SBen Skeggs asyw->image.blockh, 486d6e11e2SBen Skeggs 0x0810, asyw->image.format << 8 | 492ce7f386SBen Skeggs asyw->image.colorspace); 506d6e11e2SBen Skeggs return 0; 512ce7f386SBen Skeggs } 522ce7f386SBen Skeggs 532ce7f386SBen Skeggs int 542ce7f386SBen Skeggs ovly827e_ntfy_wait_begun(struct nouveau_bo *bo, u32 offset, 552ce7f386SBen Skeggs struct nvif_device *device) 562ce7f386SBen Skeggs { 572ce7f386SBen Skeggs s64 time = nvif_msec(device, 2000ULL, 582ce7f386SBen Skeggs u32 data = nouveau_bo_rd32(bo, offset / 4 + 3); 592ce7f386SBen Skeggs if ((data & 0xffff0000) == 0xffff0000) 602ce7f386SBen Skeggs break; 612ce7f386SBen Skeggs usleep_range(1, 2); 622ce7f386SBen Skeggs ); 632ce7f386SBen Skeggs return time < 0 ? time : 0; 642ce7f386SBen Skeggs } 652ce7f386SBen Skeggs 662ce7f386SBen Skeggs void 672ce7f386SBen Skeggs ovly827e_ntfy_reset(struct nouveau_bo *bo, u32 offset) 682ce7f386SBen Skeggs { 692ce7f386SBen Skeggs nouveau_bo_wr32(bo, offset / 4 + 0, 0x00000000); 702ce7f386SBen Skeggs nouveau_bo_wr32(bo, offset / 4 + 1, 0x00000000); 712ce7f386SBen Skeggs nouveau_bo_wr32(bo, offset / 4 + 2, 0x00000000); 722ce7f386SBen Skeggs nouveau_bo_wr32(bo, offset / 4 + 3, 0x80000000); 732ce7f386SBen Skeggs } 7453e0a3e7SBen Skeggs 7553e0a3e7SBen Skeggs static const struct nv50_wndw_func 7653e0a3e7SBen Skeggs ovly827e = { 772ce7f386SBen Skeggs .acquire = ovly507e_acquire, 782ce7f386SBen Skeggs .release = ovly507e_release, 79fe8a2eecSBen Skeggs .ntfy_set = base507c_ntfy_set, 80bcae99c2SBen Skeggs .ntfy_clr = base507c_ntfy_clr, 812ce7f386SBen Skeggs .ntfy_reset = ovly827e_ntfy_reset, 822ce7f386SBen Skeggs .ntfy_wait_begun = ovly827e_ntfy_wait_begun, 832ce7f386SBen Skeggs .image_set = ovly827e_image_set, 848944d8b3SBen Skeggs .image_clr = base507c_image_clr, 852ce7f386SBen Skeggs .scale_set = ovly507e_scale_set, 862ce7f386SBen Skeggs .update = ovly507e_update, 8753e0a3e7SBen Skeggs }; 8853e0a3e7SBen Skeggs 8953e0a3e7SBen Skeggs const u32 9053e0a3e7SBen Skeggs ovly827e_format[] = { 912ce7f386SBen Skeggs DRM_FORMAT_YUYV, 922ce7f386SBen Skeggs DRM_FORMAT_UYVY, 932ce7f386SBen Skeggs DRM_FORMAT_XRGB8888, 942ce7f386SBen Skeggs DRM_FORMAT_XRGB1555, 952ce7f386SBen Skeggs DRM_FORMAT_XBGR2101010, 9653e0a3e7SBen Skeggs 0 9753e0a3e7SBen Skeggs }; 9853e0a3e7SBen Skeggs 9953e0a3e7SBen Skeggs int 10053e0a3e7SBen Skeggs ovly827e_new(struct nouveau_drm *drm, int head, s32 oclass, 10153e0a3e7SBen Skeggs struct nv50_wndw **pwndw) 10253e0a3e7SBen Skeggs { 10353e0a3e7SBen Skeggs return ovly507e_new_(&ovly827e, ovly827e_format, drm, head, oclass, 10453e0a3e7SBen Skeggs 0x00000004 << (head * 8), pwndw); 10553e0a3e7SBen Skeggs } 106