diff options
author | Dave Airlie <airlied@redhat.com> | 2008-02-07 00:01:05 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2008-02-07 00:13:40 -0500 |
commit | 3d5e2c13b13468f5eb2ac9323690af7e17f195fe (patch) | |
tree | c282c2a8413ca5096877360d86402df08bec6b3a /drivers/char | |
parent | 576cc458a64673ecf3fa7f1bab751e52fd939071 (diff) |
drm: add initial r500 drm support
This adds CP support for the r500 series of chips, and allows
accel 2D support on these chips with a new radeon driver.
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/drm/drm_pciids.h | 95 | ||||
-rw-r--r-- | drivers/char/drm/r300_cmdbuf.c | 39 | ||||
-rw-r--r-- | drivers/char/drm/radeon_cp.c | 135 | ||||
-rw-r--r-- | drivers/char/drm/radeon_drm.h | 1 | ||||
-rw-r--r-- | drivers/char/drm/radeon_drv.h | 26 | ||||
-rw-r--r-- | drivers/char/drm/radeon_state.c | 3 |
6 files changed, 240 insertions, 59 deletions
diff --git a/drivers/char/drm/drm_pciids.h b/drivers/char/drm/drm_pciids.h index c69a4d095e2d..f52468843678 100644 --- a/drivers/char/drm/drm_pciids.h +++ b/drivers/char/drm/drm_pciids.h | |||
@@ -139,6 +139,101 @@ | |||
139 | {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ | 139 | {0x1002, 0x5e4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ |
140 | {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ | 140 | {0x1002, 0x5e4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ |
141 | {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ | 141 | {0x1002, 0x5e4f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ |
142 | {0x1002, 0x7100, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
143 | {0x1002, 0x7101, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
144 | {0x1002, 0x7102, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
145 | {0x1002, 0x7103, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
146 | {0x1002, 0x7104, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
147 | {0x1002, 0x7105, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
148 | {0x1002, 0x7106, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
149 | {0x1002, 0x7108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
150 | {0x1002, 0x7109, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
151 | {0x1002, 0x710A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
152 | {0x1002, 0x710B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
153 | {0x1002, 0x710C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
154 | {0x1002, 0x710E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
155 | {0x1002, 0x710F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R520|RADEON_NEW_MEMMAP}, \ | ||
156 | {0x1002, 0x7140, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
157 | {0x1002, 0x7141, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
158 | {0x1002, 0x7142, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
159 | {0x1002, 0x7143, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
160 | {0x1002, 0x7144, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
161 | {0x1002, 0x7145, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
162 | {0x1002, 0x7146, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
163 | {0x1002, 0x7147, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
164 | {0x1002, 0x7149, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
165 | {0x1002, 0x714A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
166 | {0x1002, 0x714B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
167 | {0x1002, 0x714C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
168 | {0x1002, 0x714D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
169 | {0x1002, 0x714E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
170 | {0x1002, 0x714F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
171 | {0x1002, 0x7151, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
172 | {0x1002, 0x7152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
173 | {0x1002, 0x7153, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
174 | {0x1002, 0x715E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
175 | {0x1002, 0x715F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
176 | {0x1002, 0x7180, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
177 | {0x1002, 0x7181, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
178 | {0x1002, 0x7183, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
179 | {0x1002, 0x7186, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
180 | {0x1002, 0x7187, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
181 | {0x1002, 0x7188, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
182 | {0x1002, 0x718A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
183 | {0x1002, 0x718B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
184 | {0x1002, 0x718C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
185 | {0x1002, 0x718D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
186 | {0x1002, 0x718F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
187 | {0x1002, 0x7193, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
188 | {0x1002, 0x7196, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
189 | {0x1002, 0x719B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
190 | {0x1002, 0x719F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV515|RADEON_NEW_MEMMAP}, \ | ||
191 | {0x1002, 0x71C0, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
192 | {0x1002, 0x71C1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
193 | {0x1002, 0x71C2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
194 | {0x1002, 0x71C3, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
195 | {0x1002, 0x71C4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
196 | {0x1002, 0x71C5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
197 | {0x1002, 0x71C6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
198 | {0x1002, 0x71C7, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
199 | {0x1002, 0x71CD, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
200 | {0x1002, 0x71CE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
201 | {0x1002, 0x71D2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
202 | {0x1002, 0x71D4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
203 | {0x1002, 0x71D5, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
204 | {0x1002, 0x71D6, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
205 | {0x1002, 0x71DA, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
206 | {0x1002, 0x71DE, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
207 | {0x1002, 0x7200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_NEW_MEMMAP}, \ | ||
208 | {0x1002, 0x7210, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
209 | {0x1002, 0x7211, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV530|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
210 | {0x1002, 0x7240, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
211 | {0x1002, 0x7243, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
212 | {0x1002, 0x7244, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
213 | {0x1002, 0x7245, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
214 | {0x1002, 0x7246, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
215 | {0x1002, 0x7247, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
216 | {0x1002, 0x7248, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
217 | {0x1002, 0x7249, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
218 | {0x1002, 0x724A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
219 | {0x1002, 0x724B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
220 | {0x1002, 0x724C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
221 | {0x1002, 0x724D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
222 | {0x1002, 0x724E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
223 | {0x1002, 0x724F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_NEW_MEMMAP}, \ | ||
224 | {0x1002, 0x7280, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV570|RADEON_NEW_MEMMAP}, \ | ||
225 | {0x1002, 0x7281, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV560|RADEON_NEW_MEMMAP}, \ | ||
226 | {0x1002, 0x7283, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV560|RADEON_NEW_MEMMAP}, \ | ||
227 | {0x1002, 0x7284, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R580|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | ||
228 | {0x1002, 0x7287, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV560|RADEON_NEW_MEMMAP}, \ | ||
229 | {0x1002, 0x7288, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV570|RADEON_NEW_MEMMAP}, \ | ||
230 | {0x1002, 0x7289, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV570|RADEON_NEW_MEMMAP}, \ | ||
231 | {0x1002, 0x728B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV570|RADEON_NEW_MEMMAP}, \ | ||
232 | {0x1002, 0x728C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV570|RADEON_NEW_MEMMAP}, \ | ||
233 | {0x1002, 0x7290, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV560|RADEON_NEW_MEMMAP}, \ | ||
234 | {0x1002, 0x7291, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV560|RADEON_NEW_MEMMAP}, \ | ||
235 | {0x1002, 0x7293, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV560|RADEON_NEW_MEMMAP}, \ | ||
236 | {0x1002, 0x7297, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV560|RADEON_NEW_MEMMAP}, \ | ||
142 | {0x1002, 0x7834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_NEW_MEMMAP}, \ | 237 | {0x1002, 0x7834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_NEW_MEMMAP}, \ |
143 | {0x1002, 0x7835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ | 238 | {0x1002, 0x7835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
144 | {0, 0, 0} | 239 | {0, 0, 0} |
diff --git a/drivers/char/drm/r300_cmdbuf.c b/drivers/char/drm/r300_cmdbuf.c index 8cd82710f6a0..0f4afc44245c 100644 --- a/drivers/char/drm/r300_cmdbuf.c +++ b/drivers/char/drm/r300_cmdbuf.c | |||
@@ -77,23 +77,31 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv, | |||
77 | return -EFAULT; | 77 | return -EFAULT; |
78 | } | 78 | } |
79 | 79 | ||
80 | box.x1 = | 80 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) { |
81 | (box.x1 + | 81 | box.x1 = (box.x1) & |
82 | R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK; | 82 | R300_CLIPRECT_MASK; |
83 | box.y1 = | 83 | box.y1 = (box.y1) & |
84 | (box.y1 + | 84 | R300_CLIPRECT_MASK; |
85 | R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK; | 85 | box.x2 = (box.x2) & |
86 | box.x2 = | 86 | R300_CLIPRECT_MASK; |
87 | (box.x2 + | 87 | box.y2 = (box.y2) & |
88 | R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK; | 88 | R300_CLIPRECT_MASK; |
89 | box.y2 = | 89 | } else { |
90 | (box.y2 + | 90 | box.x1 = (box.x1 + R300_CLIPRECT_OFFSET) & |
91 | R300_CLIPRECT_OFFSET) & R300_CLIPRECT_MASK; | 91 | R300_CLIPRECT_MASK; |
92 | box.y1 = (box.y1 + R300_CLIPRECT_OFFSET) & | ||
93 | R300_CLIPRECT_MASK; | ||
94 | box.x2 = (box.x2 + R300_CLIPRECT_OFFSET) & | ||
95 | R300_CLIPRECT_MASK; | ||
96 | box.y2 = (box.y2 + R300_CLIPRECT_OFFSET) & | ||
97 | R300_CLIPRECT_MASK; | ||
92 | 98 | ||
99 | } | ||
93 | OUT_RING((box.x1 << R300_CLIPRECT_X_SHIFT) | | 100 | OUT_RING((box.x1 << R300_CLIPRECT_X_SHIFT) | |
94 | (box.y1 << R300_CLIPRECT_Y_SHIFT)); | 101 | (box.y1 << R300_CLIPRECT_Y_SHIFT)); |
95 | OUT_RING((box.x2 << R300_CLIPRECT_X_SHIFT) | | 102 | OUT_RING((box.x2 << R300_CLIPRECT_X_SHIFT) | |
96 | (box.y2 << R300_CLIPRECT_Y_SHIFT)); | 103 | (box.y2 << R300_CLIPRECT_Y_SHIFT)); |
104 | |||
97 | } | 105 | } |
98 | 106 | ||
99 | OUT_RING_REG(R300_RE_CLIPRECT_CNTL, r300_cliprect_cntl[nr - 1]); | 107 | OUT_RING_REG(R300_RE_CLIPRECT_CNTL, r300_cliprect_cntl[nr - 1]); |
@@ -133,9 +141,11 @@ static int r300_emit_cliprects(drm_radeon_private_t *dev_priv, | |||
133 | 141 | ||
134 | static u8 r300_reg_flags[0x10000 >> 2]; | 142 | static u8 r300_reg_flags[0x10000 >> 2]; |
135 | 143 | ||
136 | void r300_init_reg_flags(void) | 144 | void r300_init_reg_flags(struct drm_device *dev) |
137 | { | 145 | { |
138 | int i; | 146 | int i; |
147 | drm_radeon_private_t *dev_priv = dev->dev_private; | ||
148 | |||
139 | memset(r300_reg_flags, 0, 0x10000 >> 2); | 149 | memset(r300_reg_flags, 0, 0x10000 >> 2); |
140 | #define ADD_RANGE_MARK(reg, count,mark) \ | 150 | #define ADD_RANGE_MARK(reg, count,mark) \ |
141 | for(i=((reg)>>2);i<((reg)>>2)+(count);i++)\ | 151 | for(i=((reg)>>2);i<((reg)>>2)+(count);i++)\ |
@@ -230,6 +240,9 @@ void r300_init_reg_flags(void) | |||
230 | ADD_RANGE(R300_VAP_INPUT_ROUTE_0_0, 8); | 240 | ADD_RANGE(R300_VAP_INPUT_ROUTE_0_0, 8); |
231 | ADD_RANGE(R300_VAP_INPUT_ROUTE_1_0, 8); | 241 | ADD_RANGE(R300_VAP_INPUT_ROUTE_1_0, 8); |
232 | 242 | ||
243 | if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RV515) { | ||
244 | ADD_RANGE(0x4074, 16); | ||
245 | } | ||
233 | } | 246 | } |
234 | 247 | ||
235 | static __inline__ int r300_check_range(unsigned reg, int count) | 248 | static __inline__ int r300_check_range(unsigned reg, int count) |
diff --git a/drivers/char/drm/radeon_cp.c b/drivers/char/drm/radeon_cp.c index 020323bd1626..5dc799ab86b8 100644 --- a/drivers/char/drm/radeon_cp.c +++ b/drivers/char/drm/radeon_cp.c | |||
@@ -816,6 +816,46 @@ static const u32 R300_cp_microcode[][2] = { | |||
816 | {0000000000, 0000000000}, | 816 | {0000000000, 0000000000}, |
817 | }; | 817 | }; |
818 | 818 | ||
819 | static u32 RADEON_READ_MCIND(drm_radeon_private_t *dev_priv, int addr) | ||
820 | { | ||
821 | u32 ret; | ||
822 | RADEON_WRITE(R520_MC_IND_INDEX, 0x7f0000 | (addr & 0xff)); | ||
823 | ret = RADEON_READ(R520_MC_IND_DATA); | ||
824 | RADEON_WRITE(R520_MC_IND_INDEX, 0); | ||
825 | return ret; | ||
826 | } | ||
827 | |||
828 | u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv) | ||
829 | { | ||
830 | |||
831 | if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) | ||
832 | return RADEON_READ_MCIND(dev_priv, RV515_MC_FB_LOCATION); | ||
833 | else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) | ||
834 | return RADEON_READ_MCIND(dev_priv, R520_MC_FB_LOCATION); | ||
835 | else | ||
836 | return RADEON_READ(RADEON_MC_FB_LOCATION); | ||
837 | } | ||
838 | |||
839 | static void radeon_write_fb_location(drm_radeon_private_t *dev_priv, u32 fb_loc) | ||
840 | { | ||
841 | if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) | ||
842 | RADEON_WRITE_MCIND(RV515_MC_FB_LOCATION, fb_loc); | ||
843 | else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) | ||
844 | RADEON_WRITE_MCIND(R520_MC_FB_LOCATION, fb_loc); | ||
845 | else | ||
846 | RADEON_WRITE(RADEON_MC_FB_LOCATION, fb_loc); | ||
847 | } | ||
848 | |||
849 | static void radeon_write_agp_location(drm_radeon_private_t *dev_priv, u32 agp_loc) | ||
850 | { | ||
851 | if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) | ||
852 | RADEON_WRITE_MCIND(RV515_MC_AGP_LOCATION, agp_loc); | ||
853 | else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) | ||
854 | RADEON_WRITE_MCIND(R520_MC_AGP_LOCATION, agp_loc); | ||
855 | else | ||
856 | RADEON_WRITE(RADEON_MC_AGP_LOCATION, agp_loc); | ||
857 | } | ||
858 | |||
819 | static int RADEON_READ_PLL(struct drm_device * dev, int addr) | 859 | static int RADEON_READ_PLL(struct drm_device * dev, int addr) |
820 | { | 860 | { |
821 | drm_radeon_private_t *dev_priv = dev->dev_private; | 861 | drm_radeon_private_t *dev_priv = dev->dev_private; |
@@ -824,7 +864,7 @@ static int RADEON_READ_PLL(struct drm_device * dev, int addr) | |||
824 | return RADEON_READ(RADEON_CLOCK_CNTL_DATA); | 864 | return RADEON_READ(RADEON_CLOCK_CNTL_DATA); |
825 | } | 865 | } |
826 | 866 | ||
827 | static int RADEON_READ_PCIE(drm_radeon_private_t *dev_priv, int addr) | 867 | static u32 RADEON_READ_PCIE(drm_radeon_private_t *dev_priv, int addr) |
828 | { | 868 | { |
829 | RADEON_WRITE8(RADEON_PCIE_INDEX, addr & 0xff); | 869 | RADEON_WRITE8(RADEON_PCIE_INDEX, addr & 0xff); |
830 | return RADEON_READ(RADEON_PCIE_DATA); | 870 | return RADEON_READ(RADEON_PCIE_DATA); |
@@ -1074,41 +1114,43 @@ static int radeon_do_engine_reset(struct drm_device * dev) | |||
1074 | 1114 | ||
1075 | radeon_do_pixcache_flush(dev_priv); | 1115 | radeon_do_pixcache_flush(dev_priv); |
1076 | 1116 | ||
1077 | clock_cntl_index = RADEON_READ(RADEON_CLOCK_CNTL_INDEX); | 1117 | if ((dev_priv->flags & RADEON_FAMILY_MASK) < CHIP_RV515) { |
1078 | mclk_cntl = RADEON_READ_PLL(dev, RADEON_MCLK_CNTL); | 1118 | clock_cntl_index = RADEON_READ(RADEON_CLOCK_CNTL_INDEX); |
1079 | 1119 | mclk_cntl = RADEON_READ_PLL(dev, RADEON_MCLK_CNTL); | |
1080 | RADEON_WRITE_PLL(RADEON_MCLK_CNTL, (mclk_cntl | | 1120 | |
1081 | RADEON_FORCEON_MCLKA | | 1121 | RADEON_WRITE_PLL(RADEON_MCLK_CNTL, (mclk_cntl | |
1082 | RADEON_FORCEON_MCLKB | | 1122 | RADEON_FORCEON_MCLKA | |
1083 | RADEON_FORCEON_YCLKA | | 1123 | RADEON_FORCEON_MCLKB | |
1084 | RADEON_FORCEON_YCLKB | | 1124 | RADEON_FORCEON_YCLKA | |
1085 | RADEON_FORCEON_MC | | 1125 | RADEON_FORCEON_YCLKB | |
1086 | RADEON_FORCEON_AIC)); | 1126 | RADEON_FORCEON_MC | |
1087 | 1127 | RADEON_FORCEON_AIC)); | |
1088 | rbbm_soft_reset = RADEON_READ(RADEON_RBBM_SOFT_RESET); | 1128 | |
1089 | 1129 | rbbm_soft_reset = RADEON_READ(RADEON_RBBM_SOFT_RESET); | |
1090 | RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset | | 1130 | |
1091 | RADEON_SOFT_RESET_CP | | 1131 | RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset | |
1092 | RADEON_SOFT_RESET_HI | | 1132 | RADEON_SOFT_RESET_CP | |
1093 | RADEON_SOFT_RESET_SE | | 1133 | RADEON_SOFT_RESET_HI | |
1094 | RADEON_SOFT_RESET_RE | | 1134 | RADEON_SOFT_RESET_SE | |
1095 | RADEON_SOFT_RESET_PP | | 1135 | RADEON_SOFT_RESET_RE | |
1096 | RADEON_SOFT_RESET_E2 | | 1136 | RADEON_SOFT_RESET_PP | |
1097 | RADEON_SOFT_RESET_RB)); | 1137 | RADEON_SOFT_RESET_E2 | |
1098 | RADEON_READ(RADEON_RBBM_SOFT_RESET); | 1138 | RADEON_SOFT_RESET_RB)); |
1099 | RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset & | 1139 | RADEON_READ(RADEON_RBBM_SOFT_RESET); |
1100 | ~(RADEON_SOFT_RESET_CP | | 1140 | RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset & |
1101 | RADEON_SOFT_RESET_HI | | 1141 | ~(RADEON_SOFT_RESET_CP | |
1102 | RADEON_SOFT_RESET_SE | | 1142 | RADEON_SOFT_RESET_HI | |
1103 | RADEON_SOFT_RESET_RE | | 1143 | RADEON_SOFT_RESET_SE | |
1104 | RADEON_SOFT_RESET_PP | | 1144 | RADEON_SOFT_RESET_RE | |
1105 | RADEON_SOFT_RESET_E2 | | 1145 | RADEON_SOFT_RESET_PP | |
1106 | RADEON_SOFT_RESET_RB))); | 1146 | RADEON_SOFT_RESET_E2 | |
1107 | RADEON_READ(RADEON_RBBM_SOFT_RESET); | 1147 | RADEON_SOFT_RESET_RB))); |
1108 | 1148 | RADEON_READ(RADEON_RBBM_SOFT_RESET); | |
1109 | RADEON_WRITE_PLL(RADEON_MCLK_CNTL, mclk_cntl); | 1149 | |
1110 | RADEON_WRITE(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); | 1150 | RADEON_WRITE_PLL(RADEON_MCLK_CNTL, mclk_cntl); |
1111 | RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); | 1151 | RADEON_WRITE(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); |
1152 | RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); | ||
1153 | } | ||
1112 | 1154 | ||
1113 | /* Reset the CP ring */ | 1155 | /* Reset the CP ring */ |
1114 | radeon_do_cp_reset(dev_priv); | 1156 | radeon_do_cp_reset(dev_priv); |
@@ -1134,14 +1176,14 @@ static void radeon_cp_init_ring_buffer(struct drm_device * dev, | |||
1134 | * always appended to the fb which is not necessarily the case | 1176 | * always appended to the fb which is not necessarily the case |
1135 | */ | 1177 | */ |
1136 | if (!dev_priv->new_memmap) | 1178 | if (!dev_priv->new_memmap) |
1137 | RADEON_WRITE(RADEON_MC_FB_LOCATION, | 1179 | radeon_write_fb_location(dev_priv, |
1138 | ((dev_priv->gart_vm_start - 1) & 0xffff0000) | 1180 | ((dev_priv->gart_vm_start - 1) & 0xffff0000) |
1139 | | (dev_priv->fb_location >> 16)); | 1181 | | (dev_priv->fb_location >> 16)); |
1140 | 1182 | ||
1141 | #if __OS_HAS_AGP | 1183 | #if __OS_HAS_AGP |
1142 | if (dev_priv->flags & RADEON_IS_AGP) { | 1184 | if (dev_priv->flags & RADEON_IS_AGP) { |
1143 | RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base); | 1185 | RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base); |
1144 | RADEON_WRITE(RADEON_MC_AGP_LOCATION, | 1186 | radeon_write_agp_location(dev_priv, |
1145 | (((dev_priv->gart_vm_start - 1 + | 1187 | (((dev_priv->gart_vm_start - 1 + |
1146 | dev_priv->gart_size) & 0xffff0000) | | 1188 | dev_priv->gart_size) & 0xffff0000) | |
1147 | (dev_priv->gart_vm_start >> 16))); | 1189 | (dev_priv->gart_vm_start >> 16))); |
@@ -1305,7 +1347,7 @@ static void radeon_set_igpgart(drm_radeon_private_t * dev_priv, int on) | |||
1305 | 1347 | ||
1306 | RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev_priv->gart_vm_start); | 1348 | RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev_priv->gart_vm_start); |
1307 | dev_priv->gart_size = 32*1024*1024; | 1349 | dev_priv->gart_size = 32*1024*1024; |
1308 | RADEON_WRITE(RADEON_MC_AGP_LOCATION, | 1350 | radeon_write_agp_location(dev_priv, |
1309 | (((dev_priv->gart_vm_start - 1 + | 1351 | (((dev_priv->gart_vm_start - 1 + |
1310 | dev_priv->gart_size) & 0xffff0000) | | 1352 | dev_priv->gart_size) & 0xffff0000) | |
1311 | (dev_priv->gart_vm_start >> 16))); | 1353 | (dev_priv->gart_vm_start >> 16))); |
@@ -1339,7 +1381,7 @@ static void radeon_set_pciegart(drm_radeon_private_t * dev_priv, int on) | |||
1339 | dev_priv->gart_vm_start + | 1381 | dev_priv->gart_vm_start + |
1340 | dev_priv->gart_size - 1); | 1382 | dev_priv->gart_size - 1); |
1341 | 1383 | ||
1342 | RADEON_WRITE(RADEON_MC_AGP_LOCATION, 0xffffffc0); /* ?? */ | 1384 | radeon_write_agp_location(dev_priv, 0xffffffc0); /* ?? */ |
1343 | 1385 | ||
1344 | RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL, | 1386 | RADEON_WRITE_PCIE(RADEON_PCIE_TX_GART_CNTL, |
1345 | RADEON_PCIE_TX_GART_EN); | 1387 | RADEON_PCIE_TX_GART_EN); |
@@ -1382,7 +1424,7 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on) | |||
1382 | 1424 | ||
1383 | /* Turn off AGP aperture -- is this required for PCI GART? | 1425 | /* Turn off AGP aperture -- is this required for PCI GART? |
1384 | */ | 1426 | */ |
1385 | RADEON_WRITE(RADEON_MC_AGP_LOCATION, 0xffffffc0); /* ?? */ | 1427 | radeon_write_agp_location(dev_priv, 0xffffffc0); |
1386 | RADEON_WRITE(RADEON_AGP_COMMAND, 0); /* clear AGP_COMMAND */ | 1428 | RADEON_WRITE(RADEON_AGP_COMMAND, 0); /* clear AGP_COMMAND */ |
1387 | } else { | 1429 | } else { |
1388 | RADEON_WRITE(RADEON_AIC_CNTL, | 1430 | RADEON_WRITE(RADEON_AIC_CNTL, |
@@ -1587,10 +1629,9 @@ static int radeon_do_init_cp(struct drm_device * dev, drm_radeon_init_t * init) | |||
1587 | dev->agp_buffer_map->handle); | 1629 | dev->agp_buffer_map->handle); |
1588 | } | 1630 | } |
1589 | 1631 | ||
1590 | dev_priv->fb_location = (RADEON_READ(RADEON_MC_FB_LOCATION) | 1632 | dev_priv->fb_location = (radeon_read_fb_location(dev_priv) & 0xffff) << 16; |
1591 | & 0xffff) << 16; | ||
1592 | dev_priv->fb_size = | 1633 | dev_priv->fb_size = |
1593 | ((RADEON_READ(RADEON_MC_FB_LOCATION) & 0xffff0000u) + 0x10000) | 1634 | ((radeon_read_fb_location(dev_priv) & 0xffff0000u) + 0x10000) |
1594 | - dev_priv->fb_location; | 1635 | - dev_priv->fb_location; |
1595 | 1636 | ||
1596 | dev_priv->front_pitch_offset = (((dev_priv->front_pitch / 64) << 22) | | 1637 | dev_priv->front_pitch_offset = (((dev_priv->front_pitch / 64) << 22) | |
@@ -1841,7 +1882,7 @@ int radeon_cp_init(struct drm_device *dev, void *data, struct drm_file *file_pri | |||
1841 | LOCK_TEST_WITH_RETURN(dev, file_priv); | 1882 | LOCK_TEST_WITH_RETURN(dev, file_priv); |
1842 | 1883 | ||
1843 | if (init->func == RADEON_INIT_R300_CP) | 1884 | if (init->func == RADEON_INIT_R300_CP) |
1844 | r300_init_reg_flags(); | 1885 | r300_init_reg_flags(dev); |
1845 | 1886 | ||
1846 | switch (init->func) { | 1887 | switch (init->func) { |
1847 | case RADEON_INIT_CP: | 1888 | case RADEON_INIT_CP: |
@@ -2250,6 +2291,10 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) | |||
2250 | case CHIP_R350: | 2291 | case CHIP_R350: |
2251 | case CHIP_R420: | 2292 | case CHIP_R420: |
2252 | case CHIP_RV410: | 2293 | case CHIP_RV410: |
2294 | case CHIP_RV515: | ||
2295 | case CHIP_R520: | ||
2296 | case CHIP_RV570: | ||
2297 | case CHIP_R580: | ||
2253 | dev_priv->flags |= RADEON_HAS_HIERZ; | 2298 | dev_priv->flags |= RADEON_HAS_HIERZ; |
2254 | break; | 2299 | break; |
2255 | default: | 2300 | default: |
diff --git a/drivers/char/drm/radeon_drm.h b/drivers/char/drm/radeon_drm.h index 5f8d0420634d..71e5b21fad2c 100644 --- a/drivers/char/drm/radeon_drm.h +++ b/drivers/char/drm/radeon_drm.h | |||
@@ -656,6 +656,7 @@ typedef struct drm_radeon_indirect { | |||
656 | #define RADEON_PARAM_SCRATCH_OFFSET 11 | 656 | #define RADEON_PARAM_SCRATCH_OFFSET 11 |
657 | #define RADEON_PARAM_CARD_TYPE 12 | 657 | #define RADEON_PARAM_CARD_TYPE 12 |
658 | #define RADEON_PARAM_VBLANK_CRTC 13 /* VBLANK CRTC */ | 658 | #define RADEON_PARAM_VBLANK_CRTC 13 /* VBLANK CRTC */ |
659 | #define RADEON_PARAM_FB_LOCATION 14 /* FB location */ | ||
659 | 660 | ||
660 | typedef struct drm_radeon_getparam { | 661 | typedef struct drm_radeon_getparam { |
661 | int param; | 662 | int param; |
diff --git a/drivers/char/drm/radeon_drv.h b/drivers/char/drm/radeon_drv.h index 443a8952eced..4434332c79bc 100644 --- a/drivers/char/drm/radeon_drv.h +++ b/drivers/char/drm/radeon_drv.h | |||
@@ -123,6 +123,12 @@ enum radeon_family { | |||
123 | CHIP_R420, | 123 | CHIP_R420, |
124 | CHIP_RV410, | 124 | CHIP_RV410, |
125 | CHIP_RS400, | 125 | CHIP_RS400, |
126 | CHIP_RV515, | ||
127 | CHIP_R520, | ||
128 | CHIP_RV530, | ||
129 | CHIP_RV560, | ||
130 | CHIP_RV570, | ||
131 | CHIP_R580, | ||
126 | CHIP_LAST, | 132 | CHIP_LAST, |
127 | }; | 133 | }; |
128 | 134 | ||
@@ -342,6 +348,7 @@ extern int radeon_cp_resume(struct drm_device *dev, void *data, struct drm_file | |||
342 | extern int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv); | 348 | extern int radeon_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv); |
343 | extern int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv); | 349 | extern int radeon_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv); |
344 | extern int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv); | 350 | extern int radeon_cp_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv); |
351 | extern u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv); | ||
345 | 352 | ||
346 | extern void radeon_freelist_reset(struct drm_device * dev); | 353 | extern void radeon_freelist_reset(struct drm_device * dev); |
347 | extern struct drm_buf *radeon_freelist_get(struct drm_device * dev); | 354 | extern struct drm_buf *radeon_freelist_get(struct drm_device * dev); |
@@ -388,7 +395,7 @@ extern long radeon_compat_ioctl(struct file *filp, unsigned int cmd, | |||
388 | unsigned long arg); | 395 | unsigned long arg); |
389 | 396 | ||
390 | /* r300_cmdbuf.c */ | 397 | /* r300_cmdbuf.c */ |
391 | extern void r300_init_reg_flags(void); | 398 | extern void r300_init_reg_flags(struct drm_device *dev); |
392 | 399 | ||
393 | extern int r300_do_cp_cmdbuf(struct drm_device * dev, | 400 | extern int r300_do_cp_cmdbuf(struct drm_device * dev, |
394 | struct drm_file *file_priv, | 401 | struct drm_file *file_priv, |
@@ -460,6 +467,16 @@ extern int r300_do_cp_cmdbuf(struct drm_device * dev, | |||
460 | #define RADEON_IGPGART_ENABLE 0x38 | 467 | #define RADEON_IGPGART_ENABLE 0x38 |
461 | #define RADEON_IGPGART_UNK_39 0x39 | 468 | #define RADEON_IGPGART_UNK_39 0x39 |
462 | 469 | ||
470 | #define R520_MC_IND_INDEX 0x70 | ||
471 | #define R520_MC_IND_WR_EN (1<<24) | ||
472 | #define R520_MC_IND_DATA 0x74 | ||
473 | |||
474 | #define RV515_MC_FB_LOCATION 0x01 | ||
475 | #define RV515_MC_AGP_LOCATION 0x02 | ||
476 | |||
477 | #define R520_MC_FB_LOCATION 0x04 | ||
478 | #define R520_MC_AGP_LOCATION 0x05 | ||
479 | |||
463 | #define RADEON_MPP_TB_CONFIG 0x01c0 | 480 | #define RADEON_MPP_TB_CONFIG 0x01c0 |
464 | #define RADEON_MEM_CNTL 0x0140 | 481 | #define RADEON_MEM_CNTL 0x0140 |
465 | #define RADEON_MEM_SDRAM_MODE_REG 0x0158 | 482 | #define RADEON_MEM_SDRAM_MODE_REG 0x0158 |
@@ -1052,6 +1069,13 @@ do { \ | |||
1052 | RADEON_WRITE( RADEON_PCIE_DATA, (val) ); \ | 1069 | RADEON_WRITE( RADEON_PCIE_DATA, (val) ); \ |
1053 | } while (0) | 1070 | } while (0) |
1054 | 1071 | ||
1072 | #define RADEON_WRITE_MCIND( addr, val ) \ | ||
1073 | do { \ | ||
1074 | RADEON_WRITE(R520_MC_IND_INDEX, 0xff0000 | ((addr) & 0xff)); \ | ||
1075 | RADEON_WRITE(R520_MC_IND_DATA, (val)); \ | ||
1076 | RADEON_WRITE(R520_MC_IND_INDEX, 0); \ | ||
1077 | } while (0) | ||
1078 | |||
1055 | #define CP_PACKET0( reg, n ) \ | 1079 | #define CP_PACKET0( reg, n ) \ |
1056 | (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) | 1080 | (RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2)) |
1057 | #define CP_PACKET0_TABLE( reg, n ) \ | 1081 | #define CP_PACKET0_TABLE( reg, n ) \ |
diff --git a/drivers/char/drm/radeon_state.c b/drivers/char/drm/radeon_state.c index 1dffdc3e7ef0..6f75512f591e 100644 --- a/drivers/char/drm/radeon_state.c +++ b/drivers/char/drm/radeon_state.c | |||
@@ -3034,6 +3034,9 @@ static int radeon_cp_getparam(struct drm_device *dev, void *data, struct drm_fil | |||
3034 | case RADEON_PARAM_VBLANK_CRTC: | 3034 | case RADEON_PARAM_VBLANK_CRTC: |
3035 | value = radeon_vblank_crtc_get(dev); | 3035 | value = radeon_vblank_crtc_get(dev); |
3036 | break; | 3036 | break; |
3037 | case RADEON_PARAM_FB_LOCATION: | ||
3038 | value = radeon_read_fb_location(dev_priv); | ||
3039 | break; | ||
3037 | default: | 3040 | default: |
3038 | DRM_DEBUG("Invalid parameter %d\n", param->param); | 3041 | DRM_DEBUG("Invalid parameter %d\n", param->param); |
3039 | return -EINVAL; | 3042 | return -EINVAL; |