int cayman_resume(struct radeon_device *rdev) { int r; /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, * posting will perform necessary task to bring back GPU into good * shape. */ /* post card */ atom_asic_init(rdev->mode_info.atom_context); rdev->accel_working = true; r = cayman_startup(rdev); if (r) { DRM_ERROR("cayman startup failed on resume\n"); rdev->accel_working = false; return r; } return r; }
/* Plan is to move initialization in that function and use * helper function so that radeon_device_init pretty much * do nothing more than calling asic specific function. This * should also allow to remove a bunch of callback function * like vram_info. */ int cayman_init(struct radeon_device *rdev) { struct radeon_ring *ring = &rdev->ring[RADEON_RING_TYPE_GFX_INDEX]; int r; /* Read BIOS */ if (!radeon_get_bios(rdev)) { if (ASIC_IS_AVIVO(rdev)) return -EINVAL; } /* Must be an ATOMBIOS */ if (!rdev->is_atom_bios) { dev_err(rdev->dev, "Expecting atombios for cayman GPU\n"); return -EINVAL; } r = radeon_atombios_init(rdev); if (r) return r; /* Post card if necessary */ if (!radeon_card_posted(rdev)) { if (!rdev->bios) { dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n"); return -EINVAL; } DRM_INFO("GPU not posted. posting now...\n"); atom_asic_init(rdev->mode_info.atom_context); } /* Initialize scratch registers */ r600_scratch_init(rdev); /* Initialize surface registers */ radeon_surface_init(rdev); /* Initialize clocks */ radeon_get_clock_info(rdev->ddev); /* Fence driver */ r = radeon_fence_driver_init(rdev); if (r) return r; /* initialize memory controller */ r = evergreen_mc_init(rdev); if (r) return r; /* Memory manager */ r = radeon_bo_init(rdev); if (r) return r; r = radeon_irq_kms_init(rdev); if (r) return r; ring->ring_obj = NULL; r600_ring_init(rdev, ring, 1024 * 1024); rdev->ih.ring_obj = NULL; r600_ih_ring_init(rdev, 64 * 1024); r = r600_pcie_gart_init(rdev); if (r) return r; r = radeon_ib_pool_init(rdev); rdev->accel_working = true; if (r) { dev_err(rdev->dev, "IB initialization failed (%d).\n", r); rdev->accel_working = false; } r = radeon_vm_manager_init(rdev); if (r) { dev_err(rdev->dev, "vm manager initialization failed (%d).\n", r); } r = cayman_startup(rdev); if (r) { dev_err(rdev->dev, "disabling GPU acceleration\n"); cayman_cp_fini(rdev); r600_irq_fini(rdev); if (rdev->flags & RADEON_IS_IGP) si_rlc_fini(rdev); radeon_wb_fini(rdev); r100_ib_fini(rdev); radeon_vm_manager_fini(rdev); radeon_irq_kms_fini(rdev); cayman_pcie_gart_fini(rdev); rdev->accel_working = false; } /* Don't start up if the MC ucode is missing. * The default clocks and voltages before the MC ucode * is loaded are not suffient for advanced operations. * * We can skip this check for TN, because there is no MC * ucode. */ if (!rdev->mc_fw && !(rdev->flags & RADEON_IS_IGP)) { DRM_ERROR("radeon: MC ucode required for NI+.\n"); return -EINVAL; } return 0; }
status_t radeon_init_bios(uint8* bios) { radeon_shared_info &info = *gInfo->shared_info; if (info.has_rom == false) { TRACE("%s: called even though has_rom == false\n", __func__); return B_ERROR; } #ifdef TRACE_ATOM radeon_dump_bios(); #endif struct card_info *atom_card_info = (card_info*)malloc(sizeof(card_info)); if (!atom_card_info) return B_NO_MEMORY; atom_card_info->reg_read = Read32Cail; atom_card_info->reg_write = Write32Cail; // use MMIO instead of PCI I/O BAR atom_card_info->ioreg_read = Read32Cail; atom_card_info->ioreg_write = Write32Cail; atom_card_info->mc_read = _read32; atom_card_info->mc_write = _write32; atom_card_info->pll_read = _read32; atom_card_info->pll_write = _write32; // Point AtomBIOS parser to card bios and malloc gAtomContext gAtomContext = atom_parse(atom_card_info, bios); if (gAtomContext == NULL) { TRACE("%s: couldn't parse system AtomBIOS\n", __func__); return B_ERROR; } if ((gAtomContext->exec_sem = create_sem(1, "AtomBIOS_exec")) < B_NO_ERROR) { TRACE("%s: couldn't create semaphore for AtomBIOS exec thread!\n", __func__); return B_ERROR; } radeon_bios_init_scratch(); atom_allocate_fb_scratch(gAtomContext); // post card atombios if needed if (radeon_bios_isposted() == false) { TRACE("%s: init AtomBIOS for this card as it is not not posted\n", __func__); // radeon_gpu_reset(); // <= r500 only? atom_asic_init(gAtomContext); } else { TRACE("%s: AtomBIOS is already posted\n", __func__); } return B_OK; }