int rs400_mc_wait_for_idle(struct radeon_device *rdev)
{ unsigned i;
uint32_t tmp;
for (i = 0; i < rdev->usec_timeout; i++) { /* read MC_STATUS */
tmp = RREG32(RADEON_MC_STATUS); if (tmp & RADEON_MC_IDLE) { return0;
}
udelay(1);
} return -1;
}
staticvoid rs400_gpu_init(struct radeon_device *rdev)
{ /* Earlier code was calling r420_pipes_init and then *rs400_mc_wait_for_idle(rdev).Theproblemisthat *atleastonmyMobilityRadeonXpress200MRC410card *thatendsupinthiscodepathendsupnum_gb_pipes==3 *whilethecardseemstohaveonlyonepipe.Withthe *r420pipeinitializationmethod. * *ProblemsshownupasHyperZglitches,see: *https://bugs.freedesktop.org/show_bug.cgi?id=110897 * *Delegatinginitializationtor300codeseemstowork *andresultsinproperpipenumbers.Thers400cards *aresaidtobenotr400,butr300kindofcards.
*/
r300_gpu_init(rdev);
if (rs400_mc_wait_for_idle(rdev)) {
pr_warn("rs400: Failed to wait MC idle while programming pipes. Bad things might happen. %08x\n",
RREG32(RADEON_MC_STATUS));
}
}
/* Stops all mc clients */
r100_mc_stop(rdev, &save);
/* Wait for mc idle */ if (rs400_mc_wait_for_idle(rdev))
dev_warn(rdev->dev, "rs400: Wait MC idle timeout before updating MC.\n");
WREG32(R_000148_MC_FB_LOCATION,
S_000148_MC_FB_START(rdev->mc.vram_start >> 16) |
S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16));
r100_mc_resume(rdev, &save);
}
staticint rs400_startup(struct radeon_device *rdev)
{ int r;
r100_set_common_regs(rdev);
rs400_mc_program(rdev); /* Resume clock */
r300_clock_startup(rdev); /* Initialize GPU configuration (# pipes, ...) */
rs400_gpu_init(rdev);
r100_enable_bm(rdev); /* Initialize GART (initialize after TTM so we can allocate
* memory through TTM but finalize after TTM) */
r = rs400_gart_enable(rdev); if (r) return r;
/* allocate wb buffer */
r = radeon_wb_init(rdev); if (r) return r;
r = radeon_fence_driver_start_ring(rdev, RADEON_RING_TYPE_GFX_INDEX); if (r) {
dev_err(rdev->dev, "failed initializing CP fences (%d).\n", r); return r;
}
/* Enable IRQ */ if (!rdev->irq.installed) {
r = radeon_irq_kms_init(rdev); if (r) return r;
}
r100_irq_set(rdev);
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL); /* 1M ring buffer */
r = r100_cp_init(rdev, 1024 * 1024); if (r) {
dev_err(rdev->dev, "failed initializing CP (%d).\n", r); return r;
}
r = radeon_ib_pool_init(rdev); if (r) {
dev_err(rdev->dev, "IB initialization failed (%d).\n", r); return r;
}
return0;
}
int rs400_resume(struct radeon_device *rdev)
{ int r;
/* Make sur GART are not working */
rs400_gart_disable(rdev); /* Resume clock before doing reset */
r300_clock_startup(rdev); /* setup MC before calling post tables */
rs400_mc_program(rdev); /* Reset gpu before posting otherwise ATOM will enter infinite loop */ if (radeon_asic_reset(rdev)) {
dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
RREG32(R_000E40_RBBM_STATUS),
RREG32(R_0007C0_CP_STAT));
} /* post */
radeon_combios_asic_init(rdev_to_drm(rdev)); /* Resume clock after posting */
r300_clock_startup(rdev); /* Initialize surface registers */
radeon_surface_init(rdev);
rdev->accel_working = true;
r = rs400_startup(rdev); if (r) {
rdev->accel_working = false;
} return r;
}
int rs400_init(struct radeon_device *rdev)
{ int r;
/* Disable VGA */
r100_vga_render_disable(rdev); /* Initialize scratch registers */
radeon_scratch_init(rdev); /* Initialize surface registers */
radeon_surface_init(rdev); /* TODO: disable VGA need to use VGA request */ /* restore some register to sane defaults */
r100_restore_sanity(rdev); /* BIOS*/ if (!radeon_get_bios(rdev)) { if (ASIC_IS_AVIVO(rdev)) return -EINVAL;
} if (rdev->is_atom_bios) {
dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); return -EINVAL;
} else {
r = radeon_combios_init(rdev); if (r) return r;
} /* Reset gpu before posting otherwise ATOM will enter infinite loop */ if (radeon_asic_reset(rdev)) {
dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
RREG32(R_000E40_RBBM_STATUS),
RREG32(R_0007C0_CP_STAT));
} /* check if cards are posted or not */ if (radeon_boot_test_post_card(rdev) == false) return -EINVAL;
/* Initialize clocks */
radeon_get_clock_info(rdev_to_drm(rdev)); /* initialize memory controller */
rs400_mc_init(rdev); /* Fence driver */
radeon_fence_driver_init(rdev); /* Memory manager */
r = radeon_bo_init(rdev); if (r) return r;
r = rs400_gart_init(rdev); if (r) return r;
r300_set_reg_safe(rdev);
/* Initialize power management */
radeon_pm_init(rdev);
rdev->accel_working = true;
r = rs400_startup(rdev); if (r) { /* Somethings want wront with the accel init stop accel */
dev_err(rdev->dev, "Disabling GPU acceleration\n");
r100_cp_fini(rdev);
radeon_wb_fini(rdev);
radeon_ib_pool_fini(rdev);
rs400_gart_fini(rdev);
radeon_irq_kms_fini(rdev);
rdev->accel_working = false;
} return0;
}
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.343Bemerkung:
(vorverarbeitet am 2026-10-12)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.