On Sat, May 21, 2005 at 03:17:21PM +0200, Paolo Pisati wrote:
> 
> (i already sent an email to Eric some days ago but i 
> didn't receive any ack so i try here...)
> 
> can anyone take a look at this?
> as the comments say, agp still doesn't 
> work...
> 
> anything i can do to help?
> Eric?
[snip]

i answer to myself:

just after my post i realized that my chipset 
wasn't supported by eric's patch (mine is a i915GM while
original patch was for i915G).
I added my chip id to eric's patch and now i have
agp working (somehow):

[EMAIL PROTECTED] ~]$ dmesg | grep agp
agp0: <Intel 82915GM (915GM GMCH) SVGA controller> port 0xec38-0xec3f mem 
0xdfec0000-0xdfefffff,0xc0000000-0xcfffffff,0xdff00000-0xdff7ffff irq 16 at 
device 2.0 on pci0
agp0: detected 8060k stolen memory
agp0: aperture size is 256M
[EMAIL PROTECTED] ~]$ ls -la /dev/agpgart 
crw-------  1 root  wheel  241,   0 May 22 12:52 /dev/agpgart

Unfortunately, xorg-6.8.2 doesn't support my chipset
yet (seems i have to wait for 6.8.3 if it ever will be released...),
so i couldn't test if there were any mistakes in agp
programming.

Anyway, attached is eric's patch with i915gm id added, 
if someone care to test it.

bye
-- 
Paolo

diff -u /usr/src/sys/pci/agp_i810.c agp/agp_i810.c
--- /usr/src/sys/pci/agp_i810.c Wed Mar 23 06:59:42 2005
+++ agp/agp_i810.c      Sun May 22 13:55:32 2005
@@ -65,10 +65,12 @@
 #define READ1(off)     bus_space_read_1(sc->bst, sc->bsh, off)
 #define READ4(off)     bus_space_read_4(sc->bst, sc->bsh, off)
 #define WRITE4(off,v)  bus_space_write_4(sc->bst, sc->bsh, off, v)
+#define WRITEGTT(off,v)        bus_space_write_4(sc->gtt_bst, sc->gtt_bsh, 
off, v)
 
 #define CHIP_I810 0    /* i810/i815 */
 #define CHIP_I830 1    /* 830M/845G */
 #define CHIP_I855 2    /* 852GM/855GM/865G */
+#define CHIP_I915 3    /* 915G */
 
 struct agp_i810_softc {
        struct agp_softc agp;
@@ -78,9 +80,14 @@
        u_int32_t dcache_size;          /* i810 only */
        u_int32_t stolen;               /* number of i830/845 gtt entries for 
stolen memory */
        device_t bdev;                  /* bridge device */
+
        struct resource *regs;          /* memory mapped GC registers */
        bus_space_tag_t bst;            /* bus_space tag */
        bus_space_handle_t bsh;         /* bus_space handle */
+
+       struct resource *gtt;           /* memory mapped GATT entries */
+       bus_space_tag_t gtt_bst;        /* bus_space tag */
+       bus_space_handle_t gtt_bsh;     /* bus_space handle */
 };
 
 static const char*
@@ -129,6 +136,12 @@
 
        case 0x25728086:
                return ("Intel 82865G (865G GMCH) SVGA controller");
+
+       case 0x25828086:
+               return ("Intel 82915G (915G GMCH) SVGA controller");
+       
+       case 0x25928086:
+               return ("Intel 82915GM (915GM GMCH) SVGA controller");
        };
 
        return NULL;
@@ -160,6 +173,8 @@
        case 0x25628086:
        case 0x35828086:
        case 0x25728086:
+       case 0x25828086:
+       case 0x25928086:
                devid -= 0x20000;
                break;
        };
@@ -222,6 +237,8 @@
                case 0x35828086:
                case 0x25628086:
                case 0x25728086:
+               case 0x25828086:
+               case 0x25928086:        /* XXX: Is this the right way? */
                        gcc1 = pci_read_config(bdev, AGP_I830_GCC1, 1);
                        if ((gcc1 & AGP_I830_GCC1_DEV2) == 
AGP_I830_GCC1_DEV2_DISABLED) {
                                if (bootverbose)
@@ -272,19 +289,41 @@
        case 0x25728086:
                sc->chiptype = CHIP_I855;
                break;
+       case 0x25828086:
+       case 0x25928086:
+               sc->chiptype = CHIP_I915;
+               break;
        };
 
        /* Same for i810 and i830 */
-       rid = AGP_I810_MMADR;
+       if (sc->chiptype == CHIP_I915)
+               rid = AGP_I915_MMADR;
+       else
+               rid = AGP_I810_MMADR;
+
        sc->regs = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
                                          RF_ACTIVE);
        if (!sc->regs) {
                agp_generic_detach(dev);
-               return ENOMEM;
+               return ENODEV;
        }
        sc->bst = rman_get_bustag(sc->regs);
        sc->bsh = rman_get_bushandle(sc->regs);
 
