1551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie/* 2551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Copyright 2008 Advanced Micro Devices, Inc. 3551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Copyright 2008 Red Hat Inc. 4551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Copyright 2009 Jerome Glisse. 5551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * 6551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 7551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * copy of this software and associated documentation files (the "Software"), 8551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * to deal in the Software without restriction, including without limitation 9551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * and/or sell copies of the Software, and to permit persons to whom the 11551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Software is furnished to do so, subject to the following conditions: 12551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * 13551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * The above copyright notice and this permission notice shall be included in 14551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * all copies or substantial portions of the Software. 15551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * 16551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * OTHER DEALINGS IN THE SOFTWARE. 23551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * 24551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Authors: Dave Airlie 25551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Alex Deucher 26551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * Jerome Glisse 27551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie */ 28760285e7e7ab282c25b5e90816f7c47000557f4fDavid Howells#include <drm/drmP.h> 29760285e7e7ab282c25b5e90816f7c47000557f4fDavid Howells#include <drm/radeon_drm.h> 30551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie#include "radeon_reg.h" 31551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie#include "radeon.h" 32e6990375ef4ec449994991034238f1ffab8a3a1aDaniel Vetter#include "radeon_asic.h" 33551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 3444ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen#include "r100d.h" 35551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie#include "r200_reg_safe.h" 36551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 37551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie#include "r100_track.h" 38551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 39551ebd837c75fc75df81811a18b7136c39cab487Dave Airliestatic int r200_get_vtx_size_0(uint32_t vtx_fmt_0) 40551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie{ 41551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie int vtx_size, i; 42551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size = 2; 43551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 44551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_Z0) 45551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 46551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_W0) 47551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 48551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie /* blend weight */ 49551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & (0x7 << R200_VTX_WEIGHT_COUNT_SHIFT)) 50551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size += (vtx_fmt_0 >> R200_VTX_WEIGHT_COUNT_SHIFT) & 0x7; 51551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_PV_MATRIX_SEL) 52551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 53551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_N0) 54551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size += 3; 55551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_POINT_SIZE) 56551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 57551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_DISCRETE_FOG) 58551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 59551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_SHININESS_0) 60551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 61551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_SHININESS_1) 62551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 63551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie for (i = 0; i < 8; i++) { 64551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie int color_size = (vtx_fmt_0 >> (11 + 2*i)) & 0x3; 65551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie switch (color_size) { 66551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 0: break; 67551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 1: vtx_size++; break; 68551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 2: vtx_size += 3; break; 69551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 3: vtx_size += 4; break; 70551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 71551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 72551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_XY1) 73551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size += 2; 74551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_Z1) 75551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 76551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_W1) 77551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size++; 78551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (vtx_fmt_0 & R200_VTX_N1) 79551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size += 3; 80551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return vtx_size; 81551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie} 82551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 8357d20a43c9b30663bdbacde8294a902edef35a84Christian Königstruct radeon_fence *r200_copy_dma(struct radeon_device *rdev, 8457d20a43c9b30663bdbacde8294a902edef35a84Christian König uint64_t src_offset, 8557d20a43c9b30663bdbacde8294a902edef35a84Christian König uint64_t dst_offset, 8657d20a43c9b30663bdbacde8294a902edef35a84Christian König unsigned num_gpu_pages, 8757d20a43c9b30663bdbacde8294a902edef35a84Christian König struct reservation_object *resv) 8844ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen{ 89e32eb50dbe43862606a51caa94368ec6bd019434Christian König struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; 9057d20a43c9b30663bdbacde8294a902edef35a84Christian König struct radeon_fence *fence; 9144ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen uint32_t size; 9244ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen uint32_t cur_size; 9344ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen int i, num_loops; 9444ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen int r = 0; 9544ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen 9644ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen /* radeon pitch is /64 */ 97003cefe0c238e683a29d2207dba945b508cd45b7Alex Deucher size = num_gpu_pages << RADEON_GPU_PAGE_SHIFT; 9844ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen num_loops = DIV_ROUND_UP(size, 0x1FFFFF); 99e32eb50dbe43862606a51caa94368ec6bd019434Christian König r = radeon_ring_lock(rdev, ring, num_loops * 4 + 64); 10044ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen if (r) { 10144ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen DRM_ERROR("radeon: moving bo (%d).\n", r); 10257d20a43c9b30663bdbacde8294a902edef35a84Christian König return ERR_PTR(r); 10344ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen } 10444ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen /* Must wait for 2D idle & clean before DMA or hangs might happen */ 105e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); 106e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, (1 << 16)); 10744ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen for (i = 0; i < num_loops; i++) { 10844ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen cur_size = size; 10944ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen if (cur_size > 0x1FFFFF) { 11044ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen cur_size = 0x1FFFFF; 11144ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen } 11244ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen size -= cur_size; 113e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, PACKET0(0x720, 2)); 114e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, src_offset); 115e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, dst_offset); 116e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, cur_size | (1 << 31) | (1 << 30)); 11744ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen src_offset += cur_size; 11844ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen dst_offset += cur_size; 11944ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen } 120e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, PACKET0(RADEON_WAIT_UNTIL, 0)); 121e32eb50dbe43862606a51caa94368ec6bd019434Christian König radeon_ring_write(ring, RADEON_WAIT_DMA_GUI_IDLE); 12257d20a43c9b30663bdbacde8294a902edef35a84Christian König r = radeon_fence_emit(rdev, &fence, RADEON_RING_TYPE_GFX_INDEX); 12357d20a43c9b30663bdbacde8294a902edef35a84Christian König if (r) { 12457d20a43c9b30663bdbacde8294a902edef35a84Christian König radeon_ring_unlock_undo(rdev, ring); 12557d20a43c9b30663bdbacde8294a902edef35a84Christian König return ERR_PTR(r); 12644ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen } 1271538a9e0e04f6a5b323cd3d65e9320512978fcecMichel Dänzer radeon_ring_unlock_commit(rdev, ring, false); 12857d20a43c9b30663bdbacde8294a902edef35a84Christian König return fence; 12944ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen} 13044ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen 13144ca7478d46aaad488d916f7262253e000ee60f9Pauli Nieminen 132551ebd837c75fc75df81811a18b7136c39cab487Dave Airliestatic int r200_get_vtx_size_1(uint32_t vtx_fmt_1) 133551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie{ 134551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie int vtx_size, i, tex_size; 135551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size = 0; 136551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie for (i = 0; i < 6; i++) { 137551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie tex_size = (vtx_fmt_1 >> (i * 3)) & 0x7; 138551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (tex_size > 4) 139551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie continue; 140551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie vtx_size += tex_size; 141551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 142551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return vtx_size; 143551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie} 144551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 145551ebd837c75fc75df81811a18b7136c39cab487Dave Airlieint r200_packet0_check(struct radeon_cs_parser *p, 146551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie struct radeon_cs_packet *pkt, 147551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie unsigned idx, unsigned reg) 148551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie{ 149551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie struct radeon_cs_reloc *reloc; 150551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie struct r100_cs_track *track; 151551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie volatile uint32_t *ib; 152551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie uint32_t tmp; 153551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie int r; 154551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie int i; 155551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie int face; 156551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie u32 tile_flags = 0; 157513bcb4655e68706594e45dfa1d4b181500110baDave Airlie u32 idx_value; 158551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 159f2e3922106f6b29083086393ee474ad4483bc487Jerome Glisse ib = p->ib.ptr; 160551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track = (struct r100_cs_track *)p->track; 161513bcb4655e68706594e45dfa1d4b181500110baDave Airlie idx_value = radeon_get_ib_value(p, idx); 162551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie switch (reg) { 163551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_CRTC_GUI_TRIG_VLINE: 164551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie r = r100_cs_packet_parse_vline(p); 165551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) { 166551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 167551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie idx, reg); 168c3ad63afcdb931159690aa7ba2906079c3b38a13Ilija Hadzic radeon_cs_dump_packet(p, pkt); 169551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 170551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 171551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 172551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie /* FIXME: only allow PACKET3 blit? easier to check for out of 173551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie * range access */ 174551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_DST_PITCH_OFFSET: 175551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_SRC_PITCH_OFFSET: 176551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie r = r100_reloc_pitch_offset(p, pkt, idx, reg); 177551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) 178551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 179551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 180551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RB3D_DEPTHOFFSET: 181012e976d42d2819c79bdd4ef2843515bdd44e408Ilija Hadzic r = radeon_cs_packet_next_reloc(p, &reloc, 0); 182551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) { 183551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 184551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie idx, reg); 185c3ad63afcdb931159690aa7ba2906079c3b38a13Ilija Hadzic radeon_cs_dump_packet(p, pkt); 186551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 187551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 188551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->zb.robj = reloc->robj; 189513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->zb.offset = idx_value; 19040b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->zb_dirty = true; 191df0af4403aa8df728a62ccb62a61b3244871068fChristian König ib[idx] = idx_value + ((u32)reloc->gpu_offset); 192551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 193551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RB3D_COLOROFFSET: 194012e976d42d2819c79bdd4ef2843515bdd44e408Ilija Hadzic r = radeon_cs_packet_next_reloc(p, &reloc, 0); 195551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) { 196551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 197551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie idx, reg); 198c3ad63afcdb931159690aa7ba2906079c3b38a13Ilija Hadzic radeon_cs_dump_packet(p, pkt); 199551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 200551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 201551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->cb[0].robj = reloc->robj; 202513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->cb[0].offset = idx_value; 20340b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->cb_dirty = true; 204df0af4403aa8df728a62ccb62a61b3244871068fChristian König ib[idx] = idx_value + ((u32)reloc->gpu_offset); 205551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 206551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXOFFSET_0: 207551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXOFFSET_1: 208551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXOFFSET_2: 209551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXOFFSET_3: 210551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXOFFSET_4: 211551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXOFFSET_5: 212551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXOFFSET_0) / 24; 213012e976d42d2819c79bdd4ef2843515bdd44e408Ilija Hadzic r = radeon_cs_packet_next_reloc(p, &reloc, 0); 214551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) { 215551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 216551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie idx, reg); 217c3ad63afcdb931159690aa7ba2906079c3b38a13Ilija Hadzic radeon_cs_dump_packet(p, pkt); 218551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 219551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 220f2746f83d50287fdb6768e0f20168c64b6a7c9cbAlex Deucher if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { 221df0af4403aa8df728a62ccb62a61b3244871068fChristian König if (reloc->tiling_flags & RADEON_TILING_MACRO) 222f2746f83d50287fdb6768e0f20168c64b6a7c9cbAlex Deucher tile_flags |= R200_TXO_MACRO_TILE; 223df0af4403aa8df728a62ccb62a61b3244871068fChristian König if (reloc->tiling_flags & RADEON_TILING_MICRO) 224f2746f83d50287fdb6768e0f20168c64b6a7c9cbAlex Deucher tile_flags |= R200_TXO_MICRO_TILE; 225f2746f83d50287fdb6768e0f20168c64b6a7c9cbAlex Deucher 226f2746f83d50287fdb6768e0f20168c64b6a7c9cbAlex Deucher tmp = idx_value & ~(0x7 << 2); 227f2746f83d50287fdb6768e0f20168c64b6a7c9cbAlex Deucher tmp |= tile_flags; 228df0af4403aa8df728a62ccb62a61b3244871068fChristian König ib[idx] = tmp + ((u32)reloc->gpu_offset); 229f2746f83d50287fdb6768e0f20168c64b6a7c9cbAlex Deucher } else 230df0af4403aa8df728a62ccb62a61b3244871068fChristian König ib[idx] = idx_value + ((u32)reloc->gpu_offset); 231551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].robj = reloc->robj; 23240b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 233551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 234551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F1_0: 235551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F2_0: 236551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F3_0: 237551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F4_0: 238551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F5_0: 239551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F1_1: 240551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F2_1: 241551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F3_1: 242551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F4_1: 243551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F5_1: 244551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F1_2: 245551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F2_2: 246551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F3_2: 247551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F4_2: 248551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F5_2: 249551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F1_3: 250551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F2_3: 251551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F3_3: 252551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F4_3: 253551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F5_3: 254551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F1_4: 255551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F2_4: 256551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F3_4: 257551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F4_4: 258551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F5_4: 259551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F1_5: 260551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F2_5: 261551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F3_5: 262551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F4_5: 263551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_OFFSET_F5_5: 264551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXOFFSET_0) / 24; 265551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie face = (reg - ((i * 24) + R200_PP_TXOFFSET_0)) / 4; 266012e976d42d2819c79bdd4ef2843515bdd44e408Ilija Hadzic r = radeon_cs_packet_next_reloc(p, &reloc, 0); 267551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) { 268551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 269551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie idx, reg); 270c3ad63afcdb931159690aa7ba2906079c3b38a13Ilija Hadzic radeon_cs_dump_packet(p, pkt); 271551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 272551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 273513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].cube_info[face - 1].offset = idx_value; 274df0af4403aa8df728a62ccb62a61b3244871068fChristian König ib[idx] = idx_value + ((u32)reloc->gpu_offset); 275551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].cube_info[face - 1].robj = reloc->robj; 27640b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 277551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 278551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RE_WIDTH_HEIGHT: 279513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->maxy = ((idx_value >> 16) & 0x7FF); 28040b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->cb_dirty = true; 28140b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->zb_dirty = true; 282551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 283551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RB3D_COLORPITCH: 284012e976d42d2819c79bdd4ef2843515bdd44e408Ilija Hadzic r = radeon_cs_packet_next_reloc(p, &reloc, 0); 285551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) { 286551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 287551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie idx, reg); 288c3ad63afcdb931159690aa7ba2906079c3b38a13Ilija Hadzic radeon_cs_dump_packet(p, pkt); 289551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 290551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 291551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 292c9068eb296fc682513f8612168f605c169b773e4Alex Deucher if (!(p->cs_flags & RADEON_CS_KEEP_TILING_FLAGS)) { 293df0af4403aa8df728a62ccb62a61b3244871068fChristian König if (reloc->tiling_flags & RADEON_TILING_MACRO) 294c9068eb296fc682513f8612168f605c169b773e4Alex Deucher tile_flags |= RADEON_COLOR_TILE_ENABLE; 295df0af4403aa8df728a62ccb62a61b3244871068fChristian König if (reloc->tiling_flags & RADEON_TILING_MICRO) 296c9068eb296fc682513f8612168f605c169b773e4Alex Deucher tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; 297551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 298c9068eb296fc682513f8612168f605c169b773e4Alex Deucher tmp = idx_value & ~(0x7 << 16); 299c9068eb296fc682513f8612168f605c169b773e4Alex Deucher tmp |= tile_flags; 300c9068eb296fc682513f8612168f605c169b773e4Alex Deucher ib[idx] = tmp; 301c9068eb296fc682513f8612168f605c169b773e4Alex Deucher } else 302c9068eb296fc682513f8612168f605c169b773e4Alex Deucher ib[idx] = idx_value; 303551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 304513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; 30540b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->cb_dirty = true; 306551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 307551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RB3D_DEPTHPITCH: 308513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK; 30940b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->zb_dirty = true; 310551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 311551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RB3D_CNTL: 312513bcb4655e68706594e45dfa1d4b181500110baDave Airlie switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { 313551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 7: 314551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 8: 315551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 9: 316551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 11: 317551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 12: 318551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->cb[0].cpp = 1; 319551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 320551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 3: 321551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 4: 322551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 15: 323551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->cb[0].cpp = 2; 324551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 325551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 6: 326551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->cb[0].cpp = 4; 327551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 328551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie default: 329551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("Invalid color buffer format (%d) !\n", 330513bcb4655e68706594e45dfa1d4b181500110baDave Airlie ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f)); 331551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return -EINVAL; 332551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 333513bcb4655e68706594e45dfa1d4b181500110baDave Airlie if (idx_value & RADEON_DEPTHXY_OFFSET_ENABLE) { 334551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No support for depth xy offset in kms\n"); 335551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return -EINVAL; 336551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 337551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 338513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->z_enabled = !!(idx_value & RADEON_Z_ENABLE); 33940b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->cb_dirty = true; 34040b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->zb_dirty = true; 341551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 342551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RB3D_ZSTENCILCNTL: 343513bcb4655e68706594e45dfa1d4b181500110baDave Airlie switch (idx_value & 0xf) { 344551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 0: 345551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->zb.cpp = 2; 346551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 347551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 2: 348551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 3: 349551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 4: 350551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 5: 351551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 9: 352551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 11: 353551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->zb.cpp = 4; 354551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 355551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie default: 356551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 357551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 35840b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->zb_dirty = true; 359551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 360551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_RB3D_ZPASS_ADDR: 361012e976d42d2819c79bdd4ef2843515bdd44e408Ilija Hadzic r = radeon_cs_packet_next_reloc(p, &reloc, 0); 362551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (r) { 363551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie DRM_ERROR("No reloc for ib[%d]=0x%04X\n", 364551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie idx, reg); 365c3ad63afcdb931159690aa7ba2906079c3b38a13Ilija Hadzic radeon_cs_dump_packet(p, pkt); 366551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return r; 367551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 368df0af4403aa8df728a62ccb62a61b3244871068fChristian König ib[idx] = idx_value + ((u32)reloc->gpu_offset); 369551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 370551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_PP_CNTL: 371551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie { 372513bcb4655e68706594e45dfa1d4b181500110baDave Airlie uint32_t temp = idx_value >> 4; 373551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie for (i = 0; i < track->num_texture; i++) 374551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].enabled = !!(temp & (1 << i)); 37540b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 376551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 377551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 378551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case RADEON_SE_VF_CNTL: 379513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->vap_vf_cntl = idx_value; 380551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 381551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 0x210c: 382551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie /* VAP_VF_MAX_VTX_INDX */ 383513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->max_indx = idx_value & 0x00FFFFFFUL; 384551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 385551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_SE_VTX_FMT_0: 386513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->vtx_size = r200_get_vtx_size_0(idx_value); 387551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 388551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_SE_VTX_FMT_1: 389513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->vtx_size += r200_get_vtx_size_1(idx_value); 390551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 391551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXSIZE_0: 392551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXSIZE_1: 393551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXSIZE_2: 394551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXSIZE_3: 395551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXSIZE_4: 396551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXSIZE_5: 397551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXSIZE_0) / 32; 398513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1; 399513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; 40040b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 401551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 402551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXPITCH_0: 403551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXPITCH_1: 404551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXPITCH_2: 405551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXPITCH_3: 406551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXPITCH_4: 407551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXPITCH_5: 408551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXPITCH_0) / 32; 409513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].pitch = idx_value + 32; 41040b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 411551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 412551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFILTER_0: 413551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFILTER_1: 414551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFILTER_2: 415551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFILTER_3: 416551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFILTER_4: 417551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFILTER_5: 418551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXFILTER_0) / 32; 419513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].num_levels = ((idx_value & R200_MAX_MIP_LEVEL_MASK) 420551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie >> R200_MAX_MIP_LEVEL_SHIFT); 421513bcb4655e68706594e45dfa1d4b181500110baDave Airlie tmp = (idx_value >> 23) & 0x7; 422551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (tmp == 2 || tmp == 6) 423551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].roundup_w = false; 424513bcb4655e68706594e45dfa1d4b181500110baDave Airlie tmp = (idx_value >> 27) & 0x7; 425551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie if (tmp == 2 || tmp == 6) 426551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].roundup_h = false; 42740b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 428551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 429551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXMULTI_CTL_0: 430551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXMULTI_CTL_1: 431551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXMULTI_CTL_2: 432551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXMULTI_CTL_3: 433551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXMULTI_CTL_4: 434551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXMULTI_CTL_5: 435551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXMULTI_CTL_0) / 32; 436551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 437551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_X_0: 438551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_X_1: 439551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_X_2: 440551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_X_3: 441551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_X_4: 442551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_X_5: 443551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXFORMAT_X_0) / 32; 444513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].txdepth = idx_value & 0x7; 445513bcb4655e68706594e45dfa1d4b181500110baDave Airlie tmp = (idx_value >> 16) & 0x3; 446551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie /* 2D, 3D, CUBE */ 447551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie switch (tmp) { 448551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 0: 449688acaa2897462e4c5e2482496e2868db0760809Roland Scheidegger case 3: 450688acaa2897462e4c5e2482496e2868db0760809Roland Scheidegger case 4: 451551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 5: 452551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 6: 453551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 7: 454f3d1ccc14f37a07614c67a270f05a8d94ec3667cAndrew Randrianasulu /* 1D/2D */ 455551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].tex_coord_type = 0; 456551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 457551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 1: 458f3d1ccc14f37a07614c67a270f05a8d94ec3667cAndrew Randrianasulu /* CUBE */ 459f3d1ccc14f37a07614c67a270f05a8d94ec3667cAndrew Randrianasulu track->textures[i].tex_coord_type = 2; 460551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 461551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case 2: 462f3d1ccc14f37a07614c67a270f05a8d94ec3667cAndrew Randrianasulu /* 3D */ 463f3d1ccc14f37a07614c67a270f05a8d94ec3667cAndrew Randrianasulu track->textures[i].tex_coord_type = 1; 464551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 465551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 46640b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 467551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 468551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_0: 469551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_1: 470551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_2: 471551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_3: 472551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_4: 473551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_TXFORMAT_5: 474551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_TXFORMAT_0) / 32; 475513bcb4655e68706594e45dfa1d4b181500110baDave Airlie if (idx_value & R200_TXFORMAT_NON_POWER2) { 476551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].use_pitch = 1; 477551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } else { 478551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].use_pitch = 0; 479513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); 480513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); 481551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 48243b93fbffc2c080dba2e84df6fce8d7e6c0a2581Alex Deucher if (idx_value & R200_TXFORMAT_LOOKUP_DISABLE) 48343b93fbffc2c080dba2e84df6fce8d7e6c0a2581Alex Deucher track->textures[i].lookup_disable = true; 484513bcb4655e68706594e45dfa1d4b181500110baDave Airlie switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) { 485551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_I8: 486551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_RGB332: 487551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_Y8: 488551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].cpp = 1; 489f9da52d54eb0e8822b5e7f32ab1cfa6522533d6eRoland Scheidegger track->textures[i].compress_format = R100_TRACK_COMP_NONE; 490551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 491551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_AI88: 492551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_ARGB1555: 493551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_RGB565: 494551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_ARGB4444: 495551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_VYUY422: 496551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_YVYU422: 497551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_LDVDU655: 498551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_DVDU88: 499551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_AVYU4444: 500551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].cpp = 2; 501f9da52d54eb0e8822b5e7f32ab1cfa6522533d6eRoland Scheidegger track->textures[i].compress_format = R100_TRACK_COMP_NONE; 502551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 503551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_ARGB8888: 504551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_RGBA8888: 505551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_ABGR8888: 506551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_BGR111110: 507551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_LDVDU8888: 508d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie track->textures[i].cpp = 4; 509f9da52d54eb0e8822b5e7f32ab1cfa6522533d6eRoland Scheidegger track->textures[i].compress_format = R100_TRACK_COMP_NONE; 510d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie break; 511d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie case R200_TXFORMAT_DXT1: 512d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie track->textures[i].cpp = 1; 513d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie track->textures[i].compress_format = R100_TRACK_COMP_DXT1; 514d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie break; 515551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_DXT23: 516551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_TXFORMAT_DXT45: 517d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie track->textures[i].cpp = 1; 518d785d78bbdb53580b12c40e820af5a3281ce2fc8Dave Airlie track->textures[i].compress_format = R100_TRACK_COMP_DXT1; 519551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 520551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 521513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); 522513bcb4655e68706594e45dfa1d4b181500110baDave Airlie track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); 52340b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 524551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 525551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_FACES_0: 526551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_FACES_1: 527551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_FACES_2: 528551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_FACES_3: 529551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_FACES_4: 530551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie case R200_PP_CUBIC_FACES_5: 531513bcb4655e68706594e45dfa1d4b181500110baDave Airlie tmp = idx_value; 532551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie i = (reg - R200_PP_CUBIC_FACES_0) / 32; 533551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie for (face = 0; face < 4; face++) { 534551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf); 535551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie track->textures[i].cube_info[face].height = 1 << ((tmp >> ((face * 8) + 4)) & 0xf); 536551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 53740b4a7599d5555b408e594f4c8dae8015ccaae8fMarek Olšák track->tex_dirty = true; 538551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie break; 539551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie default: 540551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", 541551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie reg, idx); 542551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return -EINVAL; 543551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie } 544551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie return 0; 545551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie} 546551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie 547d4550907157d8b3d5286157c15f1200c44842269Jerome Glissevoid r200_set_safe_registers(struct radeon_device *rdev) 548551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie{ 549551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie rdev->config.r100.reg_safe_bm = r200_reg_safe_bm; 550551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r200_reg_safe_bm); 551551ebd837c75fc75df81811a18b7136c39cab487Dave Airlie} 552