Sun Dec 19 11:57:43 2021 UTC ()
i915: Draft gem fault.


(riastradh)
diff -r1.8 -r1.9 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c
diff -r1.83 -r1.84 src/sys/external/bsd/drm2/i915drm/files.i915drmkms
diff -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/io-mapping.h

cvs diff -r1.8 -r1.9 src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c 2021/12/19 11:56:52 1.8
+++ src/sys/external/bsd/drm2/dist/drm/i915/gem/i915_gem_mman.c 2021/12/19 11:57:42 1.9
@@ -1,23 +1,23 @@ @@ -1,23 +1,23 @@
1/* $NetBSD: i915_gem_mman.c,v 1.8 2021/12/19 11:56:52 riastradh Exp $ */ 1/* $NetBSD: i915_gem_mman.c,v 1.9 2021/12/19 11:57:42 riastradh Exp $ */
2 2
3/* 3/*
4 * SPDX-License-Identifier: MIT 4 * SPDX-License-Identifier: MIT
5 * 5 *
6 * Copyright © 2014-2016 Intel Corporation 6 * Copyright © 2014-2016 Intel Corporation
7 */ 7 */
8 8
9#include <sys/cdefs.h> 9#include <sys/cdefs.h>
10__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.8 2021/12/19 11:56:52 riastradh Exp $"); 10__KERNEL_RCSID(0, "$NetBSD: i915_gem_mman.c,v 1.9 2021/12/19 11:57:42 riastradh Exp $");
11 11
12#include <linux/anon_inodes.h> 12#include <linux/anon_inodes.h>
13#include <linux/mman.h> 13#include <linux/mman.h>
14#include <linux/pfn_t.h> 14#include <linux/pfn_t.h>
15#include <linux/sizes.h> 15#include <linux/sizes.h>
16 16
17#include "gt/intel_gt.h" 17#include "gt/intel_gt.h"
18#include "gt/intel_gt_requests.h" 18#include "gt/intel_gt_requests.h"
19 19
20#include "i915_drv.h" 20#include "i915_drv.h"
21#include "i915_gem_gtt.h" 21#include "i915_gem_gtt.h"
22#include "i915_gem_ioctls.h" 22#include "i915_gem_ioctls.h"
23#include "i915_gem_object.h" 23#include "i915_gem_object.h"
@@ -229,36 +229,42 @@ compute_partial_view(const struct drm_i9 @@ -229,36 +229,42 @@ compute_partial_view(const struct drm_i9
229 view.partial.offset = rounddown(page_offset, chunk); 229 view.partial.offset = rounddown(page_offset, chunk);
230 view.partial.size = 230 view.partial.size =
231 min_t(unsigned int, chunk, 231 min_t(unsigned int, chunk,
232 (obj->base.size >> PAGE_SHIFT) - view.partial.offset); 232 (obj->base.size >> PAGE_SHIFT) - view.partial.offset);
233 233
234 /* If the partial covers the entire object, just create a normal VMA. */ 234 /* If the partial covers the entire object, just create a normal VMA. */
235 if (chunk >= obj->base.size >> PAGE_SHIFT) 235 if (chunk >= obj->base.size >> PAGE_SHIFT)
236 view.type = I915_GGTT_VIEW_NORMAL; 236 view.type = I915_GGTT_VIEW_NORMAL;
237 237
238 return view; 238 return view;
239} 239}
240 240
241#ifdef __NetBSD__ 241#ifdef __NetBSD__
 242/*
 243 * XXX pmap_enter_default instead of pmap_enter because of a problem
 244 * with using weak aliases in kernel modules.
 245 *
 246 * XXX This probably won't work in a Xen kernel! Maybe this should be
 247 * #ifdef _MODULE?
 248 */
 249int pmap_enter_default(pmap_t, vaddr_t, paddr_t, vm_prot_t, unsigned);
 250#define pmap_enter pmap_enter_default
