Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-misc-next-2021-10-06' of git://anongit.freedesktop.org/drm/drm-misc into drm-next

drm-misc-next for v5.16:

UAPI Changes:
- Allow empty drm leases for creating separate GEM namespaces.

Cross-subsystem Changes:
- Slightly rework dma_buf_poll.
- Add dma_resv_for_each_fence_unlocked to iterate, and use it inside
the lockless dma-resv functions.

Core Changes:
- Allow devm_drm_of_get_bridge to build without CONFIG_OF for compile testing.
- Add more DP2 headers.
- fix CONFIG_FB dependency in fb_helper.
- Add DRM_FORMAT_R8 to drm_format_info, and helpers for RGB332 and RGB888.
- Fix crash on a 0 or invalid EDID.

Driver Changes:
- Apply and revert DRM_MODESET_LOCK_ALL_BEGIN.
- Add mode_valid to ti-sn65dsi86 bridge.
- Support multiple syncobjs in v3d.
- Add R8, RGB332 and RGB888 pixel formats to GUD.
- Use devm_add_action_or_reset in dw-hdmi-cec.

Signed-off-by: Dave Airlie <airlied@redhat.com>

# gpg: Signature made Wed 06 Oct 2021 20:48:12 AEST
# gpg: using RSA key B97BD6A80CAC4981091AE547FE558C72A67013C3
# gpg: Good signature from "Maarten Lankhorst <maarten.lankhorst@linux.intel.com>" [expired]
# gpg: aka "Maarten Lankhorst <maarten@debian.org>" [expired]
# gpg: aka "Maarten Lankhorst <maarten.lankhorst@canonical.com>" [expired]
# gpg: Note: This key has expired!
# Primary key fingerprint: B97B D6A8 0CAC 4981 091A E547 FE55 8C72 A670 13C3
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/2602f4e9-a8ac-83f8-6c2a-39fd9ca2e1ba@linux.intel.com

+3157 -1140
+7
Documentation/devicetree/bindings/display/panel/boe,tv101wum-nl6.yaml
··· 26 26 - auo,b101uan08.3 27 27 # BOE TV105WUM-NW0 10.5" WUXGA TFT LCD panel 28 28 - boe,tv105wum-nw0 29 + # BOE TV110C9M-LL3 10.95" WUXGA TFT LCD panel 30 + - boe,tv110c9m-ll3 31 + # INX HJ110IZ-01A 10.95" WUXGA TFT LCD panel 32 + - innolux,hj110iz-01a 29 33 30 34 reg: 31 35 description: the virtual channel number of a DSI peripheral ··· 38 34 description: a GPIO spec for the enable pin 39 35 40 36 pp1800-supply: 37 + description: core voltage supply 38 + 39 + pp3300-supply: 41 40 description: core voltage supply 42 41 43 42 avdd-supply:
+12
Documentation/gpu/drm-kms-helpers.rst
··· 151 151 .. kernel-doc:: drivers/gpu/drm/drm_bridge.c 152 152 :doc: overview 153 153 154 + Display Driver Integration 155 + -------------------------- 156 + 157 + .. kernel-doc:: drivers/gpu/drm/drm_bridge.c 158 + :doc: display driver integration 159 + 160 + Special Care with MIPI-DSI bridges 161 + ---------------------------------- 162 + 163 + .. kernel-doc:: drivers/gpu/drm/drm_bridge.c 164 + :doc: special care dsi 165 + 154 166 Bridge Operations 155 167 ----------------- 156 168
-17
Documentation/gpu/todo.rst
··· 353 353 354 354 Level: Intermediate 355 355 356 - Use DRM_MODESET_LOCK_ALL_* helpers instead of boilerplate 357 - --------------------------------------------------------- 358 - 359 - For cases where drivers are attempting to grab the modeset locks with a local 360 - acquire context. Replace the boilerplate code surrounding 361 - drm_modeset_lock_all_ctx() with DRM_MODESET_LOCK_ALL_BEGIN() and 362 - DRM_MODESET_LOCK_ALL_END() instead. 363 - 364 - This should also be done for all places where drm_modeset_lock_all() is still 365 - used. 366 - 367 - As a reference, take a look at the conversions already completed in drm core. 368 - 369 - Contact: Sean Paul, respective driver maintainers 370 - 371 - Level: Starter 372 - 373 356 Rename CMA helpers to DMA helpers 374 357 --------------------------------- 375 358
+1 -1
Documentation/locking/ww-mutex-design.rst
··· 60 60 Compared to normal mutexes two additional concepts/objects show up in the lock 61 61 interface for w/w mutexes: 62 62 63 - Acquire context: To ensure eventual forward progress it is important the a task 63 + Acquire context: To ensure eventual forward progress it is important that a task 64 64 trying to acquire locks doesn't grab a new reservation id, but keeps the one it 65 65 acquired when starting the lock acquisition. This ticket is stored in the 66 66 acquire context. Furthermore the acquire context keeps track of debugging state
+75 -87
drivers/dma-buf/dma-buf.c
··· 74 74 * If you hit this BUG() it means someone dropped their ref to the 75 75 * dma-buf while still having pending operation to the buffer. 76 76 */ 77 - BUG_ON(dmabuf->cb_shared.active || dmabuf->cb_excl.active); 77 + BUG_ON(dmabuf->cb_in.active || dmabuf->cb_out.active); 78 78 79 79 dma_buf_stats_teardown(dmabuf); 80 80 dmabuf->ops->release(dmabuf); ··· 206 206 wake_up_locked_poll(dcb->poll, dcb->active); 207 207 dcb->active = 0; 208 208 spin_unlock_irqrestore(&dcb->poll->lock, flags); 209 + dma_fence_put(fence); 210 + } 211 + 212 + static bool dma_buf_poll_shared(struct dma_resv *resv, 213 + struct dma_buf_poll_cb_t *dcb) 214 + { 215 + struct dma_resv_list *fobj = dma_resv_shared_list(resv); 216 + struct dma_fence *fence; 217 + int i, r; 218 + 219 + if (!fobj) 220 + return false; 221 + 222 + for (i = 0; i < fobj->shared_count; ++i) { 223 + fence = rcu_dereference_protected(fobj->shared[i], 224 + dma_resv_held(resv)); 225 + dma_fence_get(fence); 226 + r = dma_fence_add_callback(fence, &dcb->cb, dma_buf_poll_cb); 227 + if (!r) 228 + return true; 229 + dma_fence_put(fence); 230 + } 231 + 232 + return false; 233 + } 234 + 235 + static bool dma_buf_poll_excl(struct dma_resv *resv, 236 + struct dma_buf_poll_cb_t *dcb) 237 + { 238 + struct dma_fence *fence = dma_resv_excl_fence(resv); 239 + int r; 240 + 241 + if (!fence) 242 + return false; 243 + 244 + dma_fence_get(fence); 245 + r = dma_fence_add_callback(fence, &dcb->cb, dma_buf_poll_cb); 246 + if (!r) 247 + return true; 248 + dma_fence_put(fence); 249 + 250 + return false; 209 251 } 210 252 211 253 static __poll_t dma_buf_poll(struct file *file, poll_table *poll) 212 254 { 213 255 struct dma_buf *dmabuf; 214 256 struct dma_resv *resv; 215 - struct dma_resv_list *fobj; 216 - struct dma_fence *fence_excl; 217 257 __poll_t events; 218 - unsigned shared_count, seq; 219 258 220 259 dmabuf = file->private_data; 221 260 if (!dmabuf || !dmabuf->resv) ··· 268 229 if (!events) 269 230 return 0; 270 231 271 - retry: 272 - seq = read_seqcount_begin(&resv->seq); 273 - rcu_read_lock(); 232 + dma_resv_lock(resv, NULL); 274 233 275 - fobj = rcu_dereference(resv->fence); 276 - if (fobj) 277 - shared_count = fobj->shared_count; 278 - else 279 - shared_count = 0; 280 - fence_excl = dma_resv_excl_fence(resv); 281 - if (read_seqcount_retry(&resv->seq, seq)) { 282 - rcu_read_unlock(); 283 - goto retry; 284 - } 234 + if (events & EPOLLOUT) { 235 + struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_out; 285 236 286 - if (fence_excl && (!(events & EPOLLOUT) || shared_count == 0)) { 287 - struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_excl; 288 - __poll_t pevents = EPOLLIN; 289 - 290 - if (shared_count == 0) 291 - pevents |= EPOLLOUT; 292 - 293 - spin_lock_irq(&dmabuf->poll.lock); 294 - if (dcb->active) { 295 - dcb->active |= pevents; 296 - events &= ~pevents; 297 - } else 298 - dcb->active = pevents; 299 - spin_unlock_irq(&dmabuf->poll.lock); 300 - 301 - if (events & pevents) { 302 - if (!dma_fence_get_rcu(fence_excl)) { 303 - /* force a recheck */ 304 - events &= ~pevents; 305 - dma_buf_poll_cb(NULL, &dcb->cb); 306 - } else if (!dma_fence_add_callback(fence_excl, &dcb->cb, 307 - dma_buf_poll_cb)) { 308 - events &= ~pevents; 309 - dma_fence_put(fence_excl); 310 - } else { 311 - /* 312 - * No callback queued, wake up any additional 313 - * waiters. 314 - */ 315 - dma_fence_put(fence_excl); 316 - dma_buf_poll_cb(NULL, &dcb->cb); 317 - } 318 - } 319 - } 320 - 321 - if ((events & EPOLLOUT) && shared_count > 0) { 322 - struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_shared; 323 - int i; 324 - 325 - /* Only queue a new callback if no event has fired yet */ 237 + /* Check that callback isn't busy */ 326 238 spin_lock_irq(&dmabuf->poll.lock); 327 239 if (dcb->active) 328 240 events &= ~EPOLLOUT; ··· 281 291 dcb->active = EPOLLOUT; 282 292 spin_unlock_irq(&dmabuf->poll.lock); 283 293 284 - if (!(events & EPOLLOUT)) 285 - goto out; 286 - 287 - for (i = 0; i < shared_count; ++i) { 288 - struct dma_fence *fence = rcu_dereference(fobj->shared[i]); 289 - 290 - if (!dma_fence_get_rcu(fence)) { 291 - /* 292 - * fence refcount dropped to zero, this means 293 - * that fobj has been freed 294 - * 295 - * call dma_buf_poll_cb and force a recheck! 296 - */ 297 - events &= ~EPOLLOUT; 294 + if (events & EPOLLOUT) { 295 + if (!dma_buf_poll_shared(resv, dcb) && 296 + !dma_buf_poll_excl(resv, dcb)) 297 + /* No callback queued, wake up any other waiters */ 298 298 dma_buf_poll_cb(NULL, &dcb->cb); 299 - break; 300 - } 301 - if (!dma_fence_add_callback(fence, &dcb->cb, 302 - dma_buf_poll_cb)) { 303 - dma_fence_put(fence); 299 + else 304 300 events &= ~EPOLLOUT; 305 - break; 306 - } 307 - dma_fence_put(fence); 308 301 } 309 - 310 - /* No callback queued, wake up any additional waiters. */ 311 - if (i == shared_count) 312 - dma_buf_poll_cb(NULL, &dcb->cb); 313 302 } 314 303 315 - out: 316 - rcu_read_unlock(); 304 + if (events & EPOLLIN) { 305 + struct dma_buf_poll_cb_t *dcb = &dmabuf->cb_in; 306 + 307 + /* Check that callback isn't busy */ 308 + spin_lock_irq(&dmabuf->poll.lock); 309 + if (dcb->active) 310 + events &= ~EPOLLIN; 311 + else 312 + dcb->active = EPOLLIN; 313 + spin_unlock_irq(&dmabuf->poll.lock); 314 + 315 + if (events & EPOLLIN) { 316 + if (!dma_buf_poll_excl(resv, dcb)) 317 + /* No callback queued, wake up any other waiters */ 318 + dma_buf_poll_cb(NULL, &dcb->cb); 319 + else 320 + events &= ~EPOLLIN; 321 + } 322 + } 323 + 324 + dma_resv_unlock(resv); 317 325 return events; 318 326 } 319 327 ··· 554 566 dmabuf->owner = exp_info->owner; 555 567 spin_lock_init(&dmabuf->name_lock); 556 568 init_waitqueue_head(&dmabuf->poll); 557 - dmabuf->cb_excl.poll = dmabuf->cb_shared.poll = &dmabuf->poll; 558 - dmabuf->cb_excl.active = dmabuf->cb_shared.active = 0; 569 + dmabuf->cb_in.poll = dmabuf->cb_out.poll = &dmabuf->poll; 570 + dmabuf->cb_in.active = dmabuf->cb_out.active = 0; 559 571 560 572 if (!resv) { 561 573 resv = (struct dma_resv *)&dmabuf[1];
+185 -239
drivers/dma-buf/dma-resv.c
··· 324 324 EXPORT_SYMBOL(dma_resv_add_excl_fence); 325 325 326 326 /** 327 + * dma_resv_iter_restart_unlocked - restart the unlocked iterator 328 + * @cursor: The dma_resv_iter object to restart 329 + * 330 + * Restart the unlocked iteration by initializing the cursor object. 331 + */ 332 + static void dma_resv_iter_restart_unlocked(struct dma_resv_iter *cursor) 333 + { 334 + cursor->seq = read_seqcount_begin(&cursor->obj->seq); 335 + cursor->index = -1; 336 + if (cursor->all_fences) 337 + cursor->fences = dma_resv_shared_list(cursor->obj); 338 + else 339 + cursor->fences = NULL; 340 + cursor->is_restarted = true; 341 + } 342 + 343 + /** 344 + * dma_resv_iter_walk_unlocked - walk over fences in a dma_resv obj 345 + * @cursor: cursor to record the current position 346 + * 347 + * Return all the fences in the dma_resv object which are not yet signaled. 348 + * The returned fence has an extra local reference so will stay alive. 349 + * If a concurrent modify is detected the whole iteration is started over again. 350 + */ 351 + static void dma_resv_iter_walk_unlocked(struct dma_resv_iter *cursor) 352 + { 353 + struct dma_resv *obj = cursor->obj; 354 + 355 + do { 356 + /* Drop the reference from the previous round */ 357 + dma_fence_put(cursor->fence); 358 + 359 + if (cursor->index == -1) { 360 + cursor->fence = dma_resv_excl_fence(obj); 361 + cursor->index++; 362 + if (!cursor->fence) 363 + continue; 364 + 365 + } else if (!cursor->fences || 366 + cursor->index >= cursor->fences->shared_count) { 367 + cursor->fence = NULL; 368 + break; 369 + 370 + } else { 371 + struct dma_resv_list *fences = cursor->fences; 372 + unsigned int idx = cursor->index++; 373 + 374 + cursor->fence = rcu_dereference(fences->shared[idx]); 375 + } 376 + cursor->fence = dma_fence_get_rcu(cursor->fence); 377 + if (!cursor->fence || !dma_fence_is_signaled(cursor->fence)) 378 + break; 379 + } while (true); 380 + } 381 + 382 + /** 383 + * dma_resv_iter_first_unlocked - first fence in an unlocked dma_resv obj. 384 + * @cursor: the cursor with the current position 385 + * 386 + * Returns the first fence from an unlocked dma_resv obj. 387 + */ 388 + struct dma_fence *dma_resv_iter_first_unlocked(struct dma_resv_iter *cursor) 389 + { 390 + rcu_read_lock(); 391 + do { 392 + dma_resv_iter_restart_unlocked(cursor); 393 + dma_resv_iter_walk_unlocked(cursor); 394 + } while (read_seqcount_retry(&cursor->obj->seq, cursor->seq)); 395 + rcu_read_unlock(); 396 + 397 + return cursor->fence; 398 + } 399 + EXPORT_SYMBOL(dma_resv_iter_first_unlocked); 400 + 401 + /** 402 + * dma_resv_iter_next_unlocked - next fence in an unlocked dma_resv obj. 403 + * @cursor: the cursor with the current position 404 + * 405 + * Returns the next fence from an unlocked dma_resv obj. 406 + */ 407 + struct dma_fence *dma_resv_iter_next_unlocked(struct dma_resv_iter *cursor) 408 + { 409 + bool restart; 410 + 411 + rcu_read_lock(); 412 + cursor->is_restarted = false; 413 + restart = read_seqcount_retry(&cursor->obj->seq, cursor->seq); 414 + do { 415 + if (restart) 416 + dma_resv_iter_restart_unlocked(cursor); 417 + dma_resv_iter_walk_unlocked(cursor); 418 + restart = true; 419 + } while (read_seqcount_retry(&cursor->obj->seq, cursor->seq)); 420 + rcu_read_unlock(); 421 + 422 + return cursor->fence; 423 + } 424 + EXPORT_SYMBOL(dma_resv_iter_next_unlocked); 425 + 426 + /** 327 427 * dma_resv_copy_fences - Copy all fences from src to dst. 328 428 * @dst: the destination reservation object 329 429 * @src: the source reservation object ··· 432 332 */ 433 333 int dma_resv_copy_fences(struct dma_resv *dst, struct dma_resv *src) 434 334 { 435 - struct dma_resv_list *src_list, *dst_list; 436 - struct dma_fence *old, *new; 437 - unsigned int i; 335 + struct dma_resv_iter cursor; 336 + struct dma_resv_list *list; 337 + struct dma_fence *f, *excl; 438 338 439 339 dma_resv_assert_held(dst); 440 340 441 - rcu_read_lock(); 442 - src_list = dma_resv_shared_list(src); 341 + list = NULL; 342 + excl = NULL; 443 343 444 - retry: 445 - if (src_list) { 446 - unsigned int shared_count = src_list->shared_count; 344 + dma_resv_iter_begin(&cursor, src, true); 345 + dma_resv_for_each_fence_unlocked(&cursor, f) { 447 346 448 - rcu_read_unlock(); 347 + if (dma_resv_iter_is_restarted(&cursor)) { 348 + dma_resv_list_free(list); 349 + dma_fence_put(excl); 449 350 450 - dst_list = dma_resv_list_alloc(shared_count); 451 - if (!dst_list) 452 - return -ENOMEM; 351 + if (cursor.fences) { 352 + unsigned int cnt = cursor.fences->shared_count; 453 353 454 - rcu_read_lock(); 455 - src_list = dma_resv_shared_list(src); 456 - if (!src_list || src_list->shared_count > shared_count) { 457 - kfree(dst_list); 458 - goto retry; 354 + list = dma_resv_list_alloc(cnt); 355 + if (!list) { 356 + dma_resv_iter_end(&cursor); 357 + return -ENOMEM; 358 + } 359 + 360 + list->shared_count = 0; 361 + 362 + } else { 363 + list = NULL; 364 + } 365 + excl = NULL; 459 366 } 460 367 461 - dst_list->shared_count = 0; 462 - for (i = 0; i < src_list->shared_count; ++i) { 463 - struct dma_fence __rcu **dst; 464 - struct dma_fence *fence; 465 - 466 - fence = rcu_dereference(src_list->shared[i]); 467 - if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, 468 - &fence->flags)) 469 - continue; 470 - 471 - if (!dma_fence_get_rcu(fence)) { 472 - dma_resv_list_free(dst_list); 473 - src_list = dma_resv_shared_list(src); 474 - goto retry; 475 - } 476 - 477 - if (dma_fence_is_signaled(fence)) { 478 - dma_fence_put(fence); 479 - continue; 480 - } 481 - 482 - dst = &dst_list->shared[dst_list->shared_count++]; 483 - rcu_assign_pointer(*dst, fence); 484 - } 485 - } else { 486 - dst_list = NULL; 368 + dma_fence_get(f); 369 + if (dma_resv_iter_is_exclusive(&cursor)) 370 + excl = f; 371 + else 372 + RCU_INIT_POINTER(list->shared[list->shared_count++], f); 487 373 } 488 - 489 - new = dma_fence_get_rcu_safe(&src->fence_excl); 490 - rcu_read_unlock(); 491 - 492 - src_list = dma_resv_shared_list(dst); 493 - old = dma_resv_excl_fence(dst); 374 + dma_resv_iter_end(&cursor); 494 375 495 376 write_seqcount_begin(&dst->seq); 496 - /* write_seqcount_begin provides the necessary memory barrier */ 497 - RCU_INIT_POINTER(dst->fence_excl, new); 498 - RCU_INIT_POINTER(dst->fence, dst_list); 377 + excl = rcu_replace_pointer(dst->fence_excl, excl, dma_resv_held(dst)); 378 + list = rcu_replace_pointer(dst->fence, list, dma_resv_held(dst)); 499 379 write_seqcount_end(&dst->seq); 500 380 501 - dma_resv_list_free(src_list); 502 - dma_fence_put(old); 381 + dma_resv_list_free(list); 382 + dma_fence_put(excl); 503 383 504 384 return 0; 505 385 } ··· 489 409 * dma_resv_get_fences - Get an object's shared and exclusive 490 410 * fences without update side lock held 491 411 * @obj: the reservation object 492 - * @pfence_excl: the returned exclusive fence (or NULL) 493 - * @pshared_count: the number of shared fences returned 494 - * @pshared: the array of shared fence ptrs returned (array is krealloc'd to 412 + * @fence_excl: the returned exclusive fence (or NULL) 413 + * @shared_count: the number of shared fences returned 414 + * @shared: the array of shared fence ptrs returned (array is krealloc'd to 495 415 * the required size, and must be freed by caller) 496 416 * 497 417 * Retrieve all fences from the reservation object. If the pointer for the 498 418 * exclusive fence is not specified the fence is put into the array of the 499 419 * shared fences as well. Returns either zero or -ENOMEM. 500 420 */ 501 - int dma_resv_get_fences(struct dma_resv *obj, struct dma_fence **pfence_excl, 502 - unsigned int *pshared_count, 503 - struct dma_fence ***pshared) 421 + int dma_resv_get_fences(struct dma_resv *obj, struct dma_fence **fence_excl, 422 + unsigned int *shared_count, struct dma_fence ***shared) 504 423 { 505 - struct dma_fence **shared = NULL; 506 - struct dma_fence *fence_excl; 507 - unsigned int shared_count; 508 - int ret = 1; 424 + struct dma_resv_iter cursor; 425 + struct dma_fence *fence; 509 426 510 - do { 511 - struct dma_resv_list *fobj; 512 - unsigned int i, seq; 513 - size_t sz = 0; 427 + *shared_count = 0; 428 + *shared = NULL; 514 429 515 - shared_count = i = 0; 430 + if (fence_excl) 431 + *fence_excl = NULL; 516 432 517 - rcu_read_lock(); 518 - seq = read_seqcount_begin(&obj->seq); 433 + dma_resv_iter_begin(&cursor, obj, true); 434 + dma_resv_for_each_fence_unlocked(&cursor, fence) { 519 435 520 - fence_excl = dma_resv_excl_fence(obj); 521 - if (fence_excl && !dma_fence_get_rcu(fence_excl)) 522 - goto unlock; 436 + if (dma_resv_iter_is_restarted(&cursor)) { 437 + unsigned int count; 523 438 524 - fobj = dma_resv_shared_list(obj); 525 - if (fobj) 526 - sz += sizeof(*shared) * fobj->shared_max; 439 + while (*shared_count) 440 + dma_fence_put((*shared)[--(*shared_count)]); 527 441 528 - if (!pfence_excl && fence_excl) 529 - sz += sizeof(*shared); 442 + if (fence_excl) 443 + dma_fence_put(*fence_excl); 530 444 531 - if (sz) { 532 - struct dma_fence **nshared; 445 + count = cursor.fences ? cursor.fences->shared_count : 0; 446 + count += fence_excl ? 0 : 1; 533 447 534 - nshared = krealloc(shared, sz, 535 - GFP_NOWAIT | __GFP_NOWARN); 536 - if (!nshared) { 537 - rcu_read_unlock(); 538 - 539 - dma_fence_put(fence_excl); 540 - fence_excl = NULL; 541 - 542 - nshared = krealloc(shared, sz, GFP_KERNEL); 543 - if (nshared) { 544 - shared = nshared; 545 - continue; 546 - } 547 - 548 - ret = -ENOMEM; 549 - break; 550 - } 551 - shared = nshared; 552 - shared_count = fobj ? fobj->shared_count : 0; 553 - for (i = 0; i < shared_count; ++i) { 554 - shared[i] = rcu_dereference(fobj->shared[i]); 555 - if (!dma_fence_get_rcu(shared[i])) 556 - break; 448 + /* Eventually re-allocate the array */ 449 + *shared = krealloc_array(*shared, count, 450 + sizeof(void *), 451 + GFP_KERNEL); 452 + if (count && !*shared) { 453 + dma_resv_iter_end(&cursor); 454 + return -ENOMEM; 557 455 } 558 456 } 559 457 560 - if (i != shared_count || read_seqcount_retry(&obj->seq, seq)) { 561 - while (i--) 562 - dma_fence_put(shared[i]); 563 - dma_fence_put(fence_excl); 564 - goto unlock; 565 - } 566 - 567 - ret = 0; 568 - unlock: 569 - rcu_read_unlock(); 570 - } while (ret); 571 - 572 - if (pfence_excl) 573 - *pfence_excl = fence_excl; 574 - else if (fence_excl) 575 - shared[shared_count++] = fence_excl; 576 - 577 - if (!shared_count) { 578 - kfree(shared); 579 - shared = NULL; 458 + dma_fence_get(fence); 459 + if (dma_resv_iter_is_exclusive(&cursor) && fence_excl) 460 + *fence_excl = fence; 461 + else 462 + (*shared)[(*shared_count)++] = fence; 580 463 } 464 + dma_resv_iter_end(&cursor); 581 465 582 - *pshared_count = shared_count; 583 - *pshared = shared; 584 - return ret; 466 + return 0; 585 467 } 586 468 EXPORT_SYMBOL_GPL(dma_resv_get_fences); 587 469 ··· 565 523 unsigned long timeout) 566 524 { 567 525 long ret = timeout ? timeout : 1; 568 - unsigned int seq, shared_count; 526 + struct dma_resv_iter cursor; 569 527 struct dma_fence *fence; 570 - int i; 571 528 572 - retry: 573 - shared_count = 0; 574 - seq = read_seqcount_begin(&obj->seq); 575 - rcu_read_lock(); 576 - i = -1; 577 - 578 - fence = dma_resv_excl_fence(obj); 579 - if (fence && !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) { 580 - if (!dma_fence_get_rcu(fence)) 581 - goto unlock_retry; 582 - 583 - if (dma_fence_is_signaled(fence)) { 584 - dma_fence_put(fence); 585 - fence = NULL; 586 - } 587 - 588 - } else { 589 - fence = NULL; 590 - } 591 - 592 - if (wait_all) { 593 - struct dma_resv_list *fobj = dma_resv_shared_list(obj); 594 - 595 - if (fobj) 596 - shared_count = fobj->shared_count; 597 - 598 - for (i = 0; !fence && i < shared_count; ++i) { 599 - struct dma_fence *lfence; 600 - 601 - lfence = rcu_dereference(fobj->shared[i]); 602 - if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, 603 - &lfence->flags)) 604 - continue; 605 - 606 - if (!dma_fence_get_rcu(lfence)) 607 - goto unlock_retry; 608 - 609 - if (dma_fence_is_signaled(lfence)) { 610 - dma_fence_put(lfence); 611 - continue; 612 - } 613 - 614 - fence = lfence; 615 - break; 616 - } 617 - } 618 - 619 - rcu_read_unlock(); 620 - if (fence) { 621 - if (read_seqcount_retry(&obj->seq, seq)) { 622 - dma_fence_put(fence); 623 - goto retry; 624 - } 529 + dma_resv_iter_begin(&cursor, obj, wait_all); 530 + dma_resv_for_each_fence_unlocked(&cursor, fence) { 625 531 626 532 ret = dma_fence_wait_timeout(fence, intr, ret); 627 - dma_fence_put(fence); 628 - if (ret > 0 && wait_all && (i + 1 < shared_count)) 629 - goto retry; 533 + if (ret <= 0) { 534 + dma_resv_iter_end(&cursor); 535 + return ret; 536 + } 630 537 } 631 - return ret; 538 + dma_resv_iter_end(&cursor); 632 539 633 - unlock_retry: 634 - rcu_read_unlock(); 635 - goto retry; 540 + return ret; 636 541 } 637 542 EXPORT_SYMBOL_GPL(dma_resv_wait_timeout); 638 543 639 - 640 - static inline int dma_resv_test_signaled_single(struct dma_fence *passed_fence) 641 - { 642 - struct dma_fence *fence, *lfence = passed_fence; 643 - int ret = 1; 644 - 645 - if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &lfence->flags)) { 646 - fence = dma_fence_get_rcu(lfence); 647 - if (!fence) 648 - return -1; 649 - 650 - ret = !!dma_fence_is_signaled(fence); 651 - dma_fence_put(fence); 652 - } 653 - return ret; 654 - } 655 544 656 545 /** 657 546 * dma_resv_test_signaled - Test if a reservation object's fences have been ··· 600 627 */ 601 628 bool dma_resv_test_signaled(struct dma_resv *obj, bool test_all) 602 629 { 630 + struct dma_resv_iter cursor; 603 631 struct dma_fence *fence; 604 - unsigned int seq; 605 - int ret; 606 632 607 - rcu_read_lock(); 608 - retry: 609 - ret = true; 610 - seq = read_seqcount_begin(&obj->seq); 611 - 612 - if (test_all) { 613 - struct dma_resv_list *fobj = dma_resv_shared_list(obj); 614 - unsigned int i, shared_count; 615 - 616 - shared_count = fobj ? fobj->shared_count : 0; 617 - for (i = 0; i < shared_count; ++i) { 618 - fence = rcu_dereference(fobj->shared[i]); 619 - ret = dma_resv_test_signaled_single(fence); 620 - if (ret < 0) 621 - goto retry; 622 - else if (!ret) 623 - break; 624 - } 633 + dma_resv_iter_begin(&cursor, obj, test_all); 634 + dma_resv_for_each_fence_unlocked(&cursor, fence) { 635 + dma_resv_iter_end(&cursor); 636 + return false; 625 637 } 626 - 627 - fence = dma_resv_excl_fence(obj); 628 - if (ret && fence) { 629 - ret = dma_resv_test_signaled_single(fence); 630 - if (ret < 0) 631 - goto retry; 632 - 633 - } 634 - 635 - if (read_seqcount_retry(&obj->seq, seq)) 636 - goto retry; 637 - 638 - rcu_read_unlock(); 639 - return ret; 638 + dma_resv_iter_end(&cursor); 639 + return true; 640 640 } 641 641 EXPORT_SYMBOL_GPL(dma_resv_test_signaled); 642 642
+1 -1
drivers/gpu/drm/Kconfig
··· 103 103 config DRM_FBDEV_EMULATION 104 104 bool "Enable legacy fbdev support for your modesetting driver" 105 105 depends on DRM 106 - depends on FB 106 + depends on FB=y || FB=DRM 107 107 select DRM_KMS_HELPER 108 108 select FB_CFB_FILLRECT 109 109 select FB_CFB_COPYAREA
+19 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 894 894 DRM_ERROR("failed to pin userptr\n"); 895 895 return r; 896 896 } 897 - } else if (ttm->page_flags & TTM_PAGE_FLAG_SG) { 897 + } else if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL) { 898 898 if (!ttm->sg) { 899 899 struct dma_buf_attachment *attach; 900 900 struct sg_table *sgt; ··· 1119 1119 { 1120 1120 struct amdgpu_device *adev = amdgpu_ttm_adev(bdev); 1121 1121 struct amdgpu_ttm_tt *gtt = (void *)ttm; 1122 + pgoff_t i; 1123 + int ret; 1122 1124 1123 1125 /* user pages are bound by amdgpu_ttm_tt_pin_userptr() */ 1124 1126 if (gtt->userptr) { ··· 1130 1128 return 0; 1131 1129 } 1132 1130 1133 - if (ttm->page_flags & TTM_PAGE_FLAG_SG) 1131 + if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL) 1134 1132 return 0; 1135 1133 1136 - return ttm_pool_alloc(&adev->mman.bdev.pool, ttm, ctx); 1134 + ret = ttm_pool_alloc(&adev->mman.bdev.pool, ttm, ctx); 1135 + if (ret) 1136 + return ret; 1137 + 1138 + for (i = 0; i < ttm->num_pages; ++i) 1139 + ttm->pages[i]->mapping = bdev->dev_mapping; 1140 + 1141 + return 0; 1137 1142 } 1138 1143 1139 1144 /* ··· 1154 1145 { 1155 1146 struct amdgpu_ttm_tt *gtt = (void *)ttm; 1156 1147 struct amdgpu_device *adev; 1148 + pgoff_t i; 1157 1149 1158 1150 amdgpu_ttm_backend_unbind(bdev, ttm); 1159 1151 ··· 1165 1155 return; 1166 1156 } 1167 1157 1168 - if (ttm->page_flags & TTM_PAGE_FLAG_SG) 1158 + if (ttm->page_flags & TTM_TT_FLAG_EXTERNAL) 1169 1159 return; 1160 + 1161 + for (i = 0; i < ttm->num_pages; ++i) 1162 + ttm->pages[i]->mapping = NULL; 1170 1163 1171 1164 adev = amdgpu_ttm_adev(bdev); 1172 1165 return ttm_pool_free(&adev->mman.bdev.pool, ttm); ··· 1198 1185 return -ENOMEM; 1199 1186 } 1200 1187 1201 - /* Set TTM_PAGE_FLAG_SG before populate but after create. */ 1202 - bo->ttm->page_flags |= TTM_PAGE_FLAG_SG; 1188 + /* Set TTM_TT_FLAG_EXTERNAL before populate but after create. */ 1189 + bo->ttm->page_flags |= TTM_TT_FLAG_EXTERNAL; 1203 1190 1204 1191 gtt = (void *)bo->ttm; 1205 1192 gtt->userptr = addr;
-2
drivers/gpu/drm/ast/ast_drv.h
··· 158 158 uint32_t dram_type; 159 159 uint32_t mclk; 160 160 161 - int fb_mtrr; 162 - 163 161 struct drm_plane primary_plane; 164 162 struct ast_cursor_plane cursor_plane; 165 163 struct drm_crtc crtc;
+10 -17
drivers/gpu/drm/ast/ast_mm.c
··· 74 74 return vram_size; 75 75 } 76 76 77 - static void ast_mm_release(struct drm_device *dev, void *ptr) 78 - { 79 - struct ast_private *ast = to_ast_private(dev); 80 - struct pci_dev *pdev = to_pci_dev(dev->dev); 81 - 82 - arch_phys_wc_del(ast->fb_mtrr); 83 - arch_io_free_memtype_wc(pci_resource_start(pdev, 0), 84 - pci_resource_len(pdev, 0)); 85 - } 86 - 87 77 int ast_mm_init(struct ast_private *ast) 88 78 { 89 79 struct drm_device *dev = &ast->base; 90 80 struct pci_dev *pdev = to_pci_dev(dev->dev); 81 + resource_size_t base, size; 91 82 u32 vram_size; 92 83 int ret; 93 84 85 + base = pci_resource_start(pdev, 0); 86 + size = pci_resource_len(pdev, 0); 87 + 88 + /* Don't fail on errors, but performance might be reduced. */ 89 + devm_arch_io_reserve_memtype_wc(dev->dev, base, size); 90 + devm_arch_phys_wc_add(dev->dev, base, size); 91 + 94 92 vram_size = ast_get_vram_size(ast); 95 93 96 - ret = drmm_vram_helper_init(dev, pci_resource_start(pdev, 0), vram_size); 94 + ret = drmm_vram_helper_init(dev, base, vram_size); 97 95 if (ret) { 98 96 drm_err(dev, "Error initializing VRAM MM; %d\n", ret); 99 97 return ret; 100 98 } 101 99 102 - arch_io_reserve_memtype_wc(pci_resource_start(pdev, 0), 103 - pci_resource_len(pdev, 0)); 104 - ast->fb_mtrr = arch_phys_wc_add(pci_resource_start(pdev, 0), 105 - pci_resource_len(pdev, 0)); 106 - 107 - return drmm_add_action_or_reset(dev, ast_mm_release, NULL); 100 + return 0; 108 101 }
+243 -31
drivers/gpu/drm/bridge/parade-ps8640.c
··· 9 9 #include <linux/i2c.h> 10 10 #include <linux/module.h> 11 11 #include <linux/of_graph.h> 12 + #include <linux/regmap.h> 12 13 #include <linux/regulator/consumer.h> 13 14 14 15 #include <drm/drm_bridge.h> 16 + #include <drm/drm_dp_helper.h> 15 17 #include <drm/drm_mipi_dsi.h> 16 18 #include <drm/drm_of.h> 17 19 #include <drm/drm_panel.h> 18 20 #include <drm/drm_print.h> 21 + 22 + #define PAGE0_AUXCH_CFG3 0x76 23 + #define AUXCH_CFG3_RESET 0xff 24 + #define PAGE0_SWAUX_ADDR_7_0 0x7d 25 + #define PAGE0_SWAUX_ADDR_15_8 0x7e 26 + #define PAGE0_SWAUX_ADDR_23_16 0x7f 27 + #define SWAUX_ADDR_MASK GENMASK(19, 0) 28 + #define PAGE0_SWAUX_LENGTH 0x80 29 + #define SWAUX_LENGTH_MASK GENMASK(3, 0) 30 + #define SWAUX_NO_PAYLOAD BIT(7) 31 + #define PAGE0_SWAUX_WDATA 0x81 32 + #define PAGE0_SWAUX_RDATA 0x82 33 + #define PAGE0_SWAUX_CTRL 0x83 34 + #define SWAUX_SEND BIT(0) 35 + #define PAGE0_SWAUX_STATUS 0x84 36 + #define SWAUX_M_MASK GENMASK(4, 0) 37 + #define SWAUX_STATUS_MASK GENMASK(7, 5) 38 + #define SWAUX_STATUS_NACK (0x1 << 5) 39 + #define SWAUX_STATUS_DEFER (0x2 << 5) 40 + #define SWAUX_STATUS_ACKM (0x3 << 5) 41 + #define SWAUX_STATUS_INVALID (0x4 << 5) 42 + #define SWAUX_STATUS_I2C_NACK (0x5 << 5) 43 + #define SWAUX_STATUS_I2C_DEFER (0x6 << 5) 44 + #define SWAUX_STATUS_TIMEOUT (0x7 << 5) 19 45 20 46 #define PAGE2_GPIO_H 0xa7 21 47 #define PS_GPIO9 BIT(1) ··· 56 30 #define VDO_EN 0x1c 57 31 58 32 #define NUM_MIPI_LANES 4 33 + 34 + #define COMMON_PS8640_REGMAP_CONFIG \ 35 + .reg_bits = 8, \ 36 + .val_bits = 8, \ 37 + .cache_type = REGCACHE_NONE 59 38 60 39 /* 61 40 * PS8640 uses multiple addresses: ··· 93 62 struct ps8640 { 94 63 struct drm_bridge bridge; 95 64 struct drm_bridge *panel_bridge; 65 + struct drm_dp_aux aux; 96 66 struct mipi_dsi_device *dsi; 97 67 struct i2c_client *page[MAX_DEVS]; 68 + struct regmap *regmap[MAX_DEVS]; 98 69 struct regulator_bulk_data supplies[2]; 99 70 struct gpio_desc *gpio_reset; 100 71 struct gpio_desc *gpio_powerdown; 101 72 bool powered; 73 + }; 74 + 75 + static const struct regmap_config ps8640_regmap_config[] = { 76 + [PAGE0_DP_CNTL] = { 77 + COMMON_PS8640_REGMAP_CONFIG, 78 + .max_register = 0xbf, 79 + }, 80 + [PAGE1_VDO_BDG] = { 81 + COMMON_PS8640_REGMAP_CONFIG, 82 + .max_register = 0xff, 83 + }, 84 + [PAGE2_TOP_CNTL] = { 85 + COMMON_PS8640_REGMAP_CONFIG, 86 + .max_register = 0xff, 87 + }, 88 + [PAGE3_DSI_CNTL1] = { 89 + COMMON_PS8640_REGMAP_CONFIG, 90 + .max_register = 0xff, 91 + }, 92 + [PAGE4_MIPI_PHY] = { 93 + COMMON_PS8640_REGMAP_CONFIG, 94 + .max_register = 0xff, 95 + }, 96 + [PAGE5_VPLL] = { 97 + COMMON_PS8640_REGMAP_CONFIG, 98 + .max_register = 0x7f, 99 + }, 100 + [PAGE6_DSI_CNTL2] = { 101 + COMMON_PS8640_REGMAP_CONFIG, 102 + .max_register = 0xff, 103 + }, 104 + [PAGE7_SPI_CNTL] = { 105 + COMMON_PS8640_REGMAP_CONFIG, 106 + .max_register = 0xff, 107 + }, 102 108 }; 103 109 104 110 static inline struct ps8640 *bridge_to_ps8640(struct drm_bridge *e) ··· 143 75 return container_of(e, struct ps8640, bridge); 144 76 } 145 77 78 + static inline struct ps8640 *aux_to_ps8640(struct drm_dp_aux *aux) 79 + { 80 + return container_of(aux, struct ps8640, aux); 81 + } 82 + 83 + static ssize_t ps8640_aux_transfer(struct drm_dp_aux *aux, 84 + struct drm_dp_aux_msg *msg) 85 + { 86 + struct ps8640 *ps_bridge = aux_to_ps8640(aux); 87 + struct regmap *map = ps_bridge->regmap[PAGE0_DP_CNTL]; 88 + struct device *dev = &ps_bridge->page[PAGE0_DP_CNTL]->dev; 89 + unsigned int len = msg->size; 90 + unsigned int data; 91 + unsigned int base; 92 + int ret; 93 + u8 request = msg->request & 94 + ~(DP_AUX_I2C_MOT | DP_AUX_I2C_WRITE_STATUS_UPDATE); 95 + u8 *buf = msg->buffer; 96 + u8 addr_len[PAGE0_SWAUX_LENGTH + 1 - PAGE0_SWAUX_ADDR_7_0]; 97 + u8 i; 98 + bool is_native_aux = false; 99 + 100 + if (len > DP_AUX_MAX_PAYLOAD_BYTES) 101 + return -EINVAL; 102 + 103 + if (msg->address & ~SWAUX_ADDR_MASK) 104 + return -EINVAL; 105 + 106 + switch (request) { 107 + case DP_AUX_NATIVE_WRITE: 108 + case DP_AUX_NATIVE_READ: 109 + is_native_aux = true; 110 + fallthrough; 111 + case DP_AUX_I2C_WRITE: 112 + case DP_AUX_I2C_READ: 113 + break; 114 + default: 115 + return -EINVAL; 116 + } 117 + 118 + ret = regmap_write(map, PAGE0_AUXCH_CFG3, AUXCH_CFG3_RESET); 119 + if (ret) { 120 + DRM_DEV_ERROR(dev, "failed to write PAGE0_AUXCH_CFG3: %d\n", 121 + ret); 122 + return ret; 123 + } 124 + 125 + /* Assume it's good */ 126 + msg->reply = 0; 127 + 128 + base = PAGE0_SWAUX_ADDR_7_0; 129 + addr_len[PAGE0_SWAUX_ADDR_7_0 - base] = msg->address; 130 + addr_len[PAGE0_SWAUX_ADDR_15_8 - base] = msg->address >> 8; 131 + addr_len[PAGE0_SWAUX_ADDR_23_16 - base] = (msg->address >> 16) | 132 + (msg->request << 4); 133 + addr_len[PAGE0_SWAUX_LENGTH - base] = (len == 0) ? SWAUX_NO_PAYLOAD : 134 + ((len - 1) & SWAUX_LENGTH_MASK); 135 + 136 + regmap_bulk_write(map, PAGE0_SWAUX_ADDR_7_0, addr_len, 137 + ARRAY_SIZE(addr_len)); 138 + 139 + if (len && (request == DP_AUX_NATIVE_WRITE || 140 + request == DP_AUX_I2C_WRITE)) { 141 + /* Write to the internal FIFO buffer */ 142 + for (i = 0; i < len; i++) { 143 + ret = regmap_write(map, PAGE0_SWAUX_WDATA, buf[i]); 144 + if (ret) { 145 + DRM_DEV_ERROR(dev, 146 + "failed to write WDATA: %d\n", 147 + ret); 148 + return ret; 149 + } 150 + } 151 + } 152 + 153 + regmap_write(map, PAGE0_SWAUX_CTRL, SWAUX_SEND); 154 + 155 + /* Zero delay loop because i2c transactions are slow already */ 156 + regmap_read_poll_timeout(map, PAGE0_SWAUX_CTRL, data, 157 + !(data & SWAUX_SEND), 0, 50 * 1000); 158 + 159 + regmap_read(map, PAGE0_SWAUX_STATUS, &data); 160 + if (ret) { 161 + DRM_DEV_ERROR(dev, "failed to read PAGE0_SWAUX_STATUS: %d\n", 162 + ret); 163 + return ret; 164 + } 165 + 166 + switch (data & SWAUX_STATUS_MASK) { 167 + /* Ignore the DEFER cases as they are already handled in hardware */ 168 + case SWAUX_STATUS_NACK: 169 + case SWAUX_STATUS_I2C_NACK: 170 + /* 171 + * The programming guide is not clear about whether a I2C NACK 172 + * would trigger SWAUX_STATUS_NACK or SWAUX_STATUS_I2C_NACK. So 173 + * we handle both cases together. 174 + */ 175 + if (is_native_aux) 176 + msg->reply |= DP_AUX_NATIVE_REPLY_NACK; 177 + else 178 + msg->reply |= DP_AUX_I2C_REPLY_NACK; 179 + 180 + fallthrough; 181 + case SWAUX_STATUS_ACKM: 182 + len = data & SWAUX_M_MASK; 183 + break; 184 + case SWAUX_STATUS_INVALID: 185 + return -EOPNOTSUPP; 186 + case SWAUX_STATUS_TIMEOUT: 187 + return -ETIMEDOUT; 188 + } 189 + 190 + if (len && (request == DP_AUX_NATIVE_READ || 191 + request == DP_AUX_I2C_READ)) { 192 + /* Read from the internal FIFO buffer */ 193 + for (i = 0; i < len; i++) { 194 + ret = regmap_read(map, PAGE0_SWAUX_RDATA, &data); 195 + if (ret) { 196 + DRM_DEV_ERROR(dev, 197 + "failed to read RDATA: %d\n", 198 + ret); 199 + return ret; 200 + } 201 + 202 + buf[i] = data; 203 + } 204 + } 205 + 206 + return len; 207 + } 208 + 146 209 static int ps8640_bridge_vdo_control(struct ps8640 *ps_bridge, 147 210 const enum ps8640_vdo_control ctrl) 148 211 { 149 - struct i2c_client *client = ps_bridge->page[PAGE3_DSI_CNTL1]; 212 + struct regmap *map = ps_bridge->regmap[PAGE3_DSI_CNTL1]; 150 213 u8 vdo_ctrl_buf[] = { VDO_CTL_ADD, ctrl }; 151 214 int ret; 152 215 153 - ret = i2c_smbus_write_i2c_block_data(client, PAGE3_SET_ADD, 154 - sizeof(vdo_ctrl_buf), 155 - vdo_ctrl_buf); 216 + ret = regmap_bulk_write(map, PAGE3_SET_ADD, 217 + vdo_ctrl_buf, sizeof(vdo_ctrl_buf)); 218 + 156 219 if (ret < 0) { 157 220 DRM_ERROR("failed to %sable VDO: %d\n", 158 221 ctrl == ENABLE ? "en" : "dis", ret); ··· 295 96 296 97 static void ps8640_bridge_poweron(struct ps8640 *ps_bridge) 297 98 { 298 - struct i2c_client *client = ps_bridge->page[PAGE2_TOP_CNTL]; 299 - unsigned long timeout; 99 + struct regmap *map = ps_bridge->regmap[PAGE2_TOP_CNTL]; 300 100 int ret, status; 301 101 302 102 if (ps_bridge->powered) ··· 319 121 */ 320 122 msleep(200); 321 123 322 - timeout = jiffies + msecs_to_jiffies(200) + 1; 124 + ret = regmap_read_poll_timeout(map, PAGE2_GPIO_H, status, 125 + status & PS_GPIO9, 20 * 1000, 200 * 1000); 323 126 324 - while (time_is_after_jiffies(timeout)) { 325 - status = i2c_smbus_read_byte_data(client, PAGE2_GPIO_H); 326 - if (status < 0) { 327 - DRM_ERROR("failed read PAGE2_GPIO_H: %d\n", status); 328 - goto err_regulators_disable; 329 - } 330 - if ((status & PS_GPIO9) == PS_GPIO9) 331 - break; 332 - 333 - msleep(20); 127 + if (ret < 0) { 128 + DRM_ERROR("failed read PAGE2_GPIO_H: %d\n", ret); 129 + goto err_regulators_disable; 334 130 } 335 131 336 132 msleep(50); ··· 336 144 * disabled by the manufacturer. Once disabled, all MCS commands are 337 145 * ignored by the display interface. 338 146 */ 339 - status = i2c_smbus_read_byte_data(client, PAGE2_MCS_EN); 340 - if (status < 0) { 341 - DRM_ERROR("failed read PAGE2_MCS_EN: %d\n", status); 342 - goto err_regulators_disable; 343 - } 344 147 345 - ret = i2c_smbus_write_byte_data(client, PAGE2_MCS_EN, 346 - status & ~MCS_EN); 148 + ret = regmap_update_bits(map, PAGE2_MCS_EN, MCS_EN, 0); 347 149 if (ret < 0) { 348 150 DRM_ERROR("failed write PAGE2_MCS_EN: %d\n", ret); 349 151 goto err_regulators_disable; 350 152 } 351 153 352 154 /* Switch access edp panel's edid through i2c */ 353 - ret = i2c_smbus_write_byte_data(client, PAGE2_I2C_BYPASS, 354 - I2C_BYPASS_EN); 155 + ret = regmap_write(map, PAGE2_I2C_BYPASS, I2C_BYPASS_EN); 355 156 if (ret < 0) { 356 157 DRM_ERROR("failed write PAGE2_I2C_BYPASS: %d\n", ret); 357 158 goto err_regulators_disable; ··· 443 258 dsi->format = MIPI_DSI_FMT_RGB888; 444 259 dsi->lanes = NUM_MIPI_LANES; 445 260 ret = mipi_dsi_attach(dsi); 446 - if (ret) 261 + if (ret) { 262 + dev_err(dev, "failed to attach dsi device: %d\n", ret); 447 263 goto err_dsi_attach; 264 + } 265 + 266 + ret = drm_dp_aux_register(&ps_bridge->aux); 267 + if (ret) { 268 + dev_err(dev, "failed to register DP AUX channel: %d\n", ret); 269 + goto err_aux_register; 270 + } 448 271 449 272 /* Attach the panel-bridge to the dsi bridge */ 450 273 return drm_bridge_attach(bridge->encoder, ps_bridge->panel_bridge, 451 274 &ps_bridge->bridge, flags); 452 275 276 + err_aux_register: 277 + mipi_dsi_detach(dsi); 453 278 err_dsi_attach: 454 279 mipi_dsi_device_unregister(dsi); 455 280 return ret; 281 + } 282 + 283 + static void ps8640_bridge_detach(struct drm_bridge *bridge) 284 + { 285 + drm_dp_aux_unregister(&bridge_to_ps8640(bridge)->aux); 456 286 } 457 287 458 288 static struct edid *ps8640_bridge_get_edid(struct drm_bridge *bridge, ··· 506 306 507 307 static const struct drm_bridge_funcs ps8640_bridge_funcs = { 508 308 .attach = ps8640_bridge_attach, 309 + .detach = ps8640_bridge_detach, 509 310 .get_edid = ps8640_bridge_get_edid, 510 311 .post_disable = ps8640_post_disable, 511 312 .pre_enable = ps8640_pre_enable, ··· 563 362 564 363 ps_bridge->page[PAGE0_DP_CNTL] = client; 565 364 365 + ps_bridge->regmap[PAGE0_DP_CNTL] = devm_regmap_init_i2c(client, ps8640_regmap_config); 366 + if (IS_ERR(ps_bridge->regmap[PAGE0_DP_CNTL])) 367 + return PTR_ERR(ps_bridge->regmap[PAGE0_DP_CNTL]); 368 + 566 369 for (i = 1; i < ARRAY_SIZE(ps_bridge->page); i++) { 567 370 ps_bridge->page[i] = devm_i2c_new_dummy_device(&client->dev, 568 371 client->adapter, 569 372 client->addr + i); 570 - if (IS_ERR(ps_bridge->page[i])) { 571 - dev_err(dev, "failed i2c dummy device, address %02x\n", 572 - client->addr + i); 373 + if (IS_ERR(ps_bridge->page[i])) 573 374 return PTR_ERR(ps_bridge->page[i]); 574 - } 375 + 376 + ps_bridge->regmap[i] = devm_regmap_init_i2c(ps_bridge->page[i], 377 + ps8640_regmap_config + i); 378 + if (IS_ERR(ps_bridge->regmap[i])) 379 + return PTR_ERR(ps_bridge->regmap[i]); 575 380 } 576 381 577 382 i2c_set_clientdata(client, ps_bridge); 383 + 384 + ps_bridge->aux.name = "parade-ps8640-aux"; 385 + ps_bridge->aux.dev = dev; 386 + ps_bridge->aux.transfer = ps8640_aux_transfer; 387 + drm_dp_aux_init(&ps_bridge->aux); 578 388 579 389 drm_bridge_add(&ps_bridge->bridge); 580 390
+2 -4
drivers/gpu/drm/bridge/synopsys/dw-hdmi-cec.c
··· 265 265 /* override the module pointer */ 266 266 cec->adap->owner = THIS_MODULE; 267 267 268 - ret = devm_add_action(&pdev->dev, dw_hdmi_cec_del, cec); 269 - if (ret) { 270 - cec_delete_adapter(cec->adap); 268 + ret = devm_add_action_or_reset(&pdev->dev, dw_hdmi_cec_del, cec); 269 + if (ret) 271 270 return ret; 272 - } 273 271 274 272 ret = devm_request_threaded_irq(&pdev->dev, cec->irq, 275 273 dw_hdmi_cec_hardirq,
+13 -12
drivers/gpu/drm/bridge/ti-sn65dsi86.c
··· 615 615 return drm_bridge_get_modes(pdata->next_bridge, connector); 616 616 } 617 617 618 - static enum drm_mode_status 619 - ti_sn_bridge_connector_mode_valid(struct drm_connector *connector, 620 - struct drm_display_mode *mode) 621 - { 622 - /* maximum supported resolution is 4K at 60 fps */ 623 - if (mode->clock > 594000) 624 - return MODE_CLOCK_HIGH; 625 - 626 - return MODE_OK; 627 - } 628 - 629 618 static struct drm_connector_helper_funcs ti_sn_bridge_connector_helper_funcs = { 630 619 .get_modes = ti_sn_bridge_connector_get_modes, 631 - .mode_valid = ti_sn_bridge_connector_mode_valid, 632 620 }; 633 621 634 622 static const struct drm_connector_funcs ti_sn_bridge_connector_funcs = { ··· 752 764 static void ti_sn_bridge_detach(struct drm_bridge *bridge) 753 765 { 754 766 drm_dp_aux_unregister(&bridge_to_ti_sn65dsi86(bridge)->aux); 767 + } 768 + 769 + static enum drm_mode_status 770 + ti_sn_bridge_mode_valid(struct drm_bridge *bridge, 771 + const struct drm_display_info *info, 772 + const struct drm_display_mode *mode) 773 + { 774 + /* maximum supported resolution is 4K at 60 fps */ 775 + if (mode->clock > 594000) 776 + return MODE_CLOCK_HIGH; 777 + 778 + return MODE_OK; 755 779 } 756 780 757 781 static void ti_sn_bridge_disable(struct drm_bridge *bridge) ··· 1127 1127 static const struct drm_bridge_funcs ti_sn_bridge_funcs = { 1128 1128 .attach = ti_sn_bridge_attach, 1129 1129 .detach = ti_sn_bridge_detach, 1130 + .mode_valid = ti_sn_bridge_mode_valid, 1130 1131 .pre_enable = ti_sn_bridge_pre_enable, 1131 1132 .enable = ti_sn_bridge_enable, 1132 1133 .disable = ti_sn_bridge_disable,
+65 -4
drivers/gpu/drm/drm_bridge.c
··· 50 50 * Chaining multiple bridges to the output of a bridge, or the same bridge to 51 51 * the output of different bridges, is not supported. 52 52 * 53 + * &drm_bridge, like &drm_panel, aren't &drm_mode_object entities like planes, 54 + * CRTCs, encoders or connectors and hence are not visible to userspace. They 55 + * just provide additional hooks to get the desired output at the end of the 56 + * encoder chain. 57 + */ 58 + 59 + /** 60 + * DOC: display driver integration 61 + * 53 62 * Display drivers are responsible for linking encoders with the first bridge 54 63 * in the chains. This is done by acquiring the appropriate bridge with 55 64 * devm_drm_of_get_bridge(). Once acquired, the bridge shall be attached to the ··· 93 84 * helper to create the &drm_connector, or implement it manually on top of the 94 85 * connector-related operations exposed by the bridge (see the overview 95 86 * documentation of bridge operations for more details). 87 + */ 88 + 89 + /** 90 + * DOC: special care dsi 96 91 * 97 - * &drm_bridge, like &drm_panel, aren't &drm_mode_object entities like planes, 98 - * CRTCs, encoders or connectors and hence are not visible to userspace. They 99 - * just provide additional hooks to get the desired output at the end of the 100 - * encoder chain. 92 + * The interaction between the bridges and other frameworks involved in 93 + * the probing of the upstream driver and the bridge driver can be 94 + * challenging. Indeed, there's multiple cases that needs to be 95 + * considered: 96 + * 97 + * - The upstream driver doesn't use the component framework and isn't a 98 + * MIPI-DSI host. In this case, the bridge driver will probe at some 99 + * point and the upstream driver should try to probe again by returning 100 + * EPROBE_DEFER as long as the bridge driver hasn't probed. 101 + * 102 + * - The upstream driver doesn't use the component framework, but is a 103 + * MIPI-DSI host. The bridge device uses the MIPI-DCS commands to be 104 + * controlled. In this case, the bridge device is a child of the 105 + * display device and when it will probe it's assured that the display 106 + * device (and MIPI-DSI host) is present. The upstream driver will be 107 + * assured that the bridge driver is connected between the 108 + * &mipi_dsi_host_ops.attach and &mipi_dsi_host_ops.detach operations. 109 + * Therefore, it must run mipi_dsi_host_register() in its probe 110 + * function, and then run drm_bridge_attach() in its 111 + * &mipi_dsi_host_ops.attach hook. 112 + * 113 + * - The upstream driver uses the component framework and is a MIPI-DSI 114 + * host. The bridge device uses the MIPI-DCS commands to be 115 + * controlled. This is the same situation than above, and can run 116 + * mipi_dsi_host_register() in either its probe or bind hooks. 117 + * 118 + * - The upstream driver uses the component framework and is a MIPI-DSI 119 + * host. The bridge device uses a separate bus (such as I2C) to be 120 + * controlled. In this case, there's no correlation between the probe 121 + * of the bridge and upstream drivers, so care must be taken to avoid 122 + * an endless EPROBE_DEFER loop, with each driver waiting for the 123 + * other to probe. 124 + * 125 + * The ideal pattern to cover the last item (and all the others in the 126 + * MIPI-DSI host driver case) is to split the operations like this: 127 + * 128 + * - The MIPI-DSI host driver must run mipi_dsi_host_register() in its 129 + * probe hook. It will make sure that the MIPI-DSI host sticks around, 130 + * and that the driver's bind can be called. 131 + * 132 + * - In its probe hook, the bridge driver must try to find its MIPI-DSI 133 + * host, register as a MIPI-DSI device and attach the MIPI-DSI device 134 + * to its host. The bridge driver is now functional. 135 + * 136 + * - In its &struct mipi_dsi_host_ops.attach hook, the MIPI-DSI host can 137 + * now add its component. Its bind hook will now be called and since 138 + * the bridge driver is attached and registered, we can now look for 139 + * and attach it. 140 + * 141 + * At this point, we're now certain that both the upstream driver and 142 + * the bridge driver are functional and we can't have a deadlock-like 143 + * situation when probing. 101 144 */ 102 145 103 146 static DEFINE_MUTEX(bridge_lock);
+72 -76
drivers/gpu/drm/drm_edid.c
··· 100 100 #define LEVEL_GTF2 2 101 101 #define LEVEL_CVT 3 102 102 103 - #define EDID_QUIRK(vend, product_id, _quirks) \ 103 + #define EDID_QUIRK(vend_chr_0, vend_chr_1, vend_chr_2, product_id, _quirks) \ 104 104 { \ 105 - .panel_id = drm_edid_encode_panel_id(vend, product_id), \ 105 + .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \ 106 + product_id), \ 106 107 .quirks = _quirks \ 107 108 } 108 109 ··· 112 111 u32 quirks; 113 112 } edid_quirk_list[] = { 114 113 /* Acer AL1706 */ 115 - EDID_QUIRK("ACR", 44358, EDID_QUIRK_PREFER_LARGE_60), 114 + EDID_QUIRK('A', 'C', 'R', 44358, EDID_QUIRK_PREFER_LARGE_60), 116 115 /* Acer F51 */ 117 - EDID_QUIRK("API", 0x7602, EDID_QUIRK_PREFER_LARGE_60), 116 + EDID_QUIRK('A', 'P', 'I', 0x7602, EDID_QUIRK_PREFER_LARGE_60), 118 117 119 118 /* AEO model 0 reports 8 bpc, but is a 6 bpc panel */ 120 - EDID_QUIRK("AEO", 0, EDID_QUIRK_FORCE_6BPC), 119 + EDID_QUIRK('A', 'E', 'O', 0, EDID_QUIRK_FORCE_6BPC), 121 120 122 121 /* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */ 123 - EDID_QUIRK("BOE", 0x78b, EDID_QUIRK_FORCE_6BPC), 122 + EDID_QUIRK('B', 'O', 'E', 0x78b, EDID_QUIRK_FORCE_6BPC), 124 123 125 124 /* CPT panel of Asus UX303LA reports 8 bpc, but is a 6 bpc panel */ 126 - EDID_QUIRK("CPT", 0x17df, EDID_QUIRK_FORCE_6BPC), 125 + EDID_QUIRK('C', 'P', 'T', 0x17df, EDID_QUIRK_FORCE_6BPC), 127 126 128 127 /* SDC panel of Lenovo B50-80 reports 8 bpc, but is a 6 bpc panel */ 129 - EDID_QUIRK("SDC", 0x3652, EDID_QUIRK_FORCE_6BPC), 128 + EDID_QUIRK('S', 'D', 'C', 0x3652, EDID_QUIRK_FORCE_6BPC), 130 129 131 130 /* BOE model 0x0771 reports 8 bpc, but is a 6 bpc panel */ 132 - EDID_QUIRK("BOE", 0x0771, EDID_QUIRK_FORCE_6BPC), 131 + EDID_QUIRK('B', 'O', 'E', 0x0771, EDID_QUIRK_FORCE_6BPC), 133 132 134 133 /* Belinea 10 15 55 */ 135 - EDID_QUIRK("MAX", 1516, EDID_QUIRK_PREFER_LARGE_60), 136 - EDID_QUIRK("MAX", 0x77e, EDID_QUIRK_PREFER_LARGE_60), 134 + EDID_QUIRK('M', 'A', 'X', 1516, EDID_QUIRK_PREFER_LARGE_60), 135 + EDID_QUIRK('M', 'A', 'X', 0x77e, EDID_QUIRK_PREFER_LARGE_60), 137 136 138 137 /* Envision Peripherals, Inc. EN-7100e */ 139 - EDID_QUIRK("EPI", 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH), 138 + EDID_QUIRK('E', 'P', 'I', 59264, EDID_QUIRK_135_CLOCK_TOO_HIGH), 140 139 /* Envision EN2028 */ 141 - EDID_QUIRK("EPI", 8232, EDID_QUIRK_PREFER_LARGE_60), 140 + EDID_QUIRK('E', 'P', 'I', 8232, EDID_QUIRK_PREFER_LARGE_60), 142 141 143 142 /* Funai Electronics PM36B */ 144 - EDID_QUIRK("FCM", 13600, EDID_QUIRK_PREFER_LARGE_75 | 143 + EDID_QUIRK('F', 'C', 'M', 13600, EDID_QUIRK_PREFER_LARGE_75 | 145 144 EDID_QUIRK_DETAILED_IN_CM), 146 145 147 146 /* LGD panel of HP zBook 17 G2, eDP 10 bpc, but reports unknown bpc */ 148 - EDID_QUIRK("LGD", 764, EDID_QUIRK_FORCE_10BPC), 147 + EDID_QUIRK('L', 'G', 'D', 764, EDID_QUIRK_FORCE_10BPC), 149 148 150 149 /* LG Philips LCD LP154W01-A5 */ 151 - EDID_QUIRK("LPL", 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE), 152 - EDID_QUIRK("LPL", 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE), 150 + EDID_QUIRK('L', 'P', 'L', 0, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE), 151 + EDID_QUIRK('L', 'P', 'L', 0x2a00, EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE), 153 152 154 153 /* Samsung SyncMaster 205BW. Note: irony */ 155 - EDID_QUIRK("SAM", 541, EDID_QUIRK_DETAILED_SYNC_PP), 154 + EDID_QUIRK('S', 'A', 'M', 541, EDID_QUIRK_DETAILED_SYNC_PP), 156 155 /* Samsung SyncMaster 22[5-6]BW */ 157 - EDID_QUIRK("SAM", 596, EDID_QUIRK_PREFER_LARGE_60), 158 - EDID_QUIRK("SAM", 638, EDID_QUIRK_PREFER_LARGE_60), 156 + EDID_QUIRK('S', 'A', 'M', 596, EDID_QUIRK_PREFER_LARGE_60), 157 + EDID_QUIRK('S', 'A', 'M', 638, EDID_QUIRK_PREFER_LARGE_60), 159 158 160 159 /* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */ 161 - EDID_QUIRK("SNY", 0x2541, EDID_QUIRK_FORCE_12BPC), 160 + EDID_QUIRK('S', 'N', 'Y', 0x2541, EDID_QUIRK_FORCE_12BPC), 162 161 163 162 /* ViewSonic VA2026w */ 164 - EDID_QUIRK("VSC", 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING), 163 + EDID_QUIRK('V', 'S', 'C', 5020, EDID_QUIRK_FORCE_REDUCED_BLANKING), 165 164 166 165 /* Medion MD 30217 PG */ 167 - EDID_QUIRK("MED", 0x7b8, EDID_QUIRK_PREFER_LARGE_75), 166 + EDID_QUIRK('M', 'E', 'D', 0x7b8, EDID_QUIRK_PREFER_LARGE_75), 168 167 169 168 /* Lenovo G50 */ 170 - EDID_QUIRK("SDC", 18514, EDID_QUIRK_FORCE_6BPC), 169 + EDID_QUIRK('S', 'D', 'C', 18514, EDID_QUIRK_FORCE_6BPC), 171 170 172 171 /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */ 173 - EDID_QUIRK("SEC", 0xd033, EDID_QUIRK_FORCE_8BPC), 172 + EDID_QUIRK('S', 'E', 'C', 0xd033, EDID_QUIRK_FORCE_8BPC), 174 173 175 174 /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/ 176 - EDID_QUIRK("ETR", 13896, EDID_QUIRK_FORCE_8BPC), 175 + EDID_QUIRK('E', 'T', 'R', 13896, EDID_QUIRK_FORCE_8BPC), 177 176 178 177 /* Valve Index Headset */ 179 - EDID_QUIRK("VLV", 0x91a8, EDID_QUIRK_NON_DESKTOP), 180 - EDID_QUIRK("VLV", 0x91b0, EDID_QUIRK_NON_DESKTOP), 181 - EDID_QUIRK("VLV", 0x91b1, EDID_QUIRK_NON_DESKTOP), 182 - EDID_QUIRK("VLV", 0x91b2, EDID_QUIRK_NON_DESKTOP), 183 - EDID_QUIRK("VLV", 0x91b3, EDID_QUIRK_NON_DESKTOP), 184 - EDID_QUIRK("VLV", 0x91b4, EDID_QUIRK_NON_DESKTOP), 185 - EDID_QUIRK("VLV", 0x91b5, EDID_QUIRK_NON_DESKTOP), 186 - EDID_QUIRK("VLV", 0x91b6, EDID_QUIRK_NON_DESKTOP), 187 - EDID_QUIRK("VLV", 0x91b7, EDID_QUIRK_NON_DESKTOP), 188 - EDID_QUIRK("VLV", 0x91b8, EDID_QUIRK_NON_DESKTOP), 189 - EDID_QUIRK("VLV", 0x91b9, EDID_QUIRK_NON_DESKTOP), 190 - EDID_QUIRK("VLV", 0x91ba, EDID_QUIRK_NON_DESKTOP), 191 - EDID_QUIRK("VLV", 0x91bb, EDID_QUIRK_NON_DESKTOP), 192 - EDID_QUIRK("VLV", 0x91bc, EDID_QUIRK_NON_DESKTOP), 193 - EDID_QUIRK("VLV", 0x91bd, EDID_QUIRK_NON_DESKTOP), 194 - EDID_QUIRK("VLV", 0x91be, EDID_QUIRK_NON_DESKTOP), 195 - EDID_QUIRK("VLV", 0x91bf, EDID_QUIRK_NON_DESKTOP), 178 + EDID_QUIRK('V', 'L', 'V', 0x91a8, EDID_QUIRK_NON_DESKTOP), 179 + EDID_QUIRK('V', 'L', 'V', 0x91b0, EDID_QUIRK_NON_DESKTOP), 180 + EDID_QUIRK('V', 'L', 'V', 0x91b1, EDID_QUIRK_NON_DESKTOP), 181 + EDID_QUIRK('V', 'L', 'V', 0x91b2, EDID_QUIRK_NON_DESKTOP), 182 + EDID_QUIRK('V', 'L', 'V', 0x91b3, EDID_QUIRK_NON_DESKTOP), 183 + EDID_QUIRK('V', 'L', 'V', 0x91b4, EDID_QUIRK_NON_DESKTOP), 184 + EDID_QUIRK('V', 'L', 'V', 0x91b5, EDID_QUIRK_NON_DESKTOP), 185 + EDID_QUIRK('V', 'L', 'V', 0x91b6, EDID_QUIRK_NON_DESKTOP), 186 + EDID_QUIRK('V', 'L', 'V', 0x91b7, EDID_QUIRK_NON_DESKTOP), 187 + EDID_QUIRK('V', 'L', 'V', 0x91b8, EDID_QUIRK_NON_DESKTOP), 188 + EDID_QUIRK('V', 'L', 'V', 0x91b9, EDID_QUIRK_NON_DESKTOP), 189 + EDID_QUIRK('V', 'L', 'V', 0x91ba, EDID_QUIRK_NON_DESKTOP), 190 + EDID_QUIRK('V', 'L', 'V', 0x91bb, EDID_QUIRK_NON_DESKTOP), 191 + EDID_QUIRK('V', 'L', 'V', 0x91bc, EDID_QUIRK_NON_DESKTOP), 192 + EDID_QUIRK('V', 'L', 'V', 0x91bd, EDID_QUIRK_NON_DESKTOP), 193 + EDID_QUIRK('V', 'L', 'V', 0x91be, EDID_QUIRK_NON_DESKTOP), 194 + EDID_QUIRK('V', 'L', 'V', 0x91bf, EDID_QUIRK_NON_DESKTOP), 196 195 197 196 /* HTC Vive and Vive Pro VR Headsets */ 198 - EDID_QUIRK("HVR", 0xaa01, EDID_QUIRK_NON_DESKTOP), 199 - EDID_QUIRK("HVR", 0xaa02, EDID_QUIRK_NON_DESKTOP), 197 + EDID_QUIRK('H', 'V', 'R', 0xaa01, EDID_QUIRK_NON_DESKTOP), 198 + EDID_QUIRK('H', 'V', 'R', 0xaa02, EDID_QUIRK_NON_DESKTOP), 200 199 201 200 /* Oculus Rift DK1, DK2, CV1 and Rift S VR Headsets */ 202 - EDID_QUIRK("OVR", 0x0001, EDID_QUIRK_NON_DESKTOP), 203 - EDID_QUIRK("OVR", 0x0003, EDID_QUIRK_NON_DESKTOP), 204 - EDID_QUIRK("OVR", 0x0004, EDID_QUIRK_NON_DESKTOP), 205 - EDID_QUIRK("OVR", 0x0012, EDID_QUIRK_NON_DESKTOP), 201 + EDID_QUIRK('O', 'V', 'R', 0x0001, EDID_QUIRK_NON_DESKTOP), 202 + EDID_QUIRK('O', 'V', 'R', 0x0003, EDID_QUIRK_NON_DESKTOP), 203 + EDID_QUIRK('O', 'V', 'R', 0x0004, EDID_QUIRK_NON_DESKTOP), 204 + EDID_QUIRK('O', 'V', 'R', 0x0012, EDID_QUIRK_NON_DESKTOP), 206 205 207 206 /* Windows Mixed Reality Headsets */ 208 - EDID_QUIRK("ACR", 0x7fce, EDID_QUIRK_NON_DESKTOP), 209 - EDID_QUIRK("HPN", 0x3515, EDID_QUIRK_NON_DESKTOP), 210 - EDID_QUIRK("LEN", 0x0408, EDID_QUIRK_NON_DESKTOP), 211 - EDID_QUIRK("LEN", 0xb800, EDID_QUIRK_NON_DESKTOP), 212 - EDID_QUIRK("FUJ", 0x1970, EDID_QUIRK_NON_DESKTOP), 213 - EDID_QUIRK("DEL", 0x7fce, EDID_QUIRK_NON_DESKTOP), 214 - EDID_QUIRK("SEC", 0x144a, EDID_QUIRK_NON_DESKTOP), 215 - EDID_QUIRK("AUS", 0xc102, EDID_QUIRK_NON_DESKTOP), 207 + EDID_QUIRK('A', 'C', 'R', 0x7fce, EDID_QUIRK_NON_DESKTOP), 208 + EDID_QUIRK('H', 'P', 'N', 0x3515, EDID_QUIRK_NON_DESKTOP), 209 + EDID_QUIRK('L', 'E', 'N', 0x0408, EDID_QUIRK_NON_DESKTOP), 210 + EDID_QUIRK('L', 'E', 'N', 0xb800, EDID_QUIRK_NON_DESKTOP), 211 + EDID_QUIRK('F', 'U', 'J', 0x1970, EDID_QUIRK_NON_DESKTOP), 212 + EDID_QUIRK('D', 'E', 'L', 0x7fce, EDID_QUIRK_NON_DESKTOP), 213 + EDID_QUIRK('S', 'E', 'C', 0x144a, EDID_QUIRK_NON_DESKTOP), 214 + EDID_QUIRK('A', 'U', 'S', 0xc102, EDID_QUIRK_NON_DESKTOP), 216 215 217 216 /* Sony PlayStation VR Headset */ 218 - EDID_QUIRK("SNY", 0x0704, EDID_QUIRK_NON_DESKTOP), 217 + EDID_QUIRK('S', 'N', 'Y', 0x0704, EDID_QUIRK_NON_DESKTOP), 219 218 220 219 /* Sensics VR Headsets */ 221 - EDID_QUIRK("SEN", 0x1019, EDID_QUIRK_NON_DESKTOP), 220 + EDID_QUIRK('S', 'E', 'N', 0x1019, EDID_QUIRK_NON_DESKTOP), 222 221 223 222 /* OSVR HDK and HDK2 VR Headsets */ 224 - EDID_QUIRK("SVR", 0x1019, EDID_QUIRK_NON_DESKTOP), 223 + EDID_QUIRK('S', 'V', 'R', 0x1019, EDID_QUIRK_NON_DESKTOP), 225 224 }; 226 225 227 226 /* ··· 1911 1910 } 1912 1911 EXPORT_SYMBOL(drm_add_override_edid_modes); 1913 1912 1914 - static struct edid *drm_do_get_edid_base_block( 1913 + static struct edid *drm_do_get_edid_base_block(struct drm_connector *connector, 1915 1914 int (*get_edid_block)(void *data, u8 *buf, unsigned int block, 1916 1915 size_t len), 1917 - void *data, bool *edid_corrupt, int *null_edid_counter) 1916 + void *data) 1918 1917 { 1919 - int i; 1918 + int *null_edid_counter = connector ? &connector->null_edid_counter : NULL; 1919 + bool *edid_corrupt = connector ? &connector->edid_corrupt : NULL; 1920 1920 void *edid; 1921 + int i; 1921 1922 1922 1923 edid = kmalloc(EDID_LENGTH, GFP_KERNEL); 1923 1924 if (edid == NULL) ··· 1943 1940 return edid; 1944 1941 1945 1942 carp: 1946 - kfree(edid); 1947 - return ERR_PTR(-EINVAL); 1948 - 1943 + if (connector) 1944 + connector_bad_edid(connector, edid, 1); 1949 1945 out: 1950 1946 kfree(edid); 1951 1947 return NULL; ··· 1983 1981 if (override) 1984 1982 return override; 1985 1983 1986 - edid = (u8 *)drm_do_get_edid_base_block(get_edid_block, data, 1987 - &connector->edid_corrupt, 1988 - &connector->null_edid_counter); 1989 - if (IS_ERR_OR_NULL(edid)) { 1990 - if (IS_ERR(edid)) 1991 - connector_bad_edid(connector, edid, 1); 1984 + edid = (u8 *)drm_do_get_edid_base_block(connector, get_edid_block, data); 1985 + if (!edid) 1992 1986 return NULL; 1993 - } 1994 1987 1995 1988 /* if there's no extensions or no connector, we're done */ 1996 1989 valid_extensions = edid[0x7e]; ··· 2138 2141 struct edid *edid; 2139 2142 u32 panel_id; 2140 2143 2141 - edid = drm_do_get_edid_base_block(drm_do_probe_ddc_edid, adapter, 2142 - NULL, NULL); 2144 + edid = drm_do_get_edid_base_block(NULL, drm_do_probe_ddc_edid, adapter); 2143 2145 2144 2146 /* 2145 2147 * There are no manufacturer IDs of 0, so if there is a problem reading 2146 2148 * the EDID then we'll just return 0. 2147 2149 */ 2148 - if (IS_ERR_OR_NULL(edid)) 2150 + if (!edid) 2149 2151 return 0; 2150 2152 2151 2153 panel_id = edid_extract_panel_id(edid);
+88
drivers/gpu/drm/drm_format_helper.c
··· 135 135 } 136 136 EXPORT_SYMBOL(drm_fb_swab); 137 137 138 + static void drm_fb_xrgb8888_to_rgb332_line(u8 *dbuf, __le32 *sbuf, unsigned int pixels) 139 + { 140 + unsigned int x; 141 + u32 pix; 142 + 143 + for (x = 0; x < pixels; x++) { 144 + pix = le32_to_cpu(sbuf[x]); 145 + dbuf[x] = ((pix & 0x00e00000) >> 16) | 146 + ((pix & 0x0000e000) >> 11) | 147 + ((pix & 0x000000c0) >> 6); 148 + } 149 + } 150 + 151 + /** 152 + * drm_fb_xrgb8888_to_rgb332 - Convert XRGB8888 to RGB332 clip buffer 153 + * @dst: RGB332 destination buffer 154 + * @src: XRGB8888 source buffer 155 + * @fb: DRM framebuffer 156 + * @clip: Clip rectangle area to copy 157 + * 158 + * Drivers can use this function for RGB332 devices that don't natively support XRGB8888. 159 + * 160 + * This function does not apply clipping on dst, i.e. the destination is a small buffer 161 + * containing the clip rect only. 162 + */ 163 + void drm_fb_xrgb8888_to_rgb332(void *dst, void *src, struct drm_framebuffer *fb, 164 + struct drm_rect *clip) 165 + { 166 + size_t width = drm_rect_width(clip); 167 + size_t src_len = width * sizeof(u32); 168 + unsigned int y; 169 + void *sbuf; 170 + 171 + /* Use a buffer to speed up access on buffers with uncached read mapping (i.e. WC) */ 172 + sbuf = kmalloc(src_len, GFP_KERNEL); 173 + if (!sbuf) 174 + return; 175 + 176 + src += clip_offset(clip, fb->pitches[0], sizeof(u32)); 177 + for (y = 0; y < drm_rect_height(clip); y++) { 178 + memcpy(sbuf, src, src_len); 179 + drm_fb_xrgb8888_to_rgb332_line(dst, sbuf, width); 180 + src += fb->pitches[0]; 181 + dst += width; 182 + } 183 + 184 + kfree(sbuf); 185 + } 186 + EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb332); 187 + 138 188 static void drm_fb_xrgb8888_to_rgb565_line(u16 *dbuf, u32 *sbuf, 139 189 unsigned int pixels, 140 190 bool swab) ··· 299 249 *dbuf++ = (sbuf[x] & 0x00FF0000) >> 16; 300 250 } 301 251 } 252 + 253 + /** 254 + * drm_fb_xrgb8888_to_rgb888 - Convert XRGB8888 to RGB888 clip buffer 255 + * @dst: RGB888 destination buffer 256 + * @src: XRGB8888 source buffer 257 + * @fb: DRM framebuffer 258 + * @clip: Clip rectangle area to copy 259 + * 260 + * Drivers can use this function for RGB888 devices that don't natively 261 + * support XRGB8888. 262 + * 263 + * This function does not apply clipping on dst, i.e. the destination 264 + * is a small buffer containing the clip rect only. 265 + */ 266 + void drm_fb_xrgb8888_to_rgb888(void *dst, void *src, struct drm_framebuffer *fb, 267 + struct drm_rect *clip) 268 + { 269 + size_t width = drm_rect_width(clip); 270 + size_t src_len = width * sizeof(u32); 271 + unsigned int y; 272 + void *sbuf; 273 + 274 + /* Use a buffer to speed up access on buffers with uncached read mapping (i.e. WC) */ 275 + sbuf = kmalloc(src_len, GFP_KERNEL); 276 + if (!sbuf) 277 + return; 278 + 279 + src += clip_offset(clip, fb->pitches[0], sizeof(u32)); 280 + for (y = 0; y < drm_rect_height(clip); y++) { 281 + memcpy(sbuf, src, src_len); 282 + drm_fb_xrgb8888_to_rgb888_line(dst, sbuf, width); 283 + src += fb->pitches[0]; 284 + dst += width * 3; 285 + } 286 + 287 + kfree(sbuf); 288 + } 289 + EXPORT_SYMBOL(drm_fb_xrgb8888_to_rgb888); 302 290 303 291 /** 304 292 * drm_fb_xrgb8888_to_rgb888_dstclip - Convert XRGB8888 to RGB888 clip buffer
+1
drivers/gpu/drm/drm_fourcc.c
··· 133 133 { 134 134 static const struct drm_format_info formats[] = { 135 135 { .format = DRM_FORMAT_C8, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 }, 136 + { .format = DRM_FORMAT_R8, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 }, 136 137 { .format = DRM_FORMAT_RGB332, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 }, 137 138 { .format = DRM_FORMAT_BGR233, .depth = 8, .num_planes = 1, .cpp = { 1, 0, 0 }, .hsub = 1, .vsub = 1 }, 138 139 { .format = DRM_FORMAT_XRGB4444, .depth = 0, .num_planes = 1, .cpp = { 2, 0, 0 }, .hsub = 1, .vsub = 1 },
+18 -21
drivers/gpu/drm/drm_lease.c
··· 489 489 if (!drm_core_check_feature(dev, DRIVER_MODESET)) 490 490 return -EOPNOTSUPP; 491 491 492 - /* need some objects */ 493 - if (cl->object_count == 0) { 494 - DRM_DEBUG_LEASE("no objects in lease\n"); 495 - return -EINVAL; 496 - } 497 - 498 492 if (cl->flags && (cl->flags & ~(O_CLOEXEC | O_NONBLOCK))) { 499 493 DRM_DEBUG_LEASE("invalid flags\n"); 500 494 return -EINVAL; ··· 504 510 505 511 object_count = cl->object_count; 506 512 507 - object_ids = memdup_user(u64_to_user_ptr(cl->object_ids), 508 - array_size(object_count, sizeof(__u32))); 509 - if (IS_ERR(object_ids)) { 510 - ret = PTR_ERR(object_ids); 511 - goto out_lessor; 512 - } 513 - 513 + /* Handle leased objects, if any */ 514 514 idr_init(&leases); 515 + if (object_count != 0) { 516 + object_ids = memdup_user(u64_to_user_ptr(cl->object_ids), 517 + array_size(object_count, sizeof(__u32))); 518 + if (IS_ERR(object_ids)) { 519 + ret = PTR_ERR(object_ids); 520 + idr_destroy(&leases); 521 + goto out_lessor; 522 + } 515 523 516 - /* fill and validate the object idr */ 517 - ret = fill_object_idr(dev, lessor_priv, &leases, 518 - object_count, object_ids); 519 - kfree(object_ids); 520 - if (ret) { 521 - DRM_DEBUG_LEASE("lease object lookup failed: %i\n", ret); 522 - idr_destroy(&leases); 523 - goto out_lessor; 524 + /* fill and validate the object idr */ 525 + ret = fill_object_idr(dev, lessor_priv, &leases, 526 + object_count, object_ids); 527 + kfree(object_ids); 528 + if (ret) { 529 + DRM_DEBUG_LEASE("lease object lookup failed: %i\n", ret); 530 + idr_destroy(&leases); 531 + goto out_lessor; 532 + } 524 533 } 525 534 526 535 /* Allocate a file descriptor for the lease */
+81
drivers/gpu/drm/drm_mipi_dsi.c
··· 246 246 } 247 247 EXPORT_SYMBOL(mipi_dsi_device_unregister); 248 248 249 + static void devm_mipi_dsi_device_unregister(void *arg) 250 + { 251 + struct mipi_dsi_device *dsi = arg; 252 + 253 + mipi_dsi_device_unregister(dsi); 254 + } 255 + 256 + /** 257 + * devm_mipi_dsi_device_register_full - create a managed MIPI DSI device 258 + * @dev: device to tie the MIPI-DSI device lifetime to 259 + * @host: DSI host to which this device is connected 260 + * @info: pointer to template containing DSI device information 261 + * 262 + * Create a MIPI DSI device by using the device information provided by 263 + * mipi_dsi_device_info template 264 + * 265 + * This is the managed version of mipi_dsi_device_register_full() which 266 + * automatically calls mipi_dsi_device_unregister() when @dev is 267 + * unbound. 268 + * 269 + * Returns: 270 + * A pointer to the newly created MIPI DSI device, or, a pointer encoded 271 + * with an error 272 + */ 273 + struct mipi_dsi_device * 274 + devm_mipi_dsi_device_register_full(struct device *dev, 275 + struct mipi_dsi_host *host, 276 + const struct mipi_dsi_device_info *info) 277 + { 278 + struct mipi_dsi_device *dsi; 279 + int ret; 280 + 281 + dsi = mipi_dsi_device_register_full(host, info); 282 + if (IS_ERR(dsi)) 283 + return dsi; 284 + 285 + ret = devm_add_action_or_reset(dev, 286 + devm_mipi_dsi_device_unregister, 287 + dsi); 288 + if (ret) 289 + return ERR_PTR(ret); 290 + 291 + return dsi; 292 + } 293 + EXPORT_SYMBOL_GPL(devm_mipi_dsi_device_register_full); 294 + 249 295 static DEFINE_MUTEX(host_lock); 250 296 static LIST_HEAD(host_list); 251 297 ··· 390 344 return ops->detach(dsi->host, dsi); 391 345 } 392 346 EXPORT_SYMBOL(mipi_dsi_detach); 347 + 348 + static void devm_mipi_dsi_detach(void *arg) 349 + { 350 + struct mipi_dsi_device *dsi = arg; 351 + 352 + mipi_dsi_detach(dsi); 353 + } 354 + 355 + /** 356 + * devm_mipi_dsi_attach - Attach a MIPI-DSI device to its DSI Host 357 + * @dev: device to tie the MIPI-DSI device attachment lifetime to 358 + * @dsi: DSI peripheral 359 + * 360 + * This is the managed version of mipi_dsi_attach() which automatically 361 + * calls mipi_dsi_detach() when @dev is unbound. 362 + * 363 + * Returns: 364 + * 0 on success, a negative error code on failure. 365 + */ 366 + int devm_mipi_dsi_attach(struct device *dev, 367 + struct mipi_dsi_device *dsi) 368 + { 369 + int ret; 370 + 371 + ret = mipi_dsi_attach(dsi); 372 + if (ret) 373 + return ret; 374 + 375 + ret = devm_add_action_or_reset(dev, devm_mipi_dsi_detach, dsi); 376 + if (ret) 377 + return ret; 378 + 379 + return 0; 380 + } 381 + EXPORT_SYMBOL_GPL(devm_mipi_dsi_attach); 393 382 394 383 static ssize_t mipi_dsi_device_transfer(struct mipi_dsi_device *dsi, 395 384 struct mipi_dsi_msg *msg)
+88 -31
drivers/gpu/drm/drm_probe_helper.c
··· 795 795 } 796 796 EXPORT_SYMBOL(drm_kms_helper_poll_fini); 797 797 798 + static bool check_connector_changed(struct drm_connector *connector) 799 + { 800 + struct drm_device *dev = connector->dev; 801 + enum drm_connector_status old_status; 802 + u64 old_epoch_counter; 803 + 804 + /* Only handle HPD capable connectors. */ 805 + drm_WARN_ON(dev, !(connector->polled & DRM_CONNECTOR_POLL_HPD)); 806 + 807 + drm_WARN_ON(dev, !mutex_is_locked(&dev->mode_config.mutex)); 808 + 809 + old_status = connector->status; 810 + old_epoch_counter = connector->epoch_counter; 811 + connector->status = drm_helper_probe_detect(connector, NULL, false); 812 + 813 + if (old_epoch_counter == connector->epoch_counter) { 814 + drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Same epoch counter %llu\n", 815 + connector->base.id, 816 + connector->name, 817 + connector->epoch_counter); 818 + 819 + return false; 820 + } 821 + 822 + drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s\n", 823 + connector->base.id, 824 + connector->name, 825 + drm_get_connector_status_name(old_status), 826 + drm_get_connector_status_name(connector->status)); 827 + 828 + drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Changed epoch counter %llu => %llu\n", 829 + connector->base.id, 830 + connector->name, 831 + old_epoch_counter, 832 + connector->epoch_counter); 833 + 834 + return true; 835 + } 836 + 837 + /** 838 + * drm_connector_helper_hpd_irq_event - hotplug processing 839 + * @connector: drm_connector 840 + * 841 + * Drivers can use this helper function to run a detect cycle on a connector 842 + * which has the DRM_CONNECTOR_POLL_HPD flag set in its &polled member. 843 + * 844 + * This helper function is useful for drivers which can track hotplug 845 + * interrupts for a single connector. Drivers that want to send a 846 + * hotplug event for all connectors or can't track hotplug interrupts 847 + * per connector need to use drm_helper_hpd_irq_event(). 848 + * 849 + * This function must be called from process context with no mode 850 + * setting locks held. 851 + * 852 + * Note that a connector can be both polled and probed from the hotplug 853 + * handler, in case the hotplug interrupt is known to be unreliable. 854 + * 855 + * Returns: 856 + * A boolean indicating whether the connector status changed or not 857 + */ 858 + bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector) 859 + { 860 + struct drm_device *dev = connector->dev; 861 + bool changed; 862 + 863 + mutex_lock(&dev->mode_config.mutex); 864 + changed = check_connector_changed(connector); 865 + mutex_unlock(&dev->mode_config.mutex); 866 + 867 + if (changed) { 868 + drm_kms_helper_hotplug_event(dev); 869 + drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Sent hotplug event\n", 870 + connector->base.id, 871 + connector->name); 872 + } 873 + 874 + return changed; 875 + } 876 + EXPORT_SYMBOL(drm_connector_helper_hpd_irq_event); 877 + 798 878 /** 799 879 * drm_helper_hpd_irq_event - hotplug processing 800 880 * @dev: drm_device ··· 888 808 * interrupts for each connector. 889 809 * 890 810 * Drivers which support hotplug interrupts for each connector individually and 891 - * which have a more fine-grained detect logic should bypass this code and 892 - * directly call drm_kms_helper_hotplug_event() in case the connector state 893 - * changed. 811 + * which have a more fine-grained detect logic can use 812 + * drm_connector_helper_hpd_irq_event(). Alternatively, they should bypass this 813 + * code and directly call drm_kms_helper_hotplug_event() in case the connector 814 + * state changed. 894 815 * 895 816 * This function must be called from process context with no mode 896 817 * setting locks held. 897 818 * 898 819 * Note that a connector can be both polled and probed from the hotplug handler, 899 820 * in case the hotplug interrupt is known to be unreliable. 821 + * 822 + * Returns: 823 + * A boolean indicating whether the connector status changed or not 900 824 */ 901 825 bool drm_helper_hpd_irq_event(struct drm_device *dev) 902 826 { 903 827 struct drm_connector *connector; 904 828 struct drm_connector_list_iter conn_iter; 905 - enum drm_connector_status old_status; 906 829 bool changed = false; 907 - u64 old_epoch_counter; 908 830 909 831 if (!dev->mode_config.poll_enabled) 910 832 return false; ··· 918 836 if (!(connector->polled & DRM_CONNECTOR_POLL_HPD)) 919 837 continue; 920 838 921 - old_status = connector->status; 922 - 923 - old_epoch_counter = connector->epoch_counter; 924 - 925 - DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id, 926 - connector->name, 927 - old_epoch_counter); 928 - 929 - connector->status = drm_helper_probe_detect(connector, NULL, false); 930 - DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n", 931 - connector->base.id, 932 - connector->name, 933 - drm_get_connector_status_name(old_status), 934 - drm_get_connector_status_name(connector->status)); 935 - 936 - DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n", 937 - connector->base.id, 938 - connector->name, 939 - connector->epoch_counter); 940 - 941 - /* 942 - * Check if epoch counter had changed, meaning that we need 943 - * to send a uevent. 944 - */ 945 - if (old_epoch_counter != connector->epoch_counter) 839 + if (check_connector_changed(connector)) 946 840 changed = true; 947 - 948 841 } 949 842 drm_connector_list_iter_end(&conn_iter); 950 843 mutex_unlock(&dev->mode_config.mutex);
+6 -6
drivers/gpu/drm/gma500/backlight.c
··· 16 16 #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE 17 17 static void do_gma_backlight_set(struct drm_device *dev) 18 18 { 19 - struct drm_psb_private *dev_priv = dev->dev_private; 19 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 20 20 backlight_update_status(dev_priv->backlight_device); 21 21 } 22 22 #endif ··· 24 24 void gma_backlight_enable(struct drm_device *dev) 25 25 { 26 26 #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE 27 - struct drm_psb_private *dev_priv = dev->dev_private; 27 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 28 28 dev_priv->backlight_enabled = true; 29 29 if (dev_priv->backlight_device) { 30 30 dev_priv->backlight_device->props.brightness = dev_priv->backlight_level; ··· 36 36 void gma_backlight_disable(struct drm_device *dev) 37 37 { 38 38 #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE 39 - struct drm_psb_private *dev_priv = dev->dev_private; 39 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 40 40 dev_priv->backlight_enabled = false; 41 41 if (dev_priv->backlight_device) { 42 42 dev_priv->backlight_device->props.brightness = 0; ··· 48 48 void gma_backlight_set(struct drm_device *dev, int v) 49 49 { 50 50 #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE 51 - struct drm_psb_private *dev_priv = dev->dev_private; 51 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 52 52 dev_priv->backlight_level = v; 53 53 if (dev_priv->backlight_device && dev_priv->backlight_enabled) { 54 54 dev_priv->backlight_device->props.brightness = v; ··· 60 60 int gma_backlight_init(struct drm_device *dev) 61 61 { 62 62 #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE 63 - struct drm_psb_private *dev_priv = dev->dev_private; 63 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 64 64 dev_priv->backlight_enabled = true; 65 65 return dev_priv->ops->backlight_init(dev); 66 66 #else ··· 71 71 void gma_backlight_exit(struct drm_device *dev) 72 72 { 73 73 #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE 74 - struct drm_psb_private *dev_priv = dev->dev_private; 74 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 75 75 if (dev_priv->backlight_device) { 76 76 dev_priv->backlight_device->props.brightness = 0; 77 77 backlight_update_status(dev_priv->backlight_device);
+12 -12
drivers/gpu/drm/gma500/cdv_device.c
··· 38 38 39 39 static int cdv_output_init(struct drm_device *dev) 40 40 { 41 - struct drm_psb_private *dev_priv = dev->dev_private; 41 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 42 42 43 43 drm_mode_create_scaling_mode_property(dev); 44 44 ··· 146 146 147 147 static int cdv_backlight_init(struct drm_device *dev) 148 148 { 149 - struct drm_psb_private *dev_priv = dev->dev_private; 149 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 150 150 struct backlight_properties props; 151 151 152 152 memset(&props, 0, sizeof(struct backlight_properties)); ··· 206 206 207 207 static void cdv_init_pm(struct drm_device *dev) 208 208 { 209 - struct drm_psb_private *dev_priv = dev->dev_private; 209 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 210 210 struct pci_dev *pdev = to_pci_dev(dev->dev); 211 211 u32 pwr_cnt; 212 212 int domain = pci_domain_nr(pdev->bus); ··· 259 259 */ 260 260 static int cdv_save_display_registers(struct drm_device *dev) 261 261 { 262 - struct drm_psb_private *dev_priv = dev->dev_private; 262 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 263 263 struct pci_dev *pdev = to_pci_dev(dev->dev); 264 264 struct psb_save_area *regs = &dev_priv->regs; 265 265 struct drm_connector *connector; ··· 314 314 */ 315 315 static int cdv_restore_display_registers(struct drm_device *dev) 316 316 { 317 - struct drm_psb_private *dev_priv = dev->dev_private; 317 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 318 318 struct pci_dev *pdev = to_pci_dev(dev->dev); 319 319 struct psb_save_area *regs = &dev_priv->regs; 320 320 struct drm_connector *connector; ··· 383 383 384 384 static int cdv_power_down(struct drm_device *dev) 385 385 { 386 - struct drm_psb_private *dev_priv = dev->dev_private; 386 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 387 387 u32 pwr_cnt, pwr_mask, pwr_sts; 388 388 int tries = 5; 389 389 ··· 405 405 406 406 static int cdv_power_up(struct drm_device *dev) 407 407 { 408 - struct drm_psb_private *dev_priv = dev->dev_private; 408 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 409 409 u32 pwr_cnt, pwr_mask, pwr_sts; 410 410 int tries = 5; 411 411 ··· 429 429 { 430 430 struct drm_psb_private *dev_priv = container_of(work, struct drm_psb_private, 431 431 hotplug_work); 432 - struct drm_device *dev = dev_priv->dev; 432 + struct drm_device *dev = &dev_priv->dev; 433 433 434 434 /* Just fire off a uevent and let userspace tell us what to do */ 435 435 drm_helper_hpd_irq_event(dev); ··· 440 440 441 441 static int cdv_hotplug_event(struct drm_device *dev) 442 442 { 443 - struct drm_psb_private *dev_priv = dev->dev_private; 443 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 444 444 schedule_work(&dev_priv->hotplug_work); 445 445 REG_WRITE(PORT_HOTPLUG_STAT, REG_READ(PORT_HOTPLUG_STAT)); 446 446 return 1; ··· 468 468 void cdv_intel_attach_force_audio_property(struct drm_connector *connector) 469 469 { 470 470 struct drm_device *dev = connector->dev; 471 - struct drm_psb_private *dev_priv = dev->dev_private; 471 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 472 472 struct drm_property *prop; 473 473 int i; 474 474 ··· 497 497 void cdv_intel_attach_broadcast_rgb_property(struct drm_connector *connector) 498 498 { 499 499 struct drm_device *dev = connector->dev; 500 - struct drm_psb_private *dev_priv = dev->dev_private; 500 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 501 501 struct drm_property *prop; 502 502 int i; 503 503 ··· 574 574 575 575 static int cdv_chip_setup(struct drm_device *dev) 576 576 { 577 - struct drm_psb_private *dev_priv = dev->dev_private; 577 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 578 578 struct pci_dev *pdev = to_pci_dev(dev->dev); 579 579 INIT_WORK(&dev_priv->hotplug_work, cdv_hotplug_work_func); 580 580
+5 -5
drivers/gpu/drm/gma500/cdv_intel_display.c
··· 455 455 static bool cdv_intel_pipe_enabled(struct drm_device *dev, int pipe) 456 456 { 457 457 struct drm_crtc *crtc; 458 - struct drm_psb_private *dev_priv = dev->dev_private; 458 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 459 459 struct gma_crtc *gma_crtc = NULL; 460 460 461 461 crtc = dev_priv->pipe_to_crtc_mapping[pipe]; ··· 489 489 490 490 void cdv_update_wm(struct drm_device *dev, struct drm_crtc *crtc) 491 491 { 492 - struct drm_psb_private *dev_priv = dev->dev_private; 492 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 493 493 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 494 494 495 495 /* Is only one pipe enabled? */ ··· 574 574 struct drm_framebuffer *old_fb) 575 575 { 576 576 struct drm_device *dev = crtc->dev; 577 - struct drm_psb_private *dev_priv = dev->dev_private; 577 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 578 578 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 579 579 int pipe = gma_crtc->pipe; 580 580 const struct psb_offset *map = &dev_priv->regmap[pipe]; ··· 829 829 static int cdv_intel_crtc_clock_get(struct drm_device *dev, 830 830 struct drm_crtc *crtc) 831 831 { 832 - struct drm_psb_private *dev_priv = dev->dev_private; 832 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 833 833 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 834 834 int pipe = gma_crtc->pipe; 835 835 const struct psb_offset *map = &dev_priv->regmap[pipe]; ··· 910 910 { 911 911 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 912 912 int pipe = gma_crtc->pipe; 913 - struct drm_psb_private *dev_priv = dev->dev_private; 913 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 914 914 struct psb_pipe *p = &dev_priv->regs.pipe[pipe]; 915 915 const struct psb_offset *map = &dev_priv->regmap[pipe]; 916 916 struct drm_display_mode *mode;
+6 -6
drivers/gpu/drm/gma500/cdv_intel_dp.c
··· 515 515 struct cdv_intel_dp *intel_dp = encoder->dev_priv; 516 516 int max_link_clock = cdv_intel_dp_link_clock(cdv_intel_dp_max_link_bw(encoder)); 517 517 int max_lanes = cdv_intel_dp_max_lane_count(encoder); 518 - struct drm_psb_private *dev_priv = connector->dev->dev_private; 518 + struct drm_psb_private *dev_priv = to_drm_psb_private(connector->dev); 519 519 520 520 if (is_edp(encoder) && intel_dp->panel_fixed_mode) { 521 521 if (mode->hdisplay > intel_dp->panel_fixed_mode->hdisplay) ··· 896 896 cdv_intel_dp_mode_fixup(struct drm_encoder *encoder, const struct drm_display_mode *mode, 897 897 struct drm_display_mode *adjusted_mode) 898 898 { 899 - struct drm_psb_private *dev_priv = encoder->dev->dev_private; 899 + struct drm_psb_private *dev_priv = to_drm_psb_private(encoder->dev); 900 900 struct gma_encoder *intel_encoder = to_gma_encoder(encoder); 901 901 struct cdv_intel_dp *intel_dp = intel_encoder->dev_priv; 902 902 int lane_count, clock; ··· 988 988 struct drm_display_mode *adjusted_mode) 989 989 { 990 990 struct drm_device *dev = crtc->dev; 991 - struct drm_psb_private *dev_priv = dev->dev_private; 991 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 992 992 struct drm_mode_config *mode_config = &dev->mode_config; 993 993 struct drm_encoder *encoder; 994 994 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); ··· 1744 1744 1745 1745 if (is_edp(intel_encoder)) { 1746 1746 struct drm_device *dev = connector->dev; 1747 - struct drm_psb_private *dev_priv = dev->dev_private; 1747 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 1748 1748 1749 1749 cdv_intel_edp_panel_vdd_off(intel_encoder); 1750 1750 if (ret) { ··· 1809 1809 struct drm_property *property, 1810 1810 uint64_t val) 1811 1811 { 1812 - struct drm_psb_private *dev_priv = connector->dev->dev_private; 1812 + struct drm_psb_private *dev_priv = to_drm_psb_private(connector->dev); 1813 1813 struct gma_encoder *encoder = gma_attached_encoder(connector); 1814 1814 struct cdv_intel_dp *intel_dp = encoder->dev_priv; 1815 1815 int ret; ··· 1908 1908 /* check the VBT to see whether the eDP is on DP-D port */ 1909 1909 static bool cdv_intel_dpc_is_edp(struct drm_device *dev) 1910 1910 { 1911 - struct drm_psb_private *dev_priv = dev->dev_private; 1911 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 1912 1912 struct child_device_config *p_child; 1913 1913 int i; 1914 1914
+11 -11
drivers/gpu/drm/gma500/cdv_intel_lvds.c
··· 57 57 */ 58 58 static u32 cdv_intel_lvds_get_max_backlight(struct drm_device *dev) 59 59 { 60 - struct drm_psb_private *dev_priv = dev->dev_private; 60 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 61 61 u32 retval; 62 62 63 63 if (gma_power_begin(dev, false)) { ··· 81 81 */ 82 82 static void cdv_intel_lvds_set_backlight(struct drm_device *dev, int level) 83 83 { 84 - struct drm_psb_private *dev_priv = dev->dev_private; 84 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 85 85 u32 blc_pwm_ctl; 86 86 87 87 if (gma_power_begin(dev, false)) { ··· 105 105 static void cdv_intel_lvds_set_power(struct drm_device *dev, 106 106 struct drm_encoder *encoder, bool on) 107 107 { 108 - struct drm_psb_private *dev_priv = dev->dev_private; 108 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 109 109 u32 pp_status; 110 110 111 111 if (!gma_power_begin(dev, true)) ··· 154 154 struct drm_display_mode *mode) 155 155 { 156 156 struct drm_device *dev = connector->dev; 157 - struct drm_psb_private *dev_priv = dev->dev_private; 157 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 158 158 struct drm_display_mode *fixed_mode = 159 159 dev_priv->mode_dev.panel_fixed_mode; 160 160 ··· 180 180 struct drm_display_mode *adjusted_mode) 181 181 { 182 182 struct drm_device *dev = encoder->dev; 183 - struct drm_psb_private *dev_priv = dev->dev_private; 183 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 184 184 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 185 185 struct drm_encoder *tmp_encoder; 186 186 struct drm_display_mode *panel_fixed_mode = mode_dev->panel_fixed_mode; ··· 227 227 static void cdv_intel_lvds_prepare(struct drm_encoder *encoder) 228 228 { 229 229 struct drm_device *dev = encoder->dev; 230 - struct drm_psb_private *dev_priv = dev->dev_private; 230 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 231 231 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 232 232 233 233 if (!gma_power_begin(dev, true)) ··· 245 245 static void cdv_intel_lvds_commit(struct drm_encoder *encoder) 246 246 { 247 247 struct drm_device *dev = encoder->dev; 248 - struct drm_psb_private *dev_priv = dev->dev_private; 248 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 249 249 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 250 250 251 251 if (mode_dev->backlight_duty_cycle == 0) ··· 260 260 struct drm_display_mode *adjusted_mode) 261 261 { 262 262 struct drm_device *dev = encoder->dev; 263 - struct drm_psb_private *dev_priv = dev->dev_private; 263 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 264 264 struct gma_crtc *gma_crtc = to_gma_crtc(encoder->crtc); 265 265 u32 pfit_control; 266 266 ··· 297 297 static int cdv_intel_lvds_get_modes(struct drm_connector *connector) 298 298 { 299 299 struct drm_device *dev = connector->dev; 300 - struct drm_psb_private *dev_priv = dev->dev_private; 300 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 301 301 struct gma_encoder *gma_encoder = gma_attached_encoder(connector); 302 302 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 303 303 int ret; ··· 428 428 static bool lvds_is_present_in_vbt(struct drm_device *dev, 429 429 u8 *i2c_pin) 430 430 { 431 - struct drm_psb_private *dev_priv = dev->dev_private; 431 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 432 432 int i; 433 433 434 434 if (!dev_priv->child_dev_num) ··· 486 486 struct drm_encoder *encoder; 487 487 struct drm_display_mode *scan; 488 488 struct drm_crtc *crtc; 489 - struct drm_psb_private *dev_priv = dev->dev_private; 489 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 490 490 u32 lvds; 491 491 int pipe; 492 492 u8 pin;
+8 -8
drivers/gpu/drm/gma500/framebuffer.c
··· 81 81 struct vm_area_struct *vma = vmf->vma; 82 82 struct drm_framebuffer *fb = vma->vm_private_data; 83 83 struct drm_device *dev = fb->dev; 84 - struct drm_psb_private *dev_priv = dev->dev_private; 84 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 85 85 struct gtt_range *gtt = to_gtt_range(fb->obj[0]); 86 86 int page_num; 87 87 int i; ··· 261 261 struct drm_fb_helper_surface_size *sizes) 262 262 { 263 263 struct drm_device *dev = fb_helper->dev; 264 - struct drm_psb_private *dev_priv = dev->dev_private; 264 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 265 265 struct pci_dev *pdev = to_pci_dev(dev->dev); 266 266 struct fb_info *info; 267 267 struct drm_framebuffer *fb; ··· 374 374 struct drm_fb_helper_surface_size *sizes) 375 375 { 376 376 struct drm_device *dev = fb_helper->dev; 377 - struct drm_psb_private *dev_priv = dev->dev_private; 377 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 378 378 unsigned int fb_size; 379 379 int bytespp; 380 380 ··· 422 422 int psb_fbdev_init(struct drm_device *dev) 423 423 { 424 424 struct drm_fb_helper *fb_helper; 425 - struct drm_psb_private *dev_priv = dev->dev_private; 425 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 426 426 int ret; 427 427 428 428 fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL); ··· 457 457 458 458 static void psb_fbdev_fini(struct drm_device *dev) 459 459 { 460 - struct drm_psb_private *dev_priv = dev->dev_private; 460 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 461 461 462 462 if (!dev_priv->fb_helper) 463 463 return; ··· 474 474 475 475 static void psb_setup_outputs(struct drm_device *dev) 476 476 { 477 - struct drm_psb_private *dev_priv = dev->dev_private; 477 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 478 478 struct drm_connector *connector; 479 479 480 480 drm_mode_create_scaling_mode_property(dev); ··· 533 533 534 534 void psb_modeset_init(struct drm_device *dev) 535 535 { 536 - struct drm_psb_private *dev_priv = dev->dev_private; 536 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 537 537 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 538 538 struct pci_dev *pdev = to_pci_dev(dev->dev); 539 539 int i; ··· 566 566 567 567 void psb_modeset_cleanup(struct drm_device *dev) 568 568 { 569 - struct drm_psb_private *dev_priv = dev->dev_private; 569 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 570 570 if (dev_priv->modeset) { 571 571 drm_kms_helper_poll_fini(dev); 572 572 psb_fbdev_fini(dev);
+1 -1
drivers/gpu/drm/gma500/gem.c
··· 147 147 148 148 obj = vma->vm_private_data; /* GEM object */ 149 149 dev = obj->dev; 150 - dev_priv = dev->dev_private; 150 + dev_priv = to_drm_psb_private(dev); 151 151 152 152 r = container_of(obj, struct gtt_range, gem); /* Get the gtt range */ 153 153
+1 -1
drivers/gpu/drm/gma500/gma_device.c
··· 15 15 struct pci_dev *pci_root = 16 16 pci_get_domain_bus_and_slot(pci_domain_nr(pdev->bus), 17 17 0, 0); 18 - struct drm_psb_private *dev_priv = dev->dev_private; 18 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 19 19 20 20 /*pci_write_config_dword(pci_root, 0xD4, 0x00C32004);*/ 21 21 /*pci_write_config_dword(pci_root, 0xD0, 0xE0033000);*/
+7 -7
drivers/gpu/drm/gma500/gma_display.c
··· 51 51 struct drm_framebuffer *old_fb) 52 52 { 53 53 struct drm_device *dev = crtc->dev; 54 - struct drm_psb_private *dev_priv = dev->dev_private; 54 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 55 55 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 56 56 struct drm_framebuffer *fb = crtc->primary->fb; 57 57 struct gtt_range *gtt; ··· 136 136 void gma_crtc_load_lut(struct drm_crtc *crtc) 137 137 { 138 138 struct drm_device *dev = crtc->dev; 139 - struct drm_psb_private *dev_priv = dev->dev_private; 139 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 140 140 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 141 141 const struct psb_offset *map = &dev_priv->regmap[gma_crtc->pipe]; 142 142 int palreg = map->palette; ··· 189 189 void gma_crtc_dpms(struct drm_crtc *crtc, int mode) 190 190 { 191 191 struct drm_device *dev = crtc->dev; 192 - struct drm_psb_private *dev_priv = dev->dev_private; 192 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 193 193 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 194 194 int pipe = gma_crtc->pipe; 195 195 const struct psb_offset *map = &dev_priv->regmap[pipe]; ··· 324 324 uint32_t width, uint32_t height) 325 325 { 326 326 struct drm_device *dev = crtc->dev; 327 - struct drm_psb_private *dev_priv = dev->dev_private; 327 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 328 328 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 329 329 int pipe = gma_crtc->pipe; 330 330 uint32_t control = (pipe == 0) ? CURACNTR : CURBCNTR; ··· 553 553 struct drm_modeset_acquire_ctx *ctx) 554 554 { 555 555 struct drm_device *dev = set->crtc->dev; 556 - struct drm_psb_private *dev_priv = dev->dev_private; 556 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 557 557 int ret; 558 558 559 559 if (!dev_priv->rpm_enabled) ··· 572 572 void gma_crtc_save(struct drm_crtc *crtc) 573 573 { 574 574 struct drm_device *dev = crtc->dev; 575 - struct drm_psb_private *dev_priv = dev->dev_private; 575 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 576 576 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 577 577 struct psb_intel_crtc_state *crtc_state = gma_crtc->crtc_state; 578 578 const struct psb_offset *map = &dev_priv->regmap[gma_crtc->pipe]; ··· 615 615 void gma_crtc_restore(struct drm_crtc *crtc) 616 616 { 617 617 struct drm_device *dev = crtc->dev; 618 - struct drm_psb_private *dev_priv = dev->dev_private; 618 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 619 619 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 620 620 struct psb_intel_crtc_state *crtc_state = gma_crtc->crtc_state; 621 621 const struct psb_offset *map = &dev_priv->regmap[gma_crtc->pipe];
+9 -9
drivers/gpu/drm/gma500/gtt.c
··· 53 53 */ 54 54 static u32 __iomem *psb_gtt_entry(struct drm_device *dev, struct gtt_range *r) 55 55 { 56 - struct drm_psb_private *dev_priv = dev->dev_private; 56 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 57 57 unsigned long offset; 58 58 59 59 offset = r->resource.start - dev_priv->gtt_mem->start; ··· 118 118 */ 119 119 static void psb_gtt_remove(struct drm_device *dev, struct gtt_range *r) 120 120 { 121 - struct drm_psb_private *dev_priv = dev->dev_private; 121 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 122 122 u32 __iomem *gtt_slot; 123 123 u32 pte; 124 124 int i; ··· 188 188 { 189 189 int ret = 0; 190 190 struct drm_device *dev = gt->gem.dev; 191 - struct drm_psb_private *dev_priv = dev->dev_private; 191 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 192 192 u32 gpu_base = dev_priv->gtt.gatt_start; 193 193 194 194 mutex_lock(&dev_priv->gtt_mutex); ··· 226 226 void psb_gtt_unpin(struct gtt_range *gt) 227 227 { 228 228 struct drm_device *dev = gt->gem.dev; 229 - struct drm_psb_private *dev_priv = dev->dev_private; 229 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 230 230 u32 gpu_base = dev_priv->gtt.gatt_start; 231 231 232 232 mutex_lock(&dev_priv->gtt_mutex); ··· 266 266 struct gtt_range *psb_gtt_alloc_range(struct drm_device *dev, int len, 267 267 const char *name, int backed, u32 align) 268 268 { 269 - struct drm_psb_private *dev_priv = dev->dev_private; 269 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 270 270 struct gtt_range *gt; 271 271 struct resource *r = dev_priv->gtt_mem; 272 272 int ret; ··· 322 322 323 323 static void psb_gtt_alloc(struct drm_device *dev) 324 324 { 325 - struct drm_psb_private *dev_priv = dev->dev_private; 325 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 326 326 init_rwsem(&dev_priv->gtt.sem); 327 327 } 328 328 329 329 void psb_gtt_takedown(struct drm_device *dev) 330 330 { 331 - struct drm_psb_private *dev_priv = dev->dev_private; 331 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 332 332 struct pci_dev *pdev = to_pci_dev(dev->dev); 333 333 334 334 if (dev_priv->gtt_map) { ··· 347 347 348 348 int psb_gtt_init(struct drm_device *dev, int resume) 349 349 { 350 - struct drm_psb_private *dev_priv = dev->dev_private; 350 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 351 351 struct pci_dev *pdev = to_pci_dev(dev->dev); 352 352 unsigned gtt_pages; 353 353 unsigned long stolen_size, vram_stolen_size; ··· 496 496 497 497 int psb_gtt_restore(struct drm_device *dev) 498 498 { 499 - struct drm_psb_private *dev_priv = dev->dev_private; 499 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 500 500 struct resource *r = dev_priv->gtt_mem->child; 501 501 struct gtt_range *range; 502 502 unsigned int restored = 0, total = 0, size = 0;
+5 -5
drivers/gpu/drm/gma500/intel_bios.c
··· 207 207 208 208 lvds_bl = kmemdup(vbt_lvds_bl, sizeof(*vbt_lvds_bl), GFP_KERNEL); 209 209 if (!lvds_bl) { 210 - dev_err(dev_priv->dev->dev, "out of memory for backlight data\n"); 210 + dev_err(dev_priv->dev.dev, "out of memory for backlight data\n"); 211 211 return; 212 212 } 213 213 dev_priv->lvds_bl = lvds_bl; ··· 248 248 panel_fixed_mode = kzalloc(sizeof(*panel_fixed_mode), 249 249 GFP_KERNEL); 250 250 if (panel_fixed_mode == NULL) { 251 - dev_err(dev_priv->dev->dev, "out of memory for fixed panel mode\n"); 251 + dev_err(dev_priv->dev.dev, "out of memory for fixed panel mode\n"); 252 252 return; 253 253 } 254 254 ··· 259 259 dev_priv->lfp_lvds_vbt_mode = panel_fixed_mode; 260 260 drm_mode_debug_printmodeline(panel_fixed_mode); 261 261 } else { 262 - dev_dbg(dev_priv->dev->dev, "ignoring invalid LVDS VBT\n"); 262 + dev_dbg(dev_priv->dev.dev, "ignoring invalid LVDS VBT\n"); 263 263 dev_priv->lvds_vbt = 0; 264 264 kfree(panel_fixed_mode); 265 265 } ··· 515 515 */ 516 516 int psb_intel_init_bios(struct drm_device *dev) 517 517 { 518 - struct drm_psb_private *dev_priv = dev->dev_private; 518 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 519 519 struct pci_dev *pdev = to_pci_dev(dev->dev); 520 520 struct vbt_header *vbt = NULL; 521 521 struct bdb_header *bdb = NULL; ··· 579 579 */ 580 580 void psb_intel_destroy_bios(struct drm_device *dev) 581 581 { 582 - struct drm_psb_private *dev_priv = dev->dev_private; 582 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 583 583 584 584 kfree(dev_priv->sdvo_lvds_vbt_mode); 585 585 kfree(dev_priv->lfp_lvds_vbt_mode);
+6 -6
drivers/gpu/drm/gma500/intel_gmbus.c
··· 75 75 void 76 76 gma_intel_i2c_reset(struct drm_device *dev) 77 77 { 78 - struct drm_psb_private *dev_priv = dev->dev_private; 78 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 79 79 GMBUS_REG_WRITE(GMBUS0, 0); 80 80 } 81 81 ··· 196 196 "gma500 GPIO%c", "?BACDE?F"[pin]); 197 197 gpio->adapter.owner = THIS_MODULE; 198 198 gpio->adapter.algo_data = &gpio->algo; 199 - gpio->adapter.dev.parent = dev_priv->dev->dev; 199 + gpio->adapter.dev.parent = dev_priv->dev.dev; 200 200 gpio->algo.setsda = set_data; 201 201 gpio->algo.setscl = set_clock; 202 202 gpio->algo.getsda = get_data; ··· 226 226 adapter); 227 227 int ret; 228 228 229 - gma_intel_i2c_reset(dev_priv->dev); 229 + gma_intel_i2c_reset(&dev_priv->dev); 230 230 231 231 intel_i2c_quirk_set(dev_priv, true); 232 232 set_data(gpio, 1); ··· 394 394 "reserved", 395 395 "dpd", 396 396 }; 397 - struct drm_psb_private *dev_priv = dev->dev_private; 397 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 398 398 int ret, i; 399 399 400 400 dev_priv->gmbus = kcalloc(GMBUS_NUM_PORTS, sizeof(struct intel_gmbus), ··· 432 432 bus->force_bit = intel_gpio_create(dev_priv, i); 433 433 } 434 434 435 - gma_intel_i2c_reset(dev_priv->dev); 435 + gma_intel_i2c_reset(&dev_priv->dev); 436 436 437 437 return 0; 438 438 ··· 480 480 481 481 void gma_intel_teardown_gmbus(struct drm_device *dev) 482 482 { 483 - struct drm_psb_private *dev_priv = dev->dev_private; 483 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 484 484 int i; 485 485 486 486 if (dev_priv->gmbus == NULL)
+5 -6
drivers/gpu/drm/gma500/mid_bios.c
··· 18 18 19 19 static void mid_get_fuse_settings(struct drm_device *dev) 20 20 { 21 - struct drm_psb_private *dev_priv = dev->dev_private; 21 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 22 22 struct pci_dev *pdev = to_pci_dev(dev->dev); 23 23 struct pci_dev *pci_root = 24 24 pci_get_domain_bus_and_slot(pci_domain_nr(pdev->bus), ··· 94 94 static void mid_get_pci_revID(struct drm_psb_private *dev_priv) 95 95 { 96 96 uint32_t platform_rev_id = 0; 97 - struct pci_dev *pdev = to_pci_dev(dev_priv->dev->dev); 97 + struct pci_dev *pdev = to_pci_dev(dev_priv->dev.dev); 98 98 int domain = pci_domain_nr(pdev->bus); 99 99 struct pci_dev *pci_gfx_root = 100 100 pci_get_domain_bus_and_slot(domain, 0, PCI_DEVFN(2, 0)); ··· 106 106 pci_read_config_dword(pci_gfx_root, 0x08, &platform_rev_id); 107 107 dev_priv->platform_rev_id = (uint8_t) platform_rev_id; 108 108 pci_dev_put(pci_gfx_root); 109 - dev_dbg(dev_priv->dev->dev, "platform_rev_id is %x\n", 110 - dev_priv->platform_rev_id); 109 + dev_dbg(dev_priv->dev.dev, "platform_rev_id is %x\n", dev_priv->platform_rev_id); 111 110 } 112 111 113 112 struct mid_vbt_header { ··· 269 270 270 271 static void mid_get_vbt_data(struct drm_psb_private *dev_priv) 271 272 { 272 - struct drm_device *dev = dev_priv->dev; 273 + struct drm_device *dev = &dev_priv->dev; 273 274 struct pci_dev *pdev = to_pci_dev(dev->dev); 274 275 u32 addr; 275 276 u8 __iomem *vbt_virtual; ··· 324 325 325 326 int mid_chip_setup(struct drm_device *dev) 326 327 { 327 - struct drm_psb_private *dev_priv = dev->dev_private; 328 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 328 329 mid_get_fuse_settings(dev); 329 330 mid_get_vbt_data(dev_priv); 330 331 mid_get_pci_revID(dev_priv);
+6 -6
drivers/gpu/drm/gma500/mmu.c
··· 66 66 static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver, int force) 67 67 { 68 68 struct drm_device *dev = driver->dev; 69 - struct drm_psb_private *dev_priv = dev->dev_private; 69 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 70 70 71 71 if (atomic_read(&driver->needs_tlbflush) || force) { 72 72 uint32_t val = PSB_RSGX32(PSB_CR_BIF_CTRL); ··· 94 94 void psb_mmu_flush(struct psb_mmu_driver *driver) 95 95 { 96 96 struct drm_device *dev = driver->dev; 97 - struct drm_psb_private *dev_priv = dev->dev_private; 97 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 98 98 uint32_t val; 99 99 100 100 down_write(&driver->sem); ··· 120 120 void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context) 121 121 { 122 122 struct drm_device *dev = pd->driver->dev; 123 - struct drm_psb_private *dev_priv = dev->dev_private; 123 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 124 124 uint32_t offset = (hw_context == 0) ? PSB_CR_BIF_DIR_LIST_BASE0 : 125 125 PSB_CR_BIF_DIR_LIST_BASE1 + hw_context * 4; 126 126 ··· 230 230 { 231 231 struct psb_mmu_driver *driver = pd->driver; 232 232 struct drm_device *dev = driver->dev; 233 - struct drm_psb_private *dev_priv = dev->dev_private; 233 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 234 234 struct psb_mmu_pt *pt; 235 235 int i; 236 236 ··· 409 409 void psb_mmu_driver_takedown(struct psb_mmu_driver *driver) 410 410 { 411 411 struct drm_device *dev = driver->dev; 412 - struct drm_psb_private *dev_priv = dev->dev_private; 412 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 413 413 414 414 PSB_WSGX32(driver->bif_ctrl, PSB_CR_BIF_CTRL); 415 415 psb_mmu_free_pagedir(driver->default_pd); ··· 422 422 atomic_t *msvdx_mmu_invaldc) 423 423 { 424 424 struct psb_mmu_driver *driver; 425 - struct drm_psb_private *dev_priv = dev->dev_private; 425 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 426 426 427 427 driver = kmalloc(sizeof(*driver), GFP_KERNEL); 428 428
+4 -4
drivers/gpu/drm/gma500/oaktrail_crtc.c
··· 82 82 { 83 83 const struct gma_limit_t *limit = NULL; 84 84 struct drm_device *dev = crtc->dev; 85 - struct drm_psb_private *dev_priv = dev->dev_private; 85 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 86 86 87 87 if (gma_pipe_has_type(crtc, INTEL_OUTPUT_LVDS) 88 88 || gma_pipe_has_type(crtc, INTEL_OUTPUT_MIPI)) { ··· 214 214 static void oaktrail_crtc_dpms(struct drm_crtc *crtc, int mode) 215 215 { 216 216 struct drm_device *dev = crtc->dev; 217 - struct drm_psb_private *dev_priv = dev->dev_private; 217 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 218 218 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 219 219 int pipe = gma_crtc->pipe; 220 220 const struct psb_offset *map = &dev_priv->regmap[pipe]; ··· 361 361 { 362 362 struct drm_device *dev = crtc->dev; 363 363 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 364 - struct drm_psb_private *dev_priv = dev->dev_private; 364 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 365 365 int pipe = gma_crtc->pipe; 366 366 const struct psb_offset *map = &dev_priv->regmap[pipe]; 367 367 int refclk = 0; ··· 589 589 int x, int y, struct drm_framebuffer *old_fb) 590 590 { 591 591 struct drm_device *dev = crtc->dev; 592 - struct drm_psb_private *dev_priv = dev->dev_private; 592 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 593 593 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 594 594 struct drm_framebuffer *fb = crtc->primary->fb; 595 595 int pipe = gma_crtc->pipe;
+10 -10
drivers/gpu/drm/gma500/oaktrail_device.c
··· 20 20 21 21 static int oaktrail_output_init(struct drm_device *dev) 22 22 { 23 - struct drm_psb_private *dev_priv = dev->dev_private; 23 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 24 24 if (dev_priv->iLVDS_enable) 25 25 oaktrail_lvds_init(dev, &dev_priv->mode_dev); 26 26 else ··· 51 51 static int oaktrail_set_brightness(struct backlight_device *bd) 52 52 { 53 53 struct drm_device *dev = bl_get_data(oaktrail_backlight_device); 54 - struct drm_psb_private *dev_priv = dev->dev_private; 54 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 55 55 int level = bd->props.brightness; 56 56 u32 blc_pwm_ctl; 57 57 u32 max_pwm_blc; ··· 96 96 97 97 static int device_backlight_init(struct drm_device *dev) 98 98 { 99 - struct drm_psb_private *dev_priv = dev->dev_private; 99 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 100 100 unsigned long core_clock; 101 101 u16 bl_max_freq; 102 102 uint32_t value; ··· 133 133 134 134 static int oaktrail_backlight_init(struct drm_device *dev) 135 135 { 136 - struct drm_psb_private *dev_priv = dev->dev_private; 136 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 137 137 int ret; 138 138 struct backlight_properties props; 139 139 ··· 175 175 */ 176 176 static int oaktrail_save_display_registers(struct drm_device *dev) 177 177 { 178 - struct drm_psb_private *dev_priv = dev->dev_private; 178 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 179 179 struct psb_save_area *regs = &dev_priv->regs; 180 180 struct psb_pipe *p = &regs->pipe[0]; 181 181 int i; ··· 289 289 */ 290 290 static int oaktrail_restore_display_registers(struct drm_device *dev) 291 291 { 292 - struct drm_psb_private *dev_priv = dev->dev_private; 292 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 293 293 struct psb_save_area *regs = &dev_priv->regs; 294 294 struct psb_pipe *p = &regs->pipe[0]; 295 295 u32 pp_stat; ··· 404 404 */ 405 405 static int oaktrail_power_down(struct drm_device *dev) 406 406 { 407 - struct drm_psb_private *dev_priv = dev->dev_private; 407 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 408 408 u32 pwr_mask ; 409 409 u32 pwr_sts; 410 410 ··· 428 428 */ 429 429 static int oaktrail_power_up(struct drm_device *dev) 430 430 { 431 - struct drm_psb_private *dev_priv = dev->dev_private; 431 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 432 432 u32 pwr_mask = PSB_PWRGT_DISPLAY_MASK; 433 433 u32 pwr_sts, pwr_cnt; 434 434 ··· 500 500 501 501 static int oaktrail_chip_setup(struct drm_device *dev) 502 502 { 503 - struct drm_psb_private *dev_priv = dev->dev_private; 503 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 504 504 struct pci_dev *pdev = to_pci_dev(dev->dev); 505 505 int ret; 506 506 ··· 524 524 525 525 static void oaktrail_teardown(struct drm_device *dev) 526 526 { 527 - struct drm_psb_private *dev_priv = dev->dev_private; 527 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 528 528 529 529 gma_intel_teardown_gmbus(dev); 530 530 oaktrail_hdmi_teardown(dev);
+9 -9
drivers/gpu/drm/gma500/oaktrail_hdmi.c
··· 130 130 131 131 static void oaktrail_hdmi_audio_enable(struct drm_device *dev) 132 132 { 133 - struct drm_psb_private *dev_priv = dev->dev_private; 133 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 134 134 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 135 135 136 136 HDMI_WRITE(HDMI_HCR, 0x67); ··· 145 145 146 146 static void oaktrail_hdmi_audio_disable(struct drm_device *dev) 147 147 { 148 - struct drm_psb_private *dev_priv = dev->dev_private; 148 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 149 149 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 150 150 151 151 HDMI_WRITE(0x51a8, 0x0); ··· 264 264 struct drm_framebuffer *old_fb) 265 265 { 266 266 struct drm_device *dev = crtc->dev; 267 - struct drm_psb_private *dev_priv = dev->dev_private; 267 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 268 268 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 269 269 int pipe = 1; 270 270 int htot_reg = (pipe == 0) ? HTOTAL_A : HTOTAL_B; ··· 494 494 static int dpms_mode = -1; 495 495 496 496 struct drm_device *dev = encoder->dev; 497 - struct drm_psb_private *dev_priv = dev->dev_private; 497 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 498 498 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 499 499 u32 temp; 500 500 ··· 529 529 { 530 530 enum drm_connector_status status; 531 531 struct drm_device *dev = connector->dev; 532 - struct drm_psb_private *dev_priv = dev->dev_private; 532 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 533 533 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 534 534 u32 temp; 535 535 ··· 665 665 666 666 void oaktrail_hdmi_setup(struct drm_device *dev) 667 667 { 668 - struct drm_psb_private *dev_priv = dev->dev_private; 668 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 669 669 struct pci_dev *pdev; 670 670 struct oaktrail_hdmi_dev *hdmi_dev; 671 671 int ret; ··· 718 718 719 719 void oaktrail_hdmi_teardown(struct drm_device *dev) 720 720 { 721 - struct drm_psb_private *dev_priv = dev->dev_private; 721 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 722 722 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 723 723 struct pci_dev *pdev; 724 724 ··· 735 735 /* save HDMI register state */ 736 736 void oaktrail_hdmi_save(struct drm_device *dev) 737 737 { 738 - struct drm_psb_private *dev_priv = dev->dev_private; 738 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 739 739 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 740 740 struct psb_state *regs = &dev_priv->regs.psb; 741 741 struct psb_pipe *pipeb = &dev_priv->regs.pipe[1]; ··· 788 788 /* restore HDMI register state */ 789 789 void oaktrail_hdmi_restore(struct drm_device *dev) 790 790 { 791 - struct drm_psb_private *dev_priv = dev->dev_private; 791 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 792 792 struct oaktrail_hdmi_dev *hdmi_dev = dev_priv->hdmi_priv; 793 793 struct psb_state *regs = &dev_priv->regs.psb; 794 794 struct psb_pipe *pipeb = &dev_priv->regs.pipe[1];
+7 -7
drivers/gpu/drm/gma500/oaktrail_lvds.c
··· 37 37 bool on) 38 38 { 39 39 u32 pp_status; 40 - struct drm_psb_private *dev_priv = dev->dev_private; 40 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 41 41 42 42 if (!gma_power_begin(dev, true)) 43 43 return; ··· 83 83 struct drm_display_mode *adjusted_mode) 84 84 { 85 85 struct drm_device *dev = encoder->dev; 86 - struct drm_psb_private *dev_priv = dev->dev_private; 86 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 87 87 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 88 88 struct drm_mode_config *mode_config = &dev->mode_config; 89 89 struct drm_connector *connector = NULL; ··· 155 155 static void oaktrail_lvds_prepare(struct drm_encoder *encoder) 156 156 { 157 157 struct drm_device *dev = encoder->dev; 158 - struct drm_psb_private *dev_priv = dev->dev_private; 158 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 159 159 struct gma_encoder *gma_encoder = to_gma_encoder(encoder); 160 160 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 161 161 ··· 171 171 172 172 static u32 oaktrail_lvds_get_max_backlight(struct drm_device *dev) 173 173 { 174 - struct drm_psb_private *dev_priv = dev->dev_private; 174 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 175 175 u32 ret; 176 176 177 177 if (gma_power_begin(dev, false)) { ··· 191 191 static void oaktrail_lvds_commit(struct drm_encoder *encoder) 192 192 { 193 193 struct drm_device *dev = encoder->dev; 194 - struct drm_psb_private *dev_priv = dev->dev_private; 194 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 195 195 struct gma_encoder *gma_encoder = to_gma_encoder(encoder); 196 196 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 197 197 ··· 215 215 struct psb_intel_mode_device *mode_dev) 216 216 { 217 217 struct drm_display_mode *mode = NULL; 218 - struct drm_psb_private *dev_priv = dev->dev_private; 218 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 219 219 struct oaktrail_timing_info *ti = &dev_priv->gct_data.DTD; 220 220 221 221 mode_dev->panel_fixed_mode = NULL; ··· 294 294 struct gma_connector *gma_connector; 295 295 struct drm_connector *connector; 296 296 struct drm_encoder *encoder; 297 - struct drm_psb_private *dev_priv = dev->dev_private; 297 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 298 298 struct edid *edid; 299 299 struct i2c_adapter *i2c_adap; 300 300 struct drm_display_mode *scan; /* *modes, *bios_mode; */
+1 -1
drivers/gpu/drm/gma500/oaktrail_lvds_i2c.c
··· 133 133 { 134 134 struct drm_device *dev = encoder->dev; 135 135 struct gma_encoder *gma_encoder = to_gma_encoder(encoder); 136 - struct drm_psb_private *dev_priv = dev->dev_private; 136 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 137 137 struct psb_intel_i2c_chan *chan; 138 138 139 139 chan = kzalloc(sizeof(struct psb_intel_i2c_chan), GFP_KERNEL);
+7 -7
drivers/gpu/drm/gma500/opregion.c
··· 147 147 148 148 static u32 asle_set_backlight(struct drm_device *dev, u32 bclp) 149 149 { 150 - struct drm_psb_private *dev_priv = dev->dev_private; 150 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 151 151 struct opregion_asle *asle = dev_priv->opregion.asle; 152 152 struct backlight_device *bd = dev_priv->backlight_device; 153 153 ··· 190 190 } 191 191 192 192 if (asle_req & ASLE_SET_BACKLIGHT) 193 - asle_stat |= asle_set_backlight(dev_priv->dev, asle->bclp); 193 + asle_stat |= asle_set_backlight(&dev_priv->dev, asle->bclp); 194 194 195 195 asle->aslc = asle_stat; 196 196 ··· 198 198 199 199 void psb_intel_opregion_asle_intr(struct drm_device *dev) 200 200 { 201 - struct drm_psb_private *dev_priv = dev->dev_private; 201 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 202 202 203 203 if (dev_priv->opregion.asle) 204 204 schedule_work(&dev_priv->opregion.asle_work); ··· 211 211 212 212 void psb_intel_opregion_enable_asle(struct drm_device *dev) 213 213 { 214 - struct drm_psb_private *dev_priv = dev->dev_private; 214 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 215 215 struct opregion_asle *asle = dev_priv->opregion.asle; 216 216 217 217 if (asle && system_opregion ) { ··· 258 258 259 259 void psb_intel_opregion_init(struct drm_device *dev) 260 260 { 261 - struct drm_psb_private *dev_priv = dev->dev_private; 261 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 262 262 struct psb_intel_opregion *opregion = &dev_priv->opregion; 263 263 264 264 if (!opregion->header) ··· 278 278 279 279 void psb_intel_opregion_fini(struct drm_device *dev) 280 280 { 281 - struct drm_psb_private *dev_priv = dev->dev_private; 281 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 282 282 struct psb_intel_opregion *opregion = &dev_priv->opregion; 283 283 284 284 if (!opregion->header) ··· 304 304 305 305 int psb_intel_opregion_setup(struct drm_device *dev) 306 306 { 307 - struct drm_psb_private *dev_priv = dev->dev_private; 307 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 308 308 struct pci_dev *pdev = to_pci_dev(dev->dev); 309 309 struct psb_intel_opregion *opregion = &dev_priv->opregion; 310 310 u32 opregion_phy, mboxes;
+10 -10
drivers/gpu/drm/gma500/power.c
··· 47 47 */ 48 48 void gma_power_init(struct drm_device *dev) 49 49 { 50 - struct drm_psb_private *dev_priv = dev->dev_private; 50 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 51 51 52 52 /* FIXME: Move APM/OSPM base into relevant device code */ 53 53 dev_priv->apm_base = dev_priv->apm_reg & 0xffff; ··· 82 82 */ 83 83 static void gma_suspend_display(struct drm_device *dev) 84 84 { 85 - struct drm_psb_private *dev_priv = dev->dev_private; 85 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 86 86 87 87 if (dev_priv->suspended) 88 88 return; ··· 101 101 static void gma_resume_display(struct pci_dev *pdev) 102 102 { 103 103 struct drm_device *dev = pci_get_drvdata(pdev); 104 - struct drm_psb_private *dev_priv = dev->dev_private; 104 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 105 105 106 106 /* turn on the display power island */ 107 107 dev_priv->ops->power_up(dev); ··· 125 125 static void gma_suspend_pci(struct pci_dev *pdev) 126 126 { 127 127 struct drm_device *dev = pci_get_drvdata(pdev); 128 - struct drm_psb_private *dev_priv = dev->dev_private; 128 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 129 129 int bsm, vbt; 130 130 131 131 if (dev_priv->suspended) ··· 155 155 static bool gma_resume_pci(struct pci_dev *pdev) 156 156 { 157 157 struct drm_device *dev = pci_get_drvdata(pdev); 158 - struct drm_psb_private *dev_priv = dev->dev_private; 158 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 159 159 int ret; 160 160 161 161 if (!dev_priv->suspended) ··· 189 189 { 190 190 struct pci_dev *pdev = to_pci_dev(_dev); 191 191 struct drm_device *dev = pci_get_drvdata(pdev); 192 - struct drm_psb_private *dev_priv = dev->dev_private; 192 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 193 193 194 194 mutex_lock(&power_mutex); 195 195 if (!dev_priv->suspended) { ··· 234 234 */ 235 235 bool gma_power_is_on(struct drm_device *dev) 236 236 { 237 - struct drm_psb_private *dev_priv = dev->dev_private; 237 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 238 238 return dev_priv->display_power; 239 239 } 240 240 ··· 248 248 */ 249 249 bool gma_power_begin(struct drm_device *dev, bool force_on) 250 250 { 251 - struct drm_psb_private *dev_priv = dev->dev_private; 251 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 252 252 struct pci_dev *pdev = to_pci_dev(dev->dev); 253 253 int ret; 254 254 unsigned long flags; ··· 288 288 */ 289 289 void gma_power_end(struct drm_device *dev) 290 290 { 291 - struct drm_psb_private *dev_priv = dev->dev_private; 291 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 292 292 unsigned long flags; 293 293 spin_lock_irqsave(&power_ctrl_lock, flags); 294 294 dev_priv->display_count--; ··· 310 310 int psb_runtime_idle(struct device *dev) 311 311 { 312 312 struct drm_device *drmdev = pci_get_drvdata(to_pci_dev(dev)); 313 - struct drm_psb_private *dev_priv = drmdev->dev_private; 313 + struct drm_psb_private *dev_priv = to_drm_psb_private(drmdev); 314 314 if (dev_priv->display_count) 315 315 return 0; 316 316 else
+8 -8
drivers/gpu/drm/gma500/psb_device.c
··· 18 18 19 19 static int psb_output_init(struct drm_device *dev) 20 20 { 21 - struct drm_psb_private *dev_priv = dev->dev_private; 21 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 22 22 psb_intel_lvds_init(dev, &dev_priv->mode_dev); 23 23 psb_intel_sdvo_init(dev, SDVOB); 24 24 return 0; ··· 55 55 56 56 static int psb_backlight_setup(struct drm_device *dev) 57 57 { 58 - struct drm_psb_private *dev_priv = dev->dev_private; 58 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 59 59 unsigned long core_clock; 60 60 /* u32 bl_max_freq; */ 61 61 /* unsigned long value; */ ··· 110 110 111 111 static int psb_backlight_init(struct drm_device *dev) 112 112 { 113 - struct drm_psb_private *dev_priv = dev->dev_private; 113 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 114 114 int ret; 115 115 struct backlight_properties props; 116 116 ··· 149 149 150 150 static void psb_init_pm(struct drm_device *dev) 151 151 { 152 - struct drm_psb_private *dev_priv = dev->dev_private; 152 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 153 153 154 154 u32 gating = PSB_RSGX32(PSB_CR_CLKGATECTL); 155 155 gating &= ~3; /* Disable 2D clock gating */ ··· 167 167 */ 168 168 static int psb_save_display_registers(struct drm_device *dev) 169 169 { 170 - struct drm_psb_private *dev_priv = dev->dev_private; 170 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 171 171 struct drm_crtc *crtc; 172 172 struct gma_connector *connector; 173 173 struct psb_state *regs = &dev_priv->regs.psb; ··· 205 205 */ 206 206 static int psb_restore_display_registers(struct drm_device *dev) 207 207 { 208 - struct drm_psb_private *dev_priv = dev->dev_private; 208 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 209 209 struct drm_crtc *crtc; 210 210 struct gma_connector *connector; 211 211 struct psb_state *regs = &dev_priv->regs.psb; ··· 300 300 301 301 static int psb_chip_setup(struct drm_device *dev) 302 302 { 303 - struct drm_psb_private *dev_priv = dev->dev_private; 303 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 304 304 dev_priv->regmap = psb_regmap; 305 305 gma_get_core_freq(dev); 306 306 gma_intel_setup_gmbus(dev); ··· 311 311 312 312 static void psb_chip_teardown(struct drm_device *dev) 313 313 { 314 - struct drm_psb_private *dev_priv = dev->dev_private; 314 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 315 315 psb_lid_timer_takedown(dev_priv); 316 316 gma_intel_teardown_gmbus(dev); 317 317 }
+69 -80
drivers/gpu/drm/gma500/psb_drv.c
··· 124 124 125 125 static int psb_do_init(struct drm_device *dev) 126 126 { 127 - struct drm_psb_private *dev_priv = dev->dev_private; 127 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 128 128 struct psb_gtt *pg = &dev_priv->gtt; 129 129 130 130 uint32_t stolen_gtt; ··· 163 163 164 164 static void psb_driver_unload(struct drm_device *dev) 165 165 { 166 - struct drm_psb_private *dev_priv = dev->dev_private; 166 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 167 167 168 168 /* TODO: Kill vblank etc here */ 169 169 170 - if (dev_priv) { 171 - if (dev_priv->backlight_device) 172 - gma_backlight_exit(dev); 173 - psb_modeset_cleanup(dev); 170 + if (dev_priv->backlight_device) 171 + gma_backlight_exit(dev); 172 + psb_modeset_cleanup(dev); 174 173 175 - if (dev_priv->ops->chip_teardown) 176 - dev_priv->ops->chip_teardown(dev); 174 + if (dev_priv->ops->chip_teardown) 175 + dev_priv->ops->chip_teardown(dev); 177 176 178 - psb_intel_opregion_fini(dev); 177 + psb_intel_opregion_fini(dev); 179 178 180 - if (dev_priv->pf_pd) { 181 - psb_mmu_free_pagedir(dev_priv->pf_pd); 182 - dev_priv->pf_pd = NULL; 183 - } 184 - if (dev_priv->mmu) { 185 - struct psb_gtt *pg = &dev_priv->gtt; 186 - 187 - down_read(&pg->sem); 188 - psb_mmu_remove_pfn_sequence( 189 - psb_mmu_get_default_pd 190 - (dev_priv->mmu), 191 - pg->mmu_gatt_start, 192 - dev_priv->vram_stolen_size >> PAGE_SHIFT); 193 - up_read(&pg->sem); 194 - psb_mmu_driver_takedown(dev_priv->mmu); 195 - dev_priv->mmu = NULL; 196 - } 197 - psb_gtt_takedown(dev); 198 - if (dev_priv->scratch_page) { 199 - set_pages_wb(dev_priv->scratch_page, 1); 200 - __free_page(dev_priv->scratch_page); 201 - dev_priv->scratch_page = NULL; 202 - } 203 - if (dev_priv->vdc_reg) { 204 - iounmap(dev_priv->vdc_reg); 205 - dev_priv->vdc_reg = NULL; 206 - } 207 - if (dev_priv->sgx_reg) { 208 - iounmap(dev_priv->sgx_reg); 209 - dev_priv->sgx_reg = NULL; 210 - } 211 - if (dev_priv->aux_reg) { 212 - iounmap(dev_priv->aux_reg); 213 - dev_priv->aux_reg = NULL; 214 - } 215 - pci_dev_put(dev_priv->aux_pdev); 216 - pci_dev_put(dev_priv->lpc_pdev); 217 - 218 - /* Destroy VBT data */ 219 - psb_intel_destroy_bios(dev); 220 - 221 - kfree(dev_priv); 222 - dev->dev_private = NULL; 179 + if (dev_priv->pf_pd) { 180 + psb_mmu_free_pagedir(dev_priv->pf_pd); 181 + dev_priv->pf_pd = NULL; 223 182 } 183 + if (dev_priv->mmu) { 184 + struct psb_gtt *pg = &dev_priv->gtt; 185 + 186 + down_read(&pg->sem); 187 + psb_mmu_remove_pfn_sequence( 188 + psb_mmu_get_default_pd 189 + (dev_priv->mmu), 190 + pg->mmu_gatt_start, 191 + dev_priv->vram_stolen_size >> PAGE_SHIFT); 192 + up_read(&pg->sem); 193 + psb_mmu_driver_takedown(dev_priv->mmu); 194 + dev_priv->mmu = NULL; 195 + } 196 + psb_gtt_takedown(dev); 197 + if (dev_priv->scratch_page) { 198 + set_pages_wb(dev_priv->scratch_page, 1); 199 + __free_page(dev_priv->scratch_page); 200 + dev_priv->scratch_page = NULL; 201 + } 202 + if (dev_priv->vdc_reg) { 203 + iounmap(dev_priv->vdc_reg); 204 + dev_priv->vdc_reg = NULL; 205 + } 206 + if (dev_priv->sgx_reg) { 207 + iounmap(dev_priv->sgx_reg); 208 + dev_priv->sgx_reg = NULL; 209 + } 210 + if (dev_priv->aux_reg) { 211 + iounmap(dev_priv->aux_reg); 212 + dev_priv->aux_reg = NULL; 213 + } 214 + pci_dev_put(dev_priv->aux_pdev); 215 + pci_dev_put(dev_priv->lpc_pdev); 216 + 217 + /* Destroy VBT data */ 218 + psb_intel_destroy_bios(dev); 219 + 224 220 gma_power_uninit(dev); 221 + } 222 + 223 + static void psb_device_release(void *data) 224 + { 225 + struct drm_device *dev = data; 226 + 227 + psb_driver_unload(dev); 225 228 } 226 229 227 230 static int psb_driver_load(struct drm_device *dev, unsigned long flags) 228 231 { 229 232 struct pci_dev *pdev = to_pci_dev(dev->dev); 230 - struct drm_psb_private *dev_priv; 233 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 231 234 unsigned long resource_start, resource_len; 232 235 unsigned long irqflags; 233 236 int ret = -ENOMEM; ··· 238 235 struct gma_encoder *gma_encoder; 239 236 struct psb_gtt *pg; 240 237 241 - /* allocating and initializing driver private data */ 242 - dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); 243 - if (dev_priv == NULL) 244 - return -ENOMEM; 238 + /* initializing driver private data */ 245 239 246 240 dev_priv->ops = (struct psb_ops *)flags; 247 - dev_priv->dev = dev; 248 - dev->dev_private = (void *) dev_priv; 249 241 250 242 pg = &dev_priv->gtt; 251 243 ··· 407 409 pm_runtime_enable(dev->dev); 408 410 pm_runtime_set_active(dev->dev); 409 411 #endif 410 - /* Intel drm driver load is done, continue doing pvr load */ 411 - return 0; 412 + 413 + return devm_add_action_or_reset(dev->dev, psb_device_release, dev); 414 + 412 415 out_err: 413 416 psb_driver_unload(dev); 414 417 return ret; ··· 430 431 { 431 432 struct drm_file *file_priv = filp->private_data; 432 433 struct drm_device *dev = file_priv->minor->dev; 433 - struct drm_psb_private *dev_priv = dev->dev_private; 434 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 434 435 static unsigned int runtime_allowed; 435 436 436 437 if (runtime_allowed == 1 && dev_priv->is_lvds_on) { ··· 444 445 445 446 static int psb_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 446 447 { 448 + struct drm_psb_private *dev_priv; 447 449 struct drm_device *dev; 448 450 int ret; 449 451 450 - ret = pci_enable_device(pdev); 452 + ret = pcim_enable_device(pdev); 451 453 if (ret) 452 454 return ret; 453 455 454 - dev = drm_dev_alloc(&driver, &pdev->dev); 455 - if (IS_ERR(dev)) { 456 - ret = PTR_ERR(dev); 457 - goto err_pci_disable_device; 458 - } 456 + dev_priv = devm_drm_dev_alloc(&pdev->dev, &driver, struct drm_psb_private, dev); 457 + if (IS_ERR(dev_priv)) 458 + return PTR_ERR(dev_priv); 459 + dev = &dev_priv->dev; 459 460 460 461 pci_set_drvdata(pdev, dev); 461 462 462 463 ret = psb_driver_load(dev, ent->driver_data); 463 464 if (ret) 464 - goto err_drm_dev_put; 465 + return ret; 465 466 466 467 ret = drm_dev_register(dev, ent->driver_data); 467 468 if (ret) 468 - goto err_psb_driver_unload; 469 + return ret; 469 470 470 471 return 0; 471 - 472 - err_psb_driver_unload: 473 - psb_driver_unload(dev); 474 - err_drm_dev_put: 475 - drm_dev_put(dev); 476 - err_pci_disable_device: 477 - pci_disable_device(pdev); 478 - return ret; 479 472 } 480 473 481 474 static void psb_pci_remove(struct pci_dev *pdev) ··· 475 484 struct drm_device *dev = pci_get_drvdata(pdev); 476 485 477 486 drm_dev_unregister(dev); 478 - psb_driver_unload(dev); 479 - drm_dev_put(dev); 480 487 } 481 488 482 489 static const struct dev_pm_ops psb_pm_ops = {
+12 -12
drivers/gpu/drm/gma500/psb_drv.h
··· 389 389 struct intel_scu_ipc_dev; 390 390 391 391 struct drm_psb_private { 392 - struct drm_device *dev; 392 + struct drm_device dev; 393 + 393 394 struct pci_dev *aux_pdev; /* Currently only used by mrst */ 394 395 struct pci_dev *lpc_pdev; /* Currently only used by mrst */ 395 396 const struct psb_ops *ops; ··· 568 567 uint8_t panel_type; 569 568 }; 570 569 570 + static inline struct drm_psb_private *to_drm_psb_private(struct drm_device *dev) 571 + { 572 + return container_of(dev, struct drm_psb_private, dev); 573 + } 571 574 572 575 /* Operations for each board type */ 573 576 struct psb_ops { ··· 622 617 623 618 extern int drm_crtc_probe_output_modes(struct drm_device *dev, int, int); 624 619 extern int drm_pick_crtcs(struct drm_device *dev); 625 - 626 - static inline struct drm_psb_private *psb_priv(struct drm_device *dev) 627 - { 628 - return (struct drm_psb_private *) dev->dev_private; 629 - } 630 620 631 621 /* psb_irq.c */ 632 622 extern void psb_irq_uninstall_islands(struct drm_device *dev, int hw_islands); ··· 729 729 730 730 static inline uint32_t REGISTER_READ(struct drm_device *dev, uint32_t reg) 731 731 { 732 - struct drm_psb_private *dev_priv = dev->dev_private; 732 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 733 733 return ioread32(dev_priv->vdc_reg + reg); 734 734 } 735 735 736 736 static inline uint32_t REGISTER_READ_AUX(struct drm_device *dev, uint32_t reg) 737 737 { 738 - struct drm_psb_private *dev_priv = dev->dev_private; 738 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 739 739 return ioread32(dev_priv->aux_reg + reg); 740 740 } 741 741 ··· 761 761 static inline void REGISTER_WRITE(struct drm_device *dev, uint32_t reg, 762 762 uint32_t val) 763 763 { 764 - struct drm_psb_private *dev_priv = dev->dev_private; 764 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 765 765 iowrite32((val), dev_priv->vdc_reg + (reg)); 766 766 } 767 767 768 768 static inline void REGISTER_WRITE_AUX(struct drm_device *dev, uint32_t reg, 769 769 uint32_t val) 770 770 { 771 - struct drm_psb_private *dev_priv = dev->dev_private; 771 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 772 772 iowrite32((val), dev_priv->aux_reg + (reg)); 773 773 } 774 774 ··· 789 789 static inline void REGISTER_WRITE16(struct drm_device *dev, 790 790 uint32_t reg, uint32_t val) 791 791 { 792 - struct drm_psb_private *dev_priv = dev->dev_private; 792 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 793 793 iowrite16((val), dev_priv->vdc_reg + (reg)); 794 794 } 795 795 ··· 798 798 static inline void REGISTER_WRITE8(struct drm_device *dev, 799 799 uint32_t reg, uint32_t val) 800 800 { 801 - struct drm_psb_private *dev_priv = dev->dev_private; 801 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 802 802 iowrite8((val), dev_priv->vdc_reg + (reg)); 803 803 } 804 804
+5 -5
drivers/gpu/drm/gma500/psb_intel_display.c
··· 95 95 struct drm_framebuffer *old_fb) 96 96 { 97 97 struct drm_device *dev = crtc->dev; 98 - struct drm_psb_private *dev_priv = dev->dev_private; 98 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 99 99 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 100 100 const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; 101 101 int pipe = gma_crtc->pipe; ··· 298 298 struct drm_crtc *crtc) 299 299 { 300 300 struct gma_crtc *gma_crtc = to_gma_crtc(crtc); 301 - struct drm_psb_private *dev_priv = dev->dev_private; 301 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 302 302 int pipe = gma_crtc->pipe; 303 303 const struct psb_offset *map = &dev_priv->regmap[pipe]; 304 304 u32 dpll; ··· 380 380 int hsync; 381 381 int vtot; 382 382 int vsync; 383 - struct drm_psb_private *dev_priv = dev->dev_private; 383 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 384 384 struct psb_pipe *p = &dev_priv->regs.pipe[pipe]; 385 385 const struct psb_offset *map = &dev_priv->regmap[pipe]; 386 386 ··· 451 451 static void psb_intel_cursor_init(struct drm_device *dev, 452 452 struct gma_crtc *gma_crtc) 453 453 { 454 - struct drm_psb_private *dev_priv = dev->dev_private; 454 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 455 455 u32 control[3] = { CURACNTR, CURBCNTR, CURCCNTR }; 456 456 u32 base[3] = { CURABASE, CURBBASE, CURCBASE }; 457 457 struct gtt_range *cursor_gt; ··· 481 481 void psb_intel_crtc_init(struct drm_device *dev, int pipe, 482 482 struct psb_intel_mode_device *mode_dev) 483 483 { 484 - struct drm_psb_private *dev_priv = dev->dev_private; 484 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 485 485 struct gma_crtc *gma_crtc; 486 486 int i; 487 487
+14 -17
drivers/gpu/drm/gma500/psb_intel_lvds.c
··· 59 59 */ 60 60 static u32 psb_intel_lvds_get_max_backlight(struct drm_device *dev) 61 61 { 62 - struct drm_psb_private *dev_priv = dev->dev_private; 62 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 63 63 u32 ret; 64 64 65 65 if (gma_power_begin(dev, false)) { ··· 88 88 static int psb_lvds_i2c_set_brightness(struct drm_device *dev, 89 89 unsigned int level) 90 90 { 91 - struct drm_psb_private *dev_priv = 92 - (struct drm_psb_private *)dev->dev_private; 91 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 93 92 94 93 struct psb_intel_i2c_chan *lvds_i2c_bus = dev_priv->lvds_i2c_bus; 95 94 u8 out_buf[2]; ··· 127 128 128 129 static int psb_lvds_pwm_set_brightness(struct drm_device *dev, int level) 129 130 { 130 - struct drm_psb_private *dev_priv = 131 - (struct drm_psb_private *)dev->dev_private; 131 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 132 132 133 133 u32 max_pwm_blc; 134 134 u32 blc_pwm_duty_cycle; ··· 159 161 */ 160 162 void psb_intel_lvds_set_brightness(struct drm_device *dev, int level) 161 163 { 162 - struct drm_psb_private *dev_priv = dev->dev_private; 164 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 163 165 164 166 dev_dbg(dev->dev, "backlight level is %d\n", level); 165 167 ··· 181 183 */ 182 184 static void psb_intel_lvds_set_backlight(struct drm_device *dev, int level) 183 185 { 184 - struct drm_psb_private *dev_priv = dev->dev_private; 186 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 185 187 u32 blc_pwm_ctl; 186 188 187 189 if (gma_power_begin(dev, false)) { ··· 206 208 */ 207 209 static void psb_intel_lvds_set_power(struct drm_device *dev, bool on) 208 210 { 209 - struct drm_psb_private *dev_priv = dev->dev_private; 211 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 210 212 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 211 213 u32 pp_status; 212 214 ··· 252 254 static void psb_intel_lvds_save(struct drm_connector *connector) 253 255 { 254 256 struct drm_device *dev = connector->dev; 255 - struct drm_psb_private *dev_priv = 256 - (struct drm_psb_private *)dev->dev_private; 257 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 257 258 struct gma_encoder *gma_encoder = gma_attached_encoder(connector); 258 259 struct psb_intel_lvds_priv *lvds_priv = 259 260 (struct psb_intel_lvds_priv *)gma_encoder->dev_priv; ··· 332 335 enum drm_mode_status psb_intel_lvds_mode_valid(struct drm_connector *connector, 333 336 struct drm_display_mode *mode) 334 337 { 335 - struct drm_psb_private *dev_priv = connector->dev->dev_private; 338 + struct drm_psb_private *dev_priv = to_drm_psb_private(connector->dev); 336 339 struct gma_encoder *gma_encoder = gma_attached_encoder(connector); 337 340 struct drm_display_mode *fixed_mode = 338 341 dev_priv->mode_dev.panel_fixed_mode; ··· 362 365 struct drm_display_mode *adjusted_mode) 363 366 { 364 367 struct drm_device *dev = encoder->dev; 365 - struct drm_psb_private *dev_priv = dev->dev_private; 368 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 366 369 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 367 370 struct gma_crtc *gma_crtc = to_gma_crtc(encoder->crtc); 368 371 struct drm_encoder *tmp_encoder; ··· 423 426 static void psb_intel_lvds_prepare(struct drm_encoder *encoder) 424 427 { 425 428 struct drm_device *dev = encoder->dev; 426 - struct drm_psb_private *dev_priv = dev->dev_private; 429 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 427 430 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 428 431 429 432 if (!gma_power_begin(dev, true)) ··· 441 444 static void psb_intel_lvds_commit(struct drm_encoder *encoder) 442 445 { 443 446 struct drm_device *dev = encoder->dev; 444 - struct drm_psb_private *dev_priv = dev->dev_private; 447 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 445 448 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 446 449 447 450 if (mode_dev->backlight_duty_cycle == 0) ··· 456 459 struct drm_display_mode *adjusted_mode) 457 460 { 458 461 struct drm_device *dev = encoder->dev; 459 - struct drm_psb_private *dev_priv = dev->dev_private; 462 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 460 463 u32 pfit_control; 461 464 462 465 /* ··· 490 493 static int psb_intel_lvds_get_modes(struct drm_connector *connector) 491 494 { 492 495 struct drm_device *dev = connector->dev; 493 - struct drm_psb_private *dev_priv = dev->dev_private; 496 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 494 497 struct psb_intel_mode_device *mode_dev = &dev_priv->mode_dev; 495 498 struct gma_encoder *gma_encoder = gma_attached_encoder(connector); 496 499 struct psb_intel_lvds_priv *lvds_priv = gma_encoder->dev_priv; ··· 638 641 struct drm_encoder *encoder; 639 642 struct drm_display_mode *scan; /* *modes, *bios_mode; */ 640 643 struct drm_crtc *crtc; 641 - struct drm_psb_private *dev_priv = dev->dev_private; 644 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 642 645 u32 lvds; 643 646 int pipe; 644 647
+5 -5
drivers/gpu/drm/gma500/psb_intel_sdvo.c
··· 1217 1217 static struct edid * 1218 1218 psb_intel_sdvo_get_analog_edid(struct drm_connector *connector) 1219 1219 { 1220 - struct drm_psb_private *dev_priv = connector->dev->dev_private; 1220 + struct drm_psb_private *dev_priv = to_drm_psb_private(connector->dev); 1221 1221 1222 1222 return drm_get_edid(connector, 1223 1223 &dev_priv->gmbus[dev_priv->crt_ddc_pin].adapter); ··· 1486 1486 static void psb_intel_sdvo_get_lvds_modes(struct drm_connector *connector) 1487 1487 { 1488 1488 struct psb_intel_sdvo *psb_intel_sdvo = intel_attached_sdvo(connector); 1489 - struct drm_psb_private *dev_priv = connector->dev->dev_private; 1489 + struct drm_psb_private *dev_priv = to_drm_psb_private(connector->dev); 1490 1490 struct drm_display_mode *newmode; 1491 1491 1492 1492 /* ··· 1570 1570 { 1571 1571 struct psb_intel_sdvo *psb_intel_sdvo = intel_attached_sdvo(connector); 1572 1572 struct psb_intel_sdvo_connector *psb_intel_sdvo_connector = to_psb_intel_sdvo_connector(connector); 1573 - struct drm_psb_private *dev_priv = connector->dev->dev_private; 1573 + struct drm_psb_private *dev_priv = to_drm_psb_private(connector->dev); 1574 1574 uint16_t temp_value; 1575 1575 uint8_t cmd; 1576 1576 int ret; ··· 1878 1878 static u8 1879 1879 psb_intel_sdvo_get_slave_addr(struct drm_device *dev, int sdvo_reg) 1880 1880 { 1881 - struct drm_psb_private *dev_priv = dev->dev_private; 1881 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 1882 1882 struct sdvo_device_mapping *my_mapping, *other_mapping; 1883 1883 1884 1884 if (IS_SDVOB(sdvo_reg)) { ··· 2415 2415 2416 2416 bool psb_intel_sdvo_init(struct drm_device *dev, int sdvo_reg) 2417 2417 { 2418 - struct drm_psb_private *dev_priv = dev->dev_private; 2418 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 2419 2419 struct gma_encoder *gma_encoder; 2420 2420 struct psb_intel_sdvo *psb_intel_sdvo; 2421 2421 int i;
+12 -14
drivers/gpu/drm/gma500/psb_irq.c
··· 76 76 u32 reg = psb_pipestat(pipe); 77 77 dev_priv->pipestat[pipe] |= mask; 78 78 /* Enable the interrupt, clear any pending status */ 79 - if (gma_power_begin(dev_priv->dev, false)) { 79 + if (gma_power_begin(&dev_priv->dev, false)) { 80 80 u32 writeVal = PSB_RVDC32(reg); 81 81 writeVal |= (mask | (mask >> 16)); 82 82 PSB_WVDC32(writeVal, reg); 83 83 (void) PSB_RVDC32(reg); 84 - gma_power_end(dev_priv->dev); 84 + gma_power_end(&dev_priv->dev); 85 85 } 86 86 } 87 87 } ··· 92 92 if ((dev_priv->pipestat[pipe] & mask) != 0) { 93 93 u32 reg = psb_pipestat(pipe); 94 94 dev_priv->pipestat[pipe] &= ~mask; 95 - if (gma_power_begin(dev_priv->dev, false)) { 95 + if (gma_power_begin(&dev_priv->dev, false)) { 96 96 u32 writeVal = PSB_RVDC32(reg); 97 97 writeVal &= ~mask; 98 98 PSB_WVDC32(writeVal, reg); 99 99 (void) PSB_RVDC32(reg); 100 - gma_power_end(dev_priv->dev); 100 + gma_power_end(&dev_priv->dev); 101 101 } 102 102 } 103 103 } ··· 107 107 */ 108 108 static void mid_pipe_event_handler(struct drm_device *dev, int pipe) 109 109 { 110 - struct drm_psb_private *dev_priv = 111 - (struct drm_psb_private *) dev->dev_private; 110 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 112 111 113 112 uint32_t pipe_stat_val = 0; 114 113 uint32_t pipe_stat_reg = psb_pipestat(pipe); ··· 177 178 */ 178 179 static void psb_sgx_interrupt(struct drm_device *dev, u32 stat_1, u32 stat_2) 179 180 { 180 - struct drm_psb_private *dev_priv = dev->dev_private; 181 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 181 182 u32 val, addr; 182 183 183 184 if (stat_1 & _PSB_CE_TWOD_COMPLETE) ··· 225 226 static irqreturn_t psb_irq_handler(int irq, void *arg) 226 227 { 227 228 struct drm_device *dev = arg; 228 - struct drm_psb_private *dev_priv = dev->dev_private; 229 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 229 230 uint32_t vdc_stat, dsp_int = 0, sgx_int = 0, hotplug_int = 0; 230 231 u32 sgx_stat_1, sgx_stat_2; 231 232 int handled = 0; ··· 276 277 277 278 void psb_irq_preinstall(struct drm_device *dev) 278 279 { 279 - struct drm_psb_private *dev_priv = 280 - (struct drm_psb_private *) dev->dev_private; 280 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 281 281 unsigned long irqflags; 282 282 283 283 spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags); ··· 305 307 306 308 void psb_irq_postinstall(struct drm_device *dev) 307 309 { 308 - struct drm_psb_private *dev_priv = dev->dev_private; 310 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 309 311 unsigned long irqflags; 310 312 unsigned int i; 311 313 ··· 354 356 355 357 void psb_irq_uninstall(struct drm_device *dev) 356 358 { 357 - struct drm_psb_private *dev_priv = dev->dev_private; 359 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 358 360 struct pci_dev *pdev = to_pci_dev(dev->dev); 359 361 unsigned long irqflags; 360 362 unsigned int i; ··· 395 397 { 396 398 struct drm_device *dev = crtc->dev; 397 399 unsigned int pipe = crtc->index; 398 - struct drm_psb_private *dev_priv = dev->dev_private; 400 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 399 401 unsigned long irqflags; 400 402 uint32_t reg_val = 0; 401 403 uint32_t pipeconf_reg = mid_pipeconf(pipe); ··· 431 433 { 432 434 struct drm_device *dev = crtc->dev; 433 435 unsigned int pipe = crtc->index; 434 - struct drm_psb_private *dev_priv = dev->dev_private; 436 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 435 437 unsigned long irqflags; 436 438 437 439 spin_lock_irqsave(&dev_priv->irqmask_lock, irqflags);
+1 -1
drivers/gpu/drm/gma500/psb_lid.c
··· 14 14 static void psb_lid_timer_func(struct timer_list *t) 15 15 { 16 16 struct drm_psb_private *dev_priv = from_timer(dev_priv, t, lid_timer); 17 - struct drm_device *dev = (struct drm_device *)dev_priv->dev; 17 + struct drm_device *dev = (struct drm_device *)&dev_priv->dev; 18 18 struct timer_list *lid_timer = &dev_priv->lid_timer; 19 19 unsigned long irq_flags; 20 20 u32 __iomem *lid_state = dev_priv->opregion.lid_state;
+6
drivers/gpu/drm/gud/gud_drv.c
··· 523 523 switch (format) { 524 524 case GUD_DRM_FORMAT_R1: 525 525 fallthrough; 526 + case DRM_FORMAT_R8: 527 + fallthrough; 526 528 case GUD_DRM_FORMAT_XRGB1111: 529 + fallthrough; 530 + case DRM_FORMAT_RGB332: 531 + fallthrough; 532 + case DRM_FORMAT_RGB888: 527 533 if (!xrgb8888_emulation_format) 528 534 xrgb8888_emulation_format = info; 529 535 break;
+12
drivers/gpu/drm/gud/gud_internal.h
··· 80 80 switch (fourcc) { 81 81 case GUD_DRM_FORMAT_R1: 82 82 return GUD_PIXEL_FORMAT_R1; 83 + case DRM_FORMAT_R8: 84 + return GUD_PIXEL_FORMAT_R8; 83 85 case GUD_DRM_FORMAT_XRGB1111: 84 86 return GUD_PIXEL_FORMAT_XRGB1111; 87 + case DRM_FORMAT_RGB332: 88 + return GUD_PIXEL_FORMAT_RGB332; 85 89 case DRM_FORMAT_RGB565: 86 90 return GUD_PIXEL_FORMAT_RGB565; 91 + case DRM_FORMAT_RGB888: 92 + return GUD_PIXEL_FORMAT_RGB888; 87 93 case DRM_FORMAT_XRGB8888: 88 94 return GUD_PIXEL_FORMAT_XRGB8888; 89 95 case DRM_FORMAT_ARGB8888: ··· 104 98 switch (format) { 105 99 case GUD_PIXEL_FORMAT_R1: 106 100 return GUD_DRM_FORMAT_R1; 101 + case GUD_PIXEL_FORMAT_R8: 102 + return DRM_FORMAT_R8; 107 103 case GUD_PIXEL_FORMAT_XRGB1111: 108 104 return GUD_DRM_FORMAT_XRGB1111; 105 + case GUD_PIXEL_FORMAT_RGB332: 106 + return DRM_FORMAT_RGB332; 109 107 case GUD_PIXEL_FORMAT_RGB565: 110 108 return DRM_FORMAT_RGB565; 109 + case GUD_PIXEL_FORMAT_RGB888: 110 + return DRM_FORMAT_RGB888; 111 111 case GUD_PIXEL_FORMAT_XRGB8888: 112 112 return DRM_FORMAT_XRGB8888; 113 113 case GUD_PIXEL_FORMAT_ARGB8888:
+6
drivers/gpu/drm/gud/gud_pipe.c
··· 189 189 ret = -ENOMEM; 190 190 goto end_cpu_access; 191 191 } 192 + } else if (format->format == DRM_FORMAT_R8) { 193 + drm_fb_xrgb8888_to_gray8(buf, vaddr, fb, rect); 194 + } else if (format->format == DRM_FORMAT_RGB332) { 195 + drm_fb_xrgb8888_to_rgb332(buf, vaddr, fb, rect); 192 196 } else if (format->format == DRM_FORMAT_RGB565) { 193 197 drm_fb_xrgb8888_to_rgb565(buf, vaddr, fb, rect, gud_is_big_endian()); 198 + } else if (format->format == DRM_FORMAT_RGB888) { 199 + drm_fb_xrgb8888_to_rgb888(buf, vaddr, fb, rect); 194 200 } else { 195 201 len = gud_xrgb8888_to_color(buf, format, vaddr, fb, rect); 196 202 }
+3 -3
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
··· 182 182 183 183 if (obj->flags & I915_BO_ALLOC_CPU_CLEAR && 184 184 man->use_tt) 185 - page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; 185 + page_flags |= TTM_TT_FLAG_ZERO_ALLOC; 186 186 187 187 ret = ttm_tt_init(&i915_tt->ttm, bo, page_flags, 188 188 i915_ttm_select_tt_caching(obj)); ··· 451 451 if (bo->type == ttm_bo_type_kernel) 452 452 return -EINVAL; 453 453 454 - if (ttm && !(ttm->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC)) 454 + if (ttm && !(ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC)) 455 455 return 0; 456 456 457 457 intel_engine_pm_get(i915->gt.migrate.context->engine); ··· 525 525 526 526 /* Populate ttm with pages if needed. Typically system memory. */ 527 527 if (bo->ttm && (dst_man->use_tt || 528 - (bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED))) { 528 + (bo->ttm->page_flags & TTM_TT_FLAG_SWAPPED))) { 529 529 ret = ttm_tt_populate(bo->bdev, bo->ttm, ctx); 530 530 if (ret) 531 531 return ret;
-2
drivers/gpu/drm/mgag200/mgag200_drv.h
··· 224 224 225 225 enum mga_type type; 226 226 227 - int fb_mtrr; 228 - 229 227 union { 230 228 struct { 231 229 long ref_clk;
+7 -28
drivers/gpu/drm/mgag200/mgag200_mm.c
··· 75 75 return offset - 65536; 76 76 } 77 77 78 - static void mgag200_mm_release(struct drm_device *dev, void *ptr) 79 - { 80 - struct mga_device *mdev = to_mga_device(dev); 81 - struct pci_dev *pdev = to_pci_dev(dev->dev); 82 - 83 - mdev->vram_fb_available = 0; 84 - iounmap(mdev->vram); 85 - arch_io_free_memtype_wc(pci_resource_start(pdev, 0), 86 - pci_resource_len(pdev, 0)); 87 - arch_phys_wc_del(mdev->fb_mtrr); 88 - mdev->fb_mtrr = 0; 89 - } 90 - 91 78 int mgag200_mm_init(struct mga_device *mdev) 92 79 { 93 80 struct drm_device *dev = &mdev->base; 94 81 struct pci_dev *pdev = to_pci_dev(dev->dev); 95 82 u8 misc; 96 83 resource_size_t start, len; 97 - int ret; 98 84 99 85 WREG_ECRT(0x04, 0x00); 100 86 ··· 98 112 return -ENXIO; 99 113 } 100 114 101 - arch_io_reserve_memtype_wc(start, len); 115 + /* Don't fail on errors, but performance might be reduced. */ 116 + devm_arch_io_reserve_memtype_wc(dev->dev, start, len); 117 + devm_arch_phys_wc_add(dev->dev, start, len); 102 118 103 - mdev->fb_mtrr = arch_phys_wc_add(start, len); 104 - 105 - mdev->vram = ioremap(start, len); 106 - if (!mdev->vram) { 107 - ret = -ENOMEM; 108 - goto err_arch_phys_wc_del; 109 - } 119 + mdev->vram = devm_ioremap(dev->dev, start, len); 120 + if (!mdev->vram) 121 + return -ENOMEM; 110 122 111 123 mdev->mc.vram_size = mgag200_probe_vram(mdev, mdev->vram, len); 112 124 mdev->mc.vram_base = start; ··· 112 128 113 129 mdev->vram_fb_available = mdev->mc.vram_size; 114 130 115 - return drmm_add_action_or_reset(dev, mgag200_mm_release, NULL); 116 - 117 - err_arch_phys_wc_del: 118 - arch_phys_wc_del(mdev->fb_mtrr); 119 - arch_io_free_memtype_wc(start, len); 120 - return ret; 131 + return 0; 121 132 }
+2 -2
drivers/gpu/drm/msm/Kconfig
··· 3 3 config DRM_MSM 4 4 tristate "MSM DRM" 5 5 depends on DRM 6 - depends on ARCH_QCOM || SOC_IMX5 || (ARM && COMPILE_TEST) 6 + depends on ARCH_QCOM || SOC_IMX5 || COMPILE_TEST 7 7 depends on IOMMU_SUPPORT 8 - depends on OF && COMMON_CLK 8 + depends on (OF && COMMON_CLK) || COMPILE_TEST 9 9 depends on QCOM_OCMEM || QCOM_OCMEM=n 10 10 depends on QCOM_LLCC || QCOM_LLCC=n 11 11 depends on QCOM_COMMAND_DB || QCOM_COMMAND_DB=n
+1 -1
drivers/gpu/drm/msm/msm_gem.c
··· 85 85 86 86 paddr = physaddr(obj); 87 87 for (i = 0; i < npages; i++) { 88 - p[i] = phys_to_page(paddr); 88 + p[i] = pfn_to_page(__phys_to_pfn(paddr)); 89 89 paddr += PAGE_SIZE; 90 90 } 91 91
+2 -2
drivers/gpu/drm/nouveau/nouveau_bo.c
··· 1249 1249 struct ttm_tt *ttm_dma = (void *)ttm; 1250 1250 struct nouveau_drm *drm; 1251 1251 struct device *dev; 1252 - bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG); 1252 + bool slave = !!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL); 1253 1253 1254 1254 if (ttm_tt_is_populated(ttm)) 1255 1255 return 0; ··· 1272 1272 { 1273 1273 struct nouveau_drm *drm; 1274 1274 struct device *dev; 1275 - bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG); 1275 + bool slave = !!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL); 1276 1276 1277 1277 if (slave) 1278 1278 return;
+741 -2
drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
··· 45 45 const struct panel_desc *desc; 46 46 47 47 enum drm_panel_orientation orientation; 48 + struct regulator *pp3300; 48 49 struct regulator *pp1800; 49 50 struct regulator *avee; 50 51 struct regulator *avdd; ··· 74 73 .type = DELAY_CMD,\ 75 74 .len = sizeof((char[]){__VA_ARGS__}), \ 76 75 .data = (char[]){__VA_ARGS__} } 76 + 77 + static const struct panel_init_cmd boe_tv110c9m_init_cmd[] = { 78 + _INIT_DCS_CMD(0xFF, 0x20), 79 + _INIT_DCS_CMD(0xFB, 0x01), 80 + _INIT_DCS_CMD(0x05, 0xD9), 81 + _INIT_DCS_CMD(0x07, 0x78), 82 + _INIT_DCS_CMD(0x08, 0x5A), 83 + _INIT_DCS_CMD(0x0D, 0x63), 84 + _INIT_DCS_CMD(0x0E, 0x91), 85 + _INIT_DCS_CMD(0x0F, 0x73), 86 + _INIT_DCS_CMD(0x95, 0xEB), 87 + _INIT_DCS_CMD(0x96, 0xEB), 88 + _INIT_DCS_CMD(0x30, 0x11), 89 + _INIT_DCS_CMD(0x6D, 0x66), 90 + _INIT_DCS_CMD(0x75, 0xA2), 91 + _INIT_DCS_CMD(0x77, 0x3B), 92 + 93 + _INIT_DCS_CMD(0xB0, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4D, 0x00, 0x6D, 0x00, 0x89, 0x00, 0xA1, 0x00, 0xB6, 0x00, 0xC9), 94 + _INIT_DCS_CMD(0xB1, 0x00, 0xDA, 0x01, 0x13, 0x01, 0x3C, 0x01, 0x7E, 0x01, 0xAB, 0x01, 0xF7, 0x02, 0x2F, 0x02, 0x31), 95 + _INIT_DCS_CMD(0xB2, 0x02, 0x67, 0x02, 0xA6, 0x02, 0xD1, 0x03, 0x08, 0x03, 0x2E, 0x03, 0x5B, 0x03, 0x6B, 0x03, 0x7B), 96 + _INIT_DCS_CMD(0xB3, 0x03, 0x8E, 0x03, 0xA2, 0x03, 0xB7, 0x03, 0xE7, 0x03, 0xFD, 0x03, 0xFF), 97 + 98 + _INIT_DCS_CMD(0xB4, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4D, 0x00, 0x6D, 0x00, 0x89, 0x00, 0xA1, 0x00, 0xB6, 0x00, 0xC9), 99 + _INIT_DCS_CMD(0xB5, 0x00, 0xDA, 0x01, 0x13, 0x01, 0x3C, 0x01, 0x7E, 0x01, 0xAB, 0x01, 0xF7, 0x02, 0x2F, 0x02, 0x31), 100 + _INIT_DCS_CMD(0xB6, 0x02, 0x67, 0x02, 0xA6, 0x02, 0xD1, 0x03, 0x08, 0x03, 0x2E, 0x03, 0x5B, 0x03, 0x6B, 0x03, 0x7B), 101 + _INIT_DCS_CMD(0xB7, 0x03, 0x8E, 0x03, 0xA2, 0x03, 0xB7, 0x03, 0xE7, 0x03, 0xFD, 0x03, 0xFF), 102 + _INIT_DCS_CMD(0xB8, 0x00, 0x08, 0x00, 0x23, 0x00, 0x4D, 0x00, 0x6D, 0x00, 0x89, 0x00, 0xA1, 0x00, 0xB6, 0x00, 0xC9), 103 + _INIT_DCS_CMD(0xB9, 0x00, 0xDA, 0x01, 0x13, 0x01, 0x3C, 0x01, 0x7E, 0x01, 0xAB, 0x01, 0xF7, 0x02, 0x2F, 0x02, 0x31), 104 + _INIT_DCS_CMD(0xBA, 0x02, 0x67, 0x02, 0xA6, 0x02, 0xD1, 0x03, 0x08, 0x03, 0x2E, 0x03, 0x5B, 0x03, 0x6B, 0x03, 0x7B), 105 + _INIT_DCS_CMD(0xBB, 0x03, 0x8E, 0x03, 0xA2, 0x03, 0xB7, 0x03, 0xE7, 0x03, 0xFD, 0x03, 0xFF), 106 + 107 + _INIT_DCS_CMD(0xFF, 0x21), 108 + _INIT_DCS_CMD(0xFB, 0x01), 109 + 110 + _INIT_DCS_CMD(0xB0, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x45, 0x00, 0x65, 0x00, 0x81, 0x00, 0x99, 0x00, 0xAE, 0x00, 0xC1), 111 + _INIT_DCS_CMD(0xB1, 0x00, 0xD2, 0x01, 0x0B, 0x01, 0x34, 0x01, 0x76, 0x01, 0xA3, 0x01, 0xEF, 0x02, 0x27, 0x02, 0x29), 112 + _INIT_DCS_CMD(0xB2, 0x02, 0x5F, 0x02, 0x9E, 0x02, 0xC9, 0x03, 0x00, 0x03, 0x26, 0x03, 0x53, 0x03, 0x63, 0x03, 0x73), 113 + _INIT_DCS_CMD(0xB3, 0x03, 0x86, 0x03, 0x9A, 0x03, 0xAF, 0x03, 0xDF, 0x03, 0xF5, 0x03, 0xF7), 114 + 115 + _INIT_DCS_CMD(0xB4, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x45, 0x00, 0x65, 0x00, 0x81, 0x00, 0x99, 0x00, 0xAE, 0x00, 0xC1), 116 + _INIT_DCS_CMD(0xB5, 0x00, 0xD2, 0x01, 0x0B, 0x01, 0x34, 0x01, 0x76, 0x01, 0xA3, 0x01, 0xEF, 0x02, 0x27, 0x02, 0x29), 117 + _INIT_DCS_CMD(0xB6, 0x02, 0x5F, 0x02, 0x9E, 0x02, 0xC9, 0x03, 0x00, 0x03, 0x26, 0x03, 0x53, 0x03, 0x63, 0x03, 0x73), 118 + _INIT_DCS_CMD(0xB7, 0x03, 0x86, 0x03, 0x9A, 0x03, 0xAF, 0x03, 0xDF, 0x03, 0xF5, 0x03, 0xF7), 119 + 120 + _INIT_DCS_CMD(0xB8, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x45, 0x00, 0x65, 0x00, 0x81, 0x00, 0x99, 0x00, 0xAE, 0x00, 0xC1), 121 + _INIT_DCS_CMD(0xB9, 0x00, 0xD2, 0x01, 0x0B, 0x01, 0x34, 0x01, 0x76, 0x01, 0xA3, 0x01, 0xEF, 0x02, 0x27, 0x02, 0x29), 122 + _INIT_DCS_CMD(0xBA, 0x02, 0x5F, 0x02, 0x9E, 0x02, 0xC9, 0x03, 0x00, 0x03, 0x26, 0x03, 0x53, 0x03, 0x63, 0x03, 0x73), 123 + _INIT_DCS_CMD(0xBB, 0x03, 0x86, 0x03, 0x9A, 0x03, 0xAF, 0x03, 0xDF, 0x03, 0xF5, 0x03, 0xF7), 124 + 125 + _INIT_DCS_CMD(0xFF, 0x24), 126 + _INIT_DCS_CMD(0xFB, 0x01), 127 + 128 + _INIT_DCS_CMD(0x00, 0x00), 129 + _INIT_DCS_CMD(0x01, 0x00), 130 + 131 + _INIT_DCS_CMD(0x02, 0x1C), 132 + _INIT_DCS_CMD(0x03, 0x1C), 133 + 134 + _INIT_DCS_CMD(0x04, 0x1D), 135 + _INIT_DCS_CMD(0x05, 0x1D), 136 + 137 + _INIT_DCS_CMD(0x06, 0x04), 138 + _INIT_DCS_CMD(0x07, 0x04), 139 + 140 + _INIT_DCS_CMD(0x08, 0x0F), 141 + _INIT_DCS_CMD(0x09, 0x0F), 142 + 143 + _INIT_DCS_CMD(0x0A, 0x0E), 144 + _INIT_DCS_CMD(0x0B, 0x0E), 145 + 146 + _INIT_DCS_CMD(0x0C, 0x0D), 147 + _INIT_DCS_CMD(0x0D, 0x0D), 148 + 149 + _INIT_DCS_CMD(0x0E, 0x0C), 150 + _INIT_DCS_CMD(0x0F, 0x0C), 151 + 152 + _INIT_DCS_CMD(0x10, 0x08), 153 + _INIT_DCS_CMD(0x11, 0x08), 154 + 155 + _INIT_DCS_CMD(0x12, 0x00), 156 + _INIT_DCS_CMD(0x13, 0x00), 157 + _INIT_DCS_CMD(0x14, 0x00), 158 + _INIT_DCS_CMD(0x15, 0x00), 159 + 160 + _INIT_DCS_CMD(0x16, 0x00), 161 + _INIT_DCS_CMD(0x17, 0x00), 162 + 163 + _INIT_DCS_CMD(0x18, 0x1C), 164 + _INIT_DCS_CMD(0x19, 0x1C), 165 + 166 + _INIT_DCS_CMD(0x1A, 0x1D), 167 + _INIT_DCS_CMD(0x1B, 0x1D), 168 + 169 + _INIT_DCS_CMD(0x1C, 0x04), 170 + _INIT_DCS_CMD(0x1D, 0x04), 171 + 172 + _INIT_DCS_CMD(0x1E, 0x0F), 173 + _INIT_DCS_CMD(0x1F, 0x0F), 174 + 175 + _INIT_DCS_CMD(0x20, 0x0E), 176 + _INIT_DCS_CMD(0x21, 0x0E), 177 + 178 + _INIT_DCS_CMD(0x22, 0x0D), 179 + _INIT_DCS_CMD(0x23, 0x0D), 180 + 181 + _INIT_DCS_CMD(0x24, 0x0C), 182 + _INIT_DCS_CMD(0x25, 0x0C), 183 + 184 + _INIT_DCS_CMD(0x26, 0x08), 185 + _INIT_DCS_CMD(0x27, 0x08), 186 + 187 + _INIT_DCS_CMD(0x28, 0x00), 188 + _INIT_DCS_CMD(0x29, 0x00), 189 + _INIT_DCS_CMD(0x2A, 0x00), 190 + _INIT_DCS_CMD(0x2B, 0x00), 191 + 192 + _INIT_DCS_CMD(0x2D, 0x20), 193 + _INIT_DCS_CMD(0x2F, 0x0A), 194 + _INIT_DCS_CMD(0x30, 0x44), 195 + _INIT_DCS_CMD(0x33, 0x0C), 196 + _INIT_DCS_CMD(0x34, 0x32), 197 + 198 + _INIT_DCS_CMD(0x37, 0x44), 199 + _INIT_DCS_CMD(0x38, 0x40), 200 + _INIT_DCS_CMD(0x39, 0x00), 201 + _INIT_DCS_CMD(0x3A, 0x5D), 202 + _INIT_DCS_CMD(0x3B, 0x60), 203 + _INIT_DCS_CMD(0x3D, 0x42), 204 + _INIT_DCS_CMD(0x3F, 0x06), 205 + _INIT_DCS_CMD(0x43, 0x06), 206 + _INIT_DCS_CMD(0x47, 0x66), 207 + _INIT_DCS_CMD(0x4A, 0x5D), 208 + _INIT_DCS_CMD(0x4B, 0x60), 209 + _INIT_DCS_CMD(0x4C, 0x91), 210 + _INIT_DCS_CMD(0x4D, 0x21), 211 + _INIT_DCS_CMD(0x4E, 0x43), 212 + _INIT_DCS_CMD(0x51, 0x12), 213 + _INIT_DCS_CMD(0x52, 0x34), 214 + _INIT_DCS_CMD(0x55, 0x82, 0x02), 215 + _INIT_DCS_CMD(0x56, 0x04), 216 + _INIT_DCS_CMD(0x58, 0x21), 217 + _INIT_DCS_CMD(0x59, 0x30), 218 + _INIT_DCS_CMD(0x5A, 0x60), 219 + _INIT_DCS_CMD(0x5B, 0x50), 220 + _INIT_DCS_CMD(0x5E, 0x00, 0x06), 221 + _INIT_DCS_CMD(0x5F, 0x00), 222 + _INIT_DCS_CMD(0x65, 0x82), 223 + _INIT_DCS_CMD(0x7E, 0x20), 224 + _INIT_DCS_CMD(0x7F, 0x3C), 225 + _INIT_DCS_CMD(0x82, 0x04), 226 + _INIT_DCS_CMD(0x97, 0xC0), 227 + _INIT_DCS_CMD(0xB6, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00), 228 + _INIT_DCS_CMD(0x91, 0x44), 229 + _INIT_DCS_CMD(0x92, 0xA9), 230 + _INIT_DCS_CMD(0x93, 0x1A), 231 + _INIT_DCS_CMD(0x94, 0x96), 232 + _INIT_DCS_CMD(0xD7, 0x55), 233 + _INIT_DCS_CMD(0xDA, 0x0A), 234 + _INIT_DCS_CMD(0xDE, 0x08), 235 + _INIT_DCS_CMD(0xDB, 0x05), 236 + _INIT_DCS_CMD(0xDC, 0xA9), 237 + _INIT_DCS_CMD(0xDD, 0x22), 238 + 239 + _INIT_DCS_CMD(0xDF, 0x05), 240 + _INIT_DCS_CMD(0xE0, 0xA9), 241 + _INIT_DCS_CMD(0xE1, 0x05), 242 + _INIT_DCS_CMD(0xE2, 0xA9), 243 + _INIT_DCS_CMD(0xE3, 0x05), 244 + _INIT_DCS_CMD(0xE4, 0xA9), 245 + _INIT_DCS_CMD(0xE5, 0x05), 246 + _INIT_DCS_CMD(0xE6, 0xA9), 247 + _INIT_DCS_CMD(0x5C, 0x00), 248 + _INIT_DCS_CMD(0x5D, 0x00), 249 + _INIT_DCS_CMD(0x8D, 0x00), 250 + _INIT_DCS_CMD(0x8E, 0x00), 251 + _INIT_DCS_CMD(0xB5, 0x90), 252 + _INIT_DCS_CMD(0xFF, 0x25), 253 + _INIT_DCS_CMD(0xFB, 0x01), 254 + _INIT_DCS_CMD(0x05, 0x00), 255 + _INIT_DCS_CMD(0x19, 0x07), 256 + _INIT_DCS_CMD(0x1F, 0x60), 257 + _INIT_DCS_CMD(0x20, 0x50), 258 + _INIT_DCS_CMD(0x26, 0x60), 259 + _INIT_DCS_CMD(0x27, 0x50), 260 + _INIT_DCS_CMD(0x33, 0x60), 261 + _INIT_DCS_CMD(0x34, 0x50), 262 + _INIT_DCS_CMD(0x3F, 0xE0), 263 + _INIT_DCS_CMD(0x40, 0x00), 264 + _INIT_DCS_CMD(0x44, 0x00), 265 + _INIT_DCS_CMD(0x45, 0x40), 266 + _INIT_DCS_CMD(0x48, 0x60), 267 + _INIT_DCS_CMD(0x49, 0x50), 268 + _INIT_DCS_CMD(0x5B, 0x00), 269 + _INIT_DCS_CMD(0x5C, 0x00), 270 + _INIT_DCS_CMD(0x5D, 0x00), 271 + _INIT_DCS_CMD(0x5E, 0xD0), 272 + _INIT_DCS_CMD(0x61, 0x60), 273 + _INIT_DCS_CMD(0x62, 0x50), 274 + _INIT_DCS_CMD(0xF1, 0x10), 275 + _INIT_DCS_CMD(0xFF, 0x2A), 276 + _INIT_DCS_CMD(0xFB, 0x01), 277 + 278 + _INIT_DCS_CMD(0x64, 0x16), 279 + _INIT_DCS_CMD(0x67, 0x16), 280 + _INIT_DCS_CMD(0x6A, 0x16), 281 + 282 + _INIT_DCS_CMD(0x70, 0x30), 283 + 284 + _INIT_DCS_CMD(0xA2, 0xF3), 285 + _INIT_DCS_CMD(0xA3, 0xFF), 286 + _INIT_DCS_CMD(0xA4, 0xFF), 287 + _INIT_DCS_CMD(0xA5, 0xFF), 288 + 289 + _INIT_DCS_CMD(0xD6, 0x08), 290 + 291 + _INIT_DCS_CMD(0xFF, 0x26), 292 + _INIT_DCS_CMD(0xFB, 0x01), 293 + _INIT_DCS_CMD(0x00, 0xA1), 294 + 295 + _INIT_DCS_CMD(0x02, 0x31), 296 + _INIT_DCS_CMD(0x04, 0x28), 297 + _INIT_DCS_CMD(0x06, 0x30), 298 + _INIT_DCS_CMD(0x0C, 0x16), 299 + _INIT_DCS_CMD(0x0D, 0x0D), 300 + _INIT_DCS_CMD(0x0F, 0x00), 301 + _INIT_DCS_CMD(0x11, 0x00), 302 + _INIT_DCS_CMD(0x12, 0x50), 303 + _INIT_DCS_CMD(0x13, 0x56), 304 + _INIT_DCS_CMD(0x14, 0x57), 305 + _INIT_DCS_CMD(0x15, 0x00), 306 + _INIT_DCS_CMD(0x16, 0x10), 307 + _INIT_DCS_CMD(0x17, 0xA0), 308 + _INIT_DCS_CMD(0x18, 0x86), 309 + _INIT_DCS_CMD(0x19, 0x0D), 310 + _INIT_DCS_CMD(0x1A, 0x7F), 311 + _INIT_DCS_CMD(0x1B, 0x0C), 312 + _INIT_DCS_CMD(0x1C, 0xBF), 313 + _INIT_DCS_CMD(0x22, 0x00), 314 + _INIT_DCS_CMD(0x23, 0x00), 315 + _INIT_DCS_CMD(0x2A, 0x0D), 316 + _INIT_DCS_CMD(0x2B, 0x7F), 317 + 318 + _INIT_DCS_CMD(0x1D, 0x00), 319 + _INIT_DCS_CMD(0x1E, 0x65), 320 + _INIT_DCS_CMD(0x1F, 0x65), 321 + _INIT_DCS_CMD(0x24, 0x00), 322 + _INIT_DCS_CMD(0x25, 0x65), 323 + _INIT_DCS_CMD(0x2F, 0x05), 324 + _INIT_DCS_CMD(0x30, 0x65), 325 + _INIT_DCS_CMD(0x31, 0x05), 326 + _INIT_DCS_CMD(0x32, 0x7D), 327 + _INIT_DCS_CMD(0x39, 0x00), 328 + _INIT_DCS_CMD(0x3A, 0x65), 329 + _INIT_DCS_CMD(0x20, 0x01), 330 + _INIT_DCS_CMD(0x33, 0x11), 331 + _INIT_DCS_CMD(0x34, 0x78), 332 + _INIT_DCS_CMD(0x35, 0x16), 333 + _INIT_DCS_CMD(0xC8, 0x04), 334 + _INIT_DCS_CMD(0xC9, 0x80), 335 + _INIT_DCS_CMD(0xCA, 0x4E), 336 + _INIT_DCS_CMD(0xCB, 0x00), 337 + _INIT_DCS_CMD(0xA9, 0x4C), 338 + _INIT_DCS_CMD(0xAA, 0x47), 339 + 340 + _INIT_DCS_CMD(0xFF, 0x27), 341 + _INIT_DCS_CMD(0xFB, 0x01), 342 + 343 + _INIT_DCS_CMD(0x56, 0x06), 344 + _INIT_DCS_CMD(0x58, 0x80), 345 + _INIT_DCS_CMD(0x59, 0x75), 346 + _INIT_DCS_CMD(0x5A, 0x00), 347 + _INIT_DCS_CMD(0x5B, 0x02), 348 + _INIT_DCS_CMD(0x5C, 0x00), 349 + _INIT_DCS_CMD(0x5D, 0x00), 350 + _INIT_DCS_CMD(0x5E, 0x20), 351 + _INIT_DCS_CMD(0x5F, 0x10), 352 + _INIT_DCS_CMD(0x60, 0x00), 353 + _INIT_DCS_CMD(0x61, 0x2E), 354 + _INIT_DCS_CMD(0x62, 0x00), 355 + _INIT_DCS_CMD(0x63, 0x01), 356 + _INIT_DCS_CMD(0x64, 0x43), 357 + _INIT_DCS_CMD(0x65, 0x2D), 358 + _INIT_DCS_CMD(0x66, 0x00), 359 + _INIT_DCS_CMD(0x67, 0x01), 360 + _INIT_DCS_CMD(0x68, 0x44), 361 + 362 + _INIT_DCS_CMD(0x00, 0x00), 363 + _INIT_DCS_CMD(0x78, 0x00), 364 + _INIT_DCS_CMD(0xC3, 0x00), 365 + 366 + _INIT_DCS_CMD(0xFF, 0x2A), 367 + _INIT_DCS_CMD(0xFB, 0x01), 368 + 369 + _INIT_DCS_CMD(0x22, 0x2F), 370 + _INIT_DCS_CMD(0x23, 0x08), 371 + 372 + _INIT_DCS_CMD(0x24, 0x00), 373 + _INIT_DCS_CMD(0x25, 0x65), 374 + _INIT_DCS_CMD(0x26, 0xF8), 375 + _INIT_DCS_CMD(0x27, 0x00), 376 + _INIT_DCS_CMD(0x28, 0x1A), 377 + _INIT_DCS_CMD(0x29, 0x00), 378 + _INIT_DCS_CMD(0x2A, 0x1A), 379 + _INIT_DCS_CMD(0x2B, 0x00), 380 + _INIT_DCS_CMD(0x2D, 0x1A), 381 + 382 + _INIT_DCS_CMD(0xFF, 0x23), 383 + _INIT_DCS_CMD(0xFB, 0x01), 384 + 385 + _INIT_DCS_CMD(0x00, 0x80), 386 + _INIT_DCS_CMD(0x07, 0x00), 387 + 388 + _INIT_DCS_CMD(0xFF, 0xE0), 389 + _INIT_DCS_CMD(0xFB, 0x01), 390 + _INIT_DCS_CMD(0x14, 0x60), 391 + _INIT_DCS_CMD(0x16, 0xC0), 392 + 393 + _INIT_DCS_CMD(0xFF, 0xF0), 394 + _INIT_DCS_CMD(0xFB, 0x01), 395 + _INIT_DCS_CMD(0x3A, 0x08), 396 + 397 + _INIT_DCS_CMD(0xFF, 0x10), 398 + _INIT_DCS_CMD(0xFB, 0x01), 399 + _INIT_DCS_CMD(0xB9, 0x01), 400 + _INIT_DCS_CMD(0xFF, 0x20), 401 + _INIT_DCS_CMD(0xFB, 0x01), 402 + _INIT_DCS_CMD(0x18, 0x40), 403 + 404 + _INIT_DCS_CMD(0xFF, 0x10), 405 + _INIT_DCS_CMD(0xFB, 0x01), 406 + _INIT_DCS_CMD(0xB9, 0x02), 407 + _INIT_DCS_CMD(0x35, 0x00), 408 + _INIT_DCS_CMD(0x51, 0x00, 0xFF), 409 + _INIT_DCS_CMD(0x53, 0x24), 410 + _INIT_DCS_CMD(0x55, 0x00), 411 + _INIT_DCS_CMD(0xBB, 0x13), 412 + _INIT_DCS_CMD(0x3B, 0x03, 0x96, 0x1A, 0x04, 0x04), 413 + _INIT_DELAY_CMD(100), 414 + _INIT_DCS_CMD(0x11), 415 + _INIT_DELAY_CMD(200), 416 + _INIT_DCS_CMD(0x29), 417 + _INIT_DELAY_CMD(100), 418 + {}, 419 + }; 420 + 421 + static const struct panel_init_cmd inx_init_cmd[] = { 422 + _INIT_DCS_CMD(0xFF, 0x20), 423 + _INIT_DCS_CMD(0xFB, 0x01), 424 + _INIT_DCS_CMD(0x05, 0xD1), 425 + _INIT_DCS_CMD(0x0D, 0x63), 426 + _INIT_DCS_CMD(0x07, 0x8C), 427 + _INIT_DCS_CMD(0x08, 0x4B), 428 + _INIT_DCS_CMD(0x0E, 0x91), 429 + _INIT_DCS_CMD(0x0F, 0x69), 430 + _INIT_DCS_CMD(0x95, 0xFF), 431 + _INIT_DCS_CMD(0x96, 0xFF), 432 + _INIT_DCS_CMD(0x9D, 0x0A), 433 + _INIT_DCS_CMD(0x9E, 0x0A), 434 + _INIT_DCS_CMD(0x69, 0x98), 435 + _INIT_DCS_CMD(0x75, 0xA2), 436 + _INIT_DCS_CMD(0x77, 0xB3), 437 + _INIT_DCS_CMD(0xFF, 0x24), 438 + _INIT_DCS_CMD(0xFB, 0x01), 439 + _INIT_DCS_CMD(0x91, 0x44), 440 + _INIT_DCS_CMD(0x92, 0x7A), 441 + _INIT_DCS_CMD(0x93, 0x1A), 442 + _INIT_DCS_CMD(0x94, 0x40), 443 + _INIT_DCS_CMD(0x9A, 0x08), 444 + _INIT_DCS_CMD(0x60, 0x96), 445 + _INIT_DCS_CMD(0x61, 0xD0), 446 + _INIT_DCS_CMD(0x63, 0x70), 447 + _INIT_DCS_CMD(0xC2, 0xCF), 448 + _INIT_DCS_CMD(0x9B, 0x0F), 449 + _INIT_DCS_CMD(0x9A, 0x08), 450 + _INIT_DCS_CMD(0x00, 0x03), 451 + _INIT_DCS_CMD(0x01, 0x03), 452 + _INIT_DCS_CMD(0x02, 0x03), 453 + _INIT_DCS_CMD(0x03, 0x03), 454 + _INIT_DCS_CMD(0x04, 0x03), 455 + _INIT_DCS_CMD(0x05, 0x03), 456 + _INIT_DCS_CMD(0x06, 0x22), 457 + _INIT_DCS_CMD(0x07, 0x06), 458 + _INIT_DCS_CMD(0x08, 0x00), 459 + _INIT_DCS_CMD(0x09, 0x1D), 460 + _INIT_DCS_CMD(0x0A, 0x1C), 461 + _INIT_DCS_CMD(0x0B, 0x13), 462 + _INIT_DCS_CMD(0x0C, 0x12), 463 + _INIT_DCS_CMD(0x0D, 0x11), 464 + _INIT_DCS_CMD(0x0E, 0x10), 465 + _INIT_DCS_CMD(0x0F, 0x0F), 466 + _INIT_DCS_CMD(0x10, 0x0E), 467 + _INIT_DCS_CMD(0x11, 0x0D), 468 + _INIT_DCS_CMD(0x12, 0x0C), 469 + _INIT_DCS_CMD(0x13, 0x04), 470 + _INIT_DCS_CMD(0x14, 0x03), 471 + _INIT_DCS_CMD(0x15, 0x03), 472 + _INIT_DCS_CMD(0x16, 0x03), 473 + _INIT_DCS_CMD(0x17, 0x03), 474 + _INIT_DCS_CMD(0x18, 0x03), 475 + _INIT_DCS_CMD(0x19, 0x03), 476 + _INIT_DCS_CMD(0x1A, 0x03), 477 + _INIT_DCS_CMD(0x1B, 0x03), 478 + _INIT_DCS_CMD(0x1C, 0x22), 479 + _INIT_DCS_CMD(0x1D, 0x06), 480 + _INIT_DCS_CMD(0x1E, 0x00), 481 + _INIT_DCS_CMD(0x1F, 0x1D), 482 + _INIT_DCS_CMD(0x20, 0x1C), 483 + _INIT_DCS_CMD(0x21, 0x13), 484 + _INIT_DCS_CMD(0x22, 0x12), 485 + _INIT_DCS_CMD(0x23, 0x11), 486 + _INIT_DCS_CMD(0x24, 0x10), 487 + _INIT_DCS_CMD(0x25, 0x0F), 488 + _INIT_DCS_CMD(0x26, 0x0E), 489 + _INIT_DCS_CMD(0x27, 0x0D), 490 + _INIT_DCS_CMD(0x28, 0x0C), 491 + _INIT_DCS_CMD(0x29, 0x04), 492 + _INIT_DCS_CMD(0x2A, 0x03), 493 + _INIT_DCS_CMD(0x2B, 0x03), 494 + 495 + _INIT_DCS_CMD(0x2F, 0x06), 496 + _INIT_DCS_CMD(0x30, 0x32), 497 + _INIT_DCS_CMD(0x31, 0x43), 498 + _INIT_DCS_CMD(0x33, 0x06), 499 + _INIT_DCS_CMD(0x34, 0x32), 500 + _INIT_DCS_CMD(0x35, 0x43), 501 + _INIT_DCS_CMD(0x37, 0x44), 502 + _INIT_DCS_CMD(0x38, 0x40), 503 + _INIT_DCS_CMD(0x39, 0x00), 504 + _INIT_DCS_CMD(0x3A, 0x01), 505 + _INIT_DCS_CMD(0x3B, 0x48), 506 + _INIT_DCS_CMD(0x3D, 0x93), 507 + _INIT_DCS_CMD(0xAB, 0x44), 508 + _INIT_DCS_CMD(0xAC, 0x40), 509 + 510 + _INIT_DCS_CMD(0x4D, 0x21), 511 + _INIT_DCS_CMD(0x4E, 0x43), 512 + _INIT_DCS_CMD(0x4F, 0x65), 513 + _INIT_DCS_CMD(0x50, 0x87), 514 + _INIT_DCS_CMD(0x51, 0x78), 515 + _INIT_DCS_CMD(0x52, 0x56), 516 + _INIT_DCS_CMD(0x53, 0x34), 517 + _INIT_DCS_CMD(0x54, 0x21), 518 + _INIT_DCS_CMD(0x55, 0x83), 519 + _INIT_DCS_CMD(0x56, 0x08), 520 + _INIT_DCS_CMD(0x58, 0x21), 521 + _INIT_DCS_CMD(0x59, 0x40), 522 + _INIT_DCS_CMD(0x5A, 0x09), 523 + _INIT_DCS_CMD(0x5B, 0x48), 524 + _INIT_DCS_CMD(0x5E, 0x00, 0x10), 525 + _INIT_DCS_CMD(0x5F, 0x00), 526 + 527 + _INIT_DCS_CMD(0x7A, 0x00), 528 + _INIT_DCS_CMD(0x7B, 0x00), 529 + _INIT_DCS_CMD(0x7C, 0x00), 530 + _INIT_DCS_CMD(0x7D, 0x00), 531 + _INIT_DCS_CMD(0x7E, 0x20), 532 + _INIT_DCS_CMD(0x7F, 0x3C), 533 + _INIT_DCS_CMD(0x80, 0x00), 534 + _INIT_DCS_CMD(0x81, 0x00), 535 + _INIT_DCS_CMD(0x82, 0x08), 536 + _INIT_DCS_CMD(0x97, 0x02), 537 + _INIT_DCS_CMD(0xC5, 0x10), 538 + _INIT_DCS_CMD(0xDA, 0x05), 539 + _INIT_DCS_CMD(0xDB, 0x01), 540 + _INIT_DCS_CMD(0xDC, 0x7A), 541 + _INIT_DCS_CMD(0xDD, 0x55), 542 + _INIT_DCS_CMD(0xDE, 0x27), 543 + _INIT_DCS_CMD(0xDF, 0x01), 544 + _INIT_DCS_CMD(0xE0, 0x7A), 545 + _INIT_DCS_CMD(0xE1, 0x01), 546 + _INIT_DCS_CMD(0xE2, 0x7A), 547 + _INIT_DCS_CMD(0xE3, 0x01), 548 + _INIT_DCS_CMD(0xE4, 0x7A), 549 + _INIT_DCS_CMD(0xE5, 0x01), 550 + _INIT_DCS_CMD(0xE6, 0x7A), 551 + _INIT_DCS_CMD(0xE7, 0x00), 552 + _INIT_DCS_CMD(0xE8, 0x00), 553 + _INIT_DCS_CMD(0xE9, 0x01), 554 + _INIT_DCS_CMD(0xEA, 0x7A), 555 + _INIT_DCS_CMD(0xEB, 0x01), 556 + _INIT_DCS_CMD(0xEE, 0x7A), 557 + _INIT_DCS_CMD(0xEF, 0x01), 558 + _INIT_DCS_CMD(0xF0, 0x7A), 559 + 560 + _INIT_DCS_CMD(0xFF, 0x25), 561 + _INIT_DCS_CMD(0xFB, 0x01), 562 + 563 + _INIT_DCS_CMD(0x05, 0x00), 564 + 565 + _INIT_DCS_CMD(0xF1, 0x10), 566 + _INIT_DCS_CMD(0x1E, 0x00), 567 + _INIT_DCS_CMD(0x1F, 0x09), 568 + _INIT_DCS_CMD(0x20, 0x46), 569 + _INIT_DCS_CMD(0x25, 0x00), 570 + _INIT_DCS_CMD(0x26, 0x09), 571 + _INIT_DCS_CMD(0x27, 0x46), 572 + _INIT_DCS_CMD(0x3F, 0x80), 573 + _INIT_DCS_CMD(0x40, 0x00), 574 + _INIT_DCS_CMD(0x43, 0x00), 575 + 576 + _INIT_DCS_CMD(0x44, 0x09), 577 + _INIT_DCS_CMD(0x45, 0x46), 578 + 579 + _INIT_DCS_CMD(0x48, 0x09), 580 + _INIT_DCS_CMD(0x49, 0x46), 581 + _INIT_DCS_CMD(0x5B, 0x80), 582 + _INIT_DCS_CMD(0x5C, 0x00), 583 + _INIT_DCS_CMD(0x5D, 0x01), 584 + _INIT_DCS_CMD(0x5E, 0x46), 585 + _INIT_DCS_CMD(0x61, 0x01), 586 + _INIT_DCS_CMD(0x62, 0x46), 587 + _INIT_DCS_CMD(0x68, 0x10), 588 + _INIT_DCS_CMD(0xFF, 0x26), 589 + _INIT_DCS_CMD(0xFB, 0x01), 590 + 591 + _INIT_DCS_CMD(0x00, 0xA1), 592 + _INIT_DCS_CMD(0x02, 0x31), 593 + _INIT_DCS_CMD(0x0A, 0xF2), 594 + _INIT_DCS_CMD(0x04, 0x28), 595 + _INIT_DCS_CMD(0x06, 0x30), 596 + _INIT_DCS_CMD(0x0C, 0x16), 597 + _INIT_DCS_CMD(0x0D, 0x0D), 598 + _INIT_DCS_CMD(0x0F, 0x00), 599 + _INIT_DCS_CMD(0x11, 0x00), 600 + _INIT_DCS_CMD(0x12, 0x50), 601 + _INIT_DCS_CMD(0x13, 0x56), 602 + _INIT_DCS_CMD(0x14, 0x57), 603 + _INIT_DCS_CMD(0x15, 0x00), 604 + _INIT_DCS_CMD(0x16, 0x10), 605 + _INIT_DCS_CMD(0x17, 0xA0), 606 + _INIT_DCS_CMD(0x18, 0x86), 607 + _INIT_DCS_CMD(0x22, 0x00), 608 + _INIT_DCS_CMD(0x23, 0x00), 609 + _INIT_DCS_CMD(0x19, 0x0D), 610 + _INIT_DCS_CMD(0x1A, 0x7F), 611 + _INIT_DCS_CMD(0x1B, 0x0C), 612 + _INIT_DCS_CMD(0x1C, 0xBF), 613 + _INIT_DCS_CMD(0x2A, 0x0D), 614 + _INIT_DCS_CMD(0x2B, 0x7F), 615 + _INIT_DCS_CMD(0x20, 0x00), 616 + 617 + _INIT_DCS_CMD(0x1D, 0x00), 618 + _INIT_DCS_CMD(0x1E, 0x78), 619 + _INIT_DCS_CMD(0x1F, 0x78), 620 + 621 + _INIT_DCS_CMD(0x2F, 0x03), 622 + _INIT_DCS_CMD(0x30, 0x78), 623 + _INIT_DCS_CMD(0x33, 0x78), 624 + _INIT_DCS_CMD(0x34, 0x66), 625 + _INIT_DCS_CMD(0x35, 0x11), 626 + 627 + _INIT_DCS_CMD(0x39, 0x10), 628 + _INIT_DCS_CMD(0x3A, 0x78), 629 + _INIT_DCS_CMD(0x3B, 0x06), 630 + 631 + _INIT_DCS_CMD(0xC8, 0x04), 632 + _INIT_DCS_CMD(0xC9, 0x84), 633 + _INIT_DCS_CMD(0xCA, 0x4E), 634 + _INIT_DCS_CMD(0xCB, 0x00), 635 + 636 + _INIT_DCS_CMD(0xA9, 0x50), 637 + _INIT_DCS_CMD(0xAA, 0x4F), 638 + _INIT_DCS_CMD(0xAB, 0x4D), 639 + _INIT_DCS_CMD(0xAC, 0x4A), 640 + _INIT_DCS_CMD(0xAD, 0x48), 641 + _INIT_DCS_CMD(0xAE, 0x46), 642 + _INIT_DCS_CMD(0xFF, 0x27), 643 + _INIT_DCS_CMD(0xFB, 0x01), 644 + _INIT_DCS_CMD(0xC0, 0x18), 645 + _INIT_DCS_CMD(0xC1, 0x00), 646 + _INIT_DCS_CMD(0xC2, 0x00), 647 + _INIT_DCS_CMD(0x56, 0x06), 648 + _INIT_DCS_CMD(0x58, 0x80), 649 + _INIT_DCS_CMD(0x59, 0x75), 650 + _INIT_DCS_CMD(0x5A, 0x00), 651 + _INIT_DCS_CMD(0x5B, 0x02), 652 + _INIT_DCS_CMD(0x5C, 0x00), 653 + _INIT_DCS_CMD(0x5D, 0x00), 654 + _INIT_DCS_CMD(0x5E, 0x20), 655 + _INIT_DCS_CMD(0x5F, 0x10), 656 + _INIT_DCS_CMD(0x60, 0x00), 657 + _INIT_DCS_CMD(0x61, 0x2E), 658 + _INIT_DCS_CMD(0x62, 0x00), 659 + _INIT_DCS_CMD(0x63, 0x01), 660 + _INIT_DCS_CMD(0x64, 0x43), 661 + _INIT_DCS_CMD(0x65, 0x2D), 662 + _INIT_DCS_CMD(0x66, 0x00), 663 + _INIT_DCS_CMD(0x67, 0x01), 664 + _INIT_DCS_CMD(0x68, 0x43), 665 + _INIT_DCS_CMD(0x98, 0x01), 666 + _INIT_DCS_CMD(0xB4, 0x03), 667 + _INIT_DCS_CMD(0x9B, 0xBD), 668 + _INIT_DCS_CMD(0xA0, 0x90), 669 + _INIT_DCS_CMD(0xAB, 0x1B), 670 + _INIT_DCS_CMD(0xBC, 0x0C), 671 + _INIT_DCS_CMD(0xBD, 0x28), 672 + 673 + _INIT_DCS_CMD(0xFF, 0x2A), 674 + _INIT_DCS_CMD(0xFB, 0x01), 675 + 676 + _INIT_DCS_CMD(0x22, 0x2F), 677 + _INIT_DCS_CMD(0x23, 0x08), 678 + 679 + _INIT_DCS_CMD(0x24, 0x00), 680 + _INIT_DCS_CMD(0x25, 0x65), 681 + _INIT_DCS_CMD(0x26, 0xF8), 682 + _INIT_DCS_CMD(0x27, 0x00), 683 + _INIT_DCS_CMD(0x28, 0x1A), 684 + _INIT_DCS_CMD(0x29, 0x00), 685 + _INIT_DCS_CMD(0x2A, 0x1A), 686 + _INIT_DCS_CMD(0x2B, 0x00), 687 + _INIT_DCS_CMD(0x2D, 0x1A), 688 + 689 + _INIT_DCS_CMD(0x64, 0x96), 690 + _INIT_DCS_CMD(0x65, 0x00), 691 + _INIT_DCS_CMD(0x66, 0x00), 692 + _INIT_DCS_CMD(0x6A, 0x96), 693 + _INIT_DCS_CMD(0x6B, 0x00), 694 + _INIT_DCS_CMD(0x6C, 0x00), 695 + _INIT_DCS_CMD(0x70, 0x92), 696 + _INIT_DCS_CMD(0x71, 0x00), 697 + _INIT_DCS_CMD(0x72, 0x00), 698 + _INIT_DCS_CMD(0xA2, 0x33), 699 + _INIT_DCS_CMD(0xA3, 0x30), 700 + _INIT_DCS_CMD(0xA4, 0xC0), 701 + _INIT_DCS_CMD(0xE8, 0x00), 702 + _INIT_DCS_CMD(0xFF, 0xF0), 703 + _INIT_DCS_CMD(0xFB, 0x01), 704 + _INIT_DCS_CMD(0x3A, 0x08), 705 + _INIT_DCS_CMD(0xFF, 0xD0), 706 + _INIT_DCS_CMD(0xFB, 0x01), 707 + _INIT_DCS_CMD(0x00, 0x33), 708 + _INIT_DCS_CMD(0x02, 0x77), 709 + _INIT_DCS_CMD(0x08, 0x01), 710 + _INIT_DCS_CMD(0x09, 0xBF), 711 + _INIT_DCS_CMD(0x28, 0x30), 712 + _INIT_DCS_CMD(0x2F, 0x33), 713 + _INIT_DCS_CMD(0xFF, 0x23), 714 + _INIT_DCS_CMD(0xFB, 0x01), 715 + _INIT_DCS_CMD(0x00, 0x80), 716 + _INIT_DCS_CMD(0x07, 0x00), 717 + _INIT_DCS_CMD(0xFF, 0x20), 718 + _INIT_DCS_CMD(0xFB, 0x01), 719 + _INIT_DCS_CMD(0x30, 0x00), 720 + _INIT_DCS_CMD(0xFF, 0x10), 721 + _INIT_DCS_CMD(0xB9, 0x01), 722 + _INIT_DCS_CMD(0xFF, 0x20), 723 + _INIT_DCS_CMD(0x18, 0x40), 724 + _INIT_DCS_CMD(0xFF, 0x10), 725 + _INIT_DCS_CMD(0xB9, 0x02), 726 + _INIT_DCS_CMD(0xFF, 0x10), 727 + _INIT_DCS_CMD(0xFB, 0x01), 728 + _INIT_DCS_CMD(0xBB, 0x13), 729 + _INIT_DCS_CMD(0x3B, 0x03, 0x96, 0x1A, 0x04, 0x04), 730 + _INIT_DCS_CMD(0x35, 0x00), 731 + _INIT_DCS_CMD(0x51, 0x0F, 0xFF), 732 + _INIT_DCS_CMD(0x53, 0x24), 733 + _INIT_DELAY_CMD(100), 734 + _INIT_DCS_CMD(0x11), 735 + _INIT_DELAY_CMD(200), 736 + _INIT_DCS_CMD(0x29), 737 + _INIT_DELAY_CMD(100), 738 + {}, 739 + }; 77 740 78 741 static const struct panel_init_cmd boe_init_cmd[] = { 79 742 _INIT_DELAY_CMD(24), ··· 1176 511 gpiod_set_value(boe->enable_gpio, 0); 1177 512 usleep_range(5000, 7000); 1178 513 regulator_disable(boe->pp1800); 514 + regulator_disable(boe->pp3300); 1179 515 } else { 1180 516 gpiod_set_value(boe->enable_gpio, 0); 1181 - usleep_range(500, 1000); 517 + usleep_range(1000, 2000); 1182 518 regulator_disable(boe->avee); 1183 519 regulator_disable(boe->avdd); 1184 520 usleep_range(5000, 7000); 1185 521 regulator_disable(boe->pp1800); 522 + regulator_disable(boe->pp3300); 1186 523 } 1187 524 1188 525 boe->prepared = false; ··· 1203 536 gpiod_set_value(boe->enable_gpio, 0); 1204 537 usleep_range(1000, 1500); 1205 538 539 + ret = regulator_enable(boe->pp3300); 540 + if (ret < 0) 541 + return ret; 542 + 1206 543 ret = regulator_enable(boe->pp1800); 1207 544 if (ret < 0) 1208 545 return ret; ··· 1220 549 if (ret < 0) 1221 550 goto poweroffavdd; 1222 551 1223 - usleep_range(5000, 10000); 552 + usleep_range(10000, 11000); 1224 553 1225 554 gpiod_set_value(boe->enable_gpio, 1); 1226 555 usleep_range(1000, 2000); ··· 1256 585 msleep(130); 1257 586 return 0; 1258 587 } 588 + 589 + static const struct drm_display_mode boe_tv110c9m_default_mode = { 590 + .clock = 166594, 591 + .hdisplay = 1200, 592 + .hsync_start = 1200 + 40, 593 + .hsync_end = 1200 + 40 + 8, 594 + .htotal = 1200 + 40 + 8 + 28, 595 + .vdisplay = 2000, 596 + .vsync_start = 2000 + 26, 597 + .vsync_end = 2000 + 26 + 2, 598 + .vtotal = 2000 + 26 + 2 + 148, 599 + .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED, 600 + }; 601 + 602 + static const struct panel_desc boe_tv110c9m_desc = { 603 + .modes = &boe_tv110c9m_default_mode, 604 + .bpc = 8, 605 + .size = { 606 + .width_mm = 143, 607 + .height_mm = 238, 608 + }, 609 + .lanes = 4, 610 + .format = MIPI_DSI_FMT_RGB888, 611 + .mode_flags = MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_VIDEO 612 + | MIPI_DSI_MODE_VIDEO_HSE 613 + | MIPI_DSI_CLOCK_NON_CONTINUOUS 614 + | MIPI_DSI_MODE_VIDEO_BURST, 615 + .init_cmds = boe_tv110c9m_init_cmd, 616 + }; 617 + 618 + static const struct drm_display_mode inx_hj110iz_default_mode = { 619 + .clock = 166594, 620 + .hdisplay = 1200, 621 + .hsync_start = 1200 + 40, 622 + .hsync_end = 1200 + 40 + 8, 623 + .htotal = 1200 + 40 + 8 + 28, 624 + .vdisplay = 2000, 625 + .vsync_start = 2000 + 26, 626 + .vsync_end = 2000 + 26 + 1, 627 + .vtotal = 2000 + 26 + 1 + 149, 628 + .type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED, 629 + }; 630 + 631 + static const struct panel_desc inx_hj110iz_desc = { 632 + .modes = &inx_hj110iz_default_mode, 633 + .bpc = 8, 634 + .size = { 635 + .width_mm = 143, 636 + .height_mm = 238, 637 + }, 638 + .lanes = 4, 639 + .format = MIPI_DSI_FMT_RGB888, 640 + .mode_flags = MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_VIDEO 641 + | MIPI_DSI_MODE_VIDEO_HSE 642 + | MIPI_DSI_CLOCK_NON_CONTINUOUS 643 + | MIPI_DSI_MODE_VIDEO_BURST, 644 + .init_cmds = inx_init_cmd, 645 + }; 1259 646 1260 647 static const struct drm_display_mode boe_tv101wum_nl6_default_mode = { 1261 648 .clock = 159425, ··· 1496 767 if (IS_ERR(boe->avee)) 1497 768 return PTR_ERR(boe->avee); 1498 769 770 + boe->pp3300 = devm_regulator_get(dev, "pp3300"); 771 + if (IS_ERR(boe->pp3300)) 772 + return PTR_ERR(boe->pp3300); 773 + 1499 774 boe->pp1800 = devm_regulator_get(dev, "pp1800"); 1500 775 if (IS_ERR(boe->pp1800)) 1501 776 return PTR_ERR(boe->pp1800); ··· 1602 869 }, 1603 870 { .compatible = "boe,tv105wum-nw0", 1604 871 .data = &boe_tv105wum_nw0_desc 872 + }, 873 + { .compatible = "boe,tv110c9m-ll3", 874 + .data = &boe_tv110c9m_desc 875 + }, 876 + { .compatible = "innolux,hj110iz-01a", 877 + .data = &inx_hj110iz_desc 1605 878 }, 1606 879 { /* sentinel */ } 1607 880 };
+12 -11
drivers/gpu/drm/panel/panel-edp.c
··· 1745 1745 .enable = 50, 1746 1746 }; 1747 1747 1748 - #define EDP_PANEL_ENTRY(vend, product_id, _delay, _name) \ 1748 + #define EDP_PANEL_ENTRY(vend_chr_0, vend_chr_1, vend_chr_2, product_id, _delay, _name) \ 1749 1749 { \ 1750 1750 .name = _name, \ 1751 - .panel_id = drm_edid_encode_panel_id(vend, product_id), \ 1751 + .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \ 1752 + product_id), \ 1752 1753 .delay = _delay \ 1753 1754 } 1754 1755 ··· 1761 1760 * Sort first by vendor, then by product ID. 1762 1761 */ 1763 1762 static const struct edp_panel_entry edp_panels[] = { 1764 - EDP_PANEL_ENTRY("AUO", 0x405c, &auo_b116xak01.delay, "B116XAK01"), 1765 - EDP_PANEL_ENTRY("AUO", 0x615c, &delay_200_500_e50, "B116XAN06.1"), 1763 + EDP_PANEL_ENTRY('A', 'U', 'O', 0x405c, &auo_b116xak01.delay, "B116XAK01"), 1764 + EDP_PANEL_ENTRY('A', 'U', 'O', 0x615c, &delay_200_500_e50, "B116XAN06.1"), 1766 1765 1767 - EDP_PANEL_ENTRY("BOE", 0x0786, &delay_200_500_p2e80, "NV116WHM-T01"), 1768 - EDP_PANEL_ENTRY("BOE", 0x07d1, &boe_nv133fhm_n61.delay, "NV133FHM-N61"), 1769 - EDP_PANEL_ENTRY("BOE", 0x082d, &boe_nv133fhm_n61.delay, "NV133FHM-N62"), 1770 - EDP_PANEL_ENTRY("BOE", 0x098d, &boe_nv110wtm_n61.delay, "NV110WTM-N61"), 1766 + EDP_PANEL_ENTRY('B', 'O', 'E', 0x0786, &delay_200_500_p2e80, "NV116WHM-T01"), 1767 + EDP_PANEL_ENTRY('B', 'O', 'E', 0x07d1, &boe_nv133fhm_n61.delay, "NV133FHM-N61"), 1768 + EDP_PANEL_ENTRY('B', 'O', 'E', 0x082d, &boe_nv133fhm_n61.delay, "NV133FHM-N62"), 1769 + EDP_PANEL_ENTRY('B', 'O', 'E', 0x098d, &boe_nv110wtm_n61.delay, "NV110WTM-N61"), 1771 1770 1772 - EDP_PANEL_ENTRY("CMN", 0x114c, &innolux_n116bca_ea1.delay, "N116BCA-EA1"), 1771 + EDP_PANEL_ENTRY('C', 'M', 'N', 0x114c, &innolux_n116bca_ea1.delay, "N116BCA-EA1"), 1773 1772 1774 - EDP_PANEL_ENTRY("KDB", 0x0624, &kingdisplay_kd116n21_30nv_a010.delay, "116N21-30NV-A010"), 1773 + EDP_PANEL_ENTRY('K', 'D', 'B', 0x0624, &kingdisplay_kd116n21_30nv_a010.delay, "116N21-30NV-A010"), 1775 1774 1776 - EDP_PANEL_ENTRY("SHP", 0x154c, &delay_200_500_p2e100, "LQ116M1JW10"), 1775 + EDP_PANEL_ENTRY('S', 'H', 'P', 0x154c, &delay_200_500_p2e100, "LQ116M1JW10"), 1777 1776 1778 1777 { /* sentinal */ } 1779 1778 };
+4 -4
drivers/gpu/drm/radeon/radeon_ttm.c
··· 545 545 { 546 546 struct radeon_device *rdev = radeon_get_rdev(bdev); 547 547 struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm); 548 - bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG); 548 + bool slave = !!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL); 549 549 550 550 if (gtt && gtt->userptr) { 551 551 ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL); 552 552 if (!ttm->sg) 553 553 return -ENOMEM; 554 554 555 - ttm->page_flags |= TTM_PAGE_FLAG_SG; 555 + ttm->page_flags |= TTM_TT_FLAG_EXTERNAL; 556 556 return 0; 557 557 } 558 558 ··· 569 569 { 570 570 struct radeon_device *rdev = radeon_get_rdev(bdev); 571 571 struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(rdev, ttm); 572 - bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG); 572 + bool slave = !!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL); 573 573 574 574 radeon_ttm_tt_unbind(bdev, ttm); 575 575 576 576 if (gtt && gtt->userptr) { 577 577 kfree(ttm->sg); 578 - ttm->page_flags &= ~TTM_PAGE_FLAG_SG; 578 + ttm->page_flags &= ~TTM_TT_FLAG_EXTERNAL; 579 579 return; 580 580 } 581 581
+2 -2
drivers/gpu/drm/ttm/ttm_bo.c
··· 1115 1115 return -EBUSY; 1116 1116 1117 1117 if (!bo->ttm || !ttm_tt_is_populated(bo->ttm) || 1118 - bo->ttm->page_flags & TTM_PAGE_FLAG_SG || 1119 - bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED || 1118 + bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL || 1119 + bo->ttm->page_flags & TTM_TT_FLAG_SWAPPED || 1120 1120 !ttm_bo_get_unless_zero(bo)) { 1121 1121 if (locked) 1122 1122 dma_resv_unlock(bo->base.resv);
+2 -2
drivers/gpu/drm/ttm/ttm_bo_util.c
··· 103 103 104 104 /* Don't move nonexistent data. Clear destination instead. */ 105 105 if (src_ops->maps_tt && (!ttm || !ttm_tt_is_populated(ttm))) { 106 - if (ttm && !(ttm->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC)) 106 + if (ttm && !(ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC)) 107 107 return; 108 108 109 109 for (i = 0; i < num_pages; ++i) { ··· 150 150 struct ttm_kmap_iter *dst_iter, *src_iter; 151 151 int ret = 0; 152 152 153 - if (ttm && ((ttm->page_flags & TTM_PAGE_FLAG_SWAPPED) || 153 + if (ttm && ((ttm->page_flags & TTM_TT_FLAG_SWAPPED) || 154 154 dst_man->use_tt)) { 155 155 ret = ttm_tt_populate(bdev, ttm, ctx); 156 156 if (ret)
+5 -10
drivers/gpu/drm/ttm/ttm_bo_vm.c
··· 162 162 * Refuse to fault imported pages. This should be handled 163 163 * (if at all) by redirecting mmap to the exporter. 164 164 */ 165 - if (bo->ttm && (bo->ttm->page_flags & TTM_PAGE_FLAG_SG)) { 166 - dma_resv_unlock(bo->base.resv); 167 - return VM_FAULT_SIGBUS; 165 + if (bo->ttm && (bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL)) { 166 + if (!(bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE)) { 167 + dma_resv_unlock(bo->base.resv); 168 + return VM_FAULT_SIGBUS; 169 + } 168 170 } 169 171 170 172 return 0; ··· 348 346 } else if (unlikely(!page)) { 349 347 break; 350 348 } 351 - page->index = drm_vma_node_start(&bo->base.vma_node) + 352 - page_offset; 353 349 pfn = page_to_pfn(page); 354 350 } 355 351 ··· 519 519 520 520 switch (bo->resource->mem_type) { 521 521 case TTM_PL_SYSTEM: 522 - if (unlikely(bo->ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) { 523 - ret = ttm_tt_swapin(bo->ttm); 524 - if (unlikely(ret != 0)) 525 - return ret; 526 - } 527 522 fallthrough; 528 523 case TTM_PL_TT: 529 524 ret = ttm_bo_vm_access_kmap(bo, offset, buf, len, write);
+1 -1
drivers/gpu/drm/ttm/ttm_pool.c
··· 371 371 WARN_ON(!num_pages || ttm_tt_is_populated(tt)); 372 372 WARN_ON(dma_addr && !pool->dev); 373 373 374 - if (tt->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC) 374 + if (tt->page_flags & TTM_TT_FLAG_ZERO_ALLOC) 375 375 gfp_flags |= __GFP_ZERO; 376 376 377 377 if (ctx->gfp_retry_mayfail)
+15 -39
drivers/gpu/drm/ttm/ttm_tt.c
··· 68 68 switch (bo->type) { 69 69 case ttm_bo_type_device: 70 70 if (zero_alloc) 71 - page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; 71 + page_flags |= TTM_TT_FLAG_ZERO_ALLOC; 72 72 break; 73 73 case ttm_bo_type_kernel: 74 74 break; 75 75 case ttm_bo_type_sg: 76 - page_flags |= TTM_PAGE_FLAG_SG; 76 + page_flags |= TTM_TT_FLAG_EXTERNAL; 77 77 break; 78 78 default: 79 79 pr_err("Illegal buffer object type\n"); ··· 83 83 bo->ttm = bdev->funcs->ttm_tt_create(bo, page_flags); 84 84 if (unlikely(bo->ttm == NULL)) 85 85 return -ENOMEM; 86 + 87 + WARN_ON(bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL_MAPPABLE && 88 + !(bo->ttm->page_flags & TTM_TT_FLAG_EXTERNAL)); 86 89 87 90 return 0; 88 91 } ··· 159 156 160 157 void ttm_tt_fini(struct ttm_tt *ttm) 161 158 { 162 - WARN_ON(ttm->page_flags & TTM_PAGE_FLAG_PRIV_POPULATED); 159 + WARN_ON(ttm->page_flags & TTM_TT_FLAG_PRIV_POPULATED); 163 160 164 161 if (ttm->swap_storage) 165 162 fput(ttm->swap_storage); ··· 181 178 182 179 ttm_tt_init_fields(ttm, bo, page_flags, caching); 183 180 184 - if (page_flags & TTM_PAGE_FLAG_SG) 181 + if (page_flags & TTM_TT_FLAG_EXTERNAL) 185 182 ret = ttm_sg_tt_alloc_page_directory(ttm); 186 183 else 187 184 ret = ttm_dma_tt_alloc_page_directory(ttm); ··· 227 224 228 225 fput(swap_storage); 229 226 ttm->swap_storage = NULL; 230 - ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED; 227 + ttm->page_flags &= ~TTM_TT_FLAG_SWAPPED; 231 228 232 229 return 0; 233 230 ··· 282 279 283 280 ttm_tt_unpopulate(bdev, ttm); 284 281 ttm->swap_storage = swap_storage; 285 - ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED; 282 + ttm->page_flags |= TTM_TT_FLAG_SWAPPED; 286 283 287 284 return ttm->num_pages; 288 285 ··· 290 287 fput(swap_storage); 291 288 292 289 return ret; 293 - } 294 - 295 - static void ttm_tt_add_mapping(struct ttm_device *bdev, struct ttm_tt *ttm) 296 - { 297 - pgoff_t i; 298 - 299 - if (ttm->page_flags & TTM_PAGE_FLAG_SG) 300 - return; 301 - 302 - for (i = 0; i < ttm->num_pages; ++i) 303 - ttm->pages[i]->mapping = bdev->dev_mapping; 304 290 } 305 291 306 292 int ttm_tt_populate(struct ttm_device *bdev, ··· 303 311 if (ttm_tt_is_populated(ttm)) 304 312 return 0; 305 313 306 - if (!(ttm->page_flags & TTM_PAGE_FLAG_SG)) { 314 + if (!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL)) { 307 315 atomic_long_add(ttm->num_pages, &ttm_pages_allocated); 308 316 if (bdev->pool.use_dma32) 309 317 atomic_long_add(ttm->num_pages, ··· 328 336 if (ret) 329 337 goto error; 330 338 331 - ttm_tt_add_mapping(bdev, ttm); 332 - ttm->page_flags |= TTM_PAGE_FLAG_PRIV_POPULATED; 333 - if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) { 339 + ttm->page_flags |= TTM_TT_FLAG_PRIV_POPULATED; 340 + if (unlikely(ttm->page_flags & TTM_TT_FLAG_SWAPPED)) { 334 341 ret = ttm_tt_swapin(ttm); 335 342 if (unlikely(ret != 0)) { 336 343 ttm_tt_unpopulate(bdev, ttm); ··· 340 349 return 0; 341 350 342 351 error: 343 - if (!(ttm->page_flags & TTM_PAGE_FLAG_SG)) { 352 + if (!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL)) { 344 353 atomic_long_sub(ttm->num_pages, &ttm_pages_allocated); 345 354 if (bdev->pool.use_dma32) 346 355 atomic_long_sub(ttm->num_pages, ··· 350 359 } 351 360 EXPORT_SYMBOL(ttm_tt_populate); 352 361 353 - static void ttm_tt_clear_mapping(struct ttm_tt *ttm) 354 - { 355 - pgoff_t i; 356 - struct page **page = ttm->pages; 357 - 358 - if (ttm->page_flags & TTM_PAGE_FLAG_SG) 359 - return; 360 - 361 - for (i = 0; i < ttm->num_pages; ++i) { 362 - (*page)->mapping = NULL; 363 - (*page++)->index = 0; 364 - } 365 - } 366 - 367 362 void ttm_tt_unpopulate(struct ttm_device *bdev, struct ttm_tt *ttm) 368 363 { 369 364 if (!ttm_tt_is_populated(ttm)) 370 365 return; 371 366 372 - ttm_tt_clear_mapping(ttm); 373 367 if (bdev->funcs->ttm_tt_unpopulate) 374 368 bdev->funcs->ttm_tt_unpopulate(bdev, ttm); 375 369 else 376 370 ttm_pool_free(&bdev->pool, ttm); 377 371 378 - if (!(ttm->page_flags & TTM_PAGE_FLAG_SG)) { 372 + if (!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL)) { 379 373 atomic_long_sub(ttm->num_pages, &ttm_pages_allocated); 380 374 if (bdev->pool.use_dma32) 381 375 atomic_long_sub(ttm->num_pages, 382 376 &ttm_dma32_pages_allocated); 383 377 } 384 378 385 - ttm->page_flags &= ~TTM_PAGE_FLAG_PRIV_POPULATED; 379 + ttm->page_flags &= ~TTM_TT_FLAG_PRIV_POPULATED; 386 380 } 387 381 388 382 #ifdef CONFIG_DEBUG_FS
+5 -5
drivers/gpu/drm/v3d/v3d_drv.c
··· 83 83 return 0; 84 84 } 85 85 86 - 87 86 switch (args->param) { 88 87 case DRM_V3D_PARAM_SUPPORTS_TFU: 89 88 args->value = 1; ··· 95 96 return 0; 96 97 case DRM_V3D_PARAM_SUPPORTS_PERFMON: 97 98 args->value = (v3d->ver >= 40); 99 + return 0; 100 + case DRM_V3D_PARAM_SUPPORTS_MULTISYNC_EXT: 101 + args->value = 1; 98 102 return 0; 99 103 default: 100 104 DRM_DEBUG("Unknown parameter %d\n", args->param); ··· 138 136 struct v3d_file_priv *v3d_priv = file->driver_priv; 139 137 enum v3d_queue q; 140 138 141 - for (q = 0; q < V3D_MAX_QUEUES; q++) { 139 + for (q = 0; q < V3D_MAX_QUEUES; q++) 142 140 drm_sched_entity_destroy(&v3d_priv->sched_entity[q]); 143 - } 144 141 145 142 v3d_perfmon_close_file(v3d_priv); 146 143 kfree(v3d_priv); ··· 148 147 DEFINE_DRM_GEM_FOPS(v3d_drm_fops); 149 148 150 149 /* DRM_AUTH is required on SUBMIT_CL for now, while we don't have GMP 151 - * protection between clients. Note that render nodes would be be 150 + * protection between clients. Note that render nodes would be 152 151 * able to submit CLs that could access BOs from clients authenticated 153 152 * with the master node. The TFU doesn't use the GMP, so it would 154 153 * need to stay DRM_AUTH until we do buffer size/offset validation. ··· 219 218 int ret; 220 219 u32 mmu_debug; 221 220 u32 ident1; 222 - 223 221 224 222 v3d = devm_drm_dev_alloc(dev, &v3d_drm_driver, struct v3d_dev, drm); 225 223 if (IS_ERR(v3d))
+15 -9
drivers/gpu/drm/v3d/v3d_drv.h
··· 19 19 20 20 #define GMP_GRANULARITY (128 * 1024) 21 21 22 - /* Enum for each of the V3D queues. */ 23 - enum v3d_queue { 24 - V3D_BIN, 25 - V3D_RENDER, 26 - V3D_TFU, 27 - V3D_CSD, 28 - V3D_CACHE_CLEAN, 29 - }; 30 - 31 22 #define V3D_MAX_QUEUES (V3D_CACHE_CLEAN + 1) 32 23 33 24 struct v3d_queue_state { ··· 283 292 u32 timedout_batches; 284 293 285 294 struct drm_v3d_submit_csd args; 295 + }; 296 + 297 + struct v3d_submit_outsync { 298 + struct drm_syncobj *syncobj; 299 + }; 300 + 301 + struct v3d_submit_ext { 302 + u32 flags; 303 + u32 wait_stage; 304 + 305 + u32 in_sync_count; 306 + u64 in_syncs; 307 + 308 + u32 out_sync_count; 309 + struct v3d_submit_outsync *out_syncs; 286 310 }; 287 311 288 312 /**
+292 -100
drivers/gpu/drm/v3d/v3d_gem.c
··· 392 392 393 393 void v3d_job_cleanup(struct v3d_job *job) 394 394 { 395 + if (!job) 396 + return; 397 + 395 398 drm_sched_job_cleanup(&job->base); 396 399 v3d_job_put(job); 397 400 } ··· 419 416 return -EINVAL; 420 417 421 418 ret = drm_gem_dma_resv_wait(file_priv, args->handle, 422 - true, timeout_jiffies); 419 + true, timeout_jiffies); 423 420 424 421 /* Decrement the user's timeout, in case we got interrupted 425 422 * such that the ioctl will be restarted. ··· 438 435 } 439 436 440 437 static int 441 - v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv, 442 - struct v3d_job *job, void (*free)(struct kref *ref), 443 - u32 in_sync, enum v3d_queue queue) 438 + v3d_job_add_deps(struct drm_file *file_priv, struct v3d_job *job, 439 + u32 in_sync, u32 point) 444 440 { 445 441 struct dma_fence *in_fence = NULL; 446 - struct v3d_file_priv *v3d_priv = file_priv->driver_priv; 447 442 int ret; 448 443 444 + ret = drm_syncobj_find_fence(file_priv, in_sync, point, 0, &in_fence); 445 + if (ret == -EINVAL) 446 + return ret; 447 + 448 + return drm_sched_job_add_dependency(&job->base, in_fence); 449 + } 450 + 451 + static int 452 + v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv, 453 + void **container, size_t size, void (*free)(struct kref *ref), 454 + u32 in_sync, struct v3d_submit_ext *se, enum v3d_queue queue) 455 + { 456 + struct v3d_file_priv *v3d_priv = file_priv->driver_priv; 457 + struct v3d_job *job; 458 + bool has_multisync = se && (se->flags & DRM_V3D_EXT_ID_MULTI_SYNC); 459 + int ret, i; 460 + 461 + *container = kcalloc(1, size, GFP_KERNEL); 462 + if (!*container) { 463 + DRM_ERROR("Cannot allocate memory for v3d job."); 464 + return -ENOMEM; 465 + } 466 + 467 + job = *container; 449 468 job->v3d = v3d; 450 469 job->free = free; 451 470 452 471 ret = pm_runtime_get_sync(v3d->drm.dev); 453 472 if (ret < 0) 454 - return ret; 473 + goto fail; 455 474 456 475 ret = drm_sched_job_init(&job->base, &v3d_priv->sched_entity[queue], 457 476 v3d_priv); 458 477 if (ret) 459 - goto fail; 460 - 461 - ret = drm_syncobj_find_fence(file_priv, in_sync, 0, 0, &in_fence); 462 - if (ret == -EINVAL) 463 478 goto fail_job; 464 479 465 - ret = drm_sched_job_add_dependency(&job->base, in_fence); 466 - if (ret) 467 - goto fail_job; 480 + if (has_multisync) { 481 + if (se->in_sync_count && se->wait_stage == queue) { 482 + struct drm_v3d_sem __user *handle = u64_to_user_ptr(se->in_syncs); 483 + 484 + for (i = 0; i < se->in_sync_count; i++) { 485 + struct drm_v3d_sem in; 486 + 487 + ret = copy_from_user(&in, handle++, sizeof(in)); 488 + if (ret) { 489 + DRM_DEBUG("Failed to copy wait dep handle.\n"); 490 + goto fail_deps; 491 + } 492 + ret = v3d_job_add_deps(file_priv, job, in.handle, 0); 493 + if (ret) 494 + goto fail_deps; 495 + } 496 + } 497 + } else { 498 + ret = v3d_job_add_deps(file_priv, job, in_sync, 0); 499 + if (ret) 500 + goto fail_deps; 501 + } 468 502 469 503 kref_init(&job->refcount); 470 504 471 505 return 0; 472 - fail_job: 506 + 507 + fail_deps: 473 508 drm_sched_job_cleanup(&job->base); 474 - fail: 509 + fail_job: 475 510 pm_runtime_put_autosuspend(v3d->drm.dev); 511 + fail: 512 + kfree(*container); 513 + *container = NULL; 514 + 476 515 return ret; 477 516 } 478 517 ··· 536 491 struct v3d_job *job, 537 492 struct ww_acquire_ctx *acquire_ctx, 538 493 u32 out_sync, 494 + struct v3d_submit_ext *se, 539 495 struct dma_fence *done_fence) 540 496 { 541 497 struct drm_syncobj *sync_out; 498 + bool has_multisync = se && (se->flags & DRM_V3D_EXT_ID_MULTI_SYNC); 542 499 int i; 543 500 544 501 for (i = 0; i < job->bo_count; i++) { 545 502 /* XXX: Use shared fences for read-only objects. */ 546 503 dma_resv_add_excl_fence(job->bo[i]->resv, 547 - job->done_fence); 504 + job->done_fence); 548 505 } 549 506 550 507 drm_gem_unlock_reservations(job->bo, job->bo_count, acquire_ctx); 551 508 552 509 /* Update the return sync object for the job */ 553 - sync_out = drm_syncobj_find(file_priv, out_sync); 554 - if (sync_out) { 555 - drm_syncobj_replace_fence(sync_out, done_fence); 556 - drm_syncobj_put(sync_out); 510 + /* If it only supports a single signal semaphore*/ 511 + if (!has_multisync) { 512 + sync_out = drm_syncobj_find(file_priv, out_sync); 513 + if (sync_out) { 514 + drm_syncobj_replace_fence(sync_out, done_fence); 515 + drm_syncobj_put(sync_out); 516 + } 517 + return; 557 518 } 519 + 520 + /* If multiple semaphores extension is supported */ 521 + if (se->out_sync_count) { 522 + for (i = 0; i < se->out_sync_count; i++) { 523 + drm_syncobj_replace_fence(se->out_syncs[i].syncobj, 524 + done_fence); 525 + drm_syncobj_put(se->out_syncs[i].syncobj); 526 + } 527 + kvfree(se->out_syncs); 528 + } 529 + } 530 + 531 + static void 532 + v3d_put_multisync_post_deps(struct v3d_submit_ext *se) 533 + { 534 + unsigned int i; 535 + 536 + if (!(se && se->out_sync_count)) 537 + return; 538 + 539 + for (i = 0; i < se->out_sync_count; i++) 540 + drm_syncobj_put(se->out_syncs[i].syncobj); 541 + kvfree(se->out_syncs); 542 + } 543 + 544 + static int 545 + v3d_get_multisync_post_deps(struct drm_file *file_priv, 546 + struct v3d_submit_ext *se, 547 + u32 count, u64 handles) 548 + { 549 + struct drm_v3d_sem __user *post_deps; 550 + int i, ret; 551 + 552 + if (!count) 553 + return 0; 554 + 555 + se->out_syncs = (struct v3d_submit_outsync *) 556 + kvmalloc_array(count, 557 + sizeof(struct v3d_submit_outsync), 558 + GFP_KERNEL); 559 + if (!se->out_syncs) 560 + return -ENOMEM; 561 + 562 + post_deps = u64_to_user_ptr(handles); 563 + 564 + for (i = 0; i < count; i++) { 565 + struct drm_v3d_sem out; 566 + 567 + ret = copy_from_user(&out, post_deps++, sizeof(out)); 568 + if (ret) { 569 + DRM_DEBUG("Failed to copy post dep handles\n"); 570 + goto fail; 571 + } 572 + 573 + se->out_syncs[i].syncobj = drm_syncobj_find(file_priv, 574 + out.handle); 575 + if (!se->out_syncs[i].syncobj) { 576 + ret = -EINVAL; 577 + goto fail; 578 + } 579 + } 580 + se->out_sync_count = count; 581 + 582 + return 0; 583 + 584 + fail: 585 + for (i--; i >= 0; i--) 586 + drm_syncobj_put(se->out_syncs[i].syncobj); 587 + kvfree(se->out_syncs); 588 + 589 + return ret; 590 + } 591 + 592 + /* Get data for multiple binary semaphores synchronization. Parse syncobj 593 + * to be signaled when job completes (out_sync). 594 + */ 595 + static int 596 + v3d_get_multisync_submit_deps(struct drm_file *file_priv, 597 + struct drm_v3d_extension __user *ext, 598 + void *data) 599 + { 600 + struct drm_v3d_multi_sync multisync; 601 + struct v3d_submit_ext *se = data; 602 + int ret; 603 + 604 + ret = copy_from_user(&multisync, ext, sizeof(multisync)); 605 + if (ret) 606 + return ret; 607 + 608 + if (multisync.pad) 609 + return -EINVAL; 610 + 611 + ret = v3d_get_multisync_post_deps(file_priv, data, multisync.out_sync_count, 612 + multisync.out_syncs); 613 + if (ret) 614 + return ret; 615 + 616 + se->in_sync_count = multisync.in_sync_count; 617 + se->in_syncs = multisync.in_syncs; 618 + se->flags |= DRM_V3D_EXT_ID_MULTI_SYNC; 619 + se->wait_stage = multisync.wait_stage; 620 + 621 + return 0; 622 + } 623 + 624 + /* Whenever userspace sets ioctl extensions, v3d_get_extensions parses data 625 + * according to the extension id (name). 626 + */ 627 + static int 628 + v3d_get_extensions(struct drm_file *file_priv, 629 + u64 ext_handles, 630 + void *data) 631 + { 632 + struct drm_v3d_extension __user *user_ext; 633 + int ret; 634 + 635 + user_ext = u64_to_user_ptr(ext_handles); 636 + while (user_ext) { 637 + struct drm_v3d_extension ext; 638 + 639 + if (copy_from_user(&ext, user_ext, sizeof(ext))) { 640 + DRM_DEBUG("Failed to copy submit extension\n"); 641 + return -EFAULT; 642 + } 643 + 644 + switch (ext.id) { 645 + case DRM_V3D_EXT_ID_MULTI_SYNC: 646 + ret = v3d_get_multisync_submit_deps(file_priv, user_ext, data); 647 + if (ret) 648 + return ret; 649 + break; 650 + default: 651 + DRM_DEBUG_DRIVER("Unknown extension id: %d\n", ext.id); 652 + return -EINVAL; 653 + } 654 + 655 + user_ext = u64_to_user_ptr(ext.next); 656 + } 657 + 658 + return 0; 558 659 } 559 660 560 661 /** ··· 722 531 struct v3d_dev *v3d = to_v3d_dev(dev); 723 532 struct v3d_file_priv *v3d_priv = file_priv->driver_priv; 724 533 struct drm_v3d_submit_cl *args = data; 534 + struct v3d_submit_ext se = {0}; 725 535 struct v3d_bin_job *bin = NULL; 726 - struct v3d_render_job *render; 536 + struct v3d_render_job *render = NULL; 727 537 struct v3d_job *clean_job = NULL; 728 538 struct v3d_job *last_job; 729 539 struct ww_acquire_ctx acquire_ctx; ··· 732 540 733 541 trace_v3d_submit_cl_ioctl(&v3d->drm, args->rcl_start, args->rcl_end); 734 542 735 - if (args->pad != 0) 543 + if (args->pad) 736 544 return -EINVAL; 737 545 738 - if (args->flags != 0 && 739 - args->flags != DRM_V3D_SUBMIT_CL_FLUSH_CACHE) { 546 + if (args->flags && 547 + args->flags & ~(DRM_V3D_SUBMIT_CL_FLUSH_CACHE | 548 + DRM_V3D_SUBMIT_EXTENSION)) { 740 549 DRM_INFO("invalid flags: %d\n", args->flags); 741 550 return -EINVAL; 742 551 } 743 552 744 - render = kcalloc(1, sizeof(*render), GFP_KERNEL); 745 - if (!render) 746 - return -ENOMEM; 553 + if (args->flags & DRM_V3D_SUBMIT_EXTENSION) { 554 + ret = v3d_get_extensions(file_priv, args->extensions, &se); 555 + if (ret) { 556 + DRM_DEBUG("Failed to get extensions.\n"); 557 + return ret; 558 + } 559 + } 560 + 561 + ret = v3d_job_init(v3d, file_priv, (void *)&render, sizeof(*render), 562 + v3d_render_job_free, args->in_sync_rcl, &se, V3D_RENDER); 563 + if (ret) 564 + goto fail; 747 565 748 566 render->start = args->rcl_start; 749 567 render->end = args->rcl_end; 750 568 INIT_LIST_HEAD(&render->unref_list); 751 569 752 - ret = v3d_job_init(v3d, file_priv, &render->base, 753 - v3d_render_job_free, args->in_sync_rcl, V3D_RENDER); 754 - if (ret) { 755 - kfree(render); 756 - return ret; 757 - } 758 - 759 570 if (args->bcl_start != args->bcl_end) { 760 - bin = kcalloc(1, sizeof(*bin), GFP_KERNEL); 761 - if (!bin) { 762 - v3d_job_cleanup(&render->base); 763 - return -ENOMEM; 764 - } 765 - 766 - ret = v3d_job_init(v3d, file_priv, &bin->base, 767 - v3d_job_free, args->in_sync_bcl, V3D_BIN); 768 - if (ret) { 769 - v3d_job_cleanup(&render->base); 770 - kfree(bin); 771 - return ret; 772 - } 571 + ret = v3d_job_init(v3d, file_priv, (void *)&bin, sizeof(*bin), 572 + v3d_job_free, args->in_sync_bcl, &se, V3D_BIN); 573 + if (ret) 574 + goto fail; 773 575 774 576 bin->start = args->bcl_start; 775 577 bin->end = args->bcl_end; ··· 774 588 } 775 589 776 590 if (args->flags & DRM_V3D_SUBMIT_CL_FLUSH_CACHE) { 777 - clean_job = kcalloc(1, sizeof(*clean_job), GFP_KERNEL); 778 - if (!clean_job) { 779 - ret = -ENOMEM; 591 + ret = v3d_job_init(v3d, file_priv, (void *)&clean_job, sizeof(*clean_job), 592 + v3d_job_free, 0, 0, V3D_CACHE_CLEAN); 593 + if (ret) 780 594 goto fail; 781 - } 782 - 783 - ret = v3d_job_init(v3d, file_priv, clean_job, v3d_job_free, 0, V3D_CACHE_CLEAN); 784 - if (ret) { 785 - kfree(clean_job); 786 - clean_job = NULL; 787 - goto fail; 788 - } 789 595 790 596 last_job = clean_job; 791 597 } else { ··· 835 657 last_job, 836 658 &acquire_ctx, 837 659 args->out_sync, 660 + &se, 838 661 last_job->done_fence); 839 662 840 663 if (bin) ··· 851 672 drm_gem_unlock_reservations(last_job->bo, 852 673 last_job->bo_count, &acquire_ctx); 853 674 fail: 854 - if (bin) 855 - v3d_job_cleanup(&bin->base); 856 - v3d_job_cleanup(&render->base); 857 - if (clean_job) 858 - v3d_job_cleanup(clean_job); 675 + v3d_job_cleanup((void *)bin); 676 + v3d_job_cleanup((void *)render); 677 + v3d_job_cleanup(clean_job); 678 + v3d_put_multisync_post_deps(&se); 859 679 860 680 return ret; 861 681 } ··· 874 696 { 875 697 struct v3d_dev *v3d = to_v3d_dev(dev); 876 698 struct drm_v3d_submit_tfu *args = data; 877 - struct v3d_tfu_job *job; 699 + struct v3d_submit_ext se = {0}; 700 + struct v3d_tfu_job *job = NULL; 878 701 struct ww_acquire_ctx acquire_ctx; 879 702 int ret = 0; 880 703 881 704 trace_v3d_submit_tfu_ioctl(&v3d->drm, args->iia); 882 705 883 - job = kcalloc(1, sizeof(*job), GFP_KERNEL); 884 - if (!job) 885 - return -ENOMEM; 886 - 887 - ret = v3d_job_init(v3d, file_priv, &job->base, 888 - v3d_job_free, args->in_sync, V3D_TFU); 889 - if (ret) { 890 - kfree(job); 891 - return ret; 706 + if (args->flags && !(args->flags & DRM_V3D_SUBMIT_EXTENSION)) { 707 + DRM_DEBUG("invalid flags: %d\n", args->flags); 708 + return -EINVAL; 892 709 } 710 + 711 + if (args->flags & DRM_V3D_SUBMIT_EXTENSION) { 712 + ret = v3d_get_extensions(file_priv, args->extensions, &se); 713 + if (ret) { 714 + DRM_DEBUG("Failed to get extensions.\n"); 715 + return ret; 716 + } 717 + } 718 + 719 + ret = v3d_job_init(v3d, file_priv, (void *)&job, sizeof(*job), 720 + v3d_job_free, args->in_sync, &se, V3D_TFU); 721 + if (ret) 722 + goto fail; 893 723 894 724 job->base.bo = kcalloc(ARRAY_SIZE(args->bo_handles), 895 725 sizeof(*job->base.bo), GFP_KERNEL); 896 726 if (!job->base.bo) { 897 - v3d_job_cleanup(&job->base); 898 - return -ENOMEM; 727 + ret = -ENOMEM; 728 + goto fail; 899 729 } 900 730 901 731 job->args = *args; ··· 943 757 v3d_attach_fences_and_unlock_reservation(file_priv, 944 758 &job->base, &acquire_ctx, 945 759 args->out_sync, 760 + &se, 946 761 job->base.done_fence); 947 762 948 763 v3d_job_put(&job->base); ··· 951 764 return 0; 952 765 953 766 fail: 954 - v3d_job_cleanup(&job->base); 767 + v3d_job_cleanup((void *)job); 768 + v3d_put_multisync_post_deps(&se); 955 769 956 770 return ret; 957 771 } ··· 973 785 struct v3d_dev *v3d = to_v3d_dev(dev); 974 786 struct v3d_file_priv *v3d_priv = file_priv->driver_priv; 975 787 struct drm_v3d_submit_csd *args = data; 976 - struct v3d_csd_job *job; 977 - struct v3d_job *clean_job; 788 + struct v3d_submit_ext se = {0}; 789 + struct v3d_csd_job *job = NULL; 790 + struct v3d_job *clean_job = NULL; 978 791 struct ww_acquire_ctx acquire_ctx; 979 792 int ret; 980 793 981 794 trace_v3d_submit_csd_ioctl(&v3d->drm, args->cfg[5], args->cfg[6]); 795 + 796 + if (args->pad) 797 + return -EINVAL; 982 798 983 799 if (!v3d_has_csd(v3d)) { 984 800 DRM_DEBUG("Attempting CSD submit on non-CSD hardware\n"); 985 801 return -EINVAL; 986 802 } 987 803 988 - job = kcalloc(1, sizeof(*job), GFP_KERNEL); 989 - if (!job) 990 - return -ENOMEM; 991 - 992 - ret = v3d_job_init(v3d, file_priv, &job->base, 993 - v3d_job_free, args->in_sync, V3D_CSD); 994 - if (ret) { 995 - kfree(job); 996 - return ret; 804 + if (args->flags && !(args->flags & DRM_V3D_SUBMIT_EXTENSION)) { 805 + DRM_INFO("invalid flags: %d\n", args->flags); 806 + return -EINVAL; 997 807 } 998 808 999 - clean_job = kcalloc(1, sizeof(*clean_job), GFP_KERNEL); 1000 - if (!clean_job) { 1001 - v3d_job_cleanup(&job->base); 1002 - return -ENOMEM; 809 + if (args->flags & DRM_V3D_SUBMIT_EXTENSION) { 810 + ret = v3d_get_extensions(file_priv, args->extensions, &se); 811 + if (ret) { 812 + DRM_DEBUG("Failed to get extensions.\n"); 813 + return ret; 814 + } 1003 815 } 1004 816 1005 - ret = v3d_job_init(v3d, file_priv, clean_job, v3d_job_free, 0, V3D_CACHE_CLEAN); 1006 - if (ret) { 1007 - v3d_job_cleanup(&job->base); 1008 - kfree(clean_job); 1009 - return ret; 1010 - } 817 + ret = v3d_job_init(v3d, file_priv, (void *)&job, sizeof(*job), 818 + v3d_job_free, args->in_sync, &se, V3D_CSD); 819 + if (ret) 820 + goto fail; 821 + 822 + ret = v3d_job_init(v3d, file_priv, (void *)&clean_job, sizeof(*clean_job), 823 + v3d_job_free, 0, 0, V3D_CACHE_CLEAN); 824 + if (ret) 825 + goto fail; 1011 826 1012 827 job->args = *args; 1013 828 ··· 1047 856 clean_job, 1048 857 &acquire_ctx, 1049 858 args->out_sync, 859 + &se, 1050 860 clean_job->done_fence); 1051 861 1052 862 v3d_job_put(&job->base); ··· 1060 868 drm_gem_unlock_reservations(clean_job->bo, clean_job->bo_count, 1061 869 &acquire_ctx); 1062 870 fail: 1063 - v3d_job_cleanup(&job->base); 871 + v3d_job_cleanup((void *)job); 1064 872 v3d_job_cleanup(clean_job); 873 + v3d_put_multisync_post_deps(&se); 1065 874 1066 875 return ret; 1067 876 } ··· 1096 903 if (!v3d->pt) { 1097 904 drm_mm_takedown(&v3d->mm); 1098 905 dev_err(v3d->drm.dev, 1099 - "Failed to allocate page tables. " 1100 - "Please ensure you have CMA enabled.\n"); 906 + "Failed to allocate page tables. Please ensure you have CMA enabled.\n"); 1101 907 return -ENOMEM; 1102 908 } 1103 909
+1 -4
drivers/gpu/drm/vboxvideo/vbox_drv.c
··· 69 69 70 70 ret = vbox_mode_init(vbox); 71 71 if (ret) 72 - goto err_mm_fini; 72 + goto err_hw_fini; 73 73 74 74 ret = vbox_irq_init(vbox); 75 75 if (ret) ··· 87 87 vbox_irq_fini(vbox); 88 88 err_mode_fini: 89 89 vbox_mode_fini(vbox); 90 - err_mm_fini: 91 - vbox_mm_fini(vbox); 92 90 err_hw_fini: 93 91 vbox_hw_fini(vbox); 94 92 return ret; ··· 99 101 drm_dev_unregister(&vbox->ddev); 100 102 vbox_irq_fini(vbox); 101 103 vbox_mode_fini(vbox); 102 - vbox_mm_fini(vbox); 103 104 vbox_hw_fini(vbox); 104 105 } 105 106
-1
drivers/gpu/drm/vboxvideo/vbox_drv.h
··· 139 139 void vbox_report_caps(struct vbox_private *vbox); 140 140 141 141 int vbox_mm_init(struct vbox_private *vbox); 142 - void vbox_mm_fini(struct vbox_private *vbox); 143 142 144 143 /* vbox_irq.c */ 145 144 int vbox_irq_init(struct vbox_private *vbox);
+8 -9
drivers/gpu/drm/vboxvideo/vbox_ttm.c
··· 13 13 int vbox_mm_init(struct vbox_private *vbox) 14 14 { 15 15 int ret; 16 + resource_size_t base, size; 16 17 struct drm_device *dev = &vbox->ddev; 17 18 struct pci_dev *pdev = to_pci_dev(dev->dev); 18 19 19 - ret = drmm_vram_helper_init(dev, pci_resource_start(pdev, 0), 20 - vbox->available_vram_size); 20 + base = pci_resource_start(pdev, 0); 21 + size = pci_resource_len(pdev, 0); 22 + 23 + /* Don't fail on errors, but performance might be reduced. */ 24 + devm_arch_phys_wc_add(&pdev->dev, base, size); 25 + 26 + ret = drmm_vram_helper_init(dev, base, vbox->available_vram_size); 21 27 if (ret) { 22 28 DRM_ERROR("Error initializing VRAM MM; %d\n", ret); 23 29 return ret; 24 30 } 25 31 26 - vbox->fb_mtrr = arch_phys_wc_add(pci_resource_start(pdev, 0), 27 - pci_resource_len(pdev, 0)); 28 32 return 0; 29 - } 30 - 31 - void vbox_mm_fini(struct vbox_private *vbox) 32 - { 33 - arch_phys_wc_del(vbox->fb_mtrr); 34 33 }
+3 -2
drivers/gpu/drm/vc4/vc4_hdmi.c
··· 1564 1564 static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv) 1565 1565 { 1566 1566 struct vc4_hdmi *vc4_hdmi = priv; 1567 - struct drm_device *dev = vc4_hdmi->connector.dev; 1567 + struct drm_connector *connector = &vc4_hdmi->connector; 1568 + struct drm_device *dev = connector->dev; 1568 1569 1569 1570 if (dev && dev->registered) 1570 - drm_kms_helper_hotplug_event(dev); 1571 + drm_connector_helper_hpd_irq_event(connector); 1571 1572 1572 1573 return IRQ_HANDLED; 1573 1574 }
+1
drivers/gpu/drm/virtio/virtgpu_debugfs.c
··· 52 52 vgdev->has_resource_assign_uuid); 53 53 54 54 virtio_gpu_add_bool(m, "blob resources", vgdev->has_resource_blob); 55 + virtio_gpu_add_bool(m, "context init", vgdev->has_context_init); 55 56 virtio_gpu_add_int(m, "cap sets", vgdev->num_capsets); 56 57 virtio_gpu_add_int(m, "scanouts", vgdev->num_scanouts); 57 58 if (vgdev->host_visible_region.len) {
+43 -1
drivers/gpu/drm/virtio/virtgpu_drv.c
··· 29 29 #include <linux/module.h> 30 30 #include <linux/console.h> 31 31 #include <linux/pci.h> 32 + #include <linux/poll.h> 33 + #include <linux/wait.h> 32 34 33 35 #include <drm/drm.h> 34 36 #include <drm/drm_aperture.h> ··· 157 155 schedule_work(&vgdev->config_changed_work); 158 156 } 159 157 158 + static __poll_t virtio_gpu_poll(struct file *filp, 159 + struct poll_table_struct *wait) 160 + { 161 + struct drm_file *drm_file = filp->private_data; 162 + struct virtio_gpu_fpriv *vfpriv = drm_file->driver_priv; 163 + struct drm_device *dev = drm_file->minor->dev; 164 + struct drm_pending_event *e = NULL; 165 + __poll_t mask = 0; 166 + 167 + if (!vfpriv->ring_idx_mask) 168 + return drm_poll(filp, wait); 169 + 170 + poll_wait(filp, &drm_file->event_wait, wait); 171 + 172 + if (!list_empty(&drm_file->event_list)) { 173 + spin_lock_irq(&dev->event_lock); 174 + e = list_first_entry(&drm_file->event_list, 175 + struct drm_pending_event, link); 176 + drm_file->event_space += e->event->length; 177 + list_del(&e->link); 178 + spin_unlock_irq(&dev->event_lock); 179 + 180 + kfree(e); 181 + mask |= EPOLLIN | EPOLLRDNORM; 182 + } 183 + 184 + return mask; 185 + } 186 + 160 187 static struct virtio_device_id id_table[] = { 161 188 { VIRTIO_ID_GPU, VIRTIO_DEV_ANY_ID }, 162 189 { 0 }, ··· 203 172 VIRTIO_GPU_F_EDID, 204 173 VIRTIO_GPU_F_RESOURCE_UUID, 205 174 VIRTIO_GPU_F_RESOURCE_BLOB, 175 + VIRTIO_GPU_F_CONTEXT_INIT, 206 176 }; 207 177 static struct virtio_driver virtio_gpu_driver = { 208 178 .feature_table = features, ··· 225 193 MODULE_AUTHOR("Gerd Hoffmann <kraxel@redhat.com>"); 226 194 MODULE_AUTHOR("Alon Levy"); 227 195 228 - DEFINE_DRM_GEM_FOPS(virtio_gpu_driver_fops); 196 + static const struct file_operations virtio_gpu_driver_fops = { 197 + .owner = THIS_MODULE, 198 + .open = drm_open, 199 + .release = drm_release, 200 + .unlocked_ioctl = drm_ioctl, 201 + .compat_ioctl = drm_compat_ioctl, 202 + .poll = virtio_gpu_poll, 203 + .read = drm_read, 204 + .llseek = noop_llseek, 205 + .mmap = drm_gem_mmap 206 + }; 229 207 230 208 static const struct drm_driver driver = { 231 209 .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_RENDER | DRIVER_ATOMIC,
+24 -4
drivers/gpu/drm/virtio/virtgpu_drv.h
··· 55 55 #define STATE_OK 1 56 56 #define STATE_ERR 2 57 57 58 + #define MAX_CAPSET_ID 63 59 + #define MAX_RINGS 64 60 + 58 61 struct virtio_gpu_object_params { 59 62 unsigned long size; 60 63 bool dumb; ··· 138 135 spinlock_t lock; 139 136 }; 140 137 138 + #define VIRTGPU_EVENT_FENCE_SIGNALED_INTERNAL 0x10000000 139 + struct virtio_gpu_fence_event { 140 + struct drm_pending_event base; 141 + struct drm_event event; 142 + }; 143 + 141 144 struct virtio_gpu_fence { 142 145 struct dma_fence f; 146 + uint32_t ring_idx; 143 147 uint64_t fence_id; 148 + bool emit_fence_info; 149 + struct virtio_gpu_fence_event *e; 144 150 struct virtio_gpu_fence_driver *drv; 145 151 struct list_head node; 146 152 }; ··· 246 234 bool has_resource_assign_uuid; 247 235 bool has_resource_blob; 248 236 bool has_host_visible; 237 + bool has_context_init; 249 238 struct virtio_shm_region host_visible_region; 250 239 struct drm_mm host_visible_mm; 251 240 ··· 258 245 259 246 struct virtio_gpu_drv_capset *capsets; 260 247 uint32_t num_capsets; 248 + uint64_t capset_id_mask; 261 249 struct list_head cap_cache; 262 250 263 251 /* protects uuid state when exporting */ ··· 269 255 270 256 struct virtio_gpu_fpriv { 271 257 uint32_t ctx_id; 258 + uint32_t context_init; 272 259 bool context_created; 260 + uint32_t num_rings; 261 + uint64_t base_fence_ctx; 262 + uint64_t ring_idx_mask; 273 263 struct mutex context_lock; 274 264 }; 275 265 276 266 /* virtgpu_ioctl.c */ 277 - #define DRM_VIRTIO_NUM_IOCTLS 11 267 + #define DRM_VIRTIO_NUM_IOCTLS 12 278 268 extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS]; 279 269 void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file); 280 270 ··· 356 338 struct virtio_gpu_drv_cap_cache **cache_p); 357 339 int virtio_gpu_cmd_get_edids(struct virtio_gpu_device *vgdev); 358 340 void virtio_gpu_cmd_context_create(struct virtio_gpu_device *vgdev, uint32_t id, 359 - uint32_t nlen, const char *name); 341 + uint32_t context_init, uint32_t nlen, 342 + const char *name); 360 343 void virtio_gpu_cmd_context_destroy(struct virtio_gpu_device *vgdev, 361 344 uint32_t id); 362 345 void virtio_gpu_cmd_context_attach_resource(struct virtio_gpu_device *vgdev, ··· 437 418 int index); 438 419 439 420 /* virtgpu_fence.c */ 440 - struct virtio_gpu_fence *virtio_gpu_fence_alloc( 441 - struct virtio_gpu_device *vgdev); 421 + struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev, 422 + uint64_t base_fence_ctx, 423 + uint32_t ring_idx); 442 424 void virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev, 443 425 struct virtio_gpu_ctrl_hdr *cmd_hdr, 444 426 struct virtio_gpu_fence *fence);
+27 -3
drivers/gpu/drm/virtio/virtgpu_fence.c
··· 71 71 .timeline_value_str = virtio_gpu_timeline_value_str, 72 72 }; 73 73 74 - struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev) 74 + struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev, 75 + uint64_t base_fence_ctx, 76 + uint32_t ring_idx) 75 77 { 78 + uint64_t fence_context = base_fence_ctx + ring_idx; 76 79 struct virtio_gpu_fence_driver *drv = &vgdev->fence_drv; 77 80 struct virtio_gpu_fence *fence = kzalloc(sizeof(struct virtio_gpu_fence), 78 81 GFP_KERNEL); 82 + 79 83 if (!fence) 80 84 return fence; 81 85 82 86 fence->drv = drv; 87 + fence->ring_idx = ring_idx; 88 + fence->emit_fence_info = !(base_fence_ctx == drv->context); 83 89 84 90 /* This only partially initializes the fence because the seqno is 85 91 * unknown yet. The fence must not be used outside of the driver 86 92 * until virtio_gpu_fence_emit is called. 87 93 */ 88 - dma_fence_init(&fence->f, &virtio_gpu_fence_ops, &drv->lock, drv->context, 89 - 0); 94 + 95 + dma_fence_init(&fence->f, &virtio_gpu_fence_ops, &drv->lock, 96 + fence_context, 0); 90 97 91 98 return fence; 92 99 } ··· 115 108 116 109 cmd_hdr->flags |= cpu_to_le32(VIRTIO_GPU_FLAG_FENCE); 117 110 cmd_hdr->fence_id = cpu_to_le64(fence->fence_id); 111 + 112 + /* Only currently defined fence param. */ 113 + if (fence->emit_fence_info) { 114 + cmd_hdr->flags |= 115 + cpu_to_le32(VIRTIO_GPU_FLAG_INFO_RING_IDX); 116 + cmd_hdr->ring_idx = (u8)fence->ring_idx; 117 + } 118 118 } 119 119 120 120 void virtio_gpu_fence_event_process(struct virtio_gpu_device *vgdev, ··· 152 138 continue; 153 139 154 140 dma_fence_signal_locked(&curr->f); 141 + if (curr->e) { 142 + drm_send_event(vgdev->ddev, &curr->e->base); 143 + curr->e = NULL; 144 + } 145 + 155 146 list_del(&curr->node); 156 147 dma_fence_put(&curr->f); 157 148 } 158 149 159 150 dma_fence_signal_locked(&signaled->f); 151 + if (signaled->e) { 152 + drm_send_event(vgdev->ddev, &signaled->e->base); 153 + signaled->e = NULL; 154 + } 155 + 160 156 list_del(&signaled->node); 161 157 dma_fence_put(&signaled->f); 162 158 break;
+186 -9
drivers/gpu/drm/virtio/virtgpu_ioctl.c
··· 38 38 VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \ 39 39 VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) 40 40 41 + static int virtio_gpu_fence_event_create(struct drm_device *dev, 42 + struct drm_file *file, 43 + struct virtio_gpu_fence *fence, 44 + uint32_t ring_idx) 45 + { 46 + struct virtio_gpu_fpriv *vfpriv = file->driver_priv; 47 + struct virtio_gpu_fence_event *e = NULL; 48 + int ret; 49 + 50 + if (!(vfpriv->ring_idx_mask & (1 << ring_idx))) 51 + return 0; 52 + 53 + e = kzalloc(sizeof(*e), GFP_KERNEL); 54 + if (!e) 55 + return -ENOMEM; 56 + 57 + e->event.type = VIRTGPU_EVENT_FENCE_SIGNALED_INTERNAL; 58 + e->event.length = sizeof(e->event); 59 + 60 + ret = drm_event_reserve_init(dev, file, &e->base, &e->event); 61 + if (ret) 62 + goto free; 63 + 64 + fence->e = e; 65 + return 0; 66 + free: 67 + kfree(e); 68 + return ret; 69 + } 70 + 71 + /* Must be called with &virtio_gpu_fpriv.struct_mutex held. */ 72 + static void virtio_gpu_create_context_locked(struct virtio_gpu_device *vgdev, 73 + struct virtio_gpu_fpriv *vfpriv) 74 + { 75 + char dbgname[TASK_COMM_LEN]; 76 + 77 + get_task_comm(dbgname, current); 78 + virtio_gpu_cmd_context_create(vgdev, vfpriv->ctx_id, 79 + vfpriv->context_init, strlen(dbgname), 80 + dbgname); 81 + 82 + vfpriv->context_created = true; 83 + } 84 + 41 85 void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file) 42 86 { 43 87 struct virtio_gpu_device *vgdev = dev->dev_private; 44 88 struct virtio_gpu_fpriv *vfpriv = file->driver_priv; 45 - char dbgname[TASK_COMM_LEN]; 46 89 47 90 mutex_lock(&vfpriv->context_lock); 48 91 if (vfpriv->context_created) 49 92 goto out_unlock; 50 93 51 - get_task_comm(dbgname, current); 52 - virtio_gpu_cmd_context_create(vgdev, vfpriv->ctx_id, 53 - strlen(dbgname), dbgname); 54 - vfpriv->context_created = true; 94 + virtio_gpu_create_context_locked(vgdev, vfpriv); 55 95 56 96 out_unlock: 57 97 mutex_unlock(&vfpriv->context_lock); ··· 129 89 int in_fence_fd = exbuf->fence_fd; 130 90 int out_fence_fd = -1; 131 91 void *buf; 92 + uint64_t fence_ctx; 93 + uint32_t ring_idx; 94 + 95 + fence_ctx = vgdev->fence_drv.context; 96 + ring_idx = 0; 132 97 133 98 if (vgdev->has_virgl_3d == false) 134 99 return -ENOSYS; 135 100 136 101 if ((exbuf->flags & ~VIRTGPU_EXECBUF_FLAGS)) 137 102 return -EINVAL; 103 + 104 + if ((exbuf->flags & VIRTGPU_EXECBUF_RING_IDX)) { 105 + if (exbuf->ring_idx >= vfpriv->num_rings) 106 + return -EINVAL; 107 + 108 + if (!vfpriv->base_fence_ctx) 109 + return -EINVAL; 110 + 111 + fence_ctx = vfpriv->base_fence_ctx; 112 + ring_idx = exbuf->ring_idx; 113 + } 138 114 139 115 exbuf->fence_fd = -1; 140 116 ··· 219 163 goto out_memdup; 220 164 } 221 165 222 - out_fence = virtio_gpu_fence_alloc(vgdev); 166 + out_fence = virtio_gpu_fence_alloc(vgdev, fence_ctx, ring_idx); 223 167 if(!out_fence) { 224 168 ret = -ENOMEM; 225 169 goto out_unresv; 226 170 } 171 + 172 + ret = virtio_gpu_fence_event_create(dev, file, out_fence, ring_idx); 173 + if (ret) 174 + goto out_unresv; 227 175 228 176 if (out_fence_fd >= 0) { 229 177 sync_file = sync_file_create(&out_fence->f); ··· 286 226 case VIRTGPU_PARAM_CROSS_DEVICE: 287 227 value = vgdev->has_resource_assign_uuid ? 1 : 0; 288 228 break; 229 + case VIRTGPU_PARAM_CONTEXT_INIT: 230 + value = vgdev->has_context_init ? 1 : 0; 231 + break; 232 + case VIRTGPU_PARAM_SUPPORTED_CAPSET_IDs: 233 + value = vgdev->capset_id_mask; 234 + break; 289 235 default: 290 236 return -EINVAL; 291 237 } ··· 344 278 if (params.size == 0) 345 279 params.size = PAGE_SIZE; 346 280 347 - fence = virtio_gpu_fence_alloc(vgdev); 281 + fence = virtio_gpu_fence_alloc(vgdev, vgdev->fence_drv.context, 0); 348 282 if (!fence) 349 283 return -ENOMEM; 350 284 ret = virtio_gpu_object_create(vgdev, &params, &qobj, fence); ··· 423 357 if (ret != 0) 424 358 goto err_put_free; 425 359 426 - fence = virtio_gpu_fence_alloc(vgdev); 360 + fence = virtio_gpu_fence_alloc(vgdev, vgdev->fence_drv.context, 0); 427 361 if (!fence) { 428 362 ret = -ENOMEM; 429 363 goto err_unlock; ··· 483 417 goto err_put_free; 484 418 485 419 ret = -ENOMEM; 486 - fence = virtio_gpu_fence_alloc(vgdev); 420 + fence = virtio_gpu_fence_alloc(vgdev, vgdev->fence_drv.context, 421 + 0); 487 422 if (!fence) 488 423 goto err_unlock; 489 424 ··· 729 662 return 0; 730 663 } 731 664 665 + static int virtio_gpu_context_init_ioctl(struct drm_device *dev, 666 + void *data, struct drm_file *file) 667 + { 668 + int ret = 0; 669 + uint32_t num_params, i, param, value; 670 + uint64_t valid_ring_mask; 671 + size_t len; 672 + struct drm_virtgpu_context_set_param *ctx_set_params = NULL; 673 + struct virtio_gpu_device *vgdev = dev->dev_private; 674 + struct virtio_gpu_fpriv *vfpriv = file->driver_priv; 675 + struct drm_virtgpu_context_init *args = data; 676 + 677 + num_params = args->num_params; 678 + len = num_params * sizeof(struct drm_virtgpu_context_set_param); 679 + 680 + if (!vgdev->has_context_init || !vgdev->has_virgl_3d) 681 + return -EINVAL; 682 + 683 + /* Number of unique parameters supported at this time. */ 684 + if (num_params > 3) 685 + return -EINVAL; 686 + 687 + ctx_set_params = memdup_user(u64_to_user_ptr(args->ctx_set_params), 688 + len); 689 + 690 + if (IS_ERR(ctx_set_params)) 691 + return PTR_ERR(ctx_set_params); 692 + 693 + mutex_lock(&vfpriv->context_lock); 694 + if (vfpriv->context_created) { 695 + ret = -EEXIST; 696 + goto out_unlock; 697 + } 698 + 699 + for (i = 0; i < num_params; i++) { 700 + param = ctx_set_params[i].param; 701 + value = ctx_set_params[i].value; 702 + 703 + switch (param) { 704 + case VIRTGPU_CONTEXT_PARAM_CAPSET_ID: 705 + if (value > MAX_CAPSET_ID) { 706 + ret = -EINVAL; 707 + goto out_unlock; 708 + } 709 + 710 + if ((vgdev->capset_id_mask & (1 << value)) == 0) { 711 + ret = -EINVAL; 712 + goto out_unlock; 713 + } 714 + 715 + /* Context capset ID already set */ 716 + if (vfpriv->context_init & 717 + VIRTIO_GPU_CONTEXT_INIT_CAPSET_ID_MASK) { 718 + ret = -EINVAL; 719 + goto out_unlock; 720 + } 721 + 722 + vfpriv->context_init |= value; 723 + break; 724 + case VIRTGPU_CONTEXT_PARAM_NUM_RINGS: 725 + if (vfpriv->base_fence_ctx) { 726 + ret = -EINVAL; 727 + goto out_unlock; 728 + } 729 + 730 + if (value > MAX_RINGS) { 731 + ret = -EINVAL; 732 + goto out_unlock; 733 + } 734 + 735 + vfpriv->base_fence_ctx = dma_fence_context_alloc(value); 736 + vfpriv->num_rings = value; 737 + break; 738 + case VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK: 739 + if (vfpriv->ring_idx_mask) { 740 + ret = -EINVAL; 741 + goto out_unlock; 742 + } 743 + 744 + vfpriv->ring_idx_mask = value; 745 + break; 746 + default: 747 + ret = -EINVAL; 748 + goto out_unlock; 749 + } 750 + } 751 + 752 + if (vfpriv->ring_idx_mask) { 753 + valid_ring_mask = 0; 754 + for (i = 0; i < vfpriv->num_rings; i++) 755 + valid_ring_mask |= 1 << i; 756 + 757 + if (~valid_ring_mask & vfpriv->ring_idx_mask) { 758 + ret = -EINVAL; 759 + goto out_unlock; 760 + } 761 + } 762 + 763 + virtio_gpu_create_context_locked(vgdev, vfpriv); 764 + virtio_gpu_notify(vgdev); 765 + 766 + out_unlock: 767 + mutex_unlock(&vfpriv->context_lock); 768 + kfree(ctx_set_params); 769 + return ret; 770 + } 771 + 732 772 struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS] = { 733 773 DRM_IOCTL_DEF_DRV(VIRTGPU_MAP, virtio_gpu_map_ioctl, 734 774 DRM_RENDER_ALLOW), ··· 871 697 872 698 DRM_IOCTL_DEF_DRV(VIRTGPU_RESOURCE_CREATE_BLOB, 873 699 virtio_gpu_resource_create_blob_ioctl, 700 + DRM_RENDER_ALLOW), 701 + 702 + DRM_IOCTL_DEF_DRV(VIRTGPU_CONTEXT_INIT, virtio_gpu_context_init_ioctl, 874 703 DRM_RENDER_ALLOW), 875 704 };
+24 -2
drivers/gpu/drm/virtio/virtgpu_kms.c
··· 65 65 int num_capsets) 66 66 { 67 67 int i, ret; 68 + bool invalid_capset_id = false; 68 69 69 70 vgdev->capsets = kcalloc(num_capsets, 70 71 sizeof(struct virtio_gpu_drv_capset), ··· 79 78 virtio_gpu_notify(vgdev); 80 79 ret = wait_event_timeout(vgdev->resp_wq, 81 80 vgdev->capsets[i].id > 0, 5 * HZ); 82 - if (ret == 0) { 81 + /* 82 + * Capability ids are defined in the virtio-gpu spec and are 83 + * between 1 to 63, inclusive. 84 + */ 85 + if (!vgdev->capsets[i].id || 86 + vgdev->capsets[i].id > MAX_CAPSET_ID) 87 + invalid_capset_id = true; 88 + 89 + if (ret == 0) 83 90 DRM_ERROR("timed out waiting for cap set %d\n", i); 91 + else if (invalid_capset_id) 92 + DRM_ERROR("invalid capset id %u", vgdev->capsets[i].id); 93 + 94 + if (ret == 0 || invalid_capset_id) { 84 95 spin_lock(&vgdev->display_info_lock); 85 96 kfree(vgdev->capsets); 86 97 vgdev->capsets = NULL; 87 98 spin_unlock(&vgdev->display_info_lock); 88 99 return; 89 100 } 101 + 102 + vgdev->capset_id_mask |= 1 << vgdev->capsets[i].id; 90 103 DRM_INFO("cap set %d: id %d, max-version %d, max-size %d\n", 91 104 i, vgdev->capsets[i].id, 92 105 vgdev->capsets[i].max_version, 93 106 vgdev->capsets[i].max_size); 94 107 } 108 + 95 109 vgdev->num_capsets = num_capsets; 96 110 } 97 111 ··· 191 175 (unsigned long)vgdev->host_visible_region.addr, 192 176 (unsigned long)vgdev->host_visible_region.len); 193 177 } 178 + if (virtio_has_feature(vgdev->vdev, VIRTIO_GPU_F_CONTEXT_INIT)) { 179 + vgdev->has_context_init = true; 180 + } 194 181 195 - DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible\n", 182 + DRM_INFO("features: %cvirgl %cedid %cresource_blob %chost_visible", 196 183 vgdev->has_virgl_3d ? '+' : '-', 197 184 vgdev->has_edid ? '+' : '-', 198 185 vgdev->has_resource_blob ? '+' : '-', 199 186 vgdev->has_host_visible ? '+' : '-'); 187 + 188 + DRM_INFO("features: %ccontext_init\n", 189 + vgdev->has_context_init ? '+' : '-'); 200 190 201 191 ret = virtio_find_vqs(vgdev->vdev, 2, vqs, callbacks, names, NULL); 202 192 if (ret) {
+2 -1
drivers/gpu/drm/virtio/virtgpu_plane.c
··· 256 256 return 0; 257 257 258 258 if (bo->dumb && (plane->state->fb != new_state->fb)) { 259 - vgfb->fence = virtio_gpu_fence_alloc(vgdev); 259 + vgfb->fence = virtio_gpu_fence_alloc(vgdev, vgdev->fence_drv.context, 260 + 0); 260 261 if (!vgfb->fence) 261 262 return -ENOMEM; 262 263 }
+6 -13
drivers/gpu/drm/virtio/virtgpu_vq.c
··· 199 199 struct list_head reclaim_list; 200 200 struct virtio_gpu_vbuffer *entry, *tmp; 201 201 struct virtio_gpu_ctrl_hdr *resp; 202 - u64 fence_id = 0; 202 + u64 fence_id; 203 203 204 204 INIT_LIST_HEAD(&reclaim_list); 205 205 spin_lock(&vgdev->ctrlq.qlock); ··· 226 226 DRM_DEBUG("response 0x%x\n", le32_to_cpu(resp->type)); 227 227 } 228 228 if (resp->flags & cpu_to_le32(VIRTIO_GPU_FLAG_FENCE)) { 229 - u64 f = le64_to_cpu(resp->fence_id); 230 - 231 - if (fence_id > f) { 232 - DRM_ERROR("%s: Oops: fence %llx -> %llx\n", 233 - __func__, fence_id, f); 234 - } else { 235 - fence_id = f; 236 - } 229 + fence_id = le64_to_cpu(resp->fence_id); 230 + virtio_gpu_fence_event_process(vgdev, fence_id); 237 231 } 238 232 if (entry->resp_cb) 239 233 entry->resp_cb(vgdev, entry); 240 234 } 241 235 wake_up(&vgdev->ctrlq.ack_queue); 242 - 243 - if (fence_id) 244 - virtio_gpu_fence_event_process(vgdev, fence_id); 245 236 246 237 list_for_each_entry_safe(entry, tmp, &reclaim_list, list) { 247 238 if (entry->objs) ··· 902 911 } 903 912 904 913 void virtio_gpu_cmd_context_create(struct virtio_gpu_device *vgdev, uint32_t id, 905 - uint32_t nlen, const char *name) 914 + uint32_t context_init, uint32_t nlen, 915 + const char *name) 906 916 { 907 917 struct virtio_gpu_ctx_create *cmd_p; 908 918 struct virtio_gpu_vbuffer *vbuf; ··· 914 922 cmd_p->hdr.type = cpu_to_le32(VIRTIO_GPU_CMD_CTX_CREATE); 915 923 cmd_p->hdr.ctx_id = cpu_to_le32(id); 916 924 cmd_p->nlen = cpu_to_le32(nlen); 925 + cmd_p->context_init = cpu_to_le32(context_init); 917 926 strncpy(cmd_p->debug_name, name, sizeof(cmd_p->debug_name) - 1); 918 927 cmd_p->debug_name[sizeof(cmd_p->debug_name) - 1] = 0; 919 928 virtio_gpu_queue_ctrl_buffer(vgdev, vbuf);
+21 -2
include/drm/drm_bridge.h
··· 790 790 791 791 void drm_bridge_add(struct drm_bridge *bridge); 792 792 void drm_bridge_remove(struct drm_bridge *bridge); 793 - struct drm_bridge *of_drm_find_bridge(struct device_node *np); 794 793 int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, 795 794 struct drm_bridge *previous, 796 795 enum drm_bridge_attach_flags flags); 796 + 797 + #ifdef CONFIG_OF 798 + struct drm_bridge *of_drm_find_bridge(struct device_node *np); 799 + #else 800 + static inline struct drm_bridge *of_drm_find_bridge(struct device_node *np) 801 + { 802 + return NULL; 803 + } 804 + #endif 797 805 798 806 /** 799 807 * drm_bridge_get_next_bridge() - Get the next bridge in the chain ··· 919 911 struct drm_bridge *devm_drm_panel_bridge_add_typed(struct device *dev, 920 912 struct drm_panel *panel, 921 913 u32 connector_type); 914 + struct drm_connector *drm_panel_bridge_connector(struct drm_bridge *bridge); 915 + #endif 916 + 917 + #if defined(CONFIG_OF) && defined(CONFIG_DRM_PANEL_BRIDGE) 922 918 struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, struct device_node *node, 923 919 u32 port, u32 endpoint); 924 - struct drm_connector *drm_panel_bridge_connector(struct drm_bridge *bridge); 920 + #else 921 + static inline struct drm_bridge *devm_drm_of_get_bridge(struct device *dev, 922 + struct device_node *node, 923 + u32 port, 924 + u32 endpoint) 925 + { 926 + return ERR_PTR(-ENODEV); 927 + } 925 928 #endif 926 929 927 930 #endif
+20
include/drm/drm_dp_helper.h
··· 453 453 # define DP_FEC_UNCORR_BLK_ERROR_COUNT_CAP (1 << 1) 454 454 # define DP_FEC_CORR_BLK_ERROR_COUNT_CAP (1 << 2) 455 455 # define DP_FEC_BIT_ERROR_COUNT_CAP (1 << 3) 456 + #define DP_FEC_CAPABILITY_1 0x091 /* 2.0 */ 456 457 457 458 /* DP-HDMI2.1 PCON DSC ENCODER SUPPORT */ 458 459 #define DP_PCON_DSC_ENCODER_CAP_SIZE 0xC /* 0x9E - 0x92 */ ··· 537 536 #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_0 0x0a0 /* DP 1.4a SCR */ 538 537 #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_1 0x0a1 539 538 #define DP_DSC_BRANCH_MAX_LINE_WIDTH 0x0a2 539 + 540 + /* DFP Capability Extension */ 541 + #define DP_DFP_CAPABILITY_EXTENSION_SUPPORT 0x0a3 /* 2.0 */ 540 542 541 543 /* Link Configuration */ 542 544 #define DP_LINK_BW_SET 0x100 ··· 692 688 693 689 #define DP_DSC_ENABLE 0x160 /* DP 1.4 */ 694 690 # define DP_DECOMPRESSION_EN (1 << 0) 691 + #define DP_DSC_CONFIGURATION 0x161 /* DP 2.0 */ 695 692 696 693 #define DP_PSR_EN_CFG 0x170 /* XXX 1.2? */ 697 694 # define DP_PSR_ENABLE BIT(0) ··· 748 743 # define DP_RECEIVE_PORT_0_STATUS (1 << 0) 749 744 # define DP_RECEIVE_PORT_1_STATUS (1 << 1) 750 745 # define DP_STREAM_REGENERATION_STATUS (1 << 2) /* 2.0 */ 746 + # define DP_INTRA_HOP_AUX_REPLY_INDICATION (1 << 3) /* 2.0 */ 751 747 752 748 #define DP_ADJUST_REQUEST_LANE0_1 0x206 753 749 #define DP_ADJUST_REQUEST_LANE2_3 0x207 ··· 870 864 # define DP_PHY_TEST_PATTERN_PRBS7 0x3 871 865 # define DP_PHY_TEST_PATTERN_80BIT_CUSTOM 0x4 872 866 # define DP_PHY_TEST_PATTERN_CP2520 0x5 867 + 868 + #define DP_PHY_SQUARE_PATTERN 0x249 873 869 874 870 #define DP_TEST_HBR2_SCRAMBLER_RESET 0x24A 875 871 #define DP_TEST_80BIT_CUSTOM_PATTERN_7_0 0x250 ··· 1116 1108 1117 1109 #define DP_128B132B_TRAINING_AUX_RD_INTERVAL 0x2216 /* 2.0 */ 1118 1110 # define DP_128B132B_TRAINING_AUX_RD_INTERVAL_MASK 0x7f 1111 + 1112 + #define DP_TEST_264BIT_CUSTOM_PATTERN_7_0 0x2230 1113 + #define DP_TEST_264BIT_CUSTOM_PATTERN_263_256 0x2250 1114 + 1115 + /* DSC Extended Capability Branch Total DSC Resources */ 1116 + #define DP_DSC_SUPPORT_AND_DSC_DECODER_COUNT 0x2260 /* 2.0 */ 1117 + # define DP_DSC_DECODER_COUNT_MASK (0b111 << 5) 1118 + # define DP_DSC_DECODER_COUNT_SHIFT 5 1119 + #define DP_DSC_MAX_SLICE_COUNT_AND_AGGREGATION_0 0x2270 /* 2.0 */ 1120 + # define DP_DSC_DECODER_0_MAXIMUM_SLICE_COUNT_MASK (1 << 0) 1121 + # define DP_DSC_DECODER_0_AGGREGATION_SUPPORT_MASK (0b111 << 1) 1122 + # define DP_DSC_DECODER_0_AGGREGATION_SUPPORT_SHIFT 1 1119 1123 1120 1124 /* Protocol Converter Extension */ 1121 1125 /* HDMI CEC tunneling over AUX DP 1.3 section 5.3.3.3.1 DPCD 1.4+ */
+8 -6
include/drm/drm_edid.h
··· 510 510 511 511 /** 512 512 * drm_edid_encode_panel_id - Encode an ID for matching against drm_edid_get_panel_id() 513 - * @vend: 3-character vendor string 513 + * @vend_chr_0: First character of the vendor string. 514 + * @vend_chr_1: Second character of the vendor string. 515 + * @vend_chr_2: Third character of the vendor string. 514 516 * @product_id: The 16-bit product ID. 515 517 * 516 518 * This is a macro so that it can be calculated at compile time and used 517 519 * as an initializer. 518 520 * 519 521 * For instance: 520 - * drm_edid_encode_panel_id("BOE", 0x2d08) => 0x09e52d08 522 + * drm_edid_encode_panel_id('B', 'O', 'E', 0x2d08) => 0x09e52d08 521 523 * 522 524 * Return: a 32-bit ID per panel. 523 525 */ 524 - #define drm_edid_encode_panel_id(vend, product_id) \ 525 - ((((u32)((vend)[0]) - '@') & 0x1f) << 26 | \ 526 - (((u32)((vend)[1]) - '@') & 0x1f) << 21 | \ 527 - (((u32)((vend)[2]) - '@') & 0x1f) << 16 | \ 526 + #define drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, product_id) \ 527 + ((((u32)(vend_chr_0) - '@') & 0x1f) << 26 | \ 528 + (((u32)(vend_chr_1) - '@') & 0x1f) << 21 | \ 529 + (((u32)(vend_chr_2) - '@') & 0x1f) << 16 | \ 528 530 ((product_id) & 0xffff)) 529 531 530 532 /**
+4
include/drm/drm_format_helper.h
··· 16 16 struct drm_rect *clip); 17 17 void drm_fb_swab(void *dst, void *src, struct drm_framebuffer *fb, 18 18 struct drm_rect *clip, bool cached); 19 + void drm_fb_xrgb8888_to_rgb332(void *dst, void *vaddr, struct drm_framebuffer *fb, 20 + struct drm_rect *clip); 19 21 void drm_fb_xrgb8888_to_rgb565(void *dst, void *vaddr, 20 22 struct drm_framebuffer *fb, 21 23 struct drm_rect *clip, bool swab); 22 24 void drm_fb_xrgb8888_to_rgb565_dstclip(void __iomem *dst, unsigned int dst_pitch, 23 25 void *vaddr, struct drm_framebuffer *fb, 24 26 struct drm_rect *clip, bool swab); 27 + void drm_fb_xrgb8888_to_rgb888(void *dst, void *src, struct drm_framebuffer *fb, 28 + struct drm_rect *clip); 25 29 void drm_fb_xrgb8888_to_rgb888_dstclip(void __iomem *dst, unsigned int dst_pitch, 26 30 void *vaddr, struct drm_framebuffer *fb, 27 31 struct drm_rect *clip);
+4
include/drm/drm_mipi_dsi.h
··· 227 227 mipi_dsi_device_register_full(struct mipi_dsi_host *host, 228 228 const struct mipi_dsi_device_info *info); 229 229 void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi); 230 + struct mipi_dsi_device * 231 + devm_mipi_dsi_device_register_full(struct device *dev, struct mipi_dsi_host *host, 232 + const struct mipi_dsi_device_info *info); 230 233 struct mipi_dsi_device *of_find_mipi_dsi_device_by_node(struct device_node *np); 231 234 int mipi_dsi_attach(struct mipi_dsi_device *dsi); 232 235 int mipi_dsi_detach(struct mipi_dsi_device *dsi); 236 + int devm_mipi_dsi_attach(struct device *dev, struct mipi_dsi_device *dsi); 233 237 int mipi_dsi_shutdown_peripheral(struct mipi_dsi_device *dsi); 234 238 int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device *dsi); 235 239 int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device *dsi,
+30
include/drm/drm_print.h
··· 340 340 /** 341 341 * DRM_DEV_ERROR() - Error output. 342 342 * 343 + * NOTE: this is deprecated in favor of drm_err() or dev_err(). 344 + * 343 345 * @dev: device pointer 344 346 * @fmt: printf() like format string. 345 347 */ ··· 350 348 351 349 /** 352 350 * DRM_DEV_ERROR_RATELIMITED() - Rate limited error output. 351 + * 352 + * NOTE: this is deprecated in favor of drm_err_ratelimited() or 353 + * dev_err_ratelimited(). 353 354 * 354 355 * @dev: device pointer 355 356 * @fmt: printf() like format string. ··· 369 364 DRM_DEV_ERROR(dev, fmt, ##__VA_ARGS__); \ 370 365 }) 371 366 367 + /* NOTE: this is deprecated in favor of drm_info() or dev_info(). */ 372 368 #define DRM_DEV_INFO(dev, fmt, ...) \ 373 369 drm_dev_printk(dev, KERN_INFO, fmt, ##__VA_ARGS__) 374 370 371 + /* NOTE: this is deprecated in favor of drm_info_once() or dev_info_once(). */ 375 372 #define DRM_DEV_INFO_ONCE(dev, fmt, ...) \ 376 373 ({ \ 377 374 static bool __print_once __read_mostly; \ ··· 386 379 /** 387 380 * DRM_DEV_DEBUG() - Debug output for generic drm code 388 381 * 382 + * NOTE: this is deprecated in favor of drm_dbg_core(). 383 + * 389 384 * @dev: device pointer 390 385 * @fmt: printf() like format string. 391 386 */ ··· 396 387 /** 397 388 * DRM_DEV_DEBUG_DRIVER() - Debug output for vendor specific part of the driver 398 389 * 390 + * NOTE: this is deprecated in favor of drm_dbg() or dev_dbg(). 391 + * 399 392 * @dev: device pointer 400 393 * @fmt: printf() like format string. 401 394 */ ··· 405 394 drm_dev_dbg(dev, DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 406 395 /** 407 396 * DRM_DEV_DEBUG_KMS() - Debug output for modesetting code 397 + * 398 + * NOTE: this is deprecated in favor of drm_dbg_kms(). 408 399 * 409 400 * @dev: device pointer 410 401 * @fmt: printf() like format string. ··· 493 480 #define _DRM_PRINTK(once, level, fmt, ...) \ 494 481 printk##once(KERN_##level "[" DRM_NAME "] " fmt, ##__VA_ARGS__) 495 482 483 + /* NOTE: this is deprecated in favor of pr_info(). */ 496 484 #define DRM_INFO(fmt, ...) \ 497 485 _DRM_PRINTK(, INFO, fmt, ##__VA_ARGS__) 486 + /* NOTE: this is deprecated in favor of pr_notice(). */ 498 487 #define DRM_NOTE(fmt, ...) \ 499 488 _DRM_PRINTK(, NOTICE, fmt, ##__VA_ARGS__) 489 + /* NOTE: this is deprecated in favor of pr_warn(). */ 500 490 #define DRM_WARN(fmt, ...) \ 501 491 _DRM_PRINTK(, WARNING, fmt, ##__VA_ARGS__) 502 492 493 + /* NOTE: this is deprecated in favor of pr_info_once(). */ 503 494 #define DRM_INFO_ONCE(fmt, ...) \ 504 495 _DRM_PRINTK(_once, INFO, fmt, ##__VA_ARGS__) 496 + /* NOTE: this is deprecated in favor of pr_notice_once(). */ 505 497 #define DRM_NOTE_ONCE(fmt, ...) \ 506 498 _DRM_PRINTK(_once, NOTICE, fmt, ##__VA_ARGS__) 499 + /* NOTE: this is deprecated in favor of pr_warn_once(). */ 507 500 #define DRM_WARN_ONCE(fmt, ...) \ 508 501 _DRM_PRINTK(_once, WARNING, fmt, ##__VA_ARGS__) 509 502 503 + /* NOTE: this is deprecated in favor of pr_err(). */ 510 504 #define DRM_ERROR(fmt, ...) \ 511 505 __drm_err(fmt, ##__VA_ARGS__) 512 506 507 + /* NOTE: this is deprecated in favor of pr_err_ratelimited(). */ 513 508 #define DRM_ERROR_RATELIMITED(fmt, ...) \ 514 509 DRM_DEV_ERROR_RATELIMITED(NULL, fmt, ##__VA_ARGS__) 515 510 511 + /* NOTE: this is deprecated in favor of drm_dbg_core(NULL, ...). */ 516 512 #define DRM_DEBUG(fmt, ...) \ 517 513 __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) 518 514 515 + /* NOTE: this is deprecated in favor of drm_dbg(NULL, ...). */ 519 516 #define DRM_DEBUG_DRIVER(fmt, ...) \ 520 517 __drm_dbg(DRM_UT_DRIVER, fmt, ##__VA_ARGS__) 521 518 519 + /* NOTE: this is deprecated in favor of drm_dbg_kms(NULL, ...). */ 522 520 #define DRM_DEBUG_KMS(fmt, ...) \ 523 521 __drm_dbg(DRM_UT_KMS, fmt, ##__VA_ARGS__) 524 522 523 + /* NOTE: this is deprecated in favor of drm_dbg_prime(NULL, ...). */ 525 524 #define DRM_DEBUG_PRIME(fmt, ...) \ 526 525 __drm_dbg(DRM_UT_PRIME, fmt, ##__VA_ARGS__) 527 526 527 + /* NOTE: this is deprecated in favor of drm_dbg_atomic(NULL, ...). */ 528 528 #define DRM_DEBUG_ATOMIC(fmt, ...) \ 529 529 __drm_dbg(DRM_UT_ATOMIC, fmt, ##__VA_ARGS__) 530 530 531 + /* NOTE: this is deprecated in favor of drm_dbg_vbl(NULL, ...). */ 531 532 #define DRM_DEBUG_VBL(fmt, ...) \ 532 533 __drm_dbg(DRM_UT_VBL, fmt, ##__VA_ARGS__) 533 534 535 + /* NOTE: this is deprecated in favor of drm_dbg_lease(NULL, ...). */ 534 536 #define DRM_DEBUG_LEASE(fmt, ...) \ 535 537 __drm_dbg(DRM_UT_LEASE, fmt, ##__VA_ARGS__) 536 538 539 + /* NOTE: this is deprecated in favor of drm_dbg_dp(NULL, ...). */ 537 540 #define DRM_DEBUG_DP(fmt, ...) \ 538 541 __drm_dbg(DRM_UT_DP, fmt, ## __VA_ARGS__) 539 542 ··· 565 536 #define drm_dbg_kms_ratelimited(drm, fmt, ...) \ 566 537 __DRM_DEFINE_DBG_RATELIMITED(KMS, drm, fmt, ## __VA_ARGS__) 567 538 539 + /* NOTE: this is deprecated in favor of drm_dbg_kms_ratelimited(NULL, ...). */ 568 540 #define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) drm_dbg_kms_ratelimited(NULL, fmt, ## __VA_ARGS__) 569 541 570 542 /*
+1
include/drm/drm_probe_helper.h
··· 18 18 void drm_kms_helper_poll_init(struct drm_device *dev); 19 19 void drm_kms_helper_poll_fini(struct drm_device *dev); 20 20 bool drm_helper_hpd_irq_event(struct drm_device *dev); 21 + bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector); 21 22 void drm_kms_helper_hotplug_event(struct drm_device *dev); 22 23 23 24 void drm_kms_helper_poll_disable(struct drm_device *dev);
+4 -2
include/drm/gud.h
··· 246 246 /* Get supported pixel formats as a byte array of GUD_PIXEL_FORMAT_* */ 247 247 #define GUD_REQ_GET_FORMATS 0x40 248 248 #define GUD_FORMATS_MAX_NUM 32 249 - /* R1 is a 1-bit monochrome transfer format presented to userspace as XRGB8888 */ 250 - #define GUD_PIXEL_FORMAT_R1 0x01 249 + #define GUD_PIXEL_FORMAT_R1 0x01 /* 1-bit monochrome */ 250 + #define GUD_PIXEL_FORMAT_R8 0x08 /* 8-bit greyscale */ 251 251 #define GUD_PIXEL_FORMAT_XRGB1111 0x20 252 + #define GUD_PIXEL_FORMAT_RGB332 0x30 252 253 #define GUD_PIXEL_FORMAT_RGB565 0x40 254 + #define GUD_PIXEL_FORMAT_RGB888 0x50 253 255 #define GUD_PIXEL_FORMAT_XRGB8888 0x80 254 256 #define GUD_PIXEL_FORMAT_ARGB8888 0x81 255 257
+1 -1
include/drm/ttm/ttm_device.h
··· 65 65 * ttm_tt_create 66 66 * 67 67 * @bo: The buffer object to create the ttm for. 68 - * @page_flags: Page flags as identified by TTM_PAGE_FLAG_XX flags. 68 + * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags. 69 69 * 70 70 * Create a struct ttm_tt to back data with system memory pages. 71 71 * No pages are actually allocated.
+58 -24
include/drm/ttm/ttm_tt.h
··· 38 38 struct ttm_buffer_object; 39 39 struct ttm_operation_ctx; 40 40 41 - #define TTM_PAGE_FLAG_SWAPPED (1 << 4) 42 - #define TTM_PAGE_FLAG_ZERO_ALLOC (1 << 6) 43 - #define TTM_PAGE_FLAG_SG (1 << 8) 44 - #define TTM_PAGE_FLAG_NO_RETRY (1 << 9) 45 - 46 - #define TTM_PAGE_FLAG_PRIV_POPULATED (1 << 31) 47 - 48 41 /** 49 - * struct ttm_tt 50 - * 51 - * @pages: Array of pages backing the data. 52 - * @page_flags: see TTM_PAGE_FLAG_* 53 - * @num_pages: Number of pages in the page array. 54 - * @sg: for SG objects via dma-buf 55 - * @dma_address: The DMA (bus) addresses of the pages 56 - * @swap_storage: Pointer to shmem struct file for swap storage. 57 - * @pages_list: used by some page allocation backend 58 - * @caching: The current caching state of the pages, see enum ttm_caching. 59 - * 60 - * This is a structure holding the pages, caching- and aperture binding 61 - * status for a buffer object that isn't backed by fixed (VRAM / AGP) 42 + * struct ttm_tt - This is a structure holding the pages, caching- and aperture 43 + * binding status for a buffer object that isn't backed by fixed (VRAM / AGP) 62 44 * memory. 63 45 */ 64 46 struct ttm_tt { 47 + /** @pages: Array of pages backing the data. */ 65 48 struct page **pages; 49 + /** 50 + * @page_flags: The page flags. 51 + * 52 + * Supported values: 53 + * 54 + * TTM_TT_FLAG_SWAPPED: Set by TTM when the pages have been unpopulated 55 + * and swapped out by TTM. Calling ttm_tt_populate() will then swap the 56 + * pages back in, and unset the flag. Drivers should in general never 57 + * need to touch this. 58 + * 59 + * TTM_TT_FLAG_ZERO_ALLOC: Set if the pages will be zeroed on 60 + * allocation. 61 + * 62 + * TTM_TT_FLAG_EXTERNAL: Set if the underlying pages were allocated 63 + * externally, like with dma-buf or userptr. This effectively disables 64 + * TTM swapping out such pages. Also important is to prevent TTM from 65 + * ever directly mapping these pages. 66 + * 67 + * Note that enum ttm_bo_type.ttm_bo_type_sg objects will always enable 68 + * this flag. 69 + * 70 + * TTM_TT_FLAG_EXTERNAL_MAPPABLE: Same behaviour as 71 + * TTM_TT_FLAG_EXTERNAL, but with the reduced restriction that it is 72 + * still valid to use TTM to map the pages directly. This is useful when 73 + * implementing a ttm_tt backend which still allocates driver owned 74 + * pages underneath(say with shmem). 75 + * 76 + * Note that since this also implies TTM_TT_FLAG_EXTERNAL, the usage 77 + * here should always be: 78 + * 79 + * page_flags = TTM_TT_FLAG_EXTERNAL | 80 + * TTM_TT_FLAG_EXTERNAL_MAPPABLE; 81 + * 82 + * TTM_TT_FLAG_PRIV_POPULATED: TTM internal only. DO NOT USE. This is 83 + * set by TTM after ttm_tt_populate() has successfully returned, and is 84 + * then unset when TTM calls ttm_tt_unpopulate(). 85 + */ 86 + #define TTM_TT_FLAG_SWAPPED (1 << 0) 87 + #define TTM_TT_FLAG_ZERO_ALLOC (1 << 1) 88 + #define TTM_TT_FLAG_EXTERNAL (1 << 2) 89 + #define TTM_TT_FLAG_EXTERNAL_MAPPABLE (1 << 3) 90 + 91 + #define TTM_TT_FLAG_PRIV_POPULATED (1 << 31) 66 92 uint32_t page_flags; 93 + /** @num_pages: Number of pages in the page array. */ 67 94 uint32_t num_pages; 95 + /** @sg: for SG objects via dma-buf. */ 68 96 struct sg_table *sg; 97 + /** @dma_address: The DMA (bus) addresses of the pages. */ 69 98 dma_addr_t *dma_address; 99 + /** @swap_storage: Pointer to shmem struct file for swap storage. */ 70 100 struct file *swap_storage; 101 + /** 102 + * @caching: The current caching state of the pages, see enum 103 + * ttm_caching. 104 + */ 71 105 enum ttm_caching caching; 72 106 }; 73 107 ··· 119 85 120 86 static inline bool ttm_tt_is_populated(struct ttm_tt *tt) 121 87 { 122 - return tt->page_flags & TTM_PAGE_FLAG_PRIV_POPULATED; 88 + return tt->page_flags & TTM_TT_FLAG_PRIV_POPULATED; 123 89 } 124 90 125 91 /** ··· 138 104 * 139 105 * @ttm: The struct ttm_tt. 140 106 * @bo: The buffer object we create the ttm for. 141 - * @page_flags: Page flags as identified by TTM_PAGE_FLAG_XX flags. 107 + * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags. 142 108 * @caching: the desired caching state of the pages 143 109 * 144 110 * Create a struct ttm_tt to back data with system memory pages. ··· 213 179 */ 214 180 static inline void ttm_tt_mark_for_clear(struct ttm_tt *ttm) 215 181 { 216 - ttm->page_flags |= TTM_PAGE_FLAG_ZERO_ALLOC; 182 + ttm->page_flags |= TTM_TT_FLAG_ZERO_ALLOC; 217 183 } 218 184 219 185 void ttm_tt_mgr_init(unsigned long num_pages, unsigned long num_dma32_pages); ··· 229 195 * 230 196 * @bo: Buffer object we allocate the ttm for. 231 197 * @bridge: The agp bridge this device is sitting on. 232 - * @page_flags: Page flags as identified by TTM_PAGE_FLAG_XX flags. 198 + * @page_flags: Page flags as identified by TTM_TT_FLAG_XX flags. 233 199 * 234 200 * 235 201 * Create a TTM backend that uses the indicated AGP bridge as an aperture
+1 -1
include/linux/dma-buf.h
··· 440 440 wait_queue_head_t *poll; 441 441 442 442 __poll_t active; 443 - } cb_excl, cb_shared; 443 + } cb_in, cb_out; 444 444 #ifdef CONFIG_DMABUF_SYSFS_STATS 445 445 /** 446 446 * @sysfs_entry:
+95
include/linux/dma-resv.h
··· 149 149 struct dma_resv_list __rcu *fence; 150 150 }; 151 151 152 + /** 153 + * struct dma_resv_iter - current position into the dma_resv fences 154 + * 155 + * Don't touch this directly in the driver, use the accessor function instead. 156 + */ 157 + struct dma_resv_iter { 158 + /** @obj: The dma_resv object we iterate over */ 159 + struct dma_resv *obj; 160 + 161 + /** @all_fences: If all fences should be returned */ 162 + bool all_fences; 163 + 164 + /** @fence: the currently handled fence */ 165 + struct dma_fence *fence; 166 + 167 + /** @seq: sequence number to check for modifications */ 168 + unsigned int seq; 169 + 170 + /** @index: index into the shared fences */ 171 + unsigned int index; 172 + 173 + /** @fences: the shared fences */ 174 + struct dma_resv_list *fences; 175 + 176 + /** @is_restarted: true if this is the first returned fence */ 177 + bool is_restarted; 178 + }; 179 + 180 + struct dma_fence *dma_resv_iter_first_unlocked(struct dma_resv_iter *cursor); 181 + struct dma_fence *dma_resv_iter_next_unlocked(struct dma_resv_iter *cursor); 182 + 183 + /** 184 + * dma_resv_iter_begin - initialize a dma_resv_iter object 185 + * @cursor: The dma_resv_iter object to initialize 186 + * @obj: The dma_resv object which we want to iterate over 187 + * @all_fences: If all fences should be returned or just the exclusive one 188 + */ 189 + static inline void dma_resv_iter_begin(struct dma_resv_iter *cursor, 190 + struct dma_resv *obj, 191 + bool all_fences) 192 + { 193 + cursor->obj = obj; 194 + cursor->all_fences = all_fences; 195 + cursor->fence = NULL; 196 + } 197 + 198 + /** 199 + * dma_resv_iter_end - cleanup a dma_resv_iter object 200 + * @cursor: the dma_resv_iter object which should be cleaned up 201 + * 202 + * Make sure that the reference to the fence in the cursor is properly 203 + * dropped. 204 + */ 205 + static inline void dma_resv_iter_end(struct dma_resv_iter *cursor) 206 + { 207 + dma_fence_put(cursor->fence); 208 + } 209 + 210 + /** 211 + * dma_resv_iter_is_exclusive - test if the current fence is the exclusive one 212 + * @cursor: the cursor of the current position 213 + * 214 + * Returns true if the currently returned fence is the exclusive one. 215 + */ 216 + static inline bool dma_resv_iter_is_exclusive(struct dma_resv_iter *cursor) 217 + { 218 + return cursor->index == 0; 219 + } 220 + 221 + /** 222 + * dma_resv_iter_is_restarted - test if this is the first fence after a restart 223 + * @cursor: the cursor with the current position 224 + * 225 + * Return true if this is the first fence in an iteration after a restart. 226 + */ 227 + static inline bool dma_resv_iter_is_restarted(struct dma_resv_iter *cursor) 228 + { 229 + return cursor->is_restarted; 230 + } 231 + 232 + /** 233 + * dma_resv_for_each_fence_unlocked - unlocked fence iterator 234 + * @cursor: a struct dma_resv_iter pointer 235 + * @fence: the current fence 236 + * 237 + * Iterate over the fences in a struct dma_resv object without holding the 238 + * &dma_resv.lock and using RCU instead. The cursor needs to be initialized 239 + * with dma_resv_iter_begin() and cleaned up with dma_resv_iter_end(). Inside 240 + * the iterator a reference to the dma_fence is held and the RCU lock dropped. 241 + * When the dma_resv is modified the iteration starts over again. 242 + */ 243 + #define dma_resv_for_each_fence_unlocked(cursor, fence) \ 244 + for (fence = dma_resv_iter_first_unlocked(cursor); \ 245 + fence; fence = dma_resv_iter_next_unlocked(cursor)) 246 + 152 247 #define dma_resv_held(obj) lockdep_is_held(&(obj)->lock.base) 153 248 #define dma_resv_assert_held(obj) lockdep_assert_held(&(obj)->lock.base) 154 249
+5
include/linux/io.h
··· 132 132 #endif 133 133 #endif 134 134 135 + int devm_arch_phys_wc_add(struct device *dev, unsigned long base, unsigned long size); 136 + 135 137 enum { 136 138 /* See memremap() kernel-doc for usage description... */ 137 139 MEMREMAP_WB = 1 << 0, ··· 167 165 { 168 166 } 169 167 #endif 168 + 169 + int devm_arch_io_reserve_memtype_wc(struct device *dev, resource_size_t start, 170 + resource_size_t size); 170 171 171 172 #endif /* _LINUX_IO_H */
+2 -1
include/uapi/drm/drm_mode.h
··· 1112 1112 * Lease mode resources, creating another drm_master. 1113 1113 * 1114 1114 * The @object_ids array must reference at least one CRTC, one connector and 1115 - * one plane if &DRM_CLIENT_CAP_UNIVERSAL_PLANES is enabled. 1115 + * one plane if &DRM_CLIENT_CAP_UNIVERSAL_PLANES is enabled. Alternatively, 1116 + * the lease can be completely empty. 1116 1117 */ 1117 1118 struct drm_mode_create_lease { 1118 1119 /** @object_ids: Pointer to array of object ids (__u32) */
+78
include/uapi/drm/v3d_drm.h
··· 58 58 struct drm_v3d_perfmon_get_values) 59 59 60 60 #define DRM_V3D_SUBMIT_CL_FLUSH_CACHE 0x01 61 + #define DRM_V3D_SUBMIT_EXTENSION 0x02 62 + 63 + /* struct drm_v3d_extension - ioctl extensions 64 + * 65 + * Linked-list of generic extensions where the id identify which struct is 66 + * pointed by ext_data. Therefore, DRM_V3D_EXT_ID_* is used on id to identify 67 + * the extension type. 68 + */ 69 + struct drm_v3d_extension { 70 + __u64 next; 71 + __u32 id; 72 + #define DRM_V3D_EXT_ID_MULTI_SYNC 0x01 73 + __u32 flags; /* mbz */ 74 + }; 75 + 76 + /* struct drm_v3d_sem - wait/signal semaphore 77 + * 78 + * If binary semaphore, it only takes syncobj handle and ignores flags and 79 + * point fields. Point is defined for timeline syncobj feature. 80 + */ 81 + struct drm_v3d_sem { 82 + __u32 handle; /* syncobj */ 83 + /* rsv below, for future uses */ 84 + __u32 flags; 85 + __u64 point; /* for timeline sem support */ 86 + __u64 mbz[2]; /* must be zero, rsv */ 87 + }; 88 + 89 + /* Enum for each of the V3D queues. */ 90 + enum v3d_queue { 91 + V3D_BIN, 92 + V3D_RENDER, 93 + V3D_TFU, 94 + V3D_CSD, 95 + V3D_CACHE_CLEAN, 96 + }; 97 + 98 + /** 99 + * struct drm_v3d_multi_sync - ioctl extension to add support multiples 100 + * syncobjs for commands submission. 101 + * 102 + * When an extension of DRM_V3D_EXT_ID_MULTI_SYNC id is defined, it points to 103 + * this extension to define wait and signal dependencies, instead of single 104 + * in/out sync entries on submitting commands. The field flags is used to 105 + * determine the stage to set wait dependencies. 106 + */ 107 + struct drm_v3d_multi_sync { 108 + struct drm_v3d_extension base; 109 + /* Array of wait and signal semaphores */ 110 + __u64 in_syncs; 111 + __u64 out_syncs; 112 + 113 + /* Number of entries */ 114 + __u32 in_sync_count; 115 + __u32 out_sync_count; 116 + 117 + /* set the stage (v3d_queue) to sync */ 118 + __u32 wait_stage; 119 + 120 + __u32 pad; /* mbz */ 121 + }; 61 122 62 123 /** 63 124 * struct drm_v3d_submit_cl - ioctl argument for submitting commands to the 3D ··· 196 135 /* Number of BO handles passed in (size is that times 4). */ 197 136 __u32 bo_handle_count; 198 137 138 + /* DRM_V3D_SUBMIT_* properties */ 199 139 __u32 flags; 200 140 201 141 /* ID of the perfmon to attach to this job. 0 means no perfmon. */ 202 142 __u32 perfmon_id; 203 143 204 144 __u32 pad; 145 + 146 + /* Pointer to an array of ioctl extensions*/ 147 + __u64 extensions; 205 148 }; 206 149 207 150 /** ··· 275 210 DRM_V3D_PARAM_SUPPORTS_CSD, 276 211 DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH, 277 212 DRM_V3D_PARAM_SUPPORTS_PERFMON, 213 + DRM_V3D_PARAM_SUPPORTS_MULTISYNC_EXT, 278 214 }; 279 215 280 216 struct drm_v3d_get_param { ··· 314 248 __u32 in_sync; 315 249 /* Sync object to signal when the TFU job is done. */ 316 250 __u32 out_sync; 251 + 252 + __u32 flags; 253 + 254 + /* Pointer to an array of ioctl extensions*/ 255 + __u64 extensions; 317 256 }; 318 257 319 258 /* Submits a compute shader for dispatch. This job will block on any ··· 347 276 348 277 /* ID of the perfmon to attach to this job. 0 means no perfmon. */ 349 278 __u32 perfmon_id; 279 + 280 + /* Pointer to an array of ioctl extensions*/ 281 + __u64 extensions; 282 + 283 + __u32 flags; 284 + 285 + __u32 pad; 350 286 }; 351 287 352 288 enum {
+27
include/uapi/drm/virtgpu_drm.h
··· 47 47 #define DRM_VIRTGPU_WAIT 0x08 48 48 #define DRM_VIRTGPU_GET_CAPS 0x09 49 49 #define DRM_VIRTGPU_RESOURCE_CREATE_BLOB 0x0a 50 + #define DRM_VIRTGPU_CONTEXT_INIT 0x0b 50 51 51 52 #define VIRTGPU_EXECBUF_FENCE_FD_IN 0x01 52 53 #define VIRTGPU_EXECBUF_FENCE_FD_OUT 0x02 54 + #define VIRTGPU_EXECBUF_RING_IDX 0x04 53 55 #define VIRTGPU_EXECBUF_FLAGS (\ 54 56 VIRTGPU_EXECBUF_FENCE_FD_IN |\ 55 57 VIRTGPU_EXECBUF_FENCE_FD_OUT |\ 58 + VIRTGPU_EXECBUF_RING_IDX |\ 56 59 0) 57 60 58 61 struct drm_virtgpu_map { ··· 71 68 __u64 bo_handles; 72 69 __u32 num_bo_handles; 73 70 __s32 fence_fd; /* in/out fence fd (see VIRTGPU_EXECBUF_FENCE_FD_IN/OUT) */ 71 + __u32 ring_idx; /* command ring index (see VIRTGPU_EXECBUF_RING_IDX) */ 72 + __u32 pad; 74 73 }; 75 74 76 75 #define VIRTGPU_PARAM_3D_FEATURES 1 /* do we have 3D features in the hw */ ··· 80 75 #define VIRTGPU_PARAM_RESOURCE_BLOB 3 /* DRM_VIRTGPU_RESOURCE_CREATE_BLOB */ 81 76 #define VIRTGPU_PARAM_HOST_VISIBLE 4 /* Host blob resources are mappable */ 82 77 #define VIRTGPU_PARAM_CROSS_DEVICE 5 /* Cross virtio-device resource sharing */ 78 + #define VIRTGPU_PARAM_CONTEXT_INIT 6 /* DRM_VIRTGPU_CONTEXT_INIT */ 79 + #define VIRTGPU_PARAM_SUPPORTED_CAPSET_IDs 7 /* Bitmask of supported capability set ids */ 83 80 84 81 struct drm_virtgpu_getparam { 85 82 __u64 param; ··· 180 173 __u64 blob_id; 181 174 }; 182 175 176 + #define VIRTGPU_CONTEXT_PARAM_CAPSET_ID 0x0001 177 + #define VIRTGPU_CONTEXT_PARAM_NUM_RINGS 0x0002 178 + #define VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK 0x0003 179 + struct drm_virtgpu_context_set_param { 180 + __u64 param; 181 + __u64 value; 182 + }; 183 + 184 + struct drm_virtgpu_context_init { 185 + __u32 num_params; 186 + __u32 pad; 187 + 188 + /* pointer to drm_virtgpu_context_set_param array */ 189 + __u64 ctx_set_params; 190 + }; 191 + 183 192 #define DRM_IOCTL_VIRTGPU_MAP \ 184 193 DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map) 185 194 ··· 234 211 #define DRM_IOCTL_VIRTGPU_RESOURCE_CREATE_BLOB \ 235 212 DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_RESOURCE_CREATE_BLOB, \ 236 213 struct drm_virtgpu_resource_create_blob) 214 + 215 + #define DRM_IOCTL_VIRTGPU_CONTEXT_INIT \ 216 + DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_CONTEXT_INIT, \ 217 + struct drm_virtgpu_context_init) 237 218 238 219 #if defined(__cplusplus) 239 220 }
+15 -3
include/uapi/linux/virtio_gpu.h
··· 59 59 * VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB 60 60 */ 61 61 #define VIRTIO_GPU_F_RESOURCE_BLOB 3 62 + /* 63 + * VIRTIO_GPU_CMD_CREATE_CONTEXT with 64 + * context_init and multiple timelines 65 + */ 66 + #define VIRTIO_GPU_F_CONTEXT_INIT 4 62 67 63 68 enum virtio_gpu_ctrl_type { 64 69 VIRTIO_GPU_UNDEFINED = 0, ··· 127 122 VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1 128 123 }; 129 124 130 - #define VIRTIO_GPU_FLAG_FENCE (1 << 0) 125 + #define VIRTIO_GPU_FLAG_FENCE (1 << 0) 126 + /* 127 + * If the following flag is set, then ring_idx contains the index 128 + * of the command ring that needs to used when creating the fence 129 + */ 130 + #define VIRTIO_GPU_FLAG_INFO_RING_IDX (1 << 1) 131 131 132 132 struct virtio_gpu_ctrl_hdr { 133 133 __le32 type; 134 134 __le32 flags; 135 135 __le64 fence_id; 136 136 __le32 ctx_id; 137 - __le32 padding; 137 + __u8 ring_idx; 138 + __u8 padding[3]; 138 139 }; 139 140 140 141 /* data passed in the cursor vq */ ··· 280 269 }; 281 270 282 271 /* VIRTIO_GPU_CMD_CTX_CREATE */ 272 + #define VIRTIO_GPU_CONTEXT_INIT_CAPSET_ID_MASK 0x000000ff 283 273 struct virtio_gpu_ctx_create { 284 274 struct virtio_gpu_ctrl_hdr hdr; 285 275 __le32 nlen; 286 - __le32 padding; 276 + __le32 context_init; 287 277 char debug_name[64]; 288 278 }; 289 279
+82
lib/devres.c
··· 528 528 } 529 529 EXPORT_SYMBOL(pcim_iounmap_regions); 530 530 #endif /* CONFIG_PCI */ 531 + 532 + static void devm_arch_phys_ac_add_release(struct device *dev, void *res) 533 + { 534 + arch_phys_wc_del(*((int *)res)); 535 + } 536 + 537 + /** 538 + * devm_arch_phys_wc_add - Managed arch_phys_wc_add() 539 + * @dev: Managed device 540 + * @base: Memory base address 541 + * @size: Size of memory range 542 + * 543 + * Adds a WC MTRR using arch_phys_wc_add() and sets up a release callback. 544 + * See arch_phys_wc_add() for more information. 545 + */ 546 + int devm_arch_phys_wc_add(struct device *dev, unsigned long base, unsigned long size) 547 + { 548 + int *mtrr; 549 + int ret; 550 + 551 + mtrr = devres_alloc(devm_arch_phys_ac_add_release, sizeof(*mtrr), GFP_KERNEL); 552 + if (!mtrr) 553 + return -ENOMEM; 554 + 555 + ret = arch_phys_wc_add(base, size); 556 + if (ret < 0) { 557 + devres_free(mtrr); 558 + return ret; 559 + } 560 + 561 + *mtrr = ret; 562 + devres_add(dev, mtrr); 563 + 564 + return ret; 565 + } 566 + EXPORT_SYMBOL(devm_arch_phys_wc_add); 567 + 568 + struct arch_io_reserve_memtype_wc_devres { 569 + resource_size_t start; 570 + resource_size_t size; 571 + }; 572 + 573 + static void devm_arch_io_free_memtype_wc_release(struct device *dev, void *res) 574 + { 575 + const struct arch_io_reserve_memtype_wc_devres *this = res; 576 + 577 + arch_io_free_memtype_wc(this->start, this->size); 578 + } 579 + 580 + /** 581 + * devm_arch_io_reserve_memtype_wc - Managed arch_io_reserve_memtype_wc() 582 + * @dev: Managed device 583 + * @start: Memory base address 584 + * @size: Size of memory range 585 + * 586 + * Reserves a memory range with WC caching using arch_io_reserve_memtype_wc() 587 + * and sets up a release callback See arch_io_reserve_memtype_wc() for more 588 + * information. 589 + */ 590 + int devm_arch_io_reserve_memtype_wc(struct device *dev, resource_size_t start, 591 + resource_size_t size) 592 + { 593 + struct arch_io_reserve_memtype_wc_devres *dr; 594 + int ret; 595 + 596 + dr = devres_alloc(devm_arch_io_free_memtype_wc_release, sizeof(*dr), GFP_KERNEL); 597 + if (!dr) 598 + return -ENOMEM; 599 + 600 + ret = arch_io_reserve_memtype_wc(start, size); 601 + if (ret < 0) { 602 + devres_free(dr); 603 + return ret; 604 + } 605 + 606 + dr->start = start; 607 + dr->size = size; 608 + devres_add(dev, dr); 609 + 610 + return ret; 611 + } 612 + EXPORT_SYMBOL(devm_arch_io_reserve_memtype_wc);