diff mbox

drm/radeon/kms: fix gart setup on fusion parts (v2)

Message ID 1304468244-24149-1-git-send-email-airlied@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dave Airlie May 4, 2011, 12:17 a.m. UTC
From: Alex Deucher <alexdeucher@gmail.com>

Out of the entire GART/VM subsystem, the hw designers changed
the location of 3 regs.

v2: airlied: add parameter for userspace to work from.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Cc: stable@kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
---
 drivers/gpu/drm/radeon/evergreen.c  |   17 +++++++++--------
 drivers/gpu/drm/radeon/evergreend.h |    5 +++++
 drivers/gpu/drm/radeon/radeon_kms.c |    3 +++
 include/drm/radeon_drm.h            |    1 +
 4 files changed, 18 insertions(+), 8 deletions(-)

Comments

Alex Deucher May 4, 2011, 12:19 a.m. UTC | #1
On Tue, May 3, 2011 at 8:17 PM, Dave Airlie <airlied@gmail.com> wrote:
> From: Alex Deucher <alexdeucher@gmail.com>
>
> Out of the entire GART/VM subsystem, the hw designers changed
> the location of 3 regs.
>
> v2: airlied: add parameter for userspace to work from.
>
> Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
> Signed-off-by: Jerome Glisse <jglisse@redhat.com>
> Cc: stable@kernel.org
> Signed-off-by: Dave Airlie <airlied@redhat.com>

Looks good.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>

> ---
>  drivers/gpu/drm/radeon/evergreen.c  |   17 +++++++++--------
>  drivers/gpu/drm/radeon/evergreend.h |    5 +++++
>  drivers/gpu/drm/radeon/radeon_kms.c |    3 +++
>  include/drm/radeon_drm.h            |    1 +
>  4 files changed, 18 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index e9bc135..c20eac3 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -862,9 +862,15 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev)
>                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);
> +       if (rdev->flags & RADEON_IS_IGP) {
> +               WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
> +               WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
> +               WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
> +       } else {
> +               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);
> @@ -2923,11 +2929,6 @@ static int evergreen_startup(struct radeon_device *rdev)
>                rdev->asic->copy = NULL;
>                dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
>        }
> -       /* XXX: ontario has problems blitting to gart at the moment */
> -       if (rdev->family == CHIP_PALM) {
> -               rdev->asic->copy = NULL;
> -               radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
> -       }
>
>        /* allocate wb buffer */
>        r = radeon_wb_init(rdev);
> diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
> index 9aaa3f0..9453384 100644
> --- a/drivers/gpu/drm/radeon/evergreend.h
> +++ b/drivers/gpu/drm/radeon/evergreend.h
> @@ -221,6 +221,11 @@
>  #define        MC_VM_MD_L1_TLB0_CNTL                           0x2654
>  #define        MC_VM_MD_L1_TLB1_CNTL                           0x2658
>  #define        MC_VM_MD_L1_TLB2_CNTL                           0x265C
> +
> +#define        FUS_MC_VM_MD_L1_TLB0_CNTL                       0x265C
> +#define        FUS_MC_VM_MD_L1_TLB1_CNTL                       0x2660
> +#define        FUS_MC_VM_MD_L1_TLB2_CNTL                       0x2664
> +
>  #define        MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR              0x203C
>  #define        MC_VM_SYSTEM_APERTURE_HIGH_ADDR                 0x2038
>  #define        MC_VM_SYSTEM_APERTURE_LOW_ADDR                  0x2034
> diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
> index 871df03..bd58af6 100644
> --- a/drivers/gpu/drm/radeon/radeon_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_kms.c
> @@ -234,6 +234,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
>                        return -EINVAL;
>                }
>                break;
> +       case RADEON_INFO_FUSION_GART_WORKING:
> +               value = 1;
> +               break;
>        default:
>                DRM_DEBUG_KMS("Invalid request %d\n", info->request);
>                return -EINVAL;
> diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h
> index 7aa5ddd..787f7b6 100644
> --- a/include/drm/radeon_drm.h
> +++ b/include/drm/radeon_drm.h
> @@ -910,6 +910,7 @@ struct drm_radeon_cs {
>  #define RADEON_INFO_CLOCK_CRYSTAL_FREQ 0x09 /* clock crystal frequency */
>  #define RADEON_INFO_NUM_BACKENDS       0x0a /* DB/backends for r600+ - need for OQ */
>  #define RADEON_INFO_NUM_TILE_PIPES     0x0b /* tile pipes for r600+ */
> +#define RADEON_INFO_FUSION_GART_WORKING        0x0c /* fusion writes to GTT were broken before this */
>
>  struct drm_radeon_info {
>        uint32_t                request;
> --
> 1.7.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index e9bc135..c20eac3 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -862,9 +862,15 @@  int evergreen_pcie_gart_enable(struct radeon_device *rdev)
 		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);
+	if (rdev->flags & RADEON_IS_IGP) {
+		WREG32(FUS_MC_VM_MD_L1_TLB0_CNTL, tmp);
+		WREG32(FUS_MC_VM_MD_L1_TLB1_CNTL, tmp);
+		WREG32(FUS_MC_VM_MD_L1_TLB2_CNTL, tmp);
+	} else {
+		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);
@@ -2923,11 +2929,6 @@  static int evergreen_startup(struct radeon_device *rdev)
 		rdev->asic->copy = NULL;
 		dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
 	}