242 251
243static int 252static int
244i915_gem_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, struct vm_page **pps, 253i915_error_to_vmf_fault(int err)
245 int npages, int centeridx, vm_prot_t access_type, int flags) 
246{ 254{
247 panic("NYI"); 255 return err;
248} 256}
249 
250#else 257#else
251 
252static vm_fault_t i915_error_to_vmf_fault(int err) 258static vm_fault_t i915_error_to_vmf_fault(int err)
253{ 259{
254 switch (err) { 260 switch (err) {
255 default: 261 default:
256 WARN_ONCE(err, "unhandled error in %s: %i\n", __func__, err); 262 WARN_ONCE(err, "unhandled error in %s: %i\n", __func__, err);
257 /* fallthrough */ 263 /* fallthrough */
258 case -EIO: /* shmemfs failure from swap device */ 264 case -EIO: /* shmemfs failure from swap device */
259 case -EFAULT: /* purged object */ 265 case -EFAULT: /* purged object */
260 case -ENODEV: /* bad object, how did you get here! */ 266 case -ENODEV: /* bad object, how did you get here! */
261 case -ENXIO: /* unable to access backing store (on device) */ 267 case -ENXIO: /* unable to access backing store (on device) */
262 return VM_FAULT_SIGBUS; 268 return VM_FAULT_SIGBUS;
263 269
264 case -ENOSPC: /* shmemfs allocation failure */ 270 case -ENOSPC: /* shmemfs allocation failure */
@@ -267,89 +273,154 @@ static vm_fault_t i915_error_to_vmf_faul @@ -267,89 +273,154 @@ static vm_fault_t i915_error_to_vmf_faul
267 273
268 case 0: 274 case 0:
269 case -EAGAIN: 275 case -EAGAIN:
270 case -ERESTARTSYS: 276 case -ERESTARTSYS:
271 case -EINTR: 277 case -EINTR:
272 case -EBUSY: 278 case -EBUSY:
273 /* 279 /*
274 * EBUSY is ok: this just means that another thread 280 * EBUSY is ok: this just means that another thread
275 * already did the job. 281 * already did the job.
276 */ 282 */
277 return VM_FAULT_NOPAGE; 283 return VM_FAULT_NOPAGE;
278 } 284 }
279} 285}
 286#endif
280 287
 288#ifdef __NetBSD__
 289static int
 290vm_fault_cpu(struct uvm_faultinfo *ufi, struct i915_mmap_offset *mmo,
 291 vaddr_t vaddr, struct vm_page **pps, int npages, int centeridx, int flags)
 292#else
281static vm_fault_t vm_fault_cpu(struct vm_fault *vmf) 293static vm_fault_t vm_fault_cpu(struct vm_fault *vmf)
 294#endif
282{ 295{
 296#ifndef __NetBSD__
283 struct vm_area_struct *area = vmf->vma; 297 struct vm_area_struct *area = vmf->vma;
284 struct i915_mmap_offset *mmo = area->vm_private_data; 298 struct i915_mmap_offset *mmo = area->vm_private_data;
 299#endif
285 struct drm_i915_gem_object *obj = mmo->obj; 300 struct drm_i915_gem_object *obj = mmo->obj;
 301#ifdef __NetBSD__
 302 bool write = ufi->entry->protection & VM_PROT_WRITE;
 303#else
 304 bool write = area->vm_flags & VM_WRITE;
 305#endif
286 resource_size_t iomap; 306 resource_size_t iomap;
287 int err; 307 int err;
288 308
289 /* Sanity check that we allow writing into this object */ 309 /* Sanity check that we allow writing into this object */
290 if (unlikely(i915_gem_object_is_readonly(obj) && 310 if (unlikely(i915_gem_object_is_readonly(obj) && write))
291 area->vm_flags & VM_WRITE)) 311#ifdef __NetBSD__
 312 return -EFAULT;
 313#else
292 return VM_FAULT_SIGBUS; 314 return VM_FAULT_SIGBUS;
 315#endif
293 316
294 err = i915_gem_object_pin_pages(obj); 317 err = i915_gem_object_pin_pages(obj);
295 if (err) 318 if (err)
296 goto out; 319 goto out;
297 320
298 iomap = -1; 321 iomap = -1;
299 if (!i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_STRUCT_PAGE)) { 322 if (!i915_gem_object_type_has(obj, I915_GEM_OBJECT_HAS_STRUCT_PAGE)) {
300 iomap = obj->mm.region->iomap.base; 323 iomap = obj->mm.region->iomap.base;
301 iomap -= obj->mm.region->region.start; 324 iomap -= obj->mm.region->region.start;
302 } 325 }
303 326
304 /* PTEs are revoked in obj->ops->put_pages() */ 327 /* PTEs are revoked in obj->ops->put_pages() */
 328#ifdef __NetBSD__
 329 /* XXX No lmem supported yet. */
 330 KASSERT(i915_gem_object_type_has(obj,
 331 I915_GEM_OBJECT_HAS_STRUCT_PAGE));
 332
 333 struct scatterlist *sg = obj->mm.pages->sgl;
 334 unsigned startpage = (ufi->entry->offset + (vaddr - ufi->entry->start))
 335 >> PAGE_SHIFT;
 336 paddr_t paddr;
 337 int i;
 338
 339 for (i = 0; i < npages; i++) {
 340 if ((flags & PGO_ALLPAGES) == 0 && i != centeridx)
 341 continue;
 342 if (pps[i] == PGO_DONTCARE)
 343 continue;
 344 paddr = page_to_phys(sg->sg_pgs[startpage + i]);
 345 /* XXX errno NetBSD->Linux */
 346 err = -pmap_enter(ufi->orig_map->pmap,
 347 vaddr + i*PAGE_SIZE, paddr, ufi->entry->protection,
 348 PMAP_CANFAIL | ufi->entry->protection);
 349 if (err)
 350 break;
 351 }
 352 pmap_update(ufi->orig_map->pmap);
 353#else
305 err = remap_io_sg(area, 354 err = remap_io_sg(area,
306 area->vm_start, area->vm_end - area->vm_start, 355 area->vm_start, area->vm_end - area->vm_start,
307 obj->mm.pages->sgl, iomap); 356 obj->mm.pages->sgl, iomap);
 357#endif
308 358
309 if (area->vm_flags & VM_WRITE) { 359 if (write) {
310 GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj)); 360 GEM_BUG_ON(!i915_gem_object_has_pinned_pages(obj));
311 obj->mm.dirty = true; 361 obj->mm.dirty = true;
312 } 362 }
313 363
314 i915_gem_object_unpin_pages(obj); 364 i915_gem_object_unpin_pages(obj);
315 365
316out: 366out:
317 return i915_error_to_vmf_fault(err); 367 return i915_error_to_vmf_fault(err);
318} 368}
319 369
 370#ifdef __NetBSD__
 371static int
 372vm_fault_gtt(struct uvm_faultinfo *ufi, struct i915_mmap_offset *mmo,
 373 vaddr_t vaddr, struct vm_page **pps, int npages, int centeridx, int flags)
 374#else
