lkml.org 
[lkml]   [2010]   [Dec]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [137/223] intel-gtt: fix gtt_total_entries detection
    Date
    2.6.35-longterm review patch.  If anyone has any objections, please let me know.

    ------------------
    From: Daniel Vetter <daniel.vetter@ffwll.ch>

    commit e5e408fc94595aab897f613b6f4e2f5b36870a6f upstream.

    In commit f1befe71 Chris Wilson added some code to clear the full gtt
    on g33/pineview instead of just the mappable part. The code looks like
    it was copy-pasted from agp/intel-gtt.c, at least an identical piece
    of code is still there (in intel_i830_init_gtt_entries). This lead to
    a regression in 2.6.35 which was supposedly fixed in commit e7b96f28

    Now this commit makes absolutely no sense to me. It seems to be
    slightly confused about chipset generations - it references docs for
    4th gen but the regression concerns 3rd gen g33. Luckily the the g33
    gmch docs are available with the GMCH Graphics Control pci config
    register definitions. The other (bigger problem) is that the new
    check in there uses the i830 stolen mem bits (.5M, 1M or 8M of stolen
    mem). They are different since the i855GM.

    The most likely case is that it hits the 512M fallback, which was
    probably the right thing for the boxes this was tested on.

    So the original approach by Chris Wilson seems to be wrong and the
    current code is definitely wrong. There is a third approach by Jesse
    Barnes from his RFC patch "Who wants a bigger GTT mapping range?"
    where he simply shoves g33 in the same clause like later chipset
    generations.

    I've asked him and Jesse confirmed that this should work. So implement
    it.

    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=16891$
    Tested-by: Anisse Astier <anisse@astier.eu>
    Signed-off-by: Anisse Astier <anisse@astier.eu>
    Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    Signed-off-by: Andi Kleen <ak@linux.intel.com>

    ---
    drivers/char/agp/intel-gtt.c | 63 ++++++++++++++++++-------------------------
    1 file changed, 27 insertions(+), 36 deletions(-)

    Index: linux/drivers/char/agp/intel-gtt.c
    ===================================================================
    --- linux.orig/drivers/char/agp/intel-gtt.c
    +++ linux/drivers/char/agp/intel-gtt.c
    @@ -531,7 +531,7 @@ static void intel_i830_init_gtt_entries(

    pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);

    - if (IS_I965) {
    + if (IS_G33 || IS_I965) {
    u32 pgetbl_ctl;
    pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL);

    @@ -564,22 +564,6 @@ static void intel_i830_init_gtt_entries(
    size = 512;
    }
    size += 4; /* add in BIOS popup space */
    - } else if (IS_G33 && !IS_PINEVIEW) {
    - /* G33's GTT size defined in gmch_ctrl */
    - switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) {
    - case G33_PGETBL_SIZE_1M:
    - size = 1024;
    - break;
    - case G33_PGETBL_SIZE_2M:
    - size = 2048;
    - break;
    - default:
    - dev_info(&agp_bridge->dev->dev,
    - "unknown page table size 0x%x, assuming 512KB\n",
    - (gmch_ctrl & G33_PGETBL_SIZE_MASK));
    - size = 512;
    - }
    - size += 4;
    } else if (IS_G4X || IS_PINEVIEW) {
    /* On 4 series hardware, GTT stolen is separate from graphics
    * stolen, ignore it in stolen gtt entries counting. However,
    @@ -1250,24 +1234,31 @@ static int intel_i915_get_gtt_size(void)
    int size;

    if (IS_G33) {
    - u16 gmch_ctrl;
    + u32 pgetbl_ctl;
    + pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL);

    - /* G33's GTT size defined in gmch_ctrl */
    - pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
    - switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
    - case I830_GMCH_GMS_STOLEN_512:
    + switch (pgetbl_ctl & I965_PGETBL_SIZE_MASK) {
    + case I965_PGETBL_SIZE_128KB:
    + size = 128;
    + break;
    + case I965_PGETBL_SIZE_256KB:
    + size = 256;
    + break;
    + case I965_PGETBL_SIZE_512KB:
    size = 512;
    break;
    - case I830_GMCH_GMS_STOLEN_1024:
    + case I965_PGETBL_SIZE_1MB:
    size = 1024;
    break;
    - case I830_GMCH_GMS_STOLEN_8192:
    - size = 8*1024;
    + case I965_PGETBL_SIZE_2MB:
    + size = 2048;
    + break;
    + case I965_PGETBL_SIZE_1_5MB:
    + size = 1024 + 512;
    break;
    default:
    - dev_info(&agp_bridge->dev->dev,
    - "unknown page table size 0x%x, assuming 512KB\n",
    - (gmch_ctrl & I830_GMCH_GMS_MASK));
    + dev_info(&intel_private.pcidev->dev,
    + "unknown page table size, assuming 512KB\n");
    size = 512;
    }
    } else {
    @@ -1299,14 +1290,6 @@ static int intel_i915_create_gatt_table(
    pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);
    pci_read_config_dword(intel_private.pcidev, I915_PTEADDR, &temp2);

    - gtt_map_size = intel_i915_get_gtt_size();
    -
    - intel_private.gtt = ioremap(temp2, gtt_map_size);
    - if (!intel_private.gtt)
    - return -ENOMEM;
    -
    - intel_private.gtt_total_size = gtt_map_size / 4;
    -
    temp &= 0xfff80000;

    intel_private.registers = ioremap(temp, 128 * 4096);
    @@ -1315,6 +1298,14 @@ static int intel_i915_create_gatt_table(
    return -ENOMEM;
    }

    + gtt_map_size = intel_i915_get_gtt_size();
    +
    + intel_private.gtt = ioremap(temp2, gtt_map_size);
    + if (!intel_private.gtt)
    + return -ENOMEM;
    +
    + intel_private.gtt_total_size = gtt_map_size / 4;
    +
    temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
    global_cache_flush(); /* FIXME: ? */


    \
     
     \ /
      Last update: 2010-12-13 01:13    [W:0.028 / U:30.640 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site