diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_device.c')
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 56 |
1 files changed, 54 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 44b8034a400d..a8f608903989 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -98,6 +98,42 @@ static const char radeon_family_name[][16] = { | |||
98 | }; | 98 | }; |
99 | 99 | ||
100 | /** | 100 | /** |
101 | * radeon_program_register_sequence - program an array of registers. | ||
102 | * | ||
103 | * @rdev: radeon_device pointer | ||
104 | * @registers: pointer to the register array | ||
105 | * @array_size: size of the register array | ||
106 | * | ||
107 | * Programs an array or registers with and and or masks. | ||
108 | * This is a helper for setting golden registers. | ||
109 | */ | ||
110 | void radeon_program_register_sequence(struct radeon_device *rdev, | ||
111 | const u32 *registers, | ||
112 | const u32 array_size) | ||
113 | { | ||
114 | u32 tmp, reg, and_mask, or_mask; | ||
115 | int i; | ||
116 | |||
117 | if (array_size % 3) | ||
118 | return; | ||
119 | |||
120 | for (i = 0; i < array_size; i +=3) { | ||
121 | reg = registers[i + 0]; | ||
122 | and_mask = registers[i + 1]; | ||
123 | or_mask = registers[i + 2]; | ||
124 | |||
125 | if (and_mask == 0xffffffff) { | ||
126 | tmp = or_mask; | ||
127 | } else { | ||
128 | tmp = RREG32(reg); | ||
129 | tmp &= ~and_mask; | ||
130 | tmp |= or_mask; | ||
131 | } | ||
132 | WREG32(reg, tmp); | ||
133 | } | ||
134 | } | ||
135 | |||
136 | /** | ||
101 | * radeon_surface_init - Clear GPU surface registers. | 137 | * radeon_surface_init - Clear GPU surface registers. |
102 | * | 138 | * |
103 | * @rdev: radeon_device pointer | 139 | * @rdev: radeon_device pointer |
@@ -359,7 +395,7 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 | |||
359 | uint64_t limit = (uint64_t)radeon_vram_limit << 20; | 395 | uint64_t limit = (uint64_t)radeon_vram_limit << 20; |
360 | 396 | ||
361 | mc->vram_start = base; | 397 | mc->vram_start = base; |
362 | if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) { | 398 | if (mc->mc_vram_size > (rdev->mc.mc_mask - base + 1)) { |
363 | dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n"); | 399 | dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n"); |
364 | mc->real_vram_size = mc->aper_size; | 400 | mc->real_vram_size = mc->aper_size; |
365 | mc->mc_vram_size = mc->aper_size; | 401 | mc->mc_vram_size = mc->aper_size; |
@@ -394,7 +430,7 @@ void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) | |||
394 | { | 430 | { |
395 | u64 size_af, size_bf; | 431 | u64 size_af, size_bf; |
396 | 432 | ||
397 | size_af = ((0xFFFFFFFF - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align; | 433 | size_af = ((rdev->mc.mc_mask - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align; |
398 | size_bf = mc->vram_start & ~mc->gtt_base_align; | 434 | size_bf = mc->vram_start & ~mc->gtt_base_align; |
399 | if (size_bf > size_af) { | 435 | if (size_bf > size_af) { |
400 | if (mc->gtt_size > size_bf) { | 436 | if (mc->gtt_size > size_bf) { |
@@ -1068,6 +1104,17 @@ int radeon_device_init(struct radeon_device *rdev, | |||
1068 | radeon_agp_disable(rdev); | 1104 | radeon_agp_disable(rdev); |
1069 | } | 1105 | } |
1070 | 1106 | ||
1107 | /* Set the internal MC address mask | ||
1108 | * This is the max address of the GPU's | ||
1109 | * internal address space. | ||
1110 | */ | ||
1111 | if (rdev->family >= CHIP_CAYMAN) | ||
1112 | rdev->mc.mc_mask = 0xffffffffffULL; /* 40 bit MC */ | ||
1113 | else if (rdev->family >= CHIP_CEDAR) | ||
1114 | rdev->mc.mc_mask = 0xfffffffffULL; /* 36 bit MC */ | ||
1115 | else | ||
1116 | rdev->mc.mc_mask = 0xffffffffULL; /* 32 bit MC */ | ||
1117 | |||
1071 | /* set DMA mask + need_dma32 flags. | 1118 | /* set DMA mask + need_dma32 flags. |
1072 | * PCIE - can handle 40-bits. | 1119 | * PCIE - can handle 40-bits. |
1073 | * IGP - can handle 40-bits | 1120 | * IGP - can handle 40-bits |
@@ -1131,6 +1178,11 @@ int radeon_device_init(struct radeon_device *rdev, | |||
1131 | if (r) | 1178 | if (r) |
1132 | DRM_ERROR("ib ring test failed (%d).\n", r); | 1179 | DRM_ERROR("ib ring test failed (%d).\n", r); |
1133 | 1180 | ||
1181 | r = radeon_gem_debugfs_init(rdev); | ||
1182 | if (r) { | ||
1183 | DRM_ERROR("registering gem debugfs failed (%d).\n", r); | ||
1184 | } | ||
1185 | |||
1134 | if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) { | 1186 | if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) { |
1135 | /* Acceleration not working on AGP card try again | 1187 | /* Acceleration not working on AGP card try again |
1136 | * with fallback to PCI or PCIE GART | 1188 | * with fallback to PCI or PCIE GART |