1fda9279dSmrg/* 2fda9279dSmrg * Copyright 2014 Red Hat Inc. 3fda9279dSmrg * 4fda9279dSmrg * Permission is hereby granted, free of charge, to any person obtaining a 5fda9279dSmrg * copy of this software and associated documentation files (the "Software"), 6fda9279dSmrg * to deal in the Software without restriction, including without limitation 7fda9279dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8fda9279dSmrg * and/or sell copies of the Software, and to permit persons to whom the 9fda9279dSmrg * Software is furnished to do so, subject to the following conditions: 10fda9279dSmrg * 11fda9279dSmrg * The above copyright notice and this permission notice shall be included in 12fda9279dSmrg * all copies or substantial portions of the Software. 13fda9279dSmrg * 14fda9279dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15fda9279dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16fda9279dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17fda9279dSmrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18fda9279dSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19fda9279dSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20fda9279dSmrg * OTHER DEALINGS IN THE SOFTWARE. 21fda9279dSmrg * 22fda9279dSmrg * Authors: Ben Skeggs <bskeggs@redhat.com> 23fda9279dSmrg */ 24fda9279dSmrg 25fda9279dSmrg#include "nouveau_copy.h" 26fda9279dSmrg 27fda9279dSmrg#include "hwdefs/nv_object.xml.h" 28fda9279dSmrg#include "nv50_accel.h" 29fda9279dSmrg 30fda9279dSmrgstatic Bool 31fda9279dSmrgnouveau_copy85b5_rect(struct nouveau_pushbuf *push, struct nouveau_object *copy, 32fda9279dSmrg int w, int h, int cpp, 33fda9279dSmrg struct nouveau_bo *src, uint32_t src_off, int src_dom, 34fda9279dSmrg int src_pitch, int src_h, int src_x, int src_y, 35fda9279dSmrg struct nouveau_bo *dst, uint32_t dst_off, int dst_dom, 36fda9279dSmrg int dst_pitch, int dst_h, int dst_x, int dst_y) 37fda9279dSmrg{ 38fda9279dSmrg struct nouveau_pushbuf_refn refs[] = { 39fda9279dSmrg { src, src_dom | NOUVEAU_BO_RD }, 40fda9279dSmrg { dst, dst_dom | NOUVEAU_BO_WR }, 41fda9279dSmrg }; 42fda9279dSmrg unsigned exec; 43fda9279dSmrg 44fda9279dSmrg if (nouveau_pushbuf_space(push, 64, 0, 0) || 45fda9279dSmrg nouveau_pushbuf_refn (push, refs, 2)) 46fda9279dSmrg return FALSE; 47fda9279dSmrg 48fda9279dSmrg exec = 0x00000000; 49fda9279dSmrg if (!src->config.nv50.memtype) { 50fda9279dSmrg src_off += src_y * src_pitch + src_x * cpp; 51fda9279dSmrg exec |= 0x00000010; 52fda9279dSmrg } 53fda9279dSmrg if (!dst->config.nv50.memtype) { 54fda9279dSmrg dst_off += dst_y * dst_pitch + dst_x * cpp; 55fda9279dSmrg exec |= 0x00000100; 56fda9279dSmrg } 57fda9279dSmrg 58fda9279dSmrg BEGIN_NV04(push, SUBC_COPY(0x0200), 7); 59fda9279dSmrg PUSH_DATA (push, src->config.nv50.tile_mode); 60fda9279dSmrg PUSH_DATA (push, src_pitch); 61fda9279dSmrg PUSH_DATA (push, src_h); 62fda9279dSmrg PUSH_DATA (push, 1); 63fda9279dSmrg PUSH_DATA (push, 0); 64fda9279dSmrg PUSH_DATA (push, src_x * cpp); 65fda9279dSmrg PUSH_DATA (push, src_y); 66fda9279dSmrg BEGIN_NV04(push, SUBC_COPY(0x0220), 7); 67fda9279dSmrg PUSH_DATA (push, dst->config.nv50.tile_mode); 68fda9279dSmrg PUSH_DATA (push, dst_pitch); 69fda9279dSmrg PUSH_DATA (push, dst_h); 70fda9279dSmrg PUSH_DATA (push, 1); 71fda9279dSmrg PUSH_DATA (push, 0); 72fda9279dSmrg PUSH_DATA (push, dst_x * cpp); 73fda9279dSmrg PUSH_DATA (push, dst_y); 74fda9279dSmrg BEGIN_NV04(push, SUBC_COPY(0x030c), 8); 75fda9279dSmrg PUSH_DATA (push, (src->offset + src_off) >> 32); 76fda9279dSmrg PUSH_DATA (push, (src->offset + src_off)); 77fda9279dSmrg PUSH_DATA (push, (dst->offset + dst_off) >> 32); 78fda9279dSmrg PUSH_DATA (push, (dst->offset + dst_off)); 79fda9279dSmrg PUSH_DATA (push, src_pitch); 80fda9279dSmrg PUSH_DATA (push, dst_pitch); 81fda9279dSmrg PUSH_DATA (push, w * cpp); 82fda9279dSmrg PUSH_DATA (push, h); 83fda9279dSmrg BEGIN_NV04(push, SUBC_COPY(0x0300), 1); 84fda9279dSmrg PUSH_DATA (push, exec); 85fda9279dSmrg return TRUE; 86fda9279dSmrg} 87fda9279dSmrg 88fda9279dSmrgBool 89fda9279dSmrgnouveau_copy85b5_init(NVPtr pNv) 90fda9279dSmrg{ 91fda9279dSmrg struct nouveau_pushbuf *push = pNv->ce_pushbuf; 92fda9279dSmrg struct nv04_fifo *fifo = pNv->ce_channel->data; 93fda9279dSmrg if (PUSH_SPACE(push, 8)) { 94fda9279dSmrg BEGIN_NV04(push, NV01_SUBC(COPY, OBJECT), 1); 95fda9279dSmrg PUSH_DATA (push, pNv->NvCopy->handle); 96fda9279dSmrg BEGIN_NV04(push, SUBC_COPY(0x0180), 3); 97fda9279dSmrg PUSH_DATA (push, fifo->vram); 98fda9279dSmrg PUSH_DATA (push, fifo->vram); 99fda9279dSmrg PUSH_DATA (push, fifo->vram); 100fda9279dSmrg pNv->ce_rect = nouveau_copy85b5_rect; 101fda9279dSmrg return TRUE; 102fda9279dSmrg } 103fda9279dSmrg return FALSE; 104fda9279dSmrg} 105