1 1.1 riastrad /* $NetBSD: radeon_rs400.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2008 Advanced Micro Devices, Inc. 5 1.1 riastrad * Copyright 2008 Red Hat Inc. 6 1.1 riastrad * Copyright 2009 Jerome Glisse. 7 1.1 riastrad * 8 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 9 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 10 1.1 riastrad * to deal in the Software without restriction, including without limitation 11 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 13 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 14 1.1 riastrad * 15 1.1 riastrad * The above copyright notice and this permission notice shall be included in 16 1.1 riastrad * all copies or substantial portions of the Software. 17 1.1 riastrad * 18 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21 1.1 riastrad * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 22 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 1.1 riastrad * OTHER DEALINGS IN THE SOFTWARE. 25 1.1 riastrad * 26 1.1 riastrad * Authors: Dave Airlie 27 1.1 riastrad * Alex Deucher 28 1.1 riastrad * Jerome Glisse 29 1.1 riastrad */ 30 1.2 riastrad 31 1.1 riastrad #include <sys/cdefs.h> 32 1.1 riastrad __KERNEL_RCSID(0, "$NetBSD: radeon_rs400.c,v 1.2 2021/12/18 23:45:43 riastradh Exp $"); 33 1.1 riastrad 34 1.1 riastrad #include <linux/seq_file.h> 35 1.1 riastrad #include <linux/slab.h> 36 1.2 riastrad 37 1.2 riastrad #include <drm/drm_debugfs.h> 38 1.2 riastrad #include <drm/drm_device.h> 39 1.2 riastrad #include <drm/drm_file.h> 40 1.2 riastrad 41 1.1 riastrad #include "radeon.h" 42 1.1 riastrad #include "radeon_asic.h" 43 1.1 riastrad #include "rs400d.h" 44 1.1 riastrad 45 1.1 riastrad /* This files gather functions specifics to : rs400,rs480 */ 46 1.1 riastrad static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev); 47 1.1 riastrad 48 1.1 riastrad void rs400_gart_adjust_size(struct radeon_device *rdev) 49 1.1 riastrad { 50 1.1 riastrad /* Check gart size */ 51 1.1 riastrad switch (rdev->mc.gtt_size/(1024*1024)) { 52 1.1 riastrad case 32: 53 1.1 riastrad case 64: 54 1.1 riastrad case 128: 55 1.1 riastrad case 256: 56 1.1 riastrad case 512: 57 1.1 riastrad case 1024: 58 1.1 riastrad case 2048: 59 1.1 riastrad break; 60 1.1 riastrad default: 61 1.1 riastrad DRM_ERROR("Unable to use IGP GART size %uM\n", 62 1.1 riastrad (unsigned)(rdev->mc.gtt_size >> 20)); 63 1.1 riastrad DRM_ERROR("Valid GART size for IGP are 32M,64M,128M,256M,512M,1G,2G\n"); 64 1.1 riastrad DRM_ERROR("Forcing to 32M GART size\n"); 65 1.1 riastrad rdev->mc.gtt_size = 32 * 1024 * 1024; 66 1.1 riastrad return; 67 1.1 riastrad } 68 1.1 riastrad } 69 1.1 riastrad 70 1.1 riastrad void rs400_gart_tlb_flush(struct radeon_device *rdev) 71 1.1 riastrad { 72 1.1 riastrad uint32_t tmp; 73 1.1 riastrad unsigned int timeout = rdev->usec_timeout; 74 1.1 riastrad 75 1.1 riastrad WREG32_MC(RS480_GART_CACHE_CNTRL, RS480_GART_CACHE_INVALIDATE); 76 1.1 riastrad do { 77 1.1 riastrad tmp = RREG32_MC(RS480_GART_CACHE_CNTRL); 78 1.1 riastrad if ((tmp & RS480_GART_CACHE_INVALIDATE) == 0) 79 1.1 riastrad break; 80 1.2 riastrad udelay(1); 81 1.1 riastrad timeout--; 82 1.1 riastrad } while (timeout > 0); 83 1.1 riastrad WREG32_MC(RS480_GART_CACHE_CNTRL, 0); 84 1.1 riastrad } 85 1.1 riastrad 86 1.1 riastrad int rs400_gart_init(struct radeon_device *rdev) 87 1.1 riastrad { 88 1.1 riastrad int r; 89 1.1 riastrad 90 1.1 riastrad if (rdev->gart.ptr) { 91 1.1 riastrad WARN(1, "RS400 GART already initialized\n"); 92 1.1 riastrad return 0; 93 1.1 riastrad } 94 1.1 riastrad /* Check gart size */ 95 1.1 riastrad switch(rdev->mc.gtt_size / (1024 * 1024)) { 96 1.1 riastrad case 32: 97 1.1 riastrad case 64: 98 1.1 riastrad case 128: 99 1.1 riastrad case 256: 100 1.1 riastrad case 512: 101 1.1 riastrad case 1024: 102 1.1 riastrad case 2048: 103 1.1 riastrad break; 104 1.1 riastrad default: 105 1.1 riastrad return -EINVAL; 106 1.1 riastrad } 107 1.1 riastrad /* Initialize common gart structure */ 108 1.1 riastrad r = radeon_gart_init(rdev); 109 1.1 riastrad if (r) 110 1.1 riastrad return r; 111 1.1 riastrad if (rs400_debugfs_pcie_gart_info_init(rdev)) 112 1.1 riastrad DRM_ERROR("Failed to register debugfs file for RS400 GART !\n"); 113 1.1 riastrad rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; 114 1.1 riastrad return radeon_gart_table_ram_alloc(rdev); 115 1.1 riastrad } 116 1.1 riastrad 117 1.1 riastrad int rs400_gart_enable(struct radeon_device *rdev) 118 1.1 riastrad { 119 1.1 riastrad uint32_t size_reg; 120 1.1 riastrad uint32_t tmp; 121 1.1 riastrad 122 1.1 riastrad tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); 123 1.1 riastrad tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS; 124 1.1 riastrad WREG32_MC(RS690_AIC_CTRL_SCRATCH, tmp); 125 1.1 riastrad /* Check gart size */ 126 1.1 riastrad switch(rdev->mc.gtt_size / (1024 * 1024)) { 127 1.1 riastrad case 32: 128 1.1 riastrad size_reg = RS480_VA_SIZE_32MB; 129 1.1 riastrad break; 130 1.1 riastrad case 64: 131 1.1 riastrad size_reg = RS480_VA_SIZE_64MB; 132 1.1 riastrad break; 133 1.1 riastrad case 128: 134 1.1 riastrad size_reg = RS480_VA_SIZE_128MB; 135 1.1 riastrad break; 136 1.1 riastrad case 256: 137 1.1 riastrad size_reg = RS480_VA_SIZE_256MB; 138 1.1 riastrad break; 139 1.1 riastrad case 512: 140 1.1 riastrad size_reg = RS480_VA_SIZE_512MB; 141 1.1 riastrad break; 142 1.1 riastrad case 1024: 143 1.1 riastrad size_reg = RS480_VA_SIZE_1GB; 144 1.1 riastrad break; 145 1.1 riastrad case 2048: 146 1.1 riastrad size_reg = RS480_VA_SIZE_2GB; 147 1.1 riastrad break; 148 1.1 riastrad default: 149 1.1 riastrad return -EINVAL; 150 1.1 riastrad } 151 1.1 riastrad /* It should be fine to program it to max value */ 152 1.1 riastrad if (rdev->family == CHIP_RS690 || (rdev->family == CHIP_RS740)) { 153 1.1 riastrad WREG32_MC(RS690_MCCFG_AGP_BASE, 0xFFFFFFFF); 154 1.1 riastrad WREG32_MC(RS690_MCCFG_AGP_BASE_2, 0); 155 1.1 riastrad } else { 156 1.1 riastrad WREG32(RADEON_AGP_BASE, 0xFFFFFFFF); 157 1.1 riastrad WREG32(RS480_AGP_BASE_2, 0); 158 1.1 riastrad } 159 1.1 riastrad tmp = REG_SET(RS690_MC_AGP_TOP, rdev->mc.gtt_end >> 16); 160 1.1 riastrad tmp |= REG_SET(RS690_MC_AGP_START, rdev->mc.gtt_start >> 16); 161 1.1 riastrad if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) { 162 1.1 riastrad WREG32_MC(RS690_MCCFG_AGP_LOCATION, tmp); 163 1.1 riastrad tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; 164 1.1 riastrad WREG32(RADEON_BUS_CNTL, tmp); 165 1.1 riastrad } else { 166 1.1 riastrad WREG32(RADEON_MC_AGP_LOCATION, tmp); 167 1.1 riastrad tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; 168 1.1 riastrad WREG32(RADEON_BUS_CNTL, tmp); 169 1.1 riastrad } 170 1.1 riastrad /* Table should be in 32bits address space so ignore bits above. */ 171 1.1 riastrad tmp = (u32)rdev->gart.table_addr & 0xfffff000; 172 1.1 riastrad tmp |= (upper_32_bits(rdev->gart.table_addr) & 0xff) << 4; 173 1.1 riastrad 174 1.1 riastrad WREG32_MC(RS480_GART_BASE, tmp); 175 1.1 riastrad /* TODO: more tweaking here */ 176 1.1 riastrad WREG32_MC(RS480_GART_FEATURE_ID, 177 1.1 riastrad (RS480_TLB_ENABLE | 178 1.1 riastrad RS480_GTW_LAC_EN | RS480_1LEVEL_GART)); 179 1.1 riastrad /* Disable snooping */ 180 1.1 riastrad WREG32_MC(RS480_AGP_MODE_CNTL, 181 1.1 riastrad (1 << RS480_REQ_TYPE_SNOOP_SHIFT) | RS480_REQ_TYPE_SNOOP_DIS); 182 1.1 riastrad /* Disable AGP mode */ 183 1.1 riastrad /* FIXME: according to doc we should set HIDE_MMCFG_BAR=0, 184 1.1 riastrad * AGPMODE30=0 & AGP30ENHANCED=0 in NB_CNTL */ 185 1.1 riastrad if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) { 186 1.1 riastrad tmp = RREG32_MC(RS480_MC_MISC_CNTL); 187 1.1 riastrad tmp |= RS480_GART_INDEX_REG_EN | RS690_BLOCK_GFX_D3_EN; 188 1.1 riastrad WREG32_MC(RS480_MC_MISC_CNTL, tmp); 189 1.1 riastrad } else { 190 1.1 riastrad tmp = RREG32_MC(RS480_MC_MISC_CNTL); 191 1.1 riastrad tmp |= RS480_GART_INDEX_REG_EN; 192 1.1 riastrad WREG32_MC(RS480_MC_MISC_CNTL, tmp); 193 1.1 riastrad } 194 1.1 riastrad /* Enable gart */ 195 1.1 riastrad WREG32_MC(RS480_AGP_ADDRESS_SPACE_SIZE, (RS480_GART_EN | size_reg)); 196 1.1 riastrad rs400_gart_tlb_flush(rdev); 197 1.1 riastrad DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 198 1.1 riastrad (unsigned)(rdev->mc.gtt_size >> 20), 199 1.1 riastrad (unsigned long long)rdev->gart.table_addr); 200 1.1 riastrad rdev->gart.ready = true; 201 1.1 riastrad return 0; 202 1.1 riastrad } 203 1.1 riastrad 204 1.1 riastrad void rs400_gart_disable(struct radeon_device *rdev) 205 1.1 riastrad { 206 1.1 riastrad uint32_t tmp; 207 1.1 riastrad 208 1.1 riastrad tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); 209 1.1 riastrad tmp |= RS690_DIS_OUT_OF_PCI_GART_ACCESS; 210 1.1 riastrad WREG32_MC(RS690_AIC_CTRL_SCRATCH, tmp); 211 1.1 riastrad WREG32_MC(RS480_AGP_ADDRESS_SPACE_SIZE, 0); 212 1.1 riastrad } 213 1.1 riastrad 214 1.1 riastrad void rs400_gart_fini(struct radeon_device *rdev) 215 1.1 riastrad { 216 1.1 riastrad radeon_gart_fini(rdev); 217 1.1 riastrad rs400_gart_disable(rdev); 218 1.1 riastrad radeon_gart_table_ram_free(rdev); 219 1.1 riastrad } 220 1.1 riastrad 221 1.1 riastrad #define RS400_PTE_UNSNOOPED (1 << 0) 222 1.1 riastrad #define RS400_PTE_WRITEABLE (1 << 2) 223 1.1 riastrad #define RS400_PTE_READABLE (1 << 3) 224 1.1 riastrad 225 1.1 riastrad uint64_t rs400_gart_get_page_entry(uint64_t addr, uint32_t flags) 226 1.1 riastrad { 227 1.1 riastrad uint32_t entry; 228 1.1 riastrad 229 1.1 riastrad entry = (lower_32_bits(addr) & PAGE_MASK) | 230 1.1 riastrad ((upper_32_bits(addr) & 0xff) << 4); 231 1.1 riastrad if (flags & RADEON_GART_PAGE_READ) 232 1.1 riastrad entry |= RS400_PTE_READABLE; 233 1.1 riastrad if (flags & RADEON_GART_PAGE_WRITE) 234 1.1 riastrad entry |= RS400_PTE_WRITEABLE; 235 1.1 riastrad if (!(flags & RADEON_GART_PAGE_SNOOP)) 236 1.1 riastrad entry |= RS400_PTE_UNSNOOPED; 237 1.1 riastrad return entry; 238 1.1 riastrad } 239 1.1 riastrad 240 1.1 riastrad void rs400_gart_set_page(struct radeon_device *rdev, unsigned i, 241 1.1 riastrad uint64_t entry) 242 1.1 riastrad { 243 1.1 riastrad u32 *gtt = rdev->gart.ptr; 244 1.1 riastrad gtt[i] = cpu_to_le32(lower_32_bits(entry)); 245 1.1 riastrad } 246 1.1 riastrad 247 1.1 riastrad int rs400_mc_wait_for_idle(struct radeon_device *rdev) 248 1.1 riastrad { 249 1.1 riastrad unsigned i; 250 1.1 riastrad uint32_t tmp; 251 1.1 riastrad 252 1.1 riastrad for (i = 0; i < rdev->usec_timeout; i++) { 253 1.1 riastrad /* read MC_STATUS */ 254 1.1 riastrad tmp = RREG32(RADEON_MC_STATUS); 255 1.1 riastrad if (tmp & RADEON_MC_IDLE) { 256 1.1 riastrad return 0; 257 1.1 riastrad } 258 1.2 riastrad udelay(1); 259 1.1 riastrad } 260 1.1 riastrad return -1; 261 1.1 riastrad } 262 1.1 riastrad 263 1.1 riastrad static void rs400_gpu_init(struct radeon_device *rdev) 264 1.1 riastrad { 265 1.1 riastrad /* FIXME: is this correct ? */ 266 1.1 riastrad r420_pipes_init(rdev); 267 1.1 riastrad if (rs400_mc_wait_for_idle(rdev)) { 268 1.2 riastrad pr_warn("rs400: Failed to wait MC idle while programming pipes. Bad things might happen. %08x\n", 269 1.2 riastrad RREG32(RADEON_MC_STATUS)); 270 1.1 riastrad } 271 1.1 riastrad } 272 1.1 riastrad 273 1.1 riastrad static void rs400_mc_init(struct radeon_device *rdev) 274 1.1 riastrad { 275 1.1 riastrad u64 base; 276 1.1 riastrad 277 1.1 riastrad rs400_gart_adjust_size(rdev); 278 1.1 riastrad rdev->mc.igp_sideport_enabled = radeon_combios_sideport_present(rdev); 279 1.1 riastrad /* DDR for all card after R300 & IGP */ 280 1.1 riastrad rdev->mc.vram_is_ddr = true; 281 1.1 riastrad rdev->mc.vram_width = 128; 282 1.1 riastrad r100_vram_init_sizes(rdev); 283 1.1 riastrad base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16; 284 1.1 riastrad radeon_vram_location(rdev, &rdev->mc, base); 285 1.1 riastrad rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1; 286 1.1 riastrad radeon_gtt_location(rdev, &rdev->mc); 287 1.1 riastrad radeon_update_bandwidth_info(rdev); 288 1.1 riastrad } 289 1.1 riastrad 290 1.1 riastrad uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) 291 1.1 riastrad { 292 1.1 riastrad unsigned long flags; 293 1.1 riastrad uint32_t r; 294 1.1 riastrad 295 1.1 riastrad spin_lock_irqsave(&rdev->mc_idx_lock, flags); 296 1.1 riastrad WREG32(RS480_NB_MC_INDEX, reg & 0xff); 297 1.1 riastrad r = RREG32(RS480_NB_MC_DATA); 298 1.1 riastrad WREG32(RS480_NB_MC_INDEX, 0xff); 299 1.1 riastrad spin_unlock_irqrestore(&rdev->mc_idx_lock, flags); 300 1.1 riastrad return r; 301 1.1 riastrad } 302 1.1 riastrad 303 1.1 riastrad void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) 304 1.1 riastrad { 305 1.1 riastrad unsigned long flags; 306 1.1 riastrad 307 1.1 riastrad spin_lock_irqsave(&rdev->mc_idx_lock, flags); 308 1.1 riastrad WREG32(RS480_NB_MC_INDEX, ((reg) & 0xff) | RS480_NB_MC_IND_WR_EN); 309 1.1 riastrad WREG32(RS480_NB_MC_DATA, (v)); 310 1.1 riastrad WREG32(RS480_NB_MC_INDEX, 0xff); 311 1.1 riastrad spin_unlock_irqrestore(&rdev->mc_idx_lock, flags); 312 1.1 riastrad } 313 1.1 riastrad 314 1.1 riastrad #if defined(CONFIG_DEBUG_FS) 315 1.1 riastrad static int rs400_debugfs_gart_info(struct seq_file *m, void *data) 316 1.1 riastrad { 317 1.1 riastrad struct drm_info_node *node = (struct drm_info_node *) m->private; 318 1.1 riastrad struct drm_device *dev = node->minor->dev; 319 1.1 riastrad struct radeon_device *rdev = dev->dev_private; 320 1.1 riastrad uint32_t tmp; 321 1.1 riastrad 322 1.1 riastrad tmp = RREG32(RADEON_HOST_PATH_CNTL); 323 1.1 riastrad seq_printf(m, "HOST_PATH_CNTL 0x%08x\n", tmp); 324 1.1 riastrad tmp = RREG32(RADEON_BUS_CNTL); 325 1.1 riastrad seq_printf(m, "BUS_CNTL 0x%08x\n", tmp); 326 1.1 riastrad tmp = RREG32_MC(RS690_AIC_CTRL_SCRATCH); 327 1.1 riastrad seq_printf(m, "AIC_CTRL_SCRATCH 0x%08x\n", tmp); 328 1.1 riastrad if (rdev->family == CHIP_RS690 || (rdev->family == CHIP_RS740)) { 329 1.1 riastrad tmp = RREG32_MC(RS690_MCCFG_AGP_BASE); 330 1.1 riastrad seq_printf(m, "MCCFG_AGP_BASE 0x%08x\n", tmp); 331 1.1 riastrad tmp = RREG32_MC(RS690_MCCFG_AGP_BASE_2); 332 1.1 riastrad seq_printf(m, "MCCFG_AGP_BASE_2 0x%08x\n", tmp); 333 1.1 riastrad tmp = RREG32_MC(RS690_MCCFG_AGP_LOCATION); 334 1.1 riastrad seq_printf(m, "MCCFG_AGP_LOCATION 0x%08x\n", tmp); 335 1.1 riastrad tmp = RREG32_MC(RS690_MCCFG_FB_LOCATION); 336 1.1 riastrad seq_printf(m, "MCCFG_FB_LOCATION 0x%08x\n", tmp); 337 1.1 riastrad tmp = RREG32(RS690_HDP_FB_LOCATION); 338 1.1 riastrad seq_printf(m, "HDP_FB_LOCATION 0x%08x\n", tmp); 339 1.1 riastrad } else { 340 1.1 riastrad tmp = RREG32(RADEON_AGP_BASE); 341 1.1 riastrad seq_printf(m, "AGP_BASE 0x%08x\n", tmp); 342 1.1 riastrad tmp = RREG32(RS480_AGP_BASE_2); 343 1.1 riastrad seq_printf(m, "AGP_BASE_2 0x%08x\n", tmp); 344 1.1 riastrad tmp = RREG32(RADEON_MC_AGP_LOCATION); 345 1.1 riastrad seq_printf(m, "MC_AGP_LOCATION 0x%08x\n", tmp); 346 1.1 riastrad } 347 1.1 riastrad tmp = RREG32_MC(RS480_GART_BASE); 348 1.1 riastrad seq_printf(m, "GART_BASE 0x%08x\n", tmp); 349 1.1 riastrad tmp = RREG32_MC(RS480_GART_FEATURE_ID); 350 1.1 riastrad seq_printf(m, "GART_FEATURE_ID 0x%08x\n", tmp); 351 1.1 riastrad tmp = RREG32_MC(RS480_AGP_MODE_CNTL); 352 1.1 riastrad seq_printf(m, "AGP_MODE_CONTROL 0x%08x\n", tmp); 353 1.1 riastrad tmp = RREG32_MC(RS480_MC_MISC_CNTL); 354 1.1 riastrad seq_printf(m, "MC_MISC_CNTL 0x%08x\n", tmp); 355 1.1 riastrad tmp = RREG32_MC(0x5F); 356 1.1 riastrad seq_printf(m, "MC_MISC_UMA_CNTL 0x%08x\n", tmp); 357 1.1 riastrad tmp = RREG32_MC(RS480_AGP_ADDRESS_SPACE_SIZE); 358 1.1 riastrad seq_printf(m, "AGP_ADDRESS_SPACE_SIZE 0x%08x\n", tmp); 359 1.1 riastrad tmp = RREG32_MC(RS480_GART_CACHE_CNTRL); 360 1.1 riastrad seq_printf(m, "GART_CACHE_CNTRL 0x%08x\n", tmp); 361 1.1 riastrad tmp = RREG32_MC(0x3B); 362 1.1 riastrad seq_printf(m, "MC_GART_ERROR_ADDRESS 0x%08x\n", tmp); 363 1.1 riastrad tmp = RREG32_MC(0x3C); 364 1.1 riastrad seq_printf(m, "MC_GART_ERROR_ADDRESS_HI 0x%08x\n", tmp); 365 1.1 riastrad tmp = RREG32_MC(0x30); 366 1.1 riastrad seq_printf(m, "GART_ERROR_0 0x%08x\n", tmp); 367 1.1 riastrad tmp = RREG32_MC(0x31); 368 1.1 riastrad seq_printf(m, "GART_ERROR_1 0x%08x\n", tmp); 369 1.1 riastrad tmp = RREG32_MC(0x32); 370 1.1 riastrad seq_printf(m, "GART_ERROR_2 0x%08x\n", tmp); 371 1.1 riastrad tmp = RREG32_MC(0x33); 372 1.1 riastrad seq_printf(m, "GART_ERROR_3 0x%08x\n", tmp); 373 1.1 riastrad tmp = RREG32_MC(0x34); 374 1.1 riastrad seq_printf(m, "GART_ERROR_4 0x%08x\n", tmp); 375 1.1 riastrad tmp = RREG32_MC(0x35); 376 1.1 riastrad seq_printf(m, "GART_ERROR_5 0x%08x\n", tmp); 377 1.1 riastrad tmp = RREG32_MC(0x36); 378 1.1 riastrad seq_printf(m, "GART_ERROR_6 0x%08x\n", tmp); 379 1.1 riastrad tmp = RREG32_MC(0x37); 380 1.1 riastrad seq_printf(m, "GART_ERROR_7 0x%08x\n", tmp); 381 1.1 riastrad return 0; 382 1.1 riastrad } 383 1.1 riastrad 384 1.1 riastrad static struct drm_info_list rs400_gart_info_list[] = { 385 1.1 riastrad {"rs400_gart_info", rs400_debugfs_gart_info, 0, NULL}, 386 1.1 riastrad }; 387 1.1 riastrad #endif 388 1.1 riastrad 389 1.1 riastrad static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) 390 1.1 riastrad { 391 1.1 riastrad #if defined(CONFIG_DEBUG_FS) 392 1.1 riastrad return radeon_debugfs_add_files(rdev, rs400_gart_info_list, 1); 393 1.1 riastrad #else 394 1.1 riastrad return 0; 395 1.1 riastrad #endif 396 1.1 riastrad } 397 1.1 riastrad 398 1.1 riastrad static void rs400_mc_program(struct radeon_device *rdev) 399 1.1 riastrad { 400 1.1 riastrad struct r100_mc_save save; 401 1.1 riastrad 402 1.1 riastrad /* Stops all mc clients */ 403 1.1 riastrad r100_mc_stop(rdev, &save); 404 1.1 riastrad 405 1.1 riastrad /* Wait for mc idle */ 406 1.1 riastrad if (rs400_mc_wait_for_idle(rdev)) 407 1.1 riastrad dev_warn(rdev->dev, "rs400: Wait MC idle timeout before updating MC.\n"); 408 1.1 riastrad WREG32(R_000148_MC_FB_LOCATION, 409 1.1 riastrad S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | 410 1.1 riastrad S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); 411 1.1 riastrad 412 1.1 riastrad r100_mc_resume(rdev, &save); 413 1.1 riastrad } 414 1.1 riastrad 415 1.1 riastrad static int rs400_startup(struct radeon_device *rdev) 416 1.1 riastrad { 417 1.1 riastrad int r; 418 1.1 riastrad 419 1.1 riastrad r100_set_common_regs(rdev); 420 1.1 riastrad 421 1.1 riastrad rs400_mc_program(rdev); 422 1.1 riastrad /* Resume clock */ 423 1.1 riastrad r300_clock_startup(rdev); 424 1.1 riastrad /* Initialize GPU configuration (# pipes, ...) */ 425 1.1 riastrad rs400_gpu_init(rdev); 426 1.1 riastrad r100_enable_bm(rdev); 427 1.1 riastrad /* Initialize GART (initialize after TTM so we can allocate 428 1.1 riastrad * memory through TTM but finalize after TTM) */ 429 1.1 riastrad r = rs400_gart_enable(rdev); 430 1.1 riastrad if (r) 431 1.1 riastrad return r; 432 1.1 riastrad 433 1.1 riastrad /* allocate wb buffer */ 434 1.1 riastrad r = radeon_wb_init(rdev); 435 1.1 riastrad if (r) 436 1.1 riastrad return r; 437 1.1 riastrad 438 1.1 riastrad r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); 439 1.1 riastrad if (r) { 440 1.1 riastrad dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); 441 1.1 riastrad return r; 442 1.1 riastrad } 443 1.1 riastrad 444 1.1 riastrad /* Enable IRQ */ 445 1.1 riastrad if (!rdev->irq.installed) { 446 1.1 riastrad r = radeon_irq_kms_init(rdev); 447 1.1 riastrad if (r) 448 1.1 riastrad return r; 449 1.1 riastrad } 450 1.1 riastrad 451 1.1 riastrad r100_irq_set(rdev); 452 1.1 riastrad rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); 453 1.1 riastrad /* 1M ring buffer */ 454 1.1 riastrad r = r100_cp_init(rdev, 1024 * 1024); 455 1.1 riastrad if (r) { 456 1.1 riastrad dev_err(rdev->dev, "failed initializing CP (%d).\n", r); 457 1.1 riastrad return r; 458 1.1 riastrad } 459 1.1 riastrad 460 1.1 riastrad r = radeon_ib_pool_init(rdev); 461 1.1 riastrad if (r) { 462 1.1 riastrad dev_err(rdev->dev, "IB initialization failed (%d).\n", r); 463 1.1 riastrad return r; 464 1.1 riastrad } 465 1.1 riastrad 466 1.1 riastrad return 0; 467 1.1 riastrad } 468 1.1 riastrad 469 1.1 riastrad int rs400_resume(struct radeon_device *rdev) 470 1.1 riastrad { 471 1.1 riastrad int r; 472 1.1 riastrad 473 1.1 riastrad /* Make sur GART are not working */ 474 1.1 riastrad rs400_gart_disable(rdev); 475 1.1 riastrad /* Resume clock before doing reset */ 476 1.1 riastrad r300_clock_startup(rdev); 477 1.1 riastrad /* setup MC before calling post tables */ 478 1.1 riastrad rs400_mc_program(rdev); 479 1.1 riastrad /* Reset gpu before posting otherwise ATOM will enter infinite loop */ 480 1.1 riastrad if (radeon_asic_reset(rdev)) { 481 1.1 riastrad dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", 482 1.1 riastrad RREG32(R_000E40_RBBM_STATUS), 483 1.1 riastrad RREG32(R_0007C0_CP_STAT)); 484 1.1 riastrad } 485 1.1 riastrad /* post */ 486 1.1 riastrad radeon_combios_asic_init(rdev->ddev); 487 1.1 riastrad /* Resume clock after posting */ 488 1.1 riastrad r300_clock_startup(rdev); 489 1.1 riastrad /* Initialize surface registers */ 490 1.1 riastrad radeon_surface_init(rdev); 491 1.1 riastrad 492 1.1 riastrad rdev->accel_working = true; 493 1.1 riastrad r = rs400_startup(rdev); 494 1.1 riastrad if (r) { 495 1.1 riastrad rdev->accel_working = false; 496 1.1 riastrad } 497 1.1 riastrad return r; 498 1.1 riastrad } 499 1.1 riastrad 500 1.1 riastrad int rs400_suspend(struct radeon_device *rdev) 501 1.1 riastrad { 502 1.1 riastrad radeon_pm_suspend(rdev); 503 1.1 riastrad r100_cp_disable(rdev); 504 1.1 riastrad radeon_wb_disable(rdev); 505 1.1 riastrad r100_irq_disable(rdev); 506 1.1 riastrad rs400_gart_disable(rdev); 507 1.1 riastrad return 0; 508 1.1 riastrad } 509 1.1 riastrad 510 1.1 riastrad void rs400_fini(struct radeon_device *rdev) 511 1.1 riastrad { 512 1.1 riastrad radeon_pm_fini(rdev); 513 1.1 riastrad r100_cp_fini(rdev); 514 1.1 riastrad radeon_wb_fini(rdev); 515 1.1 riastrad radeon_ib_pool_fini(rdev); 516 1.1 riastrad radeon_gem_fini(rdev); 517 1.1 riastrad rs400_gart_fini(rdev); 518 1.1 riastrad radeon_irq_kms_fini(rdev); 519 1.1 riastrad radeon_fence_driver_fini(rdev); 520 1.1 riastrad radeon_bo_fini(rdev); 521 1.1 riastrad radeon_atombios_fini(rdev); 522 1.1 riastrad kfree(rdev->bios); 523 1.1 riastrad rdev->bios = NULL; 524 1.1 riastrad } 525 1.1 riastrad 526 1.1 riastrad int rs400_init(struct radeon_device *rdev) 527 1.1 riastrad { 528 1.1 riastrad int r; 529 1.1 riastrad 530 1.1 riastrad /* Disable VGA */ 531 1.1 riastrad r100_vga_render_disable(rdev); 532 1.1 riastrad /* Initialize scratch registers */ 533 1.1 riastrad radeon_scratch_init(rdev); 534 1.1 riastrad /* Initialize surface registers */ 535 1.1 riastrad radeon_surface_init(rdev); 536 1.1 riastrad /* TODO: disable VGA need to use VGA request */ 537 1.1 riastrad /* restore some register to sane defaults */ 538 1.1 riastrad r100_restore_sanity(rdev); 539 1.1 riastrad /* BIOS*/ 540 1.1 riastrad if (!radeon_get_bios(rdev)) { 541 1.1 riastrad if (ASIC_IS_AVIVO(rdev)) 542 1.1 riastrad return -EINVAL; 543 1.1 riastrad } 544 1.1 riastrad if (rdev->is_atom_bios) { 545 1.1 riastrad dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); 546 1.1 riastrad return -EINVAL; 547 1.1 riastrad } else { 548 1.1 riastrad r = radeon_combios_init(rdev); 549 1.1 riastrad if (r) 550 1.1 riastrad return r; 551 1.1 riastrad } 552 1.1 riastrad /* Reset gpu before posting otherwise ATOM will enter infinite loop */ 553 1.1 riastrad if (radeon_asic_reset(rdev)) { 554 1.1 riastrad dev_warn(rdev->dev, 555 1.1 riastrad "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", 556 1.1 riastrad RREG32(R_000E40_RBBM_STATUS), 557 1.1 riastrad RREG32(R_0007C0_CP_STAT)); 558 1.1 riastrad } 559 1.1 riastrad /* check if cards are posted or not */ 560 1.1 riastrad if (radeon_boot_test_post_card(rdev) == false) 561 1.1 riastrad return -EINVAL; 562 1.1 riastrad 563 1.1 riastrad /* Initialize clocks */ 564 1.1 riastrad radeon_get_clock_info(rdev->ddev); 565 1.1 riastrad /* initialize memory controller */ 566 1.1 riastrad rs400_mc_init(rdev); 567 1.1 riastrad /* Fence driver */ 568 1.1 riastrad r = radeon_fence_driver_init(rdev); 569 1.1 riastrad if (r) 570 1.1 riastrad return r; 571 1.1 riastrad /* Memory manager */ 572 1.1 riastrad r = radeon_bo_init(rdev); 573 1.1 riastrad if (r) 574 1.1 riastrad return r; 575 1.1 riastrad r = rs400_gart_init(rdev); 576 1.1 riastrad if (r) 577 1.1 riastrad return r; 578 1.1 riastrad r300_set_reg_safe(rdev); 579 1.1 riastrad 580 1.1 riastrad /* Initialize power management */ 581 1.1 riastrad radeon_pm_init(rdev); 582 1.1 riastrad 583 1.1 riastrad rdev->accel_working = true; 584 1.1 riastrad r = rs400_startup(rdev); 585 1.1 riastrad if (r) { 586 1.1 riastrad /* Somethings want wront with the accel init stop accel */ 587 1.1 riastrad dev_err(rdev->dev, "Disabling GPU acceleration\n"); 588 1.1 riastrad r100_cp_fini(rdev); 589 1.1 riastrad radeon_wb_fini(rdev); 590 1.1 riastrad radeon_ib_pool_fini(rdev); 591 1.1 riastrad rs400_gart_fini(rdev); 592 1.1 riastrad radeon_irq_kms_fini(rdev); 593 1.1 riastrad rdev->accel_working = false; 594 1.1 riastrad } 595 1.1 riastrad return 0; 596 1.1 riastrad } 597