On Fri, Feb 03, 2023 at 10:38:53PM -0500, Thomas Frohwein wrote:
> On Sat, Feb 04, 2023 at 01:24:42PM +1100, Jonathan Gray wrote:
> 
> [...]
> 
> > 
> > I've committed the i915_gem_stolen_lmem_setup() portion.
> > 
> > Another diff
> > 
> > likely some more iomap use will show up later
> > 
> > i915_gem_object_read_from_page_iomap()
> > i915_gem_object_map_pfn()
> > i915_gem_object_map()
> > i915_ttm_io_mem_pfn()
> 
> I applied this; now the kernel panics when trying to switch the video
> mode. Excerpt (handtyped; screenshot at [1]):
> 
> ...
> 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?

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 = {

Reply via email to