On Fri, Feb 03, 2023 at 02:27:09PM -0500, Thomas Frohwein wrote:
> On Fri, Feb 03, 2023 at 12:54:52PM +1100, Jonathan Gray wrote:
> [...]
> > > +xehp_load_dss_mask: stub
> > > +xehp_load_dss_mask: stub
> > > +intel_slicemask_from_xehp_dssmask: stub
> > > +intel_slicemask_from_xehp_dssmask: stub
> > > +i915_gem_stolen_lmem_setup: stub
> > > +drm:pid0:intel_memory_regions_hw_probe *ERROR* [drm] *ERROR* Failed to
> > > setup region(-78) type=3
> > > +Device initialization failed (-78)
> >
> > thanks
> >
> > xehp_load_dss_mask() needs:
> > bitmap_from_arr32()
> >
> > intel_slicemask_from_xehp_dssmask() needs:
> > bitmap_intersects()
> > bitmap_shift_right()
> >
> > updated diff which unstubs i915_gem_stolen_lmem_setup()
>
> thanks, this moves forward into the next stub:
>
> -i915_gem_stolen_lmem_setup: stub
> +init_stolen_lmem: stub
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()
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 = {