Hi!

> > > > > Especially the PCI video_state trick finally got me a working resume 
> > > > > on
> > > > > 2.6.19-ck2 r128 Rage Mobility M4 AGP *WITH*(!) fully enabled and 
> > > > > working
> > > > > (and keeping working!) DRI (3D).
> > > > 
> > > > Can we get whitelist entry for suspend.sf.net? s2ram from there can do
> > > > all the tricks you described, one letter per trick :-). We even got
> > > > PCI saving lately.
> > > 
> > > Whitelist? Let me blacklist it all the way to Timbuktu instead!
> > 
> > > I've been doing more testing, and X never managed to come back to working
> > > state without some of my couple intel-agp changes:
> > > - a proper suspend method, doing a proper pci_save_state()
> > >   or improved equivalent
> > > - a missing resume check for my i815 chipset
> > > - global cache flush in _configure
> > > - restoring AGP bridge PCI config space
> > 
> > Can you post a patch?
> 
> Took way longer than I'd have wanted it to (nice daughter and stuff ;),
> but here it is.

No problem.

Ok, I guess we'll  need a real commit log.


>  #define INTEL_I820_RDCR              0x51
> @@ -664,7 +671,7 @@
>       if ((pg_start + mem->page_count) > num_entries)
>               goto out_err;
>  
> -     /* The i830 can't check the GTT for entries since its read only,
> +     /* The i830 can't check the GTT for entries since it's read-only,
>        * depend on the caller to make the correct offset decisions.
>        */
>  
> @@ -787,7 +794,7 @@
>       if ((pg_start + mem->page_count) > num_entries)
>               goto out_err;
>  
> -     /* The i915 can't check the GTT for entries since its read only,
> +     /* The i915 can't check the GTT for entries since it's read-only,
>        * depend on the caller to make the correct offset decisions.
>        */
>  

You should not do cleanups at the same time as code changes.

> @@ -1103,8 +1110,8 @@
>       /* attbase - aperture base */
>       /* the Intel 815 chipset spec. says that bits 29-31 in the
>       * ATTBASE register are reserved -> try not to write them */
> -     if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
> -             printk (KERN_EMERG PFX "gatt bus addr too high");
> +     if (agp_bridge->gatt_bus_addr & I815_ATTBASE_MASK) {
> +             printk (KERN_EMERG PFX "gatt bus addr too high\n");
>               return -EINVAL;
>       }
>  
> @@ -1119,7 +1126,7 @@
>       agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
>  
>       pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
> -     addr &= INTEL_815_ATTBASE_MASK;
> +     addr &= I815_ATTBASE_MASK;
>       addr |= agp_bridge->gatt_bus_addr;
>       pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);

And I guess macro search&replace counts as cleanup, too. It would be
nice to submit them separately and first.

> @@ -1355,7 +1362,7 @@
>       pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, 
> agp_bridge->gatt_bus_addr);
>  
>       /* agpctrl */
> -     pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
> +     pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x00000000);
>  

Huh?

>  #ifdef CONFIG_PM
> +

I'd kill this empty line.

> +static int agp_i815_remember_state(struct pci_dev *pdev, int restore)
> +{
> +     typedef struct {
> +             int reg;
> +             u32 value;
> +     } saved_regs;
> +
> +     /* Dell Inspiron 8000 BIOS rev. A23 needs the following registers saved
> +      * to be able to successfully restore X11 when AGP 3D is enabled
> +      * (register values given are after resume vs. before suspend):
> +      *
> +      * I815_GMCHCFG (0x50; we need to set bit 1 (Aperture Access Global 
> Enable) of I815_APCONT (0x51),
> +      *              thus use I815_GMCHCFG (0x50) as 32bit base register); 
> 0x4fdd0040 instead of 0x4fdd0240
> +      * ??? (0x80); 0x07ce1cde instead of 0x07cb94de
> +      * I815_SM_RCOMP (0x98); 0x80648064 instead of 0x80548054
> +      * I815_SM (0x9c); 0x00c48405 instead of 0x04848405
> +      * I815_AGPCMD (0xa8); 0x00000000 instead of 0x00000304
> +      * INTEL_AGPCTRL (0xb0); 0x00000000 instead of 0x00000080
> +      * INTEL_APSIZE (0xb4);
> +      * INTEL_ATTBASE (0xb8); 0x00000000 instead of 0x024b0000
> +      * I815_ERRSTS?? (0xc8; undocumented for i815, see above); 0x00000000 
> instead of 0x00000800
> +      * ??? (0xe8); 0x1c700000 instead of 0x18500000
> +      *
> +      * Other machines/chipsets/BIOS versions may require
> +      * a different set of registers to be properly saved.
> +      */
> +     static saved_regs i815_saved_regs[] = {
> +             { I815_UNKNOWN_80, 0 },
> +             { I815_GMCHCFG, 0 },
> +             { I815_SM_RCOMP, 0 },
> +             { I815_SM, 0 },
> +             { I815_AGPCMD, 0 },
> +             { INTEL_AGPCTRL, 0 },
> +             { INTEL_APSIZE, 0 },
> +             { INTEL_ATTBASE, 0 },
> +             { I815_ERRSTS, 0 },
> +             { I815_UNKNOWN_E8, 0 },
> +             { 0, 0 }, /* DELIMITER */
> +     };
> +     saved_regs *p;
> +
> +     if (restore) {
> +             u32 val;
> +             for (p = i815_saved_regs; (p->reg != 0); p++)
> +             {

This goes to previous line. ";p->reg ;" is enough.

> +                     pci_read_config_dword(pdev, p->reg, &val);
> +                     if (val != p->value) {
> +                             printk(KERN_DEBUG "AGP: Writing back config 
> space on "
> +                                     "device %s at offset %x (was %x, 
> writing %x)\n",
> +                                     pci_name(pdev), p->reg,
> +                                     val, p->value);
> +                             pci_write_config_dword(pdev, p->reg,
> +                                     p->value);
> +                     }
> +             }       
> +     } else {
> +             for (p = i815_saved_regs; (p->reg != 0); p++)

Same here.

> +                     pci_read_config_dword(pdev, p->reg, &p->value);
> +     }
> +     return 1;
> +}

Should this betwo functions, one for save, one for restore, with "to
save" array being global?

> +/*
> + * set DEBUG_AGP_PM to 1 if your AGP chipset has issues resuming
> + * (machine lockups due to non-restored hardware registered values),
> + * then figure out from the log which registers have to be restored manually,
> + * then add specific support for your chipset, similar to what already exists

Can we get debugging stuff separately?

> @@ -2106,6 +2282,12 @@
>  {
>       if (agp_off)
>               return -EINVAL;
> +     /* let people know that this is an important place to investigate at in 
> case of resume lockups */
> +     printk(KERN_INFO PFX
> +             "suspend/resume of intel-agp.ko is NOT always stable for all 
> Intel AGP\n"
> +             "chipset/BIOS combos, may cause resume lockups when DRI (3D 
> accel) active,\n"
> +             "in AGP (non-PCI) mode! (see DEBUG_AGP_PM in intel-agp.c source 
> to investigate)\n"
> +     );

I'm not sure if we want such big/ugly warnings. Can you get it to one
line, at least?

Otherwise it looks ok.
                                                                        Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
-
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to