Rev 6283 | Rev 6320 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2340 | Serge | 1 | |
2 | |||
3 | |||
5060 | serge | 4 | #include |
5 | #include "i915_drv.h" |
||
2338 | Serge | 6 | #include "intel_drv.h" |
7 | #include |
||
8 | #include |
||
9 | #include |
||
10 | |||
11 | |||
12 | |||
13 | |||
6283 | serge | 14 | #include |
5354 | serge | 15 | |
2338 | Serge | 16 | |
6283 | serge | 17 | void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb); |
18 | void init_system_cursors(struct drm_device *dev); |
||
19 | |||
2338 | Serge | 20 | |
6283 | serge | 21 | |
22 | |||
5354 | serge | 23 | |
2338 | Serge | 24 | |
5354 | serge | 25 | u32 cmd_offset; |
26 | |||
2340 | Serge | 27 | |
2351 | Serge | 28 | int sna_init(); |
29 | |||
30 | |||
3031 | serge | 31 | { |
32 | static char name[4]; |
||
33 | |||
34 | |||
35 | name[1] = ((x[0] & 0x03) << 3) + ((x[1] & 0xE0) >> 5) + '@'; |
||
36 | name[2] = (x[1] & 0x1F) + '@'; |
||
37 | name[3] = 0; |
||
38 | |||
39 | |||
40 | } |
||
41 | |||
42 | |||
6088 | serge | 43 | { |
44 | struct drm_display_mode *mode; |
||
45 | int count = 0; |
||
46 | |||
47 | |||
48 | count++; |
||
49 | |||
50 | |||
51 | }; |
||
52 | |||
53 | |||
6283 | serge | 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 | |||
63 | |||
64 | |||
65 | |||
66 | |||
67 | { |
||
68 | int gen3size; |
||
69 | |||
70 | |||
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 | |||
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 | |||
6296 | serge | 91 | |
6283 | serge | 92 | |
93 | { |
||
94 | struct drm_mode_fb_cmd2 mode_cmd = {}; |
||
95 | int ret; |
||
96 | |||
97 | |||
98 | drm_framebuffer_remove(fb); |
||
99 | ifbdev->fb = NULL; |
||
100 | fb = NULL; |
||
101 | DRM_DEBUG_KMS("create new framebuffer\n"); |
||
102 | |||
103 | |||
104 | mode_cmd.height = mode->vdisplay; |
||
105 | |||
106 | |||
107 | mode_cmd.pixel_format = DRM_FORMAT_XRGB8888; |
||
108 | |||
109 | |||
110 | |||
111 | |||
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 | |||
125 | if (IS_ERR(fb)) { |
||
126 | ret = PTR_ERR(fb); |
||
127 | goto out_unref; |
||
128 | } |
||
129 | |||
130 | |||
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 | |||
141 | |||
142 | |||
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 | |||
6296 | serge | 151 | { |
152 | int ret; |
||
153 | |||
154 | |||
155 | idr_preload(GFP_KERNEL); |
||
156 | ret = idr_alloc(&dev->object_name_idr, &obj->base, 1, 0, GFP_NOWAIT); |
||
157 | idr_preload_end(); |
||
158 | mutex_unlock(&dev->object_name_lock); |
||
159 | obj->base.name = ret; |
||
160 | obj->base.handle_count++; |
||
161 | DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, obj->base.name ); |
||
162 | } |
||
163 | |||
164 | |||
6283 | serge | 165 | fb->height = mode->vdisplay; |
166 | |||
167 | |||
168 | fb->pitches[1] = |
||
169 | fb->pitches[2] = |
||
170 | fb->pitches[3] = stride; |
||
171 | |||
172 | |||
173 | fb->depth = 24; |
||
174 | LEAVE(); |
||
175 | return fb; |
||
176 | |||
177 | |||
178 | drm_framebuffer_remove(fb); |
||
179 | out_unref: |
||
180 | drm_gem_object_unreference(&obj->base); |
||
181 | out: |
||
182 | mutex_unlock(&dev->struct_mutex); |
||
183 | return NULL; |
||
184 | } |
||
185 | |||
186 | |||
5060 | serge | 187 | struct drm_crtc *crtc, videomode_t *reqmode, bool strict) |
188 | { |
||
3031 | serge | 189 | struct drm_i915_private *dev_priv = dev->dev_private; |
6296 | serge | 190 | struct drm_mode_config *config = &dev->mode_config; |
191 | struct drm_display_mode *mode = NULL, *tmpmode; |
||
192 | struct drm_connector *tmpc; |
||
6088 | serge | 193 | struct drm_framebuffer *fb = NULL; |
6296 | serge | 194 | struct drm_mode_set set; |
3031 | serge | 195 | char con_edid[128]; |
6283 | serge | 196 | int ret; |
3031 | serge | 197 | |
198 | |||
5060 | serge | 199 | |
3031 | serge | 200 | |
6088 | serge | 201 | { |
202 | const struct drm_connector_funcs *f = tmpc->funcs; |
||
203 | if(tmpc == connector) |
||
204 | continue; |
||
205 | f->dpms(tmpc, DRM_MODE_DPMS_OFF); |
||
206 | }; |
||
207 | |||
208 | |||
3031 | serge | 209 | { |
210 | if( (tmpmode->hdisplay == reqmode->width) && |
||
5060 | serge | 211 | (tmpmode->vdisplay == reqmode->height) && |
212 | (drm_mode_vrefresh(tmpmode) == reqmode->freq) ) |
||
3031 | serge | 213 | { |
214 | mode = tmpmode; |
||
215 | goto do_set; |
||
216 | } |
||
217 | }; |
||
218 | |||
219 | |||
220 | { |
||
221 | list_for_each_entry(tmpmode, &connector->modes, head) |
||
222 | { |
||
223 | if( (tmpmode->hdisplay == reqmode->width) && |
||
5060 | serge | 224 | (tmpmode->vdisplay == reqmode->height) ) |
225 | { |
||
3031 | serge | 226 | mode = tmpmode; |
227 | goto do_set; |
||
228 | } |
||
229 | }; |
||
230 | }; |
||
231 | |||
232 | |||
6283 | serge | 233 | drm_modeset_unlock_all(dev); |
234 | DRM_ERROR("%s failed\n", __FUNCTION__); |
||
3037 | serge | 235 | return -1; |
3031 | serge | 236 | |
237 | |||
238 | |||
239 | |||
6283 | serge | 240 | |
6088 | serge | 241 | |
6283 | serge | 242 | if(fb == NULL) |
243 | { |
||
244 | DRM_ERROR("%s failed\n", __FUNCTION__); |
||
245 | return -1; |
||
246 | }; |
||
247 | drm_framebuffer_reference(fb); |
||
248 | |||
3031 | serge | 249 | |
6283 | serge | 250 | |
6088 | serge | 251 | |
252 | |||
6283 | serge | 253 | |
254 | "monitor: %s model %x serial number %u\n", |
||
255 | mode->hdisplay, mode->vdisplay, |
||
256 | crtc->base.id, connector->name, |
||
257 | manufacturer_name(con_edid + 0x08), |
||
6296 | serge | 258 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
259 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
||
260 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
||
261 | |||
6088 | serge | 262 | |
3031 | serge | 263 | |
264 | |||
265 | os_display->crtc = crtc; |
||
266 | |||
267 | |||
6283 | serge | 268 | fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format); |
6084 | serge | 269 | |
270 | |||
3031 | serge | 271 | set.x = 0; |
272 | set.y = 0; |
||
273 | set.mode = mode; |
||
274 | set.connectors = &connector; |
||
275 | set.num_connectors = 1; |
||
276 | set.fb = fb; |
||
277 | |||
278 | |||
5060 | serge | 279 | |
280 | |||
3031 | serge | 281 | { |
282 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
||
6283 | serge | 283 | struct kos_framebuffer *kfb = intel_fb->private; |
284 | kolibri_framebuffer_update(dev_priv, kfb); |
||
285 | DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb); |
||
286 | |||
287 | |||
288 | os_display->height = mode->vdisplay; |
||
289 | os_display->vrefresh = drm_mode_vrefresh(mode); |
||
3031 | serge | 290 | sysSetFramebuffer(intel_fb->private); |
6283 | serge | 291 | sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]); |
292 | |||
3031 | serge | 293 | |
6283 | serge | 294 | os_display->crtc = connector->encoder->crtc; |
295 | os_display->supported_modes = count_connector_modes(connector); |
||
296 | |||
3031 | serge | 297 | |
6283 | serge | 298 | crtc->cursor_y = os_display->height/2; |
299 | |||
300 | |||
301 | |||
302 | |||
3037 | serge | 303 | mode->hdisplay, mode->vdisplay, fb->pitches[0]); |
6283 | serge | 304 | } |
3031 | serge | 305 | else |
306 | DRM_ERROR("failed to set mode %d_%d on crtc %p\n", |
||
307 | fb->width, fb->height, crtc); |
||
308 | |||
309 | |||
6283 | serge | 310 | drm_modeset_unlock_all(dev); |
6084 | serge | 311 | |
312 | |||
3031 | serge | 313 | } |
314 | |||
315 | |||
6088 | serge | 316 | struct drm_connector *connector, struct drm_display_mode *mode) |
317 | { |
||
2338 | Serge | 318 | struct drm_i915_private *dev_priv = dev->dev_private; |
6088 | serge | 319 | struct drm_connector *tmpc; |
320 | struct drm_mode_config *config = &dev->mode_config; |
||
321 | struct drm_framebuffer *fb = NULL; |
||
322 | struct drm_mode_set set; |
||
323 | struct drm_crtc *crtc = NULL; |
||
6283 | serge | 324 | |
325 | |||
6088 | serge | 326 | int stride; |
327 | int ret; |
||
328 | |||
2338 | Serge | 329 | |
6283 | serge | 330 | if(fb == NULL) |
331 | { |
||
332 | DRM_ERROR("%s failed\n", __FUNCTION__); |
||
333 | return -1; |
||
334 | }; |
||
335 | drm_framebuffer_reference(fb); |
||
336 | |||
337 | |||
6088 | serge | 338 | |
339 | |||
340 | { |
||
2338 | Serge | 341 | const struct drm_connector_funcs *f = tmpc->funcs; |
6088 | serge | 342 | if(tmpc == connector) |
343 | continue; |
||
344 | f->dpms(tmpc, DRM_MODE_DPMS_OFF); |
||
345 | }; |
||
2338 | Serge | 346 | |
6088 | serge | 347 | |
6283 | serge | 348 | |
6088 | serge | 349 | |
350 | DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n" |
||
351 | "monitor: %s model %x serial number %u\n", |
||
352 | mode->hdisplay, mode->vdisplay, |
||
6283 | serge | 353 | connector->encoder->crtc->base.id, connector->name, |
6088 | serge | 354 | manufacturer_name(con_edid + 0x08), |
355 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
||
356 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
||
357 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
||
358 | |||
359 | |||
6283 | serge | 360 | |
361 | |||
362 | os_display->crtc = crtc; |
||
363 | |||
364 | |||
6088 | serge | 365 | fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format); |
366 | |||
367 | |||
6283 | serge | 368 | set.x = 0; |
6088 | serge | 369 | set.y = 0; |
370 | set.mode = mode; |
||
371 | set.connectors = &connector; |
||
372 | set.num_connectors = 1; |
||
373 | set.fb = fb; |
||
374 | |||
375 | |||
376 | if ( !ret ) |
||
377 | { |
||
378 | struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); |
||
6283 | serge | 379 | struct kos_framebuffer *kfb = intel_fb->private; |
380 | kolibri_framebuffer_update(dev_priv, kfb); |
||
381 | DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb); |
||
382 | |||
6088 | serge | 383 | |
6283 | serge | 384 | os_display->height = mode->vdisplay; |
385 | os_display->vrefresh = drm_mode_vrefresh(mode); |
||
6088 | serge | 386 | sysSetFramebuffer(intel_fb->private); |
6283 | serge | 387 | sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]); |
388 | |||
6088 | serge | 389 | |
390 | os_display->crtc = connector->encoder->crtc; |
||
391 | os_display->supported_modes = count_connector_modes(connector); |
||
392 | |||
393 | |||
394 | crtc->cursor_y = os_display->height/2; |
||
395 | |||
396 | |||
6283 | serge | 397 | |
6088 | serge | 398 | |
399 | mode->hdisplay, mode->vdisplay, fb->pitches[0]); |
||
6283 | serge | 400 | } |
6088 | serge | 401 | else |
402 | DRM_ERROR(" failed to set mode %d_%d on crtc %p\n", |
||
403 | fb->width, fb->height, connector->encoder->crtc); |
||
404 | |||
405 | |||
6283 | serge | 406 | drm_modeset_unlock_all(dev); |
6088 | serge | 407 | return ret; |
408 | } |
||
409 | |||
410 | |||
411 | { |
||
412 | struct drm_display_mode *mode; |
||
413 | int retval; |
||
414 | |||
415 | |||
416 | if(mode == NULL) |
||
417 | return EINVAL; |
||
418 | |||
419 | |||
420 | |||
421 | |||
422 | return retval; |
||
423 | }; |
||
2338 | Serge | 424 | |
425 | |||
5060 | serge | 426 | { |
3031 | serge | 427 | struct drm_crtc *tmp_crtc; |
5060 | serge | 428 | int crtc_mask = 1; |
429 | |||
3031 | serge | 430 | |
5060 | serge | 431 | { |
3031 | serge | 432 | if (encoder->possible_crtcs & crtc_mask) |
5060 | serge | 433 | { |
6084 | serge | 434 | encoder->crtc = tmp_crtc; |
5060 | serge | 435 | DRM_DEBUG_KMS("use CRTC %p ID %d\n", tmp_crtc, tmp_crtc->base.id); |
436 | return tmp_crtc; |
||
437 | }; |
||
438 | crtc_mask <<= 1; |
||
439 | }; |
||
3031 | serge | 440 | return NULL; |
5060 | serge | 441 | }; |
3031 | serge | 442 | |
443 | |||
6088 | serge | 444 | { |
2338 | Serge | 445 | const struct drm_connector_helper_funcs *connector_funcs; |
6088 | serge | 446 | struct drm_encoder *encoder; |
4560 | Serge | 447 | struct drm_crtc *crtc; |
5060 | serge | 448 | |
2338 | Serge | 449 | |
6088 | serge | 450 | return -EINVAL; |
451 | |||
452 | |||
453 | |||
454 | |||
455 | { |
||
456 | connector_funcs = connector->helper_private; |
||
457 | encoder = connector_funcs->best_encoder(connector); |
||
458 | |||
459 | |||
460 | { |
||
461 | DRM_DEBUG_KMS("CONNECTOR %s ID: %d no active encoders\n", |
||
462 | connector->name, connector->base.id); |
||
463 | return -EINVAL; |
||
464 | }; |
||
465 | connector->encoder = encoder; |
||
6131 | serge | 466 | } |
6088 | serge | 467 | |
468 | |||
469 | if(crtc == NULL) |
||
470 | crtc = get_possible_crtc(dev, encoder); |
||
471 | |||
472 | |||
473 | { |
||
474 | DRM_DEBUG_KMS("%s connector: %p encode: %p crtc: %p\n",__FUNCTION__, |
||
6131 | serge | 475 | connector, encoder, crtc); |
476 | return 0; |
||
6088 | serge | 477 | } |
478 | else |
||
479 | DRM_DEBUG_KMS("No CRTC for encoder %d\n", encoder->base.id); |
||
480 | return -EINVAL; |
||
481 | } |
||
482 | |||
483 | |||
484 | { |
||
485 | struct drm_connector *connector; |
||
486 | |||
487 | |||
5060 | serge | 488 | { |
2338 | Serge | 489 | int name_len = __builtin_strlen(connector->name); |
6088 | serge | 490 | |
491 | |||
492 | continue; |
||
2338 | Serge | 493 | |
494 | |||
6088 | serge | 495 | continue; |
496 | |||
5060 | serge | 497 | |
6088 | serge | 498 | return connector; |
499 | } |
||
500 | return NULL; |
||
501 | } |
||
502 | |||
5060 | serge | 503 | |
2338 | Serge | 504 | |
6088 | serge | 505 | struct drm_crtc **boot_crtc) |
506 | { |
||
507 | struct drm_connector *connector; |
||
6103 | serge | 508 | |
4371 | Serge | 509 | |
6088 | serge | 510 | { |
511 | connector = get_cmdline_connector(dev, i915.cmdline_mode); |
||
512 | if(connector != NULL) |
||
513 | { |
||
5060 | serge | 514 | *boot_connector = connector; |
515 | *boot_crtc = connector->encoder->crtc; |
||
6088 | serge | 516 | return 0; |
5060 | serge | 517 | } |
518 | } |
||
6088 | serge | 519 | |
5060 | serge | 520 | |
6088 | serge | 521 | { |
522 | if(check_connector(dev, connector) == 0) |
||
523 | { |
||
524 | *boot_connector = connector; |
||
525 | *boot_crtc = connector->encoder->crtc; |
||
526 | return 0; |
||
527 | }; |
||
528 | }; |
||
2338 | Serge | 529 | |
530 | |||
5060 | serge | 531 | }; |
4398 | Serge | 532 | |
2338 | Serge | 533 | |
6103 | serge | 534 | |
5060 | serge | 535 | { |
4371 | Serge | 536 | struct drm_display_mode *mode; |
537 | |||
538 | |||
539 | { |
||
540 | if( os_display->width == mode->hdisplay && |
||
5060 | serge | 541 | os_display->height == mode->vdisplay && |
542 | drm_mode_vrefresh(mode) == 60) |
||
4371 | Serge | 543 | { |
544 | usermode->width = os_display->width; |
||
545 | usermode->height = os_display->height; |
||
546 | usermode->freq = 60; |
||
547 | return 1; |
||
548 | } |
||
549 | } |
||
550 | return 0; |
||
551 | } |
||
552 | |||
553 | |||
554 | { |
||
555 | struct drm_connector_helper_funcs *connector_funcs; |
||
556 | struct drm_connector *connector = NULL; |
||
5060 | serge | 557 | struct drm_crtc *crtc = NULL; |
558 | struct drm_plane *plane; |
||
6283 | serge | 559 | |
4371 | Serge | 560 | |
6296 | serge | 561 | ENTER(); |
6283 | serge | 562 | |
4371 | Serge | 563 | |
6283 | serge | 564 | { |
565 | drm_plane_helper_disable(plane); |
||
566 | }; |
||
567 | |||
568 | |||
4371 | Serge | 569 | ret = choose_config(dev, &connector, &crtc); |
5060 | serge | 570 | if(ret) |
571 | { |
||
4371 | Serge | 572 | mutex_unlock(&dev->mode_config.mutex); |
6088 | serge | 573 | DRM_DEBUG_KMS("No active connectors!\n"); |
4371 | Serge | 574 | return -1; |
575 | }; |
||
576 | |||
577 | |||
6283 | serge | 578 | |
5060 | serge | 579 | |
2338 | Serge | 580 | os_display->ddev = dev; |
581 | os_display->connector = connector; |
||
582 | os_display->crtc = crtc; |
||
583 | os_display->supported_modes = count_connector_modes(connector); |
||
584 | mutex_unlock(&dev->mode_config.mutex); |
||
6088 | serge | 585 | |
2338 | Serge | 586 | |
6283 | serge | 587 | |
6088 | serge | 588 | |
589 | |||
590 | |||
591 | ret = set_cmdline_mode(dev, connector); |
||
592 | |||
593 | |||
594 | { |
||
4280 | Serge | 595 | mutex_lock(&dev->mode_config.mutex); |
6088 | serge | 596 | |
597 | |||
598 | (usermode->height == 0)) |
||
599 | { |
||
4371 | Serge | 600 | if( !get_boot_mode(connector, usermode)) |
6088 | serge | 601 | { |
602 | struct drm_display_mode *mode; |
||
603 | |||
4280 | Serge | 604 | |
6088 | serge | 605 | usermode->width = mode->hdisplay; |
606 | usermode->height = mode->vdisplay; |
||
607 | usermode->freq = drm_mode_vrefresh(mode); |
||
608 | }; |
||
609 | }; |
||
4280 | Serge | 610 | mutex_unlock(&dev->mode_config.mutex); |
6088 | serge | 611 | |
612 | |||
613 | }; |
||
4280 | Serge | 614 | |
615 | |||
6283 | serge | 616 | |
2340 | Serge | 617 | |
6088 | serge | 618 | }; |
2338 | Serge | 619 | |
620 | |||
621 | |||
6088 | serge | 622 | { |
623 | struct drm_connector_helper_funcs *connector_funcs; |
||
624 | struct drm_connector *connector; |
||
625 | struct drm_cmdline_mode cmd_mode = {0}; |
||
6103 | serge | 626 | struct drm_display_mode *mode; |
6088 | serge | 627 | char *mode_option; |
628 | int retval = 0; |
||
629 | char con_edid[128]; |
||
630 | |||
631 | |||
632 | return EINVAL; |
||
633 | |||
634 | |||
635 | connector = get_cmdline_connector(dev, cmdline); |
||
636 | mutex_unlock(&dev->mode_config.mutex); |
||
637 | |||
638 | |||
639 | return EINVAL; |
||
640 | |||
641 | |||
642 | if(mode_option == NULL) |
||
643 | return EINVAL; |
||
644 | |||
645 | |||
646 | |||
647 | |||
648 | return EINVAL; |
||
649 | |||
650 | |||
651 | connector->name, |
||
652 | cmd_mode.xres, cmd_mode.yres, |
||
653 | cmd_mode.refresh_specified ? cmd_mode.refresh : 60, |
||
654 | cmd_mode.rb ? " reduced blanking" : "", |
||
655 | cmd_mode.margins ? " with margins" : "", |
||
656 | cmd_mode.interlace ? " interlaced" : ""); |
||
657 | |||
658 | |||
659 | if(mode == NULL) |
||
660 | return EINVAL; |
||
661 | |||
662 | |||
663 | DRM_DEBUG_KMS("connector: %s monitor: %s model %x serial number %u\n", |
||
664 | connector->name, |
||
665 | manufacturer_name(con_edid + 0x08), |
||
666 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
||
667 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
||
668 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
||
669 | |||
670 | |||
671 | |||
672 | |||
673 | |||
674 | |||
675 | } |
||
676 | |||
677 | |||
6103 | serge | 678 | { |
679 | struct drm_connector *connector; |
||
680 | char con_edid[128]; |
||
681 | |||
682 | |||
683 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) |
||
684 | { |
||
685 | if( connector->status != connector_status_connected) |
||
686 | continue; |
||
687 | |||
688 | |||
689 | |||
690 | |||
691 | { |
||
692 | printf("%s mode %dx%d connected %s model %x serial number %u\n", |
||
693 | connector->name, os_display->width, os_display->height, |
||
694 | manufacturer_name(con_edid + 0x08), |
||
695 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
||
696 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
||
697 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
||
698 | continue; |
||
699 | } |
||
700 | else |
||
701 | { |
||
702 | printf("%s connected: %s model %x serial number %u\n", |
||
703 | connector->name, manufacturer_name(con_edid + 0x08), |
||
704 | (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)), |
||
705 | (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8) |
||
706 | + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24))); |
||
707 | } |
||
708 | }; |
||
709 | mutex_unlock(&dev->mode_config.mutex); |
||
710 | } |
||
711 | |||
712 | |||
713 | { |
||
714 | struct drm_connector *connector; |
||
715 | struct drm_display_mode *drmmode; |
||
716 | |||
717 | |||
718 | |||
719 | |||
720 | if(connector == NULL) |
||
721 | { |
||
722 | mutex_unlock(&dev->mode_config.mutex); |
||
723 | return EINVAL; |
||
724 | }; |
||
725 | |||
726 | |||
727 | |||
728 | |||
729 | { |
||
730 | printf("%dx%d@%d\n", drmmode->hdisplay, drmmode->vdisplay, drm_mode_vrefresh(drmmode)); |
||
731 | }; |
||
732 | |||
733 | |||
734 | return 0; |
||
735 | }; |
||
736 | |||
737 | |||
2338 | Serge | 738 | { |
739 | int err = -1; |
||
740 | |||
741 | |||
3031 | serge | 742 | |
2338 | Serge | 743 | |
744 | { |
||
745 | *count = os_display->supported_modes; |
||
746 | err = 0; |
||
747 | } |
||
748 | else if( mode != NULL ) |
||
749 | { |
||
750 | struct drm_display_mode *drmmode; |
||
751 | int i = 0; |
||
752 | |||
753 | |||
754 | *count = os_display->supported_modes; |
||
755 | |||
756 | |||
757 | { |
||
758 | if( i < *count) |
||
759 | { |
||
760 | mode->width = drmmode->hdisplay; |
||
5060 | serge | 761 | mode->height = drmmode->vdisplay; |
762 | mode->bpp = 32; |
||
2338 | Serge | 763 | mode->freq = drm_mode_vrefresh(drmmode); |
764 | i++; |
||
765 | mode++; |
||
766 | } |
||
767 | else break; |
||
768 | }; |
||
769 | *count = i; |
||
770 | err = 0; |
||
771 | }; |
||
772 | return err; |
||
773 | }; |
||
774 | |||
775 | |||
776 | { |
||
777 | |||
778 | |||
3031 | serge | 779 | // mode->width, mode->height, mode->freq); |
780 | |||
2338 | Serge | 781 | |
782 | (mode->height != 0) && |
||
783 | (mode->freq != 0 ) && |
||
784 | ( (mode->width != os_display->width) || |
||
785 | (mode->height != os_display->height) || |
||
786 | (mode->freq != os_display->vrefresh) ) ) |
||
787 | { |
||
788 | return set_mode(os_display->ddev, os_display->connector, os_display->crtc, mode, true); |
||
5060 | serge | 789 | }; |
2338 | Serge | 790 | |
791 | |||
5060 | serge | 792 | }; |
2338 | Serge | 793 | |
794 | |||
4126 | Serge | 795 | { |
796 | const struct drm_connector_funcs *f = os_display->connector->funcs; |
||
4371 | Serge | 797 | |
4126 | Serge | 798 | |
799 | }; |
||
800 | |||
801 | |||
6283 | serge | 802 | |
803 | { |
||
2338 | Serge | 804 | u32 ifl; |
6283 | serge | 805 | |
2342 | Serge | 806 | |
6283 | serge | 807 | { |
808 | struct drm_i915_private *dev_priv = os_display->ddev->dev_private; |
||
809 | struct intel_crtc *crtc = to_intel_crtc(os_display->crtc); |
||
810 | struct kos_framebuffer *kfb = os_display->current_lfb; |
||
811 | struct intel_framebuffer *intel_fb = (struct intel_framebuffer*)kfb->private; |
||
812 | struct drm_i915_gem_object *obj = intel_fb->obj; |
||
813 | |||
3037 | serge | 814 | |
6283 | serge | 815 | fb->width = os_display->width; |
816 | fb->height = os_display->height; |
||
817 | fb->pitch = obj->stride; |
||
818 | fb->tiling = obj->tiling_mode; |
||
819 | fb->crtc = crtc->base.base.id; |
||
820 | fb->pipe = crtc->pipe; |
||
821 | } |
||
822 | safe_sti(ifl); |
||
823 | |||
6296 | serge | 824 | |
6283 | serge | 825 | } |
826 | |||
3037 | serge | 827 | |
6283 | serge | 828 | { |
2338 | Serge | 829 | struct kos_framebuffer *kfb; |
6283 | serge | 830 | addr_t dummy_table; |
831 | addr_t *pt_addr = NULL; |
||
832 | int pde; |
||
833 | |||
6296 | serge | 834 | |
6283 | serge | 835 | kfb->private = intel_fb; |
836 | |||
2338 | Serge | 837 | |
6283 | serge | 838 | { |
839 | dummy_table = AllocPage(); |
||
840 | kfb->pde[pde] = dummy_table|PG_UW; |
||
841 | |||
2338 | Serge | 842 | |
6283 | serge | 843 | __builtin_memset(pt_addr,0,4096); |
844 | kunmap((struct page*)dummy_table); |
||
845 | }; |
||
846 | |||
847 | |||
848 | |||
6296 | serge | 849 | |
6283 | serge | 850 | #if 0 |
851 | struct sg_page_iter sg_iter; |
||
852 | num_pages = obj->base.size/4096; |
||
853 | printf("num_pages %d\n",num_pages); |
||
854 | |||
855 | |||
856 | pde = 0; |
||
857 | pt_addr = NULL; |
||
858 | |||
859 | |||
860 | while (__sg_page_iter_next(&sg_iter)) |
||
861 | { |
||
2338 | Serge | 862 | if (pt_addr == NULL) |
6283 | serge | 863 | { |
6296 | serge | 864 | addr_t pt = AllocPage(); |
6283 | serge | 865 | kfb->pde[pde] = pt|PG_UW; |
866 | pde++; |
||
867 | pt_addr = kmap_atomic((struct page*)pt); |
||
868 | } |
||
6296 | serge | 869 | pt_addr[pte] = sg_page_iter_dma_address(&sg_iter)|PG_UW|PG_WRITEC; |
6283 | serge | 870 | if( (pte & 15) == 0) |
871 | DRM_DEBUG_KMS("pte %x\n",pt_addr[pte]); |
||
872 | if (++pte == 1024) |
||
873 | { |
||
6296 | serge | 874 | kunmap_atomic(pt_addr); |
6283 | serge | 875 | pt_addr = NULL; |
876 | if (pde == 8) |
||
877 | break; |
||
878 | pte = 0; |
||
879 | } |
||
2338 | Serge | 880 | } |
6296 | serge | 881 | |
2338 | Serge | 882 | |
6283 | serge | 883 | { |
6296 | serge | 884 | for(;pte < 1024; pte++) |
6283 | serge | 885 | pt_addr[pte] = dummy_page|PG_UW; |
886 | kunmap_atomic(pt_addr); |
||
887 | } |
||
6296 | serge | 888 | #endif |
6283 | serge | 889 | }; |
890 | |||
2338 | Serge | 891 | |
6283 | serge | 892 | { |
893 | struct intel_framebuffer *intel_fb = kfb->private; |
||
894 | addr_t *pt_addr = NULL; |
||
895 | int pte = 0; |
||
896 | int pde = 0; |
||
897 | int num_pages; |
||
898 | addr_t pfn; |
||
899 | ENTER(); |
||
900 | num_pages = intel_fb->obj->base.size/4096; |
||
901 | pfn = dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(intel_fb->obj); |
||
902 | |||
2338 | Serge | 903 | |
6283 | serge | 904 | { |
6296 | serge | 905 | if (pt_addr == NULL) |
6283 | serge | 906 | { |
907 | addr_t pt = kfb->pde[pde] & 0xFFFFF000; |
||
908 | pde++; |
||
909 | pt_addr = kmap_atomic((struct page*)pt); |
||
910 | } |
||
911 | pt_addr[pte] = pfn|PG_UW|PG_WRITEC; |
||
912 | pfn+= 4096; |
||
913 | num_pages--; |
||
914 | if (++pte == 1024) |
||
915 | { |
||
916 | kunmap_atomic(pt_addr); |
||
917 | pt_addr = NULL; |
||
918 | if (pde == 8) |
||
919 | break; |
||
920 | pte = 0; |
||
921 | } |
||
922 | } |
||
923 | |||
2338 | Serge | 924 | |
6283 | serge | 925 | { |
2338 | Serge | 926 | for(;pte < 1024; pte++) |
6283 | serge | 927 | pt_addr[pte] = dummy_fb_page|PG_UW; |
928 | kunmap_atomic(pt_addr); |
||
929 | } |
||
2338 | Serge | 930 | LEAVE(); |
6283 | serge | 931 | }; |
2338 | Serge | 932 | |
933 | |||
3277 | Serge | 934 | { |
935 | int left; |
||
936 | int top; |
||
937 | int right; |
||
938 | int bottom; |
||
939 | }rect_t; |
||
940 | |||
3263 | Serge | 941 | |
3277 | Serge | 942 | |
943 | |||
944 | |||
945 | |||
946 | |||
947 | struct drm_file *file) |
||
948 | { |
||
949 | struct drm_i915_mask *mask = data; |
||
950 | struct drm_gem_object *obj; |
||
951 | static unsigned int mask_seqno[256]; |
||
952 | rect_t winrc; |
||
953 | u32 slot; |
||
954 | int ret=0; |
||
4371 | Serge | 955 | |
3277 | Serge | 956 | |
957 | if (obj == NULL) |
||
958 | return -ENOENT; |
||
959 | |||
960 | |||
961 | drm_gem_object_unreference_unlocked(obj); |
||
962 | return -EINVAL; |
||
963 | } |
||
964 | |||
965 | |||
966 | { |
||
967 | // static warn_count; |
||
3298 | Serge | 968 | |
3277 | Serge | 969 | |
3290 | Serge | 970 | mask->height = winrc.bottom - winrc.top + 1; |
971 | mask->bo_pitch = (mask->width+15) & ~15; |
||
972 | |||
973 | |||
3298 | Serge | 974 | if(warn_count < 1) |
3277 | Serge | 975 | { |
976 | printf("left %d top %d right %d bottom %d\n", |
||
977 | winrc.left, winrc.top, winrc.right, winrc.bottom); |
||
978 | printf("mask pitch %d data %p\n", mask->bo_pitch, mask->bo_map); |
||
5060 | serge | 979 | warn_count++; |
3277 | Serge | 980 | }; |
981 | #endif |
||
3298 | Serge | 982 | |
983 | |||
4104 | Serge | 984 | |
3277 | Serge | 985 | |
3290 | Serge | 986 | |
3277 | Serge | 987 | |
988 | |||
989 | { |
||
990 | u8* src_offset; |
||
991 | u8* dst_offset; |
||
992 | u32 ifl; |
||
993 | |||
994 | |||
995 | if (ret) |
||
996 | goto err1; |
||
4371 | Serge | 997 | |
3277 | Serge | 998 | |
999 | if(ret != 0 ) |
||
4398 | Serge | 1000 | { |
3277 | Serge | 1001 | dbgprintf("%s: i915_gem_object_set_to_cpu_domain failed\n", __FUNCTION__); |
4371 | Serge | 1002 | goto err2; |
1003 | }; |
||
3277 | Serge | 1004 | |
1005 | |||
1006 | |||
1007 | |||
1008 | |||
1009 | |||
5354 | serge | 1010 | src_offset+= winrc.top*os_display->width + winrc.left; |
1011 | |||
3277 | Serge | 1012 | |
1013 | |||
1014 | |||
5354 | serge | 1015 | |
3277 | Serge | 1016 | |
1017 | { |
||
1018 | mask_seqno[slot] = os_display->mask_seqno; |
||
1019 | |||
1020 | |||
1021 | |||
1022 | |||
1023 | "movd %[slot], %%xmm6 \n" |
||
4560 | Serge | 1024 | "punpckldq %%xmm6, %%xmm6 \n" |
3277 | Serge | 1025 | "punpcklqdq %%xmm6, %%xmm6 \n" |
1026 | :: [slot] "m" (slot) |
||
1027 | :"xmm6"); |
||
1028 | |||
1029 | |||
1030 | { |
||
1031 | int tmp_w = mask->width; |
||
4398 | Serge | 1032 | |
3277 | Serge | 1033 | |
1034 | u8* tmp_dst = dst_offset; |
||
1035 | |||
1036 | |||
1037 | dst_offset+= mask->bo_pitch; |
||
1038 | |||
1039 | |||
1040 | { |
||
1041 | __asm__ __volatile__ ( |
||
1042 | "movdqu (%0), %%xmm0 \n" |
||
1043 | "movdqu 16(%0), %%xmm1 \n" |
||
1044 | "movdqu 32(%0), %%xmm2 \n" |
||
1045 | "movdqu 48(%0), %%xmm3 \n" |
||
1046 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1047 | "pcmpeqb %%xmm6, %%xmm1 \n" |
||
1048 | "pcmpeqb %%xmm6, %%xmm2 \n" |
||
1049 | "pcmpeqb %%xmm6, %%xmm3 \n" |
||
1050 | "movdqa %%xmm0, (%%edi) \n" |
||
1051 | "movdqa %%xmm1, 16(%%edi) \n" |
||
1052 | "movdqa %%xmm2, 32(%%edi) \n" |
||
1053 | "movdqa %%xmm3, 48(%%edi) \n" |
||
1054 | |||
1055 | |||
1056 | :"xmm0","xmm1","xmm2","xmm3"); |
||
1057 | tmp_w -= 64; |
||
1058 | tmp_src += 64; |
||
1059 | tmp_dst += 64; |
||
1060 | } |
||
1061 | |||
1062 | |||
1063 | { |
||
1064 | __asm__ __volatile__ ( |
||
1065 | "movdqu (%0), %%xmm0 \n" |
||
1066 | "movdqu 16(%0), %%xmm1 \n" |
||
1067 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1068 | "pcmpeqb %%xmm6, %%xmm1 \n" |
||
1069 | "movdqa %%xmm0, (%%edi) \n" |
||
1070 | "movdqa %%xmm1, 16(%%edi) \n" |
||
1071 | |||
1072 | |||
1073 | :"xmm0","xmm1"); |
||
1074 | tmp_w -= 32; |
||
1075 | tmp_src += 32; |
||
1076 | tmp_dst += 32; |
||
1077 | } |
||
1078 | |||
1079 | |||
4398 | Serge | 1080 | { |
3277 | Serge | 1081 | __asm__ __volatile__ ( |
1082 | "movdqu (%0), %%xmm0 \n" |
||
1083 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1084 | "movdqa %%xmm0, (%%edi) \n" |
||
1085 | :: "r" (tmp_src), "D" (tmp_dst) |
||
1086 | :"xmm0"); |
||
1087 | tmp_w -= 16; |
||
1088 | tmp_src += 16; |
||
1089 | tmp_dst += 16; |
||
1090 | } |
||
1091 | |||
4398 | Serge | 1092 | |
1093 | { |
||
1094 | __asm__ __volatile__ ( |
||
1095 | "movq (%0), %%xmm0 \n" |
||
1096 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1097 | "movq %%xmm0, (%%edi) \n" |
||
1098 | :: "r" (tmp_src), "D" (tmp_dst) |
||
1099 | :"xmm0"); |
||
1100 | tmp_w -= 8; |
||
1101 | tmp_src += 8; |
||
1102 | tmp_dst += 8; |
||
1103 | } |
||
1104 | if( tmp_w >= 4 ) |
||
1105 | { |
||
1106 | __asm__ __volatile__ ( |
||
1107 | "movd (%0), %%xmm0 \n" |
||
1108 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1109 | "movd %%xmm0, (%%edi) \n" |
||
1110 | :: "r" (tmp_src), "D" (tmp_dst) |
||
1111 | :"xmm0"); |
||
1112 | tmp_w -= 4; |
||
1113 | tmp_src += 4; |
||
1114 | tmp_dst += 4; |
||
1115 | } |
||
1116 | while(tmp_w--) |
||
1117 | *tmp_dst++ = (*tmp_src++ == (u8)slot) ? 0xFF:0x00; |
||
1118 | }; |
||
3277 | Serge | 1119 | }; |
1120 | safe_sti(ifl); |
||
1121 | |||
4371 | Serge | 1122 | |
1123 | } |
||
4539 | Serge | 1124 | |
1125 | |||
1126 | mutex_unlock(&dev->struct_mutex); |
||
1127 | err1: |
||
1128 | drm_gem_object_unreference(obj); |
||
1129 | |||
1130 | |||
1131 | } |
||
1132 | |||
1133 | |||
1134 | struct drm_file *file) |
||
1135 | { |
||
1136 | struct drm_i915_mask_update *mask = data; |
||
1137 | struct drm_gem_object *obj; |
||
1138 | static unsigned int mask_seqno[256]; |
||
1139 | static warn_count; |
||
1140 | |||
1141 | |||
1142 | u32 winw,winh; |
||
1143 | u32 ml,mt,mr,mb; |
||
1144 | u32 slot; |
||
1145 | int ret = 0; |
||
1146 | slot = *((u8*)CURRENT_TASK); |
||
1147 | |||
1148 | |||
6084 | serge | 1149 | return 0; |
4539 | Serge | 1150 | |
1151 | |||
6084 | serge | 1152 | memset((void*)mask->bo_map,0,mask->width * mask->height); |
1153 | |||
5367 | serge | 1154 | |
4539 | Serge | 1155 | win.right+= 1; |
1156 | win.bottom+= 1; |
||
1157 | |||
1158 | |||
1159 | winh = win.bottom - win.top; |
||
1160 | |||
1161 | |||
1162 | mask->dy >= winh) |
||
1163 | return 1; |
||
1164 | |||
1165 | |||
1166 | mt = win.top + mask->dy; |
||
1167 | mr = ml + mask->width; |
||
1168 | mb = mt + mask->height; |
||
1169 | |||
1170 | |||
1171 | mr < win.left || mb < win.top ) |
||
1172 | return 1; |
||
1173 | |||
1174 | |||
1175 | mr = win.right; |
||
1176 | |||
1177 | |||
1178 | mb = win.bottom; |
||
1179 | |||
1180 | |||
1181 | mask->height = mb - mt; |
||
1182 | |||
1183 | |||
1184 | mask->height== 0 ) |
||
1185 | return 1; |
||
1186 | |||
1187 | |||
6131 | serge | 1188 | if (ret) |
1189 | return ret; |
||
1190 | |||
1191 | |||
4539 | Serge | 1192 | if (obj == NULL) |
1193 | { |
||
6131 | serge | 1194 | ret = -ENOENT; |
1195 | goto unlock; |
||
1196 | } |
||
1197 | |||
4539 | Serge | 1198 | |
6131 | serge | 1199 | { |
1200 | ret = -ENOENT; |
||
1201 | goto out; |
||
1202 | } |
||
4539 | Serge | 1203 | |
1204 | |||
6084 | serge | 1205 | if(warn_count < 100) |
1206 | { |
||
4539 | Serge | 1207 | printf("left %d top %d right %d bottom %d\n", |
1208 | ml, mt, mr, mb); |
||
1209 | warn_count++; |
||
1210 | }; |
||
1211 | #endif |
||
1212 | |||
1213 | |||
1214 | |||
1215 | |||
1216 | |||
1217 | u8* src_offset; |
||
1218 | u8* dst_offset; |
||
1219 | u32 ifl; |
||
1220 | |||
1221 | |||
1222 | |||
1223 | |||
5354 | serge | 1224 | src_offset+= mt*os_display->width + ml; |
1225 | dst_offset = (u8*)mask->bo_map; |
||
4539 | Serge | 1226 | |
1227 | |||
5354 | serge | 1228 | |
4539 | Serge | 1229 | |
1230 | { |
||
4371 | Serge | 1231 | mask_seqno[slot] = os_display->mask_seqno; |
4539 | Serge | 1232 | |
1233 | |||
1234 | |||
1235 | |||
1236 | "movd %[slot], %%xmm6 \n" |
||
1237 | "punpckldq %%xmm6, %%xmm6 \n" |
||
1238 | "punpcklqdq %%xmm6, %%xmm6 \n" |
||
1239 | :: [slot] "m" (slot) |
||
1240 | :"xmm6"); |
||
1241 | |||
1242 | |||
1243 | { |
||
1244 | int tmp_w = mask->width; |
||
1245 | |||
1246 | |||
1247 | u8* tmp_dst = dst_offset; |
||
1248 | |||
1249 | |||
1250 | dst_offset+= mask->bo_pitch; |
||
1251 | |||
1252 | |||
1253 | { |
||
1254 | __asm__ __volatile__ ( |
||
1255 | "movdqu (%0), %%xmm0 \n" |
||
1256 | "movdqu 16(%0), %%xmm1 \n" |
||
1257 | "movdqu 32(%0), %%xmm2 \n" |
||
1258 | "movdqu 48(%0), %%xmm3 \n" |
||
1259 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1260 | "pcmpeqb %%xmm6, %%xmm1 \n" |
||
1261 | "pcmpeqb %%xmm6, %%xmm2 \n" |
||
1262 | "pcmpeqb %%xmm6, %%xmm3 \n" |
||
1263 | "movdqa %%xmm0, (%%edi) \n" |
||
1264 | "movdqa %%xmm1, 16(%%edi) \n" |
||
1265 | "movdqa %%xmm2, 32(%%edi) \n" |
||
1266 | "movdqa %%xmm3, 48(%%edi) \n" |
||
1267 | |||
1268 | |||
1269 | :"xmm0","xmm1","xmm2","xmm3"); |
||
1270 | tmp_w -= 64; |
||
1271 | tmp_src += 64; |
||
1272 | tmp_dst += 64; |
||
1273 | } |
||
1274 | |||
1275 | |||
1276 | { |
||
1277 | __asm__ __volatile__ ( |
||
1278 | "movdqu (%0), %%xmm0 \n" |
||
1279 | "movdqu 16(%0), %%xmm1 \n" |
||
1280 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1281 | "pcmpeqb %%xmm6, %%xmm1 \n" |
||
1282 | "movdqa %%xmm0, (%%edi) \n" |
||
1283 | "movdqa %%xmm1, 16(%%edi) \n" |
||
1284 | |||
1285 | |||
1286 | :"xmm0","xmm1"); |
||
1287 | tmp_w -= 32; |
||
1288 | tmp_src += 32; |
||
1289 | tmp_dst += 32; |
||
1290 | } |
||
1291 | |||
1292 | |||
1293 | { |
||
1294 | __asm__ __volatile__ ( |
||
1295 | "movdqu (%0), %%xmm0 \n" |
||
1296 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1297 | "movdqa %%xmm0, (%%edi) \n" |
||
1298 | :: "r" (tmp_src), "D" (tmp_dst) |
||
1299 | :"xmm0"); |
||
1300 | tmp_w -= 16; |
||
1301 | tmp_src += 16; |
||
1302 | tmp_dst += 16; |
||
1303 | } |
||
1304 | |||
1305 | |||
1306 | { |
||
1307 | __asm__ __volatile__ ( |
||
1308 | "movq (%0), %%xmm0 \n" |
||
1309 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1310 | "movq %%xmm0, (%%edi) \n" |
||
1311 | :: "r" (tmp_src), "D" (tmp_dst) |
||
1312 | :"xmm0"); |
||
1313 | tmp_w -= 8; |
||
1314 | tmp_src += 8; |
||
1315 | tmp_dst += 8; |
||
1316 | } |
||
1317 | if( tmp_w >= 4 ) |
||
1318 | { |
||
4560 | Serge | 1319 | __asm__ __volatile__ ( |
4539 | Serge | 1320 | "movd (%0), %%xmm0 \n" |
1321 | "pcmpeqb %%xmm6, %%xmm0 \n" |
||
1322 | "movd %%xmm0, (%%edi) \n" |
||
1323 | :: "r" (tmp_src), "D" (tmp_dst) |
||
1324 | :"xmm0"); |
||
1325 | tmp_w -= 4; |
||
1326 | tmp_src += 4; |
||
1327 | tmp_dst += 4; |
||
1328 | } |
||
1329 | while(tmp_w--) |
||
1330 | *tmp_dst++ = (*tmp_src++ == (u8)slot) ? 0xFF:0x00; |
||
1331 | }; |
||
1332 | }; |
||
4371 | Serge | 1333 | safe_sti(ifl); |
4539 | Serge | 1334 | |
1335 | |||
1336 | } |
||
3277 | Serge | 1337 | #endif |
4539 | Serge | 1338 | |
3277 | Serge | 1339 | |
6131 | serge | 1340 | drm_gem_object_unreference(obj); |
3277 | Serge | 1341 | |
1342 | |||
6131 | serge | 1343 | mutex_unlock(&dev->struct_mutex); |
1344 | |||
1345 | |||
4371 | Serge | 1346 | } |
3277 | Serge | 1347 | |
1348 | |||
1349 | |||
1350 | |||
2360 | Serge | 1351 | |
3031 | serge | 1352 | |
2360 | Serge | 1353 | |
3031 | serge | 1354 | { |
1355 | u32 tmp = GetTimerTicks(); |
||
1356 | |||
2360 | Serge | 1357 | |
3031 | serge | 1358 | ts->tv_nsec = (tmp - ts->tv_sec*100)*10000000; |
1359 | } |
||
1360 | |||
2360 | Serge | 1361 | |
6084 | serge | 1362 | { |
3031 | serge | 1363 | unsigned long flags; |
3480 | Serge | 1364 | |
3031 | serge | 1365 | |
3480 | Serge | 1366 | spin_lock_irqsave(&q->lock, flags); |
1367 | if (list_empty(&wait->task_list)) |
||
1368 | __add_wait_queue(q, wait); |
||
1369 | spin_unlock_irqrestore(&q->lock, flags); |
||
1370 | } |
||
1371 | |||
1372 | |||
1373 | * finish_wait - clean up after waiting in a queue |
||
1374 | * @q: waitqueue waited on |
||
1375 | * @wait: wait descriptor |
||
1376 | * |
||
1377 | * Sets current thread back to running state and removes |
||
1378 | * the wait descriptor from the given waitqueue if still |
||
1379 | * queued. |
||
1380 | */ |
||
1381 | void finish_wait(wait_queue_head_t *q, wait_queue_t *wait) |
||
1382 | { |
||
1383 | unsigned long flags; |
||
1384 | |||
1385 | |||
1386 | /* |
||
1387 | * We can check for list emptiness outside the lock |
||
1388 | * IFF: |
||
1389 | * - we use the "careful" check that verifies both |
||
1390 | * the next and prev pointers, so that there cannot |
||
1391 | * be any half-pending updates in progress on other |
||
1392 | * CPU's that we haven't seen yet (and that might |
||
1393 | * still change the stack area. |
||
1394 | * and |
||
1395 | * - all other users take the lock (ie we can only |
||
1396 | * have _one_ other CPU that looks at or modifies |
||
1397 | * the list). |
||
1398 | */ |
||
1399 | if (!list_empty_careful(&wait->task_list)) { |
||
1400 | spin_lock_irqsave(&q->lock, flags); |
||
1401 | list_del_init(&wait->task_list); |
||
1402 | spin_unlock_irqrestore(&q->lock, flags); |
||
1403 | } |
||
1404 | |||
1405 | |||
1406 | } |
||
1407 | |||
1408 | |||
1409 | { |
||
1410 | list_del_init(&wait->task_list); |
||
1411 | return 1; |
||
1412 | }24); |
||
1413 | |||
1414 | |||
1415 | |||
1416 |