Index: sys/dev/agp/agp_i810.h =================================================================== --- sys/dev/agp/agp_i810.h +++ sys/dev/agp/agp_i810.h @@ -71,7 +71,6 @@ bus_addr_t gma_bus_addr; }; -struct intel_gtt agp_intel_gtt_get(device_t dev); int agp_intel_gtt_chipset_flush(device_t dev); void agp_intel_gtt_unmap_memory(device_t dev, struct sglist *sg_list); void agp_intel_gtt_clear_range(device_t dev, u_int first_entry, @@ -82,8 +81,8 @@ u_int pg_start, u_int flags); void agp_intel_gtt_insert_pages(device_t dev, u_int first_entry, u_int num_entries, vm_page_t *pages, u_int flags); - -struct intel_gtt *intel_gtt_get(void); +void intel_gtt_get(size_t *gtt_total, size_t *stolen_size, + bus_addr_t *mappable_base, unsigned long *mappable_end); int intel_gtt_chipset_flush(void); void intel_gtt_unmap_memory(struct sglist *sg_list); void intel_gtt_clear_range(u_int first_entry, u_int num_entries); Index: sys/dev/agp/agp_i810.c =================================================================== --- sys/dev/agp/agp_i810.c +++ sys/dev/agp/agp_i810.c @@ -236,10 +236,6 @@ void (*chipset_flush)(device_t); }; -static struct { - struct intel_gtt base; -} intel_private; - static const struct agp_i810_driver agp_i810_i810_driver = { .chiptype = CHIP_I810, .gen = 1, @@ -1964,23 +1960,17 @@ sc->match->driver->read_gtt_pte(dev, first_entry + num_entries - 1); } -struct intel_gtt -agp_intel_gtt_get(device_t dev) +void +intel_gtt_get(size_t *gtt_total, size_t *stolen_size, + bus_addr_t *mappable_base, unsigned long *mappable_end) { struct agp_i810_softc *sc; - struct intel_gtt res; - sc = device_get_softc(dev); - res.stolen_size = sc->stolen_size; - res.gtt_total_entries = sc->gtt_total_entries; - res.gtt_mappable_entries = sc->gtt_mappable_entries; - res.do_idle_maps = 0; - res.scratch_page_dma = VM_PAGE_TO_PHYS(bogus_page); - if (sc->agp.as_aperture != NULL) - res.gma_bus_addr = rman_get_start(sc->agp.as_aperture); - else - res.gma_bus_addr = 0; - return (res); + sc = device_get_softc(intel_agp); + *stolen_size = sc->stolen_size; + *gtt_total = sc->gtt_total_entries << PAGE_SHIFT; + *mappable_end = sc->gtt_mappable_entries << PAGE_SHIFT; + *mappable_base = rman_get_start(sc->agp.as_aperture); } static int @@ -2283,14 +2273,6 @@ pages, flags); } -struct intel_gtt * -intel_gtt_get(void) -{ - - intel_private.base = agp_intel_gtt_get(intel_agp); - return (&intel_private.base); -} - int intel_gtt_chipset_flush(void) { Index: sys/dev/drm2/i915/i915_gem_gtt.c =================================================================== --- sys/dev/drm2/i915/i915_gem_gtt.c +++ sys/dev/drm2/i915/i915_gem_gtt.c @@ -649,12 +649,17 @@ struct drm_i915_private *dev_priv = dev->dev_private; vm_paddr_t gtt_bus_addr; u16 snb_gmch_ctl; + struct intel_gtt *gtt; int ret; /* On modern platforms we need not worry ourself with the legacy * hostbridge query stuff. Skip it entirely */ + gtt = dev_priv->mm.gtt = malloc(sizeof(*dev_priv->mm.gtt), DRM_I915_GEM, M_WAITOK | M_ZERO); + if (INTEL_INFO(dev)->gen < 6) { + size_t gtt_total, stolen_size; + unsigned long mappable_end; #ifdef FREEBSD_WIP ret = intel_gmch_probe(dev_priv->bridge_dev, dev->pdev, NULL); if (!ret) { @@ -663,7 +668,10 @@ } #endif /* FREEBSD_WIP */ - dev_priv->mm.gtt = intel_gtt_get(); + intel_gtt_get(>t_total, &stolen_size, >t->gma_bus_addr, &mappable_end); + gtt->gtt_total_entries = gtt_total; + gtt->stolen_size = stolen_size; + gtt->gtt_mappable_entries = mappable_endi >> PAGE_SHIFT; if (!dev_priv->mm.gtt) { DRM_ERROR("Failed to initialize GTT\n"); #ifdef FREEBSD_WIP @@ -674,10 +682,6 @@ return 0; } - dev_priv->mm.gtt = malloc(sizeof(*dev_priv->mm.gtt), DRM_I915_GEM, M_WAITOK | M_ZERO); - if (!dev_priv->mm.gtt) - return -ENOMEM; - #ifdef FREEBSD_WIP if (!pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(40))) pci_set_consistent_dma_mask(dev->pdev, DMA_BIT_MASK(40));