diff options
author | Alex Deucher <alexdeucher@gmail.com> | 2008-10-16 19:21:45 -0400 |
---|---|---|
committer | Dave Airlie <airlied@linux.ie> | 2008-10-17 17:10:54 -0400 |
commit | edc6f389f6ae9cb7621270a8ddbb1892bd8df125 (patch) | |
tree | 775537e224e7eb83290df07779b3e3ab6876adab /drivers/gpu/drm | |
parent | b2ceddfa52cbeb244b90096f1e8d3e9f7e0ce299 (diff) |
radeon: fix PCI bus mastering support enables.
Someone noticed these registers moved around for later chips,
so we redo the codepaths per-chip. PCIE chips don't appear to
require explicit enables.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cp.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.h | 25 |
2 files changed, 39 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index a83d7615ba7f..59a2132a8f57 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
@@ -363,6 +363,7 @@ static void radeon_cp_load_microcode(drm_radeon_private_t * dev_priv) | |||
363 | R300_cp_microcode[i][0]); | 363 | R300_cp_microcode[i][0]); |
364 | } | 364 | } |
365 | } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) || | 365 | } else if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R420) || |
366 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_R423) || | ||
366 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV410)) { | 367 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV410)) { |
367 | DRM_INFO("Loading R400 Microcode\n"); | 368 | DRM_INFO("Loading R400 Microcode\n"); |
368 | for (i = 0; i < 256; i++) { | 369 | for (i = 0; i < 256; i++) { |
@@ -652,8 +653,18 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev, | |||
652 | RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7); | 653 | RADEON_WRITE(RADEON_SCRATCH_UMSK, 0x7); |
653 | 654 | ||
654 | /* Turn on bus mastering */ | 655 | /* Turn on bus mastering */ |
655 | tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; | 656 | if (((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS400) || |
656 | RADEON_WRITE(RADEON_BUS_CNTL, tmp); | 657 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS690) || |
658 | ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RS740)) { | ||
659 | /* rs400, rs690/rs740 */ | ||
660 | tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RS400_BUS_MASTER_DIS; | ||
661 | RADEON_WRITE(RADEON_BUS_CNTL, tmp); | ||
662 | } else if (!(((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV380) || | ||
663 | ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_R423))) { | ||
664 | /* r1xx, r2xx, r300, r(v)350, r420/r481, rs480 */ | ||
665 | tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; | ||
666 | RADEON_WRITE(RADEON_BUS_CNTL, tmp); | ||
667 | } /* PCIE cards appears to not need this */ | ||
657 | 668 | ||
658 | dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0; | 669 | dev_priv->sarea_priv->last_frame = dev_priv->scratch[0] = 0; |
659 | RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame); | 670 | RADEON_WRITE(RADEON_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame); |
@@ -1719,6 +1730,7 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) | |||
1719 | case CHIP_R300: | 1730 | case CHIP_R300: |
1720 | case CHIP_R350: | 1731 | case CHIP_R350: |
1721 | case CHIP_R420: | 1732 | case CHIP_R420: |
1733 | case CHIP_R423: | ||
1722 | case CHIP_RV410: | 1734 | case CHIP_RV410: |
1723 | case CHIP_RV515: | 1735 | case CHIP_RV515: |
1724 | case CHIP_R520: | 1736 | case CHIP_R520: |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.h b/drivers/gpu/drm/radeon/radeon_drv.h index 9278429af9ed..4dbb813910c3 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.h +++ b/drivers/gpu/drm/radeon/radeon_drv.h | |||
@@ -122,6 +122,7 @@ enum radeon_family { | |||
122 | CHIP_RV350, | 122 | CHIP_RV350, |
123 | CHIP_RV380, | 123 | CHIP_RV380, |
124 | CHIP_R420, | 124 | CHIP_R420, |
125 | CHIP_R423, | ||
125 | CHIP_RV410, | 126 | CHIP_RV410, |
126 | CHIP_RS400, | 127 | CHIP_RS400, |
127 | CHIP_RS480, | 128 | CHIP_RS480, |
@@ -439,8 +440,31 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev, | |||
439 | # define RADEON_SCISSOR_1_ENABLE (1 << 29) | 440 | # define RADEON_SCISSOR_1_ENABLE (1 << 29) |
440 | # define RADEON_SCISSOR_2_ENABLE (1 << 30) | 441 | # define RADEON_SCISSOR_2_ENABLE (1 << 30) |
441 | 442 | ||
443 | /* | ||
444 | * PCIE radeons (rv370/rv380, rv410, r423/r430/r480, r5xx) | ||
445 | * don't have an explicit bus mastering disable bit. It's handled | ||
446 | * by the PCI D-states. PMI_BM_DIS disables D-state bus master | ||
447 | * handling, not bus mastering itself. | ||
448 | */ | ||
442 | #define RADEON_BUS_CNTL 0x0030 | 449 | #define RADEON_BUS_CNTL 0x0030 |
450 | /* r1xx, r2xx, r300, r(v)350, r420/r481, rs480 */ | ||
443 | # define RADEON_BUS_MASTER_DIS (1 << 6) | 451 | # define RADEON_BUS_MASTER_DIS (1 << 6) |
452 | /* rs400, rs690/rs740 */ | ||
453 | # define RS400_BUS_MASTER_DIS (1 << 14) | ||
454 | # define RS400_MSI_REARM (1 << 20) | ||
455 | /* see RS480_MSI_REARM in AIC_CNTL for rs480 */ | ||
456 | |||
457 | #define RADEON_BUS_CNTL1 0x0034 | ||
458 | # define RADEON_PMI_BM_DIS (1 << 2) | ||
459 | # define RADEON_PMI_INT_DIS (1 << 3) | ||
460 | |||
461 | #define RV370_BUS_CNTL 0x004c | ||
462 | # define RV370_PMI_BM_DIS (1 << 5) | ||
463 | # define RV370_PMI_INT_DIS (1 << 6) | ||
464 | |||
465 | #define RADEON_MSI_REARM_EN 0x0160 | ||
466 | /* rv370/rv380, rv410, r423/r430/r480, r5xx */ | ||
467 | # define RV370_MSI_REARM_EN (1 << 0) | ||
444 | 468 | ||
445 | #define RADEON_CLOCK_CNTL_DATA 0x000c | 469 | #define RADEON_CLOCK_CNTL_DATA 0x000c |
446 | # define RADEON_PLL_WR_EN (1 << 7) | 470 | # define RADEON_PLL_WR_EN (1 << 7) |
@@ -913,6 +937,7 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev, | |||
913 | 937 | ||
914 | #define RADEON_AIC_CNTL 0x01d0 | 938 | #define RADEON_AIC_CNTL 0x01d0 |
915 | # define RADEON_PCIGART_TRANSLATE_EN (1 << 0) | 939 | # define RADEON_PCIGART_TRANSLATE_EN (1 << 0) |
940 | # define RS480_MSI_REARM (1 << 3) | ||
916 | #define RADEON_AIC_STAT 0x01d4 | 941 | #define RADEON_AIC_STAT 0x01d4 |
917 | #define RADEON_AIC_PT_BASE 0x01d8 | 942 | #define RADEON_AIC_PT_BASE 0x01d8 |
918 | #define RADEON_AIC_LO_ADDR 0x01dc | 943 | #define RADEON_AIC_LO_ADDR 0x01dc |