Rev 6131 | Rev 6296 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6131 | Rev 6283 | ||
---|---|---|---|
Line 9... | Line 9... | ||
9 | #include |
9 | #include |
10 | 10 | ||
Line 11... | Line 11... | ||
11 | #include |
11 | #include |
Line 12... | Line 12... | ||
12 | 12 | ||
13 | #include "bitmap.h" |
13 | //#include "bitmap.h" |
Line -... | Line 14... | ||
- | 14 | #include |
|
- | 15 | ||
- | 16 | void FASTCALL sysSetFramebuffer(void *fb)__asm__("SetFramebuffer"); |
|
- | 17 | void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb); |
|
- | 18 | void init_system_cursors(struct drm_device *dev); |
|
Line 14... | Line 19... | ||
14 | #include |
19 | |
15 | - | ||
16 | - | ||
Line 17... | Line 20... | ||
17 | display_t *os_display; |
20 | addr_t dummy_fb_page; |
18 | struct drm_i915_gem_object *main_fb_obj; |
21 | |
Line 19... | Line 22... | ||
19 | struct drm_framebuffer *main_framebuffer; |
22 | display_t *os_display; |
20 | 23 | ||
Line 21... | Line -... | ||
21 | u32 cmd_buffer; |
- | |
22 | u32 cmd_offset; |
- | |
23 | - | ||
24 | void init_render(); |
- | |
25 | int sna_init(); |
- | |
26 | - | ||
27 | static cursor_t* __stdcall select_cursor_kms(cursor_t *cursor); |
- | |
28 | static void __stdcall move_cursor_kms(cursor_t *cursor, int x, int y); |
- | |
29 | - | ||
30 | void __stdcall restore_cursor(int x, int y) |
- | |
31 | {}; |
- | |
32 | 24 | u32 cmd_buffer; |
|
33 | void disable_mouse(void) |
25 | u32 cmd_offset; |
34 | {}; |
26 | |
Line 35... | Line 27... | ||
35 | 27 | void init_render(); |
|
Line 57... | Line 49... | ||
57 | 49 | ||
Line 58... | Line 50... | ||
58 | return count; |
50 | return count; |
59 | }; |
51 | }; |
Line -... | Line 52... | ||
- | 52 | ||
- | 53 | struct drm_framebuffer *get_framebuffer(struct drm_device *dev, struct drm_display_mode *mode, int tiling) |
|
- | 54 | { |
|
- | 55 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
- | 56 | struct intel_fbdev *ifbdev = dev_priv->fbdev; |
|
- | 57 | struct intel_framebuffer *intel_fb = ifbdev->fb; |
|
- | 58 | struct drm_framebuffer *fb = &intel_fb->base; |
|
- | 59 | struct drm_i915_gem_object *obj = NULL; |
|
- | 60 | int stride, size; |
|
- | 61 | ||
- | 62 | ENTER(); |
|
- | 63 | ||
- | 64 | stride = mode->hdisplay *4; |
|
- | 65 | ||
- | 66 | if(tiling) |
|
- | 67 | { |
|
- | 68 | int gen3size; |
|
- | 69 | ||
- | 70 | if(IS_GEN3(dev)) |
|
- | 71 | for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1); |
|
- | 72 | else |
|
- | 73 | stride = ALIGN(stride, 512); |
|
- | 74 | size = stride * ALIGN(mode->vdisplay, 8); |
|
- | 75 | ||
- | 76 | if(IS_GEN3(dev)) |
|
- | 77 | { |
|
- | 78 | for (gen3size = 1024*1024; gen3size < size; gen3size <<= 1); |
|
- | 79 | size = gen3size; |
|
- | 80 | } |
|
- | 81 | else |
|
- | 82 | size = ALIGN(size, 4096); |
|
- | 83 | } |
|
- | 84 | else |
|
- | 85 | { |
|
- | 86 | stride = ALIGN(stride, 64); |
|
- | 87 | size = stride * ALIGN(mode->vdisplay, 2); |
|
- | 88 | } |
|
- | 89 | ||
- | 90 | dbgprintf("size %x stride %x\n", size, stride); |
|
- | 91 | ||
- | 92 | if(intel_fb == NULL || size > intel_fb->obj->base.size) |
|
- | 93 | { |
|
- | 94 | struct drm_mode_fb_cmd2 mode_cmd = {}; |
|
- | 95 | int ret; |
|
- | 96 | ||
- | 97 | DRM_DEBUG_KMS("remove old framebuffer\n"); |
|
- | 98 | drm_framebuffer_remove(fb); |
|
- | 99 | ifbdev->fb = NULL; |
|
- | 100 | fb = NULL; |
|
- | 101 | DRM_DEBUG_KMS("create new framebuffer\n"); |
|
- | 102 | ||
- | 103 | mode_cmd.width = mode->hdisplay; |
|
- | 104 | mode_cmd.height = mode->vdisplay; |
|
- | 105 | ||
- | 106 | mode_cmd.pitches[0] = stride; |
|
- | 107 | mode_cmd.pixel_format = DRM_FORMAT_XRGB8888; |
|
- | 108 | ||
- | 109 | mutex_lock(&dev->struct_mutex); |
|
- | 110 | ||
- | 111 | /* If the FB is too big, just don't use it since fbdev is not very |
|
- | 112 | * important and we should probably use that space with FBC or other |
|
- | 113 | * features. */ |
|
- | 114 | if (size * 2 < dev_priv->gtt.stolen_usable_size) |
|
- | 115 | obj = i915_gem_object_create_stolen(dev, size); |
|
- | 116 | if (obj == NULL) |
|
- | 117 | obj = i915_gem_alloc_object(dev, size); |
|
- | 118 | if (!obj) { |
|
- | 119 | DRM_ERROR("failed to allocate framebuffer\n"); |
|
- | 120 | ret = -ENOMEM; |
|
- | 121 | goto out; |
|
- | 122 | } |
|
- | 123 | ||
- | 124 | fb = __intel_framebuffer_create(dev, &mode_cmd, obj); |
|
- | 125 | if (IS_ERR(fb)) { |
|
- | 126 | ret = PTR_ERR(fb); |
|
- | 127 | goto out_unref; |
|
- | 128 | } |
|
- | 129 | ||
- | 130 | /* Flush everything out, we'll be doing GTT only from now on */ |
|
- | 131 | ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL, NULL, NULL); |
|
- | 132 | if (ret) { |
|
- | 133 | DRM_ERROR("failed to pin obj: %d\n", ret); |
|
- | 134 | goto out_fb; |
|
- | 135 | } |
|
- | 136 | mutex_unlock(&dev->struct_mutex); |
|
- | 137 | ifbdev->fb = to_intel_framebuffer(fb); |
|
- | 138 | } |
|
- | 139 | ||
- | 140 | obj = ifbdev->fb->obj; |
|
- | 141 | ||
- | 142 | if(tiling) |
|
- | 143 | { |
|
- | 144 | obj->tiling_mode = I915_TILING_X; |
|
- | 145 | fb->modifier[0] = I915_FORMAT_MOD_X_TILED; |
|
- | 146 | obj->fence_dirty = true; |
|
- | 147 | obj->stride = stride; |
|
- | 148 | }; |
|
- | 149 | ||
- | 150 | fb->width = mode->hdisplay; |
|
- | 151 | fb->height = mode->vdisplay; |
|
- | 152 | ||
- | 153 | fb->pitches[0] = |
|
- | 154 | fb->pitches[1] = |
|
- | 155 | fb->pitches[2] = |
|
- | 156 | fb->pitches[3] = stride; |
|
- | 157 | ||
- | 158 | fb->bits_per_pixel = 32; |
|
- | 159 | fb->depth = 24; |
|
- | 160 | LEAVE(); |
|
- | 161 | return fb; |
|
- | 162 | ||
- | 163 | out_fb: |
|
- | 164 | drm_framebuffer_remove(fb); |
|
- | 165 | out_unref: |
|
- | 166 | drm_gem_object_unreference(&obj->base); |
|
- | 167 | out: |
|
- | 168 | mutex_unlock(&dev->struct_mutex); |
|
- | 169 | return NULL; |
|
- | 170 | } |
|
60 | 171 | ||
61 | static int set_mode(struct drm_device *dev, struct drm_connector *connector, |
172 | static int set_mode(struct drm_device *dev, struct drm_connector *connector, |
62 | struct drm_crtc *crtc, videomode_t *reqmode, bool strict) |
173 | struct drm_crtc *crtc, videomode_t *reqmode, bool strict) |
63 | { |
174 | { |
64 | struct drm_i915_private *dev_priv = dev->dev_private; |
- | |
65 | 175 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
66 | struct drm_mode_config *config = &dev->mode_config; |
176 | struct drm_mode_config *config = &dev->mode_config; |
67 | struct drm_display_mode *mode = NULL, *tmpmode; |
177 | struct drm_display_mode *mode = NULL, *tmpmode; |
68 | struct drm_connector *tmpc; |
178 | struct drm_connector *tmpc; |
69 | struct drm_framebuffer *fb = NULL; |
179 | struct drm_framebuffer *fb = NULL; |
70 | struct drm_mode_set set; |
180 | struct drm_mode_set set; |
71 | const char *con_name; |
- | |
72 | unsigned hdisplay, vdisplay; |
- | |
73 | int stride; |
181 | char con_edid[128]; |
Line 74... | Line 182... | ||
74 | int ret; |
182 | int ret; |
Line 75... | Line 183... | ||
75 | 183 | ||
Line 106... | Line 214... | ||
106 | } |
214 | } |
107 | }; |
215 | }; |
108 | }; |
216 | }; |
109 | 217 | ||
Line -... | Line 218... | ||
- | 218 | out: |
|
- | 219 | drm_modeset_unlock_all(dev); |
|
110 | DRM_ERROR("%s failed\n", __FUNCTION__); |
220 | DRM_ERROR("%s failed\n", __FUNCTION__); |
111 | - | ||
112 | return -1; |
221 | return -1; |
Line 113... | Line 222... | ||
113 | 222 | ||
Line -... | Line 223... | ||
- | 223 | do_set: |
|
Line -... | Line 224... | ||
- | 224 | ||
- | 225 | drm_modeset_unlock_all(dev); |
|
- | 226 | ||
- | 227 | fb = get_framebuffer(dev, mode, 1); |
|
- | 228 | if(fb == NULL) |
|
- | 229 | { |
|
114 | do_set: |
230 | DRM_ERROR("%s failed\n", __FUNCTION__); |
Line 115... | Line 231... | ||
115 | 231 | return -1; |
|
Line 116... | Line 232... | ||
116 | 232 | }; |
|
- | 233 | drm_framebuffer_reference(fb); |
|
- | 234 | ||
117 | con_name = connector->name; |
235 | drm_modeset_lock_all(dev); |
- | 236 | ||
- | 237 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
|
118 | 238 | ||
119 | char con_edid[128]; |
239 | DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n" |
120 | 240 | "monitor: %s model %x serial number %u\n", |
|
121 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
241 | mode->hdisplay, mode->vdisplay, |
Line 122... | Line -... | ||
122 | DRM_DEBUG_KMS("Manufacturer: %s Model %x Serial Number %u\n", |
- | |
123 | manufacturer_name(con_edid + 0x08), |
- | |
124 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
- | |
125 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
- | |
126 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
242 | crtc->base.id, connector->name, |
Line 127... | Line -... | ||
127 | - | ||
128 | DRM_DEBUG_KMS("set mode %d %d: crtc %d connector %s\n", |
- | |
129 | reqmode->width, reqmode->height, crtc->base.id, |
- | |
130 | con_name); |
- | |
131 | - | ||
132 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
- | |
133 | - | ||
134 | hdisplay = mode->hdisplay; |
- | |
135 | vdisplay = mode->vdisplay; |
- | |
136 | - | ||
137 | // if (crtc->invert_dimensions) |
- | |
138 | // swap(hdisplay, vdisplay); |
- | |
139 | - | ||
140 | fb = crtc->primary->fb; |
- | |
141 | if(fb == NULL) |
- | |
142 | fb = main_framebuffer; |
- | |
143 | - | ||
144 | fb->width = reqmode->width; |
- | |
145 | fb->height = reqmode->height; |
- | |
146 | - | ||
147 | main_fb_obj->tiling_mode = I915_TILING_X; |
- | |
148 | - | ||
149 | if( main_fb_obj->tiling_mode == I915_TILING_X) |
- | |
150 | { |
- | |
151 | if(IS_GEN3(dev)) |
- | |
152 | for (stride = 512; stride < reqmode->width * 4; stride <<= 1); |
- | |
153 | else |
- | |
154 | stride = ALIGN(reqmode->width * 4, 512); |
- | |
155 | } |
- | |
156 | else |
- | |
157 | { |
- | |
158 | stride = ALIGN(reqmode->width * 4, 64); |
- | |
159 | } |
- | |
160 | - | ||
161 | fb->pitches[0] = |
- | |
162 | fb->pitches[1] = |
- | |
163 | fb->pitches[2] = |
- | |
164 | fb->pitches[3] = stride; |
243 | manufacturer_name(con_edid + 0x08), |
165 | 244 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
|
Line 166... | Line -... | ||
166 | main_fb_obj->stride = stride; |
- | |
167 | - | ||
168 | fb->bits_per_pixel = 32; |
245 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
169 | fb->depth = 24; |
246 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
Line 170... | Line 247... | ||
170 | 247 | ||
171 | crtc->enabled = true; |
248 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
172 | os_display->crtc = crtc; |
249 | |
Line 187... | Line 264... | ||
187 | ret = drm_mode_set_config_internal(&set); |
264 | ret = drm_mode_set_config_internal(&set); |
Line 188... | Line 265... | ||
188 | 265 | ||
189 | if ( !ret ) |
266 | if ( !ret ) |
- | 267 | { |
|
- | 268 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
|
- | 269 | struct kos_framebuffer *kfb = intel_fb->private; |
|
- | 270 | kolibri_framebuffer_update(dev_priv, kfb); |
|
- | 271 | DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb); |
|
190 | { |
272 | |
191 | os_display->width = fb->width; |
273 | os_display->width = mode->hdisplay; |
192 | os_display->height = fb->height; |
274 | os_display->height = mode->vdisplay; |
- | 275 | os_display->vrefresh = drm_mode_vrefresh(mode); |
|
- | 276 | sysSetFramebuffer(intel_fb->private); |
|
- | 277 | sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]); |
|
- | 278 | ||
- | 279 | os_display->connector = connector; |
|
- | 280 | os_display->crtc = connector->encoder->crtc; |
|
- | 281 | os_display->supported_modes = count_connector_modes(connector); |
|
- | 282 | ||
- | 283 | crtc->cursor_x = os_display->width/2; |
|
Line 193... | Line 284... | ||
193 | os_display->vrefresh = drm_mode_vrefresh(mode); |
284 | crtc->cursor_y = os_display->height/2; |
Line 194... | Line 285... | ||
194 | 285 | ||
195 | sysSetScreen(fb->width, fb->height, fb->pitches[0]); |
286 | os_display->select_cursor(os_display->cursor); |
196 | 287 | ||
197 | DRM_DEBUG_KMS("new mode %d x %d pitch %d\n", |
288 | DRM_DEBUG_KMS("new mode %d x %d pitch %d\n", |
198 | fb->width, fb->height, fb->pitches[0]); |
289 | mode->hdisplay, mode->vdisplay, fb->pitches[0]); |
199 | } |
290 | } |
Line -... | Line 291... | ||
- | 291 | else |
|
200 | else |
292 | DRM_ERROR("failed to set mode %d_%d on crtc %p\n", |
Line 201... | Line 293... | ||
201 | DRM_ERROR("failed to set mode %d_%d on crtc %p\n", |
293 | fb->width, fb->height, crtc); |
202 | fb->width, fb->height, crtc); |
294 | |
Line 213... | Line 305... | ||
213 | struct drm_connector *tmpc; |
305 | struct drm_connector *tmpc; |
214 | struct drm_mode_config *config = &dev->mode_config; |
306 | struct drm_mode_config *config = &dev->mode_config; |
215 | struct drm_framebuffer *fb = NULL; |
307 | struct drm_framebuffer *fb = NULL; |
216 | struct drm_mode_set set; |
308 | struct drm_mode_set set; |
217 | char con_edid[128]; |
309 | struct drm_crtc *crtc = NULL; |
- | 310 | ||
- | 311 | char con_edid[128]; |
|
218 | int stride; |
312 | int stride; |
219 | int ret; |
313 | int ret; |
220 | 314 | ||
Line -... | Line 315... | ||
- | 315 | fb = get_framebuffer(dev, mode, 1); |
|
- | 316 | if(fb == NULL) |
|
- | 317 | { |
|
- | 318 | DRM_ERROR("%s failed\n", __FUNCTION__); |
|
- | 319 | return -1; |
|
- | 320 | }; |
|
- | 321 | drm_framebuffer_reference(fb); |
|
- | 322 | ||
221 | drm_modeset_lock_all(dev); |
323 | drm_modeset_lock_all(dev); |
Line 222... | Line 324... | ||
222 | 324 | ||
223 | list_for_each_entry(tmpc, &dev->mode_config.connector_list, head) |
325 | list_for_each_entry(tmpc, &dev->mode_config.connector_list, head) |
224 | { |
326 | { |
225 | const struct drm_connector_funcs *f = tmpc->funcs; |
327 | const struct drm_connector_funcs *f = tmpc->funcs; |
226 | if(tmpc == connector) |
328 | if(tmpc == connector) |
227 | continue; |
329 | continue; |
228 | f->dpms(tmpc, DRM_MODE_DPMS_OFF); |
330 | f->dpms(tmpc, DRM_MODE_DPMS_OFF); |
Line 229... | Line -... | ||
229 | }; |
- | |
230 | - | ||
231 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
331 | }; |
232 | - | ||
233 | fb = connector->encoder->crtc->primary->fb; |
- | |
234 | if(fb == NULL) |
- | |
235 | fb = main_framebuffer; |
- | |
236 | - | ||
237 | fb->width = mode->hdisplay; |
- | |
238 | fb->height = mode->vdisplay;; |
- | |
239 | - | ||
240 | main_fb_obj->tiling_mode = I915_TILING_X; |
- | |
241 | - | ||
242 | if( main_fb_obj->tiling_mode == I915_TILING_X) |
- | |
243 | { |
- | |
244 | if(IS_GEN3(dev)) |
- | |
245 | for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1); |
- | |
246 | else |
- | |
247 | stride = ALIGN(mode->hdisplay * 4, 512); |
- | |
248 | } |
- | |
249 | else |
- | |
250 | { |
- | |
251 | stride = ALIGN(mode->hdisplay * 4, 64); |
- | |
252 | } |
- | |
253 | - | ||
254 | fb->pitches[0] = |
- | |
255 | fb->pitches[1] = |
- | |
256 | fb->pitches[2] = |
- | |
257 | fb->pitches[3] = stride; |
- | |
258 | - | ||
259 | main_fb_obj->stride = stride; |
- | |
260 | - | ||
261 | fb->bits_per_pixel = 32; |
- | |
262 | fb->depth = 24; |
- | |
263 | - | ||
264 | connector->encoder->crtc->enabled = true; |
- | |
Line 265... | Line 332... | ||
265 | 332 | ||
266 | i915_gem_object_put_fence(main_fb_obj); |
333 | crtc = connector->encoder->crtc; |
267 | 334 | ||
268 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
335 | memcpy(con_edid, connector->edid_blob_ptr->data, 128); |
269 | DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n" |
336 | DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n" |
270 | "monitor: %s model %x serial number %u\n", |
337 | "monitor: %s model %x serial number %u\n", |
271 | fb->width, fb->height, |
338 | mode->hdisplay, mode->vdisplay, |
272 | connector->encoder->crtc->base.id, connector->name, |
339 | connector->encoder->crtc->base.id, connector->name, |
273 | manufacturer_name(con_edid + 0x08), |
340 | manufacturer_name(con_edid + 0x08), |
Line -... | Line 341... | ||
- | 341 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
|
- | 342 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
|
- | 343 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
|
- | 344 | ||
- | 345 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
|
274 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
346 | |
275 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
347 | crtc->enabled = true; |
Line 276... | Line 348... | ||
276 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
348 | os_display->crtc = crtc; |
277 | 349 | ||
278 | DRM_DEBUG_KMS("use framebuffer %p %dx%d pitch %d format %x\n", |
350 | DRM_DEBUG_KMS("use framebuffer %p %dx%d pitch %d format %x\n", |
279 | fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format); |
351 | fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format); |
280 | 352 | ||
281 | set.crtc = connector->encoder->crtc; |
353 | set.crtc = crtc; |
282 | set.x = 0; |
354 | set.x = 0; |
Line 283... | Line 355... | ||
283 | set.y = 0; |
355 | set.y = 0; |
284 | set.mode = mode; |
356 | set.mode = mode; |
285 | set.connectors = &connector; |
357 | set.connectors = &connector; |
- | 358 | set.num_connectors = 1; |
|
286 | set.num_connectors = 1; |
359 | set.fb = fb; |
- | 360 | ||
- | 361 | ret = drm_mode_set_config_internal(&set); |
|
Line 287... | Line 362... | ||
287 | set.fb = fb; |
362 | if ( !ret ) |
288 | 363 | { |
|
289 | ret = drm_mode_set_config_internal(&set); |
364 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
290 | if ( !ret ) |
- | |
- | 365 | struct kos_framebuffer *kfb = intel_fb->private; |
|
291 | { |
366 | kolibri_framebuffer_update(dev_priv, kfb); |
Line 292... | Line 367... | ||
292 | struct drm_crtc *crtc = os_display->crtc; |
367 | DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb); |
293 | 368 | ||
294 | os_display->width = fb->width; |
369 | os_display->width = mode->hdisplay; |
Line 295... | Line 370... | ||
295 | os_display->height = fb->height; |
370 | os_display->height = mode->vdisplay; |
296 | os_display->vrefresh = drm_mode_vrefresh(mode); |
371 | os_display->vrefresh = drm_mode_vrefresh(mode); |
Line 297... | Line 372... | ||
297 | 372 | sysSetFramebuffer(intel_fb->private); |
|
Line 298... | Line 373... | ||
298 | sysSetScreen(fb->width, fb->height, fb->pitches[0]); |
373 | sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]); |
299 | 374 | ||
300 | os_display->connector = connector; |
375 | os_display->connector = connector; |
301 | os_display->crtc = connector->encoder->crtc; |
376 | os_display->crtc = connector->encoder->crtc; |
302 | os_display->supported_modes = count_connector_modes(connector); |
377 | os_display->supported_modes = count_connector_modes(connector); |
303 | 378 | ||
Line -... | Line 379... | ||
- | 379 | crtc->cursor_x = os_display->width/2; |
|
304 | crtc->cursor_x = os_display->width/2; |
380 | crtc->cursor_y = os_display->height/2; |
305 | crtc->cursor_y = os_display->height/2; |
- | |
306 | 381 | ||
307 | select_cursor_kms(os_display->cursor); |
382 | os_display->select_cursor(os_display->cursor); |
Line 308... | Line 383... | ||
308 | 383 | ||
309 | DRM_DEBUG_KMS("new mode %d x %d pitch %d\n", |
384 | DRM_DEBUG_KMS("new mode %d x %d pitch %d\n", |
Line 465... | Line 540... | ||
465 | { |
540 | { |
466 | struct drm_connector_helper_funcs *connector_funcs; |
541 | struct drm_connector_helper_funcs *connector_funcs; |
467 | struct drm_connector *connector = NULL; |
542 | struct drm_connector *connector = NULL; |
468 | struct drm_crtc *crtc = NULL; |
543 | struct drm_crtc *crtc = NULL; |
469 | struct drm_framebuffer *fb; |
544 | struct drm_plane *plane; |
470 | 545 | ||
Line 471... | Line -... | ||
471 | cursor_t *cursor; |
- | |
472 | u32 ifl; |
- | |
473 | int ret; |
546 | int ret; |
- | 547 | ENTER(); |
|
- | 548 | ||
- | 549 | drm_for_each_plane(plane, dev) |
|
- | 550 | { |
|
- | 551 | drm_plane_helper_disable(plane); |
|
- | 552 | }; |
|
Line 474... | Line 553... | ||
474 | 553 | ||
475 | mutex_lock(&dev->mode_config.mutex); |
554 | mutex_lock(&dev->mode_config.mutex); |
476 | ret = choose_config(dev, &connector, &crtc); |
555 | ret = choose_config(dev, &connector, &crtc); |
477 | if(ret) |
556 | if(ret) |
478 | { |
557 | { |
479 | mutex_unlock(&dev->mode_config.mutex); |
558 | mutex_unlock(&dev->mode_config.mutex); |
480 | DRM_DEBUG_KMS("No active connectors!\n"); |
559 | DRM_DEBUG_KMS("No active connectors!\n"); |
481 | return -1; |
560 | return -1; |
Line -... | Line 561... | ||
- | 561 | }; |
|
482 | }; |
562 | |
483 | 563 | /* |
|
484 | mutex_lock(&dev->object_name_lock); |
- | |
485 | idr_preload(GFP_KERNEL); |
564 | mutex_lock(&dev->object_name_lock); |
486 | 565 | idr_preload(GFP_KERNEL); |
|
Line 487... | Line 566... | ||
487 | if (!main_fb_obj->base.name) { |
566 | if (!main_fb_obj->base.name) { |
488 | ret = idr_alloc(&dev->object_name_idr, &main_fb_obj->base, 1, 0, GFP_NOWAIT); |
567 | ret = idr_alloc(&dev->object_name_idr, &main_fb_obj->base, 1, 0, GFP_NOWAIT); |
489 | 568 | ||
490 | main_fb_obj->base.name = ret; |
569 | main_fb_obj->base.name = ret; |
491 | main_fb_obj->base.handle_count++; |
- | |
492 | DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, main_fb_obj->base.name ); |
570 | main_fb_obj->base.handle_count++; |
493 | } |
571 | DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, main_fb_obj->base.name ); |
- | 572 | } |
|
- | 573 | idr_preload_end(); |
|
Line 494... | Line 574... | ||
494 | 574 | mutex_unlock(&dev->object_name_lock); |
|
495 | idr_preload_end(); |
575 | */ |
496 | mutex_unlock(&dev->object_name_lock); |
576 | dummy_fb_page = AllocPage(); |
497 | 577 | ||
498 | os_display = GetDisplay(); |
578 | os_display = GetDisplay(); |
499 | os_display->ddev = dev; |
579 | os_display->ddev = dev; |
Line 500... | Line 580... | ||
500 | os_display->connector = connector; |
580 | os_display->connector = connector; |
501 | os_display->crtc = crtc; |
- | |
502 | os_display->supported_modes = count_connector_modes(connector); |
- | |
503 | mutex_unlock(&dev->mode_config.mutex); |
- | |
504 | - | ||
505 | mutex_init(&cursor_lock); |
- | |
506 | mutex_lock(&dev->struct_mutex); |
- | |
507 | - | ||
508 | ifl = safe_cli(); |
- | |
509 | { |
- | |
510 | list_for_each_entry(cursor, &os_display->cursors, list) |
- | |
511 | { |
- | |
512 | init_cursor(cursor); |
- | |
513 | }; |
- | |
514 | - | ||
515 | os_display->restore_cursor(0,0); |
- | |
516 | os_display->init_cursor = init_cursor; |
- | |
517 | os_display->select_cursor = select_cursor_kms; |
- | |
518 | os_display->show_cursor = NULL; |
- | |
519 | os_display->move_cursor = move_cursor_kms; |
- | |
520 | os_display->restore_cursor = restore_cursor; |
- | |
521 | os_display->disable_mouse = disable_mouse; |
- | |
522 | - | ||
523 | crtc->cursor_x = os_display->width/2; |
- | |
524 | crtc->cursor_y = os_display->height/2; |
- | |
525 | - | ||
Line 526... | Line 581... | ||
526 | select_cursor_kms(os_display->cursor); |
581 | os_display->crtc = crtc; |
Line 527... | Line 582... | ||
527 | }; |
582 | os_display->supported_modes = count_connector_modes(connector); |
528 | safe_sti(ifl); |
583 | mutex_unlock(&dev->mode_config.mutex); |
Line 555... | Line 610... | ||
555 | 610 | ||
Line 556... | Line 611... | ||
556 | set_mode(dev, os_display->connector, os_display->crtc, usermode, false); |
611 | set_mode(dev, os_display->connector, os_display->crtc, usermode, false); |
557 | }; |
612 | }; |
Line 558... | Line -... | ||
558 | - | ||
559 | #ifdef __HWA__ |
- | |
560 | err = init_bitmaps(); |
613 | |
Line 561... | Line 614... | ||
561 | #endif |
614 | LEAVE(); |
562 | 615 | ||
Line 743... | Line 796... | ||
743 | 796 | ||
Line 744... | Line 797... | ||
744 | f->dpms(os_display->connector, mode); |
797 | f->dpms(os_display->connector, mode); |
745 | }; |
798 | }; |
Line 746... | Line -... | ||
746 | - | ||
747 | void __attribute__((regparm(1))) destroy_cursor(cursor_t *cursor) |
- | |
748 | { |
- | |
749 | struct drm_i915_gem_object *obj = cursor->cobj; |
- | |
750 | list_del(&cursor->list); |
- | |
751 | - | ||
752 | i915_gem_object_ggtt_unpin(cursor->cobj); |
- | |
753 | - | ||
754 | mutex_lock(&main_device->struct_mutex); |
- | |
755 | drm_gem_object_unreference(&obj->base); |
- | |
756 | mutex_unlock(&main_device->struct_mutex); |
- | |
757 | - | ||
758 | __DestroyObject(cursor); |
- | |
Line 759... | Line 799... | ||
759 | }; |
799 | |
760 | 800 | ||
761 | int init_cursor(cursor_t *cursor) |
- | |
762 | { |
- | |
763 | struct drm_i915_private *dev_priv = os_display->ddev->dev_private; |
801 | int i915_fbinfo(struct drm_i915_fb_info *fb) |
764 | struct drm_i915_gem_object *obj; |
- | |
765 | uint32_t *bits; |
- | |
766 | uint32_t *src; |
- | |
767 | void *mapped; |
- | |
768 | - | ||
769 | int i,j; |
- | |
770 | int ret; |
- | |
771 | - | ||
772 | if (dev_priv->info.cursor_needs_physical) |
- | |
773 | { |
- | |
774 | bits = (uint32_t*)KernelAlloc(KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*8); |
- | |
775 | if (unlikely(bits == NULL)) |
- | |
776 | return ENOMEM; |
- | |
777 | cursor->cobj = (struct drm_i915_gem_object *)GetPgAddr(bits); |
- | |
778 | } |
- | |
779 | else |
- | |
780 | { |
- | |
781 | obj = i915_gem_alloc_object(os_display->ddev, KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4); |
- | |
782 | if (unlikely(obj == NULL)) |
- | |
783 | return -ENOMEM; |
- | |
784 | - | ||
785 | ret = i915_gem_object_ggtt_pin(obj, &i915_ggtt_view_normal, 128*1024, PIN_GLOBAL); |
- | |
786 | if (ret) { |
- | |
787 | drm_gem_object_unreference(&obj->base); |
- | |
788 | return ret; |
- | |
789 | } |
- | |
790 | - | ||
791 | ret = i915_gem_object_set_to_gtt_domain(obj, true); |
- | |
792 | if (ret) |
- | |
793 | { |
- | |
794 | i915_gem_object_ggtt_unpin(obj); |
- | |
795 | drm_gem_object_unreference(&obj->base); |
- | |
796 | return ret; |
- | |
797 | } |
- | |
Line 798... | Line -... | ||
798 | /* You don't need to worry about fragmentation issues. |
- | |
799 | * GTT space is continuous. I guarantee it. */ |
- | |
800 | - | ||
801 | mapped = bits = (u32*)MapIoMem(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj), |
- | |
802 | KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4, PG_SW); |
- | |
803 | - | ||
804 | if (unlikely(bits == NULL)) |
- | |
805 | { |
- | |
806 | i915_gem_object_ggtt_unpin(obj); |
- | |
807 | drm_gem_object_unreference(&obj->base); |
- | |
808 | return -ENOMEM; |
- | |
809 | }; |
- | |
810 | cursor->cobj = obj; |
802 | { |
811 | }; |
- | |
812 | - | ||
813 | src = cursor->data; |
803 | u32 ifl; |
- | 804 | ||
- | 805 | ifl = safe_cli(); |
|
- | 806 | { |
|
- | 807 | struct drm_i915_private *dev_priv = os_display->ddev->dev_private; |
|
- | 808 | struct intel_crtc *crtc = to_intel_crtc(os_display->crtc); |
|
- | 809 | struct kos_framebuffer *kfb = os_display->current_lfb; |
|
814 | 810 | struct intel_framebuffer *intel_fb = (struct intel_framebuffer*)kfb->private; |
|
- | 811 | struct drm_i915_gem_object *obj = intel_fb->obj; |
|
- | 812 | ||
815 | for(i = 0; i < 32; i++) |
813 | fb->name = obj->base.name; |
816 | { |
814 | fb->width = os_display->width; |
- | 815 | fb->height = os_display->height; |
|
817 | for(j = 0; j < 32; j++) |
816 | fb->pitch = obj->stride; |
818 | *bits++ = *src++; |
817 | fb->tiling = obj->tiling_mode; |
819 | for(j = 32; j < KMS_CURSOR_WIDTH; j++) |
- | |
820 | *bits++ = 0; |
818 | fb->crtc = crtc->base.base.id; |
821 | } |
- | |
822 | for(i = 0; i < KMS_CURSOR_WIDTH*(KMS_CURSOR_HEIGHT-32); i++) |
- | |
823 | *bits++ = 0; |
- | |
824 | - | ||
825 | FreeKernelSpace(mapped); |
- | |
826 | - | ||
827 | KernelFree(cursor->data); |
- | |
828 | - | ||
829 | cursor->data = bits; |
- | |
830 | 819 | fb->pipe = crtc->pipe; |
|
831 | cursor->header.destroy = destroy_cursor; |
820 | } |
Line 832... | Line 821... | ||
832 | 821 | safe_sti(ifl); |
|
833 | return 0; |
822 | return 0; |
834 | } |
823 | } |
- | 824 | ||
835 | 825 | ||
- | 826 | int kolibri_framebuffer_init(struct intel_framebuffer *intel_fb) |
|
836 | 827 | { |
|
837 | void __stdcall move_cursor_kms(cursor_t *cursor, int x, int y) |
828 | struct kos_framebuffer *kfb; |
838 | { |
829 | addr_t dummy_table; |
Line 839... | Line 830... | ||
839 | struct drm_crtc *crtc = os_display->crtc; |
830 | addr_t *pt_addr = NULL; |
- | 831 | int pde; |
|
840 | struct drm_plane_state *cursor_state = crtc->cursor->state; |
832 | ENTER(); |
- | 833 | kfb = kzalloc(sizeof(struct kos_framebuffer),0); |
|
Line -... | Line 834... | ||
- | 834 | kfb->private = intel_fb; |
|
841 | 835 | ||
842 | x-= cursor->hot_x; |
836 | for(pde = 0; pde < 8; pde++) |
- | 837 | { |
|
Line -... | Line 838... | ||
- | 838 | dummy_table = AllocPage(); |
|
- | 839 | kfb->pde[pde] = dummy_table|PG_UW; |
|
- | 840 | ||
- | 841 | pt_addr = kmap((struct page*)dummy_table); |
|
- | 842 | __builtin_memset(pt_addr,0,4096); |
|
- | 843 | kunmap((struct page*)dummy_table); |
|
- | 844 | }; |
|
- | 845 | ||
- | 846 | intel_fb->private = kfb; |
|
- | 847 | LEAVE(); |
|
- | 848 | return 0; |
|
- | 849 | #if 0 |
|
- | 850 | struct sg_page_iter sg_iter; |
|
- | 851 | num_pages = obj->base.size/4096; |
|
- | 852 | printf("num_pages %d\n",num_pages); |
|
- | 853 | ||
- | 854 | pte = 0; |
|
- | 855 | pde = 0; |
|
- | 856 | pt_addr = NULL; |
|
- | 857 | ||
- | 858 | __sg_page_iter_start(&sg_iter, obj->pages->sgl, sg_nents(obj->pages->sgl), 0); |
|
- | 859 | while (__sg_page_iter_next(&sg_iter)) |
|
- | 860 | { |
|
- | 861 | if (pt_addr == NULL) |
|
- | 862 | { |
|
- | 863 | addr_t pt = AllocPage(); |
|
- | 864 | kfb->pde[pde] = pt|PG_UW; |
|
843 | y-= cursor->hot_y; |
865 | pde++; |
- | 866 | pt_addr = kmap_atomic((struct page*)pt); |
|
- | 867 | } |
|
- | 868 | pt_addr[pte] = sg_page_iter_dma_address(&sg_iter)|PG_UW|PG_WRITEC; |
|
- | 869 | if( (pte & 15) == 0) |
|
- | 870 | DRM_DEBUG_KMS("pte %x\n",pt_addr[pte]); |
|
- | 871 | if (++pte == 1024) |
|
Line -... | Line 872... | ||
- | 872 | { |
|
- | 873 | kunmap_atomic(pt_addr); |
|
- | 874 | pt_addr = NULL; |
|
- | 875 | if (pde == 8) |
|
- | 876 | break; |
|
- | 877 | pte = 0; |
|
- | 878 | } |
|
844 | 879 | } |
|
Line 845... | Line 880... | ||
845 | crtc->cursor_x = x; |
880 | |
846 | crtc->cursor_y = y; |
881 | if(pt_addr) |
847 | 882 | { |
|
848 | cursor_state->crtc_x = x; |
883 | for(;pte < 1024; pte++) |
849 | cursor_state->crtc_y = y; |
884 | pt_addr[pte] = dummy_page|PG_UW; |
850 | - | ||
- | 885 | kunmap_atomic(pt_addr); |
|
- | 886 | } |
|
851 | intel_crtc_update_cursor(crtc, 1); |
887 | #endif |
852 | 888 | }; |
|
853 | }; |
889 | |
- | 890 | void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb) |
|
854 | 891 | { |
|
855 | cursor_t* __stdcall select_cursor_kms(cursor_t *cursor) |
892 | struct intel_framebuffer *intel_fb = kfb->private; |
856 | { |
893 | addr_t *pt_addr = NULL; |
857 | struct drm_i915_private *dev_priv = os_display->ddev->dev_private; |
894 | int pte = 0; |
858 | struct drm_crtc *crtc = os_display->crtc; |
895 | int pde = 0; |
859 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
896 | int num_pages; |
- | 897 | addr_t pfn; |
|
860 | 898 | ENTER(); |
|
861 | cursor_t *old; |
899 | num_pages = intel_fb->obj->base.size/4096; |
862 | 900 | pfn = dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(intel_fb->obj); |
|
- | 901 | ||
- | 902 | while(num_pages) |
|
- | 903 | { |
|
863 | old = os_display->cursor; |
904 | if (pt_addr == NULL) |
864 | 905 | { |
|
865 | mutex_lock(&cursor_lock); |
906 | addr_t pt = kfb->pde[pde] & 0xFFFFF000; |
866 | 907 | pde++; |
|
867 | os_display->cursor = cursor; |
908 | pt_addr = kmap_atomic((struct page*)pt); |
- | 909 | } |
|
- | 910 | pt_addr[pte] = pfn|PG_UW|PG_WRITEC; |
|
- | 911 | pfn+= 4096; |
|
Line -... | Line 912... | ||
- | 912 | num_pages--; |
|
- | 913 | if (++pte == 1024) |
|
- | 914 | { |
|
868 | 915 | kunmap_atomic(pt_addr); |
|
- | 916 | pt_addr = NULL; |
|
869 | if (!dev_priv->info.cursor_needs_physical) |
917 | if (pde == 8) |
- | 918 | break; |
|
870 | intel_crtc->cursor_addr = i915_gem_obj_ggtt_offset(cursor->cobj); |
919 | pte = 0; |
Line 871... | Line -... | ||
871 | else |
- | |
872 | intel_crtc->cursor_addr = (addr_t)cursor->cobj; |
- | |
873 | - | ||
874 | intel_crtc->base.cursor->state->crtc_w = 64; |
- | |
875 | intel_crtc->base.cursor->state->crtc_h = 64; |
- | |
876 | intel_crtc->base.cursor->state->rotation = 0; |
- | |
877 | mutex_unlock(&cursor_lock); |
- | |
878 | - | ||
879 | move_cursor_kms(cursor, crtc->cursor_x, crtc->cursor_y); |
- | |
880 | return old; |
- | |
881 | }; |
- | |
882 | - | ||
883 | int i915_fbinfo(struct drm_i915_fb_info *fb) |
- | |
884 | { |
- | |
885 | struct drm_i915_private *dev_priv = os_display->ddev->dev_private; |
- | |
886 | struct intel_crtc *crtc = to_intel_crtc(os_display->crtc); |
- | |
887 | struct drm_i915_gem_object *obj = get_fb_obj(); |
- | |
888 | - | ||
889 | fb->name = obj->base.name; |
920 | } |
890 | fb->width = os_display->width; |
921 | } |
891 | fb->height = os_display->height; |
922 | |
892 | fb->pitch = obj->stride; |
923 | if(pt_addr) |
893 | fb->tiling = obj->tiling_mode; |
924 | { |