Module Name: src Committed By: riastradh Date: Wed May 14 15:58:24 UTC 2014
Modified Files: src/sys/external/bsd/drm2/i915drm: i915_gem_gtt.c Log Message: Tweak i915 gen6_gtt_init calculations for clarity. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 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.5 src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c:1.6 --- src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c:1.5 Fri May 2 14:36:10 2014 +++ src/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c Wed May 14 15:58:24 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_gem_gtt.c,v 1.5 2014/05/02 14:36:10 riastradh Exp $ */ +/* $NetBSD: i915_gem_gtt.c,v 1.6 2014/05/14 15:58:24 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.5 2014/05/02 14:36:10 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.6 2014/05/14 15:58:24 riastradh Exp $"); #include <sys/types.h> #include <sys/param.h> @@ -565,13 +565,13 @@ gen6_gtt_init(struct drm_device *dev) struct drm_i915_private *const dev_priv = dev->dev_private; struct pci_attach_args *const pa = &dev->pdev->pd_pa; struct intel_gtt *gtt = dev_priv->mm.gtt; + bus_addr_t gtt_addr; + bus_size_t gtt_size; uint16_t snb_gmch_ctl, ggms, gms; int ret; gtt->do_idle_maps = false; - 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); /* GMS: Graphics Mode Select. */ @@ -586,38 +586,47 @@ gen6_gtt_init(struct drm_device *dev) gtt->stolen_size = sizes[gms] << 20; } - /* GGMS: GTT Graphics Memory Size. */ + /* GGMS: GTT Graphics Memory Size, in megabytes. */ ggms = __SHIFTOUT(snb_gmch_ctl, SNB_GMCH_GGMS); + CTASSERT(SNB_GMCH_GGMS_MASK <= (INT_MAX >> 20)); gtt->gtt_total_entries = (ggms << 20) / sizeof(gtt_pte_t); - gtt->gtt_mappable_entries = (dev->bus_maps[2].bm_size >> PAGE_SHIFT); - if (((gtt->gtt_mappable_entries >> 8) < 64) || - (gtt->gtt_total_entries < gtt->gtt_mappable_entries)) { - DRM_ERROR("unknown GMADR entries: %d\n", - gtt->gtt_mappable_entries); - ret = -ENXIO; - goto fail0; - } - /* Linux sez: For GEN6+ the PTEs for the ggtt live at 2MB + BAR0 */ - if (dev->bus_maps[0].bm_size < (gtt->gtt_total_entries * - sizeof(gtt_pte_t))) { - DRM_ERROR("BAR0 too small for GTT: 0x%"PRIxMAX" < 0x%"PRIxMAX - "\n", + gtt_addr = (2<<20); + gtt_size = (gtt->gtt_total_entries * sizeof(gtt_pte_t)); + if ((gtt_addr > (__type_max(bus_addr_t) - dev->bus_maps[0].bm_base)) || + (gtt_size > (__type_max(bus_addr_t) - + (dev->bus_maps[0].bm_base + gtt_addr)))) { + DRM_ERROR("GTT doesn't fit in BAR0:" + " base 0x%"PRIxMAX + " size 0x%"PRIxMAX"," + " gtt_addr 0x%"PRIxMAX"" + " gtt_total_entries 0x%"PRIxMAX"\n", + (uintmax_t)dev->bus_maps[0].bm_base, (uintmax_t)dev->bus_maps[0].bm_size, - (uintmax_t)(gtt->gtt_total_entries * sizeof(gtt_pte_t))); + (uintmax_t)gtt_addr, + (uintmax_t)gtt->gtt_total_entries); ret = -ENODEV; goto fail0; } - if (bus_space_map(dev->bst, (dev->bus_maps[0].bm_base + (2<<20)), - (gtt->gtt_total_entries * sizeof(gtt_pte_t)), - 0, - >t->gtt_bsh)) { + + if (bus_space_map(dev->bst, (dev->bus_maps[0].bm_base + gtt_addr), + gtt_size, 0, >t->gtt_bsh)) { DRM_ERROR("unable to map GTT\n"); ret = -ENODEV; goto fail0; } + gtt->gma_bus_addr = dev->bus_maps[2].bm_base; + gtt->gtt_mappable_entries = (dev->bus_maps[2].bm_size >> PAGE_SHIFT); + if (((gtt->gtt_mappable_entries >> 8) < 64) || + (gtt->gtt_total_entries < gtt->gtt_mappable_entries)) { + DRM_ERROR("unknown GMADR entries: %d\n", + gtt->gtt_mappable_entries); + ret = -ENXIO; + goto fail1; + } + ret = i915_gem_gtt_init_scratch_page(gtt, dev->dmat); if (ret) goto fail1; @@ -627,8 +636,7 @@ gen6_gtt_init(struct drm_device *dev) 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))); +fail1: bus_space_unmap(dev->bst, gtt->gtt_bsh, gtt_size); fail0: return ret; }