On Tue, 2005-03-01 at 22:23 +0100, Pavel Machek wrote:
> Hi!
> 
> > (This is for -mm, to be merged along with the aty128fb and radeonfb
> > related patches).
> > 
> > This patch adds suspend/resume support to the Apple UniNorth AGP bridge
> > to make sure AGP is properly disabled when the machine goes to sleep.
> > Without this, the r300 based laptops will fail to wakeup from sleep when
> > using the new experimental r300 DRI driver. It should also improve
> > reliablility in general with other chips.
> 
> > --- linux-work.orig/drivers/char/agp/uninorth-agp.c 2005-03-01 
> > 13:53:32.000000000 +1100
> > +++ linux-work/drivers/char/agp/uninorth-agp.c      2005-03-01 
> > 14:36:54.000000000 +1100
> > @@ -155,6 +161,56 @@
> >     uninorth_tlbflush(NULL);
> >  }
> >  
> > +#ifdef CONFIG_PM
> > +static int agp_uninorth_suspend(struct pci_dev *pdev, u32 state)
> 
> pm_message_t state, please.

Oops :) 

>From [EMAIL PROTECTED] Mon Feb 28 18:49:35 2005
Return-Path: <[EMAIL PROTECTED]>
Received: from ozlabs.org (ozlabs.org [203.10.76.45]) by gate.crashing.org
        (8.12.8/8.12.8) with ESMTP id j210nZgJ030407 for
        <[EMAIL PROTECTED]>; Mon, 28 Feb 2005 18:49:35 -0600
Received: by ozlabs.org (Postfix, from userid 1003) id 0B4B767A75; Tue,  1
        Mar 2005 11:50:51 +1100 (EST)
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Message-ID: <[EMAIL PROTECTED]>
Date: Tue, 1 Mar 2005 11:57:58 +1100
From: Paul Mackerras <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: agp sleep patch
X-Mailer: VM 7.19 under Emacs 21.3.1
X-Spam-Checker-Version: SpamAssassin 3.0.1 (2004-10-22) on gate.crashing.org
X-Spam-Level: 
X-Spam-Status: No, score=-3.3 required=5.0 tests=AWL,BAYES_00 autolearn=ham
        version=3.0.1
Status:   
X-Evolution-Source: pop://[EMAIL PROTECTED]:10110
Content-Transfer-Encoding: 8bit

Index: linux-work/drivers/char/agp/uninorth-agp.c
===================================================================
--- linux-work.orig/drivers/char/agp/uninorth-agp.c     2005-03-01 
13:53:32.000000000 +1100
+++ linux-work/drivers/char/agp/uninorth-agp.c  2005-03-02 09:01:00.000000000 
+1100
@@ -6,6 +6,7 @@
 #include <linux/init.h>
 #include <linux/pagemap.h>
 #include <linux/agp_backend.h>
+#include <linux/delay.h>
 #include <asm/uninorth.h>
 #include <asm/pci-bridge.h>
 #include "agp.h"
@@ -51,6 +52,11 @@
 
 static void uninorth_cleanup(void)
 {
+       u32 tmp;
+
+       pci_read_config_dword(agp_bridge->dev, UNI_N_CFG_GART_CTRL, &tmp);
+       if (!(tmp & UNI_N_CFG_GART_ENABLE))
+               return;
        pci_write_config_dword(agp_bridge->dev, UNI_N_CFG_GART_CTRL,
                        UNI_N_CFG_GART_ENABLE | UNI_N_CFG_GART_INVAL);
        pci_write_config_dword(agp_bridge->dev, UNI_N_CFG_GART_CTRL,
@@ -155,6 +161,59 @@
        uninorth_tlbflush(NULL);
 }
 
+#ifdef CONFIG_PM
+static int agp_uninorth_suspend(struct pci_dev *pdev, pm_message_t state)
+{
+       u32 cmd;
+       u8 agp;
+       struct pci_dev *device = NULL;
+
+       if (state != PMSG_SUSPEND)
+               return 0;
+
+       /* turn off AGP on the video chip, if it was enabled */
+       for_each_pci_dev(device) {
+               /* Don't touch the bridge yet, device first */
+               if (device == pdev)
+                       continue;
+               /* Only deal with devices on the same bus here, no Mac has a P2P
+                * bridge on the AGP port, and mucking around the entire PCI 
tree
+                * is source of problems on some machines because of a bug in
+                * some versions of pci_find_capability() when hitting a dead 
device
+                */
+               if (device->bus != pdev->bus)
+                       continue;
+               agp = pci_find_capability(device, PCI_CAP_ID_AGP);
+               if (!agp)
+                       continue;
+               pci_read_config_dword(device, agp + PCI_AGP_COMMAND, &cmd);
+               if (!(cmd & PCI_AGP_COMMAND_AGP))
+                       continue;
+               printk("uninorth-agp: disabling AGP on device %s\n", 
pci_name(device));
+               cmd &= ~PCI_AGP_COMMAND_AGP;
+               pci_write_config_dword(device, agp + PCI_AGP_COMMAND, cmd);
+       }
+       
+       /* turn off AGP on the bridge */
+       agp = pci_find_capability(pdev, PCI_CAP_ID_AGP);
+       pci_read_config_dword(pdev, agp + PCI_AGP_COMMAND, &cmd);
+       if (cmd & PCI_AGP_COMMAND_AGP) {
+               printk("uninorth-agp: disabling AGP on bridge %s\n", 
pci_name(pdev));
+               cmd &= ~PCI_AGP_COMMAND_AGP;
+               pci_write_config_dword(pdev, agp + PCI_AGP_COMMAND, cmd);
+       }
+       /* turn off the GART */
+       uninorth_cleanup();
+
+       return 0;
+}
+
+static int agp_uninorth_resume(struct pci_dev *pdev)
+{
+       return 0;
+}
+#endif
+
 static int uninorth_create_gatt_table(void)
 {
        char *table;
@@ -369,6 +428,10 @@
        .id_table       = agp_uninorth_pci_table,
        .probe          = agp_uninorth_probe,
        .remove         = agp_uninorth_remove,
+#ifdef CONFIG_PM
+       .suspend        = agp_uninorth_suspend,
+       .resume         = agp_uninorth_resume,
+#endif
 };
 
 static int __init agp_uninorth_init(void)


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to