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 "nvc0_accel.h" 29fda9279dSmrg 30fda9279dSmrgBool 31fda9279dSmrgnouveau_copya0b5_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 = 0x00000206; 49fda9279dSmrg if (!src->config.nvc0.memtype) { 50fda9279dSmrg src_off += src_y * src_pitch + src_x * cpp; 51fda9279dSmrg exec |= 0x00000080; 52fda9279dSmrg } 53fda9279dSmrg if (!dst->config.nvc0.memtype) { 54fda9279dSmrg dst_off += dst_y * dst_pitch + dst_x * cpp; 55fda9279dSmrg exec |= 0x00000100; 56fda9279dSmrg } 57fda9279dSmrg 58fda9279dSmrg BEGIN_NVC0(push, SUBC_COPY(0x0728), 6); 59fda9279dSmrg PUSH_DATA (push, 0x00001000 | src->config.nvc0.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_y << 16) | src_x * cpp); 65fda9279dSmrg BEGIN_NVC0(push, SUBC_COPY(0x070c), 6); 66fda9279dSmrg PUSH_DATA (push, 0x000001000 | dst->config.nvc0.tile_mode); 67fda9279dSmrg PUSH_DATA (push, dst_pitch); 68fda9279dSmrg PUSH_DATA (push, dst_h); 69fda9279dSmrg PUSH_DATA (push, 1); 70fda9279dSmrg PUSH_DATA (push, 0); 71fda9279dSmrg PUSH_DATA (push, (dst_y << 16) | dst_x * cpp); 72fda9279dSmrg BEGIN_NVC0(push, SUBC_COPY(0x0400), 8); 73fda9279dSmrg PUSH_DATA (push, (src->offset + src_off) >> 32); 74fda9279dSmrg PUSH_DATA (push, (src->offset + src_off)); 75fda9279dSmrg PUSH_DATA (push, (dst->offset + dst_off) >> 32); 76fda9279dSmrg PUSH_DATA (push, (dst->offset + dst_off)); 77fda9279dSmrg PUSH_DATA (push, src_pitch); 78fda9279dSmrg PUSH_DATA (push, dst_pitch); 79fda9279dSmrg PUSH_DATA (push, w * cpp); 80fda9279dSmrg PUSH_DATA (push, h); 81fda9279dSmrg BEGIN_NVC0(push, SUBC_COPY(0x0300), 1); 82fda9279dSmrg PUSH_DATA (push, exec); 83fda9279dSmrg return TRUE; 84fda9279dSmrg} 85fda9279dSmrg 86fda9279dSmrgBool 87fda9279dSmrgnouveau_copya0b5_init(NVPtr pNv) 88fda9279dSmrg{ 89fda9279dSmrg struct nouveau_pushbuf *push = pNv->ce_pushbuf; 90fda9279dSmrg if (PUSH_SPACE(push, 8)) { 91fda9279dSmrg BEGIN_NVC0(push, NV01_SUBC(COPY, OBJECT), 1); 92fda9279dSmrg PUSH_DATA (push, pNv->NvCopy->handle); 93fda9279dSmrg pNv->ce_rect = nouveau_copya0b5_rect; 94fda9279dSmrg return TRUE; 95fda9279dSmrg } 96fda9279dSmrg return FALSE; 97fda9279dSmrg} 98