+       if (sc->chiptype == CHIP_I915) {
+               rid = AGP_I915_GTTADR;
+               sc->gtt = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
+                                                RF_ACTIVE);
+               if (!sc->gtt) {
+                       bus_release_resource(dev, SYS_RES_MEMORY,
+                                            AGP_I810_MMADR, sc->regs);
+                       agp_generic_detach(dev);
+                       return ENODEV;
+               }
+               sc->gtt_bst = rman_get_bustag(sc->regs);
+               sc->gtt_bsh = rman_get_bushandle(sc->regs);
+       }
+
        sc->initial_aperture = AGP_GET_APERTURE(dev);
 
        gatt = malloc( sizeof(struct agp_gatt), M_AGP, M_NOWAIT);
@@ -350,7 +389,7 @@
                WRITE4(AGP_I810_PGTBL_CTL, pgtblctl);
 
                gatt->ag_physical = pgtblctl & ~1;
-       } else {        /* CHIP_I855 */
+       } else if (sc->chiptype == CHIP_I855 || sc->chiptype == CHIP_I915) {    
/* CHIP_I855 */
                /* The i855 automatically initializes the 128k gatt on boot. */
                unsigned int gcc1, pgtblctl;
                
@@ -371,6 +410,12 @@
                        case AGP_I855_GCC1_GMS_STOLEN_32M: 
                                sc->stolen = (32768 - 132) * 1024 / 4096;
                                break;
+                       case AGP_I915_GCC1_GMS_STOLEN_48M: 
+                               sc->stolen = (49152 - 132) * 1024 / 4096;
+                               break;
+                       case AGP_I915_GCC1_GMS_STOLEN_64M: 
+                               sc->stolen = (65536 - 132) * 1024 / 4096;
+                               break;
                        default:
                                sc->stolen = 0;
                                device_printf(dev, "unknown memory 
configuration, disabling\n");
@@ -425,8 +470,15 @@
        }
        free(sc->gatt, M_AGP);
 
-       bus_release_resource(dev, SYS_RES_MEMORY,
-                            AGP_I810_MMADR, sc->regs);
+       if (sc->chiptype == CHIP_I915) {
+               bus_release_resource(dev, SYS_RES_MEMORY,
+                                    AGP_I915_GTTADR, sc->regs);
+               bus_release_resource(dev, SYS_RES_MEMORY, AGP_I915_MMADR,
+                                    sc->regs);
+       } else {
+               bus_release_resource(dev, SYS_RES_MEMORY, AGP_I810_MMADR,
+                                    sc->regs);
+       }
 
        child = device_find_child( dev, "drmsub", 0 );
        if (child)
@@ -439,34 +491,45 @@
 agp_i810_get_aperture(device_t dev)
 {
        struct agp_i810_softc *sc = device_get_softc(dev);
+       uint32_t temp;
+       u_int16_t miscc;
 
-       if ( sc->chiptype == CHIP_I810 ) {
-               u_int16_t miscc;
+       switch (sc->chiptype) {
+       case CHIP_I810:
                miscc = pci_read_config(sc->bdev, AGP_I810_MISCC, 2);
                if ((miscc & AGP_I810_MISCC_WINSIZE) == 
AGP_I810_MISCC_WINSIZE_32)
                        return 32 * 1024 * 1024;
                else
                        return 64 * 1024 * 1024;
-       } else if ( sc->chiptype == CHIP_I830 ) {
-               unsigned int gcc1;
-
-               gcc1 = pci_read_config(sc->bdev, AGP_I830_GCC1, 2);
-               if ((gcc1 & AGP_I830_GCC1_GMASIZE) == AGP_I830_GCC1_GMASIZE_64)
+       case CHIP_I830:
+               temp = pci_read_config(sc->bdev, AGP_I830_GCC1, 2);
+               if ((temp & AGP_I830_GCC1_GMASIZE) == AGP_I830_GCC1_GMASIZE_64)
                        return 64 * 1024 * 1024;
                else
                        return 128 * 1024 * 1024;
-       } else { /* CHIP_I855 */
+       case CHIP_I855:
                return 128 * 1024 * 1024;
+       case CHIP_I915:
+               temp = pci_read_config(sc->bdev, AGP_I915_GMADR, 4);
+               if (temp & (1 << 27)) {
+                       return 128 * 1024 * 1024;
+               } else {
+                       return 256 * 1024 * 1024;
+               }
        }
+
+       return 0;
 }
 
 static int
 agp_i810_set_aperture(device_t dev, u_int32_t aperture)
 {
        struct agp_i810_softc *sc = device_get_softc(dev);
-       u_int16_t miscc;
+       u_int16_t miscc, gcc1;
+       u_int32_t temp;
 
-       if ( sc->chiptype == CHIP_I810 ) {
+       switch (sc->chiptype) {
+       case CHIP_I810:
                /*
                 * Double check for sanity.
                 */
@@ -474,7 +537,7 @@
                        device_printf(dev, "bad aperture size %d\n", aperture);
                        return EINVAL;
                }
-       
+
                miscc = pci_read_config(sc->bdev, AGP_I810_MISCC, 2);
                miscc &= ~AGP_I810_MISCC_WINSIZE;
                if (aperture == 32 * 1024 * 1024)
@@ -483,10 +546,10 @@
                        miscc |= AGP_I810_MISCC_WINSIZE_64;
        
                pci_write_config(sc->bdev, AGP_I810_MISCC, miscc, 2);
-       } else if ( sc->chiptype == CHIP_I830 ) {
-               unsigned int gcc1;
-
-               if (aperture != 64 * 1024 * 1024 && aperture != 128 * 1024 * 
1024) {
+               break;
+       case CHIP_I830:
+               if (aperture != 64 * 1024 * 1024 &&
+                   aperture != 128 * 1024 * 1024) {
                        device_printf(dev, "bad aperture size %d\n", aperture);
                        return EINVAL;
                }
@@ -498,11 +561,30 @@
                        gcc1 |= AGP_I830_GCC1_GMASIZE_128;
 
                pci_write_config(sc->bdev, AGP_I830_GCC1, gcc1, 2);
-       } else {        /* CHIP_I855 */
+               break;
+       case CHIP_I855:
                if (aperture != 128 * 1024 * 1024) {
                        device_printf(dev, "bad aperture size %d\n", aperture);
                        return EINVAL;
                }
+               break;
+       case CHIP_I915:
+               temp = pci_read_config(sc->bdev, AGP_I915_GMADR, 4);
+
+               switch (aperture) {
+               case 128 * 1024 * 1024:
+                       temp |= (1 << 27);
+                       break;
+               case 256 * 1024 * 1024:
+                       temp &= ~(1 << 27);
+                       break;
+               default:
+                       device_printf(dev, "bad aperture size %d\n", aperture);
+                       return EINVAL;
+               }
+
+               pci_write_config(sc->bdev, AGP_I915_GMADR, temp, 4);
+               break;
        }
 
        return 0;
@@ -525,7 +607,12 @@
                }
        }
 
-       WRITE4(AGP_I810_GTT + (offset >> AGP_PAGE_SHIFT) * 4, physical | 1);
+       if (sc->chiptype == CHIP_I915) {
+               WRITEGTT(offset >> AGP_PAGE_SHIFT, physical | 1);
+       } else {
+               WRITE4(AGP_I810_GTT + (offset >> AGP_PAGE_SHIFT) * 4, physical 
| 1);
+       }
+
        return 0;
 }
 
@@ -544,7 +631,12 @@
                }
        }
 
