diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2012-11-04 12:21:28 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-11-11 17:51:43 -0500 |
commit | 03752f5b7b77b95d83479885040950fba1250850 (patch) | |
tree | 7b9c007faef69561d6fc22ba17e8140380ffdf0b | |
parent | e76e9aebcdbfebae8f4cd147e3c0f800d36e97f3 (diff) |
drm/i915: Calculate correct stolen size for GEN7+
This bug existed in the old code, but was easier to fix here in the
rework. Unfortunately gen7 doesn't have a nice way to figure out the
size and we must use a lookup table.
As Jesse pointed out, there is some confusion in the docs about these
definitions. We're picking the one which seems more accurate, but we
really aren't certain.
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 2 |
2 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index e74be0c2c6a5..814ed3ed7790 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -512,6 +512,15 @@ static inline unsigned int gen6_get_stolen_size(u16 snb_gmch_ctl) | |||
512 | return snb_gmch_ctl << 25; /* 32 MB units */ | 512 | return snb_gmch_ctl << 25; /* 32 MB units */ |
513 | } | 513 | } |
514 | 514 | ||
515 | static inline unsigned int gen7_get_stolen_size(u16 snb_gmch_ctl) | ||
516 | { | ||
517 | static const int stolen_decoder[] = { | ||
518 | 0, 0, 0, 0, 0, 32, 48, 64, 128, 256, 96, 160, 224, 352}; | ||
519 | snb_gmch_ctl >>= IVB_GMCH_GMS_SHIFT; | ||
520 | snb_gmch_ctl &= IVB_GMCH_GMS_MASK; | ||
521 | return stolen_decoder[snb_gmch_ctl] << 20; | ||
522 | } | ||
523 | |||
515 | int i915_gem_gtt_init(struct drm_device *dev) | 524 | int i915_gem_gtt_init(struct drm_device *dev) |
516 | { | 525 | { |
517 | struct drm_i915_private *dev_priv = dev->dev_private; | 526 | struct drm_i915_private *dev_priv = dev->dev_private; |
@@ -557,7 +566,10 @@ int i915_gem_gtt_init(struct drm_device *dev) | |||
557 | pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl); | 566 | pci_read_config_word(dev->pdev, SNB_GMCH_CTRL, &snb_gmch_ctl); |
558 | dev_priv->mm.gtt->gtt_total_entries = | 567 | dev_priv->mm.gtt->gtt_total_entries = |
559 | gen6_get_total_gtt_size(snb_gmch_ctl) / sizeof(gtt_pte_t); | 568 | gen6_get_total_gtt_size(snb_gmch_ctl) / sizeof(gtt_pte_t); |
560 | dev_priv->mm.gtt->stolen_size = gen6_get_stolen_size(snb_gmch_ctl); | 569 | if (INTEL_INFO(dev)->gen < 7) |
570 | dev_priv->mm.gtt->stolen_size = gen6_get_stolen_size(snb_gmch_ctl); | ||
571 | else | ||
572 | dev_priv->mm.gtt->stolen_size = gen7_get_stolen_size(snb_gmch_ctl); | ||
561 | 573 | ||
562 | dev_priv->mm.gtt->gtt_mappable_entries = pci_resource_len(dev->pdev, 2) >> PAGE_SHIFT; | 574 | dev_priv->mm.gtt->gtt_mappable_entries = pci_resource_len(dev->pdev, 2) >> PAGE_SHIFT; |
563 | /* 64/512MB is the current min/max we actually know of, but this is just a | 575 | /* 64/512MB is the current min/max we actually know of, but this is just a |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 449403f60e4f..e62b347dc049 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -46,6 +46,8 @@ | |||
46 | #define SNB_GMCH_GGMS_MASK 0x3 | 46 | #define SNB_GMCH_GGMS_MASK 0x3 |
47 | #define SNB_GMCH_GMS_SHIFT 3 /* Graphics Mode Select */ | 47 | #define SNB_GMCH_GMS_SHIFT 3 /* Graphics Mode Select */ |
48 | #define SNB_GMCH_GMS_MASK 0x1f | 48 | #define SNB_GMCH_GMS_MASK 0x1f |
49 | #define IVB_GMCH_GMS_SHIFT 4 | ||
50 | #define IVB_GMCH_GMS_MASK 0xf | ||
49 | 51 | ||
50 | 52 | ||
51 | /* PCI config space */ | 53 | /* PCI config space */ |