linux/drivers/char/agp/intel-agp.c
<<
>>
Prefs
   1/*
   2 * Intel AGPGART routines.
   3 */
   4
   5#include <linux/module.h>
   6#include <linux/pci.h>
   7#include <linux/slab.h>
   8#include <linux/init.h>
   9#include <linux/kernel.h>
  10#include <linux/pagemap.h>
  11#include <linux/agp_backend.h>
  12#include <asm/smp.h>
  13#include "agp.h"
  14#include "intel-agp.h"
  15#include <drm/intel-gtt.h>
  16
  17static int intel_fetch_size(void)
  18{
  19        int i;
  20        u16 temp;
  21        struct aper_size_info_16 *values;
  22
  23        pci_read_config_word(agp_bridge->dev, INTEL_APSIZE, &temp);
  24        values = A_SIZE_16(agp_bridge->driver->aperture_sizes);
  25
  26        for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
  27                if (temp == values[i].size_value) {
  28                        agp_bridge->previous_size = agp_bridge->current_size = (void *) (values + i);
  29                        agp_bridge->aperture_size_idx = i;
  30                        return values[i].size;
  31                }
  32        }
  33
  34        return 0;
  35}
  36
  37static int __intel_8xx_fetch_size(u8 temp)
  38{
  39        int i;
  40        struct aper_size_info_8 *values;
  41
  42        values = A_SIZE_8(agp_bridge->driver->aperture_sizes);
  43
  44        for (i = 0; i < agp_bridge->driver->num_aperture_sizes; i++) {
  45                if (temp == values[i].size_value) {
  46                        agp_bridge->previous_size =
  47                                agp_bridge->current_size = (void *) (values + i);
  48                        agp_bridge->aperture_size_idx = i;
  49                        return values[i].size;
  50                }
  51        }
  52        return 0;
  53}
  54
  55static int intel_8xx_fetch_size(void)
  56{
  57        u8 temp;
  58
  59        pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
  60        return __intel_8xx_fetch_size(temp);
  61}
  62
  63static int intel_815_fetch_size(void)
  64{
  65        u8 temp;
  66
  67        /* Intel 815 chipsets have a _weird_ APSIZE register with only
  68         * one non-reserved bit, so mask the others out ... */
  69        pci_read_config_byte(agp_bridge->dev, INTEL_APSIZE, &temp);
  70        temp &= (1 << 3);
  71
  72        return __intel_8xx_fetch_size(temp);
  73}
  74
  75static void intel_tlbflush(struct agp_memory *mem)
  76{
  77        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2200);
  78        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
  79}
  80
  81
  82static void intel_8xx_tlbflush(struct agp_memory *mem)
  83{
  84        u32 temp;
  85        pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
  86        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp & ~(1 << 7));
  87        pci_read_config_dword(agp_bridge->dev, INTEL_AGPCTRL, &temp);
  88        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, temp | (1 << 7));
  89}
  90
  91
  92static void intel_cleanup(void)
  93{
  94        u16 temp;
  95        struct aper_size_info_16 *previous_size;
  96
  97        previous_size = A_SIZE_16(agp_bridge->previous_size);
  98        pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
  99        pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
 100        pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
 101}
 102
 103
 104static void intel_8xx_cleanup(void)
 105{
 106        u16 temp;
 107        struct aper_size_info_8 *previous_size;
 108
 109        previous_size = A_SIZE_8(agp_bridge->previous_size);
 110        pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp);
 111        pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp & ~(1 << 9));
 112        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, previous_size->size_value);
 113}
 114
 115
 116static int intel_configure(void)
 117{
 118        u16 temp2;
 119        struct aper_size_info_16 *current_size;
 120
 121        current_size = A_SIZE_16(agp_bridge->current_size);
 122
 123        /* aperture size */
 124        pci_write_config_word(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 125
 126        /* address to map to */
 127        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 128                                                    AGP_APERTURE_BAR);
 129
 130        /* attbase - aperture base */
 131        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 132
 133        /* agpctrl */
 134        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x2280);
 135
 136        /* paccfg/nbxcfg */
 137        pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
 138        pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG,
 139                        (temp2 & ~(1 << 10)) | (1 << 9));
 140        /* clear any possible error conditions */
 141        pci_write_config_byte(agp_bridge->dev, INTEL_ERRSTS + 1, 7);
 142        return 0;
 143}
 144
 145static int intel_815_configure(void)
 146{
 147        u32 addr;
 148        u8 temp2;
 149        struct aper_size_info_8 *current_size;
 150
 151        /* attbase - aperture base */
 152        /* the Intel 815 chipset spec. says that bits 29-31 in the
 153        * ATTBASE register are reserved -> try not to write them */
 154        if (agp_bridge->gatt_bus_addr & INTEL_815_ATTBASE_MASK) {
 155                dev_emerg(&agp_bridge->dev->dev, "gatt bus addr too high");
 156                return -EINVAL;
 157        }
 158
 159        current_size = A_SIZE_8(agp_bridge->current_size);
 160
 161        /* aperture size */
 162        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
 163                        current_size->size_value);
 164
 165        /* address to map to */
 166        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 167                                                    AGP_APERTURE_BAR);
 168
 169        pci_read_config_dword(agp_bridge->dev, INTEL_ATTBASE, &addr);
 170        addr &= INTEL_815_ATTBASE_MASK;
 171        addr |= agp_bridge->gatt_bus_addr;
 172        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, addr);
 173
 174        /* agpctrl */
 175        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 176
 177        /* apcont */
 178        pci_read_config_byte(agp_bridge->dev, INTEL_815_APCONT, &temp2);
 179        pci_write_config_byte(agp_bridge->dev, INTEL_815_APCONT, temp2 | (1 << 1));
 180
 181        /* clear any possible error conditions */
 182        /* Oddness : this chipset seems to have no ERRSTS register ! */
 183        return 0;
 184}
 185
 186static void intel_820_tlbflush(struct agp_memory *mem)
 187{
 188        return;
 189}
 190
 191static void intel_820_cleanup(void)
 192{
 193        u8 temp;
 194        struct aper_size_info_8 *previous_size;
 195
 196        previous_size = A_SIZE_8(agp_bridge->previous_size);
 197        pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp);
 198        pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR,
 199                        temp & ~(1 << 1));
 200        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE,
 201                        previous_size->size_value);
 202}
 203
 204
 205static int intel_820_configure(void)
 206{
 207        u8 temp2;
 208        struct aper_size_info_8 *current_size;
 209
 210        current_size = A_SIZE_8(agp_bridge->current_size);
 211
 212        /* aperture size */
 213        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 214
 215        /* address to map to */
 216        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 217                                                    AGP_APERTURE_BAR);
 218
 219        /* attbase - aperture base */
 220        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 221
 222        /* agpctrl */
 223        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 224
 225        /* global enable aperture access */
 226        /* This flag is not accessed through MCHCFG register as in */
 227        /* i850 chipset. */
 228        pci_read_config_byte(agp_bridge->dev, INTEL_I820_RDCR, &temp2);
 229        pci_write_config_byte(agp_bridge->dev, INTEL_I820_RDCR, temp2 | (1 << 1));
 230        /* clear any possible AGP-related error conditions */
 231        pci_write_config_word(agp_bridge->dev, INTEL_I820_ERRSTS, 0x001c);
 232        return 0;
 233}
 234
 235static int intel_840_configure(void)
 236{
 237        u16 temp2;
 238        struct aper_size_info_8 *current_size;
 239
 240        current_size = A_SIZE_8(agp_bridge->current_size);
 241
 242        /* aperture size */
 243        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 244
 245        /* address to map to */
 246        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 247                                                    AGP_APERTURE_BAR);
 248
 249        /* attbase - aperture base */
 250        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 251
 252        /* agpctrl */
 253        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 254
 255        /* mcgcfg */
 256        pci_read_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, &temp2);
 257        pci_write_config_word(agp_bridge->dev, INTEL_I840_MCHCFG, temp2 | (1 << 9));
 258        /* clear any possible error conditions */
 259        pci_write_config_word(agp_bridge->dev, INTEL_I840_ERRSTS, 0xc000);
 260        return 0;
 261}
 262
 263static int intel_845_configure(void)
 264{
 265        u8 temp2;
 266        struct aper_size_info_8 *current_size;
 267
 268        current_size = A_SIZE_8(agp_bridge->current_size);
 269
 270        /* aperture size */
 271        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 272
 273        if (agp_bridge->apbase_config != 0) {
 274                pci_write_config_dword(agp_bridge->dev, AGP_APBASE,
 275                                       agp_bridge->apbase_config);
 276        } else {
 277                /* address to map to */
 278                agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 279                                                            AGP_APERTURE_BAR);
 280                agp_bridge->apbase_config = agp_bridge->gart_bus_addr;
 281        }
 282
 283        /* attbase - aperture base */
 284        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 285
 286        /* agpctrl */
 287        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 288
 289        /* agpm */
 290        pci_read_config_byte(agp_bridge->dev, INTEL_I845_AGPM, &temp2);
 291        pci_write_config_byte(agp_bridge->dev, INTEL_I845_AGPM, temp2 | (1 << 1));
 292        /* clear any possible error conditions */
 293        pci_write_config_word(agp_bridge->dev, INTEL_I845_ERRSTS, 0x001c);
 294        return 0;
 295}
 296
 297static int intel_850_configure(void)
 298{
 299        u16 temp2;
 300        struct aper_size_info_8 *current_size;
 301
 302        current_size = A_SIZE_8(agp_bridge->current_size);
 303
 304        /* aperture size */
 305        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 306
 307        /* address to map to */
 308        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 309                                                    AGP_APERTURE_BAR);
 310
 311        /* attbase - aperture base */
 312        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 313
 314        /* agpctrl */
 315        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 316
 317        /* mcgcfg */
 318        pci_read_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, &temp2);
 319        pci_write_config_word(agp_bridge->dev, INTEL_I850_MCHCFG, temp2 | (1 << 9));
 320        /* clear any possible AGP-related error conditions */
 321        pci_write_config_word(agp_bridge->dev, INTEL_I850_ERRSTS, 0x001c);
 322        return 0;
 323}
 324
 325static int intel_860_configure(void)
 326{
 327        u16 temp2;
 328        struct aper_size_info_8 *current_size;
 329
 330        current_size = A_SIZE_8(agp_bridge->current_size);
 331
 332        /* aperture size */
 333        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 334
 335        /* address to map to */
 336        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 337                                                    AGP_APERTURE_BAR);
 338
 339        /* attbase - aperture base */
 340        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 341
 342        /* agpctrl */
 343        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 344
 345        /* mcgcfg */
 346        pci_read_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, &temp2);
 347        pci_write_config_word(agp_bridge->dev, INTEL_I860_MCHCFG, temp2 | (1 << 9));
 348        /* clear any possible AGP-related error conditions */
 349        pci_write_config_word(agp_bridge->dev, INTEL_I860_ERRSTS, 0xf700);
 350        return 0;
 351}
 352
 353static int intel_830mp_configure(void)
 354{
 355        u16 temp2;
 356        struct aper_size_info_8 *current_size;
 357
 358        current_size = A_SIZE_8(agp_bridge->current_size);
 359
 360        /* aperture size */
 361        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 362
 363        /* address to map to */
 364        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 365                                                    AGP_APERTURE_BAR);
 366
 367        /* attbase - aperture base */
 368        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 369
 370        /* agpctrl */
 371        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 372
 373        /* gmch */
 374        pci_read_config_word(agp_bridge->dev, INTEL_NBXCFG, &temp2);
 375        pci_write_config_word(agp_bridge->dev, INTEL_NBXCFG, temp2 | (1 << 9));
 376        /* clear any possible AGP-related error conditions */
 377        pci_write_config_word(agp_bridge->dev, INTEL_I830_ERRSTS, 0x1c);
 378        return 0;
 379}
 380
 381static int intel_7505_configure(void)
 382{
 383        u16 temp2;
 384        struct aper_size_info_8 *current_size;
 385
 386        current_size = A_SIZE_8(agp_bridge->current_size);
 387
 388        /* aperture size */
 389        pci_write_config_byte(agp_bridge->dev, INTEL_APSIZE, current_size->size_value);
 390
 391        /* address to map to */
 392        agp_bridge->gart_bus_addr = pci_bus_address(agp_bridge->dev,
 393                                                    AGP_APERTURE_BAR);
 394
 395        /* attbase - aperture base */
 396        pci_write_config_dword(agp_bridge->dev, INTEL_ATTBASE, agp_bridge->gatt_bus_addr);
 397
 398        /* agpctrl */
 399        pci_write_config_dword(agp_bridge->dev, INTEL_AGPCTRL, 0x0000);
 400
 401        /* mchcfg */
 402        pci_read_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, &temp2);
 403        pci_write_config_word(agp_bridge->dev, INTEL_I7505_MCHCFG, temp2 | (1 << 9));
 404
 405        return 0;
 406}
 407
 408/* Setup function */
 409static const struct gatt_mask intel_generic_masks[] =
 410{
 411        {.mask = 0x00000017, .type = 0}
 412};
 413
 414static const struct aper_size_info_8 intel_815_sizes[2] =
 415{
 416        {64, 16384, 4, 0},
 417        {32, 8192, 3, 8},
 418};
 419
 420static const struct aper_size_info_8 intel_8xx_sizes[7] =
 421{
 422        {256, 65536, 6, 0},
 423        {128, 32768, 5, 32},
 424        {64, 16384, 4, 48},
 425        {32, 8192, 3, 56},
 426        {16, 4096, 2, 60},
 427        {8, 2048, 1, 62},
 428        {4, 1024, 0, 63}
 429};
 430
 431static const struct aper_size_info_16 intel_generic_sizes[7] =
 432{
 433        {256, 65536, 6, 0},
 434        {128, 32768, 5, 32},
 435        {64, 16384, 4, 48},
 436        {32, 8192, 3, 56},
 437        {16, 4096, 2, 60},
 438        {8, 2048, 1, 62},
 439        {4, 1024, 0, 63}
 440};
 441
 442static const struct aper_size_info_8 intel_830mp_sizes[4] =
 443{
 444        {256, 65536, 6, 0},
 445        {128, 32768, 5, 32},
 446        {64, 16384, 4, 48},
 447        {32, 8192, 3, 56}
 448};
 449
 450static const struct agp_bridge_driver intel_generic_driver = {
 451        .owner                  = THIS_MODULE,
 452        .aperture_sizes         = intel_generic_sizes,
 453        .size_type              = U16_APER_SIZE,
 454        .num_aperture_sizes     = 7,
 455        .needs_scratch_page     = true,
 456        .configure              = intel_configure,
 457        .fetch_size             = intel_fetch_size,
 458        .cleanup                = intel_cleanup,
 459        .tlb_flush              = intel_tlbflush,
 460        .mask_memory            = agp_generic_mask_memory,
 461        .masks                  = intel_generic_masks,
 462        .agp_enable             = agp_generic_enable,
 463        .cache_flush            = global_cache_flush,
 464        .create_gatt_table      = agp_generic_create_gatt_table,
 465        .free_gatt_table        = agp_generic_free_gatt_table,
 466        .insert_memory          = agp_generic_insert_memory,
 467        .remove_memory          = agp_generic_remove_memory,
 468        .alloc_by_type          = agp_generic_alloc_by_type,
 469        .free_by_type           = agp_generic_free_by_type,
 470        .agp_alloc_page         = agp_generic_alloc_page,
 471        .agp_alloc_pages        = agp_generic_alloc_pages,
 472        .agp_destroy_page       = agp_generic_destroy_page,
 473        .agp_destroy_pages      = agp_generic_destroy_pages,
 474        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 475};
 476
 477static const struct agp_bridge_driver intel_815_driver = {
 478        .owner                  = THIS_MODULE,
 479        .aperture_sizes         = intel_815_sizes,
 480        .size_type              = U8_APER_SIZE,
 481        .num_aperture_sizes     = 2,
 482        .needs_scratch_page     = true,
 483        .configure              = intel_815_configure,
 484        .fetch_size             = intel_815_fetch_size,
 485        .cleanup                = intel_8xx_cleanup,
 486        .tlb_flush              = intel_8xx_tlbflush,
 487        .mask_memory            = agp_generic_mask_memory,
 488        .masks                  = intel_generic_masks,
 489        .agp_enable             = agp_generic_enable,
 490        .cache_flush            = global_cache_flush,
 491        .create_gatt_table      = agp_generic_create_gatt_table,
 492        .free_gatt_table        = agp_generic_free_gatt_table,
 493        .insert_memory          = agp_generic_insert_memory,
 494        .remove_memory          = agp_generic_remove_memory,
 495        .alloc_by_type          = agp_generic_alloc_by_type,
 496        .free_by_type           = agp_generic_free_by_type,
 497        .agp_alloc_page         = agp_generic_alloc_page,
 498        .agp_alloc_pages        = agp_generic_alloc_pages,
 499        .agp_destroy_page       = agp_generic_destroy_page,
 500        .agp_destroy_pages      = agp_generic_destroy_pages,
 501        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 502};
 503
 504static const struct agp_bridge_driver intel_820_driver = {
 505        .owner                  = THIS_MODULE,
 506        .aperture_sizes         = intel_8xx_sizes,
 507        .size_type              = U8_APER_SIZE,
 508        .num_aperture_sizes     = 7,
 509        .needs_scratch_page     = true,
 510        .configure              = intel_820_configure,
 511        .fetch_size             = intel_8xx_fetch_size,
 512        .cleanup                = intel_820_cleanup,
 513        .tlb_flush              = intel_820_tlbflush,
 514        .mask_memory            = agp_generic_mask_memory,
 515        .masks                  = intel_generic_masks,
 516        .agp_enable             = agp_generic_enable,
 517        .cache_flush            = global_cache_flush,
 518        .create_gatt_table      = agp_generic_create_gatt_table,
 519        .free_gatt_table        = agp_generic_free_gatt_table,
 520        .insert_memory          = agp_generic_insert_memory,
 521        .remove_memory          = agp_generic_remove_memory,
 522        .alloc_by_type          = agp_generic_alloc_by_type,
 523        .free_by_type           = agp_generic_free_by_type,
 524        .agp_alloc_page         = agp_generic_alloc_page,
 525        .agp_alloc_pages        = agp_generic_alloc_pages,
 526        .agp_destroy_page       = agp_generic_destroy_page,
 527        .agp_destroy_pages      = agp_generic_destroy_pages,
 528        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 529};
 530
 531static const struct agp_bridge_driver intel_830mp_driver = {
 532        .owner                  = THIS_MODULE,
 533        .aperture_sizes         = intel_830mp_sizes,
 534        .size_type              = U8_APER_SIZE,
 535        .num_aperture_sizes     = 4,
 536        .needs_scratch_page     = true,
 537        .configure              = intel_830mp_configure,
 538        .fetch_size             = intel_8xx_fetch_size,
 539        .cleanup                = intel_8xx_cleanup,
 540        .tlb_flush              = intel_8xx_tlbflush,
 541        .mask_memory            = agp_generic_mask_memory,
 542        .masks                  = intel_generic_masks,
 543        .agp_enable             = agp_generic_enable,
 544        .cache_flush            = global_cache_flush,
 545        .create_gatt_table      = agp_generic_create_gatt_table,
 546        .free_gatt_table        = agp_generic_free_gatt_table,
 547        .insert_memory          = agp_generic_insert_memory,
 548        .remove_memory          = agp_generic_remove_memory,
 549        .alloc_by_type          = agp_generic_alloc_by_type,
 550        .free_by_type           = agp_generic_free_by_type,
 551        .agp_alloc_page         = agp_generic_alloc_page,
 552        .agp_alloc_pages        = agp_generic_alloc_pages,
 553        .agp_destroy_page       = agp_generic_destroy_page,
 554        .agp_destroy_pages      = agp_generic_destroy_pages,
 555        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 556};
 557
 558static const struct agp_bridge_driver intel_840_driver = {
 559        .owner                  = THIS_MODULE,
 560        .aperture_sizes         = intel_8xx_sizes,
 561        .size_type              = U8_APER_SIZE,
 562        .num_aperture_sizes     = 7,
 563        .needs_scratch_page     = true,
 564        .configure              = intel_840_configure,
 565        .fetch_size             = intel_8xx_fetch_size,
 566        .cleanup                = intel_8xx_cleanup,
 567        .tlb_flush              = intel_8xx_tlbflush,
 568        .mask_memory            = agp_generic_mask_memory,
 569        .masks                  = intel_generic_masks,
 570        .agp_enable             = agp_generic_enable,
 571        .cache_flush            = global_cache_flush,
 572        .create_gatt_table      = agp_generic_create_gatt_table,
 573        .free_gatt_table        = agp_generic_free_gatt_table,
 574        .insert_memory          = agp_generic_insert_memory,
 575        .remove_memory          = agp_generic_remove_memory,
 576        .alloc_by_type          = agp_generic_alloc_by_type,
 577        .free_by_type           = agp_generic_free_by_type,
 578        .agp_alloc_page         = agp_generic_alloc_page,
 579        .agp_alloc_pages        = agp_generic_alloc_pages,
 580        .agp_destroy_page       = agp_generic_destroy_page,
 581        .agp_destroy_pages      = agp_generic_destroy_pages,
 582        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 583};
 584
 585static const struct agp_bridge_driver intel_845_driver = {
 586        .owner                  = THIS_MODULE,
 587        .aperture_sizes         = intel_8xx_sizes,
 588        .size_type              = U8_APER_SIZE,
 589        .num_aperture_sizes     = 7,
 590        .needs_scratch_page     = true,
 591        .configure              = intel_845_configure,
 592        .fetch_size             = intel_8xx_fetch_size,
 593        .cleanup                = intel_8xx_cleanup,
 594        .tlb_flush              = intel_8xx_tlbflush,
 595        .mask_memory            = agp_generic_mask_memory,
 596        .masks                  = intel_generic_masks,
 597        .agp_enable             = agp_generic_enable,
 598        .cache_flush            = global_cache_flush,
 599        .create_gatt_table      = agp_generic_create_gatt_table,
 600        .free_gatt_table        = agp_generic_free_gatt_table,
 601        .insert_memory          = agp_generic_insert_memory,
 602        .remove_memory          = agp_generic_remove_memory,
 603        .alloc_by_type          = agp_generic_alloc_by_type,
 604        .free_by_type           = agp_generic_free_by_type,
 605        .agp_alloc_page         = agp_generic_alloc_page,
 606        .agp_alloc_pages        = agp_generic_alloc_pages,
 607        .agp_destroy_page       = agp_generic_destroy_page,
 608        .agp_destroy_pages      = agp_generic_destroy_pages,
 609        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 610};
 611
 612static const struct agp_bridge_driver intel_850_driver = {
 613        .owner                  = THIS_MODULE,
 614        .aperture_sizes         = intel_8xx_sizes,
 615        .size_type              = U8_APER_SIZE,
 616        .num_aperture_sizes     = 7,
 617        .needs_scratch_page     = true,
 618        .configure              = intel_850_configure,
 619        .fetch_size             = intel_8xx_fetch_size,
 620        .cleanup                = intel_8xx_cleanup,
 621        .tlb_flush              = intel_8xx_tlbflush,
 622        .mask_memory            = agp_generic_mask_memory,
 623        .masks                  = intel_generic_masks,
 624        .agp_enable             = agp_generic_enable,
 625        .cache_flush            = global_cache_flush,
 626        .create_gatt_table      = agp_generic_create_gatt_table,
 627        .free_gatt_table        = agp_generic_free_gatt_table,
 628        .insert_memory          = agp_generic_insert_memory,
 629        .remove_memory          = agp_generic_remove_memory,
 630        .alloc_by_type          = agp_generic_alloc_by_type,
 631        .free_by_type           = agp_generic_free_by_type,
 632        .agp_alloc_page         = agp_generic_alloc_page,
 633        .agp_alloc_pages        = agp_generic_alloc_pages,
 634        .agp_destroy_page       = agp_generic_destroy_page,
 635        .agp_destroy_pages      = agp_generic_destroy_pages,
 636        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 637};
 638
 639static const struct agp_bridge_driver intel_860_driver = {
 640        .owner                  = THIS_MODULE,
 641        .aperture_sizes         = intel_8xx_sizes,
 642        .size_type              = U8_APER_SIZE,
 643        .num_aperture_sizes     = 7,
 644        .needs_scratch_page     = true,
 645        .configure              = intel_860_configure,
 646        .fetch_size             = intel_8xx_fetch_size,
 647        .cleanup                = intel_8xx_cleanup,
 648        .tlb_flush              = intel_8xx_tlbflush,
 649        .mask_memory            = agp_generic_mask_memory,
 650        .masks                  = intel_generic_masks,
 651        .agp_enable             = agp_generic_enable,
 652        .cache_flush            = global_cache_flush,
 653        .create_gatt_table      = agp_generic_create_gatt_table,
 654        .free_gatt_table        = agp_generic_free_gatt_table,
 655        .insert_memory          = agp_generic_insert_memory,
 656        .remove_memory          = agp_generic_remove_memory,
 657        .alloc_by_type          = agp_generic_alloc_by_type,
 658        .free_by_type           = agp_generic_free_by_type,
 659        .agp_alloc_page         = agp_generic_alloc_page,
 660        .agp_alloc_pages        = agp_generic_alloc_pages,
 661        .agp_destroy_page       = agp_generic_destroy_page,
 662        .agp_destroy_pages      = agp_generic_destroy_pages,
 663        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 664};
 665
 666static const struct agp_bridge_driver intel_7505_driver = {
 667        .owner                  = THIS_MODULE,
 668        .aperture_sizes         = intel_8xx_sizes,
 669        .size_type              = U8_APER_SIZE,
 670        .num_aperture_sizes     = 7,
 671        .needs_scratch_page     = true,
 672        .configure              = intel_7505_configure,
 673        .fetch_size             = intel_8xx_fetch_size,
 674        .cleanup                = intel_8xx_cleanup,
 675        .tlb_flush              = intel_8xx_tlbflush,
 676        .mask_memory            = agp_generic_mask_memory,
 677        .masks                  = intel_generic_masks,
 678        .agp_enable             = agp_generic_enable,
 679        .cache_flush            = global_cache_flush,
 680        .create_gatt_table      = agp_generic_create_gatt_table,
 681        .free_gatt_table        = agp_generic_free_gatt_table,
 682        .insert_memory          = agp_generic_insert_memory,
 683        .remove_memory          = agp_generic_remove_memory,
 684        .alloc_by_type          = agp_generic_alloc_by_type,
 685        .free_by_type           = agp_generic_free_by_type,
 686        .agp_alloc_page         = agp_generic_alloc_page,
 687        .agp_alloc_pages        = agp_generic_alloc_pages,
 688        .agp_destroy_page       = agp_generic_destroy_page,
 689        .agp_destroy_pages      = agp_generic_destroy_pages,
 690        .agp_type_to_mask_type  = agp_generic_type_to_mask_type,
 691};
 692
 693/* Table to describe Intel GMCH and AGP/PCIE GART drivers.  At least one of
 694 * driver and gmch_driver must be non-null, and find_gmch will determine
 695 * which one should be used if a gmch_chip_id is present.
 696 */
 697static const struct intel_agp_driver_description {
 698        unsigned int chip_id;
 699        char *name;
 700        const struct agp_bridge_driver *driver;
 701} intel_agp_chipsets[] = {
 702        { PCI_DEVICE_ID_INTEL_82443LX_0, "440LX", &intel_generic_driver },
 703        { PCI_DEVICE_ID_INTEL_82443BX_0, "440BX", &intel_generic_driver },
 704        { PCI_DEVICE_ID_INTEL_82443GX_0, "440GX", &intel_generic_driver },
 705        { PCI_DEVICE_ID_INTEL_82815_MC, "i815", &intel_815_driver },
 706        { PCI_DEVICE_ID_INTEL_82820_HB, "i820", &intel_820_driver },
 707        { PCI_DEVICE_ID_INTEL_82820_UP_HB, "i820", &intel_820_driver },
 708        { PCI_DEVICE_ID_INTEL_82830_HB, "830M", &intel_830mp_driver },
 709        { PCI_DEVICE_ID_INTEL_82840_HB, "i840", &intel_840_driver },
 710        { PCI_DEVICE_ID_INTEL_82845_HB, "i845", &intel_845_driver },
 711        { PCI_DEVICE_ID_INTEL_82845G_HB, "845G", &intel_845_driver },
 712        { PCI_DEVICE_ID_INTEL_82850_HB, "i850", &intel_850_driver },
 713        { PCI_DEVICE_ID_INTEL_82854_HB, "854", &intel_845_driver },
 714        { PCI_DEVICE_ID_INTEL_82855PM_HB, "855PM", &intel_845_driver },
 715        { PCI_DEVICE_ID_INTEL_82855GM_HB, "855GM", &intel_845_driver },
 716        { PCI_DEVICE_ID_INTEL_82860_HB, "i860", &intel_860_driver },
 717        { PCI_DEVICE_ID_INTEL_82865_HB, "865", &intel_845_driver },
 718        { PCI_DEVICE_ID_INTEL_82875_HB, "i875", &intel_845_driver },
 719        { PCI_DEVICE_ID_INTEL_7505_0, "E7505", &intel_7505_driver },
 720        { PCI_DEVICE_ID_INTEL_7205_0, "E7205", &intel_7505_driver },
 721        { 0, NULL, NULL }
 722};
 723
 724static int agp_intel_probe(struct pci_dev *pdev,
 725                           const struct pci_device_id *ent)
 726{
 727        struct agp_bridge_data *bridge;
 728        u8 cap_ptr = 0;
 729        struct resource *r;
 730        int i, err;
 731
 732        cap_ptr = pci_find_capability(pdev, PCI_CAP_ID_AGP);
 733
 734        bridge = agp_alloc_bridge();
 735        if (!bridge)
 736                return -ENOMEM;
 737
 738        bridge->capndx = cap_ptr;
 739
 740        if (intel_gmch_probe(pdev, NULL, bridge))
 741                goto found_gmch;
 742
 743        for (i = 0; intel_agp_chipsets[i].name != NULL; i++) {
 744                /* In case that multiple models of gfx chip may
 745                   stand on same host bridge type, this can be
 746                   sure we detect the right IGD. */
 747                if (pdev->device == intel_agp_chipsets[i].chip_id) {
 748                        bridge->driver = intel_agp_chipsets[i].driver;
 749                        break;
 750                }
 751        }
 752
 753        if (!bridge->driver) {
 754                if (cap_ptr)
 755                        dev_warn(&pdev->dev, "unsupported Intel chipset [%04x/%04x]\n",
 756                                 pdev->vendor, pdev->device);
 757                agp_put_bridge(bridge);
 758                return -ENODEV;
 759        }
 760
 761        bridge->dev = pdev;
 762        bridge->dev_private_data = NULL;
 763
 764        dev_info(&pdev->dev, "Intel %s Chipset\n", intel_agp_chipsets[i].name);
 765
 766        /*
 767        * The following fixes the case where the BIOS has "forgotten" to
 768        * provide an address range for the GART.
 769        * 20030610 - hamish@zot.org
 770        * This happens before pci_enable_device() intentionally;
 771        * calling pci_enable_device() before assigning the resource
 772        * will result in the GART being disabled on machines with such
 773        * BIOSs (the GART ends up with a BAR starting at 0, which
 774        * conflicts a lot of other devices).
 775        */
 776        r = &pdev->resource[0];
 777        if (!r->start && r->end) {
 778                if (pci_assign_resource(pdev, 0)) {
 779                        dev_err(&pdev->dev, "can't assign resource 0\n");
 780                        agp_put_bridge(bridge);
 781                        return -ENODEV;
 782                }
 783        }
 784
 785        /*
 786        * If the device has not been properly setup, the following will catch
 787        * the problem and should stop the system from crashing.
 788        * 20030610 - hamish@zot.org
 789        */
 790        if (pci_enable_device(pdev)) {
 791                dev_err(&pdev->dev, "can't enable PCI device\n");
 792                agp_put_bridge(bridge);
 793                return -ENODEV;
 794        }
 795
 796        /* Fill in the mode register */
 797        if (cap_ptr) {
 798                pci_read_config_dword(pdev,
 799                                bridge->capndx+PCI_AGP_STATUS,
 800                                &bridge->mode);
 801        }
 802
 803found_gmch:
 804        pci_set_drvdata(pdev, bridge);
 805        err = agp_add_bridge(bridge);
 806        return err;
 807}
 808
 809static void agp_intel_remove(struct pci_dev *pdev)
 810{
 811        struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
 812
 813        agp_remove_bridge(bridge);
 814
 815        intel_gmch_remove();
 816
 817        agp_put_bridge(bridge);
 818}
 819
 820#ifdef CONFIG_PM
 821static int agp_intel_resume(struct pci_dev *pdev)
 822{
 823        struct agp_bridge_data *bridge = pci_get_drvdata(pdev);
 824
 825        bridge->driver->configure();
 826
 827        return 0;
 828}
 829#endif
 830
 831static struct pci_device_id agp_intel_pci_table[] = {
 832#define ID(x)                                           \
 833        {                                               \
 834        .class          = (PCI_CLASS_BRIDGE_HOST << 8), \
 835        .class_mask     = ~0,                           \
 836        .vendor         = PCI_VENDOR_ID_INTEL,          \
 837        .device         = x,                            \
 838        .subvendor      = PCI_ANY_ID,                   \
 839        .subdevice      = PCI_ANY_ID,                   \
 840        }
 841        ID(PCI_DEVICE_ID_INTEL_82441), /* for HAS2 support */
 842        ID(PCI_DEVICE_ID_INTEL_82443LX_0),
 843        ID(PCI_DEVICE_ID_INTEL_82443BX_0),
 844        ID(PCI_DEVICE_ID_INTEL_82443GX_0),
 845        ID(PCI_DEVICE_ID_INTEL_82810_MC1),
 846        ID(PCI_DEVICE_ID_INTEL_82810_MC3),
 847        ID(PCI_DEVICE_ID_INTEL_82810E_MC),
 848        ID(PCI_DEVICE_ID_INTEL_82815_MC),
 849        ID(PCI_DEVICE_ID_INTEL_82820_HB),
 850        ID(PCI_DEVICE_ID_INTEL_82820_UP_HB),
 851        ID(PCI_DEVICE_ID_INTEL_82830_HB),
 852        ID(PCI_DEVICE_ID_INTEL_82840_HB),
 853        ID(PCI_DEVICE_ID_INTEL_82845_HB),
 854        ID(PCI_DEVICE_ID_INTEL_82845G_HB),
 855        ID(PCI_DEVICE_ID_INTEL_82850_HB),
 856        ID(PCI_DEVICE_ID_INTEL_82854_HB),
 857        ID(PCI_DEVICE_ID_INTEL_82855PM_HB),
 858        ID(PCI_DEVICE_ID_INTEL_82855GM_HB),
 859        ID(PCI_DEVICE_ID_INTEL_82860_HB),
 860        ID(PCI_DEVICE_ID_INTEL_82865_HB),
 861        ID(PCI_DEVICE_ID_INTEL_82875_HB),
 862        ID(PCI_DEVICE_ID_INTEL_7505_0),
 863        ID(PCI_DEVICE_ID_INTEL_7205_0),
 864        ID(PCI_DEVICE_ID_INTEL_E7221_HB),
 865        ID(PCI_DEVICE_ID_INTEL_82915G_HB),
 866        ID(PCI_DEVICE_ID_INTEL_82915GM_HB),
 867        ID(PCI_DEVICE_ID_INTEL_82945G_HB),
 868        ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
 869        ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
 870        ID(PCI_DEVICE_ID_INTEL_PINEVIEW_M_HB),
 871        ID(PCI_DEVICE_ID_INTEL_PINEVIEW_HB),
 872        ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
 873        ID(PCI_DEVICE_ID_INTEL_82G35_HB),
 874        ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
 875        ID(PCI_DEVICE_ID_INTEL_82965G_HB),
 876        ID(PCI_DEVICE_ID_INTEL_82965GM_HB),
 877        ID(PCI_DEVICE_ID_INTEL_82965GME_HB),
 878        ID(PCI_DEVICE_ID_INTEL_G33_HB),
 879        ID(PCI_DEVICE_ID_INTEL_Q35_HB),
 880        ID(PCI_DEVICE_ID_INTEL_Q33_HB),
 881        ID(PCI_DEVICE_ID_INTEL_GM45_HB),
 882        ID(PCI_DEVICE_ID_INTEL_EAGLELAKE_HB),
 883        ID(PCI_DEVICE_ID_INTEL_Q45_HB),
 884        ID(PCI_DEVICE_ID_INTEL_G45_HB),
 885        ID(PCI_DEVICE_ID_INTEL_G41_HB),
 886        ID(PCI_DEVICE_ID_INTEL_B43_HB),
 887        ID(PCI_DEVICE_ID_INTEL_B43_1_HB),
 888        ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB),
 889        ID(PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB),
 890        ID(PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB),
 891        ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB),
 892        ID(PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB),
 893        { }
 894};
 895
 896MODULE_DEVICE_TABLE(pci, agp_intel_pci_table);
 897
 898static struct pci_driver agp_intel_pci_driver = {
 899        .name           = "agpgart-intel",
 900        .id_table       = agp_intel_pci_table,
 901        .probe          = agp_intel_probe,
 902        .remove         = agp_intel_remove,
 903#ifdef CONFIG_PM
 904        .resume         = agp_intel_resume,
 905#endif
 906};
 907
 908static int __init agp_intel_init(void)
 909{
 910        if (agp_off)
 911                return -EINVAL;
 912        return pci_register_driver(&agp_intel_pci_driver);
 913}
 914
 915static void __exit agp_intel_cleanup(void)
 916{
 917        pci_unregister_driver(&agp_intel_pci_driver);
 918}
 919
 920module_init(agp_intel_init);
 921module_exit(agp_intel_cleanup);
 922
 923MODULE_AUTHOR("Dave Jones <davej@redhat.com>");
 924MODULE_LICENSE("GPL and additional rights");
 925