-       WRITE4(AGP_I810_GTT + (offset >> AGP_PAGE_SHIFT) * 4, 0);
+       if (sc->chiptype == CHIP_I915) {
+               WRITE4(offset >> AGP_PAGE_SHIFT, 0);
+       } else {
+               WRITE4(AGP_I810_GTT + (offset >> AGP_PAGE_SHIFT) * 4, 0);
+       }
+       
        return 0;
 }
 
@@ -669,8 +761,8 @@
                return EINVAL;
 
        for (i = 0; i < mem->am_size; i += AGP_PAGE_SIZE) {
-               WRITE4(AGP_I810_GTT + (offset >> AGP_PAGE_SHIFT) * 4,
-                      i | 3);
+               WRITE4(AGP_I810_GTT + (i >> AGP_PAGE_SHIFT) * 4,
+                      offset | 3);
        }
 
        return 0;
diff -u /usr/src/sys/pci/agpreg.h agp/agpreg.h
--- /usr/src/sys/pci/agpreg.h   Mon Aug 16 14:25:48 2004
+++ agp/agpreg.h        Sun May 22 13:55:32 2005
@@ -233,6 +233,15 @@
 #define AGP_I852_GM                    0x5
 
 /*
+ * 915G registers
+ */
+#define AGP_I915_GMADR                 0x18
+#define AGP_I915_MMADR                 0x10
+#define AGP_I915_GTTADR                        0x1C
+#define AGP_I915_GCC1_GMS_STOLEN_48M   0x60
+#define AGP_I915_GCC1_GMS_STOLEN_64M   0x70
+
+/*
  * NVIDIA nForce/nForce2 registers
  */
 #define        AGP_NVIDIA_0_APBASE             0x10
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to