320static vm_fault_t vm_fault_gtt(struct vm_fault *vmf) 375static vm_fault_t vm_fault_gtt(struct vm_fault *vmf)
 376#endif
321{ 377{
322#define MIN_CHUNK_PAGES (SZ_1M >> PAGE_SHIFT) 378#define MIN_CHUNK_PAGES (SZ_1M >> PAGE_SHIFT)
 379#ifndef __NetBSD__
323 struct vm_area_struct *area = vmf->vma; 380 struct vm_area_struct *area = vmf->vma;
324 struct i915_mmap_offset *mmo = area->vm_private_data; 381 struct i915_mmap_offset *mmo = area->vm_private_data;
 382#endif
325 struct drm_i915_gem_object *obj = mmo->obj; 383 struct drm_i915_gem_object *obj = mmo->obj;
326 struct drm_device *dev = obj->base.dev; 384 struct drm_device *dev = obj->base.dev;
327 struct drm_i915_private *i915 = to_i915(dev); 385 struct drm_i915_private *i915 = to_i915(dev);
328 struct intel_runtime_pm *rpm = &i915->runtime_pm; 386 struct intel_runtime_pm *rpm = &i915->runtime_pm;
329 struct i915_ggtt *ggtt = &i915->ggtt; 387 struct i915_ggtt *ggtt = &i915->ggtt;
 388#ifdef __NetBSD__
 389 bool write = ufi->entry->protection & VM_PROT_WRITE;
 390#else
330 bool write = area->vm_flags & VM_WRITE; 391 bool write = area->vm_flags & VM_WRITE;
 392#endif
331 intel_wakeref_t wakeref; 393 intel_wakeref_t wakeref;
332 struct i915_vma *vma; 394 struct i915_vma *vma;
333 pgoff_t page_offset; 395 pgoff_t page_offset;
334 int srcu; 396 int srcu;
335 int ret; 397 int ret;
336 398
337 /* Sanity check that we allow writing into this object */ 399 /* Sanity check that we allow writing into this object */
338 if (i915_gem_object_is_readonly(obj) && write) 400 if (i915_gem_object_is_readonly(obj) && write)
 401#ifdef __NetBSD__
 402 return -EFAULT;
 403#else
339 return VM_FAULT_SIGBUS; 404 return VM_FAULT_SIGBUS;
 405#endif
340 406
 407#ifdef __NetBSD__
 408 page_offset = (ufi->entry->offset + (vaddr - ufi->entry->start))
 409 >> PAGE_SHIFT;
 410#else
341 /* We don't use vmf->pgoff since that has the fake offset */ 411 /* We don't use vmf->pgoff since that has the fake offset */
342 page_offset = (vmf->address - area->vm_start) >> PAGE_SHIFT; 412 page_offset = (vmf->address - area->vm_start) >> PAGE_SHIFT;
 413#endif
343 414
344 trace_i915_gem_object_fault(obj, page_offset, true, write); 415 trace_i915_gem_object_fault(obj, page_offset, true, write);
345 416
346 ret = i915_gem_object_pin_pages(obj); 417 ret = i915_gem_object_pin_pages(obj);
347 if (ret) 418 if (ret)
348 goto err; 419 goto err;
349 420
350 wakeref = intel_runtime_pm_get(rpm); 421 wakeref = intel_runtime_pm_get(rpm);
351 422
352 ret = intel_gt_reset_trylock(ggtt->vm.gt, &srcu); 423 ret = intel_gt_reset_trylock(ggtt->vm.gt, &srcu);
353 if (ret) 424 if (ret)
354 goto err_rpm; 425 goto err_rpm;
355 426
@@ -389,31 +460,53 @@ static vm_fault_t vm_fault_gtt(struct vm @@ -389,31 +460,53 @@ static vm_fault_t vm_fault_gtt(struct vm
389 } 460 }
390 461
391 /* Access to snoopable pages through the GTT is incoherent. */ 462 /* Access to snoopable pages through the GTT is incoherent. */
392 if (obj->cache_level != I915_CACHE_NONE && !HAS_LLC(i915)) { 463 if (obj->cache_level != I915_CACHE_NONE && !HAS_LLC(i915)) {
393 ret = -EFAULT; 464 ret = -EFAULT;
394 goto err_unpin; 465 goto err_unpin;
395 } 466 }
396 467
397 ret = i915_vma_pin_fence(vma); 468 ret = i915_vma_pin_fence(vma);
398 if (ret) 469 if (ret)
399 goto err_unpin; 470 goto err_unpin;
400 471
401 /* Finally, remap it using the new GTT offset */ 472 /* Finally, remap it using the new GTT offset */
 473#ifdef __NetBSD__
 474 unsigned startpage = page_offset;
 475 paddr_t paddr;
 476 int i;
 477
 478 for (i = 0; i < npages; i++) {
 479 if ((flags & PGO_ALLPAGES) == 0 && i != centeridx)
 480 continue;
 481 if (pps[i] == PGO_DONTCARE)
 482 continue;
 483 paddr = ggtt->gmadr.start + vma->node.start
 484 + (startpage + i)*PAGE_SIZE;
 485 /* XXX errno NetBSD->Linux */
 486 ret = -pmap_enter(ufi->orig_map->pmap,
 487 vaddr + i*PAGE_SIZE, paddr, ufi->entry->protection,
 488 PMAP_CANFAIL | ufi->entry->protection);
 489 if (ret)
 490 break;
 491 }
 492 pmap_update(ufi->orig_map->pmap);
 493#else
402 ret = remap_io_mapping(area, 494 ret = remap_io_mapping(area,
403 area->vm_start + (vma->ggtt_view.partial.offset << PAGE_SHIFT), 495 area->vm_start + (vma->ggtt_view.partial.offset << PAGE_SHIFT),
404 (ggtt->gmadr.start + vma->node.start) >> PAGE_SHIFT, 496 (ggtt->gmadr.start + vma->node.start) >> PAGE_SHIFT,
405 min_t(u64, vma->size, area->vm_end - area->vm_start), 497 min_t(u64, vma->size, area->vm_end - area->vm_start),
406 &ggtt->iomap); 498 &ggtt->iomap);
 499#endif
407 if (ret) 500 if (ret)
408 goto err_fence; 501 goto err_fence;
409 502
410 assert_rpm_wakelock_held(rpm); 503 assert_rpm_wakelock_held(rpm);
411 504
412 /* Mark as being mmapped into userspace for later revocation */ 505 /* Mark as being mmapped into userspace for later revocation */
413 mutex_lock(&i915->ggtt.vm.mutex); 506 mutex_lock(&i915->ggtt.vm.mutex);
414 if (!i915_vma_set_userfault(vma) && !obj->userfault_count++) 507 if (!i915_vma_set_userfault(vma) && !obj->userfault_count++)
415 list_add(&obj->userfault_link, &i915->ggtt.userfault_list); 508 list_add(&obj->userfault_link, &i915->ggtt.userfault_list);
416 mutex_unlock(&i915->ggtt.vm.mutex); 509 mutex_unlock(&i915->ggtt.vm.mutex);
417 510
418 /* Track the mmo associated with the fenced vma */ 511 /* Track the mmo associated with the fenced vma */
419 vma->mmo = mmo; 512 vma->mmo = mmo;
@@ -431,27 +524,114 @@ static vm_fault_t vm_fault_gtt(struct vm @@ -431,27 +524,114 @@ static vm_fault_t vm_fault_gtt(struct vm
431err_fence: 524err_fence:
432 i915_vma_unpin_fence(vma); 525 i915_vma_unpin_fence(vma);
433err_unpin: 526err_unpin:
434 __i915_vma_unpin(vma); 527 __i915_vma_unpin(vma);
435err_reset: 528err_reset:
436 intel_gt_reset_unlock(ggtt->vm.gt, srcu); 529 intel_gt_reset_unlock(ggtt->vm.gt, srcu);
437err_rpm: 530err_rpm:
438 intel_runtime_pm_put(rpm, wakeref); 531 intel_runtime_pm_put(rpm, wakeref);
439 i915_gem_object_unpin_pages(obj); 532 i915_gem_object_unpin_pages(obj);
440err: 533err:
441 return i915_error_to_vmf_fault(ret); 534 return i915_error_to_vmf_fault(ret);
442} 535}
443 536
444#endif /* __NetBSD__ */ 537#ifdef __NetBSD__
 538
 539static int
 540i915_gem_fault(struct uvm_faultinfo *ufi, vaddr_t vaddr, struct vm_page **pps,
 541 int npages, int centeridx, vm_prot_t access_type, int flags)
 542{
 543 struct uvm_object *uobj = ufi->entry->object.uvm_obj;
 544 struct drm_gem_object *gem =
 545 container_of(uobj, struct drm_gem_object, gemo_uvmobj);
 546 struct drm_i915_gem_object *obj = to_intel_bo(gem);
 547 struct drm_device *dev = obj->base.dev;
 548 struct drm_vma_offset_node *node;
 549 struct i915_mmap_offset *mmo;
 550 bool pinned = false;
 551 int error;
 552
 553 KASSERT(rw_lock_held(obj->base.filp->vmobjlock));
 554 KASSERT(!i915_gem_object_is_readonly(obj) ||
 555 (access_type & VM_PROT_WRITE) == 0);
 556 KASSERT(i915_gem_object_type_has(obj,
 557 I915_GEM_OBJECT_HAS_STRUCT_PAGE|I915_GEM_OBJECT_HAS_IOMEM));
 558
 559 /* Actually we don't support iomem right now! */
 560 KASSERT(i915_gem_object_type_has(obj,
 561 I915_GEM_OBJECT_HAS_STRUCT_PAGE));
 562
 563 /*
 564 * Look up the mmo again because we can't conveniently store it
 565 * alongside the mapping unless we create a separate uvm object
 566 * for it. XXX Consider creating a separate uvm object as a
 567 * kind of subobject of the main object.
 568 */
 569 rcu_read_lock();
 570 drm_vma_offset_lock_lookup(dev->vma_offset_manager);
 571 node = drm_vma_offset_exact_lookup_locked(dev->vma_offset_manager,
 572 ufi->entry->start >> PAGE_SHIFT,
 573 (ufi->entry->end - ufi->entry->start) >> PAGE_SHIFT);
 574 drm_vma_offset_unlock_lookup(dev->vma_offset_manager);
 575 rcu_read_unlock();
 576
 577 /*
 578 * The mmo had better be there -- hope we can't remove the mmo
 579 * without unmapping first!
 580 */
 581 KASSERT(node);
 582 mmo = container_of(node, struct i915_mmap_offset, vma_node);
 583 KASSERT(obj == mmo->obj);
 584
 585 /* XXX errno Linux->NetBSD */
 586 error = -i915_gem_object_pin_pages(obj);
 587 if (error)
 588 goto out;
 589 pinned = true;
 590
 591 switch (mmo->mmap_type) {
 592 case I915_MMAP_TYPE_WC:
 593 case I915_MMAP_TYPE_WB:
 594 case I915_MMAP_TYPE_UC:
 595 /* XXX errno Linux->NetBSD */
 596 error = -vm_fault_cpu(ufi, mmo, vaddr, pps, npages, centeridx,
 597 flags);
 598 break;
 599 case I915_MMAP_TYPE_GTT:
 600 error = -vm_fault_gtt(ufi, mmo, vaddr, pps, npages, centeridx,
 601 flags);
 602 break;
 603 default:
 604 panic("invalid i915 gem mmap offset type: %d",
 605 mmo->mmap_type);
 606 }
 607
 608out: if (pinned)
 609 i915_gem_object_unpin_pages(obj);
 610 uvmfault_unlockall(ufi, ufi->entry->aref.ar_amap, uobj);
 611
 612 /*
 613 * Remap EINTR to success, so that we return to userland.
 614 * On the way out, we'll deliver the signal, and if the signal
 615 * is not fatal then the user code which faulted will most likely
 616 * fault again, and we'll come back here for another try.
 617 */
 618 if (error == EINTR)
 619 error = 0;
 620
 621 return error;
 622}
 623
 624#endif
445 625
446void __i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj) 626void __i915_gem_object_release_mmap_gtt(struct drm_i915_gem_object *obj)
447{ 627{
448 struct i915_vma *vma; 628 struct i915_vma *vma;
449 629
450 GEM_BUG_ON(!obj->userfault_count); 630 GEM_BUG_ON(!obj->userfault_count);
451 631
452 for_each_ggtt_vma(vma, obj) 632 for_each_ggtt_vma(vma, obj)
453 i915_vma_revoke_mmap(vma); 633 i915_vma_revoke_mmap(vma);
454 634
455 GEM_BUG_ON(obj->userfault_count); 635 GEM_BUG_ON(obj->userfault_count);
456} 636}
457 637

cvs diff -r1.83 -r1.84 src/sys/external/bsd/drm2/i915drm/files.i915drmkms (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/i915drm/files.i915drmkms 2021/12/19 11:52:07 1.83
+++ src/sys/external/bsd/drm2/i915drm/files.i915drmkms 2021/12/19 11:57:42 1.84
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1# $NetBSD: files.i915drmkms,v 1.83 2021/12/19 11:52:07 riastradh Exp $ 1# $NetBSD: files.i915drmkms,v 1.84 2021/12/19 11:57:42 riastradh Exp $
2 2
3version 20180827 3version 20180827
4 4
5define intelfbbus { } 5define intelfbbus { }
6device i915drmkms: drmkms, drmkms_pci, intelfbbus, agp_i810, firmload 6device i915drmkms: drmkms, drmkms_pci, intelfbbus, agp_i810, firmload
7attach i915drmkms at pci 7attach i915drmkms at pci
8 8
9device intelfb: intelfbbus, drmfb, drmfb_pci, wsemuldisplaydev 9device intelfb: intelfbbus, drmfb, drmfb_pci, wsemuldisplaydev
10attach intelfb at intelfbbus 10attach intelfb at intelfbbus
11 11
12# This code comes from the Linux kernel, which assumes signed 12# This code comes from the Linux kernel, which assumes signed
13# overflow is OK. 13# overflow is OK.
14makeoptions i915drmkms "COPTS.i915drmkms"+="-fwrapv" 14makeoptions i915drmkms "COPTS.i915drmkms"+="-fwrapv"
@@ -25,26 +25,27 @@ makeoptions i915drmkms "CPPFLAGS.i915drm @@ -25,26 +25,27 @@ makeoptions i915drmkms "CPPFLAGS.i915drm
25makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_ALPHA_SUPPORT=0" 25makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_ALPHA_SUPPORT=0"
26makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FBDEV=1" 26makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FBDEV=1"
27makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_GVT=0" 27makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_GVT=0"
28makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT=0" 28makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_PRELIMINARY_HW_SUPPORT=0"
29makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_DEBUG_MMIO=1" # XXX 29makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_DEBUG_MMIO=1" # XXX
30makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FORCE_PROBE=0" 30makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_FORCE_PROBE=0"
31makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SPIN_REQUEST=0" 31makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SPIN_REQUEST=0"
32makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SW_FENCE_CHECK_DAG=1" # XXX expensive debug option? 32makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SW_FENCE_CHECK_DAG=1" # XXX expensive debug option?
33makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500" # milliseconds 33makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_HEARTBEAT_INTERVAL=2500" # milliseconds
34makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_STOP_TIMEOUT=100" # milliseconds 34makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_STOP_TIMEOUT=100" # milliseconds
35makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_PREEMPT_TIMEOUT=640" # milliseconds 35makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_PREEMPT_TIMEOUT=640" # milliseconds
36makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_CAPTURE_ERROR=0" 36makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_CAPTURE_ERROR=0"
37makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SELFTEST=0" 37makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_SELFTEST=0"
 38makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=0"
38makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_PM=1" 39makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_PM=1"
39makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_INTEL_MEI_HDCP=0" 40makeoptions i915drmkms "CPPFLAGS.i915drmkms"+="-DCONFIG_INTEL_MEI_HDCP=0"
40 41
41makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-missing-field-initializers" 42makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-missing-field-initializers"
42makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-pointer-arith" 43makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-pointer-arith"
43makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-shadow" 44makeoptions i915drmkms "CWARNFLAGS.i915drmkms"+="-Wno-shadow"
44 45
45makeoptions i915drmkms "CWARNFLAGS.i915_pci.c"+="${${ACTIVE_CC} == gcc:? -Wno-override-init :}" 46makeoptions i915drmkms "CWARNFLAGS.i915_pci.c"+="${${ACTIVE_CC} == gcc:? -Wno-override-init :}"
46makeoptions i915drmkms "CWARNFLAGS.i915_pci.c"+="${${ACTIVE_CC} == clang:? -Wno-initializer-overrides :}" 47makeoptions i915drmkms "CWARNFLAGS.i915_pci.c"+="${${ACTIVE_CC} == clang:? -Wno-initializer-overrides :}"
47 48
48makeoptions i915drmkms "CWARNFLAGS.intel_sprite.c"+="${${ACTIVE_CC} == gcc:? -Wno-maybe-uninitialized :}" 49makeoptions i915drmkms "CWARNFLAGS.intel_sprite.c"+="${${ACTIVE_CC} == gcc:? -Wno-maybe-uninitialized :}"
49 50
50makeoptions i915drmkms "CWARNFLAGS.intel_ddi.c"+="${${ACTIVE_CC} == gcc && ${HAVE_GCC:U0} >= 10:? -Wno-maybe-uninitialized :} ${${ACTIVE_CC} == gcc && ${HAVE_GCC:U0} >= 7:? -Wno-implicit-fallthrough :}" 51makeoptions i915drmkms "CWARNFLAGS.intel_ddi.c"+="${${ACTIVE_CC} == gcc && ${HAVE_GCC:U0} >= 10:? -Wno-maybe-uninitialized :} ${${ACTIVE_CC} == gcc && ${HAVE_GCC:U0} >= 7:? -Wno-implicit-fallthrough :}"

cvs diff -r1.8 -r1.9 src/sys/external/bsd/drm2/include/linux/io-mapping.h (expand / switch to unified diff)

--- src/sys/external/bsd/drm2/include/linux/io-mapping.h 2021/12/19 11:39:56 1.8
+++ src/sys/external/bsd/drm2/include/linux/io-mapping.h 2021/12/19 11:57:43 1.9
@@ -1,14 +1,14 @@ @@ -1,14 +1,14 @@
1/* $NetBSD: io-mapping.h,v 1.8 2021/12/19 11:39:56 riastradh Exp $ */ 1/* $NetBSD: io-mapping.h,v 1.9 2021/12/19 11:57:43 riastradh Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2013 The NetBSD Foundation, Inc. 4 * Copyright (c) 2013 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Taylor R. Campbell. 8 * by Taylor R. Campbell.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
@@ -32,27 +32,27 @@ @@ -32,27 +32,27 @@
32#ifndef _LINUX_IO_MAPPING_H_ 32#ifndef _LINUX_IO_MAPPING_H_
33#define _LINUX_IO_MAPPING_H_ 33#define _LINUX_IO_MAPPING_H_
34 34
35#include <sys/param.h> 35#include <sys/param.h>
36#include <sys/bus.h> 36#include <sys/bus.h>
37#include <sys/kmem.h> 37#include <sys/kmem.h>
38#include <sys/systm.h> 38#include <sys/systm.h>
39#include <sys/mman.h> 39#include <sys/mman.h>
40 40
41#include <uvm/uvm_extern.h> 41#include <uvm/uvm_extern.h>
42 42
43struct io_mapping { 43struct io_mapping {
44 bus_space_tag_t diom_bst; 44 bus_space_tag_t diom_bst;
45 bus_addr_t diom_addr; 45 bus_addr_t base; /* Linux API */
46 bus_size_t size; /* Linux API */ 46 bus_size_t size; /* Linux API */
47 vaddr_t diom_va; 47 vaddr_t diom_va;
48 bool diom_mapped; 48 bool diom_mapped;
49}; 49};
50 50
51static inline bool 51static inline bool
52bus_space_io_mapping_init_wc(bus_space_tag_t bst, struct io_mapping *mapping, 52bus_space_io_mapping_init_wc(bus_space_tag_t bst, struct io_mapping *mapping,
53 bus_addr_t addr, bus_size_t size) 53 bus_addr_t addr, bus_size_t size)
54{ 54{
55 bus_size_t offset; 55 bus_size_t offset;
56 56
57 KASSERT(PAGE_SIZE <= size); 57 KASSERT(PAGE_SIZE <= size);
58 KASSERT(0 == (size & (PAGE_SIZE - 1))); 58 KASSERT(0 == (size & (PAGE_SIZE - 1)));
@@ -65,27 +65,27 @@ bus_space_io_mapping_init_wc(bus_space_t @@ -65,27 +65,27 @@ bus_space_io_mapping_init_wc(bus_space_t
65 * have PAT or if we later make this use direct map. 65 * have PAT or if we later make this use direct map.
66 */ 66 */
67 67
68 /* Make sure the region is mappable. */ 68 /* Make sure the region is mappable. */
69 for (offset = 0; offset < size; offset += PAGE_SIZE) { 69 for (offset = 0; offset < size; offset += PAGE_SIZE) {
70 if (bus_space_mmap(bst, addr, offset, PROT_READ|PROT_WRITE, 70 if (bus_space_mmap(bst, addr, offset, PROT_READ|PROT_WRITE,
71 BUS_SPACE_MAP_LINEAR|BUS_SPACE_MAP_PREFETCHABLE) 71 BUS_SPACE_MAP_LINEAR|BUS_SPACE_MAP_PREFETCHABLE)
72 == (paddr_t)-1) 72 == (paddr_t)-1)
73 return false; 73 return false;
74 } 74 }
75 75
76 /* Initialize the mapping record. */ 76 /* Initialize the mapping record. */
77 mapping->diom_bst = bst; 77 mapping->diom_bst = bst;
78 mapping->diom_addr = addr; 78 mapping->base = addr;
79 mapping->size = size; 79 mapping->size = size;
80 mapping->diom_mapped = false; 80 mapping->diom_mapped = false;
81 81
82 /* Allocate kva for one page. */ 82 /* Allocate kva for one page. */
83 mapping->diom_va = uvm_km_alloc(kernel_map, PAGE_SIZE, PAGE_SIZE, 83 mapping->diom_va = uvm_km_alloc(kernel_map, PAGE_SIZE, PAGE_SIZE,
84 UVM_KMF_VAONLY | UVM_KMF_WAITVA); 84 UVM_KMF_VAONLY | UVM_KMF_WAITVA);
85 KASSERT(mapping->diom_va != 0); 85 KASSERT(mapping->diom_va != 0);
86 86
87 return true; 87 return true;
88} 88}
89 89
90static inline void 90static inline void
91io_mapping_fini(struct io_mapping *mapping) 91io_mapping_fini(struct io_mapping *mapping)
@@ -123,27 +123,27 @@ io_mapping_free(struct io_mapping *mappi @@ -123,27 +123,27 @@ io_mapping_free(struct io_mapping *mappi
123static inline void * 123static inline void *
124io_mapping_map_wc(struct io_mapping *mapping, bus_addr_t offset, 124io_mapping_map_wc(struct io_mapping *mapping, bus_addr_t offset,
125 bus_size_t size) 125 bus_size_t size)
126{ 126{
127 paddr_t cookie; 127 paddr_t cookie;
128 128
129 KASSERT(size == PAGE_SIZE); 129 KASSERT(size == PAGE_SIZE);
130 KASSERT(0 == (offset & (PAGE_SIZE - 1))); 130 KASSERT(0 == (offset & (PAGE_SIZE - 1)));
131 KASSERT(PAGE_SIZE <= mapping->size); 131 KASSERT(PAGE_SIZE <= mapping->size);
132 KASSERT(offset <= (mapping->size - PAGE_SIZE)); 132 KASSERT(offset <= (mapping->size - PAGE_SIZE));
133 KASSERT(__type_fit(off_t, offset)); 133 KASSERT(__type_fit(off_t, offset));
134 KASSERT(!mapping->diom_mapped); 134 KASSERT(!mapping->diom_mapped);
135 135
136 cookie = bus_space_mmap(mapping->diom_bst, mapping->diom_addr, offset, 136 cookie = bus_space_mmap(mapping->diom_bst, mapping->base, offset,
137 PROT_READ|PROT_WRITE, 137 PROT_READ|PROT_WRITE,
138 BUS_SPACE_MAP_LINEAR|BUS_SPACE_MAP_PREFETCHABLE); 138 BUS_SPACE_MAP_LINEAR|BUS_SPACE_MAP_PREFETCHABLE);
139 KASSERT(cookie != (paddr_t)-1); 139 KASSERT(cookie != (paddr_t)-1);
140 140
141 pmap_kenter_pa(mapping->diom_va, pmap_phys_address(cookie), 141 pmap_kenter_pa(mapping->diom_va, pmap_phys_address(cookie),
142 PROT_READ|PROT_WRITE, pmap_mmap_flags(cookie)); 142 PROT_READ|PROT_WRITE, pmap_mmap_flags(cookie));
143 pmap_update(pmap_kernel()); 143 pmap_update(pmap_kernel());
144 144
145 mapping->diom_mapped = true; 145 mapping->diom_mapped = true;
146 return (void *)mapping->diom_va; 146 return (void *)mapping->diom_va;
147} 147}
148 148
149static inline void 149static inline void