Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: (24 commits) drm/radeon/kms: fix vline register for second head. drm/r600: avoid assigning vb twice in blit code drm/radeon: use list_for_each_entry instead of list_for_each drm/radeon/kms: Fix AGP support for R600/RV770 family (v2) drm/radeon/kms: Fallback to non AGP when acceleration fails to initialize (v2) drm/radeon/kms: Fix RS600/RV515/R520/RS690 IRQ drm/radeon: Fix setting of bits drm/ttm: fix refcounting in ttm global code. drm/fb: add more correct 8/16/24/32 bpp fb support. drm/fb: add setcmap and fix 8-bit support. drm/radeon/kms: respect single crtc cards, only create one crtc. (v2) drm: Delete the DRM_DEBUG_KMS in drm_mode_cursor_ioctl drm/radeon/kms: add support for "Surround View" drm/radeon/kms: Fix irq handling on AVIVO hw drm/radeon/kms: R600/RV770 remove dead code and print message for wrong BIOS drm/radeon/kms: Fix R600/RV770 disable acceleration path drm/radeon/kms: Fix R600/RV770 startup path & reset drm/radeon/kms: Fix R600 write back buffer drm/radeon/kms: Remove old init path as no hw use it anymore drm/radeon/kms: Convert RS600 to new init path ...
This commit is contained in:
Коммит
1c6e6d91b2
|
@ -1556,8 +1556,6 @@ int drm_mode_cursor_ioctl(struct drm_device *dev,
|
|||
struct drm_crtc *crtc;
|
||||
int ret = 0;
|
||||
|
||||
DRM_DEBUG_KMS("\n");
|
||||
|
||||
if (!req->flags) {
|
||||
DRM_ERROR("no operation set\n");
|
||||
return -EINVAL;
|
||||
|
|
|
@ -454,6 +454,96 @@ out_free:
|
|||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_init_crtc_count);
|
||||
|
||||
static void setcolreg(struct drm_crtc *crtc, u16 red, u16 green,
|
||||
u16 blue, u16 regno, struct fb_info *info)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = info->par;
|
||||
struct drm_framebuffer *fb = fb_helper->fb;
|
||||
int pindex;
|
||||
|
||||
pindex = regno;
|
||||
|
||||
if (fb->bits_per_pixel == 16) {
|
||||
pindex = regno << 3;
|
||||
|
||||
if (fb->depth == 16 && regno > 63)
|
||||
return;
|
||||
if (fb->depth == 15 && regno > 31)
|
||||
return;
|
||||
|
||||
if (fb->depth == 16) {
|
||||
u16 r, g, b;
|
||||
int i;
|
||||
if (regno < 32) {
|
||||
for (i = 0; i < 8; i++)
|
||||
fb_helper->funcs->gamma_set(crtc, red,
|
||||
green, blue, pindex + i);
|
||||
}
|
||||
|
||||
fb_helper->funcs->gamma_get(crtc, &r,
|
||||
&g, &b,
|
||||
pindex >> 1);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
fb_helper->funcs->gamma_set(crtc, r,
|
||||
green, b,
|
||||
(pindex >> 1) + i);
|
||||
}
|
||||
}
|
||||
|
||||
if (fb->depth != 16)
|
||||
fb_helper->funcs->gamma_set(crtc, red, green, blue, pindex);
|
||||
|
||||
if (regno < 16 && info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
|
||||
((u32 *) fb->pseudo_palette)[regno] =
|
||||
(regno << info->var.red.offset) |
|
||||
(regno << info->var.green.offset) |
|
||||
(regno << info->var.blue.offset);
|
||||
}
|
||||
}
|
||||
|
||||
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info)
|
||||
{
|
||||
struct drm_fb_helper *fb_helper = info->par;
|
||||
struct drm_device *dev = fb_helper->dev;
|
||||
u16 *red, *green, *blue, *transp;
|
||||
struct drm_crtc *crtc;
|
||||
int i, rc = 0;
|
||||
int start;
|
||||
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
|
||||
for (i = 0; i < fb_helper->crtc_count; i++) {
|
||||
if (crtc->base.id == fb_helper->crtc_info[i].crtc_id)
|
||||
break;
|
||||
}
|
||||
if (i == fb_helper->crtc_count)
|
||||
continue;
|
||||
|
||||
red = cmap->red;
|
||||
green = cmap->green;
|
||||
blue = cmap->blue;
|
||||
transp = cmap->transp;
|
||||
start = cmap->start;
|
||||
|
||||
for (i = 0; i < cmap->len; i++) {
|
||||
u16 hred, hgreen, hblue, htransp = 0xffff;
|
||||
|
||||
hred = *red++;
|
||||
hgreen = *green++;
|
||||
hblue = *blue++;
|
||||
|
||||
if (transp)
|
||||
htransp = *transp++;
|
||||
|
||||
setcolreg(crtc, hred, hgreen, hblue, start++, info);
|
||||
}
|
||||
crtc_funcs->load_lut(crtc);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_setcmap);
|
||||
|
||||
int drm_fb_helper_setcolreg(unsigned regno,
|
||||
unsigned red,
|
||||
unsigned green,
|
||||
|
@ -466,9 +556,11 @@ int drm_fb_helper_setcolreg(unsigned regno,
|
|||
struct drm_crtc *crtc;
|
||||
int i;
|
||||
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
struct drm_framebuffer *fb = fb_helper->fb;
|
||||
if (regno > 255)
|
||||
return 1;
|
||||
|
||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
|
||||
struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
|
||||
for (i = 0; i < fb_helper->crtc_count; i++) {
|
||||
if (crtc->base.id == fb_helper->crtc_info[i].crtc_id)
|
||||
break;
|
||||
|
@ -476,35 +568,9 @@ int drm_fb_helper_setcolreg(unsigned regno,
|
|||
if (i == fb_helper->crtc_count)
|
||||
continue;
|
||||
|
||||
if (regno > 255)
|
||||
return 1;
|
||||
|
||||
if (fb->depth == 8) {
|
||||
fb_helper->funcs->gamma_set(crtc, red, green, blue, regno);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (regno < 16) {
|
||||
switch (fb->depth) {
|
||||
case 15:
|
||||
fb->pseudo_palette[regno] = ((red & 0xf800) >> 1) |
|
||||
((green & 0xf800) >> 6) |
|
||||
((blue & 0xf800) >> 11);
|
||||
break;
|
||||
case 16:
|
||||
fb->pseudo_palette[regno] = (red & 0xf800) |
|
||||
((green & 0xfc00) >> 5) |
|
||||
((blue & 0xf800) >> 11);
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
fb->pseudo_palette[regno] =
|
||||
(((red >> 8) & 0xff) << info->var.red.offset) |
|
||||
(((green >> 8) & 0xff) << info->var.green.offset) |
|
||||
(((blue >> 8) & 0xff) << info->var.blue.offset);
|
||||
break;
|
||||
}
|
||||
}
|
||||
setcolreg(crtc, red, green, blue, regno, info);
|
||||
crtc_funcs->load_lut(crtc);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -674,6 +740,7 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
|
|||
EXPORT_SYMBOL(drm_fb_helper_pan_display);
|
||||
|
||||
int drm_fb_helper_single_fb_probe(struct drm_device *dev,
|
||||
int preferred_bpp,
|
||||
int (*fb_create)(struct drm_device *dev,
|
||||
uint32_t fb_width,
|
||||
uint32_t fb_height,
|
||||
|
@ -696,6 +763,11 @@ int drm_fb_helper_single_fb_probe(struct drm_device *dev,
|
|||
struct drm_fb_helper *fb_helper;
|
||||
uint32_t surface_depth = 24, surface_bpp = 32;
|
||||
|
||||
/* if driver picks 8 or 16 by default use that
|
||||
for both depth/bpp */
|
||||
if (preferred_bpp != surface_bpp) {
|
||||
surface_depth = surface_bpp = preferred_bpp;
|
||||
}
|
||||
/* first up get a count of crtcs now in use and new min/maxes width/heights */
|
||||
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
|
||||
struct drm_fb_helper_connector *fb_help_conn = connector->fb_helper_private;
|
||||
|
@ -851,10 +923,12 @@ void drm_fb_helper_free(struct drm_fb_helper *helper)
|
|||
}
|
||||
EXPORT_SYMBOL(drm_fb_helper_free);
|
||||
|
||||
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch)
|
||||
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
|
||||
uint32_t depth)
|
||||
{
|
||||
info->fix.type = FB_TYPE_PACKED_PIXELS;
|
||||
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
||||
info->fix.visual = depth == 8 ? FB_VISUAL_PSEUDOCOLOR :
|
||||
FB_VISUAL_DIRECTCOLOR;
|
||||
info->fix.type_aux = 0;
|
||||
info->fix.xpanstep = 1; /* doing it in hw */
|
||||
info->fix.ypanstep = 1; /* doing it in hw */
|
||||
|
|
|
@ -3244,6 +3244,16 @@ void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
|||
intel_crtc->lut_b[regno] = blue >> 8;
|
||||
}
|
||||
|
||||
void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, int regno)
|
||||
{
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
|
||||
*red = intel_crtc->lut_r[regno] << 8;
|
||||
*green = intel_crtc->lut_g[regno] << 8;
|
||||
*blue = intel_crtc->lut_b[regno] << 8;
|
||||
}
|
||||
|
||||
static void intel_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, uint32_t size)
|
||||
{
|
||||
|
@ -3835,6 +3845,7 @@ static const struct drm_crtc_helper_funcs intel_helper_funcs = {
|
|||
.mode_set_base = intel_pipe_set_base,
|
||||
.prepare = intel_crtc_prepare,
|
||||
.commit = intel_crtc_commit,
|
||||
.load_lut = intel_crtc_load_lut,
|
||||
};
|
||||
|
||||
static const struct drm_crtc_funcs intel_crtc_funcs = {
|
||||
|
|
|
@ -175,6 +175,8 @@ extern int intelfb_resize(struct drm_device *dev, struct drm_crtc *crtc);
|
|||
extern void intelfb_restore(void);
|
||||
extern void intel_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
||||
u16 blue, int regno);
|
||||
extern void intel_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, int regno);
|
||||
|
||||
extern int intel_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd *mode_cmd,
|
||||
|
|
|
@ -60,10 +60,12 @@ static struct fb_ops intelfb_ops = {
|
|||
.fb_imageblit = cfb_imageblit,
|
||||
.fb_pan_display = drm_fb_helper_pan_display,
|
||||
.fb_blank = drm_fb_helper_blank,
|
||||
.fb_setcmap = drm_fb_helper_setcmap,
|
||||
};
|
||||
|
||||
static struct drm_fb_helper_funcs intel_fb_helper_funcs = {
|
||||
.gamma_set = intel_crtc_fb_gamma_set,
|
||||
.gamma_get = intel_crtc_fb_gamma_get,
|
||||
};
|
||||
|
||||
|
||||
|
@ -123,6 +125,10 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width,
|
|||
struct device *device = &dev->pdev->dev;
|
||||
int size, ret, mmio_bar = IS_I9XX(dev) ? 0 : 1;
|
||||
|
||||
/* we don't do packed 24bpp */
|
||||
if (surface_bpp == 24)
|
||||
surface_bpp = 32;
|
||||
|
||||
mode_cmd.width = surface_width;
|
||||
mode_cmd.height = surface_height;
|
||||
|
||||
|
@ -206,7 +212,7 @@ static int intelfb_create(struct drm_device *dev, uint32_t fb_width,
|
|||
|
||||
// memset(info->screen_base, 0, size);
|
||||
|
||||
drm_fb_helper_fill_fix(info, fb->pitch);
|
||||
drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);
|
||||
drm_fb_helper_fill_var(info, fb, fb_width, fb_height);
|
||||
|
||||
/* FIXME: we really shouldn't expose mmio space at all */
|
||||
|
@ -244,7 +250,7 @@ int intelfb_probe(struct drm_device *dev)
|
|||
int ret;
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
ret = drm_fb_helper_single_fb_probe(dev, intelfb_create);
|
||||
ret = drm_fb_helper_single_fb_probe(dev, 32, intelfb_create);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(intelfb_probe);
|
||||
|
|
|
@ -733,6 +733,7 @@ static const struct drm_crtc_helper_funcs atombios_helper_funcs = {
|
|||
.mode_set_base = atombios_crtc_set_base,
|
||||
.prepare = atombios_crtc_prepare,
|
||||
.commit = atombios_crtc_commit,
|
||||
.load_lut = radeon_crtc_load_lut,
|
||||
};
|
||||
|
||||
void radeon_atombios_init_crtc(struct drm_device *dev,
|
||||
|
|
|
@ -32,6 +32,9 @@
|
|||
#include "radeon_reg.h"
|
||||
#include "radeon.h"
|
||||
#include "r100d.h"
|
||||
#include "rs100d.h"
|
||||
#include "rv200d.h"
|
||||
#include "rv250d.h"
|
||||
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -60,18 +63,7 @@ MODULE_FIRMWARE(FIRMWARE_R520);
|
|||
|
||||
/* This files gather functions specifics to:
|
||||
* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
|
||||
*
|
||||
* Some of these functions might be used by newer ASICs.
|
||||
*/
|
||||
int r200_init(struct radeon_device *rdev);
|
||||
void r100_hdp_reset(struct radeon_device *rdev);
|
||||
void r100_gpu_init(struct radeon_device *rdev);
|
||||
int r100_gui_wait_for_idle(struct radeon_device *rdev);
|
||||
int r100_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
void r100_gpu_wait_for_vsync(struct radeon_device *rdev);
|
||||
void r100_gpu_wait_for_vsync2(struct radeon_device *rdev);
|
||||
int r100_debugfs_mc_info_init(struct radeon_device *rdev);
|
||||
|
||||
|
||||
/*
|
||||
* PCI GART
|
||||
|
@ -152,136 +144,6 @@ void r100_pci_gart_fini(struct radeon_device *rdev)
|
|||
radeon_gart_fini(rdev);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* MC
|
||||
*/
|
||||
void r100_mc_disable_clients(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t ov0_scale_cntl, crtc_ext_cntl, crtc_gen_cntl, crtc2_gen_cntl;
|
||||
|
||||
/* FIXME: is this function correct for rs100,rs200,rs300 ? */
|
||||
if (r100_gui_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait GUI idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
|
||||
/* stop display and memory access */
|
||||
ov0_scale_cntl = RREG32(RADEON_OV0_SCALE_CNTL);
|
||||
WREG32(RADEON_OV0_SCALE_CNTL, ov0_scale_cntl & ~RADEON_SCALER_ENABLE);
|
||||
crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
|
||||
WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl | RADEON_CRTC_DISPLAY_DIS);
|
||||
crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL);
|
||||
|
||||
r100_gpu_wait_for_vsync(rdev);
|
||||
|
||||
WREG32(RADEON_CRTC_GEN_CNTL,
|
||||
(crtc_gen_cntl & ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_ICON_EN)) |
|
||||
RADEON_CRTC_DISP_REQ_EN_B | RADEON_CRTC_EXT_DISP_EN);
|
||||
|
||||
if (!(rdev->flags & RADEON_SINGLE_CRTC)) {
|
||||
crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
|
||||
|
||||
r100_gpu_wait_for_vsync2(rdev);
|
||||
WREG32(RADEON_CRTC2_GEN_CNTL,
|
||||
(crtc2_gen_cntl &
|
||||
~(RADEON_CRTC2_CUR_EN | RADEON_CRTC2_ICON_EN)) |
|
||||
RADEON_CRTC2_DISP_REQ_EN_B);
|
||||
}
|
||||
|
||||
udelay(500);
|
||||
}
|
||||
|
||||
void r100_mc_setup(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
int r;
|
||||
|
||||
r = r100_debugfs_mc_info_init(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("Failed to register debugfs file for R100 MC !\n");
|
||||
}
|
||||
/* Write VRAM size in case we are limiting it */
|
||||
WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size);
|
||||
/* Novell bug 204882 for RN50/M6/M7 with 8/16/32MB VRAM,
|
||||
* if the aperture is 64MB but we have 32MB VRAM
|
||||
* we report only 32MB VRAM but we have to set MC_FB_LOCATION
|
||||
* to 64MB, otherwise the gpu accidentially dies */
|
||||
tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
|
||||
tmp = REG_SET(RADEON_MC_FB_TOP, tmp >> 16);
|
||||
tmp |= REG_SET(RADEON_MC_FB_START, rdev->mc.vram_location >> 16);
|
||||
WREG32(RADEON_MC_FB_LOCATION, tmp);
|
||||
|
||||
/* Enable bus mastering */
|
||||
tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
|
||||
WREG32(RADEON_BUS_CNTL, tmp);
|
||||
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
|
||||
tmp = REG_SET(RADEON_MC_AGP_TOP, tmp >> 16);
|
||||
tmp |= REG_SET(RADEON_MC_AGP_START, rdev->mc.gtt_location >> 16);
|
||||
WREG32(RADEON_MC_AGP_LOCATION, tmp);
|
||||
WREG32(RADEON_AGP_BASE, rdev->mc.agp_base);
|
||||
} else {
|
||||
WREG32(RADEON_MC_AGP_LOCATION, 0x0FFFFFFF);
|
||||
WREG32(RADEON_AGP_BASE, 0);
|
||||
}
|
||||
|
||||
tmp = RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL;
|
||||
tmp |= (7 << 28);
|
||||
WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE);
|
||||
(void)RREG32(RADEON_HOST_PATH_CNTL);
|
||||
WREG32(RADEON_HOST_PATH_CNTL, tmp);
|
||||
(void)RREG32(RADEON_HOST_PATH_CNTL);
|
||||
}
|
||||
|
||||
int r100_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (r100_debugfs_rbbm_init(rdev)) {
|
||||
DRM_ERROR("Failed to register debugfs file for RBBM !\n");
|
||||
}
|
||||
|
||||
r100_gpu_init(rdev);
|
||||
/* Disable gart which also disable out of gart access */
|
||||
r100_pci_gart_disable(rdev);
|
||||
|
||||
/* Setup GPU memory space */
|
||||
rdev->mc.gtt_location = 0xFFFFFFFFUL;
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
r = radeon_agp_init(rdev);
|
||||
if (r) {
|
||||
printk(KERN_WARNING "[drm] Disabling AGP\n");
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
|
||||
} else {
|
||||
rdev->mc.gtt_location = rdev->mc.agp_base;
|
||||
}
|
||||
}
|
||||
r = radeon_mc_setup(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
r100_mc_disable_clients(rdev);
|
||||
if (r100_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait MC idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
|
||||
r100_mc_setup(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void r100_mc_fini(struct radeon_device *rdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Interrupts
|
||||
*/
|
||||
int r100_irq_set(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp = 0;
|
||||
|
@ -358,10 +220,6 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc)
|
|||
return RREG32(RADEON_CRTC2_CRNT_FRAME);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Fence emission
|
||||
*/
|
||||
void r100_fence_ring_emit(struct radeon_device *rdev,
|
||||
struct radeon_fence *fence)
|
||||
{
|
||||
|
@ -377,10 +235,6 @@ void r100_fence_ring_emit(struct radeon_device *rdev,
|
|||
radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Writeback
|
||||
*/
|
||||
int r100_wb_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
@ -504,10 +358,6 @@ int r100_copy_blit(struct radeon_device *rdev,
|
|||
return r;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CP
|
||||
*/
|
||||
static int r100_cp_wait_for_idle(struct radeon_device *rdev)
|
||||
{
|
||||
unsigned i;
|
||||
|
@ -612,6 +462,7 @@ static int r100_cp_init_microcode(struct radeon_device *rdev)
|
|||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static void r100_cp_load_microcode(struct radeon_device *rdev)
|
||||
{
|
||||
const __be32 *fw_data;
|
||||
|
@ -978,7 +829,7 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
|
||||
header = radeon_get_ib_value(p, h_idx);
|
||||
crtc_id = radeon_get_ib_value(p, h_idx + 5);
|
||||
reg = header >> 2;
|
||||
reg = CP_PACKET0_GET_REG(header);
|
||||
mutex_lock(&p->rdev->ddev->mode_config.mutex);
|
||||
obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
|
||||
if (!obj) {
|
||||
|
@ -1990,7 +1841,7 @@ void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
|
|||
r100_pll_errata_after_data(rdev);
|
||||
}
|
||||
|
||||
int r100_init(struct radeon_device *rdev)
|
||||
void r100_set_safe_registers(struct radeon_device *rdev)
|
||||
{
|
||||
if (ASIC_IS_RN50(rdev)) {
|
||||
rdev->config.r100.reg_safe_bm = rn50_reg_safe_bm;
|
||||
|
@ -1999,9 +1850,8 @@ int r100_init(struct radeon_device *rdev)
|
|||
rdev->config.r100.reg_safe_bm = r100_reg_safe_bm;
|
||||
rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r100_reg_safe_bm);
|
||||
} else {
|
||||
return r200_init(rdev);
|
||||
r200_set_safe_registers(rdev);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2299,9 +2149,11 @@ void r100_bandwidth_update(struct radeon_device *rdev)
|
|||
mode1 = &rdev->mode_info.crtcs[0]->base.mode;
|
||||
pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8;
|
||||
}
|
||||
if (rdev->mode_info.crtcs[1]->base.enabled) {
|
||||
mode2 = &rdev->mode_info.crtcs[1]->base.mode;
|
||||
pixel_bytes2 = rdev->mode_info.crtcs[1]->base.fb->bits_per_pixel / 8;
|
||||
if (!(rdev->flags & RADEON_SINGLE_CRTC)) {
|
||||
if (rdev->mode_info.crtcs[1]->base.enabled) {
|
||||
mode2 = &rdev->mode_info.crtcs[1]->base.mode;
|
||||
pixel_bytes2 = rdev->mode_info.crtcs[1]->base.fb->bits_per_pixel / 8;
|
||||
}
|
||||
}
|
||||
|
||||
min_mem_eff.full = rfixed_const_8(0);
|
||||
|
@ -3114,7 +2966,7 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save)
|
|||
WREG32(R_000740_CP_CSQ_CNTL, 0);
|
||||
|
||||
/* Save few CRTC registers */
|
||||
save->GENMO_WT = RREG32(R_0003C0_GENMO_WT);
|
||||
save->GENMO_WT = RREG8(R_0003C2_GENMO_WT);
|
||||
save->CRTC_EXT_CNTL = RREG32(R_000054_CRTC_EXT_CNTL);
|
||||
save->CRTC_GEN_CNTL = RREG32(R_000050_CRTC_GEN_CNTL);
|
||||
save->CUR_OFFSET = RREG32(R_000260_CUR_OFFSET);
|
||||
|
@ -3124,7 +2976,7 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save)
|
|||
}
|
||||
|
||||
/* Disable VGA aperture access */
|
||||
WREG32(R_0003C0_GENMO_WT, C_0003C0_VGA_RAM_EN & save->GENMO_WT);
|
||||
WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & save->GENMO_WT);
|
||||
/* Disable cursor, overlay, crtc */
|
||||
WREG32(R_000260_CUR_OFFSET, save->CUR_OFFSET | S_000260_CUR_LOCK(1));
|
||||
WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL |
|
||||
|
@ -3156,10 +3008,264 @@ void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save)
|
|||
rdev->mc.vram_location);
|
||||
}
|
||||
/* Restore CRTC registers */
|
||||
WREG32(R_0003C0_GENMO_WT, save->GENMO_WT);
|
||||
WREG8(R_0003C2_GENMO_WT, save->GENMO_WT);
|
||||
WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL);
|
||||
WREG32(R_000050_CRTC_GEN_CNTL, save->CRTC_GEN_CNTL);
|
||||
if (!(rdev->flags & RADEON_SINGLE_CRTC)) {
|
||||
WREG32(R_0003F8_CRTC2_GEN_CNTL, save->CRTC2_GEN_CNTL);
|
||||
}
|
||||
}
|
||||
|
||||
void r100_vga_render_disable(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = RREG8(R_0003C2_GENMO_WT);
|
||||
WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & tmp);
|
||||
}
|
||||
|
||||
static void r100_debugfs(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
r = r100_debugfs_mc_info_init(rdev);
|
||||
if (r)
|
||||
dev_warn(rdev->dev, "Failed to create r100_mc debugfs file.\n");
|
||||
}
|
||||
|
||||
static void r100_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
struct r100_mc_save save;
|
||||
|
||||
/* Stops all mc clients */
|
||||
r100_mc_stop(rdev, &save);
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
WREG32(R_00014C_MC_AGP_LOCATION,
|
||||
S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) |
|
||||
S_00014C_MC_AGP_TOP(rdev->mc.gtt_end >> 16));
|
||||
WREG32(R_000170_AGP_BASE, lower_32_bits(rdev->mc.agp_base));
|
||||
if (rdev->family > CHIP_RV200)
|
||||
WREG32(R_00015C_AGP_BASE_2,
|
||||
upper_32_bits(rdev->mc.agp_base) & 0xff);
|
||||
} else {
|
||||
WREG32(R_00014C_MC_AGP_LOCATION, 0x0FFFFFFF);
|
||||
WREG32(R_000170_AGP_BASE, 0);
|
||||
if (rdev->family > CHIP_RV200)
|
||||
WREG32(R_00015C_AGP_BASE_2, 0);
|
||||
}
|
||||
/* Wait for mc idle */
|
||||
if (r100_mc_wait_for_idle(rdev))
|
||||
dev_warn(rdev->dev, "Wait for MC idle timeout.\n");
|
||||
/* Program MC, should be a 32bits limited address space */
|
||||
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);
|
||||
}
|
||||
|
||||
void r100_clock_startup(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
if (radeon_dynclks != -1 && radeon_dynclks)
|
||||
radeon_legacy_set_clock_gating(rdev, 1);
|
||||
/* We need to force on some of the block */
|
||||
tmp = RREG32_PLL(R_00000D_SCLK_CNTL);
|
||||
tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1);
|
||||
if ((rdev->family == CHIP_RV250) || (rdev->family == CHIP_RV280))
|
||||
tmp |= S_00000D_FORCE_DISP1(1) | S_00000D_FORCE_DISP2(1);
|
||||
WREG32_PLL(R_00000D_SCLK_CNTL, tmp);
|
||||
}
|
||||
|
||||
static int r100_startup(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
r100_mc_program(rdev);
|
||||
/* Resume clock */
|
||||
r100_clock_startup(rdev);
|
||||
/* Initialize GPU configuration (# pipes, ...) */
|
||||
r100_gpu_init(rdev);
|
||||
/* Initialize GART (initialize after TTM so we can allocate
|
||||
* memory through TTM but finalize after TTM) */
|
||||
if (rdev->flags & RADEON_IS_PCI) {
|
||||
r = r100_pci_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
r100_irq_set(rdev);
|
||||
/* 1M ring buffer */
|
||||
r = r100_cp_init(rdev, 1024 * 1024);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = r100_wb_init(rdev);
|
||||
if (r)
|
||||
dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
|
||||
r = r100_ib_init(rdev);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int r100_resume(struct radeon_device *rdev)
|
||||
{
|
||||
/* Make sur GART are not working */
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_disable(rdev);
|
||||
/* Resume clock before doing reset */
|
||||
r100_clock_startup(rdev);
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_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->ddev);
|
||||
/* Resume clock after posting */
|
||||
r100_clock_startup(rdev);
|
||||
return r100_startup(rdev);
|
||||
}
|
||||
|
||||
int r100_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
r100_irq_disable(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_disable(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void r100_fini(struct radeon_device *rdev)
|
||||
{
|
||||
r100_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_object_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
}
|
||||
|
||||
int r100_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
u32 tmp;
|
||||
|
||||
/* Setup GPU memory space */
|
||||
rdev->mc.vram_location = 0xFFFFFFFFUL;
|
||||
rdev->mc.gtt_location = 0xFFFFFFFFUL;
|
||||
if (rdev->flags & RADEON_IS_IGP) {
|
||||
tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM));
|
||||
rdev->mc.vram_location = tmp << 16;
|
||||
}
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
r = radeon_agp_init(rdev);
|
||||
if (r) {
|
||||
printk(KERN_WARNING "[drm] Disabling AGP\n");
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
|
||||
} else {
|
||||
rdev->mc.gtt_location = rdev->mc.agp_base;
|
||||
}
|
||||
}
|
||||
r = radeon_mc_setup(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int r100_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
/* Register debugfs file specific to this group of asics */
|
||||
r100_debugfs(rdev);
|
||||
/* 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 */
|
||||
/* 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_gpu_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_card_posted(rdev) && rdev->bios) {
|
||||
DRM_INFO("GPU not posted. posting now...\n");
|
||||
radeon_combios_asic_init(rdev->ddev);
|
||||
}
|
||||
/* Set asic errata */
|
||||
r100_errata(rdev);
|
||||
/* Initialize clocks */
|
||||
radeon_get_clock_info(rdev->ddev);
|
||||
/* Get vram informations */
|
||||
r100_vram_info(rdev);
|
||||
/* Initialize memory controller (also test AGP) */
|
||||
r = r100_mc_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
if (rdev->flags & RADEON_IS_PCI) {
|
||||
r = r100_pci_gart_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
r100_set_safe_registers(rdev);
|
||||
rdev->accel_working = true;
|
||||
r = r100_startup(rdev);
|
||||
if (r) {
|
||||
/* Somethings want wront with the accel init stop accel */
|
||||
dev_err(rdev->dev, "Disabling GPU acceleration\n");
|
||||
r100_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -381,6 +381,24 @@
|
|||
#define S_000054_VCRTC_IDX_MASTER(x) (((x) & 0x7F) << 24)
|
||||
#define G_000054_VCRTC_IDX_MASTER(x) (((x) >> 24) & 0x7F)
|
||||
#define C_000054_VCRTC_IDX_MASTER 0x80FFFFFF
|
||||
#define R_000148_MC_FB_LOCATION 0x000148
|
||||
#define S_000148_MC_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000148_MC_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000148_MC_FB_START 0xFFFF0000
|
||||
#define S_000148_MC_FB_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_000148_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_000148_MC_FB_TOP 0x0000FFFF
|
||||
#define R_00014C_MC_AGP_LOCATION 0x00014C
|
||||
#define S_00014C_MC_AGP_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_00014C_MC_AGP_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_00014C_MC_AGP_START 0xFFFF0000
|
||||
#define S_00014C_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_00014C_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_00014C_MC_AGP_TOP 0x0000FFFF
|
||||
#define R_000170_AGP_BASE 0x000170
|
||||
#define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0)
|
||||
#define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF)
|
||||
#define C_000170_AGP_BASE_ADDR 0x00000000
|
||||
#define R_00023C_DISPLAY_BASE_ADDR 0x00023C
|
||||
#define S_00023C_DISPLAY_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0)
|
||||
#define G_00023C_DISPLAY_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF)
|
||||
|
@ -403,25 +421,25 @@
|
|||
#define S_000360_CUR2_LOCK(x) (((x) & 0x1) << 31)
|
||||
#define G_000360_CUR2_LOCK(x) (((x) >> 31) & 0x1)
|
||||
#define C_000360_CUR2_LOCK 0x7FFFFFFF
|
||||
#define R_0003C0_GENMO_WT 0x0003C0
|
||||
#define S_0003C0_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0)
|
||||
#define G_0003C0_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1)
|
||||
#define C_0003C0_GENMO_MONO_ADDRESS_B 0xFFFFFFFE
|
||||
#define S_0003C0_VGA_RAM_EN(x) (((x) & 0x1) << 1)
|
||||
#define G_0003C0_VGA_RAM_EN(x) (((x) >> 1) & 0x1)
|
||||
#define C_0003C0_VGA_RAM_EN 0xFFFFFFFD
|
||||
#define S_0003C0_VGA_CKSEL(x) (((x) & 0x3) << 2)
|
||||
#define G_0003C0_VGA_CKSEL(x) (((x) >> 2) & 0x3)
|
||||
#define C_0003C0_VGA_CKSEL 0xFFFFFFF3
|
||||
#define S_0003C0_ODD_EVEN_MD_PGSEL(x) (((x) & 0x1) << 5)
|
||||
#define G_0003C0_ODD_EVEN_MD_PGSEL(x) (((x) >> 5) & 0x1)
|
||||
#define C_0003C0_ODD_EVEN_MD_PGSEL 0xFFFFFFDF
|
||||
#define S_0003C0_VGA_HSYNC_POL(x) (((x) & 0x1) << 6)
|
||||
#define G_0003C0_VGA_HSYNC_POL(x) (((x) >> 6) & 0x1)
|
||||
#define C_0003C0_VGA_HSYNC_POL 0xFFFFFFBF
|
||||
#define S_0003C0_VGA_VSYNC_POL(x) (((x) & 0x1) << 7)
|
||||
#define G_0003C0_VGA_VSYNC_POL(x) (((x) >> 7) & 0x1)
|
||||
#define C_0003C0_VGA_VSYNC_POL 0xFFFFFF7F
|
||||
#define R_0003C2_GENMO_WT 0x0003C0
|
||||
#define S_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0)
|
||||
#define G_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1)
|
||||
#define C_0003C2_GENMO_MONO_ADDRESS_B 0xFE
|
||||
#define S_0003C2_VGA_RAM_EN(x) (((x) & 0x1) << 1)
|
||||
#define G_0003C2_VGA_RAM_EN(x) (((x) >> 1) & 0x1)
|
||||
#define C_0003C2_VGA_RAM_EN 0xFD
|
||||
#define S_0003C2_VGA_CKSEL(x) (((x) & 0x3) << 2)
|
||||
#define G_0003C2_VGA_CKSEL(x) (((x) >> 2) & 0x3)
|
||||
#define C_0003C2_VGA_CKSEL 0xF3
|
||||
#define S_0003C2_ODD_EVEN_MD_PGSEL(x) (((x) & 0x1) << 5)
|
||||
#define G_0003C2_ODD_EVEN_MD_PGSEL(x) (((x) >> 5) & 0x1)
|
||||
#define C_0003C2_ODD_EVEN_MD_PGSEL 0xDF
|
||||
#define S_0003C2_VGA_HSYNC_POL(x) (((x) & 0x1) << 6)
|
||||
#define G_0003C2_VGA_HSYNC_POL(x) (((x) >> 6) & 0x1)
|
||||
#define C_0003C2_VGA_HSYNC_POL 0xBF
|
||||
#define S_0003C2_VGA_VSYNC_POL(x) (((x) & 0x1) << 7)
|
||||
#define G_0003C2_VGA_VSYNC_POL(x) (((x) >> 7) & 0x1)
|
||||
#define C_0003C2_VGA_VSYNC_POL 0x7F
|
||||
#define R_0003F8_CRTC2_GEN_CNTL 0x0003F8
|
||||
#define S_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) & 0x1) << 0)
|
||||
#define G_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) >> 0) & 0x1)
|
||||
|
@ -545,6 +563,46 @@
|
|||
#define S_000774_SCRATCH_ADDR(x) (((x) & 0x7FFFFFF) << 5)
|
||||
#define G_000774_SCRATCH_ADDR(x) (((x) >> 5) & 0x7FFFFFF)
|
||||
#define C_000774_SCRATCH_ADDR 0x0000001F
|
||||
#define R_0007C0_CP_STAT 0x0007C0
|
||||
#define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0)
|
||||
#define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1)
|
||||
#define C_0007C0_MRU_BUSY 0xFFFFFFFE
|
||||
#define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1)
|
||||
#define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1)
|
||||
#define C_0007C0_MWU_BUSY 0xFFFFFFFD
|
||||
#define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2)
|
||||
#define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1)
|
||||
#define C_0007C0_RSIU_BUSY 0xFFFFFFFB
|
||||
#define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3)
|
||||
#define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1)
|
||||
#define C_0007C0_RCIU_BUSY 0xFFFFFFF7
|
||||
#define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9)
|
||||
#define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1)
|
||||
#define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF
|
||||
#define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10)
|
||||
#define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF
|
||||
#define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11)
|
||||
#define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1)
|
||||
#define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF
|
||||
#define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12)
|
||||
#define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF
|
||||
#define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13)
|
||||
#define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1)
|
||||
#define C_0007C0_CSI_BUSY 0xFFFFDFFF
|
||||
#define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28)
|
||||
#define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1)
|
||||
#define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF
|
||||
#define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29)
|
||||
#define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1)
|
||||
#define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF
|
||||
#define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30)
|
||||
#define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1)
|
||||
#define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF
|
||||
#define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31)
|
||||
#define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1)
|
||||
#define C_0007C0_CP_BUSY 0x7FFFFFFF
|
||||
#define R_000E40_RBBM_STATUS 0x000E40
|
||||
#define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0)
|
||||
#define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F)
|
||||
|
@ -604,4 +662,53 @@
|
|||
#define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1)
|
||||
#define C_000E40_GUI_ACTIVE 0x7FFFFFFF
|
||||
|
||||
|
||||
#define R_00000D_SCLK_CNTL 0x00000D
|
||||
#define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0)
|
||||
#define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7)
|
||||
#define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8
|
||||
#define S_00000D_TCLK_SRC_SEL(x) (((x) & 0x7) << 8)
|
||||
#define G_00000D_TCLK_SRC_SEL(x) (((x) >> 8) & 0x7)
|
||||
#define C_00000D_TCLK_SRC_SEL 0xFFFFF8FF
|
||||
#define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16)
|
||||
#define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1)
|
||||
#define C_00000D_FORCE_CP 0xFFFEFFFF
|
||||
#define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17)
|
||||
#define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1)
|
||||
#define C_00000D_FORCE_HDP 0xFFFDFFFF
|
||||
#define S_00000D_FORCE_DISP(x) (((x) & 0x1) << 18)
|
||||
#define G_00000D_FORCE_DISP(x) (((x) >> 18) & 0x1)
|
||||
#define C_00000D_FORCE_DISP 0xFFFBFFFF
|
||||
#define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19)
|
||||
#define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1)
|
||||
#define C_00000D_FORCE_TOP 0xFFF7FFFF
|
||||
#define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20)
|
||||
#define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1)
|
||||
#define C_00000D_FORCE_E2 0xFFEFFFFF
|
||||
#define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21)
|
||||
#define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1)
|
||||
#define C_00000D_FORCE_SE 0xFFDFFFFF
|
||||
#define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22)
|
||||
#define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1)
|
||||
#define C_00000D_FORCE_IDCT 0xFFBFFFFF
|
||||
#define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23)
|
||||
#define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1)
|
||||
#define C_00000D_FORCE_VIP 0xFF7FFFFF
|
||||
#define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24)
|
||||
#define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1)
|
||||
#define C_00000D_FORCE_RE 0xFEFFFFFF
|
||||
#define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25)
|
||||
#define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1)
|
||||
#define C_00000D_FORCE_PB 0xFDFFFFFF
|
||||
#define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26)
|
||||
#define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1)
|
||||
#define C_00000D_FORCE_TAM 0xFBFFFFFF
|
||||
#define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27)
|
||||
#define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1)
|
||||
#define C_00000D_FORCE_TDM 0xF7FFFFFF
|
||||
#define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28)
|
||||
#define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1)
|
||||
#define C_00000D_FORCE_RB 0xEFFFFFFF
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -447,9 +447,8 @@ int r200_packet0_check(struct radeon_cs_parser *p,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int r200_init(struct radeon_device *rdev)
|
||||
void r200_set_safe_registers(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->config.r100.reg_safe_bm = r200_reg_safe_bm;
|
||||
rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r200_reg_safe_bm);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -33,43 +33,16 @@
|
|||
#include "radeon_drm.h"
|
||||
#include "r100_track.h"
|
||||
#include "r300d.h"
|
||||
|
||||
#include "rv350d.h"
|
||||
#include "r300_reg_safe.h"
|
||||
|
||||
/* r300,r350,rv350,rv370,rv380 depends on : */
|
||||
void r100_hdp_reset(struct radeon_device *rdev);
|
||||
int r100_cp_reset(struct radeon_device *rdev);
|
||||
int r100_rb2d_reset(struct radeon_device *rdev);
|
||||
int r100_cp_init(struct radeon_device *rdev, unsigned ring_size);
|
||||
int r100_pci_gart_enable(struct radeon_device *rdev);
|
||||
void r100_mc_setup(struct radeon_device *rdev);
|
||||
void r100_mc_disable_clients(struct radeon_device *rdev);
|
||||
int r100_gui_wait_for_idle(struct radeon_device *rdev);
|
||||
int r100_cs_packet_parse(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
unsigned idx);
|
||||
int r100_cs_packet_parse_vline(struct radeon_cs_parser *p);
|
||||
int r100_cs_parse_packet0(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
const unsigned *auth, unsigned n,
|
||||
radeon_packet0_check_t check);
|
||||
int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
struct radeon_object *robj);
|
||||
|
||||
/* This files gather functions specifics to:
|
||||
* r300,r350,rv350,rv370,rv380
|
||||
*
|
||||
* Some of these functions might be used by newer ASICs.
|
||||
*/
|
||||
void r300_gpu_init(struct radeon_device *rdev);
|
||||
int r300_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
|
||||
|
||||
/* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */
|
||||
|
||||
/*
|
||||
* rv370,rv380 PCIE GART
|
||||
*/
|
||||
static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
|
||||
|
||||
void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
|
@ -182,59 +155,6 @@ void rv370_pcie_gart_fini(struct radeon_device *rdev)
|
|||
radeon_gart_fini(rdev);
|
||||
}
|
||||
|
||||
/*
|
||||
* MC
|
||||
*/
|
||||
int r300_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (r100_debugfs_rbbm_init(rdev)) {
|
||||
DRM_ERROR("Failed to register debugfs file for RBBM !\n");
|
||||
}
|
||||
|
||||
r300_gpu_init(rdev);
|
||||
r100_pci_gart_disable(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCIE) {
|
||||
rv370_pcie_gart_disable(rdev);
|
||||
}
|
||||
|
||||
/* Setup GPU memory space */
|
||||
rdev->mc.vram_location = 0xFFFFFFFFUL;
|
||||
rdev->mc.gtt_location = 0xFFFFFFFFUL;
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
r = radeon_agp_init(rdev);
|
||||
if (r) {
|
||||
printk(KERN_WARNING "[drm] Disabling AGP\n");
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
|
||||
} else {
|
||||
rdev->mc.gtt_location = rdev->mc.agp_base;
|
||||
}
|
||||
}
|
||||
r = radeon_mc_setup(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Program GPU memory space */
|
||||
r100_mc_disable_clients(rdev);
|
||||
if (r300_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait MC idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
r100_mc_setup(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void r300_mc_fini(struct radeon_device *rdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Fence emission
|
||||
*/
|
||||
void r300_fence_ring_emit(struct radeon_device *rdev,
|
||||
struct radeon_fence *fence)
|
||||
{
|
||||
|
@ -260,10 +180,6 @@ void r300_fence_ring_emit(struct radeon_device *rdev,
|
|||
radeon_ring_write(rdev, RADEON_SW_INT_FIRE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Global GPU functions
|
||||
*/
|
||||
int r300_copy_dma(struct radeon_device *rdev,
|
||||
uint64_t src_offset,
|
||||
uint64_t dst_offset,
|
||||
|
@ -582,11 +498,6 @@ void r300_vram_info(struct radeon_device *rdev)
|
|||
r100_vram_init_sizes(rdev);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* PCIE Lanes
|
||||
*/
|
||||
|
||||
void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes)
|
||||
{
|
||||
uint32_t link_width_cntl, mask;
|
||||
|
@ -646,10 +557,6 @@ void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes)
|
|||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Debugfs info
|
||||
*/
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data)
|
||||
{
|
||||
|
@ -680,7 +587,7 @@ static struct drm_info_list rv370_pcie_gart_info_list[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
|
||||
static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
|
||||
{
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1);
|
||||
|
@ -689,10 +596,6 @@ int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
|
|||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CS functions
|
||||
*/
|
||||
static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
unsigned idx, unsigned reg)
|
||||
|
@ -1226,12 +1129,6 @@ void r300_set_reg_safe(struct radeon_device *rdev)
|
|||
rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm);
|
||||
}
|
||||
|
||||
int r300_init(struct radeon_device *rdev)
|
||||
{
|
||||
r300_set_reg_safe(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void r300_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
struct r100_mc_save save;
|
||||
|
@ -1265,3 +1162,198 @@ void r300_mc_program(struct radeon_device *rdev)
|
|||
S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16));
|
||||
r100_mc_resume(rdev, &save);
|
||||
}
|
||||
|
||||
void r300_clock_startup(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
if (radeon_dynclks != -1 && radeon_dynclks)
|
||||
radeon_legacy_set_clock_gating(rdev, 1);
|
||||
/* We need to force on some of the block */
|
||||
tmp = RREG32_PLL(R_00000D_SCLK_CNTL);
|
||||
tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1);
|
||||
if ((rdev->family == CHIP_RV350) || (rdev->family == CHIP_RV380))
|
||||
tmp |= S_00000D_FORCE_VAP(1);
|
||||
WREG32_PLL(R_00000D_SCLK_CNTL, tmp);
|
||||
}
|
||||
|
||||
static int r300_startup(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
r300_mc_program(rdev);
|
||||
/* Resume clock */
|
||||
r300_clock_startup(rdev);
|
||||
/* Initialize GPU configuration (# pipes, ...) */
|
||||
r300_gpu_init(rdev);
|
||||
/* Initialize GART (initialize after TTM so we can allocate
|
||||
* memory through TTM but finalize after TTM) */
|
||||
if (rdev->flags & RADEON_IS_PCIE) {
|
||||
r = rv370_pcie_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
if (rdev->flags & RADEON_IS_PCI) {
|
||||
r = r100_pci_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
r100_irq_set(rdev);
|
||||
/* 1M ring buffer */
|
||||
r = r100_cp_init(rdev, 1024 * 1024);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = r100_wb_init(rdev);
|
||||
if (r)
|
||||
dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
|
||||
r = r100_ib_init(rdev);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int r300_resume(struct radeon_device *rdev)
|
||||
{
|
||||
/* Make sur GART are not working */
|
||||
if (rdev->flags & RADEON_IS_PCIE)
|
||||
rv370_pcie_gart_disable(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_disable(rdev);
|
||||
/* Resume clock before doing reset */
|
||||
r300_clock_startup(rdev);
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_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->ddev);
|
||||
/* Resume clock after posting */
|
||||
r300_clock_startup(rdev);
|
||||
return r300_startup(rdev);
|
||||
}
|
||||
|
||||
int r300_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
r100_irq_disable(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCIE)
|
||||
rv370_pcie_gart_disable(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_disable(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void r300_fini(struct radeon_device *rdev)
|
||||
{
|
||||
r300_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCIE)
|
||||
rv370_pcie_gart_fini(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_object_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
}
|
||||
|
||||
int r300_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 */
|
||||
/* 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_gpu_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_card_posted(rdev) && rdev->bios) {
|
||||
DRM_INFO("GPU not posted. posting now...\n");
|
||||
radeon_combios_asic_init(rdev->ddev);
|
||||
}
|
||||
/* Set asic errata */
|
||||
r300_errata(rdev);
|
||||
/* Initialize clocks */
|
||||
radeon_get_clock_info(rdev->ddev);
|
||||
/* Get vram informations */
|
||||
r300_vram_info(rdev);
|
||||
/* Initialize memory controller (also test AGP) */
|
||||
r = r420_mc_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
if (rdev->flags & RADEON_IS_PCIE) {
|
||||
r = rv370_pcie_gart_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
if (rdev->flags & RADEON_IS_PCI) {
|
||||
r = r100_pci_gart_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
r300_set_reg_safe(rdev);
|
||||
rdev->accel_working = true;
|
||||
r = r300_startup(rdev);
|
||||
if (r) {
|
||||
/* Somethings want wront with the accel init stop accel */
|
||||
dev_err(rdev->dev, "Disabling GPU acceleration\n");
|
||||
r300_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCIE)
|
||||
rv370_pcie_gart_fini(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCI)
|
||||
r100_pci_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -96,6 +96,211 @@
|
|||
#define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0)
|
||||
#define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF)
|
||||
#define C_000170_AGP_BASE_ADDR 0x00000000
|
||||
#define R_0007C0_CP_STAT 0x0007C0
|
||||
#define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0)
|
||||
#define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1)
|
||||
#define C_0007C0_MRU_BUSY 0xFFFFFFFE
|
||||
#define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1)
|
||||
#define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1)
|
||||
#define C_0007C0_MWU_BUSY 0xFFFFFFFD
|
||||
#define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2)
|
||||
#define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1)
|
||||
#define C_0007C0_RSIU_BUSY 0xFFFFFFFB
|
||||
#define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3)
|
||||
#define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1)
|
||||
#define C_0007C0_RCIU_BUSY 0xFFFFFFF7
|
||||
#define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9)
|
||||
#define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1)
|
||||
#define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF
|
||||
#define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10)
|
||||
#define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF
|
||||
#define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11)
|
||||
#define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1)
|
||||
#define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF
|
||||
#define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12)
|
||||
#define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF
|
||||
#define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13)
|
||||
#define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1)
|
||||
#define C_0007C0_CSI_BUSY 0xFFFFDFFF
|
||||
#define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF
|
||||
#define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF
|
||||
#define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28)
|
||||
#define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1)
|
||||
#define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF
|
||||
#define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29)
|
||||
#define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1)
|
||||
#define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF
|
||||
#define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30)
|
||||
#define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1)
|
||||
#define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF
|
||||
#define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31)
|
||||
#define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1)
|
||||
#define C_0007C0_CP_BUSY 0x7FFFFFFF
|
||||
#define R_000E40_RBBM_STATUS 0x000E40
|
||||
#define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0)
|
||||
#define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F)
|
||||
#define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80
|
||||
#define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8)
|
||||
#define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1)
|
||||
#define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF
|
||||
#define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9)
|
||||
#define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1)
|
||||
#define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF
|
||||
#define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10)
|
||||
#define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1)
|
||||
#define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF
|
||||
#define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11)
|
||||
#define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1)
|
||||
#define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF
|
||||
#define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12)
|
||||
#define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1)
|
||||
#define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF
|
||||
#define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13)
|
||||
#define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1)
|
||||
#define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF
|
||||
#define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF
|
||||
#define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_000E40_ENG_EV_BUSY 0xFFFF7FFF
|
||||
#define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16)
|
||||
#define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1)
|
||||
#define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF
|
||||
#define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17)
|
||||
#define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1)
|
||||
#define C_000E40_E2_BUSY 0xFFFDFFFF
|
||||
#define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18)
|
||||
#define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1)
|
||||
#define C_000E40_RB2D_BUSY 0xFFFBFFFF
|
||||
#define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19)
|
||||
#define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1)
|
||||
#define C_000E40_RB3D_BUSY 0xFFF7FFFF
|
||||
#define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20)
|
||||
#define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1)
|
||||
#define C_000E40_VAP_BUSY 0xFFEFFFFF
|
||||
#define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21)
|
||||
#define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1)
|
||||
#define C_000E40_RE_BUSY 0xFFDFFFFF
|
||||
#define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22)
|
||||
#define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1)
|
||||
#define C_000E40_TAM_BUSY 0xFFBFFFFF
|
||||
#define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23)
|
||||
#define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1)
|
||||
#define C_000E40_TDM_BUSY 0xFF7FFFFF
|
||||
#define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24)
|
||||
#define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1)
|
||||
#define C_000E40_PB_BUSY 0xFEFFFFFF
|
||||
#define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25)
|
||||
#define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1)
|
||||
#define C_000E40_TIM_BUSY 0xFDFFFFFF
|
||||
#define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26)
|
||||
#define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1)
|
||||
#define C_000E40_GA_BUSY 0xFBFFFFFF
|
||||
#define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27)
|
||||
#define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1)
|
||||
#define C_000E40_CBA2D_BUSY 0xF7FFFFFF
|
||||
#define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31)
|
||||
#define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1)
|
||||
#define C_000E40_GUI_ACTIVE 0x7FFFFFFF
|
||||
|
||||
|
||||
#define R_00000D_SCLK_CNTL 0x00000D
|
||||
#define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0)
|
||||
#define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7)
|
||||
#define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8
|
||||
#define S_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 3)
|
||||
#define G_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) >> 3) & 0x1)
|
||||
#define C_00000D_CP_MAX_DYN_STOP_LAT 0xFFFFFFF7
|
||||
#define S_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 4)
|
||||
#define G_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) >> 4) & 0x1)
|
||||
#define C_00000D_HDP_MAX_DYN_STOP_LAT 0xFFFFFFEF
|
||||
#define S_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 5)
|
||||
#define G_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) >> 5) & 0x1)
|
||||
#define C_00000D_TV_MAX_DYN_STOP_LAT 0xFFFFFFDF
|
||||
#define S_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 6)
|
||||
#define G_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) >> 6) & 0x1)
|
||||
#define C_00000D_E2_MAX_DYN_STOP_LAT 0xFFFFFFBF
|
||||
#define S_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 7)
|
||||
#define G_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) >> 7) & 0x1)
|
||||
#define C_00000D_SE_MAX_DYN_STOP_LAT 0xFFFFFF7F
|
||||
#define S_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 8)
|
||||
#define G_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) >> 8) & 0x1)
|
||||
#define C_00000D_IDCT_MAX_DYN_STOP_LAT 0xFFFFFEFF
|
||||
#define S_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 9)
|
||||
#define G_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) >> 9) & 0x1)
|
||||
#define C_00000D_VIP_MAX_DYN_STOP_LAT 0xFFFFFDFF
|
||||
#define S_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 10)
|
||||
#define G_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) >> 10) & 0x1)
|
||||
#define C_00000D_RE_MAX_DYN_STOP_LAT 0xFFFFFBFF
|
||||
#define S_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 11)
|
||||
#define G_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) >> 11) & 0x1)
|
||||
#define C_00000D_PB_MAX_DYN_STOP_LAT 0xFFFFF7FF
|
||||
#define S_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 12)
|
||||
#define G_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) >> 12) & 0x1)
|
||||
#define C_00000D_TAM_MAX_DYN_STOP_LAT 0xFFFFEFFF
|
||||
#define S_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 13)
|
||||
#define G_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) >> 13) & 0x1)
|
||||
#define C_00000D_TDM_MAX_DYN_STOP_LAT 0xFFFFDFFF
|
||||
#define S_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 14)
|
||||
#define G_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) >> 14) & 0x1)
|
||||
#define C_00000D_RB_MAX_DYN_STOP_LAT 0xFFFFBFFF
|
||||
#define S_00000D_FORCE_DISP2(x) (((x) & 0x1) << 15)
|
||||
#define G_00000D_FORCE_DISP2(x) (((x) >> 15) & 0x1)
|
||||
#define C_00000D_FORCE_DISP2 0xFFFF7FFF
|
||||
#define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16)
|
||||
#define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1)
|
||||
#define C_00000D_FORCE_CP 0xFFFEFFFF
|
||||
#define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17)
|
||||
#define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1)
|
||||
#define C_00000D_FORCE_HDP 0xFFFDFFFF
|
||||
#define S_00000D_FORCE_DISP1(x) (((x) & 0x1) << 18)
|
||||
#define G_00000D_FORCE_DISP1(x) (((x) >> 18) & 0x1)
|
||||
#define C_00000D_FORCE_DISP1 0xFFFBFFFF
|
||||
#define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19)
|
||||
#define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1)
|
||||
#define C_00000D_FORCE_TOP 0xFFF7FFFF
|
||||
#define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20)
|
||||
#define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1)
|
||||
#define C_00000D_FORCE_E2 0xFFEFFFFF
|
||||
#define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21)
|
||||
#define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1)
|
||||
#define C_00000D_FORCE_SE 0xFFDFFFFF
|
||||
#define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22)
|
||||
#define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1)
|
||||
#define C_00000D_FORCE_IDCT 0xFFBFFFFF
|
||||
#define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23)
|
||||
#define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1)
|
||||
#define C_00000D_FORCE_VIP 0xFF7FFFFF
|
||||
#define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24)
|
||||
#define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1)
|
||||
#define C_00000D_FORCE_RE 0xFEFFFFFF
|
||||
#define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25)
|
||||
#define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1)
|
||||
#define C_00000D_FORCE_PB 0xFDFFFFFF
|
||||
#define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26)
|
||||
#define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1)
|
||||
#define C_00000D_FORCE_TAM 0xFBFFFFFF
|
||||
#define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27)
|
||||
#define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1)
|
||||
#define C_00000D_FORCE_TDM 0xF7FFFFFF
|
||||
#define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28)
|
||||
#define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1)
|
||||
#define C_00000D_FORCE_RB 0xEFFFFFFF
|
||||
#define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29)
|
||||
#define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1)
|
||||
#define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF
|
||||
#define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30)
|
||||
#define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1)
|
||||
#define C_00000D_FORCE_SUBPIC 0xBFFFFFFF
|
||||
#define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31)
|
||||
#define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1)
|
||||
#define C_00000D_FORCE_OV0 0x7FFFFFFF
|
||||
|
||||
#endif
|
||||
|
|
|
@ -155,6 +155,9 @@ static void r420_debugfs(struct radeon_device *rdev)
|
|||
static void r420_clock_resume(struct radeon_device *rdev)
|
||||
{
|
||||
u32 sclk_cntl;
|
||||
|
||||
if (radeon_dynclks != -1 && radeon_dynclks)
|
||||
radeon_atom_set_clock_gating(rdev, 1);
|
||||
sclk_cntl = RREG32_PLL(R_00000D_SCLK_CNTL);
|
||||
sclk_cntl |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1);
|
||||
if (rdev->family == CHIP_R420)
|
||||
|
@ -167,6 +170,8 @@ static int r420_startup(struct radeon_device *rdev)
|
|||
int r;
|
||||
|
||||
r300_mc_program(rdev);
|
||||
/* Resume clock */
|
||||
r420_clock_resume(rdev);
|
||||
/* Initialize GART (initialize after TTM so we can allocate
|
||||
* memory through TTM but finalize after TTM) */
|
||||
if (rdev->flags & RADEON_IS_PCIE) {
|
||||
|
@ -267,7 +272,6 @@ int r420_init(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
rdev->new_init_path = true;
|
||||
/* Initialize scratch registers */
|
||||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
|
|
|
@ -212,9 +212,9 @@
|
|||
#define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20)
|
||||
#define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1)
|
||||
#define C_00000D_FORCE_E2 0xFFEFFFFF
|
||||
#define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21)
|
||||
#define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1)
|
||||
#define C_00000D_FORCE_SE 0xFFDFFFFF
|
||||
#define S_00000D_FORCE_VAP(x) (((x) & 0x1) << 21)
|
||||
#define G_00000D_FORCE_VAP(x) (((x) >> 21) & 0x1)
|
||||
#define C_00000D_FORCE_VAP 0xFFDFFFFF
|
||||
#define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22)
|
||||
#define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1)
|
||||
#define C_00000D_FORCE_IDCT 0xFFBFFFFF
|
||||
|
@ -224,24 +224,24 @@
|
|||
#define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24)
|
||||
#define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1)
|
||||
#define C_00000D_FORCE_RE 0xFEFFFFFF
|
||||
#define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25)
|
||||
#define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1)
|
||||
#define C_00000D_FORCE_PB 0xFDFFFFFF
|
||||
#define S_00000D_FORCE_SR(x) (((x) & 0x1) << 25)
|
||||
#define G_00000D_FORCE_SR(x) (((x) >> 25) & 0x1)
|
||||
#define C_00000D_FORCE_SR 0xFDFFFFFF
|
||||
#define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26)
|
||||
#define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1)
|
||||
#define C_00000D_FORCE_PX 0xFBFFFFFF
|
||||
#define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27)
|
||||
#define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1)
|
||||
#define C_00000D_FORCE_TX 0xF7FFFFFF
|
||||
#define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28)
|
||||
#define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1)
|
||||
#define C_00000D_FORCE_RB 0xEFFFFFFF
|
||||
#define S_00000D_FORCE_US(x) (((x) & 0x1) << 28)
|
||||
#define G_00000D_FORCE_US(x) (((x) >> 28) & 0x1)
|
||||
#define C_00000D_FORCE_US 0xEFFFFFFF
|
||||
#define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29)
|
||||
#define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1)
|
||||
#define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF
|
||||
#define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30)
|
||||
#define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1)
|
||||
#define C_00000D_FORCE_SUBPIC 0xBFFFFFFF
|
||||
#define S_00000D_FORCE_SU(x) (((x) & 0x1) << 30)
|
||||
#define G_00000D_FORCE_SU(x) (((x) >> 30) & 0x1)
|
||||
#define C_00000D_FORCE_SU 0xBFFFFFFF
|
||||
#define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31)
|
||||
#define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1)
|
||||
#define C_00000D_FORCE_OV0 0x7FFFFFFF
|
||||
|
|
|
@ -186,7 +186,7 @@ static int r520_startup(struct radeon_device *rdev)
|
|||
}
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
r100_irq_set(rdev);
|
||||
rs600_irq_set(rdev);
|
||||
/* 1M ring buffer */
|
||||
r = r100_cp_init(rdev, 1024 * 1024);
|
||||
if (r) {
|
||||
|
@ -228,7 +228,6 @@ int r520_init(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
rdev->new_init_path = true;
|
||||
/* Initialize scratch registers */
|
||||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
|
|
|
@ -65,16 +65,11 @@ MODULE_FIRMWARE("radeon/RV710_me.bin");
|
|||
|
||||
int r600_debugfs_mc_info_init(struct radeon_device *rdev);
|
||||
|
||||
/* This files gather functions specifics to:
|
||||
* r600,rv610,rv630,rv620,rv635,rv670
|
||||
*
|
||||
* Some of these functions might be used by newer ASICs.
|
||||
*/
|
||||
/* r600,rv610,rv630,rv620,rv635,rv670 */
|
||||
int r600_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
void r600_gpu_init(struct radeon_device *rdev);
|
||||
void r600_fini(struct radeon_device *rdev);
|
||||
|
||||
|
||||
/*
|
||||
* R600 PCIE GART
|
||||
*/
|
||||
|
@ -168,7 +163,7 @@ int r600_pcie_gart_enable(struct radeon_device *rdev)
|
|||
WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
|
||||
WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
|
||||
WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
|
||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
|
||||
|
@ -225,6 +220,40 @@ void r600_pcie_gart_fini(struct radeon_device *rdev)
|
|||
radeon_gart_fini(rdev);
|
||||
}
|
||||
|
||||
void r600_agp_enable(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
int i;
|
||||
|
||||
/* Setup L2 cache */
|
||||
WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
|
||||
ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
|
||||
EFFECTIVE_L2_QUEUE_SIZE(7));
|
||||
WREG32(VM_L2_CNTL2, 0);
|
||||
WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1));
|
||||
/* Setup TLB control */
|
||||
tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
|
||||
SYSTEM_ACCESS_MODE_NOT_IN_SYS |
|
||||
EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) |
|
||||
ENABLE_WAIT_L2_QUERY;
|
||||
WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING);
|
||||
WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp);
|
||||
WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
|
||||
WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE);
|
||||
for (i = 0; i < 7; i++)
|
||||
WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
|
||||
}
|
||||
|
||||
int r600_mc_wait_for_idle(struct radeon_device *rdev)
|
||||
{
|
||||
unsigned i;
|
||||
|
@ -240,14 +269,9 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static void r600_mc_resume(struct radeon_device *rdev)
|
||||
static void r600_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
u32 d1vga_control, d2vga_control;
|
||||
u32 vga_render_control, vga_hdp_control;
|
||||
u32 d1crtc_control, d2crtc_control;
|
||||
u32 new_d1grph_primary, new_d1grph_secondary;
|
||||
u32 new_d2grph_primary, new_d2grph_secondary;
|
||||
u64 old_vram_start;
|
||||
struct rv515_mc_save save;
|
||||
u32 tmp;
|
||||
int i, j;
|
||||
|
||||
|
@ -261,85 +285,51 @@ static void r600_mc_resume(struct radeon_device *rdev)
|
|||
}
|
||||
WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
|
||||
|
||||
d1vga_control = RREG32(D1VGA_CONTROL);
|
||||
d2vga_control = RREG32(D2VGA_CONTROL);
|
||||
vga_render_control = RREG32(VGA_RENDER_CONTROL);
|
||||
vga_hdp_control = RREG32(VGA_HDP_CONTROL);
|
||||
d1crtc_control = RREG32(D1CRTC_CONTROL);
|
||||
d2crtc_control = RREG32(D2CRTC_CONTROL);
|
||||
old_vram_start = (u64)(RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24;
|
||||
new_d1grph_primary = RREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS);
|
||||
new_d1grph_secondary = RREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS);
|
||||
new_d1grph_primary += rdev->mc.vram_start - old_vram_start;
|
||||
new_d1grph_secondary += rdev->mc.vram_start - old_vram_start;
|
||||
new_d2grph_primary = RREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS);
|
||||
new_d2grph_secondary = RREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS);
|
||||
new_d2grph_primary += rdev->mc.vram_start - old_vram_start;
|
||||
new_d2grph_secondary += rdev->mc.vram_start - old_vram_start;
|
||||
|
||||
/* Stop all video */
|
||||
WREG32(D1VGA_CONTROL, 0);
|
||||
WREG32(D2VGA_CONTROL, 0);
|
||||
WREG32(VGA_RENDER_CONTROL, 0);
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D1CRTC_CONTROL, 0);
|
||||
WREG32(D2CRTC_CONTROL, 0);
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 0);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 0);
|
||||
|
||||
mdelay(1);
|
||||
rv515_mc_stop(rdev, &save);
|
||||
if (r600_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "[drm] MC not idle !\n");
|
||||
dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
|
||||
}
|
||||
|
||||
/* Lockout access through VGA aperture*/
|
||||
/* Lockout access through VGA aperture (doesn't exist before R600) */
|
||||
WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
|
||||
|
||||
/* Update configuration */
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12);
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
if (rdev->mc.vram_start < rdev->mc.gtt_start) {
|
||||
/* VRAM before AGP */
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
|
||||
rdev->mc.vram_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
|
||||
rdev->mc.gtt_end >> 12);
|
||||
} else {
|
||||
/* VRAM after AGP */
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
|
||||
rdev->mc.gtt_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
|
||||
rdev->mc.vram_end >> 12);
|
||||
}
|
||||
} else {
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end >> 12);
|
||||
}
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0);
|
||||
tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16;
|
||||
tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
|
||||
tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
|
||||
WREG32(MC_VM_FB_LOCATION, tmp);
|
||||
WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
|
||||
WREG32(HDP_NONSURFACE_INFO, (2 << 7));
|
||||
WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF);
|
||||
WREG32(HDP_NONSURFACE_SIZE, rdev->mc.mc_vram_size | 0x3FF);
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16);
|
||||
WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
|
||||
WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22);
|
||||
WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22);
|
||||
WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
|
||||
} else {
|
||||
WREG32(MC_VM_AGP_BASE, 0);
|
||||
WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
|
||||
WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
|
||||
}
|
||||
WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS, new_d1grph_primary);
|
||||
WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS, new_d1grph_secondary);
|
||||
WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS, new_d2grph_primary);
|
||||
WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS, new_d2grph_secondary);
|
||||
WREG32(VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start);
|
||||
|
||||
/* Unlock host access */
|
||||
WREG32(VGA_HDP_CONTROL, vga_hdp_control);
|
||||
|
||||
mdelay(1);
|
||||
if (r600_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "[drm] MC not idle !\n");
|
||||
dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
|
||||
}
|
||||
|
||||
/* Restore video state */
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D1CRTC_CONTROL, d1crtc_control);
|
||||
WREG32(D2CRTC_CONTROL, d2crtc_control);
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 0);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 0);
|
||||
WREG32(D1VGA_CONTROL, d1vga_control);
|
||||
WREG32(D2VGA_CONTROL, d2vga_control);
|
||||
WREG32(VGA_RENDER_CONTROL, vga_render_control);
|
||||
|
||||
rv515_mc_resume(rdev, &save);
|
||||
/* we need to own VRAM, so turn off the VGA renderer here
|
||||
* to stop it overwriting our objects */
|
||||
rv515_vga_render_disable(rdev);
|
||||
|
@ -445,9 +435,9 @@ int r600_mc_init(struct radeon_device *rdev)
|
|||
}
|
||||
}
|
||||
rdev->mc.vram_start = rdev->mc.vram_location;
|
||||
rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size;
|
||||
rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
|
||||
rdev->mc.gtt_start = rdev->mc.gtt_location;
|
||||
rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size;
|
||||
rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
|
||||
/* FIXME: we should enforce default clock in case GPU is not in
|
||||
* default setup
|
||||
*/
|
||||
|
@ -463,6 +453,7 @@ int r600_mc_init(struct radeon_device *rdev)
|
|||
*/
|
||||
int r600_gpu_soft_reset(struct radeon_device *rdev)
|
||||
{
|
||||
struct rv515_mc_save save;
|
||||
u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) |
|
||||
S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) |
|
||||
S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) |
|
||||
|
@ -480,13 +471,25 @@ int r600_gpu_soft_reset(struct radeon_device *rdev)
|
|||
S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) |
|
||||
S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1);
|
||||
u32 srbm_reset = 0;
|
||||
u32 tmp;
|
||||
|
||||
dev_info(rdev->dev, "GPU softreset \n");
|
||||
dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n",
|
||||
RREG32(R_008010_GRBM_STATUS));
|
||||
dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n",
|
||||
RREG32(R_008014_GRBM_STATUS2));
|
||||
dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n",
|
||||
RREG32(R_000E50_SRBM_STATUS));
|
||||
rv515_mc_stop(rdev, &save);
|
||||
if (r600_mc_wait_for_idle(rdev)) {
|
||||
dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
|
||||
}
|
||||
/* Disable CP parsing/prefetching */
|
||||
WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(0xff));
|
||||
/* Check if any of the rendering block is busy and reset it */
|
||||
if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) ||
|
||||
(RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) {
|
||||
WREG32(R_008020_GRBM_SOFT_RESET, S_008020_SOFT_RESET_CR(1) |
|
||||
tmp = S_008020_SOFT_RESET_CR(1) |
|
||||
S_008020_SOFT_RESET_DB(1) |
|
||||
S_008020_SOFT_RESET_CB(1) |
|
||||
S_008020_SOFT_RESET_PA(1) |
|
||||
|
@ -498,14 +501,18 @@ int r600_gpu_soft_reset(struct radeon_device *rdev)
|
|||
S_008020_SOFT_RESET_TC(1) |
|
||||
S_008020_SOFT_RESET_TA(1) |
|
||||
S_008020_SOFT_RESET_VC(1) |
|
||||
S_008020_SOFT_RESET_VGT(1));
|
||||
S_008020_SOFT_RESET_VGT(1);
|
||||
dev_info(rdev->dev, " R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp);
|
||||
WREG32(R_008020_GRBM_SOFT_RESET, tmp);
|
||||
(void)RREG32(R_008020_GRBM_SOFT_RESET);
|
||||
udelay(50);
|
||||
WREG32(R_008020_GRBM_SOFT_RESET, 0);
|
||||
(void)RREG32(R_008020_GRBM_SOFT_RESET);
|
||||
}
|
||||
/* Reset CP (we always reset CP) */
|
||||
WREG32(R_008020_GRBM_SOFT_RESET, S_008020_SOFT_RESET_CP(1));
|
||||
tmp = S_008020_SOFT_RESET_CP(1);
|
||||
dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp);
|
||||
WREG32(R_008020_GRBM_SOFT_RESET, tmp);
|
||||
(void)RREG32(R_008020_GRBM_SOFT_RESET);
|
||||
udelay(50);
|
||||
WREG32(R_008020_GRBM_SOFT_RESET, 0);
|
||||
|
@ -533,6 +540,14 @@ int r600_gpu_soft_reset(struct radeon_device *rdev)
|
|||
srbm_reset |= S_000E60_SOFT_RESET_RLC(1);
|
||||
if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS)))
|
||||
srbm_reset |= S_000E60_SOFT_RESET_SEM(1);
|
||||
if (G_000E50_BIF_BUSY(RREG32(R_000E50_SRBM_STATUS)))
|
||||
srbm_reset |= S_000E60_SOFT_RESET_BIF(1);
|
||||
dev_info(rdev->dev, " R_000E60_SRBM_SOFT_RESET=0x%08X\n", srbm_reset);
|
||||
WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset);
|
||||
(void)RREG32(R_000E60_SRBM_SOFT_RESET);
|
||||
udelay(50);
|
||||
WREG32(R_000E60_SRBM_SOFT_RESET, 0);
|
||||
(void)RREG32(R_000E60_SRBM_SOFT_RESET);
|
||||
WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset);
|
||||
(void)RREG32(R_000E60_SRBM_SOFT_RESET);
|
||||
udelay(50);
|
||||
|
@ -540,6 +555,17 @@ int r600_gpu_soft_reset(struct radeon_device *rdev)
|
|||
(void)RREG32(R_000E60_SRBM_SOFT_RESET);
|
||||
/* Wait a little for things to settle down */
|
||||
udelay(50);
|
||||
dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n",
|
||||
RREG32(R_008010_GRBM_STATUS));
|
||||
dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n",
|
||||
RREG32(R_008014_GRBM_STATUS2));
|
||||
dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n",
|
||||
RREG32(R_000E50_SRBM_STATUS));
|
||||
/* After reset we need to reinit the asic as GPU often endup in an
|
||||
* incoherent state.
|
||||
*/
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
rv515_mc_resume(rdev, &save);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1350,32 +1376,47 @@ int r600_ring_test(struct radeon_device *rdev)
|
|||
return r;
|
||||
}
|
||||
|
||||
/*
|
||||
* Writeback
|
||||
*/
|
||||
int r600_wb_init(struct radeon_device *rdev)
|
||||
void r600_wb_disable(struct radeon_device *rdev)
|
||||
{
|
||||
WREG32(SCRATCH_UMSK, 0);
|
||||
if (rdev->wb.wb_obj) {
|
||||
radeon_object_kunmap(rdev->wb.wb_obj);
|
||||
radeon_object_unpin(rdev->wb.wb_obj);
|
||||
}
|
||||
}
|
||||
|
||||
void r600_wb_fini(struct radeon_device *rdev)
|
||||
{
|
||||
r600_wb_disable(rdev);
|
||||
if (rdev->wb.wb_obj) {
|
||||
radeon_object_unref(&rdev->wb.wb_obj);
|
||||
rdev->wb.wb = NULL;
|
||||
rdev->wb.wb_obj = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
int r600_wb_enable(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (rdev->wb.wb_obj == NULL) {
|
||||
r = radeon_object_create(rdev, NULL, 4096,
|
||||
true,
|
||||
RADEON_GEM_DOMAIN_GTT,
|
||||
false, &rdev->wb.wb_obj);
|
||||
r = radeon_object_create(rdev, NULL, 4096, true,
|
||||
RADEON_GEM_DOMAIN_GTT, false, &rdev->wb.wb_obj);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failed to create WB buffer (%d).\n", r);
|
||||
dev_warn(rdev->dev, "failed to create WB buffer (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = radeon_object_pin(rdev->wb.wb_obj,
|
||||
RADEON_GEM_DOMAIN_GTT,
|
||||
&rdev->wb.gpu_addr);
|
||||
r = radeon_object_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
|
||||
&rdev->wb.gpu_addr);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failed to pin WB buffer (%d).\n", r);
|
||||
dev_warn(rdev->dev, "failed to pin WB buffer (%d).\n", r);
|
||||
r600_wb_fini(rdev);
|
||||
return r;
|
||||
}
|
||||
r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failed to map WB buffer (%d).\n", r);
|
||||
dev_warn(rdev->dev, "failed to map WB buffer (%d).\n", r);
|
||||
r600_wb_fini(rdev);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
|
@ -1386,21 +1427,6 @@ int r600_wb_init(struct radeon_device *rdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void r600_wb_fini(struct radeon_device *rdev)
|
||||
{
|
||||
if (rdev->wb.wb_obj) {
|
||||
radeon_object_kunmap(rdev->wb.wb_obj);
|
||||
radeon_object_unpin(rdev->wb.wb_obj);
|
||||
radeon_object_unref(&rdev->wb.wb_obj);
|
||||
rdev->wb.wb = NULL;
|
||||
rdev->wb.wb_obj = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* CS
|
||||
*/
|
||||
void r600_fence_ring_emit(struct radeon_device *rdev,
|
||||
struct radeon_fence *fence)
|
||||
{
|
||||
|
@ -1477,11 +1503,14 @@ int r600_startup(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
r600_gpu_reset(rdev);
|
||||
r600_mc_resume(rdev);
|
||||
r = r600_pcie_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r600_mc_program(rdev);
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
r600_agp_enable(rdev);
|
||||
} else {
|
||||
r = r600_pcie_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
r600_gpu_init(rdev);
|
||||
|
||||
r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
|
||||
|
@ -1500,9 +1529,8 @@ int r600_startup(struct radeon_device *rdev)
|
|||
r = r600_cp_resume(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = r600_wb_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* write back buffer are not vital so don't worry about failure */
|
||||
r600_wb_enable(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1524,15 +1552,12 @@ int r600_resume(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
if (radeon_gpu_reset(rdev)) {
|
||||
/* FIXME: what do we want to do here ? */
|
||||
}
|
||||
/* Do not reset GPU before posting, on r600 hw unlike on r500 hw,
|
||||
* posting will perform necessary task to bring back GPU into good
|
||||
* shape.
|
||||
*/
|
||||
/* post card */
|
||||
if (rdev->is_atom_bios) {
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
} else {
|
||||
radeon_combios_asic_init(rdev->ddev);
|
||||
}
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
/* Initialize clocks */
|
||||
r = radeon_clocks_init(rdev);
|
||||
if (r) {
|
||||
|
@ -1545,7 +1570,7 @@ int r600_resume(struct radeon_device *rdev)
|
|||
return r;
|
||||
}
|
||||
|
||||
r = radeon_ib_test(rdev);
|
||||
r = r600_ib_test(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failled testing IB (%d).\n", r);
|
||||
return r;
|
||||
|
@ -1553,13 +1578,12 @@ int r600_resume(struct radeon_device *rdev)
|
|||
return r;
|
||||
}
|
||||
|
||||
|
||||
int r600_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
/* FIXME: we should wait for ring to be empty */
|
||||
r600_cp_stop(rdev);
|
||||
rdev->cp.ready = false;
|
||||
|
||||
r600_wb_disable(rdev);
|
||||
r600_pcie_gart_disable(rdev);
|
||||
/* unpin shaders bo */
|
||||
radeon_object_unpin(rdev->r600_blit.shader_obj);
|
||||
|
@ -1576,7 +1600,6 @@ int r600_init(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
rdev->new_init_path = true;
|
||||
r = radeon_dummy_page_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
@ -1593,8 +1616,10 @@ int r600_init(struct radeon_device *rdev)
|
|||
return -EINVAL;
|
||||
}
|
||||
/* Must be an ATOMBIOS */
|
||||
if (!rdev->is_atom_bios)
|
||||
if (!rdev->is_atom_bios) {
|
||||
dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
r = radeon_atombios_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
@ -1616,15 +1641,8 @@ int r600_init(struct radeon_device *rdev)
|
|||
if (r)
|
||||
return r;
|
||||
r = r600_mc_init(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
r600_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return r600_init(rdev);
|
||||
}
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
|
@ -1653,12 +1671,10 @@ int r600_init(struct radeon_device *rdev)
|
|||
|
||||
r = r600_startup(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
r600_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return r600_init(rdev);
|
||||
}
|
||||
r600_suspend(rdev);
|
||||
r600_wb_fini(rdev);
|
||||
radeon_ring_fini(rdev);
|
||||
r600_pcie_gart_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
if (rdev->accel_working) {
|
||||
|
@ -1667,7 +1683,7 @@ int r600_init(struct radeon_device *rdev)
|
|||
DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
r = radeon_ib_test(rdev);
|
||||
r = r600_ib_test(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failled testing IB (%d).\n", r);
|
||||
rdev->accel_working = false;
|
||||
|
@ -1683,19 +1699,15 @@ void r600_fini(struct radeon_device *rdev)
|
|||
|
||||
r600_blit_fini(rdev);
|
||||
radeon_ring_fini(rdev);
|
||||
r600_wb_fini(rdev);
|
||||
r600_pcie_gart_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_clocks_fini(rdev);
|
||||
#if __OS_HAS_AGP
|
||||
if (rdev->flags & RADEON_IS_AGP)
|
||||
radeon_agp_fini(rdev);
|
||||
#endif
|
||||
radeon_object_fini(rdev);
|
||||
if (rdev->is_atom_bios)
|
||||
radeon_atombios_fini(rdev);
|
||||
else
|
||||
radeon_combios_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
radeon_dummy_page_fini(rdev);
|
||||
|
|
|
@ -582,8 +582,6 @@ r600_blit_copy(struct drm_device *dev,
|
|||
u64 vb_addr;
|
||||
u32 *vb;
|
||||
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
|
||||
if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) {
|
||||
max_bytes = 8192;
|
||||
|
||||
|
@ -619,8 +617,8 @@ r600_blit_copy(struct drm_device *dev,
|
|||
if (!dev_priv->blit_vb)
|
||||
return;
|
||||
set_shaders(dev);
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
}
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
|
||||
vb[0] = i2f(dst_x);
|
||||
vb[1] = 0;
|
||||
|
@ -708,8 +706,8 @@ r600_blit_copy(struct drm_device *dev,
|
|||
return;
|
||||
|
||||
set_shaders(dev);
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
}
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
|
||||
vb[0] = i2f(dst_x / 4);
|
||||
vb[1] = 0;
|
||||
|
@ -777,8 +775,6 @@ r600_blit_swap(struct drm_device *dev,
|
|||
u64 vb_addr;
|
||||
u32 *vb;
|
||||
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
|
||||
if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) {
|
||||
|
||||
r600_nomm_put_vb(dev);
|
||||
|
@ -787,8 +783,8 @@ r600_blit_swap(struct drm_device *dev,
|
|||
return;
|
||||
|
||||
set_shaders(dev);
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
}
|
||||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
|
||||
if (cpp == 4) {
|
||||
cb_format = COLOR_8_8_8_8;
|
||||
|
|
|
@ -610,7 +610,6 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
|
|||
|
||||
DRM_DEBUG("emitting copy %16llx %16llx %d %d\n", src_gpu_addr, dst_gpu_addr,
|
||||
size_bytes, rdev->r600_blit.vb_used);
|
||||
vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used);
|
||||
if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) {
|
||||
max_bytes = 8192;
|
||||
|
||||
|
@ -653,6 +652,7 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
|
|||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
#endif
|
||||
}
|
||||
vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used);
|
||||
|
||||
vb[0] = i2f(dst_x);
|
||||
vb[1] = 0;
|
||||
|
@ -747,6 +747,7 @@ void r600_kms_blit_copy(struct radeon_device *rdev,
|
|||
vb = r600_nomm_get_vb_ptr(dev);
|
||||
}
|
||||
#endif
|
||||
vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used);
|
||||
|
||||
vb[0] = i2f(dst_x / 4);
|
||||
vb[1] = 0;
|
||||
|
|
|
@ -252,7 +252,7 @@ static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p)
|
|||
|
||||
header = radeon_get_ib_value(p, h_idx);
|
||||
crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1);
|
||||
reg = header >> 2;
|
||||
reg = CP_PACKET0_GET_REG(header);
|
||||
mutex_lock(&p->rdev->ddev->mode_config.mutex);
|
||||
obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC);
|
||||
if (!obj) {
|
||||
|
|
|
@ -643,6 +643,7 @@
|
|||
#define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1)
|
||||
#define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1)
|
||||
#define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1)
|
||||
#define G_000E50_BIF_BUSY(x) (((x) >> 29) & 1)
|
||||
#define R_000E60_SRBM_SOFT_RESET 0x0E60
|
||||
#define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1)
|
||||
#define S_000E60_SOFT_RESET_CG(x) (((x) & 1) << 2)
|
||||
|
|
|
@ -590,18 +590,8 @@ struct radeon_asic {
|
|||
void (*fini)(struct radeon_device *rdev);
|
||||
int (*resume)(struct radeon_device *rdev);
|
||||
int (*suspend)(struct radeon_device *rdev);
|
||||
void (*errata)(struct radeon_device *rdev);
|
||||
void (*vram_info)(struct radeon_device *rdev);
|
||||
void (*vga_set_state)(struct radeon_device *rdev, bool state);
|
||||
int (*gpu_reset)(struct radeon_device *rdev);
|
||||
int (*mc_init)(struct radeon_device *rdev);
|
||||
void (*mc_fini)(struct radeon_device *rdev);
|
||||
int (*wb_init)(struct radeon_device *rdev);
|
||||
void (*wb_fini)(struct radeon_device *rdev);
|
||||
int (*gart_init)(struct radeon_device *rdev);
|
||||
void (*gart_fini)(struct radeon_device *rdev);
|
||||
int (*gart_enable)(struct radeon_device *rdev);
|
||||
void (*gart_disable)(struct radeon_device *rdev);
|
||||
void (*gart_tlb_flush)(struct radeon_device *rdev);
|
||||
int (*gart_set_page)(struct radeon_device *rdev, int i, uint64_t addr);
|
||||
int (*cp_init)(struct radeon_device *rdev, unsigned ring_size);
|
||||
|
@ -611,7 +601,6 @@ struct radeon_asic {
|
|||
void (*ring_start)(struct radeon_device *rdev);
|
||||
int (*ring_test)(struct radeon_device *rdev);
|
||||
void (*ring_ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib);
|
||||
int (*ib_test)(struct radeon_device *rdev);
|
||||
int (*irq_set)(struct radeon_device *rdev);
|
||||
int (*irq_process)(struct radeon_device *rdev);
|
||||
u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc);
|
||||
|
@ -789,7 +778,6 @@ struct radeon_device {
|
|||
bool shutdown;
|
||||
bool suspend;
|
||||
bool need_dma32;
|
||||
bool new_init_path;
|
||||
bool accel_working;
|
||||
struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES];
|
||||
const struct firmware *me_fw; /* all family ME firmware */
|
||||
|
@ -949,28 +937,14 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v)
|
|||
#define radeon_resume(rdev) (rdev)->asic->resume((rdev))
|
||||
#define radeon_suspend(rdev) (rdev)->asic->suspend((rdev))
|
||||
#define radeon_cs_parse(p) rdev->asic->cs_parse((p))
|
||||
#define radeon_errata(rdev) (rdev)->asic->errata((rdev))
|
||||
#define radeon_vram_info(rdev) (rdev)->asic->vram_info((rdev))
|
||||
#define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state))
|
||||
#define radeon_gpu_reset(rdev) (rdev)->asic->gpu_reset((rdev))
|
||||
#define radeon_mc_init(rdev) (rdev)->asic->mc_init((rdev))
|
||||
#define radeon_mc_fini(rdev) (rdev)->asic->mc_fini((rdev))
|
||||
#define radeon_wb_init(rdev) (rdev)->asic->wb_init((rdev))
|
||||
#define radeon_wb_fini(rdev) (rdev)->asic->wb_fini((rdev))
|
||||
#define radeon_gpu_gart_init(rdev) (rdev)->asic->gart_init((rdev))
|
||||
#define radeon_gpu_gart_fini(rdev) (rdev)->asic->gart_fini((rdev))
|
||||
#define radeon_gart_enable(rdev) (rdev)->asic->gart_enable((rdev))
|
||||
#define radeon_gart_disable(rdev) (rdev)->asic->gart_disable((rdev))
|
||||
#define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev))
|
||||
#define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart_set_page((rdev), (i), (p))
|
||||
#define radeon_cp_init(rdev,rsize) (rdev)->asic->cp_init((rdev), (rsize))
|
||||
#define radeon_cp_fini(rdev) (rdev)->asic->cp_fini((rdev))
|
||||
#define radeon_cp_disable(rdev) (rdev)->asic->cp_disable((rdev))
|
||||
#define radeon_cp_commit(rdev) (rdev)->asic->cp_commit((rdev))
|
||||
#define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev))
|
||||
#define radeon_ring_test(rdev) (rdev)->asic->ring_test((rdev))
|
||||
#define radeon_ring_ib_execute(rdev, ib) (rdev)->asic->ring_ib_execute((rdev), (ib))
|
||||
#define radeon_ib_test(rdev) (rdev)->asic->ib_test((rdev))
|
||||
#define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev))
|
||||
#define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev))
|
||||
#define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc))
|
||||
|
@ -996,6 +970,7 @@ extern void radeon_clocks_fini(struct radeon_device *rdev);
|
|||
extern void radeon_scratch_init(struct radeon_device *rdev);
|
||||
extern void radeon_surface_init(struct radeon_device *rdev);
|
||||
extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data);
|
||||
extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable);
|
||||
extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
|
||||
|
||||
/* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */
|
||||
|
@ -1031,11 +1006,27 @@ extern int r100_wb_init(struct radeon_device *rdev);
|
|||
extern void r100_hdp_reset(struct radeon_device *rdev);
|
||||
extern int r100_rb2d_reset(struct radeon_device *rdev);
|
||||
extern int r100_cp_reset(struct radeon_device *rdev);
|
||||
extern void r100_vga_render_disable(struct radeon_device *rdev);
|
||||
extern int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
struct radeon_object *robj);
|
||||
extern int r100_cs_parse_packet0(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
const unsigned *auth, unsigned n,
|
||||
radeon_packet0_check_t check);
|
||||
extern int r100_cs_packet_parse(struct radeon_cs_parser *p,
|
||||
struct radeon_cs_packet *pkt,
|
||||
unsigned idx);
|
||||
|
||||
/* rv200,rv250,rv280 */
|
||||
extern void r200_set_safe_registers(struct radeon_device *rdev);
|
||||
|
||||
/* r300,r350,rv350,rv370,rv380 */
|
||||
extern void r300_set_reg_safe(struct radeon_device *rdev);
|
||||
extern void r300_mc_program(struct radeon_device *rdev);
|
||||
extern void r300_vram_info(struct radeon_device *rdev);
|
||||
extern void r300_clock_startup(struct radeon_device *rdev);
|
||||
extern int r300_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
extern int rv370_pcie_gart_init(struct radeon_device *rdev);
|
||||
extern void rv370_pcie_gart_fini(struct radeon_device *rdev);
|
||||
extern int rv370_pcie_gart_enable(struct radeon_device *rdev);
|
||||
|
@ -1066,6 +1057,18 @@ extern void rv515_clock_startup(struct radeon_device *rdev);
|
|||
extern void rv515_debugfs(struct radeon_device *rdev);
|
||||
extern int rv515_suspend(struct radeon_device *rdev);
|
||||
|
||||
/* rs400 */
|
||||
extern int rs400_gart_init(struct radeon_device *rdev);
|
||||
extern int rs400_gart_enable(struct radeon_device *rdev);
|
||||
extern void rs400_gart_adjust_size(struct radeon_device *rdev);
|
||||
extern void rs400_gart_disable(struct radeon_device *rdev);
|
||||
extern void rs400_gart_fini(struct radeon_device *rdev);
|
||||
|
||||
/* rs600 */
|
||||
extern void rs600_set_safe_registers(struct radeon_device *rdev);
|
||||
extern int rs600_irq_set(struct radeon_device *rdev);
|
||||
extern void rs600_irq_disable(struct radeon_device *rdev);
|
||||
|
||||
/* rs690, rs740 */
|
||||
extern void rs690_line_buffer_adjust(struct radeon_device *rdev,
|
||||
struct drm_display_mode *mode1,
|
||||
|
@ -1083,8 +1086,9 @@ extern int r600_pcie_gart_init(struct radeon_device *rdev);
|
|||
extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev);
|
||||
extern int r600_ib_test(struct radeon_device *rdev);
|
||||
extern int r600_ring_test(struct radeon_device *rdev);
|
||||
extern int r600_wb_init(struct radeon_device *rdev);
|
||||
extern void r600_wb_fini(struct radeon_device *rdev);
|
||||
extern int r600_wb_enable(struct radeon_device *rdev);
|
||||
extern void r600_wb_disable(struct radeon_device *rdev);
|
||||
extern void r600_scratch_init(struct radeon_device *rdev);
|
||||
extern int r600_blit_init(struct radeon_device *rdev);
|
||||
extern void r600_blit_fini(struct radeon_device *rdev);
|
||||
|
|
|
@ -41,28 +41,17 @@ void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
|
|||
/*
|
||||
* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
|
||||
*/
|
||||
int r100_init(struct radeon_device *rdev);
|
||||
int r200_init(struct radeon_device *rdev);
|
||||
extern int r100_init(struct radeon_device *rdev);
|
||||
extern void r100_fini(struct radeon_device *rdev);
|
||||
extern int r100_suspend(struct radeon_device *rdev);
|
||||
extern int r100_resume(struct radeon_device *rdev);
|
||||
uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg);
|
||||
void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
|
||||
void r100_errata(struct radeon_device *rdev);
|
||||
void r100_vram_info(struct radeon_device *rdev);
|
||||
void r100_vga_set_state(struct radeon_device *rdev, bool state);
|
||||
int r100_gpu_reset(struct radeon_device *rdev);
|
||||
int r100_mc_init(struct radeon_device *rdev);
|
||||
void r100_mc_fini(struct radeon_device *rdev);
|
||||
u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc);
|
||||
int r100_wb_init(struct radeon_device *rdev);
|
||||
void r100_wb_fini(struct radeon_device *rdev);
|
||||
int r100_pci_gart_init(struct radeon_device *rdev);
|
||||
void r100_pci_gart_fini(struct radeon_device *rdev);
|
||||
int r100_pci_gart_enable(struct radeon_device *rdev);
|
||||
void r100_pci_gart_disable(struct radeon_device *rdev);
|
||||
void r100_pci_gart_tlb_flush(struct radeon_device *rdev);
|
||||
int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
|
||||
int r100_cp_init(struct radeon_device *rdev, unsigned ring_size);
|
||||
void r100_cp_fini(struct radeon_device *rdev);
|
||||
void r100_cp_disable(struct radeon_device *rdev);
|
||||
void r100_cp_commit(struct radeon_device *rdev);
|
||||
void r100_ring_start(struct radeon_device *rdev);
|
||||
int r100_irq_set(struct radeon_device *rdev);
|
||||
|
@ -83,33 +72,21 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg,
|
|||
int r100_clear_surface_reg(struct radeon_device *rdev, int reg);
|
||||
void r100_bandwidth_update(struct radeon_device *rdev);
|
||||
void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
|
||||
int r100_ib_test(struct radeon_device *rdev);
|
||||
int r100_ring_test(struct radeon_device *rdev);
|
||||
|
||||
static struct radeon_asic r100_asic = {
|
||||
.init = &r100_init,
|
||||
.errata = &r100_errata,
|
||||
.vram_info = &r100_vram_info,
|
||||
.fini = &r100_fini,
|
||||
.suspend = &r100_suspend,
|
||||
.resume = &r100_resume,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &r100_gpu_reset,
|
||||
.mc_init = &r100_mc_init,
|
||||
.mc_fini = &r100_mc_fini,
|
||||
.wb_init = &r100_wb_init,
|
||||
.wb_fini = &r100_wb_fini,
|
||||
.gart_init = &r100_pci_gart_init,
|
||||
.gart_fini = &r100_pci_gart_fini,
|
||||
.gart_enable = &r100_pci_gart_enable,
|
||||
.gart_disable = &r100_pci_gart_disable,
|
||||
.gart_tlb_flush = &r100_pci_gart_tlb_flush,
|
||||
.gart_set_page = &r100_pci_gart_set_page,
|
||||
.cp_init = &r100_cp_init,
|
||||
.cp_fini = &r100_cp_fini,
|
||||
.cp_disable = &r100_cp_disable,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &r100_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = &r100_ib_test,
|
||||
.irq_set = &r100_irq_set,
|
||||
.irq_process = &r100_irq_process,
|
||||
.get_vblank_counter = &r100_get_vblank_counter,
|
||||
|
@ -131,55 +108,38 @@ static struct radeon_asic r100_asic = {
|
|||
/*
|
||||
* r300,r350,rv350,rv380
|
||||
*/
|
||||
int r300_init(struct radeon_device *rdev);
|
||||
void r300_errata(struct radeon_device *rdev);
|
||||
void r300_vram_info(struct radeon_device *rdev);
|
||||
int r300_gpu_reset(struct radeon_device *rdev);
|
||||
int r300_mc_init(struct radeon_device *rdev);
|
||||
void r300_mc_fini(struct radeon_device *rdev);
|
||||
void r300_ring_start(struct radeon_device *rdev);
|
||||
void r300_fence_ring_emit(struct radeon_device *rdev,
|
||||
struct radeon_fence *fence);
|
||||
int r300_cs_parse(struct radeon_cs_parser *p);
|
||||
int rv370_pcie_gart_init(struct radeon_device *rdev);
|
||||
void rv370_pcie_gart_fini(struct radeon_device *rdev);
|
||||
int rv370_pcie_gart_enable(struct radeon_device *rdev);
|
||||
void rv370_pcie_gart_disable(struct radeon_device *rdev);
|
||||
void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev);
|
||||
int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
|
||||
uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg);
|
||||
void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
|
||||
void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes);
|
||||
int r300_copy_dma(struct radeon_device *rdev,
|
||||
uint64_t src_offset,
|
||||
uint64_t dst_offset,
|
||||
unsigned num_pages,
|
||||
struct radeon_fence *fence);
|
||||
|
||||
extern int r300_init(struct radeon_device *rdev);
|
||||
extern void r300_fini(struct radeon_device *rdev);
|
||||
extern int r300_suspend(struct radeon_device *rdev);
|
||||
extern int r300_resume(struct radeon_device *rdev);
|
||||
extern int r300_gpu_reset(struct radeon_device *rdev);
|
||||
extern void r300_ring_start(struct radeon_device *rdev);
|
||||
extern void r300_fence_ring_emit(struct radeon_device *rdev,
|
||||
struct radeon_fence *fence);
|
||||
extern int r300_cs_parse(struct radeon_cs_parser *p);
|
||||
extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev);
|
||||
extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
|
||||
extern uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg);
|
||||
extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
|
||||
extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes);
|
||||
extern int r300_copy_dma(struct radeon_device *rdev,
|
||||
uint64_t src_offset,
|
||||
uint64_t dst_offset,
|
||||
unsigned num_pages,
|
||||
struct radeon_fence *fence);
|
||||
static struct radeon_asic r300_asic = {
|
||||
.init = &r300_init,
|
||||
.errata = &r300_errata,
|
||||
.vram_info = &r300_vram_info,
|
||||
.fini = &r300_fini,
|
||||
.suspend = &r300_suspend,
|
||||
.resume = &r300_resume,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &r300_gpu_reset,
|
||||
.mc_init = &r300_mc_init,
|
||||
.mc_fini = &r300_mc_fini,
|
||||
.wb_init = &r100_wb_init,
|
||||
.wb_fini = &r100_wb_fini,
|
||||
.gart_init = &r100_pci_gart_init,
|
||||
.gart_fini = &r100_pci_gart_fini,
|
||||
.gart_enable = &r100_pci_gart_enable,
|
||||
.gart_disable = &r100_pci_gart_disable,
|
||||
.gart_tlb_flush = &r100_pci_gart_tlb_flush,
|
||||
.gart_set_page = &r100_pci_gart_set_page,
|
||||
.cp_init = &r100_cp_init,
|
||||
.cp_fini = &r100_cp_fini,
|
||||
.cp_disable = &r100_cp_disable,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &r300_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = &r100_ib_test,
|
||||
.irq_set = &r100_irq_set,
|
||||
.irq_process = &r100_irq_process,
|
||||
.get_vblank_counter = &r100_get_vblank_counter,
|
||||
|
@ -209,26 +169,14 @@ static struct radeon_asic r420_asic = {
|
|||
.fini = &r420_fini,
|
||||
.suspend = &r420_suspend,
|
||||
.resume = &r420_resume,
|
||||
.errata = NULL,
|
||||
.vram_info = NULL,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &r300_gpu_reset,
|
||||
.mc_init = NULL,
|
||||
.mc_fini = NULL,
|
||||
.wb_init = NULL,
|
||||
.wb_fini = NULL,
|
||||
.gart_enable = NULL,
|
||||
.gart_disable = NULL,
|
||||
.gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rv370_pcie_gart_set_page,
|
||||
.cp_init = NULL,
|
||||
.cp_fini = NULL,
|
||||
.cp_disable = NULL,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &r300_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = NULL,
|
||||
.irq_set = &r100_irq_set,
|
||||
.irq_process = &r100_irq_process,
|
||||
.get_vblank_counter = &r100_get_vblank_counter,
|
||||
|
@ -250,42 +198,27 @@ static struct radeon_asic r420_asic = {
|
|||
/*
|
||||
* rs400,rs480
|
||||
*/
|
||||
void rs400_errata(struct radeon_device *rdev);
|
||||
void rs400_vram_info(struct radeon_device *rdev);
|
||||
int rs400_mc_init(struct radeon_device *rdev);
|
||||
void rs400_mc_fini(struct radeon_device *rdev);
|
||||
int rs400_gart_init(struct radeon_device *rdev);
|
||||
void rs400_gart_fini(struct radeon_device *rdev);
|
||||
int rs400_gart_enable(struct radeon_device *rdev);
|
||||
void rs400_gart_disable(struct radeon_device *rdev);
|
||||
extern int rs400_init(struct radeon_device *rdev);
|
||||
extern void rs400_fini(struct radeon_device *rdev);
|
||||
extern int rs400_suspend(struct radeon_device *rdev);
|
||||
extern int rs400_resume(struct radeon_device *rdev);
|
||||
void rs400_gart_tlb_flush(struct radeon_device *rdev);
|
||||
int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
|
||||
uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg);
|
||||
void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
|
||||
static struct radeon_asic rs400_asic = {
|
||||
.init = &r300_init,
|
||||
.errata = &rs400_errata,
|
||||
.vram_info = &rs400_vram_info,
|
||||
.init = &rs400_init,
|
||||
.fini = &rs400_fini,
|
||||
.suspend = &rs400_suspend,
|
||||
.resume = &rs400_resume,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &r300_gpu_reset,
|
||||
.mc_init = &rs400_mc_init,
|
||||
.mc_fini = &rs400_mc_fini,
|
||||
.wb_init = &r100_wb_init,
|
||||
.wb_fini = &r100_wb_fini,
|
||||
.gart_init = &rs400_gart_init,
|
||||
.gart_fini = &rs400_gart_fini,
|
||||
.gart_enable = &rs400_gart_enable,
|
||||
.gart_disable = &rs400_gart_disable,
|
||||
.gart_tlb_flush = &rs400_gart_tlb_flush,
|
||||
.gart_set_page = &rs400_gart_set_page,
|
||||
.cp_init = &r100_cp_init,
|
||||
.cp_fini = &r100_cp_fini,
|
||||
.cp_disable = &r100_cp_disable,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &r300_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = &r100_ib_test,
|
||||
.irq_set = &r100_irq_set,
|
||||
.irq_process = &r100_irq_process,
|
||||
.get_vblank_counter = &r100_get_vblank_counter,
|
||||
|
@ -307,18 +240,13 @@ static struct radeon_asic rs400_asic = {
|
|||
/*
|
||||
* rs600.
|
||||
*/
|
||||
int rs600_init(struct radeon_device *rdev);
|
||||
void rs600_errata(struct radeon_device *rdev);
|
||||
void rs600_vram_info(struct radeon_device *rdev);
|
||||
int rs600_mc_init(struct radeon_device *rdev);
|
||||
void rs600_mc_fini(struct radeon_device *rdev);
|
||||
extern int rs600_init(struct radeon_device *rdev);
|
||||
extern void rs600_fini(struct radeon_device *rdev);
|
||||
extern int rs600_suspend(struct radeon_device *rdev);
|
||||
extern int rs600_resume(struct radeon_device *rdev);
|
||||
int rs600_irq_set(struct radeon_device *rdev);
|
||||
int rs600_irq_process(struct radeon_device *rdev);
|
||||
u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc);
|
||||
int rs600_gart_init(struct radeon_device *rdev);
|
||||
void rs600_gart_fini(struct radeon_device *rdev);
|
||||
int rs600_gart_enable(struct radeon_device *rdev);
|
||||
void rs600_gart_disable(struct radeon_device *rdev);
|
||||
void rs600_gart_tlb_flush(struct radeon_device *rdev);
|
||||
int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr);
|
||||
uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg);
|
||||
|
@ -326,28 +254,17 @@ void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
|
|||
void rs600_bandwidth_update(struct radeon_device *rdev);
|
||||
static struct radeon_asic rs600_asic = {
|
||||
.init = &rs600_init,
|
||||
.errata = &rs600_errata,
|
||||
.vram_info = &rs600_vram_info,
|
||||
.fini = &rs600_fini,
|
||||
.suspend = &rs600_suspend,
|
||||
.resume = &rs600_resume,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &r300_gpu_reset,
|
||||
.mc_init = &rs600_mc_init,
|
||||
.mc_fini = &rs600_mc_fini,
|
||||
.wb_init = &r100_wb_init,
|
||||
.wb_fini = &r100_wb_fini,
|
||||
.gart_init = &rs600_gart_init,
|
||||
.gart_fini = &rs600_gart_fini,
|
||||
.gart_enable = &rs600_gart_enable,
|
||||
.gart_disable = &rs600_gart_disable,
|
||||
.gart_tlb_flush = &rs600_gart_tlb_flush,
|
||||
.gart_set_page = &rs600_gart_set_page,
|
||||
.cp_init = &r100_cp_init,
|
||||
.cp_fini = &r100_cp_fini,
|
||||
.cp_disable = &r100_cp_disable,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &r300_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = &r100_ib_test,
|
||||
.irq_set = &rs600_irq_set,
|
||||
.irq_process = &rs600_irq_process,
|
||||
.get_vblank_counter = &rs600_get_vblank_counter,
|
||||
|
@ -367,37 +284,26 @@ static struct radeon_asic rs600_asic = {
|
|||
/*
|
||||
* rs690,rs740
|
||||
*/
|
||||
void rs690_errata(struct radeon_device *rdev);
|
||||
void rs690_vram_info(struct radeon_device *rdev);
|
||||
int rs690_mc_init(struct radeon_device *rdev);
|
||||
void rs690_mc_fini(struct radeon_device *rdev);
|
||||
int rs690_init(struct radeon_device *rdev);
|
||||
void rs690_fini(struct radeon_device *rdev);
|
||||
int rs690_resume(struct radeon_device *rdev);
|
||||
int rs690_suspend(struct radeon_device *rdev);
|
||||
uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg);
|
||||
void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v);
|
||||
void rs690_bandwidth_update(struct radeon_device *rdev);
|
||||
static struct radeon_asic rs690_asic = {
|
||||
.init = &rs600_init,
|
||||
.errata = &rs690_errata,
|
||||
.vram_info = &rs690_vram_info,
|
||||
.init = &rs690_init,
|
||||
.fini = &rs690_fini,
|
||||
.suspend = &rs690_suspend,
|
||||
.resume = &rs690_resume,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &r300_gpu_reset,
|
||||
.mc_init = &rs690_mc_init,
|
||||
.mc_fini = &rs690_mc_fini,
|
||||
.wb_init = &r100_wb_init,
|
||||
.wb_fini = &r100_wb_fini,
|
||||
.gart_init = &rs400_gart_init,
|
||||
.gart_fini = &rs400_gart_fini,
|
||||
.gart_enable = &rs400_gart_enable,
|
||||
.gart_disable = &rs400_gart_disable,
|
||||
.gart_tlb_flush = &rs400_gart_tlb_flush,
|
||||
.gart_set_page = &rs400_gart_set_page,
|
||||
.cp_init = &r100_cp_init,
|
||||
.cp_fini = &r100_cp_fini,
|
||||
.cp_disable = &r100_cp_disable,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &r300_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = &r100_ib_test,
|
||||
.irq_set = &rs600_irq_set,
|
||||
.irq_process = &rs600_irq_process,
|
||||
.get_vblank_counter = &rs600_get_vblank_counter,
|
||||
|
@ -435,28 +341,14 @@ static struct radeon_asic rv515_asic = {
|
|||
.fini = &rv515_fini,
|
||||
.suspend = &rv515_suspend,
|
||||
.resume = &rv515_resume,
|
||||
.errata = NULL,
|
||||
.vram_info = NULL,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &rv515_gpu_reset,
|
||||
.mc_init = NULL,
|
||||
.mc_fini = NULL,
|
||||
.wb_init = NULL,
|
||||
.wb_fini = NULL,
|
||||
.gart_init = &rv370_pcie_gart_init,
|
||||
.gart_fini = &rv370_pcie_gart_fini,
|
||||
.gart_enable = NULL,
|
||||
.gart_disable = NULL,
|
||||
.gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rv370_pcie_gart_set_page,
|
||||
.cp_init = NULL,
|
||||
.cp_fini = NULL,
|
||||
.cp_disable = NULL,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &rv515_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = NULL,
|
||||
.irq_set = &rs600_irq_set,
|
||||
.irq_process = &rs600_irq_process,
|
||||
.get_vblank_counter = &rs600_get_vblank_counter,
|
||||
|
@ -485,28 +377,14 @@ static struct radeon_asic r520_asic = {
|
|||
.fini = &rv515_fini,
|
||||
.suspend = &rv515_suspend,
|
||||
.resume = &r520_resume,
|
||||
.errata = NULL,
|
||||
.vram_info = NULL,
|
||||
.vga_set_state = &r100_vga_set_state,
|
||||
.gpu_reset = &rv515_gpu_reset,
|
||||
.mc_init = NULL,
|
||||
.mc_fini = NULL,
|
||||
.wb_init = NULL,
|
||||
.wb_fini = NULL,
|
||||
.gart_init = NULL,
|
||||
.gart_fini = NULL,
|
||||
.gart_enable = NULL,
|
||||
.gart_disable = NULL,
|
||||
.gart_tlb_flush = &rv370_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rv370_pcie_gart_set_page,
|
||||
.cp_init = NULL,
|
||||
.cp_fini = NULL,
|
||||
.cp_disable = NULL,
|
||||
.cp_commit = &r100_cp_commit,
|
||||
.ring_start = &rv515_ring_start,
|
||||
.ring_test = &r100_ring_test,
|
||||
.ring_ib_execute = &r100_ring_ib_execute,
|
||||
.ib_test = NULL,
|
||||
.irq_set = &rs600_irq_set,
|
||||
.irq_process = &rs600_irq_process,
|
||||
.get_vblank_counter = &rs600_get_vblank_counter,
|
||||
|
@ -554,37 +432,23 @@ int r600_set_surface_reg(struct radeon_device *rdev, int reg,
|
|||
uint32_t offset, uint32_t obj_size);
|
||||
int r600_clear_surface_reg(struct radeon_device *rdev, int reg);
|
||||
void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib);
|
||||
int r600_ib_test(struct radeon_device *rdev);
|
||||
int r600_ring_test(struct radeon_device *rdev);
|
||||
int r600_copy_blit(struct radeon_device *rdev,
|
||||
uint64_t src_offset, uint64_t dst_offset,
|
||||
unsigned num_pages, struct radeon_fence *fence);
|
||||
|
||||
static struct radeon_asic r600_asic = {
|
||||
.errata = NULL,
|
||||
.init = &r600_init,
|
||||
.fini = &r600_fini,
|
||||
.suspend = &r600_suspend,
|
||||
.resume = &r600_resume,
|
||||
.cp_commit = &r600_cp_commit,
|
||||
.vram_info = NULL,
|
||||
.vga_set_state = &r600_vga_set_state,
|
||||
.gpu_reset = &r600_gpu_reset,
|
||||
.mc_init = NULL,
|
||||
.mc_fini = NULL,
|
||||
.wb_init = &r600_wb_init,
|
||||
.wb_fini = &r600_wb_fini,
|
||||
.gart_enable = NULL,
|
||||
.gart_disable = NULL,
|
||||
.gart_tlb_flush = &r600_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rs600_gart_set_page,
|
||||
.cp_init = NULL,
|
||||
.cp_fini = NULL,
|
||||
.cp_disable = NULL,
|
||||
.ring_start = NULL,
|
||||
.ring_test = &r600_ring_test,
|
||||
.ring_ib_execute = &r600_ring_ib_execute,
|
||||
.ib_test = &r600_ib_test,
|
||||
.irq_set = &r600_irq_set,
|
||||
.irq_process = &r600_irq_process,
|
||||
.fence_ring_emit = &r600_fence_ring_emit,
|
||||
|
@ -611,30 +475,17 @@ int rv770_resume(struct radeon_device *rdev);
|
|||
int rv770_gpu_reset(struct radeon_device *rdev);
|
||||
|
||||
static struct radeon_asic rv770_asic = {
|
||||
.errata = NULL,
|
||||
.init = &rv770_init,
|
||||
.fini = &rv770_fini,
|
||||
.suspend = &rv770_suspend,
|
||||
.resume = &rv770_resume,
|
||||
.cp_commit = &r600_cp_commit,
|
||||
.vram_info = NULL,
|
||||
.gpu_reset = &rv770_gpu_reset,
|
||||
.vga_set_state = &r600_vga_set_state,
|
||||
.mc_init = NULL,
|
||||
.mc_fini = NULL,
|
||||
.wb_init = &r600_wb_init,
|
||||
.wb_fini = &r600_wb_fini,
|
||||
.gart_enable = NULL,
|
||||
.gart_disable = NULL,
|
||||
.gart_tlb_flush = &r600_pcie_gart_tlb_flush,
|
||||
.gart_set_page = &rs600_gart_set_page,
|
||||
.cp_init = NULL,
|
||||
.cp_fini = NULL,
|
||||
.cp_disable = NULL,
|
||||
.ring_start = NULL,
|
||||
.ring_test = &r600_ring_test,
|
||||
.ring_ib_execute = &r600_ring_ib_execute,
|
||||
.ib_test = &r600_ib_test,
|
||||
.irq_set = &r600_irq_set,
|
||||
.irq_process = &r600_irq_process,
|
||||
.fence_ring_emit = &r600_fence_ring_emit,
|
||||
|
|
|
@ -33,12 +33,50 @@
|
|||
/*
|
||||
* BIOS.
|
||||
*/
|
||||
|
||||
/* If you boot an IGP board with a discrete card as the primary,
|
||||
* the IGP rom is not accessible via the rom bar as the IGP rom is
|
||||
* part of the system bios. On boot, the system bios puts a
|
||||
* copy of the igp rom at the start of vram if a discrete card is
|
||||
* present.
|
||||
*/
|
||||
static bool igp_read_bios_from_vram(struct radeon_device *rdev)
|
||||
{
|
||||
uint8_t __iomem *bios;
|
||||
resource_size_t vram_base;
|
||||
resource_size_t size = 256 * 1024; /* ??? */
|
||||
|
||||
rdev->bios = NULL;
|
||||
vram_base = drm_get_resource_start(rdev->ddev, 0);
|
||||
bios = ioremap(vram_base, size);
|
||||
if (!bios) {
|
||||
DRM_ERROR("Unable to mmap vram\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) {
|
||||
iounmap(bios);
|
||||
DRM_ERROR("bad rom signature\n");
|
||||
return false;
|
||||
}
|
||||
rdev->bios = kmalloc(size, GFP_KERNEL);
|
||||
if (rdev->bios == NULL) {
|
||||
iounmap(bios);
|
||||
DRM_ERROR("kmalloc failed\n");
|
||||
return false;
|
||||
}
|
||||
memcpy(rdev->bios, bios, size);
|
||||
iounmap(bios);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool radeon_read_bios(struct radeon_device *rdev)
|
||||
{
|
||||
uint8_t __iomem *bios;
|
||||
size_t size;
|
||||
|
||||
rdev->bios = NULL;
|
||||
/* XXX: some cards may return 0 for rom size? ddx has a workaround */
|
||||
bios = pci_map_rom(rdev->pdev, &size);
|
||||
if (!bios) {
|
||||
return false;
|
||||
|
@ -341,7 +379,9 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev)
|
|||
|
||||
static bool radeon_read_disabled_bios(struct radeon_device *rdev)
|
||||
{
|
||||
if (rdev->family >= CHIP_RV770)
|
||||
if (rdev->flags & RADEON_IS_IGP)
|
||||
return igp_read_bios_from_vram(rdev);
|
||||
else if (rdev->family >= CHIP_RV770)
|
||||
return r700_read_disabled_bios(rdev);
|
||||
else if (rdev->family >= CHIP_R600)
|
||||
return r600_read_disabled_bios(rdev);
|
||||
|
@ -356,7 +396,12 @@ bool radeon_get_bios(struct radeon_device *rdev)
|
|||
bool r;
|
||||
uint16_t tmp;
|
||||
|
||||
r = radeon_read_bios(rdev);
|
||||
if (rdev->flags & RADEON_IS_IGP) {
|
||||
r = igp_read_bios_from_vram(rdev);
|
||||
if (r == false)
|
||||
r = radeon_read_bios(rdev);
|
||||
} else
|
||||
r = radeon_read_bios(rdev);
|
||||
if (r == false) {
|
||||
r = radeon_read_disabled_bios(rdev);
|
||||
}
|
||||
|
|
|
@ -411,7 +411,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
|
|||
R300_PIXCLK_TRANS_ALWAYS_ONb |
|
||||
R300_PIXCLK_TVO_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb);
|
||||
R300_P2G2CLK_DAC_ALWAYS_ONb);
|
||||
WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
|
||||
} else if (rdev->family >= CHIP_RV350) {
|
||||
tmp = RREG32_PLL(R300_SCLK_CNTL2);
|
||||
|
@ -464,7 +464,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
|
|||
R300_PIXCLK_TRANS_ALWAYS_ONb |
|
||||
R300_PIXCLK_TVO_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb);
|
||||
R300_P2G2CLK_DAC_ALWAYS_ONb);
|
||||
WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
|
||||
|
||||
tmp = RREG32_PLL(RADEON_MCLK_MISC);
|
||||
|
@ -654,7 +654,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
|
|||
R300_PIXCLK_TRANS_ALWAYS_ONb |
|
||||
R300_PIXCLK_TVO_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb |
|
||||
R300_P2G2CLK_DAC_ALWAYS_ONb |
|
||||
R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
|
||||
WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
|
||||
} else if (rdev->family >= CHIP_RV350) {
|
||||
|
@ -705,7 +705,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
|
|||
R300_PIXCLK_TRANS_ALWAYS_ONb |
|
||||
R300_PIXCLK_TVO_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb |
|
||||
R300_P2G2CLK_ALWAYS_ONb |
|
||||
R300_P2G2CLK_DAC_ALWAYS_ONb |
|
||||
R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
|
||||
WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
|
||||
} else {
|
||||
|
|
|
@ -322,10 +322,6 @@ int radeon_asic_init(struct radeon_device *rdev)
|
|||
case CHIP_RV380:
|
||||
rdev->asic = &r300_asic;
|
||||
if (rdev->flags & RADEON_IS_PCIE) {
|
||||
rdev->asic->gart_init = &rv370_pcie_gart_init;
|
||||
rdev->asic->gart_fini = &rv370_pcie_gart_fini;
|
||||
rdev->asic->gart_enable = &rv370_pcie_gart_enable;
|
||||
rdev->asic->gart_disable = &rv370_pcie_gart_disable;
|
||||
rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
|
||||
}
|
||||
|
@ -485,7 +481,6 @@ void radeon_combios_fini(struct radeon_device *rdev)
|
|||
static unsigned int radeon_vga_set_decode(void *cookie, bool state)
|
||||
{
|
||||
struct radeon_device *rdev = cookie;
|
||||
|
||||
radeon_vga_set_state(rdev, state);
|
||||
if (state)
|
||||
return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
|
||||
|
@ -493,6 +488,29 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state)
|
|||
else
|
||||
return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
|
||||
}
|
||||
|
||||
void radeon_agp_disable(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
} else if (rdev->family >= CHIP_RV515 ||
|
||||
rdev->family == CHIP_RV380 ||
|
||||
rdev->family == CHIP_RV410 ||
|
||||
rdev->family == CHIP_R423) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
|
||||
} else {
|
||||
DRM_INFO("Forcing AGP to PCI mode\n");
|
||||
rdev->flags |= RADEON_IS_PCI;
|
||||
rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &r100_pci_gart_set_page;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Radeon device.
|
||||
*/
|
||||
|
@ -531,32 +549,7 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||
}
|
||||
|
||||
if (radeon_agpmode == -1) {
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
if (rdev->family >= CHIP_R600) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
} else if (rdev->family >= CHIP_RV515 ||
|
||||
rdev->family == CHIP_RV380 ||
|
||||
rdev->family == CHIP_RV410 ||
|
||||
rdev->family == CHIP_R423) {
|
||||
DRM_INFO("Forcing AGP to PCIE mode\n");
|
||||
rdev->flags |= RADEON_IS_PCIE;
|
||||
rdev->asic->gart_init = &rv370_pcie_gart_init;
|
||||
rdev->asic->gart_fini = &rv370_pcie_gart_fini;
|
||||
rdev->asic->gart_enable = &rv370_pcie_gart_enable;
|
||||
rdev->asic->gart_disable = &rv370_pcie_gart_disable;
|
||||
rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &rv370_pcie_gart_set_page;
|
||||
} else {
|
||||
DRM_INFO("Forcing AGP to PCI mode\n");
|
||||
rdev->flags |= RADEON_IS_PCI;
|
||||
rdev->asic->gart_init = &r100_pci_gart_init;
|
||||
rdev->asic->gart_fini = &r100_pci_gart_fini;
|
||||
rdev->asic->gart_enable = &r100_pci_gart_enable;
|
||||
rdev->asic->gart_disable = &r100_pci_gart_disable;
|
||||
rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush;
|
||||
rdev->asic->gart_set_page = &r100_pci_gart_set_page;
|
||||
}
|
||||
radeon_agp_disable(rdev);
|
||||
}
|
||||
|
||||
/* set DMA mask + need_dma32 flags.
|
||||
|
@ -588,111 +581,27 @@ int radeon_device_init(struct radeon_device *rdev,
|
|||
DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base);
|
||||
DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size);
|
||||
|
||||
rdev->new_init_path = false;
|
||||
r = radeon_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
/* if we have > 1 VGA cards, then disable the radeon VGA resources */
|
||||
r = vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode);
|
||||
if (r) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!rdev->new_init_path) {
|
||||
/* Setup errata flags */
|
||||
radeon_errata(rdev);
|
||||
/* Initialize scratch registers */
|
||||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
r = radeon_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
return -EINVAL;
|
||||
}
|
||||
if (rdev->is_atom_bios) {
|
||||
r = radeon_atombios_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
} else {
|
||||
r = radeon_combios_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
}
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_reset(rdev)) {
|
||||
/* FIXME: what do we want to do here ? */
|
||||
}
|
||||
/* check if cards are posted or not */
|
||||
if (!radeon_card_posted(rdev) && rdev->bios) {
|
||||
DRM_INFO("GPU not posted. posting now...\n");
|
||||
if (rdev->is_atom_bios) {
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
} else {
|
||||
radeon_combios_asic_init(rdev->ddev);
|
||||
}
|
||||
}
|
||||
/* Get clock & vram information */
|
||||
radeon_get_clock_info(rdev->ddev);
|
||||
radeon_vram_info(rdev);
|
||||
/* Initialize clocks */
|
||||
r = radeon_clocks_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Initialize memory controller (also test AGP) */
|
||||
r = radeon_mc_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
r = radeon_gpu_gart_init(rdev);
|
||||
if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) {
|
||||
/* Acceleration not working on AGP card try again
|
||||
* with fallback to PCI or PCIE GART
|
||||
*/
|
||||
radeon_gpu_reset(rdev);
|
||||
radeon_fini(rdev);
|
||||
radeon_agp_disable(rdev);
|
||||
r = radeon_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Initialize GART (initialize after TTM so we can allocate
|
||||
* memory through TTM but finalize after TTM) */
|
||||
r = radeon_gart_enable(rdev);
|
||||
if (r)
|
||||
return 0;
|
||||
r = radeon_gem_init(rdev);
|
||||
if (r)
|
||||
return 0;
|
||||
|
||||
/* 1M ring buffer */
|
||||
r = radeon_cp_init(rdev, 1024 * 1024);
|
||||
if (r)
|
||||
return 0;
|
||||
r = radeon_wb_init(rdev);
|
||||
if (r)
|
||||
DRM_ERROR("radeon: failled initializing WB (%d).\n", r);
|
||||
r = radeon_ib_pool_init(rdev);
|
||||
if (r)
|
||||
return 0;
|
||||
r = radeon_ib_test(rdev);
|
||||
if (r)
|
||||
return 0;
|
||||
rdev->accel_working = true;
|
||||
}
|
||||
DRM_INFO("radeon: kernel modesetting successfully initialized.\n");
|
||||
if (radeon_testing) {
|
||||
radeon_test_moves(rdev);
|
||||
}
|
||||
|
@ -706,32 +615,8 @@ void radeon_device_fini(struct radeon_device *rdev)
|
|||
{
|
||||
DRM_INFO("radeon: finishing device.\n");
|
||||
rdev->shutdown = true;
|
||||
/* Order matter so becarefull if you rearrange anythings */
|
||||
if (!rdev->new_init_path) {
|
||||
radeon_ib_pool_fini(rdev);
|
||||
radeon_cp_fini(rdev);
|
||||
radeon_wb_fini(rdev);
|
||||
radeon_gpu_gart_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
radeon_mc_fini(rdev);
|
||||
#if __OS_HAS_AGP
|
||||
radeon_agp_fini(rdev);
|
||||
#endif
|
||||
radeon_irq_kms_fini(rdev);
|
||||
vga_client_register(rdev->pdev, NULL, NULL, NULL);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_clocks_fini(rdev);
|
||||
radeon_object_fini(rdev);
|
||||
if (rdev->is_atom_bios) {
|
||||
radeon_atombios_fini(rdev);
|
||||
} else {
|
||||
radeon_combios_fini(rdev);
|
||||
}
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
} else {
|
||||
radeon_fini(rdev);
|
||||
}
|
||||
radeon_fini(rdev);
|
||||
vga_client_register(rdev->pdev, NULL, NULL, NULL);
|
||||
iounmap(rdev->rmmio);
|
||||
rdev->rmmio = NULL;
|
||||
}
|
||||
|
@ -771,14 +656,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
|||
|
||||
radeon_save_bios_scratch_regs(rdev);
|
||||
|
||||
if (!rdev->new_init_path) {
|
||||
radeon_cp_disable(rdev);
|
||||
radeon_gart_disable(rdev);
|
||||
rdev->irq.sw_int = false;
|
||||
radeon_irq_set(rdev);
|
||||
} else {
|
||||
radeon_suspend(rdev);
|
||||
}
|
||||
radeon_suspend(rdev);
|
||||
/* evict remaining vram memory */
|
||||
radeon_object_evict_vram(rdev);
|
||||
|
||||
|
@ -797,7 +675,6 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
|||
int radeon_resume_kms(struct drm_device *dev)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
int r;
|
||||
|
||||
acquire_console_sem();
|
||||
pci_set_power_state(dev->pdev, PCI_D0);
|
||||
|
@ -807,43 +684,7 @@ int radeon_resume_kms(struct drm_device *dev)
|
|||
return -1;
|
||||
}
|
||||
pci_set_master(dev->pdev);
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (!rdev->new_init_path) {
|
||||
if (radeon_gpu_reset(rdev)) {
|
||||
/* FIXME: what do we want to do here ? */
|
||||
}
|
||||
/* post card */
|
||||
if (rdev->is_atom_bios) {
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
} else {
|
||||
radeon_combios_asic_init(rdev->ddev);
|
||||
}
|
||||
/* Initialize clocks */
|
||||
r = radeon_clocks_init(rdev);
|
||||
if (r) {
|
||||
release_console_sem();
|
||||
return r;
|
||||
}
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
radeon_irq_set(rdev);
|
||||
/* Initialize GPU Memory Controller */
|
||||
r = radeon_mc_init(rdev);
|
||||
if (r) {
|
||||
goto out;
|
||||
}
|
||||
r = radeon_gart_enable(rdev);
|
||||
if (r) {
|
||||
goto out;
|
||||
}
|
||||
r = radeon_cp_init(rdev, rdev->cp.ring_size);
|
||||
if (r) {
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
radeon_resume(rdev);
|
||||
}
|
||||
out:
|
||||
radeon_resume(rdev);
|
||||
radeon_restore_bios_scratch_regs(rdev);
|
||||
fb_set_suspend(rdev->fbdev_info, 0);
|
||||
release_console_sem();
|
||||
|
|
|
@ -106,24 +106,33 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc)
|
|||
legacy_crtc_load_lut(crtc);
|
||||
}
|
||||
|
||||
/** Sets the color ramps on behalf of RandR */
|
||||
/** Sets the color ramps on behalf of fbcon */
|
||||
void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
||||
u16 blue, int regno)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
|
||||
if (regno == 0)
|
||||
DRM_DEBUG("gamma set %d\n", radeon_crtc->crtc_id);
|
||||
radeon_crtc->lut_r[regno] = red >> 6;
|
||||
radeon_crtc->lut_g[regno] = green >> 6;
|
||||
radeon_crtc->lut_b[regno] = blue >> 6;
|
||||
}
|
||||
|
||||
/** Gets the color ramps on behalf of fbcon */
|
||||
void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, int regno)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
|
||||
*red = radeon_crtc->lut_r[regno] << 6;
|
||||
*green = radeon_crtc->lut_g[regno] << 6;
|
||||
*blue = radeon_crtc->lut_b[regno] << 6;
|
||||
}
|
||||
|
||||
static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, uint32_t size)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
|
||||
int i, j;
|
||||
int i;
|
||||
|
||||
if (size != 256) {
|
||||
return;
|
||||
|
@ -132,23 +141,11 @@ static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green,
|
|||
return;
|
||||
}
|
||||
|
||||
if (crtc->fb->depth == 16) {
|
||||
for (i = 0; i < 64; i++) {
|
||||
if (i <= 31) {
|
||||
for (j = 0; j < 8; j++) {
|
||||
radeon_crtc->lut_r[i * 8 + j] = red[i] >> 6;
|
||||
radeon_crtc->lut_b[i * 8 + j] = blue[i] >> 6;
|
||||
}
|
||||
}
|
||||
for (j = 0; j < 4; j++)
|
||||
radeon_crtc->lut_g[i * 4 + j] = green[i] >> 6;
|
||||
}
|
||||
} else {
|
||||
for (i = 0; i < 256; i++) {
|
||||
radeon_crtc->lut_r[i] = red[i] >> 6;
|
||||
radeon_crtc->lut_g[i] = green[i] >> 6;
|
||||
radeon_crtc->lut_b[i] = blue[i] >> 6;
|
||||
}
|
||||
/* userspace palettes are always correct as is */
|
||||
for (i = 0; i < 256; i++) {
|
||||
radeon_crtc->lut_r[i] = red[i] >> 6;
|
||||
radeon_crtc->lut_g[i] = green[i] >> 6;
|
||||
radeon_crtc->lut_b[i] = blue[i] >> 6;
|
||||
}
|
||||
|
||||
radeon_crtc_load_lut(crtc);
|
||||
|
@ -724,7 +721,11 @@ int radeon_modeset_init(struct radeon_device *rdev)
|
|||
if (ret) {
|
||||
return ret;
|
||||
}
|
||||
/* allocate crtcs - TODO single crtc */
|
||||
|
||||
if (rdev->flags & RADEON_SINGLE_CRTC)
|
||||
num_crtc = 1;
|
||||
|
||||
/* allocate crtcs */
|
||||
for (i = 0; i < num_crtc; i++) {
|
||||
radeon_crtc_init(rdev->ddev, i);
|
||||
}
|
||||
|
|
|
@ -1345,6 +1345,7 @@ radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder)
|
|||
void
|
||||
radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t supported_device)
|
||||
{
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct drm_encoder *encoder;
|
||||
struct radeon_encoder *radeon_encoder;
|
||||
|
||||
|
@ -1364,7 +1365,10 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t su
|
|||
return;
|
||||
|
||||
encoder = &radeon_encoder->base;
|
||||
encoder->possible_crtcs = 0x3;
|
||||
if (rdev->flags & RADEON_SINGLE_CRTC)
|
||||
encoder->possible_crtcs = 0x1;
|
||||
else
|
||||
encoder->possible_crtcs = 0x3;
|
||||
encoder->possible_clones = 0;
|
||||
|
||||
radeon_encoder->enc_priv = NULL;
|
||||
|
|
|
@ -55,6 +55,7 @@ static struct fb_ops radeonfb_ops = {
|
|||
.fb_imageblit = cfb_imageblit,
|
||||
.fb_pan_display = drm_fb_helper_pan_display,
|
||||
.fb_blank = drm_fb_helper_blank,
|
||||
.fb_setcmap = drm_fb_helper_setcmap,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -123,6 +124,7 @@ static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bo
|
|||
|
||||
static struct drm_fb_helper_funcs radeon_fb_helper_funcs = {
|
||||
.gamma_set = radeon_crtc_fb_gamma_set,
|
||||
.gamma_get = radeon_crtc_fb_gamma_get,
|
||||
};
|
||||
|
||||
int radeonfb_create(struct drm_device *dev,
|
||||
|
@ -146,9 +148,15 @@ int radeonfb_create(struct drm_device *dev,
|
|||
unsigned long tmp;
|
||||
bool fb_tiled = false; /* useful for testing */
|
||||
u32 tiling_flags = 0;
|
||||
int crtc_count;
|
||||
|
||||
mode_cmd.width = surface_width;
|
||||
mode_cmd.height = surface_height;
|
||||
|
||||
/* avivo can't scanout real 24bpp */
|
||||
if ((surface_bpp == 24) && ASIC_IS_AVIVO(rdev))
|
||||
surface_bpp = 32;
|
||||
|
||||
mode_cmd.bpp = surface_bpp;
|
||||
/* need to align pitch with crtc limits */
|
||||
mode_cmd.pitch = radeon_align_pitch(rdev, mode_cmd.width, mode_cmd.bpp, fb_tiled) * ((mode_cmd.bpp + 1) / 8);
|
||||
|
@ -217,7 +225,11 @@ int radeonfb_create(struct drm_device *dev,
|
|||
rfbdev = info->par;
|
||||
rfbdev->helper.funcs = &radeon_fb_helper_funcs;
|
||||
rfbdev->helper.dev = dev;
|
||||
ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, 2,
|
||||
if (rdev->flags & RADEON_SINGLE_CRTC)
|
||||
crtc_count = 1;
|
||||
else
|
||||
crtc_count = 2;
|
||||
ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, crtc_count,
|
||||
RADEONFB_CONN_LIMIT);
|
||||
if (ret)
|
||||
goto out_unref;
|
||||
|
@ -234,7 +246,7 @@ int radeonfb_create(struct drm_device *dev,
|
|||
|
||||
strcpy(info->fix.id, "radeondrmfb");
|
||||
|
||||
drm_fb_helper_fill_fix(info, fb->pitch);
|
||||
drm_fb_helper_fill_fix(info, fb->pitch, fb->depth);
|
||||
|
||||
info->flags = FBINFO_DEFAULT;
|
||||
info->fbops = &radeonfb_ops;
|
||||
|
@ -309,7 +321,7 @@ int radeon_parse_options(char *options)
|
|||
|
||||
int radeonfb_probe(struct drm_device *dev)
|
||||
{
|
||||
return drm_fb_helper_single_fb_probe(dev, &radeonfb_create);
|
||||
return drm_fb_helper_single_fb_probe(dev, 32, &radeonfb_create);
|
||||
}
|
||||
|
||||
int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb)
|
||||
|
|
|
@ -83,8 +83,12 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
|
|||
int radeon_irq_kms_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r = 0;
|
||||
int num_crtc = 2;
|
||||
|
||||
r = drm_vblank_init(rdev->ddev, 2);
|
||||
if (rdev->flags & RADEON_SINGLE_CRTC)
|
||||
num_crtc = 1;
|
||||
|
||||
r = drm_vblank_init(rdev->ddev, num_crtc);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -1053,6 +1053,7 @@ static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
|
|||
.mode_set_base = radeon_crtc_set_base,
|
||||
.prepare = radeon_crtc_prepare,
|
||||
.commit = radeon_crtc_commit,
|
||||
.load_lut = radeon_crtc_load_lut,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -881,7 +881,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,
|
|||
R420_TV_DAC_DACADJ_MASK |
|
||||
R420_TV_DAC_RDACPD |
|
||||
R420_TV_DAC_GDACPD |
|
||||
R420_TV_DAC_GDACPD |
|
||||
R420_TV_DAC_BDACPD |
|
||||
R420_TV_DAC_TVENABLE);
|
||||
} else {
|
||||
tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK |
|
||||
|
@ -889,7 +889,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,
|
|||
RADEON_TV_DAC_DACADJ_MASK |
|
||||
RADEON_TV_DAC_RDACPD |
|
||||
RADEON_TV_DAC_GDACPD |
|
||||
RADEON_TV_DAC_GDACPD);
|
||||
RADEON_TV_DAC_BDACPD);
|
||||
}
|
||||
|
||||
/* FIXME TV */
|
||||
|
@ -1318,7 +1318,10 @@ radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t
|
|||
return;
|
||||
|
||||
encoder = &radeon_encoder->base;
|
||||
encoder->possible_crtcs = 0x3;
|
||||
if (rdev->flags & RADEON_SINGLE_CRTC)
|
||||
encoder->possible_crtcs = 0x1;
|
||||
else
|
||||
encoder->possible_crtcs = 0x3;
|
||||
encoder->possible_clones = 0;
|
||||
|
||||
radeon_encoder->enc_priv = NULL;
|
||||
|
|
|
@ -407,6 +407,8 @@ extern void
|
|||
radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on);
|
||||
extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green,
|
||||
u16 blue, int regno);
|
||||
extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, int regno);
|
||||
struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev,
|
||||
struct drm_mode_fb_cmd *mode_cmd,
|
||||
struct drm_gem_object *obj);
|
||||
|
|
|
@ -400,11 +400,9 @@ void radeon_object_list_add_object(struct radeon_object_list *lobj,
|
|||
int radeon_object_list_reserve(struct list_head *head)
|
||||
{
|
||||
struct radeon_object_list *lobj;
|
||||
struct list_head *i;
|
||||
int r;
|
||||
|
||||
list_for_each(i, head) {
|
||||
lobj = list_entry(i, struct radeon_object_list, list);
|
||||
list_for_each_entry(lobj, head, list){
|
||||
if (!lobj->robj->pin_count) {
|
||||
r = radeon_object_reserve(lobj->robj, true);
|
||||
if (unlikely(r != 0)) {
|
||||
|
@ -420,13 +418,10 @@ int radeon_object_list_reserve(struct list_head *head)
|
|||
void radeon_object_list_unreserve(struct list_head *head)
|
||||
{
|
||||
struct radeon_object_list *lobj;
|
||||
struct list_head *i;
|
||||
|
||||
list_for_each(i, head) {
|
||||
lobj = list_entry(i, struct radeon_object_list, list);
|
||||
list_for_each_entry(lobj, head, list) {
|
||||
if (!lobj->robj->pin_count) {
|
||||
radeon_object_unreserve(lobj->robj);
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -436,7 +431,6 @@ int radeon_object_list_validate(struct list_head *head, void *fence)
|
|||
struct radeon_object_list *lobj;
|
||||
struct radeon_object *robj;
|
||||
struct radeon_fence *old_fence = NULL;
|
||||
struct list_head *i;
|
||||
int r;
|
||||
|
||||
r = radeon_object_list_reserve(head);
|
||||
|
@ -444,8 +438,7 @@ int radeon_object_list_validate(struct list_head *head, void *fence)
|
|||
radeon_object_list_unreserve(head);
|
||||
return r;
|
||||
}
|
||||
list_for_each(i, head) {
|
||||
lobj = list_entry(i, struct radeon_object_list, list);
|
||||
list_for_each_entry(lobj, head, list) {
|
||||
robj = lobj->robj;
|
||||
if (!robj->pin_count) {
|
||||
if (lobj->wdomain) {
|
||||
|
@ -482,10 +475,8 @@ void radeon_object_list_unvalidate(struct list_head *head)
|
|||
{
|
||||
struct radeon_object_list *lobj;
|
||||
struct radeon_fence *old_fence = NULL;
|
||||
struct list_head *i;
|
||||
|
||||
list_for_each(i, head) {
|
||||
lobj = list_entry(i, struct radeon_object_list, list);
|
||||
list_for_each_entry(lobj, head, list) {
|
||||
old_fence = (struct radeon_fence *)lobj->robj->tobj.sync_obj;
|
||||
lobj->robj->tobj.sync_obj = NULL;
|
||||
if (old_fence) {
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef __RS100D_H__
|
||||
#define __RS100D_H__
|
||||
|
||||
/* Registers */
|
||||
#define R_00015C_NB_TOM 0x00015C
|
||||
#define S_00015C_MC_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_00015C_MC_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_00015C_MC_FB_START 0xFFFF0000
|
||||
#define S_00015C_MC_FB_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_00015C_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_00015C_MC_FB_TOP 0x0000FFFF
|
||||
|
||||
#endif
|
|
@ -27,27 +27,12 @@
|
|||
*/
|
||||
#include <linux/seq_file.h>
|
||||
#include <drm/drmP.h>
|
||||
#include "radeon_reg.h"
|
||||
#include "radeon.h"
|
||||
#include "rs400d.h"
|
||||
|
||||
/* rs400,rs480 depends on : */
|
||||
void r100_hdp_reset(struct radeon_device *rdev);
|
||||
void r100_mc_disable_clients(struct radeon_device *rdev);
|
||||
int r300_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
void r420_pipes_init(struct radeon_device *rdev);
|
||||
/* This files gather functions specifics to : rs400,rs480 */
|
||||
static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
|
||||
|
||||
/* This files gather functions specifics to :
|
||||
* rs400,rs480
|
||||
*
|
||||
* Some of these functions might be used by newer ASICs.
|
||||
*/
|
||||
void rs400_gpu_init(struct radeon_device *rdev);
|
||||
int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev);
|
||||
|
||||
|
||||
/*
|
||||
* GART functions.
|
||||
*/
|
||||
void rs400_gart_adjust_size(struct radeon_device *rdev)
|
||||
{
|
||||
/* Check gart size */
|
||||
|
@ -238,61 +223,6 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* MC functions.
|
||||
*/
|
||||
int rs400_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
int r;
|
||||
|
||||
if (r100_debugfs_rbbm_init(rdev)) {
|
||||
DRM_ERROR("Failed to register debugfs file for RBBM !\n");
|
||||
}
|
||||
|
||||
rs400_gpu_init(rdev);
|
||||
rs400_gart_disable(rdev);
|
||||
rdev->mc.gtt_location = rdev->mc.mc_vram_size;
|
||||
rdev->mc.gtt_location += (rdev->mc.gtt_size - 1);
|
||||
rdev->mc.gtt_location &= ~(rdev->mc.gtt_size - 1);
|
||||
r = radeon_mc_setup(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
r100_mc_disable_clients(rdev);
|
||||
if (r300_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait MC idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
|
||||
tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
|
||||
tmp = REG_SET(RADEON_MC_FB_TOP, tmp >> 16);
|
||||
tmp |= REG_SET(RADEON_MC_FB_START, rdev->mc.vram_location >> 16);
|
||||
WREG32(RADEON_MC_FB_LOCATION, tmp);
|
||||
tmp = RREG32(RADEON_HOST_PATH_CNTL) | RADEON_HP_LIN_RD_CACHE_DIS;
|
||||
WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE);
|
||||
(void)RREG32(RADEON_HOST_PATH_CNTL);
|
||||
WREG32(RADEON_HOST_PATH_CNTL, tmp);
|
||||
(void)RREG32(RADEON_HOST_PATH_CNTL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rs400_mc_fini(struct radeon_device *rdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Global GPU functions
|
||||
*/
|
||||
void rs400_errata(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->pll_errata = 0;
|
||||
}
|
||||
|
||||
void rs400_gpu_init(struct radeon_device *rdev)
|
||||
{
|
||||
/* FIXME: HDP same place on rs400 ? */
|
||||
|
@ -305,10 +235,6 @@ void rs400_gpu_init(struct radeon_device *rdev)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* VRAM info.
|
||||
*/
|
||||
void rs400_vram_info(struct radeon_device *rdev)
|
||||
{
|
||||
rs400_gart_adjust_size(rdev);
|
||||
|
@ -319,10 +245,6 @@ void rs400_vram_info(struct radeon_device *rdev)
|
|||
r100_vram_init_sizes(rdev);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Indirect registers accessor
|
||||
*/
|
||||
uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg)
|
||||
{
|
||||
uint32_t r;
|
||||
|
@ -340,10 +262,6 @@ void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
|
|||
WREG32(RS480_NB_MC_INDEX, 0xff);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Debugfs info
|
||||
*/
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
static int rs400_debugfs_gart_info(struct seq_file *m, void *data)
|
||||
{
|
||||
|
@ -419,7 +337,7 @@ static struct drm_info_list rs400_gart_info_list[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
|
||||
static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
|
||||
{
|
||||
#if defined(CONFIG_DEBUG_FS)
|
||||
return radeon_debugfs_add_files(rdev, rs400_gart_info_list, 1);
|
||||
|
@ -427,3 +345,188 @@ int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
|
|||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int rs400_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
u32 tmp;
|
||||
|
||||
/* Setup GPU memory space */
|
||||
tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM));
|
||||
rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16;
|
||||
rdev->mc.gtt_location = 0xFFFFFFFFUL;
|
||||
r = radeon_mc_setup(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rs400_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
struct r100_mc_save save;
|
||||
|
||||
/* Stops all mc clients */
|
||||
r100_mc_stop(rdev, &save);
|
||||
|
||||
/* Wait for mc idle */
|
||||
if (r300_mc_wait_for_idle(rdev))
|
||||
dev_warn(rdev->dev, "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);
|
||||
}
|
||||
|
||||
static int rs400_startup(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
rs400_mc_program(rdev);
|
||||
/* Resume clock */
|
||||
r300_clock_startup(rdev);
|
||||
/* Initialize GPU configuration (# pipes, ...) */
|
||||
rs400_gpu_init(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;
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
r100_irq_set(rdev);
|
||||
/* 1M ring buffer */
|
||||
r = r100_cp_init(rdev, 1024 * 1024);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = r100_wb_init(rdev);
|
||||
if (r)
|
||||
dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
|
||||
r = r100_ib_init(rdev);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rs400_resume(struct radeon_device *rdev)
|
||||
{
|
||||
/* Make sur GART are not working */
|
||||
rs400_gart_disable(rdev);
|
||||
/* Resume clock before doing reset */
|
||||
r300_clock_startup(rdev);
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_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->ddev);
|
||||
/* Resume clock after posting */
|
||||
r300_clock_startup(rdev);
|
||||
return rs400_startup(rdev);
|
||||
}
|
||||
|
||||
int rs400_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
r100_irq_disable(rdev);
|
||||
rs400_gart_disable(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rs400_fini(struct radeon_device *rdev)
|
||||
{
|
||||
rs400_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
rs400_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_object_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
}
|
||||
|
||||
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 */
|
||||
/* 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_gpu_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_card_posted(rdev) && rdev->bios) {
|
||||
DRM_INFO("GPU not posted. posting now...\n");
|
||||
radeon_combios_asic_init(rdev->ddev);
|
||||
}
|
||||
/* Initialize clocks */
|
||||
radeon_get_clock_info(rdev->ddev);
|
||||
/* Get vram informations */
|
||||
rs400_vram_info(rdev);
|
||||
/* Initialize memory controller (also test AGP) */
|
||||
r = rs400_mc_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = rs400_gart_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r300_set_reg_safe(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");
|
||||
rs400_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
rs400_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef __RS400D_H__
|
||||
#define __RS400D_H__
|
||||
|
||||
/* Registers */
|
||||
#define R_000148_MC_FB_LOCATION 0x000148
|
||||
#define S_000148_MC_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000148_MC_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000148_MC_FB_START 0xFFFF0000
|
||||
#define S_000148_MC_FB_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_000148_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_000148_MC_FB_TOP 0x0000FFFF
|
||||
#define R_00015C_NB_TOM 0x00015C
|
||||
#define S_00015C_MC_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_00015C_MC_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_00015C_MC_FB_START 0xFFFF0000
|
||||
#define S_00015C_MC_FB_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_00015C_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_00015C_MC_FB_TOP 0x0000FFFF
|
||||
#define R_0007C0_CP_STAT 0x0007C0
|
||||
#define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0)
|
||||
#define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1)
|
||||
#define C_0007C0_MRU_BUSY 0xFFFFFFFE
|
||||
#define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1)
|
||||
#define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1)
|
||||
#define C_0007C0_MWU_BUSY 0xFFFFFFFD
|
||||
#define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2)
|
||||
#define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1)
|
||||
#define C_0007C0_RSIU_BUSY 0xFFFFFFFB
|
||||
#define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3)
|
||||
#define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1)
|
||||
#define C_0007C0_RCIU_BUSY 0xFFFFFFF7
|
||||
#define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9)
|
||||
#define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1)
|
||||
#define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF
|
||||
#define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10)
|
||||
#define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF
|
||||
#define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11)
|
||||
#define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1)
|
||||
#define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF
|
||||
#define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12)
|
||||
#define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF
|
||||
#define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13)
|
||||
#define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1)
|
||||
#define C_0007C0_CSI_BUSY 0xFFFFDFFF
|
||||
#define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF
|
||||
#define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF
|
||||
#define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28)
|
||||
#define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1)
|
||||
#define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF
|
||||
#define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29)
|
||||
#define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1)
|
||||
#define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF
|
||||
#define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30)
|
||||
#define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1)
|
||||
#define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF
|
||||
#define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31)
|
||||
#define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1)
|
||||
#define C_0007C0_CP_BUSY 0x7FFFFFFF
|
||||
#define R_000E40_RBBM_STATUS 0x000E40
|
||||
#define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0)
|
||||
#define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F)
|
||||
#define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80
|
||||
#define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8)
|
||||
#define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1)
|
||||
#define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF
|
||||
#define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9)
|
||||
#define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1)
|
||||
#define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF
|
||||
#define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10)
|
||||
#define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1)
|
||||
#define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF
|
||||
#define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11)
|
||||
#define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1)
|
||||
#define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF
|
||||
#define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12)
|
||||
#define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1)
|
||||
#define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF
|
||||
#define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13)
|
||||
#define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1)
|
||||
#define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF
|
||||
#define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF
|
||||
#define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_000E40_ENG_EV_BUSY 0xFFFF7FFF
|
||||
#define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16)
|
||||
#define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1)
|
||||
#define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF
|
||||
#define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17)
|
||||
#define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1)
|
||||
#define C_000E40_E2_BUSY 0xFFFDFFFF
|
||||
#define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18)
|
||||
#define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1)
|
||||
#define C_000E40_RB2D_BUSY 0xFFFBFFFF
|
||||
#define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19)
|
||||
#define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1)
|
||||
#define C_000E40_RB3D_BUSY 0xFFF7FFFF
|
||||
#define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20)
|
||||
#define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1)
|
||||
#define C_000E40_VAP_BUSY 0xFFEFFFFF
|
||||
#define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21)
|
||||
#define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1)
|
||||
#define C_000E40_RE_BUSY 0xFFDFFFFF
|
||||
#define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22)
|
||||
#define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1)
|
||||
#define C_000E40_TAM_BUSY 0xFFBFFFFF
|
||||
#define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23)
|
||||
#define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1)
|
||||
#define C_000E40_TDM_BUSY 0xFF7FFFFF
|
||||
#define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24)
|
||||
#define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1)
|
||||
#define C_000E40_PB_BUSY 0xFEFFFFFF
|
||||
#define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25)
|
||||
#define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1)
|
||||
#define C_000E40_TIM_BUSY 0xFDFFFFFF
|
||||
#define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26)
|
||||
#define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1)
|
||||
#define C_000E40_GA_BUSY 0xFBFFFFFF
|
||||
#define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27)
|
||||
#define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1)
|
||||
#define C_000E40_CBA2D_BUSY 0xF7FFFFFF
|
||||
#define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31)
|
||||
#define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1)
|
||||
#define C_000E40_GUI_ACTIVE 0x7FFFFFFF
|
||||
|
||||
#endif
|
|
@ -25,27 +25,26 @@
|
|||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
/* RS600 / Radeon X1250/X1270 integrated GPU
|
||||
*
|
||||
* This file gather function specific to RS600 which is the IGP of
|
||||
* the X1250/X1270 family supporting intel CPU (while RS690/RS740
|
||||
* is the X1250/X1270 supporting AMD CPU). The display engine are
|
||||
* the avivo one, bios is an atombios, 3D block are the one of the
|
||||
* R4XX family. The GART is different from the RS400 one and is very
|
||||
* close to the one of the R600 family (R600 likely being an evolution
|
||||
* of the RS600 GART block).
|
||||
*/
|
||||
#include "drmP.h"
|
||||
#include "radeon_reg.h"
|
||||
#include "radeon.h"
|
||||
#include "atom.h"
|
||||
#include "rs600d.h"
|
||||
|
||||
#include "rs600_reg_safe.h"
|
||||
|
||||
/* rs600 depends on : */
|
||||
void r100_hdp_reset(struct radeon_device *rdev);
|
||||
int r100_gui_wait_for_idle(struct radeon_device *rdev);
|
||||
int r300_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
void r420_pipes_init(struct radeon_device *rdev);
|
||||
|
||||
/* This files gather functions specifics to :
|
||||
* rs600
|
||||
*
|
||||
* Some of these functions might be used by newer ASICs.
|
||||
*/
|
||||
void rs600_gpu_init(struct radeon_device *rdev);
|
||||
int rs600_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
|
||||
|
||||
/*
|
||||
* GART.
|
||||
*/
|
||||
|
@ -53,18 +52,18 @@ void rs600_gart_tlb_flush(struct radeon_device *rdev)
|
|||
{
|
||||
uint32_t tmp;
|
||||
|
||||
tmp = RREG32_MC(RS600_MC_PT0_CNTL);
|
||||
tmp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE);
|
||||
WREG32_MC(RS600_MC_PT0_CNTL, tmp);
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
tmp &= C_000100_INVALIDATE_ALL_L1_TLBS & C_000100_INVALIDATE_L2_CACHE;
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, tmp);
|
||||
|
||||
tmp = RREG32_MC(RS600_MC_PT0_CNTL);
|
||||
tmp |= RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE;
|
||||
WREG32_MC(RS600_MC_PT0_CNTL, tmp);
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
tmp |= S_000100_INVALIDATE_ALL_L1_TLBS(1) & S_000100_INVALIDATE_L2_CACHE(1);
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, tmp);
|
||||
|
||||
tmp = RREG32_MC(RS600_MC_PT0_CNTL);
|
||||
tmp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE);
|
||||
WREG32_MC(RS600_MC_PT0_CNTL, tmp);
|
||||
tmp = RREG32_MC(RS600_MC_PT0_CNTL);
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
tmp &= C_000100_INVALIDATE_ALL_L1_TLBS & C_000100_INVALIDATE_L2_CACHE;
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, tmp);
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
}
|
||||
|
||||
int rs600_gart_init(struct radeon_device *rdev)
|
||||
|
@ -86,7 +85,7 @@ int rs600_gart_init(struct radeon_device *rdev)
|
|||
|
||||
int rs600_gart_enable(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
u32 tmp;
|
||||
int r, i;
|
||||
|
||||
if (rdev->gart.table.vram.robj == NULL) {
|
||||
|
@ -96,46 +95,50 @@ int rs600_gart_enable(struct radeon_device *rdev)
|
|||
r = radeon_gart_table_vram_pin(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Enable bus master */
|
||||
tmp = RREG32(R_00004C_BUS_CNTL) & C_00004C_BUS_MASTER_DIS;
|
||||
WREG32(R_00004C_BUS_CNTL, tmp);
|
||||
/* FIXME: setup default page */
|
||||
WREG32_MC(RS600_MC_PT0_CNTL,
|
||||
(RS600_EFFECTIVE_L2_CACHE_SIZE(6) |
|
||||
RS600_EFFECTIVE_L2_QUEUE_SIZE(6)));
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL,
|
||||
(S_000100_EFFECTIVE_L2_CACHE_SIZE(6) |
|
||||
S_000100_EFFECTIVE_L2_QUEUE_SIZE(6)));
|
||||
for (i = 0; i < 19; i++) {
|
||||
WREG32_MC(RS600_MC_PT0_CLIENT0_CNTL + i,
|
||||
(RS600_ENABLE_TRANSLATION_MODE_OVERRIDE |
|
||||
RS600_SYSTEM_ACCESS_MODE_IN_SYS |
|
||||
RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_DEFAULT_PAGE |
|
||||
RS600_EFFECTIVE_L1_CACHE_SIZE(3) |
|
||||
RS600_ENABLE_FRAGMENT_PROCESSING |
|
||||
RS600_EFFECTIVE_L1_QUEUE_SIZE(3)));
|
||||
WREG32_MC(R_00016C_MC_PT0_CLIENT0_CNTL + i,
|
||||
S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(1) |
|
||||
S_00016C_SYSTEM_ACCESS_MODE_MASK(
|
||||
V_00016C_SYSTEM_ACCESS_MODE_IN_SYS) |
|
||||
S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(
|
||||
V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE) |
|
||||
S_00016C_EFFECTIVE_L1_CACHE_SIZE(1) |
|
||||
S_00016C_ENABLE_FRAGMENT_PROCESSING(1) |
|
||||
S_00016C_EFFECTIVE_L1_QUEUE_SIZE(1));
|
||||
}
|
||||
|
||||
/* System context map to GART space */
|
||||
WREG32_MC(RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_location);
|
||||
tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
|
||||
WREG32_MC(RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, tmp);
|
||||
WREG32_MC(R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_start);
|
||||
WREG32_MC(R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.gtt_end);
|
||||
|
||||
/* enable first context */
|
||||
WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_location);
|
||||
tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
|
||||
WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_END_ADDR, tmp);
|
||||
WREG32_MC(RS600_MC_PT0_CONTEXT0_CNTL,
|
||||
(RS600_ENABLE_PAGE_TABLE | RS600_PAGE_TABLE_TYPE_FLAT));
|
||||
WREG32_MC(R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_start);
|
||||
WREG32_MC(R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR, rdev->mc.gtt_end);
|
||||
WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL,
|
||||
S_000102_ENABLE_PAGE_TABLE(1) |
|
||||
S_000102_PAGE_TABLE_DEPTH(V_000102_PAGE_TABLE_FLAT));
|
||||
/* disable all other contexts */
|
||||
for (i = 1; i < 8; i++) {
|
||||
WREG32_MC(RS600_MC_PT0_CONTEXT0_CNTL + i, 0);
|
||||
WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL + i, 0);
|
||||
}
|
||||
|
||||
/* setup the page table */
|
||||
WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_BASE_ADDR,
|
||||
rdev->gart.table_addr);
|
||||
WREG32_MC(RS600_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0);
|
||||
WREG32_MC(R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR,
|
||||
rdev->gart.table_addr);
|
||||
WREG32_MC(R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0);
|
||||
|
||||
/* enable page tables */
|
||||
tmp = RREG32_MC(RS600_MC_PT0_CNTL);
|
||||
WREG32_MC(RS600_MC_PT0_CNTL, (tmp | RS600_ENABLE_PT));
|
||||
tmp = RREG32_MC(RS600_MC_CNTL1);
|
||||
WREG32_MC(RS600_MC_CNTL1, (tmp | RS600_ENABLE_PAGE_TABLES));
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, (tmp | S_000100_ENABLE_PT(1)));
|
||||
tmp = RREG32_MC(R_000009_MC_CNTL1);
|
||||
WREG32_MC(R_000009_MC_CNTL1, (tmp | S_000009_ENABLE_PAGE_TABLES(1)));
|
||||
rs600_gart_tlb_flush(rdev);
|
||||
rdev->gart.ready = true;
|
||||
return 0;
|
||||
|
@ -146,10 +149,9 @@ void rs600_gart_disable(struct radeon_device *rdev)
|
|||
uint32_t tmp;
|
||||
|
||||
/* FIXME: disable out of gart access */
|
||||
WREG32_MC(RS600_MC_PT0_CNTL, 0);
|
||||
tmp = RREG32_MC(RS600_MC_CNTL1);
|
||||
tmp &= ~RS600_ENABLE_PAGE_TABLES;
|
||||
WREG32_MC(RS600_MC_CNTL1, tmp);
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, 0);
|
||||
tmp = RREG32_MC(R_000009_MC_CNTL1);
|
||||
WREG32_MC(R_000009_MC_CNTL1, tmp & C_000009_ENABLE_PAGE_TABLES);
|
||||
if (rdev->gart.table.vram.robj) {
|
||||
radeon_object_kunmap(rdev->gart.table.vram.robj);
|
||||
radeon_object_unpin(rdev->gart.table.vram.robj);
|
||||
|
@ -183,129 +185,61 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* MC.
|
||||
*/
|
||||
void rs600_mc_disable_clients(struct radeon_device *rdev)
|
||||
{
|
||||
unsigned tmp;
|
||||
|
||||
if (r100_gui_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait GUI idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
|
||||
rv515_vga_render_disable(rdev);
|
||||
|
||||
tmp = RREG32(AVIVO_D1VGA_CONTROL);
|
||||
WREG32(AVIVO_D1VGA_CONTROL, tmp & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
|
||||
tmp = RREG32(AVIVO_D2VGA_CONTROL);
|
||||
WREG32(AVIVO_D2VGA_CONTROL, tmp & ~AVIVO_DVGA_CONTROL_MODE_ENABLE);
|
||||
|
||||
tmp = RREG32(AVIVO_D1CRTC_CONTROL);
|
||||
WREG32(AVIVO_D1CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN);
|
||||
tmp = RREG32(AVIVO_D2CRTC_CONTROL);
|
||||
WREG32(AVIVO_D2CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN);
|
||||
|
||||
/* make sure all previous write got through */
|
||||
tmp = RREG32(AVIVO_D2CRTC_CONTROL);
|
||||
|
||||
mdelay(1);
|
||||
}
|
||||
|
||||
int rs600_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
int r;
|
||||
|
||||
if (r100_debugfs_rbbm_init(rdev)) {
|
||||
DRM_ERROR("Failed to register debugfs file for RBBM !\n");
|
||||
}
|
||||
|
||||
rs600_gpu_init(rdev);
|
||||
rs600_gart_disable(rdev);
|
||||
|
||||
/* Setup GPU memory space */
|
||||
rdev->mc.vram_location = 0xFFFFFFFFUL;
|
||||
rdev->mc.gtt_location = 0xFFFFFFFFUL;
|
||||
r = radeon_mc_setup(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Program GPU memory space */
|
||||
/* Enable bus master */
|
||||
tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS;
|
||||
WREG32(RADEON_BUS_CNTL, tmp);
|
||||
/* FIXME: What does AGP means for such chipset ? */
|
||||
WREG32_MC(RS600_MC_AGP_LOCATION, 0x0FFFFFFF);
|
||||
/* FIXME: are this AGP reg in indirect MC range ? */
|
||||
WREG32_MC(RS600_MC_AGP_BASE, 0);
|
||||
WREG32_MC(RS600_MC_AGP_BASE_2, 0);
|
||||
rs600_mc_disable_clients(rdev);
|
||||
if (rs600_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait MC idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
|
||||
tmp = REG_SET(RS600_MC_FB_TOP, tmp >> 16);
|
||||
tmp |= REG_SET(RS600_MC_FB_START, rdev->mc.vram_location >> 16);
|
||||
WREG32_MC(RS600_MC_FB_LOCATION, tmp);
|
||||
WREG32(RS690_HDP_FB_LOCATION, rdev->mc.vram_location >> 16);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rs600_mc_fini(struct radeon_device *rdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Interrupts
|
||||
*/
|
||||
int rs600_irq_set(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp = 0;
|
||||
uint32_t mode_int = 0;
|
||||
|
||||
if (rdev->irq.sw_int) {
|
||||
tmp |= RADEON_SW_INT_ENABLE;
|
||||
tmp |= S_000040_SW_INT_EN(1);
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[0]) {
|
||||
mode_int |= AVIVO_D1MODE_INT_MASK;
|
||||
mode_int |= S_006540_D1MODE_VBLANK_INT_MASK(1);
|
||||
}
|
||||
if (rdev->irq.crtc_vblank_int[1]) {
|
||||
mode_int |= AVIVO_D2MODE_INT_MASK;
|
||||
mode_int |= S_006540_D2MODE_VBLANK_INT_MASK(1);
|
||||
}
|
||||
WREG32(RADEON_GEN_INT_CNTL, tmp);
|
||||
WREG32(AVIVO_DxMODE_INT_MASK, mode_int);
|
||||
WREG32(R_000040_GEN_INT_CNTL, tmp);
|
||||
WREG32(R_006540_DxMODE_INT_MASK, mode_int);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int)
|
||||
{
|
||||
uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS);
|
||||
uint32_t irq_mask = RADEON_SW_INT_TEST;
|
||||
uint32_t irqs = RREG32(R_000044_GEN_INT_STATUS);
|
||||
uint32_t irq_mask = ~C_000044_SW_INT;
|
||||
|
||||
if (irqs & AVIVO_DISPLAY_INT_STATUS) {
|
||||
*r500_disp_int = RREG32(AVIVO_DISP_INTERRUPT_STATUS);
|
||||
if (*r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) {
|
||||
WREG32(AVIVO_D1MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK);
|
||||
if (G_000044_DISPLAY_INT_STAT(irqs)) {
|
||||
*r500_disp_int = RREG32(R_007EDC_DISP_INTERRUPT_STATUS);
|
||||
if (G_007EDC_LB_D1_VBLANK_INTERRUPT(*r500_disp_int)) {
|
||||
WREG32(R_006534_D1MODE_VBLANK_STATUS,
|
||||
S_006534_D1MODE_VBLANK_ACK(1));
|
||||
}
|
||||
if (*r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) {
|
||||
WREG32(AVIVO_D2MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK);
|
||||
if (G_007EDC_LB_D2_VBLANK_INTERRUPT(*r500_disp_int)) {
|
||||
WREG32(R_006D34_D2MODE_VBLANK_STATUS,
|
||||
S_006D34_D2MODE_VBLANK_ACK(1));
|
||||
}
|
||||
} else {
|
||||
*r500_disp_int = 0;
|
||||
}
|
||||
|
||||
if (irqs) {
|
||||
WREG32(RADEON_GEN_INT_STATUS, irqs);
|
||||
WREG32(R_000044_GEN_INT_STATUS, irqs);
|
||||
}
|
||||
return irqs & irq_mask;
|
||||
}
|
||||
|
||||
void rs600_irq_disable(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
WREG32(R_000040_GEN_INT_CNTL, 0);
|
||||
WREG32(R_006540_DxMODE_INT_MASK, 0);
|
||||
/* Wait and acknowledge irq */
|
||||
mdelay(1);
|
||||
rs600_irq_ack(rdev, &tmp);
|
||||
}
|
||||
|
||||
int rs600_irq_process(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t status;
|
||||
|
@ -317,16 +251,13 @@ int rs600_irq_process(struct radeon_device *rdev)
|
|||
}
|
||||
while (status || r500_disp_int) {
|
||||
/* SW interrupt */
|
||||
if (status & RADEON_SW_INT_TEST) {
|
||||
if (G_000040_SW_INT_EN(status))
|
||||
radeon_fence_process(rdev);
|
||||
}
|
||||
/* Vertical blank interrupts */
|
||||
if (r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) {
|
||||
if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int))
|
||||
drm_handle_vblank(rdev->ddev, 0);
|
||||
}
|
||||
if (r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) {
|
||||
if (G_007EDC_LB_D2_VBLANK_INTERRUPT(r500_disp_int))
|
||||
drm_handle_vblank(rdev->ddev, 1);
|
||||
}
|
||||
status = rs600_irq_ack(rdev, &r500_disp_int);
|
||||
}
|
||||
return IRQ_HANDLED;
|
||||
|
@ -335,53 +266,34 @@ int rs600_irq_process(struct radeon_device *rdev)
|
|||
u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc)
|
||||
{
|
||||
if (crtc == 0)
|
||||
return RREG32(AVIVO_D1CRTC_FRAME_COUNT);
|
||||
return RREG32(R_0060A4_D1CRTC_STATUS_FRAME_COUNT);
|
||||
else
|
||||
return RREG32(AVIVO_D2CRTC_FRAME_COUNT);
|
||||
return RREG32(R_0068A4_D2CRTC_STATUS_FRAME_COUNT);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Global GPU functions
|
||||
*/
|
||||
int rs600_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_MC(RS600_MC_STATUS);
|
||||
if (tmp & RS600_MC_STATUS_IDLE) {
|
||||
if (G_000000_MC_IDLE(RREG32_MC(R_000000_MC_STATUS)))
|
||||
return 0;
|
||||
}
|
||||
DRM_UDELAY(1);
|
||||
udelay(1);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void rs600_errata(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->pll_errata = 0;
|
||||
}
|
||||
|
||||
void rs600_gpu_init(struct radeon_device *rdev)
|
||||
{
|
||||
/* FIXME: HDP same place on rs600 ? */
|
||||
r100_hdp_reset(rdev);
|
||||
rv515_vga_render_disable(rdev);
|
||||
/* FIXME: is this correct ? */
|
||||
r420_pipes_init(rdev);
|
||||
if (rs600_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait MC idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
/* Wait for mc idle */
|
||||
if (rs600_mc_wait_for_idle(rdev))
|
||||
dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* VRAM info.
|
||||
*/
|
||||
void rs600_vram_info(struct radeon_device *rdev)
|
||||
{
|
||||
/* FIXME: to do or is these values sane ? */
|
||||
|
@ -394,31 +306,206 @@ void rs600_bandwidth_update(struct radeon_device *rdev)
|
|||
/* FIXME: implement, should this be like rs690 ? */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Indirect registers accessor
|
||||
*/
|
||||
uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
WREG32(RS600_MC_INDEX,
|
||||
((reg & RS600_MC_ADDR_MASK) | RS600_MC_IND_CITF_ARB0));
|
||||
r = RREG32(RS600_MC_DATA);
|
||||
return r;
|
||||
WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) |
|
||||
S_000070_MC_IND_CITF_ARB0(1));
|
||||
return RREG32(R_000074_MC_IND_DATA);
|
||||
}
|
||||
|
||||
void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
|
||||
{
|
||||
WREG32(RS600_MC_INDEX,
|
||||
RS600_MC_IND_WR_EN | RS600_MC_IND_CITF_ARB0 |
|
||||
((reg) & RS600_MC_ADDR_MASK));
|
||||
WREG32(RS600_MC_DATA, v);
|
||||
WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) |
|
||||
S_000070_MC_IND_CITF_ARB0(1) | S_000070_MC_IND_WR_EN(1));
|
||||
WREG32(R_000074_MC_IND_DATA, v);
|
||||
}
|
||||
|
||||
void rs600_debugfs(struct radeon_device *rdev)
|
||||
{
|
||||
if (r100_debugfs_rbbm_init(rdev))
|
||||
DRM_ERROR("Failed to register debugfs file for RBBM !\n");
|
||||
}
|
||||
|
||||
void rs600_set_safe_registers(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->config.r300.reg_safe_bm = rs600_reg_safe_bm;
|
||||
rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs600_reg_safe_bm);
|
||||
}
|
||||
|
||||
static void rs600_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
struct rv515_mc_save save;
|
||||
|
||||
/* Stops all mc clients */
|
||||
rv515_mc_stop(rdev, &save);
|
||||
|
||||
/* Wait for mc idle */
|
||||
if (rs600_mc_wait_for_idle(rdev))
|
||||
dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
|
||||
|
||||
/* FIXME: What does AGP means for such chipset ? */
|
||||
WREG32_MC(R_000005_MC_AGP_LOCATION, 0x0FFFFFFF);
|
||||
WREG32_MC(R_000006_AGP_BASE, 0);
|
||||
WREG32_MC(R_000007_AGP_BASE_2, 0);
|
||||
/* Program MC */
|
||||
WREG32_MC(R_000004_MC_FB_LOCATION,
|
||||
S_000004_MC_FB_START(rdev->mc.vram_start >> 16) |
|
||||
S_000004_MC_FB_TOP(rdev->mc.vram_end >> 16));
|
||||
WREG32(R_000134_HDP_FB_LOCATION,
|
||||
S_000134_HDP_FB_START(rdev->mc.vram_start >> 16));
|
||||
|
||||
rv515_mc_resume(rdev, &save);
|
||||
}
|
||||
|
||||
static int rs600_startup(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
rs600_mc_program(rdev);
|
||||
/* Resume clock */
|
||||
rv515_clock_startup(rdev);
|
||||
/* Initialize GPU configuration (# pipes, ...) */
|
||||
rs600_gpu_init(rdev);
|
||||
/* Initialize GART (initialize after TTM so we can allocate
|
||||
* memory through TTM but finalize after TTM) */
|
||||
r = rs600_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
rs600_irq_set(rdev);
|
||||
/* 1M ring buffer */
|
||||
r = r100_cp_init(rdev, 1024 * 1024);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = r100_wb_init(rdev);
|
||||
if (r)
|
||||
dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
|
||||
r = r100_ib_init(rdev);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rs600_resume(struct radeon_device *rdev)
|
||||
{
|
||||
/* Make sur GART are not working */
|
||||
rs600_gart_disable(rdev);
|
||||
/* Resume clock before doing reset */
|
||||
rv515_clock_startup(rdev);
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_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 */
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
/* Resume clock after posting */
|
||||
rv515_clock_startup(rdev);
|
||||
return rs600_startup(rdev);
|
||||
}
|
||||
|
||||
int rs600_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
rs600_irq_disable(rdev);
|
||||
rs600_gart_disable(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rs600_fini(struct radeon_device *rdev)
|
||||
{
|
||||
rs600_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
rs600_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_object_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
}
|
||||
|
||||
int rs600_init(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->config.r300.reg_safe_bm = rs600_reg_safe_bm;
|
||||
rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs600_reg_safe_bm);
|
||||
int r;
|
||||
|
||||
/* Disable VGA */
|
||||
rv515_vga_render_disable(rdev);
|
||||
/* Initialize scratch registers */
|
||||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
radeon_surface_init(rdev);
|
||||
/* BIOS */
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
return -EINVAL;
|
||||
}
|
||||
if (rdev->is_atom_bios) {
|
||||
r = radeon_atombios_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
} else {
|
||||
dev_err(rdev->dev, "Expecting atombios for RS600 GPU\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_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_card_posted(rdev) && rdev->bios) {
|
||||
DRM_INFO("GPU not posted. posting now...\n");
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
}
|
||||
/* Initialize clocks */
|
||||
radeon_get_clock_info(rdev->ddev);
|
||||
/* Get vram informations */
|
||||
rs600_vram_info(rdev);
|
||||
/* Initialize memory controller (also test AGP) */
|
||||
r = r420_mc_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
rs600_debugfs(rdev);
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = rs600_gart_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
rs600_set_safe_registers(rdev);
|
||||
rdev->accel_working = true;
|
||||
r = rs600_startup(rdev);
|
||||
if (r) {
|
||||
/* Somethings want wront with the accel init stop accel */
|
||||
dev_err(rdev->dev, "Disabling GPU acceleration\n");
|
||||
rs600_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
rs600_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,470 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef __RS600D_H__
|
||||
#define __RS600D_H__
|
||||
|
||||
/* Registers */
|
||||
#define R_000040_GEN_INT_CNTL 0x000040
|
||||
#define S_000040_DISPLAY_INT_STATUS(x) (((x) & 0x1) << 0)
|
||||
#define G_000040_DISPLAY_INT_STATUS(x) (((x) >> 0) & 0x1)
|
||||
#define C_000040_DISPLAY_INT_STATUS 0xFFFFFFFE
|
||||
#define S_000040_DMA_VIPH0_INT_EN(x) (((x) & 0x1) << 12)
|
||||
#define G_000040_DMA_VIPH0_INT_EN(x) (((x) >> 12) & 0x1)
|
||||
#define C_000040_DMA_VIPH0_INT_EN 0xFFFFEFFF
|
||||
#define S_000040_CRTC2_VSYNC(x) (((x) & 0x1) << 6)
|
||||
#define G_000040_CRTC2_VSYNC(x) (((x) >> 6) & 0x1)
|
||||
#define C_000040_CRTC2_VSYNC 0xFFFFFFBF
|
||||
#define S_000040_SNAPSHOT2(x) (((x) & 0x1) << 7)
|
||||
#define G_000040_SNAPSHOT2(x) (((x) >> 7) & 0x1)
|
||||
#define C_000040_SNAPSHOT2 0xFFFFFF7F
|
||||
#define S_000040_CRTC2_VBLANK(x) (((x) & 0x1) << 9)
|
||||
#define G_000040_CRTC2_VBLANK(x) (((x) >> 9) & 0x1)
|
||||
#define C_000040_CRTC2_VBLANK 0xFFFFFDFF
|
||||
#define S_000040_FP2_DETECT(x) (((x) & 0x1) << 10)
|
||||
#define G_000040_FP2_DETECT(x) (((x) >> 10) & 0x1)
|
||||
#define C_000040_FP2_DETECT 0xFFFFFBFF
|
||||
#define S_000040_VSYNC_DIFF_OVER_LIMIT(x) (((x) & 0x1) << 11)
|
||||
#define G_000040_VSYNC_DIFF_OVER_LIMIT(x) (((x) >> 11) & 0x1)
|
||||
#define C_000040_VSYNC_DIFF_OVER_LIMIT 0xFFFFF7FF
|
||||
#define S_000040_DMA_VIPH1_INT_EN(x) (((x) & 0x1) << 13)
|
||||
#define G_000040_DMA_VIPH1_INT_EN(x) (((x) >> 13) & 0x1)
|
||||
#define C_000040_DMA_VIPH1_INT_EN 0xFFFFDFFF
|
||||
#define S_000040_DMA_VIPH2_INT_EN(x) (((x) & 0x1) << 14)
|
||||
#define G_000040_DMA_VIPH2_INT_EN(x) (((x) >> 14) & 0x1)
|
||||
#define C_000040_DMA_VIPH2_INT_EN 0xFFFFBFFF
|
||||
#define S_000040_DMA_VIPH3_INT_EN(x) (((x) & 0x1) << 15)
|
||||
#define G_000040_DMA_VIPH3_INT_EN(x) (((x) >> 15) & 0x1)
|
||||
#define C_000040_DMA_VIPH3_INT_EN 0xFFFF7FFF
|
||||
#define S_000040_I2C_INT_EN(x) (((x) & 0x1) << 17)
|
||||
#define G_000040_I2C_INT_EN(x) (((x) >> 17) & 0x1)
|
||||
#define C_000040_I2C_INT_EN 0xFFFDFFFF
|
||||
#define S_000040_GUI_IDLE(x) (((x) & 0x1) << 19)
|
||||
#define G_000040_GUI_IDLE(x) (((x) >> 19) & 0x1)
|
||||
#define C_000040_GUI_IDLE 0xFFF7FFFF
|
||||
#define S_000040_VIPH_INT_EN(x) (((x) & 0x1) << 24)
|
||||
#define G_000040_VIPH_INT_EN(x) (((x) >> 24) & 0x1)
|
||||
#define C_000040_VIPH_INT_EN 0xFEFFFFFF
|
||||
#define S_000040_SW_INT_EN(x) (((x) & 0x1) << 25)
|
||||
#define G_000040_SW_INT_EN(x) (((x) >> 25) & 0x1)
|
||||
#define C_000040_SW_INT_EN 0xFDFFFFFF
|
||||
#define S_000040_GEYSERVILLE(x) (((x) & 0x1) << 27)
|
||||
#define G_000040_GEYSERVILLE(x) (((x) >> 27) & 0x1)
|
||||
#define C_000040_GEYSERVILLE 0xF7FFFFFF
|
||||
#define S_000040_HDCP_AUTHORIZED_INT(x) (((x) & 0x1) << 28)
|
||||
#define G_000040_HDCP_AUTHORIZED_INT(x) (((x) >> 28) & 0x1)
|
||||
#define C_000040_HDCP_AUTHORIZED_INT 0xEFFFFFFF
|
||||
#define S_000040_DVI_I2C_INT(x) (((x) & 0x1) << 29)
|
||||
#define G_000040_DVI_I2C_INT(x) (((x) >> 29) & 0x1)
|
||||
#define C_000040_DVI_I2C_INT 0xDFFFFFFF
|
||||
#define S_000040_GUIDMA(x) (((x) & 0x1) << 30)
|
||||
#define G_000040_GUIDMA(x) (((x) >> 30) & 0x1)
|
||||
#define C_000040_GUIDMA 0xBFFFFFFF
|
||||
#define S_000040_VIDDMA(x) (((x) & 0x1) << 31)
|
||||
#define G_000040_VIDDMA(x) (((x) >> 31) & 0x1)
|
||||
#define C_000040_VIDDMA 0x7FFFFFFF
|
||||
#define R_000044_GEN_INT_STATUS 0x000044
|
||||
#define S_000044_DISPLAY_INT_STAT(x) (((x) & 0x1) << 0)
|
||||
#define G_000044_DISPLAY_INT_STAT(x) (((x) >> 0) & 0x1)
|
||||
#define C_000044_DISPLAY_INT_STAT 0xFFFFFFFE
|
||||
#define S_000044_VGA_INT_STAT(x) (((x) & 0x1) << 1)
|
||||
#define G_000044_VGA_INT_STAT(x) (((x) >> 1) & 0x1)
|
||||
#define C_000044_VGA_INT_STAT 0xFFFFFFFD
|
||||
#define S_000044_CAP0_INT_ACTIVE(x) (((x) & 0x1) << 8)
|
||||
#define G_000044_CAP0_INT_ACTIVE(x) (((x) >> 8) & 0x1)
|
||||
#define C_000044_CAP0_INT_ACTIVE 0xFFFFFEFF
|
||||
#define S_000044_DMA_VIPH0_INT(x) (((x) & 0x1) << 12)
|
||||
#define G_000044_DMA_VIPH0_INT(x) (((x) >> 12) & 0x1)
|
||||
#define C_000044_DMA_VIPH0_INT 0xFFFFEFFF
|
||||
#define S_000044_DMA_VIPH1_INT(x) (((x) & 0x1) << 13)
|
||||
#define G_000044_DMA_VIPH1_INT(x) (((x) >> 13) & 0x1)
|
||||
#define C_000044_DMA_VIPH1_INT 0xFFFFDFFF
|
||||
#define S_000044_DMA_VIPH2_INT(x) (((x) & 0x1) << 14)
|
||||
#define G_000044_DMA_VIPH2_INT(x) (((x) >> 14) & 0x1)
|
||||
#define C_000044_DMA_VIPH2_INT 0xFFFFBFFF
|
||||
#define S_000044_DMA_VIPH3_INT(x) (((x) & 0x1) << 15)
|
||||
#define G_000044_DMA_VIPH3_INT(x) (((x) >> 15) & 0x1)
|
||||
#define C_000044_DMA_VIPH3_INT 0xFFFF7FFF
|
||||
#define S_000044_MC_PROBE_FAULT_STAT(x) (((x) & 0x1) << 16)
|
||||
#define G_000044_MC_PROBE_FAULT_STAT(x) (((x) >> 16) & 0x1)
|
||||
#define C_000044_MC_PROBE_FAULT_STAT 0xFFFEFFFF
|
||||
#define S_000044_I2C_INT(x) (((x) & 0x1) << 17)
|
||||
#define G_000044_I2C_INT(x) (((x) >> 17) & 0x1)
|
||||
#define C_000044_I2C_INT 0xFFFDFFFF
|
||||
#define S_000044_SCRATCH_INT_STAT(x) (((x) & 0x1) << 18)
|
||||
#define G_000044_SCRATCH_INT_STAT(x) (((x) >> 18) & 0x1)
|
||||
#define C_000044_SCRATCH_INT_STAT 0xFFFBFFFF
|
||||
#define S_000044_GUI_IDLE_STAT(x) (((x) & 0x1) << 19)
|
||||
#define G_000044_GUI_IDLE_STAT(x) (((x) >> 19) & 0x1)
|
||||
#define C_000044_GUI_IDLE_STAT 0xFFF7FFFF
|
||||
#define S_000044_ATI_OVERDRIVE_INT_STAT(x) (((x) & 0x1) << 20)
|
||||
#define G_000044_ATI_OVERDRIVE_INT_STAT(x) (((x) >> 20) & 0x1)
|
||||
#define C_000044_ATI_OVERDRIVE_INT_STAT 0xFFEFFFFF
|
||||
#define S_000044_MC_PROTECTION_FAULT_STAT(x) (((x) & 0x1) << 21)
|
||||
#define G_000044_MC_PROTECTION_FAULT_STAT(x) (((x) >> 21) & 0x1)
|
||||
#define C_000044_MC_PROTECTION_FAULT_STAT 0xFFDFFFFF
|
||||
#define S_000044_RBBM_READ_INT_STAT(x) (((x) & 0x1) << 22)
|
||||
#define G_000044_RBBM_READ_INT_STAT(x) (((x) >> 22) & 0x1)
|
||||
#define C_000044_RBBM_READ_INT_STAT 0xFFBFFFFF
|
||||
#define S_000044_CB_CONTEXT_SWITCH_STAT(x) (((x) & 0x1) << 23)
|
||||
#define G_000044_CB_CONTEXT_SWITCH_STAT(x) (((x) >> 23) & 0x1)
|
||||
#define C_000044_CB_CONTEXT_SWITCH_STAT 0xFF7FFFFF
|
||||
#define S_000044_VIPH_INT(x) (((x) & 0x1) << 24)
|
||||
#define G_000044_VIPH_INT(x) (((x) >> 24) & 0x1)
|
||||
#define C_000044_VIPH_INT 0xFEFFFFFF
|
||||
#define S_000044_SW_INT(x) (((x) & 0x1) << 25)
|
||||
#define G_000044_SW_INT(x) (((x) >> 25) & 0x1)
|
||||
#define C_000044_SW_INT 0xFDFFFFFF
|
||||
#define S_000044_SW_INT_SET(x) (((x) & 0x1) << 26)
|
||||
#define G_000044_SW_INT_SET(x) (((x) >> 26) & 0x1)
|
||||
#define C_000044_SW_INT_SET 0xFBFFFFFF
|
||||
#define S_000044_IDCT_INT_STAT(x) (((x) & 0x1) << 27)
|
||||
#define G_000044_IDCT_INT_STAT(x) (((x) >> 27) & 0x1)
|
||||
#define C_000044_IDCT_INT_STAT 0xF7FFFFFF
|
||||
#define S_000044_GUIDMA_STAT(x) (((x) & 0x1) << 30)
|
||||
#define G_000044_GUIDMA_STAT(x) (((x) >> 30) & 0x1)
|
||||
#define C_000044_GUIDMA_STAT 0xBFFFFFFF
|
||||
#define S_000044_VIDDMA_STAT(x) (((x) & 0x1) << 31)
|
||||
#define G_000044_VIDDMA_STAT(x) (((x) >> 31) & 0x1)
|
||||
#define C_000044_VIDDMA_STAT 0x7FFFFFFF
|
||||
#define R_00004C_BUS_CNTL 0x00004C
|
||||
#define S_00004C_BUS_MASTER_DIS(x) (((x) & 0x1) << 14)
|
||||
#define G_00004C_BUS_MASTER_DIS(x) (((x) >> 14) & 0x1)
|
||||
#define C_00004C_BUS_MASTER_DIS 0xFFFFBFFF
|
||||
#define S_00004C_BUS_MSI_REARM(x) (((x) & 0x1) << 20)
|
||||
#define G_00004C_BUS_MSI_REARM(x) (((x) >> 20) & 0x1)
|
||||
#define C_00004C_BUS_MSI_REARM 0xFFEFFFFF
|
||||
#define R_000070_MC_IND_INDEX 0x000070
|
||||
#define S_000070_MC_IND_ADDR(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000070_MC_IND_ADDR(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000070_MC_IND_ADDR 0xFFFF0000
|
||||
#define S_000070_MC_IND_SEQ_RBS_0(x) (((x) & 0x1) << 16)
|
||||
#define G_000070_MC_IND_SEQ_RBS_0(x) (((x) >> 16) & 0x1)
|
||||
#define C_000070_MC_IND_SEQ_RBS_0 0xFFFEFFFF
|
||||
#define S_000070_MC_IND_SEQ_RBS_1(x) (((x) & 0x1) << 17)
|
||||
#define G_000070_MC_IND_SEQ_RBS_1(x) (((x) >> 17) & 0x1)
|
||||
#define C_000070_MC_IND_SEQ_RBS_1 0xFFFDFFFF
|
||||
#define S_000070_MC_IND_SEQ_RBS_2(x) (((x) & 0x1) << 18)
|
||||
#define G_000070_MC_IND_SEQ_RBS_2(x) (((x) >> 18) & 0x1)
|
||||
#define C_000070_MC_IND_SEQ_RBS_2 0xFFFBFFFF
|
||||
#define S_000070_MC_IND_SEQ_RBS_3(x) (((x) & 0x1) << 19)
|
||||
#define G_000070_MC_IND_SEQ_RBS_3(x) (((x) >> 19) & 0x1)
|
||||
#define C_000070_MC_IND_SEQ_RBS_3 0xFFF7FFFF
|
||||
#define S_000070_MC_IND_AIC_RBS(x) (((x) & 0x1) << 20)
|
||||
#define G_000070_MC_IND_AIC_RBS(x) (((x) >> 20) & 0x1)
|
||||
#define C_000070_MC_IND_AIC_RBS 0xFFEFFFFF
|
||||
#define S_000070_MC_IND_CITF_ARB0(x) (((x) & 0x1) << 21)
|
||||
#define G_000070_MC_IND_CITF_ARB0(x) (((x) >> 21) & 0x1)
|
||||
#define C_000070_MC_IND_CITF_ARB0 0xFFDFFFFF
|
||||
#define S_000070_MC_IND_CITF_ARB1(x) (((x) & 0x1) << 22)
|
||||
#define G_000070_MC_IND_CITF_ARB1(x) (((x) >> 22) & 0x1)
|
||||
#define C_000070_MC_IND_CITF_ARB1 0xFFBFFFFF
|
||||
#define S_000070_MC_IND_WR_EN(x) (((x) & 0x1) << 23)
|
||||
#define G_000070_MC_IND_WR_EN(x) (((x) >> 23) & 0x1)
|
||||
#define C_000070_MC_IND_WR_EN 0xFF7FFFFF
|
||||
#define S_000070_MC_IND_RD_INV(x) (((x) & 0x1) << 24)
|
||||
#define G_000070_MC_IND_RD_INV(x) (((x) >> 24) & 0x1)
|
||||
#define C_000070_MC_IND_RD_INV 0xFEFFFFFF
|
||||
#define R_000074_MC_IND_DATA 0x000074
|
||||
#define S_000074_MC_IND_DATA(x) (((x) & 0xFFFFFFFF) << 0)
|
||||
#define G_000074_MC_IND_DATA(x) (((x) >> 0) & 0xFFFFFFFF)
|
||||
#define C_000074_MC_IND_DATA 0x00000000
|
||||
#define R_000134_HDP_FB_LOCATION 0x000134
|
||||
#define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000134_HDP_FB_START 0xFFFF0000
|
||||
#define R_0007C0_CP_STAT 0x0007C0
|
||||
#define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0)
|
||||
#define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1)
|
||||
#define C_0007C0_MRU_BUSY 0xFFFFFFFE
|
||||
#define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1)
|
||||
#define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1)
|
||||
#define C_0007C0_MWU_BUSY 0xFFFFFFFD
|
||||
#define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2)
|
||||
#define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1)
|
||||
#define C_0007C0_RSIU_BUSY 0xFFFFFFFB
|
||||
#define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3)
|
||||
#define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1)
|
||||
#define C_0007C0_RCIU_BUSY 0xFFFFFFF7
|
||||
#define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9)
|
||||
#define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1)
|
||||
#define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF
|
||||
#define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10)
|
||||
#define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF
|
||||
#define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11)
|
||||
#define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1)
|
||||
#define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF
|
||||
#define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12)
|
||||
#define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF
|
||||
#define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13)
|
||||
#define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1)
|
||||
#define C_0007C0_CSI_BUSY 0xFFFFDFFF
|
||||
#define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF
|
||||
#define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF
|
||||
#define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28)
|
||||
#define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1)
|
||||
#define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF
|
||||
#define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29)
|
||||
#define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1)
|
||||
#define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF
|
||||
#define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30)
|
||||
#define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1)
|
||||
#define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF
|
||||
#define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31)
|
||||
#define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1)
|
||||
#define C_0007C0_CP_BUSY 0x7FFFFFFF
|
||||
#define R_000E40_RBBM_STATUS 0x000E40
|
||||
#define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0)
|
||||
#define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F)
|
||||
#define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80
|
||||
#define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8)
|
||||
#define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1)
|
||||
#define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF
|
||||
#define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9)
|
||||
#define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1)
|
||||
#define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF
|
||||
#define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10)
|
||||
#define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1)
|
||||
#define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF
|
||||
#define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11)
|
||||
#define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1)
|
||||
#define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF
|
||||
#define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12)
|
||||
#define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1)
|
||||
#define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF
|
||||
#define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13)
|
||||
#define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1)
|
||||
#define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF
|
||||
#define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF
|
||||
#define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_000E40_ENG_EV_BUSY 0xFFFF7FFF
|
||||
#define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16)
|
||||
#define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1)
|
||||
#define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF
|
||||
#define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17)
|
||||
#define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1)
|
||||
#define C_000E40_E2_BUSY 0xFFFDFFFF
|
||||
#define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18)
|
||||
#define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1)
|
||||
#define C_000E40_RB2D_BUSY 0xFFFBFFFF
|
||||
#define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19)
|
||||
#define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1)
|
||||
#define C_000E40_RB3D_BUSY 0xFFF7FFFF
|
||||
#define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20)
|
||||
#define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1)
|
||||
#define C_000E40_VAP_BUSY 0xFFEFFFFF
|
||||
#define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21)
|
||||
#define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1)
|
||||
#define C_000E40_RE_BUSY 0xFFDFFFFF
|
||||
#define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22)
|
||||
#define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1)
|
||||
#define C_000E40_TAM_BUSY 0xFFBFFFFF
|
||||
#define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23)
|
||||
#define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1)
|
||||
#define C_000E40_TDM_BUSY 0xFF7FFFFF
|
||||
#define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24)
|
||||
#define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1)
|
||||
#define C_000E40_PB_BUSY 0xFEFFFFFF
|
||||
#define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25)
|
||||
#define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1)
|
||||
#define C_000E40_TIM_BUSY 0xFDFFFFFF
|
||||
#define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26)
|
||||
#define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1)
|
||||
#define C_000E40_GA_BUSY 0xFBFFFFFF
|
||||
#define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27)
|
||||
#define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1)
|
||||
#define C_000E40_CBA2D_BUSY 0xF7FFFFFF
|
||||
#define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31)
|
||||
#define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1)
|
||||
#define C_000E40_GUI_ACTIVE 0x7FFFFFFF
|
||||
#define R_0060A4_D1CRTC_STATUS_FRAME_COUNT 0x0060A4
|
||||
#define S_0060A4_D1CRTC_FRAME_COUNT(x) (((x) & 0xFFFFFF) << 0)
|
||||
#define G_0060A4_D1CRTC_FRAME_COUNT(x) (((x) >> 0) & 0xFFFFFF)
|
||||
#define C_0060A4_D1CRTC_FRAME_COUNT 0xFF000000
|
||||
#define R_006534_D1MODE_VBLANK_STATUS 0x006534
|
||||
#define S_006534_D1MODE_VBLANK_OCCURRED(x) (((x) & 0x1) << 0)
|
||||
#define G_006534_D1MODE_VBLANK_OCCURRED(x) (((x) >> 0) & 0x1)
|
||||
#define C_006534_D1MODE_VBLANK_OCCURRED 0xFFFFFFFE
|
||||
#define S_006534_D1MODE_VBLANK_ACK(x) (((x) & 0x1) << 4)
|
||||
#define G_006534_D1MODE_VBLANK_ACK(x) (((x) >> 4) & 0x1)
|
||||
#define C_006534_D1MODE_VBLANK_ACK 0xFFFFFFEF
|
||||
#define S_006534_D1MODE_VBLANK_STAT(x) (((x) & 0x1) << 12)
|
||||
#define G_006534_D1MODE_VBLANK_STAT(x) (((x) >> 12) & 0x1)
|
||||
#define C_006534_D1MODE_VBLANK_STAT 0xFFFFEFFF
|
||||
#define S_006534_D1MODE_VBLANK_INTERRUPT(x) (((x) & 0x1) << 16)
|
||||
#define G_006534_D1MODE_VBLANK_INTERRUPT(x) (((x) >> 16) & 0x1)
|
||||
#define C_006534_D1MODE_VBLANK_INTERRUPT 0xFFFEFFFF
|
||||
#define R_006540_DxMODE_INT_MASK 0x006540
|
||||
#define S_006540_D1MODE_VBLANK_INT_MASK(x) (((x) & 0x1) << 0)
|
||||
#define G_006540_D1MODE_VBLANK_INT_MASK(x) (((x) >> 0) & 0x1)
|
||||
#define C_006540_D1MODE_VBLANK_INT_MASK 0xFFFFFFFE
|
||||
#define S_006540_D1MODE_VLINE_INT_MASK(x) (((x) & 0x1) << 4)
|
||||
#define G_006540_D1MODE_VLINE_INT_MASK(x) (((x) >> 4) & 0x1)
|
||||
#define C_006540_D1MODE_VLINE_INT_MASK 0xFFFFFFEF
|
||||
#define S_006540_D2MODE_VBLANK_INT_MASK(x) (((x) & 0x1) << 8)
|
||||
#define G_006540_D2MODE_VBLANK_INT_MASK(x) (((x) >> 8) & 0x1)
|
||||
#define C_006540_D2MODE_VBLANK_INT_MASK 0xFFFFFEFF
|
||||
#define S_006540_D2MODE_VLINE_INT_MASK(x) (((x) & 0x1) << 12)
|
||||
#define G_006540_D2MODE_VLINE_INT_MASK(x) (((x) >> 12) & 0x1)
|
||||
#define C_006540_D2MODE_VLINE_INT_MASK 0xFFFFEFFF
|
||||
#define S_006540_D1MODE_VBLANK_CP_SEL(x) (((x) & 0x1) << 30)
|
||||
#define G_006540_D1MODE_VBLANK_CP_SEL(x) (((x) >> 30) & 0x1)
|
||||
#define C_006540_D1MODE_VBLANK_CP_SEL 0xBFFFFFFF
|
||||
#define S_006540_D2MODE_VBLANK_CP_SEL(x) (((x) & 0x1) << 31)
|
||||
#define G_006540_D2MODE_VBLANK_CP_SEL(x) (((x) >> 31) & 0x1)
|
||||
#define C_006540_D2MODE_VBLANK_CP_SEL 0x7FFFFFFF
|
||||
#define R_0068A4_D2CRTC_STATUS_FRAME_COUNT 0x0068A4
|
||||
#define S_0068A4_D2CRTC_FRAME_COUNT(x) (((x) & 0xFFFFFF) << 0)
|
||||
#define G_0068A4_D2CRTC_FRAME_COUNT(x) (((x) >> 0) & 0xFFFFFF)
|
||||
#define C_0068A4_D2CRTC_FRAME_COUNT 0xFF000000
|
||||
#define R_006D34_D2MODE_VBLANK_STATUS 0x006D34
|
||||
#define S_006D34_D2MODE_VBLANK_OCCURRED(x) (((x) & 0x1) << 0)
|
||||
#define G_006D34_D2MODE_VBLANK_OCCURRED(x) (((x) >> 0) & 0x1)
|
||||
#define C_006D34_D2MODE_VBLANK_OCCURRED 0xFFFFFFFE
|
||||
#define S_006D34_D2MODE_VBLANK_ACK(x) (((x) & 0x1) << 4)
|
||||
#define G_006D34_D2MODE_VBLANK_ACK(x) (((x) >> 4) & 0x1)
|
||||
#define C_006D34_D2MODE_VBLANK_ACK 0xFFFFFFEF
|
||||
#define S_006D34_D2MODE_VBLANK_STAT(x) (((x) & 0x1) << 12)
|
||||
#define G_006D34_D2MODE_VBLANK_STAT(x) (((x) >> 12) & 0x1)
|
||||
#define C_006D34_D2MODE_VBLANK_STAT 0xFFFFEFFF
|
||||
#define S_006D34_D2MODE_VBLANK_INTERRUPT(x) (((x) & 0x1) << 16)
|
||||
#define G_006D34_D2MODE_VBLANK_INTERRUPT(x) (((x) >> 16) & 0x1)
|
||||
#define C_006D34_D2MODE_VBLANK_INTERRUPT 0xFFFEFFFF
|
||||
#define R_007EDC_DISP_INTERRUPT_STATUS 0x007EDC
|
||||
#define S_007EDC_LB_D1_VBLANK_INTERRUPT(x) (((x) & 0x1) << 4)
|
||||
#define G_007EDC_LB_D1_VBLANK_INTERRUPT(x) (((x) >> 4) & 0x1)
|
||||
#define C_007EDC_LB_D1_VBLANK_INTERRUPT 0xFFFFFFEF
|
||||
#define S_007EDC_LB_D2_VBLANK_INTERRUPT(x) (((x) & 0x1) << 5)
|
||||
#define G_007EDC_LB_D2_VBLANK_INTERRUPT(x) (((x) >> 5) & 0x1)
|
||||
#define C_007EDC_LB_D2_VBLANK_INTERRUPT 0xFFFFFFDF
|
||||
|
||||
|
||||
/* MC registers */
|
||||
#define R_000000_MC_STATUS 0x000000
|
||||
#define S_000000_MC_IDLE(x) (((x) & 0x1) << 0)
|
||||
#define G_000000_MC_IDLE(x) (((x) >> 0) & 0x1)
|
||||
#define C_000000_MC_IDLE 0xFFFFFFFE
|
||||
#define R_000004_MC_FB_LOCATION 0x000004
|
||||
#define S_000004_MC_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000004_MC_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000004_MC_FB_START 0xFFFF0000
|
||||
#define S_000004_MC_FB_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_000004_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_000004_MC_FB_TOP 0x0000FFFF
|
||||
#define R_000005_MC_AGP_LOCATION 0x000005
|
||||
#define S_000005_MC_AGP_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000005_MC_AGP_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000005_MC_AGP_START 0xFFFF0000
|
||||
#define S_000005_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_000005_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_000005_MC_AGP_TOP 0x0000FFFF
|
||||
#define R_000006_AGP_BASE 0x000006
|
||||
#define S_000006_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0)
|
||||
#define G_000006_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF)
|
||||
#define C_000006_AGP_BASE_ADDR 0x00000000
|
||||
#define R_000007_AGP_BASE_2 0x000007
|
||||
#define S_000007_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0)
|
||||
#define G_000007_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF)
|
||||
#define C_000007_AGP_BASE_ADDR_2 0xFFFFFFF0
|
||||
#define R_000009_MC_CNTL1 0x000009
|
||||
#define S_000009_ENABLE_PAGE_TABLES(x) (((x) & 0x1) << 26)
|
||||
#define G_000009_ENABLE_PAGE_TABLES(x) (((x) >> 26) & 0x1)
|
||||
#define C_000009_ENABLE_PAGE_TABLES 0xFBFFFFFF
|
||||
/* FIXME don't know the various field size need feedback from AMD */
|
||||
#define R_000100_MC_PT0_CNTL 0x000100
|
||||
#define S_000100_ENABLE_PT(x) (((x) & 0x1) << 0)
|
||||
#define G_000100_ENABLE_PT(x) (((x) >> 0) & 0x1)
|
||||
#define C_000100_ENABLE_PT 0xFFFFFFFE
|
||||
#define S_000100_EFFECTIVE_L2_CACHE_SIZE(x) (((x) & 0x7) << 15)
|
||||
#define G_000100_EFFECTIVE_L2_CACHE_SIZE(x) (((x) >> 15) & 0x7)
|
||||
#define C_000100_EFFECTIVE_L2_CACHE_SIZE 0xFFFC7FFF
|
||||
#define S_000100_EFFECTIVE_L2_QUEUE_SIZE(x) (((x) & 0x7) << 21)
|
||||
#define G_000100_EFFECTIVE_L2_QUEUE_SIZE(x) (((x) >> 21) & 0x7)
|
||||
#define C_000100_EFFECTIVE_L2_QUEUE_SIZE 0xFF1FFFFF
|
||||
#define S_000100_INVALIDATE_ALL_L1_TLBS(x) (((x) & 0x1) << 28)
|
||||
#define G_000100_INVALIDATE_ALL_L1_TLBS(x) (((x) >> 28) & 0x1)
|
||||
#define C_000100_INVALIDATE_ALL_L1_TLBS 0xEFFFFFFF
|
||||
#define S_000100_INVALIDATE_L2_CACHE(x) (((x) & 0x1) << 29)
|
||||
#define G_000100_INVALIDATE_L2_CACHE(x) (((x) >> 29) & 0x1)
|
||||
#define C_000100_INVALIDATE_L2_CACHE 0xDFFFFFFF
|
||||
#define R_000102_MC_PT0_CONTEXT0_CNTL 0x000102
|
||||
#define S_000102_ENABLE_PAGE_TABLE(x) (((x) & 0x1) << 0)
|
||||
#define G_000102_ENABLE_PAGE_TABLE(x) (((x) >> 0) & 0x1)
|
||||
#define C_000102_ENABLE_PAGE_TABLE 0xFFFFFFFE
|
||||
#define S_000102_PAGE_TABLE_DEPTH(x) (((x) & 0x3) << 1)
|
||||
#define G_000102_PAGE_TABLE_DEPTH(x) (((x) >> 1) & 0x3)
|
||||
#define C_000102_PAGE_TABLE_DEPTH 0xFFFFFFF9
|
||||
#define V_000102_PAGE_TABLE_FLAT 0
|
||||
/* R600 documentation suggest that this should be a number of pages */
|
||||
#define R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR 0x000112
|
||||
#define R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR 0x000114
|
||||
#define R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR 0x00011C
|
||||
#define R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR 0x00012C
|
||||
#define R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR 0x00013C
|
||||
#define R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR 0x00014C
|
||||
#define R_00016C_MC_PT0_CLIENT0_CNTL 0x00016C
|
||||
#define S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(x) (((x) & 0x1) << 0)
|
||||
#define G_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(x) (((x) >> 0) & 0x1)
|
||||
#define C_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE 0xFFFFFFFE
|
||||
#define S_00016C_TRANSLATION_MODE_OVERRIDE(x) (((x) & 0x1) << 1)
|
||||
#define G_00016C_TRANSLATION_MODE_OVERRIDE(x) (((x) >> 1) & 0x1)
|
||||
#define C_00016C_TRANSLATION_MODE_OVERRIDE 0xFFFFFFFD
|
||||
#define S_00016C_SYSTEM_ACCESS_MODE_MASK(x) (((x) & 0x3) << 8)
|
||||
#define G_00016C_SYSTEM_ACCESS_MODE_MASK(x) (((x) >> 8) & 0x3)
|
||||
#define C_00016C_SYSTEM_ACCESS_MODE_MASK 0xFFFFFCFF
|
||||
#define V_00016C_SYSTEM_ACCESS_MODE_PA_ONLY 0
|
||||
#define V_00016C_SYSTEM_ACCESS_MODE_USE_SYS_MAP 1
|
||||
#define V_00016C_SYSTEM_ACCESS_MODE_IN_SYS 2
|
||||
#define V_00016C_SYSTEM_ACCESS_MODE_NOT_IN_SYS 3
|
||||
#define S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(x) (((x) & 0x1) << 10)
|
||||
#define G_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(x) (((x) >> 10) & 0x1)
|
||||
#define C_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS 0xFFFFFBFF
|
||||
#define V_00016C_SYSTEM_APERTURE_UNMAPPED_PASSTHROUGH 0
|
||||
#define V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE 1
|
||||
#define S_00016C_EFFECTIVE_L1_CACHE_SIZE(x) (((x) & 0x7) << 11)
|
||||
#define G_00016C_EFFECTIVE_L1_CACHE_SIZE(x) (((x) >> 11) & 0x7)
|
||||
#define C_00016C_EFFECTIVE_L1_CACHE_SIZE 0xFFFFC7FF
|
||||
#define S_00016C_ENABLE_FRAGMENT_PROCESSING(x) (((x) & 0x1) << 14)
|
||||
#define G_00016C_ENABLE_FRAGMENT_PROCESSING(x) (((x) >> 14) & 0x1)
|
||||
#define C_00016C_ENABLE_FRAGMENT_PROCESSING 0xFFFFBFFF
|
||||
#define S_00016C_EFFECTIVE_L1_QUEUE_SIZE(x) (((x) & 0x7) << 15)
|
||||
#define G_00016C_EFFECTIVE_L1_QUEUE_SIZE(x) (((x) >> 15) & 0x7)
|
||||
#define C_00016C_EFFECTIVE_L1_QUEUE_SIZE 0xFFFC7FFF
|
||||
#define S_00016C_INVALIDATE_L1_TLB(x) (((x) & 0x1) << 20)
|
||||
#define G_00016C_INVALIDATE_L1_TLB(x) (((x) >> 20) & 0x1)
|
||||
#define C_00016C_INVALIDATE_L1_TLB 0xFFEFFFFF
|
||||
|
||||
#endif
|
|
@ -26,105 +26,29 @@
|
|||
* Jerome Glisse
|
||||
*/
|
||||
#include "drmP.h"
|
||||
#include "radeon_reg.h"
|
||||
#include "radeon.h"
|
||||
#include "rs690r.h"
|
||||
#include "atom.h"
|
||||
#include "atom-bits.h"
|
||||
#include "rs690d.h"
|
||||
|
||||
/* rs690,rs740 depends on : */
|
||||
void r100_hdp_reset(struct radeon_device *rdev);
|
||||
int r300_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
void r420_pipes_init(struct radeon_device *rdev);
|
||||
void rs400_gart_disable(struct radeon_device *rdev);
|
||||
int rs400_gart_enable(struct radeon_device *rdev);
|
||||
void rs400_gart_adjust_size(struct radeon_device *rdev);
|
||||
void rs600_mc_disable_clients(struct radeon_device *rdev);
|
||||
|
||||
/* This files gather functions specifics to :
|
||||
* rs690,rs740
|
||||
*
|
||||
* Some of these functions might be used by newer ASICs.
|
||||
*/
|
||||
void rs690_gpu_init(struct radeon_device *rdev);
|
||||
int rs690_mc_wait_for_idle(struct radeon_device *rdev);
|
||||
|
||||
|
||||
/*
|
||||
* MC functions.
|
||||
*/
|
||||
int rs690_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
uint32_t tmp;
|
||||
int r;
|
||||
|
||||
if (r100_debugfs_rbbm_init(rdev)) {
|
||||
DRM_ERROR("Failed to register debugfs file for RBBM !\n");
|
||||
}
|
||||
|
||||
rs690_gpu_init(rdev);
|
||||
rs400_gart_disable(rdev);
|
||||
|
||||
/* Setup GPU memory space */
|
||||
rdev->mc.gtt_location = rdev->mc.mc_vram_size;
|
||||
rdev->mc.gtt_location += (rdev->mc.gtt_size - 1);
|
||||
rdev->mc.gtt_location &= ~(rdev->mc.gtt_size - 1);
|
||||
rdev->mc.vram_location = 0xFFFFFFFFUL;
|
||||
r = radeon_mc_setup(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Program GPU memory space */
|
||||
rs600_mc_disable_clients(rdev);
|
||||
if (rs690_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "Failed to wait MC idle while "
|
||||
"programming pipes. Bad things might happen.\n");
|
||||
}
|
||||
tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
|
||||
tmp = REG_SET(RS690_MC_FB_TOP, tmp >> 16);
|
||||
tmp |= REG_SET(RS690_MC_FB_START, rdev->mc.vram_location >> 16);
|
||||
WREG32_MC(RS690_MCCFG_FB_LOCATION, tmp);
|
||||
/* FIXME: Does this reg exist on RS480,RS740 ? */
|
||||
WREG32(0x310, rdev->mc.vram_location);
|
||||
WREG32(RS690_HDP_FB_LOCATION, rdev->mc.vram_location >> 16);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rs690_mc_fini(struct radeon_device *rdev)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Global GPU functions
|
||||
*/
|
||||
int rs690_mc_wait_for_idle(struct radeon_device *rdev)
|
||||
static int rs690_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_MC(RS690_MC_STATUS);
|
||||
if (tmp & RS690_MC_STATUS_IDLE) {
|
||||
tmp = RREG32_MC(R_000090_MC_SYSTEM_STATUS);
|
||||
if (G_000090_MC_SYSTEM_IDLE(tmp))
|
||||
return 0;
|
||||
}
|
||||
DRM_UDELAY(1);
|
||||
udelay(1);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void rs690_errata(struct radeon_device *rdev)
|
||||
{
|
||||
rdev->pll_errata = 0;
|
||||
}
|
||||
|
||||
void rs690_gpu_init(struct radeon_device *rdev)
|
||||
static void rs690_gpu_init(struct radeon_device *rdev)
|
||||
{
|
||||
/* FIXME: HDP same place on rs690 ? */
|
||||
r100_hdp_reset(rdev);
|
||||
rv515_vga_render_disable(rdev);
|
||||
/* FIXME: is this correct ? */
|
||||
r420_pipes_init(rdev);
|
||||
if (rs690_mc_wait_for_idle(rdev)) {
|
||||
|
@ -133,10 +57,6 @@ void rs690_gpu_init(struct radeon_device *rdev)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* VRAM info.
|
||||
*/
|
||||
void rs690_pm_info(struct radeon_device *rdev)
|
||||
{
|
||||
int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo);
|
||||
|
@ -250,39 +170,39 @@ void rs690_line_buffer_adjust(struct radeon_device *rdev,
|
|||
/*
|
||||
* Line Buffer Setup
|
||||
* There is a single line buffer shared by both display controllers.
|
||||
* DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
|
||||
* R_006520_DC_LB_MEMORY_SPLIT controls how that line buffer is shared between
|
||||
* the display controllers. The paritioning can either be done
|
||||
* manually or via one of four preset allocations specified in bits 1:0:
|
||||
* 0 - line buffer is divided in half and shared between crtc
|
||||
* 1 - D1 gets 3/4 of the line buffer, D2 gets 1/4
|
||||
* 2 - D1 gets the whole buffer
|
||||
* 3 - D1 gets 1/4 of the line buffer, D2 gets 3/4
|
||||
* Setting bit 2 of DC_LB_MEMORY_SPLIT controls switches to manual
|
||||
* Setting bit 2 of R_006520_DC_LB_MEMORY_SPLIT controls switches to manual
|
||||
* allocation mode. In manual allocation mode, D1 always starts at 0,
|
||||
* D1 end/2 is specified in bits 14:4; D2 allocation follows D1.
|
||||
*/
|
||||
tmp = RREG32(DC_LB_MEMORY_SPLIT) & ~DC_LB_MEMORY_SPLIT_MASK;
|
||||
tmp &= ~DC_LB_MEMORY_SPLIT_SHIFT_MODE;
|
||||
tmp = RREG32(R_006520_DC_LB_MEMORY_SPLIT) & C_006520_DC_LB_MEMORY_SPLIT;
|
||||
tmp &= ~C_006520_DC_LB_MEMORY_SPLIT_MODE;
|
||||
/* auto */
|
||||
if (mode1 && mode2) {
|
||||
if (mode1->hdisplay > mode2->hdisplay) {
|
||||
if (mode1->hdisplay > 2560)
|
||||
tmp |= DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q;
|
||||
tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q;
|
||||
else
|
||||
tmp |= DC_LB_MEMORY_SPLIT_D1HALF_D2HALF;
|
||||
tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF;
|
||||
} else if (mode2->hdisplay > mode1->hdisplay) {
|
||||
if (mode2->hdisplay > 2560)
|
||||
tmp |= DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q;
|
||||
tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q;
|
||||
else
|
||||
tmp |= DC_LB_MEMORY_SPLIT_D1HALF_D2HALF;
|
||||
tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF;
|
||||
} else
|
||||
tmp |= AVIVO_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF;
|
||||
tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF;
|
||||
} else if (mode1) {
|
||||
tmp |= DC_LB_MEMORY_SPLIT_D1_ONLY;
|
||||
tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_ONLY;
|
||||
} else if (mode2) {
|
||||
tmp |= DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q;
|
||||
tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q;
|
||||
}
|
||||
WREG32(DC_LB_MEMORY_SPLIT, tmp);
|
||||
WREG32(R_006520_DC_LB_MEMORY_SPLIT, tmp);
|
||||
}
|
||||
|
||||
struct rs690_watermark {
|
||||
|
@ -487,28 +407,28 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||
* option.
|
||||
*/
|
||||
if (rdev->disp_priority == 2) {
|
||||
tmp = RREG32_MC(MC_INIT_MISC_LAT_TIMER);
|
||||
tmp &= ~MC_DISP1R_INIT_LAT_MASK;
|
||||
tmp &= ~MC_DISP0R_INIT_LAT_MASK;
|
||||
if (mode1)
|
||||
tmp |= (1 << MC_DISP1R_INIT_LAT_SHIFT);
|
||||
tmp = RREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER);
|
||||
tmp &= C_000104_MC_DISP0R_INIT_LAT;
|
||||
tmp &= C_000104_MC_DISP1R_INIT_LAT;
|
||||
if (mode0)
|
||||
tmp |= (1 << MC_DISP0R_INIT_LAT_SHIFT);
|
||||
WREG32_MC(MC_INIT_MISC_LAT_TIMER, tmp);
|
||||
tmp |= S_000104_MC_DISP0R_INIT_LAT(1);
|
||||
if (mode1)
|
||||
tmp |= S_000104_MC_DISP1R_INIT_LAT(1);
|
||||
WREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER, tmp);
|
||||
}
|
||||
rs690_line_buffer_adjust(rdev, mode0, mode1);
|
||||
|
||||
if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740))
|
||||
WREG32(DCP_CONTROL, 0);
|
||||
WREG32(R_006C9C_DCP_CONTROL, 0);
|
||||
if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880))
|
||||
WREG32(DCP_CONTROL, 2);
|
||||
WREG32(R_006C9C_DCP_CONTROL, 2);
|
||||
|
||||
rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[0], &wm0);
|
||||
rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[1], &wm1);
|
||||
|
||||
tmp = (wm0.lb_request_fifo_depth - 1);
|
||||
tmp |= (wm1.lb_request_fifo_depth - 1) << 16;
|
||||
WREG32(LB_MAX_REQ_OUTSTANDING, tmp);
|
||||
WREG32(R_006D58_LB_MAX_REQ_OUTSTANDING, tmp);
|
||||
|
||||
if (mode0 && mode1) {
|
||||
if (rfixed_trunc(wm0.dbpp) > 64)
|
||||
|
@ -561,10 +481,10 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||
priority_mark12.full = 0;
|
||||
if (wm1.priority_mark_max.full > priority_mark12.full)
|
||||
priority_mark12.full = wm1.priority_mark_max.full;
|
||||
WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
||||
WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
||||
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
||||
} else if (mode0) {
|
||||
if (rfixed_trunc(wm0.dbpp) > 64)
|
||||
a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair);
|
||||
|
@ -591,10 +511,12 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||
priority_mark02.full = 0;
|
||||
if (wm0.priority_mark_max.full > priority_mark02.full)
|
||||
priority_mark02.full = wm0.priority_mark_max.full;
|
||||
WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);
|
||||
WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);
|
||||
WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02));
|
||||
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT,
|
||||
S_006D48_D2MODE_PRIORITY_A_OFF(1));
|
||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT,
|
||||
S_006D4C_D2MODE_PRIORITY_B_OFF(1));
|
||||
} else {
|
||||
if (rfixed_trunc(wm1.dbpp) > 64)
|
||||
a.full = rfixed_mul(wm1.dbpp, wm1.num_line_pair);
|
||||
|
@ -621,30 +543,203 @@ void rs690_bandwidth_update(struct radeon_device *rdev)
|
|||
priority_mark12.full = 0;
|
||||
if (wm1.priority_mark_max.full > priority_mark12.full)
|
||||
priority_mark12.full = wm1.priority_mark_max.full;
|
||||
WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF);
|
||||
WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF);
|
||||
WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
||||
WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
||||
WREG32(R_006548_D1MODE_PRIORITY_A_CNT,
|
||||
S_006548_D1MODE_PRIORITY_A_OFF(1));
|
||||
WREG32(R_00654C_D1MODE_PRIORITY_B_CNT,
|
||||
S_00654C_D1MODE_PRIORITY_B_OFF(1));
|
||||
WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12));
|
||||
WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Indirect registers accessor
|
||||
*/
|
||||
uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
WREG32(RS690_MC_INDEX, (reg & RS690_MC_INDEX_MASK));
|
||||
r = RREG32(RS690_MC_DATA);
|
||||
WREG32(RS690_MC_INDEX, RS690_MC_INDEX_MASK);
|
||||
WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg));
|
||||
r = RREG32(R_00007C_MC_DATA);
|
||||
WREG32(R_000078_MC_INDEX, ~C_000078_MC_IND_ADDR);
|
||||
return r;
|
||||
}
|
||||
|
||||
void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
|
||||
{
|
||||
WREG32(RS690_MC_INDEX,
|
||||
RS690_MC_INDEX_WR_EN | ((reg) & RS690_MC_INDEX_MASK));
|
||||
WREG32(RS690_MC_DATA, v);
|
||||
WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK);
|
||||
WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg) |
|
||||
S_000078_MC_IND_WR_EN(1));
|
||||
WREG32(R_00007C_MC_DATA, v);
|
||||
WREG32(R_000078_MC_INDEX, 0x7F);
|
||||
}
|
||||
|
||||
void rs690_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
struct rv515_mc_save save;
|
||||
|
||||
/* Stops all mc clients */
|
||||
rv515_mc_stop(rdev, &save);
|
||||
|
||||
/* Wait for mc idle */
|
||||
if (rs690_mc_wait_for_idle(rdev))
|
||||
dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
|
||||
/* Program MC, should be a 32bits limited address space */
|
||||
WREG32_MC(R_000100_MCCFG_FB_LOCATION,
|
||||
S_000100_MC_FB_START(rdev->mc.vram_start >> 16) |
|
||||
S_000100_MC_FB_TOP(rdev->mc.vram_end >> 16));
|
||||
WREG32(R_000134_HDP_FB_LOCATION,
|
||||
S_000134_HDP_FB_START(rdev->mc.vram_start >> 16));
|
||||
|
||||
rv515_mc_resume(rdev, &save);
|
||||
}
|
||||
|
||||
static int rs690_startup(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
rs690_mc_program(rdev);
|
||||
/* Resume clock */
|
||||
rv515_clock_startup(rdev);
|
||||
/* Initialize GPU configuration (# pipes, ...) */
|
||||
rs690_gpu_init(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;
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
rs600_irq_set(rdev);
|
||||
/* 1M ring buffer */
|
||||
r = r100_cp_init(rdev, 1024 * 1024);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing CP (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
r = r100_wb_init(rdev);
|
||||
if (r)
|
||||
dev_err(rdev->dev, "failled initializing WB (%d).\n", r);
|
||||
r = r100_ib_init(rdev);
|
||||
if (r) {
|
||||
dev_err(rdev->dev, "failled initializing IB (%d).\n", r);
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rs690_resume(struct radeon_device *rdev)
|
||||
{
|
||||
/* Make sur GART are not working */
|
||||
rs400_gart_disable(rdev);
|
||||
/* Resume clock before doing reset */
|
||||
rv515_clock_startup(rdev);
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_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 */
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
/* Resume clock after posting */
|
||||
rv515_clock_startup(rdev);
|
||||
return rs690_startup(rdev);
|
||||
}
|
||||
|
||||
int rs690_suspend(struct radeon_device *rdev)
|
||||
{
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
rs600_irq_disable(rdev);
|
||||
rs400_gart_disable(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rs690_fini(struct radeon_device *rdev)
|
||||
{
|
||||
rs690_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
rs400_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_object_fini(rdev);
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
}
|
||||
|
||||
int rs690_init(struct radeon_device *rdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
/* Disable VGA */
|
||||
rv515_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 */
|
||||
/* BIOS*/
|
||||
if (!radeon_get_bios(rdev)) {
|
||||
if (ASIC_IS_AVIVO(rdev))
|
||||
return -EINVAL;
|
||||
}
|
||||
if (rdev->is_atom_bios) {
|
||||
r = radeon_atombios_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
} else {
|
||||
dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
/* Reset gpu before posting otherwise ATOM will enter infinite loop */
|
||||
if (radeon_gpu_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_card_posted(rdev) && rdev->bios) {
|
||||
DRM_INFO("GPU not posted. posting now...\n");
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
}
|
||||
/* Initialize clocks */
|
||||
radeon_get_clock_info(rdev->ddev);
|
||||
/* Get vram informations */
|
||||
rs690_vram_info(rdev);
|
||||
/* Initialize memory controller (also test AGP) */
|
||||
r = r420_mc_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
rv515_debugfs(rdev);
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = rs400_gart_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
rs600_set_safe_registers(rdev);
|
||||
rdev->accel_working = true;
|
||||
r = rs690_startup(rdev);
|
||||
if (r) {
|
||||
/* Somethings want wront with the accel init stop accel */
|
||||
dev_err(rdev->dev, "Disabling GPU acceleration\n");
|
||||
rs690_suspend(rdev);
|
||||
r100_cp_fini(rdev);
|
||||
r100_wb_fini(rdev);
|
||||
r100_ib_fini(rdev);
|
||||
rs400_gart_fini(rdev);
|
||||
radeon_irq_kms_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,307 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef __RS690D_H__
|
||||
#define __RS690D_H__
|
||||
|
||||
/* Registers */
|
||||
#define R_000078_MC_INDEX 0x000078
|
||||
#define S_000078_MC_IND_ADDR(x) (((x) & 0x1FF) << 0)
|
||||
#define G_000078_MC_IND_ADDR(x) (((x) >> 0) & 0x1FF)
|
||||
#define C_000078_MC_IND_ADDR 0xFFFFFE00
|
||||
#define S_000078_MC_IND_WR_EN(x) (((x) & 0x1) << 9)
|
||||
#define G_000078_MC_IND_WR_EN(x) (((x) >> 9) & 0x1)
|
||||
#define C_000078_MC_IND_WR_EN 0xFFFFFDFF
|
||||
#define R_00007C_MC_DATA 0x00007C
|
||||
#define S_00007C_MC_DATA(x) (((x) & 0xFFFFFFFF) << 0)
|
||||
#define G_00007C_MC_DATA(x) (((x) >> 0) & 0xFFFFFFFF)
|
||||
#define C_00007C_MC_DATA 0x00000000
|
||||
#define R_0000F8_CONFIG_MEMSIZE 0x0000F8
|
||||
#define S_0000F8_CONFIG_MEMSIZE(x) (((x) & 0xFFFFFFFF) << 0)
|
||||
#define G_0000F8_CONFIG_MEMSIZE(x) (((x) >> 0) & 0xFFFFFFFF)
|
||||
#define C_0000F8_CONFIG_MEMSIZE 0x00000000
|
||||
#define R_000134_HDP_FB_LOCATION 0x000134
|
||||
#define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000134_HDP_FB_START 0xFFFF0000
|
||||
#define R_0007C0_CP_STAT 0x0007C0
|
||||
#define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0)
|
||||
#define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1)
|
||||
#define C_0007C0_MRU_BUSY 0xFFFFFFFE
|
||||
#define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1)
|
||||
#define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1)
|
||||
#define C_0007C0_MWU_BUSY 0xFFFFFFFD
|
||||
#define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2)
|
||||
#define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1)
|
||||
#define C_0007C0_RSIU_BUSY 0xFFFFFFFB
|
||||
#define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3)
|
||||
#define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1)
|
||||
#define C_0007C0_RCIU_BUSY 0xFFFFFFF7
|
||||
#define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9)
|
||||
#define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1)
|
||||
#define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF
|
||||
#define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10)
|
||||
#define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF
|
||||
#define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11)
|
||||
#define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1)
|
||||
#define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF
|
||||
#define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12)
|
||||
#define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF
|
||||
#define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13)
|
||||
#define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1)
|
||||
#define C_0007C0_CSI_BUSY 0xFFFFDFFF
|
||||
#define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF
|
||||
#define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF
|
||||
#define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28)
|
||||
#define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1)
|
||||
#define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF
|
||||
#define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29)
|
||||
#define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1)
|
||||
#define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF
|
||||
#define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30)
|
||||
#define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1)
|
||||
#define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF
|
||||
#define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31)
|
||||
#define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1)
|
||||
#define C_0007C0_CP_BUSY 0x7FFFFFFF
|
||||
#define R_000E40_RBBM_STATUS 0x000E40
|
||||
#define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0)
|
||||
#define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F)
|
||||
#define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80
|
||||
#define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8)
|
||||
#define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1)
|
||||
#define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF
|
||||
#define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9)
|
||||
#define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1)
|
||||
#define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF
|
||||
#define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10)
|
||||
#define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1)
|
||||
#define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF
|
||||
#define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11)
|
||||
#define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1)
|
||||
#define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF
|
||||
#define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12)
|
||||
#define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1)
|
||||
#define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF
|
||||
#define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13)
|
||||
#define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1)
|
||||
#define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF
|
||||
#define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14)
|
||||
#define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1)
|
||||
#define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF
|
||||
#define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15)
|
||||
#define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1)
|
||||
#define C_000E40_ENG_EV_BUSY 0xFFFF7FFF
|
||||
#define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16)
|
||||
#define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1)
|
||||
#define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF
|
||||
#define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17)
|
||||
#define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1)
|
||||
#define C_000E40_E2_BUSY 0xFFFDFFFF
|
||||
#define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18)
|
||||
#define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1)
|
||||
#define C_000E40_RB2D_BUSY 0xFFFBFFFF
|
||||
#define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19)
|
||||
#define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1)
|
||||
#define C_000E40_RB3D_BUSY 0xFFF7FFFF
|
||||
#define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20)
|
||||
#define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1)
|
||||
#define C_000E40_VAP_BUSY 0xFFEFFFFF
|
||||
#define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21)
|
||||
#define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1)
|
||||
#define C_000E40_RE_BUSY 0xFFDFFFFF
|
||||
#define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22)
|
||||
#define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1)
|
||||
#define C_000E40_TAM_BUSY 0xFFBFFFFF
|
||||
#define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23)
|
||||
#define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1)
|
||||
#define C_000E40_TDM_BUSY 0xFF7FFFFF
|
||||
#define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24)
|
||||
#define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1)
|
||||
#define C_000E40_PB_BUSY 0xFEFFFFFF
|
||||
#define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25)
|
||||
#define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1)
|
||||
#define C_000E40_TIM_BUSY 0xFDFFFFFF
|
||||
#define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26)
|
||||
#define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1)
|
||||
#define C_000E40_GA_BUSY 0xFBFFFFFF
|
||||
#define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27)
|
||||
#define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1)
|
||||
#define C_000E40_CBA2D_BUSY 0xF7FFFFFF
|
||||
#define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31)
|
||||
#define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1)
|
||||
#define C_000E40_GUI_ACTIVE 0x7FFFFFFF
|
||||
#define R_006520_DC_LB_MEMORY_SPLIT 0x006520
|
||||
#define S_006520_DC_LB_MEMORY_SPLIT(x) (((x) & 0x3) << 0)
|
||||
#define G_006520_DC_LB_MEMORY_SPLIT(x) (((x) >> 0) & 0x3)
|
||||
#define C_006520_DC_LB_MEMORY_SPLIT 0xFFFFFFFC
|
||||
#define S_006520_DC_LB_MEMORY_SPLIT_MODE(x) (((x) & 0x1) << 2)
|
||||
#define G_006520_DC_LB_MEMORY_SPLIT_MODE(x) (((x) >> 2) & 0x1)
|
||||
#define C_006520_DC_LB_MEMORY_SPLIT_MODE 0xFFFFFFFB
|
||||
#define V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF 0
|
||||
#define V_006520_DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q 1
|
||||
#define V_006520_DC_LB_MEMORY_SPLIT_D1_ONLY 2
|
||||
#define V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q 3
|
||||
#define S_006520_DC_LB_DISP1_END_ADR(x) (((x) & 0x7FF) << 4)
|
||||
#define G_006520_DC_LB_DISP1_END_ADR(x) (((x) >> 4) & 0x7FF)
|
||||
#define C_006520_DC_LB_DISP1_END_ADR 0xFFFF800F
|
||||
#define R_006548_D1MODE_PRIORITY_A_CNT 0x006548
|
||||
#define S_006548_D1MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0)
|
||||
#define G_006548_D1MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF)
|
||||
#define C_006548_D1MODE_PRIORITY_MARK_A 0xFFFF8000
|
||||
#define S_006548_D1MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16)
|
||||
#define G_006548_D1MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1)
|
||||
#define C_006548_D1MODE_PRIORITY_A_OFF 0xFFFEFFFF
|
||||
#define S_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||
#define G_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||
#define C_006548_D1MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF
|
||||
#define R_00654C_D1MODE_PRIORITY_B_CNT 0x00654C
|
||||
#define S_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0)
|
||||
#define G_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF)
|
||||
#define C_00654C_D1MODE_PRIORITY_MARK_B 0xFFFF8000
|
||||
#define S_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16)
|
||||
#define G_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1)
|
||||
#define C_00654C_D1MODE_PRIORITY_B_OFF 0xFFFEFFFF
|
||||
#define S_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||
#define G_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||
#define C_00654C_D1MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF
|
||||
#define S_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||
#define G_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||
#define C_00654C_D1MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF
|
||||
#define R_006C9C_DCP_CONTROL 0x006C9C
|
||||
#define R_006D48_D2MODE_PRIORITY_A_CNT 0x006D48
|
||||
#define S_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0)
|
||||
#define G_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF)
|
||||
#define C_006D48_D2MODE_PRIORITY_MARK_A 0xFFFF8000
|
||||
#define S_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16)
|
||||
#define G_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1)
|
||||
#define C_006D48_D2MODE_PRIORITY_A_OFF 0xFFFEFFFF
|
||||
#define S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||
#define G_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||
#define C_006D48_D2MODE_PRIORITY_A_ALWAYS_ON 0xFFEFFFFF
|
||||
#define S_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||
#define G_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||
#define C_006D48_D2MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF
|
||||
#define R_006D4C_D2MODE_PRIORITY_B_CNT 0x006D4C
|
||||
#define S_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0)
|
||||
#define G_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF)
|
||||
#define C_006D4C_D2MODE_PRIORITY_MARK_B 0xFFFF8000
|
||||
#define S_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16)
|
||||
#define G_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1)
|
||||
#define C_006D4C_D2MODE_PRIORITY_B_OFF 0xFFFEFFFF
|
||||
#define S_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20)
|
||||
#define G_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1)
|
||||
#define C_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF
|
||||
#define S_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24)
|
||||
#define G_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1)
|
||||
#define C_006D4C_D2MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF
|
||||
#define R_006D58_LB_MAX_REQ_OUTSTANDING 0x006D58
|
||||
#define S_006D58_LB_D1_MAX_REQ_OUTSTANDING(x) (((x) & 0xF) << 0)
|
||||
#define G_006D58_LB_D1_MAX_REQ_OUTSTANDING(x) (((x) >> 0) & 0xF)
|
||||
#define C_006D58_LB_D1_MAX_REQ_OUTSTANDING 0xFFFFFFF0
|
||||
#define S_006D58_LB_D2_MAX_REQ_OUTSTANDING(x) (((x) & 0xF) << 16)
|
||||
#define G_006D58_LB_D2_MAX_REQ_OUTSTANDING(x) (((x) >> 16) & 0xF)
|
||||
#define C_006D58_LB_D2_MAX_REQ_OUTSTANDING 0xFFF0FFFF
|
||||
|
||||
|
||||
#define R_000090_MC_SYSTEM_STATUS 0x000090
|
||||
#define S_000090_MC_SYSTEM_IDLE(x) (((x) & 0x1) << 0)
|
||||
#define G_000090_MC_SYSTEM_IDLE(x) (((x) >> 0) & 0x1)
|
||||
#define C_000090_MC_SYSTEM_IDLE 0xFFFFFFFE
|
||||
#define S_000090_MC_SEQUENCER_IDLE(x) (((x) & 0x1) << 1)
|
||||
#define G_000090_MC_SEQUENCER_IDLE(x) (((x) >> 1) & 0x1)
|
||||
#define C_000090_MC_SEQUENCER_IDLE 0xFFFFFFFD
|
||||
#define S_000090_MC_ARBITER_IDLE(x) (((x) & 0x1) << 2)
|
||||
#define G_000090_MC_ARBITER_IDLE(x) (((x) >> 2) & 0x1)
|
||||
#define C_000090_MC_ARBITER_IDLE 0xFFFFFFFB
|
||||
#define S_000090_MC_SELECT_PM(x) (((x) & 0x1) << 3)
|
||||
#define G_000090_MC_SELECT_PM(x) (((x) >> 3) & 0x1)
|
||||
#define C_000090_MC_SELECT_PM 0xFFFFFFF7
|
||||
#define S_000090_RESERVED4(x) (((x) & 0xF) << 4)
|
||||
#define G_000090_RESERVED4(x) (((x) >> 4) & 0xF)
|
||||
#define C_000090_RESERVED4 0xFFFFFF0F
|
||||
#define S_000090_RESERVED8(x) (((x) & 0xF) << 8)
|
||||
#define G_000090_RESERVED8(x) (((x) >> 8) & 0xF)
|
||||
#define C_000090_RESERVED8 0xFFFFF0FF
|
||||
#define S_000090_RESERVED12(x) (((x) & 0xF) << 12)
|
||||
#define G_000090_RESERVED12(x) (((x) >> 12) & 0xF)
|
||||
#define C_000090_RESERVED12 0xFFFF0FFF
|
||||
#define S_000090_MCA_INIT_EXECUTED(x) (((x) & 0x1) << 16)
|
||||
#define G_000090_MCA_INIT_EXECUTED(x) (((x) >> 16) & 0x1)
|
||||
#define C_000090_MCA_INIT_EXECUTED 0xFFFEFFFF
|
||||
#define S_000090_MCA_IDLE(x) (((x) & 0x1) << 17)
|
||||
#define G_000090_MCA_IDLE(x) (((x) >> 17) & 0x1)
|
||||
#define C_000090_MCA_IDLE 0xFFFDFFFF
|
||||
#define S_000090_MCA_SEQ_IDLE(x) (((x) & 0x1) << 18)
|
||||
#define G_000090_MCA_SEQ_IDLE(x) (((x) >> 18) & 0x1)
|
||||
#define C_000090_MCA_SEQ_IDLE 0xFFFBFFFF
|
||||
#define S_000090_MCA_ARB_IDLE(x) (((x) & 0x1) << 19)
|
||||
#define G_000090_MCA_ARB_IDLE(x) (((x) >> 19) & 0x1)
|
||||
#define C_000090_MCA_ARB_IDLE 0xFFF7FFFF
|
||||
#define S_000090_RESERVED20(x) (((x) & 0xFFF) << 20)
|
||||
#define G_000090_RESERVED20(x) (((x) >> 20) & 0xFFF)
|
||||
#define C_000090_RESERVED20 0x000FFFFF
|
||||
#define R_000100_MCCFG_FB_LOCATION 0x000100
|
||||
#define S_000100_MC_FB_START(x) (((x) & 0xFFFF) << 0)
|
||||
#define G_000100_MC_FB_START(x) (((x) >> 0) & 0xFFFF)
|
||||
#define C_000100_MC_FB_START 0xFFFF0000
|
||||
#define S_000100_MC_FB_TOP(x) (((x) & 0xFFFF) << 16)
|
||||
#define G_000100_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF)
|
||||
#define C_000100_MC_FB_TOP 0x0000FFFF
|
||||
#define R_000104_MC_INIT_MISC_LAT_TIMER 0x000104
|
||||
#define S_000104_MC_CPR_INIT_LAT(x) (((x) & 0xF) << 0)
|
||||
#define G_000104_MC_CPR_INIT_LAT(x) (((x) >> 0) & 0xF)
|
||||
#define C_000104_MC_CPR_INIT_LAT 0xFFFFFFF0
|
||||
#define S_000104_MC_VF_INIT_LAT(x) (((x) & 0xF) << 4)
|
||||
#define G_000104_MC_VF_INIT_LAT(x) (((x) >> 4) & 0xF)
|
||||
#define C_000104_MC_VF_INIT_LAT 0xFFFFFF0F
|
||||
#define S_000104_MC_DISP0R_INIT_LAT(x) (((x) & 0xF) << 8)
|
||||
#define G_000104_MC_DISP0R_INIT_LAT(x) (((x) >> 8) & 0xF)
|
||||
#define C_000104_MC_DISP0R_INIT_LAT 0xFFFFF0FF
|
||||
#define S_000104_MC_DISP1R_INIT_LAT(x) (((x) & 0xF) << 12)
|
||||
#define G_000104_MC_DISP1R_INIT_LAT(x) (((x) >> 12) & 0xF)
|
||||
#define C_000104_MC_DISP1R_INIT_LAT 0xFFFF0FFF
|
||||
#define S_000104_MC_FIXED_INIT_LAT(x) (((x) & 0xF) << 16)
|
||||
#define G_000104_MC_FIXED_INIT_LAT(x) (((x) >> 16) & 0xF)
|
||||
#define C_000104_MC_FIXED_INIT_LAT 0xFFF0FFFF
|
||||
#define S_000104_MC_E2R_INIT_LAT(x) (((x) & 0xF) << 20)
|
||||
#define G_000104_MC_E2R_INIT_LAT(x) (((x) >> 20) & 0xF)
|
||||
#define C_000104_MC_E2R_INIT_LAT 0xFF0FFFFF
|
||||
#define S_000104_SAME_PAGE_PRIO(x) (((x) & 0xF) << 24)
|
||||
#define G_000104_SAME_PAGE_PRIO(x) (((x) >> 24) & 0xF)
|
||||
#define C_000104_SAME_PAGE_PRIO 0xF0FFFFFF
|
||||
#define S_000104_MC_GLOBW_INIT_LAT(x) (((x) & 0xF) << 28)
|
||||
#define G_000104_MC_GLOBW_INIT_LAT(x) (((x) >> 28) & 0xF)
|
||||
#define C_000104_MC_GLOBW_INIT_LAT 0x0FFFFFFF
|
||||
|
||||
#endif
|
|
@ -1,99 +0,0 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef RS690R_H
|
||||
#define RS690R_H
|
||||
|
||||
/* RS690/RS740 registers */
|
||||
#define MC_INDEX 0x0078
|
||||
# define MC_INDEX_MASK 0x1FF
|
||||
# define MC_INDEX_WR_EN (1 << 9)
|
||||
# define MC_INDEX_WR_ACK 0x7F
|
||||
#define MC_DATA 0x007C
|
||||
#define HDP_FB_LOCATION 0x0134
|
||||
#define DC_LB_MEMORY_SPLIT 0x6520
|
||||
#define DC_LB_MEMORY_SPLIT_MASK 0x00000003
|
||||
#define DC_LB_MEMORY_SPLIT_SHIFT 0
|
||||
#define DC_LB_MEMORY_SPLIT_D1HALF_D2HALF 0
|
||||
#define DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q 1
|
||||
#define DC_LB_MEMORY_SPLIT_D1_ONLY 2
|
||||
#define DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q 3
|
||||
#define DC_LB_MEMORY_SPLIT_SHIFT_MODE (1 << 2)
|
||||
#define DC_LB_DISP1_END_ADR_SHIFT 4
|
||||
#define DC_LB_DISP1_END_ADR_MASK 0x00007FF0
|
||||
#define D1MODE_PRIORITY_A_CNT 0x6548
|
||||
#define MODE_PRIORITY_MARK_MASK 0x00007FFF
|
||||
#define MODE_PRIORITY_OFF (1 << 16)
|
||||
#define MODE_PRIORITY_ALWAYS_ON (1 << 20)
|
||||
#define MODE_PRIORITY_FORCE_MASK (1 << 24)
|
||||
#define D1MODE_PRIORITY_B_CNT 0x654C
|
||||
#define LB_MAX_REQ_OUTSTANDING 0x6D58
|
||||
#define LB_D1_MAX_REQ_OUTSTANDING_MASK 0x0000000F
|
||||
#define LB_D1_MAX_REQ_OUTSTANDING_SHIFT 0
|
||||
#define LB_D2_MAX_REQ_OUTSTANDING_MASK 0x000F0000
|
||||
#define LB_D2_MAX_REQ_OUTSTANDING_SHIFT 16
|
||||
#define DCP_CONTROL 0x6C9C
|
||||
#define D2MODE_PRIORITY_A_CNT 0x6D48
|
||||
#define D2MODE_PRIORITY_B_CNT 0x6D4C
|
||||
|
||||
/* MC indirect registers */
|
||||
#define MC_STATUS_IDLE (1 << 0)
|
||||
#define MC_MISC_CNTL 0x18
|
||||
#define DISABLE_GTW (1 << 1)
|
||||
#define GART_INDEX_REG_EN (1 << 12)
|
||||
#define BLOCK_GFX_D3_EN (1 << 14)
|
||||
#define GART_FEATURE_ID 0x2B
|
||||
#define HANG_EN (1 << 11)
|
||||
#define TLB_ENABLE (1 << 18)
|
||||
#define P2P_ENABLE (1 << 19)
|
||||
#define GTW_LAC_EN (1 << 25)
|
||||
#define LEVEL2_GART (0 << 30)
|
||||
#define LEVEL1_GART (1 << 30)
|
||||
#define PDC_EN (1 << 31)
|
||||
#define GART_BASE 0x2C
|
||||
#define GART_CACHE_CNTRL 0x2E
|
||||
# define GART_CACHE_INVALIDATE (1 << 0)
|
||||
#define MC_STATUS 0x90
|
||||
#define MCCFG_FB_LOCATION 0x100
|
||||
#define MC_FB_START_MASK 0x0000FFFF
|
||||
#define MC_FB_START_SHIFT 0
|
||||
#define MC_FB_TOP_MASK 0xFFFF0000
|
||||
#define MC_FB_TOP_SHIFT 16
|
||||
#define MCCFG_AGP_LOCATION 0x101
|
||||
#define MC_AGP_START_MASK 0x0000FFFF
|
||||
#define MC_AGP_START_SHIFT 0
|
||||
#define MC_AGP_TOP_MASK 0xFFFF0000
|
||||
#define MC_AGP_TOP_SHIFT 16
|
||||
#define MCCFG_AGP_BASE 0x102
|
||||
#define MCCFG_AGP_BASE_2 0x103
|
||||
#define MC_INIT_MISC_LAT_TIMER 0x104
|
||||
#define MC_DISP0R_INIT_LAT_SHIFT 8
|
||||
#define MC_DISP0R_INIT_LAT_MASK 0x00000F00
|
||||
#define MC_DISP1R_INIT_LAT_SHIFT 12
|
||||
#define MC_DISP1R_INIT_LAT_MASK 0x0000F000
|
||||
|
||||
#endif
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef __RV200D_H__
|
||||
#define __RV200D_H__
|
||||
|
||||
#define R_00015C_AGP_BASE_2 0x00015C
|
||||
#define S_00015C_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0)
|
||||
#define G_00015C_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF)
|
||||
#define C_00015C_AGP_BASE_ADDR_2 0xFFFFFFF0
|
||||
|
||||
#endif
|
|
@ -0,0 +1,123 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef __RV250D_H__
|
||||
#define __RV250D_H__
|
||||
|
||||
#define R_00000D_SCLK_CNTL_M6 0x00000D
|
||||
#define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0)
|
||||
#define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7)
|
||||
#define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8
|
||||
#define S_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 3)
|
||||
#define G_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) >> 3) & 0x1)
|
||||
#define C_00000D_CP_MAX_DYN_STOP_LAT 0xFFFFFFF7
|
||||
#define S_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 4)
|
||||
#define G_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) >> 4) & 0x1)
|
||||
#define C_00000D_HDP_MAX_DYN_STOP_LAT 0xFFFFFFEF
|
||||
#define S_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 5)
|
||||
#define G_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) >> 5) & 0x1)
|
||||
#define C_00000D_TV_MAX_DYN_STOP_LAT 0xFFFFFFDF
|
||||
#define S_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 6)
|
||||
#define G_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) >> 6) & 0x1)
|
||||
#define C_00000D_E2_MAX_DYN_STOP_LAT 0xFFFFFFBF
|
||||
#define S_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 7)
|
||||
#define G_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) >> 7) & 0x1)
|
||||
#define C_00000D_SE_MAX_DYN_STOP_LAT 0xFFFFFF7F
|
||||
#define S_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 8)
|
||||
#define G_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) >> 8) & 0x1)
|
||||
#define C_00000D_IDCT_MAX_DYN_STOP_LAT 0xFFFFFEFF
|
||||
#define S_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 9)
|
||||
#define G_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) >> 9) & 0x1)
|
||||
#define C_00000D_VIP_MAX_DYN_STOP_LAT 0xFFFFFDFF
|
||||
#define S_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 10)
|
||||
#define G_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) >> 10) & 0x1)
|
||||
#define C_00000D_RE_MAX_DYN_STOP_LAT 0xFFFFFBFF
|
||||
#define S_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 11)
|
||||
#define G_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) >> 11) & 0x1)
|
||||
#define C_00000D_PB_MAX_DYN_STOP_LAT 0xFFFFF7FF
|
||||
#define S_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 12)
|
||||
#define G_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) >> 12) & 0x1)
|
||||
#define C_00000D_TAM_MAX_DYN_STOP_LAT 0xFFFFEFFF
|
||||
#define S_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 13)
|
||||
#define G_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) >> 13) & 0x1)
|
||||
#define C_00000D_TDM_MAX_DYN_STOP_LAT 0xFFFFDFFF
|
||||
#define S_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 14)
|
||||
#define G_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) >> 14) & 0x1)
|
||||
#define C_00000D_RB_MAX_DYN_STOP_LAT 0xFFFFBFFF
|
||||
#define S_00000D_FORCE_DISP2(x) (((x) & 0x1) << 15)
|
||||
#define G_00000D_FORCE_DISP2(x) (((x) >> 15) & 0x1)
|
||||
#define C_00000D_FORCE_DISP2 0xFFFF7FFF
|
||||
#define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16)
|
||||
#define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1)
|
||||
#define C_00000D_FORCE_CP 0xFFFEFFFF
|
||||
#define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17)
|
||||
#define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1)
|
||||
#define C_00000D_FORCE_HDP 0xFFFDFFFF
|
||||
#define S_00000D_FORCE_DISP1(x) (((x) & 0x1) << 18)
|
||||
#define G_00000D_FORCE_DISP1(x) (((x) >> 18) & 0x1)
|
||||
#define C_00000D_FORCE_DISP1 0xFFFBFFFF
|
||||
#define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19)
|
||||
#define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1)
|
||||
#define C_00000D_FORCE_TOP 0xFFF7FFFF
|
||||
#define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20)
|
||||
#define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1)
|
||||
#define C_00000D_FORCE_E2 0xFFEFFFFF
|
||||
#define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21)
|
||||
#define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1)
|
||||
#define C_00000D_FORCE_SE 0xFFDFFFFF
|
||||
#define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22)
|
||||
#define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1)
|
||||
#define C_00000D_FORCE_IDCT 0xFFBFFFFF
|
||||
#define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23)
|
||||
#define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1)
|
||||
#define C_00000D_FORCE_VIP 0xFF7FFFFF
|
||||
#define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24)
|
||||
#define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1)
|
||||
#define C_00000D_FORCE_RE 0xFEFFFFFF
|
||||
#define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25)
|
||||
#define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1)
|
||||
#define C_00000D_FORCE_PB 0xFDFFFFFF
|
||||
#define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26)
|
||||
#define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1)
|
||||
#define C_00000D_FORCE_TAM 0xFBFFFFFF
|
||||
#define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27)
|
||||
#define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1)
|
||||
#define C_00000D_FORCE_TDM 0xF7FFFFFF
|
||||
#define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28)
|
||||
#define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1)
|
||||
#define C_00000D_FORCE_RB 0xEFFFFFFF
|
||||
#define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29)
|
||||
#define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1)
|
||||
#define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF
|
||||
#define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30)
|
||||
#define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1)
|
||||
#define C_00000D_FORCE_SUBPIC 0xBFFFFFFF
|
||||
#define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31)
|
||||
#define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1)
|
||||
#define C_00000D_FORCE_OV0 0x7FFFFFFF
|
||||
|
||||
#endif
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* Copyright 2008 Advanced Micro Devices, Inc.
|
||||
* Copyright 2008 Red Hat Inc.
|
||||
* Copyright 2009 Jerome Glisse.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Authors: Dave Airlie
|
||||
* Alex Deucher
|
||||
* Jerome Glisse
|
||||
*/
|
||||
#ifndef __RV350D_H__
|
||||
#define __RV350D_H__
|
||||
|
||||
/* RV350, RV380 registers */
|
||||
/* #define R_00000D_SCLK_CNTL 0x00000D */
|
||||
#define S_00000D_FORCE_VAP(x) (((x) & 0x1) << 21)
|
||||
#define G_00000D_FORCE_VAP(x) (((x) >> 21) & 0x1)
|
||||
#define C_00000D_FORCE_VAP 0xFFDFFFFF
|
||||
#define S_00000D_FORCE_SR(x) (((x) & 0x1) << 25)
|
||||
#define G_00000D_FORCE_SR(x) (((x) >> 25) & 0x1)
|
||||
#define C_00000D_FORCE_SR 0xFDFFFFFF
|
||||
#define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26)
|
||||
#define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1)
|
||||
#define C_00000D_FORCE_PX 0xFBFFFFFF
|
||||
#define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27)
|
||||
#define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1)
|
||||
#define C_00000D_FORCE_TX 0xF7FFFFFF
|
||||
#define S_00000D_FORCE_US(x) (((x) & 0x1) << 28)
|
||||
#define G_00000D_FORCE_US(x) (((x) >> 28) & 0x1)
|
||||
#define C_00000D_FORCE_US 0xEFFFFFFF
|
||||
#define S_00000D_FORCE_SU(x) (((x) & 0x1) << 30)
|
||||
#define G_00000D_FORCE_SU(x) (((x) >> 30) & 0x1)
|
||||
#define C_00000D_FORCE_SU 0xBFFFFFFF
|
||||
|
||||
#endif
|
|
@ -478,7 +478,7 @@ static int rv515_startup(struct radeon_device *rdev)
|
|||
}
|
||||
/* Enable IRQ */
|
||||
rdev->irq.sw_int = true;
|
||||
r100_irq_set(rdev);
|
||||
rs600_irq_set(rdev);
|
||||
/* 1M ring buffer */
|
||||
r = r100_cp_init(rdev, 1024 * 1024);
|
||||
if (r) {
|
||||
|
@ -520,7 +520,7 @@ int rv515_suspend(struct radeon_device *rdev)
|
|||
{
|
||||
r100_cp_disable(rdev);
|
||||
r100_wb_disable(rdev);
|
||||
r100_irq_disable(rdev);
|
||||
rs600_irq_disable(rdev);
|
||||
if (rdev->flags & RADEON_IS_PCIE)
|
||||
rv370_pcie_gart_disable(rdev);
|
||||
return 0;
|
||||
|
@ -553,7 +553,6 @@ int rv515_init(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
rdev->new_init_path = true;
|
||||
/* Initialize scratch registers */
|
||||
radeon_scratch_init(rdev);
|
||||
/* Initialize surface registers */
|
||||
|
|
|
@ -75,7 +75,7 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev)
|
|||
WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12);
|
||||
WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12);
|
||||
WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) |
|
||||
RANGE_PROTECTION_FAULT_ENABLE_DEFAULT);
|
||||
|
@ -126,17 +126,36 @@ void rv770_pcie_gart_fini(struct radeon_device *rdev)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* MC
|
||||
*/
|
||||
static void rv770_mc_resume(struct radeon_device *rdev)
|
||||
void rv770_agp_enable(struct radeon_device *rdev)
|
||||
{
|
||||
u32 d1vga_control, d2vga_control;
|
||||
u32 vga_render_control, vga_hdp_control;
|
||||
u32 d1crtc_control, d2crtc_control;
|
||||
u32 new_d1grph_primary, new_d1grph_secondary;
|
||||
u32 new_d2grph_primary, new_d2grph_secondary;
|
||||
u64 old_vram_start;
|
||||
u32 tmp;
|
||||
int i;
|
||||
|
||||
/* Setup L2 cache */
|
||||
WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING |
|
||||
ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE |
|
||||
EFFECTIVE_L2_QUEUE_SIZE(7));
|
||||
WREG32(VM_L2_CNTL2, 0);
|
||||
WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2));
|
||||
/* Setup TLB control */
|
||||
tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING |
|
||||
SYSTEM_ACCESS_MODE_NOT_IN_SYS |
|
||||
SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU |
|
||||
EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5);
|
||||
WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp);
|
||||
WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp);
|
||||
WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp);
|
||||
WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp);
|
||||
for (i = 0; i < 7; i++)
|
||||
WREG32(VM_CONTEXT0_CNTL + (i * 4), 0);
|
||||
}
|
||||
|
||||
static void rv770_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
struct rv515_mc_save save;
|
||||
u32 tmp;
|
||||
int i, j;
|
||||
|
||||
|
@ -150,53 +169,42 @@ static void rv770_mc_resume(struct radeon_device *rdev)
|
|||
}
|
||||
WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0);
|
||||
|
||||
d1vga_control = RREG32(D1VGA_CONTROL);
|
||||
d2vga_control = RREG32(D2VGA_CONTROL);
|
||||
vga_render_control = RREG32(VGA_RENDER_CONTROL);
|
||||
vga_hdp_control = RREG32(VGA_HDP_CONTROL);
|
||||
d1crtc_control = RREG32(D1CRTC_CONTROL);
|
||||
d2crtc_control = RREG32(D2CRTC_CONTROL);
|
||||
old_vram_start = (u64)(RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24;
|
||||
new_d1grph_primary = RREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS);
|
||||
new_d1grph_secondary = RREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS);
|
||||
new_d1grph_primary += rdev->mc.vram_start - old_vram_start;
|
||||
new_d1grph_secondary += rdev->mc.vram_start - old_vram_start;
|
||||
new_d2grph_primary = RREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS);
|
||||
new_d2grph_secondary = RREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS);
|
||||
new_d2grph_primary += rdev->mc.vram_start - old_vram_start;
|
||||
new_d2grph_secondary += rdev->mc.vram_start - old_vram_start;
|
||||
|
||||
/* Stop all video */
|
||||
WREG32(D1VGA_CONTROL, 0);
|
||||
WREG32(D2VGA_CONTROL, 0);
|
||||
WREG32(VGA_RENDER_CONTROL, 0);
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D1CRTC_CONTROL, 0);
|
||||
WREG32(D2CRTC_CONTROL, 0);
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 0);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 0);
|
||||
|
||||
mdelay(1);
|
||||
rv515_mc_stop(rdev, &save);
|
||||
if (r600_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "[drm] MC not idle !\n");
|
||||
dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
|
||||
}
|
||||
|
||||
/* Lockout access through VGA aperture*/
|
||||
WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE);
|
||||
|
||||
/* Update configuration */
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12);
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
if (rdev->mc.vram_start < rdev->mc.gtt_start) {
|
||||
/* VRAM before AGP */
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
|
||||
rdev->mc.vram_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
|
||||
rdev->mc.gtt_end >> 12);
|
||||
} else {
|
||||
/* VRAM after AGP */
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
|
||||
rdev->mc.gtt_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
|
||||
rdev->mc.vram_end >> 12);
|
||||
}
|
||||
} else {
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR,
|
||||
rdev->mc.vram_start >> 12);
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR,
|
||||
rdev->mc.vram_end >> 12);
|
||||
}
|
||||
WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0);
|
||||
tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16;
|
||||
tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16;
|
||||
tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF);
|
||||
WREG32(MC_VM_FB_LOCATION, tmp);
|
||||
WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8));
|
||||
WREG32(HDP_NONSURFACE_INFO, (2 << 7));
|
||||
WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF);
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16);
|
||||
WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16);
|
||||
WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16);
|
||||
WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22);
|
||||
} else {
|
||||
|
@ -204,31 +212,10 @@ static void rv770_mc_resume(struct radeon_device *rdev)
|
|||
WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF);
|
||||
WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF);
|
||||
}
|
||||
WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS, new_d1grph_primary);
|
||||
WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS, new_d1grph_secondary);
|
||||
WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS, new_d2grph_primary);
|
||||
WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS, new_d2grph_secondary);
|
||||
WREG32(VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start);
|
||||
|
||||
/* Unlock host access */
|
||||
WREG32(VGA_HDP_CONTROL, vga_hdp_control);
|
||||
|
||||
mdelay(1);
|
||||
if (r600_mc_wait_for_idle(rdev)) {
|
||||
printk(KERN_WARNING "[drm] MC not idle !\n");
|
||||
dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
|
||||
}
|
||||
|
||||
/* Restore video state */
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 1);
|
||||
WREG32(D1CRTC_CONTROL, d1crtc_control);
|
||||
WREG32(D2CRTC_CONTROL, d2crtc_control);
|
||||
WREG32(D1CRTC_UPDATE_LOCK, 0);
|
||||
WREG32(D2CRTC_UPDATE_LOCK, 0);
|
||||
WREG32(D1VGA_CONTROL, d1vga_control);
|
||||
WREG32(D2VGA_CONTROL, d2vga_control);
|
||||
WREG32(VGA_RENDER_CONTROL, vga_render_control);
|
||||
|
||||
rv515_mc_resume(rdev, &save);
|
||||
/* we need to own VRAM, so turn off the VGA renderer here
|
||||
* to stop it overwriting our objects */
|
||||
rv515_vga_render_disable(rdev);
|
||||
|
@ -840,9 +827,9 @@ int rv770_mc_init(struct radeon_device *rdev)
|
|||
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
|
||||
}
|
||||
rdev->mc.vram_start = rdev->mc.vram_location;
|
||||
rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size;
|
||||
rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
|
||||
rdev->mc.gtt_start = rdev->mc.gtt_location;
|
||||
rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size;
|
||||
rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
|
||||
/* FIXME: we should enforce default clock in case GPU is not in
|
||||
* default setup
|
||||
*/
|
||||
|
@ -861,11 +848,14 @@ static int rv770_startup(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
radeon_gpu_reset(rdev);
|
||||
rv770_mc_resume(rdev);
|
||||
r = rv770_pcie_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
rv770_mc_program(rdev);
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
rv770_agp_enable(rdev);
|
||||
} else {
|
||||
r = rv770_pcie_gart_enable(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
rv770_gpu_init(rdev);
|
||||
|
||||
r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM,
|
||||
|
@ -884,9 +874,8 @@ static int rv770_startup(struct radeon_device *rdev)
|
|||
r = r600_cp_resume(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = r600_wb_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* write back buffer are not vital so don't worry about failure */
|
||||
r600_wb_enable(rdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -894,15 +883,12 @@ int rv770_resume(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
if (radeon_gpu_reset(rdev)) {
|
||||
/* FIXME: what do we want to do here ? */
|
||||
}
|
||||
/* 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 */
|
||||
if (rdev->is_atom_bios) {
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
} else {
|
||||
radeon_combios_asic_init(rdev->ddev);
|
||||
}
|
||||
atom_asic_init(rdev->mode_info.atom_context);
|
||||
/* Initialize clocks */
|
||||
r = radeon_clocks_init(rdev);
|
||||
if (r) {
|
||||
|
@ -915,7 +901,7 @@ int rv770_resume(struct radeon_device *rdev)
|
|||
return r;
|
||||
}
|
||||
|
||||
r = radeon_ib_test(rdev);
|
||||
r = r600_ib_test(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failled testing IB (%d).\n", r);
|
||||
return r;
|
||||
|
@ -929,8 +915,8 @@ int rv770_suspend(struct radeon_device *rdev)
|
|||
/* FIXME: we should wait for ring to be empty */
|
||||
r700_cp_stop(rdev);
|
||||
rdev->cp.ready = false;
|
||||
r600_wb_disable(rdev);
|
||||
rv770_pcie_gart_disable(rdev);
|
||||
|
||||
/* unpin shaders bo */
|
||||
radeon_object_unpin(rdev->r600_blit.shader_obj);
|
||||
return 0;
|
||||
|
@ -946,7 +932,6 @@ int rv770_init(struct radeon_device *rdev)
|
|||
{
|
||||
int r;
|
||||
|
||||
rdev->new_init_path = true;
|
||||
r = radeon_dummy_page_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
@ -960,8 +945,10 @@ int rv770_init(struct radeon_device *rdev)
|
|||
return -EINVAL;
|
||||
}
|
||||
/* Must be an ATOMBIOS */
|
||||
if (!rdev->is_atom_bios)
|
||||
if (!rdev->is_atom_bios) {
|
||||
dev_err(rdev->dev, "Expecting atombios for R600 GPU\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
r = radeon_atombios_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
@ -983,15 +970,8 @@ int rv770_init(struct radeon_device *rdev)
|
|||
if (r)
|
||||
return r;
|
||||
r = rv770_mc_init(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
rv770_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return rv770_init(rdev);
|
||||
}
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
/* Memory manager */
|
||||
r = radeon_object_init(rdev);
|
||||
if (r)
|
||||
|
@ -1020,12 +1000,10 @@ int rv770_init(struct radeon_device *rdev)
|
|||
|
||||
r = rv770_startup(rdev);
|
||||
if (r) {
|
||||
if (rdev->flags & RADEON_IS_AGP) {
|
||||
/* Retry with disabling AGP */
|
||||
rv770_fini(rdev);
|
||||
rdev->flags &= ~RADEON_IS_AGP;
|
||||
return rv770_init(rdev);
|
||||
}
|
||||
rv770_suspend(rdev);
|
||||
r600_wb_fini(rdev);
|
||||
radeon_ring_fini(rdev);
|
||||
rv770_pcie_gart_fini(rdev);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
if (rdev->accel_working) {
|
||||
|
@ -1034,7 +1012,7 @@ int rv770_init(struct radeon_device *rdev)
|
|||
DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r);
|
||||
rdev->accel_working = false;
|
||||
}
|
||||
r = radeon_ib_test(rdev);
|
||||
r = r600_ib_test(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: failled testing IB (%d).\n", r);
|
||||
rdev->accel_working = false;
|
||||
|
@ -1049,20 +1027,15 @@ void rv770_fini(struct radeon_device *rdev)
|
|||
|
||||
r600_blit_fini(rdev);
|
||||
radeon_ring_fini(rdev);
|
||||
r600_wb_fini(rdev);
|
||||
rv770_pcie_gart_fini(rdev);
|
||||
radeon_gem_fini(rdev);
|
||||
radeon_fence_driver_fini(rdev);
|
||||
radeon_clocks_fini(rdev);
|
||||
#if __OS_HAS_AGP
|
||||
if (rdev->flags & RADEON_IS_AGP)
|
||||
radeon_agp_fini(rdev);
|
||||
#endif
|
||||
radeon_object_fini(rdev);
|
||||
if (rdev->is_atom_bios) {
|
||||
radeon_atombios_fini(rdev);
|
||||
} else {
|
||||
radeon_combios_fini(rdev);
|
||||
}
|
||||
radeon_atombios_fini(rdev);
|
||||
kfree(rdev->bios);
|
||||
rdev->bios = NULL;
|
||||
radeon_dummy_page_fini(rdev);
|
||||
|
|
|
@ -82,8 +82,8 @@ int ttm_global_item_ref(struct ttm_global_reference *ref)
|
|||
if (unlikely(ret != 0))
|
||||
goto out_err;
|
||||
|
||||
++item->refcount;
|
||||
}
|
||||
++item->refcount;
|
||||
ref->object = item->object;
|
||||
object = item->object;
|
||||
mutex_unlock(&item->mutex);
|
||||
|
|
|
@ -61,6 +61,9 @@ struct drm_crtc_helper_funcs {
|
|||
/* Move the crtc on the current fb to the given position *optional* */
|
||||
int (*mode_set_base)(struct drm_crtc *crtc, int x, int y,
|
||||
struct drm_framebuffer *old_fb);
|
||||
|
||||
/* reload the current crtc LUT */
|
||||
void (*load_lut)(struct drm_crtc *crtc);
|
||||
};
|
||||
|
||||
struct drm_encoder_helper_funcs {
|
||||
|
|
|
@ -39,6 +39,8 @@ struct drm_fb_helper_crtc {
|
|||
struct drm_fb_helper_funcs {
|
||||
void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green,
|
||||
u16 blue, int regno);
|
||||
void (*gamma_get)(struct drm_crtc *crtc, u16 *red, u16 *green,
|
||||
u16 *blue, int regno);
|
||||
};
|
||||
|
||||
/* mode specified on the command line */
|
||||
|
@ -71,6 +73,7 @@ struct drm_fb_helper {
|
|||
};
|
||||
|
||||
int drm_fb_helper_single_fb_probe(struct drm_device *dev,
|
||||
int preferred_bpp,
|
||||
int (*fb_create)(struct drm_device *dev,
|
||||
uint32_t fb_width,
|
||||
uint32_t fb_height,
|
||||
|
@ -98,9 +101,11 @@ int drm_fb_helper_setcolreg(unsigned regno,
|
|||
void drm_fb_helper_restore(void);
|
||||
void drm_fb_helper_fill_var(struct fb_info *info, struct drm_framebuffer *fb,
|
||||
uint32_t fb_width, uint32_t fb_height);
|
||||
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch);
|
||||
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
|
||||
uint32_t depth);
|
||||
|
||||
int drm_fb_helper_add_connector(struct drm_connector *connector);
|
||||
int drm_fb_helper_parse_command_line(struct drm_device *dev);
|
||||
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
{0x1002, 0x5158, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV200}, \
|
||||
{0x1002, 0x5159, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \
|
||||
{0x1002, 0x515A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \
|
||||
{0x1002, 0x515E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \
|
||||
{0x1002, 0x515E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100|RADEON_SINGLE_CRTC}, \
|
||||
{0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
|
||||
{0x1002, 0x5462, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
|
||||
{0x1002, 0x5464, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
|
||||
|
@ -113,7 +113,7 @@
|
|||
{0x1002, 0x5962, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5964, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5965, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280}, \
|
||||
{0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100}, \
|
||||
{0x1002, 0x5969, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV100|RADEON_SINGLE_CRTC}, \
|
||||
{0x1002, 0x5a41, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5a42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \
|
||||
{0x1002, 0x5a61, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS400|RADEON_IS_IGP|RADEON_IS_IGPGART}, \
|
||||
|
|
Загрузка…
Ссылка в новой задаче