On Tue, Feb 07, 2023 at 08:51:40PM +1100, Jonathan Gray wrote: [...] > > ... > > i915_resize_lmem_bar: stub > > panic: kernel diagnostic assertion "pdev->pci->sc_bridgetag == NULL" > > failed: file "/usr/src/sys/dev/pci/drm/drm_linux.c", line 1277 > > ... > > The vga arbiter bits need to change. There isn't an easy way to get > a softc to avoid having state shared by multiple inteldrm instances. > > perhaps they can be skipped for the moment?
Thanks, this leads to a uvm_fault now: xehp_load_dss_mask: stub xehp_load_dss_mask: stub intel_slicemask_from_xehp_dssmask: stub intel_slicemask_from_xehp_dssmask: stub i915_resize_lmem_bar: stub uvm_fault(0xffffffff825181f8, 0x10, 0, 1) -> e screen photo at https://thfr.info/tmp/DG2-error-20230212.jpg > > Index: sys/dev/pci/drm/drm_linux.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/drm_linux.c,v > retrieving revision 1.95 > diff -u -p -r1.95 drm_linux.c > --- sys/dev/pci/drm/drm_linux.c 1 Jan 2023 01:34:34 -0000 1.95 > +++ sys/dev/pci/drm/drm_linux.c 7 Feb 2023 09:31:55 -0000 > @@ -1274,7 +1274,8 @@ vga_disable_bridge(struct pci_attach_arg > void > vga_get_uninterruptible(struct pci_dev *pdev, int rsrc) > { > - KASSERT(pdev->pci->sc_bridgetag == NULL); > + if (pdev->pci->sc_bridgetag != NULL) > + return; > pci_enumerate_bus(pdev->pci, vga_disable_bridge, NULL); > } > > @@ -1282,6 +1283,9 @@ void > vga_put(struct pci_dev *pdev, int rsrc) > { > pcireg_t bc; > + > + if (pdev->pci->sc_bridgetag != NULL) > + return; > > if (!vga_bridge_disabled) > return; > Index: sys/dev/pci/drm/i915/i915_pci.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/i915_pci.c,v > retrieving revision 1.15 > diff -u -p -r1.15 i915_pci.c > --- sys/dev/pci/drm/i915/i915_pci.c 25 Jan 2023 01:51:59 -0000 1.15 > +++ sys/dev/pci/drm/i915/i915_pci.c 3 Feb 2023 01:43:02 -0000 > @@ -1078,7 +1078,6 @@ static const struct intel_device_info dg > XE_LPD_FEATURES, > .__runtime.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | > BIT(TRANSCODER_C) | BIT(TRANSCODER_D), > - .require_force_probe = 1, > }; > > static const struct intel_device_info ats_m_info = { > Index: sys/dev/pci/drm/i915/intel_memory_region.h > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_memory_region.h,v > retrieving revision 1.3 > diff -u -p -r1.3 intel_memory_region.h > --- sys/dev/pci/drm/i915/intel_memory_region.h 1 Jan 2023 01:34:55 > -0000 1.3 > +++ sys/dev/pci/drm/i915/intel_memory_region.h 4 Feb 2023 00:59:23 > -0000 > @@ -70,8 +70,13 @@ struct intel_memory_region { > > const struct intel_memory_region_ops *ops; > > -#ifdef notyet > +#ifdef __linux__ > struct io_mapping iomap; > +#else > + struct vm_page *pgs; > + struct agp_map *agph; > + bus_space_handle_t bsh; > + bus_space_tag_t bst; > #endif > struct resource region; > > Index: sys/dev/pci/drm/i915/gem/i915_gem_lmem.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/gem/i915_gem_lmem.c,v > retrieving revision 1.4 > diff -u -p -r1.4 i915_gem_lmem.c > --- sys/dev/pci/drm/i915/gem/i915_gem_lmem.c 1 Jan 2023 01:34:56 -0000 > 1.4 > +++ sys/dev/pci/drm/i915/gem/i915_gem_lmem.c 4 Feb 2023 00:58:16 -0000 > @@ -15,9 +15,6 @@ i915_gem_object_lmem_io_map(struct drm_i > unsigned long n, > unsigned long size) > { > - STUB(); > - return NULL; > -#ifdef notyet > resource_size_t offset; > > GEM_BUG_ON(!i915_gem_object_is_contiguous(obj)); > @@ -25,7 +22,11 @@ i915_gem_object_lmem_io_map(struct drm_i > offset = i915_gem_object_get_dma_address(obj, n); > offset -= obj->mm.region->region.start; > > +#ifdef __linux__ > return io_mapping_map_wc(&obj->mm.region->iomap, offset, size); > +#else > + agp_map_atomic(obj->mm.region->agph, offset, &obj->mm.region->bsh); > + return bus_space_vaddr(obj->mm.region->bst, obj->mm.region->bsh); > #endif > } > > Index: sys/dev/pci/drm/i915/gem/i915_gem_stolen.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/gem/i915_gem_stolen.c,v > retrieving revision 1.5 > diff -u -p -r1.5 i915_gem_stolen.c > --- sys/dev/pci/drm/i915/gem/i915_gem_stolen.c 4 Feb 2023 00:07:11 > -0000 1.5 > +++ sys/dev/pci/drm/i915/gem/i915_gem_stolen.c 4 Feb 2023 01:23:34 > -0000 > @@ -774,18 +774,44 @@ static int init_stolen_lmem(struct intel > if (err) > return err; > > - STUB(); > - return -ENOSYS; > -#ifdef notyet > +#ifdef __linux__ > if (mem->io_size && !io_mapping_init_wc(&mem->iomap, > mem->io_start, > mem->io_size)) { > err = -EIO; > goto err_cleanup; > } > +#else > + if (mem->io_size) { > + int i; > + > + uvm_page_physload(atop(mem->io_start), > + atop(mem->io_start + mem->io_size), > + atop(mem->io_start), > + atop(mem->io_start + mem->io_size), > + PHYSLOAD_DEVICE); > + /* array of vm pages that physload introduced. */ > + mem->pgs = PHYS_TO_VM_PAGE(mem->io_start); > + KASSERT(mem->pgs != NULL); > + /* > + * XXX mark all pages write combining so user mmaps get the > + * right bits. We really need a proper MI api for doing this, > + * but for now this allows us to use PAT where available. > + */ > + for (i = 0; i < atop(mem->io_size); i++) > + atomic_setbits_int(&(mem->pgs[i].pg_flags), > + PG_PMAP_WC); > + if (agp_init_map(mem->bst, mem->io_start, > + mem->io_size, > + BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE, > + &mem->agph)) > + panic("can't map lmem"); > + } > +#endif > > return 0; > > +#ifdef __linux__ > err_cleanup: > i915_gem_cleanup_stolen(mem->i915); > return err; > Index: sys/dev/pci/drm/i915/gt/intel_region_lmem.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/drm/i915/gt/intel_region_lmem.c,v > retrieving revision 1.2 > diff -u -p -r1.2 intel_region_lmem.c > --- sys/dev/pci/drm/i915/gt/intel_region_lmem.c 1 Jan 2023 01:34:57 > -0000 1.2 > +++ sys/dev/pci/drm/i915/gt/intel_region_lmem.c 4 Feb 2023 01:31:29 > -0000 > @@ -142,15 +142,37 @@ region_lmem_release(struct intel_memory_ > static int > region_lmem_init(struct intel_memory_region *mem) > { > - STUB(); > - return -ENOSYS; > -#ifdef notyet > int ret; > > +#ifdef __linux__ > if (!io_mapping_init_wc(&mem->iomap, > mem->io_start, > mem->io_size)) > return -EIO; > +#else > + int i; > + uvm_page_physload(atop(mem->io_start), > + atop(mem->io_start + mem->io_size), > + atop(mem->io_start), > + atop(mem->io_start + mem->io_size), > + PHYSLOAD_DEVICE); > + /* array of vm pages that physload introduced. */ > + mem->pgs = PHYS_TO_VM_PAGE(mem->io_start); > + KASSERT(mem->pgs != NULL); > + /* > + * XXX mark all pages write combining so user mmaps get the > + * right bits. We really need a proper MI api for doing this, > + * but for now this allows us to use PAT where available. > + */ > + for (i = 0; i < atop(mem->io_size); i++) > + atomic_setbits_int(&(mem->pgs[i].pg_flags), > + PG_PMAP_WC); > + if (agp_init_map(mem->i915->bst, mem->io_start, > + mem->io_size, > + BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE, > + &mem->agph)) > + panic("can't init lmem"); > +#endif > > ret = intel_region_ttm_init(mem); > if (ret) > @@ -159,10 +181,13 @@ region_lmem_init(struct intel_memory_reg > return 0; > > out_no_buddy: > +#ifdef __linux__ > io_mapping_fini(&mem->iomap); > +#else > + agp_destroy_map(mem->agph); > +#endif > > return ret; > -#endif > } > > static const struct intel_memory_region_ops intel_region_lmem_ops = {