Module Name: src Committed By: riastradh Date: Wed Mar 5 22:18:27 UTC 2014
Modified Files: src/sys/external/bsd/drm2/i915drm [riastradh-drm2]: i915_gem_gtt.c Log Message: Fix up i915_gem_gtt for agp-style gen<6 devices. - Set the DMA mask correctly: gen<4 needs 32-bit; gen4+, 36-bit. - Use agp_i810_write_gtt_entry, not AGP_BIND_PAGE. - Do a posting read after changing all the GTT entries. To generate a diff of this commit: cvs rdiff -u -r1.1.2.9 -r1.1.2.10 \ src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c diff -u src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c:1.1.2.9 src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c:1.1.2.10 --- src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c:1.1.2.9 Wed Mar 5 14:45:00 2014 +++ src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c Wed Mar 5 22:18:27 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_gtt.c,v 1.1.2.9 2014/03/05 14:45:00 riastradh Exp $ */ +/* $NetBSD: i915_gem_gtt.c,v 1.1.2.10 2014/03/05 22:18:27 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.1.2.9 2014/03/05 14:45:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.1.2.10 2014/03/05 22:18:27 riastradh Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -83,6 +83,18 @@ i915_gem_gtt_init(struct drm_device *dev if (ret) goto fail0; + /* + * The GTT entries are limited to 32-bit physical addresses up + * until gen4, at and after which they are limited to 36-bit + * physical addresses. + * + * XXX pci_set_dma_mask? pci_set_consistent_dma_mask? + */ + if (INTEL_INFO(dev)->gen < 4) + drm_limit_dma_space(dev, 0, 0x00000000ffffffffULL); + else + drm_limit_dma_space(dev, 0, 0x0000000fffffffffULL); + /* Success! */ DRM_INFO("Memory usable by graphics device = %dM\n", gtt->gtt_total_entries >> 8); @@ -428,10 +440,12 @@ agp_ggtt_bind_object(struct drm_i915_gem { struct drm_device *const dev = obj->base.dev; struct drm_i915_private *const dev_priv = dev->dev_private; + struct agp_i810_softc *const isc = agp_i810_sc->as_chipc; const off_t start = obj->gtt_space->start; bus_addr_t addr; bus_size_t len; unsigned int seg, i = 0; + int error; for (seg = 0; seg < obj->igo_dmamap->dm_nsegs; seg++) { addr = obj->igo_dmamap->dm_segs[seg].ds_addr; @@ -439,8 +453,14 @@ agp_ggtt_bind_object(struct drm_i915_gem do { KASSERT(PAGE_SIZE <= len); KASSERT(0 == (len % PAGE_SIZE)); - AGP_BIND_PAGE(agp_i810_sc, (start + (i << PAGE_SHIFT)), - addr); + error = agp_i810_write_gtt_entry(isc, + (start + (i << PAGE_SHIFT)), (addr | 1)); + if (error) + DRM_DEBUG("agp_i810_write_gtt_entry" + " %"PRIxMAX" -> %"PRIxMAX" failed: %d\n", + (uintmax_t)(start + (i << PAGE_SHIFT)), + (uintmax_t)(addr | 1), + error); addr += PAGE_SIZE; len -= PAGE_SIZE; i += 1; @@ -452,22 +472,20 @@ agp_ggtt_bind_object(struct drm_i915_gem (start >> PAGE_SHIFT))); KASSERT(i == (obj->base.size >> PAGE_SHIFT)); - /* - * XXX Linux does a posting read here of the last PTE, but the - * AGP API provides no way to do that. Hope it's OK... - */ + agp_i810_post_gtt_entry(isc, (start + ((i-1) << PAGE_SHIFT))); } static void agp_ggtt_clear_range(struct drm_device *dev, unsigned start_page, unsigned npages) { + struct agp_i810_softc *const isc = agp_i810_sc->as_chipc; unsigned page; for (page = start_page; npages--; page++) - AGP_UNBIND_PAGE(agp_i810_sc, (off_t)page << PAGE_SHIFT); + agp_i810_write_gtt_entry(isc, (off_t)page << PAGE_SHIFT, 0); - /* XXX Posting read! */ + agp_i810_post_gtt_entry(isc, ((page - 1) << PAGE_SHIFT)); } /* @@ -533,9 +551,6 @@ gen6_gtt_init(struct drm_device *dev) gtt->do_idle_maps = false; - /* XXX pci_set_dma_mask? pci_set_consistent_dma_mask? */ - drm_limit_dma_space(dev, 0, 0x0000000fffffffffULL); - gtt->gma_bus_addr = dev->bus_maps[2].bm_base; snb_gmch_ctl = pci_conf_read(pa->pa_pc, pa->pa_tag, SNB_GMCH_CTRL); @@ -595,8 +610,7 @@ fail2: __unused i915_gem_gtt_fini_scratch_page(gtt, dev->dmat); fail1: bus_space_unmap(dev->bst, gtt->gtt_bsh, (gtt->gtt_total_entries * sizeof(gtt_pte_t))); -fail0: /* XXX Undo drm_limit_dma_space? */ - return ret; +fail0: return ret; } static void