Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/external/bsd/drm2/i915drm Rework gen6 aperture/gtt size ...
details: https://anonhg.NetBSD.org/src/rev/4527746a262a
branches: trunk
changeset: 329680:4527746a262a
user: riastradh <riastradh%NetBSD.org@localhost>
date: Tue Jun 03 19:49:37 2014 +0000
description:
Rework gen6 aperture/gtt size detection. Mark variables __diagused.
diffstat:
sys/external/bsd/drm2/i915drm/i915_gem_gtt.c | 68 ++++++++++++++++++---------
1 files changed, 44 insertions(+), 24 deletions(-)
diffs (117 lines):
diff -r 3a8c0f081a29 -r 4527746a262a sys/external/bsd/drm2/i915drm/i915_gem_gtt.c
--- a/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c Tue Jun 03 19:42:17 2014 +0000
+++ b/sys/external/bsd/drm2/i915drm/i915_gem_gtt.c Tue Jun 03 19:49:37 2014 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: i915_gem_gtt.c,v 1.14 2014/05/29 22:05:24 riastradh Exp $ */
+/* $NetBSD: i915_gem_gtt.c,v 1.15 2014/06/03 19:49:37 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.14 2014/05/29 22:05:24 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i915_gem_gtt.c,v 1.15 2014/06/03 19:49:37 riastradh Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -447,8 +447,8 @@
agp_ggtt_bind_object(struct drm_i915_gem_object *obj,
enum i915_cache_level cache_level)
{
- struct drm_device *const dev = obj->base.dev;
- struct drm_i915_private *const dev_priv = dev->dev_private;
+ struct drm_device *const dev __diagused = obj->base.dev;
+ struct drm_i915_private *const dev_priv __diagused = 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;
@@ -505,10 +505,6 @@
* Gen6+ GTT
*/
-#define SNB_GMCH_GGMS (SNB_GMCH_GGMS_MASK << SNB_GMCH_GGMS_SHIFT)
-#define SNB_GMCH_GMS (SNB_GMCH_GMS_MASK << SNB_GMCH_GMS_SHIFT)
-#define IVB_GMCH_GMS (IVB_GMCH_GMS_MASK << IVB_GMCH_GMS_SHIFT)
-
typedef uint32_t gtt_pte_t;
#define GEN6_PTE_VALID 0x01
@@ -570,6 +566,15 @@
return ((bus_addr_t)(addr & 0xff0) << 28) | (addr & ~(uint32_t)0xff0);
}
+#define GEN6_PCI_MGGC 0x50
+#define GEN6_PCI_MGGC_GGMS __BITS(9,8)
+#define GEN6_PCI_MGGC_GGMS_NONE 0x0
+#define GEN6_PCI_MGGC_GGMS_1MB 0x1
+#define GEN6_PCI_MGGC_GGMS_2MB 0x2
+#define GEN6_PCI_MGGC_GMS __BITS(7,3)
+#define GEN6_PCI_MGGC_GMS_MAX 0xa
+#define GEN6_PCI_MGGC_GMS_IVB_1GB 0xb /* IVB-specific */
+
static int
gen6_gtt_init(struct drm_device *dev)
{
@@ -578,29 +583,44 @@
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;
+ pcireg_t mggc;
+ unsigned ggms, gms;
int ret;
gtt->do_idle_maps = false;
- snb_gmch_ctl = pci_conf_read(pa->pa_pc, pa->pa_tag, SNB_GMCH_CTRL);
+ /* MGGC: Mirror of GMCH Graphics Control */
+ mggc = pci_conf_read(pa->pa_pc, pa->pa_tag, GEN6_PCI_MGGC);
- /* GMS: Graphics Mode Select. */
- if (INTEL_INFO(dev)->gen < 7) {
- gms = __SHIFTOUT(snb_gmch_ctl, SNB_GMCH_GMS);
- gtt->stolen_size = (gms << 25);
- } else {
- gms = __SHIFTOUT(snb_gmch_ctl, IVB_GMCH_GMS);
- static const unsigned sizes[] = {
- 0, 0, 0, 0, 0, 32, 48, 64, 128, 256, 96, 160, 224, 352
- };
- gtt->stolen_size = sizes[gms] << 20;
+ /* GGMS: GTT Graphics Memory Size */
+ ggms = __SHIFTOUT(mggc, GEN6_PCI_MGGC_GGMS);
+ switch (ggms) {
+ case GEN6_PCI_MGGC_GGMS_NONE:
+ gtt->gtt_total_entries = 0;
+ break;
+ case GEN6_PCI_MGGC_GGMS_1MB:
+ gtt->gtt_total_entries = (1*1024*1024) / 4;
+ break;
+ case GEN6_PCI_MGGC_GGMS_2MB:
+ gtt->gtt_total_entries = (2*1024*1024) / 4;
+ break;
+ default:
+ DRM_ERROR("unknown GTT Graphics Memory Size: %u\n", ggms);
+ gtt->gtt_total_entries = 0;
+ break;
}
- /* 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);
+ /* GMS: Graphics Mode Select */
+ gms = __SHIFTOUT(mggc, GEN6_PCI_MGGC_GMS);
+ if (gms <= GEN6_PCI_MGGC_GMS_MAX) {
+ gtt->stolen_size = gms * 32*1024*1024;
+ } else if ((INTEL_INFO(dev)->gen == 7) &&
+ (gms == GEN6_PCI_MGGC_GMS_IVB_1GB)) {
+ gtt->stolen_size = 1*1024*1024*1024;
+ } else {
+ DRM_ERROR("unknown Graphics Mode Select: %u\n", gms);
+ gtt->stolen_size = 0;
+ }
/* Linux sez: For GEN6+ the PTEs for the ggtt live at 2MB + BAR0 */
gtt_addr = (2<<20);
Home |
Main Index |
Thread Index |
Old Index