-	/* XXX: ontario has problems blitting to gart at the moment */
-	if (rdev->family == CHIP_PALM) {
-		rdev->asic->copy = NULL;
-		radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
-	}
 
 	/* allocate wb buffer */
 	r = radeon_wb_init(rdev);
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h
index 9aaa3f0..9453384 100644
--- a/drivers/gpu/drm/radeon/evergreend.h
+++ b/drivers/gpu/drm/radeon/evergreend.h
@@ -221,6 +221,11 @@ 
 #define	MC_VM_MD_L1_TLB0_CNTL				0x2654
 #define	MC_VM_MD_L1_TLB1_CNTL				0x2658
 #define	MC_VM_MD_L1_TLB2_CNTL				0x265C
+
+#define	FUS_MC_VM_MD_L1_TLB0_CNTL			0x265C
+#define	FUS_MC_VM_MD_L1_TLB1_CNTL			0x2660
+#define	FUS_MC_VM_MD_L1_TLB2_CNTL			0x2664
+
 #define	MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR		0x203C
 #define	MC_VM_SYSTEM_APERTURE_HIGH_ADDR			0x2038
 #define	MC_VM_SYSTEM_APERTURE_LOW_ADDR			0x2034
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
index 871df03..bd58af6 100644
--- a/drivers/gpu/drm/radeon/radeon_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_kms.c
@@ -234,6 +234,9 @@  int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
 			return -EINVAL;
 		}
 		break;
+	case RADEON_INFO_FUSION_GART_WORKING:
+		value = 1;
+		break;
 	default:
 		DRM_DEBUG_KMS("Invalid request %d\n", info->request);
 		return -EINVAL;
diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h
index 7aa5ddd..787f7b6 100644
--- a/include/drm/radeon_drm.h
+++ b/include/drm/radeon_drm.h
@@ -910,6 +910,7 @@  struct drm_radeon_cs {
 #define RADEON_INFO_CLOCK_CRYSTAL_FREQ	0x09 /* clock crystal frequency */
 #define RADEON_INFO_NUM_BACKENDS	0x0a /* DB/backends for r600+ - need for OQ */
 #define RADEON_INFO_NUM_TILE_PIPES	0x0b /* tile pipes for r600+ */
+#define RADEON_INFO_FUSION_GART_WORKING	0x0c /* fusion writes to GTT were broken before this */
 
 struct drm_radeon_info {
 	uint32_t		request;