Rev 1179 | Rev 1246 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1179 | Rev 1221 | ||
---|---|---|---|
1 | /* |
1 | /* |
2 | * Copyright 2008 Advanced Micro Devices, Inc. |
2 | * Copyright 2008 Advanced Micro Devices, Inc. |
3 | * Copyright 2008 Red Hat Inc. |
3 | * Copyright 2008 Red Hat Inc. |
4 | * Copyright 2009 Jerome Glisse. |
4 | * Copyright 2009 Jerome Glisse. |
5 | * |
5 | * |
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
7 | * copy of this software and associated documentation files (the "Software"), |
7 | * copy of this software and associated documentation files (the "Software"), |
8 | * to deal in the Software without restriction, including without limitation |
8 | * to deal in the Software without restriction, including without limitation |
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
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 |
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: |
11 | * Software is furnished to do so, subject to the following conditions: |
12 | * |
12 | * |
13 | * The above copyright notice and this permission notice shall be included in |
13 | * The above copyright notice and this permission notice shall be included in |
14 | * all copies or substantial portions of the Software. |
14 | * all copies or substantial portions of the Software. |
15 | * |
15 | * |
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
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, |
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
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 |
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, |
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 |
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
22 | * OTHER DEALINGS IN THE SOFTWARE. |
22 | * OTHER DEALINGS IN THE SOFTWARE. |
23 | * |
23 | * |
24 | * Authors: Dave Airlie |
24 | * Authors: Dave Airlie |
25 | * Alex Deucher |
25 | * Alex Deucher |
26 | * Jerome Glisse |
26 | * Jerome Glisse |
27 | */ |
27 | */ |
28 | #include |
28 | #include |
29 | #include "drmP.h" |
29 | #include "drmP.h" |
30 | #include "drm.h" |
30 | #include "drm.h" |
31 | #include "radeon_reg.h" |
31 | #include "radeon_reg.h" |
32 | #include "radeon.h" |
32 | #include "radeon.h" |
33 | #include "radeon_drm.h" |
33 | #include "radeon_drm.h" |
34 | 34 | ||
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 | - | ||
39 | /* r300,r350,rv350,rv370,rv380 depends on : */ |
- | |
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 | 38 | ||
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 | 39 | /* This files gather functions specifics to: r300,r350,rv350,rv370,rv380 */ |
|
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; |
76 | int i; |
49 | int i; |
77 | 50 | ||
78 | /* Workaround HW bug do flush 2 times */ |
51 | /* Workaround HW bug do flush 2 times */ |
79 | for (i = 0; i < 2; i++) { |
52 | for (i = 0; i < 2; i++) { |
80 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
53 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
81 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB); |
54 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp | RADEON_PCIE_TX_GART_INVALIDATE_TLB); |
82 | (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
55 | (void)RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
83 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
56 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
84 | } |
57 | } |
85 | mb(); |
58 | mb(); |
86 | } |
59 | } |
87 | 60 | ||
88 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
61 | int rv370_pcie_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) |
89 | { |
62 | { |
90 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; |
63 | void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; |
91 | 64 | ||
92 | if (i < 0 || i > rdev->gart.num_gpu_pages) { |
65 | if (i < 0 || i > rdev->gart.num_gpu_pages) { |
93 | return -EINVAL; |
66 | return -EINVAL; |
94 | } |
67 | } |
95 | addr = (lower_32_bits(addr) >> 8) | |
68 | addr = (lower_32_bits(addr) >> 8) | |
96 | ((upper_32_bits(addr) & 0xff) << 24) | |
69 | ((upper_32_bits(addr) & 0xff) << 24) | |
97 | 0xc; |
70 | 0xc; |
98 | /* on x86 we want this to be CPU endian, on powerpc |
71 | /* on x86 we want this to be CPU endian, on powerpc |
99 | * on powerpc without HW swappers, it'll get swapped on way |
72 | * on powerpc without HW swappers, it'll get swapped on way |
100 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ |
73 | * into VRAM - so no need for cpu_to_le32 on VRAM tables */ |
101 | writel(addr, ((void __iomem *)ptr) + (i * 4)); |
74 | writel(addr, ((void __iomem *)ptr) + (i * 4)); |
102 | return 0; |
75 | return 0; |
103 | } |
76 | } |
104 | 77 | ||
105 | int rv370_pcie_gart_init(struct radeon_device *rdev) |
78 | int rv370_pcie_gart_init(struct radeon_device *rdev) |
106 | { |
79 | { |
107 | int r; |
80 | int r; |
108 | 81 | ||
109 | if (rdev->gart.table.vram.robj) { |
82 | if (rdev->gart.table.vram.robj) { |
110 | WARN(1, "RV370 PCIE GART already initialized.\n"); |
83 | WARN(1, "RV370 PCIE GART already initialized.\n"); |
111 | return 0; |
84 | return 0; |
112 | } |
85 | } |
113 | /* Initialize common gart structure */ |
86 | /* Initialize common gart structure */ |
114 | r = radeon_gart_init(rdev); |
87 | r = radeon_gart_init(rdev); |
115 | if (r) |
88 | if (r) |
116 | return r; |
89 | return r; |
117 | r = rv370_debugfs_pcie_gart_info_init(rdev); |
90 | r = rv370_debugfs_pcie_gart_info_init(rdev); |
118 | if (r) |
91 | if (r) |
119 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); |
92 | DRM_ERROR("Failed to register debugfs file for PCIE gart !\n"); |
120 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
93 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 4; |
121 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; |
94 | rdev->asic->gart_tlb_flush = &rv370_pcie_gart_tlb_flush; |
122 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; |
95 | rdev->asic->gart_set_page = &rv370_pcie_gart_set_page; |
123 | return radeon_gart_table_vram_alloc(rdev); |
96 | return radeon_gart_table_vram_alloc(rdev); |
124 | } |
97 | } |
125 | 98 | ||
126 | int rv370_pcie_gart_enable(struct radeon_device *rdev) |
99 | int rv370_pcie_gart_enable(struct radeon_device *rdev) |
127 | { |
100 | { |
128 | uint32_t table_addr; |
101 | uint32_t table_addr; |
129 | uint32_t tmp; |
102 | uint32_t tmp; |
130 | int r; |
103 | int r; |
131 | 104 | ||
132 | if (rdev->gart.table.vram.robj == NULL) { |
105 | if (rdev->gart.table.vram.robj == NULL) { |
133 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); |
106 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); |
134 | return -EINVAL; |
107 | return -EINVAL; |
135 | } |
108 | } |
136 | r = radeon_gart_table_vram_pin(rdev); |
109 | r = radeon_gart_table_vram_pin(rdev); |
137 | if (r) |
110 | if (r) |
138 | return r; |
111 | return r; |
139 | /* discard memory request outside of configured range */ |
112 | /* discard memory request outside of configured range */ |
140 | tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
113 | tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
141 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
114 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
142 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_location); |
115 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_location); |
143 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 4096; |
116 | tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 4096; |
144 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, tmp); |
117 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, tmp); |
145 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0); |
118 | WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0); |
146 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0); |
119 | WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0); |
147 | table_addr = rdev->gart.table_addr; |
120 | table_addr = rdev->gart.table_addr; |
148 | WREG32_PCIE(RADEON_PCIE_TX_GART_BASE, table_addr); |
121 | WREG32_PCIE(RADEON_PCIE_TX_GART_BASE, table_addr); |
149 | /* FIXME: setup default page */ |
122 | /* FIXME: setup default page */ |
150 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_location); |
123 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_location); |
151 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); |
124 | WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); |
152 | /* Clear error */ |
125 | /* Clear error */ |
153 | WREG32_PCIE(0x18, 0); |
126 | WREG32_PCIE(0x18, 0); |
154 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
127 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
155 | tmp |= RADEON_PCIE_TX_GART_EN; |
128 | tmp |= RADEON_PCIE_TX_GART_EN; |
156 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
129 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
157 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
130 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); |
158 | rv370_pcie_gart_tlb_flush(rdev); |
131 | rv370_pcie_gart_tlb_flush(rdev); |
159 | DRM_INFO("PCIE GART of %uM enabled (table at 0x%08X).\n", |
132 | DRM_INFO("PCIE GART of %uM enabled (table at 0x%08X).\n", |
160 | (unsigned)(rdev->mc.gtt_size >> 20), table_addr); |
133 | (unsigned)(rdev->mc.gtt_size >> 20), table_addr); |
161 | rdev->gart.ready = true; |
134 | rdev->gart.ready = true; |
162 | return 0; |
135 | return 0; |
163 | } |
136 | } |
164 | 137 | ||
165 | void rv370_pcie_gart_disable(struct radeon_device *rdev) |
138 | void rv370_pcie_gart_disable(struct radeon_device *rdev) |
166 | { |
139 | { |
167 | uint32_t tmp; |
140 | uint32_t tmp; |
168 | 141 | ||
169 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
142 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
170 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
143 | tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; |
171 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN); |
144 | WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN); |
172 | if (rdev->gart.table.vram.robj) { |
145 | if (rdev->gart.table.vram.robj) { |
173 | // radeon_object_kunmap(rdev->gart.table.vram.robj); |
146 | // radeon_object_kunmap(rdev->gart.table.vram.robj); |
174 | // radeon_object_unpin(rdev->gart.table.vram.robj); |
147 | // radeon_object_unpin(rdev->gart.table.vram.robj); |
175 | } |
148 | } |
176 | } |
149 | } |
177 | 150 | ||
178 | void rv370_pcie_gart_fini(struct radeon_device *rdev) |
151 | void rv370_pcie_gart_fini(struct radeon_device *rdev) |
179 | { |
152 | { |
180 | rv370_pcie_gart_disable(rdev); |
153 | rv370_pcie_gart_disable(rdev); |
181 | radeon_gart_table_vram_free(rdev); |
154 | radeon_gart_table_vram_free(rdev); |
182 | radeon_gart_fini(rdev); |
155 | radeon_gart_fini(rdev); |
183 | } |
156 | } |
184 | - | ||
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 | r = radeon_mc_setup(rdev); |
- | |
206 | if (r) { |
- | |
207 | return r; |
- | |
208 | } |
- | |
209 | - | ||
210 | /* Program GPU memory space */ |
- | |
211 | r100_mc_disable_clients(rdev); |
- | |
212 | if (r300_mc_wait_for_idle(rdev)) { |
- | |
213 | printk(KERN_WARNING "Failed to wait MC idle while " |
- | |
214 | "programming pipes. Bad things might happen.\n"); |
- | |
215 | } |
- | |
216 | r100_mc_setup(rdev); |
- | |
217 | return 0; |
- | |
218 | } |
- | |
219 | - | ||
220 | void r300_mc_fini(struct radeon_device *rdev) |
- | |
221 | { |
- | |
222 | } |
- | |
223 | - | ||
224 | - | ||
225 | /* |
- | |
226 | * Fence emission |
- | |
227 | */ |
157 | |
228 | void r300_fence_ring_emit(struct radeon_device *rdev, |
158 | void r300_fence_ring_emit(struct radeon_device *rdev, |
229 | struct radeon_fence *fence) |
159 | struct radeon_fence *fence) |
230 | { |
160 | { |
231 | /* Who ever call radeon_fence_emit should call ring_lock and ask |
161 | /* Who ever call radeon_fence_emit should call ring_lock and ask |
232 | * for enough space (today caller are ib schedule and buffer move) */ |
162 | * for enough space (today caller are ib schedule and buffer move) */ |
233 | /* Write SC register so SC & US assert idle */ |
163 | /* Write SC register so SC & US assert idle */ |
234 | radeon_ring_write(rdev, PACKET0(0x43E0, 0)); |
164 | radeon_ring_write(rdev, PACKET0(0x43E0, 0)); |
235 | radeon_ring_write(rdev, 0); |
165 | radeon_ring_write(rdev, 0); |
236 | radeon_ring_write(rdev, PACKET0(0x43E4, 0)); |
166 | radeon_ring_write(rdev, PACKET0(0x43E4, 0)); |
237 | radeon_ring_write(rdev, 0); |
167 | radeon_ring_write(rdev, 0); |
238 | /* Flush 3D cache */ |
168 | /* Flush 3D cache */ |
239 | radeon_ring_write(rdev, PACKET0(0x4E4C, 0)); |
169 | radeon_ring_write(rdev, PACKET0(0x4E4C, 0)); |
240 | radeon_ring_write(rdev, (2 << 0)); |
170 | radeon_ring_write(rdev, (2 << 0)); |
241 | radeon_ring_write(rdev, PACKET0(0x4F18, 0)); |
171 | radeon_ring_write(rdev, PACKET0(0x4F18, 0)); |
242 | radeon_ring_write(rdev, (1 << 0)); |
172 | radeon_ring_write(rdev, (1 << 0)); |
243 | /* Wait until IDLE & CLEAN */ |
173 | /* Wait until IDLE & CLEAN */ |
244 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); |
174 | radeon_ring_write(rdev, PACKET0(0x1720, 0)); |
245 | radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9)); |
175 | radeon_ring_write(rdev, (1 << 17) | (1 << 16) | (1 << 9)); |
246 | /* Emit fence sequence & fire IRQ */ |
176 | /* Emit fence sequence & fire IRQ */ |
247 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); |
177 | radeon_ring_write(rdev, PACKET0(rdev->fence_drv.scratch_reg, 0)); |
248 | radeon_ring_write(rdev, fence->seq); |
178 | radeon_ring_write(rdev, fence->seq); |
249 | radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0)); |
179 | radeon_ring_write(rdev, PACKET0(RADEON_GEN_INT_STATUS, 0)); |
250 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); |
180 | radeon_ring_write(rdev, RADEON_SW_INT_FIRE); |
251 | } |
181 | } |
252 | 182 | ||
253 | 183 | ||
254 | #if 0 |
184 | #if 0 |
255 | 185 | ||
256 | /* |
- | |
257 | * Global GPU functions |
- | |
258 | */ |
186 | |
259 | int r300_copy_dma(struct radeon_device *rdev, |
187 | int r300_copy_dma(struct radeon_device *rdev, |
260 | uint64_t src_offset, |
188 | uint64_t src_offset, |
261 | uint64_t dst_offset, |
189 | uint64_t dst_offset, |
262 | unsigned num_pages, |
190 | unsigned num_pages, |
263 | struct radeon_fence *fence) |
191 | struct radeon_fence *fence) |
264 | { |
192 | { |
265 | uint32_t size; |
193 | uint32_t size; |
266 | uint32_t cur_size; |
194 | uint32_t cur_size; |
267 | int i, num_loops; |
195 | int i, num_loops; |
268 | int r = 0; |
196 | int r = 0; |
269 | 197 | ||
270 | /* radeon pitch is /64 */ |
198 | /* radeon pitch is /64 */ |
271 | size = num_pages << PAGE_SHIFT; |
199 | size = num_pages << PAGE_SHIFT; |
272 | num_loops = DIV_ROUND_UP(size, 0x1FFFFF); |
200 | num_loops = DIV_ROUND_UP(size, 0x1FFFFF); |
273 | r = radeon_ring_lock(rdev, num_loops * 4 + 64); |
201 | r = radeon_ring_lock(rdev, num_loops * 4 + 64); |
274 | if (r) { |
202 | if (r) { |
275 | DRM_ERROR("radeon: moving bo (%d).\n", r); |
203 | DRM_ERROR("radeon: moving bo (%d).\n", r); |
276 | return r; |
204 | return r; |
277 | } |
205 | } |
278 | /* Must wait for 2D idle & clean before DMA or hangs might happen */ |
206 | /* Must wait for 2D idle & clean before DMA or hangs might happen */ |
279 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 )); |
207 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0 )); |
280 | radeon_ring_write(rdev, (1 << 16)); |
208 | radeon_ring_write(rdev, (1 << 16)); |
281 | for (i = 0; i < num_loops; i++) { |
209 | for (i = 0; i < num_loops; i++) { |
282 | cur_size = size; |
210 | cur_size = size; |
283 | if (cur_size > 0x1FFFFF) { |
211 | if (cur_size > 0x1FFFFF) { |
284 | cur_size = 0x1FFFFF; |
212 | cur_size = 0x1FFFFF; |
285 | } |
213 | } |
286 | size -= cur_size; |
214 | size -= cur_size; |
287 | radeon_ring_write(rdev, PACKET0(0x720, 2)); |
215 | radeon_ring_write(rdev, PACKET0(0x720, 2)); |
288 | radeon_ring_write(rdev, src_offset); |
216 | radeon_ring_write(rdev, src_offset); |
289 | radeon_ring_write(rdev, dst_offset); |
217 | radeon_ring_write(rdev, dst_offset); |
290 | radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30)); |
218 | radeon_ring_write(rdev, cur_size | (1 << 31) | (1 << 30)); |
291 | src_offset += cur_size; |
219 | src_offset += cur_size; |
292 | dst_offset += cur_size; |
220 | dst_offset += cur_size; |
293 | } |
221 | } |
294 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
222 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
295 | radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE); |
223 | radeon_ring_write(rdev, RADEON_WAIT_DMA_GUI_IDLE); |
296 | if (fence) { |
224 | if (fence) { |
297 | r = radeon_fence_emit(rdev, fence); |
225 | r = radeon_fence_emit(rdev, fence); |
298 | } |
226 | } |
299 | radeon_ring_unlock_commit(rdev); |
227 | radeon_ring_unlock_commit(rdev); |
300 | return r; |
228 | return r; |
301 | } |
229 | } |
302 | 230 | ||
303 | #endif |
231 | #endif |
304 | 232 | ||
305 | void r300_ring_start(struct radeon_device *rdev) |
233 | void r300_ring_start(struct radeon_device *rdev) |
306 | { |
234 | { |
307 | unsigned gb_tile_config; |
235 | unsigned gb_tile_config; |
308 | int r; |
236 | int r; |
309 | 237 | ||
310 | /* Sub pixel 1/12 so we can have 4K rendering according to doc */ |
238 | /* Sub pixel 1/12 so we can have 4K rendering according to doc */ |
311 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); |
239 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); |
312 | switch(rdev->num_gb_pipes) { |
240 | switch(rdev->num_gb_pipes) { |
313 | case 2: |
241 | case 2: |
314 | gb_tile_config |= R300_PIPE_COUNT_R300; |
242 | gb_tile_config |= R300_PIPE_COUNT_R300; |
315 | break; |
243 | break; |
316 | case 3: |
244 | case 3: |
317 | gb_tile_config |= R300_PIPE_COUNT_R420_3P; |
245 | gb_tile_config |= R300_PIPE_COUNT_R420_3P; |
318 | break; |
246 | break; |
319 | case 4: |
247 | case 4: |
320 | gb_tile_config |= R300_PIPE_COUNT_R420; |
248 | gb_tile_config |= R300_PIPE_COUNT_R420; |
321 | break; |
249 | break; |
322 | case 1: |
250 | case 1: |
323 | default: |
251 | default: |
324 | gb_tile_config |= R300_PIPE_COUNT_RV350; |
252 | gb_tile_config |= R300_PIPE_COUNT_RV350; |
325 | break; |
253 | break; |
326 | } |
254 | } |
327 | 255 | ||
328 | r = radeon_ring_lock(rdev, 64); |
256 | r = radeon_ring_lock(rdev, 64); |
329 | if (r) { |
257 | if (r) { |
330 | return; |
258 | return; |
331 | } |
259 | } |
332 | radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0)); |
260 | radeon_ring_write(rdev, PACKET0(RADEON_ISYNC_CNTL, 0)); |
333 | radeon_ring_write(rdev, |
261 | radeon_ring_write(rdev, |
334 | RADEON_ISYNC_ANY2D_IDLE3D | |
262 | RADEON_ISYNC_ANY2D_IDLE3D | |
335 | RADEON_ISYNC_ANY3D_IDLE2D | |
263 | RADEON_ISYNC_ANY3D_IDLE2D | |
336 | RADEON_ISYNC_WAIT_IDLEGUI | |
264 | RADEON_ISYNC_WAIT_IDLEGUI | |
337 | RADEON_ISYNC_CPSCRATCH_IDLEGUI); |
265 | RADEON_ISYNC_CPSCRATCH_IDLEGUI); |
338 | radeon_ring_write(rdev, PACKET0(R300_GB_TILE_CONFIG, 0)); |
266 | radeon_ring_write(rdev, PACKET0(R300_GB_TILE_CONFIG, 0)); |
339 | radeon_ring_write(rdev, gb_tile_config); |
267 | radeon_ring_write(rdev, gb_tile_config); |
340 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
268 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
341 | radeon_ring_write(rdev, |
269 | radeon_ring_write(rdev, |
342 | RADEON_WAIT_2D_IDLECLEAN | |
270 | RADEON_WAIT_2D_IDLECLEAN | |
343 | RADEON_WAIT_3D_IDLECLEAN); |
271 | RADEON_WAIT_3D_IDLECLEAN); |
344 | radeon_ring_write(rdev, PACKET0(0x170C, 0)); |
272 | radeon_ring_write(rdev, PACKET0(0x170C, 0)); |
345 | radeon_ring_write(rdev, 1 << 31); |
273 | radeon_ring_write(rdev, 1 << 31); |
346 | radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0)); |
274 | radeon_ring_write(rdev, PACKET0(R300_GB_SELECT, 0)); |
347 | radeon_ring_write(rdev, 0); |
275 | radeon_ring_write(rdev, 0); |
348 | radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0)); |
276 | radeon_ring_write(rdev, PACKET0(R300_GB_ENABLE, 0)); |
349 | radeon_ring_write(rdev, 0); |
277 | radeon_ring_write(rdev, 0); |
350 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
278 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
351 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
279 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
352 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
280 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
353 | radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); |
281 | radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); |
354 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
282 | radeon_ring_write(rdev, PACKET0(RADEON_WAIT_UNTIL, 0)); |
355 | radeon_ring_write(rdev, |
283 | radeon_ring_write(rdev, |
356 | RADEON_WAIT_2D_IDLECLEAN | |
284 | RADEON_WAIT_2D_IDLECLEAN | |
357 | RADEON_WAIT_3D_IDLECLEAN); |
285 | RADEON_WAIT_3D_IDLECLEAN); |
358 | radeon_ring_write(rdev, PACKET0(R300_GB_AA_CONFIG, 0)); |
286 | radeon_ring_write(rdev, PACKET0(R300_GB_AA_CONFIG, 0)); |
359 | radeon_ring_write(rdev, 0); |
287 | radeon_ring_write(rdev, 0); |
360 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
288 | radeon_ring_write(rdev, PACKET0(R300_RB3D_DSTCACHE_CTLSTAT, 0)); |
361 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
289 | radeon_ring_write(rdev, R300_RB3D_DC_FLUSH | R300_RB3D_DC_FREE); |
362 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
290 | radeon_ring_write(rdev, PACKET0(R300_RB3D_ZCACHE_CTLSTAT, 0)); |
363 | radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); |
291 | radeon_ring_write(rdev, R300_ZC_FLUSH | R300_ZC_FREE); |
364 | radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS0, 0)); |
292 | radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS0, 0)); |
365 | radeon_ring_write(rdev, |
293 | radeon_ring_write(rdev, |
366 | ((6 << R300_MS_X0_SHIFT) | |
294 | ((6 << R300_MS_X0_SHIFT) | |
367 | (6 << R300_MS_Y0_SHIFT) | |
295 | (6 << R300_MS_Y0_SHIFT) | |
368 | (6 << R300_MS_X1_SHIFT) | |
296 | (6 << R300_MS_X1_SHIFT) | |
369 | (6 << R300_MS_Y1_SHIFT) | |
297 | (6 << R300_MS_Y1_SHIFT) | |
370 | (6 << R300_MS_X2_SHIFT) | |
298 | (6 << R300_MS_X2_SHIFT) | |
371 | (6 << R300_MS_Y2_SHIFT) | |
299 | (6 << R300_MS_Y2_SHIFT) | |
372 | (6 << R300_MSBD0_Y_SHIFT) | |
300 | (6 << R300_MSBD0_Y_SHIFT) | |
373 | (6 << R300_MSBD0_X_SHIFT))); |
301 | (6 << R300_MSBD0_X_SHIFT))); |
374 | radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS1, 0)); |
302 | radeon_ring_write(rdev, PACKET0(R300_GB_MSPOS1, 0)); |
375 | radeon_ring_write(rdev, |
303 | radeon_ring_write(rdev, |
376 | ((6 << R300_MS_X3_SHIFT) | |
304 | ((6 << R300_MS_X3_SHIFT) | |
377 | (6 << R300_MS_Y3_SHIFT) | |
305 | (6 << R300_MS_Y3_SHIFT) | |
378 | (6 << R300_MS_X4_SHIFT) | |
306 | (6 << R300_MS_X4_SHIFT) | |
379 | (6 << R300_MS_Y4_SHIFT) | |
307 | (6 << R300_MS_Y4_SHIFT) | |
380 | (6 << R300_MS_X5_SHIFT) | |
308 | (6 << R300_MS_X5_SHIFT) | |
381 | (6 << R300_MS_Y5_SHIFT) | |
309 | (6 << R300_MS_Y5_SHIFT) | |
382 | (6 << R300_MSBD1_SHIFT))); |
310 | (6 << R300_MSBD1_SHIFT))); |
383 | radeon_ring_write(rdev, PACKET0(R300_GA_ENHANCE, 0)); |
311 | radeon_ring_write(rdev, PACKET0(R300_GA_ENHANCE, 0)); |
384 | radeon_ring_write(rdev, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); |
312 | radeon_ring_write(rdev, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); |
385 | radeon_ring_write(rdev, PACKET0(R300_GA_POLY_MODE, 0)); |
313 | radeon_ring_write(rdev, PACKET0(R300_GA_POLY_MODE, 0)); |
386 | radeon_ring_write(rdev, |
314 | radeon_ring_write(rdev, |
387 | R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); |
315 | R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); |
388 | radeon_ring_write(rdev, PACKET0(R300_GA_ROUND_MODE, 0)); |
316 | radeon_ring_write(rdev, PACKET0(R300_GA_ROUND_MODE, 0)); |
389 | radeon_ring_write(rdev, |
317 | radeon_ring_write(rdev, |
390 | R300_GEOMETRY_ROUND_NEAREST | |
318 | R300_GEOMETRY_ROUND_NEAREST | |
391 | R300_COLOR_ROUND_NEAREST); |
319 | R300_COLOR_ROUND_NEAREST); |
392 | radeon_ring_unlock_commit(rdev); |
320 | radeon_ring_unlock_commit(rdev); |
393 | } |
321 | } |
394 | 322 | ||
395 | void r300_errata(struct radeon_device *rdev) |
323 | void r300_errata(struct radeon_device *rdev) |
396 | { |
324 | { |
397 | rdev->pll_errata = 0; |
325 | rdev->pll_errata = 0; |
398 | 326 | ||
399 | if (rdev->family == CHIP_R300 && |
327 | if (rdev->family == CHIP_R300 && |
400 | (RREG32(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) == RADEON_CFG_ATI_REV_A11) { |
328 | (RREG32(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) == RADEON_CFG_ATI_REV_A11) { |
401 | rdev->pll_errata |= CHIP_ERRATA_R300_CG; |
329 | rdev->pll_errata |= CHIP_ERRATA_R300_CG; |
402 | } |
330 | } |
403 | } |
331 | } |
404 | 332 | ||
405 | int r300_mc_wait_for_idle(struct radeon_device *rdev) |
333 | int r300_mc_wait_for_idle(struct radeon_device *rdev) |
406 | { |
334 | { |
407 | unsigned i; |
335 | unsigned i; |
408 | uint32_t tmp; |
336 | uint32_t tmp; |
409 | 337 | ||
410 | for (i = 0; i < rdev->usec_timeout; i++) { |
338 | for (i = 0; i < rdev->usec_timeout; i++) { |
411 | /* read MC_STATUS */ |
339 | /* read MC_STATUS */ |
412 | tmp = RREG32(0x0150); |
340 | tmp = RREG32(0x0150); |
413 | if (tmp & (1 << 4)) { |
341 | if (tmp & (1 << 4)) { |
414 | return 0; |
342 | return 0; |
415 | } |
343 | } |
416 | DRM_UDELAY(1); |
344 | DRM_UDELAY(1); |
417 | } |
345 | } |
418 | return -1; |
346 | return -1; |
419 | } |
347 | } |
420 | 348 | ||
421 | void r300_gpu_init(struct radeon_device *rdev) |
349 | void r300_gpu_init(struct radeon_device *rdev) |
422 | { |
350 | { |
423 | uint32_t gb_tile_config, tmp; |
351 | uint32_t gb_tile_config, tmp; |
424 | 352 | ||
425 | r100_hdp_reset(rdev); |
353 | r100_hdp_reset(rdev); |
426 | /* FIXME: rv380 one pipes ? */ |
354 | /* FIXME: rv380 one pipes ? */ |
427 | if ((rdev->family == CHIP_R300) || (rdev->family == CHIP_R350)) { |
355 | if ((rdev->family == CHIP_R300) || (rdev->family == CHIP_R350)) { |
428 | /* r300,r350 */ |
356 | /* r300,r350 */ |
429 | rdev->num_gb_pipes = 2; |
357 | rdev->num_gb_pipes = 2; |
430 | } else { |
358 | } else { |
431 | /* rv350,rv370,rv380 */ |
359 | /* rv350,rv370,rv380 */ |
432 | rdev->num_gb_pipes = 1; |
360 | rdev->num_gb_pipes = 1; |
433 | } |
361 | } |
434 | rdev->num_z_pipes = 1; |
362 | rdev->num_z_pipes = 1; |
435 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); |
363 | gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); |
436 | switch (rdev->num_gb_pipes) { |
364 | switch (rdev->num_gb_pipes) { |
437 | case 2: |
365 | case 2: |
438 | gb_tile_config |= R300_PIPE_COUNT_R300; |
366 | gb_tile_config |= R300_PIPE_COUNT_R300; |
439 | break; |
367 | break; |
440 | case 3: |
368 | case 3: |
441 | gb_tile_config |= R300_PIPE_COUNT_R420_3P; |
369 | gb_tile_config |= R300_PIPE_COUNT_R420_3P; |
442 | break; |
370 | break; |
443 | case 4: |
371 | case 4: |
444 | gb_tile_config |= R300_PIPE_COUNT_R420; |
372 | gb_tile_config |= R300_PIPE_COUNT_R420; |
445 | break; |
373 | break; |
446 | default: |
374 | default: |
447 | case 1: |
375 | case 1: |
448 | gb_tile_config |= R300_PIPE_COUNT_RV350; |
376 | gb_tile_config |= R300_PIPE_COUNT_RV350; |
449 | break; |
377 | break; |
450 | } |
378 | } |
451 | WREG32(R300_GB_TILE_CONFIG, gb_tile_config); |
379 | WREG32(R300_GB_TILE_CONFIG, gb_tile_config); |
452 | 380 | ||
453 | if (r100_gui_wait_for_idle(rdev)) { |
381 | if (r100_gui_wait_for_idle(rdev)) { |
454 | printk(KERN_WARNING "Failed to wait GUI idle while " |
382 | printk(KERN_WARNING "Failed to wait GUI idle while " |
455 | "programming pipes. Bad things might happen.\n"); |
383 | "programming pipes. Bad things might happen.\n"); |
456 | } |
384 | } |
457 | 385 | ||
458 | tmp = RREG32(0x170C); |
386 | tmp = RREG32(0x170C); |
459 | WREG32(0x170C, tmp | (1 << 31)); |
387 | WREG32(0x170C, tmp | (1 << 31)); |
460 | 388 | ||
461 | WREG32(R300_RB2D_DSTCACHE_MODE, |
389 | WREG32(R300_RB2D_DSTCACHE_MODE, |
462 | R300_DC_AUTOFLUSH_ENABLE | |
390 | R300_DC_AUTOFLUSH_ENABLE | |
463 | R300_DC_DC_DISABLE_IGNORE_PE); |
391 | R300_DC_DC_DISABLE_IGNORE_PE); |
464 | 392 | ||
465 | if (r100_gui_wait_for_idle(rdev)) { |
393 | if (r100_gui_wait_for_idle(rdev)) { |
466 | printk(KERN_WARNING "Failed to wait GUI idle while " |
394 | printk(KERN_WARNING "Failed to wait GUI idle while " |
467 | "programming pipes. Bad things might happen.\n"); |
395 | "programming pipes. Bad things might happen.\n"); |
468 | } |
396 | } |
469 | if (r300_mc_wait_for_idle(rdev)) { |
397 | if (r300_mc_wait_for_idle(rdev)) { |
470 | printk(KERN_WARNING "Failed to wait MC idle while " |
398 | printk(KERN_WARNING "Failed to wait MC idle while " |
471 | "programming pipes. Bad things might happen.\n"); |
399 | "programming pipes. Bad things might happen.\n"); |
472 | } |
400 | } |
473 | DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", |
401 | DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", |
474 | rdev->num_gb_pipes, rdev->num_z_pipes); |
402 | rdev->num_gb_pipes, rdev->num_z_pipes); |
475 | } |
403 | } |
476 | 404 | ||
477 | int r300_ga_reset(struct radeon_device *rdev) |
405 | int r300_ga_reset(struct radeon_device *rdev) |
478 | { |
406 | { |
479 | uint32_t tmp; |
407 | uint32_t tmp; |
480 | bool reinit_cp; |
408 | bool reinit_cp; |
481 | int i; |
409 | int i; |
482 | 410 | ||
483 | reinit_cp = rdev->cp.ready; |
411 | reinit_cp = rdev->cp.ready; |
484 | rdev->cp.ready = false; |
412 | rdev->cp.ready = false; |
485 | for (i = 0; i < rdev->usec_timeout; i++) { |
413 | for (i = 0; i < rdev->usec_timeout; i++) { |
486 | WREG32(RADEON_CP_CSQ_MODE, 0); |
414 | WREG32(RADEON_CP_CSQ_MODE, 0); |
487 | WREG32(RADEON_CP_CSQ_CNTL, 0); |
415 | WREG32(RADEON_CP_CSQ_CNTL, 0); |
488 | WREG32(RADEON_RBBM_SOFT_RESET, 0x32005); |
416 | WREG32(RADEON_RBBM_SOFT_RESET, 0x32005); |
489 | (void)RREG32(RADEON_RBBM_SOFT_RESET); |
417 | (void)RREG32(RADEON_RBBM_SOFT_RESET); |
490 | udelay(200); |
418 | udelay(200); |
491 | WREG32(RADEON_RBBM_SOFT_RESET, 0); |
419 | WREG32(RADEON_RBBM_SOFT_RESET, 0); |
492 | /* Wait to prevent race in RBBM_STATUS */ |
420 | /* Wait to prevent race in RBBM_STATUS */ |
493 | mdelay(1); |
421 | mdelay(1); |
494 | tmp = RREG32(RADEON_RBBM_STATUS); |
422 | tmp = RREG32(RADEON_RBBM_STATUS); |
495 | if (tmp & ((1 << 20) | (1 << 26))) { |
423 | if (tmp & ((1 << 20) | (1 << 26))) { |
496 | DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)", tmp); |
424 | DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)", tmp); |
497 | /* GA still busy soft reset it */ |
425 | /* GA still busy soft reset it */ |
498 | WREG32(0x429C, 0x200); |
426 | WREG32(0x429C, 0x200); |
499 | WREG32(R300_VAP_PVS_STATE_FLUSH_REG, 0); |
427 | WREG32(R300_VAP_PVS_STATE_FLUSH_REG, 0); |
500 | WREG32(0x43E0, 0); |
428 | WREG32(0x43E0, 0); |
501 | WREG32(0x43E4, 0); |
429 | WREG32(0x43E4, 0); |
502 | WREG32(0x24AC, 0); |
430 | WREG32(0x24AC, 0); |
503 | } |
431 | } |
504 | /* Wait to prevent race in RBBM_STATUS */ |
432 | /* Wait to prevent race in RBBM_STATUS */ |
505 | mdelay(1); |
433 | mdelay(1); |
506 | tmp = RREG32(RADEON_RBBM_STATUS); |
434 | tmp = RREG32(RADEON_RBBM_STATUS); |
507 | if (!(tmp & ((1 << 20) | (1 << 26)))) { |
435 | if (!(tmp & ((1 << 20) | (1 << 26)))) { |
508 | break; |
436 | break; |
509 | } |
437 | } |
510 | } |
438 | } |
511 | for (i = 0; i < rdev->usec_timeout; i++) { |
439 | for (i = 0; i < rdev->usec_timeout; i++) { |
512 | tmp = RREG32(RADEON_RBBM_STATUS); |
440 | tmp = RREG32(RADEON_RBBM_STATUS); |
513 | if (!(tmp & ((1 << 20) | (1 << 26)))) { |
441 | if (!(tmp & ((1 << 20) | (1 << 26)))) { |
514 | DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n", |
442 | DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n", |
515 | tmp); |
443 | tmp); |
516 | if (reinit_cp) { |
444 | if (reinit_cp) { |
517 | return r100_cp_init(rdev, rdev->cp.ring_size); |
445 | return r100_cp_init(rdev, rdev->cp.ring_size); |
518 | } |
446 | } |
519 | return 0; |
447 | return 0; |
520 | } |
448 | } |
521 | DRM_UDELAY(1); |
449 | DRM_UDELAY(1); |
522 | } |
450 | } |
523 | tmp = RREG32(RADEON_RBBM_STATUS); |
451 | tmp = RREG32(RADEON_RBBM_STATUS); |
524 | DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp); |
452 | DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp); |
525 | return -1; |
453 | return -1; |
526 | } |
454 | } |
527 | 455 | ||
528 | int r300_gpu_reset(struct radeon_device *rdev) |
456 | int r300_gpu_reset(struct radeon_device *rdev) |
529 | { |
457 | { |
530 | uint32_t status; |
458 | uint32_t status; |
531 | 459 | ||
532 | /* reset order likely matter */ |
460 | /* reset order likely matter */ |
533 | status = RREG32(RADEON_RBBM_STATUS); |
461 | status = RREG32(RADEON_RBBM_STATUS); |
534 | /* reset HDP */ |
462 | /* reset HDP */ |
535 | r100_hdp_reset(rdev); |
463 | r100_hdp_reset(rdev); |
536 | /* reset rb2d */ |
464 | /* reset rb2d */ |
537 | if (status & ((1 << 17) | (1 << 18) | (1 << 27))) { |
465 | if (status & ((1 << 17) | (1 << 18) | (1 << 27))) { |
538 | r100_rb2d_reset(rdev); |
466 | r100_rb2d_reset(rdev); |
539 | } |
467 | } |
540 | /* reset GA */ |
468 | /* reset GA */ |
541 | if (status & ((1 << 20) | (1 << 26))) { |
469 | if (status & ((1 << 20) | (1 << 26))) { |
542 | r300_ga_reset(rdev); |
470 | r300_ga_reset(rdev); |
543 | } |
471 | } |
544 | /* reset CP */ |
472 | /* reset CP */ |
545 | status = RREG32(RADEON_RBBM_STATUS); |
473 | status = RREG32(RADEON_RBBM_STATUS); |
546 | if (status & (1 << 16)) { |
474 | if (status & (1 << 16)) { |
547 | r100_cp_reset(rdev); |
475 | r100_cp_reset(rdev); |
548 | } |
476 | } |
549 | /* Check if GPU is idle */ |
477 | /* Check if GPU is idle */ |
550 | status = RREG32(RADEON_RBBM_STATUS); |
478 | status = RREG32(RADEON_RBBM_STATUS); |
551 | if (status & (1 << 31)) { |
479 | if (status & (1 << 31)) { |
552 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); |
480 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); |
553 | return -1; |
481 | return -1; |
554 | } |
482 | } |
555 | DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status); |
483 | DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status); |
556 | return 0; |
484 | return 0; |
557 | } |
485 | } |
558 | 486 | ||
559 | 487 | ||
560 | /* |
488 | /* |
561 | * r300,r350,rv350,rv380 VRAM info |
489 | * r300,r350,rv350,rv380 VRAM info |
562 | */ |
490 | */ |
563 | void r300_vram_info(struct radeon_device *rdev) |
491 | void r300_vram_info(struct radeon_device *rdev) |
564 | { |
492 | { |
565 | uint32_t tmp; |
493 | uint32_t tmp; |
566 | 494 | ||
567 | /* DDR for all card after R300 & IGP */ |
495 | /* DDR for all card after R300 & IGP */ |
568 | rdev->mc.vram_is_ddr = true; |
496 | rdev->mc.vram_is_ddr = true; |
569 | tmp = RREG32(RADEON_MEM_CNTL); |
497 | tmp = RREG32(RADEON_MEM_CNTL); |
570 | if (tmp & R300_MEM_NUM_CHANNELS_MASK) { |
498 | if (tmp & R300_MEM_NUM_CHANNELS_MASK) { |
571 | rdev->mc.vram_width = 128; |
499 | rdev->mc.vram_width = 128; |
572 | } else { |
500 | } else { |
573 | rdev->mc.vram_width = 64; |
501 | rdev->mc.vram_width = 64; |
574 | } |
502 | } |
575 | 503 | ||
576 | r100_vram_init_sizes(rdev); |
504 | r100_vram_init_sizes(rdev); |
577 | } |
505 | } |
578 | - | ||
579 | - | ||
580 | /* |
- | |
581 | * PCIE Lanes |
- | |
582 | */ |
- | |
583 | 506 | ||
584 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) |
507 | void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) |
585 | { |
508 | { |
586 | uint32_t link_width_cntl, mask; |
509 | uint32_t link_width_cntl, mask; |
587 | 510 | ||
588 | if (rdev->flags & RADEON_IS_IGP) |
511 | if (rdev->flags & RADEON_IS_IGP) |
589 | return; |
512 | return; |
590 | 513 | ||
591 | if (!(rdev->flags & RADEON_IS_PCIE)) |
514 | if (!(rdev->flags & RADEON_IS_PCIE)) |
592 | return; |
515 | return; |
593 | 516 | ||
594 | /* FIXME wait for idle */ |
517 | /* FIXME wait for idle */ |
595 | 518 | ||
596 | switch (lanes) { |
519 | switch (lanes) { |
597 | case 0: |
520 | case 0: |
598 | mask = RADEON_PCIE_LC_LINK_WIDTH_X0; |
521 | mask = RADEON_PCIE_LC_LINK_WIDTH_X0; |
599 | break; |
522 | break; |
600 | case 1: |
523 | case 1: |
601 | mask = RADEON_PCIE_LC_LINK_WIDTH_X1; |
524 | mask = RADEON_PCIE_LC_LINK_WIDTH_X1; |
602 | break; |
525 | break; |
603 | case 2: |
526 | case 2: |
604 | mask = RADEON_PCIE_LC_LINK_WIDTH_X2; |
527 | mask = RADEON_PCIE_LC_LINK_WIDTH_X2; |
605 | break; |
528 | break; |
606 | case 4: |
529 | case 4: |
607 | mask = RADEON_PCIE_LC_LINK_WIDTH_X4; |
530 | mask = RADEON_PCIE_LC_LINK_WIDTH_X4; |
608 | break; |
531 | break; |
609 | case 8: |
532 | case 8: |
610 | mask = RADEON_PCIE_LC_LINK_WIDTH_X8; |
533 | mask = RADEON_PCIE_LC_LINK_WIDTH_X8; |
611 | break; |
534 | break; |
612 | case 12: |
535 | case 12: |
613 | mask = RADEON_PCIE_LC_LINK_WIDTH_X12; |
536 | mask = RADEON_PCIE_LC_LINK_WIDTH_X12; |
614 | break; |
537 | break; |
615 | case 16: |
538 | case 16: |
616 | default: |
539 | default: |
617 | mask = RADEON_PCIE_LC_LINK_WIDTH_X16; |
540 | mask = RADEON_PCIE_LC_LINK_WIDTH_X16; |
618 | break; |
541 | break; |
619 | } |
542 | } |
620 | 543 | ||
621 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
544 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
622 | 545 | ||
623 | if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) == |
546 | if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) == |
624 | (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT)) |
547 | (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT)) |
625 | return; |
548 | return; |
626 | 549 | ||
627 | link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK | |
550 | link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK | |
628 | RADEON_PCIE_LC_RECONFIG_NOW | |
551 | RADEON_PCIE_LC_RECONFIG_NOW | |
629 | RADEON_PCIE_LC_RECONFIG_LATER | |
552 | RADEON_PCIE_LC_RECONFIG_LATER | |
630 | RADEON_PCIE_LC_SHORT_RECONFIG_EN); |
553 | RADEON_PCIE_LC_SHORT_RECONFIG_EN); |
631 | link_width_cntl |= mask; |
554 | link_width_cntl |= mask; |
632 | WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); |
555 | WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); |
633 | WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, (link_width_cntl | |
556 | WREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL, (link_width_cntl | |
634 | RADEON_PCIE_LC_RECONFIG_NOW)); |
557 | RADEON_PCIE_LC_RECONFIG_NOW)); |
635 | 558 | ||
636 | /* wait for lane set to complete */ |
559 | /* wait for lane set to complete */ |
637 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
560 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
638 | while (link_width_cntl == 0xffffffff) |
561 | while (link_width_cntl == 0xffffffff) |
639 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
562 | link_width_cntl = RREG32_PCIE(RADEON_PCIE_LC_LINK_WIDTH_CNTL); |
640 | 563 | ||
641 | } |
564 | } |
642 | - | ||
643 | - | ||
644 | /* |
- | |
645 | * Debugfs info |
- | |
646 | */ |
565 | |
647 | #if defined(CONFIG_DEBUG_FS) |
566 | #if defined(CONFIG_DEBUG_FS) |
648 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) |
567 | static int rv370_debugfs_pcie_gart_info(struct seq_file *m, void *data) |
649 | { |
568 | { |
650 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
569 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
651 | struct drm_device *dev = node->minor->dev; |
570 | struct drm_device *dev = node->minor->dev; |
652 | struct radeon_device *rdev = dev->dev_private; |
571 | struct radeon_device *rdev = dev->dev_private; |
653 | uint32_t tmp; |
572 | uint32_t tmp; |
654 | 573 | ||
655 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
574 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); |
656 | seq_printf(m, "PCIE_TX_GART_CNTL 0x%08x\n", tmp); |
575 | seq_printf(m, "PCIE_TX_GART_CNTL 0x%08x\n", tmp); |
657 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_BASE); |
576 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_BASE); |
658 | seq_printf(m, "PCIE_TX_GART_BASE 0x%08x\n", tmp); |
577 | seq_printf(m, "PCIE_TX_GART_BASE 0x%08x\n", tmp); |
659 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_LO); |
578 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_LO); |
660 | seq_printf(m, "PCIE_TX_GART_START_LO 0x%08x\n", tmp); |
579 | seq_printf(m, "PCIE_TX_GART_START_LO 0x%08x\n", tmp); |
661 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_HI); |
580 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_START_HI); |
662 | seq_printf(m, "PCIE_TX_GART_START_HI 0x%08x\n", tmp); |
581 | seq_printf(m, "PCIE_TX_GART_START_HI 0x%08x\n", tmp); |
663 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_LO); |
582 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_LO); |
664 | seq_printf(m, "PCIE_TX_GART_END_LO 0x%08x\n", tmp); |
583 | seq_printf(m, "PCIE_TX_GART_END_LO 0x%08x\n", tmp); |
665 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_HI); |
584 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_END_HI); |
666 | seq_printf(m, "PCIE_TX_GART_END_HI 0x%08x\n", tmp); |
585 | seq_printf(m, "PCIE_TX_GART_END_HI 0x%08x\n", tmp); |
667 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_ERROR); |
586 | tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_ERROR); |
668 | seq_printf(m, "PCIE_TX_GART_ERROR 0x%08x\n", tmp); |
587 | seq_printf(m, "PCIE_TX_GART_ERROR 0x%08x\n", tmp); |
669 | return 0; |
588 | return 0; |
670 | } |
589 | } |
671 | 590 | ||
672 | static struct drm_info_list rv370_pcie_gart_info_list[] = { |
591 | static struct drm_info_list rv370_pcie_gart_info_list[] = { |
673 | {"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL}, |
592 | {"rv370_pcie_gart_info", rv370_debugfs_pcie_gart_info, 0, NULL}, |
674 | }; |
593 | }; |
675 | #endif |
594 | #endif |
676 | 595 | ||
677 | int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
596 | static int rv370_debugfs_pcie_gart_info_init(struct radeon_device *rdev) |
678 | { |
597 | { |
679 | #if defined(CONFIG_DEBUG_FS) |
598 | #if defined(CONFIG_DEBUG_FS) |
680 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); |
599 | return radeon_debugfs_add_files(rdev, rv370_pcie_gart_info_list, 1); |
681 | #else |
600 | #else |
682 | return 0; |
601 | return 0; |
683 | #endif |
602 | #endif |
684 | } |
603 | } |
685 | 604 | ||
686 | 605 | ||
687 | #if 0 |
606 | #if 0 |
688 | /* |
607 | |
689 | * CS functions |
- | |
690 | */ |
- | |
691 | static int r300_packet0_check(struct radeon_cs_parser *p, |
608 | static int r300_packet0_check(struct radeon_cs_parser *p, |
692 | struct radeon_cs_packet *pkt, |
609 | struct radeon_cs_packet *pkt, |
693 | unsigned idx, unsigned reg) |
610 | unsigned idx, unsigned reg) |
694 | { |
611 | { |
695 | struct radeon_cs_chunk *ib_chunk; |
- | |
696 | struct radeon_cs_reloc *reloc; |
612 | struct radeon_cs_reloc *reloc; |
697 | struct r100_cs_track *track; |
613 | struct r100_cs_track *track; |
698 | volatile uint32_t *ib; |
614 | volatile uint32_t *ib; |
699 | uint32_t tmp, tile_flags = 0; |
615 | uint32_t tmp, tile_flags = 0; |
700 | unsigned i; |
616 | unsigned i; |
701 | int r; |
617 | int r; |
- | 618 | u32 idx_value; |
|
702 | 619 | ||
703 | ib = p->ib->ptr; |
- | |
704 | ib_chunk = &p->chunks[p->chunk_ib_idx]; |
620 | ib = p->ib->ptr; |
- | 621 | track = (struct r100_cs_track *)p->track; |
|
- | 622 | idx_value = radeon_get_ib_value(p, idx); |
|
705 | track = (struct r100_cs_track *)p->track; |
623 | |
706 | switch(reg) { |
624 | switch(reg) { |
707 | case AVIVO_D1MODE_VLINE_START_END: |
625 | case AVIVO_D1MODE_VLINE_START_END: |
708 | case RADEON_CRTC_GUI_TRIG_VLINE: |
626 | case RADEON_CRTC_GUI_TRIG_VLINE: |
709 | r = r100_cs_packet_parse_vline(p); |
627 | r = r100_cs_packet_parse_vline(p); |
710 | if (r) { |
628 | if (r) { |
711 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
629 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
712 | idx, reg); |
630 | idx, reg); |
713 | r100_cs_dump_packet(p, pkt); |
631 | r100_cs_dump_packet(p, pkt); |
714 | return r; |
632 | return r; |
715 | } |
633 | } |
716 | break; |
634 | break; |
717 | case RADEON_DST_PITCH_OFFSET: |
635 | case RADEON_DST_PITCH_OFFSET: |
718 | case RADEON_SRC_PITCH_OFFSET: |
636 | case RADEON_SRC_PITCH_OFFSET: |
719 | r = r100_reloc_pitch_offset(p, pkt, idx, reg); |
637 | r = r100_reloc_pitch_offset(p, pkt, idx, reg); |
720 | if (r) |
638 | if (r) |
721 | return r; |
639 | return r; |
722 | break; |
640 | break; |
723 | case R300_RB3D_COLOROFFSET0: |
641 | case R300_RB3D_COLOROFFSET0: |
724 | case R300_RB3D_COLOROFFSET1: |
642 | case R300_RB3D_COLOROFFSET1: |
725 | case R300_RB3D_COLOROFFSET2: |
643 | case R300_RB3D_COLOROFFSET2: |
726 | case R300_RB3D_COLOROFFSET3: |
644 | case R300_RB3D_COLOROFFSET3: |
727 | i = (reg - R300_RB3D_COLOROFFSET0) >> 2; |
645 | i = (reg - R300_RB3D_COLOROFFSET0) >> 2; |
728 | r = r100_cs_packet_next_reloc(p, &reloc); |
646 | r = r100_cs_packet_next_reloc(p, &reloc); |
729 | if (r) { |
647 | if (r) { |
730 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
648 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
731 | idx, reg); |
649 | idx, reg); |
732 | r100_cs_dump_packet(p, pkt); |
650 | r100_cs_dump_packet(p, pkt); |
733 | return r; |
651 | return r; |
734 | } |
652 | } |
735 | track->cb[i].robj = reloc->robj; |
653 | track->cb[i].robj = reloc->robj; |
736 | track->cb[i].offset = ib_chunk->kdata[idx]; |
654 | track->cb[i].offset = idx_value; |
737 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
655 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
738 | break; |
656 | break; |
739 | case R300_ZB_DEPTHOFFSET: |
657 | case R300_ZB_DEPTHOFFSET: |
740 | r = r100_cs_packet_next_reloc(p, &reloc); |
658 | r = r100_cs_packet_next_reloc(p, &reloc); |
741 | if (r) { |
659 | if (r) { |
742 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
660 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
743 | idx, reg); |
661 | idx, reg); |
744 | r100_cs_dump_packet(p, pkt); |
662 | r100_cs_dump_packet(p, pkt); |
745 | return r; |
663 | return r; |
746 | } |
664 | } |
747 | track->zb.robj = reloc->robj; |
665 | track->zb.robj = reloc->robj; |
748 | track->zb.offset = ib_chunk->kdata[idx]; |
666 | track->zb.offset = idx_value; |
749 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
667 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
750 | break; |
668 | break; |
751 | case R300_TX_OFFSET_0: |
669 | case R300_TX_OFFSET_0: |
752 | case R300_TX_OFFSET_0+4: |
670 | case R300_TX_OFFSET_0+4: |
753 | case R300_TX_OFFSET_0+8: |
671 | case R300_TX_OFFSET_0+8: |
754 | case R300_TX_OFFSET_0+12: |
672 | case R300_TX_OFFSET_0+12: |
755 | case R300_TX_OFFSET_0+16: |
673 | case R300_TX_OFFSET_0+16: |
756 | case R300_TX_OFFSET_0+20: |
674 | case R300_TX_OFFSET_0+20: |
757 | case R300_TX_OFFSET_0+24: |
675 | case R300_TX_OFFSET_0+24: |
758 | case R300_TX_OFFSET_0+28: |
676 | case R300_TX_OFFSET_0+28: |
759 | case R300_TX_OFFSET_0+32: |
677 | case R300_TX_OFFSET_0+32: |
760 | case R300_TX_OFFSET_0+36: |
678 | case R300_TX_OFFSET_0+36: |
761 | case R300_TX_OFFSET_0+40: |
679 | case R300_TX_OFFSET_0+40: |
762 | case R300_TX_OFFSET_0+44: |
680 | case R300_TX_OFFSET_0+44: |
763 | case R300_TX_OFFSET_0+48: |
681 | case R300_TX_OFFSET_0+48: |
764 | case R300_TX_OFFSET_0+52: |
682 | case R300_TX_OFFSET_0+52: |
765 | case R300_TX_OFFSET_0+56: |
683 | case R300_TX_OFFSET_0+56: |
766 | case R300_TX_OFFSET_0+60: |
684 | case R300_TX_OFFSET_0+60: |
767 | i = (reg - R300_TX_OFFSET_0) >> 2; |
685 | i = (reg - R300_TX_OFFSET_0) >> 2; |
768 | r = r100_cs_packet_next_reloc(p, &reloc); |
686 | r = r100_cs_packet_next_reloc(p, &reloc); |
769 | if (r) { |
687 | if (r) { |
770 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
688 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
771 | idx, reg); |
689 | idx, reg); |
772 | r100_cs_dump_packet(p, pkt); |
690 | r100_cs_dump_packet(p, pkt); |
773 | return r; |
691 | return r; |
774 | } |
692 | } |
775 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
693 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
776 | track->textures[i].robj = reloc->robj; |
694 | track->textures[i].robj = reloc->robj; |
777 | break; |
695 | break; |
778 | /* Tracked registers */ |
696 | /* Tracked registers */ |
779 | case 0x2084: |
697 | case 0x2084: |
780 | /* VAP_VF_CNTL */ |
698 | /* VAP_VF_CNTL */ |
781 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
699 | track->vap_vf_cntl = idx_value; |
782 | break; |
700 | break; |
783 | case 0x20B4: |
701 | case 0x20B4: |
784 | /* VAP_VTX_SIZE */ |
702 | /* VAP_VTX_SIZE */ |
785 | track->vtx_size = ib_chunk->kdata[idx] & 0x7F; |
703 | track->vtx_size = idx_value & 0x7F; |
786 | break; |
704 | break; |
787 | case 0x2134: |
705 | case 0x2134: |
788 | /* VAP_VF_MAX_VTX_INDX */ |
706 | /* VAP_VF_MAX_VTX_INDX */ |
789 | track->max_indx = ib_chunk->kdata[idx] & 0x00FFFFFFUL; |
707 | track->max_indx = idx_value & 0x00FFFFFFUL; |
790 | break; |
708 | break; |
791 | case 0x43E4: |
709 | case 0x43E4: |
792 | /* SC_SCISSOR1 */ |
710 | /* SC_SCISSOR1 */ |
793 | track->maxy = ((ib_chunk->kdata[idx] >> 13) & 0x1FFF) + 1; |
711 | track->maxy = ((idx_value >> 13) & 0x1FFF) + 1; |
794 | if (p->rdev->family < CHIP_RV515) { |
712 | if (p->rdev->family < CHIP_RV515) { |
795 | track->maxy -= 1440; |
713 | track->maxy -= 1440; |
796 | } |
714 | } |
797 | break; |
715 | break; |
798 | case 0x4E00: |
716 | case 0x4E00: |
799 | /* RB3D_CCTL */ |
717 | /* RB3D_CCTL */ |
800 | track->num_cb = ((ib_chunk->kdata[idx] >> 5) & 0x3) + 1; |
718 | track->num_cb = ((idx_value >> 5) & 0x3) + 1; |
801 | break; |
719 | break; |
802 | case 0x4E38: |
720 | case 0x4E38: |
803 | case 0x4E3C: |
721 | case 0x4E3C: |
804 | case 0x4E40: |
722 | case 0x4E40: |
805 | case 0x4E44: |
723 | case 0x4E44: |
806 | /* RB3D_COLORPITCH0 */ |
724 | /* RB3D_COLORPITCH0 */ |
807 | /* RB3D_COLORPITCH1 */ |
725 | /* RB3D_COLORPITCH1 */ |
808 | /* RB3D_COLORPITCH2 */ |
726 | /* RB3D_COLORPITCH2 */ |
809 | /* RB3D_COLORPITCH3 */ |
727 | /* RB3D_COLORPITCH3 */ |
810 | r = r100_cs_packet_next_reloc(p, &reloc); |
728 | r = r100_cs_packet_next_reloc(p, &reloc); |
811 | if (r) { |
729 | if (r) { |
812 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
730 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
813 | idx, reg); |
731 | idx, reg); |
814 | r100_cs_dump_packet(p, pkt); |
732 | r100_cs_dump_packet(p, pkt); |
815 | return r; |
733 | return r; |
816 | } |
734 | } |
817 | 735 | ||
818 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
736 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
819 | tile_flags |= R300_COLOR_TILE_ENABLE; |
737 | tile_flags |= R300_COLOR_TILE_ENABLE; |
820 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
738 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
821 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; |
739 | tile_flags |= R300_COLOR_MICROTILE_ENABLE; |
822 | 740 | ||
823 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); |
741 | tmp = idx_value & ~(0x7 << 16); |
824 | tmp |= tile_flags; |
742 | tmp |= tile_flags; |
825 | ib[idx] = tmp; |
743 | ib[idx] = tmp; |
826 | 744 | ||
827 | i = (reg - 0x4E38) >> 2; |
745 | i = (reg - 0x4E38) >> 2; |
828 | track->cb[i].pitch = ib_chunk->kdata[idx] & 0x3FFE; |
746 | track->cb[i].pitch = idx_value & 0x3FFE; |
829 | switch (((ib_chunk->kdata[idx] >> 21) & 0xF)) { |
747 | switch (((idx_value >> 21) & 0xF)) { |
830 | case 9: |
748 | case 9: |
831 | case 11: |
749 | case 11: |
832 | case 12: |
750 | case 12: |
833 | track->cb[i].cpp = 1; |
751 | track->cb[i].cpp = 1; |
834 | break; |
752 | break; |
835 | case 3: |
753 | case 3: |
836 | case 4: |
754 | case 4: |
837 | case 13: |
755 | case 13: |
838 | case 15: |
756 | case 15: |
839 | track->cb[i].cpp = 2; |
757 | track->cb[i].cpp = 2; |
840 | break; |
758 | break; |
841 | case 6: |
759 | case 6: |
842 | track->cb[i].cpp = 4; |
760 | track->cb[i].cpp = 4; |
843 | break; |
761 | break; |
844 | case 10: |
762 | case 10: |
845 | track->cb[i].cpp = 8; |
763 | track->cb[i].cpp = 8; |
846 | break; |
764 | break; |
847 | case 7: |
765 | case 7: |
848 | track->cb[i].cpp = 16; |
766 | track->cb[i].cpp = 16; |
849 | break; |
767 | break; |
850 | default: |
768 | default: |
851 | DRM_ERROR("Invalid color buffer format (%d) !\n", |
769 | DRM_ERROR("Invalid color buffer format (%d) !\n", |
852 | ((ib_chunk->kdata[idx] >> 21) & 0xF)); |
770 | ((idx_value >> 21) & 0xF)); |
853 | return -EINVAL; |
771 | return -EINVAL; |
854 | } |
772 | } |
855 | break; |
773 | break; |
856 | case 0x4F00: |
774 | case 0x4F00: |
857 | /* ZB_CNTL */ |
775 | /* ZB_CNTL */ |
858 | if (ib_chunk->kdata[idx] & 2) { |
776 | if (idx_value & 2) { |
859 | track->z_enabled = true; |
777 | track->z_enabled = true; |
860 | } else { |
778 | } else { |
861 | track->z_enabled = false; |
779 | track->z_enabled = false; |
862 | } |
780 | } |
863 | break; |
781 | break; |
864 | case 0x4F10: |
782 | case 0x4F10: |
865 | /* ZB_FORMAT */ |
783 | /* ZB_FORMAT */ |
866 | switch ((ib_chunk->kdata[idx] & 0xF)) { |
784 | switch ((idx_value & 0xF)) { |
867 | case 0: |
785 | case 0: |
868 | case 1: |
786 | case 1: |
869 | track->zb.cpp = 2; |
787 | track->zb.cpp = 2; |
870 | break; |
788 | break; |
871 | case 2: |
789 | case 2: |
872 | track->zb.cpp = 4; |
790 | track->zb.cpp = 4; |
873 | break; |
791 | break; |
874 | default: |
792 | default: |
875 | DRM_ERROR("Invalid z buffer format (%d) !\n", |
793 | DRM_ERROR("Invalid z buffer format (%d) !\n", |
876 | (ib_chunk->kdata[idx] & 0xF)); |
794 | (idx_value & 0xF)); |
877 | return -EINVAL; |
795 | return -EINVAL; |
878 | } |
796 | } |
879 | break; |
797 | break; |
880 | case 0x4F24: |
798 | case 0x4F24: |
881 | /* ZB_DEPTHPITCH */ |
799 | /* ZB_DEPTHPITCH */ |
882 | r = r100_cs_packet_next_reloc(p, &reloc); |
800 | r = r100_cs_packet_next_reloc(p, &reloc); |
883 | if (r) { |
801 | if (r) { |
884 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
802 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
885 | idx, reg); |
803 | idx, reg); |
886 | r100_cs_dump_packet(p, pkt); |
804 | r100_cs_dump_packet(p, pkt); |
887 | return r; |
805 | return r; |
888 | } |
806 | } |
889 | 807 | ||
890 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
808 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
891 | tile_flags |= R300_DEPTHMACROTILE_ENABLE; |
809 | tile_flags |= R300_DEPTHMACROTILE_ENABLE; |
892 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
810 | if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
893 | tile_flags |= R300_DEPTHMICROTILE_TILED;; |
811 | tile_flags |= R300_DEPTHMICROTILE_TILED;; |
894 | 812 | ||
895 | tmp = ib_chunk->kdata[idx] & ~(0x7 << 16); |
813 | tmp = idx_value & ~(0x7 << 16); |
896 | tmp |= tile_flags; |
814 | tmp |= tile_flags; |
897 | ib[idx] = tmp; |
815 | ib[idx] = tmp; |
898 | 816 | ||
899 | track->zb.pitch = ib_chunk->kdata[idx] & 0x3FFC; |
817 | track->zb.pitch = idx_value & 0x3FFC; |
900 | break; |
818 | break; |
901 | case 0x4104: |
819 | case 0x4104: |
902 | for (i = 0; i < 16; i++) { |
820 | for (i = 0; i < 16; i++) { |
903 | bool enabled; |
821 | bool enabled; |
904 | 822 | ||
905 | enabled = !!(ib_chunk->kdata[idx] & (1 << i)); |
823 | enabled = !!(idx_value & (1 << i)); |
906 | track->textures[i].enabled = enabled; |
824 | track->textures[i].enabled = enabled; |
907 | } |
825 | } |
908 | break; |
826 | break; |
909 | case 0x44C0: |
827 | case 0x44C0: |
910 | case 0x44C4: |
828 | case 0x44C4: |
911 | case 0x44C8: |
829 | case 0x44C8: |
912 | case 0x44CC: |
830 | case 0x44CC: |
913 | case 0x44D0: |
831 | case 0x44D0: |
914 | case 0x44D4: |
832 | case 0x44D4: |
915 | case 0x44D8: |
833 | case 0x44D8: |
916 | case 0x44DC: |
834 | case 0x44DC: |
917 | case 0x44E0: |
835 | case 0x44E0: |
918 | case 0x44E4: |
836 | case 0x44E4: |
919 | case 0x44E8: |
837 | case 0x44E8: |
920 | case 0x44EC: |
838 | case 0x44EC: |
921 | case 0x44F0: |
839 | case 0x44F0: |
922 | case 0x44F4: |
840 | case 0x44F4: |
923 | case 0x44F8: |
841 | case 0x44F8: |
924 | case 0x44FC: |
842 | case 0x44FC: |
925 | /* TX_FORMAT1_[0-15] */ |
843 | /* TX_FORMAT1_[0-15] */ |
926 | i = (reg - 0x44C0) >> 2; |
844 | i = (reg - 0x44C0) >> 2; |
927 | tmp = (ib_chunk->kdata[idx] >> 25) & 0x3; |
845 | tmp = (idx_value >> 25) & 0x3; |
928 | track->textures[i].tex_coord_type = tmp; |
846 | track->textures[i].tex_coord_type = tmp; |
929 | switch ((ib_chunk->kdata[idx] & 0x1F)) { |
847 | switch ((idx_value & 0x1F)) { |
930 | case R300_TX_FORMAT_X8: |
848 | case R300_TX_FORMAT_X8: |
931 | case R300_TX_FORMAT_Y4X4: |
849 | case R300_TX_FORMAT_Y4X4: |
932 | case R300_TX_FORMAT_Z3Y3X2: |
850 | case R300_TX_FORMAT_Z3Y3X2: |
933 | track->textures[i].cpp = 1; |
851 | track->textures[i].cpp = 1; |
934 | break; |
852 | break; |
935 | case R300_TX_FORMAT_X16: |
853 | case R300_TX_FORMAT_X16: |
936 | case R300_TX_FORMAT_Y8X8: |
854 | case R300_TX_FORMAT_Y8X8: |
937 | case R300_TX_FORMAT_Z5Y6X5: |
855 | case R300_TX_FORMAT_Z5Y6X5: |
938 | case R300_TX_FORMAT_Z6Y5X5: |
856 | case R300_TX_FORMAT_Z6Y5X5: |
939 | case R300_TX_FORMAT_W4Z4Y4X4: |
857 | case R300_TX_FORMAT_W4Z4Y4X4: |
940 | case R300_TX_FORMAT_W1Z5Y5X5: |
858 | case R300_TX_FORMAT_W1Z5Y5X5: |
941 | case R300_TX_FORMAT_DXT1: |
859 | case R300_TX_FORMAT_DXT1: |
942 | case R300_TX_FORMAT_D3DMFT_CxV8U8: |
860 | case R300_TX_FORMAT_D3DMFT_CxV8U8: |
943 | case R300_TX_FORMAT_B8G8_B8G8: |
861 | case R300_TX_FORMAT_B8G8_B8G8: |
944 | case R300_TX_FORMAT_G8R8_G8B8: |
862 | case R300_TX_FORMAT_G8R8_G8B8: |
945 | track->textures[i].cpp = 2; |
863 | track->textures[i].cpp = 2; |
946 | break; |
864 | break; |
947 | case R300_TX_FORMAT_Y16X16: |
865 | case R300_TX_FORMAT_Y16X16: |
948 | case R300_TX_FORMAT_Z11Y11X10: |
866 | case R300_TX_FORMAT_Z11Y11X10: |
949 | case R300_TX_FORMAT_Z10Y11X11: |
867 | case R300_TX_FORMAT_Z10Y11X11: |
950 | case R300_TX_FORMAT_W8Z8Y8X8: |
868 | case R300_TX_FORMAT_W8Z8Y8X8: |
951 | case R300_TX_FORMAT_W2Z10Y10X10: |
869 | case R300_TX_FORMAT_W2Z10Y10X10: |
952 | case 0x17: |
870 | case 0x17: |
953 | case R300_TX_FORMAT_FL_I32: |
871 | case R300_TX_FORMAT_FL_I32: |
954 | case 0x1e: |
872 | case 0x1e: |
955 | case R300_TX_FORMAT_DXT3: |
873 | case R300_TX_FORMAT_DXT3: |
956 | case R300_TX_FORMAT_DXT5: |
874 | case R300_TX_FORMAT_DXT5: |
957 | track->textures[i].cpp = 4; |
875 | track->textures[i].cpp = 4; |
958 | break; |
876 | break; |
959 | case R300_TX_FORMAT_W16Z16Y16X16: |
877 | case R300_TX_FORMAT_W16Z16Y16X16: |
960 | case R300_TX_FORMAT_FL_R16G16B16A16: |
878 | case R300_TX_FORMAT_FL_R16G16B16A16: |
961 | case R300_TX_FORMAT_FL_I32A32: |
879 | case R300_TX_FORMAT_FL_I32A32: |
962 | track->textures[i].cpp = 8; |
880 | track->textures[i].cpp = 8; |
963 | break; |
881 | break; |
964 | case R300_TX_FORMAT_FL_R32G32B32A32: |
882 | case R300_TX_FORMAT_FL_R32G32B32A32: |
965 | track->textures[i].cpp = 16; |
883 | track->textures[i].cpp = 16; |
966 | break; |
884 | break; |
967 | default: |
885 | default: |
968 | DRM_ERROR("Invalid texture format %u\n", |
886 | DRM_ERROR("Invalid texture format %u\n", |
969 | (ib_chunk->kdata[idx] & 0x1F)); |
887 | (idx_value & 0x1F)); |
970 | return -EINVAL; |
888 | return -EINVAL; |
971 | break; |
889 | break; |
972 | } |
890 | } |
973 | break; |
891 | break; |
974 | case 0x4400: |
892 | case 0x4400: |
975 | case 0x4404: |
893 | case 0x4404: |
976 | case 0x4408: |
894 | case 0x4408: |
977 | case 0x440C: |
895 | case 0x440C: |
978 | case 0x4410: |
896 | case 0x4410: |
979 | case 0x4414: |
897 | case 0x4414: |
980 | case 0x4418: |
898 | case 0x4418: |
981 | case 0x441C: |
899 | case 0x441C: |
982 | case 0x4420: |
900 | case 0x4420: |
983 | case 0x4424: |
901 | case 0x4424: |
984 | case 0x4428: |
902 | case 0x4428: |
985 | case 0x442C: |
903 | case 0x442C: |
986 | case 0x4430: |
904 | case 0x4430: |
987 | case 0x4434: |
905 | case 0x4434: |
988 | case 0x4438: |
906 | case 0x4438: |
989 | case 0x443C: |
907 | case 0x443C: |
990 | /* TX_FILTER0_[0-15] */ |
908 | /* TX_FILTER0_[0-15] */ |
991 | i = (reg - 0x4400) >> 2; |
909 | i = (reg - 0x4400) >> 2; |
992 | tmp = ib_chunk->kdata[idx] & 0x7; |
910 | tmp = idx_value & 0x7; |
993 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
911 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
994 | track->textures[i].roundup_w = false; |
912 | track->textures[i].roundup_w = false; |
995 | } |
913 | } |
996 | tmp = (ib_chunk->kdata[idx] >> 3) & 0x7; |
914 | tmp = (idx_value >> 3) & 0x7; |
997 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
915 | if (tmp == 2 || tmp == 4 || tmp == 6) { |
998 | track->textures[i].roundup_h = false; |
916 | track->textures[i].roundup_h = false; |
999 | } |
917 | } |
1000 | break; |
918 | break; |
1001 | case 0x4500: |
919 | case 0x4500: |
1002 | case 0x4504: |
920 | case 0x4504: |
1003 | case 0x4508: |
921 | case 0x4508: |
1004 | case 0x450C: |
922 | case 0x450C: |
1005 | case 0x4510: |
923 | case 0x4510: |
1006 | case 0x4514: |
924 | case 0x4514: |
1007 | case 0x4518: |
925 | case 0x4518: |
1008 | case 0x451C: |
926 | case 0x451C: |
1009 | case 0x4520: |
927 | case 0x4520: |
1010 | case 0x4524: |
928 | case 0x4524: |
1011 | case 0x4528: |
929 | case 0x4528: |
1012 | case 0x452C: |
930 | case 0x452C: |
1013 | case 0x4530: |
931 | case 0x4530: |
1014 | case 0x4534: |
932 | case 0x4534: |
1015 | case 0x4538: |
933 | case 0x4538: |
1016 | case 0x453C: |
934 | case 0x453C: |
1017 | /* TX_FORMAT2_[0-15] */ |
935 | /* TX_FORMAT2_[0-15] */ |
1018 | i = (reg - 0x4500) >> 2; |
936 | i = (reg - 0x4500) >> 2; |
1019 | tmp = ib_chunk->kdata[idx] & 0x3FFF; |
937 | tmp = idx_value & 0x3FFF; |
1020 | track->textures[i].pitch = tmp + 1; |
938 | track->textures[i].pitch = tmp + 1; |
1021 | if (p->rdev->family >= CHIP_RV515) { |
939 | if (p->rdev->family >= CHIP_RV515) { |
1022 | tmp = ((ib_chunk->kdata[idx] >> 15) & 1) << 11; |
940 | tmp = ((idx_value >> 15) & 1) << 11; |
1023 | track->textures[i].width_11 = tmp; |
941 | track->textures[i].width_11 = tmp; |
1024 | tmp = ((ib_chunk->kdata[idx] >> 16) & 1) << 11; |
942 | tmp = ((idx_value >> 16) & 1) << 11; |
1025 | track->textures[i].height_11 = tmp; |
943 | track->textures[i].height_11 = tmp; |
1026 | } |
944 | } |
1027 | break; |
945 | break; |
1028 | case 0x4480: |
946 | case 0x4480: |
1029 | case 0x4484: |
947 | case 0x4484: |
1030 | case 0x4488: |
948 | case 0x4488: |
1031 | case 0x448C: |
949 | case 0x448C: |
1032 | case 0x4490: |
950 | case 0x4490: |
1033 | case 0x4494: |
951 | case 0x4494: |
1034 | case 0x4498: |
952 | case 0x4498: |
1035 | case 0x449C: |
953 | case 0x449C: |
1036 | case 0x44A0: |
954 | case 0x44A0: |
1037 | case 0x44A4: |
955 | case 0x44A4: |
1038 | case 0x44A8: |
956 | case 0x44A8: |
1039 | case 0x44AC: |
957 | case 0x44AC: |
1040 | case 0x44B0: |
958 | case 0x44B0: |
1041 | case 0x44B4: |
959 | case 0x44B4: |
1042 | case 0x44B8: |
960 | case 0x44B8: |
1043 | case 0x44BC: |
961 | case 0x44BC: |
1044 | /* TX_FORMAT0_[0-15] */ |
962 | /* TX_FORMAT0_[0-15] */ |
1045 | i = (reg - 0x4480) >> 2; |
963 | i = (reg - 0x4480) >> 2; |
1046 | tmp = ib_chunk->kdata[idx] & 0x7FF; |
964 | tmp = idx_value & 0x7FF; |
1047 | track->textures[i].width = tmp + 1; |
965 | track->textures[i].width = tmp + 1; |
1048 | tmp = (ib_chunk->kdata[idx] >> 11) & 0x7FF; |
966 | tmp = (idx_value >> 11) & 0x7FF; |
1049 | track->textures[i].height = tmp + 1; |
967 | track->textures[i].height = tmp + 1; |
1050 | tmp = (ib_chunk->kdata[idx] >> 26) & 0xF; |
968 | tmp = (idx_value >> 26) & 0xF; |
1051 | track->textures[i].num_levels = tmp; |
969 | track->textures[i].num_levels = tmp; |
1052 | tmp = ib_chunk->kdata[idx] & (1 << 31); |
970 | tmp = idx_value & (1 << 31); |
1053 | track->textures[i].use_pitch = !!tmp; |
971 | track->textures[i].use_pitch = !!tmp; |
1054 | tmp = (ib_chunk->kdata[idx] >> 22) & 0xF; |
972 | tmp = (idx_value >> 22) & 0xF; |
1055 | track->textures[i].txdepth = tmp; |
973 | track->textures[i].txdepth = tmp; |
1056 | break; |
974 | break; |
1057 | case R300_ZB_ZPASS_ADDR: |
975 | case R300_ZB_ZPASS_ADDR: |
1058 | r = r100_cs_packet_next_reloc(p, &reloc); |
976 | r = r100_cs_packet_next_reloc(p, &reloc); |
1059 | if (r) { |
977 | if (r) { |
1060 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
978 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", |
1061 | idx, reg); |
979 | idx, reg); |
1062 | r100_cs_dump_packet(p, pkt); |
980 | r100_cs_dump_packet(p, pkt); |
1063 | return r; |
981 | return r; |
1064 | } |
982 | } |
1065 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); |
983 | ib[idx] = idx_value + ((u32)reloc->lobj.gpu_offset); |
1066 | break; |
984 | break; |
1067 | case 0x4be8: |
985 | case 0x4be8: |
1068 | /* valid register only on RV530 */ |
986 | /* valid register only on RV530 */ |
1069 | if (p->rdev->family == CHIP_RV530) |
987 | if (p->rdev->family == CHIP_RV530) |
1070 | break; |
988 | break; |
1071 | /* fallthrough do not move */ |
989 | /* fallthrough do not move */ |
1072 | default: |
990 | default: |
1073 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", |
991 | printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", |
1074 | reg, idx); |
992 | reg, idx); |
1075 | return -EINVAL; |
993 | return -EINVAL; |
1076 | } |
994 | } |
1077 | return 0; |
995 | return 0; |
1078 | } |
996 | } |
1079 | 997 | ||
1080 | static int r300_packet3_check(struct radeon_cs_parser *p, |
998 | static int r300_packet3_check(struct radeon_cs_parser *p, |
1081 | struct radeon_cs_packet *pkt) |
999 | struct radeon_cs_packet *pkt) |
1082 | { |
1000 | { |
1083 | struct radeon_cs_chunk *ib_chunk; |
- | |
1084 | - | ||
1085 | struct radeon_cs_reloc *reloc; |
1001 | struct radeon_cs_reloc *reloc; |
1086 | struct r100_cs_track *track; |
1002 | struct r100_cs_track *track; |
1087 | volatile uint32_t *ib; |
1003 | volatile uint32_t *ib; |
1088 | unsigned idx; |
1004 | unsigned idx; |
1089 | unsigned i, c; |
- | |
1090 | int r; |
1005 | int r; |
1091 | 1006 | ||
1092 | ib = p->ib->ptr; |
1007 | ib = p->ib->ptr; |
1093 | ib_chunk = &p->chunks[p->chunk_ib_idx]; |
- | |
1094 | idx = pkt->idx + 1; |
1008 | idx = pkt->idx + 1; |
1095 | track = (struct r100_cs_track *)p->track; |
1009 | track = (struct r100_cs_track *)p->track; |
1096 | switch(pkt->opcode) { |
1010 | switch(pkt->opcode) { |
1097 | case PACKET3_3D_LOAD_VBPNTR: |
1011 | case PACKET3_3D_LOAD_VBPNTR: |
1098 | c = ib_chunk->kdata[idx++] & 0x1F; |
- | |
1099 | track->num_arrays = c; |
- | |
1100 | for (i = 0; i < (c - 1); i+=2, idx+=3) { |
- | |
1101 | r = r100_cs_packet_next_reloc(p, &reloc); |
1012 | r = r100_packet3_load_vbpntr(p, pkt, idx); |
1102 | if (r) { |
- | |
1103 | DRM_ERROR("No reloc for packet3 %d\n", |
- | |
1104 | pkt->opcode); |
- | |
1105 | r100_cs_dump_packet(p, pkt); |
- | |
1106 | return r; |
- | |
1107 | } |
- | |
1108 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
- | |
1109 | track->arrays[i + 0].robj = reloc->robj; |
- | |
1110 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; |
- | |
1111 | track->arrays[i + 0].esize &= 0x7F; |
- | |
1112 | r = r100_cs_packet_next_reloc(p, &reloc); |
- | |
1113 | if (r) { |
- | |
1114 | DRM_ERROR("No reloc for packet3 %d\n", |
- | |
1115 | pkt->opcode); |
- | |
1116 | r100_cs_dump_packet(p, pkt); |
- | |
1117 | return r; |
- | |
1118 | } |
- | |
1119 | ib[idx+2] = ib_chunk->kdata[idx+2] + ((u32)reloc->lobj.gpu_offset); |
- | |
1120 | track->arrays[i + 1].robj = reloc->robj; |
- | |
1121 | track->arrays[i + 1].esize = ib_chunk->kdata[idx] >> 24; |
- | |
1122 | track->arrays[i + 1].esize &= 0x7F; |
- | |
1123 | } |
- | |
1124 | if (c & 1) { |
- | |
1125 | r = r100_cs_packet_next_reloc(p, &reloc); |
- | |
1126 | if (r) { |
1013 | if (r) |
1127 | DRM_ERROR("No reloc for packet3 %d\n", |
- | |
1128 | pkt->opcode); |
- | |
1129 | r100_cs_dump_packet(p, pkt); |
- | |
1130 | return r; |
1014 | return r; |
1131 | } |
- | |
1132 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
- | |
1133 | track->arrays[i + 0].robj = reloc->robj; |
- | |
1134 | track->arrays[i + 0].esize = ib_chunk->kdata[idx] >> 8; |
- | |
1135 | track->arrays[i + 0].esize &= 0x7F; |
- | |
1136 | } |
- | |
1137 | break; |
1015 | break; |
1138 | case PACKET3_INDX_BUFFER: |
1016 | case PACKET3_INDX_BUFFER: |
1139 | r = r100_cs_packet_next_reloc(p, &reloc); |
1017 | r = r100_cs_packet_next_reloc(p, &reloc); |
1140 | if (r) { |
1018 | if (r) { |
1141 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1019 | DRM_ERROR("No reloc for packet3 %d\n", pkt->opcode); |
1142 | r100_cs_dump_packet(p, pkt); |
1020 | r100_cs_dump_packet(p, pkt); |
1143 | return r; |
1021 | return r; |
1144 | } |
1022 | } |
1145 | ib[idx+1] = ib_chunk->kdata[idx+1] + ((u32)reloc->lobj.gpu_offset); |
1023 | ib[idx+1] = radeon_get_ib_value(p, idx + 1) + ((u32)reloc->lobj.gpu_offset); |
1146 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1024 | r = r100_cs_track_check_pkt3_indx_buffer(p, pkt, reloc->robj); |
1147 | if (r) { |
1025 | if (r) { |
1148 | return r; |
1026 | return r; |
1149 | } |
1027 | } |
1150 | break; |
1028 | break; |
1151 | /* Draw packet */ |
1029 | /* Draw packet */ |
1152 | case PACKET3_3D_DRAW_IMMD: |
1030 | case PACKET3_3D_DRAW_IMMD: |
1153 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1031 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1154 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1032 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1155 | * in cmd stream */ |
1033 | * in cmd stream */ |
1156 | if (((ib_chunk->kdata[idx+1] >> 4) & 0x3) != 3) { |
1034 | if (((radeon_get_ib_value(p, idx + 1) >> 4) & 0x3) != 3) { |
1157 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1035 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1158 | return -EINVAL; |
1036 | return -EINVAL; |
1159 | } |
1037 | } |
1160 | track->vap_vf_cntl = ib_chunk->kdata[idx+1]; |
1038 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1161 | track->immd_dwords = pkt->count - 1; |
1039 | track->immd_dwords = pkt->count - 1; |
1162 | r = r100_cs_track_check(p->rdev, track); |
1040 | r = r100_cs_track_check(p->rdev, track); |
1163 | if (r) { |
1041 | if (r) { |
1164 | return r; |
1042 | return r; |
1165 | } |
1043 | } |
1166 | break; |
1044 | break; |
1167 | case PACKET3_3D_DRAW_IMMD_2: |
1045 | case PACKET3_3D_DRAW_IMMD_2: |
1168 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1046 | /* Number of dwords is vtx_size * (num_vertices - 1) |
1169 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1047 | * PRIM_WALK must be equal to 3 vertex data in embedded |
1170 | * in cmd stream */ |
1048 | * in cmd stream */ |
1171 | if (((ib_chunk->kdata[idx] >> 4) & 0x3) != 3) { |
1049 | if (((radeon_get_ib_value(p, idx) >> 4) & 0x3) != 3) { |
1172 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1050 | DRM_ERROR("PRIM_WALK must be 3 for IMMD draw\n"); |
1173 | return -EINVAL; |
1051 | return -EINVAL; |
1174 | } |
1052 | } |
1175 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
1053 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1176 | track->immd_dwords = pkt->count; |
1054 | track->immd_dwords = pkt->count; |
1177 | r = r100_cs_track_check(p->rdev, track); |
1055 | r = r100_cs_track_check(p->rdev, track); |
1178 | if (r) { |
1056 | if (r) { |
1179 | return r; |
1057 | return r; |
1180 | } |
1058 | } |
1181 | break; |
1059 | break; |
1182 | case PACKET3_3D_DRAW_VBUF: |
1060 | case PACKET3_3D_DRAW_VBUF: |
1183 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; |
1061 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1184 | r = r100_cs_track_check(p->rdev, track); |
1062 | r = r100_cs_track_check(p->rdev, track); |
1185 | if (r) { |
1063 | if (r) { |
1186 | return r; |
1064 | return r; |
1187 | } |
1065 | } |
1188 | break; |
1066 | break; |
1189 | case PACKET3_3D_DRAW_VBUF_2: |
1067 | case PACKET3_3D_DRAW_VBUF_2: |
1190 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
1068 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1191 | r = r100_cs_track_check(p->rdev, track); |
1069 | r = r100_cs_track_check(p->rdev, track); |
1192 | if (r) { |
1070 | if (r) { |
1193 | return r; |
1071 | return r; |
1194 | } |
1072 | } |
1195 | break; |
1073 | break; |
1196 | case PACKET3_3D_DRAW_INDX: |
1074 | case PACKET3_3D_DRAW_INDX: |
1197 | track->vap_vf_cntl = ib_chunk->kdata[idx + 1]; |
1075 | track->vap_vf_cntl = radeon_get_ib_value(p, idx + 1); |
1198 | r = r100_cs_track_check(p->rdev, track); |
1076 | r = r100_cs_track_check(p->rdev, track); |
1199 | if (r) { |
1077 | if (r) { |
1200 | return r; |
1078 | return r; |
1201 | } |
1079 | } |
1202 | break; |
1080 | break; |
1203 | case PACKET3_3D_DRAW_INDX_2: |
1081 | case PACKET3_3D_DRAW_INDX_2: |
1204 | track->vap_vf_cntl = ib_chunk->kdata[idx]; |
1082 | track->vap_vf_cntl = radeon_get_ib_value(p, idx); |
1205 | r = r100_cs_track_check(p->rdev, track); |
1083 | r = r100_cs_track_check(p->rdev, track); |
1206 | if (r) { |
1084 | if (r) { |
1207 | return r; |
1085 | return r; |
1208 | } |
1086 | } |
1209 | break; |
1087 | break; |
1210 | case PACKET3_NOP: |
1088 | case PACKET3_NOP: |
1211 | break; |
1089 | break; |
1212 | default: |
1090 | default: |
1213 | DRM_ERROR("Packet3 opcode %x not supported\n", pkt->opcode); |
1091 | DRM_ERROR("Packet3 opcode %x not supported\n", pkt->opcode); |
1214 | return -EINVAL; |
1092 | return -EINVAL; |
1215 | } |
1093 | } |
1216 | return 0; |
1094 | return 0; |
1217 | } |
1095 | } |
1218 | 1096 | ||
1219 | int r300_cs_parse(struct radeon_cs_parser *p) |
1097 | int r300_cs_parse(struct radeon_cs_parser *p) |
1220 | { |
1098 | { |
1221 | struct radeon_cs_packet pkt; |
1099 | struct radeon_cs_packet pkt; |
1222 | struct r100_cs_track *track; |
1100 | struct r100_cs_track *track; |
1223 | int r; |
1101 | int r; |
1224 | 1102 | ||
1225 | track = kzalloc(sizeof(*track), GFP_KERNEL); |
1103 | track = kzalloc(sizeof(*track), GFP_KERNEL); |
1226 | r100_cs_track_clear(p->rdev, track); |
1104 | r100_cs_track_clear(p->rdev, track); |
1227 | p->track = track; |
1105 | p->track = track; |
1228 | do { |
1106 | do { |
1229 | r = r100_cs_packet_parse(p, &pkt, p->idx); |
1107 | r = r100_cs_packet_parse(p, &pkt, p->idx); |
1230 | if (r) { |
1108 | if (r) { |
1231 | return r; |
1109 | return r; |
1232 | } |
1110 | } |
1233 | p->idx += pkt.count + 2; |
1111 | p->idx += pkt.count + 2; |
1234 | switch (pkt.type) { |
1112 | switch (pkt.type) { |
1235 | case PACKET_TYPE0: |
1113 | case PACKET_TYPE0: |
1236 | r = r100_cs_parse_packet0(p, &pkt, |
1114 | r = r100_cs_parse_packet0(p, &pkt, |
1237 | p->rdev->config.r300.reg_safe_bm, |
1115 | p->rdev->config.r300.reg_safe_bm, |
1238 | p->rdev->config.r300.reg_safe_bm_size, |
1116 | p->rdev->config.r300.reg_safe_bm_size, |
1239 | &r300_packet0_check); |
1117 | &r300_packet0_check); |
1240 | break; |
1118 | break; |
1241 | case PACKET_TYPE2: |
1119 | case PACKET_TYPE2: |
1242 | break; |
1120 | break; |
1243 | case PACKET_TYPE3: |
1121 | case PACKET_TYPE3: |
1244 | r = r300_packet3_check(p, &pkt); |
1122 | r = r300_packet3_check(p, &pkt); |
1245 | break; |
1123 | break; |
1246 | default: |
1124 | default: |
1247 | DRM_ERROR("Unknown packet type %d !\n", pkt.type); |
1125 | DRM_ERROR("Unknown packet type %d !\n", pkt.type); |
1248 | return -EINVAL; |
1126 | return -EINVAL; |
1249 | } |
1127 | } |
1250 | if (r) { |
1128 | if (r) { |
1251 | return r; |
1129 | return r; |
1252 | } |
1130 | } |
1253 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); |
1131 | } while (p->idx < p->chunks[p->chunk_ib_idx].length_dw); |
1254 | return 0; |
1132 | return 0; |
1255 | } |
1133 | } |
1256 | #endif |
1134 | #endif |
1257 | 1135 | ||
1258 | 1136 | ||
1259 | void r300_set_reg_safe(struct radeon_device *rdev) |
1137 | void r300_set_reg_safe(struct radeon_device *rdev) |
1260 | { |
1138 | { |
1261 | rdev->config.r300.reg_safe_bm = r300_reg_safe_bm; |
1139 | rdev->config.r300.reg_safe_bm = r300_reg_safe_bm; |
1262 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); |
1140 | rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r300_reg_safe_bm); |
1263 | } |
1141 | } |
1264 | - | ||
1265 | int r300_init(struct radeon_device *rdev) |
- | |
1266 | { |
- | |
1267 | r300_set_reg_safe(rdev); |
- | |
1268 | return 0; |
- | |
1269 | } |
- | |
1270 | 1142 | ||
1271 | void r300_mc_program(struct radeon_device *rdev) |
1143 | void r300_mc_program(struct radeon_device *rdev) |
1272 | { |
1144 | { |
1273 | struct r100_mc_save save; |
1145 | struct r100_mc_save save; |
1274 | int r; |
1146 | int r; |
1275 | 1147 | ||
1276 | r = r100_debugfs_mc_info_init(rdev); |
1148 | r = r100_debugfs_mc_info_init(rdev); |
1277 | if (r) { |
1149 | if (r) { |
1278 | dev_err(rdev->dev, "Failed to create r100_mc debugfs file.\n"); |
1150 | dev_err(rdev->dev, "Failed to create r100_mc debugfs file.\n"); |
1279 | } |
1151 | } |
1280 | 1152 | ||
1281 | /* Stops all mc clients */ |
1153 | /* Stops all mc clients */ |
1282 | r100_mc_stop(rdev, &save); |
1154 | r100_mc_stop(rdev, &save); |
1283 | if (rdev->flags & RADEON_IS_AGP) { |
1155 | if (rdev->flags & RADEON_IS_AGP) { |
1284 | WREG32(R_00014C_MC_AGP_LOCATION, |
1156 | WREG32(R_00014C_MC_AGP_LOCATION, |
1285 | S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) | |
1157 | S_00014C_MC_AGP_START(rdev->mc.gtt_start >> 16) | |
1286 | S_00014C_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); |
1158 | S_00014C_MC_AGP_TOP(rdev->mc.gtt_end >> 16)); |
1287 | WREG32(R_000170_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); |
1159 | WREG32(R_000170_AGP_BASE, lower_32_bits(rdev->mc.agp_base)); |
1288 | WREG32(R_00015C_AGP_BASE_2, |
1160 | WREG32(R_00015C_AGP_BASE_2, |
1289 | upper_32_bits(rdev->mc.agp_base) & 0xff); |
1161 | upper_32_bits(rdev->mc.agp_base) & 0xff); |
1290 | } else { |
1162 | } else { |
1291 | WREG32(R_00014C_MC_AGP_LOCATION, 0x0FFFFFFF); |
1163 | WREG32(R_00014C_MC_AGP_LOCATION, 0x0FFFFFFF); |
1292 | WREG32(R_000170_AGP_BASE, 0); |
1164 | WREG32(R_000170_AGP_BASE, 0); |
1293 | WREG32(R_00015C_AGP_BASE_2, 0); |
1165 | WREG32(R_00015C_AGP_BASE_2, 0); |
1294 | } |
1166 | } |
1295 | /* Wait for mc idle */ |
1167 | /* Wait for mc idle */ |
1296 | if (r300_mc_wait_for_idle(rdev)) |
1168 | if (r300_mc_wait_for_idle(rdev)) |
1297 | DRM_INFO("Failed to wait MC idle before programming MC.\n"); |
1169 | DRM_INFO("Failed to wait MC idle before programming MC.\n"); |
1298 | /* Program MC, should be a 32bits limited address space */ |
1170 | /* Program MC, should be a 32bits limited address space */ |
1299 | WREG32(R_000148_MC_FB_LOCATION, |
1171 | WREG32(R_000148_MC_FB_LOCATION, |
1300 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
1172 | S_000148_MC_FB_START(rdev->mc.vram_start >> 16) | |
1301 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
1173 | S_000148_MC_FB_TOP(rdev->mc.vram_end >> 16)); |
1302 | r100_mc_resume(rdev, &save); |
1174 | r100_mc_resume(rdev, &save); |
1303 | }>>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>><>><>><>><>>> |
1175 | } |
- | 1176 | ||
- | 1177 | void r300_clock_startup(struct radeon_device *rdev) |
|
- | 1178 | { |
|
- | 1179 | u32 tmp; |
|
- | 1180 | ||
- | 1181 | if (radeon_dynclks != -1 && radeon_dynclks) |
|
- | 1182 | radeon_legacy_set_clock_gating(rdev, 1); |
|
- | 1183 | /* We need to force on some of the block */ |
|
- | 1184 | tmp = RREG32_PLL(R_00000D_SCLK_CNTL); |
|
- | 1185 | tmp |= S_00000D_FORCE_CP(1) | S_00000D_FORCE_VIP(1); |
|
- | 1186 | if ((rdev->family == CHIP_RV350) || (rdev->family == CHIP_RV380)) |
|
- | 1187 | tmp |= S_00000D_FORCE_VAP(1); |
|
- | 1188 | WREG32_PLL(R_00000D_SCLK_CNTL, tmp); |
|
- | 1189 | } |
|
- | 1190 | ||
- | 1191 | static int r300_startup(struct radeon_device *rdev) |
|
- | 1192 | { |
|
- | 1193 | int r; |
|
- | 1194 | ||
- | 1195 | r300_mc_program(rdev); |
|
- | 1196 | /* Resume clock */ |
|
- | 1197 | r300_clock_startup(rdev); |
|
- | 1198 | /* Initialize GPU configuration (# pipes, ...) */ |
|
- | 1199 | r300_gpu_init(rdev); |
|
- | 1200 | /* Initialize GART (initialize after TTM so we can allocate |
|
- | 1201 | * memory through TTM but finalize after TTM) */ |
|
- | 1202 | if (rdev->flags & RADEON_IS_PCIE) { |
|
- | 1203 | r = rv370_pcie_gart_enable(rdev); |
|
- | 1204 | if (r) |
|
- | 1205 | return r; |
|
- | 1206 | } |
|
- | 1207 | if (rdev->flags & RADEON_IS_PCI) { |
|
- | 1208 | r = r100_pci_gart_enable(rdev); |
|
- | 1209 | if (r) |
|
- | 1210 | return r; |
|
- | 1211 | } |
|
- | 1212 | /* Enable IRQ */ |
|
- | 1213 | // rdev->irq.sw_int = true; |
|
- | 1214 | // r100_irq_set(rdev); |
|
- | 1215 | /* 1M ring buffer */ |
|
- | 1216 | // r = r100_cp_init(rdev, 1024 * 1024); |
|
- | 1217 | // if (r) { |
|
- | 1218 | // dev_err(rdev->dev, "failled initializing CP (%d).\n", r); |
|
- | 1219 | // return r; |
|
- | 1220 | // } |
|
- | 1221 | // r = r100_wb_init(rdev); |
|
- | 1222 | // if (r) |
|
- | 1223 | // dev_err(rdev->dev, "failled initializing WB (%d).\n", r); |
|
- | 1224 | // r = r100_ib_init(rdev); |
|
- | 1225 | // if (r) { |
|
- | 1226 | // dev_err(rdev->dev, "failled initializing IB (%d).\n", r); |
|
- | 1227 | // return r; |
|
- | 1228 | // } |
|
- | 1229 | return 0; |
|
- | 1230 | } |
|
- | 1231 | ||
- | 1232 | ||
- | 1233 | ||
- | 1234 | ||
- | 1235 | ||
- | 1236 | int r300_init(struct radeon_device *rdev) |
|
- | 1237 | { |
|
- | 1238 | int r; |
|
- | 1239 | ||
- | 1240 | /* Disable VGA */ |
|
- | 1241 | r100_vga_render_disable(rdev); |
|
- | 1242 | /* Initialize scratch registers */ |
|
- | 1243 | radeon_scratch_init(rdev); |
|
- | 1244 | /* Initialize surface registers */ |
|
- | 1245 | radeon_surface_init(rdev); |
|
- | 1246 | /* TODO: disable VGA need to use VGA request */ |
|
- | 1247 | /* BIOS*/ |
|
- | 1248 | if (!radeon_get_bios(rdev)) { |
|
- | 1249 | if (ASIC_IS_AVIVO(rdev)) |
|
- | 1250 | return -EINVAL; |
|
- | 1251 | } |
|
- | 1252 | if (rdev->is_atom_bios) { |
|
- | 1253 | dev_err(rdev->dev, "Expecting combios for RS400/RS480 GPU\n"); |
|
- | 1254 | return -EINVAL; |
|
- | 1255 | } else { |
|
- | 1256 | r = radeon_combios_init(rdev); |
|
- | 1257 | if (r) |
|
- | 1258 | return r; |
|
- | 1259 | } |
|
- | 1260 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ |
|
- | 1261 | if (radeon_gpu_reset(rdev)) { |
|
- | 1262 | dev_warn(rdev->dev, |
|
- | 1263 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", |
|
- | 1264 | RREG32(R_000E40_RBBM_STATUS), |
|
- | 1265 | RREG32(R_0007C0_CP_STAT)); |
|
- | 1266 | } |
|
- | 1267 | /* check if cards are posted or not */ |
|
- | 1268 | if (!radeon_card_posted(rdev) && rdev->bios) { |
|
- | 1269 | DRM_INFO("GPU not posted. posting now...\n"); |
|
- | 1270 | radeon_combios_asic_init(rdev->ddev); |
|
- | 1271 | } |
|
- | 1272 | /* Set asic errata */ |
|
- | 1273 | r300_errata(rdev); |
|
- | 1274 | /* Initialize clocks */ |
|
- | 1275 | radeon_get_clock_info(rdev->ddev); |
|
- | 1276 | /* Get vram informations */ |
|
- | 1277 | r300_vram_info(rdev); |
|
- | 1278 | /* Initialize memory controller (also test AGP) */ |
|
- | 1279 | r = r420_mc_init(rdev); |
|
- | 1280 | if (r) |
|
- | 1281 | return r; |
|
- | 1282 | /* Fence driver */ |
|
- | 1283 | // r = radeon_fence_driver_init(rdev); |
|
- | 1284 | // if (r) |
|
- | 1285 | // return r; |
|
- | 1286 | // r = radeon_irq_kms_init(rdev); |
|
- | 1287 | // if (r) |
|
- | 1288 | // return r; |
|
- | 1289 | /* Memory manager */ |
|
- | 1290 | r = radeon_object_init(rdev); |
|
- | 1291 | if (r) |
|
- | 1292 | return r; |
|
- | 1293 | if (rdev->flags & RADEON_IS_PCIE) { |
|
- | 1294 | r = rv370_pcie_gart_init(rdev); |
|
- | 1295 | if (r) |
|
- | 1296 | return r; |
|
- | 1297 | } |
|
- | 1298 | if (rdev->flags & RADEON_IS_PCI) { |
|
- | 1299 | r = r100_pci_gart_init(rdev); |
|
- | 1300 | if (r) |
|
- | 1301 | return r; |
|
- | 1302 | } |
|
- | 1303 | r300_set_reg_safe(rdev); |
|
- | 1304 | rdev->accel_working = true; |
|
- | 1305 | r = r300_startup(rdev); |
|
- | 1306 | if (r) { |
|
- | 1307 | /* Somethings want wront with the accel init stop accel */ |
|
- | 1308 | dev_err(rdev->dev, "Disabling GPU acceleration\n"); |
|
- | 1309 | // r300_suspend(rdev); |
|
- | 1310 | // r100_cp_fini(rdev); |
|
- | 1311 | // r100_wb_fini(rdev); |
|
- | 1312 | // r100_ib_fini(rdev); |
|
- | 1313 | if (rdev->flags & RADEON_IS_PCIE) |
|
- | 1314 | rv370_pcie_gart_fini(rdev); |
|
- | 1315 | if (rdev->flags & RADEON_IS_PCI) |
|
- | 1316 | r100_pci_gart_fini(rdev); |
|
- | 1317 | // radeon_irq_kms_fini(rdev); |
|
- | 1318 | rdev->accel_working = false; |
|
- | 1319 | } |
|
- | 1320 | return 0; |
|
- | 1321 | }>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>>><>><>>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>><>><>><>><>><>><>><>><>>> |