diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
53 files changed, 4876 insertions, 2199 deletions
diff --git a/drivers/gpu/drm/radeon/.gitignore b/drivers/gpu/drm/radeon/.gitignore new file mode 100644 index 00000000000..403eb3a5891 --- /dev/null +++ b/drivers/gpu/drm/radeon/.gitignore | |||
@@ -0,0 +1,3 @@ | |||
1 | mkregtable | ||
2 | *_reg_safe.h | ||
3 | |||
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 6a015929dee..14fa9701aeb 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -733,6 +733,7 @@ static const struct drm_crtc_helper_funcs atombios_helper_funcs = { | |||
733 | .mode_set_base = atombios_crtc_set_base, | 733 | .mode_set_base = atombios_crtc_set_base, |
734 | .prepare = atombios_crtc_prepare, | 734 | .prepare = atombios_crtc_prepare, |
735 | .commit = atombios_crtc_commit, | 735 | .commit = atombios_crtc_commit, |
736 | .load_lut = radeon_crtc_load_lut, | ||
736 | }; | 737 | }; |
737 | 738 | ||
738 | void radeon_atombios_init_crtc(struct drm_device *dev, | 739 | void radeon_atombios_init_crtc(struct drm_device *dev, |
diff --git a/drivers/gpu/drm/radeon/avivod.h b/drivers/gpu/drm/radeon/avivod.h index e2b92c445ba..d4e6e6e4a93 100644 --- a/drivers/gpu/drm/radeon/avivod.h +++ b/drivers/gpu/drm/radeon/avivod.h | |||
@@ -57,13 +57,4 @@ | |||
57 | #define VGA_RENDER_CONTROL 0x0300 | 57 | #define VGA_RENDER_CONTROL 0x0300 |
58 | #define VGA_VSTATUS_CNTL_MASK 0x00030000 | 58 | #define VGA_VSTATUS_CNTL_MASK 0x00030000 |
59 | 59 | ||
60 | /* AVIVO disable VGA rendering */ | ||
61 | static inline void radeon_avivo_vga_render_disable(struct radeon_device *rdev) | ||
62 | { | ||
63 | u32 vga_render; | ||
64 | vga_render = RREG32(VGA_RENDER_CONTROL); | ||
65 | vga_render &= ~VGA_VSTATUS_CNTL_MASK; | ||
66 | WREG32(VGA_RENDER_CONTROL, vga_render); | ||
67 | } | ||
68 | |||
69 | #endif | 60 | #endif |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index be51c5f7d0f..161094c07d9 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -32,6 +32,9 @@ | |||
32 | #include "radeon_reg.h" | 32 | #include "radeon_reg.h" |
33 | #include "radeon.h" | 33 | #include "radeon.h" |
34 | #include "r100d.h" | 34 | #include "r100d.h" |
35 | #include "rs100d.h" | ||
36 | #include "rv200d.h" | ||
37 | #include "rv250d.h" | ||
35 | 38 | ||
36 | #include <linux/firmware.h> | 39 | #include <linux/firmware.h> |
37 | #include <linux/platform_device.h> | 40 | #include <linux/platform_device.h> |
@@ -60,18 +63,7 @@ MODULE_FIRMWARE(FIRMWARE_R520); | |||
60 | 63 | ||
61 | /* This files gather functions specifics to: | 64 | /* This files gather functions specifics to: |
62 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 | 65 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
63 | * | ||
64 | * Some of these functions might be used by newer ASICs. | ||
65 | */ | 66 | */ |
66 | int r200_init(struct radeon_device *rdev); | ||
67 | void r100_hdp_reset(struct radeon_device *rdev); | ||
68 | void r100_gpu_init(struct radeon_device *rdev); | ||
69 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | ||
70 | int r100_mc_wait_for_idle(struct radeon_device *rdev); | ||
71 | void r100_gpu_wait_for_vsync(struct radeon_device *rdev); | ||
72 | void r100_gpu_wait_for_vsync2(struct radeon_device *rdev); | ||
73 | int r100_debugfs_mc_info_init(struct radeon_device *rdev); | ||
74 | |||
75 | 67 | ||
76 | /* | 68 | /* |
77 | * PCI GART | 69 | * PCI GART |
@@ -152,136 +144,6 @@ void r100_pci_gart_fini(struct radeon_device *rdev) | |||
152 | radeon_gart_fini(rdev); | 144 | radeon_gart_fini(rdev); |
153 | } | 145 | } |
154 | 146 | ||
155 | |||
156 | /* | ||
157 | * MC | ||
158 | */ | ||
159 | void r100_mc_disable_clients(struct radeon_device *rdev) | ||
160 | { | ||
161 | uint32_t ov0_scale_cntl, crtc_ext_cntl, crtc_gen_cntl, crtc2_gen_cntl; | ||
162 | |||
163 | /* FIXME: is this function correct for rs100,rs200,rs300 ? */ | ||
164 | if (r100_gui_wait_for_idle(rdev)) { | ||
165 | printk(KERN_WARNING "Failed to wait GUI idle while " | ||
166 | "programming pipes. Bad things might happen.\n"); | ||
167 | } | ||
168 | |||
169 | /* stop display and memory access */ | ||
170 | ov0_scale_cntl = RREG32(RADEON_OV0_SCALE_CNTL); | ||
171 | WREG32(RADEON_OV0_SCALE_CNTL, ov0_scale_cntl & ~RADEON_SCALER_ENABLE); | ||
172 | crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); | ||
173 | WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl | RADEON_CRTC_DISPLAY_DIS); | ||
174 | crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL); | ||
175 | |||
176 | r100_gpu_wait_for_vsync(rdev); | ||
177 | |||
178 | WREG32(RADEON_CRTC_GEN_CNTL, | ||
179 | (crtc_gen_cntl & ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_ICON_EN)) | | ||
180 | RADEON_CRTC_DISP_REQ_EN_B | RADEON_CRTC_EXT_DISP_EN); | ||
181 | |||
182 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { | ||
183 | crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); | ||
184 | |||
185 | r100_gpu_wait_for_vsync2(rdev); | ||
186 | WREG32(RADEON_CRTC2_GEN_CNTL, | ||
187 | (crtc2_gen_cntl & | ||
188 | ~(RADEON_CRTC2_CUR_EN | RADEON_CRTC2_ICON_EN)) | | ||
189 | RADEON_CRTC2_DISP_REQ_EN_B); | ||
190 | } | ||
191 | |||
192 | udelay(500); | ||
193 | } | ||
194 | |||
195 | void r100_mc_setup(struct radeon_device *rdev) | ||
196 | { | ||
197 | uint32_t tmp; | ||
198 | int r; | ||
199 | |||
200 | r = r100_debugfs_mc_info_init(rdev); | ||
201 | if (r) { | ||
202 | DRM_ERROR("Failed to register debugfs file for R100 MC !\n"); | ||
203 | } | ||
204 | /* Write VRAM size in case we are limiting it */ | ||
205 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | ||
206 | /* Novell bug 204882 for RN50/M6/M7 with 8/16/32MB VRAM, | ||
207 | * if the aperture is 64MB but we have 32MB VRAM | ||
208 | * we report only 32MB VRAM but we have to set MC_FB_LOCATION | ||
209 | * to 64MB, otherwise the gpu accidentially dies */ | ||
210 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
211 | tmp = REG_SET(RADEON_MC_FB_TOP, tmp >> 16); | ||
212 | tmp |= REG_SET(RADEON_MC_FB_START, rdev->mc.vram_location >> 16); | ||
213 | WREG32(RADEON_MC_FB_LOCATION, tmp); | ||
214 | |||
215 | /* Enable bus mastering */ | ||
216 | tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS; | ||
217 | WREG32(RADEON_BUS_CNTL, tmp); | ||
218 | |||
219 | if (rdev->flags & RADEON_IS_AGP) { | ||
220 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | ||
221 | tmp = REG_SET(RADEON_MC_AGP_TOP, tmp >> 16); | ||
222 | tmp |= REG_SET(RADEON_MC_AGP_START, rdev->mc.gtt_location >> 16); | ||
223 | WREG32(RADEON_MC_AGP_LOCATION, tmp); | ||
224 | WREG32(RADEON_AGP_BASE, rdev->mc.agp_base); | ||
225 | } else { | ||
226 | WREG32(RADEON_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
227 | WREG32(RADEON_AGP_BASE, 0); | ||
228 | } | ||
229 | |||
230 | tmp = RREG32(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL; | ||
231 | tmp |= (7 << 28); | ||
232 | WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE); | ||
233 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
234 | WREG32(RADEON_HOST_PATH_CNTL, tmp); | ||
235 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
236 | } | ||
237 | |||
238 | int r100_mc_init(struct radeon_device *rdev) | ||
239 | { | ||
240 | int r; | ||
241 | |||
242 | if (r100_debugfs_rbbm_init(rdev)) { | ||
243 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
244 | } | ||
245 | |||
246 | r100_gpu_init(rdev); | ||
247 | /* Disable gart which also disable out of gart access */ | ||
248 | r100_pci_gart_disable(rdev); | ||
249 | |||
250 | /* Setup GPU memory space */ | ||
251 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
252 | if (rdev->flags & RADEON_IS_AGP) { | ||
253 | r = radeon_agp_init(rdev); | ||
254 | if (r) { | ||
255 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
256 | rdev->flags &= ~RADEON_IS_AGP; | ||
257 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
258 | } else { | ||
259 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
260 | } | ||
261 | } | ||
262 | r = radeon_mc_setup(rdev); | ||
263 | if (r) { | ||
264 | return r; | ||
265 | } | ||
266 | |||
267 | r100_mc_disable_clients(rdev); | ||
268 | if (r100_mc_wait_for_idle(rdev)) { | ||
269 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
270 | "programming pipes. Bad things might happen.\n"); | ||
271 | } | ||
272 | |||
273 | r100_mc_setup(rdev); | ||
274 | return 0; | ||
275 | } | ||
276 | |||
277 | void r100_mc_fini(struct radeon_device *rdev) | ||
278 | { | ||
279 | } | ||
280 | |||
281 | |||
282 | /* | ||
283 | * Interrupts | ||
284 | */ | ||
285 | int r100_irq_set(struct radeon_device *rdev) | 147 | int r100_irq_set(struct radeon_device *rdev) |
286 | { | 148 | { |
287 | uint32_t tmp = 0; | 149 | uint32_t tmp = 0; |
@@ -358,10 +220,6 @@ u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | |||
358 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | 220 | return RREG32(RADEON_CRTC2_CRNT_FRAME); |
359 | } | 221 | } |
360 | 222 | ||
361 | |||
362 | /* | ||
363 | * Fence emission | ||
364 | */ | ||
365 | void r100_fence_ring_emit(struct radeon_device *rdev, | 223 | void r100_fence_ring_emit(struct radeon_device *rdev, |
366 | struct radeon_fence *fence) | 224 | struct radeon_fence *fence) |
367 | { | 225 | { |
@@ -377,10 +235,6 @@ void r100_fence_ring_emit(struct radeon_device *rdev, | |||
377 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); | 235 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); |
378 | } | 236 | } |
379 | 237 | ||
380 | |||
381 | /* | ||
382 | * Writeback | ||
383 | */ | ||
384 | int r100_wb_init(struct radeon_device *rdev) | 238 | int r100_wb_init(struct radeon_device *rdev) |
385 | { | 239 | { |
386 | int r; | 240 | int r; |
@@ -504,10 +358,6 @@ int r100_copy_blit(struct radeon_device *rdev, | |||
504 | return r; | 358 | return r; |
505 | } | 359 | } |
506 | 360 | ||
507 | |||
508 | /* | ||
509 | * CP | ||
510 | */ | ||
511 | static int r100_cp_wait_for_idle(struct radeon_device *rdev) | 361 | static int r100_cp_wait_for_idle(struct radeon_device *rdev) |
512 | { | 362 | { |
513 | unsigned i; | 363 | unsigned i; |
@@ -612,6 +462,7 @@ static int r100_cp_init_microcode(struct radeon_device *rdev) | |||
612 | } | 462 | } |
613 | return err; | 463 | return err; |
614 | } | 464 | } |
465 | |||
615 | static void r100_cp_load_microcode(struct radeon_device *rdev) | 466 | static void r100_cp_load_microcode(struct radeon_device *rdev) |
616 | { | 467 | { |
617 | const __be32 *fw_data; | 468 | const __be32 *fw_data; |
@@ -863,13 +714,11 @@ int r100_cs_parse_packet0(struct radeon_cs_parser *p, | |||
863 | void r100_cs_dump_packet(struct radeon_cs_parser *p, | 714 | void r100_cs_dump_packet(struct radeon_cs_parser *p, |
864 | struct radeon_cs_packet *pkt) | 715 | struct radeon_cs_packet *pkt) |
865 | { | 716 | { |
866 | struct radeon_cs_chunk *ib_chunk; | ||
867 | volatile uint32_t *ib; | 717 | volatile uint32_t *ib; |
868 | unsigned i; | 718 | unsigned i; |
869 | unsigned idx; | 719 | unsigned idx; |
870 | 720 | ||
871 | ib = p->ib->ptr; | 721 | ib = p->ib->ptr; |
872 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
873 | idx = pkt->idx; | 722 | idx = pkt->idx; |
874 | for (i = 0; i <= (pkt->count + 1); i++, idx++) { | 723 | for (i = 0; i <= (pkt->count + 1); i++, idx++) { |
875 | DRM_INFO("ib[%d]=0x%08X\n", idx, ib[idx]); | 724 | DRM_INFO("ib[%d]=0x%08X\n", idx, ib[idx]); |
@@ -896,7 +745,7 @@ int r100_cs_packet_parse(struct radeon_cs_parser *p, | |||
896 | idx, ib_chunk->length_dw); | 745 | idx, ib_chunk->length_dw); |
897 | return -EINVAL; | 746 | return -EINVAL; |
898 | } | 747 | } |
899 | header = ib_chunk->kdata[idx]; | 748 | header = radeon_get_ib_value(p, idx); |
900 | pkt->idx = idx; | 749 | pkt->idx = idx; |
901 | pkt->type = CP_PACKET_GET_TYPE(header); | 750 | pkt->type = CP_PACKET_GET_TYPE(header); |
902 | pkt->count = CP_PACKET_GET_COUNT(header); | 751 | pkt->count = CP_PACKET_GET_COUNT(header); |
@@ -939,7 +788,6 @@ int r100_cs_packet_parse(struct radeon_cs_parser *p, | |||
939 | */ | 788 | */ |
940 | int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) | 789 | int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) |
941 | { | 790 | { |
942 | struct radeon_cs_chunk *ib_chunk; | ||
943 | struct drm_mode_object *obj; | 791 | struct drm_mode_object *obj; |
944 | struct drm_crtc *crtc; | 792 | struct drm_crtc *crtc; |
945 | struct radeon_crtc *radeon_crtc; | 793 | struct radeon_crtc *radeon_crtc; |
@@ -947,8 +795,9 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) | |||
947 | int crtc_id; | 795 | int crtc_id; |
948 | int r; | 796 | int r; |
949 | uint32_t header, h_idx, reg; | 797 | uint32_t header, h_idx, reg; |
798 | volatile uint32_t *ib; | ||
950 | 799 | ||
951 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | 800 | ib = p->ib->ptr; |
952 | 801 | ||
953 | /* parse the wait until */ | 802 | /* parse the wait until */ |
954 | r = r100_cs_packet_parse(p, &waitreloc, p->idx); | 803 | r = r100_cs_packet_parse(p, &waitreloc, p->idx); |
@@ -963,24 +812,24 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) | |||
963 | return r; | 812 | return r; |
964 | } | 813 | } |
965 | 814 | ||
966 | if (ib_chunk->kdata[waitreloc.idx + 1] != RADEON_WAIT_CRTC_VLINE) { | 815 | if (radeon_get_ib_value(p, waitreloc.idx + 1) != RADEON_WAIT_CRTC_VLINE) { |
967 | DRM_ERROR("vline wait had illegal wait until\n"); | 816 | DRM_ERROR("vline wait had illegal wait until\n"); |
968 | r = -EINVAL; | 817 | r = -EINVAL; |
969 | return r; | 818 | return r; |
970 | } | 819 | } |
971 | 820 | ||
972 | /* jump over the NOP */ | 821 | /* jump over the NOP */ |
973 | r = r100_cs_packet_parse(p, &p3reloc, p->idx); | 822 | r = r100_cs_packet_parse(p, &p3reloc, p->idx + waitreloc.count + 2); |
974 | if (r) | 823 | if (r) |
975 | return r; | 824 | return r; |
976 | 825 | ||
977 | h_idx = p->idx - 2; | 826 | h_idx = p->idx - 2; |
978 | p->idx += waitreloc.count; | 827 | p->idx += waitreloc.count + 2; |
979 | p->idx += p3reloc.count; | 828 | p->idx += p3reloc.count + 2; |
980 | 829 | ||
981 | header = ib_chunk->kdata[h_idx]; | 830 | header = radeon_get_ib_value(p, h_idx); |
982 | crtc_id = ib_chunk->kdata[h_idx + 5]; | 831 | crtc_id = radeon_get_ib_value(p, h_idx + 5); |
983 | reg = ib_chunk->kdata[h_idx] >> 2; | 832 | reg = CP_PACKET0_GET_REG(header); |
984 | mutex_lock(&p->rdev->ddev->mode_config.mutex); | 833 | mutex_lock(&p->rdev->ddev->mode_config.mutex); |
985 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); | 834 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); |
986 | if (!obj) { | 835 | if (!obj) { |
@@ -994,16 +843,16 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) | |||
994 | 843 | ||
995 | if (!crtc->enabled) { | 844 | if (!crtc->enabled) { |
996 | /* if the CRTC isn't enabled - we need to nop out the wait until */ | 845 | /* if the CRTC isn't enabled - we need to nop out the wait until */ |
997 | ib_chunk->kdata[h_idx + 2] = PACKET2(0); | 846 | ib[h_idx + 2] = PACKET2(0); |
998 | ib_chunk->kdata[h_idx + 3] = PACKET2(0); | 847 | ib[h_idx + 3] = PACKET2(0); |
999 | } else if (crtc_id == 1) { | 848 | } else if (crtc_id == 1) { |
1000 | switch (reg) { | 849 | switch (reg) { |
1001 | case AVIVO_D1MODE_VLINE_START_END: | 850 | case AVIVO_D1MODE_VLINE_START_END: |
1002 | header &= R300_CP_PACKET0_REG_MASK; | 851 | header &= ~R300_CP_PACKET0_REG_MASK; |
1003 | header |= AVIVO_D2MODE_VLINE_START_END >> 2; | 852 | header |= AVIVO_D2MODE_VLINE_START_END >> 2; |
1004 | break; | 853 | break; |
1005 | case RADEON_CRTC_GUI_TRIG_VLINE: | 854 | case RADEON_CRTC_GUI_TRIG_VLINE: |
1006 | header &= R300_CP_PACKET0_REG_MASK; | 855 | header &= ~R300_CP_PACKET0_REG_MASK; |
1007 | header |= RADEON_CRTC2_GUI_TRIG_VLINE >> 2; | 856 | header |= RADEON_CRTC2_GUI_TRIG_VLINE >> 2; |
1008 | break; | 857 | break; |
1009 | default: | 858 | default: |
@@ -1011,8 +860,8 @@ int r100_cs_packet_parse_vline(struct radeon_cs_parser *p) | |||
1011 | r = -EINVAL; | 860 | r = -EINVAL; |
1012 | goto out; | 861 | goto out; |
1013 | } | 862 | } |
1014 | ib_chunk->kdata[h_idx] = header; | 863 | ib[h_idx] = header; |
1015 | ib_chunk->kdata[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1; | 864 | ib[h_idx + 3] |= RADEON_ENG_DISPLAY_SELECT_CRTC1; |
1016 | } | 865 | } |
1017 | out: | 866 | out: |
1018 | mutex_unlock(&p->rdev->ddev->mode_config.mutex); | 867 | mutex_unlock(&p->rdev->ddev->mode_config.mutex); |
@@ -1033,7 +882,6 @@ out: | |||
1033 | int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, | 882 | int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, |
1034 | struct radeon_cs_reloc **cs_reloc) | 883 | struct radeon_cs_reloc **cs_reloc) |
1035 | { | 884 | { |
1036 | struct radeon_cs_chunk *ib_chunk; | ||
1037 | struct radeon_cs_chunk *relocs_chunk; | 885 | struct radeon_cs_chunk *relocs_chunk; |
1038 | struct radeon_cs_packet p3reloc; | 886 | struct radeon_cs_packet p3reloc; |
1039 | unsigned idx; | 887 | unsigned idx; |
@@ -1044,7 +892,6 @@ int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, | |||
1044 | return -EINVAL; | 892 | return -EINVAL; |
1045 | } | 893 | } |
1046 | *cs_reloc = NULL; | 894 | *cs_reloc = NULL; |
1047 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
1048 | relocs_chunk = &p->chunks[p->chunk_relocs_idx]; | 895 | relocs_chunk = &p->chunks[p->chunk_relocs_idx]; |
1049 | r = r100_cs_packet_parse(p, &p3reloc, p->idx); | 896 | r = r100_cs_packet_parse(p, &p3reloc, p->idx); |
1050 | if (r) { | 897 | if (r) { |
@@ -1057,7 +904,7 @@ int r100_cs_packet_next_reloc(struct radeon_cs_parser *p, | |||
1057 | r100_cs_dump_packet(p, &p3reloc); | 904 | r100_cs_dump_packet(p, &p3reloc); |
1058 | return -EINVAL; | 905 | return -EINVAL; |
1059 | } | 906 | } |
1060 | idx = ib_chunk->kdata[p3reloc.idx + 1]; | 907 | idx = radeon_get_ib_value(p, p3reloc.idx + 1); |
1061 | if (idx >= relocs_chunk->length_dw) { | 908 | if (idx >= relocs_chunk->length_dw) { |
1062 | DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", | 909 | DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", |
1063 | idx, relocs_chunk->length_dw); | 910 | idx, relocs_chunk->length_dw); |
@@ -1126,7 +973,6 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1126 | struct radeon_cs_packet *pkt, | 973 | struct radeon_cs_packet *pkt, |
1127 | unsigned idx, unsigned reg) | 974 | unsigned idx, unsigned reg) |
1128 | { | 975 | { |
1129 | struct radeon_cs_chunk *ib_chunk; | ||
1130 | struct radeon_cs_reloc *reloc; | 976 | struct radeon_cs_reloc *reloc; |
1131 | struct r100_cs_track *track; | 977 | struct r100_cs_track *track; |
1132 | volatile uint32_t *ib; | 978 | volatile uint32_t *ib; |
@@ -1134,11 +980,13 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1134 | int r; | 980 | int r; |
1135 | int i, face; | 981 | int i, face; |
1136 | u32 tile_flags = 0; | 982 | u32 tile_flags = 0; |
983 | u32 idx_value; | ||
1137 | 984 | ||
1138 | ib = p->ib->ptr; | 985 | ib = p->ib->ptr; |
1139 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
1140 | track = (struct r100_cs_track *)p->track; | 986 | track = (struct r100_cs_track *)p->track; |
1141 | 987 | ||
988 | idx_value = radeon_get_ib_value(p, idx); | ||
989 | |||
1142 | switch (reg) { | 990 | switch (reg) { |
1143 | case RADEON_CRTC_GUI_TRIG_VLINE: | 991 | case RADEON_CRTC_GUI_TRIG_VLINE: |
1144 | r = r100_cs_packet_parse_vline(p); | 992 | r = r100_cs_packet_parse_vline(p); |
@@ -1166,8 +1014,8 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1166 | return r; | 1014 | return r; |
1167 | } | 1015 | } |
1168 | track->zb.robj = reloc->robj; | 1016 | track->zb.robj = reloc->robj; |
1169 | track->zb.offset = ib_chunk->kdata[idx]; | 1017 | track->zb.offset = idx_value; |
1170 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1018 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1171 | break; | 1019 | break; |
1172 | case RADEON_RB3D_COLOROFFSET: | 1020 | case RADEON_RB3D_COLOROFFSET: |
1173 | r = r100_cs_packet_next_reloc(p, &reloc); | 1021 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -1178,8 +1026,8 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1178 | return r; | 1026 | return r; |
1179 | } | 1027 | } |
1180 | track->cb[0].robj = reloc->robj; | 1028 | track->cb[0].robj = reloc->robj; |
1181 | track->cb[0].offset = ib_chunk->kdata[idx]; | 1029 | track->cb[0].offset = idx_value; |
1182 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1030 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1183 | break; | 1031 | break; |
1184 | case RADEON_PP_TXOFFSET_0: | 1032 | case RADEON_PP_TXOFFSET_0: |
1185 | case RADEON_PP_TXOFFSET_1: | 1033 | case RADEON_PP_TXOFFSET_1: |
@@ -1192,7 +1040,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1192 | r100_cs_dump_packet(p, pkt); | 1040 | r100_cs_dump_packet(p, pkt); |
1193 | return r; | 1041 | return r; |
1194 | } | 1042 | } |
1195 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1043 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1196 | track->textures[i].robj = reloc->robj; | 1044 | track->textures[i].robj = reloc->robj; |
1197 | break; | 1045 | break; |
1198 | case RADEON_PP_CUBIC_OFFSET_T0_0: | 1046 | case RADEON_PP_CUBIC_OFFSET_T0_0: |
@@ -1208,8 +1056,8 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1208 | r100_cs_dump_packet(p, pkt); | 1056 | r100_cs_dump_packet(p, pkt); |
1209 | return r; | 1057 | return r; |
1210 | } | 1058 | } |
1211 | track->textures[0].cube_info[i].offset = ib_chunk->kdata[idx]; | 1059 | track->textures[0].cube_info[i].offset = idx_value; |
1212 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1060 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1213 | track->textures[0].cube_info[i].robj = reloc->robj; | 1061 | track->textures[0].cube_info[i].robj = reloc->robj; |
1214 | break; | 1062 | break; |
1215 | case RADEON_PP_CUBIC_OFFSET_T1_0: | 1063 | case RADEON_PP_CUBIC_OFFSET_T1_0: |
@@ -1225,8 +1073,8 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1225 | r100_cs_dump_packet(p, pkt); | 1073 | r100_cs_dump_packet(p, pkt); |
1226 | return r; | 1074 | return r; |
1227 | } | 1075 | } |
1228 | track->textures[1].cube_info[i].offset = ib_chunk->kdata[idx]; | 1076 | track->textures[1].cube_info[i].offset = idx_value; |
1229 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1077 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1230 | track->textures[1].cube_info[i].robj = reloc->robj; | 1078 | track->textures[1].cube_info[i].robj = reloc->robj; |
1231 | break; | 1079 | break; |
1232 | case RADEON_PP_CUBIC_OFFSET_T2_0: | 1080 | case RADEON_PP_CUBIC_OFFSET_T2_0: |
@@ -1242,12 +1090,12 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1242 | r100_cs_dump_packet(p, pkt); | 1090 | r100_cs_dump_packet(p, pkt); |
1243 | return r; | 1091 | return r; |
1244 | } | 1092 | } |
1245 | track->textures[2].cube_info[i].offset = ib_chunk->kdata[idx]; | 1093 | track->textures[2].cube_info[i].offset = idx_value; |
1246 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1094 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1247 | track->textures[2].cube_info[i].robj = reloc->robj; | 1095 | track->textures[2].cube_info[i].robj = reloc->robj; |
1248 | break; | 1096 | break; |
1249 | case RADEON_RE_WIDTH_HEIGHT: | 1097 | case RADEON_RE_WIDTH_HEIGHT: |
1250 | track->maxy = ((ib_chunk->kdata[idx] >> 16) & 0x7FF); | 1098 | track->maxy = ((idx_value >> 16) & 0x7FF); |
1251 | break; | 1099 | break; |
1252 | case RADEON_RB3D_COLORPITCH: | 1100 | case RADEON_RB3D_COLORPITCH: |
1253 | r = r100_cs_packet_next_reloc(p, &reloc); | 1101 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -1263,17 +1111,17 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1263 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) | 1111 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
1264 | tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; | 1112 | tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; |
1265 | 1113 | ||
1266 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); | 1114 | tmp = idx_value & ~(0x7 << 16); |
1267 | tmp |= tile_flags; | 1115 | tmp |= tile_flags; |
1268 | ib[idx] = tmp; | 1116 | ib[idx] = tmp; |
1269 | 1117 | ||
1270 | track->cb[0].pitch = ib_chunk->kdata[idx] & RADEON_COLORPITCH_MASK; | 1118 | track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; |
1271 | break; | 1119 | break; |
1272 | case RADEON_RB3D_DEPTHPITCH: | 1120 | case RADEON_RB3D_DEPTHPITCH: |
1273 | track->zb.pitch = ib_chunk->kdata[idx] & RADEON_DEPTHPITCH_MASK; | 1121 | track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK; |
1274 | break; | 1122 | break; |
1275 | case RADEON_RB3D_CNTL: | 1123 | case RADEON_RB3D_CNTL: |
1276 | switch ((ib_chunk->kdata[idx] >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { | 1124 | switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { |
1277 | case 7: | 1125 | case 7: |
1278 | case 8: | 1126 | case 8: |
1279 | case 9: | 1127 | case 9: |
@@ -1291,13 +1139,13 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1291 | break; | 1139 | break; |
1292 | default: | 1140 | default: |
1293 | DRM_ERROR("Invalid color buffer format (%d) !\n", | 1141 | DRM_ERROR("Invalid color buffer format (%d) !\n", |
1294 | ((ib_chunk->kdata[idx] >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f)); | 1142 | ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f)); |
1295 | return -EINVAL; | 1143 | return -EINVAL; |
1296 | } | 1144 | } |
1297 | track->z_enabled = !!(ib_chunk->kdata[idx] & RADEON_Z_ENABLE); | 1145 | track->z_enabled = !!(idx_value & RADEON_Z_ENABLE); |
1298 | break; | 1146 | break; |
1299 | case RADEON_RB3D_ZSTENCILCNTL: | 1147 | case RADEON_RB3D_ZSTENCILCNTL: |
1300 | switch (ib_chunk->kdata[idx] & 0xf) { | 1148 | switch (idx_value & 0xf) { |
1301 | case 0: | 1149 | case 0: |
1302 | track->zb.cpp = 2; | 1150 | track->zb.cpp = 2; |
1303 | break; | 1151 | break; |
@@ -1321,44 +1169,44 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1321 | r100_cs_dump_packet(p, pkt); | 1169 | r100_cs_dump_packet(p, pkt); |
1322 | return r; | 1170 | return r; |
1323 | } | 1171 | } |
1324 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1172 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1325 | break; | 1173 | break; |
1326 | case RADEON_PP_CNTL: | 1174 | case RADEON_PP_CNTL: |
1327 | { | 1175 | { |
1328 | uint32_t temp = ib_chunk->kdata[idx] >> 4; | 1176 | uint32_t temp = idx_value >> 4; |
1329 | for (i = 0; i < track->num_texture; i++) | 1177 | for (i = 0; i < track->num_texture; i++) |
1330 | track->textures[i].enabled = !!(temp & (1 << i)); | 1178 | track->textures[i].enabled = !!(temp & (1 << i)); |
1331 | } | 1179 | } |
1332 | break; | 1180 | break; |
1333 | case RADEON_SE_VF_CNTL: | 1181 | case RADEON_SE_VF_CNTL: |
1334 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 1182 | track->vap_vf_cntl = idx_value; |
1335 | break; | 1183 | break; |
1336 | case RADEON_SE_VTX_FMT: | 1184 | case RADEON_SE_VTX_FMT: |
1337 | track->vtx_size = r100_get_vtx_size(ib_chunk->kdata[idx]); | 1185 | track->vtx_size = r100_get_vtx_size(idx_value); |
1338 | break; | 1186 | break; |
1339 | case RADEON_PP_TEX_SIZE_0: | 1187 | case RADEON_PP_TEX_SIZE_0: |
1340 | case RADEON_PP_TEX_SIZE_1: | 1188 | case RADEON_PP_TEX_SIZE_1: |
1341 | case RADEON_PP_TEX_SIZE_2: | 1189 | case RADEON_PP_TEX_SIZE_2: |
1342 | i = (reg - RADEON_PP_TEX_SIZE_0) / 8; | 1190 | i = (reg - RADEON_PP_TEX_SIZE_0) / 8; |
1343 | track->textures[i].width = (ib_chunk->kdata[idx] & RADEON_TEX_USIZE_MASK) + 1; | 1191 | track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1; |
1344 | track->textures[i].height = ((ib_chunk->kdata[idx] & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; | 1192 | track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; |
1345 | break; | 1193 | break; |
1346 | case RADEON_PP_TEX_PITCH_0: | 1194 | case RADEON_PP_TEX_PITCH_0: |
1347 | case RADEON_PP_TEX_PITCH_1: | 1195 | case RADEON_PP_TEX_PITCH_1: |
1348 | case RADEON_PP_TEX_PITCH_2: | 1196 | case RADEON_PP_TEX_PITCH_2: |
1349 | i = (reg - RADEON_PP_TEX_PITCH_0) / 8; | 1197 | i = (reg - RADEON_PP_TEX_PITCH_0) / 8; |
1350 | track->textures[i].pitch = ib_chunk->kdata[idx] + 32; | 1198 | track->textures[i].pitch = idx_value + 32; |
1351 | break; | 1199 | break; |
1352 | case RADEON_PP_TXFILTER_0: | 1200 | case RADEON_PP_TXFILTER_0: |
1353 | case RADEON_PP_TXFILTER_1: | 1201 | case RADEON_PP_TXFILTER_1: |
1354 | case RADEON_PP_TXFILTER_2: | 1202 | case RADEON_PP_TXFILTER_2: |
1355 | i = (reg - RADEON_PP_TXFILTER_0) / 24; | 1203 | i = (reg - RADEON_PP_TXFILTER_0) / 24; |
1356 | track->textures[i].num_levels = ((ib_chunk->kdata[idx] & RADEON_MAX_MIP_LEVEL_MASK) | 1204 | track->textures[i].num_levels = ((idx_value & RADEON_MAX_MIP_LEVEL_MASK) |
1357 | >> RADEON_MAX_MIP_LEVEL_SHIFT); | 1205 | >> RADEON_MAX_MIP_LEVEL_SHIFT); |
1358 | tmp = (ib_chunk->kdata[idx] >> 23) & 0x7; | 1206 | tmp = (idx_value >> 23) & 0x7; |
1359 | if (tmp == 2 || tmp == 6) | 1207 | if (tmp == 2 || tmp == 6) |
1360 | track->textures[i].roundup_w = false; | 1208 | track->textures[i].roundup_w = false; |
1361 | tmp = (ib_chunk->kdata[idx] >> 27) & 0x7; | 1209 | tmp = (idx_value >> 27) & 0x7; |
1362 | if (tmp == 2 || tmp == 6) | 1210 | if (tmp == 2 || tmp == 6) |
1363 | track->textures[i].roundup_h = false; | 1211 | track->textures[i].roundup_h = false; |
1364 | break; | 1212 | break; |
@@ -1366,16 +1214,16 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1366 | case RADEON_PP_TXFORMAT_1: | 1214 | case RADEON_PP_TXFORMAT_1: |
1367 | case RADEON_PP_TXFORMAT_2: | 1215 | case RADEON_PP_TXFORMAT_2: |
1368 | i = (reg - RADEON_PP_TXFORMAT_0) / 24; | 1216 | i = (reg - RADEON_PP_TXFORMAT_0) / 24; |
1369 | if (ib_chunk->kdata[idx] & RADEON_TXFORMAT_NON_POWER2) { | 1217 | if (idx_value & RADEON_TXFORMAT_NON_POWER2) { |
1370 | track->textures[i].use_pitch = 1; | 1218 | track->textures[i].use_pitch = 1; |
1371 | } else { | 1219 | } else { |
1372 | track->textures[i].use_pitch = 0; | 1220 | track->textures[i].use_pitch = 0; |
1373 | track->textures[i].width = 1 << ((ib_chunk->kdata[idx] >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); | 1221 | track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); |
1374 | track->textures[i].height = 1 << ((ib_chunk->kdata[idx] >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); | 1222 | track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); |
1375 | } | 1223 | } |
1376 | if (ib_chunk->kdata[idx] & RADEON_TXFORMAT_CUBIC_MAP_ENABLE) | 1224 | if (idx_value & RADEON_TXFORMAT_CUBIC_MAP_ENABLE) |
1377 | track->textures[i].tex_coord_type = 2; | 1225 | track->textures[i].tex_coord_type = 2; |
1378 | switch ((ib_chunk->kdata[idx] & RADEON_TXFORMAT_FORMAT_MASK)) { | 1226 | switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) { |
1379 | case RADEON_TXFORMAT_I8: | 1227 | case RADEON_TXFORMAT_I8: |
1380 | case RADEON_TXFORMAT_RGB332: | 1228 | case RADEON_TXFORMAT_RGB332: |
1381 | case RADEON_TXFORMAT_Y8: | 1229 | case RADEON_TXFORMAT_Y8: |
@@ -1402,13 +1250,13 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
1402 | track->textures[i].cpp = 4; | 1250 | track->textures[i].cpp = 4; |
1403 | break; | 1251 | break; |
1404 | } | 1252 | } |
1405 | track->textures[i].cube_info[4].width = 1 << ((ib_chunk->kdata[idx] >> 16) & 0xf); | 1253 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); |
1406 | track->textures[i].cube_info[4].height = 1 << ((ib_chunk->kdata[idx] >> 20) & 0xf); | 1254 | track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); |
1407 | break; | 1255 | break; |
1408 | case RADEON_PP_CUBIC_FACES_0: | 1256 | case RADEON_PP_CUBIC_FACES_0: |
1409 | case RADEON_PP_CUBIC_FACES_1: | 1257 | case RADEON_PP_CUBIC_FACES_1: |
1410 | case RADEON_PP_CUBIC_FACES_2: | 1258 | case RADEON_PP_CUBIC_FACES_2: |
1411 | tmp = ib_chunk->kdata[idx]; | 1259 | tmp = idx_value; |
1412 | i = (reg - RADEON_PP_CUBIC_FACES_0) / 4; | 1260 | i = (reg - RADEON_PP_CUBIC_FACES_0) / 4; |
1413 | for (face = 0; face < 4; face++) { | 1261 | for (face = 0; face < 4; face++) { |
1414 | track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf); | 1262 | track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf); |
@@ -1427,15 +1275,14 @@ int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | |||
1427 | struct radeon_cs_packet *pkt, | 1275 | struct radeon_cs_packet *pkt, |
1428 | struct radeon_object *robj) | 1276 | struct radeon_object *robj) |
1429 | { | 1277 | { |
1430 | struct radeon_cs_chunk *ib_chunk; | ||
1431 | unsigned idx; | 1278 | unsigned idx; |
1432 | 1279 | u32 value; | |
1433 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
1434 | idx = pkt->idx + 1; | 1280 | idx = pkt->idx + 1; |
1435 | if ((ib_chunk->kdata[idx+2] + 1) > radeon_object_size(robj)) { | 1281 | value = radeon_get_ib_value(p, idx + 2); |
1282 | if ((value + 1) > radeon_object_size(robj)) { | ||
1436 | DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER " | 1283 | DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER " |
1437 | "(need %u have %lu) !\n", | 1284 | "(need %u have %lu) !\n", |
1438 | ib_chunk->kdata[idx+2] + 1, | 1285 | value + 1, |
1439 | radeon_object_size(robj)); | 1286 | radeon_object_size(robj)); |
1440 | return -EINVAL; | 1287 | return -EINVAL; |
1441 | } | 1288 | } |
@@ -1445,59 +1292,20 @@ int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | |||
1445 | static int r100_packet3_check(struct radeon_cs_parser *p, | 1292 | static int r100_packet3_check(struct radeon_cs_parser *p, |
1446 | struct radeon_cs_packet *pkt) | 1293 | struct radeon_cs_packet *pkt) |
1447 | { | 1294 | { |
1448 | struct radeon_cs_chunk *ib_chunk; | ||
1449 | struct radeon_cs_reloc *reloc; | 1295 | struct radeon_cs_reloc *reloc; |
1450 | struct r100_cs_track *track; | 1296 | struct r100_cs_track *track; |
1451 | unsigned idx; | 1297 | unsigned idx; |
1452 | unsigned i, c; | ||
1453 | volatile uint32_t *ib; | 1298 | volatile uint32_t *ib; |
1454 | int r; | 1299 | int r; |
1455 | 1300 | ||
1456 | ib = p->ib->ptr; | 1301 | ib = p->ib->ptr; |
1457 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
1458 | idx = pkt->idx + 1; | 1302 | idx = pkt->idx + 1; |
1459 | track = (struct r100_cs_track *)p->track; | 1303 | track = (struct r100_cs_track *)p->track; |
1460 | switch (pkt->opcode) { | 1304 | switch (pkt->opcode) { |
1461 | case PACKET3_3D_LOAD_VBPNTR: | 1305 | case PACKET3_3D_LOAD_VBPNTR: |
1462 | c = ib_chunk->kdata[idx++]; | 1306 | r = r100_packet3_load_vbpntr(p, pkt, idx); |
1463 | track->num_arrays = c; | 1307 | if (r) |
1464 | for (i = 0; i < (c - 1); i += 2, idx += 3) { | 1308 | return r; |
1465 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
1466 | if (r) { | ||
1467 | DRM_ERROR("No reloc for packet3 %d\n", | ||
1468 | pkt->opcode); | ||
1469 | r100_cs_dump_packet(p, pkt); | ||
1470 | return r; | ||
1471 | } | ||
1472 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | ||
1473 | track->arrays[i + 0].robj = reloc->robj; | ||
1474 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; | ||
1475 | track->arrays[i + 0].esize &= 0x7F; | ||
1476 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
1477 | if (r) { | ||
1478 | DRM_ERROR("No reloc for packet3 %d\n", | ||
1479 | pkt->opcode); | ||
1480 | r100_cs_dump_packet(p, pkt); | ||
1481 | return r; | ||
1482 | } | ||
1483 | ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset); | ||
1484 | track->arrays[i + 1].robj = reloc->robj; | ||
1485 | track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24; | ||
1486 | track->arrays[i + 1].esize &= 0x7F; | ||
1487 | } | ||
1488 | if (c & 1) { | ||
1489 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
1490 | if (r) { | ||
1491 | DRM_ERROR("No reloc for packet3 %d\n", | ||
1492 | pkt->opcode); | ||
1493 | r100_cs_dump_packet(p, pkt); | ||
1494 | return r; | ||
1495 | } | ||
1496 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | ||
1497 | track->arrays[i + 0].robj = reloc->robj; | ||
1498 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; | ||
1499 | track->arrays[i + 0].esize &= 0x7F; | ||
1500 | } | ||
1501 | break; | 1309 | break; |
1502 | case PACKET3_INDX_BUFFER: | 1310 | case PACKET3_INDX_BUFFER: |
1503 | r = r100_cs_packet_next_reloc(p, &reloc); | 1311 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -1506,7 +1314,7 @@ static int r100_packet3_check(struct radeon_cs_parser *p, | |||
1506 | r100_cs_dump_packet(p, pkt); | 1314 | r100_cs_dump_packet(p, pkt); |
1507 | return r; | 1315 | return r; |
1508 | } | 1316 | } |
1509 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | 1317 | ib[idx+1] = radeon_get_ib_value(p, idx+1) + ((u32)reloc->lobj.gpu_offset); |
1510 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); | 1318 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1511 | if (r) { | 1319 | if (r) { |
1512 | return r; | 1320 | return r; |
@@ -1520,27 +1328,27 @@ static int r100_packet3_check(struct radeon_cs_parser *p, | |||
1520 | r100_cs_dump_packet(p, pkt); | 1328 | r100_cs_dump_packet(p, pkt); |
1521 | return r; | 1329 | return r; |
1522 | } | 1330 | } |
1523 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 1331 | ib[idx] = radeon_get_ib_value(p, idx) + ((u32)reloc->lobj.gpu_offset); |
1524 | track->num_arrays = 1; | 1332 | track->num_arrays = 1; |
1525 | track->vtx_size = r100_get_vtx_size(ib_chunk->kdata[idx+2]); | 1333 | track->vtx_size = r100_get_vtx_size(radeon_get_ib_value(p, idx + 2)); |
1526 | 1334 | ||
1527 | track->arrays[0].robj = reloc->robj; | 1335 | track->arrays[0].robj = reloc->robj; |
1528 | track->arrays[0].esize = track->vtx_size; | 1336 | track->arrays[0].esize = track->vtx_size; |
1529 | 1337 | ||
1530 | track->max_indx = ib_chunk->kdata[idx+1]; | 1338 | track->max_indx = radeon_get_ib_value(p, idx+1); |
1531 | 1339 | ||
1532 | track->vap_vf_cntl = ib_chunk->kdata[idx+3]; | 1340 | track->vap_vf_cntl = radeon_get_ib_value(p, idx+3); |
1533 | track->immd_dwords = pkt->count - 1; | 1341 | track->immd_dwords = pkt->count - 1; |
1534 | r = r100_cs_track_check(p->rdev, track); | 1342 | r = r100_cs_track_check(p->rdev, track); |
1535 | if (r) | 1343 | if (r) |
1536 | return r; | 1344 | return r; |
1537 | break; | 1345 | break; |
1538 | case PACKET3_3D_DRAW_IMMD: | 1346 | case PACKET3_3D_DRAW_IMMD: |
1539 | if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) { | 1347 | if (((radeon_get_ib_value(p, idx + 1) >> 4) & 0x3) != 3) { |
1540 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); | 1348 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1541 | return -EINVAL; | 1349 | return -EINVAL; |
1542 | } | 1350 | } |
1543 | track->vap_vf_cntl = ib_chunk->kdata[idx+1]; | 1351 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1544 | track->immd_dwords = pkt->count - 1; | 1352 | track->immd_dwords = pkt->count - 1; |
1545 | r = r100_cs_track_check(p->rdev, track); | 1353 | r = r100_cs_track_check(p->rdev, track); |
1546 | if (r) | 1354 | if (r) |
@@ -1548,11 +1356,11 @@ static int r100_packet3_check(struct radeon_cs_parser *p, | |||
1548 | break; | 1356 | break; |
1549 | /* triggers drawing using in-packet vertex data */ | 1357 | /* triggers drawing using in-packet vertex data */ |
1550 | case PACKET3_3D_DRAW_IMMD_2: | 1358 | case PACKET3_3D_DRAW_IMMD_2: |
1551 | if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) { | 1359 | if (((radeon_get_ib_value(p, idx) >> 4) & 0x3) != 3) { |
1552 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); | 1360 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1553 | return -EINVAL; | 1361 | return -EINVAL; |
1554 | } | 1362 | } |
1555 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 1363 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1556 | track->immd_dwords = pkt->count; | 1364 | track->immd_dwords = pkt->count; |
1557 | r = r100_cs_track_check(p->rdev, track); | 1365 | r = r100_cs_track_check(p->rdev, track); |
1558 | if (r) | 1366 | if (r) |
@@ -1560,28 +1368,28 @@ static int r100_packet3_check(struct radeon_cs_parser *p, | |||
1560 | break; | 1368 | break; |
1561 | /* triggers drawing using in-packet vertex data */ | 1369 | /* triggers drawing using in-packet vertex data */ |
1562 | case PACKET3_3D_DRAW_VBUF_2: | 1370 | case PACKET3_3D_DRAW_VBUF_2: |
1563 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 1371 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1564 | r = r100_cs_track_check(p->rdev, track); | 1372 | r = r100_cs_track_check(p->rdev, track); |
1565 | if (r) | 1373 | if (r) |
1566 | return r; | 1374 | return r; |
1567 | break; | 1375 | break; |
1568 | /* triggers drawing of vertex buffers setup elsewhere */ | 1376 | /* triggers drawing of vertex buffers setup elsewhere */ |
1569 | case PACKET3_3D_DRAW_INDX_2: | 1377 | case PACKET3_3D_DRAW_INDX_2: |
1570 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 1378 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1571 | r = r100_cs_track_check(p->rdev, track); | 1379 | r = r100_cs_track_check(p->rdev, track); |
1572 | if (r) | 1380 | if (r) |
1573 | return r; | 1381 | return r; |
1574 | break; | 1382 | break; |
1575 | /* triggers drawing using indices to vertex buffer */ | 1383 | /* triggers drawing using indices to vertex buffer */ |
1576 | case PACKET3_3D_DRAW_VBUF: | 1384 | case PACKET3_3D_DRAW_VBUF: |
1577 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; | 1385 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1578 | r = r100_cs_track_check(p->rdev, track); | 1386 | r = r100_cs_track_check(p->rdev, track); |
1579 | if (r) | 1387 | if (r) |
1580 | return r; | 1388 | return r; |
1581 | break; | 1389 | break; |
1582 | /* triggers drawing of vertex buffers setup elsewhere */ | 1390 | /* triggers drawing of vertex buffers setup elsewhere */ |
1583 | case PACKET3_3D_DRAW_INDX: | 1391 | case PACKET3_3D_DRAW_INDX: |
1584 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; | 1392 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1585 | r = r100_cs_track_check(p->rdev, track); | 1393 | r = r100_cs_track_check(p->rdev, track); |
1586 | if (r) | 1394 | if (r) |
1587 | return r; | 1395 | return r; |
@@ -2033,7 +1841,7 @@ void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
2033 | r100_pll_errata_after_data(rdev); | 1841 | r100_pll_errata_after_data(rdev); |
2034 | } | 1842 | } |
2035 | 1843 | ||
2036 | int r100_init(struct radeon_device *rdev) | 1844 | void r100_set_safe_registers(struct radeon_device *rdev) |
2037 | { | 1845 | { |
2038 | if (ASIC_IS_RN50(rdev)) { | 1846 | if (ASIC_IS_RN50(rdev)) { |
2039 | rdev->config.r100.reg_safe_bm = rn50_reg_safe_bm; | 1847 | rdev->config.r100.reg_safe_bm = rn50_reg_safe_bm; |
@@ -2042,9 +1850,8 @@ int r100_init(struct radeon_device *rdev) | |||
2042 | rdev->config.r100.reg_safe_bm = r100_reg_safe_bm; | 1850 | rdev->config.r100.reg_safe_bm = r100_reg_safe_bm; |
2043 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r100_reg_safe_bm); | 1851 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r100_reg_safe_bm); |
2044 | } else { | 1852 | } else { |
2045 | return r200_init(rdev); | 1853 | r200_set_safe_registers(rdev); |
2046 | } | 1854 | } |
2047 | return 0; | ||
2048 | } | 1855 | } |
2049 | 1856 | ||
2050 | /* | 1857 | /* |
@@ -2342,9 +2149,11 @@ void r100_bandwidth_update(struct radeon_device *rdev) | |||
2342 | mode1 = &rdev->mode_info.crtcs[0]->base.mode; | 2149 | mode1 = &rdev->mode_info.crtcs[0]->base.mode; |
2343 | pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8; | 2150 | pixel_bytes1 = rdev->mode_info.crtcs[0]->base.fb->bits_per_pixel / 8; |
2344 | } | 2151 | } |
2345 | if (rdev->mode_info.crtcs[1]->base.enabled) { | 2152 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { |
2346 | mode2 = &rdev->mode_info.crtcs[1]->base.mode; | 2153 | if (rdev->mode_info.crtcs[1]->base.enabled) { |
2347 | pixel_bytes2 = rdev->mode_info.crtcs[1]->base.fb->bits_per_pixel / 8; | 2154 | mode2 = &rdev->mode_info.crtcs[1]->base.mode; |
2155 | pixel_bytes2 = rdev->mode_info.crtcs[1]->base.fb->bits_per_pixel / 8; | ||
2156 | } | ||
2348 | } | 2157 | } |
2349 | 2158 | ||
2350 | min_mem_eff.full = rfixed_const_8(0); | 2159 | min_mem_eff.full = rfixed_const_8(0); |
@@ -3157,7 +2966,7 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save) | |||
3157 | WREG32(R_000740_CP_CSQ_CNTL, 0); | 2966 | WREG32(R_000740_CP_CSQ_CNTL, 0); |
3158 | 2967 | ||
3159 | /* Save few CRTC registers */ | 2968 | /* Save few CRTC registers */ |
3160 | save->GENMO_WT = RREG32(R_0003C0_GENMO_WT); | 2969 | save->GENMO_WT = RREG8(R_0003C2_GENMO_WT); |
3161 | save->CRTC_EXT_CNTL = RREG32(R_000054_CRTC_EXT_CNTL); | 2970 | save->CRTC_EXT_CNTL = RREG32(R_000054_CRTC_EXT_CNTL); |
3162 | save->CRTC_GEN_CNTL = RREG32(R_000050_CRTC_GEN_CNTL); | 2971 | save->CRTC_GEN_CNTL = RREG32(R_000050_CRTC_GEN_CNTL); |
3163 | save->CUR_OFFSET = RREG32(R_000260_CUR_OFFSET); | 2972 | save->CUR_OFFSET = RREG32(R_000260_CUR_OFFSET); |
@@ -3167,7 +2976,7 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save) | |||
3167 | } | 2976 | } |
3168 | 2977 | ||
3169 | /* Disable VGA aperture access */ | 2978 | /* Disable VGA aperture access */ |
3170 | WREG32(R_0003C0_GENMO_WT, C_0003C0_VGA_RAM_EN & save->GENMO_WT); | 2979 | WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & save->GENMO_WT); |
3171 | /* Disable cursor, overlay, crtc */ | 2980 | /* Disable cursor, overlay, crtc */ |
3172 | WREG32(R_000260_CUR_OFFSET, save->CUR_OFFSET | S_000260_CUR_LOCK(1)); | 2981 | WREG32(R_000260_CUR_OFFSET, save->CUR_OFFSET | S_000260_CUR_LOCK(1)); |
3173 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL | | 2982 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL | |
@@ -3199,10 +3008,264 @@ void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save) | |||
3199 | rdev->mc.vram_location); | 3008 | rdev->mc.vram_location); |
3200 | } | 3009 | } |
3201 | /* Restore CRTC registers */ | 3010 | /* Restore CRTC registers */ |
3202 | WREG32(R_0003C0_GENMO_WT, save->GENMO_WT); | 3011 | WREG8(R_0003C2_GENMO_WT, save->GENMO_WT); |
3203 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL); | 3012 | WREG32(R_000054_CRTC_EXT_CNTL, save->CRTC_EXT_CNTL); |
3204 | WREG32(R_000050_CRTC_GEN_CNTL, save->CRTC_GEN_CNTL); | 3013 | WREG32(R_000050_CRTC_GEN_CNTL, save->CRTC_GEN_CNTL); |
3205 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { | 3014 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) { |
3206 | WREG32(R_0003F8_CRTC2_GEN_CNTL, save->CRTC2_GEN_CNTL); | 3015 | WREG32(R_0003F8_CRTC2_GEN_CNTL, save->CRTC2_GEN_CNTL); |
3207 | } | 3016 | } |
3208 | } | 3017 | } |
3018 | |||
3019 | void r100_vga_render_disable(struct radeon_device *rdev) | ||
3020 | { | ||
3021 | u32 tmp; | ||
3022 | |||
3023 | tmp = RREG8(R_0003C2_GENMO_WT); | ||
3024 | WREG8(R_0003C2_GENMO_WT, C_0003C2_VGA_RAM_EN & tmp); | ||
3025 | } | ||
3026 | |||
3027 | static void r100_debugfs(struct radeon_device *rdev) | ||
3028 | { | ||
3029 | int r; | ||
3030 | |||
3031 | r = r100_debugfs_mc_info_init(rdev); | ||
3032 | if (r) | ||
3033 | dev_warn(rdev->dev, "Failed to create r100_mc debugfs file.\n"); | ||
3034 | } | ||
3035 | |||
3036 | static void r100_mc_program(struct radeon_device *rdev) | ||
3037 | { | ||
3038 | struct r100_mc_save save; | ||
3039 | |||
3040 | /* Stops all mc clients */ | ||
3041 | r100_mc_stop(rdev, &save); | ||
3042 | if (rdev->flags & RADEON_IS_AGP) { | ||
3043 | WREG32(R_00014C_MC_AGP_LOCATION, | ||
3044 | S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) | | ||
3045 | S_00014C_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); | ||
3046 | WREG32(R_000170_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); | ||
3047 | if (rdev->family > CHIP_RV200) | ||
3048 | WREG32(R_00015C_AGP_BASE_2, | ||
3049 | upper_32_bits(rdev->mc.agp_base) & 0xff); | ||
3050 | } else { | ||
3051 | WREG32(R_00014C_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
3052 | WREG32(R_000170_AGP_BASE, 0); | ||
3053 | if (rdev->family > CHIP_RV200) | ||
3054 | WREG32(R_00015C_AGP_BASE_2, 0); | ||
3055 | } | ||
3056 | /* Wait for mc idle */ | ||
3057 | if (r100_mc_wait_for_idle(rdev)) | ||
3058 | dev_warn(rdev->dev, "Wait for MC idle timeout.\n"); | ||
3059 | /* Program MC, should be a 32bits limited address space */ | ||
3060 | WREG32(R_000148_MC_FB_LOCATION, | ||
3061 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
3062 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
3063 | r100_mc_resume(rdev, &save); | ||
3064 | } | ||
3065 | |||
3066 | void r100_clock_startup(struct radeon_device *rdev) | ||
3067 | { | ||
3068 | u32 tmp; | ||
3069 | |||
3070 | if (radeon_dynclks != -1 && radeon_dynclks) | ||
3071 | radeon_legacy_set_clock_gating(rdev, 1); | ||
3072 | /* We need to force on some of the block */ | ||
3073 | tmp = RREG32_PLL(R_00000D_SCLK_CNTL); | ||
3074 | tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); | ||
3075 | if ((rdev->family == CHIP_RV250) || (rdev->family == CHIP_RV280)) | ||
3076 | tmp |= S_00000D_FORCE_DISP1(1) | S_00000D_FORCE_DISP2(1); | ||
3077 | WREG32_PLL(R_00000D_SCLK_CNTL, tmp); | ||
3078 | } | ||
3079 | |||
3080 | static int r100_startup(struct radeon_device *rdev) | ||
3081 | { | ||
3082 | int r; | ||
3083 | |||
3084 | r100_mc_program(rdev); | ||
3085 | /* Resume clock */ | ||
3086 | r100_clock_startup(rdev); | ||
3087 | /* Initialize GPU configuration (# pipes, ...) */ | ||
3088 | r100_gpu_init(rdev); | ||
3089 | /* Initialize GART (initialize after TTM so we can allocate | ||
3090 | * memory through TTM but finalize after TTM) */ | ||
3091 | if (rdev->flags & RADEON_IS_PCI) { | ||
3092 | r = r100_pci_gart_enable(rdev); | ||
3093 | if (r) | ||
3094 | return r; | ||
3095 | } | ||
3096 | /* Enable IRQ */ | ||
3097 | rdev->irq.sw_int = true; | ||
3098 | r100_irq_set(rdev); | ||
3099 | /* 1M ring buffer */ | ||
3100 | r = r100_cp_init(rdev, 1024 * 1024); | ||
3101 | if (r) { | ||
3102 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
3103 | return r; | ||
3104 | } | ||
3105 | r = r100_wb_init(rdev); | ||
3106 | if (r) | ||
3107 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
3108 | r = r100_ib_init(rdev); | ||
3109 | if (r) { | ||
3110 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
3111 | return r; | ||
3112 | } | ||
3113 | return 0; | ||
3114 | } | ||
3115 | |||
3116 | int r100_resume(struct radeon_device *rdev) | ||
3117 | { | ||
3118 | /* Make sur GART are not working */ | ||
3119 | if (rdev->flags & RADEON_IS_PCI) | ||
3120 | r100_pci_gart_disable(rdev); | ||
3121 | /* Resume clock before doing reset */ | ||
3122 | r100_clock_startup(rdev); | ||
3123 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
3124 | if (radeon_gpu_reset(rdev)) { | ||
3125 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
3126 | RREG32(R_000E40_RBBM_STATUS), | ||
3127 | RREG32(R_0007C0_CP_STAT)); | ||
3128 | } | ||
3129 | /* post */ | ||
3130 | radeon_combios_asic_init(rdev->ddev); | ||
3131 | /* Resume clock after posting */ | ||
3132 | r100_clock_startup(rdev); | ||
3133 | return r100_startup(rdev); | ||
3134 | } | ||
3135 | |||
3136 | int r100_suspend(struct radeon_device *rdev) | ||
3137 | { | ||
3138 | r100_cp_disable(rdev); | ||
3139 | r100_wb_disable(rdev); | ||
3140 | r100_irq_disable(rdev); | ||
3141 | if (rdev->flags & RADEON_IS_PCI) | ||
3142 | r100_pci_gart_disable(rdev); | ||
3143 | return 0; | ||
3144 | } | ||
3145 | |||
3146 | void r100_fini(struct radeon_device *rdev) | ||
3147 | { | ||
3148 | r100_suspend(rdev); | ||
3149 | r100_cp_fini(rdev); | ||
3150 | r100_wb_fini(rdev); | ||
3151 | r100_ib_fini(rdev); | ||
3152 | radeon_gem_fini(rdev); | ||
3153 | if (rdev->flags & RADEON_IS_PCI) | ||
3154 | r100_pci_gart_fini(rdev); | ||
3155 | radeon_irq_kms_fini(rdev); | ||
3156 | radeon_fence_driver_fini(rdev); | ||
3157 | radeon_object_fini(rdev); | ||
3158 | radeon_atombios_fini(rdev); | ||
3159 | kfree(rdev->bios); | ||
3160 | rdev->bios = NULL; | ||
3161 | } | ||
3162 | |||
3163 | int r100_mc_init(struct radeon_device *rdev) | ||
3164 | { | ||
3165 | int r; | ||
3166 | u32 tmp; | ||
3167 | |||
3168 | /* Setup GPU memory space */ | ||
3169 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
3170 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
3171 | if (rdev->flags & RADEON_IS_IGP) { | ||
3172 | tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM)); | ||
3173 | rdev->mc.vram_location = tmp << 16; | ||
3174 | } | ||
3175 | if (rdev->flags & RADEON_IS_AGP) { | ||
3176 | r = radeon_agp_init(rdev); | ||
3177 | if (r) { | ||
3178 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
3179 | rdev->flags &= ~RADEON_IS_AGP; | ||
3180 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
3181 | } else { | ||
3182 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
3183 | } | ||
3184 | } | ||
3185 | r = radeon_mc_setup(rdev); | ||
3186 | if (r) | ||
3187 | return r; | ||
3188 | return 0; | ||
3189 | } | ||
3190 | |||
3191 | int r100_init(struct radeon_device *rdev) | ||
3192 | { | ||
3193 | int r; | ||
3194 | |||
3195 | /* Register debugfs file specific to this group of asics */ | ||
3196 | r100_debugfs(rdev); | ||
3197 | /* Disable VGA */ | ||
3198 | r100_vga_render_disable(rdev); | ||
3199 | /* Initialize scratch registers */ | ||
3200 | radeon_scratch_init(rdev); | ||
3201 | /* Initialize surface registers */ | ||
3202 | radeon_surface_init(rdev); | ||
3203 | /* TODO: disable VGA need to use VGA request */ | ||
3204 | /* BIOS*/ | ||
3205 | if (!radeon_get_bios(rdev)) { | ||
3206 | if (ASIC_IS_AVIVO(rdev)) | ||
3207 | return -EINVAL; | ||
3208 | } | ||
3209 | if (rdev->is_atom_bios) { | ||
3210 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); | ||
3211 | return -EINVAL; | ||
3212 | } else { | ||
3213 | r = radeon_combios_init(rdev); | ||
3214 | if (r) | ||
3215 | return r; | ||
3216 | } | ||
3217 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
3218 | if (radeon_gpu_reset(rdev)) { | ||
3219 | dev_warn(rdev->dev, | ||
3220 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
3221 | RREG32(R_000E40_RBBM_STATUS), | ||
3222 | RREG32(R_0007C0_CP_STAT)); | ||
3223 | } | ||
3224 | /* check if cards are posted or not */ | ||
3225 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
3226 | DRM_INFO("GPU not posted. posting now...\n"); | ||
3227 | radeon_combios_asic_init(rdev->ddev); | ||
3228 | } | ||
3229 | /* Set asic errata */ | ||
3230 | r100_errata(rdev); | ||
3231 | /* Initialize clocks */ | ||
3232 | radeon_get_clock_info(rdev->ddev); | ||
3233 | /* Get vram informations */ | ||
3234 | r100_vram_info(rdev); | ||
3235 | /* Initialize memory controller (also test AGP) */ | ||
3236 | r = r100_mc_init(rdev); | ||
3237 | if (r) | ||
3238 | return r; | ||
3239 | /* Fence driver */ | ||
3240 | r = radeon_fence_driver_init(rdev); | ||
3241 | if (r) | ||
3242 | return r; | ||
3243 | r = radeon_irq_kms_init(rdev); | ||
3244 | if (r) | ||
3245 | return r; | ||
3246 | /* Memory manager */ | ||
3247 | r = radeon_object_init(rdev); | ||
3248 | if (r) | ||
3249 | return r; | ||
3250 | if (rdev->flags & RADEON_IS_PCI) { | ||
3251 | r = r100_pci_gart_init(rdev); | ||
3252 | if (r) | ||
3253 | return r; | ||
3254 | } | ||
3255 | r100_set_safe_registers(rdev); | ||
3256 | rdev->accel_working = true; | ||
3257 | r = r100_startup(rdev); | ||
3258 | if (r) { | ||
3259 | /* Somethings want wront with the accel init stop accel */ | ||
3260 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
3261 | r100_suspend(rdev); | ||
3262 | r100_cp_fini(rdev); | ||
3263 | r100_wb_fini(rdev); | ||
3264 | r100_ib_fini(rdev); | ||
3265 | if (rdev->flags & RADEON_IS_PCI) | ||
3266 | r100_pci_gart_fini(rdev); | ||
3267 | radeon_irq_kms_fini(rdev); | ||
3268 | rdev->accel_working = false; | ||
3269 | } | ||
3270 | return 0; | ||
3271 | } | ||
diff --git a/drivers/gpu/drm/radeon/r100_track.h b/drivers/gpu/drm/radeon/r100_track.h index 70a82eda394..0daf0d76a89 100644 --- a/drivers/gpu/drm/radeon/r100_track.h +++ b/drivers/gpu/drm/radeon/r100_track.h | |||
@@ -84,6 +84,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
84 | struct radeon_cs_packet *pkt, | 84 | struct radeon_cs_packet *pkt, |
85 | unsigned idx, unsigned reg); | 85 | unsigned idx, unsigned reg); |
86 | 86 | ||
87 | |||
88 | |||
87 | static inline int r100_reloc_pitch_offset(struct radeon_cs_parser *p, | 89 | static inline int r100_reloc_pitch_offset(struct radeon_cs_parser *p, |
88 | struct radeon_cs_packet *pkt, | 90 | struct radeon_cs_packet *pkt, |
89 | unsigned idx, | 91 | unsigned idx, |
@@ -93,9 +95,7 @@ static inline int r100_reloc_pitch_offset(struct radeon_cs_parser *p, | |||
93 | u32 tile_flags = 0; | 95 | u32 tile_flags = 0; |
94 | u32 tmp; | 96 | u32 tmp; |
95 | struct radeon_cs_reloc *reloc; | 97 | struct radeon_cs_reloc *reloc; |
96 | struct radeon_cs_chunk *ib_chunk; | 98 | u32 value; |
97 | |||
98 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
99 | 99 | ||
100 | r = r100_cs_packet_next_reloc(p, &reloc); | 100 | r = r100_cs_packet_next_reloc(p, &reloc); |
101 | if (r) { | 101 | if (r) { |
@@ -104,7 +104,8 @@ static inline int r100_reloc_pitch_offset(struct radeon_cs_parser *p, | |||
104 | r100_cs_dump_packet(p, pkt); | 104 | r100_cs_dump_packet(p, pkt); |
105 | return r; | 105 | return r; |
106 | } | 106 | } |
107 | tmp = ib_chunk->kdata[idx] & 0x003fffff; | 107 | value = radeon_get_ib_value(p, idx); |
108 | tmp = value & 0x003fffff; | ||
108 | tmp += (((u32)reloc->lobj.gpu_offset) >> 10); | 109 | tmp += (((u32)reloc->lobj.gpu_offset) >> 10); |
109 | 110 | ||
110 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) | 111 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
@@ -119,6 +120,64 @@ static inline int r100_reloc_pitch_offset(struct radeon_cs_parser *p, | |||
119 | } | 120 | } |
120 | 121 | ||
121 | tmp |= tile_flags; | 122 | tmp |= tile_flags; |
122 | p->ib->ptr[idx] = (ib_chunk->kdata[idx] & 0x3fc00000) | tmp; | 123 | p->ib->ptr[idx] = (value & 0x3fc00000) | tmp; |
123 | return 0; | 124 | return 0; |
124 | } | 125 | } |
126 | |||
127 | static inline int r100_packet3_load_vbpntr(struct radeon_cs_parser *p, | ||
128 | struct radeon_cs_packet *pkt, | ||
129 | int idx) | ||
130 | { | ||
131 | unsigned c, i; | ||
132 | struct radeon_cs_reloc *reloc; | ||
133 | struct r100_cs_track *track; | ||
134 | int r = 0; | ||
135 | volatile uint32_t *ib; | ||
136 | u32 idx_value; | ||
137 | |||
138 | ib = p->ib->ptr; | ||
139 | track = (struct r100_cs_track *)p->track; | ||
140 | c = radeon_get_ib_value(p, idx++) & 0x1F; | ||
141 | track->num_arrays = c; | ||
142 | for (i = 0; i < (c - 1); i+=2, idx+=3) { | ||
143 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
144 | if (r) { | ||
145 | DRM_ERROR("No reloc for packet3 %d\n", | ||
146 | pkt->opcode); | ||
147 | r100_cs_dump_packet(p, pkt); | ||
148 | return r; | ||
149 | } | ||
150 | idx_value = radeon_get_ib_value(p, idx); | ||
151 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); | ||
152 | |||
153 | track->arrays[i + 0].esize = idx_value >> 8; | ||
154 | track->arrays[i + 0].robj = reloc->robj; | ||
155 | track->arrays[i + 0].esize &= 0x7F; | ||
156 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
157 | if (r) { | ||
158 | DRM_ERROR("No reloc for packet3 %d\n", | ||
159 | pkt->opcode); | ||
160 | r100_cs_dump_packet(p, pkt); | ||
161 | return r; | ||
162 | } | ||
163 | ib[idx+2] = radeon_get_ib_value(p, idx + 2) + ((u32)reloc->lobj.gpu_offset); | ||
164 | track->arrays[i + 1].robj = reloc->robj; | ||
165 | track->arrays[i + 1].esize = idx_value >> 24; | ||
166 | track->arrays[i + 1].esize &= 0x7F; | ||
167 | } | ||
168 | if (c & 1) { | ||
169 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
170 | if (r) { | ||
171 | DRM_ERROR("No reloc for packet3 %d\n", | ||
172 | pkt->opcode); | ||
173 | r100_cs_dump_packet(p, pkt); | ||
174 | return r; | ||
175 | } | ||
176 | idx_value = radeon_get_ib_value(p, idx); | ||
177 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); | ||
178 | track->arrays[i + 0].robj = reloc->robj; | ||
179 | track->arrays[i + 0].esize = idx_value >> 8; | ||
180 | track->arrays[i + 0].esize &= 0x7F; | ||
181 | } | ||
182 | return r; | ||
183 | } | ||
diff --git a/drivers/gpu/drm/radeon/r100d.h b/drivers/gpu/drm/radeon/r100d.h index c4b257ec920..df29a630c46 100644 --- a/drivers/gpu/drm/radeon/r100d.h +++ b/drivers/gpu/drm/radeon/r100d.h | |||
@@ -381,6 +381,24 @@ | |||
381 | #define S_000054_VCRTC_IDX_MASTER(x) (((x) & 0x7F) << 24) | 381 | #define S_000054_VCRTC_IDX_MASTER(x) (((x) & 0x7F) << 24) |
382 | #define G_000054_VCRTC_IDX_MASTER(x) (((x) >> 24) & 0x7F) | 382 | #define G_000054_VCRTC_IDX_MASTER(x) (((x) >> 24) & 0x7F) |
383 | #define C_000054_VCRTC_IDX_MASTER 0x80FFFFFF | 383 | #define C_000054_VCRTC_IDX_MASTER 0x80FFFFFF |
384 | #define R_000148_MC_FB_LOCATION 0x000148 | ||
385 | #define S_000148_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
386 | #define G_000148_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
387 | #define C_000148_MC_FB_START 0xFFFF0000 | ||
388 | #define S_000148_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
389 | #define G_000148_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
390 | #define C_000148_MC_FB_TOP 0x0000FFFF | ||
391 | #define R_00014C_MC_AGP_LOCATION 0x00014C | ||
392 | #define S_00014C_MC_AGP_START(x) (((x) & 0xFFFF) << 0) | ||
393 | #define G_00014C_MC_AGP_START(x) (((x) >> 0) & 0xFFFF) | ||
394 | #define C_00014C_MC_AGP_START 0xFFFF0000 | ||
395 | #define S_00014C_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16) | ||
396 | #define G_00014C_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF) | ||
397 | #define C_00014C_MC_AGP_TOP 0x0000FFFF | ||
398 | #define R_000170_AGP_BASE 0x000170 | ||
399 | #define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | ||
400 | #define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | ||
401 | #define C_000170_AGP_BASE_ADDR 0x00000000 | ||
384 | #define R_00023C_DISPLAY_BASE_ADDR 0x00023C | 402 | #define R_00023C_DISPLAY_BASE_ADDR 0x00023C |
385 | #define S_00023C_DISPLAY_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | 403 | #define S_00023C_DISPLAY_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) |
386 | #define G_00023C_DISPLAY_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | 404 | #define G_00023C_DISPLAY_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) |
@@ -403,25 +421,25 @@ | |||
403 | #define S_000360_CUR2_LOCK(x) (((x) & 0x1) << 31) | 421 | #define S_000360_CUR2_LOCK(x) (((x) & 0x1) << 31) |
404 | #define G_000360_CUR2_LOCK(x) (((x) >> 31) & 0x1) | 422 | #define G_000360_CUR2_LOCK(x) (((x) >> 31) & 0x1) |
405 | #define C_000360_CUR2_LOCK 0x7FFFFFFF | 423 | #define C_000360_CUR2_LOCK 0x7FFFFFFF |
406 | #define R_0003C0_GENMO_WT 0x0003C0 | 424 | #define R_0003C2_GENMO_WT 0x0003C0 |
407 | #define S_0003C0_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0) | 425 | #define S_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) & 0x1) << 0) |
408 | #define G_0003C0_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1) | 426 | #define G_0003C2_GENMO_MONO_ADDRESS_B(x) (((x) >> 0) & 0x1) |
409 | #define C_0003C0_GENMO_MONO_ADDRESS_B 0xFFFFFFFE | 427 | #define C_0003C2_GENMO_MONO_ADDRESS_B 0xFE |
410 | #define S_0003C0_VGA_RAM_EN(x) (((x) & 0x1) << 1) | 428 | #define S_0003C2_VGA_RAM_EN(x) (((x) & 0x1) << 1) |
411 | #define G_0003C0_VGA_RAM_EN(x) (((x) >> 1) & 0x1) | 429 | #define G_0003C2_VGA_RAM_EN(x) (((x) >> 1) & 0x1) |
412 | #define C_0003C0_VGA_RAM_EN 0xFFFFFFFD | 430 | #define C_0003C2_VGA_RAM_EN 0xFD |
413 | #define S_0003C0_VGA_CKSEL(x) (((x) & 0x3) << 2) | 431 | #define S_0003C2_VGA_CKSEL(x) (((x) & 0x3) << 2) |
414 | #define G_0003C0_VGA_CKSEL(x) (((x) >> 2) & 0x3) | 432 | #define G_0003C2_VGA_CKSEL(x) (((x) >> 2) & 0x3) |
415 | #define C_0003C0_VGA_CKSEL 0xFFFFFFF3 | 433 | #define C_0003C2_VGA_CKSEL 0xF3 |
416 | #define S_0003C0_ODD_EVEN_MD_PGSEL(x) (((x) & 0x1) << 5) | 434 | #define S_0003C2_ODD_EVEN_MD_PGSEL(x) (((x) & 0x1) << 5) |
417 | #define G_0003C0_ODD_EVEN_MD_PGSEL(x) (((x) >> 5) & 0x1) | 435 | #define G_0003C2_ODD_EVEN_MD_PGSEL(x) (((x) >> 5) & 0x1) |
418 | #define C_0003C0_ODD_EVEN_MD_PGSEL 0xFFFFFFDF | 436 | #define C_0003C2_ODD_EVEN_MD_PGSEL 0xDF |
419 | #define S_0003C0_VGA_HSYNC_POL(x) (((x) & 0x1) << 6) | 437 | #define S_0003C2_VGA_HSYNC_POL(x) (((x) & 0x1) << 6) |
420 | #define G_0003C0_VGA_HSYNC_POL(x) (((x) >> 6) & 0x1) | 438 | #define G_0003C2_VGA_HSYNC_POL(x) (((x) >> 6) & 0x1) |
421 | #define C_0003C0_VGA_HSYNC_POL 0xFFFFFFBF | 439 | #define C_0003C2_VGA_HSYNC_POL 0xBF |
422 | #define S_0003C0_VGA_VSYNC_POL(x) (((x) & 0x1) << 7) | 440 | #define S_0003C2_VGA_VSYNC_POL(x) (((x) & 0x1) << 7) |
423 | #define G_0003C0_VGA_VSYNC_POL(x) (((x) >> 7) & 0x1) | 441 | #define G_0003C2_VGA_VSYNC_POL(x) (((x) >> 7) & 0x1) |
424 | #define C_0003C0_VGA_VSYNC_POL 0xFFFFFF7F | 442 | #define C_0003C2_VGA_VSYNC_POL 0x7F |
425 | #define R_0003F8_CRTC2_GEN_CNTL 0x0003F8 | 443 | #define R_0003F8_CRTC2_GEN_CNTL 0x0003F8 |
426 | #define S_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) & 0x1) << 0) | 444 | #define S_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) & 0x1) << 0) |
427 | #define G_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) >> 0) & 0x1) | 445 | #define G_0003F8_CRTC2_DBL_SCAN_EN(x) (((x) >> 0) & 0x1) |
@@ -545,6 +563,46 @@ | |||
545 | #define S_000774_SCRATCH_ADDR(x) (((x) & 0x7FFFFFF) << 5) | 563 | #define S_000774_SCRATCH_ADDR(x) (((x) & 0x7FFFFFF) << 5) |
546 | #define G_000774_SCRATCH_ADDR(x) (((x) >> 5) & 0x7FFFFFF) | 564 | #define G_000774_SCRATCH_ADDR(x) (((x) >> 5) & 0x7FFFFFF) |
547 | #define C_000774_SCRATCH_ADDR 0x0000001F | 565 | #define C_000774_SCRATCH_ADDR 0x0000001F |
566 | #define R_0007C0_CP_STAT 0x0007C0 | ||
567 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
568 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
569 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
570 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
571 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
572 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
573 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
574 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
575 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
576 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
577 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
578 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
579 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
580 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
581 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
582 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
583 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
584 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
585 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
586 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
587 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
588 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
589 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
590 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
591 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
592 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
593 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
594 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
595 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
596 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
597 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
598 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
599 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
600 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
601 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
602 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
603 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
604 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
605 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
548 | #define R_000E40_RBBM_STATUS 0x000E40 | 606 | #define R_000E40_RBBM_STATUS 0x000E40 |
549 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | 607 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) |
550 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | 608 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) |
@@ -604,4 +662,53 @@ | |||
604 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | 662 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) |
605 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | 663 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF |
606 | 664 | ||
665 | |||
666 | #define R_00000D_SCLK_CNTL 0x00000D | ||
667 | #define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0) | ||
668 | #define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7) | ||
669 | #define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8 | ||
670 | #define S_00000D_TCLK_SRC_SEL(x) (((x) & 0x7) << 8) | ||
671 | #define G_00000D_TCLK_SRC_SEL(x) (((x) >> 8) & 0x7) | ||
672 | #define C_00000D_TCLK_SRC_SEL 0xFFFFF8FF | ||
673 | #define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16) | ||
674 | #define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1) | ||
675 | #define C_00000D_FORCE_CP 0xFFFEFFFF | ||
676 | #define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17) | ||
677 | #define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1) | ||
678 | #define C_00000D_FORCE_HDP 0xFFFDFFFF | ||
679 | #define S_00000D_FORCE_DISP(x) (((x) & 0x1) << 18) | ||
680 | #define G_00000D_FORCE_DISP(x) (((x) >> 18) & 0x1) | ||
681 | #define C_00000D_FORCE_DISP 0xFFFBFFFF | ||
682 | #define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19) | ||
683 | #define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1) | ||
684 | #define C_00000D_FORCE_TOP 0xFFF7FFFF | ||
685 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | ||
686 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | ||
687 | #define C_00000D_FORCE_E2 0xFFEFFFFF | ||
688 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | ||
689 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | ||
690 | #define C_00000D_FORCE_SE 0xFFDFFFFF | ||
691 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | ||
692 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | ||
693 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | ||
694 | #define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23) | ||
695 | #define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1) | ||
696 | #define C_00000D_FORCE_VIP 0xFF7FFFFF | ||
697 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | ||
698 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | ||
699 | #define C_00000D_FORCE_RE 0xFEFFFFFF | ||
700 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | ||
701 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | ||
702 | #define C_00000D_FORCE_PB 0xFDFFFFFF | ||
703 | #define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26) | ||
704 | #define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1) | ||
705 | #define C_00000D_FORCE_TAM 0xFBFFFFFF | ||
706 | #define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27) | ||
707 | #define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1) | ||
708 | #define C_00000D_FORCE_TDM 0xF7FFFFFF | ||
709 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | ||
710 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | ||
711 | #define C_00000D_FORCE_RB 0xEFFFFFFF | ||
712 | |||
713 | |||
607 | #endif | 714 | #endif |
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c index 568c74bfba3..eb740fc3549 100644 --- a/drivers/gpu/drm/radeon/r200.c +++ b/drivers/gpu/drm/radeon/r200.c | |||
@@ -96,7 +96,6 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
96 | struct radeon_cs_packet *pkt, | 96 | struct radeon_cs_packet *pkt, |
97 | unsigned idx, unsigned reg) | 97 | unsigned idx, unsigned reg) |
98 | { | 98 | { |
99 | struct radeon_cs_chunk *ib_chunk; | ||
100 | struct radeon_cs_reloc *reloc; | 99 | struct radeon_cs_reloc *reloc; |
101 | struct r100_cs_track *track; | 100 | struct r100_cs_track *track; |
102 | volatile uint32_t *ib; | 101 | volatile uint32_t *ib; |
@@ -105,11 +104,11 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
105 | int i; | 104 | int i; |
106 | int face; | 105 | int face; |
107 | u32 tile_flags = 0; | 106 | u32 tile_flags = 0; |
107 | u32 idx_value; | ||
108 | 108 | ||
109 | ib = p->ib->ptr; | 109 | ib = p->ib->ptr; |
110 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
111 | track = (struct r100_cs_track *)p->track; | 110 | track = (struct r100_cs_track *)p->track; |
112 | 111 | idx_value = radeon_get_ib_value(p, idx); | |
113 | switch (reg) { | 112 | switch (reg) { |
114 | case RADEON_CRTC_GUI_TRIG_VLINE: | 113 | case RADEON_CRTC_GUI_TRIG_VLINE: |
115 | r = r100_cs_packet_parse_vline(p); | 114 | r = r100_cs_packet_parse_vline(p); |
@@ -137,8 +136,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
137 | return r; | 136 | return r; |
138 | } | 137 | } |
139 | track->zb.robj = reloc->robj; | 138 | track->zb.robj = reloc->robj; |
140 | track->zb.offset = ib_chunk->kdata[idx]; | 139 | track->zb.offset = idx_value; |
141 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 140 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
142 | break; | 141 | break; |
143 | case RADEON_RB3D_COLOROFFSET: | 142 | case RADEON_RB3D_COLOROFFSET: |
144 | r = r100_cs_packet_next_reloc(p, &reloc); | 143 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -149,8 +148,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
149 | return r; | 148 | return r; |
150 | } | 149 | } |
151 | track->cb[0].robj = reloc->robj; | 150 | track->cb[0].robj = reloc->robj; |
152 | track->cb[0].offset = ib_chunk->kdata[idx]; | 151 | track->cb[0].offset = idx_value; |
153 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 152 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
154 | break; | 153 | break; |
155 | case R200_PP_TXOFFSET_0: | 154 | case R200_PP_TXOFFSET_0: |
156 | case R200_PP_TXOFFSET_1: | 155 | case R200_PP_TXOFFSET_1: |
@@ -166,7 +165,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
166 | r100_cs_dump_packet(p, pkt); | 165 | r100_cs_dump_packet(p, pkt); |
167 | return r; | 166 | return r; |
168 | } | 167 | } |
169 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 168 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
170 | track->textures[i].robj = reloc->robj; | 169 | track->textures[i].robj = reloc->robj; |
171 | break; | 170 | break; |
172 | case R200_PP_CUBIC_OFFSET_F1_0: | 171 | case R200_PP_CUBIC_OFFSET_F1_0: |
@@ -208,12 +207,12 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
208 | r100_cs_dump_packet(p, pkt); | 207 | r100_cs_dump_packet(p, pkt); |
209 | return r; | 208 | return r; |
210 | } | 209 | } |
211 | track->textures[i].cube_info[face - 1].offset = ib_chunk->kdata[idx]; | 210 | track->textures[i].cube_info[face - 1].offset = idx_value; |
212 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 211 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
213 | track->textures[i].cube_info[face - 1].robj = reloc->robj; | 212 | track->textures[i].cube_info[face - 1].robj = reloc->robj; |
214 | break; | 213 | break; |
215 | case RADEON_RE_WIDTH_HEIGHT: | 214 | case RADEON_RE_WIDTH_HEIGHT: |
216 | track->maxy = ((ib_chunk->kdata[idx] >> 16) & 0x7FF); | 215 | track->maxy = ((idx_value >> 16) & 0x7FF); |
217 | break; | 216 | break; |
218 | case RADEON_RB3D_COLORPITCH: | 217 | case RADEON_RB3D_COLORPITCH: |
219 | r = r100_cs_packet_next_reloc(p, &reloc); | 218 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -229,17 +228,17 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
229 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) | 228 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
230 | tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; | 229 | tile_flags |= RADEON_COLOR_MICROTILE_ENABLE; |
231 | 230 | ||
232 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); | 231 | tmp = idx_value & ~(0x7 << 16); |
233 | tmp |= tile_flags; | 232 | tmp |= tile_flags; |
234 | ib[idx] = tmp; | 233 | ib[idx] = tmp; |
235 | 234 | ||
236 | track->cb[0].pitch = ib_chunk->kdata[idx] & RADEON_COLORPITCH_MASK; | 235 | track->cb[0].pitch = idx_value & RADEON_COLORPITCH_MASK; |
237 | break; | 236 | break; |
238 | case RADEON_RB3D_DEPTHPITCH: | 237 | case RADEON_RB3D_DEPTHPITCH: |
239 | track->zb.pitch = ib_chunk->kdata[idx] & RADEON_DEPTHPITCH_MASK; | 238 | track->zb.pitch = idx_value & RADEON_DEPTHPITCH_MASK; |
240 | break; | 239 | break; |
241 | case RADEON_RB3D_CNTL: | 240 | case RADEON_RB3D_CNTL: |
242 | switch ((ib_chunk->kdata[idx] >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { | 241 | switch ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f) { |
243 | case 7: | 242 | case 7: |
244 | case 8: | 243 | case 8: |
245 | case 9: | 244 | case 9: |
@@ -257,18 +256,18 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
257 | break; | 256 | break; |
258 | default: | 257 | default: |
259 | DRM_ERROR("Invalid color buffer format (%d) !\n", | 258 | DRM_ERROR("Invalid color buffer format (%d) !\n", |
260 | ((ib_chunk->kdata[idx] >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f)); | 259 | ((idx_value >> RADEON_RB3D_COLOR_FORMAT_SHIFT) & 0x1f)); |
261 | return -EINVAL; | 260 | return -EINVAL; |
262 | } | 261 | } |
263 | if (ib_chunk->kdata[idx] & RADEON_DEPTHXY_OFFSET_ENABLE) { | 262 | if (idx_value & RADEON_DEPTHXY_OFFSET_ENABLE) { |
264 | DRM_ERROR("No support for depth xy offset in kms\n"); | 263 | DRM_ERROR("No support for depth xy offset in kms\n"); |
265 | return -EINVAL; | 264 | return -EINVAL; |
266 | } | 265 | } |
267 | 266 | ||
268 | track->z_enabled = !!(ib_chunk->kdata[idx] & RADEON_Z_ENABLE); | 267 | track->z_enabled = !!(idx_value & RADEON_Z_ENABLE); |
269 | break; | 268 | break; |
270 | case RADEON_RB3D_ZSTENCILCNTL: | 269 | case RADEON_RB3D_ZSTENCILCNTL: |
271 | switch (ib_chunk->kdata[idx] & 0xf) { | 270 | switch (idx_value & 0xf) { |
272 | case 0: | 271 | case 0: |
273 | track->zb.cpp = 2; | 272 | track->zb.cpp = 2; |
274 | break; | 273 | break; |
@@ -292,27 +291,27 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
292 | r100_cs_dump_packet(p, pkt); | 291 | r100_cs_dump_packet(p, pkt); |
293 | return r; | 292 | return r; |
294 | } | 293 | } |
295 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 294 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
296 | break; | 295 | break; |
297 | case RADEON_PP_CNTL: | 296 | case RADEON_PP_CNTL: |
298 | { | 297 | { |
299 | uint32_t temp = ib_chunk->kdata[idx] >> 4; | 298 | uint32_t temp = idx_value >> 4; |
300 | for (i = 0; i < track->num_texture; i++) | 299 | for (i = 0; i < track->num_texture; i++) |
301 | track->textures[i].enabled = !!(temp & (1 << i)); | 300 | track->textures[i].enabled = !!(temp & (1 << i)); |
302 | } | 301 | } |
303 | break; | 302 | break; |
304 | case RADEON_SE_VF_CNTL: | 303 | case RADEON_SE_VF_CNTL: |
305 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 304 | track->vap_vf_cntl = idx_value; |
306 | break; | 305 | break; |
307 | case 0x210c: | 306 | case 0x210c: |
308 | /* VAP_VF_MAX_VTX_INDX */ | 307 | /* VAP_VF_MAX_VTX_INDX */ |
309 | track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL; | 308 | track->max_indx = idx_value & 0x00FFFFFFUL; |
310 | break; | 309 | break; |
311 | case R200_SE_VTX_FMT_0: | 310 | case R200_SE_VTX_FMT_0: |
312 | track->vtx_size = r200_get_vtx_size_0(ib_chunk->kdata[idx]); | 311 | track->vtx_size = r200_get_vtx_size_0(idx_value); |
313 | break; | 312 | break; |
314 | case R200_SE_VTX_FMT_1: | 313 | case R200_SE_VTX_FMT_1: |
315 | track->vtx_size += r200_get_vtx_size_1(ib_chunk->kdata[idx]); | 314 | track->vtx_size += r200_get_vtx_size_1(idx_value); |
316 | break; | 315 | break; |
317 | case R200_PP_TXSIZE_0: | 316 | case R200_PP_TXSIZE_0: |
318 | case R200_PP_TXSIZE_1: | 317 | case R200_PP_TXSIZE_1: |
@@ -321,8 +320,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
321 | case R200_PP_TXSIZE_4: | 320 | case R200_PP_TXSIZE_4: |
322 | case R200_PP_TXSIZE_5: | 321 | case R200_PP_TXSIZE_5: |
323 | i = (reg - R200_PP_TXSIZE_0) / 32; | 322 | i = (reg - R200_PP_TXSIZE_0) / 32; |
324 | track->textures[i].width = (ib_chunk->kdata[idx] & RADEON_TEX_USIZE_MASK) + 1; | 323 | track->textures[i].width = (idx_value & RADEON_TEX_USIZE_MASK) + 1; |
325 | track->textures[i].height = ((ib_chunk->kdata[idx] & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; | 324 | track->textures[i].height = ((idx_value & RADEON_TEX_VSIZE_MASK) >> RADEON_TEX_VSIZE_SHIFT) + 1; |
326 | break; | 325 | break; |
327 | case R200_PP_TXPITCH_0: | 326 | case R200_PP_TXPITCH_0: |
328 | case R200_PP_TXPITCH_1: | 327 | case R200_PP_TXPITCH_1: |
@@ -331,7 +330,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
331 | case R200_PP_TXPITCH_4: | 330 | case R200_PP_TXPITCH_4: |
332 | case R200_PP_TXPITCH_5: | 331 | case R200_PP_TXPITCH_5: |
333 | i = (reg - R200_PP_TXPITCH_0) / 32; | 332 | i = (reg - R200_PP_TXPITCH_0) / 32; |
334 | track->textures[i].pitch = ib_chunk->kdata[idx] + 32; | 333 | track->textures[i].pitch = idx_value + 32; |
335 | break; | 334 | break; |
336 | case R200_PP_TXFILTER_0: | 335 | case R200_PP_TXFILTER_0: |
337 | case R200_PP_TXFILTER_1: | 336 | case R200_PP_TXFILTER_1: |
@@ -340,12 +339,12 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
340 | case R200_PP_TXFILTER_4: | 339 | case R200_PP_TXFILTER_4: |
341 | case R200_PP_TXFILTER_5: | 340 | case R200_PP_TXFILTER_5: |
342 | i = (reg - R200_PP_TXFILTER_0) / 32; | 341 | i = (reg - R200_PP_TXFILTER_0) / 32; |
343 | track->textures[i].num_levels = ((ib_chunk->kdata[idx] & R200_MAX_MIP_LEVEL_MASK) | 342 | track->textures[i].num_levels = ((idx_value & R200_MAX_MIP_LEVEL_MASK) |
344 | >> R200_MAX_MIP_LEVEL_SHIFT); | 343 | >> R200_MAX_MIP_LEVEL_SHIFT); |
345 | tmp = (ib_chunk->kdata[idx] >> 23) & 0x7; | 344 | tmp = (idx_value >> 23) & 0x7; |
346 | if (tmp == 2 || tmp == 6) | 345 | if (tmp == 2 || tmp == 6) |
347 | track->textures[i].roundup_w = false; | 346 | track->textures[i].roundup_w = false; |
348 | tmp = (ib_chunk->kdata[idx] >> 27) & 0x7; | 347 | tmp = (idx_value >> 27) & 0x7; |
349 | if (tmp == 2 || tmp == 6) | 348 | if (tmp == 2 || tmp == 6) |
350 | track->textures[i].roundup_h = false; | 349 | track->textures[i].roundup_h = false; |
351 | break; | 350 | break; |
@@ -364,8 +363,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
364 | case R200_PP_TXFORMAT_X_4: | 363 | case R200_PP_TXFORMAT_X_4: |
365 | case R200_PP_TXFORMAT_X_5: | 364 | case R200_PP_TXFORMAT_X_5: |
366 | i = (reg - R200_PP_TXFORMAT_X_0) / 32; | 365 | i = (reg - R200_PP_TXFORMAT_X_0) / 32; |
367 | track->textures[i].txdepth = ib_chunk->kdata[idx] & 0x7; | 366 | track->textures[i].txdepth = idx_value & 0x7; |
368 | tmp = (ib_chunk->kdata[idx] >> 16) & 0x3; | 367 | tmp = (idx_value >> 16) & 0x3; |
369 | /* 2D, 3D, CUBE */ | 368 | /* 2D, 3D, CUBE */ |
370 | switch (tmp) { | 369 | switch (tmp) { |
371 | case 0: | 370 | case 0: |
@@ -389,14 +388,14 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
389 | case R200_PP_TXFORMAT_4: | 388 | case R200_PP_TXFORMAT_4: |
390 | case R200_PP_TXFORMAT_5: | 389 | case R200_PP_TXFORMAT_5: |
391 | i = (reg - R200_PP_TXFORMAT_0) / 32; | 390 | i = (reg - R200_PP_TXFORMAT_0) / 32; |
392 | if (ib_chunk->kdata[idx] & R200_TXFORMAT_NON_POWER2) { | 391 | if (idx_value & R200_TXFORMAT_NON_POWER2) { |
393 | track->textures[i].use_pitch = 1; | 392 | track->textures[i].use_pitch = 1; |
394 | } else { | 393 | } else { |
395 | track->textures[i].use_pitch = 0; | 394 | track->textures[i].use_pitch = 0; |
396 | track->textures[i].width = 1 << ((ib_chunk->kdata[idx] >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); | 395 | track->textures[i].width = 1 << ((idx_value >> RADEON_TXFORMAT_WIDTH_SHIFT) & RADEON_TXFORMAT_WIDTH_MASK); |
397 | track->textures[i].height = 1 << ((ib_chunk->kdata[idx] >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); | 396 | track->textures[i].height = 1 << ((idx_value >> RADEON_TXFORMAT_HEIGHT_SHIFT) & RADEON_TXFORMAT_HEIGHT_MASK); |
398 | } | 397 | } |
399 | switch ((ib_chunk->kdata[idx] & RADEON_TXFORMAT_FORMAT_MASK)) { | 398 | switch ((idx_value & RADEON_TXFORMAT_FORMAT_MASK)) { |
400 | case R200_TXFORMAT_I8: | 399 | case R200_TXFORMAT_I8: |
401 | case R200_TXFORMAT_RGB332: | 400 | case R200_TXFORMAT_RGB332: |
402 | case R200_TXFORMAT_Y8: | 401 | case R200_TXFORMAT_Y8: |
@@ -424,8 +423,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
424 | track->textures[i].cpp = 4; | 423 | track->textures[i].cpp = 4; |
425 | break; | 424 | break; |
426 | } | 425 | } |
427 | track->textures[i].cube_info[4].width = 1 << ((ib_chunk->kdata[idx] >> 16) & 0xf); | 426 | track->textures[i].cube_info[4].width = 1 << ((idx_value >> 16) & 0xf); |
428 | track->textures[i].cube_info[4].height = 1 << ((ib_chunk->kdata[idx] >> 20) & 0xf); | 427 | track->textures[i].cube_info[4].height = 1 << ((idx_value >> 20) & 0xf); |
429 | break; | 428 | break; |
430 | case R200_PP_CUBIC_FACES_0: | 429 | case R200_PP_CUBIC_FACES_0: |
431 | case R200_PP_CUBIC_FACES_1: | 430 | case R200_PP_CUBIC_FACES_1: |
@@ -433,7 +432,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
433 | case R200_PP_CUBIC_FACES_3: | 432 | case R200_PP_CUBIC_FACES_3: |
434 | case R200_PP_CUBIC_FACES_4: | 433 | case R200_PP_CUBIC_FACES_4: |
435 | case R200_PP_CUBIC_FACES_5: | 434 | case R200_PP_CUBIC_FACES_5: |
436 | tmp = ib_chunk->kdata[idx]; | 435 | tmp = idx_value; |
437 | i = (reg - R200_PP_CUBIC_FACES_0) / 32; | 436 | i = (reg - R200_PP_CUBIC_FACES_0) / 32; |
438 | for (face = 0; face < 4; face++) { | 437 | for (face = 0; face < 4; face++) { |
439 | track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf); | 438 | track->textures[i].cube_info[face].width = 1 << ((tmp >> (face * 8)) & 0xf); |
@@ -448,9 +447,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
448 | return 0; | 447 | return 0; |
449 | } | 448 | } |
450 | 449 | ||
451 | int r200_init(struct radeon_device *rdev) | 450 | void r200_set_safe_registers(struct radeon_device *rdev) |
452 | { | 451 | { |
453 | rdev->config.r100.reg_safe_bm = r200_reg_safe_bm; | 452 | rdev->config.r100.reg_safe_bm = r200_reg_safe_bm; |
454 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r200_reg_safe_bm); | 453 | rdev->config.r100.reg_safe_bm_size = ARRAY_SIZE(r200_reg_safe_bm); |
455 | return 0; | ||
456 | } | 454 | } |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index bb151ecdf8f..e08c4a8974c 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -33,43 +33,16 @@ | |||
33 | #include "radeon_drm.h" | 33 | #include "radeon_drm.h" |
34 | #include "r100_track.h" | 34 | #include "r100_track.h" |
35 | #include "r300d.h" | 35 | #include "r300d.h" |
36 | 36 | #include "rv350d.h" | |
37 | #include "r300_reg_safe.h" | 37 | #include "r300_reg_safe.h" |
38 | 38 | ||
39 | /* r300,r350,rv350,rv370,rv380 depends on : */ | 39 | /* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */ |
40 | void r100_hdp_reset(struct radeon_device *rdev); | ||
41 | int r100_cp_reset(struct radeon_device *rdev); | ||
42 | int r100_rb2d_reset(struct radeon_device *rdev); | ||
43 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | ||
44 | int r100_pci_gart_enable(struct radeon_device *rdev); | ||
45 | void r100_mc_setup(struct radeon_device *rdev); | ||
46 | void r100_mc_disable_clients(struct radeon_device *rdev); | ||
47 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | ||
48 | int r100_cs_packet_parse(struct radeon_cs_parser *p, | ||
49 | struct radeon_cs_packet *pkt, | ||
50 | unsigned idx); | ||
51 | int r100_cs_packet_parse_vline(struct radeon_cs_parser *p); | ||
52 | int r100_cs_parse_packet0(struct radeon_cs_parser *p, | ||
53 | struct radeon_cs_packet *pkt, | ||
54 | const unsigned *auth, unsigned n, | ||
55 | radeon_packet0_check_t check); | ||
56 | int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | ||
57 | struct radeon_cs_packet *pkt, | ||
58 | struct radeon_object *robj); | ||
59 | |||
60 | /* This files gather functions specifics to: | ||
61 | * r300,r350,rv350,rv370,rv380 | ||
62 | * | ||
63 | * Some of these functions might be used by newer ASICs. | ||
64 | */ | ||
65 | void r300_gpu_init(struct radeon_device *rdev); | ||
66 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
67 | int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev); | ||
68 | |||
69 | 40 | ||
70 | /* | 41 | /* |
71 | * rv370,rv380 PCIE GART | 42 | * rv370,rv380 PCIE GART |
72 | */ | 43 | */ |
44 | static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev); | ||
45 | |||
73 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) | 46 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev) |
74 | { | 47 | { |
75 | uint32_t tmp; | 48 | uint32_t tmp; |
@@ -182,59 +155,6 @@ void rv370_pcie_gart_fini(struct radeon_device *rdev) | |||
182 | radeon_gart_fini(rdev); | 155 | radeon_gart_fini(rdev); |
183 | } | 156 | } |
184 | 157 | ||
185 | /* | ||
186 | * MC | ||
187 | */ | ||
188 | int r300_mc_init(struct radeon_device *rdev) | ||
189 | { | ||
190 | int r; | ||
191 | |||
192 | if (r100_debugfs_rbbm_init(rdev)) { | ||
193 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
194 | } | ||
195 | |||
196 | r300_gpu_init(rdev); | ||
197 | r100_pci_gart_disable(rdev); | ||
198 | if (rdev->flags & RADEON_IS_PCIE) { | ||
199 | rv370_pcie_gart_disable(rdev); | ||
200 | } | ||
201 | |||
202 | /* Setup GPU memory space */ | ||
203 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
204 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
205 | if (rdev->flags & RADEON_IS_AGP) { | ||
206 | r = radeon_agp_init(rdev); | ||
207 | if (r) { | ||
208 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
209 | rdev->flags &= ~RADEON_IS_AGP; | ||
210 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
211 | } else { | ||
212 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
213 | } | ||
214 | } | ||
215 | r = radeon_mc_setup(rdev); | ||
216 | if (r) { | ||
217 | return r; | ||
218 | } | ||
219 | |||
220 | /* Program GPU memory space */ | ||
221 | r100_mc_disable_clients(rdev); | ||
222 | if (r300_mc_wait_for_idle(rdev)) { | ||
223 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
224 | "programming pipes. Bad things might happen.\n"); | ||
225 | } | ||
226 | r100_mc_setup(rdev); | ||
227 | return 0; | ||
228 | } | ||
229 | |||
230 | void r300_mc_fini(struct radeon_device *rdev) | ||
231 | { | ||
232 | } | ||
233 | |||
234 | |||
235 | /* | ||
236 | * Fence emission | ||
237 | */ | ||
238 | void r300_fence_ring_emit(struct radeon_device *rdev, | 158 | void r300_fence_ring_emit(struct radeon_device *rdev, |
239 | struct radeon_fence *fence) | 159 | struct radeon_fence *fence) |
240 | { | 160 | { |
@@ -260,10 +180,6 @@ void r300_fence_ring_emit(struct radeon_device *rdev, | |||
260 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); | 180 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); |
261 | } | 181 | } |
262 | 182 | ||
263 | |||
264 | /* | ||
265 | * Global GPU functions | ||
266 | */ | ||
267 | int r300_copy_dma(struct radeon_device *rdev, | 183 | int r300_copy_dma(struct radeon_device *rdev, |
268 | uint64_t src_offset, | 184 | uint64_t src_offset, |
269 | uint64_t dst_offset, | 185 | uint64_t dst_offset, |
@@ -582,11 +498,6 @@ void r300_vram_info(struct radeon_device *rdev) | |||
582 | r100_vram_init_sizes(rdev); | 498 | r100_vram_init_sizes(rdev); |
583 | } | 499 | } |
584 | 500 | ||
585 | |||
586 | /* | ||
587 | * PCIE Lanes | ||
588 | */ | ||
589 | |||
590 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) | 501 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) |
591 | { | 502 | { |
592 | uint32_t link_width_cntl, mask; | 503 | uint32_t link_width_cntl, mask; |
@@ -646,10 +557,6 @@ void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) | |||
646 | 557 | ||
647 | } | 558 | } |
648 | 559 | ||
649 | |||
650 | /* | ||
651 | * Debugfs info | ||
652 | */ | ||
653 | #if defined(CONFIG_DEBUG_FS) | 560 | #if defined(CONFIG_DEBUG_FS) |
654 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) | 561 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) |
655 | { | 562 | { |
@@ -680,7 +587,7 @@ static struct drm_info_list rv370_pcie_gart_info_list[] = { | |||
680 | }; | 587 | }; |
681 | #endif | 588 | #endif |
682 | 589 | ||
683 | int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | 590 | static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
684 | { | 591 | { |
685 | #if defined(CONFIG_DEBUG_FS) | 592 | #if defined(CONFIG_DEBUG_FS) |
686 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); | 593 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); |
@@ -689,25 +596,22 @@ int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | |||
689 | #endif | 596 | #endif |
690 | } | 597 | } |
691 | 598 | ||
692 | |||
693 | /* | ||
694 | * CS functions | ||
695 | */ | ||
696 | static int r300_packet0_check(struct radeon_cs_parser *p, | 599 | static int r300_packet0_check(struct radeon_cs_parser *p, |
697 | struct radeon_cs_packet *pkt, | 600 | struct radeon_cs_packet *pkt, |
698 | unsigned idx, unsigned reg) | 601 | unsigned idx, unsigned reg) |
699 | { | 602 | { |
700 | struct radeon_cs_chunk *ib_chunk; | ||
701 | struct radeon_cs_reloc *reloc; | 603 | struct radeon_cs_reloc *reloc; |
702 | struct r100_cs_track *track; | 604 | struct r100_cs_track *track; |
703 | volatile uint32_t *ib; | 605 | volatile uint32_t *ib; |
704 | uint32_t tmp, tile_flags = 0; | 606 | uint32_t tmp, tile_flags = 0; |
705 | unsigned i; | 607 | unsigned i; |
706 | int r; | 608 | int r; |
609 | u32 idx_value; | ||
707 | 610 | ||
708 | ib = p->ib->ptr; | 611 | ib = p->ib->ptr; |
709 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
710 | track = (struct r100_cs_track *)p->track; | 612 | track = (struct r100_cs_track *)p->track; |
613 | idx_value = radeon_get_ib_value(p, idx); | ||
614 | |||
711 | switch(reg) { | 615 | switch(reg) { |
712 | case AVIVO_D1MODE_VLINE_START_END: | 616 | case AVIVO_D1MODE_VLINE_START_END: |
713 | case RADEON_CRTC_GUI_TRIG_VLINE: | 617 | case RADEON_CRTC_GUI_TRIG_VLINE: |
@@ -738,8 +642,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
738 | return r; | 642 | return r; |
739 | } | 643 | } |
740 | track->cb[i].robj = reloc->robj; | 644 | track->cb[i].robj = reloc->robj; |
741 | track->cb[i].offset = ib_chunk->kdata[idx]; | 645 | track->cb[i].offset = idx_value; |
742 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 646 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
743 | break; | 647 | break; |
744 | case R300_ZB_DEPTHOFFSET: | 648 | case R300_ZB_DEPTHOFFSET: |
745 | r = r100_cs_packet_next_reloc(p, &reloc); | 649 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -750,8 +654,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
750 | return r; | 654 | return r; |
751 | } | 655 | } |
752 | track->zb.robj = reloc->robj; | 656 | track->zb.robj = reloc->robj; |
753 | track->zb.offset = ib_chunk->kdata[idx]; | 657 | track->zb.offset = idx_value; |
754 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 658 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
755 | break; | 659 | break; |
756 | case R300_TX_OFFSET_0: | 660 | case R300_TX_OFFSET_0: |
757 | case R300_TX_OFFSET_0+4: | 661 | case R300_TX_OFFSET_0+4: |
@@ -777,32 +681,32 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
777 | r100_cs_dump_packet(p, pkt); | 681 | r100_cs_dump_packet(p, pkt); |
778 | return r; | 682 | return r; |
779 | } | 683 | } |
780 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 684 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
781 | track->textures[i].robj = reloc->robj; | 685 | track->textures[i].robj = reloc->robj; |
782 | break; | 686 | break; |
783 | /* Tracked registers */ | 687 | /* Tracked registers */ |
784 | case 0x2084: | 688 | case 0x2084: |
785 | /* VAP_VF_CNTL */ | 689 | /* VAP_VF_CNTL */ |
786 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 690 | track->vap_vf_cntl = idx_value; |
787 | break; | 691 | break; |
788 | case 0x20B4: | 692 | case 0x20B4: |
789 | /* VAP_VTX_SIZE */ | 693 | /* VAP_VTX_SIZE */ |
790 | track->vtx_size = ib_chunk->kdata[idx] & 0x7F; | 694 | track->vtx_size = idx_value & 0x7F; |
791 | break; | 695 | break; |
792 | case 0x2134: | 696 | case 0x2134: |
793 | /* VAP_VF_MAX_VTX_INDX */ | 697 | /* VAP_VF_MAX_VTX_INDX */ |
794 | track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL; | 698 | track->max_indx = idx_value & 0x00FFFFFFUL; |
795 | break; | 699 | break; |
796 | case 0x43E4: | 700 | case 0x43E4: |
797 | /* SC_SCISSOR1 */ | 701 | /* SC_SCISSOR1 */ |
798 | track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1; | 702 | track->maxy = ((idx_value >> 13) & 0x1FFF) + 1; |
799 | if (p->rdev->family < CHIP_RV515) { | 703 | if (p->rdev->family < CHIP_RV515) { |
800 | track->maxy -= 1440; | 704 | track->maxy -= 1440; |
801 | } | 705 | } |
802 | break; | 706 | break; |
803 | case 0x4E00: | 707 | case 0x4E00: |
804 | /* RB3D_CCTL */ | 708 | /* RB3D_CCTL */ |
805 | track->num_cb = ((ib_chunk->kdata[idx] >> 5) & 0x3) + 1; | 709 | track->num_cb = ((idx_value >> 5) & 0x3) + 1; |
806 | break; | 710 | break; |
807 | case 0x4E38: | 711 | case 0x4E38: |
808 | case 0x4E3C: | 712 | case 0x4E3C: |
@@ -825,13 +729,13 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
825 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) | 729 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
826 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; | 730 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; |
827 | 731 | ||
828 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); | 732 | tmp = idx_value & ~(0x7 << 16); |
829 | tmp |= tile_flags; | 733 | tmp |= tile_flags; |
830 | ib[idx] = tmp; | 734 | ib[idx] = tmp; |
831 | 735 | ||
832 | i = (reg - 0x4E38) >> 2; | 736 | i = (reg - 0x4E38) >> 2; |
833 | track->cb[i].pitch = ib_chunk->kdata[idx] & 0x3FFE; | 737 | track->cb[i].pitch = idx_value & 0x3FFE; |
834 | switch (((ib_chunk->kdata[idx] >> 21) & 0xF)) { | 738 | switch (((idx_value >> 21) & 0xF)) { |
835 | case 9: | 739 | case 9: |
836 | case 11: | 740 | case 11: |
837 | case 12: | 741 | case 12: |
@@ -854,13 +758,13 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
854 | break; | 758 | break; |
855 | default: | 759 | default: |
856 | DRM_ERROR("Invalid color buffer format (%d) !\n", | 760 | DRM_ERROR("Invalid color buffer format (%d) !\n", |
857 | ((ib_chunk->kdata[idx] >> 21) & 0xF)); | 761 | ((idx_value >> 21) & 0xF)); |
858 | return -EINVAL; | 762 | return -EINVAL; |
859 | } | 763 | } |
860 | break; | 764 | break; |
861 | case 0x4F00: | 765 | case 0x4F00: |
862 | /* ZB_CNTL */ | 766 | /* ZB_CNTL */ |
863 | if (ib_chunk->kdata[idx] & 2) { | 767 | if (idx_value & 2) { |
864 | track->z_enabled = true; | 768 | track->z_enabled = true; |
865 | } else { | 769 | } else { |
866 | track->z_enabled = false; | 770 | track->z_enabled = false; |
@@ -868,7 +772,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
868 | break; | 772 | break; |
869 | case 0x4F10: | 773 | case 0x4F10: |
870 | /* ZB_FORMAT */ | 774 | /* ZB_FORMAT */ |
871 | switch ((ib_chunk->kdata[idx] & 0xF)) { | 775 | switch ((idx_value & 0xF)) { |
872 | case 0: | 776 | case 0: |
873 | case 1: | 777 | case 1: |
874 | track->zb.cpp = 2; | 778 | track->zb.cpp = 2; |
@@ -878,7 +782,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
878 | break; | 782 | break; |
879 | default: | 783 | default: |
880 | DRM_ERROR("Invalid z buffer format (%d) !\n", | 784 | DRM_ERROR("Invalid z buffer format (%d) !\n", |
881 | (ib_chunk->kdata[idx] & 0xF)); | 785 | (idx_value & 0xF)); |
882 | return -EINVAL; | 786 | return -EINVAL; |
883 | } | 787 | } |
884 | break; | 788 | break; |
@@ -897,17 +801,17 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
897 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) | 801 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
898 | tile_flags |= R300_DEPTHMICROTILE_TILED;; | 802 | tile_flags |= R300_DEPTHMICROTILE_TILED;; |
899 | 803 | ||
900 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); | 804 | tmp = idx_value & ~(0x7 << 16); |
901 | tmp |= tile_flags; | 805 | tmp |= tile_flags; |
902 | ib[idx] = tmp; | 806 | ib[idx] = tmp; |
903 | 807 | ||
904 | track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC; | 808 | track->zb.pitch = idx_value & 0x3FFC; |
905 | break; | 809 | break; |
906 | case 0x4104: | 810 | case 0x4104: |
907 | for (i = 0; i < 16; i++) { | 811 | for (i = 0; i < 16; i++) { |
908 | bool enabled; | 812 | bool enabled; |
909 | 813 | ||
910 | enabled = !!(ib_chunk->kdata[idx] & (1 << i)); | 814 | enabled = !!(idx_value & (1 << i)); |
911 | track->textures[i].enabled = enabled; | 815 | track->textures[i].enabled = enabled; |
912 | } | 816 | } |
913 | break; | 817 | break; |
@@ -929,9 +833,9 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
929 | case 0x44FC: | 833 | case 0x44FC: |
930 | /* TX_FORMAT1_[0-15] */ | 834 | /* TX_FORMAT1_[0-15] */ |
931 | i = (reg - 0x44C0) >> 2; | 835 | i = (reg - 0x44C0) >> 2; |
932 | tmp = (ib_chunk->kdata[idx] >> 25) & 0x3; | 836 | tmp = (idx_value >> 25) & 0x3; |
933 | track->textures[i].tex_coord_type = tmp; | 837 | track->textures[i].tex_coord_type = tmp; |
934 | switch ((ib_chunk->kdata[idx] & 0x1F)) { | 838 | switch ((idx_value & 0x1F)) { |
935 | case R300_TX_FORMAT_X8: | 839 | case R300_TX_FORMAT_X8: |
936 | case R300_TX_FORMAT_Y4X4: | 840 | case R300_TX_FORMAT_Y4X4: |
937 | case R300_TX_FORMAT_Z3Y3X2: | 841 | case R300_TX_FORMAT_Z3Y3X2: |
@@ -971,7 +875,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
971 | break; | 875 | break; |
972 | default: | 876 | default: |
973 | DRM_ERROR("Invalid texture format %u\n", | 877 | DRM_ERROR("Invalid texture format %u\n", |
974 | (ib_chunk->kdata[idx] & 0x1F)); | 878 | (idx_value & 0x1F)); |
975 | return -EINVAL; | 879 | return -EINVAL; |
976 | break; | 880 | break; |
977 | } | 881 | } |
@@ -994,11 +898,11 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
994 | case 0x443C: | 898 | case 0x443C: |
995 | /* TX_FILTER0_[0-15] */ | 899 | /* TX_FILTER0_[0-15] */ |
996 | i = (reg - 0x4400) >> 2; | 900 | i = (reg - 0x4400) >> 2; |
997 | tmp = ib_chunk->kdata[idx] & 0x7; | 901 | tmp = idx_value & 0x7; |
998 | if (tmp == 2 || tmp == 4 || tmp == 6) { | 902 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
999 | track->textures[i].roundup_w = false; | 903 | track->textures[i].roundup_w = false; |
1000 | } | 904 | } |
1001 | tmp = (ib_chunk->kdata[idx] >> 3) & 0x7; | 905 | tmp = (idx_value >> 3) & 0x7; |
1002 | if (tmp == 2 || tmp == 4 || tmp == 6) { | 906 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
1003 | track->textures[i].roundup_h = false; | 907 | track->textures[i].roundup_h = false; |
1004 | } | 908 | } |
@@ -1021,12 +925,12 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1021 | case 0x453C: | 925 | case 0x453C: |
1022 | /* TX_FORMAT2_[0-15] */ | 926 | /* TX_FORMAT2_[0-15] */ |
1023 | i = (reg - 0x4500) >> 2; | 927 | i = (reg - 0x4500) >> 2; |
1024 | tmp = ib_chunk->kdata[idx] & 0x3FFF; | 928 | tmp = idx_value & 0x3FFF; |
1025 | track->textures[i].pitch = tmp + 1; | 929 | track->textures[i].pitch = tmp + 1; |
1026 | if (p->rdev->family >= CHIP_RV515) { | 930 | if (p->rdev->family >= CHIP_RV515) { |
1027 | tmp = ((ib_chunk->kdata[idx] >> 15) & 1) << 11; | 931 | tmp = ((idx_value >> 15) & 1) << 11; |
1028 | track->textures[i].width_11 = tmp; | 932 | track->textures[i].width_11 = tmp; |
1029 | tmp = ((ib_chunk->kdata[idx] >> 16) & 1) << 11; | 933 | tmp = ((idx_value >> 16) & 1) << 11; |
1030 | track->textures[i].height_11 = tmp; | 934 | track->textures[i].height_11 = tmp; |
1031 | } | 935 | } |
1032 | break; | 936 | break; |
@@ -1048,15 +952,15 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1048 | case 0x44BC: | 952 | case 0x44BC: |
1049 | /* TX_FORMAT0_[0-15] */ | 953 | /* TX_FORMAT0_[0-15] */ |
1050 | i = (reg - 0x4480) >> 2; | 954 | i = (reg - 0x4480) >> 2; |
1051 | tmp = ib_chunk->kdata[idx] & 0x7FF; | 955 | tmp = idx_value & 0x7FF; |
1052 | track->textures[i].width = tmp + 1; | 956 | track->textures[i].width = tmp + 1; |
1053 | tmp = (ib_chunk->kdata[idx] >> 11) & 0x7FF; | 957 | tmp = (idx_value >> 11) & 0x7FF; |
1054 | track->textures[i].height = tmp + 1; | 958 | track->textures[i].height = tmp + 1; |
1055 | tmp = (ib_chunk->kdata[idx] >> 26) & 0xF; | 959 | tmp = (idx_value >> 26) & 0xF; |
1056 | track->textures[i].num_levels = tmp; | 960 | track->textures[i].num_levels = tmp; |
1057 | tmp = ib_chunk->kdata[idx] & (1 << 31); | 961 | tmp = idx_value & (1 << 31); |
1058 | track->textures[i].use_pitch = !!tmp; | 962 | track->textures[i].use_pitch = !!tmp; |
1059 | tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; | 963 | tmp = (idx_value >> 22) & 0xF; |
1060 | track->textures[i].txdepth = tmp; | 964 | track->textures[i].txdepth = tmp; |
1061 | break; | 965 | break; |
1062 | case R300_ZB_ZPASS_ADDR: | 966 | case R300_ZB_ZPASS_ADDR: |
@@ -1067,7 +971,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1067 | r100_cs_dump_packet(p, pkt); | 971 | r100_cs_dump_packet(p, pkt); |
1068 | return r; | 972 | return r; |
1069 | } | 973 | } |
1070 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | 974 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1071 | break; | 975 | break; |
1072 | case 0x4be8: | 976 | case 0x4be8: |
1073 | /* valid register only on RV530 */ | 977 | /* valid register only on RV530 */ |
@@ -1085,60 +989,20 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
1085 | static int r300_packet3_check(struct radeon_cs_parser *p, | 989 | static int r300_packet3_check(struct radeon_cs_parser *p, |
1086 | struct radeon_cs_packet *pkt) | 990 | struct radeon_cs_packet *pkt) |
1087 | { | 991 | { |
1088 | struct radeon_cs_chunk *ib_chunk; | ||
1089 | |||
1090 | struct radeon_cs_reloc *reloc; | 992 | struct radeon_cs_reloc *reloc; |
1091 | struct r100_cs_track *track; | 993 | struct r100_cs_track *track; |
1092 | volatile uint32_t *ib; | 994 | volatile uint32_t *ib; |
1093 | unsigned idx; | 995 | unsigned idx; |
1094 | unsigned i, c; | ||
1095 | int r; | 996 | int r; |
1096 | 997 | ||
1097 | ib = p->ib->ptr; | 998 | ib = p->ib->ptr; |
1098 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
1099 | idx = pkt->idx + 1; | 999 | idx = pkt->idx + 1; |
1100 | track = (struct r100_cs_track *)p->track; | 1000 | track = (struct r100_cs_track *)p->track; |
1101 | switch(pkt->opcode) { | 1001 | switch(pkt->opcode) { |
1102 | case PACKET3_3D_LOAD_VBPNTR: | 1002 | case PACKET3_3D_LOAD_VBPNTR: |
1103 | c = ib_chunk->kdata[idx++] & 0x1F; | 1003 | r = r100_packet3_load_vbpntr(p, pkt, idx); |
1104 | track->num_arrays = c; | 1004 | if (r) |
1105 | for (i = 0; i < (c - 1); i+=2, idx+=3) { | 1005 | return r; |
1106 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
1107 | if (r) { | ||
1108 | DRM_ERROR("No reloc for packet3 %d\n", | ||
1109 | pkt->opcode); | ||
1110 | r100_cs_dump_packet(p, pkt); | ||
1111 | return r; | ||
1112 | } | ||
1113 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | ||
1114 | track->arrays[i + 0].robj = reloc->robj; | ||
1115 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; | ||
1116 | track->arrays[i + 0].esize &= 0x7F; | ||
1117 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
1118 | if (r) { | ||
1119 | DRM_ERROR("No reloc for packet3 %d\n", | ||
1120 | pkt->opcode); | ||
1121 | r100_cs_dump_packet(p, pkt); | ||
1122 | return r; | ||
1123 | } | ||
1124 | ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset); | ||
1125 | track->arrays[i + 1].robj = reloc->robj; | ||
1126 | track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24; | ||
1127 | track->arrays[i + 1].esize &= 0x7F; | ||
1128 | } | ||
1129 | if (c & 1) { | ||
1130 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
1131 | if (r) { | ||
1132 | DRM_ERROR("No reloc for packet3 %d\n", | ||
1133 | pkt->opcode); | ||
1134 | r100_cs_dump_packet(p, pkt); | ||
1135 | return r; | ||
1136 | } | ||
1137 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | ||
1138 | track->arrays[i + 0].robj = reloc->robj; | ||
1139 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; | ||
1140 | track->arrays[i + 0].esize &= 0x7F; | ||
1141 | } | ||
1142 | break; | 1006 | break; |
1143 | case PACKET3_INDX_BUFFER: | 1007 | case PACKET3_INDX_BUFFER: |
1144 | r = r100_cs_packet_next_reloc(p, &reloc); | 1008 | r = r100_cs_packet_next_reloc(p, &reloc); |
@@ -1147,7 +1011,7 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
1147 | r100_cs_dump_packet(p, pkt); | 1011 | r100_cs_dump_packet(p, pkt); |
1148 | return r; | 1012 | return r; |
1149 | } | 1013 | } |
1150 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); | 1014 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
1151 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); | 1015 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1152 | if (r) { | 1016 | if (r) { |
1153 | return r; | 1017 | return r; |
@@ -1158,11 +1022,11 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
1158 | /* Number of dwords is vtx_size * (num_vertices - 1) | 1022 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1159 | * PRIM_WALK must be equal to 3 vertex data in embedded | 1023 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1160 | * in cmd stream */ | 1024 | * in cmd stream */ |
1161 | if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) { | 1025 | if (((radeon_get_ib_value(p, idx + 1) >> 4) & 0x3) != 3) { |
1162 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); | 1026 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1163 | return -EINVAL; | 1027 | return -EINVAL; |
1164 | } | 1028 | } |
1165 | track->vap_vf_cntl = ib_chunk->kdata[idx+1]; | 1029 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1166 | track->immd_dwords = pkt->count - 1; | 1030 | track->immd_dwords = pkt->count - 1; |
1167 | r = r100_cs_track_check(p->rdev, track); | 1031 | r = r100_cs_track_check(p->rdev, track); |
1168 | if (r) { | 1032 | if (r) { |
@@ -1173,11 +1037,11 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
1173 | /* Number of dwords is vtx_size * (num_vertices - 1) | 1037 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1174 | * PRIM_WALK must be equal to 3 vertex data in embedded | 1038 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1175 | * in cmd stream */ | 1039 | * in cmd stream */ |
1176 | if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) { | 1040 | if (((radeon_get_ib_value(p, idx) >> 4) & 0x3) != 3) { |
1177 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); | 1041 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1178 | return -EINVAL; | 1042 | return -EINVAL; |
1179 | } | 1043 | } |
1180 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 1044 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1181 | track->immd_dwords = pkt->count; | 1045 | track->immd_dwords = pkt->count; |
1182 | r = r100_cs_track_check(p->rdev, track); | 1046 | r = r100_cs_track_check(p->rdev, track); |
1183 | if (r) { | 1047 | if (r) { |
@@ -1185,28 +1049,28 @@ static int r300_packet3_check(struct radeon_cs_parser *p, | |||
1185 | } | 1049 | } |
1186 | break; | 1050 | break; |
1187 | case PACKET3_3D_DRAW_VBUF: | 1051 | case PACKET3_3D_DRAW_VBUF: |
1188 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; | 1052 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1189 | r = r100_cs_track_check(p->rdev, track); | 1053 | r = r100_cs_track_check(p->rdev, track); |
1190 | if (r) { | 1054 | if (r) { |
1191 | return r; | 1055 | return r; |
1192 | } | 1056 | } |
1193 | break; | 1057 | break; |
1194 | case PACKET3_3D_DRAW_VBUF_2: | 1058 | case PACKET3_3D_DRAW_VBUF_2: |
1195 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 1059 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1196 | r = r100_cs_track_check(p->rdev, track); | 1060 | r = r100_cs_track_check(p->rdev, track); |
1197 | if (r) { | 1061 | if (r) { |
1198 | return r; | 1062 | return r; |
1199 | } | 1063 | } |
1200 | break; | 1064 | break; |
1201 | case PACKET3_3D_DRAW_INDX: | 1065 | case PACKET3_3D_DRAW_INDX: |
1202 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; | 1066 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1203 | r = r100_cs_track_check(p->rdev, track); | 1067 | r = r100_cs_track_check(p->rdev, track); |
1204 | if (r) { | 1068 | if (r) { |
1205 | return r; | 1069 | return r; |
1206 | } | 1070 | } |
1207 | break; | 1071 | break; |
1208 | case PACKET3_3D_DRAW_INDX_2: | 1072 | case PACKET3_3D_DRAW_INDX_2: |
1209 | track->vap_vf_cntl = ib_chunk->kdata[idx]; | 1073 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1210 | r = r100_cs_track_check(p->rdev, track); | 1074 | r = r100_cs_track_check(p->rdev, track); |
1211 | if (r) { | 1075 | if (r) { |
1212 | return r; | 1076 | return r; |
@@ -1265,12 +1129,6 @@ void r300_set_reg_safe(struct radeon_device *rdev) | |||
1265 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); | 1129 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); |
1266 | } | 1130 | } |
1267 | 1131 | ||
1268 | int r300_init(struct radeon_device *rdev) | ||
1269 | { | ||
1270 | r300_set_reg_safe(rdev); | ||
1271 | return 0; | ||
1272 | } | ||
1273 | |||
1274 | void r300_mc_program(struct radeon_device *rdev) | 1132 | void r300_mc_program(struct radeon_device *rdev) |
1275 | { | 1133 | { |
1276 | struct r100_mc_save save; | 1134 | struct r100_mc_save save; |
@@ -1304,3 +1162,198 @@ void r300_mc_program(struct radeon_device *rdev) | |||
1304 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | 1162 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
1305 | r100_mc_resume(rdev, &save); | 1163 | r100_mc_resume(rdev, &save); |
1306 | } | 1164 | } |
1165 | |||
1166 | void r300_clock_startup(struct radeon_device *rdev) | ||
1167 | { | ||
1168 | u32 tmp; | ||
1169 | |||
1170 | if (radeon_dynclks != -1 && radeon_dynclks) | ||
1171 | radeon_legacy_set_clock_gating(rdev, 1); | ||
1172 | /* We need to force on some of the block */ | ||
1173 | tmp = RREG32_PLL(R_00000D_SCLK_CNTL); | ||
1174 | tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); | ||
1175 | if ((rdev->family == CHIP_RV350) || (rdev->family == CHIP_RV380)) | ||
1176 | tmp |= S_00000D_FORCE_VAP(1); | ||
1177 | WREG32_PLL(R_00000D_SCLK_CNTL, tmp); | ||
1178 | } | ||
1179 | |||
1180 | static int r300_startup(struct radeon_device *rdev) | ||
1181 | { | ||
1182 | int r; | ||
1183 | |||
1184 | r300_mc_program(rdev); | ||
1185 | /* Resume clock */ | ||
1186 | r300_clock_startup(rdev); | ||
1187 | /* Initialize GPU configuration (# pipes, ...) */ | ||
1188 | r300_gpu_init(rdev); | ||
1189 | /* Initialize GART (initialize after TTM so we can allocate | ||
1190 | * memory through TTM but finalize after TTM) */ | ||
1191 | if (rdev->flags & RADEON_IS_PCIE) { | ||
1192 | r = rv370_pcie_gart_enable(rdev); | ||
1193 | if (r) | ||
1194 | return r; | ||
1195 | } | ||
1196 | if (rdev->flags & RADEON_IS_PCI) { | ||
1197 | r = r100_pci_gart_enable(rdev); | ||
1198 | if (r) | ||
1199 | return r; | ||
1200 | } | ||
1201 | /* Enable IRQ */ | ||
1202 | rdev->irq.sw_int = true; | ||
1203 | r100_irq_set(rdev); | ||
1204 | /* 1M ring buffer */ | ||
1205 | r = r100_cp_init(rdev, 1024 * 1024); | ||
1206 | if (r) { | ||
1207 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
1208 | return r; | ||
1209 | } | ||
1210 | r = r100_wb_init(rdev); | ||
1211 | if (r) | ||
1212 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
1213 | r = r100_ib_init(rdev); | ||
1214 | if (r) { | ||
1215 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
1216 | return r; | ||
1217 | } | ||
1218 | return 0; | ||
1219 | } | ||
1220 | |||
1221 | int r300_resume(struct radeon_device *rdev) | ||
1222 | { | ||
1223 | /* Make sur GART are not working */ | ||
1224 | if (rdev->flags & RADEON_IS_PCIE) | ||
1225 | rv370_pcie_gart_disable(rdev); | ||
1226 | if (rdev->flags & RADEON_IS_PCI) | ||
1227 | r100_pci_gart_disable(rdev); | ||
1228 | /* Resume clock before doing reset */ | ||
1229 | r300_clock_startup(rdev); | ||
1230 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
1231 | if (radeon_gpu_reset(rdev)) { | ||
1232 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
1233 | RREG32(R_000E40_RBBM_STATUS), | ||
1234 | RREG32(R_0007C0_CP_STAT)); | ||
1235 | } | ||
1236 | /* post */ | ||
1237 | radeon_combios_asic_init(rdev->ddev); | ||
1238 | /* Resume clock after posting */ | ||
1239 | r300_clock_startup(rdev); | ||
1240 | return r300_startup(rdev); | ||
1241 | } | ||
1242 | |||
1243 | int r300_suspend(struct radeon_device *rdev) | ||
1244 | { | ||
1245 | r100_cp_disable(rdev); | ||
1246 | r100_wb_disable(rdev); | ||
1247 | r100_irq_disable(rdev); | ||
1248 | if (rdev->flags & RADEON_IS_PCIE) | ||
1249 | rv370_pcie_gart_disable(rdev); | ||
1250 | if (rdev->flags & RADEON_IS_PCI) | ||
1251 | r100_pci_gart_disable(rdev); | ||
1252 | return 0; | ||
1253 | } | ||
1254 | |||
1255 | void r300_fini(struct radeon_device *rdev) | ||
1256 | { | ||
1257 | r300_suspend(rdev); | ||
1258 | r100_cp_fini(rdev); | ||
1259 | r100_wb_fini(rdev); | ||
1260 | r100_ib_fini(rdev); | ||
1261 | radeon_gem_fini(rdev); | ||
1262 | if (rdev->flags & RADEON_IS_PCIE) | ||
1263 | rv370_pcie_gart_fini(rdev); | ||
1264 | if (rdev->flags & RADEON_IS_PCI) | ||
1265 | r100_pci_gart_fini(rdev); | ||
1266 | radeon_irq_kms_fini(rdev); | ||
1267 | radeon_fence_driver_fini(rdev); | ||
1268 | radeon_object_fini(rdev); | ||
1269 | radeon_atombios_fini(rdev); | ||
1270 | kfree(rdev->bios); | ||
1271 | rdev->bios = NULL; | ||
1272 | } | ||
1273 | |||
1274 | int r300_init(struct radeon_device *rdev) | ||
1275 | { | ||
1276 | int r; | ||
1277 | |||
1278 | /* Disable VGA */ | ||
1279 | r100_vga_render_disable(rdev); | ||
1280 | /* Initialize scratch registers */ | ||
1281 | radeon_scratch_init(rdev); | ||
1282 | /* Initialize surface registers */ | ||
1283 | radeon_surface_init(rdev); | ||
1284 | /* TODO: disable VGA need to use VGA request */ | ||
1285 | /* BIOS*/ | ||
1286 | if (!radeon_get_bios(rdev)) { | ||
1287 | if (ASIC_IS_AVIVO(rdev)) | ||
1288 | return -EINVAL; | ||
1289 | } | ||
1290 | if (rdev->is_atom_bios) { | ||
1291 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); | ||
1292 | return -EINVAL; | ||
1293 | } else { | ||
1294 | r = radeon_combios_init(rdev); | ||
1295 | if (r) | ||
1296 | return r; | ||
1297 | } | ||
1298 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
1299 | if (radeon_gpu_reset(rdev)) { | ||
1300 | dev_warn(rdev->dev, | ||
1301 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
1302 | RREG32(R_000E40_RBBM_STATUS), | ||
1303 | RREG32(R_0007C0_CP_STAT)); | ||
1304 | } | ||
1305 | /* check if cards are posted or not */ | ||
1306 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
1307 | DRM_INFO("GPU not posted. posting now...\n"); | ||
1308 | radeon_combios_asic_init(rdev->ddev); | ||
1309 | } | ||
1310 | /* Set asic errata */ | ||
1311 | r300_errata(rdev); | ||
1312 | /* Initialize clocks */ | ||
1313 | radeon_get_clock_info(rdev->ddev); | ||
1314 | /* Get vram informations */ | ||
1315 | r300_vram_info(rdev); | ||
1316 | /* Initialize memory controller (also test AGP) */ | ||
1317 | r = r420_mc_init(rdev); | ||
1318 | if (r) | ||
1319 | return r; | ||
1320 | /* Fence driver */ | ||
1321 | r = radeon_fence_driver_init(rdev); | ||
1322 | if (r) | ||
1323 | return r; | ||
1324 | r = radeon_irq_kms_init(rdev); | ||
1325 | if (r) | ||
1326 | return r; | ||
1327 | /* Memory manager */ | ||
1328 | r = radeon_object_init(rdev); | ||
1329 | if (r) | ||
1330 | return r; | ||
1331 | if (rdev->flags & RADEON_IS_PCIE) { | ||
1332 | r = rv370_pcie_gart_init(rdev); | ||
1333 | if (r) | ||
1334 | return r; | ||
1335 | } | ||
1336 | if (rdev->flags & RADEON_IS_PCI) { | ||
1337 | r = r100_pci_gart_init(rdev); | ||
1338 | if (r) | ||
1339 | return r; | ||
1340 | } | ||
1341 | r300_set_reg_safe(rdev); | ||
1342 | rdev->accel_working = true; | ||
1343 | r = r300_startup(rdev); | ||
1344 | if (r) { | ||
1345 | /* Somethings want wront with the accel init stop accel */ | ||
1346 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
1347 | r300_suspend(rdev); | ||
1348 | r100_cp_fini(rdev); | ||
1349 | r100_wb_fini(rdev); | ||
1350 | r100_ib_fini(rdev); | ||
1351 | if (rdev->flags & RADEON_IS_PCIE) | ||
1352 | rv370_pcie_gart_fini(rdev); | ||
1353 | if (rdev->flags & RADEON_IS_PCI) | ||
1354 | r100_pci_gart_fini(rdev); | ||
1355 | radeon_irq_kms_fini(rdev); | ||
1356 | rdev->accel_working = false; | ||
1357 | } | ||
1358 | return 0; | ||
1359 | } | ||
diff --git a/drivers/gpu/drm/radeon/r300d.h b/drivers/gpu/drm/radeon/r300d.h index d4fa3eb1074..4c73114f0de 100644 --- a/drivers/gpu/drm/radeon/r300d.h +++ b/drivers/gpu/drm/radeon/r300d.h | |||
@@ -96,6 +96,211 @@ | |||
96 | #define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | 96 | #define S_000170_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) |
97 | #define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | 97 | #define G_000170_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) |
98 | #define C_000170_AGP_BASE_ADDR 0x00000000 | 98 | #define C_000170_AGP_BASE_ADDR 0x00000000 |
99 | #define R_0007C0_CP_STAT 0x0007C0 | ||
100 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
101 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
102 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
103 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
104 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
105 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
106 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
107 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
108 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
109 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
110 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
111 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
112 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
113 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
114 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
115 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
116 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
117 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
118 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
119 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
120 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
121 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
122 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
123 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
124 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
125 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
126 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
127 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
128 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
129 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
130 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
131 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
132 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
133 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
134 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
135 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
136 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
137 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
138 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
139 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
140 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
141 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
142 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
143 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
144 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
145 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
146 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
147 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
148 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
149 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
150 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
151 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
152 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
153 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
154 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
155 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
156 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
157 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
158 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
159 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
160 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
161 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
162 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
163 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
164 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
165 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
166 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
167 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
168 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
169 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
170 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
171 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
172 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
173 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
174 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
175 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
176 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
177 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
178 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
179 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
180 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
181 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
182 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
183 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
184 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
185 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
186 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
187 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
188 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
189 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
190 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
191 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
192 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
193 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
194 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
195 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
196 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
197 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
198 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
199 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
200 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
201 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
202 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
203 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
204 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
205 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
206 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
207 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
208 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
209 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
210 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
211 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
99 | 212 | ||
100 | 213 | ||
214 | #define R_00000D_SCLK_CNTL 0x00000D | ||
215 | #define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0) | ||
216 | #define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7) | ||
217 | #define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8 | ||
218 | #define S_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 3) | ||
219 | #define G_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) >> 3) & 0x1) | ||
220 | #define C_00000D_CP_MAX_DYN_STOP_LAT 0xFFFFFFF7 | ||
221 | #define S_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 4) | ||
222 | #define G_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) >> 4) & 0x1) | ||
223 | #define C_00000D_HDP_MAX_DYN_STOP_LAT 0xFFFFFFEF | ||
224 | #define S_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 5) | ||
225 | #define G_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) >> 5) & 0x1) | ||
226 | #define C_00000D_TV_MAX_DYN_STOP_LAT 0xFFFFFFDF | ||
227 | #define S_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 6) | ||
228 | #define G_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) >> 6) & 0x1) | ||
229 | #define C_00000D_E2_MAX_DYN_STOP_LAT 0xFFFFFFBF | ||
230 | #define S_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 7) | ||
231 | #define G_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) >> 7) & 0x1) | ||
232 | #define C_00000D_SE_MAX_DYN_STOP_LAT 0xFFFFFF7F | ||
233 | #define S_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 8) | ||
234 | #define G_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) >> 8) & 0x1) | ||
235 | #define C_00000D_IDCT_MAX_DYN_STOP_LAT 0xFFFFFEFF | ||
236 | #define S_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 9) | ||
237 | #define G_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) >> 9) & 0x1) | ||
238 | #define C_00000D_VIP_MAX_DYN_STOP_LAT 0xFFFFFDFF | ||
239 | #define S_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 10) | ||
240 | #define G_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) >> 10) & 0x1) | ||
241 | #define C_00000D_RE_MAX_DYN_STOP_LAT 0xFFFFFBFF | ||
242 | #define S_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 11) | ||
243 | #define G_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) >> 11) & 0x1) | ||
244 | #define C_00000D_PB_MAX_DYN_STOP_LAT 0xFFFFF7FF | ||
245 | #define S_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 12) | ||
246 | #define G_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) >> 12) & 0x1) | ||
247 | #define C_00000D_TAM_MAX_DYN_STOP_LAT 0xFFFFEFFF | ||
248 | #define S_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 13) | ||
249 | #define G_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) >> 13) & 0x1) | ||
250 | #define C_00000D_TDM_MAX_DYN_STOP_LAT 0xFFFFDFFF | ||
251 | #define S_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 14) | ||
252 | #define G_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) >> 14) & 0x1) | ||
253 | #define C_00000D_RB_MAX_DYN_STOP_LAT 0xFFFFBFFF | ||
254 | #define S_00000D_FORCE_DISP2(x) (((x) & 0x1) << 15) | ||
255 | #define G_00000D_FORCE_DISP2(x) (((x) >> 15) & 0x1) | ||
256 | #define C_00000D_FORCE_DISP2 0xFFFF7FFF | ||
257 | #define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16) | ||
258 | #define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1) | ||
259 | #define C_00000D_FORCE_CP 0xFFFEFFFF | ||
260 | #define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17) | ||
261 | #define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1) | ||
262 | #define C_00000D_FORCE_HDP 0xFFFDFFFF | ||
263 | #define S_00000D_FORCE_DISP1(x) (((x) & 0x1) << 18) | ||
264 | #define G_00000D_FORCE_DISP1(x) (((x) >> 18) & 0x1) | ||
265 | #define C_00000D_FORCE_DISP1 0xFFFBFFFF | ||
266 | #define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19) | ||
267 | #define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1) | ||
268 | #define C_00000D_FORCE_TOP 0xFFF7FFFF | ||
269 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | ||
270 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | ||
271 | #define C_00000D_FORCE_E2 0xFFEFFFFF | ||
272 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | ||
273 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | ||
274 | #define C_00000D_FORCE_SE 0xFFDFFFFF | ||
275 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | ||
276 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | ||
277 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | ||
278 | #define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23) | ||
279 | #define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1) | ||
280 | #define C_00000D_FORCE_VIP 0xFF7FFFFF | ||
281 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | ||
282 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | ||
283 | #define C_00000D_FORCE_RE 0xFEFFFFFF | ||
284 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | ||
285 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | ||
286 | #define C_00000D_FORCE_PB 0xFDFFFFFF | ||
287 | #define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26) | ||
288 | #define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1) | ||
289 | #define C_00000D_FORCE_TAM 0xFBFFFFFF | ||
290 | #define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27) | ||
291 | #define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1) | ||
292 | #define C_00000D_FORCE_TDM 0xF7FFFFFF | ||
293 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | ||
294 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | ||
295 | #define C_00000D_FORCE_RB 0xEFFFFFFF | ||
296 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) | ||
297 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) | ||
298 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF | ||
299 | #define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30) | ||
300 | #define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1) | ||
301 | #define C_00000D_FORCE_SUBPIC 0xBFFFFFFF | ||
302 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) | ||
303 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) | ||
304 | #define C_00000D_FORCE_OV0 0x7FFFFFFF | ||
305 | |||
101 | #endif | 306 | #endif |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index 49a2fdc57d2..5c7fe52de30 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
@@ -155,6 +155,9 @@ static void r420_debugfs(struct radeon_device *rdev) | |||
155 | static void r420_clock_resume(struct radeon_device *rdev) | 155 | static void r420_clock_resume(struct radeon_device *rdev) |
156 | { | 156 | { |
157 | u32 sclk_cntl; | 157 | u32 sclk_cntl; |
158 | |||
159 | if (radeon_dynclks != -1 && radeon_dynclks) | ||
160 | radeon_atom_set_clock_gating(rdev, 1); | ||
158 | sclk_cntl = RREG32_PLL(R_00000D_SCLK_CNTL); | 161 | sclk_cntl = RREG32_PLL(R_00000D_SCLK_CNTL); |
159 | sclk_cntl |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); | 162 | sclk_cntl |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); |
160 | if (rdev->family == CHIP_R420) | 163 | if (rdev->family == CHIP_R420) |
@@ -167,6 +170,8 @@ static int r420_startup(struct radeon_device *rdev) | |||
167 | int r; | 170 | int r; |
168 | 171 | ||
169 | r300_mc_program(rdev); | 172 | r300_mc_program(rdev); |
173 | /* Resume clock */ | ||
174 | r420_clock_resume(rdev); | ||
170 | /* Initialize GART (initialize after TTM so we can allocate | 175 | /* Initialize GART (initialize after TTM so we can allocate |
171 | * memory through TTM but finalize after TTM) */ | 176 | * memory through TTM but finalize after TTM) */ |
172 | if (rdev->flags & RADEON_IS_PCIE) { | 177 | if (rdev->flags & RADEON_IS_PCIE) { |
@@ -267,7 +272,6 @@ int r420_init(struct radeon_device *rdev) | |||
267 | { | 272 | { |
268 | int r; | 273 | int r; |
269 | 274 | ||
270 | rdev->new_init_path = true; | ||
271 | /* Initialize scratch registers */ | 275 | /* Initialize scratch registers */ |
272 | radeon_scratch_init(rdev); | 276 | radeon_scratch_init(rdev); |
273 | /* Initialize surface registers */ | 277 | /* Initialize surface registers */ |
diff --git a/drivers/gpu/drm/radeon/r420d.h b/drivers/gpu/drm/radeon/r420d.h index a48a7db1e2a..fc78d31a0b4 100644 --- a/drivers/gpu/drm/radeon/r420d.h +++ b/drivers/gpu/drm/radeon/r420d.h | |||
@@ -212,9 +212,9 @@ | |||
212 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | 212 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) |
213 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | 213 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) |
214 | #define C_00000D_FORCE_E2 0xFFEFFFFF | 214 | #define C_00000D_FORCE_E2 0xFFEFFFFF |
215 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | 215 | #define S_00000D_FORCE_VAP(x) (((x) & 0x1) << 21) |
216 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | 216 | #define G_00000D_FORCE_VAP(x) (((x) >> 21) & 0x1) |
217 | #define C_00000D_FORCE_SE 0xFFDFFFFF | 217 | #define C_00000D_FORCE_VAP 0xFFDFFFFF |
218 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | 218 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) |
219 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | 219 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) |
220 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | 220 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF |
@@ -224,24 +224,24 @@ | |||
224 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | 224 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) |
225 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | 225 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) |
226 | #define C_00000D_FORCE_RE 0xFEFFFFFF | 226 | #define C_00000D_FORCE_RE 0xFEFFFFFF |
227 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | 227 | #define S_00000D_FORCE_SR(x) (((x) & 0x1) << 25) |
228 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | 228 | #define G_00000D_FORCE_SR(x) (((x) >> 25) & 0x1) |
229 | #define C_00000D_FORCE_PB 0xFDFFFFFF | 229 | #define C_00000D_FORCE_SR 0xFDFFFFFF |
230 | #define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26) | 230 | #define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26) |
231 | #define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1) | 231 | #define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1) |
232 | #define C_00000D_FORCE_PX 0xFBFFFFFF | 232 | #define C_00000D_FORCE_PX 0xFBFFFFFF |
233 | #define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27) | 233 | #define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27) |
234 | #define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1) | 234 | #define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1) |
235 | #define C_00000D_FORCE_TX 0xF7FFFFFF | 235 | #define C_00000D_FORCE_TX 0xF7FFFFFF |
236 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | 236 | #define S_00000D_FORCE_US(x) (((x) & 0x1) << 28) |
237 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | 237 | #define G_00000D_FORCE_US(x) (((x) >> 28) & 0x1) |
238 | #define C_00000D_FORCE_RB 0xEFFFFFFF | 238 | #define C_00000D_FORCE_US 0xEFFFFFFF |
239 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) | 239 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) |
240 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) | 240 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) |
241 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF | 241 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF |
242 | #define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30) | 242 | #define S_00000D_FORCE_SU(x) (((x) & 0x1) << 30) |
243 | #define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1) | 243 | #define G_00000D_FORCE_SU(x) (((x) >> 30) & 0x1) |
244 | #define C_00000D_FORCE_SUBPIC 0xBFFFFFFF | 244 | #define C_00000D_FORCE_SU 0xBFFFFFFF |
245 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) | 245 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) |
246 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) | 246 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) |
247 | #define C_00000D_FORCE_OV0 0x7FFFFFFF | 247 | #define C_00000D_FORCE_OV0 0x7FFFFFFF |
diff --git a/drivers/gpu/drm/radeon/r500_reg.h b/drivers/gpu/drm/radeon/r500_reg.h index e1d5e0331e1..868add6e166 100644 --- a/drivers/gpu/drm/radeon/r500_reg.h +++ b/drivers/gpu/drm/radeon/r500_reg.h | |||
@@ -445,6 +445,8 @@ | |||
445 | #define AVIVO_D1MODE_VBLANK_STATUS 0x6534 | 445 | #define AVIVO_D1MODE_VBLANK_STATUS 0x6534 |
446 | # define AVIVO_VBLANK_ACK (1 << 4) | 446 | # define AVIVO_VBLANK_ACK (1 << 4) |
447 | #define AVIVO_D1MODE_VLINE_START_END 0x6538 | 447 | #define AVIVO_D1MODE_VLINE_START_END 0x6538 |
448 | #define AVIVO_D1MODE_VLINE_STATUS 0x653c | ||
449 | # define AVIVO_D1MODE_VLINE_STAT (1 << 12) | ||
448 | #define AVIVO_DxMODE_INT_MASK 0x6540 | 450 | #define AVIVO_DxMODE_INT_MASK 0x6540 |
449 | # define AVIVO_D1MODE_INT_MASK (1 << 0) | 451 | # define AVIVO_D1MODE_INT_MASK (1 << 0) |
450 | # define AVIVO_D2MODE_INT_MASK (1 << 8) | 452 | # define AVIVO_D2MODE_INT_MASK (1 << 8) |
@@ -502,6 +504,7 @@ | |||
502 | 504 | ||
503 | #define AVIVO_D2MODE_VBLANK_STATUS 0x6d34 | 505 | #define AVIVO_D2MODE_VBLANK_STATUS 0x6d34 |
504 | #define AVIVO_D2MODE_VLINE_START_END 0x6d38 | 506 | #define AVIVO_D2MODE_VLINE_START_END 0x6d38 |
507 | #define AVIVO_D2MODE_VLINE_STATUS 0x6d3c | ||
505 | #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 | 508 | #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 |
506 | #define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84 | 509 | #define AVIVO_D2MODE_VIEWPORT_SIZE 0x6d84 |
507 | #define AVIVO_D2MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6d88 | 510 | #define AVIVO_D2MODE_EXT_OVERSCAN_LEFT_RIGHT 0x6d88 |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index d4b0b9d2e39..a555b7b19b4 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
@@ -26,108 +26,13 @@ | |||
26 | * Jerome Glisse | 26 | * Jerome Glisse |
27 | */ | 27 | */ |
28 | #include "drmP.h" | 28 | #include "drmP.h" |
29 | #include "radeon_reg.h" | ||
30 | #include "radeon.h" | 29 | #include "radeon.h" |
30 | #include "atom.h" | ||
31 | #include "r520d.h" | ||
31 | 32 | ||
32 | /* r520,rv530,rv560,rv570,r580 depends on : */ | 33 | /* This files gather functions specifics to: r520,rv530,rv560,rv570,r580 */ |
33 | void r100_hdp_reset(struct radeon_device *rdev); | ||
34 | void r420_pipes_init(struct radeon_device *rdev); | ||
35 | void rs600_mc_disable_clients(struct radeon_device *rdev); | ||
36 | void rs600_disable_vga(struct radeon_device *rdev); | ||
37 | int rv515_debugfs_pipes_info_init(struct radeon_device *rdev); | ||
38 | int rv515_debugfs_ga_info_init(struct radeon_device *rdev); | ||
39 | 34 | ||
40 | /* This files gather functions specifics to: | 35 | static int r520_mc_wait_for_idle(struct radeon_device *rdev) |
41 | * r520,rv530,rv560,rv570,r580 | ||
42 | * | ||
43 | * Some of these functions might be used by newer ASICs. | ||
44 | */ | ||
45 | void r520_gpu_init(struct radeon_device *rdev); | ||
46 | int r520_mc_wait_for_idle(struct radeon_device *rdev); | ||
47 | |||
48 | |||
49 | /* | ||
50 | * MC | ||
51 | */ | ||
52 | int r520_mc_init(struct radeon_device *rdev) | ||
53 | { | ||
54 | uint32_t tmp; | ||
55 | int r; | ||
56 | |||
57 | if (r100_debugfs_rbbm_init(rdev)) { | ||
58 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
59 | } | ||
60 | if (rv515_debugfs_pipes_info_init(rdev)) { | ||
61 | DRM_ERROR("Failed to register debugfs file for pipes !\n"); | ||
62 | } | ||
63 | if (rv515_debugfs_ga_info_init(rdev)) { | ||
64 | DRM_ERROR("Failed to register debugfs file for pipes !\n"); | ||
65 | } | ||
66 | |||
67 | r520_gpu_init(rdev); | ||
68 | rv370_pcie_gart_disable(rdev); | ||
69 | |||
70 | /* Setup GPU memory space */ | ||
71 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
72 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
73 | if (rdev->flags & RADEON_IS_AGP) { | ||
74 | r = radeon_agp_init(rdev); | ||
75 | if (r) { | ||
76 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
77 | rdev->flags &= ~RADEON_IS_AGP; | ||
78 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
79 | } else { | ||
80 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
81 | } | ||
82 | } | ||
83 | r = radeon_mc_setup(rdev); | ||
84 | if (r) { | ||
85 | return r; | ||
86 | } | ||
87 | |||
88 | /* Program GPU memory space */ | ||
89 | rs600_mc_disable_clients(rdev); | ||
90 | if (r520_mc_wait_for_idle(rdev)) { | ||
91 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
92 | "programming pipes. Bad things might happen.\n"); | ||
93 | } | ||
94 | /* Write VRAM size in case we are limiting it */ | ||
95 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | ||
96 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
97 | tmp = REG_SET(R520_MC_FB_TOP, tmp >> 16); | ||
98 | tmp |= REG_SET(R520_MC_FB_START, rdev->mc.vram_location >> 16); | ||
99 | WREG32_MC(R520_MC_FB_LOCATION, tmp); | ||
100 | WREG32(RS690_HDP_FB_LOCATION, rdev->mc.vram_location >> 16); | ||
101 | WREG32(0x310, rdev->mc.vram_location); | ||
102 | if (rdev->flags & RADEON_IS_AGP) { | ||
103 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | ||
104 | tmp = REG_SET(R520_MC_AGP_TOP, tmp >> 16); | ||
105 | tmp |= REG_SET(R520_MC_AGP_START, rdev->mc.gtt_location >> 16); | ||
106 | WREG32_MC(R520_MC_AGP_LOCATION, tmp); | ||
107 | WREG32_MC(R520_MC_AGP_BASE, rdev->mc.agp_base); | ||
108 | WREG32_MC(R520_MC_AGP_BASE_2, 0); | ||
109 | } else { | ||
110 | WREG32_MC(R520_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
111 | WREG32_MC(R520_MC_AGP_BASE, 0); | ||
112 | WREG32_MC(R520_MC_AGP_BASE_2, 0); | ||
113 | } | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | void r520_mc_fini(struct radeon_device *rdev) | ||
118 | { | ||
119 | } | ||
120 | |||
121 | |||
122 | /* | ||
123 | * Global GPU functions | ||
124 | */ | ||
125 | void r520_errata(struct radeon_device *rdev) | ||
126 | { | ||
127 | rdev->pll_errata = 0; | ||
128 | } | ||
129 | |||
130 | int r520_mc_wait_for_idle(struct radeon_device *rdev) | ||
131 | { | 36 | { |
132 | unsigned i; | 37 | unsigned i; |
133 | uint32_t tmp; | 38 | uint32_t tmp; |
@@ -143,12 +48,12 @@ int r520_mc_wait_for_idle(struct radeon_device *rdev) | |||
143 | return -1; | 48 | return -1; |
144 | } | 49 | } |
145 | 50 | ||
146 | void r520_gpu_init(struct radeon_device *rdev) | 51 | static void r520_gpu_init(struct radeon_device *rdev) |
147 | { | 52 | { |
148 | unsigned pipe_select_current, gb_pipe_select, tmp; | 53 | unsigned pipe_select_current, gb_pipe_select, tmp; |
149 | 54 | ||
150 | r100_hdp_reset(rdev); | 55 | r100_hdp_reset(rdev); |
151 | rs600_disable_vga(rdev); | 56 | rv515_vga_render_disable(rdev); |
152 | /* | 57 | /* |
153 | * DST_PIPE_CONFIG 0x170C | 58 | * DST_PIPE_CONFIG 0x170C |
154 | * GB_TILE_CONFIG 0x4018 | 59 | * GB_TILE_CONFIG 0x4018 |
@@ -186,10 +91,6 @@ void r520_gpu_init(struct radeon_device *rdev) | |||
186 | } | 91 | } |
187 | } | 92 | } |
188 | 93 | ||
189 | |||
190 | /* | ||
191 | * VRAM info | ||
192 | */ | ||
193 | static void r520_vram_get_type(struct radeon_device *rdev) | 94 | static void r520_vram_get_type(struct radeon_device *rdev) |
194 | { | 95 | { |
195 | uint32_t tmp; | 96 | uint32_t tmp; |
@@ -233,7 +134,167 @@ void r520_vram_info(struct radeon_device *rdev) | |||
233 | rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); | 134 | rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); |
234 | } | 135 | } |
235 | 136 | ||
236 | void r520_bandwidth_update(struct radeon_device *rdev) | 137 | void r520_mc_program(struct radeon_device *rdev) |
138 | { | ||
139 | struct rv515_mc_save save; | ||
140 | |||
141 | /* Stops all mc clients */ | ||
142 | rv515_mc_stop(rdev, &save); | ||
143 | |||
144 | /* Wait for mc idle */ | ||
145 | if (r520_mc_wait_for_idle(rdev)) | ||
146 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
147 | /* Write VRAM size in case we are limiting it */ | ||
148 | WREG32(R_0000F8_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | ||
149 | /* Program MC, should be a 32bits limited address space */ | ||
150 | WREG32_MC(R_000004_MC_FB_LOCATION, | ||
151 | S_000004_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
152 | S_000004_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
153 | WREG32(R_000134_HDP_FB_LOCATION, | ||
154 | S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); | ||
155 | if (rdev->flags & RADEON_IS_AGP) { | ||
156 | WREG32_MC(R_000005_MC_AGP_LOCATION, | ||
157 | S_000005_MC_AGP_START(rdev->mc.gtt_start >> 16) | | ||
158 | S_000005_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); | ||
159 | WREG32_MC(R_000006_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); | ||
160 | WREG32_MC(R_000007_AGP_BASE_2, | ||
161 | S_000007_AGP_BASE_ADDR_2(upper_32_bits(rdev->mc.agp_base))); | ||
162 | } else { | ||
163 | WREG32_MC(R_000005_MC_AGP_LOCATION, 0xFFFFFFFF); | ||
164 | WREG32_MC(R_000006_AGP_BASE, 0); | ||
165 | WREG32_MC(R_000007_AGP_BASE_2, 0); | ||
166 | } | ||
167 | |||
168 | rv515_mc_resume(rdev, &save); | ||
169 | } | ||
170 | |||
171 | static int r520_startup(struct radeon_device *rdev) | ||
172 | { | ||
173 | int r; | ||
174 | |||
175 | r520_mc_program(rdev); | ||
176 | /* Resume clock */ | ||
177 | rv515_clock_startup(rdev); | ||
178 | /* Initialize GPU configuration (# pipes, ...) */ | ||
179 | r520_gpu_init(rdev); | ||
180 | /* Initialize GART (initialize after TTM so we can allocate | ||
181 | * memory through TTM but finalize after TTM) */ | ||
182 | if (rdev->flags & RADEON_IS_PCIE) { | ||
183 | r = rv370_pcie_gart_enable(rdev); | ||
184 | if (r) | ||
185 | return r; | ||
186 | } | ||
187 | /* Enable IRQ */ | ||
188 | rdev->irq.sw_int = true; | ||
189 | rs600_irq_set(rdev); | ||
190 | /* 1M ring buffer */ | ||
191 | r = r100_cp_init(rdev, 1024 * 1024); | ||
192 | if (r) { | ||
193 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
194 | return r; | ||
195 | } | ||
196 | r = r100_wb_init(rdev); | ||
197 | if (r) | ||
198 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
199 | r = r100_ib_init(rdev); | ||
200 | if (r) { | ||
201 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
202 | return r; | ||
203 | } | ||
204 | return 0; | ||
205 | } | ||
206 | |||
207 | int r520_resume(struct radeon_device *rdev) | ||
237 | { | 208 | { |
238 | rv515_bandwidth_avivo_update(rdev); | 209 | /* Make sur GART are not working */ |
210 | if (rdev->flags & RADEON_IS_PCIE) | ||
211 | rv370_pcie_gart_disable(rdev); | ||
212 | /* Resume clock before doing reset */ | ||
213 | rv515_clock_startup(rdev); | ||
214 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
215 | if (radeon_gpu_reset(rdev)) { | ||
216 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
217 | RREG32(R_000E40_RBBM_STATUS), | ||
218 | RREG32(R_0007C0_CP_STAT)); | ||
219 | } | ||
220 | /* post */ | ||
221 | atom_asic_init(rdev->mode_info.atom_context); | ||
222 | /* Resume clock after posting */ | ||
223 | rv515_clock_startup(rdev); | ||
224 | return r520_startup(rdev); | ||
225 | } | ||
226 | |||
227 | int r520_init(struct radeon_device *rdev) | ||
228 | { | ||
229 | int r; | ||
230 | |||
231 | /* Initialize scratch registers */ | ||
232 | radeon_scratch_init(rdev); | ||
233 | /* Initialize surface registers */ | ||
234 | radeon_surface_init(rdev); | ||
235 | /* TODO: disable VGA need to use VGA request */ | ||
236 | /* BIOS*/ | ||
237 | if (!radeon_get_bios(rdev)) { | ||
238 | if (ASIC_IS_AVIVO(rdev)) | ||
239 | return -EINVAL; | ||
240 | } | ||
241 | if (rdev->is_atom_bios) { | ||
242 | r = radeon_atombios_init(rdev); | ||
243 | if (r) | ||
244 | return r; | ||
245 | } else { | ||
246 | dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n"); | ||
247 | return -EINVAL; | ||
248 | } | ||
249 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
250 | if (radeon_gpu_reset(rdev)) { | ||
251 | dev_warn(rdev->dev, | ||
252 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
253 | RREG32(R_000E40_RBBM_STATUS), | ||
254 | RREG32(R_0007C0_CP_STAT)); | ||
255 | } | ||
256 | /* check if cards are posted or not */ | ||
257 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
258 | DRM_INFO("GPU not posted. posting now...\n"); | ||
259 | atom_asic_init(rdev->mode_info.atom_context); | ||
260 | } | ||
261 | /* Initialize clocks */ | ||
262 | radeon_get_clock_info(rdev->ddev); | ||
263 | /* Get vram informations */ | ||
264 | r520_vram_info(rdev); | ||
265 | /* Initialize memory controller (also test AGP) */ | ||
266 | r = r420_mc_init(rdev); | ||
267 | if (r) | ||
268 | return r; | ||
269 | rv515_debugfs(rdev); | ||
270 | /* Fence driver */ | ||
271 | r = radeon_fence_driver_init(rdev); | ||
272 | if (r) | ||
273 | return r; | ||
274 | r = radeon_irq_kms_init(rdev); | ||
275 | if (r) | ||
276 | return r; | ||
277 | /* Memory manager */ | ||
278 | r = radeon_object_init(rdev); | ||
279 | if (r) | ||
280 | return r; | ||
281 | r = rv370_pcie_gart_init(rdev); | ||
282 | if (r) | ||
283 | return r; | ||
284 | rv515_set_safe_registers(rdev); | ||
285 | rdev->accel_working = true; | ||
286 | r = r520_startup(rdev); | ||
287 | if (r) { | ||
288 | /* Somethings want wront with the accel init stop accel */ | ||
289 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
290 | rv515_suspend(rdev); | ||
291 | r100_cp_fini(rdev); | ||
292 | r100_wb_fini(rdev); | ||
293 | r100_ib_fini(rdev); | ||
294 | rv370_pcie_gart_fini(rdev); | ||
295 | radeon_agp_fini(rdev); | ||
296 | radeon_irq_kms_fini(rdev); | ||
297 | rdev->accel_working = false; | ||
298 | } | ||
299 | return 0; | ||
239 | } | 300 | } |
diff --git a/drivers/gpu/drm/radeon/r520d.h b/drivers/gpu/drm/radeon/r520d.h new file mode 100644 index 00000000000..61af61f644b --- /dev/null +++ b/drivers/gpu/drm/radeon/r520d.h | |||
@@ -0,0 +1,187 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __R520D_H__ | ||
29 | #define __R520D_H__ | ||
30 | |||
31 | /* Registers */ | ||
32 | #define R_0000F8_CONFIG_MEMSIZE 0x0000F8 | ||
33 | #define S_0000F8_CONFIG_MEMSIZE(x) (((x) & 0xFFFFFFFF) << 0) | ||
34 | #define G_0000F8_CONFIG_MEMSIZE(x) (((x) >> 0) & 0xFFFFFFFF) | ||
35 | #define C_0000F8_CONFIG_MEMSIZE 0x00000000 | ||
36 | #define R_000134_HDP_FB_LOCATION 0x000134 | ||
37 | #define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0) | ||
38 | #define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
39 | #define C_000134_HDP_FB_START 0xFFFF0000 | ||
40 | #define R_0007C0_CP_STAT 0x0007C0 | ||
41 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
42 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
43 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
44 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
45 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
46 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
47 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
48 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
49 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
50 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
51 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
52 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
53 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
54 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
55 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
56 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
57 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
58 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
59 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
60 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
61 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
62 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
63 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
64 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
65 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
66 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
67 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
68 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
69 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
70 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
71 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
72 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
73 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
74 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
75 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
76 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
77 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
78 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
79 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
80 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
81 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
82 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
83 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
84 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
85 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
86 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
87 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
88 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
89 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
90 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
91 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
92 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
93 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
94 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
95 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
96 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
97 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
98 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
99 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
100 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
101 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
102 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
103 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
104 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
105 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
106 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
107 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
108 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
109 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
110 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
111 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
112 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
113 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
114 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
115 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
116 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
117 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
118 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
119 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
120 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
121 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
122 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
123 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
124 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
125 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
126 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
127 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
128 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
129 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
130 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
131 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
132 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
133 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
134 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
135 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
136 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
137 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
138 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
139 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
140 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
141 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
142 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
143 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
144 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
145 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
146 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
147 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
148 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
149 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
150 | #define S_000E40_RBBM_HIBUSY(x) (((x) & 0x1) << 28) | ||
151 | #define G_000E40_RBBM_HIBUSY(x) (((x) >> 28) & 0x1) | ||
152 | #define C_000E40_RBBM_HIBUSY 0xEFFFFFFF | ||
153 | #define S_000E40_SKID_CFBUSY(x) (((x) & 0x1) << 29) | ||
154 | #define G_000E40_SKID_CFBUSY(x) (((x) >> 29) & 0x1) | ||
155 | #define C_000E40_SKID_CFBUSY 0xDFFFFFFF | ||
156 | #define S_000E40_VAP_VF_BUSY(x) (((x) & 0x1) << 30) | ||
157 | #define G_000E40_VAP_VF_BUSY(x) (((x) >> 30) & 0x1) | ||
158 | #define C_000E40_VAP_VF_BUSY 0xBFFFFFFF | ||
159 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
160 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
161 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
162 | |||
163 | |||
164 | #define R_000004_MC_FB_LOCATION 0x000004 | ||
165 | #define S_000004_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
166 | #define G_000004_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
167 | #define C_000004_MC_FB_START 0xFFFF0000 | ||
168 | #define S_000004_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
169 | #define G_000004_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
170 | #define C_000004_MC_FB_TOP 0x0000FFFF | ||
171 | #define R_000005_MC_AGP_LOCATION 0x000005 | ||
172 | #define S_000005_MC_AGP_START(x) (((x) & 0xFFFF) << 0) | ||
173 | #define G_000005_MC_AGP_START(x) (((x) >> 0) & 0xFFFF) | ||
174 | #define C_000005_MC_AGP_START 0xFFFF0000 | ||
175 | #define S_000005_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16) | ||
176 | #define G_000005_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF) | ||
177 | #define C_000005_MC_AGP_TOP 0x0000FFFF | ||
178 | #define R_000006_AGP_BASE 0x000006 | ||
179 | #define S_000006_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | ||
180 | #define G_000006_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | ||
181 | #define C_000006_AGP_BASE_ADDR 0x00000000 | ||
182 | #define R_000007_AGP_BASE_2 0x000007 | ||
183 | #define S_000007_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0) | ||
184 | #define G_000007_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF) | ||
185 | #define C_000007_AGP_BASE_ADDR_2 0xFFFFFFF0 | ||
186 | |||
187 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index eab31c1d6df..609719490ec 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -33,8 +33,8 @@ | |||
33 | #include "radeon.h" | 33 | #include "radeon.h" |
34 | #include "radeon_mode.h" | 34 | #include "radeon_mode.h" |
35 | #include "r600d.h" | 35 | #include "r600d.h" |
36 | #include "avivod.h" | ||
37 | #include "atom.h" | 36 | #include "atom.h" |
37 | #include "avivod.h" | ||
38 | 38 | ||
39 | #define PFP_UCODE_SIZE 576 | 39 | #define PFP_UCODE_SIZE 576 |
40 | #define PM4_UCODE_SIZE 1792 | 40 | #define PM4_UCODE_SIZE 1792 |
@@ -65,16 +65,11 @@ MODULE_FIRMWARE("radeon/RV710_me.bin"); | |||
65 | 65 | ||
66 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); | 66 | int r600_debugfs_mc_info_init(struct radeon_device *rdev); |
67 | 67 | ||
68 | /* This files gather functions specifics to: | 68 | /* r600,rv610,rv630,rv620,rv635,rv670 */ |
69 | * r600,rv610,rv630,rv620,rv635,rv670 | ||
70 | * | ||
71 | * Some of these functions might be used by newer ASICs. | ||
72 | */ | ||
73 | int r600_mc_wait_for_idle(struct radeon_device *rdev); | 69 | int r600_mc_wait_for_idle(struct radeon_device *rdev); |
74 | void r600_gpu_init(struct radeon_device *rdev); | 70 | void r600_gpu_init(struct radeon_device *rdev); |
75 | void r600_fini(struct radeon_device *rdev); | 71 | void r600_fini(struct radeon_device *rdev); |
76 | 72 | ||
77 | |||
78 | /* | 73 | /* |
79 | * R600 PCIE GART | 74 | * R600 PCIE GART |
80 | */ | 75 | */ |
@@ -168,7 +163,7 @@ int r600_pcie_gart_enable(struct radeon_device *rdev) | |||
168 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | 163 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); |
169 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | 164 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); |
170 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); | 165 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); |
171 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 166 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); |
172 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); | 167 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); |
173 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | | 168 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | |
174 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | 169 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); |
@@ -225,6 +220,40 @@ void r600_pcie_gart_fini(struct radeon_device *rdev) | |||
225 | radeon_gart_fini(rdev); | 220 | radeon_gart_fini(rdev); |
226 | } | 221 | } |
227 | 222 | ||
223 | void r600_agp_enable(struct radeon_device *rdev) | ||
224 | { | ||
225 | u32 tmp; | ||
226 | int i; | ||
227 | |||
228 | /* Setup L2 cache */ | ||
229 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | | ||
230 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | | ||
231 | EFFECTIVE_L2_QUEUE_SIZE(7)); | ||
232 | WREG32(VM_L2_CNTL2, 0); | ||
233 | WREG32(VM_L2_CNTL3, BANK_SELECT_0(0) | BANK_SELECT_1(1)); | ||
234 | /* Setup TLB control */ | ||
235 | tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | | ||
236 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | ||
237 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5) | | ||
238 | ENABLE_WAIT_L2_QUERY; | ||
239 | WREG32(MC_VM_L1_TLB_MCB_RD_SYS_CNTL, tmp); | ||
240 | WREG32(MC_VM_L1_TLB_MCB_WR_SYS_CNTL, tmp); | ||
241 | WREG32(MC_VM_L1_TLB_MCB_RD_HDP_CNTL, tmp | ENABLE_L1_STRICT_ORDERING); | ||
242 | WREG32(MC_VM_L1_TLB_MCB_WR_HDP_CNTL, tmp); | ||
243 | WREG32(MC_VM_L1_TLB_MCD_RD_A_CNTL, tmp); | ||
244 | WREG32(MC_VM_L1_TLB_MCD_WR_A_CNTL, tmp); | ||
245 | WREG32(MC_VM_L1_TLB_MCD_RD_B_CNTL, tmp); | ||
246 | WREG32(MC_VM_L1_TLB_MCD_WR_B_CNTL, tmp); | ||
247 | WREG32(MC_VM_L1_TLB_MCB_RD_GFX_CNTL, tmp); | ||
248 | WREG32(MC_VM_L1_TLB_MCB_WR_GFX_CNTL, tmp); | ||
249 | WREG32(MC_VM_L1_TLB_MCB_RD_PDMA_CNTL, tmp); | ||
250 | WREG32(MC_VM_L1_TLB_MCB_WR_PDMA_CNTL, tmp); | ||
251 | WREG32(MC_VM_L1_TLB_MCB_RD_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | ||
252 | WREG32(MC_VM_L1_TLB_MCB_WR_SEM_CNTL, tmp | ENABLE_SEMAPHORE_MODE); | ||
253 | for (i = 0; i < 7; i++) | ||
254 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | ||
255 | } | ||
256 | |||
228 | int r600_mc_wait_for_idle(struct radeon_device *rdev) | 257 | int r600_mc_wait_for_idle(struct radeon_device *rdev) |
229 | { | 258 | { |
230 | unsigned i; | 259 | unsigned i; |
@@ -240,14 +269,9 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev) | |||
240 | return -1; | 269 | return -1; |
241 | } | 270 | } |
242 | 271 | ||
243 | static void r600_mc_resume(struct radeon_device *rdev) | 272 | static void r600_mc_program(struct radeon_device *rdev) |
244 | { | 273 | { |
245 | u32 d1vga_control, d2vga_control; | 274 | struct rv515_mc_save save; |
246 | u32 vga_render_control, vga_hdp_control; | ||
247 | u32 d1crtc_control, d2crtc_control; | ||
248 | u32 new_d1grph_primary, new_d1grph_secondary; | ||
249 | u32 new_d2grph_primary, new_d2grph_secondary; | ||
250 | u64 old_vram_start; | ||
251 | u32 tmp; | 275 | u32 tmp; |
252 | int i, j; | 276 | int i, j; |
253 | 277 | ||
@@ -261,88 +285,54 @@ static void r600_mc_resume(struct radeon_device *rdev) | |||
261 | } | 285 | } |
262 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); | 286 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); |
263 | 287 | ||
264 | d1vga_control = RREG32(D1VGA_CONTROL); | 288 | rv515_mc_stop(rdev, &save); |
265 | d2vga_control = RREG32(D2VGA_CONTROL); | ||
266 | vga_render_control = RREG32(VGA_RENDER_CONTROL); | ||
267 | vga_hdp_control = RREG32(VGA_HDP_CONTROL); | ||
268 | d1crtc_control = RREG32(D1CRTC_CONTROL); | ||
269 | d2crtc_control = RREG32(D2CRTC_CONTROL); | ||
270 | old_vram_start = (u64)(RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; | ||
271 | new_d1grph_primary = RREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS); | ||
272 | new_d1grph_secondary = RREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS); | ||
273 | new_d1grph_primary += rdev->mc.vram_start - old_vram_start; | ||
274 | new_d1grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
275 | new_d2grph_primary = RREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS); | ||
276 | new_d2grph_secondary = RREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS); | ||
277 | new_d2grph_primary += rdev->mc.vram_start - old_vram_start; | ||
278 | new_d2grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
279 | |||
280 | /* Stop all video */ | ||
281 | WREG32(D1VGA_CONTROL, 0); | ||
282 | WREG32(D2VGA_CONTROL, 0); | ||
283 | WREG32(VGA_RENDER_CONTROL, 0); | ||
284 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
285 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
286 | WREG32(D1CRTC_CONTROL, 0); | ||
287 | WREG32(D2CRTC_CONTROL, 0); | ||
288 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
289 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
290 | |||
291 | mdelay(1); | ||
292 | if (r600_mc_wait_for_idle(rdev)) { | 289 | if (r600_mc_wait_for_idle(rdev)) { |
293 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 290 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
294 | } | 291 | } |
295 | 292 | /* Lockout access through VGA aperture (doesn't exist before R600) */ | |
296 | /* Lockout access through VGA aperture*/ | ||
297 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 293 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
298 | |||
299 | /* Update configuration */ | 294 | /* Update configuration */ |
300 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 295 | if (rdev->flags & RADEON_IS_AGP) { |
301 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 296 | if (rdev->mc.vram_start < rdev->mc.gtt_start) { |
297 | /* VRAM before AGP */ | ||
298 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
299 | rdev->mc.vram_start >> 12); | ||
300 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
301 | rdev->mc.gtt_end >> 12); | ||
302 | } else { | ||
303 | /* VRAM after AGP */ | ||
304 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
305 | rdev->mc.gtt_start >> 12); | ||
306 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
307 | rdev->mc.vram_end >> 12); | ||
308 | } | ||
309 | } else { | ||
310 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | ||
311 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.vram_end >> 12); | ||
312 | } | ||
302 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 313 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
303 | tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16; | 314 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
304 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 315 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
305 | WREG32(MC_VM_FB_LOCATION, tmp); | 316 | WREG32(MC_VM_FB_LOCATION, tmp); |
306 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 317 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
307 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 318 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
308 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 319 | WREG32(HDP_NONSURFACE_SIZE, rdev->mc.mc_vram_size | 0x3FF); |
309 | if (rdev->flags & RADEON_IS_AGP) { | 320 | if (rdev->flags & RADEON_IS_AGP) { |
310 | WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16); | 321 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); |
311 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 322 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); |
312 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); | 323 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); |
313 | } else { | 324 | } else { |
314 | WREG32(MC_VM_AGP_BASE, 0); | 325 | WREG32(MC_VM_AGP_BASE, 0); |
315 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); | 326 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); |
316 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); | 327 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); |
317 | } | 328 | } |
318 | WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS, new_d1grph_primary); | ||
319 | WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS, new_d1grph_secondary); | ||
320 | WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS, new_d2grph_primary); | ||
321 | WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS, new_d2grph_secondary); | ||
322 | WREG32(VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); | ||
323 | |||
324 | /* Unlock host access */ | ||
325 | WREG32(VGA_HDP_CONTROL, vga_hdp_control); | ||
326 | |||
327 | mdelay(1); | ||
328 | if (r600_mc_wait_for_idle(rdev)) { | 329 | if (r600_mc_wait_for_idle(rdev)) { |
329 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 330 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
330 | } | 331 | } |
331 | 332 | rv515_mc_resume(rdev, &save); | |
332 | /* Restore video state */ | ||
333 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
334 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
335 | WREG32(D1CRTC_CONTROL, d1crtc_control); | ||
336 | WREG32(D2CRTC_CONTROL, d2crtc_control); | ||
337 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
338 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
339 | WREG32(D1VGA_CONTROL, d1vga_control); | ||
340 | WREG32(D2VGA_CONTROL, d2vga_control); | ||
341 | WREG32(VGA_RENDER_CONTROL, vga_render_control); | ||
342 | |||
343 | /* we need to own VRAM, so turn off the VGA renderer here | 333 | /* we need to own VRAM, so turn off the VGA renderer here |
344 | * to stop it overwriting our objects */ | 334 | * to stop it overwriting our objects */ |
345 | radeon_avivo_vga_render_disable(rdev); | 335 | rv515_vga_render_disable(rdev); |
346 | } | 336 | } |
347 | 337 | ||
348 | int r600_mc_init(struct radeon_device *rdev) | 338 | int r600_mc_init(struct radeon_device *rdev) |
@@ -380,6 +370,13 @@ int r600_mc_init(struct radeon_device *rdev) | |||
380 | /* Setup GPU memory space */ | 370 | /* Setup GPU memory space */ |
381 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); | 371 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); |
382 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); | 372 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); |
373 | |||
374 | if (rdev->mc.mc_vram_size > rdev->mc.aper_size) | ||
375 | rdev->mc.mc_vram_size = rdev->mc.aper_size; | ||
376 | |||
377 | if (rdev->mc.real_vram_size > rdev->mc.aper_size) | ||
378 | rdev->mc.real_vram_size = rdev->mc.aper_size; | ||
379 | |||
383 | if (rdev->flags & RADEON_IS_AGP) { | 380 | if (rdev->flags & RADEON_IS_AGP) { |
384 | r = radeon_agp_init(rdev); | 381 | r = radeon_agp_init(rdev); |
385 | if (r) | 382 | if (r) |
@@ -438,9 +435,9 @@ int r600_mc_init(struct radeon_device *rdev) | |||
438 | } | 435 | } |
439 | } | 436 | } |
440 | rdev->mc.vram_start = rdev->mc.vram_location; | 437 | rdev->mc.vram_start = rdev->mc.vram_location; |
441 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 438 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
442 | rdev->mc.gtt_start = rdev->mc.gtt_location; | 439 | rdev->mc.gtt_start = rdev->mc.gtt_location; |
443 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size; | 440 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; |
444 | /* FIXME: we should enforce default clock in case GPU is not in | 441 | /* FIXME: we should enforce default clock in case GPU is not in |
445 | * default setup | 442 | * default setup |
446 | */ | 443 | */ |
@@ -456,6 +453,7 @@ int r600_mc_init(struct radeon_device *rdev) | |||
456 | */ | 453 | */ |
457 | int r600_gpu_soft_reset(struct radeon_device *rdev) | 454 | int r600_gpu_soft_reset(struct radeon_device *rdev) |
458 | { | 455 | { |
456 | struct rv515_mc_save save; | ||
459 | u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) | | 457 | u32 grbm_busy_mask = S_008010_VC_BUSY(1) | S_008010_VGT_BUSY_NO_DMA(1) | |
460 | S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) | | 458 | S_008010_VGT_BUSY(1) | S_008010_TA03_BUSY(1) | |
461 | S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) | | 459 | S_008010_TC_BUSY(1) | S_008010_SX_BUSY(1) | |
@@ -473,13 +471,25 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
473 | S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) | | 471 | S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) | |
474 | S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); | 472 | S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1); |
475 | u32 srbm_reset = 0; | 473 | u32 srbm_reset = 0; |
474 | u32 tmp; | ||
476 | 475 | ||
476 | dev_info(rdev->dev, "GPU softreset \n"); | ||
477 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | ||
478 | RREG32(R_008010_GRBM_STATUS)); | ||
479 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | ||
480 | RREG32(R_008014_GRBM_STATUS2)); | ||
481 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | ||
482 | RREG32(R_000E50_SRBM_STATUS)); | ||
483 | rv515_mc_stop(rdev, &save); | ||
484 | if (r600_mc_wait_for_idle(rdev)) { | ||
485 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
486 | } | ||
477 | /* Disable CP parsing/prefetching */ | 487 | /* Disable CP parsing/prefetching */ |
478 | WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(0xff)); | 488 | WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(0xff)); |
479 | /* Check if any of the rendering block is busy and reset it */ | 489 | /* Check if any of the rendering block is busy and reset it */ |
480 | if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) || | 490 | if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) || |
481 | (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) { | 491 | (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) { |
482 | WREG32(R_008020_GRBM_SOFT_RESET, S_008020_SOFT_RESET_CR(1) | | 492 | tmp = S_008020_SOFT_RESET_CR(1) | |
483 | S_008020_SOFT_RESET_DB(1) | | 493 | S_008020_SOFT_RESET_DB(1) | |
484 | S_008020_SOFT_RESET_CB(1) | | 494 | S_008020_SOFT_RESET_CB(1) | |
485 | S_008020_SOFT_RESET_PA(1) | | 495 | S_008020_SOFT_RESET_PA(1) | |
@@ -491,14 +501,18 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
491 | S_008020_SOFT_RESET_TC(1) | | 501 | S_008020_SOFT_RESET_TC(1) | |
492 | S_008020_SOFT_RESET_TA(1) | | 502 | S_008020_SOFT_RESET_TA(1) | |
493 | S_008020_SOFT_RESET_VC(1) | | 503 | S_008020_SOFT_RESET_VC(1) | |
494 | S_008020_SOFT_RESET_VGT(1)); | 504 | S_008020_SOFT_RESET_VGT(1); |
505 | dev_info(rdev->dev, " R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); | ||
506 | WREG32(R_008020_GRBM_SOFT_RESET, tmp); | ||
495 | (void)RREG32(R_008020_GRBM_SOFT_RESET); | 507 | (void)RREG32(R_008020_GRBM_SOFT_RESET); |
496 | udelay(50); | 508 | udelay(50); |
497 | WREG32(R_008020_GRBM_SOFT_RESET, 0); | 509 | WREG32(R_008020_GRBM_SOFT_RESET, 0); |
498 | (void)RREG32(R_008020_GRBM_SOFT_RESET); | 510 | (void)RREG32(R_008020_GRBM_SOFT_RESET); |
499 | } | 511 | } |
500 | /* Reset CP (we always reset CP) */ | 512 | /* Reset CP (we always reset CP) */ |
501 | WREG32(R_008020_GRBM_SOFT_RESET, S_008020_SOFT_RESET_CP(1)); | 513 | tmp = S_008020_SOFT_RESET_CP(1); |
514 | dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp); | ||
515 | WREG32(R_008020_GRBM_SOFT_RESET, tmp); | ||
502 | (void)RREG32(R_008020_GRBM_SOFT_RESET); | 516 | (void)RREG32(R_008020_GRBM_SOFT_RESET); |
503 | udelay(50); | 517 | udelay(50); |
504 | WREG32(R_008020_GRBM_SOFT_RESET, 0); | 518 | WREG32(R_008020_GRBM_SOFT_RESET, 0); |
@@ -526,6 +540,14 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
526 | srbm_reset |= S_000E60_SOFT_RESET_RLC(1); | 540 | srbm_reset |= S_000E60_SOFT_RESET_RLC(1); |
527 | if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS))) | 541 | if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS))) |
528 | srbm_reset |= S_000E60_SOFT_RESET_SEM(1); | 542 | srbm_reset |= S_000E60_SOFT_RESET_SEM(1); |
543 | if (G_000E50_BIF_BUSY(RREG32(R_000E50_SRBM_STATUS))) | ||
544 | srbm_reset |= S_000E60_SOFT_RESET_BIF(1); | ||
545 | dev_info(rdev->dev, " R_000E60_SRBM_SOFT_RESET=0x%08X\n", srbm_reset); | ||
546 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); | ||
547 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | ||
548 | udelay(50); | ||
549 | WREG32(R_000E60_SRBM_SOFT_RESET, 0); | ||
550 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | ||
529 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); | 551 | WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset); |
530 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | 552 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); |
531 | udelay(50); | 553 | udelay(50); |
@@ -533,6 +555,17 @@ int r600_gpu_soft_reset(struct radeon_device *rdev) | |||
533 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); | 555 | (void)RREG32(R_000E60_SRBM_SOFT_RESET); |
534 | /* Wait a little for things to settle down */ | 556 | /* Wait a little for things to settle down */ |
535 | udelay(50); | 557 | udelay(50); |
558 | dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n", | ||
559 | RREG32(R_008010_GRBM_STATUS)); | ||
560 | dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n", | ||
561 | RREG32(R_008014_GRBM_STATUS2)); | ||
562 | dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n", | ||
563 | RREG32(R_000E50_SRBM_STATUS)); | ||
564 | /* After reset we need to reinit the asic as GPU often endup in an | ||
565 | * incoherent state. | ||
566 | */ | ||
567 | atom_asic_init(rdev->mode_info.atom_context); | ||
568 | rv515_mc_resume(rdev, &save); | ||
536 | return 0; | 569 | return 0; |
537 | } | 570 | } |
538 | 571 | ||
@@ -1343,32 +1376,47 @@ int r600_ring_test(struct radeon_device *rdev) | |||
1343 | return r; | 1376 | return r; |
1344 | } | 1377 | } |
1345 | 1378 | ||
1346 | /* | 1379 | void r600_wb_disable(struct radeon_device *rdev) |
1347 | * Writeback | 1380 | { |
1348 | */ | 1381 | WREG32(SCRATCH_UMSK, 0); |
1349 | int r600_wb_init(struct radeon_device *rdev) | 1382 | if (rdev->wb.wb_obj) { |
1383 | radeon_object_kunmap(rdev->wb.wb_obj); | ||
1384 | radeon_object_unpin(rdev->wb.wb_obj); | ||
1385 | } | ||
1386 | } | ||
1387 | |||
1388 | void r600_wb_fini(struct radeon_device *rdev) | ||
1389 | { | ||
1390 | r600_wb_disable(rdev); | ||
1391 | if (rdev->wb.wb_obj) { | ||
1392 | radeon_object_unref(&rdev->wb.wb_obj); | ||
1393 | rdev->wb.wb = NULL; | ||
1394 | rdev->wb.wb_obj = NULL; | ||
1395 | } | ||
1396 | } | ||
1397 | |||
1398 | int r600_wb_enable(struct radeon_device *rdev) | ||
1350 | { | 1399 | { |
1351 | int r; | 1400 | int r; |
1352 | 1401 | ||
1353 | if (rdev->wb.wb_obj == NULL) { | 1402 | if (rdev->wb.wb_obj == NULL) { |
1354 | r = radeon_object_create(rdev, NULL, 4096, | 1403 | r = radeon_object_create(rdev, NULL, 4096, true, |
1355 | true, | 1404 | RADEON_GEM_DOMAIN_GTT, false, &rdev->wb.wb_obj); |
1356 | RADEON_GEM_DOMAIN_GTT, | ||
1357 | false, &rdev->wb.wb_obj); | ||
1358 | if (r) { | 1405 | if (r) { |
1359 | DRM_ERROR("radeon: failed to create WB buffer (%d).\n", r); | 1406 | dev_warn(rdev->dev, "failed to create WB buffer (%d).\n", r); |
1360 | return r; | 1407 | return r; |
1361 | } | 1408 | } |
1362 | r = radeon_object_pin(rdev->wb.wb_obj, | 1409 | r = radeon_object_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT, |
1363 | RADEON_GEM_DOMAIN_GTT, | 1410 | &rdev->wb.gpu_addr); |
1364 | &rdev->wb.gpu_addr); | ||
1365 | if (r) { | 1411 | if (r) { |
1366 | DRM_ERROR("radeon: failed to pin WB buffer (%d).\n", r); | 1412 | dev_warn(rdev->dev, "failed to pin WB buffer (%d).\n", r); |
1413 | r600_wb_fini(rdev); | ||
1367 | return r; | 1414 | return r; |
1368 | } | 1415 | } |
1369 | r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); | 1416 | r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb); |
1370 | if (r) { | 1417 | if (r) { |
1371 | DRM_ERROR("radeon: failed to map WB buffer (%d).\n", r); | 1418 | dev_warn(rdev->dev, "failed to map WB buffer (%d).\n", r); |
1419 | r600_wb_fini(rdev); | ||
1372 | return r; | 1420 | return r; |
1373 | } | 1421 | } |
1374 | } | 1422 | } |
@@ -1379,21 +1427,6 @@ int r600_wb_init(struct radeon_device *rdev) | |||
1379 | return 0; | 1427 | return 0; |
1380 | } | 1428 | } |
1381 | 1429 | ||
1382 | void r600_wb_fini(struct radeon_device *rdev) | ||
1383 | { | ||
1384 | if (rdev->wb.wb_obj) { | ||
1385 | radeon_object_kunmap(rdev->wb.wb_obj); | ||
1386 | radeon_object_unpin(rdev->wb.wb_obj); | ||
1387 | radeon_object_unref(&rdev->wb.wb_obj); | ||
1388 | rdev->wb.wb = NULL; | ||
1389 | rdev->wb.wb_obj = NULL; | ||
1390 | } | ||
1391 | } | ||
1392 | |||
1393 | |||
1394 | /* | ||
1395 | * CS | ||
1396 | */ | ||
1397 | void r600_fence_ring_emit(struct radeon_device *rdev, | 1430 | void r600_fence_ring_emit(struct radeon_device *rdev, |
1398 | struct radeon_fence *fence) | 1431 | struct radeon_fence *fence) |
1399 | { | 1432 | { |
@@ -1470,11 +1503,14 @@ int r600_startup(struct radeon_device *rdev) | |||
1470 | { | 1503 | { |
1471 | int r; | 1504 | int r; |
1472 | 1505 | ||
1473 | r600_gpu_reset(rdev); | 1506 | r600_mc_program(rdev); |
1474 | r600_mc_resume(rdev); | 1507 | if (rdev->flags & RADEON_IS_AGP) { |
1475 | r = r600_pcie_gart_enable(rdev); | 1508 | r600_agp_enable(rdev); |
1476 | if (r) | 1509 | } else { |
1477 | return r; | 1510 | r = r600_pcie_gart_enable(rdev); |
1511 | if (r) | ||
1512 | return r; | ||
1513 | } | ||
1478 | r600_gpu_init(rdev); | 1514 | r600_gpu_init(rdev); |
1479 | 1515 | ||
1480 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | 1516 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, |
@@ -1493,9 +1529,8 @@ int r600_startup(struct radeon_device *rdev) | |||
1493 | r = r600_cp_resume(rdev); | 1529 | r = r600_cp_resume(rdev); |
1494 | if (r) | 1530 | if (r) |
1495 | return r; | 1531 | return r; |
1496 | r = r600_wb_init(rdev); | 1532 | /* write back buffer are not vital so don't worry about failure */ |
1497 | if (r) | 1533 | r600_wb_enable(rdev); |
1498 | return r; | ||
1499 | return 0; | 1534 | return 0; |
1500 | } | 1535 | } |
1501 | 1536 | ||
@@ -1517,15 +1552,12 @@ int r600_resume(struct radeon_device *rdev) | |||
1517 | { | 1552 | { |
1518 | int r; | 1553 | int r; |
1519 | 1554 | ||
1520 | if (radeon_gpu_reset(rdev)) { | 1555 | /* Do not reset GPU before posting, on r600 hw unlike on r500 hw, |
1521 | /* FIXME: what do we want to do here ? */ | 1556 | * posting will perform necessary task to bring back GPU into good |
1522 | } | 1557 | * shape. |
1558 | */ | ||
1523 | /* post card */ | 1559 | /* post card */ |
1524 | if (rdev->is_atom_bios) { | 1560 | atom_asic_init(rdev->mode_info.atom_context); |
1525 | atom_asic_init(rdev->mode_info.atom_context); | ||
1526 | } else { | ||
1527 | radeon_combios_asic_init(rdev->ddev); | ||
1528 | } | ||
1529 | /* Initialize clocks */ | 1561 | /* Initialize clocks */ |
1530 | r = radeon_clocks_init(rdev); | 1562 | r = radeon_clocks_init(rdev); |
1531 | if (r) { | 1563 | if (r) { |
@@ -1538,7 +1570,7 @@ int r600_resume(struct radeon_device *rdev) | |||
1538 | return r; | 1570 | return r; |
1539 | } | 1571 | } |
1540 | 1572 | ||
1541 | r = radeon_ib_test(rdev); | 1573 | r = r600_ib_test(rdev); |
1542 | if (r) { | 1574 | if (r) { |
1543 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1575 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
1544 | return r; | 1576 | return r; |
@@ -1546,13 +1578,12 @@ int r600_resume(struct radeon_device *rdev) | |||
1546 | return r; | 1578 | return r; |
1547 | } | 1579 | } |
1548 | 1580 | ||
1549 | |||
1550 | int r600_suspend(struct radeon_device *rdev) | 1581 | int r600_suspend(struct radeon_device *rdev) |
1551 | { | 1582 | { |
1552 | /* FIXME: we should wait for ring to be empty */ | 1583 | /* FIXME: we should wait for ring to be empty */ |
1553 | r600_cp_stop(rdev); | 1584 | r600_cp_stop(rdev); |
1554 | rdev->cp.ready = false; | 1585 | rdev->cp.ready = false; |
1555 | 1586 | r600_wb_disable(rdev); | |
1556 | r600_pcie_gart_disable(rdev); | 1587 | r600_pcie_gart_disable(rdev); |
1557 | /* unpin shaders bo */ | 1588 | /* unpin shaders bo */ |
1558 | radeon_object_unpin(rdev->r600_blit.shader_obj); | 1589 | radeon_object_unpin(rdev->r600_blit.shader_obj); |
@@ -1569,7 +1600,6 @@ int r600_init(struct radeon_device *rdev) | |||
1569 | { | 1600 | { |
1570 | int r; | 1601 | int r; |
1571 | 1602 | ||
1572 | rdev->new_init_path = true; | ||
1573 | r = radeon_dummy_page_init(rdev); | 1603 | r = radeon_dummy_page_init(rdev); |
1574 | if (r) | 1604 | if (r) |
1575 | return r; | 1605 | return r; |
@@ -1586,8 +1616,10 @@ int r600_init(struct radeon_device *rdev) | |||
1586 | return -EINVAL; | 1616 | return -EINVAL; |
1587 | } | 1617 | } |
1588 | /* Must be an ATOMBIOS */ | 1618 | /* Must be an ATOMBIOS */ |
1589 | if (!rdev->is_atom_bios) | 1619 | if (!rdev->is_atom_bios) { |
1620 | dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); | ||
1590 | return -EINVAL; | 1621 | return -EINVAL; |
1622 | } | ||
1591 | r = radeon_atombios_init(rdev); | 1623 | r = radeon_atombios_init(rdev); |
1592 | if (r) | 1624 | if (r) |
1593 | return r; | 1625 | return r; |
@@ -1609,15 +1641,8 @@ int r600_init(struct radeon_device *rdev) | |||
1609 | if (r) | 1641 | if (r) |
1610 | return r; | 1642 | return r; |
1611 | r = r600_mc_init(rdev); | 1643 | r = r600_mc_init(rdev); |
1612 | if (r) { | 1644 | if (r) |
1613 | if (rdev->flags & RADEON_IS_AGP) { | ||
1614 | /* Retry with disabling AGP */ | ||
1615 | r600_fini(rdev); | ||
1616 | rdev->flags &= ~RADEON_IS_AGP; | ||
1617 | return r600_init(rdev); | ||
1618 | } | ||
1619 | return r; | 1645 | return r; |
1620 | } | ||
1621 | /* Memory manager */ | 1646 | /* Memory manager */ |
1622 | r = radeon_object_init(rdev); | 1647 | r = radeon_object_init(rdev); |
1623 | if (r) | 1648 | if (r) |
@@ -1646,12 +1671,10 @@ int r600_init(struct radeon_device *rdev) | |||
1646 | 1671 | ||
1647 | r = r600_startup(rdev); | 1672 | r = r600_startup(rdev); |
1648 | if (r) { | 1673 | if (r) { |
1649 | if (rdev->flags & RADEON_IS_AGP) { | 1674 | r600_suspend(rdev); |
1650 | /* Retry with disabling AGP */ | 1675 | r600_wb_fini(rdev); |
1651 | r600_fini(rdev); | 1676 | radeon_ring_fini(rdev); |
1652 | rdev->flags &= ~RADEON_IS_AGP; | 1677 | r600_pcie_gart_fini(rdev); |
1653 | return r600_init(rdev); | ||
1654 | } | ||
1655 | rdev->accel_working = false; | 1678 | rdev->accel_working = false; |
1656 | } | 1679 | } |
1657 | if (rdev->accel_working) { | 1680 | if (rdev->accel_working) { |
@@ -1660,7 +1683,7 @@ int r600_init(struct radeon_device *rdev) | |||
1660 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); | 1683 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); |
1661 | rdev->accel_working = false; | 1684 | rdev->accel_working = false; |
1662 | } | 1685 | } |
1663 | r = radeon_ib_test(rdev); | 1686 | r = r600_ib_test(rdev); |
1664 | if (r) { | 1687 | if (r) { |
1665 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1688 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
1666 | rdev->accel_working = false; | 1689 | rdev->accel_working = false; |
@@ -1676,19 +1699,15 @@ void r600_fini(struct radeon_device *rdev) | |||
1676 | 1699 | ||
1677 | r600_blit_fini(rdev); | 1700 | r600_blit_fini(rdev); |
1678 | radeon_ring_fini(rdev); | 1701 | radeon_ring_fini(rdev); |
1702 | r600_wb_fini(rdev); | ||
1679 | r600_pcie_gart_fini(rdev); | 1703 | r600_pcie_gart_fini(rdev); |
1680 | radeon_gem_fini(rdev); | 1704 | radeon_gem_fini(rdev); |
1681 | radeon_fence_driver_fini(rdev); | 1705 | radeon_fence_driver_fini(rdev); |
1682 | radeon_clocks_fini(rdev); | 1706 | radeon_clocks_fini(rdev); |
1683 | #if __OS_HAS_AGP | ||
1684 | if (rdev->flags & RADEON_IS_AGP) | 1707 | if (rdev->flags & RADEON_IS_AGP) |
1685 | radeon_agp_fini(rdev); | 1708 | radeon_agp_fini(rdev); |
1686 | #endif | ||
1687 | radeon_object_fini(rdev); | 1709 | radeon_object_fini(rdev); |
1688 | if (rdev->is_atom_bios) | 1710 | radeon_atombios_fini(rdev); |
1689 | radeon_atombios_fini(rdev); | ||
1690 | else | ||
1691 | radeon_combios_fini(rdev); | ||
1692 | kfree(rdev->bios); | 1711 | kfree(rdev->bios); |
1693 | rdev->bios = NULL; | 1712 | rdev->bios = NULL; |
1694 | radeon_dummy_page_fini(rdev); | 1713 | radeon_dummy_page_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/r600_blit.c b/drivers/gpu/drm/radeon/r600_blit.c index d988eece018..dec50108160 100644 --- a/drivers/gpu/drm/radeon/r600_blit.c +++ b/drivers/gpu/drm/radeon/r600_blit.c | |||
@@ -582,8 +582,6 @@ r600_blit_copy(struct drm_device *dev, | |||
582 | u64 vb_addr; | 582 | u64 vb_addr; |
583 | u32 *vb; | 583 | u32 *vb; |
584 | 584 | ||
585 | vb = r600_nomm_get_vb_ptr(dev); | ||
586 | |||
587 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { | 585 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { |
588 | max_bytes = 8192; | 586 | max_bytes = 8192; |
589 | 587 | ||
@@ -619,8 +617,8 @@ r600_blit_copy(struct drm_device *dev, | |||
619 | if (!dev_priv->blit_vb) | 617 | if (!dev_priv->blit_vb) |
620 | return; | 618 | return; |
621 | set_shaders(dev); | 619 | set_shaders(dev); |
622 | vb = r600_nomm_get_vb_ptr(dev); | ||
623 | } | 620 | } |
621 | vb = r600_nomm_get_vb_ptr(dev); | ||
624 | 622 | ||
625 | vb[0] = i2f(dst_x); | 623 | vb[0] = i2f(dst_x); |
626 | vb[1] = 0; | 624 | vb[1] = 0; |
@@ -708,8 +706,8 @@ r600_blit_copy(struct drm_device *dev, | |||
708 | return; | 706 | return; |
709 | 707 | ||
710 | set_shaders(dev); | 708 | set_shaders(dev); |
711 | vb = r600_nomm_get_vb_ptr(dev); | ||
712 | } | 709 | } |
710 | vb = r600_nomm_get_vb_ptr(dev); | ||
713 | 711 | ||
714 | vb[0] = i2f(dst_x / 4); | 712 | vb[0] = i2f(dst_x / 4); |
715 | vb[1] = 0; | 713 | vb[1] = 0; |
@@ -777,8 +775,6 @@ r600_blit_swap(struct drm_device *dev, | |||
777 | u64 vb_addr; | 775 | u64 vb_addr; |
778 | u32 *vb; | 776 | u32 *vb; |
779 | 777 | ||
780 | vb = r600_nomm_get_vb_ptr(dev); | ||
781 | |||
782 | if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) { | 778 | if ((dev_priv->blit_vb->used + 48) > dev_priv->blit_vb->total) { |
783 | 779 | ||
784 | r600_nomm_put_vb(dev); | 780 | r600_nomm_put_vb(dev); |
@@ -787,8 +783,8 @@ r600_blit_swap(struct drm_device *dev, | |||
787 | return; | 783 | return; |
788 | 784 | ||
789 | set_shaders(dev); | 785 | set_shaders(dev); |
790 | vb = r600_nomm_get_vb_ptr(dev); | ||
791 | } | 786 | } |
787 | vb = r600_nomm_get_vb_ptr(dev); | ||
792 | 788 | ||
793 | if (cpp == 4) { | 789 | if (cpp == 4) { |
794 | cb_format = COLOR_8_8_8_8; | 790 | cb_format = COLOR_8_8_8_8; |
diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c b/drivers/gpu/drm/radeon/r600_blit_kms.c index acae33e2ad5..93108bb31d1 100644 --- a/drivers/gpu/drm/radeon/r600_blit_kms.c +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c | |||
@@ -610,7 +610,6 @@ void r600_kms_blit_copy(struct radeon_device *rdev, | |||
610 | 610 | ||
611 | DRM_DEBUG("emitting copy %16llx %16llx %d %d\n", src_gpu_addr, dst_gpu_addr, | 611 | DRM_DEBUG("emitting copy %16llx %16llx %d %d\n", src_gpu_addr, dst_gpu_addr, |
612 | size_bytes, rdev->r600_blit.vb_used); | 612 | size_bytes, rdev->r600_blit.vb_used); |
613 | vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used); | ||
614 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { | 613 | if ((size_bytes & 3) || (src_gpu_addr & 3) || (dst_gpu_addr & 3)) { |
615 | max_bytes = 8192; | 614 | max_bytes = 8192; |
616 | 615 | ||
@@ -653,6 +652,7 @@ void r600_kms_blit_copy(struct radeon_device *rdev, | |||
653 | vb = r600_nomm_get_vb_ptr(dev); | 652 | vb = r600_nomm_get_vb_ptr(dev); |
654 | #endif | 653 | #endif |
655 | } | 654 | } |
655 | vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used); | ||
656 | 656 | ||
657 | vb[0] = i2f(dst_x); | 657 | vb[0] = i2f(dst_x); |
658 | vb[1] = 0; | 658 | vb[1] = 0; |
@@ -747,6 +747,7 @@ void r600_kms_blit_copy(struct radeon_device *rdev, | |||
747 | vb = r600_nomm_get_vb_ptr(dev); | 747 | vb = r600_nomm_get_vb_ptr(dev); |
748 | } | 748 | } |
749 | #endif | 749 | #endif |
750 | vb = (u32 *)(rdev->r600_blit.vb_ib->ptr + rdev->r600_blit.vb_used); | ||
750 | 751 | ||
751 | vb[0] = i2f(dst_x / 4); | 752 | vb[0] = i2f(dst_x / 4); |
752 | vb[1] = 0; | 753 | vb[1] = 0; |
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 33b89cd8743..17e42195c63 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -28,7 +28,6 @@ | |||
28 | #include "drmP.h" | 28 | #include "drmP.h" |
29 | #include "radeon.h" | 29 | #include "radeon.h" |
30 | #include "r600d.h" | 30 | #include "r600d.h" |
31 | #include "avivod.h" | ||
32 | 31 | ||
33 | static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, | 32 | static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, |
34 | struct radeon_cs_reloc **cs_reloc); | 33 | struct radeon_cs_reloc **cs_reloc); |
@@ -57,7 +56,7 @@ int r600_cs_packet_parse(struct radeon_cs_parser *p, | |||
57 | idx, ib_chunk->length_dw); | 56 | idx, ib_chunk->length_dw); |
58 | return -EINVAL; | 57 | return -EINVAL; |
59 | } | 58 | } |
60 | header = ib_chunk->kdata[idx]; | 59 | header = radeon_get_ib_value(p, idx); |
61 | pkt->idx = idx; | 60 | pkt->idx = idx; |
62 | pkt->type = CP_PACKET_GET_TYPE(header); | 61 | pkt->type = CP_PACKET_GET_TYPE(header); |
63 | pkt->count = CP_PACKET_GET_COUNT(header); | 62 | pkt->count = CP_PACKET_GET_COUNT(header); |
@@ -98,7 +97,6 @@ int r600_cs_packet_parse(struct radeon_cs_parser *p, | |||
98 | static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, | 97 | static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, |
99 | struct radeon_cs_reloc **cs_reloc) | 98 | struct radeon_cs_reloc **cs_reloc) |
100 | { | 99 | { |
101 | struct radeon_cs_chunk *ib_chunk; | ||
102 | struct radeon_cs_chunk *relocs_chunk; | 100 | struct radeon_cs_chunk *relocs_chunk; |
103 | struct radeon_cs_packet p3reloc; | 101 | struct radeon_cs_packet p3reloc; |
104 | unsigned idx; | 102 | unsigned idx; |
@@ -109,7 +107,6 @@ static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, | |||
109 | return -EINVAL; | 107 | return -EINVAL; |
110 | } | 108 | } |
111 | *cs_reloc = NULL; | 109 | *cs_reloc = NULL; |
112 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
113 | relocs_chunk = &p->chunks[p->chunk_relocs_idx]; | 110 | relocs_chunk = &p->chunks[p->chunk_relocs_idx]; |
114 | r = r600_cs_packet_parse(p, &p3reloc, p->idx); | 111 | r = r600_cs_packet_parse(p, &p3reloc, p->idx); |
115 | if (r) { | 112 | if (r) { |
@@ -121,7 +118,7 @@ static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, | |||
121 | p3reloc.idx); | 118 | p3reloc.idx); |
122 | return -EINVAL; | 119 | return -EINVAL; |
123 | } | 120 | } |
124 | idx = ib_chunk->kdata[p3reloc.idx + 1]; | 121 | idx = radeon_get_ib_value(p, p3reloc.idx + 1); |
125 | if (idx >= relocs_chunk->length_dw) { | 122 | if (idx >= relocs_chunk->length_dw) { |
126 | DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", | 123 | DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", |
127 | idx, relocs_chunk->length_dw); | 124 | idx, relocs_chunk->length_dw); |
@@ -146,7 +143,6 @@ static int r600_cs_packet_next_reloc_mm(struct radeon_cs_parser *p, | |||
146 | static int r600_cs_packet_next_reloc_nomm(struct radeon_cs_parser *p, | 143 | static int r600_cs_packet_next_reloc_nomm(struct radeon_cs_parser *p, |
147 | struct radeon_cs_reloc **cs_reloc) | 144 | struct radeon_cs_reloc **cs_reloc) |
148 | { | 145 | { |
149 | struct radeon_cs_chunk *ib_chunk; | ||
150 | struct radeon_cs_chunk *relocs_chunk; | 146 | struct radeon_cs_chunk *relocs_chunk; |
151 | struct radeon_cs_packet p3reloc; | 147 | struct radeon_cs_packet p3reloc; |
152 | unsigned idx; | 148 | unsigned idx; |
@@ -157,7 +153,6 @@ static int r600_cs_packet_next_reloc_nomm(struct radeon_cs_parser *p, | |||
157 | return -EINVAL; | 153 | return -EINVAL; |
158 | } | 154 | } |
159 | *cs_reloc = NULL; | 155 | *cs_reloc = NULL; |
160 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
161 | relocs_chunk = &p->chunks[p->chunk_relocs_idx]; | 156 | relocs_chunk = &p->chunks[p->chunk_relocs_idx]; |
162 | r = r600_cs_packet_parse(p, &p3reloc, p->idx); | 157 | r = r600_cs_packet_parse(p, &p3reloc, p->idx); |
163 | if (r) { | 158 | if (r) { |
@@ -169,7 +164,7 @@ static int r600_cs_packet_next_reloc_nomm(struct radeon_cs_parser *p, | |||
169 | p3reloc.idx); | 164 | p3reloc.idx); |
170 | return -EINVAL; | 165 | return -EINVAL; |
171 | } | 166 | } |
172 | idx = ib_chunk->kdata[p3reloc.idx + 1]; | 167 | idx = radeon_get_ib_value(p, p3reloc.idx + 1); |
173 | if (idx >= relocs_chunk->length_dw) { | 168 | if (idx >= relocs_chunk->length_dw) { |
174 | DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", | 169 | DRM_ERROR("Relocs at %d after relocations chunk end %d !\n", |
175 | idx, relocs_chunk->length_dw); | 170 | idx, relocs_chunk->length_dw); |
@@ -181,13 +176,136 @@ static int r600_cs_packet_next_reloc_nomm(struct radeon_cs_parser *p, | |||
181 | return 0; | 176 | return 0; |
182 | } | 177 | } |
183 | 178 | ||
179 | /** | ||
180 | * r600_cs_packet_next_vline() - parse userspace VLINE packet | ||
181 | * @parser: parser structure holding parsing context. | ||
182 | * | ||
183 | * Userspace sends a special sequence for VLINE waits. | ||
184 | * PACKET0 - VLINE_START_END + value | ||
185 | * PACKET3 - WAIT_REG_MEM poll vline status reg | ||
186 | * RELOC (P3) - crtc_id in reloc. | ||
187 | * | ||
188 | * This function parses this and relocates the VLINE START END | ||
189 | * and WAIT_REG_MEM packets to the correct crtc. | ||
190 | * It also detects a switched off crtc and nulls out the | ||
191 | * wait in that case. | ||
192 | */ | ||
193 | static int r600_cs_packet_parse_vline(struct radeon_cs_parser *p) | ||
194 | { | ||
195 | struct drm_mode_object *obj; | ||
196 | struct drm_crtc *crtc; | ||
197 | struct radeon_crtc *radeon_crtc; | ||
198 | struct radeon_cs_packet p3reloc, wait_reg_mem; | ||
199 | int crtc_id; | ||
200 | int r; | ||
201 | uint32_t header, h_idx, reg, wait_reg_mem_info; | ||
202 | volatile uint32_t *ib; | ||
203 | |||
204 | ib = p->ib->ptr; | ||
205 | |||
206 | /* parse the WAIT_REG_MEM */ | ||
207 | r = r600_cs_packet_parse(p, &wait_reg_mem, p->idx); | ||
208 | if (r) | ||
209 | return r; | ||
210 | |||
211 | /* check its a WAIT_REG_MEM */ | ||
212 | if (wait_reg_mem.type != PACKET_TYPE3 || | ||
213 | wait_reg_mem.opcode != PACKET3_WAIT_REG_MEM) { | ||
214 | DRM_ERROR("vline wait missing WAIT_REG_MEM segment\n"); | ||
215 | r = -EINVAL; | ||
216 | return r; | ||
217 | } | ||
218 | |||
219 | wait_reg_mem_info = radeon_get_ib_value(p, wait_reg_mem.idx + 1); | ||
220 | /* bit 4 is reg (0) or mem (1) */ | ||
221 | if (wait_reg_mem_info & 0x10) { | ||
222 | DRM_ERROR("vline WAIT_REG_MEM waiting on MEM rather than REG\n"); | ||
223 | r = -EINVAL; | ||
224 | return r; | ||
225 | } | ||
226 | /* waiting for value to be equal */ | ||
227 | if ((wait_reg_mem_info & 0x7) != 0x3) { | ||
228 | DRM_ERROR("vline WAIT_REG_MEM function not equal\n"); | ||
229 | r = -EINVAL; | ||
230 | return r; | ||
231 | } | ||
232 | if ((radeon_get_ib_value(p, wait_reg_mem.idx + 2) << 2) != AVIVO_D1MODE_VLINE_STATUS) { | ||
233 | DRM_ERROR("vline WAIT_REG_MEM bad reg\n"); | ||
234 | r = -EINVAL; | ||
235 | return r; | ||
236 | } | ||
237 | |||
238 | if (radeon_get_ib_value(p, wait_reg_mem.idx + 5) != AVIVO_D1MODE_VLINE_STAT) { | ||
239 | DRM_ERROR("vline WAIT_REG_MEM bad bit mask\n"); | ||
240 | r = -EINVAL; | ||
241 | return r; | ||
242 | } | ||
243 | |||
244 | /* jump over the NOP */ | ||
245 | r = r600_cs_packet_parse(p, &p3reloc, p->idx + wait_reg_mem.count + 2); | ||
246 | if (r) | ||
247 | return r; | ||
248 | |||
249 | h_idx = p->idx - 2; | ||
250 | p->idx += wait_reg_mem.count + 2; | ||
251 | p->idx += p3reloc.count + 2; | ||
252 | |||
253 | header = radeon_get_ib_value(p, h_idx); | ||
254 | crtc_id = radeon_get_ib_value(p, h_idx + 2 + 7 + 1); | ||
255 | reg = CP_PACKET0_GET_REG(header); | ||
256 | mutex_lock(&p->rdev->ddev->mode_config.mutex); | ||
257 | obj = drm_mode_object_find(p->rdev->ddev, crtc_id, DRM_MODE_OBJECT_CRTC); | ||
258 | if (!obj) { | ||
259 | DRM_ERROR("cannot find crtc %d\n", crtc_id); | ||
260 | r = -EINVAL; | ||
261 | goto out; | ||
262 | } | ||
263 | crtc = obj_to_crtc(obj); | ||
264 | radeon_crtc = to_radeon_crtc(crtc); | ||
265 | crtc_id = radeon_crtc->crtc_id; | ||
266 | |||
267 | if (!crtc->enabled) { | ||
268 | /* if the CRTC isn't enabled - we need to nop out the WAIT_REG_MEM */ | ||
269 | ib[h_idx + 2] = PACKET2(0); | ||
270 | ib[h_idx + 3] = PACKET2(0); | ||
271 | ib[h_idx + 4] = PACKET2(0); | ||
272 | ib[h_idx + 5] = PACKET2(0); | ||
273 | ib[h_idx + 6] = PACKET2(0); | ||
274 | ib[h_idx + 7] = PACKET2(0); | ||
275 | ib[h_idx + 8] = PACKET2(0); | ||
276 | } else if (crtc_id == 1) { | ||
277 | switch (reg) { | ||
278 | case AVIVO_D1MODE_VLINE_START_END: | ||
279 | header &= ~R600_CP_PACKET0_REG_MASK; | ||
280 | header |= AVIVO_D2MODE_VLINE_START_END >> 2; | ||
281 | break; | ||
282 | default: | ||
283 | DRM_ERROR("unknown crtc reloc\n"); | ||
284 | r = -EINVAL; | ||
285 | goto out; | ||
286 | } | ||
287 | ib[h_idx] = header; | ||
288 | ib[h_idx + 4] = AVIVO_D2MODE_VLINE_STATUS >> 2; | ||
289 | } | ||
290 | out: | ||
291 | mutex_unlock(&p->rdev->ddev->mode_config.mutex); | ||
292 | return r; | ||
293 | } | ||
294 | |||
184 | static int r600_packet0_check(struct radeon_cs_parser *p, | 295 | static int r600_packet0_check(struct radeon_cs_parser *p, |
185 | struct radeon_cs_packet *pkt, | 296 | struct radeon_cs_packet *pkt, |
186 | unsigned idx, unsigned reg) | 297 | unsigned idx, unsigned reg) |
187 | { | 298 | { |
299 | int r; | ||
300 | |||
188 | switch (reg) { | 301 | switch (reg) { |
189 | case AVIVO_D1MODE_VLINE_START_END: | 302 | case AVIVO_D1MODE_VLINE_START_END: |
190 | case AVIVO_D2MODE_VLINE_START_END: | 303 | r = r600_cs_packet_parse_vline(p); |
304 | if (r) { | ||
305 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | ||
306 | idx, reg); | ||
307 | return r; | ||
308 | } | ||
191 | break; | 309 | break; |
192 | default: | 310 | default: |
193 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", | 311 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", |
@@ -218,17 +336,18 @@ static int r600_cs_parse_packet0(struct radeon_cs_parser *p, | |||
218 | static int r600_packet3_check(struct radeon_cs_parser *p, | 336 | static int r600_packet3_check(struct radeon_cs_parser *p, |
219 | struct radeon_cs_packet *pkt) | 337 | struct radeon_cs_packet *pkt) |
220 | { | 338 | { |
221 | struct radeon_cs_chunk *ib_chunk; | ||
222 | struct radeon_cs_reloc *reloc; | 339 | struct radeon_cs_reloc *reloc; |
223 | volatile u32 *ib; | 340 | volatile u32 *ib; |
224 | unsigned idx; | 341 | unsigned idx; |
225 | unsigned i; | 342 | unsigned i; |
226 | unsigned start_reg, end_reg, reg; | 343 | unsigned start_reg, end_reg, reg; |
227 | int r; | 344 | int r; |
345 | u32 idx_value; | ||
228 | 346 | ||
229 | ib = p->ib->ptr; | 347 | ib = p->ib->ptr; |
230 | ib_chunk = &p->chunks[p->chunk_ib_idx]; | ||
231 | idx = pkt->idx + 1; | 348 | idx = pkt->idx + 1; |
349 | idx_value = radeon_get_ib_value(p, idx); | ||
350 | |||
232 | switch (pkt->opcode) { | 351 | switch (pkt->opcode) { |
233 | case PACKET3_START_3D_CMDBUF: | 352 | case PACKET3_START_3D_CMDBUF: |
234 | if (p->family >= CHIP_RV770 || pkt->count) { | 353 | if (p->family >= CHIP_RV770 || pkt->count) { |
@@ -259,8 +378,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
259 | DRM_ERROR("bad DRAW_INDEX\n"); | 378 | DRM_ERROR("bad DRAW_INDEX\n"); |
260 | return -EINVAL; | 379 | return -EINVAL; |
261 | } | 380 | } |
262 | ib[idx+0] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); | 381 | ib[idx+0] = idx_value + (u32)(reloc->lobj.gpu_offset & 0xffffffff); |
263 | ib[idx+1] = upper_32_bits(reloc->lobj.gpu_offset) & 0xff; | 382 | ib[idx+1] += upper_32_bits(reloc->lobj.gpu_offset) & 0xff; |
264 | break; | 383 | break; |
265 | case PACKET3_DRAW_INDEX_AUTO: | 384 | case PACKET3_DRAW_INDEX_AUTO: |
266 | if (pkt->count != 1) { | 385 | if (pkt->count != 1) { |
@@ -281,14 +400,14 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
281 | return -EINVAL; | 400 | return -EINVAL; |
282 | } | 401 | } |
283 | /* bit 4 is reg (0) or mem (1) */ | 402 | /* bit 4 is reg (0) or mem (1) */ |
284 | if (ib_chunk->kdata[idx+0] & 0x10) { | 403 | if (idx_value & 0x10) { |
285 | r = r600_cs_packet_next_reloc(p, &reloc); | 404 | r = r600_cs_packet_next_reloc(p, &reloc); |
286 | if (r) { | 405 | if (r) { |
287 | DRM_ERROR("bad WAIT_REG_MEM\n"); | 406 | DRM_ERROR("bad WAIT_REG_MEM\n"); |
288 | return -EINVAL; | 407 | return -EINVAL; |
289 | } | 408 | } |
290 | ib[idx+1] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); | 409 | ib[idx+1] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); |
291 | ib[idx+2] = upper_32_bits(reloc->lobj.gpu_offset) & 0xff; | 410 | ib[idx+2] += upper_32_bits(reloc->lobj.gpu_offset) & 0xff; |
292 | } | 411 | } |
293 | break; | 412 | break; |
294 | case PACKET3_SURFACE_SYNC: | 413 | case PACKET3_SURFACE_SYNC: |
@@ -297,8 +416,8 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
297 | return -EINVAL; | 416 | return -EINVAL; |
298 | } | 417 | } |
299 | /* 0xffffffff/0x0 is flush all cache flag */ | 418 | /* 0xffffffff/0x0 is flush all cache flag */ |
300 | if (ib_chunk->kdata[idx+1] != 0xffffffff || | 419 | if (radeon_get_ib_value(p, idx + 1) != 0xffffffff || |
301 | ib_chunk->kdata[idx+2] != 0) { | 420 | radeon_get_ib_value(p, idx + 2) != 0) { |
302 | r = r600_cs_packet_next_reloc(p, &reloc); | 421 | r = r600_cs_packet_next_reloc(p, &reloc); |
303 | if (r) { | 422 | if (r) { |
304 | DRM_ERROR("bad SURFACE_SYNC\n"); | 423 | DRM_ERROR("bad SURFACE_SYNC\n"); |
@@ -319,7 +438,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
319 | return -EINVAL; | 438 | return -EINVAL; |
320 | } | 439 | } |
321 | ib[idx+1] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); | 440 | ib[idx+1] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); |
322 | ib[idx+2] |= upper_32_bits(reloc->lobj.gpu_offset) & 0xff; | 441 | ib[idx+2] += upper_32_bits(reloc->lobj.gpu_offset) & 0xff; |
323 | } | 442 | } |
324 | break; | 443 | break; |
325 | case PACKET3_EVENT_WRITE_EOP: | 444 | case PACKET3_EVENT_WRITE_EOP: |
@@ -333,10 +452,10 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
333 | return -EINVAL; | 452 | return -EINVAL; |
334 | } | 453 | } |
335 | ib[idx+1] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); | 454 | ib[idx+1] += (u32)(reloc->lobj.gpu_offset & 0xffffffff); |
336 | ib[idx+2] |= upper_32_bits(reloc->lobj.gpu_offset) & 0xff; | 455 | ib[idx+2] += upper_32_bits(reloc->lobj.gpu_offset) & 0xff; |
337 | break; | 456 | break; |
338 | case PACKET3_SET_CONFIG_REG: | 457 | case PACKET3_SET_CONFIG_REG: |
339 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_CONFIG_REG_OFFSET; | 458 | start_reg = (idx_value << 2) + PACKET3_SET_CONFIG_REG_OFFSET; |
340 | end_reg = 4 * pkt->count + start_reg - 4; | 459 | end_reg = 4 * pkt->count + start_reg - 4; |
341 | if ((start_reg < PACKET3_SET_CONFIG_REG_OFFSET) || | 460 | if ((start_reg < PACKET3_SET_CONFIG_REG_OFFSET) || |
342 | (start_reg >= PACKET3_SET_CONFIG_REG_END) || | 461 | (start_reg >= PACKET3_SET_CONFIG_REG_END) || |
@@ -356,7 +475,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
356 | } | 475 | } |
357 | break; | 476 | break; |
358 | case PACKET3_SET_CONTEXT_REG: | 477 | case PACKET3_SET_CONTEXT_REG: |
359 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_CONTEXT_REG_OFFSET; | 478 | start_reg = (idx_value << 2) + PACKET3_SET_CONTEXT_REG_OFFSET; |
360 | end_reg = 4 * pkt->count + start_reg - 4; | 479 | end_reg = 4 * pkt->count + start_reg - 4; |
361 | if ((start_reg < PACKET3_SET_CONTEXT_REG_OFFSET) || | 480 | if ((start_reg < PACKET3_SET_CONTEXT_REG_OFFSET) || |
362 | (start_reg >= PACKET3_SET_CONTEXT_REG_END) || | 481 | (start_reg >= PACKET3_SET_CONTEXT_REG_END) || |
@@ -421,7 +540,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
421 | DRM_ERROR("bad SET_RESOURCE\n"); | 540 | DRM_ERROR("bad SET_RESOURCE\n"); |
422 | return -EINVAL; | 541 | return -EINVAL; |
423 | } | 542 | } |
424 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_RESOURCE_OFFSET; | 543 | start_reg = (idx_value << 2) + PACKET3_SET_RESOURCE_OFFSET; |
425 | end_reg = 4 * pkt->count + start_reg - 4; | 544 | end_reg = 4 * pkt->count + start_reg - 4; |
426 | if ((start_reg < PACKET3_SET_RESOURCE_OFFSET) || | 545 | if ((start_reg < PACKET3_SET_RESOURCE_OFFSET) || |
427 | (start_reg >= PACKET3_SET_RESOURCE_END) || | 546 | (start_reg >= PACKET3_SET_RESOURCE_END) || |
@@ -430,7 +549,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
430 | return -EINVAL; | 549 | return -EINVAL; |
431 | } | 550 | } |
432 | for (i = 0; i < (pkt->count / 7); i++) { | 551 | for (i = 0; i < (pkt->count / 7); i++) { |
433 | switch (G__SQ_VTX_CONSTANT_TYPE(ib[idx+(i*7)+6+1])) { | 552 | switch (G__SQ_VTX_CONSTANT_TYPE(radeon_get_ib_value(p, idx+(i*7)+6+1))) { |
434 | case SQ_TEX_VTX_VALID_TEXTURE: | 553 | case SQ_TEX_VTX_VALID_TEXTURE: |
435 | /* tex base */ | 554 | /* tex base */ |
436 | r = r600_cs_packet_next_reloc(p, &reloc); | 555 | r = r600_cs_packet_next_reloc(p, &reloc); |
@@ -455,7 +574,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
455 | return -EINVAL; | 574 | return -EINVAL; |
456 | } | 575 | } |
457 | ib[idx+1+(i*7)+0] += (u32)((reloc->lobj.gpu_offset) & 0xffffffff); | 576 | ib[idx+1+(i*7)+0] += (u32)((reloc->lobj.gpu_offset) & 0xffffffff); |
458 | ib[idx+1+(i*7)+2] |= upper_32_bits(reloc->lobj.gpu_offset) & 0xff; | 577 | ib[idx+1+(i*7)+2] += upper_32_bits(reloc->lobj.gpu_offset) & 0xff; |
459 | break; | 578 | break; |
460 | case SQ_TEX_VTX_INVALID_TEXTURE: | 579 | case SQ_TEX_VTX_INVALID_TEXTURE: |
461 | case SQ_TEX_VTX_INVALID_BUFFER: | 580 | case SQ_TEX_VTX_INVALID_BUFFER: |
@@ -466,7 +585,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
466 | } | 585 | } |
467 | break; | 586 | break; |
468 | case PACKET3_SET_ALU_CONST: | 587 | case PACKET3_SET_ALU_CONST: |
469 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_ALU_CONST_OFFSET; | 588 | start_reg = (idx_value << 2) + PACKET3_SET_ALU_CONST_OFFSET; |
470 | end_reg = 4 * pkt->count + start_reg - 4; | 589 | end_reg = 4 * pkt->count + start_reg - 4; |
471 | if ((start_reg < PACKET3_SET_ALU_CONST_OFFSET) || | 590 | if ((start_reg < PACKET3_SET_ALU_CONST_OFFSET) || |
472 | (start_reg >= PACKET3_SET_ALU_CONST_END) || | 591 | (start_reg >= PACKET3_SET_ALU_CONST_END) || |
@@ -476,7 +595,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
476 | } | 595 | } |
477 | break; | 596 | break; |
478 | case PACKET3_SET_BOOL_CONST: | 597 | case PACKET3_SET_BOOL_CONST: |
479 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_BOOL_CONST_OFFSET; | 598 | start_reg = (idx_value << 2) + PACKET3_SET_BOOL_CONST_OFFSET; |
480 | end_reg = 4 * pkt->count + start_reg - 4; | 599 | end_reg = 4 * pkt->count + start_reg - 4; |
481 | if ((start_reg < PACKET3_SET_BOOL_CONST_OFFSET) || | 600 | if ((start_reg < PACKET3_SET_BOOL_CONST_OFFSET) || |
482 | (start_reg >= PACKET3_SET_BOOL_CONST_END) || | 601 | (start_reg >= PACKET3_SET_BOOL_CONST_END) || |
@@ -486,7 +605,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
486 | } | 605 | } |
487 | break; | 606 | break; |
488 | case PACKET3_SET_LOOP_CONST: | 607 | case PACKET3_SET_LOOP_CONST: |
489 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_LOOP_CONST_OFFSET; | 608 | start_reg = (idx_value << 2) + PACKET3_SET_LOOP_CONST_OFFSET; |
490 | end_reg = 4 * pkt->count + start_reg - 4; | 609 | end_reg = 4 * pkt->count + start_reg - 4; |
491 | if ((start_reg < PACKET3_SET_LOOP_CONST_OFFSET) || | 610 | if ((start_reg < PACKET3_SET_LOOP_CONST_OFFSET) || |
492 | (start_reg >= PACKET3_SET_LOOP_CONST_END) || | 611 | (start_reg >= PACKET3_SET_LOOP_CONST_END) || |
@@ -496,7 +615,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
496 | } | 615 | } |
497 | break; | 616 | break; |
498 | case PACKET3_SET_CTL_CONST: | 617 | case PACKET3_SET_CTL_CONST: |
499 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_CTL_CONST_OFFSET; | 618 | start_reg = (idx_value << 2) + PACKET3_SET_CTL_CONST_OFFSET; |
500 | end_reg = 4 * pkt->count + start_reg - 4; | 619 | end_reg = 4 * pkt->count + start_reg - 4; |
501 | if ((start_reg < PACKET3_SET_CTL_CONST_OFFSET) || | 620 | if ((start_reg < PACKET3_SET_CTL_CONST_OFFSET) || |
502 | (start_reg >= PACKET3_SET_CTL_CONST_END) || | 621 | (start_reg >= PACKET3_SET_CTL_CONST_END) || |
@@ -510,7 +629,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
510 | DRM_ERROR("bad SET_SAMPLER\n"); | 629 | DRM_ERROR("bad SET_SAMPLER\n"); |
511 | return -EINVAL; | 630 | return -EINVAL; |
512 | } | 631 | } |
513 | start_reg = (ib[idx+0] << 2) + PACKET3_SET_SAMPLER_OFFSET; | 632 | start_reg = (idx_value << 2) + PACKET3_SET_SAMPLER_OFFSET; |
514 | end_reg = 4 * pkt->count + start_reg - 4; | 633 | end_reg = 4 * pkt->count + start_reg - 4; |
515 | if ((start_reg < PACKET3_SET_SAMPLER_OFFSET) || | 634 | if ((start_reg < PACKET3_SET_SAMPLER_OFFSET) || |
516 | (start_reg >= PACKET3_SET_SAMPLER_END) || | 635 | (start_reg >= PACKET3_SET_SAMPLER_END) || |
@@ -602,6 +721,8 @@ static void r600_cs_parser_fini(struct radeon_cs_parser *parser, int error) | |||
602 | kfree(parser->relocs); | 721 | kfree(parser->relocs); |
603 | for (i = 0; i < parser->nchunks; i++) { | 722 | for (i = 0; i < parser->nchunks; i++) { |
604 | kfree(parser->chunks[i].kdata); | 723 | kfree(parser->chunks[i].kdata); |
724 | kfree(parser->chunks[i].kpage[0]); | ||
725 | kfree(parser->chunks[i].kpage[1]); | ||
605 | } | 726 | } |
606 | kfree(parser->chunks); | 727 | kfree(parser->chunks); |
607 | kfree(parser->chunks_array); | 728 | kfree(parser->chunks_array); |
@@ -639,7 +760,6 @@ int r600_cs_legacy(struct drm_device *dev, void *data, struct drm_file *filp, | |||
639 | * uncached). */ | 760 | * uncached). */ |
640 | ib_chunk = &parser.chunks[parser.chunk_ib_idx]; | 761 | ib_chunk = &parser.chunks[parser.chunk_ib_idx]; |
641 | parser.ib->length_dw = ib_chunk->length_dw; | 762 | parser.ib->length_dw = ib_chunk->length_dw; |
642 | memcpy((void *)parser.ib->ptr, ib_chunk->kdata, ib_chunk->length_dw*4); | ||
643 | *l = parser.ib->length_dw; | 763 | *l = parser.ib->length_dw; |
644 | r = r600_cs_parse(&parser); | 764 | r = r600_cs_parse(&parser); |
645 | if (r) { | 765 | if (r) { |
@@ -647,6 +767,12 @@ int r600_cs_legacy(struct drm_device *dev, void *data, struct drm_file *filp, | |||
647 | r600_cs_parser_fini(&parser, r); | 767 | r600_cs_parser_fini(&parser, r); |
648 | return r; | 768 | return r; |
649 | } | 769 | } |
770 | r = radeon_cs_finish_pages(&parser); | ||
771 | if (r) { | ||
772 | DRM_ERROR("Invalid command stream !\n"); | ||
773 | r600_cs_parser_fini(&parser, r); | ||
774 | return r; | ||
775 | } | ||
650 | r600_cs_parser_fini(&parser, r); | 776 | r600_cs_parser_fini(&parser, r); |
651 | return r; | 777 | return r; |
652 | } | 778 | } |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 4a9028a85c9..9b64d47f1f8 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -643,6 +643,7 @@ | |||
643 | #define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1) | 643 | #define G_000E50_MCDW_BUSY(x) (((x) >> 13) & 1) |
644 | #define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1) | 644 | #define G_000E50_SEM_BUSY(x) (((x) >> 14) & 1) |
645 | #define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1) | 645 | #define G_000E50_RLC_BUSY(x) (((x) >> 15) & 1) |
646 | #define G_000E50_BIF_BUSY(x) (((x) >> 29) & 1) | ||
646 | #define R_000E60_SRBM_SOFT_RESET 0x0E60 | 647 | #define R_000E60_SRBM_SOFT_RESET 0x0E60 |
647 | #define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1) | 648 | #define S_000E60_SOFT_RESET_BIF(x) (((x) & 1) << 1) |
648 | #define S_000E60_SOFT_RESET_CG(x) (((x) & 1) << 2) | 649 | #define S_000E60_SOFT_RESET_CG(x) (((x) & 1) << 2) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 6311b136259..5ab35b81c86 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -44,6 +44,24 @@ | |||
44 | * - TESTING, TESTING, TESTING | 44 | * - TESTING, TESTING, TESTING |
45 | */ | 45 | */ |
46 | 46 | ||
47 | /* Initialization path: | ||
48 | * We expect that acceleration initialization might fail for various | ||
49 | * reasons even thought we work hard to make it works on most | ||
50 | * configurations. In order to still have a working userspace in such | ||
51 | * situation the init path must succeed up to the memory controller | ||
52 | * initialization point. Failure before this point are considered as | ||
53 | * fatal error. Here is the init callchain : | ||
54 | * radeon_device_init perform common structure, mutex initialization | ||
55 | * asic_init setup the GPU memory layout and perform all | ||
56 | * one time initialization (failure in this | ||
57 | * function are considered fatal) | ||
58 | * asic_startup setup the GPU acceleration, in order to | ||
59 | * follow guideline the first thing this | ||
60 | * function should do is setting the GPU | ||
61 | * memory controller (only MC setup failure | ||
62 | * are considered as fatal) | ||
63 | */ | ||
64 | |||
47 | #include <asm/atomic.h> | 65 | #include <asm/atomic.h> |
48 | #include <linux/wait.h> | 66 | #include <linux/wait.h> |
49 | #include <linux/list.h> | 67 | #include <linux/list.h> |
@@ -342,7 +360,7 @@ struct radeon_ib { | |||
342 | unsigned long idx; | 360 | unsigned long idx; |
343 | uint64_t gpu_addr; | 361 | uint64_t gpu_addr; |
344 | struct radeon_fence *fence; | 362 | struct radeon_fence *fence; |
345 | volatile uint32_t *ptr; | 363 | uint32_t *ptr; |
346 | uint32_t length_dw; | 364 | uint32_t length_dw; |
347 | }; | 365 | }; |
348 | 366 | ||
@@ -415,7 +433,12 @@ struct radeon_cs_reloc { | |||
415 | struct radeon_cs_chunk { | 433 | struct radeon_cs_chunk { |
416 | uint32_t chunk_id; | 434 | uint32_t chunk_id; |
417 | uint32_t length_dw; | 435 | uint32_t length_dw; |
436 | int kpage_idx[2]; | ||
437 | uint32_t *kpage[2]; | ||
418 | uint32_t *kdata; | 438 | uint32_t *kdata; |
439 | void __user *user_ptr; | ||
440 | int last_copied_page; | ||
441 | int last_page_index; | ||
419 | }; | 442 | }; |
420 | 443 | ||
421 | struct radeon_cs_parser { | 444 | struct radeon_cs_parser { |
@@ -438,8 +461,38 @@ struct radeon_cs_parser { | |||
438 | struct radeon_ib *ib; | 461 | struct radeon_ib *ib; |
439 | void *track; | 462 | void *track; |
440 | unsigned family; | 463 | unsigned family; |
464 | int parser_error; | ||
441 | }; | 465 | }; |
442 | 466 | ||
467 | extern int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx); | ||
468 | extern int radeon_cs_finish_pages(struct radeon_cs_parser *p); | ||
469 | |||
470 | |||
471 | static inline u32 radeon_get_ib_value(struct radeon_cs_parser *p, int idx) | ||
472 | { | ||
473 | struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx]; | ||
474 | u32 pg_idx, pg_offset; | ||
475 | u32 idx_value = 0; | ||
476 | int new_page; | ||
477 | |||
478 | pg_idx = (idx * 4) / PAGE_SIZE; | ||
479 | pg_offset = (idx * 4) % PAGE_SIZE; | ||
480 | |||
481 | if (ibc->kpage_idx[0] == pg_idx) | ||
482 | return ibc->kpage[0][pg_offset/4]; | ||
483 | if (ibc->kpage_idx[1] == pg_idx) | ||
484 | return ibc->kpage[1][pg_offset/4]; | ||
485 | |||
486 | new_page = radeon_cs_update_pages(p, pg_idx); | ||
487 | if (new_page < 0) { | ||
488 | p->parser_error = new_page; | ||
489 | return 0; | ||
490 | } | ||
491 | |||
492 | idx_value = ibc->kpage[new_page][pg_offset/4]; | ||
493 | return idx_value; | ||
494 | } | ||
495 | |||
443 | struct radeon_cs_packet { | 496 | struct radeon_cs_packet { |
444 | unsigned idx; | 497 | unsigned idx; |
445 | unsigned type; | 498 | unsigned type; |
@@ -537,18 +590,8 @@ struct radeon_asic { | |||
537 | void (*fini)(struct radeon_device *rdev); | 590 | void (*fini)(struct radeon_device *rdev); |
538 | int (*resume)(struct radeon_device *rdev); | 591 | int (*resume)(struct radeon_device *rdev); |
539 | int (*suspend)(struct radeon_device *rdev); | 592 | int (*suspend)(struct radeon_device *rdev); |
540 | void (*errata)(struct radeon_device *rdev); | ||
541 | void (*vram_info)(struct radeon_device *rdev); | ||
542 | void (*vga_set_state)(struct radeon_device *rdev, bool state); | 593 | void (*vga_set_state)(struct radeon_device *rdev, bool state); |
543 | int (*gpu_reset)(struct radeon_device *rdev); | 594 | int (*gpu_reset)(struct radeon_device *rdev); |
544 | int (*mc_init)(struct radeon_device *rdev); | ||
545 | void (*mc_fini)(struct radeon_device *rdev); | ||
546 | int (*wb_init)(struct radeon_device *rdev); | ||
547 | void (*wb_fini)(struct radeon_device *rdev); | ||
548 | int (*gart_init)(struct radeon_device *rdev); | ||
549 | void (*gart_fini)(struct radeon_device *rdev); | ||
550 | int (*gart_enable)(struct radeon_device *rdev); | ||
551 | void (*gart_disable)(struct radeon_device *rdev); | ||
552 | void (*gart_tlb_flush)(struct radeon_device *rdev); | 595 | void (*gart_tlb_flush)(struct radeon_device *rdev); |
553 | int (*gart_set_page)(struct radeon_device *rdev, int i, uint64_t addr); | 596 | int (*gart_set_page)(struct radeon_device *rdev, int i, uint64_t addr); |
554 | int (*cp_init)(struct radeon_device *rdev, unsigned ring_size); | 597 | int (*cp_init)(struct radeon_device *rdev, unsigned ring_size); |
@@ -558,7 +601,6 @@ struct radeon_asic { | |||
558 | void (*ring_start)(struct radeon_device *rdev); | 601 | void (*ring_start)(struct radeon_device *rdev); |
559 | int (*ring_test)(struct radeon_device *rdev); | 602 | int (*ring_test)(struct radeon_device *rdev); |
560 | void (*ring_ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib); | 603 | void (*ring_ib_execute)(struct radeon_device *rdev, struct radeon_ib *ib); |
561 | int (*ib_test)(struct radeon_device *rdev); | ||
562 | int (*irq_set)(struct radeon_device *rdev); | 604 | int (*irq_set)(struct radeon_device *rdev); |
563 | int (*irq_process)(struct radeon_device *rdev); | 605 | int (*irq_process)(struct radeon_device *rdev); |
564 | u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); | 606 | u32 (*get_vblank_counter)(struct radeon_device *rdev, int crtc); |
@@ -736,7 +778,6 @@ struct radeon_device { | |||
736 | bool shutdown; | 778 | bool shutdown; |
737 | bool suspend; | 779 | bool suspend; |
738 | bool need_dma32; | 780 | bool need_dma32; |
739 | bool new_init_path; | ||
740 | bool accel_working; | 781 | bool accel_working; |
741 | struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES]; | 782 | struct radeon_surface_reg surface_regs[RADEON_GEM_MAX_SURFACES]; |
742 | const struct firmware *me_fw; /* all family ME firmware */ | 783 | const struct firmware *me_fw; /* all family ME firmware */ |
@@ -896,28 +937,14 @@ static inline void radeon_ring_write(struct radeon_device *rdev, uint32_t v) | |||
896 | #define radeon_resume(rdev) (rdev)->asic->resume((rdev)) | 937 | #define radeon_resume(rdev) (rdev)->asic->resume((rdev)) |
897 | #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) | 938 | #define radeon_suspend(rdev) (rdev)->asic->suspend((rdev)) |
898 | #define radeon_cs_parse(p) rdev->asic->cs_parse((p)) | 939 | #define radeon_cs_parse(p) rdev->asic->cs_parse((p)) |
899 | #define radeon_errata(rdev) (rdev)->asic->errata((rdev)) | ||
900 | #define radeon_vram_info(rdev) (rdev)->asic->vram_info((rdev)) | ||
901 | #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) | 940 | #define radeon_vga_set_state(rdev, state) (rdev)->asic->vga_set_state((rdev), (state)) |
902 | #define radeon_gpu_reset(rdev) (rdev)->asic->gpu_reset((rdev)) | 941 | #define radeon_gpu_reset(rdev) (rdev)->asic->gpu_reset((rdev)) |
903 | #define radeon_mc_init(rdev) (rdev)->asic->mc_init((rdev)) | ||
904 | #define radeon_mc_fini(rdev) (rdev)->asic->mc_fini((rdev)) | ||
905 | #define radeon_wb_init(rdev) (rdev)->asic->wb_init((rdev)) | ||
906 | #define radeon_wb_fini(rdev) (rdev)->asic->wb_fini((rdev)) | ||
907 | #define radeon_gpu_gart_init(rdev) (rdev)->asic->gart_init((rdev)) | ||
908 | #define radeon_gpu_gart_fini(rdev) (rdev)->asic->gart_fini((rdev)) | ||
909 | #define radeon_gart_enable(rdev) (rdev)->asic->gart_enable((rdev)) | ||
910 | #define radeon_gart_disable(rdev) (rdev)->asic->gart_disable((rdev)) | ||
911 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev)) | 942 | #define radeon_gart_tlb_flush(rdev) (rdev)->asic->gart_tlb_flush((rdev)) |
912 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart_set_page((rdev), (i), (p)) | 943 | #define radeon_gart_set_page(rdev, i, p) (rdev)->asic->gart_set_page((rdev), (i), (p)) |
913 | #define radeon_cp_init(rdev,rsize) (rdev)->asic->cp_init((rdev), (rsize)) | ||
914 | #define radeon_cp_fini(rdev) (rdev)->asic->cp_fini((rdev)) | ||
915 | #define radeon_cp_disable(rdev) (rdev)->asic->cp_disable((rdev)) | ||
916 | #define radeon_cp_commit(rdev) (rdev)->asic->cp_commit((rdev)) | 944 | #define radeon_cp_commit(rdev) (rdev)->asic->cp_commit((rdev)) |
917 | #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) | 945 | #define radeon_ring_start(rdev) (rdev)->asic->ring_start((rdev)) |
918 | #define radeon_ring_test(rdev) (rdev)->asic->ring_test((rdev)) | 946 | #define radeon_ring_test(rdev) (rdev)->asic->ring_test((rdev)) |
919 | #define radeon_ring_ib_execute(rdev, ib) (rdev)->asic->ring_ib_execute((rdev), (ib)) | 947 | #define radeon_ring_ib_execute(rdev, ib) (rdev)->asic->ring_ib_execute((rdev), (ib)) |
920 | #define radeon_ib_test(rdev) (rdev)->asic->ib_test((rdev)) | ||
921 | #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) | 948 | #define radeon_irq_set(rdev) (rdev)->asic->irq_set((rdev)) |
922 | #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) | 949 | #define radeon_irq_process(rdev) (rdev)->asic->irq_process((rdev)) |
923 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc)) | 950 | #define radeon_get_vblank_counter(rdev, crtc) (rdev)->asic->get_vblank_counter((rdev), (crtc)) |
@@ -943,6 +970,8 @@ extern void radeon_clocks_fini(struct radeon_device *rdev); | |||
943 | extern void radeon_scratch_init(struct radeon_device *rdev); | 970 | extern void radeon_scratch_init(struct radeon_device *rdev); |
944 | extern void radeon_surface_init(struct radeon_device *rdev); | 971 | extern void radeon_surface_init(struct radeon_device *rdev); |
945 | extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data); | 972 | extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data); |
973 | extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable); | ||
974 | extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); | ||
946 | 975 | ||
947 | /* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ | 976 | /* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ |
948 | struct r100_mc_save { | 977 | struct r100_mc_save { |
@@ -974,23 +1003,71 @@ extern void r100_vram_init_sizes(struct radeon_device *rdev); | |||
974 | extern void r100_wb_disable(struct radeon_device *rdev); | 1003 | extern void r100_wb_disable(struct radeon_device *rdev); |
975 | extern void r100_wb_fini(struct radeon_device *rdev); | 1004 | extern void r100_wb_fini(struct radeon_device *rdev); |
976 | extern int r100_wb_init(struct radeon_device *rdev); | 1005 | extern int r100_wb_init(struct radeon_device *rdev); |
1006 | extern void r100_hdp_reset(struct radeon_device *rdev); | ||
1007 | extern int r100_rb2d_reset(struct radeon_device *rdev); | ||
1008 | extern int r100_cp_reset(struct radeon_device *rdev); | ||
1009 | extern void r100_vga_render_disable(struct radeon_device *rdev); | ||
1010 | extern int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p, | ||
1011 | struct radeon_cs_packet *pkt, | ||
1012 | struct radeon_object *robj); | ||
1013 | extern int r100_cs_parse_packet0(struct radeon_cs_parser *p, | ||
1014 | struct radeon_cs_packet *pkt, | ||
1015 | const unsigned *auth, unsigned n, | ||
1016 | radeon_packet0_check_t check); | ||
1017 | extern int r100_cs_packet_parse(struct radeon_cs_parser *p, | ||
1018 | struct radeon_cs_packet *pkt, | ||
1019 | unsigned idx); | ||
1020 | |||
1021 | /* rv200,rv250,rv280 */ | ||
1022 | extern void r200_set_safe_registers(struct radeon_device *rdev); | ||
977 | 1023 | ||
978 | /* r300,r350,rv350,rv370,rv380 */ | 1024 | /* r300,r350,rv350,rv370,rv380 */ |
979 | extern void r300_set_reg_safe(struct radeon_device *rdev); | 1025 | extern void r300_set_reg_safe(struct radeon_device *rdev); |
980 | extern void r300_mc_program(struct radeon_device *rdev); | 1026 | extern void r300_mc_program(struct radeon_device *rdev); |
981 | extern void r300_vram_info(struct radeon_device *rdev); | 1027 | extern void r300_vram_info(struct radeon_device *rdev); |
1028 | extern void r300_clock_startup(struct radeon_device *rdev); | ||
1029 | extern int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
982 | extern int rv370_pcie_gart_init(struct radeon_device *rdev); | 1030 | extern int rv370_pcie_gart_init(struct radeon_device *rdev); |
983 | extern void rv370_pcie_gart_fini(struct radeon_device *rdev); | 1031 | extern void rv370_pcie_gart_fini(struct radeon_device *rdev); |
984 | extern int rv370_pcie_gart_enable(struct radeon_device *rdev); | 1032 | extern int rv370_pcie_gart_enable(struct radeon_device *rdev); |
985 | extern void rv370_pcie_gart_disable(struct radeon_device *rdev); | 1033 | extern void rv370_pcie_gart_disable(struct radeon_device *rdev); |
986 | 1034 | ||
987 | /* r420,r423,rv410 */ | 1035 | /* r420,r423,rv410 */ |
1036 | extern int r420_mc_init(struct radeon_device *rdev); | ||
988 | extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg); | 1037 | extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg); |
989 | extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v); | 1038 | extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v); |
990 | extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev); | 1039 | extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev); |
1040 | extern void r420_pipes_init(struct radeon_device *rdev); | ||
991 | 1041 | ||
992 | /* rv515 */ | 1042 | /* rv515 */ |
1043 | struct rv515_mc_save { | ||
1044 | u32 d1vga_control; | ||
1045 | u32 d2vga_control; | ||
1046 | u32 vga_render_control; | ||
1047 | u32 vga_hdp_control; | ||
1048 | u32 d1crtc_control; | ||
1049 | u32 d2crtc_control; | ||
1050 | }; | ||
993 | extern void rv515_bandwidth_avivo_update(struct radeon_device *rdev); | 1051 | extern void rv515_bandwidth_avivo_update(struct radeon_device *rdev); |
1052 | extern void rv515_vga_render_disable(struct radeon_device *rdev); | ||
1053 | extern void rv515_set_safe_registers(struct radeon_device *rdev); | ||
1054 | extern void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save); | ||
1055 | extern void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save); | ||
1056 | extern void rv515_clock_startup(struct radeon_device *rdev); | ||
1057 | extern void rv515_debugfs(struct radeon_device *rdev); | ||
1058 | extern int rv515_suspend(struct radeon_device *rdev); | ||
1059 | |||
1060 | /* rs400 */ | ||
1061 | extern int rs400_gart_init(struct radeon_device *rdev); | ||
1062 | extern int rs400_gart_enable(struct radeon_device *rdev); | ||
1063 | extern void rs400_gart_adjust_size(struct radeon_device *rdev); | ||
1064 | extern void rs400_gart_disable(struct radeon_device *rdev); | ||
1065 | extern void rs400_gart_fini(struct radeon_device *rdev); | ||
1066 | |||
1067 | /* rs600 */ | ||
1068 | extern void rs600_set_safe_registers(struct radeon_device *rdev); | ||
1069 | extern int rs600_irq_set(struct radeon_device *rdev); | ||
1070 | extern void rs600_irq_disable(struct radeon_device *rdev); | ||
994 | 1071 | ||
995 | /* rs690, rs740 */ | 1072 | /* rs690, rs740 */ |
996 | extern void rs690_line_buffer_adjust(struct radeon_device *rdev, | 1073 | extern void rs690_line_buffer_adjust(struct radeon_device *rdev, |
@@ -1009,8 +1086,9 @@ extern int r600_pcie_gart_init(struct radeon_device *rdev); | |||
1009 | extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev); | 1086 | extern void r600_pcie_gart_tlb_flush(struct radeon_device *rdev); |
1010 | extern int r600_ib_test(struct radeon_device *rdev); | 1087 | extern int r600_ib_test(struct radeon_device *rdev); |
1011 | extern int r600_ring_test(struct radeon_device *rdev); | 1088 | extern int r600_ring_test(struct radeon_device *rdev); |
1012 | extern int r600_wb_init(struct radeon_device *rdev); | ||
1013 | extern void r600_wb_fini(struct radeon_device *rdev); | 1089 | extern void r600_wb_fini(struct radeon_device *rdev); |
1090 | extern int r600_wb_enable(struct radeon_device *rdev); | ||
1091 | extern void r600_wb_disable(struct radeon_device *rdev); | ||
1014 | extern void r600_scratch_init(struct radeon_device *rdev); | 1092 | extern void r600_scratch_init(struct radeon_device *rdev); |
1015 | extern int r600_blit_init(struct radeon_device *rdev); | 1093 | extern int r600_blit_init(struct radeon_device *rdev); |
1016 | extern void r600_blit_fini(struct radeon_device *rdev); | 1094 | extern void r600_blit_fini(struct radeon_device *rdev); |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 8968f78fa1e..c3532c7a6f3 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -41,28 +41,17 @@ void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); | |||
41 | /* | 41 | /* |
42 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 | 42 | * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 |
43 | */ | 43 | */ |
44 | int r100_init(struct radeon_device *rdev); | 44 | extern int r100_init(struct radeon_device *rdev); |
45 | int r200_init(struct radeon_device *rdev); | 45 | extern void r100_fini(struct radeon_device *rdev); |
46 | extern int r100_suspend(struct radeon_device *rdev); | ||
47 | extern int r100_resume(struct radeon_device *rdev); | ||
46 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); | 48 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg); |
47 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 49 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
48 | void r100_errata(struct radeon_device *rdev); | ||
49 | void r100_vram_info(struct radeon_device *rdev); | ||
50 | void r100_vga_set_state(struct radeon_device *rdev, bool state); | 50 | void r100_vga_set_state(struct radeon_device *rdev, bool state); |
51 | int r100_gpu_reset(struct radeon_device *rdev); | 51 | int r100_gpu_reset(struct radeon_device *rdev); |
52 | int r100_mc_init(struct radeon_device *rdev); | ||
53 | void r100_mc_fini(struct radeon_device *rdev); | ||
54 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); | 52 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc); |
55 | int r100_wb_init(struct radeon_device *rdev); | ||
56 | void r100_wb_fini(struct radeon_device *rdev); | ||
57 | int r100_pci_gart_init(struct radeon_device *rdev); | ||
58 | void r100_pci_gart_fini(struct radeon_device *rdev); | ||
59 | int r100_pci_gart_enable(struct radeon_device *rdev); | ||
60 | void r100_pci_gart_disable(struct radeon_device *rdev); | ||
61 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); | 53 | void r100_pci_gart_tlb_flush(struct radeon_device *rdev); |
62 | int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 54 | int r100_pci_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
63 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | ||
64 | void r100_cp_fini(struct radeon_device *rdev); | ||
65 | void r100_cp_disable(struct radeon_device *rdev); | ||
66 | void r100_cp_commit(struct radeon_device *rdev); | 55 | void r100_cp_commit(struct radeon_device *rdev); |
67 | void r100_ring_start(struct radeon_device *rdev); | 56 | void r100_ring_start(struct radeon_device *rdev); |
68 | int r100_irq_set(struct radeon_device *rdev); | 57 | int r100_irq_set(struct radeon_device *rdev); |
@@ -83,33 +72,21 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg, | |||
83 | int r100_clear_surface_reg(struct radeon_device *rdev, int reg); | 72 | int r100_clear_surface_reg(struct radeon_device *rdev, int reg); |
84 | void r100_bandwidth_update(struct radeon_device *rdev); | 73 | void r100_bandwidth_update(struct radeon_device *rdev); |
85 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 74 | void r100_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
86 | int r100_ib_test(struct radeon_device *rdev); | ||
87 | int r100_ring_test(struct radeon_device *rdev); | 75 | int r100_ring_test(struct radeon_device *rdev); |
88 | 76 | ||
89 | static struct radeon_asic r100_asic = { | 77 | static struct radeon_asic r100_asic = { |
90 | .init = &r100_init, | 78 | .init = &r100_init, |
91 | .errata = &r100_errata, | 79 | .fini = &r100_fini, |
92 | .vram_info = &r100_vram_info, | 80 | .suspend = &r100_suspend, |
81 | .resume = &r100_resume, | ||
93 | .vga_set_state = &r100_vga_set_state, | 82 | .vga_set_state = &r100_vga_set_state, |
94 | .gpu_reset = &r100_gpu_reset, | 83 | .gpu_reset = &r100_gpu_reset, |
95 | .mc_init = &r100_mc_init, | ||
96 | .mc_fini = &r100_mc_fini, | ||
97 | .wb_init = &r100_wb_init, | ||
98 | .wb_fini = &r100_wb_fini, | ||
99 | .gart_init = &r100_pci_gart_init, | ||
100 | .gart_fini = &r100_pci_gart_fini, | ||
101 | .gart_enable = &r100_pci_gart_enable, | ||
102 | .gart_disable = &r100_pci_gart_disable, | ||
103 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, | 84 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, |
104 | .gart_set_page = &r100_pci_gart_set_page, | 85 | .gart_set_page = &r100_pci_gart_set_page, |
105 | .cp_init = &r100_cp_init, | ||
106 | .cp_fini = &r100_cp_fini, | ||
107 | .cp_disable = &r100_cp_disable, | ||
108 | .cp_commit = &r100_cp_commit, | 86 | .cp_commit = &r100_cp_commit, |
109 | .ring_start = &r100_ring_start, | 87 | .ring_start = &r100_ring_start, |
110 | .ring_test = &r100_ring_test, | 88 | .ring_test = &r100_ring_test, |
111 | .ring_ib_execute = &r100_ring_ib_execute, | 89 | .ring_ib_execute = &r100_ring_ib_execute, |
112 | .ib_test = &r100_ib_test, | ||
113 | .irq_set = &r100_irq_set, | 90 | .irq_set = &r100_irq_set, |
114 | .irq_process = &r100_irq_process, | 91 | .irq_process = &r100_irq_process, |
115 | .get_vblank_counter = &r100_get_vblank_counter, | 92 | .get_vblank_counter = &r100_get_vblank_counter, |
@@ -131,55 +108,38 @@ static struct radeon_asic r100_asic = { | |||
131 | /* | 108 | /* |
132 | * r300,r350,rv350,rv380 | 109 | * r300,r350,rv350,rv380 |
133 | */ | 110 | */ |
134 | int r300_init(struct radeon_device *rdev); | 111 | extern int r300_init(struct radeon_device *rdev); |
135 | void r300_errata(struct radeon_device *rdev); | 112 | extern void r300_fini(struct radeon_device *rdev); |
136 | void r300_vram_info(struct radeon_device *rdev); | 113 | extern int r300_suspend(struct radeon_device *rdev); |
137 | int r300_gpu_reset(struct radeon_device *rdev); | 114 | extern int r300_resume(struct radeon_device *rdev); |
138 | int r300_mc_init(struct radeon_device *rdev); | 115 | extern int r300_gpu_reset(struct radeon_device *rdev); |
139 | void r300_mc_fini(struct radeon_device *rdev); | 116 | extern void r300_ring_start(struct radeon_device *rdev); |
140 | void r300_ring_start(struct radeon_device *rdev); | 117 | extern void r300_fence_ring_emit(struct radeon_device *rdev, |
141 | void r300_fence_ring_emit(struct radeon_device *rdev, | 118 | struct radeon_fence *fence); |
142 | struct radeon_fence *fence); | 119 | extern int r300_cs_parse(struct radeon_cs_parser *p); |
143 | int r300_cs_parse(struct radeon_cs_parser *p); | 120 | extern void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); |
144 | int rv370_pcie_gart_init(struct radeon_device *rdev); | 121 | extern int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
145 | void rv370_pcie_gart_fini(struct radeon_device *rdev); | 122 | extern uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg); |
146 | int rv370_pcie_gart_enable(struct radeon_device *rdev); | 123 | extern void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
147 | void rv370_pcie_gart_disable(struct radeon_device *rdev); | 124 | extern void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); |
148 | void rv370_pcie_gart_tlb_flush(struct radeon_device *rdev); | 125 | extern int r300_copy_dma(struct radeon_device *rdev, |
149 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 126 | uint64_t src_offset, |
150 | uint32_t rv370_pcie_rreg(struct radeon_device *rdev, uint32_t reg); | 127 | uint64_t dst_offset, |
151 | void rv370_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 128 | unsigned num_pages, |
152 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes); | 129 | struct radeon_fence *fence); |
153 | int r300_copy_dma(struct radeon_device *rdev, | ||
154 | uint64_t src_offset, | ||
155 | uint64_t dst_offset, | ||
156 | unsigned num_pages, | ||
157 | struct radeon_fence *fence); | ||
158 | |||
159 | static struct radeon_asic r300_asic = { | 130 | static struct radeon_asic r300_asic = { |
160 | .init = &r300_init, | 131 | .init = &r300_init, |
161 | .errata = &r300_errata, | 132 | .fini = &r300_fini, |
162 | .vram_info = &r300_vram_info, | 133 | .suspend = &r300_suspend, |
134 | .resume = &r300_resume, | ||
163 | .vga_set_state = &r100_vga_set_state, | 135 | .vga_set_state = &r100_vga_set_state, |
164 | .gpu_reset = &r300_gpu_reset, | 136 | .gpu_reset = &r300_gpu_reset, |
165 | .mc_init = &r300_mc_init, | ||
166 | .mc_fini = &r300_mc_fini, | ||
167 | .wb_init = &r100_wb_init, | ||
168 | .wb_fini = &r100_wb_fini, | ||
169 | .gart_init = &r100_pci_gart_init, | ||
170 | .gart_fini = &r100_pci_gart_fini, | ||
171 | .gart_enable = &r100_pci_gart_enable, | ||
172 | .gart_disable = &r100_pci_gart_disable, | ||
173 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, | 137 | .gart_tlb_flush = &r100_pci_gart_tlb_flush, |
174 | .gart_set_page = &r100_pci_gart_set_page, | 138 | .gart_set_page = &r100_pci_gart_set_page, |
175 | .cp_init = &r100_cp_init, | ||
176 | .cp_fini = &r100_cp_fini, | ||
177 | .cp_disable = &r100_cp_disable, | ||
178 | .cp_commit = &r100_cp_commit, | 139 | .cp_commit = &r100_cp_commit, |
179 | .ring_start = &r300_ring_start, | 140 | .ring_start = &r300_ring_start, |
180 | .ring_test = &r100_ring_test, | 141 | .ring_test = &r100_ring_test, |
181 | .ring_ib_execute = &r100_ring_ib_execute, | 142 | .ring_ib_execute = &r100_ring_ib_execute, |
182 | .ib_test = &r100_ib_test, | ||
183 | .irq_set = &r100_irq_set, | 143 | .irq_set = &r100_irq_set, |
184 | .irq_process = &r100_irq_process, | 144 | .irq_process = &r100_irq_process, |
185 | .get_vblank_counter = &r100_get_vblank_counter, | 145 | .get_vblank_counter = &r100_get_vblank_counter, |
@@ -209,26 +169,14 @@ static struct radeon_asic r420_asic = { | |||
209 | .fini = &r420_fini, | 169 | .fini = &r420_fini, |
210 | .suspend = &r420_suspend, | 170 | .suspend = &r420_suspend, |
211 | .resume = &r420_resume, | 171 | .resume = &r420_resume, |
212 | .errata = NULL, | ||
213 | .vram_info = NULL, | ||
214 | .vga_set_state = &r100_vga_set_state, | 172 | .vga_set_state = &r100_vga_set_state, |
215 | .gpu_reset = &r300_gpu_reset, | 173 | .gpu_reset = &r300_gpu_reset, |
216 | .mc_init = NULL, | ||
217 | .mc_fini = NULL, | ||
218 | .wb_init = NULL, | ||
219 | .wb_fini = NULL, | ||
220 | .gart_enable = NULL, | ||
221 | .gart_disable = NULL, | ||
222 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 174 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
223 | .gart_set_page = &rv370_pcie_gart_set_page, | 175 | .gart_set_page = &rv370_pcie_gart_set_page, |
224 | .cp_init = NULL, | ||
225 | .cp_fini = NULL, | ||
226 | .cp_disable = NULL, | ||
227 | .cp_commit = &r100_cp_commit, | 176 | .cp_commit = &r100_cp_commit, |
228 | .ring_start = &r300_ring_start, | 177 | .ring_start = &r300_ring_start, |
229 | .ring_test = &r100_ring_test, | 178 | .ring_test = &r100_ring_test, |
230 | .ring_ib_execute = &r100_ring_ib_execute, | 179 | .ring_ib_execute = &r100_ring_ib_execute, |
231 | .ib_test = NULL, | ||
232 | .irq_set = &r100_irq_set, | 180 | .irq_set = &r100_irq_set, |
233 | .irq_process = &r100_irq_process, | 181 | .irq_process = &r100_irq_process, |
234 | .get_vblank_counter = &r100_get_vblank_counter, | 182 | .get_vblank_counter = &r100_get_vblank_counter, |
@@ -250,42 +198,27 @@ static struct radeon_asic r420_asic = { | |||
250 | /* | 198 | /* |
251 | * rs400,rs480 | 199 | * rs400,rs480 |
252 | */ | 200 | */ |
253 | void rs400_errata(struct radeon_device *rdev); | 201 | extern int rs400_init(struct radeon_device *rdev); |
254 | void rs400_vram_info(struct radeon_device *rdev); | 202 | extern void rs400_fini(struct radeon_device *rdev); |
255 | int rs400_mc_init(struct radeon_device *rdev); | 203 | extern int rs400_suspend(struct radeon_device *rdev); |
256 | void rs400_mc_fini(struct radeon_device *rdev); | 204 | extern int rs400_resume(struct radeon_device *rdev); |
257 | int rs400_gart_init(struct radeon_device *rdev); | ||
258 | void rs400_gart_fini(struct radeon_device *rdev); | ||
259 | int rs400_gart_enable(struct radeon_device *rdev); | ||
260 | void rs400_gart_disable(struct radeon_device *rdev); | ||
261 | void rs400_gart_tlb_flush(struct radeon_device *rdev); | 205 | void rs400_gart_tlb_flush(struct radeon_device *rdev); |
262 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 206 | int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
263 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 207 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
264 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 208 | void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
265 | static struct radeon_asic rs400_asic = { | 209 | static struct radeon_asic rs400_asic = { |
266 | .init = &r300_init, | 210 | .init = &rs400_init, |
267 | .errata = &rs400_errata, | 211 | .fini = &rs400_fini, |
268 | .vram_info = &rs400_vram_info, | 212 | .suspend = &rs400_suspend, |
213 | .resume = &rs400_resume, | ||
269 | .vga_set_state = &r100_vga_set_state, | 214 | .vga_set_state = &r100_vga_set_state, |
270 | .gpu_reset = &r300_gpu_reset, | 215 | .gpu_reset = &r300_gpu_reset, |
271 | .mc_init = &rs400_mc_init, | ||
272 | .mc_fini = &rs400_mc_fini, | ||
273 | .wb_init = &r100_wb_init, | ||
274 | .wb_fini = &r100_wb_fini, | ||
275 | .gart_init = &rs400_gart_init, | ||
276 | .gart_fini = &rs400_gart_fini, | ||
277 | .gart_enable = &rs400_gart_enable, | ||
278 | .gart_disable = &rs400_gart_disable, | ||
279 | .gart_tlb_flush = &rs400_gart_tlb_flush, | 216 | .gart_tlb_flush = &rs400_gart_tlb_flush, |
280 | .gart_set_page = &rs400_gart_set_page, | 217 | .gart_set_page = &rs400_gart_set_page, |
281 | .cp_init = &r100_cp_init, | ||
282 | .cp_fini = &r100_cp_fini, | ||
283 | .cp_disable = &r100_cp_disable, | ||
284 | .cp_commit = &r100_cp_commit, | 218 | .cp_commit = &r100_cp_commit, |
285 | .ring_start = &r300_ring_start, | 219 | .ring_start = &r300_ring_start, |
286 | .ring_test = &r100_ring_test, | 220 | .ring_test = &r100_ring_test, |
287 | .ring_ib_execute = &r100_ring_ib_execute, | 221 | .ring_ib_execute = &r100_ring_ib_execute, |
288 | .ib_test = &r100_ib_test, | ||
289 | .irq_set = &r100_irq_set, | 222 | .irq_set = &r100_irq_set, |
290 | .irq_process = &r100_irq_process, | 223 | .irq_process = &r100_irq_process, |
291 | .get_vblank_counter = &r100_get_vblank_counter, | 224 | .get_vblank_counter = &r100_get_vblank_counter, |
@@ -307,18 +240,13 @@ static struct radeon_asic rs400_asic = { | |||
307 | /* | 240 | /* |
308 | * rs600. | 241 | * rs600. |
309 | */ | 242 | */ |
310 | int rs600_init(struct radeon_device *rdev); | 243 | extern int rs600_init(struct radeon_device *rdev); |
311 | void rs600_errata(struct radeon_device *rdev); | 244 | extern void rs600_fini(struct radeon_device *rdev); |
312 | void rs600_vram_info(struct radeon_device *rdev); | 245 | extern int rs600_suspend(struct radeon_device *rdev); |
313 | int rs600_mc_init(struct radeon_device *rdev); | 246 | extern int rs600_resume(struct radeon_device *rdev); |
314 | void rs600_mc_fini(struct radeon_device *rdev); | ||
315 | int rs600_irq_set(struct radeon_device *rdev); | 247 | int rs600_irq_set(struct radeon_device *rdev); |
316 | int rs600_irq_process(struct radeon_device *rdev); | 248 | int rs600_irq_process(struct radeon_device *rdev); |
317 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); | 249 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc); |
318 | int rs600_gart_init(struct radeon_device *rdev); | ||
319 | void rs600_gart_fini(struct radeon_device *rdev); | ||
320 | int rs600_gart_enable(struct radeon_device *rdev); | ||
321 | void rs600_gart_disable(struct radeon_device *rdev); | ||
322 | void rs600_gart_tlb_flush(struct radeon_device *rdev); | 250 | void rs600_gart_tlb_flush(struct radeon_device *rdev); |
323 | int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); | 251 | int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr); |
324 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 252 | 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); | |||
326 | void rs600_bandwidth_update(struct radeon_device *rdev); | 254 | void rs600_bandwidth_update(struct radeon_device *rdev); |
327 | static struct radeon_asic rs600_asic = { | 255 | static struct radeon_asic rs600_asic = { |
328 | .init = &rs600_init, | 256 | .init = &rs600_init, |
329 | .errata = &rs600_errata, | 257 | .fini = &rs600_fini, |
330 | .vram_info = &rs600_vram_info, | 258 | .suspend = &rs600_suspend, |
259 | .resume = &rs600_resume, | ||
331 | .vga_set_state = &r100_vga_set_state, | 260 | .vga_set_state = &r100_vga_set_state, |
332 | .gpu_reset = &r300_gpu_reset, | 261 | .gpu_reset = &r300_gpu_reset, |
333 | .mc_init = &rs600_mc_init, | ||
334 | .mc_fini = &rs600_mc_fini, | ||
335 | .wb_init = &r100_wb_init, | ||
336 | .wb_fini = &r100_wb_fini, | ||
337 | .gart_init = &rs600_gart_init, | ||
338 | .gart_fini = &rs600_gart_fini, | ||
339 | .gart_enable = &rs600_gart_enable, | ||
340 | .gart_disable = &rs600_gart_disable, | ||
341 | .gart_tlb_flush = &rs600_gart_tlb_flush, | 262 | .gart_tlb_flush = &rs600_gart_tlb_flush, |
342 | .gart_set_page = &rs600_gart_set_page, | 263 | .gart_set_page = &rs600_gart_set_page, |
343 | .cp_init = &r100_cp_init, | ||
344 | .cp_fini = &r100_cp_fini, | ||
345 | .cp_disable = &r100_cp_disable, | ||
346 | .cp_commit = &r100_cp_commit, | 264 | .cp_commit = &r100_cp_commit, |
347 | .ring_start = &r300_ring_start, | 265 | .ring_start = &r300_ring_start, |
348 | .ring_test = &r100_ring_test, | 266 | .ring_test = &r100_ring_test, |
349 | .ring_ib_execute = &r100_ring_ib_execute, | 267 | .ring_ib_execute = &r100_ring_ib_execute, |
350 | .ib_test = &r100_ib_test, | ||
351 | .irq_set = &rs600_irq_set, | 268 | .irq_set = &rs600_irq_set, |
352 | .irq_process = &rs600_irq_process, | 269 | .irq_process = &rs600_irq_process, |
353 | .get_vblank_counter = &rs600_get_vblank_counter, | 270 | .get_vblank_counter = &rs600_get_vblank_counter, |
@@ -367,37 +284,26 @@ static struct radeon_asic rs600_asic = { | |||
367 | /* | 284 | /* |
368 | * rs690,rs740 | 285 | * rs690,rs740 |
369 | */ | 286 | */ |
370 | void rs690_errata(struct radeon_device *rdev); | 287 | int rs690_init(struct radeon_device *rdev); |
371 | void rs690_vram_info(struct radeon_device *rdev); | 288 | void rs690_fini(struct radeon_device *rdev); |
372 | int rs690_mc_init(struct radeon_device *rdev); | 289 | int rs690_resume(struct radeon_device *rdev); |
373 | void rs690_mc_fini(struct radeon_device *rdev); | 290 | int rs690_suspend(struct radeon_device *rdev); |
374 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 291 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
375 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 292 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
376 | void rs690_bandwidth_update(struct radeon_device *rdev); | 293 | void rs690_bandwidth_update(struct radeon_device *rdev); |
377 | static struct radeon_asic rs690_asic = { | 294 | static struct radeon_asic rs690_asic = { |
378 | .init = &rs600_init, | 295 | .init = &rs690_init, |
379 | .errata = &rs690_errata, | 296 | .fini = &rs690_fini, |
380 | .vram_info = &rs690_vram_info, | 297 | .suspend = &rs690_suspend, |
298 | .resume = &rs690_resume, | ||
381 | .vga_set_state = &r100_vga_set_state, | 299 | .vga_set_state = &r100_vga_set_state, |
382 | .gpu_reset = &r300_gpu_reset, | 300 | .gpu_reset = &r300_gpu_reset, |
383 | .mc_init = &rs690_mc_init, | ||
384 | .mc_fini = &rs690_mc_fini, | ||
385 | .wb_init = &r100_wb_init, | ||
386 | .wb_fini = &r100_wb_fini, | ||
387 | .gart_init = &rs400_gart_init, | ||
388 | .gart_fini = &rs400_gart_fini, | ||
389 | .gart_enable = &rs400_gart_enable, | ||
390 | .gart_disable = &rs400_gart_disable, | ||
391 | .gart_tlb_flush = &rs400_gart_tlb_flush, | 301 | .gart_tlb_flush = &rs400_gart_tlb_flush, |
392 | .gart_set_page = &rs400_gart_set_page, | 302 | .gart_set_page = &rs400_gart_set_page, |
393 | .cp_init = &r100_cp_init, | ||
394 | .cp_fini = &r100_cp_fini, | ||
395 | .cp_disable = &r100_cp_disable, | ||
396 | .cp_commit = &r100_cp_commit, | 303 | .cp_commit = &r100_cp_commit, |
397 | .ring_start = &r300_ring_start, | 304 | .ring_start = &r300_ring_start, |
398 | .ring_test = &r100_ring_test, | 305 | .ring_test = &r100_ring_test, |
399 | .ring_ib_execute = &r100_ring_ib_execute, | 306 | .ring_ib_execute = &r100_ring_ib_execute, |
400 | .ib_test = &r100_ib_test, | ||
401 | .irq_set = &rs600_irq_set, | 307 | .irq_set = &rs600_irq_set, |
402 | .irq_process = &rs600_irq_process, | 308 | .irq_process = &rs600_irq_process, |
403 | .get_vblank_counter = &rs600_get_vblank_counter, | 309 | .get_vblank_counter = &rs600_get_vblank_counter, |
@@ -420,41 +326,29 @@ static struct radeon_asic rs690_asic = { | |||
420 | * rv515 | 326 | * rv515 |
421 | */ | 327 | */ |
422 | int rv515_init(struct radeon_device *rdev); | 328 | int rv515_init(struct radeon_device *rdev); |
423 | void rv515_errata(struct radeon_device *rdev); | 329 | void rv515_fini(struct radeon_device *rdev); |
424 | void rv515_vram_info(struct radeon_device *rdev); | ||
425 | int rv515_gpu_reset(struct radeon_device *rdev); | 330 | int rv515_gpu_reset(struct radeon_device *rdev); |
426 | int rv515_mc_init(struct radeon_device *rdev); | ||
427 | void rv515_mc_fini(struct radeon_device *rdev); | ||
428 | uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg); | 331 | uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg); |
429 | void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 332 | void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
430 | void rv515_ring_start(struct radeon_device *rdev); | 333 | void rv515_ring_start(struct radeon_device *rdev); |
431 | uint32_t rv515_pcie_rreg(struct radeon_device *rdev, uint32_t reg); | 334 | uint32_t rv515_pcie_rreg(struct radeon_device *rdev, uint32_t reg); |
432 | void rv515_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | 335 | void rv515_pcie_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); |
433 | void rv515_bandwidth_update(struct radeon_device *rdev); | 336 | void rv515_bandwidth_update(struct radeon_device *rdev); |
337 | int rv515_resume(struct radeon_device *rdev); | ||
338 | int rv515_suspend(struct radeon_device *rdev); | ||
434 | static struct radeon_asic rv515_asic = { | 339 | static struct radeon_asic rv515_asic = { |
435 | .init = &rv515_init, | 340 | .init = &rv515_init, |
436 | .errata = &rv515_errata, | 341 | .fini = &rv515_fini, |
437 | .vram_info = &rv515_vram_info, | 342 | .suspend = &rv515_suspend, |
343 | .resume = &rv515_resume, | ||
438 | .vga_set_state = &r100_vga_set_state, | 344 | .vga_set_state = &r100_vga_set_state, |
439 | .gpu_reset = &rv515_gpu_reset, | 345 | .gpu_reset = &rv515_gpu_reset, |
440 | .mc_init = &rv515_mc_init, | ||
441 | .mc_fini = &rv515_mc_fini, | ||
442 | .wb_init = &r100_wb_init, | ||
443 | .wb_fini = &r100_wb_fini, | ||
444 | .gart_init = &rv370_pcie_gart_init, | ||
445 | .gart_fini = &rv370_pcie_gart_fini, | ||
446 | .gart_enable = &rv370_pcie_gart_enable, | ||
447 | .gart_disable = &rv370_pcie_gart_disable, | ||
448 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 346 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
449 | .gart_set_page = &rv370_pcie_gart_set_page, | 347 | .gart_set_page = &rv370_pcie_gart_set_page, |
450 | .cp_init = &r100_cp_init, | ||
451 | .cp_fini = &r100_cp_fini, | ||
452 | .cp_disable = &r100_cp_disable, | ||
453 | .cp_commit = &r100_cp_commit, | 348 | .cp_commit = &r100_cp_commit, |
454 | .ring_start = &rv515_ring_start, | 349 | .ring_start = &rv515_ring_start, |
455 | .ring_test = &r100_ring_test, | 350 | .ring_test = &r100_ring_test, |
456 | .ring_ib_execute = &r100_ring_ib_execute, | 351 | .ring_ib_execute = &r100_ring_ib_execute, |
457 | .ib_test = &r100_ib_test, | ||
458 | .irq_set = &rs600_irq_set, | 352 | .irq_set = &rs600_irq_set, |
459 | .irq_process = &rs600_irq_process, | 353 | .irq_process = &rs600_irq_process, |
460 | .get_vblank_counter = &rs600_get_vblank_counter, | 354 | .get_vblank_counter = &rs600_get_vblank_counter, |
@@ -476,35 +370,21 @@ static struct radeon_asic rv515_asic = { | |||
476 | /* | 370 | /* |
477 | * r520,rv530,rv560,rv570,r580 | 371 | * r520,rv530,rv560,rv570,r580 |
478 | */ | 372 | */ |
479 | void r520_errata(struct radeon_device *rdev); | 373 | int r520_init(struct radeon_device *rdev); |
480 | void r520_vram_info(struct radeon_device *rdev); | 374 | int r520_resume(struct radeon_device *rdev); |
481 | int r520_mc_init(struct radeon_device *rdev); | ||
482 | void r520_mc_fini(struct radeon_device *rdev); | ||
483 | void r520_bandwidth_update(struct radeon_device *rdev); | ||
484 | static struct radeon_asic r520_asic = { | 375 | static struct radeon_asic r520_asic = { |
485 | .init = &rv515_init, | 376 | .init = &r520_init, |
486 | .errata = &r520_errata, | 377 | .fini = &rv515_fini, |
487 | .vram_info = &r520_vram_info, | 378 | .suspend = &rv515_suspend, |
379 | .resume = &r520_resume, | ||
488 | .vga_set_state = &r100_vga_set_state, | 380 | .vga_set_state = &r100_vga_set_state, |
489 | .gpu_reset = &rv515_gpu_reset, | 381 | .gpu_reset = &rv515_gpu_reset, |
490 | .mc_init = &r520_mc_init, | ||
491 | .mc_fini = &r520_mc_fini, | ||
492 | .wb_init = &r100_wb_init, | ||
493 | .wb_fini = &r100_wb_fini, | ||
494 | .gart_init = &rv370_pcie_gart_init, | ||
495 | .gart_fini = &rv370_pcie_gart_fini, | ||
496 | .gart_enable = &rv370_pcie_gart_enable, | ||
497 | .gart_disable = &rv370_pcie_gart_disable, | ||
498 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, | 382 | .gart_tlb_flush = &rv370_pcie_gart_tlb_flush, |
499 | .gart_set_page = &rv370_pcie_gart_set_page, | 383 | .gart_set_page = &rv370_pcie_gart_set_page, |
500 | .cp_init = &r100_cp_init, | ||
501 | .cp_fini = &r100_cp_fini, | ||
502 | .cp_disable = &r100_cp_disable, | ||
503 | .cp_commit = &r100_cp_commit, | 384 | .cp_commit = &r100_cp_commit, |
504 | .ring_start = &rv515_ring_start, | 385 | .ring_start = &rv515_ring_start, |
505 | .ring_test = &r100_ring_test, | 386 | .ring_test = &r100_ring_test, |
506 | .ring_ib_execute = &r100_ring_ib_execute, | 387 | .ring_ib_execute = &r100_ring_ib_execute, |
507 | .ib_test = &r100_ib_test, | ||
508 | .irq_set = &rs600_irq_set, | 388 | .irq_set = &rs600_irq_set, |
509 | .irq_process = &rs600_irq_process, | 389 | .irq_process = &rs600_irq_process, |
510 | .get_vblank_counter = &rs600_get_vblank_counter, | 390 | .get_vblank_counter = &rs600_get_vblank_counter, |
@@ -519,7 +399,7 @@ static struct radeon_asic r520_asic = { | |||
519 | .set_clock_gating = &radeon_atom_set_clock_gating, | 399 | .set_clock_gating = &radeon_atom_set_clock_gating, |
520 | .set_surface_reg = r100_set_surface_reg, | 400 | .set_surface_reg = r100_set_surface_reg, |
521 | .clear_surface_reg = r100_clear_surface_reg, | 401 | .clear_surface_reg = r100_clear_surface_reg, |
522 | .bandwidth_update = &r520_bandwidth_update, | 402 | .bandwidth_update = &rv515_bandwidth_update, |
523 | }; | 403 | }; |
524 | 404 | ||
525 | /* | 405 | /* |
@@ -552,37 +432,23 @@ int r600_set_surface_reg(struct radeon_device *rdev, int reg, | |||
552 | uint32_t offset, uint32_t obj_size); | 432 | uint32_t offset, uint32_t obj_size); |
553 | int r600_clear_surface_reg(struct radeon_device *rdev, int reg); | 433 | int r600_clear_surface_reg(struct radeon_device *rdev, int reg); |
554 | void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); | 434 | void r600_ring_ib_execute(struct radeon_device *rdev, struct radeon_ib *ib); |
555 | int r600_ib_test(struct radeon_device *rdev); | ||
556 | int r600_ring_test(struct radeon_device *rdev); | 435 | int r600_ring_test(struct radeon_device *rdev); |
557 | int r600_copy_blit(struct radeon_device *rdev, | 436 | int r600_copy_blit(struct radeon_device *rdev, |
558 | uint64_t src_offset, uint64_t dst_offset, | 437 | uint64_t src_offset, uint64_t dst_offset, |
559 | unsigned num_pages, struct radeon_fence *fence); | 438 | unsigned num_pages, struct radeon_fence *fence); |
560 | 439 | ||
561 | static struct radeon_asic r600_asic = { | 440 | static struct radeon_asic r600_asic = { |
562 | .errata = NULL, | ||
563 | .init = &r600_init, | 441 | .init = &r600_init, |
564 | .fini = &r600_fini, | 442 | .fini = &r600_fini, |
565 | .suspend = &r600_suspend, | 443 | .suspend = &r600_suspend, |
566 | .resume = &r600_resume, | 444 | .resume = &r600_resume, |
567 | .cp_commit = &r600_cp_commit, | 445 | .cp_commit = &r600_cp_commit, |
568 | .vram_info = NULL, | ||
569 | .vga_set_state = &r600_vga_set_state, | 446 | .vga_set_state = &r600_vga_set_state, |
570 | .gpu_reset = &r600_gpu_reset, | 447 | .gpu_reset = &r600_gpu_reset, |
571 | .mc_init = NULL, | ||
572 | .mc_fini = NULL, | ||
573 | .wb_init = &r600_wb_init, | ||
574 | .wb_fini = &r600_wb_fini, | ||
575 | .gart_enable = NULL, | ||
576 | .gart_disable = NULL, | ||
577 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, | 448 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, |
578 | .gart_set_page = &rs600_gart_set_page, | 449 | .gart_set_page = &rs600_gart_set_page, |
579 | .cp_init = NULL, | ||
580 | .cp_fini = NULL, | ||
581 | .cp_disable = NULL, | ||
582 | .ring_start = NULL, | ||
583 | .ring_test = &r600_ring_test, | 450 | .ring_test = &r600_ring_test, |
584 | .ring_ib_execute = &r600_ring_ib_execute, | 451 | .ring_ib_execute = &r600_ring_ib_execute, |
585 | .ib_test = &r600_ib_test, | ||
586 | .irq_set = &r600_irq_set, | 452 | .irq_set = &r600_irq_set, |
587 | .irq_process = &r600_irq_process, | 453 | .irq_process = &r600_irq_process, |
588 | .fence_ring_emit = &r600_fence_ring_emit, | 454 | .fence_ring_emit = &r600_fence_ring_emit, |
@@ -596,7 +462,7 @@ static struct radeon_asic r600_asic = { | |||
596 | .set_clock_gating = &radeon_atom_set_clock_gating, | 462 | .set_clock_gating = &radeon_atom_set_clock_gating, |
597 | .set_surface_reg = r600_set_surface_reg, | 463 | .set_surface_reg = r600_set_surface_reg, |
598 | .clear_surface_reg = r600_clear_surface_reg, | 464 | .clear_surface_reg = r600_clear_surface_reg, |
599 | .bandwidth_update = &r520_bandwidth_update, | 465 | .bandwidth_update = &rv515_bandwidth_update, |
600 | }; | 466 | }; |
601 | 467 | ||
602 | /* | 468 | /* |
@@ -609,30 +475,17 @@ int rv770_resume(struct radeon_device *rdev); | |||
609 | int rv770_gpu_reset(struct radeon_device *rdev); | 475 | int rv770_gpu_reset(struct radeon_device *rdev); |
610 | 476 | ||
611 | static struct radeon_asic rv770_asic = { | 477 | static struct radeon_asic rv770_asic = { |
612 | .errata = NULL, | ||
613 | .init = &rv770_init, | 478 | .init = &rv770_init, |
614 | .fini = &rv770_fini, | 479 | .fini = &rv770_fini, |
615 | .suspend = &rv770_suspend, | 480 | .suspend = &rv770_suspend, |
616 | .resume = &rv770_resume, | 481 | .resume = &rv770_resume, |
617 | .cp_commit = &r600_cp_commit, | 482 | .cp_commit = &r600_cp_commit, |
618 | .vram_info = NULL, | ||
619 | .gpu_reset = &rv770_gpu_reset, | 483 | .gpu_reset = &rv770_gpu_reset, |
620 | .vga_set_state = &r600_vga_set_state, | 484 | .vga_set_state = &r600_vga_set_state, |
621 | .mc_init = NULL, | ||
622 | .mc_fini = NULL, | ||
623 | .wb_init = &r600_wb_init, | ||
624 | .wb_fini = &r600_wb_fini, | ||
625 | .gart_enable = NULL, | ||
626 | .gart_disable = NULL, | ||
627 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, | 485 | .gart_tlb_flush = &r600_pcie_gart_tlb_flush, |
628 | .gart_set_page = &rs600_gart_set_page, | 486 | .gart_set_page = &rs600_gart_set_page, |
629 | .cp_init = NULL, | ||
630 | .cp_fini = NULL, | ||
631 | .cp_disable = NULL, | ||
632 | .ring_start = NULL, | ||
633 | .ring_test = &r600_ring_test, | 487 | .ring_test = &r600_ring_test, |
634 | .ring_ib_execute = &r600_ring_ib_execute, | 488 | .ring_ib_execute = &r600_ring_ib_execute, |
635 | .ib_test = &r600_ib_test, | ||
636 | .irq_set = &r600_irq_set, | 489 | .irq_set = &r600_irq_set, |
637 | .irq_process = &r600_irq_process, | 490 | .irq_process = &r600_irq_process, |
638 | .fence_ring_emit = &r600_fence_ring_emit, | 491 | .fence_ring_emit = &r600_fence_ring_emit, |
@@ -646,7 +499,7 @@ static struct radeon_asic rv770_asic = { | |||
646 | .set_clock_gating = &radeon_atom_set_clock_gating, | 499 | .set_clock_gating = &radeon_atom_set_clock_gating, |
647 | .set_surface_reg = r600_set_surface_reg, | 500 | .set_surface_reg = r600_set_surface_reg, |
648 | .clear_surface_reg = r600_clear_surface_reg, | 501 | .clear_surface_reg = r600_clear_surface_reg, |
649 | .bandwidth_update = &r520_bandwidth_update, | 502 | .bandwidth_update = &rv515_bandwidth_update, |
650 | }; | 503 | }; |
651 | 504 | ||
652 | #endif | 505 | #endif |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 74374212830..5b6c08cee40 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -272,12 +272,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev) | |||
272 | (le16_to_cpu(path->usConnObjectId) & | 272 | (le16_to_cpu(path->usConnObjectId) & |
273 | OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; | 273 | OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; |
274 | 274 | ||
275 | if ((le16_to_cpu(path->usDeviceTag) == | 275 | /* TODO CV support */ |
276 | ATOM_DEVICE_TV1_SUPPORT) | 276 | if (le16_to_cpu(path->usDeviceTag) == |
277 | || (le16_to_cpu(path->usDeviceTag) == | 277 | ATOM_DEVICE_CV_SUPPORT) |
278 | ATOM_DEVICE_TV2_SUPPORT) | ||
279 | || (le16_to_cpu(path->usDeviceTag) == | ||
280 | ATOM_DEVICE_CV_SUPPORT)) | ||
281 | continue; | 278 | continue; |
282 | 279 | ||
283 | if ((rdev->family == CHIP_RS780) && | 280 | if ((rdev->family == CHIP_RS780) && |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 96e37a6e7ce..34a9b911951 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
@@ -33,12 +33,50 @@ | |||
33 | /* | 33 | /* |
34 | * BIOS. | 34 | * BIOS. |
35 | */ | 35 | */ |
36 | |||
37 | /* If you boot an IGP board with a discrete card as the primary, | ||
38 | * the IGP rom is not accessible via the rom bar as the IGP rom is | ||
39 | * part of the system bios. On boot, the system bios puts a | ||
40 | * copy of the igp rom at the start of vram if a discrete card is | ||
41 | * present. | ||
42 | */ | ||
43 | static bool igp_read_bios_from_vram(struct radeon_device *rdev) | ||
44 | { | ||
45 | uint8_t __iomem *bios; | ||
46 | resource_size_t vram_base; | ||
47 | resource_size_t size = 256 * 1024; /* ??? */ | ||
48 | |||
49 | rdev->bios = NULL; | ||
50 | vram_base = drm_get_resource_start(rdev->ddev, 0); | ||
51 | bios = ioremap(vram_base, size); | ||
52 | if (!bios) { | ||
53 | DRM_ERROR("Unable to mmap vram\n"); | ||
54 | return false; | ||
55 | } | ||
56 | |||
57 | if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) { | ||
58 | iounmap(bios); | ||
59 | DRM_ERROR("bad rom signature\n"); | ||
60 | return false; | ||
61 | } | ||
62 | rdev->bios = kmalloc(size, GFP_KERNEL); | ||
63 | if (rdev->bios == NULL) { | ||
64 | iounmap(bios); | ||
65 | DRM_ERROR("kmalloc failed\n"); | ||
66 | return false; | ||
67 | } | ||
68 | memcpy(rdev->bios, bios, size); | ||
69 | iounmap(bios); | ||
70 | return true; | ||
71 | } | ||
72 | |||
36 | static bool radeon_read_bios(struct radeon_device *rdev) | 73 | static bool radeon_read_bios(struct radeon_device *rdev) |
37 | { | 74 | { |
38 | uint8_t __iomem *bios; | 75 | uint8_t __iomem *bios; |
39 | size_t size; | 76 | size_t size; |
40 | 77 | ||
41 | rdev->bios = NULL; | 78 | rdev->bios = NULL; |
79 | /* XXX: some cards may return 0 for rom size? ddx has a workaround */ | ||
42 | bios = pci_map_rom(rdev->pdev, &size); | 80 | bios = pci_map_rom(rdev->pdev, &size); |
43 | if (!bios) { | 81 | if (!bios) { |
44 | return false; | 82 | return false; |
@@ -341,7 +379,9 @@ static bool legacy_read_disabled_bios(struct radeon_device *rdev) | |||
341 | 379 | ||
342 | static bool radeon_read_disabled_bios(struct radeon_device *rdev) | 380 | static bool radeon_read_disabled_bios(struct radeon_device *rdev) |
343 | { | 381 | { |
344 | if (rdev->family >= CHIP_RV770) | 382 | if (rdev->flags & RADEON_IS_IGP) |
383 | return igp_read_bios_from_vram(rdev); | ||
384 | else if (rdev->family >= CHIP_RV770) | ||
345 | return r700_read_disabled_bios(rdev); | 385 | return r700_read_disabled_bios(rdev); |
346 | else if (rdev->family >= CHIP_R600) | 386 | else if (rdev->family >= CHIP_R600) |
347 | return r600_read_disabled_bios(rdev); | 387 | return r600_read_disabled_bios(rdev); |
@@ -356,7 +396,12 @@ bool radeon_get_bios(struct radeon_device *rdev) | |||
356 | bool r; | 396 | bool r; |
357 | uint16_t tmp; | 397 | uint16_t tmp; |
358 | 398 | ||
359 | r = radeon_read_bios(rdev); | 399 | if (rdev->flags & RADEON_IS_IGP) { |
400 | r = igp_read_bios_from_vram(rdev); | ||
401 | if (r == false) | ||
402 | r = radeon_read_bios(rdev); | ||
403 | } else | ||
404 | r = radeon_read_bios(rdev); | ||
360 | if (r == false) { | 405 | if (r == false) { |
361 | r = radeon_read_disabled_bios(rdev); | 406 | r = radeon_read_disabled_bios(rdev); |
362 | } | 407 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_clocks.c b/drivers/gpu/drm/radeon/radeon_clocks.c index 152eef13197..f5c32a766b1 100644 --- a/drivers/gpu/drm/radeon/radeon_clocks.c +++ b/drivers/gpu/drm/radeon/radeon_clocks.c | |||
@@ -411,7 +411,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
411 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 411 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
412 | R300_PIXCLK_TVO_ALWAYS_ONb | | 412 | R300_PIXCLK_TVO_ALWAYS_ONb | |
413 | R300_P2G2CLK_ALWAYS_ONb | | 413 | R300_P2G2CLK_ALWAYS_ONb | |
414 | R300_P2G2CLK_ALWAYS_ONb); | 414 | R300_P2G2CLK_DAC_ALWAYS_ONb); |
415 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 415 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
416 | } else if (rdev->family >= CHIP_RV350) { | 416 | } else if (rdev->family >= CHIP_RV350) { |
417 | tmp = RREG32_PLL(R300_SCLK_CNTL2); | 417 | tmp = RREG32_PLL(R300_SCLK_CNTL2); |
@@ -464,7 +464,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
464 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 464 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
465 | R300_PIXCLK_TVO_ALWAYS_ONb | | 465 | R300_PIXCLK_TVO_ALWAYS_ONb | |
466 | R300_P2G2CLK_ALWAYS_ONb | | 466 | R300_P2G2CLK_ALWAYS_ONb | |
467 | R300_P2G2CLK_ALWAYS_ONb); | 467 | R300_P2G2CLK_DAC_ALWAYS_ONb); |
468 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 468 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
469 | 469 | ||
470 | tmp = RREG32_PLL(RADEON_MCLK_MISC); | 470 | tmp = RREG32_PLL(RADEON_MCLK_MISC); |
@@ -654,7 +654,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
654 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 654 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
655 | R300_PIXCLK_TVO_ALWAYS_ONb | | 655 | R300_PIXCLK_TVO_ALWAYS_ONb | |
656 | R300_P2G2CLK_ALWAYS_ONb | | 656 | R300_P2G2CLK_ALWAYS_ONb | |
657 | R300_P2G2CLK_ALWAYS_ONb | | 657 | R300_P2G2CLK_DAC_ALWAYS_ONb | |
658 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); | 658 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); |
659 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 659 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
660 | } else if (rdev->family >= CHIP_RV350) { | 660 | } else if (rdev->family >= CHIP_RV350) { |
@@ -705,7 +705,7 @@ void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable) | |||
705 | R300_PIXCLK_TRANS_ALWAYS_ONb | | 705 | R300_PIXCLK_TRANS_ALWAYS_ONb | |
706 | R300_PIXCLK_TVO_ALWAYS_ONb | | 706 | R300_PIXCLK_TVO_ALWAYS_ONb | |
707 | R300_P2G2CLK_ALWAYS_ONb | | 707 | R300_P2G2CLK_ALWAYS_ONb | |
708 | R300_P2G2CLK_ALWAYS_ONb | | 708 | R300_P2G2CLK_DAC_ALWAYS_ONb | |
709 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); | 709 | R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); |
710 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); | 710 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
711 | } else { | 711 | } else { |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index af1d551f1a8..e376be47a4a 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include "drmP.h" | 26 | #include "drmP.h" |
27 | #include "drm_edid.h" | 27 | #include "drm_edid.h" |
28 | #include "drm_crtc_helper.h" | 28 | #include "drm_crtc_helper.h" |
29 | #include "drm_fb_helper.h" | ||
29 | #include "radeon_drm.h" | 30 | #include "radeon_drm.h" |
30 | #include "radeon.h" | 31 | #include "radeon.h" |
31 | #include "atom.h" | 32 | #include "atom.h" |
@@ -245,7 +246,7 @@ static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_conn | |||
245 | if (common_modes[i].w < 320 || common_modes[i].h < 200) | 246 | if (common_modes[i].w < 320 || common_modes[i].h < 200) |
246 | continue; | 247 | continue; |
247 | 248 | ||
248 | mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false); | 249 | mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false); |
249 | drm_mode_probed_add(connector, mode); | 250 | drm_mode_probed_add(connector, mode); |
250 | } | 251 | } |
251 | } | 252 | } |
@@ -559,7 +560,7 @@ static int radeon_tv_get_modes(struct drm_connector *connector) | |||
559 | radeon_add_common_modes(encoder, connector); | 560 | radeon_add_common_modes(encoder, connector); |
560 | else { | 561 | else { |
561 | /* only 800x600 is supported right now on pre-avivo chips */ | 562 | /* only 800x600 is supported right now on pre-avivo chips */ |
562 | tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false); | 563 | tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false, false); |
563 | tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; | 564 | tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED; |
564 | drm_mode_probed_add(connector, tv_mode); | 565 | drm_mode_probed_add(connector, tv_mode); |
565 | } | 566 | } |
@@ -743,6 +744,15 @@ struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector) | |||
743 | return NULL; | 744 | return NULL; |
744 | } | 745 | } |
745 | 746 | ||
747 | static void radeon_dvi_force(struct drm_connector *connector) | ||
748 | { | ||
749 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
750 | if (connector->force == DRM_FORCE_ON) | ||
751 | radeon_connector->use_digital = false; | ||
752 | if (connector->force == DRM_FORCE_ON_DIGITAL) | ||
753 | radeon_connector->use_digital = true; | ||
754 | } | ||
755 | |||
746 | struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = { | 756 | struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = { |
747 | .get_modes = radeon_dvi_get_modes, | 757 | .get_modes = radeon_dvi_get_modes, |
748 | .mode_valid = radeon_vga_mode_valid, | 758 | .mode_valid = radeon_vga_mode_valid, |
@@ -755,6 +765,7 @@ struct drm_connector_funcs radeon_dvi_connector_funcs = { | |||
755 | .fill_modes = drm_helper_probe_single_connector_modes, | 765 | .fill_modes = drm_helper_probe_single_connector_modes, |
756 | .set_property = radeon_connector_set_property, | 766 | .set_property = radeon_connector_set_property, |
757 | .destroy = radeon_connector_destroy, | 767 | .destroy = radeon_connector_destroy, |
768 | .force = radeon_dvi_force, | ||
758 | }; | 769 | }; |
759 | 770 | ||
760 | void | 771 | void |
@@ -771,6 +782,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
771 | struct radeon_connector *radeon_connector; | 782 | struct radeon_connector *radeon_connector; |
772 | struct radeon_connector_atom_dig *radeon_dig_connector; | 783 | struct radeon_connector_atom_dig *radeon_dig_connector; |
773 | uint32_t subpixel_order = SubPixelNone; | 784 | uint32_t subpixel_order = SubPixelNone; |
785 | int ret; | ||
774 | 786 | ||
775 | /* fixme - tv/cv/din */ | 787 | /* fixme - tv/cv/din */ |
776 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) | 788 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) |
@@ -796,24 +808,30 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
796 | switch (connector_type) { | 808 | switch (connector_type) { |
797 | case DRM_MODE_CONNECTOR_VGA: | 809 | case DRM_MODE_CONNECTOR_VGA: |
798 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | 810 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
799 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | 811 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
812 | if (ret) | ||
813 | goto failed; | ||
800 | if (i2c_bus->valid) { | 814 | if (i2c_bus->valid) { |
801 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA"); | 815 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA"); |
802 | if (!radeon_connector->ddc_bus) | 816 | if (!radeon_connector->ddc_bus) |
803 | goto failed; | 817 | goto failed; |
804 | } | 818 | } |
819 | radeon_connector->dac_load_detect = true; | ||
805 | drm_connector_attach_property(&radeon_connector->base, | 820 | drm_connector_attach_property(&radeon_connector->base, |
806 | rdev->mode_info.load_detect_property, | 821 | rdev->mode_info.load_detect_property, |
807 | 1); | 822 | 1); |
808 | break; | 823 | break; |
809 | case DRM_MODE_CONNECTOR_DVIA: | 824 | case DRM_MODE_CONNECTOR_DVIA: |
810 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | 825 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
811 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | 826 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
827 | if (ret) | ||
828 | goto failed; | ||
812 | if (i2c_bus->valid) { | 829 | if (i2c_bus->valid) { |
813 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); | 830 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
814 | if (!radeon_connector->ddc_bus) | 831 | if (!radeon_connector->ddc_bus) |
815 | goto failed; | 832 | goto failed; |
816 | } | 833 | } |
834 | radeon_connector->dac_load_detect = true; | ||
817 | drm_connector_attach_property(&radeon_connector->base, | 835 | drm_connector_attach_property(&radeon_connector->base, |
818 | rdev->mode_info.load_detect_property, | 836 | rdev->mode_info.load_detect_property, |
819 | 1); | 837 | 1); |
@@ -827,7 +845,9 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
827 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 845 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
828 | radeon_connector->con_priv = radeon_dig_connector; | 846 | radeon_connector->con_priv = radeon_dig_connector; |
829 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | 847 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
830 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | 848 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
849 | if (ret) | ||
850 | goto failed; | ||
831 | if (i2c_bus->valid) { | 851 | if (i2c_bus->valid) { |
832 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); | 852 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
833 | if (!radeon_connector->ddc_bus) | 853 | if (!radeon_connector->ddc_bus) |
@@ -837,6 +857,7 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
837 | drm_connector_attach_property(&radeon_connector->base, | 857 | drm_connector_attach_property(&radeon_connector->base, |
838 | rdev->mode_info.coherent_mode_property, | 858 | rdev->mode_info.coherent_mode_property, |
839 | 1); | 859 | 1); |
860 | radeon_connector->dac_load_detect = true; | ||
840 | drm_connector_attach_property(&radeon_connector->base, | 861 | drm_connector_attach_property(&radeon_connector->base, |
841 | rdev->mode_info.load_detect_property, | 862 | rdev->mode_info.load_detect_property, |
842 | 1); | 863 | 1); |
@@ -850,7 +871,9 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
850 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 871 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
851 | radeon_connector->con_priv = radeon_dig_connector; | 872 | radeon_connector->con_priv = radeon_dig_connector; |
852 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | 873 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
853 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | 874 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
875 | if (ret) | ||
876 | goto failed; | ||
854 | if (i2c_bus->valid) { | 877 | if (i2c_bus->valid) { |
855 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "HDMI"); | 878 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "HDMI"); |
856 | if (!radeon_connector->ddc_bus) | 879 | if (!radeon_connector->ddc_bus) |
@@ -869,7 +892,9 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
869 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 892 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
870 | radeon_connector->con_priv = radeon_dig_connector; | 893 | radeon_connector->con_priv = radeon_dig_connector; |
871 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | 894 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
872 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | 895 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
896 | if (ret) | ||
897 | goto failed; | ||
873 | if (i2c_bus->valid) { | 898 | if (i2c_bus->valid) { |
874 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); | 899 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP"); |
875 | if (!radeon_connector->ddc_bus) | 900 | if (!radeon_connector->ddc_bus) |
@@ -882,11 +907,14 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
882 | case DRM_MODE_CONNECTOR_9PinDIN: | 907 | case DRM_MODE_CONNECTOR_9PinDIN: |
883 | if (radeon_tv == 1) { | 908 | if (radeon_tv == 1) { |
884 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); | 909 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
885 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | 910 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); |
911 | if (ret) | ||
912 | goto failed; | ||
913 | radeon_connector->dac_load_detect = true; | ||
914 | drm_connector_attach_property(&radeon_connector->base, | ||
915 | rdev->mode_info.load_detect_property, | ||
916 | 1); | ||
886 | } | 917 | } |
887 | drm_connector_attach_property(&radeon_connector->base, | ||
888 | rdev->mode_info.load_detect_property, | ||
889 | 1); | ||
890 | break; | 918 | break; |
891 | case DRM_MODE_CONNECTOR_LVDS: | 919 | case DRM_MODE_CONNECTOR_LVDS: |
892 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); | 920 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
@@ -896,7 +924,9 @@ radeon_add_atom_connector(struct drm_device *dev, | |||
896 | radeon_dig_connector->igp_lane_info = igp_lane_info; | 924 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
897 | radeon_connector->con_priv = radeon_dig_connector; | 925 | radeon_connector->con_priv = radeon_dig_connector; |
898 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); | 926 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
899 | drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); | 927 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); |
928 | if (ret) | ||
929 | goto failed; | ||
900 | if (i2c_bus->valid) { | 930 | if (i2c_bus->valid) { |
901 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS"); | 931 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS"); |
902 | if (!radeon_connector->ddc_bus) | 932 | if (!radeon_connector->ddc_bus) |
@@ -932,6 +962,7 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
932 | struct drm_connector *connector; | 962 | struct drm_connector *connector; |
933 | struct radeon_connector *radeon_connector; | 963 | struct radeon_connector *radeon_connector; |
934 | uint32_t subpixel_order = SubPixelNone; | 964 | uint32_t subpixel_order = SubPixelNone; |
965 | int ret; | ||
935 | 966 | ||
936 | /* fixme - tv/cv/din */ | 967 | /* fixme - tv/cv/din */ |
937 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) | 968 | if (connector_type == DRM_MODE_CONNECTOR_Unknown) |
@@ -957,24 +988,30 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
957 | switch (connector_type) { | 988 | switch (connector_type) { |
958 | case DRM_MODE_CONNECTOR_VGA: | 989 | case DRM_MODE_CONNECTOR_VGA: |
959 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | 990 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
960 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | 991 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
992 | if (ret) | ||
993 | goto failed; | ||
961 | if (i2c_bus->valid) { | 994 | if (i2c_bus->valid) { |
962 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA"); | 995 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA"); |
963 | if (!radeon_connector->ddc_bus) | 996 | if (!radeon_connector->ddc_bus) |
964 | goto failed; | 997 | goto failed; |
965 | } | 998 | } |
999 | radeon_connector->dac_load_detect = true; | ||
966 | drm_connector_attach_property(&radeon_connector->base, | 1000 | drm_connector_attach_property(&radeon_connector->base, |
967 | rdev->mode_info.load_detect_property, | 1001 | rdev->mode_info.load_detect_property, |
968 | 1); | 1002 | 1); |
969 | break; | 1003 | break; |
970 | case DRM_MODE_CONNECTOR_DVIA: | 1004 | case DRM_MODE_CONNECTOR_DVIA: |
971 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); | 1005 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
972 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); | 1006 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
1007 | if (ret) | ||
1008 | goto failed; | ||
973 | if (i2c_bus->valid) { | 1009 | if (i2c_bus->valid) { |
974 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); | 1010 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
975 | if (!radeon_connector->ddc_bus) | 1011 | if (!radeon_connector->ddc_bus) |
976 | goto failed; | 1012 | goto failed; |
977 | } | 1013 | } |
1014 | radeon_connector->dac_load_detect = true; | ||
978 | drm_connector_attach_property(&radeon_connector->base, | 1015 | drm_connector_attach_property(&radeon_connector->base, |
979 | rdev->mode_info.load_detect_property, | 1016 | rdev->mode_info.load_detect_property, |
980 | 1); | 1017 | 1); |
@@ -982,11 +1019,14 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
982 | case DRM_MODE_CONNECTOR_DVII: | 1019 | case DRM_MODE_CONNECTOR_DVII: |
983 | case DRM_MODE_CONNECTOR_DVID: | 1020 | case DRM_MODE_CONNECTOR_DVID: |
984 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); | 1021 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
985 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); | 1022 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
1023 | if (ret) | ||
1024 | goto failed; | ||
986 | if (i2c_bus->valid) { | 1025 | if (i2c_bus->valid) { |
987 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); | 1026 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI"); |
988 | if (!radeon_connector->ddc_bus) | 1027 | if (!radeon_connector->ddc_bus) |
989 | goto failed; | 1028 | goto failed; |
1029 | radeon_connector->dac_load_detect = true; | ||
990 | drm_connector_attach_property(&radeon_connector->base, | 1030 | drm_connector_attach_property(&radeon_connector->base, |
991 | rdev->mode_info.load_detect_property, | 1031 | rdev->mode_info.load_detect_property, |
992 | 1); | 1032 | 1); |
@@ -998,7 +1038,10 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
998 | case DRM_MODE_CONNECTOR_9PinDIN: | 1038 | case DRM_MODE_CONNECTOR_9PinDIN: |
999 | if (radeon_tv == 1) { | 1039 | if (radeon_tv == 1) { |
1000 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); | 1040 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
1001 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); | 1041 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); |
1042 | if (ret) | ||
1043 | goto failed; | ||
1044 | radeon_connector->dac_load_detect = true; | ||
1002 | drm_connector_attach_property(&radeon_connector->base, | 1045 | drm_connector_attach_property(&radeon_connector->base, |
1003 | rdev->mode_info.load_detect_property, | 1046 | rdev->mode_info.load_detect_property, |
1004 | 1); | 1047 | 1); |
@@ -1006,7 +1049,9 @@ radeon_add_legacy_connector(struct drm_device *dev, | |||
1006 | break; | 1049 | break; |
1007 | case DRM_MODE_CONNECTOR_LVDS: | 1050 | case DRM_MODE_CONNECTOR_LVDS: |
1008 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); | 1051 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
1009 | drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); | 1052 | ret = drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); |
1053 | if (ret) | ||
1054 | goto failed; | ||
1010 | if (i2c_bus->valid) { | 1055 | if (i2c_bus->valid) { |
1011 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS"); | 1056 | radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS"); |
1012 | if (!radeon_connector->ddc_bus) | 1057 | if (!radeon_connector->ddc_bus) |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 12f5990c2d2..5ab2cf96a26 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -142,15 +142,31 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
142 | } | 142 | } |
143 | 143 | ||
144 | p->chunks[i].length_dw = user_chunk.length_dw; | 144 | p->chunks[i].length_dw = user_chunk.length_dw; |
145 | cdata = (uint32_t *)(unsigned long)user_chunk.chunk_data; | 145 | p->chunks[i].user_ptr = (void __user *)(unsigned long)user_chunk.chunk_data; |
146 | 146 | ||
147 | size = p->chunks[i].length_dw * sizeof(uint32_t); | 147 | cdata = (uint32_t *)(unsigned long)user_chunk.chunk_data; |
148 | p->chunks[i].kdata = kmalloc(size, GFP_KERNEL); | 148 | if (p->chunks[i].chunk_id != RADEON_CHUNK_ID_IB) { |
149 | if (p->chunks[i].kdata == NULL) { | 149 | size = p->chunks[i].length_dw * sizeof(uint32_t); |
150 | return -ENOMEM; | 150 | p->chunks[i].kdata = kmalloc(size, GFP_KERNEL); |
151 | } | 151 | if (p->chunks[i].kdata == NULL) { |
152 | if (DRM_COPY_FROM_USER(p->chunks[i].kdata, cdata, size)) { | 152 | return -ENOMEM; |
153 | return -EFAULT; | 153 | } |
154 | if (DRM_COPY_FROM_USER(p->chunks[i].kdata, | ||
155 | p->chunks[i].user_ptr, size)) { | ||
156 | return -EFAULT; | ||
157 | } | ||
158 | } else { | ||
159 | p->chunks[i].kpage[0] = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
160 | p->chunks[i].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
161 | if (p->chunks[i].kpage[0] == NULL || p->chunks[i].kpage[1] == NULL) { | ||
162 | kfree(p->chunks[i].kpage[0]); | ||
163 | kfree(p->chunks[i].kpage[1]); | ||
164 | return -ENOMEM; | ||
165 | } | ||
166 | p->chunks[i].kpage_idx[0] = -1; | ||
167 | p->chunks[i].kpage_idx[1] = -1; | ||
168 | p->chunks[i].last_copied_page = -1; | ||
169 | p->chunks[i].last_page_index = ((p->chunks[i].length_dw * 4) - 1) / PAGE_SIZE; | ||
154 | } | 170 | } |
155 | } | 171 | } |
156 | if (p->chunks[p->chunk_ib_idx].length_dw > (16 * 1024)) { | 172 | if (p->chunks[p->chunk_ib_idx].length_dw > (16 * 1024)) { |
@@ -190,6 +206,8 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error) | |||
190 | kfree(parser->relocs_ptr); | 206 | kfree(parser->relocs_ptr); |
191 | for (i = 0; i < parser->nchunks; i++) { | 207 | for (i = 0; i < parser->nchunks; i++) { |
192 | kfree(parser->chunks[i].kdata); | 208 | kfree(parser->chunks[i].kdata); |
209 | kfree(parser->chunks[i].kpage[0]); | ||
210 | kfree(parser->chunks[i].kpage[1]); | ||
193 | } | 211 | } |
194 | kfree(parser->chunks); | 212 | kfree(parser->chunks); |
195 | kfree(parser->chunks_array); | 213 | kfree(parser->chunks_array); |
@@ -238,8 +256,14 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
238 | * uncached). */ | 256 | * uncached). */ |
239 | ib_chunk = &parser.chunks[parser.chunk_ib_idx]; | 257 | ib_chunk = &parser.chunks[parser.chunk_ib_idx]; |
240 | parser.ib->length_dw = ib_chunk->length_dw; | 258 | parser.ib->length_dw = ib_chunk->length_dw; |
241 | memcpy((void *)parser.ib->ptr, ib_chunk->kdata, ib_chunk->length_dw*4); | ||
242 | r = radeon_cs_parse(&parser); | 259 | r = radeon_cs_parse(&parser); |
260 | if (r || parser.parser_error) { | ||
261 | DRM_ERROR("Invalid command stream !\n"); | ||
262 | radeon_cs_parser_fini(&parser, r); | ||
263 | mutex_unlock(&rdev->cs_mutex); | ||
264 | return r; | ||
265 | } | ||
266 | r = radeon_cs_finish_pages(&parser); | ||
243 | if (r) { | 267 | if (r) { |
244 | DRM_ERROR("Invalid command stream !\n"); | 268 | DRM_ERROR("Invalid command stream !\n"); |
245 | radeon_cs_parser_fini(&parser, r); | 269 | radeon_cs_parser_fini(&parser, r); |
@@ -254,3 +278,64 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
254 | mutex_unlock(&rdev->cs_mutex); | 278 | mutex_unlock(&rdev->cs_mutex); |
255 | return r; | 279 | return r; |
256 | } | 280 | } |
281 | |||
282 | int radeon_cs_finish_pages(struct radeon_cs_parser *p) | ||
283 | { | ||
284 | struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx]; | ||
285 | int i; | ||
286 | int size = PAGE_SIZE; | ||
287 | |||
288 | for (i = ibc->last_copied_page + 1; i <= ibc->last_page_index; i++) { | ||
289 | if (i == ibc->last_page_index) { | ||
290 | size = (ibc->length_dw * 4) % PAGE_SIZE; | ||
291 | if (size == 0) | ||
292 | size = PAGE_SIZE; | ||
293 | } | ||
294 | |||
295 | if (DRM_COPY_FROM_USER(p->ib->ptr + (i * (PAGE_SIZE/4)), | ||
296 | ibc->user_ptr + (i * PAGE_SIZE), | ||
297 | size)) | ||
298 | return -EFAULT; | ||
299 | } | ||
300 | return 0; | ||
301 | } | ||
302 | |||
303 | int radeon_cs_update_pages(struct radeon_cs_parser *p, int pg_idx) | ||
304 | { | ||
305 | int new_page; | ||
306 | struct radeon_cs_chunk *ibc = &p->chunks[p->chunk_ib_idx]; | ||
307 | int i; | ||
308 | int size = PAGE_SIZE; | ||
309 | |||
310 | for (i = ibc->last_copied_page + 1; i < pg_idx; i++) { | ||
311 | if (DRM_COPY_FROM_USER(p->ib->ptr + (i * (PAGE_SIZE/4)), | ||
312 | ibc->user_ptr + (i * PAGE_SIZE), | ||
313 | PAGE_SIZE)) { | ||
314 | p->parser_error = -EFAULT; | ||
315 | return 0; | ||
316 | } | ||
317 | } | ||
318 | |||
319 | new_page = ibc->kpage_idx[0] < ibc->kpage_idx[1] ? 0 : 1; | ||
320 | |||
321 | if (pg_idx == ibc->last_page_index) { | ||
322 | size = (ibc->length_dw * 4) % PAGE_SIZE; | ||
323 | if (size == 0) | ||
324 | size = PAGE_SIZE; | ||
325 | } | ||
326 | |||
327 | if (DRM_COPY_FROM_USER(ibc->kpage[new_page], | ||
328 | ibc->user_ptr + (pg_idx * PAGE_SIZE), | ||
329 | size)) { | ||
330 | p->parser_error = -EFAULT; | ||
331 | return 0; | ||
332 | } | ||
333 | |||
334 | /* copy to IB here */ | ||
335 | memcpy((void *)(p->ib->ptr+(pg_idx*(PAGE_SIZE/4))), ibc->kpage[new_page], size); | ||
336 | |||
337 | ibc->last_copied_page = pg_idx; | ||
338 | ibc->kpage_idx[new_page] = pg_idx; | ||
339 | |||
340 | return new_page; | ||
341 | } | ||
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index daf5db78095..df988142e6b 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -322,10 +322,6 @@ int radeon_asic_init(struct radeon_device *rdev) | |||
322 | case CHIP_RV380: | 322 | case CHIP_RV380: |
323 | rdev->asic = &r300_asic; | 323 | rdev->asic = &r300_asic; |
324 | if (rdev->flags & RADEON_IS_PCIE) { | 324 | if (rdev->flags & RADEON_IS_PCIE) { |
325 | rdev->asic->gart_init = &rv370_pcie_gart_init; | ||
326 | rdev->asic->gart_fini = &rv370_pcie_gart_fini; | ||
327 | rdev->asic->gart_enable = &rv370_pcie_gart_enable; | ||
328 | rdev->asic->gart_disable = &rv370_pcie_gart_disable; | ||
329 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | 325 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; |
330 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | 326 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; |
331 | } | 327 | } |
@@ -485,7 +481,6 @@ void radeon_combios_fini(struct radeon_device *rdev) | |||
485 | static unsigned int radeon_vga_set_decode(void *cookie, bool state) | 481 | static unsigned int radeon_vga_set_decode(void *cookie, bool state) |
486 | { | 482 | { |
487 | struct radeon_device *rdev = cookie; | 483 | struct radeon_device *rdev = cookie; |
488 | |||
489 | radeon_vga_set_state(rdev, state); | 484 | radeon_vga_set_state(rdev, state); |
490 | if (state) | 485 | if (state) |
491 | return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM | | 486 | return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM | |
@@ -493,6 +488,29 @@ static unsigned int radeon_vga_set_decode(void *cookie, bool state) | |||
493 | else | 488 | else |
494 | return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; | 489 | return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM; |
495 | } | 490 | } |
491 | |||
492 | void radeon_agp_disable(struct radeon_device *rdev) | ||
493 | { | ||
494 | rdev->flags &= ~RADEON_IS_AGP; | ||
495 | if (rdev->family >= CHIP_R600) { | ||
496 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
497 | rdev->flags |= RADEON_IS_PCIE; | ||
498 | } else if (rdev->family >= CHIP_RV515 || | ||
499 | rdev->family == CHIP_RV380 || | ||
500 | rdev->family == CHIP_RV410 || | ||
501 | rdev->family == CHIP_R423) { | ||
502 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
503 | rdev->flags |= RADEON_IS_PCIE; | ||
504 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
505 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | ||
506 | } else { | ||
507 | DRM_INFO("Forcing AGP to PCI mode\n"); | ||
508 | rdev->flags |= RADEON_IS_PCI; | ||
509 | rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; | ||
510 | rdev->asic->gart_set_page = &r100_pci_gart_set_page; | ||
511 | } | ||
512 | } | ||
513 | |||
496 | /* | 514 | /* |
497 | * Radeon device. | 515 | * Radeon device. |
498 | */ | 516 | */ |
@@ -531,29 +549,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
531 | } | 549 | } |
532 | 550 | ||
533 | if (radeon_agpmode == -1) { | 551 | if (radeon_agpmode == -1) { |
534 | rdev->flags &= ~RADEON_IS_AGP; | 552 | radeon_agp_disable(rdev); |
535 | if (rdev->family >= CHIP_RV515 || | ||
536 | rdev->family == CHIP_RV380 || | ||
537 | rdev->family == CHIP_RV410 || | ||
538 | rdev->family == CHIP_R423) { | ||
539 | DRM_INFO("Forcing AGP to PCIE mode\n"); | ||
540 | rdev->flags |= RADEON_IS_PCIE; | ||
541 | rdev->asic->gart_init = &rv370_pcie_gart_init; | ||
542 | rdev->asic->gart_fini = &rv370_pcie_gart_fini; | ||
543 | rdev->asic->gart_enable = &rv370_pcie_gart_enable; | ||
544 | rdev->asic->gart_disable = &rv370_pcie_gart_disable; | ||
545 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; | ||
546 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; | ||
547 | } else { | ||
548 | DRM_INFO("Forcing AGP to PCI mode\n"); | ||
549 | rdev->flags |= RADEON_IS_PCI; | ||
550 | rdev->asic->gart_init = &r100_pci_gart_init; | ||
551 | rdev->asic->gart_fini = &r100_pci_gart_fini; | ||
552 | rdev->asic->gart_enable = &r100_pci_gart_enable; | ||
553 | rdev->asic->gart_disable = &r100_pci_gart_disable; | ||
554 | rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush; | ||
555 | rdev->asic->gart_set_page = &r100_pci_gart_set_page; | ||
556 | } | ||
557 | } | 553 | } |
558 | 554 | ||
559 | /* set DMA mask + need_dma32 flags. | 555 | /* set DMA mask + need_dma32 flags. |
@@ -585,111 +581,26 @@ int radeon_device_init(struct radeon_device *rdev, | |||
585 | DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base); | 581 | DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base); |
586 | DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size); | 582 | DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size); |
587 | 583 | ||
588 | rdev->new_init_path = false; | ||
589 | r = radeon_init(rdev); | ||
590 | if (r) { | ||
591 | return r; | ||
592 | } | ||
593 | |||
594 | /* if we have > 1 VGA cards, then disable the radeon VGA resources */ | 584 | /* if we have > 1 VGA cards, then disable the radeon VGA resources */ |
595 | r = vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); | 585 | /* this will fail for cards that aren't VGA class devices, just |
596 | if (r) { | 586 | * ignore it */ |
597 | return -EINVAL; | 587 | vga_client_register(rdev->pdev, rdev, NULL, radeon_vga_set_decode); |
598 | } | ||
599 | |||
600 | if (!rdev->new_init_path) { | ||
601 | /* Setup errata flags */ | ||
602 | radeon_errata(rdev); | ||
603 | /* Initialize scratch registers */ | ||
604 | radeon_scratch_init(rdev); | ||
605 | /* Initialize surface registers */ | ||
606 | radeon_surface_init(rdev); | ||
607 | 588 | ||
608 | /* BIOS*/ | 589 | r = radeon_init(rdev); |
609 | if (!radeon_get_bios(rdev)) { | 590 | if (r) |
610 | if (ASIC_IS_AVIVO(rdev)) | 591 | return r; |
611 | return -EINVAL; | ||
612 | } | ||
613 | if (rdev->is_atom_bios) { | ||
614 | r = radeon_atombios_init(rdev); | ||
615 | if (r) { | ||
616 | return r; | ||
617 | } | ||
618 | } else { | ||
619 | r = radeon_combios_init(rdev); | ||
620 | if (r) { | ||
621 | return r; | ||
622 | } | ||
623 | } | ||
624 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
625 | if (radeon_gpu_reset(rdev)) { | ||
626 | /* FIXME: what do we want to do here ? */ | ||
627 | } | ||
628 | /* check if cards are posted or not */ | ||
629 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
630 | DRM_INFO("GPU not posted. posting now...\n"); | ||
631 | if (rdev->is_atom_bios) { | ||
632 | atom_asic_init(rdev->mode_info.atom_context); | ||
633 | } else { | ||
634 | radeon_combios_asic_init(rdev->ddev); | ||
635 | } | ||
636 | } | ||
637 | /* Get clock & vram information */ | ||
638 | radeon_get_clock_info(rdev->ddev); | ||
639 | radeon_vram_info(rdev); | ||
640 | /* Initialize clocks */ | ||
641 | r = radeon_clocks_init(rdev); | ||
642 | if (r) { | ||
643 | return r; | ||
644 | } | ||
645 | 592 | ||
646 | /* Initialize memory controller (also test AGP) */ | 593 | if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) { |
647 | r = radeon_mc_init(rdev); | 594 | /* Acceleration not working on AGP card try again |
648 | if (r) { | 595 | * with fallback to PCI or PCIE GART |
649 | return r; | 596 | */ |
650 | } | 597 | radeon_gpu_reset(rdev); |
651 | /* Fence driver */ | 598 | radeon_fini(rdev); |
652 | r = radeon_fence_driver_init(rdev); | 599 | radeon_agp_disable(rdev); |
653 | if (r) { | 600 | r = radeon_init(rdev); |
654 | return r; | ||
655 | } | ||
656 | r = radeon_irq_kms_init(rdev); | ||
657 | if (r) { | ||
658 | return r; | ||
659 | } | ||
660 | /* Memory manager */ | ||
661 | r = radeon_object_init(rdev); | ||
662 | if (r) { | ||
663 | return r; | ||
664 | } | ||
665 | r = radeon_gpu_gart_init(rdev); | ||
666 | if (r) | 601 | if (r) |
667 | return r; | 602 | return r; |
668 | /* Initialize GART (initialize after TTM so we can allocate | ||
669 | * memory through TTM but finalize after TTM) */ | ||
670 | r = radeon_gart_enable(rdev); | ||
671 | if (r) | ||
672 | return 0; | ||
673 | r = radeon_gem_init(rdev); | ||
674 | if (r) | ||
675 | return 0; | ||
676 | |||
677 | /* 1M ring buffer */ | ||
678 | r = radeon_cp_init(rdev, 1024 * 1024); | ||
679 | if (r) | ||
680 | return 0; | ||
681 | r = radeon_wb_init(rdev); | ||
682 | if (r) | ||
683 | DRM_ERROR("radeon: failled initializing WB (%d).\n", r); | ||
684 | r = radeon_ib_pool_init(rdev); | ||
685 | if (r) | ||
686 | return 0; | ||
687 | r = radeon_ib_test(rdev); | ||
688 | if (r) | ||
689 | return 0; | ||
690 | rdev->accel_working = true; | ||
691 | } | 603 | } |
692 | DRM_INFO("radeon: kernel modesetting successfully initialized.\n"); | ||
693 | if (radeon_testing) { | 604 | if (radeon_testing) { |
694 | radeon_test_moves(rdev); | 605 | radeon_test_moves(rdev); |
695 | } | 606 | } |
@@ -703,32 +614,8 @@ void radeon_device_fini(struct radeon_device *rdev) | |||
703 | { | 614 | { |
704 | DRM_INFO("radeon: finishing device.\n"); | 615 | DRM_INFO("radeon: finishing device.\n"); |
705 | rdev->shutdown = true; | 616 | rdev->shutdown = true; |
706 | /* Order matter so becarefull if you rearrange anythings */ | 617 | radeon_fini(rdev); |
707 | if (!rdev->new_init_path) { | 618 | vga_client_register(rdev->pdev, NULL, NULL, NULL); |
708 | radeon_ib_pool_fini(rdev); | ||
709 | radeon_cp_fini(rdev); | ||
710 | radeon_wb_fini(rdev); | ||
711 | radeon_gpu_gart_fini(rdev); | ||
712 | radeon_gem_fini(rdev); | ||
713 | radeon_mc_fini(rdev); | ||
714 | #if __OS_HAS_AGP | ||
715 | radeon_agp_fini(rdev); | ||
716 | #endif | ||
717 | radeon_irq_kms_fini(rdev); | ||
718 | vga_client_register(rdev->pdev, NULL, NULL, NULL); | ||
719 | radeon_fence_driver_fini(rdev); | ||
720 | radeon_clocks_fini(rdev); | ||
721 | radeon_object_fini(rdev); | ||
722 | if (rdev->is_atom_bios) { | ||
723 | radeon_atombios_fini(rdev); | ||
724 | } else { | ||
725 | radeon_combios_fini(rdev); | ||
726 | } | ||
727 | kfree(rdev->bios); | ||
728 | rdev->bios = NULL; | ||
729 | } else { | ||
730 | radeon_fini(rdev); | ||
731 | } | ||
732 | iounmap(rdev->rmmio); | 619 | iounmap(rdev->rmmio); |
733 | rdev->rmmio = NULL; | 620 | rdev->rmmio = NULL; |
734 | } | 621 | } |
@@ -768,14 +655,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
768 | 655 | ||
769 | radeon_save_bios_scratch_regs(rdev); | 656 | radeon_save_bios_scratch_regs(rdev); |
770 | 657 | ||
771 | if (!rdev->new_init_path) { | 658 | radeon_suspend(rdev); |
772 | radeon_cp_disable(rdev); | ||
773 | radeon_gart_disable(rdev); | ||
774 | rdev->irq.sw_int = false; | ||
775 | radeon_irq_set(rdev); | ||
776 | } else { | ||
777 | radeon_suspend(rdev); | ||
778 | } | ||
779 | /* evict remaining vram memory */ | 659 | /* evict remaining vram memory */ |
780 | radeon_object_evict_vram(rdev); | 660 | radeon_object_evict_vram(rdev); |
781 | 661 | ||
@@ -794,7 +674,6 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
794 | int radeon_resume_kms(struct drm_device *dev) | 674 | int radeon_resume_kms(struct drm_device *dev) |
795 | { | 675 | { |
796 | struct radeon_device *rdev = dev->dev_private; | 676 | struct radeon_device *rdev = dev->dev_private; |
797 | int r; | ||
798 | 677 | ||
799 | acquire_console_sem(); | 678 | acquire_console_sem(); |
800 | pci_set_power_state(dev->pdev, PCI_D0); | 679 | pci_set_power_state(dev->pdev, PCI_D0); |
@@ -804,43 +683,7 @@ int radeon_resume_kms(struct drm_device *dev) | |||
804 | return -1; | 683 | return -1; |
805 | } | 684 | } |
806 | pci_set_master(dev->pdev); | 685 | pci_set_master(dev->pdev); |
807 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 686 | radeon_resume(rdev); |
808 | if (!rdev->new_init_path) { | ||
809 | if (radeon_gpu_reset(rdev)) { | ||
810 | /* FIXME: what do we want to do here ? */ | ||
811 | } | ||
812 | /* post card */ | ||
813 | if (rdev->is_atom_bios) { | ||
814 | atom_asic_init(rdev->mode_info.atom_context); | ||
815 | } else { | ||
816 | radeon_combios_asic_init(rdev->ddev); | ||
817 | } | ||
818 | /* Initialize clocks */ | ||
819 | r = radeon_clocks_init(rdev); | ||
820 | if (r) { | ||
821 | release_console_sem(); | ||
822 | return r; | ||
823 | } | ||
824 | /* Enable IRQ */ | ||
825 | rdev->irq.sw_int = true; | ||
826 | radeon_irq_set(rdev); | ||
827 | /* Initialize GPU Memory Controller */ | ||
828 | r = radeon_mc_init(rdev); | ||
829 | if (r) { | ||
830 | goto out; | ||
831 | } | ||
832 | r = radeon_gart_enable(rdev); | ||
833 | if (r) { | ||
834 | goto out; | ||
835 | } | ||
836 | r = radeon_cp_init(rdev, rdev->cp.ring_size); | ||
837 | if (r) { | ||
838 | goto out; | ||
839 | } | ||
840 | } else { | ||
841 | radeon_resume(rdev); | ||
842 | } | ||
843 | out: | ||
844 | radeon_restore_bios_scratch_regs(rdev); | 687 | radeon_restore_bios_scratch_regs(rdev); |
845 | fb_set_suspend(rdev->fbdev_info, 0); | 688 | fb_set_suspend(rdev->fbdev_info, 0); |
846 | release_console_sem(); | 689 | release_console_sem(); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 5d8141b1376..3655d91993a 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -106,24 +106,33 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc) | |||
106 | legacy_crtc_load_lut(crtc); | 106 | legacy_crtc_load_lut(crtc); |
107 | } | 107 | } |
108 | 108 | ||
109 | /** Sets the color ramps on behalf of RandR */ | 109 | /** Sets the color ramps on behalf of fbcon */ |
110 | void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | 110 | void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, |
111 | u16 blue, int regno) | 111 | u16 blue, int regno) |
112 | { | 112 | { |
113 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 113 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
114 | 114 | ||
115 | if (regno == 0) | ||
116 | DRM_DEBUG("gamma set %d\n", radeon_crtc->crtc_id); | ||
117 | radeon_crtc->lut_r[regno] = red >> 6; | 115 | radeon_crtc->lut_r[regno] = red >> 6; |
118 | radeon_crtc->lut_g[regno] = green >> 6; | 116 | radeon_crtc->lut_g[regno] = green >> 6; |
119 | radeon_crtc->lut_b[regno] = blue >> 6; | 117 | radeon_crtc->lut_b[regno] = blue >> 6; |
120 | } | 118 | } |
121 | 119 | ||
120 | /** Gets the color ramps on behalf of fbcon */ | ||
121 | void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | ||
122 | u16 *blue, int regno) | ||
123 | { | ||
124 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
125 | |||
126 | *red = radeon_crtc->lut_r[regno] << 6; | ||
127 | *green = radeon_crtc->lut_g[regno] << 6; | ||
128 | *blue = radeon_crtc->lut_b[regno] << 6; | ||
129 | } | ||
130 | |||
122 | static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, | 131 | static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, |
123 | u16 *blue, uint32_t size) | 132 | u16 *blue, uint32_t size) |
124 | { | 133 | { |
125 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | 134 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
126 | int i, j; | 135 | int i; |
127 | 136 | ||
128 | if (size != 256) { | 137 | if (size != 256) { |
129 | return; | 138 | return; |
@@ -132,23 +141,11 @@ static void radeon_crtc_gamma_set(struct drm_crtc *crtc, u16 *red, u16 *green, | |||
132 | return; | 141 | return; |
133 | } | 142 | } |
134 | 143 | ||
135 | if (crtc->fb->depth == 16) { | 144 | /* userspace palettes are always correct as is */ |
136 | for (i = 0; i < 64; i++) { | 145 | for (i = 0; i < 256; i++) { |
137 | if (i <= 31) { | 146 | radeon_crtc->lut_r[i] = red[i] >> 6; |
138 | for (j = 0; j < 8; j++) { | 147 | radeon_crtc->lut_g[i] = green[i] >> 6; |
139 | radeon_crtc->lut_r[i * 8 + j] = red[i] >> 6; | 148 | radeon_crtc->lut_b[i] = blue[i] >> 6; |
140 | radeon_crtc->lut_b[i * 8 + j] = blue[i] >> 6; | ||
141 | } | ||
142 | } | ||
143 | for (j = 0; j < 4; j++) | ||
144 | radeon_crtc->lut_g[i * 4 + j] = green[i] >> 6; | ||
145 | } | ||
146 | } else { | ||
147 | for (i = 0; i < 256; i++) { | ||
148 | radeon_crtc->lut_r[i] = red[i] >> 6; | ||
149 | radeon_crtc->lut_g[i] = green[i] >> 6; | ||
150 | radeon_crtc->lut_b[i] = blue[i] >> 6; | ||
151 | } | ||
152 | } | 149 | } |
153 | 150 | ||
154 | radeon_crtc_load_lut(crtc); | 151 | radeon_crtc_load_lut(crtc); |
@@ -724,7 +721,11 @@ int radeon_modeset_init(struct radeon_device *rdev) | |||
724 | if (ret) { | 721 | if (ret) { |
725 | return ret; | 722 | return ret; |
726 | } | 723 | } |
727 | /* allocate crtcs - TODO single crtc */ | 724 | |
725 | if (rdev->flags & RADEON_SINGLE_CRTC) | ||
726 | num_crtc = 1; | ||
727 | |||
728 | /* allocate crtcs */ | ||
728 | for (i = 0; i < num_crtc; i++) { | 729 | for (i = 0; i < num_crtc; i++) { |
729 | radeon_crtc_init(rdev->ddev, i); | 730 | radeon_crtc_init(rdev->ddev, i); |
730 | } | 731 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 50fce498910..7f50fb864af 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -62,9 +62,6 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev); | |||
62 | int radeon_driver_irq_postinstall_kms(struct drm_device *dev); | 62 | int radeon_driver_irq_postinstall_kms(struct drm_device *dev); |
63 | void radeon_driver_irq_uninstall_kms(struct drm_device *dev); | 63 | void radeon_driver_irq_uninstall_kms(struct drm_device *dev); |
64 | irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS); | 64 | irqreturn_t radeon_driver_irq_handler_kms(DRM_IRQ_ARGS); |
65 | int radeon_master_create_kms(struct drm_device *dev, struct drm_master *master); | ||
66 | void radeon_master_destroy_kms(struct drm_device *dev, | ||
67 | struct drm_master *master); | ||
68 | int radeon_dma_ioctl_kms(struct drm_device *dev, void *data, | 65 | int radeon_dma_ioctl_kms(struct drm_device *dev, void *data, |
69 | struct drm_file *file_priv); | 66 | struct drm_file *file_priv); |
70 | int radeon_gem_object_init(struct drm_gem_object *obj); | 67 | int radeon_gem_object_init(struct drm_gem_object *obj); |
@@ -260,8 +257,6 @@ static struct drm_driver kms_driver = { | |||
260 | .get_vblank_counter = radeon_get_vblank_counter_kms, | 257 | .get_vblank_counter = radeon_get_vblank_counter_kms, |
261 | .enable_vblank = radeon_enable_vblank_kms, | 258 | .enable_vblank = radeon_enable_vblank_kms, |
262 | .disable_vblank = radeon_disable_vblank_kms, | 259 | .disable_vblank = radeon_disable_vblank_kms, |
263 | .master_create = radeon_master_create_kms, | ||
264 | .master_destroy = radeon_master_destroy_kms, | ||
265 | #if defined(CONFIG_DEBUG_FS) | 260 | #if defined(CONFIG_DEBUG_FS) |
266 | .debugfs_init = radeon_debugfs_init, | 261 | .debugfs_init = radeon_debugfs_init, |
267 | .debugfs_cleanup = radeon_debugfs_cleanup, | 262 | .debugfs_cleanup = radeon_debugfs_cleanup, |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 621646752cd..a65ab1a0dad 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -1345,6 +1345,7 @@ radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder) | |||
1345 | void | 1345 | void |
1346 | radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t supported_device) | 1346 | radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t supported_device) |
1347 | { | 1347 | { |
1348 | struct radeon_device *rdev = dev->dev_private; | ||
1348 | struct drm_encoder *encoder; | 1349 | struct drm_encoder *encoder; |
1349 | struct radeon_encoder *radeon_encoder; | 1350 | struct radeon_encoder *radeon_encoder; |
1350 | 1351 | ||
@@ -1364,7 +1365,10 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t su | |||
1364 | return; | 1365 | return; |
1365 | 1366 | ||
1366 | encoder = &radeon_encoder->base; | 1367 | encoder = &radeon_encoder->base; |
1367 | encoder->possible_crtcs = 0x3; | 1368 | if (rdev->flags & RADEON_SINGLE_CRTC) |
1369 | encoder->possible_crtcs = 0x1; | ||
1370 | else | ||
1371 | encoder->possible_crtcs = 0x3; | ||
1368 | encoder->possible_clones = 0; | 1372 | encoder->possible_clones = 0; |
1369 | 1373 | ||
1370 | radeon_encoder->enc_priv = NULL; | 1374 | radeon_encoder->enc_priv = NULL; |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index 944e4fa78db..b38c4c8e2c6 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -55,6 +55,7 @@ static struct fb_ops radeonfb_ops = { | |||
55 | .fb_imageblit = cfb_imageblit, | 55 | .fb_imageblit = cfb_imageblit, |
56 | .fb_pan_display = drm_fb_helper_pan_display, | 56 | .fb_pan_display = drm_fb_helper_pan_display, |
57 | .fb_blank = drm_fb_helper_blank, | 57 | .fb_blank = drm_fb_helper_blank, |
58 | .fb_setcmap = drm_fb_helper_setcmap, | ||
58 | }; | 59 | }; |
59 | 60 | ||
60 | /** | 61 | /** |
@@ -123,11 +124,13 @@ static int radeon_align_pitch(struct radeon_device *rdev, int width, int bpp, bo | |||
123 | 124 | ||
124 | static struct drm_fb_helper_funcs radeon_fb_helper_funcs = { | 125 | static struct drm_fb_helper_funcs radeon_fb_helper_funcs = { |
125 | .gamma_set = radeon_crtc_fb_gamma_set, | 126 | .gamma_set = radeon_crtc_fb_gamma_set, |
127 | .gamma_get = radeon_crtc_fb_gamma_get, | ||
126 | }; | 128 | }; |
127 | 129 | ||
128 | int radeonfb_create(struct drm_device *dev, | 130 | int radeonfb_create(struct drm_device *dev, |
129 | uint32_t fb_width, uint32_t fb_height, | 131 | uint32_t fb_width, uint32_t fb_height, |
130 | uint32_t surface_width, uint32_t surface_height, | 132 | uint32_t surface_width, uint32_t surface_height, |
133 | uint32_t surface_depth, uint32_t surface_bpp, | ||
131 | struct drm_framebuffer **fb_p) | 134 | struct drm_framebuffer **fb_p) |
132 | { | 135 | { |
133 | struct radeon_device *rdev = dev->dev_private; | 136 | struct radeon_device *rdev = dev->dev_private; |
@@ -145,13 +148,19 @@ int radeonfb_create(struct drm_device *dev, | |||
145 | unsigned long tmp; | 148 | unsigned long tmp; |
146 | bool fb_tiled = false; /* useful for testing */ | 149 | bool fb_tiled = false; /* useful for testing */ |
147 | u32 tiling_flags = 0; | 150 | u32 tiling_flags = 0; |
151 | int crtc_count; | ||
148 | 152 | ||
149 | mode_cmd.width = surface_width; | 153 | mode_cmd.width = surface_width; |
150 | mode_cmd.height = surface_height; | 154 | mode_cmd.height = surface_height; |
151 | mode_cmd.bpp = 32; | 155 | |
156 | /* avivo can't scanout real 24bpp */ | ||
157 | if ((surface_bpp == 24) && ASIC_IS_AVIVO(rdev)) | ||
158 | surface_bpp = 32; | ||
159 | |||
160 | mode_cmd.bpp = surface_bpp; | ||
152 | /* need to align pitch with crtc limits */ | 161 | /* need to align pitch with crtc limits */ |
153 | mode_cmd.pitch = radeon_align_pitch(rdev, mode_cmd.width, mode_cmd.bpp, fb_tiled) * ((mode_cmd.bpp + 1) / 8); | 162 | mode_cmd.pitch = radeon_align_pitch(rdev, mode_cmd.width, mode_cmd.bpp, fb_tiled) * ((mode_cmd.bpp + 1) / 8); |
154 | mode_cmd.depth = 24; | 163 | mode_cmd.depth = surface_depth; |
155 | 164 | ||
156 | size = mode_cmd.pitch * mode_cmd.height; | 165 | size = mode_cmd.pitch * mode_cmd.height; |
157 | aligned_size = ALIGN(size, PAGE_SIZE); | 166 | aligned_size = ALIGN(size, PAGE_SIZE); |
@@ -216,7 +225,11 @@ int radeonfb_create(struct drm_device *dev, | |||
216 | rfbdev = info->par; | 225 | rfbdev = info->par; |
217 | rfbdev->helper.funcs = &radeon_fb_helper_funcs; | 226 | rfbdev->helper.funcs = &radeon_fb_helper_funcs; |
218 | rfbdev->helper.dev = dev; | 227 | rfbdev->helper.dev = dev; |
219 | ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, 2, | 228 | if (rdev->flags & RADEON_SINGLE_CRTC) |
229 | crtc_count = 1; | ||
230 | else | ||
231 | crtc_count = 2; | ||
232 | ret = drm_fb_helper_init_crtc_count(&rfbdev->helper, crtc_count, | ||
220 | RADEONFB_CONN_LIMIT); | 233 | RADEONFB_CONN_LIMIT); |
221 | if (ret) | 234 | if (ret) |
222 | goto out_unref; | 235 | goto out_unref; |
@@ -233,7 +246,7 @@ int radeonfb_create(struct drm_device *dev, | |||
233 | 246 | ||
234 | strcpy(info->fix.id, "radeondrmfb"); | 247 | strcpy(info->fix.id, "radeondrmfb"); |
235 | 248 | ||
236 | drm_fb_helper_fill_fix(info, fb->pitch); | 249 | drm_fb_helper_fill_fix(info, fb->pitch, fb->depth); |
237 | 250 | ||
238 | info->flags = FBINFO_DEFAULT; | 251 | info->flags = FBINFO_DEFAULT; |
239 | info->fbops = &radeonfb_ops; | 252 | info->fbops = &radeonfb_ops; |
@@ -290,13 +303,26 @@ out: | |||
290 | return ret; | 303 | return ret; |
291 | } | 304 | } |
292 | 305 | ||
306 | static char *mode_option; | ||
307 | int radeon_parse_options(char *options) | ||
308 | { | ||
309 | char *this_opt; | ||
310 | |||
311 | if (!options || !*options) | ||
312 | return 0; | ||
313 | |||
314 | while ((this_opt = strsep(&options, ",")) != NULL) { | ||
315 | if (!*this_opt) | ||
316 | continue; | ||
317 | mode_option = this_opt; | ||
318 | } | ||
319 | return 0; | ||
320 | } | ||
321 | |||
293 | int radeonfb_probe(struct drm_device *dev) | 322 | int radeonfb_probe(struct drm_device *dev) |
294 | { | 323 | { |
295 | int ret; | 324 | return drm_fb_helper_single_fb_probe(dev, 32, &radeonfb_create); |
296 | ret = drm_fb_helper_single_fb_probe(dev, &radeonfb_create); | ||
297 | return ret; | ||
298 | } | 325 | } |
299 | EXPORT_SYMBOL(radeonfb_probe); | ||
300 | 326 | ||
301 | int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb) | 327 | int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb) |
302 | { | 328 | { |
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c index 1841145a7c4..8e0a8759e42 100644 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | |||
@@ -83,8 +83,12 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev) | |||
83 | int radeon_irq_kms_init(struct radeon_device *rdev) | 83 | int radeon_irq_kms_init(struct radeon_device *rdev) |
84 | { | 84 | { |
85 | int r = 0; | 85 | int r = 0; |
86 | int num_crtc = 2; | ||
86 | 87 | ||
87 | r = drm_vblank_init(rdev->ddev, 2); | 88 | if (rdev->flags & RADEON_SINGLE_CRTC) |
89 | num_crtc = 1; | ||
90 | |||
91 | r = drm_vblank_init(rdev->ddev, num_crtc); | ||
88 | if (r) { | 92 | if (r) { |
89 | return r; | 93 | return r; |
90 | } | 94 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index 709bd892b3a..ba128621057 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -201,55 +201,6 @@ void radeon_disable_vblank_kms(struct drm_device *dev, int crtc) | |||
201 | 201 | ||
202 | 202 | ||
203 | /* | 203 | /* |
204 | * For multiple master (like multiple X). | ||
205 | */ | ||
206 | struct drm_radeon_master_private { | ||
207 | drm_local_map_t *sarea; | ||
208 | drm_radeon_sarea_t *sarea_priv; | ||
209 | }; | ||
210 | |||
211 | int radeon_master_create_kms(struct drm_device *dev, struct drm_master *master) | ||
212 | { | ||
213 | struct drm_radeon_master_private *master_priv; | ||
214 | unsigned long sareapage; | ||
215 | int ret; | ||
216 | |||
217 | master_priv = kzalloc(sizeof(*master_priv), GFP_KERNEL); | ||
218 | if (master_priv == NULL) { | ||
219 | return -ENOMEM; | ||
220 | } | ||
221 | /* prebuild the SAREA */ | ||
222 | sareapage = max_t(unsigned long, SAREA_MAX, PAGE_SIZE); | ||
223 | ret = drm_addmap(dev, 0, sareapage, _DRM_SHM, | ||
224 | _DRM_CONTAINS_LOCK, | ||
225 | &master_priv->sarea); | ||
226 | if (ret) { | ||
227 | DRM_ERROR("SAREA setup failed\n"); | ||
228 | return ret; | ||
229 | } | ||
230 | master_priv->sarea_priv = master_priv->sarea->handle + sizeof(struct drm_sarea); | ||
231 | master_priv->sarea_priv->pfCurrentPage = 0; | ||
232 | master->driver_priv = master_priv; | ||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | void radeon_master_destroy_kms(struct drm_device *dev, | ||
237 | struct drm_master *master) | ||
238 | { | ||
239 | struct drm_radeon_master_private *master_priv = master->driver_priv; | ||
240 | |||
241 | if (master_priv == NULL) { | ||
242 | return; | ||
243 | } | ||
244 | if (master_priv->sarea) { | ||
245 | drm_rmmap_locked(dev, master_priv->sarea); | ||
246 | } | ||
247 | kfree(master_priv); | ||
248 | master->driver_priv = NULL; | ||
249 | } | ||
250 | |||
251 | |||
252 | /* | ||
253 | * IOCTL. | 204 | * IOCTL. |
254 | */ | 205 | */ |
255 | int radeon_dma_ioctl_kms(struct drm_device *dev, void *data, | 206 | int radeon_dma_ioctl_kms(struct drm_device *dev, void *data, |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 2b997a15fb1..36410f85d70 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c | |||
@@ -1053,6 +1053,7 @@ static const struct drm_crtc_helper_funcs legacy_helper_funcs = { | |||
1053 | .mode_set_base = radeon_crtc_set_base, | 1053 | .mode_set_base = radeon_crtc_set_base, |
1054 | .prepare = radeon_crtc_prepare, | 1054 | .prepare = radeon_crtc_prepare, |
1055 | .commit = radeon_crtc_commit, | 1055 | .commit = radeon_crtc_commit, |
1056 | .load_lut = radeon_crtc_load_lut, | ||
1056 | }; | 1057 | }; |
1057 | 1058 | ||
1058 | 1059 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index b1547f700d7..6ceb958fd19 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
@@ -881,7 +881,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
881 | R420_TV_DAC_DACADJ_MASK | | 881 | R420_TV_DAC_DACADJ_MASK | |
882 | R420_TV_DAC_RDACPD | | 882 | R420_TV_DAC_RDACPD | |
883 | R420_TV_DAC_GDACPD | | 883 | R420_TV_DAC_GDACPD | |
884 | R420_TV_DAC_GDACPD | | 884 | R420_TV_DAC_BDACPD | |
885 | R420_TV_DAC_TVENABLE); | 885 | R420_TV_DAC_TVENABLE); |
886 | } else { | 886 | } else { |
887 | tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK | | 887 | tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK | |
@@ -889,7 +889,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
889 | RADEON_TV_DAC_DACADJ_MASK | | 889 | RADEON_TV_DAC_DACADJ_MASK | |
890 | RADEON_TV_DAC_RDACPD | | 890 | RADEON_TV_DAC_RDACPD | |
891 | RADEON_TV_DAC_GDACPD | | 891 | RADEON_TV_DAC_GDACPD | |
892 | RADEON_TV_DAC_GDACPD); | 892 | RADEON_TV_DAC_BDACPD); |
893 | } | 893 | } |
894 | 894 | ||
895 | /* FIXME TV */ | 895 | /* FIXME TV */ |
@@ -1318,7 +1318,10 @@ radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t | |||
1318 | return; | 1318 | return; |
1319 | 1319 | ||
1320 | encoder = &radeon_encoder->base; | 1320 | encoder = &radeon_encoder->base; |
1321 | encoder->possible_crtcs = 0x3; | 1321 | if (rdev->flags & RADEON_SINGLE_CRTC) |
1322 | encoder->possible_crtcs = 0x1; | ||
1323 | else | ||
1324 | encoder->possible_crtcs = 0x3; | ||
1322 | encoder->possible_clones = 0; | 1325 | encoder->possible_clones = 0; |
1323 | 1326 | ||
1324 | radeon_encoder->enc_priv = NULL; | 1327 | radeon_encoder->enc_priv = NULL; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 570a58729da..e61226817cc 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -407,6 +407,8 @@ extern void | |||
407 | radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on); | 407 | radeon_combios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on); |
408 | extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | 408 | extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, |
409 | u16 blue, int regno); | 409 | u16 blue, int regno); |
410 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | ||
411 | u16 *blue, int regno); | ||
410 | struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev, | 412 | struct drm_framebuffer *radeon_framebuffer_create(struct drm_device *dev, |
411 | struct drm_mode_fb_cmd *mode_cmd, | 413 | struct drm_mode_fb_cmd *mode_cmd, |
412 | struct drm_gem_object *obj); | 414 | struct drm_gem_object *obj); |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 73af463b7a5..1f056dadc5c 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
@@ -400,11 +400,9 @@ void radeon_object_list_add_object(struct radeon_object_list *lobj, | |||
400 | int radeon_object_list_reserve(struct list_head *head) | 400 | int radeon_object_list_reserve(struct list_head *head) |
401 | { | 401 | { |
402 | struct radeon_object_list *lobj; | 402 | struct radeon_object_list *lobj; |
403 | struct list_head *i; | ||
404 | int r; | 403 | int r; |
405 | 404 | ||
406 | list_for_each(i, head) { | 405 | list_for_each_entry(lobj, head, list){ |
407 | lobj = list_entry(i, struct radeon_object_list, list); | ||
408 | if (!lobj->robj->pin_count) { | 406 | if (!lobj->robj->pin_count) { |
409 | r = radeon_object_reserve(lobj->robj, true); | 407 | r = radeon_object_reserve(lobj->robj, true); |
410 | if (unlikely(r != 0)) { | 408 | if (unlikely(r != 0)) { |
@@ -420,13 +418,10 @@ int radeon_object_list_reserve(struct list_head *head) | |||
420 | void radeon_object_list_unreserve(struct list_head *head) | 418 | void radeon_object_list_unreserve(struct list_head *head) |
421 | { | 419 | { |
422 | struct radeon_object_list *lobj; | 420 | struct radeon_object_list *lobj; |
423 | struct list_head *i; | ||
424 | 421 | ||
425 | list_for_each(i, head) { | 422 | list_for_each_entry(lobj, head, list) { |
426 | lobj = list_entry(i, struct radeon_object_list, list); | ||
427 | if (!lobj->robj->pin_count) { | 423 | if (!lobj->robj->pin_count) { |
428 | radeon_object_unreserve(lobj->robj); | 424 | radeon_object_unreserve(lobj->robj); |
429 | } else { | ||
430 | } | 425 | } |
431 | } | 426 | } |
432 | } | 427 | } |
@@ -436,7 +431,6 @@ int radeon_object_list_validate(struct list_head *head, void *fence) | |||
436 | struct radeon_object_list *lobj; | 431 | struct radeon_object_list *lobj; |
437 | struct radeon_object *robj; | 432 | struct radeon_object *robj; |
438 | struct radeon_fence *old_fence = NULL; | 433 | struct radeon_fence *old_fence = NULL; |
439 | struct list_head *i; | ||
440 | int r; | 434 | int r; |
441 | 435 | ||
442 | r = radeon_object_list_reserve(head); | 436 | r = radeon_object_list_reserve(head); |
@@ -444,8 +438,7 @@ int radeon_object_list_validate(struct list_head *head, void *fence) | |||
444 | radeon_object_list_unreserve(head); | 438 | radeon_object_list_unreserve(head); |
445 | return r; | 439 | return r; |
446 | } | 440 | } |
447 | list_for_each(i, head) { | 441 | list_for_each_entry(lobj, head, list) { |
448 | lobj = list_entry(i, struct radeon_object_list, list); | ||
449 | robj = lobj->robj; | 442 | robj = lobj->robj; |
450 | if (!robj->pin_count) { | 443 | if (!robj->pin_count) { |
451 | if (lobj->wdomain) { | 444 | if (lobj->wdomain) { |
@@ -482,10 +475,8 @@ void radeon_object_list_unvalidate(struct list_head *head) | |||
482 | { | 475 | { |
483 | struct radeon_object_list *lobj; | 476 | struct radeon_object_list *lobj; |
484 | struct radeon_fence *old_fence = NULL; | 477 | struct radeon_fence *old_fence = NULL; |
485 | struct list_head *i; | ||
486 | 478 | ||
487 | list_for_each(i, head) { | 479 | list_for_each_entry(lobj, head, list) { |
488 | lobj = list_entry(i, struct radeon_object_list, list); | ||
489 | old_fence = (struct radeon_fence *)lobj->robj->tobj.sync_obj; | 480 | old_fence = (struct radeon_fence *)lobj->robj->tobj.sync_obj; |
490 | lobj->robj->tobj.sync_obj = NULL; | 481 | lobj->robj->tobj.sync_obj = NULL; |
491 | if (old_fence) { | 482 | if (old_fence) { |
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index 21da871a793..bfa1ab9c93e 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
@@ -3333,6 +3333,7 @@ | |||
3333 | # define RADEON_CP_PACKET_MAX_DWORDS (1 << 12) | 3333 | # define RADEON_CP_PACKET_MAX_DWORDS (1 << 12) |
3334 | # define RADEON_CP_PACKET0_REG_MASK 0x000007ff | 3334 | # define RADEON_CP_PACKET0_REG_MASK 0x000007ff |
3335 | # define R300_CP_PACKET0_REG_MASK 0x00001fff | 3335 | # define R300_CP_PACKET0_REG_MASK 0x00001fff |
3336 | # define R600_CP_PACKET0_REG_MASK 0x0000ffff | ||
3336 | # define RADEON_CP_PACKET1_REG0_MASK 0x000007ff | 3337 | # define RADEON_CP_PACKET1_REG0_MASK 0x000007ff |
3337 | # define RADEON_CP_PACKET1_REG1_MASK 0x003ff800 | 3338 | # define RADEON_CP_PACKET1_REG1_MASK 0x003ff800 |
3338 | 3339 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index acd889c9454..765bd184b6f 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
@@ -530,7 +530,7 @@ void radeon_ttm_fini(struct radeon_device *rdev) | |||
530 | } | 530 | } |
531 | 531 | ||
532 | static struct vm_operations_struct radeon_ttm_vm_ops; | 532 | static struct vm_operations_struct radeon_ttm_vm_ops; |
533 | static struct vm_operations_struct *ttm_vm_ops = NULL; | 533 | static const struct vm_operations_struct *ttm_vm_ops = NULL; |
534 | 534 | ||
535 | static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | 535 | static int radeon_ttm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
536 | { | 536 | { |
@@ -689,9 +689,6 @@ struct ttm_backend *radeon_ttm_backend_create(struct radeon_device *rdev) | |||
689 | 689 | ||
690 | #define RADEON_DEBUGFS_MEM_TYPES 2 | 690 | #define RADEON_DEBUGFS_MEM_TYPES 2 |
691 | 691 | ||
692 | static struct drm_info_list radeon_mem_types_list[RADEON_DEBUGFS_MEM_TYPES]; | ||
693 | static char radeon_mem_types_names[RADEON_DEBUGFS_MEM_TYPES][32]; | ||
694 | |||
695 | #if defined(CONFIG_DEBUG_FS) | 692 | #if defined(CONFIG_DEBUG_FS) |
696 | static int radeon_mm_dump_table(struct seq_file *m, void *data) | 693 | static int radeon_mm_dump_table(struct seq_file *m, void *data) |
697 | { | 694 | { |
@@ -711,9 +708,11 @@ static int radeon_mm_dump_table(struct seq_file *m, void *data) | |||
711 | 708 | ||
712 | static int radeon_ttm_debugfs_init(struct radeon_device *rdev) | 709 | static int radeon_ttm_debugfs_init(struct radeon_device *rdev) |
713 | { | 710 | { |
711 | #if defined(CONFIG_DEBUG_FS) | ||
712 | static struct drm_info_list radeon_mem_types_list[RADEON_DEBUGFS_MEM_TYPES]; | ||
713 | static char radeon_mem_types_names[RADEON_DEBUGFS_MEM_TYPES][32]; | ||
714 | unsigned i; | 714 | unsigned i; |
715 | 715 | ||
716 | #if defined(CONFIG_DEBUG_FS) | ||
717 | for (i = 0; i < RADEON_DEBUGFS_MEM_TYPES; i++) { | 716 | for (i = 0; i < RADEON_DEBUGFS_MEM_TYPES; i++) { |
718 | if (i == 0) | 717 | if (i == 0) |
719 | sprintf(radeon_mem_types_names[i], "radeon_vram_mm"); | 718 | sprintf(radeon_mem_types_names[i], "radeon_vram_mm"); |
diff --git a/drivers/gpu/drm/radeon/rs100d.h b/drivers/gpu/drm/radeon/rs100d.h new file mode 100644 index 00000000000..48a913a06cf --- /dev/null +++ b/drivers/gpu/drm/radeon/rs100d.h | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __RS100D_H__ | ||
29 | #define __RS100D_H__ | ||
30 | |||
31 | /* Registers */ | ||
32 | #define R_00015C_NB_TOM 0x00015C | ||
33 | #define S_00015C_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
34 | #define G_00015C_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
35 | #define C_00015C_MC_FB_START 0xFFFF0000 | ||
36 | #define S_00015C_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
37 | #define G_00015C_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
38 | #define C_00015C_MC_FB_TOP 0x0000FFFF | ||
39 | |||
40 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index a3fbdad938c..a769c296f6a 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
@@ -27,27 +27,12 @@ | |||
27 | */ | 27 | */ |
28 | #include <linux/seq_file.h> | 28 | #include <linux/seq_file.h> |
29 | #include <drm/drmP.h> | 29 | #include <drm/drmP.h> |
30 | #include "radeon_reg.h" | ||
31 | #include "radeon.h" | 30 | #include "radeon.h" |
31 | #include "rs400d.h" | ||
32 | 32 | ||
33 | /* rs400,rs480 depends on : */ | 33 | /* This files gather functions specifics to : rs400,rs480 */ |
34 | void r100_hdp_reset(struct radeon_device *rdev); | 34 | static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev); |
35 | void r100_mc_disable_clients(struct radeon_device *rdev); | ||
36 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
37 | void r420_pipes_init(struct radeon_device *rdev); | ||
38 | 35 | ||
39 | /* This files gather functions specifics to : | ||
40 | * rs400,rs480 | ||
41 | * | ||
42 | * Some of these functions might be used by newer ASICs. | ||
43 | */ | ||
44 | void rs400_gpu_init(struct radeon_device *rdev); | ||
45 | int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev); | ||
46 | |||
47 | |||
48 | /* | ||
49 | * GART functions. | ||
50 | */ | ||
51 | void rs400_gart_adjust_size(struct radeon_device *rdev) | 36 | void rs400_gart_adjust_size(struct radeon_device *rdev) |
52 | { | 37 | { |
53 | /* Check gart size */ | 38 | /* Check gart size */ |
@@ -238,61 +223,6 @@ int rs400_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
238 | return 0; | 223 | return 0; |
239 | } | 224 | } |
240 | 225 | ||
241 | |||
242 | /* | ||
243 | * MC functions. | ||
244 | */ | ||
245 | int rs400_mc_init(struct radeon_device *rdev) | ||
246 | { | ||
247 | uint32_t tmp; | ||
248 | int r; | ||
249 | |||
250 | if (r100_debugfs_rbbm_init(rdev)) { | ||
251 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
252 | } | ||
253 | |||
254 | rs400_gpu_init(rdev); | ||
255 | rs400_gart_disable(rdev); | ||
256 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | ||
257 | rdev->mc.gtt_location += (rdev->mc.gtt_size - 1); | ||
258 | rdev->mc.gtt_location &= ~(rdev->mc.gtt_size - 1); | ||
259 | r = radeon_mc_setup(rdev); | ||
260 | if (r) { | ||
261 | return r; | ||
262 | } | ||
263 | |||
264 | r100_mc_disable_clients(rdev); | ||
265 | if (r300_mc_wait_for_idle(rdev)) { | ||
266 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
267 | "programming pipes. Bad things might happen.\n"); | ||
268 | } | ||
269 | |||
270 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
271 | tmp = REG_SET(RADEON_MC_FB_TOP, tmp >> 16); | ||
272 | tmp |= REG_SET(RADEON_MC_FB_START, rdev->mc.vram_location >> 16); | ||
273 | WREG32(RADEON_MC_FB_LOCATION, tmp); | ||
274 | tmp = RREG32(RADEON_HOST_PATH_CNTL) | RADEON_HP_LIN_RD_CACHE_DIS; | ||
275 | WREG32(RADEON_HOST_PATH_CNTL, tmp | RADEON_HDP_SOFT_RESET | RADEON_HDP_READ_BUFFER_INVALIDATE); | ||
276 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
277 | WREG32(RADEON_HOST_PATH_CNTL, tmp); | ||
278 | (void)RREG32(RADEON_HOST_PATH_CNTL); | ||
279 | |||
280 | return 0; | ||
281 | } | ||
282 | |||
283 | void rs400_mc_fini(struct radeon_device *rdev) | ||
284 | { | ||
285 | } | ||
286 | |||
287 | |||
288 | /* | ||
289 | * Global GPU functions | ||
290 | */ | ||
291 | void rs400_errata(struct radeon_device *rdev) | ||
292 | { | ||
293 | rdev->pll_errata = 0; | ||
294 | } | ||
295 | |||
296 | void rs400_gpu_init(struct radeon_device *rdev) | 226 | void rs400_gpu_init(struct radeon_device *rdev) |
297 | { | 227 | { |
298 | /* FIXME: HDP same place on rs400 ? */ | 228 | /* FIXME: HDP same place on rs400 ? */ |
@@ -305,10 +235,6 @@ void rs400_gpu_init(struct radeon_device *rdev) | |||
305 | } | 235 | } |
306 | } | 236 | } |
307 | 237 | ||
308 | |||
309 | /* | ||
310 | * VRAM info. | ||
311 | */ | ||
312 | void rs400_vram_info(struct radeon_device *rdev) | 238 | void rs400_vram_info(struct radeon_device *rdev) |
313 | { | 239 | { |
314 | rs400_gart_adjust_size(rdev); | 240 | rs400_gart_adjust_size(rdev); |
@@ -319,10 +245,6 @@ void rs400_vram_info(struct radeon_device *rdev) | |||
319 | r100_vram_init_sizes(rdev); | 245 | r100_vram_init_sizes(rdev); |
320 | } | 246 | } |
321 | 247 | ||
322 | |||
323 | /* | ||
324 | * Indirect registers accessor | ||
325 | */ | ||
326 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 248 | uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
327 | { | 249 | { |
328 | uint32_t r; | 250 | uint32_t r; |
@@ -340,10 +262,6 @@ void rs400_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
340 | WREG32(RS480_NB_MC_INDEX, 0xff); | 262 | WREG32(RS480_NB_MC_INDEX, 0xff); |
341 | } | 263 | } |
342 | 264 | ||
343 | |||
344 | /* | ||
345 | * Debugfs info | ||
346 | */ | ||
347 | #if defined(CONFIG_DEBUG_FS) | 265 | #if defined(CONFIG_DEBUG_FS) |
348 | static int rs400_debugfs_gart_info(struct seq_file *m, void *data) | 266 | static int rs400_debugfs_gart_info(struct seq_file *m, void *data) |
349 | { | 267 | { |
@@ -419,7 +337,7 @@ static struct drm_info_list rs400_gart_info_list[] = { | |||
419 | }; | 337 | }; |
420 | #endif | 338 | #endif |
421 | 339 | ||
422 | int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) | 340 | static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
423 | { | 341 | { |
424 | #if defined(CONFIG_DEBUG_FS) | 342 | #if defined(CONFIG_DEBUG_FS) |
425 | return radeon_debugfs_add_files(rdev, rs400_gart_info_list, 1); | 343 | 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) | |||
427 | return 0; | 345 | return 0; |
428 | #endif | 346 | #endif |
429 | } | 347 | } |
348 | |||
349 | static int rs400_mc_init(struct radeon_device *rdev) | ||
350 | { | ||
351 | int r; | ||
352 | u32 tmp; | ||
353 | |||
354 | /* Setup GPU memory space */ | ||
355 | tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM)); | ||
356 | rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16; | ||
357 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
358 | r = radeon_mc_setup(rdev); | ||
359 | if (r) | ||
360 | return r; | ||
361 | return 0; | ||
362 | } | ||
363 | |||
364 | void rs400_mc_program(struct radeon_device *rdev) | ||
365 | { | ||
366 | struct r100_mc_save save; | ||
367 | |||
368 | /* Stops all mc clients */ | ||
369 | r100_mc_stop(rdev, &save); | ||
370 | |||
371 | /* Wait for mc idle */ | ||
372 | if (r300_mc_wait_for_idle(rdev)) | ||
373 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
374 | WREG32(R_000148_MC_FB_LOCATION, | ||
375 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
376 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
377 | |||
378 | r100_mc_resume(rdev, &save); | ||
379 | } | ||
380 | |||
381 | static int rs400_startup(struct radeon_device *rdev) | ||
382 | { | ||
383 | int r; | ||
384 | |||
385 | rs400_mc_program(rdev); | ||
386 | /* Resume clock */ | ||
387 | r300_clock_startup(rdev); | ||
388 | /* Initialize GPU configuration (# pipes, ...) */ | ||
389 | rs400_gpu_init(rdev); | ||
390 | /* Initialize GART (initialize after TTM so we can allocate | ||
391 | * memory through TTM but finalize after TTM) */ | ||
392 | r = rs400_gart_enable(rdev); | ||
393 | if (r) | ||
394 | return r; | ||
395 | /* Enable IRQ */ | ||
396 | rdev->irq.sw_int = true; | ||
397 | r100_irq_set(rdev); | ||
398 | /* 1M ring buffer */ | ||
399 | r = r100_cp_init(rdev, 1024 * 1024); | ||
400 | if (r) { | ||
401 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
402 | return r; | ||
403 | } | ||
404 | r = r100_wb_init(rdev); | ||
405 | if (r) | ||
406 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
407 | r = r100_ib_init(rdev); | ||
408 | if (r) { | ||
409 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
410 | return r; | ||
411 | } | ||
412 | return 0; | ||
413 | } | ||
414 | |||
415 | int rs400_resume(struct radeon_device *rdev) | ||
416 | { | ||
417 | /* Make sur GART are not working */ | ||
418 | rs400_gart_disable(rdev); | ||
419 | /* Resume clock before doing reset */ | ||
420 | r300_clock_startup(rdev); | ||
421 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
422 | if (radeon_gpu_reset(rdev)) { | ||
423 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
424 | RREG32(R_000E40_RBBM_STATUS), | ||
425 | RREG32(R_0007C0_CP_STAT)); | ||
426 | } | ||
427 | /* post */ | ||
428 | radeon_combios_asic_init(rdev->ddev); | ||
429 | /* Resume clock after posting */ | ||
430 | r300_clock_startup(rdev); | ||
431 | return rs400_startup(rdev); | ||
432 | } | ||
433 | |||
434 | int rs400_suspend(struct radeon_device *rdev) | ||
435 | { | ||
436 | r100_cp_disable(rdev); | ||
437 | r100_wb_disable(rdev); | ||
438 | r100_irq_disable(rdev); | ||
439 | rs400_gart_disable(rdev); | ||
440 | return 0; | ||
441 | } | ||
442 | |||
443 | void rs400_fini(struct radeon_device *rdev) | ||
444 | { | ||
445 | rs400_suspend(rdev); | ||
446 | r100_cp_fini(rdev); | ||
447 | r100_wb_fini(rdev); | ||
448 | r100_ib_fini(rdev); | ||
449 | radeon_gem_fini(rdev); | ||
450 | rs400_gart_fini(rdev); | ||
451 | radeon_irq_kms_fini(rdev); | ||
452 | radeon_fence_driver_fini(rdev); | ||
453 | radeon_object_fini(rdev); | ||
454 | radeon_atombios_fini(rdev); | ||
455 | kfree(rdev->bios); | ||
456 | rdev->bios = NULL; | ||
457 | } | ||
458 | |||
459 | int rs400_init(struct radeon_device *rdev) | ||
460 | { | ||
461 | int r; | ||
462 | |||
463 | /* Disable VGA */ | ||
464 | r100_vga_render_disable(rdev); | ||
465 | /* Initialize scratch registers */ | ||
466 | radeon_scratch_init(rdev); | ||
467 | /* Initialize surface registers */ | ||
468 | radeon_surface_init(rdev); | ||
469 | /* TODO: disable VGA need to use VGA request */ | ||
470 | /* BIOS*/ | ||
471 | if (!radeon_get_bios(rdev)) { | ||
472 | if (ASIC_IS_AVIVO(rdev)) | ||
473 | return -EINVAL; | ||
474 | } | ||
475 | if (rdev->is_atom_bios) { | ||
476 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); | ||
477 | return -EINVAL; | ||
478 | } else { | ||
479 | r = radeon_combios_init(rdev); | ||
480 | if (r) | ||
481 | return r; | ||
482 | } | ||
483 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
484 | if (radeon_gpu_reset(rdev)) { | ||
485 | dev_warn(rdev->dev, | ||
486 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
487 | RREG32(R_000E40_RBBM_STATUS), | ||
488 | RREG32(R_0007C0_CP_STAT)); | ||
489 | } | ||
490 | /* check if cards are posted or not */ | ||
491 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
492 | DRM_INFO("GPU not posted. posting now...\n"); | ||
493 | radeon_combios_asic_init(rdev->ddev); | ||
494 | } | ||
495 | /* Initialize clocks */ | ||
496 | radeon_get_clock_info(rdev->ddev); | ||
497 | /* Get vram informations */ | ||
498 | rs400_vram_info(rdev); | ||
499 | /* Initialize memory controller (also test AGP) */ | ||
500 | r = rs400_mc_init(rdev); | ||
501 | if (r) | ||
502 | return r; | ||
503 | /* Fence driver */ | ||
504 | r = radeon_fence_driver_init(rdev); | ||
505 | if (r) | ||
506 | return r; | ||
507 | r = radeon_irq_kms_init(rdev); | ||
508 | if (r) | ||
509 | return r; | ||
510 | /* Memory manager */ | ||
511 | r = radeon_object_init(rdev); | ||
512 | if (r) | ||
513 | return r; | ||
514 | r = rs400_gart_init(rdev); | ||
515 | if (r) | ||
516 | return r; | ||
517 | r300_set_reg_safe(rdev); | ||
518 | rdev->accel_working = true; | ||
519 | r = rs400_startup(rdev); | ||
520 | if (r) { | ||
521 | /* Somethings want wront with the accel init stop accel */ | ||
522 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
523 | rs400_suspend(rdev); | ||
524 | r100_cp_fini(rdev); | ||
525 | r100_wb_fini(rdev); | ||
526 | r100_ib_fini(rdev); | ||
527 | rs400_gart_fini(rdev); | ||
528 | radeon_irq_kms_fini(rdev); | ||
529 | rdev->accel_working = false; | ||
530 | } | ||
531 | return 0; | ||
532 | } | ||
diff --git a/drivers/gpu/drm/radeon/rs400d.h b/drivers/gpu/drm/radeon/rs400d.h new file mode 100644 index 00000000000..6d8bac58ced --- /dev/null +++ b/drivers/gpu/drm/radeon/rs400d.h | |||
@@ -0,0 +1,160 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __RS400D_H__ | ||
29 | #define __RS400D_H__ | ||
30 | |||
31 | /* Registers */ | ||
32 | #define R_000148_MC_FB_LOCATION 0x000148 | ||
33 | #define S_000148_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
34 | #define G_000148_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
35 | #define C_000148_MC_FB_START 0xFFFF0000 | ||
36 | #define S_000148_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
37 | #define G_000148_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
38 | #define C_000148_MC_FB_TOP 0x0000FFFF | ||
39 | #define R_00015C_NB_TOM 0x00015C | ||
40 | #define S_00015C_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
41 | #define G_00015C_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
42 | #define C_00015C_MC_FB_START 0xFFFF0000 | ||
43 | #define S_00015C_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
44 | #define G_00015C_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
45 | #define C_00015C_MC_FB_TOP 0x0000FFFF | ||
46 | #define R_0007C0_CP_STAT 0x0007C0 | ||
47 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
48 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
49 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
50 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
51 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
52 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
53 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
54 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
55 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
56 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
57 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
58 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
59 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
60 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
61 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
62 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
63 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
64 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
65 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
66 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
67 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
68 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
69 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
70 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
71 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
72 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
73 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
74 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
75 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
76 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
77 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
78 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
79 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
80 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
81 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
82 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
83 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
84 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
85 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
86 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
87 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
88 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
89 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
90 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
91 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
92 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
93 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
94 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
95 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
96 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
97 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
98 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
99 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
100 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
101 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
102 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
103 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
104 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
105 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
106 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
107 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
108 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
109 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
110 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
111 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
112 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
113 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
114 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
115 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
116 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
117 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
118 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
119 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
120 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
121 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
122 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
123 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
124 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
125 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
126 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
127 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
128 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
129 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
130 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
131 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
132 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
133 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
134 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
135 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
136 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
137 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
138 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
139 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
140 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
141 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
142 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
143 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
144 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
145 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
146 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
147 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
148 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
149 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
150 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
151 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
152 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
153 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
154 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
155 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
156 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
157 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
158 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
159 | |||
160 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 0e791e26def..10dfa78762d 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -25,28 +25,25 @@ | |||
25 | * Alex Deucher | 25 | * Alex Deucher |
26 | * Jerome Glisse | 26 | * Jerome Glisse |
27 | */ | 27 | */ |
28 | /* RS600 / Radeon X1250/X1270 integrated GPU | ||
29 | * | ||
30 | * This file gather function specific to RS600 which is the IGP of | ||
31 | * the X1250/X1270 family supporting intel CPU (while RS690/RS740 | ||
32 | * is the X1250/X1270 supporting AMD CPU). The display engine are | ||
33 | * the avivo one, bios is an atombios, 3D block are the one of the | ||
34 | * R4XX family. The GART is different from the RS400 one and is very | ||
35 | * close to the one of the R600 family (R600 likely being an evolution | ||
36 | * of the RS600 GART block). | ||
37 | */ | ||
28 | #include "drmP.h" | 38 | #include "drmP.h" |
29 | #include "radeon_reg.h" | ||
30 | #include "radeon.h" | 39 | #include "radeon.h" |
31 | #include "avivod.h" | 40 | #include "atom.h" |
41 | #include "rs600d.h" | ||
32 | 42 | ||
33 | #include "rs600_reg_safe.h" | 43 | #include "rs600_reg_safe.h" |
34 | 44 | ||
35 | /* rs600 depends on : */ | ||
36 | void r100_hdp_reset(struct radeon_device *rdev); | ||
37 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | ||
38 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
39 | void r420_pipes_init(struct radeon_device *rdev); | ||
40 | |||
41 | /* This files gather functions specifics to : | ||
42 | * rs600 | ||
43 | * | ||
44 | * Some of these functions might be used by newer ASICs. | ||
45 | */ | ||
46 | void rs600_gpu_init(struct radeon_device *rdev); | 45 | void rs600_gpu_init(struct radeon_device *rdev); |
47 | int rs600_mc_wait_for_idle(struct radeon_device *rdev); | 46 | int rs600_mc_wait_for_idle(struct radeon_device *rdev); |
48 | void rs600_disable_vga(struct radeon_device *rdev); | ||
49 | |||
50 | 47 | ||
51 | /* | 48 | /* |
52 | * GART. | 49 | * GART. |
@@ -55,18 +52,18 @@ void rs600_gart_tlb_flush(struct radeon_device *rdev) | |||
55 | { | 52 | { |
56 | uint32_t tmp; | 53 | uint32_t tmp; |
57 | 54 | ||
58 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 55 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
59 | tmp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE); | 56 | tmp &= C_000100_INVALIDATE_ALL_L1_TLBS & C_000100_INVALIDATE_L2_CACHE; |
60 | WREG32_MC(RS600_MC_PT0_CNTL, tmp); | 57 | WREG32_MC(R_000100_MC_PT0_CNTL, tmp); |
61 | 58 | ||
62 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 59 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
63 | tmp |= RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE; | 60 | tmp |= S_000100_INVALIDATE_ALL_L1_TLBS(1) & S_000100_INVALIDATE_L2_CACHE(1); |
64 | WREG32_MC(RS600_MC_PT0_CNTL, tmp); | 61 | WREG32_MC(R_000100_MC_PT0_CNTL, tmp); |
65 | 62 | ||
66 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 63 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
67 | tmp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE); | 64 | tmp &= C_000100_INVALIDATE_ALL_L1_TLBS & C_000100_INVALIDATE_L2_CACHE; |
68 | WREG32_MC(RS600_MC_PT0_CNTL, tmp); | 65 | WREG32_MC(R_000100_MC_PT0_CNTL, tmp); |
69 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 66 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
70 | } | 67 | } |
71 | 68 | ||
72 | int rs600_gart_init(struct radeon_device *rdev) | 69 | int rs600_gart_init(struct radeon_device *rdev) |
@@ -88,7 +85,7 @@ int rs600_gart_init(struct radeon_device *rdev) | |||
88 | 85 | ||
89 | int rs600_gart_enable(struct radeon_device *rdev) | 86 | int rs600_gart_enable(struct radeon_device *rdev) |
90 | { | 87 | { |
91 | uint32_t tmp; | 88 | u32 tmp; |
92 | int r, i; | 89 | int r, i; |
93 | 90 | ||
94 | if (rdev->gart.table.vram.robj == NULL) { | 91 | if (rdev->gart.table.vram.robj == NULL) { |
@@ -98,46 +95,50 @@ int rs600_gart_enable(struct radeon_device *rdev) | |||
98 | r = radeon_gart_table_vram_pin(rdev); | 95 | r = radeon_gart_table_vram_pin(rdev); |
99 | if (r) | 96 | if (r) |
100 | return r; | 97 | return r; |
98 | /* Enable bus master */ | ||
99 | tmp = RREG32(R_00004C_BUS_CNTL) & C_00004C_BUS_MASTER_DIS; | ||
100 | WREG32(R_00004C_BUS_CNTL, tmp); | ||
101 | /* FIXME: setup default page */ | 101 | /* FIXME: setup default page */ |
102 | WREG32_MC(RS600_MC_PT0_CNTL, | 102 | WREG32_MC(R_000100_MC_PT0_CNTL, |
103 | (RS600_EFFECTIVE_L2_CACHE_SIZE(6) | | 103 | (S_000100_EFFECTIVE_L2_CACHE_SIZE(6) | |
104 | RS600_EFFECTIVE_L2_QUEUE_SIZE(6))); | 104 | S_000100_EFFECTIVE_L2_QUEUE_SIZE(6))); |
105 | for (i = 0; i < 19; i++) { | 105 | for (i = 0; i < 19; i++) { |
106 | WREG32_MC(RS600_MC_PT0_CLIENT0_CNTL + i, | 106 | WREG32_MC(R_00016C_MC_PT0_CLIENT0_CNTL + i, |
107 | (RS600_ENABLE_TRANSLATION_MODE_OVERRIDE | | 107 | S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(1) | |
108 | RS600_SYSTEM_ACCESS_MODE_IN_SYS | | 108 | S_00016C_SYSTEM_ACCESS_MODE_MASK( |
109 | RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_DEFAULT_PAGE | | 109 | V_00016C_SYSTEM_ACCESS_MODE_IN_SYS) | |
110 | RS600_EFFECTIVE_L1_CACHE_SIZE(3) | | 110 | S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS( |
111 | RS600_ENABLE_FRAGMENT_PROCESSING | | 111 | V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE) | |
112 | RS600_EFFECTIVE_L1_QUEUE_SIZE(3))); | 112 | S_00016C_EFFECTIVE_L1_CACHE_SIZE(1) | |
113 | S_00016C_ENABLE_FRAGMENT_PROCESSING(1) | | ||
114 | S_00016C_EFFECTIVE_L1_QUEUE_SIZE(1)); | ||
113 | } | 115 | } |
114 | 116 | ||
115 | /* System context map to GART space */ | 117 | /* System context map to GART space */ |
116 | WREG32_MC(RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_location); | 118 | WREG32_MC(R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.gtt_start); |
117 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | 119 | WREG32_MC(R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, rdev->mc.gtt_end); |
118 | WREG32_MC(RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, tmp); | ||
119 | 120 | ||
120 | /* enable first context */ | 121 | /* enable first context */ |
121 | WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_location); | 122 | WREG32_MC(R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR, rdev->mc.gtt_start); |
122 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | 123 | WREG32_MC(R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR, rdev->mc.gtt_end); |
123 | WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_END_ADDR, tmp); | 124 | WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL, |
124 | WREG32_MC(RS600_MC_PT0_CONTEXT0_CNTL, | 125 | S_000102_ENABLE_PAGE_TABLE(1) | |
125 | (RS600_ENABLE_PAGE_TABLE | RS600_PAGE_TABLE_TYPE_FLAT)); | 126 | S_000102_PAGE_TABLE_DEPTH(V_000102_PAGE_TABLE_FLAT)); |
126 | /* disable all other contexts */ | 127 | /* disable all other contexts */ |
127 | for (i = 1; i < 8; i++) { | 128 | for (i = 1; i < 8; i++) { |
128 | WREG32_MC(RS600_MC_PT0_CONTEXT0_CNTL + i, 0); | 129 | WREG32_MC(R_000102_MC_PT0_CONTEXT0_CNTL + i, 0); |
129 | } | 130 | } |
130 | 131 | ||
131 | /* setup the page table */ | 132 | /* setup the page table */ |
132 | WREG32_MC(RS600_MC_PT0_CONTEXT0_FLAT_BASE_ADDR, | 133 | WREG32_MC(R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR, |
133 | rdev->gart.table_addr); | 134 | rdev->gart.table_addr); |
134 | WREG32_MC(RS600_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0); | 135 | WREG32_MC(R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0); |
135 | 136 | ||
136 | /* enable page tables */ | 137 | /* enable page tables */ |
137 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 138 | tmp = RREG32_MC(R_000100_MC_PT0_CNTL); |
138 | WREG32_MC(RS600_MC_PT0_CNTL, (tmp | RS600_ENABLE_PT)); | 139 | WREG32_MC(R_000100_MC_PT0_CNTL, (tmp | S_000100_ENABLE_PT(1))); |
139 | tmp = RREG32_MC(RS600_MC_CNTL1); | 140 | tmp = RREG32_MC(R_000009_MC_CNTL1); |
140 | WREG32_MC(RS600_MC_CNTL1, (tmp | RS600_ENABLE_PAGE_TABLES)); | 141 | WREG32_MC(R_000009_MC_CNTL1, (tmp | S_000009_ENABLE_PAGE_TABLES(1))); |
141 | rs600_gart_tlb_flush(rdev); | 142 | rs600_gart_tlb_flush(rdev); |
142 | rdev->gart.ready = true; | 143 | rdev->gart.ready = true; |
143 | return 0; | 144 | return 0; |
@@ -148,10 +149,9 @@ void rs600_gart_disable(struct radeon_device *rdev) | |||
148 | uint32_t tmp; | 149 | uint32_t tmp; |
149 | 150 | ||
150 | /* FIXME: disable out of gart access */ | 151 | /* FIXME: disable out of gart access */ |
151 | WREG32_MC(RS600_MC_PT0_CNTL, 0); | 152 | WREG32_MC(R_000100_MC_PT0_CNTL, 0); |
152 | tmp = RREG32_MC(RS600_MC_CNTL1); | 153 | tmp = RREG32_MC(R_000009_MC_CNTL1); |
153 | tmp &= ~RS600_ENABLE_PAGE_TABLES; | 154 | WREG32_MC(R_000009_MC_CNTL1, tmp & C_000009_ENABLE_PAGE_TABLES); |
154 | WREG32_MC(RS600_MC_CNTL1, tmp); | ||
155 | if (rdev->gart.table.vram.robj) { | 155 | if (rdev->gart.table.vram.robj) { |
156 | radeon_object_kunmap(rdev->gart.table.vram.robj); | 156 | radeon_object_kunmap(rdev->gart.table.vram.robj); |
157 | radeon_object_unpin(rdev->gart.table.vram.robj); | 157 | radeon_object_unpin(rdev->gart.table.vram.robj); |
@@ -185,129 +185,61 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
185 | return 0; | 185 | return 0; |
186 | } | 186 | } |
187 | 187 | ||
188 | |||
189 | /* | ||
190 | * MC. | ||
191 | */ | ||
192 | void rs600_mc_disable_clients(struct radeon_device *rdev) | ||
193 | { | ||
194 | unsigned tmp; | ||
195 | |||
196 | if (r100_gui_wait_for_idle(rdev)) { | ||
197 | printk(KERN_WARNING "Failed to wait GUI idle while " | ||
198 | "programming pipes. Bad things might happen.\n"); | ||
199 | } | ||
200 | |||
201 | radeon_avivo_vga_render_disable(rdev); | ||
202 | |||
203 | tmp = RREG32(AVIVO_D1VGA_CONTROL); | ||
204 | WREG32(AVIVO_D1VGA_CONTROL, tmp & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); | ||
205 | tmp = RREG32(AVIVO_D2VGA_CONTROL); | ||
206 | WREG32(AVIVO_D2VGA_CONTROL, tmp & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); | ||
207 | |||
208 | tmp = RREG32(AVIVO_D1CRTC_CONTROL); | ||
209 | WREG32(AVIVO_D1CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN); | ||
210 | tmp = RREG32(AVIVO_D2CRTC_CONTROL); | ||
211 | WREG32(AVIVO_D2CRTC_CONTROL, tmp & ~AVIVO_CRTC_EN); | ||
212 | |||
213 | /* make sure all previous write got through */ | ||
214 | tmp = RREG32(AVIVO_D2CRTC_CONTROL); | ||
215 | |||
216 | mdelay(1); | ||
217 | } | ||
218 | |||
219 | int rs600_mc_init(struct radeon_device *rdev) | ||
220 | { | ||
221 | uint32_t tmp; | ||
222 | int r; | ||
223 | |||
224 | if (r100_debugfs_rbbm_init(rdev)) { | ||
225 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
226 | } | ||
227 | |||
228 | rs600_gpu_init(rdev); | ||
229 | rs600_gart_disable(rdev); | ||
230 | |||
231 | /* Setup GPU memory space */ | ||
232 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
233 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
234 | r = radeon_mc_setup(rdev); | ||
235 | if (r) { | ||
236 | return r; | ||
237 | } | ||
238 | |||
239 | /* Program GPU memory space */ | ||
240 | /* Enable bus master */ | ||
241 | tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; | ||
242 | WREG32(RADEON_BUS_CNTL, tmp); | ||
243 | /* FIXME: What does AGP means for such chipset ? */ | ||
244 | WREG32_MC(RS600_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
245 | /* FIXME: are this AGP reg in indirect MC range ? */ | ||
246 | WREG32_MC(RS600_MC_AGP_BASE, 0); | ||
247 | WREG32_MC(RS600_MC_AGP_BASE_2, 0); | ||
248 | rs600_mc_disable_clients(rdev); | ||
249 | if (rs600_mc_wait_for_idle(rdev)) { | ||
250 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
251 | "programming pipes. Bad things might happen.\n"); | ||
252 | } | ||
253 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
254 | tmp = REG_SET(RS600_MC_FB_TOP, tmp >> 16); | ||
255 | tmp |= REG_SET(RS600_MC_FB_START, rdev->mc.vram_location >> 16); | ||
256 | WREG32_MC(RS600_MC_FB_LOCATION, tmp); | ||
257 | WREG32(RS690_HDP_FB_LOCATION, rdev->mc.vram_location >> 16); | ||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | void rs600_mc_fini(struct radeon_device *rdev) | ||
262 | { | ||
263 | } | ||
264 | |||
265 | |||
266 | /* | ||
267 | * Interrupts | ||
268 | */ | ||
269 | int rs600_irq_set(struct radeon_device *rdev) | 188 | int rs600_irq_set(struct radeon_device *rdev) |
270 | { | 189 | { |
271 | uint32_t tmp = 0; | 190 | uint32_t tmp = 0; |
272 | uint32_t mode_int = 0; | 191 | uint32_t mode_int = 0; |
273 | 192 | ||
274 | if (rdev->irq.sw_int) { | 193 | if (rdev->irq.sw_int) { |
275 | tmp |= RADEON_SW_INT_ENABLE; | 194 | tmp |= S_000040_SW_INT_EN(1); |
276 | } | 195 | } |
277 | if (rdev->irq.crtc_vblank_int[0]) { | 196 | if (rdev->irq.crtc_vblank_int[0]) { |
278 | mode_int |= AVIVO_D1MODE_INT_MASK; | 197 | mode_int |= S_006540_D1MODE_VBLANK_INT_MASK(1); |
279 | } | 198 | } |
280 | if (rdev->irq.crtc_vblank_int[1]) { | 199 | if (rdev->irq.crtc_vblank_int[1]) { |
281 | mode_int |= AVIVO_D2MODE_INT_MASK; | 200 | mode_int |= S_006540_D2MODE_VBLANK_INT_MASK(1); |
282 | } | 201 | } |
283 | WREG32(RADEON_GEN_INT_CNTL, tmp); | 202 | WREG32(R_000040_GEN_INT_CNTL, tmp); |
284 | WREG32(AVIVO_DxMODE_INT_MASK, mode_int); | 203 | WREG32(R_006540_DxMODE_INT_MASK, mode_int); |
285 | return 0; | 204 | return 0; |
286 | } | 205 | } |
287 | 206 | ||
288 | static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int) | 207 | static inline uint32_t rs600_irq_ack(struct radeon_device *rdev, u32 *r500_disp_int) |
289 | { | 208 | { |
290 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); | 209 | uint32_t irqs = RREG32(R_000044_GEN_INT_STATUS); |
291 | uint32_t irq_mask = RADEON_SW_INT_TEST; | 210 | uint32_t irq_mask = ~C_000044_SW_INT; |
292 | 211 | ||
293 | if (irqs & AVIVO_DISPLAY_INT_STATUS) { | 212 | if (G_000044_DISPLAY_INT_STAT(irqs)) { |
294 | *r500_disp_int = RREG32(AVIVO_DISP_INTERRUPT_STATUS); | 213 | *r500_disp_int = RREG32(R_007EDC_DISP_INTERRUPT_STATUS); |
295 | if (*r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { | 214 | if (G_007EDC_LB_D1_VBLANK_INTERRUPT(*r500_disp_int)) { |
296 | WREG32(AVIVO_D1MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); | 215 | WREG32(R_006534_D1MODE_VBLANK_STATUS, |
216 | S_006534_D1MODE_VBLANK_ACK(1)); | ||
297 | } | 217 | } |
298 | if (*r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { | 218 | if (G_007EDC_LB_D2_VBLANK_INTERRUPT(*r500_disp_int)) { |
299 | WREG32(AVIVO_D2MODE_VBLANK_STATUS, AVIVO_VBLANK_ACK); | 219 | WREG32(R_006D34_D2MODE_VBLANK_STATUS, |
220 | S_006D34_D2MODE_VBLANK_ACK(1)); | ||
300 | } | 221 | } |
301 | } else { | 222 | } else { |
302 | *r500_disp_int = 0; | 223 | *r500_disp_int = 0; |
303 | } | 224 | } |
304 | 225 | ||
305 | if (irqs) { | 226 | if (irqs) { |
306 | WREG32(RADEON_GEN_INT_STATUS, irqs); | 227 | WREG32(R_000044_GEN_INT_STATUS, irqs); |
307 | } | 228 | } |
308 | return irqs & irq_mask; | 229 | return irqs & irq_mask; |
309 | } | 230 | } |
310 | 231 | ||
232 | void rs600_irq_disable(struct radeon_device *rdev) | ||
233 | { | ||
234 | u32 tmp; | ||
235 | |||
236 | WREG32(R_000040_GEN_INT_CNTL, 0); | ||
237 | WREG32(R_006540_DxMODE_INT_MASK, 0); | ||
238 | /* Wait and acknowledge irq */ | ||
239 | mdelay(1); | ||
240 | rs600_irq_ack(rdev, &tmp); | ||
241 | } | ||
242 | |||
311 | int rs600_irq_process(struct radeon_device *rdev) | 243 | int rs600_irq_process(struct radeon_device *rdev) |
312 | { | 244 | { |
313 | uint32_t status; | 245 | uint32_t status; |
@@ -319,16 +251,13 @@ int rs600_irq_process(struct radeon_device *rdev) | |||
319 | } | 251 | } |
320 | while (status || r500_disp_int) { | 252 | while (status || r500_disp_int) { |
321 | /* SW interrupt */ | 253 | /* SW interrupt */ |
322 | if (status & RADEON_SW_INT_TEST) { | 254 | if (G_000040_SW_INT_EN(status)) |
323 | radeon_fence_process(rdev); | 255 | radeon_fence_process(rdev); |
324 | } | ||
325 | /* Vertical blank interrupts */ | 256 | /* Vertical blank interrupts */ |
326 | if (r500_disp_int & AVIVO_D1_VBLANK_INTERRUPT) { | 257 | if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int)) |
327 | drm_handle_vblank(rdev->ddev, 0); | 258 | drm_handle_vblank(rdev->ddev, 0); |
328 | } | 259 | if (G_007EDC_LB_D2_VBLANK_INTERRUPT(r500_disp_int)) |
329 | if (r500_disp_int & AVIVO_D2_VBLANK_INTERRUPT) { | ||
330 | drm_handle_vblank(rdev->ddev, 1); | 260 | drm_handle_vblank(rdev->ddev, 1); |
331 | } | ||
332 | status = rs600_irq_ack(rdev, &r500_disp_int); | 261 | status = rs600_irq_ack(rdev, &r500_disp_int); |
333 | } | 262 | } |
334 | return IRQ_HANDLED; | 263 | return IRQ_HANDLED; |
@@ -337,67 +266,34 @@ int rs600_irq_process(struct radeon_device *rdev) | |||
337 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc) | 266 | u32 rs600_get_vblank_counter(struct radeon_device *rdev, int crtc) |
338 | { | 267 | { |
339 | if (crtc == 0) | 268 | if (crtc == 0) |
340 | return RREG32(AVIVO_D1CRTC_FRAME_COUNT); | 269 | return RREG32(R_0060A4_D1CRTC_STATUS_FRAME_COUNT); |
341 | else | 270 | else |
342 | return RREG32(AVIVO_D2CRTC_FRAME_COUNT); | 271 | return RREG32(R_0068A4_D2CRTC_STATUS_FRAME_COUNT); |
343 | } | ||
344 | |||
345 | |||
346 | /* | ||
347 | * Global GPU functions | ||
348 | */ | ||
349 | void rs600_disable_vga(struct radeon_device *rdev) | ||
350 | { | ||
351 | unsigned tmp; | ||
352 | |||
353 | WREG32(0x330, 0); | ||
354 | WREG32(0x338, 0); | ||
355 | tmp = RREG32(0x300); | ||
356 | tmp &= ~(3 << 16); | ||
357 | WREG32(0x300, tmp); | ||
358 | WREG32(0x308, (1 << 8)); | ||
359 | WREG32(0x310, rdev->mc.vram_location); | ||
360 | WREG32(0x594, 0); | ||
361 | } | 272 | } |
362 | 273 | ||
363 | int rs600_mc_wait_for_idle(struct radeon_device *rdev) | 274 | int rs600_mc_wait_for_idle(struct radeon_device *rdev) |
364 | { | 275 | { |
365 | unsigned i; | 276 | unsigned i; |
366 | uint32_t tmp; | ||
367 | 277 | ||
368 | for (i = 0; i < rdev->usec_timeout; i++) { | 278 | for (i = 0; i < rdev->usec_timeout; i++) { |
369 | /* read MC_STATUS */ | 279 | if (G_000000_MC_IDLE(RREG32_MC(R_000000_MC_STATUS))) |
370 | tmp = RREG32_MC(RS600_MC_STATUS); | ||
371 | if (tmp & RS600_MC_STATUS_IDLE) { | ||
372 | return 0; | 280 | return 0; |
373 | } | 281 | udelay(1); |
374 | DRM_UDELAY(1); | ||
375 | } | 282 | } |
376 | return -1; | 283 | return -1; |
377 | } | 284 | } |
378 | 285 | ||
379 | void rs600_errata(struct radeon_device *rdev) | ||
380 | { | ||
381 | rdev->pll_errata = 0; | ||
382 | } | ||
383 | |||
384 | void rs600_gpu_init(struct radeon_device *rdev) | 286 | void rs600_gpu_init(struct radeon_device *rdev) |
385 | { | 287 | { |
386 | /* FIXME: HDP same place on rs600 ? */ | 288 | /* FIXME: HDP same place on rs600 ? */ |
387 | r100_hdp_reset(rdev); | 289 | r100_hdp_reset(rdev); |
388 | rs600_disable_vga(rdev); | ||
389 | /* FIXME: is this correct ? */ | 290 | /* FIXME: is this correct ? */ |
390 | r420_pipes_init(rdev); | 291 | r420_pipes_init(rdev); |
391 | if (rs600_mc_wait_for_idle(rdev)) { | 292 | /* Wait for mc idle */ |
392 | printk(KERN_WARNING "Failed to wait MC idle while " | 293 | if (rs600_mc_wait_for_idle(rdev)) |
393 | "programming pipes. Bad things might happen.\n"); | 294 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); |
394 | } | ||
395 | } | 295 | } |
396 | 296 | ||
397 | |||
398 | /* | ||
399 | * VRAM info. | ||
400 | */ | ||
401 | void rs600_vram_info(struct radeon_device *rdev) | 297 | void rs600_vram_info(struct radeon_device *rdev) |
402 | { | 298 | { |
403 | /* FIXME: to do or is these values sane ? */ | 299 | /* FIXME: to do or is these values sane ? */ |
@@ -410,31 +306,206 @@ void rs600_bandwidth_update(struct radeon_device *rdev) | |||
410 | /* FIXME: implement, should this be like rs690 ? */ | 306 | /* FIXME: implement, should this be like rs690 ? */ |
411 | } | 307 | } |
412 | 308 | ||
413 | |||
414 | /* | ||
415 | * Indirect registers accessor | ||
416 | */ | ||
417 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 309 | uint32_t rs600_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
418 | { | 310 | { |
419 | uint32_t r; | 311 | WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) | |
420 | 312 | S_000070_MC_IND_CITF_ARB0(1)); | |
421 | WREG32(RS600_MC_INDEX, | 313 | return RREG32(R_000074_MC_IND_DATA); |
422 | ((reg & RS600_MC_ADDR_MASK) | RS600_MC_IND_CITF_ARB0)); | ||
423 | r = RREG32(RS600_MC_DATA); | ||
424 | return r; | ||
425 | } | 314 | } |
426 | 315 | ||
427 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | 316 | void rs600_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) |
428 | { | 317 | { |
429 | WREG32(RS600_MC_INDEX, | 318 | WREG32(R_000070_MC_IND_INDEX, S_000070_MC_IND_ADDR(reg) | |
430 | RS600_MC_IND_WR_EN | RS600_MC_IND_CITF_ARB0 | | 319 | S_000070_MC_IND_CITF_ARB0(1) | S_000070_MC_IND_WR_EN(1)); |
431 | ((reg) & RS600_MC_ADDR_MASK)); | 320 | WREG32(R_000074_MC_IND_DATA, v); |
432 | WREG32(RS600_MC_DATA, v); | ||
433 | } | 321 | } |
434 | 322 | ||
435 | int rs600_init(struct radeon_device *rdev) | 323 | void rs600_debugfs(struct radeon_device *rdev) |
324 | { | ||
325 | if (r100_debugfs_rbbm_init(rdev)) | ||
326 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
327 | } | ||
328 | |||
329 | void rs600_set_safe_registers(struct radeon_device *rdev) | ||
436 | { | 330 | { |
437 | rdev->config.r300.reg_safe_bm = rs600_reg_safe_bm; | 331 | rdev->config.r300.reg_safe_bm = rs600_reg_safe_bm; |
438 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs600_reg_safe_bm); | 332 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rs600_reg_safe_bm); |
333 | } | ||
334 | |||
335 | static void rs600_mc_program(struct radeon_device *rdev) | ||
336 | { | ||
337 | struct rv515_mc_save save; | ||
338 | |||
339 | /* Stops all mc clients */ | ||
340 | rv515_mc_stop(rdev, &save); | ||
341 | |||
342 | /* Wait for mc idle */ | ||
343 | if (rs600_mc_wait_for_idle(rdev)) | ||
344 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
345 | |||
346 | /* FIXME: What does AGP means for such chipset ? */ | ||
347 | WREG32_MC(R_000005_MC_AGP_LOCATION, 0x0FFFFFFF); | ||
348 | WREG32_MC(R_000006_AGP_BASE, 0); | ||
349 | WREG32_MC(R_000007_AGP_BASE_2, 0); | ||
350 | /* Program MC */ | ||
351 | WREG32_MC(R_000004_MC_FB_LOCATION, | ||
352 | S_000004_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
353 | S_000004_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
354 | WREG32(R_000134_HDP_FB_LOCATION, | ||
355 | S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); | ||
356 | |||
357 | rv515_mc_resume(rdev, &save); | ||
358 | } | ||
359 | |||
360 | static int rs600_startup(struct radeon_device *rdev) | ||
361 | { | ||
362 | int r; | ||
363 | |||
364 | rs600_mc_program(rdev); | ||
365 | /* Resume clock */ | ||
366 | rv515_clock_startup(rdev); | ||
367 | /* Initialize GPU configuration (# pipes, ...) */ | ||
368 | rs600_gpu_init(rdev); | ||
369 | /* Initialize GART (initialize after TTM so we can allocate | ||
370 | * memory through TTM but finalize after TTM) */ | ||
371 | r = rs600_gart_enable(rdev); | ||
372 | if (r) | ||
373 | return r; | ||
374 | /* Enable IRQ */ | ||
375 | rdev->irq.sw_int = true; | ||
376 | rs600_irq_set(rdev); | ||
377 | /* 1M ring buffer */ | ||
378 | r = r100_cp_init(rdev, 1024 * 1024); | ||
379 | if (r) { | ||
380 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
381 | return r; | ||
382 | } | ||
383 | r = r100_wb_init(rdev); | ||
384 | if (r) | ||
385 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
386 | r = r100_ib_init(rdev); | ||
387 | if (r) { | ||
388 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
389 | return r; | ||
390 | } | ||
391 | return 0; | ||
392 | } | ||
393 | |||
394 | int rs600_resume(struct radeon_device *rdev) | ||
395 | { | ||
396 | /* Make sur GART are not working */ | ||
397 | rs600_gart_disable(rdev); | ||
398 | /* Resume clock before doing reset */ | ||
399 | rv515_clock_startup(rdev); | ||
400 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
401 | if (radeon_gpu_reset(rdev)) { | ||
402 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
403 | RREG32(R_000E40_RBBM_STATUS), | ||
404 | RREG32(R_0007C0_CP_STAT)); | ||
405 | } | ||
406 | /* post */ | ||
407 | atom_asic_init(rdev->mode_info.atom_context); | ||
408 | /* Resume clock after posting */ | ||
409 | rv515_clock_startup(rdev); | ||
410 | return rs600_startup(rdev); | ||
411 | } | ||
412 | |||
413 | int rs600_suspend(struct radeon_device *rdev) | ||
414 | { | ||
415 | r100_cp_disable(rdev); | ||
416 | r100_wb_disable(rdev); | ||
417 | rs600_irq_disable(rdev); | ||
418 | rs600_gart_disable(rdev); | ||
419 | return 0; | ||
420 | } | ||
421 | |||
422 | void rs600_fini(struct radeon_device *rdev) | ||
423 | { | ||
424 | rs600_suspend(rdev); | ||
425 | r100_cp_fini(rdev); | ||
426 | r100_wb_fini(rdev); | ||
427 | r100_ib_fini(rdev); | ||
428 | radeon_gem_fini(rdev); | ||
429 | rs600_gart_fini(rdev); | ||
430 | radeon_irq_kms_fini(rdev); | ||
431 | radeon_fence_driver_fini(rdev); | ||
432 | radeon_object_fini(rdev); | ||
433 | radeon_atombios_fini(rdev); | ||
434 | kfree(rdev->bios); | ||
435 | rdev->bios = NULL; | ||
436 | } | ||
437 | |||
438 | int rs600_init(struct radeon_device *rdev) | ||
439 | { | ||
440 | int r; | ||
441 | |||
442 | /* Disable VGA */ | ||
443 | rv515_vga_render_disable(rdev); | ||
444 | /* Initialize scratch registers */ | ||
445 | radeon_scratch_init(rdev); | ||
446 | /* Initialize surface registers */ | ||
447 | radeon_surface_init(rdev); | ||
448 | /* BIOS */ | ||
449 | if (!radeon_get_bios(rdev)) { | ||
450 | if (ASIC_IS_AVIVO(rdev)) | ||
451 | return -EINVAL; | ||
452 | } | ||
453 | if (rdev->is_atom_bios) { | ||
454 | r = radeon_atombios_init(rdev); | ||
455 | if (r) | ||
456 | return r; | ||
457 | } else { | ||
458 | dev_err(rdev->dev, "Expecting atombios for RS600 GPU\n"); | ||
459 | return -EINVAL; | ||
460 | } | ||
461 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
462 | if (radeon_gpu_reset(rdev)) { | ||
463 | dev_warn(rdev->dev, | ||
464 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
465 | RREG32(R_000E40_RBBM_STATUS), | ||
466 | RREG32(R_0007C0_CP_STAT)); | ||
467 | } | ||
468 | /* check if cards are posted or not */ | ||
469 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
470 | DRM_INFO("GPU not posted. posting now...\n"); | ||
471 | atom_asic_init(rdev->mode_info.atom_context); | ||
472 | } | ||
473 | /* Initialize clocks */ | ||
474 | radeon_get_clock_info(rdev->ddev); | ||
475 | /* Get vram informations */ | ||
476 | rs600_vram_info(rdev); | ||
477 | /* Initialize memory controller (also test AGP) */ | ||
478 | r = r420_mc_init(rdev); | ||
479 | if (r) | ||
480 | return r; | ||
481 | rs600_debugfs(rdev); | ||
482 | /* Fence driver */ | ||
483 | r = radeon_fence_driver_init(rdev); | ||
484 | if (r) | ||
485 | return r; | ||
486 | r = radeon_irq_kms_init(rdev); | ||
487 | if (r) | ||
488 | return r; | ||
489 | /* Memory manager */ | ||
490 | r = radeon_object_init(rdev); | ||
491 | if (r) | ||
492 | return r; | ||
493 | r = rs600_gart_init(rdev); | ||
494 | if (r) | ||
495 | return r; | ||
496 | rs600_set_safe_registers(rdev); | ||
497 | rdev->accel_working = true; | ||
498 | r = rs600_startup(rdev); | ||
499 | if (r) { | ||
500 | /* Somethings want wront with the accel init stop accel */ | ||
501 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
502 | rs600_suspend(rdev); | ||
503 | r100_cp_fini(rdev); | ||
504 | r100_wb_fini(rdev); | ||
505 | r100_ib_fini(rdev); | ||
506 | rs600_gart_fini(rdev); | ||
507 | radeon_irq_kms_fini(rdev); | ||
508 | rdev->accel_working = false; | ||
509 | } | ||
439 | return 0; | 510 | return 0; |
440 | } | 511 | } |
diff --git a/drivers/gpu/drm/radeon/rs600d.h b/drivers/gpu/drm/radeon/rs600d.h new file mode 100644 index 00000000000..81308924859 --- /dev/null +++ b/drivers/gpu/drm/radeon/rs600d.h | |||
@@ -0,0 +1,470 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __RS600D_H__ | ||
29 | #define __RS600D_H__ | ||
30 | |||
31 | /* Registers */ | ||
32 | #define R_000040_GEN_INT_CNTL 0x000040 | ||
33 | #define S_000040_DISPLAY_INT_STATUS(x) (((x) & 0x1) << 0) | ||
34 | #define G_000040_DISPLAY_INT_STATUS(x) (((x) >> 0) & 0x1) | ||
35 | #define C_000040_DISPLAY_INT_STATUS 0xFFFFFFFE | ||
36 | #define S_000040_DMA_VIPH0_INT_EN(x) (((x) & 0x1) << 12) | ||
37 | #define G_000040_DMA_VIPH0_INT_EN(x) (((x) >> 12) & 0x1) | ||
38 | #define C_000040_DMA_VIPH0_INT_EN 0xFFFFEFFF | ||
39 | #define S_000040_CRTC2_VSYNC(x) (((x) & 0x1) << 6) | ||
40 | #define G_000040_CRTC2_VSYNC(x) (((x) >> 6) & 0x1) | ||
41 | #define C_000040_CRTC2_VSYNC 0xFFFFFFBF | ||
42 | #define S_000040_SNAPSHOT2(x) (((x) & 0x1) << 7) | ||
43 | #define G_000040_SNAPSHOT2(x) (((x) >> 7) & 0x1) | ||
44 | #define C_000040_SNAPSHOT2 0xFFFFFF7F | ||
45 | #define S_000040_CRTC2_VBLANK(x) (((x) & 0x1) << 9) | ||
46 | #define G_000040_CRTC2_VBLANK(x) (((x) >> 9) & 0x1) | ||
47 | #define C_000040_CRTC2_VBLANK 0xFFFFFDFF | ||
48 | #define S_000040_FP2_DETECT(x) (((x) & 0x1) << 10) | ||
49 | #define G_000040_FP2_DETECT(x) (((x) >> 10) & 0x1) | ||
50 | #define C_000040_FP2_DETECT 0xFFFFFBFF | ||
51 | #define S_000040_VSYNC_DIFF_OVER_LIMIT(x) (((x) & 0x1) << 11) | ||
52 | #define G_000040_VSYNC_DIFF_OVER_LIMIT(x) (((x) >> 11) & 0x1) | ||
53 | #define C_000040_VSYNC_DIFF_OVER_LIMIT 0xFFFFF7FF | ||
54 | #define S_000040_DMA_VIPH1_INT_EN(x) (((x) & 0x1) << 13) | ||
55 | #define G_000040_DMA_VIPH1_INT_EN(x) (((x) >> 13) & 0x1) | ||
56 | #define C_000040_DMA_VIPH1_INT_EN 0xFFFFDFFF | ||
57 | #define S_000040_DMA_VIPH2_INT_EN(x) (((x) & 0x1) << 14) | ||
58 | #define G_000040_DMA_VIPH2_INT_EN(x) (((x) >> 14) & 0x1) | ||
59 | #define C_000040_DMA_VIPH2_INT_EN 0xFFFFBFFF | ||
60 | #define S_000040_DMA_VIPH3_INT_EN(x) (((x) & 0x1) << 15) | ||
61 | #define G_000040_DMA_VIPH3_INT_EN(x) (((x) >> 15) & 0x1) | ||
62 | #define C_000040_DMA_VIPH3_INT_EN 0xFFFF7FFF | ||
63 | #define S_000040_I2C_INT_EN(x) (((x) & 0x1) << 17) | ||
64 | #define G_000040_I2C_INT_EN(x) (((x) >> 17) & 0x1) | ||
65 | #define C_000040_I2C_INT_EN 0xFFFDFFFF | ||
66 | #define S_000040_GUI_IDLE(x) (((x) & 0x1) << 19) | ||
67 | #define G_000040_GUI_IDLE(x) (((x) >> 19) & 0x1) | ||
68 | #define C_000040_GUI_IDLE 0xFFF7FFFF | ||
69 | #define S_000040_VIPH_INT_EN(x) (((x) & 0x1) << 24) | ||
70 | #define G_000040_VIPH_INT_EN(x) (((x) >> 24) & 0x1) | ||
71 | #define C_000040_VIPH_INT_EN 0xFEFFFFFF | ||
72 | #define S_000040_SW_INT_EN(x) (((x) & 0x1) << 25) | ||
73 | #define G_000040_SW_INT_EN(x) (((x) >> 25) & 0x1) | ||
74 | #define C_000040_SW_INT_EN 0xFDFFFFFF | ||
75 | #define S_000040_GEYSERVILLE(x) (((x) & 0x1) << 27) | ||
76 | #define G_000040_GEYSERVILLE(x) (((x) >> 27) & 0x1) | ||
77 | #define C_000040_GEYSERVILLE 0xF7FFFFFF | ||
78 | #define S_000040_HDCP_AUTHORIZED_INT(x) (((x) & 0x1) << 28) | ||
79 | #define G_000040_HDCP_AUTHORIZED_INT(x) (((x) >> 28) & 0x1) | ||
80 | #define C_000040_HDCP_AUTHORIZED_INT 0xEFFFFFFF | ||
81 | #define S_000040_DVI_I2C_INT(x) (((x) & 0x1) << 29) | ||
82 | #define G_000040_DVI_I2C_INT(x) (((x) >> 29) & 0x1) | ||
83 | #define C_000040_DVI_I2C_INT 0xDFFFFFFF | ||
84 | #define S_000040_GUIDMA(x) (((x) & 0x1) << 30) | ||
85 | #define G_000040_GUIDMA(x) (((x) >> 30) & 0x1) | ||
86 | #define C_000040_GUIDMA 0xBFFFFFFF | ||
87 | #define S_000040_VIDDMA(x) (((x) & 0x1) << 31) | ||
88 | #define G_000040_VIDDMA(x) (((x) >> 31) & 0x1) | ||
89 | #define C_000040_VIDDMA 0x7FFFFFFF | ||
90 | #define R_000044_GEN_INT_STATUS 0x000044 | ||
91 | #define S_000044_DISPLAY_INT_STAT(x) (((x) & 0x1) << 0) | ||
92 | #define G_000044_DISPLAY_INT_STAT(x) (((x) >> 0) & 0x1) | ||
93 | #define C_000044_DISPLAY_INT_STAT 0xFFFFFFFE | ||
94 | #define S_000044_VGA_INT_STAT(x) (((x) & 0x1) << 1) | ||
95 | #define G_000044_VGA_INT_STAT(x) (((x) >> 1) & 0x1) | ||
96 | #define C_000044_VGA_INT_STAT 0xFFFFFFFD | ||
97 | #define S_000044_CAP0_INT_ACTIVE(x) (((x) & 0x1) << 8) | ||
98 | #define G_000044_CAP0_INT_ACTIVE(x) (((x) >> 8) & 0x1) | ||
99 | #define C_000044_CAP0_INT_ACTIVE 0xFFFFFEFF | ||
100 | #define S_000044_DMA_VIPH0_INT(x) (((x) & 0x1) << 12) | ||
101 | #define G_000044_DMA_VIPH0_INT(x) (((x) >> 12) & 0x1) | ||
102 | #define C_000044_DMA_VIPH0_INT 0xFFFFEFFF | ||
103 | #define S_000044_DMA_VIPH1_INT(x) (((x) & 0x1) << 13) | ||
104 | #define G_000044_DMA_VIPH1_INT(x) (((x) >> 13) & 0x1) | ||
105 | #define C_000044_DMA_VIPH1_INT 0xFFFFDFFF | ||
106 | #define S_000044_DMA_VIPH2_INT(x) (((x) & 0x1) << 14) | ||
107 | #define G_000044_DMA_VIPH2_INT(x) (((x) >> 14) & 0x1) | ||
108 | #define C_000044_DMA_VIPH2_INT 0xFFFFBFFF | ||
109 | #define S_000044_DMA_VIPH3_INT(x) (((x) & 0x1) << 15) | ||
110 | #define G_000044_DMA_VIPH3_INT(x) (((x) >> 15) & 0x1) | ||
111 | #define C_000044_DMA_VIPH3_INT 0xFFFF7FFF | ||
112 | #define S_000044_MC_PROBE_FAULT_STAT(x) (((x) & 0x1) << 16) | ||
113 | #define G_000044_MC_PROBE_FAULT_STAT(x) (((x) >> 16) & 0x1) | ||
114 | #define C_000044_MC_PROBE_FAULT_STAT 0xFFFEFFFF | ||
115 | #define S_000044_I2C_INT(x) (((x) & 0x1) << 17) | ||
116 | #define G_000044_I2C_INT(x) (((x) >> 17) & 0x1) | ||
117 | #define C_000044_I2C_INT 0xFFFDFFFF | ||
118 | #define S_000044_SCRATCH_INT_STAT(x) (((x) & 0x1) << 18) | ||
119 | #define G_000044_SCRATCH_INT_STAT(x) (((x) >> 18) & 0x1) | ||
120 | #define C_000044_SCRATCH_INT_STAT 0xFFFBFFFF | ||
121 | #define S_000044_GUI_IDLE_STAT(x) (((x) & 0x1) << 19) | ||
122 | #define G_000044_GUI_IDLE_STAT(x) (((x) >> 19) & 0x1) | ||
123 | #define C_000044_GUI_IDLE_STAT 0xFFF7FFFF | ||
124 | #define S_000044_ATI_OVERDRIVE_INT_STAT(x) (((x) & 0x1) << 20) | ||
125 | #define G_000044_ATI_OVERDRIVE_INT_STAT(x) (((x) >> 20) & 0x1) | ||
126 | #define C_000044_ATI_OVERDRIVE_INT_STAT 0xFFEFFFFF | ||
127 | #define S_000044_MC_PROTECTION_FAULT_STAT(x) (((x) & 0x1) << 21) | ||
128 | #define G_000044_MC_PROTECTION_FAULT_STAT(x) (((x) >> 21) & 0x1) | ||
129 | #define C_000044_MC_PROTECTION_FAULT_STAT 0xFFDFFFFF | ||
130 | #define S_000044_RBBM_READ_INT_STAT(x) (((x) & 0x1) << 22) | ||
131 | #define G_000044_RBBM_READ_INT_STAT(x) (((x) >> 22) & 0x1) | ||
132 | #define C_000044_RBBM_READ_INT_STAT 0xFFBFFFFF | ||
133 | #define S_000044_CB_CONTEXT_SWITCH_STAT(x) (((x) & 0x1) << 23) | ||
134 | #define G_000044_CB_CONTEXT_SWITCH_STAT(x) (((x) >> 23) & 0x1) | ||
135 | #define C_000044_CB_CONTEXT_SWITCH_STAT 0xFF7FFFFF | ||
136 | #define S_000044_VIPH_INT(x) (((x) & 0x1) << 24) | ||
137 | #define G_000044_VIPH_INT(x) (((x) >> 24) & 0x1) | ||
138 | #define C_000044_VIPH_INT 0xFEFFFFFF | ||
139 | #define S_000044_SW_INT(x) (((x) & 0x1) << 25) | ||
140 | #define G_000044_SW_INT(x) (((x) >> 25) & 0x1) | ||
141 | #define C_000044_SW_INT 0xFDFFFFFF | ||
142 | #define S_000044_SW_INT_SET(x) (((x) & 0x1) << 26) | ||
143 | #define G_000044_SW_INT_SET(x) (((x) >> 26) & 0x1) | ||
144 | #define C_000044_SW_INT_SET 0xFBFFFFFF | ||
145 | #define S_000044_IDCT_INT_STAT(x) (((x) & 0x1) << 27) | ||
146 | #define G_000044_IDCT_INT_STAT(x) (((x) >> 27) & 0x1) | ||
147 | #define C_000044_IDCT_INT_STAT 0xF7FFFFFF | ||
148 | #define S_000044_GUIDMA_STAT(x) (((x) & 0x1) << 30) | ||
149 | #define G_000044_GUIDMA_STAT(x) (((x) >> 30) & 0x1) | ||
150 | #define C_000044_GUIDMA_STAT 0xBFFFFFFF | ||
151 | #define S_000044_VIDDMA_STAT(x) (((x) & 0x1) << 31) | ||
152 | #define G_000044_VIDDMA_STAT(x) (((x) >> 31) & 0x1) | ||
153 | #define C_000044_VIDDMA_STAT 0x7FFFFFFF | ||
154 | #define R_00004C_BUS_CNTL 0x00004C | ||
155 | #define S_00004C_BUS_MASTER_DIS(x) (((x) & 0x1) << 14) | ||
156 | #define G_00004C_BUS_MASTER_DIS(x) (((x) >> 14) & 0x1) | ||
157 | #define C_00004C_BUS_MASTER_DIS 0xFFFFBFFF | ||
158 | #define S_00004C_BUS_MSI_REARM(x) (((x) & 0x1) << 20) | ||
159 | #define G_00004C_BUS_MSI_REARM(x) (((x) >> 20) & 0x1) | ||
160 | #define C_00004C_BUS_MSI_REARM 0xFFEFFFFF | ||
161 | #define R_000070_MC_IND_INDEX 0x000070 | ||
162 | #define S_000070_MC_IND_ADDR(x) (((x) & 0xFFFF) << 0) | ||
163 | #define G_000070_MC_IND_ADDR(x) (((x) >> 0) & 0xFFFF) | ||
164 | #define C_000070_MC_IND_ADDR 0xFFFF0000 | ||
165 | #define S_000070_MC_IND_SEQ_RBS_0(x) (((x) & 0x1) << 16) | ||
166 | #define G_000070_MC_IND_SEQ_RBS_0(x) (((x) >> 16) & 0x1) | ||
167 | #define C_000070_MC_IND_SEQ_RBS_0 0xFFFEFFFF | ||
168 | #define S_000070_MC_IND_SEQ_RBS_1(x) (((x) & 0x1) << 17) | ||
169 | #define G_000070_MC_IND_SEQ_RBS_1(x) (((x) >> 17) & 0x1) | ||
170 | #define C_000070_MC_IND_SEQ_RBS_1 0xFFFDFFFF | ||
171 | #define S_000070_MC_IND_SEQ_RBS_2(x) (((x) & 0x1) << 18) | ||
172 | #define G_000070_MC_IND_SEQ_RBS_2(x) (((x) >> 18) & 0x1) | ||
173 | #define C_000070_MC_IND_SEQ_RBS_2 0xFFFBFFFF | ||
174 | #define S_000070_MC_IND_SEQ_RBS_3(x) (((x) & 0x1) << 19) | ||
175 | #define G_000070_MC_IND_SEQ_RBS_3(x) (((x) >> 19) & 0x1) | ||
176 | #define C_000070_MC_IND_SEQ_RBS_3 0xFFF7FFFF | ||
177 | #define S_000070_MC_IND_AIC_RBS(x) (((x) & 0x1) << 20) | ||
178 | #define G_000070_MC_IND_AIC_RBS(x) (((x) >> 20) & 0x1) | ||
179 | #define C_000070_MC_IND_AIC_RBS 0xFFEFFFFF | ||
180 | #define S_000070_MC_IND_CITF_ARB0(x) (((x) & 0x1) << 21) | ||
181 | #define G_000070_MC_IND_CITF_ARB0(x) (((x) >> 21) & 0x1) | ||
182 | #define C_000070_MC_IND_CITF_ARB0 0xFFDFFFFF | ||
183 | #define S_000070_MC_IND_CITF_ARB1(x) (((x) & 0x1) << 22) | ||
184 | #define G_000070_MC_IND_CITF_ARB1(x) (((x) >> 22) & 0x1) | ||
185 | #define C_000070_MC_IND_CITF_ARB1 0xFFBFFFFF | ||
186 | #define S_000070_MC_IND_WR_EN(x) (((x) & 0x1) << 23) | ||
187 | #define G_000070_MC_IND_WR_EN(x) (((x) >> 23) & 0x1) | ||
188 | #define C_000070_MC_IND_WR_EN 0xFF7FFFFF | ||
189 | #define S_000070_MC_IND_RD_INV(x) (((x) & 0x1) << 24) | ||
190 | #define G_000070_MC_IND_RD_INV(x) (((x) >> 24) & 0x1) | ||
191 | #define C_000070_MC_IND_RD_INV 0xFEFFFFFF | ||
192 | #define R_000074_MC_IND_DATA 0x000074 | ||
193 | #define S_000074_MC_IND_DATA(x) (((x) & 0xFFFFFFFF) << 0) | ||
194 | #define G_000074_MC_IND_DATA(x) (((x) >> 0) & 0xFFFFFFFF) | ||
195 | #define C_000074_MC_IND_DATA 0x00000000 | ||
196 | #define R_000134_HDP_FB_LOCATION 0x000134 | ||
197 | #define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0) | ||
198 | #define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
199 | #define C_000134_HDP_FB_START 0xFFFF0000 | ||
200 | #define R_0007C0_CP_STAT 0x0007C0 | ||
201 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
202 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
203 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
204 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
205 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
206 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
207 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
208 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
209 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
210 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
211 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
212 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
213 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
214 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
215 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
216 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
217 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
218 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
219 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
220 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
221 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
222 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
223 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
224 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
225 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
226 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
227 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
228 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
229 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
230 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
231 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
232 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
233 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
234 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
235 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
236 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
237 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
238 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
239 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
240 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
241 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
242 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
243 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
244 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
245 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
246 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
247 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
248 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
249 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
250 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
251 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
252 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
253 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
254 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
255 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
256 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
257 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
258 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
259 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
260 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
261 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
262 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
263 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
264 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
265 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
266 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
267 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
268 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
269 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
270 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
271 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
272 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
273 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
274 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
275 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
276 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
277 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
278 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
279 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
280 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
281 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
282 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
283 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
284 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
285 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
286 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
287 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
288 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
289 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
290 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
291 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
292 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
293 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
294 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
295 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
296 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
297 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
298 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
299 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
300 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
301 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
302 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
303 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
304 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
305 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
306 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
307 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
308 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
309 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
310 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
311 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
312 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
313 | #define R_0060A4_D1CRTC_STATUS_FRAME_COUNT 0x0060A4 | ||
314 | #define S_0060A4_D1CRTC_FRAME_COUNT(x) (((x) & 0xFFFFFF) << 0) | ||
315 | #define G_0060A4_D1CRTC_FRAME_COUNT(x) (((x) >> 0) & 0xFFFFFF) | ||
316 | #define C_0060A4_D1CRTC_FRAME_COUNT 0xFF000000 | ||
317 | #define R_006534_D1MODE_VBLANK_STATUS 0x006534 | ||
318 | #define S_006534_D1MODE_VBLANK_OCCURRED(x) (((x) & 0x1) << 0) | ||
319 | #define G_006534_D1MODE_VBLANK_OCCURRED(x) (((x) >> 0) & 0x1) | ||
320 | #define C_006534_D1MODE_VBLANK_OCCURRED 0xFFFFFFFE | ||
321 | #define S_006534_D1MODE_VBLANK_ACK(x) (((x) & 0x1) << 4) | ||
322 | #define G_006534_D1MODE_VBLANK_ACK(x) (((x) >> 4) & 0x1) | ||
323 | #define C_006534_D1MODE_VBLANK_ACK 0xFFFFFFEF | ||
324 | #define S_006534_D1MODE_VBLANK_STAT(x) (((x) & 0x1) << 12) | ||
325 | #define G_006534_D1MODE_VBLANK_STAT(x) (((x) >> 12) & 0x1) | ||
326 | #define C_006534_D1MODE_VBLANK_STAT 0xFFFFEFFF | ||
327 | #define S_006534_D1MODE_VBLANK_INTERRUPT(x) (((x) & 0x1) << 16) | ||
328 | #define G_006534_D1MODE_VBLANK_INTERRUPT(x) (((x) >> 16) & 0x1) | ||
329 | #define C_006534_D1MODE_VBLANK_INTERRUPT 0xFFFEFFFF | ||
330 | #define R_006540_DxMODE_INT_MASK 0x006540 | ||
331 | #define S_006540_D1MODE_VBLANK_INT_MASK(x) (((x) & 0x1) << 0) | ||
332 | #define G_006540_D1MODE_VBLANK_INT_MASK(x) (((x) >> 0) & 0x1) | ||
333 | #define C_006540_D1MODE_VBLANK_INT_MASK 0xFFFFFFFE | ||
334 | #define S_006540_D1MODE_VLINE_INT_MASK(x) (((x) & 0x1) << 4) | ||
335 | #define G_006540_D1MODE_VLINE_INT_MASK(x) (((x) >> 4) & 0x1) | ||
336 | #define C_006540_D1MODE_VLINE_INT_MASK 0xFFFFFFEF | ||
337 | #define S_006540_D2MODE_VBLANK_INT_MASK(x) (((x) & 0x1) << 8) | ||
338 | #define G_006540_D2MODE_VBLANK_INT_MASK(x) (((x) >> 8) & 0x1) | ||
339 | #define C_006540_D2MODE_VBLANK_INT_MASK 0xFFFFFEFF | ||
340 | #define S_006540_D2MODE_VLINE_INT_MASK(x) (((x) & 0x1) << 12) | ||
341 | #define G_006540_D2MODE_VLINE_INT_MASK(x) (((x) >> 12) & 0x1) | ||
342 | #define C_006540_D2MODE_VLINE_INT_MASK 0xFFFFEFFF | ||
343 | #define S_006540_D1MODE_VBLANK_CP_SEL(x) (((x) & 0x1) << 30) | ||
344 | #define G_006540_D1MODE_VBLANK_CP_SEL(x) (((x) >> 30) & 0x1) | ||
345 | #define C_006540_D1MODE_VBLANK_CP_SEL 0xBFFFFFFF | ||
346 | #define S_006540_D2MODE_VBLANK_CP_SEL(x) (((x) & 0x1) << 31) | ||
347 | #define G_006540_D2MODE_VBLANK_CP_SEL(x) (((x) >> 31) & 0x1) | ||
348 | #define C_006540_D2MODE_VBLANK_CP_SEL 0x7FFFFFFF | ||
349 | #define R_0068A4_D2CRTC_STATUS_FRAME_COUNT 0x0068A4 | ||
350 | #define S_0068A4_D2CRTC_FRAME_COUNT(x) (((x) & 0xFFFFFF) << 0) | ||
351 | #define G_0068A4_D2CRTC_FRAME_COUNT(x) (((x) >> 0) & 0xFFFFFF) | ||
352 | #define C_0068A4_D2CRTC_FRAME_COUNT 0xFF000000 | ||
353 | #define R_006D34_D2MODE_VBLANK_STATUS 0x006D34 | ||
354 | #define S_006D34_D2MODE_VBLANK_OCCURRED(x) (((x) & 0x1) << 0) | ||
355 | #define G_006D34_D2MODE_VBLANK_OCCURRED(x) (((x) >> 0) & 0x1) | ||
356 | #define C_006D34_D2MODE_VBLANK_OCCURRED 0xFFFFFFFE | ||
357 | #define S_006D34_D2MODE_VBLANK_ACK(x) (((x) & 0x1) << 4) | ||
358 | #define G_006D34_D2MODE_VBLANK_ACK(x) (((x) >> 4) & 0x1) | ||
359 | #define C_006D34_D2MODE_VBLANK_ACK 0xFFFFFFEF | ||
360 | #define S_006D34_D2MODE_VBLANK_STAT(x) (((x) & 0x1) << 12) | ||
361 | #define G_006D34_D2MODE_VBLANK_STAT(x) (((x) >> 12) & 0x1) | ||
362 | #define C_006D34_D2MODE_VBLANK_STAT 0xFFFFEFFF | ||
363 | #define S_006D34_D2MODE_VBLANK_INTERRUPT(x) (((x) & 0x1) << 16) | ||
364 | #define G_006D34_D2MODE_VBLANK_INTERRUPT(x) (((x) >> 16) & 0x1) | ||
365 | #define C_006D34_D2MODE_VBLANK_INTERRUPT 0xFFFEFFFF | ||
366 | #define R_007EDC_DISP_INTERRUPT_STATUS 0x007EDC | ||
367 | #define S_007EDC_LB_D1_VBLANK_INTERRUPT(x) (((x) & 0x1) << 4) | ||
368 | #define G_007EDC_LB_D1_VBLANK_INTERRUPT(x) (((x) >> 4) & 0x1) | ||
369 | #define C_007EDC_LB_D1_VBLANK_INTERRUPT 0xFFFFFFEF | ||
370 | #define S_007EDC_LB_D2_VBLANK_INTERRUPT(x) (((x) & 0x1) << 5) | ||
371 | #define G_007EDC_LB_D2_VBLANK_INTERRUPT(x) (((x) >> 5) & 0x1) | ||
372 | #define C_007EDC_LB_D2_VBLANK_INTERRUPT 0xFFFFFFDF | ||
373 | |||
374 | |||
375 | /* MC registers */ | ||
376 | #define R_000000_MC_STATUS 0x000000 | ||
377 | #define S_000000_MC_IDLE(x) (((x) & 0x1) << 0) | ||
378 | #define G_000000_MC_IDLE(x) (((x) >> 0) & 0x1) | ||
379 | #define C_000000_MC_IDLE 0xFFFFFFFE | ||
380 | #define R_000004_MC_FB_LOCATION 0x000004 | ||
381 | #define S_000004_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
382 | #define G_000004_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
383 | #define C_000004_MC_FB_START 0xFFFF0000 | ||
384 | #define S_000004_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
385 | #define G_000004_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
386 | #define C_000004_MC_FB_TOP 0x0000FFFF | ||
387 | #define R_000005_MC_AGP_LOCATION 0x000005 | ||
388 | #define S_000005_MC_AGP_START(x) (((x) & 0xFFFF) << 0) | ||
389 | #define G_000005_MC_AGP_START(x) (((x) >> 0) & 0xFFFF) | ||
390 | #define C_000005_MC_AGP_START 0xFFFF0000 | ||
391 | #define S_000005_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16) | ||
392 | #define G_000005_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF) | ||
393 | #define C_000005_MC_AGP_TOP 0x0000FFFF | ||
394 | #define R_000006_AGP_BASE 0x000006 | ||
395 | #define S_000006_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | ||
396 | #define G_000006_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | ||
397 | #define C_000006_AGP_BASE_ADDR 0x00000000 | ||
398 | #define R_000007_AGP_BASE_2 0x000007 | ||
399 | #define S_000007_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0) | ||
400 | #define G_000007_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF) | ||
401 | #define C_000007_AGP_BASE_ADDR_2 0xFFFFFFF0 | ||
402 | #define R_000009_MC_CNTL1 0x000009 | ||
403 | #define S_000009_ENABLE_PAGE_TABLES(x) (((x) & 0x1) << 26) | ||
404 | #define G_000009_ENABLE_PAGE_TABLES(x) (((x) >> 26) & 0x1) | ||
405 | #define C_000009_ENABLE_PAGE_TABLES 0xFBFFFFFF | ||
406 | /* FIXME don't know the various field size need feedback from AMD */ | ||
407 | #define R_000100_MC_PT0_CNTL 0x000100 | ||
408 | #define S_000100_ENABLE_PT(x) (((x) & 0x1) << 0) | ||
409 | #define G_000100_ENABLE_PT(x) (((x) >> 0) & 0x1) | ||
410 | #define C_000100_ENABLE_PT 0xFFFFFFFE | ||
411 | #define S_000100_EFFECTIVE_L2_CACHE_SIZE(x) (((x) & 0x7) << 15) | ||
412 | #define G_000100_EFFECTIVE_L2_CACHE_SIZE(x) (((x) >> 15) & 0x7) | ||
413 | #define C_000100_EFFECTIVE_L2_CACHE_SIZE 0xFFFC7FFF | ||
414 | #define S_000100_EFFECTIVE_L2_QUEUE_SIZE(x) (((x) & 0x7) << 21) | ||
415 | #define G_000100_EFFECTIVE_L2_QUEUE_SIZE(x) (((x) >> 21) & 0x7) | ||
416 | #define C_000100_EFFECTIVE_L2_QUEUE_SIZE 0xFF1FFFFF | ||
417 | #define S_000100_INVALIDATE_ALL_L1_TLBS(x) (((x) & 0x1) << 28) | ||
418 | #define G_000100_INVALIDATE_ALL_L1_TLBS(x) (((x) >> 28) & 0x1) | ||
419 | #define C_000100_INVALIDATE_ALL_L1_TLBS 0xEFFFFFFF | ||
420 | #define S_000100_INVALIDATE_L2_CACHE(x) (((x) & 0x1) << 29) | ||
421 | #define G_000100_INVALIDATE_L2_CACHE(x) (((x) >> 29) & 0x1) | ||
422 | #define C_000100_INVALIDATE_L2_CACHE 0xDFFFFFFF | ||
423 | #define R_000102_MC_PT0_CONTEXT0_CNTL 0x000102 | ||
424 | #define S_000102_ENABLE_PAGE_TABLE(x) (((x) & 0x1) << 0) | ||
425 | #define G_000102_ENABLE_PAGE_TABLE(x) (((x) >> 0) & 0x1) | ||
426 | #define C_000102_ENABLE_PAGE_TABLE 0xFFFFFFFE | ||
427 | #define S_000102_PAGE_TABLE_DEPTH(x) (((x) & 0x3) << 1) | ||
428 | #define G_000102_PAGE_TABLE_DEPTH(x) (((x) >> 1) & 0x3) | ||
429 | #define C_000102_PAGE_TABLE_DEPTH 0xFFFFFFF9 | ||
430 | #define V_000102_PAGE_TABLE_FLAT 0 | ||
431 | /* R600 documentation suggest that this should be a number of pages */ | ||
432 | #define R_000112_MC_PT0_SYSTEM_APERTURE_LOW_ADDR 0x000112 | ||
433 | #define R_000114_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR 0x000114 | ||
434 | #define R_00011C_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR 0x00011C | ||
435 | #define R_00012C_MC_PT0_CONTEXT0_FLAT_BASE_ADDR 0x00012C | ||
436 | #define R_00013C_MC_PT0_CONTEXT0_FLAT_START_ADDR 0x00013C | ||
437 | #define R_00014C_MC_PT0_CONTEXT0_FLAT_END_ADDR 0x00014C | ||
438 | #define R_00016C_MC_PT0_CLIENT0_CNTL 0x00016C | ||
439 | #define S_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(x) (((x) & 0x1) << 0) | ||
440 | #define G_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE(x) (((x) >> 0) & 0x1) | ||
441 | #define C_00016C_ENABLE_TRANSLATION_MODE_OVERRIDE 0xFFFFFFFE | ||
442 | #define S_00016C_TRANSLATION_MODE_OVERRIDE(x) (((x) & 0x1) << 1) | ||
443 | #define G_00016C_TRANSLATION_MODE_OVERRIDE(x) (((x) >> 1) & 0x1) | ||
444 | #define C_00016C_TRANSLATION_MODE_OVERRIDE 0xFFFFFFFD | ||
445 | #define S_00016C_SYSTEM_ACCESS_MODE_MASK(x) (((x) & 0x3) << 8) | ||
446 | #define G_00016C_SYSTEM_ACCESS_MODE_MASK(x) (((x) >> 8) & 0x3) | ||
447 | #define C_00016C_SYSTEM_ACCESS_MODE_MASK 0xFFFFFCFF | ||
448 | #define V_00016C_SYSTEM_ACCESS_MODE_PA_ONLY 0 | ||
449 | #define V_00016C_SYSTEM_ACCESS_MODE_USE_SYS_MAP 1 | ||
450 | #define V_00016C_SYSTEM_ACCESS_MODE_IN_SYS 2 | ||
451 | #define V_00016C_SYSTEM_ACCESS_MODE_NOT_IN_SYS 3 | ||
452 | #define S_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(x) (((x) & 0x1) << 10) | ||
453 | #define G_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS(x) (((x) >> 10) & 0x1) | ||
454 | #define C_00016C_SYSTEM_APERTURE_UNMAPPED_ACCESS 0xFFFFFBFF | ||
455 | #define V_00016C_SYSTEM_APERTURE_UNMAPPED_PASSTHROUGH 0 | ||
456 | #define V_00016C_SYSTEM_APERTURE_UNMAPPED_DEFAULT_PAGE 1 | ||
457 | #define S_00016C_EFFECTIVE_L1_CACHE_SIZE(x) (((x) & 0x7) << 11) | ||
458 | #define G_00016C_EFFECTIVE_L1_CACHE_SIZE(x) (((x) >> 11) & 0x7) | ||
459 | #define C_00016C_EFFECTIVE_L1_CACHE_SIZE 0xFFFFC7FF | ||
460 | #define S_00016C_ENABLE_FRAGMENT_PROCESSING(x) (((x) & 0x1) << 14) | ||
461 | #define G_00016C_ENABLE_FRAGMENT_PROCESSING(x) (((x) >> 14) & 0x1) | ||
462 | #define C_00016C_ENABLE_FRAGMENT_PROCESSING 0xFFFFBFFF | ||
463 | #define S_00016C_EFFECTIVE_L1_QUEUE_SIZE(x) (((x) & 0x7) << 15) | ||
464 | #define G_00016C_EFFECTIVE_L1_QUEUE_SIZE(x) (((x) >> 15) & 0x7) | ||
465 | #define C_00016C_EFFECTIVE_L1_QUEUE_SIZE 0xFFFC7FFF | ||
466 | #define S_00016C_INVALIDATE_L1_TLB(x) (((x) & 0x1) << 20) | ||
467 | #define G_00016C_INVALIDATE_L1_TLB(x) (((x) >> 20) & 0x1) | ||
468 | #define C_00016C_INVALIDATE_L1_TLB 0xFFEFFFFF | ||
469 | |||
470 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 0f585ca8276..025e3225346 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
@@ -26,106 +26,29 @@ | |||
26 | * Jerome Glisse | 26 | * Jerome Glisse |
27 | */ | 27 | */ |
28 | #include "drmP.h" | 28 | #include "drmP.h" |
29 | #include "radeon_reg.h" | ||
30 | #include "radeon.h" | 29 | #include "radeon.h" |
31 | #include "rs690r.h" | ||
32 | #include "atom.h" | 30 | #include "atom.h" |
33 | #include "atom-bits.h" | 31 | #include "rs690d.h" |
34 | |||
35 | /* rs690,rs740 depends on : */ | ||
36 | void r100_hdp_reset(struct radeon_device *rdev); | ||
37 | int r300_mc_wait_for_idle(struct radeon_device *rdev); | ||
38 | void r420_pipes_init(struct radeon_device *rdev); | ||
39 | void rs400_gart_disable(struct radeon_device *rdev); | ||
40 | int rs400_gart_enable(struct radeon_device *rdev); | ||
41 | void rs400_gart_adjust_size(struct radeon_device *rdev); | ||
42 | void rs600_mc_disable_clients(struct radeon_device *rdev); | ||
43 | void rs600_disable_vga(struct radeon_device *rdev); | ||
44 | |||
45 | /* This files gather functions specifics to : | ||
46 | * rs690,rs740 | ||
47 | * | ||
48 | * Some of these functions might be used by newer ASICs. | ||
49 | */ | ||
50 | void rs690_gpu_init(struct radeon_device *rdev); | ||
51 | int rs690_mc_wait_for_idle(struct radeon_device *rdev); | ||
52 | |||
53 | 32 | ||
54 | /* | 33 | static int rs690_mc_wait_for_idle(struct radeon_device *rdev) |
55 | * MC functions. | ||
56 | */ | ||
57 | int rs690_mc_init(struct radeon_device *rdev) | ||
58 | { | ||
59 | uint32_t tmp; | ||
60 | int r; | ||
61 | |||
62 | if (r100_debugfs_rbbm_init(rdev)) { | ||
63 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | ||
64 | } | ||
65 | |||
66 | rs690_gpu_init(rdev); | ||
67 | rs400_gart_disable(rdev); | ||
68 | |||
69 | /* Setup GPU memory space */ | ||
70 | rdev->mc.gtt_location = rdev->mc.mc_vram_size; | ||
71 | rdev->mc.gtt_location += (rdev->mc.gtt_size - 1); | ||
72 | rdev->mc.gtt_location &= ~(rdev->mc.gtt_size - 1); | ||
73 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
74 | r = radeon_mc_setup(rdev); | ||
75 | if (r) { | ||
76 | return r; | ||
77 | } | ||
78 | |||
79 | /* Program GPU memory space */ | ||
80 | rs600_mc_disable_clients(rdev); | ||
81 | if (rs690_mc_wait_for_idle(rdev)) { | ||
82 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
83 | "programming pipes. Bad things might happen.\n"); | ||
84 | } | ||
85 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
86 | tmp = REG_SET(RS690_MC_FB_TOP, tmp >> 16); | ||
87 | tmp |= REG_SET(RS690_MC_FB_START, rdev->mc.vram_location >> 16); | ||
88 | WREG32_MC(RS690_MCCFG_FB_LOCATION, tmp); | ||
89 | /* FIXME: Does this reg exist on RS480,RS740 ? */ | ||
90 | WREG32(0x310, rdev->mc.vram_location); | ||
91 | WREG32(RS690_HDP_FB_LOCATION, rdev->mc.vram_location >> 16); | ||
92 | return 0; | ||
93 | } | ||
94 | |||
95 | void rs690_mc_fini(struct radeon_device *rdev) | ||
96 | { | ||
97 | } | ||
98 | |||
99 | |||
100 | /* | ||
101 | * Global GPU functions | ||
102 | */ | ||
103 | int rs690_mc_wait_for_idle(struct radeon_device *rdev) | ||
104 | { | 34 | { |
105 | unsigned i; | 35 | unsigned i; |
106 | uint32_t tmp; | 36 | uint32_t tmp; |
107 | 37 | ||
108 | for (i = 0; i < rdev->usec_timeout; i++) { | 38 | for (i = 0; i < rdev->usec_timeout; i++) { |
109 | /* read MC_STATUS */ | 39 | /* read MC_STATUS */ |
110 | tmp = RREG32_MC(RS690_MC_STATUS); | 40 | tmp = RREG32_MC(R_000090_MC_SYSTEM_STATUS); |
111 | if (tmp & RS690_MC_STATUS_IDLE) { | 41 | if (G_000090_MC_SYSTEM_IDLE(tmp)) |
112 | return 0; | 42 | return 0; |
113 | } | 43 | udelay(1); |
114 | DRM_UDELAY(1); | ||
115 | } | 44 | } |
116 | return -1; | 45 | return -1; |
117 | } | 46 | } |
118 | 47 | ||
119 | void rs690_errata(struct radeon_device *rdev) | 48 | static void rs690_gpu_init(struct radeon_device *rdev) |
120 | { | ||
121 | rdev->pll_errata = 0; | ||
122 | } | ||
123 | |||
124 | void rs690_gpu_init(struct radeon_device *rdev) | ||
125 | { | 49 | { |
126 | /* FIXME: HDP same place on rs690 ? */ | 50 | /* FIXME: HDP same place on rs690 ? */ |
127 | r100_hdp_reset(rdev); | 51 | r100_hdp_reset(rdev); |
128 | rs600_disable_vga(rdev); | ||
129 | /* FIXME: is this correct ? */ | 52 | /* FIXME: is this correct ? */ |
130 | r420_pipes_init(rdev); | 53 | r420_pipes_init(rdev); |
131 | if (rs690_mc_wait_for_idle(rdev)) { | 54 | if (rs690_mc_wait_for_idle(rdev)) { |
@@ -134,10 +57,6 @@ void rs690_gpu_init(struct radeon_device *rdev) | |||
134 | } | 57 | } |
135 | } | 58 | } |
136 | 59 | ||
137 | |||
138 | /* | ||
139 | * VRAM info. | ||
140 | */ | ||
141 | void rs690_pm_info(struct radeon_device *rdev) | 60 | void rs690_pm_info(struct radeon_device *rdev) |
142 | { | 61 | { |
143 | int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); | 62 | int index = GetIndexIntoMasterTable(DATA, IntegratedSystemInfo); |
@@ -251,39 +170,39 @@ void rs690_line_buffer_adjust(struct radeon_device *rdev, | |||
251 | /* | 170 | /* |
252 | * Line Buffer Setup | 171 | * Line Buffer Setup |
253 | * There is a single line buffer shared by both display controllers. | 172 | * There is a single line buffer shared by both display controllers. |
254 | * DC_LB_MEMORY_SPLIT controls how that line buffer is shared between | 173 | * R_006520_DC_LB_MEMORY_SPLIT controls how that line buffer is shared between |
255 | * the display controllers. The paritioning can either be done | 174 | * the display controllers. The paritioning can either be done |
256 | * manually or via one of four preset allocations specified in bits 1:0: | 175 | * manually or via one of four preset allocations specified in bits 1:0: |
257 | * 0 - line buffer is divided in half and shared between crtc | 176 | * 0 - line buffer is divided in half and shared between crtc |
258 | * 1 - D1 gets 3/4 of the line buffer, D2 gets 1/4 | 177 | * 1 - D1 gets 3/4 of the line buffer, D2 gets 1/4 |
259 | * 2 - D1 gets the whole buffer | 178 | * 2 - D1 gets the whole buffer |
260 | * 3 - D1 gets 1/4 of the line buffer, D2 gets 3/4 | 179 | * 3 - D1 gets 1/4 of the line buffer, D2 gets 3/4 |
261 | * Setting bit 2 of DC_LB_MEMORY_SPLIT controls switches to manual | 180 | * Setting bit 2 of R_006520_DC_LB_MEMORY_SPLIT controls switches to manual |
262 | * allocation mode. In manual allocation mode, D1 always starts at 0, | 181 | * allocation mode. In manual allocation mode, D1 always starts at 0, |
263 | * D1 end/2 is specified in bits 14:4; D2 allocation follows D1. | 182 | * D1 end/2 is specified in bits 14:4; D2 allocation follows D1. |
264 | */ | 183 | */ |
265 | tmp = RREG32(DC_LB_MEMORY_SPLIT) & ~DC_LB_MEMORY_SPLIT_MASK; | 184 | tmp = RREG32(R_006520_DC_LB_MEMORY_SPLIT) & C_006520_DC_LB_MEMORY_SPLIT; |
266 | tmp &= ~DC_LB_MEMORY_SPLIT_SHIFT_MODE; | 185 | tmp &= ~C_006520_DC_LB_MEMORY_SPLIT_MODE; |
267 | /* auto */ | 186 | /* auto */ |
268 | if (mode1 && mode2) { | 187 | if (mode1 && mode2) { |
269 | if (mode1->hdisplay > mode2->hdisplay) { | 188 | if (mode1->hdisplay > mode2->hdisplay) { |
270 | if (mode1->hdisplay > 2560) | 189 | if (mode1->hdisplay > 2560) |
271 | tmp |= DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q; | 190 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q; |
272 | else | 191 | else |
273 | tmp |= DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; | 192 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; |
274 | } else if (mode2->hdisplay > mode1->hdisplay) { | 193 | } else if (mode2->hdisplay > mode1->hdisplay) { |
275 | if (mode2->hdisplay > 2560) | 194 | if (mode2->hdisplay > 2560) |
276 | tmp |= DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; | 195 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; |
277 | else | 196 | else |
278 | tmp |= DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; | 197 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; |
279 | } else | 198 | } else |
280 | tmp |= AVIVO_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; | 199 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF; |
281 | } else if (mode1) { | 200 | } else if (mode1) { |
282 | tmp |= DC_LB_MEMORY_SPLIT_D1_ONLY; | 201 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_ONLY; |
283 | } else if (mode2) { | 202 | } else if (mode2) { |
284 | tmp |= DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; | 203 | tmp |= V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; |
285 | } | 204 | } |
286 | WREG32(DC_LB_MEMORY_SPLIT, tmp); | 205 | WREG32(R_006520_DC_LB_MEMORY_SPLIT, tmp); |
287 | } | 206 | } |
288 | 207 | ||
289 | struct rs690_watermark { | 208 | struct rs690_watermark { |
@@ -488,28 +407,28 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
488 | * option. | 407 | * option. |
489 | */ | 408 | */ |
490 | if (rdev->disp_priority == 2) { | 409 | if (rdev->disp_priority == 2) { |
491 | tmp = RREG32_MC(MC_INIT_MISC_LAT_TIMER); | 410 | tmp = RREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER); |
492 | tmp &= ~MC_DISP1R_INIT_LAT_MASK; | 411 | tmp &= C_000104_MC_DISP0R_INIT_LAT; |
493 | tmp &= ~MC_DISP0R_INIT_LAT_MASK; | 412 | tmp &= C_000104_MC_DISP1R_INIT_LAT; |
494 | if (mode1) | ||
495 | tmp |= (1 << MC_DISP1R_INIT_LAT_SHIFT); | ||
496 | if (mode0) | 413 | if (mode0) |
497 | tmp |= (1 << MC_DISP0R_INIT_LAT_SHIFT); | 414 | tmp |= S_000104_MC_DISP0R_INIT_LAT(1); |
498 | WREG32_MC(MC_INIT_MISC_LAT_TIMER, tmp); | 415 | if (mode1) |
416 | tmp |= S_000104_MC_DISP1R_INIT_LAT(1); | ||
417 | WREG32_MC(R_000104_MC_INIT_MISC_LAT_TIMER, tmp); | ||
499 | } | 418 | } |
500 | rs690_line_buffer_adjust(rdev, mode0, mode1); | 419 | rs690_line_buffer_adjust(rdev, mode0, mode1); |
501 | 420 | ||
502 | if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) | 421 | if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) |
503 | WREG32(DCP_CONTROL, 0); | 422 | WREG32(R_006C9C_DCP_CONTROL, 0); |
504 | if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880)) | 423 | if ((rdev->family == CHIP_RS780) || (rdev->family == CHIP_RS880)) |
505 | WREG32(DCP_CONTROL, 2); | 424 | WREG32(R_006C9C_DCP_CONTROL, 2); |
506 | 425 | ||
507 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[0], &wm0); | 426 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[0], &wm0); |
508 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[1], &wm1); | 427 | rs690_crtc_bandwidth_compute(rdev, rdev->mode_info.crtcs[1], &wm1); |
509 | 428 | ||
510 | tmp = (wm0.lb_request_fifo_depth - 1); | 429 | tmp = (wm0.lb_request_fifo_depth - 1); |
511 | tmp |= (wm1.lb_request_fifo_depth - 1) << 16; | 430 | tmp |= (wm1.lb_request_fifo_depth - 1) << 16; |
512 | WREG32(LB_MAX_REQ_OUTSTANDING, tmp); | 431 | WREG32(R_006D58_LB_MAX_REQ_OUTSTANDING, tmp); |
513 | 432 | ||
514 | if (mode0 && mode1) { | 433 | if (mode0 && mode1) { |
515 | if (rfixed_trunc(wm0.dbpp) > 64) | 434 | if (rfixed_trunc(wm0.dbpp) > 64) |
@@ -562,10 +481,10 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
562 | priority_mark12.full = 0; | 481 | priority_mark12.full = 0; |
563 | if (wm1.priority_mark_max.full > priority_mark12.full) | 482 | if (wm1.priority_mark_max.full > priority_mark12.full) |
564 | priority_mark12.full = wm1.priority_mark_max.full; | 483 | priority_mark12.full = wm1.priority_mark_max.full; |
565 | WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); | 484 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); |
566 | WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); | 485 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); |
567 | WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); | 486 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); |
568 | WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); | 487 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); |
569 | } else if (mode0) { | 488 | } else if (mode0) { |
570 | if (rfixed_trunc(wm0.dbpp) > 64) | 489 | if (rfixed_trunc(wm0.dbpp) > 64) |
571 | a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair); | 490 | a.full = rfixed_mul(wm0.dbpp, wm0.num_line_pair); |
@@ -592,10 +511,12 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
592 | priority_mark02.full = 0; | 511 | priority_mark02.full = 0; |
593 | if (wm0.priority_mark_max.full > priority_mark02.full) | 512 | if (wm0.priority_mark_max.full > priority_mark02.full) |
594 | priority_mark02.full = wm0.priority_mark_max.full; | 513 | priority_mark02.full = wm0.priority_mark_max.full; |
595 | WREG32(D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); | 514 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark02)); |
596 | WREG32(D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); | 515 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark02)); |
597 | WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); | 516 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, |
598 | WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); | 517 | S_006D48_D2MODE_PRIORITY_A_OFF(1)); |
518 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, | ||
519 | S_006D4C_D2MODE_PRIORITY_B_OFF(1)); | ||
599 | } else { | 520 | } else { |
600 | if (rfixed_trunc(wm1.dbpp) > 64) | 521 | if (rfixed_trunc(wm1.dbpp) > 64) |
601 | a.full = rfixed_mul(wm1.dbpp, wm1.num_line_pair); | 522 | a.full = rfixed_mul(wm1.dbpp, wm1.num_line_pair); |
@@ -622,30 +543,203 @@ void rs690_bandwidth_update(struct radeon_device *rdev) | |||
622 | priority_mark12.full = 0; | 543 | priority_mark12.full = 0; |
623 | if (wm1.priority_mark_max.full > priority_mark12.full) | 544 | if (wm1.priority_mark_max.full > priority_mark12.full) |
624 | priority_mark12.full = wm1.priority_mark_max.full; | 545 | priority_mark12.full = wm1.priority_mark_max.full; |
625 | WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); | 546 | WREG32(R_006548_D1MODE_PRIORITY_A_CNT, |
626 | WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); | 547 | S_006548_D1MODE_PRIORITY_A_OFF(1)); |
627 | WREG32(D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); | 548 | WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, |
628 | WREG32(D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); | 549 | S_00654C_D1MODE_PRIORITY_B_OFF(1)); |
550 | WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, rfixed_trunc(priority_mark12)); | ||
551 | WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, rfixed_trunc(priority_mark12)); | ||
629 | } | 552 | } |
630 | } | 553 | } |
631 | 554 | ||
632 | /* | ||
633 | * Indirect registers accessor | ||
634 | */ | ||
635 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 555 | uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
636 | { | 556 | { |
637 | uint32_t r; | 557 | uint32_t r; |
638 | 558 | ||
639 | WREG32(RS690_MC_INDEX, (reg & RS690_MC_INDEX_MASK)); | 559 | WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg)); |
640 | r = RREG32(RS690_MC_DATA); | 560 | r = RREG32(R_00007C_MC_DATA); |
641 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_MASK); | 561 | WREG32(R_000078_MC_INDEX, ~C_000078_MC_IND_ADDR); |
642 | return r; | 562 | return r; |
643 | } | 563 | } |
644 | 564 | ||
645 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | 565 | void rs690_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) |
646 | { | 566 | { |
647 | WREG32(RS690_MC_INDEX, | 567 | WREG32(R_000078_MC_INDEX, S_000078_MC_IND_ADDR(reg) | |
648 | RS690_MC_INDEX_WR_EN | ((reg) & RS690_MC_INDEX_MASK)); | 568 | S_000078_MC_IND_WR_EN(1)); |
649 | WREG32(RS690_MC_DATA, v); | 569 | WREG32(R_00007C_MC_DATA, v); |
650 | WREG32(RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); | 570 | WREG32(R_000078_MC_INDEX, 0x7F); |
571 | } | ||
572 | |||
573 | void rs690_mc_program(struct radeon_device *rdev) | ||
574 | { | ||
575 | struct rv515_mc_save save; | ||
576 | |||
577 | /* Stops all mc clients */ | ||
578 | rv515_mc_stop(rdev, &save); | ||
579 | |||
580 | /* Wait for mc idle */ | ||
581 | if (rs690_mc_wait_for_idle(rdev)) | ||
582 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
583 | /* Program MC, should be a 32bits limited address space */ | ||
584 | WREG32_MC(R_000100_MCCFG_FB_LOCATION, | ||
585 | S_000100_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
586 | S_000100_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
587 | WREG32(R_000134_HDP_FB_LOCATION, | ||
588 | S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); | ||
589 | |||
590 | rv515_mc_resume(rdev, &save); | ||
591 | } | ||
592 | |||
593 | static int rs690_startup(struct radeon_device *rdev) | ||
594 | { | ||
595 | int r; | ||
596 | |||
597 | rs690_mc_program(rdev); | ||
598 | /* Resume clock */ | ||
599 | rv515_clock_startup(rdev); | ||
600 | /* Initialize GPU configuration (# pipes, ...) */ | ||
601 | rs690_gpu_init(rdev); | ||
602 | /* Initialize GART (initialize after TTM so we can allocate | ||
603 | * memory through TTM but finalize after TTM) */ | ||
604 | r = rs400_gart_enable(rdev); | ||
605 | if (r) | ||
606 | return r; | ||
607 | /* Enable IRQ */ | ||
608 | rdev->irq.sw_int = true; | ||
609 | rs600_irq_set(rdev); | ||
610 | /* 1M ring buffer */ | ||
611 | r = r100_cp_init(rdev, 1024 * 1024); | ||
612 | if (r) { | ||
613 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
614 | return r; | ||
615 | } | ||
616 | r = r100_wb_init(rdev); | ||
617 | if (r) | ||
618 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
619 | r = r100_ib_init(rdev); | ||
620 | if (r) { | ||
621 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
622 | return r; | ||
623 | } | ||
624 | return 0; | ||
625 | } | ||
626 | |||
627 | int rs690_resume(struct radeon_device *rdev) | ||
628 | { | ||
629 | /* Make sur GART are not working */ | ||
630 | rs400_gart_disable(rdev); | ||
631 | /* Resume clock before doing reset */ | ||
632 | rv515_clock_startup(rdev); | ||
633 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
634 | if (radeon_gpu_reset(rdev)) { | ||
635 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
636 | RREG32(R_000E40_RBBM_STATUS), | ||
637 | RREG32(R_0007C0_CP_STAT)); | ||
638 | } | ||
639 | /* post */ | ||
640 | atom_asic_init(rdev->mode_info.atom_context); | ||
641 | /* Resume clock after posting */ | ||
642 | rv515_clock_startup(rdev); | ||
643 | return rs690_startup(rdev); | ||
644 | } | ||
645 | |||
646 | int rs690_suspend(struct radeon_device *rdev) | ||
647 | { | ||
648 | r100_cp_disable(rdev); | ||
649 | r100_wb_disable(rdev); | ||
650 | rs600_irq_disable(rdev); | ||
651 | rs400_gart_disable(rdev); | ||
652 | return 0; | ||
653 | } | ||
654 | |||
655 | void rs690_fini(struct radeon_device *rdev) | ||
656 | { | ||
657 | rs690_suspend(rdev); | ||
658 | r100_cp_fini(rdev); | ||
659 | r100_wb_fini(rdev); | ||
660 | r100_ib_fini(rdev); | ||
661 | radeon_gem_fini(rdev); | ||
662 | rs400_gart_fini(rdev); | ||
663 | radeon_irq_kms_fini(rdev); | ||
664 | radeon_fence_driver_fini(rdev); | ||
665 | radeon_object_fini(rdev); | ||
666 | radeon_atombios_fini(rdev); | ||
667 | kfree(rdev->bios); | ||
668 | rdev->bios = NULL; | ||
669 | } | ||
670 | |||
671 | int rs690_init(struct radeon_device *rdev) | ||
672 | { | ||
673 | int r; | ||
674 | |||
675 | /* Disable VGA */ | ||
676 | rv515_vga_render_disable(rdev); | ||
677 | /* Initialize scratch registers */ | ||
678 | radeon_scratch_init(rdev); | ||
679 | /* Initialize surface registers */ | ||
680 | radeon_surface_init(rdev); | ||
681 | /* TODO: disable VGA need to use VGA request */ | ||
682 | /* BIOS*/ | ||
683 | if (!radeon_get_bios(rdev)) { | ||
684 | if (ASIC_IS_AVIVO(rdev)) | ||
685 | return -EINVAL; | ||
686 | } | ||
687 | if (rdev->is_atom_bios) { | ||
688 | r = radeon_atombios_init(rdev); | ||
689 | if (r) | ||
690 | return r; | ||
691 | } else { | ||
692 | dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n"); | ||
693 | return -EINVAL; | ||
694 | } | ||
695 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
696 | if (radeon_gpu_reset(rdev)) { | ||
697 | dev_warn(rdev->dev, | ||
698 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
699 | RREG32(R_000E40_RBBM_STATUS), | ||
700 | RREG32(R_0007C0_CP_STAT)); | ||
701 | } | ||
702 | /* check if cards are posted or not */ | ||
703 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
704 | DRM_INFO("GPU not posted. posting now...\n"); | ||
705 | atom_asic_init(rdev->mode_info.atom_context); | ||
706 | } | ||
707 | /* Initialize clocks */ | ||
708 | radeon_get_clock_info(rdev->ddev); | ||
709 | /* Get vram informations */ | ||
710 | rs690_vram_info(rdev); | ||
711 | /* Initialize memory controller (also test AGP) */ | ||
712 | r = r420_mc_init(rdev); | ||
713 | if (r) | ||
714 | return r; | ||
715 | rv515_debugfs(rdev); | ||
716 | /* Fence driver */ | ||
717 | r = radeon_fence_driver_init(rdev); | ||
718 | if (r) | ||
719 | return r; | ||
720 | r = radeon_irq_kms_init(rdev); | ||
721 | if (r) | ||
722 | return r; | ||
723 | /* Memory manager */ | ||
724 | r = radeon_object_init(rdev); | ||
725 | if (r) | ||
726 | return r; | ||
727 | r = rs400_gart_init(rdev); | ||
728 | if (r) | ||
729 | return r; | ||
730 | rs600_set_safe_registers(rdev); | ||
731 | rdev->accel_working = true; | ||
732 | r = rs690_startup(rdev); | ||
733 | if (r) { | ||
734 | /* Somethings want wront with the accel init stop accel */ | ||
735 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
736 | rs690_suspend(rdev); | ||
737 | r100_cp_fini(rdev); | ||
738 | r100_wb_fini(rdev); | ||
739 | r100_ib_fini(rdev); | ||
740 | rs400_gart_fini(rdev); | ||
741 | radeon_irq_kms_fini(rdev); | ||
742 | rdev->accel_working = false; | ||
743 | } | ||
744 | return 0; | ||
651 | } | 745 | } |
diff --git a/drivers/gpu/drm/radeon/rs690d.h b/drivers/gpu/drm/radeon/rs690d.h new file mode 100644 index 00000000000..62d31e7a897 --- /dev/null +++ b/drivers/gpu/drm/radeon/rs690d.h | |||
@@ -0,0 +1,307 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __RS690D_H__ | ||
29 | #define __RS690D_H__ | ||
30 | |||
31 | /* Registers */ | ||
32 | #define R_000078_MC_INDEX 0x000078 | ||
33 | #define S_000078_MC_IND_ADDR(x) (((x) & 0x1FF) << 0) | ||
34 | #define G_000078_MC_IND_ADDR(x) (((x) >> 0) & 0x1FF) | ||
35 | #define C_000078_MC_IND_ADDR 0xFFFFFE00 | ||
36 | #define S_000078_MC_IND_WR_EN(x) (((x) & 0x1) << 9) | ||
37 | #define G_000078_MC_IND_WR_EN(x) (((x) >> 9) & 0x1) | ||
38 | #define C_000078_MC_IND_WR_EN 0xFFFFFDFF | ||
39 | #define R_00007C_MC_DATA 0x00007C | ||
40 | #define S_00007C_MC_DATA(x) (((x) & 0xFFFFFFFF) << 0) | ||
41 | #define G_00007C_MC_DATA(x) (((x) >> 0) & 0xFFFFFFFF) | ||
42 | #define C_00007C_MC_DATA 0x00000000 | ||
43 | #define R_0000F8_CONFIG_MEMSIZE 0x0000F8 | ||
44 | #define S_0000F8_CONFIG_MEMSIZE(x) (((x) & 0xFFFFFFFF) << 0) | ||
45 | #define G_0000F8_CONFIG_MEMSIZE(x) (((x) >> 0) & 0xFFFFFFFF) | ||
46 | #define C_0000F8_CONFIG_MEMSIZE 0x00000000 | ||
47 | #define R_000134_HDP_FB_LOCATION 0x000134 | ||
48 | #define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0) | ||
49 | #define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
50 | #define C_000134_HDP_FB_START 0xFFFF0000 | ||
51 | #define R_0007C0_CP_STAT 0x0007C0 | ||
52 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
53 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
54 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
55 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
56 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
57 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
58 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
59 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
60 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
61 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
62 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
63 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
64 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
65 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
66 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
67 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
68 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
69 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
70 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
71 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
72 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
73 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
74 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
75 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
76 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
77 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
78 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
79 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
80 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
81 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
82 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
83 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
84 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
85 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
86 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
87 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
88 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
89 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
90 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
91 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
92 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
93 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
94 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
95 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
96 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
97 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
98 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
99 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
100 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
101 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
102 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
103 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
104 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
105 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
106 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
107 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
108 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
109 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
110 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
111 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
112 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
113 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
114 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
115 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
116 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
117 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
118 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
119 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
120 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
121 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
122 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
123 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
124 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
125 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
126 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
127 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
128 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
129 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
130 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
131 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
132 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
133 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
134 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
135 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
136 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
137 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
138 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
139 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
140 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
141 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
142 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
143 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
144 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
145 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
146 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
147 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
148 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
149 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
150 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
151 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
152 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
153 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
154 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
155 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
156 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
157 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
158 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
159 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
160 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
161 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
162 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
163 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
164 | #define R_006520_DC_LB_MEMORY_SPLIT 0x006520 | ||
165 | #define S_006520_DC_LB_MEMORY_SPLIT(x) (((x) & 0x3) << 0) | ||
166 | #define G_006520_DC_LB_MEMORY_SPLIT(x) (((x) >> 0) & 0x3) | ||
167 | #define C_006520_DC_LB_MEMORY_SPLIT 0xFFFFFFFC | ||
168 | #define S_006520_DC_LB_MEMORY_SPLIT_MODE(x) (((x) & 0x1) << 2) | ||
169 | #define G_006520_DC_LB_MEMORY_SPLIT_MODE(x) (((x) >> 2) & 0x1) | ||
170 | #define C_006520_DC_LB_MEMORY_SPLIT_MODE 0xFFFFFFFB | ||
171 | #define V_006520_DC_LB_MEMORY_SPLIT_D1HALF_D2HALF 0 | ||
172 | #define V_006520_DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q 1 | ||
173 | #define V_006520_DC_LB_MEMORY_SPLIT_D1_ONLY 2 | ||
174 | #define V_006520_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q 3 | ||
175 | #define S_006520_DC_LB_DISP1_END_ADR(x) (((x) & 0x7FF) << 4) | ||
176 | #define G_006520_DC_LB_DISP1_END_ADR(x) (((x) >> 4) & 0x7FF) | ||
177 | #define C_006520_DC_LB_DISP1_END_ADR 0xFFFF800F | ||
178 | #define R_006548_D1MODE_PRIORITY_A_CNT 0x006548 | ||
179 | #define S_006548_D1MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0) | ||
180 | #define G_006548_D1MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF) | ||
181 | #define C_006548_D1MODE_PRIORITY_MARK_A 0xFFFF8000 | ||
182 | #define S_006548_D1MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16) | ||
183 | #define G_006548_D1MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1) | ||
184 | #define C_006548_D1MODE_PRIORITY_A_OFF 0xFFFEFFFF | ||
185 | #define S_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
186 | #define G_006548_D1MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
187 | #define C_006548_D1MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF | ||
188 | #define R_00654C_D1MODE_PRIORITY_B_CNT 0x00654C | ||
189 | #define S_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0) | ||
190 | #define G_00654C_D1MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF) | ||
191 | #define C_00654C_D1MODE_PRIORITY_MARK_B 0xFFFF8000 | ||
192 | #define S_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16) | ||
193 | #define G_00654C_D1MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1) | ||
194 | #define C_00654C_D1MODE_PRIORITY_B_OFF 0xFFFEFFFF | ||
195 | #define S_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20) | ||
196 | #define G_00654C_D1MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1) | ||
197 | #define C_00654C_D1MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF | ||
198 | #define S_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
199 | #define G_00654C_D1MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
200 | #define C_00654C_D1MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF | ||
201 | #define R_006C9C_DCP_CONTROL 0x006C9C | ||
202 | #define R_006D48_D2MODE_PRIORITY_A_CNT 0x006D48 | ||
203 | #define S_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) & 0x7FFF) << 0) | ||
204 | #define G_006D48_D2MODE_PRIORITY_MARK_A(x) (((x) >> 0) & 0x7FFF) | ||
205 | #define C_006D48_D2MODE_PRIORITY_MARK_A 0xFFFF8000 | ||
206 | #define S_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) & 0x1) << 16) | ||
207 | #define G_006D48_D2MODE_PRIORITY_A_OFF(x) (((x) >> 16) & 0x1) | ||
208 | #define C_006D48_D2MODE_PRIORITY_A_OFF 0xFFFEFFFF | ||
209 | #define S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) & 0x1) << 20) | ||
210 | #define G_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(x) (((x) >> 20) & 0x1) | ||
211 | #define C_006D48_D2MODE_PRIORITY_A_ALWAYS_ON 0xFFEFFFFF | ||
212 | #define S_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
213 | #define G_006D48_D2MODE_PRIORITY_A_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
214 | #define C_006D48_D2MODE_PRIORITY_A_FORCE_MASK 0xFEFFFFFF | ||
215 | #define R_006D4C_D2MODE_PRIORITY_B_CNT 0x006D4C | ||
216 | #define S_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) & 0x7FFF) << 0) | ||
217 | #define G_006D4C_D2MODE_PRIORITY_MARK_B(x) (((x) >> 0) & 0x7FFF) | ||
218 | #define C_006D4C_D2MODE_PRIORITY_MARK_B 0xFFFF8000 | ||
219 | #define S_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) & 0x1) << 16) | ||
220 | #define G_006D4C_D2MODE_PRIORITY_B_OFF(x) (((x) >> 16) & 0x1) | ||
221 | #define C_006D4C_D2MODE_PRIORITY_B_OFF 0xFFFEFFFF | ||
222 | #define S_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) & 0x1) << 20) | ||
223 | #define G_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON(x) (((x) >> 20) & 0x1) | ||
224 | #define C_006D4C_D2MODE_PRIORITY_B_ALWAYS_ON 0xFFEFFFFF | ||
225 | #define S_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) & 0x1) << 24) | ||
226 | #define G_006D4C_D2MODE_PRIORITY_B_FORCE_MASK(x) (((x) >> 24) & 0x1) | ||
227 | #define C_006D4C_D2MODE_PRIORITY_B_FORCE_MASK 0xFEFFFFFF | ||
228 | #define R_006D58_LB_MAX_REQ_OUTSTANDING 0x006D58 | ||
229 | #define S_006D58_LB_D1_MAX_REQ_OUTSTANDING(x) (((x) & 0xF) << 0) | ||
230 | #define G_006D58_LB_D1_MAX_REQ_OUTSTANDING(x) (((x) >> 0) & 0xF) | ||
231 | #define C_006D58_LB_D1_MAX_REQ_OUTSTANDING 0xFFFFFFF0 | ||
232 | #define S_006D58_LB_D2_MAX_REQ_OUTSTANDING(x) (((x) & 0xF) << 16) | ||
233 | #define G_006D58_LB_D2_MAX_REQ_OUTSTANDING(x) (((x) >> 16) & 0xF) | ||
234 | #define C_006D58_LB_D2_MAX_REQ_OUTSTANDING 0xFFF0FFFF | ||
235 | |||
236 | |||
237 | #define R_000090_MC_SYSTEM_STATUS 0x000090 | ||
238 | #define S_000090_MC_SYSTEM_IDLE(x) (((x) & 0x1) << 0) | ||
239 | #define G_000090_MC_SYSTEM_IDLE(x) (((x) >> 0) & 0x1) | ||
240 | #define C_000090_MC_SYSTEM_IDLE 0xFFFFFFFE | ||
241 | #define S_000090_MC_SEQUENCER_IDLE(x) (((x) & 0x1) << 1) | ||
242 | #define G_000090_MC_SEQUENCER_IDLE(x) (((x) >> 1) & 0x1) | ||
243 | #define C_000090_MC_SEQUENCER_IDLE 0xFFFFFFFD | ||
244 | #define S_000090_MC_ARBITER_IDLE(x) (((x) & 0x1) << 2) | ||
245 | #define G_000090_MC_ARBITER_IDLE(x) (((x) >> 2) & 0x1) | ||
246 | #define C_000090_MC_ARBITER_IDLE 0xFFFFFFFB | ||
247 | #define S_000090_MC_SELECT_PM(x) (((x) & 0x1) << 3) | ||
248 | #define G_000090_MC_SELECT_PM(x) (((x) >> 3) & 0x1) | ||
249 | #define C_000090_MC_SELECT_PM 0xFFFFFFF7 | ||
250 | #define S_000090_RESERVED4(x) (((x) & 0xF) << 4) | ||
251 | #define G_000090_RESERVED4(x) (((x) >> 4) & 0xF) | ||
252 | #define C_000090_RESERVED4 0xFFFFFF0F | ||
253 | #define S_000090_RESERVED8(x) (((x) & 0xF) << 8) | ||
254 | #define G_000090_RESERVED8(x) (((x) >> 8) & 0xF) | ||
255 | #define C_000090_RESERVED8 0xFFFFF0FF | ||
256 | #define S_000090_RESERVED12(x) (((x) & 0xF) << 12) | ||
257 | #define G_000090_RESERVED12(x) (((x) >> 12) & 0xF) | ||
258 | #define C_000090_RESERVED12 0xFFFF0FFF | ||
259 | #define S_000090_MCA_INIT_EXECUTED(x) (((x) & 0x1) << 16) | ||
260 | #define G_000090_MCA_INIT_EXECUTED(x) (((x) >> 16) & 0x1) | ||
261 | #define C_000090_MCA_INIT_EXECUTED 0xFFFEFFFF | ||
262 | #define S_000090_MCA_IDLE(x) (((x) & 0x1) << 17) | ||
263 | #define G_000090_MCA_IDLE(x) (((x) >> 17) & 0x1) | ||
264 | #define C_000090_MCA_IDLE 0xFFFDFFFF | ||
265 | #define S_000090_MCA_SEQ_IDLE(x) (((x) & 0x1) << 18) | ||
266 | #define G_000090_MCA_SEQ_IDLE(x) (((x) >> 18) & 0x1) | ||
267 | #define C_000090_MCA_SEQ_IDLE 0xFFFBFFFF | ||
268 | #define S_000090_MCA_ARB_IDLE(x) (((x) & 0x1) << 19) | ||
269 | #define G_000090_MCA_ARB_IDLE(x) (((x) >> 19) & 0x1) | ||
270 | #define C_000090_MCA_ARB_IDLE 0xFFF7FFFF | ||
271 | #define S_000090_RESERVED20(x) (((x) & 0xFFF) << 20) | ||
272 | #define G_000090_RESERVED20(x) (((x) >> 20) & 0xFFF) | ||
273 | #define C_000090_RESERVED20 0x000FFFFF | ||
274 | #define R_000100_MCCFG_FB_LOCATION 0x000100 | ||
275 | #define S_000100_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
276 | #define G_000100_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
277 | #define C_000100_MC_FB_START 0xFFFF0000 | ||
278 | #define S_000100_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
279 | #define G_000100_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
280 | #define C_000100_MC_FB_TOP 0x0000FFFF | ||
281 | #define R_000104_MC_INIT_MISC_LAT_TIMER 0x000104 | ||
282 | #define S_000104_MC_CPR_INIT_LAT(x) (((x) & 0xF) << 0) | ||
283 | #define G_000104_MC_CPR_INIT_LAT(x) (((x) >> 0) & 0xF) | ||
284 | #define C_000104_MC_CPR_INIT_LAT 0xFFFFFFF0 | ||
285 | #define S_000104_MC_VF_INIT_LAT(x) (((x) & 0xF) << 4) | ||
286 | #define G_000104_MC_VF_INIT_LAT(x) (((x) >> 4) & 0xF) | ||
287 | #define C_000104_MC_VF_INIT_LAT 0xFFFFFF0F | ||
288 | #define S_000104_MC_DISP0R_INIT_LAT(x) (((x) & 0xF) << 8) | ||
289 | #define G_000104_MC_DISP0R_INIT_LAT(x) (((x) >> 8) & 0xF) | ||
290 | #define C_000104_MC_DISP0R_INIT_LAT 0xFFFFF0FF | ||
291 | #define S_000104_MC_DISP1R_INIT_LAT(x) (((x) & 0xF) << 12) | ||
292 | #define G_000104_MC_DISP1R_INIT_LAT(x) (((x) >> 12) & 0xF) | ||
293 | #define C_000104_MC_DISP1R_INIT_LAT 0xFFFF0FFF | ||
294 | #define S_000104_MC_FIXED_INIT_LAT(x) (((x) & 0xF) << 16) | ||
295 | #define G_000104_MC_FIXED_INIT_LAT(x) (((x) >> 16) & 0xF) | ||
296 | #define C_000104_MC_FIXED_INIT_LAT 0xFFF0FFFF | ||
297 | #define S_000104_MC_E2R_INIT_LAT(x) (((x) & 0xF) << 20) | ||
298 | #define G_000104_MC_E2R_INIT_LAT(x) (((x) >> 20) & 0xF) | ||
299 | #define C_000104_MC_E2R_INIT_LAT 0xFF0FFFFF | ||
300 | #define S_000104_SAME_PAGE_PRIO(x) (((x) & 0xF) << 24) | ||
301 | #define G_000104_SAME_PAGE_PRIO(x) (((x) >> 24) & 0xF) | ||
302 | #define C_000104_SAME_PAGE_PRIO 0xF0FFFFFF | ||
303 | #define S_000104_MC_GLOBW_INIT_LAT(x) (((x) & 0xF) << 28) | ||
304 | #define G_000104_MC_GLOBW_INIT_LAT(x) (((x) >> 28) & 0xF) | ||
305 | #define C_000104_MC_GLOBW_INIT_LAT 0x0FFFFFFF | ||
306 | |||
307 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rs690r.h b/drivers/gpu/drm/radeon/rs690r.h deleted file mode 100644 index c0d9faa2175..00000000000 --- a/drivers/gpu/drm/radeon/rs690r.h +++ /dev/null | |||
@@ -1,99 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef RS690R_H | ||
29 | #define RS690R_H | ||
30 | |||
31 | /* RS690/RS740 registers */ | ||
32 | #define MC_INDEX 0x0078 | ||
33 | # define MC_INDEX_MASK 0x1FF | ||
34 | # define MC_INDEX_WR_EN (1 << 9) | ||
35 | # define MC_INDEX_WR_ACK 0x7F | ||
36 | #define MC_DATA 0x007C | ||
37 | #define HDP_FB_LOCATION 0x0134 | ||
38 | #define DC_LB_MEMORY_SPLIT 0x6520 | ||
39 | #define DC_LB_MEMORY_SPLIT_MASK 0x00000003 | ||
40 | #define DC_LB_MEMORY_SPLIT_SHIFT 0 | ||
41 | #define DC_LB_MEMORY_SPLIT_D1HALF_D2HALF 0 | ||
42 | #define DC_LB_MEMORY_SPLIT_D1_3Q_D2_1Q 1 | ||
43 | #define DC_LB_MEMORY_SPLIT_D1_ONLY 2 | ||
44 | #define DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q 3 | ||
45 | #define DC_LB_MEMORY_SPLIT_SHIFT_MODE (1 << 2) | ||
46 | #define DC_LB_DISP1_END_ADR_SHIFT 4 | ||
47 | #define DC_LB_DISP1_END_ADR_MASK 0x00007FF0 | ||
48 | #define D1MODE_PRIORITY_A_CNT 0x6548 | ||
49 | #define MODE_PRIORITY_MARK_MASK 0x00007FFF | ||
50 | #define MODE_PRIORITY_OFF (1 << 16) | ||
51 | #define MODE_PRIORITY_ALWAYS_ON (1 << 20) | ||
52 | #define MODE_PRIORITY_FORCE_MASK (1 << 24) | ||
53 | #define D1MODE_PRIORITY_B_CNT 0x654C | ||
54 | #define LB_MAX_REQ_OUTSTANDING 0x6D58 | ||
55 | #define LB_D1_MAX_REQ_OUTSTANDING_MASK 0x0000000F | ||
56 | #define LB_D1_MAX_REQ_OUTSTANDING_SHIFT 0 | ||
57 | #define LB_D2_MAX_REQ_OUTSTANDING_MASK 0x000F0000 | ||
58 | #define LB_D2_MAX_REQ_OUTSTANDING_SHIFT 16 | ||
59 | #define DCP_CONTROL 0x6C9C | ||
60 | #define D2MODE_PRIORITY_A_CNT 0x6D48 | ||
61 | #define D2MODE_PRIORITY_B_CNT 0x6D4C | ||
62 | |||
63 | /* MC indirect registers */ | ||
64 | #define MC_STATUS_IDLE (1 << 0) | ||
65 | #define MC_MISC_CNTL 0x18 | ||
66 | #define DISABLE_GTW (1 << 1) | ||
67 | #define GART_INDEX_REG_EN (1 << 12) | ||
68 | #define BLOCK_GFX_D3_EN (1 << 14) | ||
69 | #define GART_FEATURE_ID 0x2B | ||
70 | #define HANG_EN (1 << 11) | ||
71 | #define TLB_ENABLE (1 << 18) | ||
72 | #define P2P_ENABLE (1 << 19) | ||
73 | #define GTW_LAC_EN (1 << 25) | ||
74 | #define LEVEL2_GART (0 << 30) | ||
75 | #define LEVEL1_GART (1 << 30) | ||
76 | #define PDC_EN (1 << 31) | ||
77 | #define GART_BASE 0x2C | ||
78 | #define GART_CACHE_CNTRL 0x2E | ||
79 | # define GART_CACHE_INVALIDATE (1 << 0) | ||
80 | #define MC_STATUS 0x90 | ||
81 | #define MCCFG_FB_LOCATION 0x100 | ||
82 | #define MC_FB_START_MASK 0x0000FFFF | ||
83 | #define MC_FB_START_SHIFT 0 | ||
84 | #define MC_FB_TOP_MASK 0xFFFF0000 | ||
85 | #define MC_FB_TOP_SHIFT 16 | ||
86 | #define MCCFG_AGP_LOCATION 0x101 | ||
87 | #define MC_AGP_START_MASK 0x0000FFFF | ||
88 | #define MC_AGP_START_SHIFT 0 | ||
89 | #define MC_AGP_TOP_MASK 0xFFFF0000 | ||
90 | #define MC_AGP_TOP_SHIFT 16 | ||
91 | #define MCCFG_AGP_BASE 0x102 | ||
92 | #define MCCFG_AGP_BASE_2 0x103 | ||
93 | #define MC_INIT_MISC_LAT_TIMER 0x104 | ||
94 | #define MC_DISP0R_INIT_LAT_SHIFT 8 | ||
95 | #define MC_DISP0R_INIT_LAT_MASK 0x00000F00 | ||
96 | #define MC_DISP1R_INIT_LAT_SHIFT 12 | ||
97 | #define MC_DISP1R_INIT_LAT_MASK 0x0000F000 | ||
98 | |||
99 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv200d.h b/drivers/gpu/drm/radeon/rv200d.h new file mode 100644 index 00000000000..c5b398330c2 --- /dev/null +++ b/drivers/gpu/drm/radeon/rv200d.h | |||
@@ -0,0 +1,36 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __RV200D_H__ | ||
29 | #define __RV200D_H__ | ||
30 | |||
31 | #define R_00015C_AGP_BASE_2 0x00015C | ||
32 | #define S_00015C_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0) | ||
33 | #define G_00015C_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF) | ||
34 | #define C_00015C_AGP_BASE_ADDR_2 0xFFFFFFF0 | ||
35 | |||
36 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv250d.h b/drivers/gpu/drm/radeon/rv250d.h new file mode 100644 index 00000000000..e5a70b06fe1 --- /dev/null +++ b/drivers/gpu/drm/radeon/rv250d.h | |||
@@ -0,0 +1,123 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __RV250D_H__ | ||
29 | #define __RV250D_H__ | ||
30 | |||
31 | #define R_00000D_SCLK_CNTL_M6 0x00000D | ||
32 | #define S_00000D_SCLK_SRC_SEL(x) (((x) & 0x7) << 0) | ||
33 | #define G_00000D_SCLK_SRC_SEL(x) (((x) >> 0) & 0x7) | ||
34 | #define C_00000D_SCLK_SRC_SEL 0xFFFFFFF8 | ||
35 | #define S_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 3) | ||
36 | #define G_00000D_CP_MAX_DYN_STOP_LAT(x) (((x) >> 3) & 0x1) | ||
37 | #define C_00000D_CP_MAX_DYN_STOP_LAT 0xFFFFFFF7 | ||
38 | #define S_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 4) | ||
39 | #define G_00000D_HDP_MAX_DYN_STOP_LAT(x) (((x) >> 4) & 0x1) | ||
40 | #define C_00000D_HDP_MAX_DYN_STOP_LAT 0xFFFFFFEF | ||
41 | #define S_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 5) | ||
42 | #define G_00000D_TV_MAX_DYN_STOP_LAT(x) (((x) >> 5) & 0x1) | ||
43 | #define C_00000D_TV_MAX_DYN_STOP_LAT 0xFFFFFFDF | ||
44 | #define S_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 6) | ||
45 | #define G_00000D_E2_MAX_DYN_STOP_LAT(x) (((x) >> 6) & 0x1) | ||
46 | #define C_00000D_E2_MAX_DYN_STOP_LAT 0xFFFFFFBF | ||
47 | #define S_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 7) | ||
48 | #define G_00000D_SE_MAX_DYN_STOP_LAT(x) (((x) >> 7) & 0x1) | ||
49 | #define C_00000D_SE_MAX_DYN_STOP_LAT 0xFFFFFF7F | ||
50 | #define S_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 8) | ||
51 | #define G_00000D_IDCT_MAX_DYN_STOP_LAT(x) (((x) >> 8) & 0x1) | ||
52 | #define C_00000D_IDCT_MAX_DYN_STOP_LAT 0xFFFFFEFF | ||
53 | #define S_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 9) | ||
54 | #define G_00000D_VIP_MAX_DYN_STOP_LAT(x) (((x) >> 9) & 0x1) | ||
55 | #define C_00000D_VIP_MAX_DYN_STOP_LAT 0xFFFFFDFF | ||
56 | #define S_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 10) | ||
57 | #define G_00000D_RE_MAX_DYN_STOP_LAT(x) (((x) >> 10) & 0x1) | ||
58 | #define C_00000D_RE_MAX_DYN_STOP_LAT 0xFFFFFBFF | ||
59 | #define S_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 11) | ||
60 | #define G_00000D_PB_MAX_DYN_STOP_LAT(x) (((x) >> 11) & 0x1) | ||
61 | #define C_00000D_PB_MAX_DYN_STOP_LAT 0xFFFFF7FF | ||
62 | #define S_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 12) | ||
63 | #define G_00000D_TAM_MAX_DYN_STOP_LAT(x) (((x) >> 12) & 0x1) | ||
64 | #define C_00000D_TAM_MAX_DYN_STOP_LAT 0xFFFFEFFF | ||
65 | #define S_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 13) | ||
66 | #define G_00000D_TDM_MAX_DYN_STOP_LAT(x) (((x) >> 13) & 0x1) | ||
67 | #define C_00000D_TDM_MAX_DYN_STOP_LAT 0xFFFFDFFF | ||
68 | #define S_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 14) | ||
69 | #define G_00000D_RB_MAX_DYN_STOP_LAT(x) (((x) >> 14) & 0x1) | ||
70 | #define C_00000D_RB_MAX_DYN_STOP_LAT 0xFFFFBFFF | ||
71 | #define S_00000D_FORCE_DISP2(x) (((x) & 0x1) << 15) | ||
72 | #define G_00000D_FORCE_DISP2(x) (((x) >> 15) & 0x1) | ||
73 | #define C_00000D_FORCE_DISP2 0xFFFF7FFF | ||
74 | #define S_00000D_FORCE_CP(x) (((x) & 0x1) << 16) | ||
75 | #define G_00000D_FORCE_CP(x) (((x) >> 16) & 0x1) | ||
76 | #define C_00000D_FORCE_CP 0xFFFEFFFF | ||
77 | #define S_00000D_FORCE_HDP(x) (((x) & 0x1) << 17) | ||
78 | #define G_00000D_FORCE_HDP(x) (((x) >> 17) & 0x1) | ||
79 | #define C_00000D_FORCE_HDP 0xFFFDFFFF | ||
80 | #define S_00000D_FORCE_DISP1(x) (((x) & 0x1) << 18) | ||
81 | #define G_00000D_FORCE_DISP1(x) (((x) >> 18) & 0x1) | ||
82 | #define C_00000D_FORCE_DISP1 0xFFFBFFFF | ||
83 | #define S_00000D_FORCE_TOP(x) (((x) & 0x1) << 19) | ||
84 | #define G_00000D_FORCE_TOP(x) (((x) >> 19) & 0x1) | ||
85 | #define C_00000D_FORCE_TOP 0xFFF7FFFF | ||
86 | #define S_00000D_FORCE_E2(x) (((x) & 0x1) << 20) | ||
87 | #define G_00000D_FORCE_E2(x) (((x) >> 20) & 0x1) | ||
88 | #define C_00000D_FORCE_E2 0xFFEFFFFF | ||
89 | #define S_00000D_FORCE_SE(x) (((x) & 0x1) << 21) | ||
90 | #define G_00000D_FORCE_SE(x) (((x) >> 21) & 0x1) | ||
91 | #define C_00000D_FORCE_SE 0xFFDFFFFF | ||
92 | #define S_00000D_FORCE_IDCT(x) (((x) & 0x1) << 22) | ||
93 | #define G_00000D_FORCE_IDCT(x) (((x) >> 22) & 0x1) | ||
94 | #define C_00000D_FORCE_IDCT 0xFFBFFFFF | ||
95 | #define S_00000D_FORCE_VIP(x) (((x) & 0x1) << 23) | ||
96 | #define G_00000D_FORCE_VIP(x) (((x) >> 23) & 0x1) | ||
97 | #define C_00000D_FORCE_VIP 0xFF7FFFFF | ||
98 | #define S_00000D_FORCE_RE(x) (((x) & 0x1) << 24) | ||
99 | #define G_00000D_FORCE_RE(x) (((x) >> 24) & 0x1) | ||
100 | #define C_00000D_FORCE_RE 0xFEFFFFFF | ||
101 | #define S_00000D_FORCE_PB(x) (((x) & 0x1) << 25) | ||
102 | #define G_00000D_FORCE_PB(x) (((x) >> 25) & 0x1) | ||
103 | #define C_00000D_FORCE_PB 0xFDFFFFFF | ||
104 | #define S_00000D_FORCE_TAM(x) (((x) & 0x1) << 26) | ||
105 | #define G_00000D_FORCE_TAM(x) (((x) >> 26) & 0x1) | ||
106 | #define C_00000D_FORCE_TAM 0xFBFFFFFF | ||
107 | #define S_00000D_FORCE_TDM(x) (((x) & 0x1) << 27) | ||
108 | #define G_00000D_FORCE_TDM(x) (((x) >> 27) & 0x1) | ||
109 | #define C_00000D_FORCE_TDM 0xF7FFFFFF | ||
110 | #define S_00000D_FORCE_RB(x) (((x) & 0x1) << 28) | ||
111 | #define G_00000D_FORCE_RB(x) (((x) >> 28) & 0x1) | ||
112 | #define C_00000D_FORCE_RB 0xEFFFFFFF | ||
113 | #define S_00000D_FORCE_TV_SCLK(x) (((x) & 0x1) << 29) | ||
114 | #define G_00000D_FORCE_TV_SCLK(x) (((x) >> 29) & 0x1) | ||
115 | #define C_00000D_FORCE_TV_SCLK 0xDFFFFFFF | ||
116 | #define S_00000D_FORCE_SUBPIC(x) (((x) & 0x1) << 30) | ||
117 | #define G_00000D_FORCE_SUBPIC(x) (((x) >> 30) & 0x1) | ||
118 | #define C_00000D_FORCE_SUBPIC 0xBFFFFFFF | ||
119 | #define S_00000D_FORCE_OV0(x) (((x) & 0x1) << 31) | ||
120 | #define G_00000D_FORCE_OV0(x) (((x) >> 31) & 0x1) | ||
121 | #define C_00000D_FORCE_OV0 0x7FFFFFFF | ||
122 | |||
123 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv350d.h b/drivers/gpu/drm/radeon/rv350d.h new file mode 100644 index 00000000000..c75c5ed9e65 --- /dev/null +++ b/drivers/gpu/drm/radeon/rv350d.h | |||
@@ -0,0 +1,52 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Jerome Glisse. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Dave Airlie | ||
25 | * Alex Deucher | ||
26 | * Jerome Glisse | ||
27 | */ | ||
28 | #ifndef __RV350D_H__ | ||
29 | #define __RV350D_H__ | ||
30 | |||
31 | /* RV350, RV380 registers */ | ||
32 | /* #define R_00000D_SCLK_CNTL 0x00000D */ | ||
33 | #define S_00000D_FORCE_VAP(x) (((x) & 0x1) << 21) | ||
34 | #define G_00000D_FORCE_VAP(x) (((x) >> 21) & 0x1) | ||
35 | #define C_00000D_FORCE_VAP 0xFFDFFFFF | ||
36 | #define S_00000D_FORCE_SR(x) (((x) & 0x1) << 25) | ||
37 | #define G_00000D_FORCE_SR(x) (((x) >> 25) & 0x1) | ||
38 | #define C_00000D_FORCE_SR 0xFDFFFFFF | ||
39 | #define S_00000D_FORCE_PX(x) (((x) & 0x1) << 26) | ||
40 | #define G_00000D_FORCE_PX(x) (((x) >> 26) & 0x1) | ||
41 | #define C_00000D_FORCE_PX 0xFBFFFFFF | ||
42 | #define S_00000D_FORCE_TX(x) (((x) & 0x1) << 27) | ||
43 | #define G_00000D_FORCE_TX(x) (((x) >> 27) & 0x1) | ||
44 | #define C_00000D_FORCE_TX 0xF7FFFFFF | ||
45 | #define S_00000D_FORCE_US(x) (((x) & 0x1) << 28) | ||
46 | #define G_00000D_FORCE_US(x) (((x) >> 28) & 0x1) | ||
47 | #define C_00000D_FORCE_US 0xEFFFFFFF | ||
48 | #define S_00000D_FORCE_SU(x) (((x) & 0x1) << 30) | ||
49 | #define G_00000D_FORCE_SU(x) (((x) >> 30) & 0x1) | ||
50 | #define C_00000D_FORCE_SU 0xBFFFFFFF | ||
51 | |||
52 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index fd799748e7d..41a34c23e6d 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
@@ -29,37 +29,17 @@ | |||
29 | #include "drmP.h" | 29 | #include "drmP.h" |
30 | #include "rv515d.h" | 30 | #include "rv515d.h" |
31 | #include "radeon.h" | 31 | #include "radeon.h" |
32 | 32 | #include "atom.h" | |
33 | #include "rv515_reg_safe.h" | 33 | #include "rv515_reg_safe.h" |
34 | /* rv515 depends on : */ | 34 | |
35 | void r100_hdp_reset(struct radeon_device *rdev); | 35 | /* This files gather functions specifics to: rv515 */ |
36 | int r100_cp_reset(struct radeon_device *rdev); | ||
37 | int r100_rb2d_reset(struct radeon_device *rdev); | ||
38 | int r100_gui_wait_for_idle(struct radeon_device *rdev); | ||
39 | int r100_cp_init(struct radeon_device *rdev, unsigned ring_size); | ||
40 | void r420_pipes_init(struct radeon_device *rdev); | ||
41 | void rs600_mc_disable_clients(struct radeon_device *rdev); | ||
42 | void rs600_disable_vga(struct radeon_device *rdev); | ||
43 | |||
44 | /* This files gather functions specifics to: | ||
45 | * rv515 | ||
46 | * | ||
47 | * Some of these functions might be used by newer ASICs. | ||
48 | */ | ||
49 | int rv515_debugfs_pipes_info_init(struct radeon_device *rdev); | 36 | int rv515_debugfs_pipes_info_init(struct radeon_device *rdev); |
50 | int rv515_debugfs_ga_info_init(struct radeon_device *rdev); | 37 | int rv515_debugfs_ga_info_init(struct radeon_device *rdev); |
51 | void rv515_gpu_init(struct radeon_device *rdev); | 38 | void rv515_gpu_init(struct radeon_device *rdev); |
52 | int rv515_mc_wait_for_idle(struct radeon_device *rdev); | 39 | int rv515_mc_wait_for_idle(struct radeon_device *rdev); |
53 | 40 | ||
54 | 41 | void rv515_debugfs(struct radeon_device *rdev) | |
55 | /* | ||
56 | * MC | ||
57 | */ | ||
58 | int rv515_mc_init(struct radeon_device *rdev) | ||
59 | { | 42 | { |
60 | uint32_t tmp; | ||
61 | int r; | ||
62 | |||
63 | if (r100_debugfs_rbbm_init(rdev)) { | 43 | if (r100_debugfs_rbbm_init(rdev)) { |
64 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); | 44 | DRM_ERROR("Failed to register debugfs file for RBBM !\n"); |
65 | } | 45 | } |
@@ -69,67 +49,8 @@ int rv515_mc_init(struct radeon_device *rdev) | |||
69 | if (rv515_debugfs_ga_info_init(rdev)) { | 49 | if (rv515_debugfs_ga_info_init(rdev)) { |
70 | DRM_ERROR("Failed to register debugfs file for pipes !\n"); | 50 | DRM_ERROR("Failed to register debugfs file for pipes !\n"); |
71 | } | 51 | } |
72 | |||
73 | rv515_gpu_init(rdev); | ||
74 | rv370_pcie_gart_disable(rdev); | ||
75 | |||
76 | /* Setup GPU memory space */ | ||
77 | rdev->mc.vram_location = 0xFFFFFFFFUL; | ||
78 | rdev->mc.gtt_location = 0xFFFFFFFFUL; | ||
79 | if (rdev->flags & RADEON_IS_AGP) { | ||
80 | r = radeon_agp_init(rdev); | ||
81 | if (r) { | ||
82 | printk(KERN_WARNING "[drm] Disabling AGP\n"); | ||
83 | rdev->flags &= ~RADEON_IS_AGP; | ||
84 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | ||
85 | } else { | ||
86 | rdev->mc.gtt_location = rdev->mc.agp_base; | ||
87 | } | ||
88 | } | ||
89 | r = radeon_mc_setup(rdev); | ||
90 | if (r) { | ||
91 | return r; | ||
92 | } | ||
93 | |||
94 | /* Program GPU memory space */ | ||
95 | rs600_mc_disable_clients(rdev); | ||
96 | if (rv515_mc_wait_for_idle(rdev)) { | ||
97 | printk(KERN_WARNING "Failed to wait MC idle while " | ||
98 | "programming pipes. Bad things might happen.\n"); | ||
99 | } | ||
100 | /* Write VRAM size in case we are limiting it */ | ||
101 | WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | ||
102 | tmp = REG_SET(MC_FB_START, rdev->mc.vram_location >> 16); | ||
103 | WREG32(0x134, tmp); | ||
104 | tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; | ||
105 | tmp = REG_SET(MC_FB_TOP, tmp >> 16); | ||
106 | tmp |= REG_SET(MC_FB_START, rdev->mc.vram_location >> 16); | ||
107 | WREG32_MC(MC_FB_LOCATION, tmp); | ||
108 | WREG32(HDP_FB_LOCATION, rdev->mc.vram_location >> 16); | ||
109 | WREG32(0x310, rdev->mc.vram_location); | ||
110 | if (rdev->flags & RADEON_IS_AGP) { | ||
111 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; | ||
112 | tmp = REG_SET(MC_AGP_TOP, tmp >> 16); | ||
113 | tmp |= REG_SET(MC_AGP_START, rdev->mc.gtt_location >> 16); | ||
114 | WREG32_MC(MC_AGP_LOCATION, tmp); | ||
115 | WREG32_MC(MC_AGP_BASE, rdev->mc.agp_base); | ||
116 | WREG32_MC(MC_AGP_BASE_2, 0); | ||
117 | } else { | ||
118 | WREG32_MC(MC_AGP_LOCATION, 0x0FFFFFFF); | ||
119 | WREG32_MC(MC_AGP_BASE, 0); | ||
120 | WREG32_MC(MC_AGP_BASE_2, 0); | ||
121 | } | ||
122 | return 0; | ||
123 | } | ||
124 | |||
125 | void rv515_mc_fini(struct radeon_device *rdev) | ||
126 | { | ||
127 | } | 52 | } |
128 | 53 | ||
129 | |||
130 | /* | ||
131 | * Global GPU functions | ||
132 | */ | ||
133 | void rv515_ring_start(struct radeon_device *rdev) | 54 | void rv515_ring_start(struct radeon_device *rdev) |
134 | { | 55 | { |
135 | int r; | 56 | int r; |
@@ -198,11 +119,6 @@ void rv515_ring_start(struct radeon_device *rdev) | |||
198 | radeon_ring_unlock_commit(rdev); | 119 | radeon_ring_unlock_commit(rdev); |
199 | } | 120 | } |
200 | 121 | ||
201 | void rv515_errata(struct radeon_device *rdev) | ||
202 | { | ||
203 | rdev->pll_errata = 0; | ||
204 | } | ||
205 | |||
206 | int rv515_mc_wait_for_idle(struct radeon_device *rdev) | 122 | int rv515_mc_wait_for_idle(struct radeon_device *rdev) |
207 | { | 123 | { |
208 | unsigned i; | 124 | unsigned i; |
@@ -219,6 +135,12 @@ int rv515_mc_wait_for_idle(struct radeon_device *rdev) | |||
219 | return -1; | 135 | return -1; |
220 | } | 136 | } |
221 | 137 | ||
138 | void rv515_vga_render_disable(struct radeon_device *rdev) | ||
139 | { | ||
140 | WREG32(R_000300_VGA_RENDER_CONTROL, | ||
141 | RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL); | ||
142 | } | ||
143 | |||
222 | void rv515_gpu_init(struct radeon_device *rdev) | 144 | void rv515_gpu_init(struct radeon_device *rdev) |
223 | { | 145 | { |
224 | unsigned pipe_select_current, gb_pipe_select, tmp; | 146 | unsigned pipe_select_current, gb_pipe_select, tmp; |
@@ -231,7 +153,7 @@ void rv515_gpu_init(struct radeon_device *rdev) | |||
231 | "reseting GPU. Bad things might happen.\n"); | 153 | "reseting GPU. Bad things might happen.\n"); |
232 | } | 154 | } |
233 | 155 | ||
234 | rs600_disable_vga(rdev); | 156 | rv515_vga_render_disable(rdev); |
235 | 157 | ||
236 | r420_pipes_init(rdev); | 158 | r420_pipes_init(rdev); |
237 | gb_pipe_select = RREG32(0x402C); | 159 | gb_pipe_select = RREG32(0x402C); |
@@ -335,10 +257,6 @@ int rv515_gpu_reset(struct radeon_device *rdev) | |||
335 | return 0; | 257 | return 0; |
336 | } | 258 | } |
337 | 259 | ||
338 | |||
339 | /* | ||
340 | * VRAM info | ||
341 | */ | ||
342 | static void rv515_vram_get_type(struct radeon_device *rdev) | 260 | static void rv515_vram_get_type(struct radeon_device *rdev) |
343 | { | 261 | { |
344 | uint32_t tmp; | 262 | uint32_t tmp; |
@@ -374,10 +292,6 @@ void rv515_vram_info(struct radeon_device *rdev) | |||
374 | rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); | 292 | rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); |
375 | } | 293 | } |
376 | 294 | ||
377 | |||
378 | /* | ||
379 | * Indirect registers accessor | ||
380 | */ | ||
381 | uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg) | 295 | uint32_t rv515_mc_rreg(struct radeon_device *rdev, uint32_t reg) |
382 | { | 296 | { |
383 | uint32_t r; | 297 | uint32_t r; |
@@ -395,9 +309,6 @@ void rv515_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
395 | WREG32(MC_IND_INDEX, 0); | 309 | WREG32(MC_IND_INDEX, 0); |
396 | } | 310 | } |
397 | 311 | ||
398 | /* | ||
399 | * Debugfs info | ||
400 | */ | ||
401 | #if defined(CONFIG_DEBUG_FS) | 312 | #if defined(CONFIG_DEBUG_FS) |
402 | static int rv515_debugfs_pipes_info(struct seq_file *m, void *data) | 313 | static int rv515_debugfs_pipes_info(struct seq_file *m, void *data) |
403 | { | 314 | { |
@@ -459,13 +370,257 @@ int rv515_debugfs_ga_info_init(struct radeon_device *rdev) | |||
459 | #endif | 370 | #endif |
460 | } | 371 | } |
461 | 372 | ||
462 | /* | 373 | void rv515_mc_stop(struct radeon_device *rdev, struct rv515_mc_save *save) |
463 | * Asic initialization | 374 | { |
464 | */ | 375 | save->d1vga_control = RREG32(R_000330_D1VGA_CONTROL); |
465 | int rv515_init(struct radeon_device *rdev) | 376 | save->d2vga_control = RREG32(R_000338_D2VGA_CONTROL); |
377 | save->vga_render_control = RREG32(R_000300_VGA_RENDER_CONTROL); | ||
378 | save->vga_hdp_control = RREG32(R_000328_VGA_HDP_CONTROL); | ||
379 | save->d1crtc_control = RREG32(R_006080_D1CRTC_CONTROL); | ||
380 | save->d2crtc_control = RREG32(R_006880_D2CRTC_CONTROL); | ||
381 | |||
382 | /* Stop all video */ | ||
383 | WREG32(R_000330_D1VGA_CONTROL, 0); | ||
384 | WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0); | ||
385 | WREG32(R_000300_VGA_RENDER_CONTROL, 0); | ||
386 | WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 1); | ||
387 | WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 1); | ||
388 | WREG32(R_006080_D1CRTC_CONTROL, 0); | ||
389 | WREG32(R_006880_D2CRTC_CONTROL, 0); | ||
390 | WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 0); | ||
391 | WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0); | ||
392 | } | ||
393 | |||
394 | void rv515_mc_resume(struct radeon_device *rdev, struct rv515_mc_save *save) | ||
395 | { | ||
396 | WREG32(R_006110_D1GRPH_PRIMARY_SURFACE_ADDRESS, rdev->mc.vram_start); | ||
397 | WREG32(R_006118_D1GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start); | ||
398 | WREG32(R_006910_D2GRPH_PRIMARY_SURFACE_ADDRESS, rdev->mc.vram_start); | ||
399 | WREG32(R_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS, rdev->mc.vram_start); | ||
400 | WREG32(R_000310_VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); | ||
401 | /* Unlock host access */ | ||
402 | WREG32(R_000328_VGA_HDP_CONTROL, save->vga_hdp_control); | ||
403 | mdelay(1); | ||
404 | /* Restore video state */ | ||
405 | WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 1); | ||
406 | WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 1); | ||
407 | WREG32(R_006080_D1CRTC_CONTROL, save->d1crtc_control); | ||
408 | WREG32(R_006880_D2CRTC_CONTROL, save->d2crtc_control); | ||
409 | WREG32(R_0060E8_D1CRTC_UPDATE_LOCK, 0); | ||
410 | WREG32(R_0068E8_D2CRTC_UPDATE_LOCK, 0); | ||
411 | WREG32(R_000330_D1VGA_CONTROL, save->d1vga_control); | ||
412 | WREG32(R_000338_D2VGA_CONTROL, save->d2vga_control); | ||
413 | WREG32(R_000300_VGA_RENDER_CONTROL, save->vga_render_control); | ||
414 | } | ||
415 | |||
416 | void rv515_mc_program(struct radeon_device *rdev) | ||
417 | { | ||
418 | struct rv515_mc_save save; | ||
419 | |||
420 | /* Stops all mc clients */ | ||
421 | rv515_mc_stop(rdev, &save); | ||
422 | |||
423 | /* Wait for mc idle */ | ||
424 | if (rv515_mc_wait_for_idle(rdev)) | ||
425 | dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); | ||
426 | /* Write VRAM size in case we are limiting it */ | ||
427 | WREG32(R_0000F8_CONFIG_MEMSIZE, rdev->mc.real_vram_size); | ||
428 | /* Program MC, should be a 32bits limited address space */ | ||
429 | WREG32_MC(R_000001_MC_FB_LOCATION, | ||
430 | S_000001_MC_FB_START(rdev->mc.vram_start >> 16) | | ||
431 | S_000001_MC_FB_TOP(rdev->mc.vram_end >> 16)); | ||
432 | WREG32(R_000134_HDP_FB_LOCATION, | ||
433 | S_000134_HDP_FB_START(rdev->mc.vram_start >> 16)); | ||
434 | if (rdev->flags & RADEON_IS_AGP) { | ||
435 | WREG32_MC(R_000002_MC_AGP_LOCATION, | ||
436 | S_000002_MC_AGP_START(rdev->mc.gtt_start >> 16) | | ||
437 | S_000002_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); | ||
438 | WREG32_MC(R_000003_MC_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); | ||
439 | WREG32_MC(R_000004_MC_AGP_BASE_2, | ||
440 | S_000004_AGP_BASE_ADDR_2(upper_32_bits(rdev->mc.agp_base))); | ||
441 | } else { | ||
442 | WREG32_MC(R_000002_MC_AGP_LOCATION, 0xFFFFFFFF); | ||
443 | WREG32_MC(R_000003_MC_AGP_BASE, 0); | ||
444 | WREG32_MC(R_000004_MC_AGP_BASE_2, 0); | ||
445 | } | ||
446 | |||
447 | rv515_mc_resume(rdev, &save); | ||
448 | } | ||
449 | |||
450 | void rv515_clock_startup(struct radeon_device *rdev) | ||
451 | { | ||
452 | if (radeon_dynclks != -1 && radeon_dynclks) | ||
453 | radeon_atom_set_clock_gating(rdev, 1); | ||
454 | /* We need to force on some of the block */ | ||
455 | WREG32_PLL(R_00000F_CP_DYN_CNTL, | ||
456 | RREG32_PLL(R_00000F_CP_DYN_CNTL) | S_00000F_CP_FORCEON(1)); | ||
457 | WREG32_PLL(R_000011_E2_DYN_CNTL, | ||
458 | RREG32_PLL(R_000011_E2_DYN_CNTL) | S_000011_E2_FORCEON(1)); | ||
459 | WREG32_PLL(R_000013_IDCT_DYN_CNTL, | ||
460 | RREG32_PLL(R_000013_IDCT_DYN_CNTL) | S_000013_IDCT_FORCEON(1)); | ||
461 | } | ||
462 | |||
463 | static int rv515_startup(struct radeon_device *rdev) | ||
464 | { | ||
465 | int r; | ||
466 | |||
467 | rv515_mc_program(rdev); | ||
468 | /* Resume clock */ | ||
469 | rv515_clock_startup(rdev); | ||
470 | /* Initialize GPU configuration (# pipes, ...) */ | ||
471 | rv515_gpu_init(rdev); | ||
472 | /* Initialize GART (initialize after TTM so we can allocate | ||
473 | * memory through TTM but finalize after TTM) */ | ||
474 | if (rdev->flags & RADEON_IS_PCIE) { | ||
475 | r = rv370_pcie_gart_enable(rdev); | ||
476 | if (r) | ||
477 | return r; | ||
478 | } | ||
479 | /* Enable IRQ */ | ||
480 | rdev->irq.sw_int = true; | ||
481 | rs600_irq_set(rdev); | ||
482 | /* 1M ring buffer */ | ||
483 | r = r100_cp_init(rdev, 1024 * 1024); | ||
484 | if (r) { | ||
485 | dev_err(rdev->dev, "failled initializing CP (%d).\n", r); | ||
486 | return r; | ||
487 | } | ||
488 | r = r100_wb_init(rdev); | ||
489 | if (r) | ||
490 | dev_err(rdev->dev, "failled initializing WB (%d).\n", r); | ||
491 | r = r100_ib_init(rdev); | ||
492 | if (r) { | ||
493 | dev_err(rdev->dev, "failled initializing IB (%d).\n", r); | ||
494 | return r; | ||
495 | } | ||
496 | return 0; | ||
497 | } | ||
498 | |||
499 | int rv515_resume(struct radeon_device *rdev) | ||
500 | { | ||
501 | /* Make sur GART are not working */ | ||
502 | if (rdev->flags & RADEON_IS_PCIE) | ||
503 | rv370_pcie_gart_disable(rdev); | ||
504 | /* Resume clock before doing reset */ | ||
505 | rv515_clock_startup(rdev); | ||
506 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
507 | if (radeon_gpu_reset(rdev)) { | ||
508 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
509 | RREG32(R_000E40_RBBM_STATUS), | ||
510 | RREG32(R_0007C0_CP_STAT)); | ||
511 | } | ||
512 | /* post */ | ||
513 | atom_asic_init(rdev->mode_info.atom_context); | ||
514 | /* Resume clock after posting */ | ||
515 | rv515_clock_startup(rdev); | ||
516 | return rv515_startup(rdev); | ||
517 | } | ||
518 | |||
519 | int rv515_suspend(struct radeon_device *rdev) | ||
520 | { | ||
521 | r100_cp_disable(rdev); | ||
522 | r100_wb_disable(rdev); | ||
523 | rs600_irq_disable(rdev); | ||
524 | if (rdev->flags & RADEON_IS_PCIE) | ||
525 | rv370_pcie_gart_disable(rdev); | ||
526 | return 0; | ||
527 | } | ||
528 | |||
529 | void rv515_set_safe_registers(struct radeon_device *rdev) | ||
466 | { | 530 | { |
467 | rdev->config.r300.reg_safe_bm = rv515_reg_safe_bm; | 531 | rdev->config.r300.reg_safe_bm = rv515_reg_safe_bm; |
468 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rv515_reg_safe_bm); | 532 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(rv515_reg_safe_bm); |
533 | } | ||
534 | |||
535 | void rv515_fini(struct radeon_device *rdev) | ||
536 | { | ||
537 | rv515_suspend(rdev); | ||
538 | r100_cp_fini(rdev); | ||
539 | r100_wb_fini(rdev); | ||
540 | r100_ib_fini(rdev); | ||
541 | radeon_gem_fini(rdev); | ||
542 | rv370_pcie_gart_fini(rdev); | ||
543 | radeon_agp_fini(rdev); | ||
544 | radeon_irq_kms_fini(rdev); | ||
545 | radeon_fence_driver_fini(rdev); | ||
546 | radeon_object_fini(rdev); | ||
547 | radeon_atombios_fini(rdev); | ||
548 | kfree(rdev->bios); | ||
549 | rdev->bios = NULL; | ||
550 | } | ||
551 | |||
552 | int rv515_init(struct radeon_device *rdev) | ||
553 | { | ||
554 | int r; | ||
555 | |||
556 | /* Initialize scratch registers */ | ||
557 | radeon_scratch_init(rdev); | ||
558 | /* Initialize surface registers */ | ||
559 | radeon_surface_init(rdev); | ||
560 | /* TODO: disable VGA need to use VGA request */ | ||
561 | /* BIOS*/ | ||
562 | if (!radeon_get_bios(rdev)) { | ||
563 | if (ASIC_IS_AVIVO(rdev)) | ||
564 | return -EINVAL; | ||
565 | } | ||
566 | if (rdev->is_atom_bios) { | ||
567 | r = radeon_atombios_init(rdev); | ||
568 | if (r) | ||
569 | return r; | ||
570 | } else { | ||
571 | dev_err(rdev->dev, "Expecting atombios for RV515 GPU\n"); | ||
572 | return -EINVAL; | ||
573 | } | ||
574 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | ||
575 | if (radeon_gpu_reset(rdev)) { | ||
576 | dev_warn(rdev->dev, | ||
577 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | ||
578 | RREG32(R_000E40_RBBM_STATUS), | ||
579 | RREG32(R_0007C0_CP_STAT)); | ||
580 | } | ||
581 | /* check if cards are posted or not */ | ||
582 | if (!radeon_card_posted(rdev) && rdev->bios) { | ||
583 | DRM_INFO("GPU not posted. posting now...\n"); | ||
584 | atom_asic_init(rdev->mode_info.atom_context); | ||
585 | } | ||
586 | /* Initialize clocks */ | ||
587 | radeon_get_clock_info(rdev->ddev); | ||
588 | /* Get vram informations */ | ||
589 | rv515_vram_info(rdev); | ||
590 | /* Initialize memory controller (also test AGP) */ | ||
591 | r = r420_mc_init(rdev); | ||
592 | if (r) | ||
593 | return r; | ||
594 | rv515_debugfs(rdev); | ||
595 | /* Fence driver */ | ||
596 | r = radeon_fence_driver_init(rdev); | ||
597 | if (r) | ||
598 | return r; | ||
599 | r = radeon_irq_kms_init(rdev); | ||
600 | if (r) | ||
601 | return r; | ||
602 | /* Memory manager */ | ||
603 | r = radeon_object_init(rdev); | ||
604 | if (r) | ||
605 | return r; | ||
606 | r = rv370_pcie_gart_init(rdev); | ||
607 | if (r) | ||
608 | return r; | ||
609 | rv515_set_safe_registers(rdev); | ||
610 | rdev->accel_working = true; | ||
611 | r = rv515_startup(rdev); | ||
612 | if (r) { | ||
613 | /* Somethings want wront with the accel init stop accel */ | ||
614 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); | ||
615 | rv515_suspend(rdev); | ||
616 | r100_cp_fini(rdev); | ||
617 | r100_wb_fini(rdev); | ||
618 | r100_ib_fini(rdev); | ||
619 | rv370_pcie_gart_fini(rdev); | ||
620 | radeon_agp_fini(rdev); | ||
621 | radeon_irq_kms_fini(rdev); | ||
622 | rdev->accel_working = false; | ||
623 | } | ||
469 | return 0; | 624 | return 0; |
470 | } | 625 | } |
471 | 626 | ||
diff --git a/drivers/gpu/drm/radeon/rv515d.h b/drivers/gpu/drm/radeon/rv515d.h index a65e17ec1c0..fc216e49384 100644 --- a/drivers/gpu/drm/radeon/rv515d.h +++ b/drivers/gpu/drm/radeon/rv515d.h | |||
@@ -216,5 +216,388 @@ | |||
216 | #define CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1) | 216 | #define CP_PACKET0_GET_ONE_REG_WR(h) (((h) >> 15) & 1) |
217 | #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) | 217 | #define CP_PACKET3_GET_OPCODE(h) (((h) >> 8) & 0xFF) |
218 | 218 | ||
219 | #endif | 219 | /* Registers */ |
220 | #define R_0000F8_CONFIG_MEMSIZE 0x0000F8 | ||
221 | #define S_0000F8_CONFIG_MEMSIZE(x) (((x) & 0xFFFFFFFF) << 0) | ||
222 | #define G_0000F8_CONFIG_MEMSIZE(x) (((x) >> 0) & 0xFFFFFFFF) | ||
223 | #define C_0000F8_CONFIG_MEMSIZE 0x00000000 | ||
224 | #define R_000134_HDP_FB_LOCATION 0x000134 | ||
225 | #define S_000134_HDP_FB_START(x) (((x) & 0xFFFF) << 0) | ||
226 | #define G_000134_HDP_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
227 | #define C_000134_HDP_FB_START 0xFFFF0000 | ||
228 | #define R_000300_VGA_RENDER_CONTROL 0x000300 | ||
229 | #define S_000300_VGA_BLINK_RATE(x) (((x) & 0x1F) << 0) | ||
230 | #define G_000300_VGA_BLINK_RATE(x) (((x) >> 0) & 0x1F) | ||
231 | #define C_000300_VGA_BLINK_RATE 0xFFFFFFE0 | ||
232 | #define S_000300_VGA_BLINK_MODE(x) (((x) & 0x3) << 5) | ||
233 | #define G_000300_VGA_BLINK_MODE(x) (((x) >> 5) & 0x3) | ||
234 | #define C_000300_VGA_BLINK_MODE 0xFFFFFF9F | ||
235 | #define S_000300_VGA_CURSOR_BLINK_INVERT(x) (((x) & 0x1) << 7) | ||
236 | #define G_000300_VGA_CURSOR_BLINK_INVERT(x) (((x) >> 7) & 0x1) | ||
237 | #define C_000300_VGA_CURSOR_BLINK_INVERT 0xFFFFFF7F | ||
238 | #define S_000300_VGA_EXTD_ADDR_COUNT_ENABLE(x) (((x) & 0x1) << 8) | ||
239 | #define G_000300_VGA_EXTD_ADDR_COUNT_ENABLE(x) (((x) >> 8) & 0x1) | ||
240 | #define C_000300_VGA_EXTD_ADDR_COUNT_ENABLE 0xFFFFFEFF | ||
241 | #define S_000300_VGA_VSTATUS_CNTL(x) (((x) & 0x3) << 16) | ||
242 | #define G_000300_VGA_VSTATUS_CNTL(x) (((x) >> 16) & 0x3) | ||
243 | #define C_000300_VGA_VSTATUS_CNTL 0xFFFCFFFF | ||
244 | #define S_000300_VGA_LOCK_8DOT(x) (((x) & 0x1) << 24) | ||
245 | #define G_000300_VGA_LOCK_8DOT(x) (((x) >> 24) & 0x1) | ||
246 | #define C_000300_VGA_LOCK_8DOT 0xFEFFFFFF | ||
247 | #define S_000300_VGAREG_LINECMP_COMPATIBILITY_SEL(x) (((x) & 0x1) << 25) | ||
248 | #define G_000300_VGAREG_LINECMP_COMPATIBILITY_SEL(x) (((x) >> 25) & 0x1) | ||
249 | #define C_000300_VGAREG_LINECMP_COMPATIBILITY_SEL 0xFDFFFFFF | ||
250 | #define R_000310_VGA_MEMORY_BASE_ADDRESS 0x000310 | ||
251 | #define S_000310_VGA_MEMORY_BASE_ADDRESS(x) (((x) & 0xFFFFFFFF) << 0) | ||
252 | #define G_000310_VGA_MEMORY_BASE_ADDRESS(x) (((x) >> 0) & 0xFFFFFFFF) | ||
253 | #define C_000310_VGA_MEMORY_BASE_ADDRESS 0x00000000 | ||
254 | #define R_000328_VGA_HDP_CONTROL 0x000328 | ||
255 | #define S_000328_VGA_MEM_PAGE_SELECT_EN(x) (((x) & 0x1) << 0) | ||
256 | #define G_000328_VGA_MEM_PAGE_SELECT_EN(x) (((x) >> 0) & 0x1) | ||
257 | #define C_000328_VGA_MEM_PAGE_SELECT_EN 0xFFFFFFFE | ||
258 | #define S_000328_VGA_RBBM_LOCK_DISABLE(x) (((x) & 0x1) << 8) | ||
259 | #define G_000328_VGA_RBBM_LOCK_DISABLE(x) (((x) >> 8) & 0x1) | ||
260 | #define C_000328_VGA_RBBM_LOCK_DISABLE 0xFFFFFEFF | ||
261 | #define S_000328_VGA_SOFT_RESET(x) (((x) & 0x1) << 16) | ||
262 | #define G_000328_VGA_SOFT_RESET(x) (((x) >> 16) & 0x1) | ||
263 | #define C_000328_VGA_SOFT_RESET 0xFFFEFFFF | ||
264 | #define S_000328_VGA_TEST_RESET_CONTROL(x) (((x) & 0x1) << 24) | ||
265 | #define G_000328_VGA_TEST_RESET_CONTROL(x) (((x) >> 24) & 0x1) | ||
266 | #define C_000328_VGA_TEST_RESET_CONTROL 0xFEFFFFFF | ||
267 | #define R_000330_D1VGA_CONTROL 0x000330 | ||
268 | #define S_000330_D1VGA_MODE_ENABLE(x) (((x) & 0x1) << 0) | ||
269 | #define G_000330_D1VGA_MODE_ENABLE(x) (((x) >> 0) & 0x1) | ||
270 | #define C_000330_D1VGA_MODE_ENABLE 0xFFFFFFFE | ||
271 | #define S_000330_D1VGA_TIMING_SELECT(x) (((x) & 0x1) << 8) | ||
272 | #define G_000330_D1VGA_TIMING_SELECT(x) (((x) >> 8) & 0x1) | ||
273 | #define C_000330_D1VGA_TIMING_SELECT 0xFFFFFEFF | ||
274 | #define S_000330_D1VGA_SYNC_POLARITY_SELECT(x) (((x) & 0x1) << 9) | ||
275 | #define G_000330_D1VGA_SYNC_POLARITY_SELECT(x) (((x) >> 9) & 0x1) | ||
276 | #define C_000330_D1VGA_SYNC_POLARITY_SELECT 0xFFFFFDFF | ||
277 | #define S_000330_D1VGA_OVERSCAN_TIMING_SELECT(x) (((x) & 0x1) << 10) | ||
278 | #define G_000330_D1VGA_OVERSCAN_TIMING_SELECT(x) (((x) >> 10) & 0x1) | ||
279 | #define C_000330_D1VGA_OVERSCAN_TIMING_SELECT 0xFFFFFBFF | ||
280 | #define S_000330_D1VGA_OVERSCAN_COLOR_EN(x) (((x) & 0x1) << 16) | ||
281 | #define G_000330_D1VGA_OVERSCAN_COLOR_EN(x) (((x) >> 16) & 0x1) | ||
282 | #define C_000330_D1VGA_OVERSCAN_COLOR_EN 0xFFFEFFFF | ||
283 | #define S_000330_D1VGA_ROTATE(x) (((x) & 0x3) << 24) | ||
284 | #define G_000330_D1VGA_ROTATE(x) (((x) >> 24) & 0x3) | ||
285 | #define C_000330_D1VGA_ROTATE 0xFCFFFFFF | ||
286 | #define R_000338_D2VGA_CONTROL 0x000338 | ||
287 | #define S_000338_D2VGA_MODE_ENABLE(x) (((x) & 0x1) << 0) | ||
288 | #define G_000338_D2VGA_MODE_ENABLE(x) (((x) >> 0) & 0x1) | ||
289 | #define C_000338_D2VGA_MODE_ENABLE 0xFFFFFFFE | ||
290 | #define S_000338_D2VGA_TIMING_SELECT(x) (((x) & 0x1) << 8) | ||
291 | #define G_000338_D2VGA_TIMING_SELECT(x) (((x) >> 8) & 0x1) | ||
292 | #define C_000338_D2VGA_TIMING_SELECT 0xFFFFFEFF | ||
293 | #define S_000338_D2VGA_SYNC_POLARITY_SELECT(x) (((x) & 0x1) << 9) | ||
294 | #define G_000338_D2VGA_SYNC_POLARITY_SELECT(x) (((x) >> 9) & 0x1) | ||
295 | #define C_000338_D2VGA_SYNC_POLARITY_SELECT 0xFFFFFDFF | ||
296 | #define S_000338_D2VGA_OVERSCAN_TIMING_SELECT(x) (((x) & 0x1) << 10) | ||
297 | #define G_000338_D2VGA_OVERSCAN_TIMING_SELECT(x) (((x) >> 10) & 0x1) | ||
298 | #define C_000338_D2VGA_OVERSCAN_TIMING_SELECT 0xFFFFFBFF | ||
299 | #define S_000338_D2VGA_OVERSCAN_COLOR_EN(x) (((x) & 0x1) << 16) | ||
300 | #define G_000338_D2VGA_OVERSCAN_COLOR_EN(x) (((x) >> 16) & 0x1) | ||
301 | #define C_000338_D2VGA_OVERSCAN_COLOR_EN 0xFFFEFFFF | ||
302 | #define S_000338_D2VGA_ROTATE(x) (((x) & 0x3) << 24) | ||
303 | #define G_000338_D2VGA_ROTATE(x) (((x) >> 24) & 0x3) | ||
304 | #define C_000338_D2VGA_ROTATE 0xFCFFFFFF | ||
305 | #define R_0007C0_CP_STAT 0x0007C0 | ||
306 | #define S_0007C0_MRU_BUSY(x) (((x) & 0x1) << 0) | ||
307 | #define G_0007C0_MRU_BUSY(x) (((x) >> 0) & 0x1) | ||
308 | #define C_0007C0_MRU_BUSY 0xFFFFFFFE | ||
309 | #define S_0007C0_MWU_BUSY(x) (((x) & 0x1) << 1) | ||
310 | #define G_0007C0_MWU_BUSY(x) (((x) >> 1) & 0x1) | ||
311 | #define C_0007C0_MWU_BUSY 0xFFFFFFFD | ||
312 | #define S_0007C0_RSIU_BUSY(x) (((x) & 0x1) << 2) | ||
313 | #define G_0007C0_RSIU_BUSY(x) (((x) >> 2) & 0x1) | ||
314 | #define C_0007C0_RSIU_BUSY 0xFFFFFFFB | ||
315 | #define S_0007C0_RCIU_BUSY(x) (((x) & 0x1) << 3) | ||
316 | #define G_0007C0_RCIU_BUSY(x) (((x) >> 3) & 0x1) | ||
317 | #define C_0007C0_RCIU_BUSY 0xFFFFFFF7 | ||
318 | #define S_0007C0_CSF_PRIMARY_BUSY(x) (((x) & 0x1) << 9) | ||
319 | #define G_0007C0_CSF_PRIMARY_BUSY(x) (((x) >> 9) & 0x1) | ||
320 | #define C_0007C0_CSF_PRIMARY_BUSY 0xFFFFFDFF | ||
321 | #define S_0007C0_CSF_INDIRECT_BUSY(x) (((x) & 0x1) << 10) | ||
322 | #define G_0007C0_CSF_INDIRECT_BUSY(x) (((x) >> 10) & 0x1) | ||
323 | #define C_0007C0_CSF_INDIRECT_BUSY 0xFFFFFBFF | ||
324 | #define S_0007C0_CSQ_PRIMARY_BUSY(x) (((x) & 0x1) << 11) | ||
325 | #define G_0007C0_CSQ_PRIMARY_BUSY(x) (((x) >> 11) & 0x1) | ||
326 | #define C_0007C0_CSQ_PRIMARY_BUSY 0xFFFFF7FF | ||
327 | #define S_0007C0_CSQ_INDIRECT_BUSY(x) (((x) & 0x1) << 12) | ||
328 | #define G_0007C0_CSQ_INDIRECT_BUSY(x) (((x) >> 12) & 0x1) | ||
329 | #define C_0007C0_CSQ_INDIRECT_BUSY 0xFFFFEFFF | ||
330 | #define S_0007C0_CSI_BUSY(x) (((x) & 0x1) << 13) | ||
331 | #define G_0007C0_CSI_BUSY(x) (((x) >> 13) & 0x1) | ||
332 | #define C_0007C0_CSI_BUSY 0xFFFFDFFF | ||
333 | #define S_0007C0_CSF_INDIRECT2_BUSY(x) (((x) & 0x1) << 14) | ||
334 | #define G_0007C0_CSF_INDIRECT2_BUSY(x) (((x) >> 14) & 0x1) | ||
335 | #define C_0007C0_CSF_INDIRECT2_BUSY 0xFFFFBFFF | ||
336 | #define S_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) & 0x1) << 15) | ||
337 | #define G_0007C0_CSQ_INDIRECT2_BUSY(x) (((x) >> 15) & 0x1) | ||
338 | #define C_0007C0_CSQ_INDIRECT2_BUSY 0xFFFF7FFF | ||
339 | #define S_0007C0_GUIDMA_BUSY(x) (((x) & 0x1) << 28) | ||
340 | #define G_0007C0_GUIDMA_BUSY(x) (((x) >> 28) & 0x1) | ||
341 | #define C_0007C0_GUIDMA_BUSY 0xEFFFFFFF | ||
342 | #define S_0007C0_VIDDMA_BUSY(x) (((x) & 0x1) << 29) | ||
343 | #define G_0007C0_VIDDMA_BUSY(x) (((x) >> 29) & 0x1) | ||
344 | #define C_0007C0_VIDDMA_BUSY 0xDFFFFFFF | ||
345 | #define S_0007C0_CMDSTRM_BUSY(x) (((x) & 0x1) << 30) | ||
346 | #define G_0007C0_CMDSTRM_BUSY(x) (((x) >> 30) & 0x1) | ||
347 | #define C_0007C0_CMDSTRM_BUSY 0xBFFFFFFF | ||
348 | #define S_0007C0_CP_BUSY(x) (((x) & 0x1) << 31) | ||
349 | #define G_0007C0_CP_BUSY(x) (((x) >> 31) & 0x1) | ||
350 | #define C_0007C0_CP_BUSY 0x7FFFFFFF | ||
351 | #define R_000E40_RBBM_STATUS 0x000E40 | ||
352 | #define S_000E40_CMDFIFO_AVAIL(x) (((x) & 0x7F) << 0) | ||
353 | #define G_000E40_CMDFIFO_AVAIL(x) (((x) >> 0) & 0x7F) | ||
354 | #define C_000E40_CMDFIFO_AVAIL 0xFFFFFF80 | ||
355 | #define S_000E40_HIRQ_ON_RBB(x) (((x) & 0x1) << 8) | ||
356 | #define G_000E40_HIRQ_ON_RBB(x) (((x) >> 8) & 0x1) | ||
357 | #define C_000E40_HIRQ_ON_RBB 0xFFFFFEFF | ||
358 | #define S_000E40_CPRQ_ON_RBB(x) (((x) & 0x1) << 9) | ||
359 | #define G_000E40_CPRQ_ON_RBB(x) (((x) >> 9) & 0x1) | ||
360 | #define C_000E40_CPRQ_ON_RBB 0xFFFFFDFF | ||
361 | #define S_000E40_CFRQ_ON_RBB(x) (((x) & 0x1) << 10) | ||
362 | #define G_000E40_CFRQ_ON_RBB(x) (((x) >> 10) & 0x1) | ||
363 | #define C_000E40_CFRQ_ON_RBB 0xFFFFFBFF | ||
364 | #define S_000E40_HIRQ_IN_RTBUF(x) (((x) & 0x1) << 11) | ||
365 | #define G_000E40_HIRQ_IN_RTBUF(x) (((x) >> 11) & 0x1) | ||
366 | #define C_000E40_HIRQ_IN_RTBUF 0xFFFFF7FF | ||
367 | #define S_000E40_CPRQ_IN_RTBUF(x) (((x) & 0x1) << 12) | ||
368 | #define G_000E40_CPRQ_IN_RTBUF(x) (((x) >> 12) & 0x1) | ||
369 | #define C_000E40_CPRQ_IN_RTBUF 0xFFFFEFFF | ||
370 | #define S_000E40_CFRQ_IN_RTBUF(x) (((x) & 0x1) << 13) | ||
371 | #define G_000E40_CFRQ_IN_RTBUF(x) (((x) >> 13) & 0x1) | ||
372 | #define C_000E40_CFRQ_IN_RTBUF 0xFFFFDFFF | ||
373 | #define S_000E40_CF_PIPE_BUSY(x) (((x) & 0x1) << 14) | ||
374 | #define G_000E40_CF_PIPE_BUSY(x) (((x) >> 14) & 0x1) | ||
375 | #define C_000E40_CF_PIPE_BUSY 0xFFFFBFFF | ||
376 | #define S_000E40_ENG_EV_BUSY(x) (((x) & 0x1) << 15) | ||
377 | #define G_000E40_ENG_EV_BUSY(x) (((x) >> 15) & 0x1) | ||
378 | #define C_000E40_ENG_EV_BUSY 0xFFFF7FFF | ||
379 | #define S_000E40_CP_CMDSTRM_BUSY(x) (((x) & 0x1) << 16) | ||
380 | #define G_000E40_CP_CMDSTRM_BUSY(x) (((x) >> 16) & 0x1) | ||
381 | #define C_000E40_CP_CMDSTRM_BUSY 0xFFFEFFFF | ||
382 | #define S_000E40_E2_BUSY(x) (((x) & 0x1) << 17) | ||
383 | #define G_000E40_E2_BUSY(x) (((x) >> 17) & 0x1) | ||
384 | #define C_000E40_E2_BUSY 0xFFFDFFFF | ||
385 | #define S_000E40_RB2D_BUSY(x) (((x) & 0x1) << 18) | ||
386 | #define G_000E40_RB2D_BUSY(x) (((x) >> 18) & 0x1) | ||
387 | #define C_000E40_RB2D_BUSY 0xFFFBFFFF | ||
388 | #define S_000E40_RB3D_BUSY(x) (((x) & 0x1) << 19) | ||
389 | #define G_000E40_RB3D_BUSY(x) (((x) >> 19) & 0x1) | ||
390 | #define C_000E40_RB3D_BUSY 0xFFF7FFFF | ||
391 | #define S_000E40_VAP_BUSY(x) (((x) & 0x1) << 20) | ||
392 | #define G_000E40_VAP_BUSY(x) (((x) >> 20) & 0x1) | ||
393 | #define C_000E40_VAP_BUSY 0xFFEFFFFF | ||
394 | #define S_000E40_RE_BUSY(x) (((x) & 0x1) << 21) | ||
395 | #define G_000E40_RE_BUSY(x) (((x) >> 21) & 0x1) | ||
396 | #define C_000E40_RE_BUSY 0xFFDFFFFF | ||
397 | #define S_000E40_TAM_BUSY(x) (((x) & 0x1) << 22) | ||
398 | #define G_000E40_TAM_BUSY(x) (((x) >> 22) & 0x1) | ||
399 | #define C_000E40_TAM_BUSY 0xFFBFFFFF | ||
400 | #define S_000E40_TDM_BUSY(x) (((x) & 0x1) << 23) | ||
401 | #define G_000E40_TDM_BUSY(x) (((x) >> 23) & 0x1) | ||
402 | #define C_000E40_TDM_BUSY 0xFF7FFFFF | ||
403 | #define S_000E40_PB_BUSY(x) (((x) & 0x1) << 24) | ||
404 | #define G_000E40_PB_BUSY(x) (((x) >> 24) & 0x1) | ||
405 | #define C_000E40_PB_BUSY 0xFEFFFFFF | ||
406 | #define S_000E40_TIM_BUSY(x) (((x) & 0x1) << 25) | ||
407 | #define G_000E40_TIM_BUSY(x) (((x) >> 25) & 0x1) | ||
408 | #define C_000E40_TIM_BUSY 0xFDFFFFFF | ||
409 | #define S_000E40_GA_BUSY(x) (((x) & 0x1) << 26) | ||
410 | #define G_000E40_GA_BUSY(x) (((x) >> 26) & 0x1) | ||
411 | #define C_000E40_GA_BUSY 0xFBFFFFFF | ||
412 | #define S_000E40_CBA2D_BUSY(x) (((x) & 0x1) << 27) | ||
413 | #define G_000E40_CBA2D_BUSY(x) (((x) >> 27) & 0x1) | ||
414 | #define C_000E40_CBA2D_BUSY 0xF7FFFFFF | ||
415 | #define S_000E40_RBBM_HIBUSY(x) (((x) & 0x1) << 28) | ||
416 | #define G_000E40_RBBM_HIBUSY(x) (((x) >> 28) & 0x1) | ||
417 | #define C_000E40_RBBM_HIBUSY 0xEFFFFFFF | ||
418 | #define S_000E40_SKID_CFBUSY(x) (((x) & 0x1) << 29) | ||
419 | #define G_000E40_SKID_CFBUSY(x) (((x) >> 29) & 0x1) | ||
420 | #define C_000E40_SKID_CFBUSY 0xDFFFFFFF | ||
421 | #define S_000E40_VAP_VF_BUSY(x) (((x) & 0x1) << 30) | ||
422 | #define G_000E40_VAP_VF_BUSY(x) (((x) >> 30) & 0x1) | ||
423 | #define C_000E40_VAP_VF_BUSY 0xBFFFFFFF | ||
424 | #define S_000E40_GUI_ACTIVE(x) (((x) & 0x1) << 31) | ||
425 | #define G_000E40_GUI_ACTIVE(x) (((x) >> 31) & 0x1) | ||
426 | #define C_000E40_GUI_ACTIVE 0x7FFFFFFF | ||
427 | #define R_006080_D1CRTC_CONTROL 0x006080 | ||
428 | #define S_006080_D1CRTC_MASTER_EN(x) (((x) & 0x1) << 0) | ||
429 | #define G_006080_D1CRTC_MASTER_EN(x) (((x) >> 0) & 0x1) | ||
430 | #define C_006080_D1CRTC_MASTER_EN 0xFFFFFFFE | ||
431 | #define S_006080_D1CRTC_SYNC_RESET_SEL(x) (((x) & 0x1) << 4) | ||
432 | #define G_006080_D1CRTC_SYNC_RESET_SEL(x) (((x) >> 4) & 0x1) | ||
433 | #define C_006080_D1CRTC_SYNC_RESET_SEL 0xFFFFFFEF | ||
434 | #define S_006080_D1CRTC_DISABLE_POINT_CNTL(x) (((x) & 0x3) << 8) | ||
435 | #define G_006080_D1CRTC_DISABLE_POINT_CNTL(x) (((x) >> 8) & 0x3) | ||
436 | #define C_006080_D1CRTC_DISABLE_POINT_CNTL 0xFFFFFCFF | ||
437 | #define S_006080_D1CRTC_CURRENT_MASTER_EN_STATE(x) (((x) & 0x1) << 16) | ||
438 | #define G_006080_D1CRTC_CURRENT_MASTER_EN_STATE(x) (((x) >> 16) & 0x1) | ||
439 | #define C_006080_D1CRTC_CURRENT_MASTER_EN_STATE 0xFFFEFFFF | ||
440 | #define S_006080_D1CRTC_DISP_READ_REQUEST_DISABLE(x) (((x) & 0x1) << 24) | ||
441 | #define G_006080_D1CRTC_DISP_READ_REQUEST_DISABLE(x) (((x) >> 24) & 0x1) | ||
442 | #define C_006080_D1CRTC_DISP_READ_REQUEST_DISABLE 0xFEFFFFFF | ||
443 | #define R_0060E8_D1CRTC_UPDATE_LOCK 0x0060E8 | ||
444 | #define S_0060E8_D1CRTC_UPDATE_LOCK(x) (((x) & 0x1) << 0) | ||
445 | #define G_0060E8_D1CRTC_UPDATE_LOCK(x) (((x) >> 0) & 0x1) | ||
446 | #define C_0060E8_D1CRTC_UPDATE_LOCK 0xFFFFFFFE | ||
447 | #define R_006110_D1GRPH_PRIMARY_SURFACE_ADDRESS 0x006110 | ||
448 | #define S_006110_D1GRPH_PRIMARY_SURFACE_ADDRESS(x) (((x) & 0xFFFFFFFF) << 0) | ||
449 | #define G_006110_D1GRPH_PRIMARY_SURFACE_ADDRESS(x) (((x) >> 0) & 0xFFFFFFFF) | ||
450 | #define C_006110_D1GRPH_PRIMARY_SURFACE_ADDRESS 0x00000000 | ||
451 | #define R_006118_D1GRPH_SECONDARY_SURFACE_ADDRESS 0x006118 | ||
452 | #define S_006118_D1GRPH_SECONDARY_SURFACE_ADDRESS(x) (((x) & 0xFFFFFFFF) << 0) | ||
453 | #define G_006118_D1GRPH_SECONDARY_SURFACE_ADDRESS(x) (((x) >> 0) & 0xFFFFFFFF) | ||
454 | #define C_006118_D1GRPH_SECONDARY_SURFACE_ADDRESS 0x00000000 | ||
455 | #define R_006880_D2CRTC_CONTROL 0x006880 | ||
456 | #define S_006880_D2CRTC_MASTER_EN(x) (((x) & 0x1) << 0) | ||
457 | #define G_006880_D2CRTC_MASTER_EN(x) (((x) >> 0) & 0x1) | ||
458 | #define C_006880_D2CRTC_MASTER_EN 0xFFFFFFFE | ||
459 | #define S_006880_D2CRTC_SYNC_RESET_SEL(x) (((x) & 0x1) << 4) | ||
460 | #define G_006880_D2CRTC_SYNC_RESET_SEL(x) (((x) >> 4) & 0x1) | ||
461 | #define C_006880_D2CRTC_SYNC_RESET_SEL 0xFFFFFFEF | ||
462 | #define S_006880_D2CRTC_DISABLE_POINT_CNTL(x) (((x) & 0x3) << 8) | ||
463 | #define G_006880_D2CRTC_DISABLE_POINT_CNTL(x) (((x) >> 8) & 0x3) | ||
464 | #define C_006880_D2CRTC_DISABLE_POINT_CNTL 0xFFFFFCFF | ||
465 | #define S_006880_D2CRTC_CURRENT_MASTER_EN_STATE(x) (((x) & 0x1) << 16) | ||
466 | #define G_006880_D2CRTC_CURRENT_MASTER_EN_STATE(x) (((x) >> 16) & 0x1) | ||
467 | #define C_006880_D2CRTC_CURRENT_MASTER_EN_STATE 0xFFFEFFFF | ||
468 | #define S_006880_D2CRTC_DISP_READ_REQUEST_DISABLE(x) (((x) & 0x1) << 24) | ||
469 | #define G_006880_D2CRTC_DISP_READ_REQUEST_DISABLE(x) (((x) >> 24) & 0x1) | ||
470 | #define C_006880_D2CRTC_DISP_READ_REQUEST_DISABLE 0xFEFFFFFF | ||
471 | #define R_0068E8_D2CRTC_UPDATE_LOCK 0x0068E8 | ||
472 | #define S_0068E8_D2CRTC_UPDATE_LOCK(x) (((x) & 0x1) << 0) | ||
473 | #define G_0068E8_D2CRTC_UPDATE_LOCK(x) (((x) >> 0) & 0x1) | ||
474 | #define C_0068E8_D2CRTC_UPDATE_LOCK 0xFFFFFFFE | ||
475 | #define R_006910_D2GRPH_PRIMARY_SURFACE_ADDRESS 0x006910 | ||
476 | #define S_006910_D2GRPH_PRIMARY_SURFACE_ADDRESS(x) (((x) & 0xFFFFFFFF) << 0) | ||
477 | #define G_006910_D2GRPH_PRIMARY_SURFACE_ADDRESS(x) (((x) >> 0) & 0xFFFFFFFF) | ||
478 | #define C_006910_D2GRPH_PRIMARY_SURFACE_ADDRESS 0x00000000 | ||
479 | #define R_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS 0x006918 | ||
480 | #define S_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS(x) (((x) & 0xFFFFFFFF) << 0) | ||
481 | #define G_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS(x) (((x) >> 0) & 0xFFFFFFFF) | ||
482 | #define C_006918_D2GRPH_SECONDARY_SURFACE_ADDRESS 0x00000000 | ||
483 | |||
484 | |||
485 | #define R_000001_MC_FB_LOCATION 0x000001 | ||
486 | #define S_000001_MC_FB_START(x) (((x) & 0xFFFF) << 0) | ||
487 | #define G_000001_MC_FB_START(x) (((x) >> 0) & 0xFFFF) | ||
488 | #define C_000001_MC_FB_START 0xFFFF0000 | ||
489 | #define S_000001_MC_FB_TOP(x) (((x) & 0xFFFF) << 16) | ||
490 | #define G_000001_MC_FB_TOP(x) (((x) >> 16) & 0xFFFF) | ||
491 | #define C_000001_MC_FB_TOP 0x0000FFFF | ||
492 | #define R_000002_MC_AGP_LOCATION 0x000002 | ||
493 | #define S_000002_MC_AGP_START(x) (((x) & 0xFFFF) << 0) | ||
494 | #define G_000002_MC_AGP_START(x) (((x) >> 0) & 0xFFFF) | ||
495 | #define C_000002_MC_AGP_START 0xFFFF0000 | ||
496 | #define S_000002_MC_AGP_TOP(x) (((x) & 0xFFFF) << 16) | ||
497 | #define G_000002_MC_AGP_TOP(x) (((x) >> 16) & 0xFFFF) | ||
498 | #define C_000002_MC_AGP_TOP 0x0000FFFF | ||
499 | #define R_000003_MC_AGP_BASE 0x000003 | ||
500 | #define S_000003_AGP_BASE_ADDR(x) (((x) & 0xFFFFFFFF) << 0) | ||
501 | #define G_000003_AGP_BASE_ADDR(x) (((x) >> 0) & 0xFFFFFFFF) | ||
502 | #define C_000003_AGP_BASE_ADDR 0x00000000 | ||
503 | #define R_000004_MC_AGP_BASE_2 0x000004 | ||
504 | #define S_000004_AGP_BASE_ADDR_2(x) (((x) & 0xF) << 0) | ||
505 | #define G_000004_AGP_BASE_ADDR_2(x) (((x) >> 0) & 0xF) | ||
506 | #define C_000004_AGP_BASE_ADDR_2 0xFFFFFFF0 | ||
220 | 507 | ||
508 | |||
509 | #define R_00000F_CP_DYN_CNTL 0x00000F | ||
510 | #define S_00000F_CP_FORCEON(x) (((x) & 0x1) << 0) | ||
511 | #define G_00000F_CP_FORCEON(x) (((x) >> 0) & 0x1) | ||
512 | #define C_00000F_CP_FORCEON 0xFFFFFFFE | ||
513 | #define S_00000F_CP_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 1) | ||
514 | #define G_00000F_CP_MAX_DYN_STOP_LAT(x) (((x) >> 1) & 0x1) | ||
515 | #define C_00000F_CP_MAX_DYN_STOP_LAT 0xFFFFFFFD | ||
516 | #define S_00000F_CP_CLOCK_STATUS(x) (((x) & 0x1) << 2) | ||
517 | #define G_00000F_CP_CLOCK_STATUS(x) (((x) >> 2) & 0x1) | ||
518 | #define C_00000F_CP_CLOCK_STATUS 0xFFFFFFFB | ||
519 | #define S_00000F_CP_PROG_SHUTOFF(x) (((x) & 0x1) << 3) | ||
520 | #define G_00000F_CP_PROG_SHUTOFF(x) (((x) >> 3) & 0x1) | ||
521 | #define C_00000F_CP_PROG_SHUTOFF 0xFFFFFFF7 | ||
522 | #define S_00000F_CP_PROG_DELAY_VALUE(x) (((x) & 0xFF) << 4) | ||
523 | #define G_00000F_CP_PROG_DELAY_VALUE(x) (((x) >> 4) & 0xFF) | ||
524 | #define C_00000F_CP_PROG_DELAY_VALUE 0xFFFFF00F | ||
525 | #define S_00000F_CP_LOWER_POWER_IDLE(x) (((x) & 0xFF) << 12) | ||
526 | #define G_00000F_CP_LOWER_POWER_IDLE(x) (((x) >> 12) & 0xFF) | ||
527 | #define C_00000F_CP_LOWER_POWER_IDLE 0xFFF00FFF | ||
528 | #define S_00000F_CP_LOWER_POWER_IGNORE(x) (((x) & 0x1) << 20) | ||
529 | #define G_00000F_CP_LOWER_POWER_IGNORE(x) (((x) >> 20) & 0x1) | ||
530 | #define C_00000F_CP_LOWER_POWER_IGNORE 0xFFEFFFFF | ||
531 | #define S_00000F_CP_NORMAL_POWER_IGNORE(x) (((x) & 0x1) << 21) | ||
532 | #define G_00000F_CP_NORMAL_POWER_IGNORE(x) (((x) >> 21) & 0x1) | ||
533 | #define C_00000F_CP_NORMAL_POWER_IGNORE 0xFFDFFFFF | ||
534 | #define S_00000F_SPARE(x) (((x) & 0x3) << 22) | ||
535 | #define G_00000F_SPARE(x) (((x) >> 22) & 0x3) | ||
536 | #define C_00000F_SPARE 0xFF3FFFFF | ||
537 | #define S_00000F_CP_NORMAL_POWER_BUSY(x) (((x) & 0xFF) << 24) | ||
538 | #define G_00000F_CP_NORMAL_POWER_BUSY(x) (((x) >> 24) & 0xFF) | ||
539 | #define C_00000F_CP_NORMAL_POWER_BUSY 0x00FFFFFF | ||
540 | #define R_000011_E2_DYN_CNTL 0x000011 | ||
541 | #define S_000011_E2_FORCEON(x) (((x) & 0x1) << 0) | ||
542 | #define G_000011_E2_FORCEON(x) (((x) >> 0) & 0x1) | ||
543 | #define C_000011_E2_FORCEON 0xFFFFFFFE | ||
544 | #define S_000011_E2_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 1) | ||
545 | #define G_000011_E2_MAX_DYN_STOP_LAT(x) (((x) >> 1) & 0x1) | ||
546 | #define C_000011_E2_MAX_DYN_STOP_LAT 0xFFFFFFFD | ||
547 | #define S_000011_E2_CLOCK_STATUS(x) (((x) & 0x1) << 2) | ||
548 | #define G_000011_E2_CLOCK_STATUS(x) (((x) >> 2) & 0x1) | ||
549 | #define C_000011_E2_CLOCK_STATUS 0xFFFFFFFB | ||
550 | #define S_000011_E2_PROG_SHUTOFF(x) (((x) & 0x1) << 3) | ||
551 | #define G_000011_E2_PROG_SHUTOFF(x) (((x) >> 3) & 0x1) | ||
552 | #define C_000011_E2_PROG_SHUTOFF 0xFFFFFFF7 | ||
553 | #define S_000011_E2_PROG_DELAY_VALUE(x) (((x) & 0xFF) << 4) | ||
554 | #define G_000011_E2_PROG_DELAY_VALUE(x) (((x) >> 4) & 0xFF) | ||
555 | #define C_000011_E2_PROG_DELAY_VALUE 0xFFFFF00F | ||
556 | #define S_000011_E2_LOWER_POWER_IDLE(x) (((x) & 0xFF) << 12) | ||
557 | #define G_000011_E2_LOWER_POWER_IDLE(x) (((x) >> 12) & 0xFF) | ||
558 | #define C_000011_E2_LOWER_POWER_IDLE 0xFFF00FFF | ||
559 | #define S_000011_E2_LOWER_POWER_IGNORE(x) (((x) & 0x1) << 20) | ||
560 | #define G_000011_E2_LOWER_POWER_IGNORE(x) (((x) >> 20) & 0x1) | ||
561 | #define C_000011_E2_LOWER_POWER_IGNORE 0xFFEFFFFF | ||
562 | #define S_000011_E2_NORMAL_POWER_IGNORE(x) (((x) & 0x1) << 21) | ||
563 | #define G_000011_E2_NORMAL_POWER_IGNORE(x) (((x) >> 21) & 0x1) | ||
564 | #define C_000011_E2_NORMAL_POWER_IGNORE 0xFFDFFFFF | ||
565 | #define S_000011_SPARE(x) (((x) & 0x3) << 22) | ||
566 | #define G_000011_SPARE(x) (((x) >> 22) & 0x3) | ||
567 | #define C_000011_SPARE 0xFF3FFFFF | ||
568 | #define S_000011_E2_NORMAL_POWER_BUSY(x) (((x) & 0xFF) << 24) | ||
569 | #define G_000011_E2_NORMAL_POWER_BUSY(x) (((x) >> 24) & 0xFF) | ||
570 | #define C_000011_E2_NORMAL_POWER_BUSY 0x00FFFFFF | ||
571 | #define R_000013_IDCT_DYN_CNTL 0x000013 | ||
572 | #define S_000013_IDCT_FORCEON(x) (((x) & 0x1) << 0) | ||
573 | #define G_000013_IDCT_FORCEON(x) (((x) >> 0) & 0x1) | ||
574 | #define C_000013_IDCT_FORCEON 0xFFFFFFFE | ||
575 | #define S_000013_IDCT_MAX_DYN_STOP_LAT(x) (((x) & 0x1) << 1) | ||
576 | #define G_000013_IDCT_MAX_DYN_STOP_LAT(x) (((x) >> 1) & 0x1) | ||
577 | #define C_000013_IDCT_MAX_DYN_STOP_LAT 0xFFFFFFFD | ||
578 | #define S_000013_IDCT_CLOCK_STATUS(x) (((x) & 0x1) << 2) | ||
579 | #define G_000013_IDCT_CLOCK_STATUS(x) (((x) >> 2) & 0x1) | ||
580 | #define C_000013_IDCT_CLOCK_STATUS 0xFFFFFFFB | ||
581 | #define S_000013_IDCT_PROG_SHUTOFF(x) (((x) & 0x1) << 3) | ||
582 | #define G_000013_IDCT_PROG_SHUTOFF(x) (((x) >> 3) & 0x1) | ||
583 | #define C_000013_IDCT_PROG_SHUTOFF 0xFFFFFFF7 | ||
584 | #define S_000013_IDCT_PROG_DELAY_VALUE(x) (((x) & 0xFF) << 4) | ||
585 | #define G_000013_IDCT_PROG_DELAY_VALUE(x) (((x) >> 4) & 0xFF) | ||
586 | #define C_000013_IDCT_PROG_DELAY_VALUE 0xFFFFF00F | ||
587 | #define S_000013_IDCT_LOWER_POWER_IDLE(x) (((x) & 0xFF) << 12) | ||
588 | #define G_000013_IDCT_LOWER_POWER_IDLE(x) (((x) >> 12) & 0xFF) | ||
589 | #define C_000013_IDCT_LOWER_POWER_IDLE 0xFFF00FFF | ||
590 | #define S_000013_IDCT_LOWER_POWER_IGNORE(x) (((x) & 0x1) << 20) | ||
591 | #define G_000013_IDCT_LOWER_POWER_IGNORE(x) (((x) >> 20) & 0x1) | ||
592 | #define C_000013_IDCT_LOWER_POWER_IGNORE 0xFFEFFFFF | ||
593 | #define S_000013_IDCT_NORMAL_POWER_IGNORE(x) (((x) & 0x1) << 21) | ||
594 | #define G_000013_IDCT_NORMAL_POWER_IGNORE(x) (((x) >> 21) & 0x1) | ||
595 | #define C_000013_IDCT_NORMAL_POWER_IGNORE 0xFFDFFFFF | ||
596 | #define S_000013_SPARE(x) (((x) & 0x3) << 22) | ||
597 | #define G_000013_SPARE(x) (((x) >> 22) & 0x3) | ||
598 | #define C_000013_SPARE 0xFF3FFFFF | ||
599 | #define S_000013_IDCT_NORMAL_POWER_BUSY(x) (((x) & 0xFF) << 24) | ||
600 | #define G_000013_IDCT_NORMAL_POWER_BUSY(x) (((x) >> 24) & 0xFF) | ||
601 | #define C_000013_IDCT_NORMAL_POWER_BUSY 0x00FFFFFF | ||
602 | |||
603 | #endif | ||
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index b574c73a510..595ac638039 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -31,8 +31,8 @@ | |||
31 | #include "radeon.h" | 31 | #include "radeon.h" |
32 | #include "radeon_drm.h" | 32 | #include "radeon_drm.h" |
33 | #include "rv770d.h" | 33 | #include "rv770d.h" |
34 | #include "avivod.h" | ||
35 | #include "atom.h" | 34 | #include "atom.h" |
35 | #include "avivod.h" | ||
36 | 36 | ||
37 | #define R700_PFP_UCODE_SIZE 848 | 37 | #define R700_PFP_UCODE_SIZE 848 |
38 | #define R700_PM4_UCODE_SIZE 1360 | 38 | #define R700_PM4_UCODE_SIZE 1360 |
@@ -75,7 +75,7 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev) | |||
75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | 75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); |
76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | 76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); |
77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); | 77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); |
78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); |
79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); | 79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); |
80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | | 80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | |
81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | 81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); |
@@ -126,17 +126,36 @@ void rv770_pcie_gart_fini(struct radeon_device *rdev) | |||
126 | } | 126 | } |
127 | 127 | ||
128 | 128 | ||
129 | /* | 129 | void rv770_agp_enable(struct radeon_device *rdev) |
130 | * MC | 130 | { |
131 | */ | 131 | u32 tmp; |
132 | static void rv770_mc_resume(struct radeon_device *rdev) | 132 | int i; |
133 | |||
134 | /* Setup L2 cache */ | ||
135 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | | ||
136 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | | ||
137 | EFFECTIVE_L2_QUEUE_SIZE(7)); | ||
138 | WREG32(VM_L2_CNTL2, 0); | ||
139 | WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); | ||
140 | /* Setup TLB control */ | ||
141 | tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | | ||
142 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | ||
143 | SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | | ||
144 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); | ||
145 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | ||
146 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | ||
147 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | ||
148 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); | ||
149 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | ||
150 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | ||
151 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | ||
152 | for (i = 0; i < 7; i++) | ||
153 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | ||
154 | } | ||
155 | |||
156 | static void rv770_mc_program(struct radeon_device *rdev) | ||
133 | { | 157 | { |
134 | u32 d1vga_control, d2vga_control; | 158 | struct rv515_mc_save save; |
135 | u32 vga_render_control, vga_hdp_control; | ||
136 | u32 d1crtc_control, d2crtc_control; | ||
137 | u32 new_d1grph_primary, new_d1grph_secondary; | ||
138 | u32 new_d2grph_primary, new_d2grph_secondary; | ||
139 | u64 old_vram_start; | ||
140 | u32 tmp; | 159 | u32 tmp; |
141 | int i, j; | 160 | int i, j; |
142 | 161 | ||
@@ -150,53 +169,42 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
150 | } | 169 | } |
151 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); | 170 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); |
152 | 171 | ||
153 | d1vga_control = RREG32(D1VGA_CONTROL); | 172 | rv515_mc_stop(rdev, &save); |
154 | d2vga_control = RREG32(D2VGA_CONTROL); | ||
155 | vga_render_control = RREG32(VGA_RENDER_CONTROL); | ||
156 | vga_hdp_control = RREG32(VGA_HDP_CONTROL); | ||
157 | d1crtc_control = RREG32(D1CRTC_CONTROL); | ||
158 | d2crtc_control = RREG32(D2CRTC_CONTROL); | ||
159 | old_vram_start = (u64)(RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; | ||
160 | new_d1grph_primary = RREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS); | ||
161 | new_d1grph_secondary = RREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS); | ||
162 | new_d1grph_primary += rdev->mc.vram_start - old_vram_start; | ||
163 | new_d1grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
164 | new_d2grph_primary = RREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS); | ||
165 | new_d2grph_secondary = RREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS); | ||
166 | new_d2grph_primary += rdev->mc.vram_start - old_vram_start; | ||
167 | new_d2grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
168 | |||
169 | /* Stop all video */ | ||
170 | WREG32(D1VGA_CONTROL, 0); | ||
171 | WREG32(D2VGA_CONTROL, 0); | ||
172 | WREG32(VGA_RENDER_CONTROL, 0); | ||
173 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
174 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
175 | WREG32(D1CRTC_CONTROL, 0); | ||
176 | WREG32(D2CRTC_CONTROL, 0); | ||
177 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
178 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
179 | |||
180 | mdelay(1); | ||
181 | if (r600_mc_wait_for_idle(rdev)) { | 173 | if (r600_mc_wait_for_idle(rdev)) { |
182 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 174 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
183 | } | 175 | } |
184 | |||
185 | /* Lockout access through VGA aperture*/ | 176 | /* Lockout access through VGA aperture*/ |
186 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 177 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
187 | |||
188 | /* Update configuration */ | 178 | /* Update configuration */ |
189 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 179 | if (rdev->flags & RADEON_IS_AGP) { |
190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 180 | if (rdev->mc.vram_start < rdev->mc.gtt_start) { |
181 | /* VRAM before AGP */ | ||
182 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
183 | rdev->mc.vram_start >> 12); | ||
184 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
185 | rdev->mc.gtt_end >> 12); | ||
186 | } else { | ||
187 | /* VRAM after AGP */ | ||
188 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
189 | rdev->mc.gtt_start >> 12); | ||
190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
191 | rdev->mc.vram_end >> 12); | ||
192 | } | ||
193 | } else { | ||
194 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
195 | rdev->mc.vram_start >> 12); | ||
196 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
197 | rdev->mc.vram_end >> 12); | ||
198 | } | ||
191 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 199 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
192 | tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16; | 200 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
193 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 201 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
194 | WREG32(MC_VM_FB_LOCATION, tmp); | 202 | WREG32(MC_VM_FB_LOCATION, tmp); |
195 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 203 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
196 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 204 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
197 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 205 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); |
198 | if (rdev->flags & RADEON_IS_AGP) { | 206 | if (rdev->flags & RADEON_IS_AGP) { |
199 | WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16); | 207 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
200 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 208 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
201 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); | 209 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); |
202 | } else { | 210 | } else { |
@@ -204,34 +212,13 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
204 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); | 212 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); |
205 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); | 213 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); |
206 | } | 214 | } |
207 | WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS, new_d1grph_primary); | ||
208 | WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS, new_d1grph_secondary); | ||
209 | WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS, new_d2grph_primary); | ||
210 | WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS, new_d2grph_secondary); | ||
211 | WREG32(VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); | ||
212 | |||
213 | /* Unlock host access */ | ||
214 | WREG32(VGA_HDP_CONTROL, vga_hdp_control); | ||
215 | |||
216 | mdelay(1); | ||
217 | if (r600_mc_wait_for_idle(rdev)) { | 215 | if (r600_mc_wait_for_idle(rdev)) { |
218 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 216 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
219 | } | 217 | } |
220 | 218 | rv515_mc_resume(rdev, &save); | |
221 | /* Restore video state */ | ||
222 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
223 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
224 | WREG32(D1CRTC_CONTROL, d1crtc_control); | ||
225 | WREG32(D2CRTC_CONTROL, d2crtc_control); | ||
226 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
227 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
228 | WREG32(D1VGA_CONTROL, d1vga_control); | ||
229 | WREG32(D2VGA_CONTROL, d2vga_control); | ||
230 | WREG32(VGA_RENDER_CONTROL, vga_render_control); | ||
231 | |||
232 | /* we need to own VRAM, so turn off the VGA renderer here | 219 | /* we need to own VRAM, so turn off the VGA renderer here |
233 | * to stop it overwriting our objects */ | 220 | * to stop it overwriting our objects */ |
234 | radeon_avivo_vga_render_disable(rdev); | 221 | rv515_vga_render_disable(rdev); |
235 | } | 222 | } |
236 | 223 | ||
237 | 224 | ||
@@ -801,6 +788,13 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
801 | /* Setup GPU memory space */ | 788 | /* Setup GPU memory space */ |
802 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); | 789 | rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); |
803 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); | 790 | rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); |
791 | |||
792 | if (rdev->mc.mc_vram_size > rdev->mc.aper_size) | ||
793 | rdev->mc.mc_vram_size = rdev->mc.aper_size; | ||
794 | |||
795 | if (rdev->mc.real_vram_size > rdev->mc.aper_size) | ||
796 | rdev->mc.real_vram_size = rdev->mc.aper_size; | ||
797 | |||
804 | if (rdev->flags & RADEON_IS_AGP) { | 798 | if (rdev->flags & RADEON_IS_AGP) { |
805 | r = radeon_agp_init(rdev); | 799 | r = radeon_agp_init(rdev); |
806 | if (r) | 800 | if (r) |
@@ -833,9 +827,9 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
833 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | 827 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; |
834 | } | 828 | } |
835 | rdev->mc.vram_start = rdev->mc.vram_location; | 829 | rdev->mc.vram_start = rdev->mc.vram_location; |
836 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 830 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
837 | rdev->mc.gtt_start = rdev->mc.gtt_location; | 831 | rdev->mc.gtt_start = rdev->mc.gtt_location; |
838 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size; | 832 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; |
839 | /* FIXME: we should enforce default clock in case GPU is not in | 833 | /* FIXME: we should enforce default clock in case GPU is not in |
840 | * default setup | 834 | * default setup |
841 | */ | 835 | */ |
@@ -854,11 +848,14 @@ static int rv770_startup(struct radeon_device *rdev) | |||
854 | { | 848 | { |
855 | int r; | 849 | int r; |
856 | 850 | ||
857 | radeon_gpu_reset(rdev); | 851 | rv770_mc_program(rdev); |
858 | rv770_mc_resume(rdev); | 852 | if (rdev->flags & RADEON_IS_AGP) { |
859 | r = rv770_pcie_gart_enable(rdev); | 853 | rv770_agp_enable(rdev); |
860 | if (r) | 854 | } else { |
861 | return r; | 855 | r = rv770_pcie_gart_enable(rdev); |
856 | if (r) | ||
857 | return r; | ||
858 | } | ||
862 | rv770_gpu_init(rdev); | 859 | rv770_gpu_init(rdev); |
863 | 860 | ||
864 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | 861 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, |
@@ -877,9 +874,8 @@ static int rv770_startup(struct radeon_device *rdev) | |||
877 | r = r600_cp_resume(rdev); | 874 | r = r600_cp_resume(rdev); |
878 | if (r) | 875 | if (r) |
879 | return r; | 876 | return r; |
880 | r = r600_wb_init(rdev); | 877 | /* write back buffer are not vital so don't worry about failure */ |
881 | if (r) | 878 | r600_wb_enable(rdev); |
882 | return r; | ||
883 | return 0; | 879 | return 0; |
884 | } | 880 | } |
885 | 881 | ||
@@ -887,15 +883,12 @@ int rv770_resume(struct radeon_device *rdev) | |||
887 | { | 883 | { |
888 | int r; | 884 | int r; |
889 | 885 | ||
890 | if (radeon_gpu_reset(rdev)) { | 886 | /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, |
891 | /* FIXME: what do we want to do here ? */ | 887 | * posting will perform necessary task to bring back GPU into good |
892 | } | 888 | * shape. |
889 | */ | ||
893 | /* post card */ | 890 | /* post card */ |
894 | if (rdev->is_atom_bios) { | 891 | atom_asic_init(rdev->mode_info.atom_context); |
895 | atom_asic_init(rdev->mode_info.atom_context); | ||
896 | } else { | ||
897 | radeon_combios_asic_init(rdev->ddev); | ||
898 | } | ||
899 | /* Initialize clocks */ | 892 | /* Initialize clocks */ |
900 | r = radeon_clocks_init(rdev); | 893 | r = radeon_clocks_init(rdev); |
901 | if (r) { | 894 | if (r) { |
@@ -908,7 +901,7 @@ int rv770_resume(struct radeon_device *rdev) | |||
908 | return r; | 901 | return r; |
909 | } | 902 | } |
910 | 903 | ||
911 | r = radeon_ib_test(rdev); | 904 | r = r600_ib_test(rdev); |
912 | if (r) { | 905 | if (r) { |
913 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 906 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
914 | return r; | 907 | return r; |
@@ -922,8 +915,8 @@ int rv770_suspend(struct radeon_device *rdev) | |||
922 | /* FIXME: we should wait for ring to be empty */ | 915 | /* FIXME: we should wait for ring to be empty */ |
923 | r700_cp_stop(rdev); | 916 | r700_cp_stop(rdev); |
924 | rdev->cp.ready = false; | 917 | rdev->cp.ready = false; |
918 | r600_wb_disable(rdev); | ||
925 | rv770_pcie_gart_disable(rdev); | 919 | rv770_pcie_gart_disable(rdev); |
926 | |||
927 | /* unpin shaders bo */ | 920 | /* unpin shaders bo */ |
928 | radeon_object_unpin(rdev->r600_blit.shader_obj); | 921 | radeon_object_unpin(rdev->r600_blit.shader_obj); |
929 | return 0; | 922 | return 0; |
@@ -939,7 +932,6 @@ int rv770_init(struct radeon_device *rdev) | |||
939 | { | 932 | { |
940 | int r; | 933 | int r; |
941 | 934 | ||
942 | rdev->new_init_path = true; | ||
943 | r = radeon_dummy_page_init(rdev); | 935 | r = radeon_dummy_page_init(rdev); |
944 | if (r) | 936 | if (r) |
945 | return r; | 937 | return r; |
@@ -953,8 +945,10 @@ int rv770_init(struct radeon_device *rdev) | |||
953 | return -EINVAL; | 945 | return -EINVAL; |
954 | } | 946 | } |
955 | /* Must be an ATOMBIOS */ | 947 | /* Must be an ATOMBIOS */ |
956 | if (!rdev->is_atom_bios) | 948 | if (!rdev->is_atom_bios) { |
949 | dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); | ||
957 | return -EINVAL; | 950 | return -EINVAL; |
951 | } | ||
958 | r = radeon_atombios_init(rdev); | 952 | r = radeon_atombios_init(rdev); |
959 | if (r) | 953 | if (r) |
960 | return r; | 954 | return r; |
@@ -976,15 +970,8 @@ int rv770_init(struct radeon_device *rdev) | |||
976 | if (r) | 970 | if (r) |
977 | return r; | 971 | return r; |
978 | r = rv770_mc_init(rdev); | 972 | r = rv770_mc_init(rdev); |
979 | if (r) { | 973 | if (r) |
980 | if (rdev->flags & RADEON_IS_AGP) { | ||
981 | /* Retry with disabling AGP */ | ||
982 | rv770_fini(rdev); | ||
983 | rdev->flags &= ~RADEON_IS_AGP; | ||
984 | return rv770_init(rdev); | ||
985 | } | ||
986 | return r; | 974 | return r; |
987 | } | ||
988 | /* Memory manager */ | 975 | /* Memory manager */ |
989 | r = radeon_object_init(rdev); | 976 | r = radeon_object_init(rdev); |
990 | if (r) | 977 | if (r) |
@@ -1013,12 +1000,10 @@ int rv770_init(struct radeon_device *rdev) | |||
1013 | 1000 | ||
1014 | r = rv770_startup(rdev); | 1001 | r = rv770_startup(rdev); |
1015 | if (r) { | 1002 | if (r) { |
1016 | if (rdev->flags & RADEON_IS_AGP) { | 1003 | rv770_suspend(rdev); |
1017 | /* Retry with disabling AGP */ | 1004 | r600_wb_fini(rdev); |
1018 | rv770_fini(rdev); | 1005 | radeon_ring_fini(rdev); |
1019 | rdev->flags &= ~RADEON_IS_AGP; | 1006 | rv770_pcie_gart_fini(rdev); |
1020 | return rv770_init(rdev); | ||
1021 | } | ||
1022 | rdev->accel_working = false; | 1007 | rdev->accel_working = false; |
1023 | } | 1008 | } |
1024 | if (rdev->accel_working) { | 1009 | if (rdev->accel_working) { |
@@ -1027,7 +1012,7 @@ int rv770_init(struct radeon_device *rdev) | |||
1027 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); | 1012 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); |
1028 | rdev->accel_working = false; | 1013 | rdev->accel_working = false; |
1029 | } | 1014 | } |
1030 | r = radeon_ib_test(rdev); | 1015 | r = r600_ib_test(rdev); |
1031 | if (r) { | 1016 | if (r) { |
1032 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1017 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
1033 | rdev->accel_working = false; | 1018 | rdev->accel_working = false; |
@@ -1042,20 +1027,15 @@ void rv770_fini(struct radeon_device *rdev) | |||
1042 | 1027 | ||
1043 | r600_blit_fini(rdev); | 1028 | r600_blit_fini(rdev); |
1044 | radeon_ring_fini(rdev); | 1029 | radeon_ring_fini(rdev); |
1030 | r600_wb_fini(rdev); | ||
1045 | rv770_pcie_gart_fini(rdev); | 1031 | rv770_pcie_gart_fini(rdev); |
1046 | radeon_gem_fini(rdev); | 1032 | radeon_gem_fini(rdev); |
1047 | radeon_fence_driver_fini(rdev); | 1033 | radeon_fence_driver_fini(rdev); |
1048 | radeon_clocks_fini(rdev); | 1034 | radeon_clocks_fini(rdev); |
1049 | #if __OS_HAS_AGP | ||
1050 | if (rdev->flags & RADEON_IS_AGP) | 1035 | if (rdev->flags & RADEON_IS_AGP) |
1051 | radeon_agp_fini(rdev); | 1036 | radeon_agp_fini(rdev); |
1052 | #endif | ||
1053 | radeon_object_fini(rdev); | 1037 | radeon_object_fini(rdev); |
1054 | if (rdev->is_atom_bios) { | 1038 | radeon_atombios_fini(rdev); |
1055 | radeon_atombios_fini(rdev); | ||
1056 | } else { | ||
1057 | radeon_combios_fini(rdev); | ||
1058 | } | ||
1059 | kfree(rdev->bios); | 1039 | kfree(rdev->bios); |
1060 | rdev->bios = NULL; | 1040 | rdev->bios = NULL; |
1061 | radeon_dummy_page_fini(rdev); | 1041 | radeon_dummy_page_fini(rdev); |