blob: f804325a735e9549f67413dcbcc1d3e7c5db7141 [file] [log] [blame]
Daniel Vetterf51b7662010-04-14 00:29:52 +02001/*
2 * Intel GTT (Graphics Translation Table) routines
3 *
4 * Caveat: This driver implements the linux agp interface, but this is far from
5 * a agp driver! GTT support ended up here for purely historical reasons: The
6 * old userspace intel graphics drivers needed an interface to map memory into
7 * the GTT. And the drm provides a default interface for graphic devices sitting
8 * on an agp port. So it made sense to fake the GTT support as an agp port to
9 * avoid having to create a new api.
10 *
11 * With gem this does not make much sense anymore, just needlessly complicates
12 * the code. But as long as the old graphics stack is still support, it's stuck
13 * here.
14 *
15 * /fairy-tale-mode off
16 */
17
18/*
19 * If we have Intel graphics, we're not going to have anything other than
20 * an Intel IOMMU. So make the correct use of the PCI DMA API contingent
21 * on the Intel IOMMU support (CONFIG_DMAR).
22 * Only newer chipsets need to bother with this, of course.
23 */
24#ifdef CONFIG_DMAR
25#define USE_PCI_DMA_API 1
26#endif
27
28static const struct aper_size_info_fixed intel_i810_sizes[] =
29{
30 {64, 16384, 4},
31 /* The 32M mode still requires a 64k gatt */
32 {32, 8192, 4}
33};
34
35#define AGP_DCACHE_MEMORY 1
36#define AGP_PHYS_MEMORY 2
37#define INTEL_AGP_CACHED_MEMORY 3
38
39static struct gatt_mask intel_i810_masks[] =
40{
41 {.mask = I810_PTE_VALID, .type = 0},
42 {.mask = (I810_PTE_VALID | I810_PTE_LOCAL), .type = AGP_DCACHE_MEMORY},
43 {.mask = I810_PTE_VALID, .type = 0},
44 {.mask = I810_PTE_VALID | I830_PTE_SYSTEM_CACHED,
45 .type = INTEL_AGP_CACHED_MEMORY}
46};
47
48static struct _intel_private {
49 struct pci_dev *pcidev; /* device one */
50 u8 __iomem *registers;
51 u32 __iomem *gtt; /* I915G */
52 int num_dcache_entries;
53 /* gtt_entries is the number of gtt entries that are already mapped
54 * to stolen memory. Stolen memory is larger than the memory mapped
55 * through gtt_entries, as it includes some reserved space for the BIOS
56 * popup and for the GTT.
57 */
58 int gtt_entries; /* i830+ */
59 int gtt_total_size;
60 union {
61 void __iomem *i9xx_flush_page;
62 void *i8xx_flush_page;
63 };
64 struct page *i8xx_page;
65 struct resource ifp_resource;
66 int resource_valid;
67} intel_private;
68
69#ifdef USE_PCI_DMA_API
70static int intel_agp_map_page(struct page *page, dma_addr_t *ret)
71{
72 *ret = pci_map_page(intel_private.pcidev, page, 0,
73 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
74 if (pci_dma_mapping_error(intel_private.pcidev, *ret))
75 return -EINVAL;
76 return 0;
77}
78
79static void intel_agp_unmap_page(struct page *page, dma_addr_t dma)
80{
81 pci_unmap_page(intel_private.pcidev, dma,
82 PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
83}
84
85static void intel_agp_free_sglist(struct agp_memory *mem)
86{
87 struct sg_table st;
88
89 st.sgl = mem->sg_list;
90 st.orig_nents = st.nents = mem->page_count;
91
92 sg_free_table(&st);
93
94 mem->sg_list = NULL;
95 mem->num_sg = 0;
96}
97
98static int intel_agp_map_memory(struct agp_memory *mem)
99{
100 struct sg_table st;
101 struct scatterlist *sg;
102 int i;
103
104 DBG("try mapping %lu pages\n", (unsigned long)mem->page_count);
105
106 if (sg_alloc_table(&st, mem->page_count, GFP_KERNEL))
Chris Wilson831cd442010-07-24 18:29:37 +0100107 goto err;
Daniel Vetterf51b7662010-04-14 00:29:52 +0200108
109 mem->sg_list = sg = st.sgl;
110
111 for (i = 0 ; i < mem->page_count; i++, sg = sg_next(sg))
112 sg_set_page(sg, mem->pages[i], PAGE_SIZE, 0);
113
114 mem->num_sg = pci_map_sg(intel_private.pcidev, mem->sg_list,
115 mem->page_count, PCI_DMA_BIDIRECTIONAL);
Chris Wilson831cd442010-07-24 18:29:37 +0100116 if (unlikely(!mem->num_sg))
117 goto err;
118
Daniel Vetterf51b7662010-04-14 00:29:52 +0200119 return 0;
Chris Wilson831cd442010-07-24 18:29:37 +0100120
121err:
122 sg_free_table(&st);
123 return -ENOMEM;
Daniel Vetterf51b7662010-04-14 00:29:52 +0200124}
125
126static void intel_agp_unmap_memory(struct agp_memory *mem)
127{
128 DBG("try unmapping %lu pages\n", (unsigned long)mem->page_count);
129
130 pci_unmap_sg(intel_private.pcidev, mem->sg_list,
131 mem->page_count, PCI_DMA_BIDIRECTIONAL);
132 intel_agp_free_sglist(mem);
133}
134
135static void intel_agp_insert_sg_entries(struct agp_memory *mem,
136 off_t pg_start, int mask_type)
137{
138 struct scatterlist *sg;
139 int i, j;
140
141 j = pg_start;
142
143 WARN_ON(!mem->num_sg);
144
145 if (mem->num_sg == mem->page_count) {
146 for_each_sg(mem->sg_list, sg, mem->page_count, i) {
147 writel(agp_bridge->driver->mask_memory(agp_bridge,
148 sg_dma_address(sg), mask_type),
149 intel_private.gtt+j);
150 j++;
151 }
152 } else {
153 /* sg may merge pages, but we have to separate
154 * per-page addr for GTT */
155 unsigned int len, m;
156
157 for_each_sg(mem->sg_list, sg, mem->num_sg, i) {
158 len = sg_dma_len(sg) / PAGE_SIZE;
159 for (m = 0; m < len; m++) {
160 writel(agp_bridge->driver->mask_memory(agp_bridge,
161 sg_dma_address(sg) + m * PAGE_SIZE,
162 mask_type),
163 intel_private.gtt+j);
164 j++;
165 }
166 }
167 }
168 readl(intel_private.gtt+j-1);
169}
170
171#else
172
173static void intel_agp_insert_sg_entries(struct agp_memory *mem,
174 off_t pg_start, int mask_type)
175{
176 int i, j;
177 u32 cache_bits = 0;
178
179 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB ||
180 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB)
181 {
Zhenyu Wanga2757b62010-07-09 10:45:17 -0700182 cache_bits = GEN6_PTE_LLC_MLC;
Daniel Vetterf51b7662010-04-14 00:29:52 +0200183 }
184
185 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
186 writel(agp_bridge->driver->mask_memory(agp_bridge,
187 page_to_phys(mem->pages[i]), mask_type),
188 intel_private.gtt+j);
189 }
190
191 readl(intel_private.gtt+j-1);
192}
193
194#endif
195
196static int intel_i810_fetch_size(void)
197{
198 u32 smram_miscc;
199 struct aper_size_info_fixed *values;
200
201 pci_read_config_dword(agp_bridge->dev, I810_SMRAM_MISCC, &smram_miscc);
202 values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
203
204 if ((smram_miscc & I810_GMS) == I810_GMS_DISABLE) {
205 dev_warn(&agp_bridge->dev->dev, "i810 is disabled\n");
206 return 0;
207 }
208 if ((smram_miscc & I810_GFX_MEM_WIN_SIZE) == I810_GFX_MEM_WIN_32M) {
Daniel Vettere1583162010-04-14 00:29:58 +0200209 agp_bridge->current_size = (void *) (values + 1);
Daniel Vetterf51b7662010-04-14 00:29:52 +0200210 agp_bridge->aperture_size_idx = 1;
211 return values[1].size;
212 } else {
Daniel Vettere1583162010-04-14 00:29:58 +0200213 agp_bridge->current_size = (void *) (values);
Daniel Vetterf51b7662010-04-14 00:29:52 +0200214 agp_bridge->aperture_size_idx = 0;
215 return values[0].size;
216 }
217
218 return 0;
219}
220
221static int intel_i810_configure(void)
222{
223 struct aper_size_info_fixed *current_size;
224 u32 temp;
225 int i;
226
227 current_size = A_SIZE_FIX(agp_bridge->current_size);
228
229 if (!intel_private.registers) {
230 pci_read_config_dword(intel_private.pcidev, I810_MMADDR, &temp);
231 temp &= 0xfff80000;
232
233 intel_private.registers = ioremap(temp, 128 * 4096);
234 if (!intel_private.registers) {
235 dev_err(&intel_private.pcidev->dev,
236 "can't remap memory\n");
237 return -ENOMEM;
238 }
239 }
240
241 if ((readl(intel_private.registers+I810_DRAM_CTL)
242 & I810_DRAM_ROW_0) == I810_DRAM_ROW_0_SDRAM) {
243 /* This will need to be dynamically assigned */
244 dev_info(&intel_private.pcidev->dev,
245 "detected 4MB dedicated video ram\n");
246 intel_private.num_dcache_entries = 1024;
247 }
248 pci_read_config_dword(intel_private.pcidev, I810_GMADDR, &temp);
249 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
250 writel(agp_bridge->gatt_bus_addr | I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL);
251 readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
252
253 if (agp_bridge->driver->needs_scratch_page) {
254 for (i = 0; i < current_size->num_entries; i++) {
255 writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
256 }
257 readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI posting. */
258 }
259 global_cache_flush();
260 return 0;
261}
262
263static void intel_i810_cleanup(void)
264{
265 writel(0, intel_private.registers+I810_PGETBL_CTL);
266 readl(intel_private.registers); /* PCI Posting. */
267 iounmap(intel_private.registers);
268}
269
Daniel Vetterf51b7662010-04-14 00:29:52 +0200270static void intel_i810_agp_enable(struct agp_bridge_data *bridge, u32 mode)
271{
272 return;
273}
274
275/* Exists to support ARGB cursors */
276static struct page *i8xx_alloc_pages(void)
277{
278 struct page *page;
279
280 page = alloc_pages(GFP_KERNEL | GFP_DMA32, 2);
281 if (page == NULL)
282 return NULL;
283
284 if (set_pages_uc(page, 4) < 0) {
285 set_pages_wb(page, 4);
286 __free_pages(page, 2);
287 return NULL;
288 }
289 get_page(page);
290 atomic_inc(&agp_bridge->current_memory_agp);
291 return page;
292}
293
294static void i8xx_destroy_pages(struct page *page)
295{
296 if (page == NULL)
297 return;
298
299 set_pages_wb(page, 4);
300 put_page(page);
301 __free_pages(page, 2);
302 atomic_dec(&agp_bridge->current_memory_agp);
303}
304
305static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge,
306 int type)
307{
308 if (type < AGP_USER_TYPES)
309 return type;
310 else if (type == AGP_USER_CACHED_MEMORY)
311 return INTEL_AGP_CACHED_MEMORY;
312 else
313 return 0;
314}
315
316static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start,
317 int type)
318{
319 int i, j, num_entries;
320 void *temp;
321 int ret = -EINVAL;
322 int mask_type;
323
324 if (mem->page_count == 0)
325 goto out;
326
327 temp = agp_bridge->current_size;
328 num_entries = A_SIZE_FIX(temp)->num_entries;
329
330 if ((pg_start + mem->page_count) > num_entries)
331 goto out_err;
332
333
334 for (j = pg_start; j < (pg_start + mem->page_count); j++) {
335 if (!PGE_EMPTY(agp_bridge, readl(agp_bridge->gatt_table+j))) {
336 ret = -EBUSY;
337 goto out_err;
338 }
339 }
340
341 if (type != mem->type)
342 goto out_err;
343
344 mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
345
346 switch (mask_type) {
347 case AGP_DCACHE_MEMORY:
348 if (!mem->is_flushed)
349 global_cache_flush();
350 for (i = pg_start; i < (pg_start + mem->page_count); i++) {
351 writel((i*4096)|I810_PTE_LOCAL|I810_PTE_VALID,
352 intel_private.registers+I810_PTE_BASE+(i*4));
353 }
354 readl(intel_private.registers+I810_PTE_BASE+((i-1)*4));
355 break;
356 case AGP_PHYS_MEMORY:
357 case AGP_NORMAL_MEMORY:
358 if (!mem->is_flushed)
359 global_cache_flush();
360 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
361 writel(agp_bridge->driver->mask_memory(agp_bridge,
362 page_to_phys(mem->pages[i]), mask_type),
363 intel_private.registers+I810_PTE_BASE+(j*4));
364 }
365 readl(intel_private.registers+I810_PTE_BASE+((j-1)*4));
366 break;
367 default:
368 goto out_err;
369 }
370
Daniel Vetterf51b7662010-04-14 00:29:52 +0200371out:
372 ret = 0;
373out_err:
374 mem->is_flushed = true;
375 return ret;
376}
377
378static int intel_i810_remove_entries(struct agp_memory *mem, off_t pg_start,
379 int type)
380{
381 int i;
382
383 if (mem->page_count == 0)
384 return 0;
385
386 for (i = pg_start; i < (mem->page_count + pg_start); i++) {
387 writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
388 }
389 readl(intel_private.registers+I810_PTE_BASE+((i-1)*4));
390
Daniel Vetterf51b7662010-04-14 00:29:52 +0200391 return 0;
392}
393
394/*
395 * The i810/i830 requires a physical address to program its mouse
396 * pointer into hardware.
397 * However the Xserver still writes to it through the agp aperture.
398 */
399static struct agp_memory *alloc_agpphysmem_i8xx(size_t pg_count, int type)
400{
401 struct agp_memory *new;
402 struct page *page;
403
404 switch (pg_count) {
405 case 1: page = agp_bridge->driver->agp_alloc_page(agp_bridge);
406 break;
407 case 4:
408 /* kludge to get 4 physical pages for ARGB cursor */
409 page = i8xx_alloc_pages();
410 break;
411 default:
412 return NULL;
413 }
414
415 if (page == NULL)
416 return NULL;
417
418 new = agp_create_memory(pg_count);
419 if (new == NULL)
420 return NULL;
421
422 new->pages[0] = page;
423 if (pg_count == 4) {
424 /* kludge to get 4 physical pages for ARGB cursor */
425 new->pages[1] = new->pages[0] + 1;
426 new->pages[2] = new->pages[1] + 1;
427 new->pages[3] = new->pages[2] + 1;
428 }
429 new->page_count = pg_count;
430 new->num_scratch_pages = pg_count;
431 new->type = AGP_PHYS_MEMORY;
432 new->physical = page_to_phys(new->pages[0]);
433 return new;
434}
435
436static struct agp_memory *intel_i810_alloc_by_type(size_t pg_count, int type)
437{
438 struct agp_memory *new;
439
440 if (type == AGP_DCACHE_MEMORY) {
441 if (pg_count != intel_private.num_dcache_entries)
442 return NULL;
443
444 new = agp_create_memory(1);
445 if (new == NULL)
446 return NULL;
447
448 new->type = AGP_DCACHE_MEMORY;
449 new->page_count = pg_count;
450 new->num_scratch_pages = 0;
451 agp_free_page_array(new);
452 return new;
453 }
454 if (type == AGP_PHYS_MEMORY)
455 return alloc_agpphysmem_i8xx(pg_count, type);
456 return NULL;
457}
458
459static void intel_i810_free_by_type(struct agp_memory *curr)
460{
461 agp_free_key(curr->key);
462 if (curr->type == AGP_PHYS_MEMORY) {
463 if (curr->page_count == 4)
464 i8xx_destroy_pages(curr->pages[0]);
465 else {
466 agp_bridge->driver->agp_destroy_page(curr->pages[0],
467 AGP_PAGE_DESTROY_UNMAP);
468 agp_bridge->driver->agp_destroy_page(curr->pages[0],
469 AGP_PAGE_DESTROY_FREE);
470 }
471 agp_free_page_array(curr);
472 }
473 kfree(curr);
474}
475
476static unsigned long intel_i810_mask_memory(struct agp_bridge_data *bridge,
477 dma_addr_t addr, int type)
478{
479 /* Type checking must be done elsewhere */
480 return addr | bridge->driver->masks[type].mask;
481}
482
483static struct aper_size_info_fixed intel_i830_sizes[] =
484{
485 {128, 32768, 5},
486 /* The 64M mode still requires a 128k gatt */
487 {64, 16384, 5},
488 {256, 65536, 6},
489 {512, 131072, 7},
490};
491
492static void intel_i830_init_gtt_entries(void)
493{
494 u16 gmch_ctrl;
495 int gtt_entries = 0;
496 u8 rdct;
497 int local = 0;
498 static const int ddt[4] = { 0, 16, 32, 64 };
499 int size; /* reserved space (in kb) at the top of stolen memory */
500
501 pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
502
503 if (IS_I965) {
504 u32 pgetbl_ctl;
505 pgetbl_ctl = readl(intel_private.registers+I810_PGETBL_CTL);
506
507 /* The 965 has a field telling us the size of the GTT,
508 * which may be larger than what is necessary to map the
509 * aperture.
510 */
511 switch (pgetbl_ctl & I965_PGETBL_SIZE_MASK) {
512 case I965_PGETBL_SIZE_128KB:
513 size = 128;
514 break;
515 case I965_PGETBL_SIZE_256KB:
516 size = 256;
517 break;
518 case I965_PGETBL_SIZE_512KB:
519 size = 512;
520 break;
521 case I965_PGETBL_SIZE_1MB:
522 size = 1024;
523 break;
524 case I965_PGETBL_SIZE_2MB:
525 size = 2048;
526 break;
527 case I965_PGETBL_SIZE_1_5MB:
528 size = 1024 + 512;
529 break;
530 default:
531 dev_info(&intel_private.pcidev->dev,
532 "unknown page table size, assuming 512KB\n");
533 size = 512;
534 }
535 size += 4; /* add in BIOS popup space */
536 } else if (IS_G33 && !IS_PINEVIEW) {
537 /* G33's GTT size defined in gmch_ctrl */
538 switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) {
539 case G33_PGETBL_SIZE_1M:
540 size = 1024;
541 break;
542 case G33_PGETBL_SIZE_2M:
543 size = 2048;
544 break;
545 default:
546 dev_info(&agp_bridge->dev->dev,
547 "unknown page table size 0x%x, assuming 512KB\n",
548 (gmch_ctrl & G33_PGETBL_SIZE_MASK));
549 size = 512;
550 }
551 size += 4;
552 } else if (IS_G4X || IS_PINEVIEW) {
553 /* On 4 series hardware, GTT stolen is separate from graphics
554 * stolen, ignore it in stolen gtt entries counting. However,
555 * 4KB of the stolen memory doesn't get mapped to the GTT.
556 */
557 size = 4;
558 } else {
559 /* On previous hardware, the GTT size was just what was
560 * required to map the aperture.
561 */
562 size = agp_bridge->driver->fetch_size() + 4;
563 }
564
565 if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82830_HB ||
566 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) {
567 switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
568 case I830_GMCH_GMS_STOLEN_512:
569 gtt_entries = KB(512) - KB(size);
570 break;
571 case I830_GMCH_GMS_STOLEN_1024:
572 gtt_entries = MB(1) - KB(size);
573 break;
574 case I830_GMCH_GMS_STOLEN_8192:
575 gtt_entries = MB(8) - KB(size);
576 break;
577 case I830_GMCH_GMS_LOCAL:
578 rdct = readb(intel_private.registers+I830_RDRAM_CHANNEL_TYPE);
579 gtt_entries = (I830_RDRAM_ND(rdct) + 1) *
580 MB(ddt[I830_RDRAM_DDT(rdct)]);
581 local = 1;
582 break;
583 default:
584 gtt_entries = 0;
585 break;
586 }
587 } else if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB ||
588 agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) {
589 /*
590 * SandyBridge has new memory control reg at 0x50.w
591 */
592 u16 snb_gmch_ctl;
593 pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl);
594 switch (snb_gmch_ctl & SNB_GMCH_GMS_STOLEN_MASK) {
595 case SNB_GMCH_GMS_STOLEN_32M:
596 gtt_entries = MB(32) - KB(size);
597 break;
598 case SNB_GMCH_GMS_STOLEN_64M:
599 gtt_entries = MB(64) - KB(size);
600 break;
601 case SNB_GMCH_GMS_STOLEN_96M:
602 gtt_entries = MB(96) - KB(size);
603 break;
604 case SNB_GMCH_GMS_STOLEN_128M:
605 gtt_entries = MB(128) - KB(size);
606 break;
607 case SNB_GMCH_GMS_STOLEN_160M:
608 gtt_entries = MB(160) - KB(size);
609 break;
610 case SNB_GMCH_GMS_STOLEN_192M:
611 gtt_entries = MB(192) - KB(size);
612 break;
613 case SNB_GMCH_GMS_STOLEN_224M:
614 gtt_entries = MB(224) - KB(size);
615 break;
616 case SNB_GMCH_GMS_STOLEN_256M:
617 gtt_entries = MB(256) - KB(size);
618 break;
619 case SNB_GMCH_GMS_STOLEN_288M:
620 gtt_entries = MB(288) - KB(size);
621 break;
622 case SNB_GMCH_GMS_STOLEN_320M:
623 gtt_entries = MB(320) - KB(size);
624 break;
625 case SNB_GMCH_GMS_STOLEN_352M:
626 gtt_entries = MB(352) - KB(size);
627 break;
628 case SNB_GMCH_GMS_STOLEN_384M:
629 gtt_entries = MB(384) - KB(size);
630 break;
631 case SNB_GMCH_GMS_STOLEN_416M:
632 gtt_entries = MB(416) - KB(size);
633 break;
634 case SNB_GMCH_GMS_STOLEN_448M:
635 gtt_entries = MB(448) - KB(size);
636 break;
637 case SNB_GMCH_GMS_STOLEN_480M:
638 gtt_entries = MB(480) - KB(size);
639 break;
640 case SNB_GMCH_GMS_STOLEN_512M:
641 gtt_entries = MB(512) - KB(size);
642 break;
643 }
644 } else {
645 switch (gmch_ctrl & I855_GMCH_GMS_MASK) {
646 case I855_GMCH_GMS_STOLEN_1M:
647 gtt_entries = MB(1) - KB(size);
648 break;
649 case I855_GMCH_GMS_STOLEN_4M:
650 gtt_entries = MB(4) - KB(size);
651 break;
652 case I855_GMCH_GMS_STOLEN_8M:
653 gtt_entries = MB(8) - KB(size);
654 break;
655 case I855_GMCH_GMS_STOLEN_16M:
656 gtt_entries = MB(16) - KB(size);
657 break;
658 case I855_GMCH_GMS_STOLEN_32M:
659 gtt_entries = MB(32) - KB(size);
660 break;
661 case I915_GMCH_GMS_STOLEN_48M:
662 /* Check it's really I915G */
663 if (IS_I915 || IS_I965 || IS_G33 || IS_G4X)
664 gtt_entries = MB(48) - KB(size);
665 else
666 gtt_entries = 0;
667 break;
668 case I915_GMCH_GMS_STOLEN_64M:
669 /* Check it's really I915G */
670 if (IS_I915 || IS_I965 || IS_G33 || IS_G4X)
671 gtt_entries = MB(64) - KB(size);
672 else
673 gtt_entries = 0;
674 break;
675 case G33_GMCH_GMS_STOLEN_128M:
676 if (IS_G33 || IS_I965 || IS_G4X)
677 gtt_entries = MB(128) - KB(size);
678 else
679 gtt_entries = 0;
680 break;
681 case G33_GMCH_GMS_STOLEN_256M:
682 if (IS_G33 || IS_I965 || IS_G4X)
683 gtt_entries = MB(256) - KB(size);
684 else
685 gtt_entries = 0;
686 break;
687 case INTEL_GMCH_GMS_STOLEN_96M:
688 if (IS_I965 || IS_G4X)
689 gtt_entries = MB(96) - KB(size);
690 else
691 gtt_entries = 0;
692 break;
693 case INTEL_GMCH_GMS_STOLEN_160M:
694 if (IS_I965 || IS_G4X)
695 gtt_entries = MB(160) - KB(size);
696 else
697 gtt_entries = 0;
698 break;
699 case INTEL_GMCH_GMS_STOLEN_224M:
700 if (IS_I965 || IS_G4X)
701 gtt_entries = MB(224) - KB(size);
702 else
703 gtt_entries = 0;
704 break;
705 case INTEL_GMCH_GMS_STOLEN_352M:
706 if (IS_I965 || IS_G4X)
707 gtt_entries = MB(352) - KB(size);
708 else
709 gtt_entries = 0;
710 break;
711 default:
712 gtt_entries = 0;
713 break;
714 }
715 }
716 if (gtt_entries > 0) {
717 dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n",
718 gtt_entries / KB(1), local ? "local" : "stolen");
719 gtt_entries /= KB(4);
720 } else {
721 dev_info(&agp_bridge->dev->dev,
722 "no pre-allocated video memory detected\n");
723 gtt_entries = 0;
724 }
725
726 intel_private.gtt_entries = gtt_entries;
727}
728
729static void intel_i830_fini_flush(void)
730{
731 kunmap(intel_private.i8xx_page);
732 intel_private.i8xx_flush_page = NULL;
733 unmap_page_from_agp(intel_private.i8xx_page);
734
735 __free_page(intel_private.i8xx_page);
736 intel_private.i8xx_page = NULL;
737}
738
739static void intel_i830_setup_flush(void)
740{
741 /* return if we've already set the flush mechanism up */
742 if (intel_private.i8xx_page)
743 return;
744
745 intel_private.i8xx_page = alloc_page(GFP_KERNEL | __GFP_ZERO | GFP_DMA32);
746 if (!intel_private.i8xx_page)
747 return;
748
749 intel_private.i8xx_flush_page = kmap(intel_private.i8xx_page);
750 if (!intel_private.i8xx_flush_page)
751 intel_i830_fini_flush();
752}
753
754/* The chipset_flush interface needs to get data that has already been
755 * flushed out of the CPU all the way out to main memory, because the GPU
756 * doesn't snoop those buffers.
757 *
758 * The 8xx series doesn't have the same lovely interface for flushing the
759 * chipset write buffers that the later chips do. According to the 865
760 * specs, it's 64 octwords, or 1KB. So, to get those previous things in
761 * that buffer out, we just fill 1KB and clflush it out, on the assumption
762 * that it'll push whatever was in there out. It appears to work.
763 */
764static void intel_i830_chipset_flush(struct agp_bridge_data *bridge)
765{
766 unsigned int *pg = intel_private.i8xx_flush_page;
767
768 memset(pg, 0, 1024);
769
770 if (cpu_has_clflush)
771 clflush_cache_range(pg, 1024);
772 else if (wbinvd_on_all_cpus() != 0)
773 printk(KERN_ERR "Timed out waiting for cache flush.\n");
774}
775
776/* The intel i830 automatically initializes the agp aperture during POST.
777 * Use the memory already set aside for in the GTT.
778 */
779static int intel_i830_create_gatt_table(struct agp_bridge_data *bridge)
780{
781 int page_order;
782 struct aper_size_info_fixed *size;
783 int num_entries;
784 u32 temp;
785
786 size = agp_bridge->current_size;
787 page_order = size->page_order;
788 num_entries = size->num_entries;
789 agp_bridge->gatt_table_real = NULL;
790
791 pci_read_config_dword(intel_private.pcidev, I810_MMADDR, &temp);
792 temp &= 0xfff80000;
793
794 intel_private.registers = ioremap(temp, 128 * 4096);
795 if (!intel_private.registers)
796 return -ENOMEM;
797
798 temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
799 global_cache_flush(); /* FIXME: ?? */
800
801 /* we have to call this as early as possible after the MMIO base address is known */
802 intel_i830_init_gtt_entries();
Ondrej Zary8699be32010-06-16 10:13:52 +0200803 if (intel_private.gtt_entries == 0) {
804 iounmap(intel_private.registers);
805 return -ENOMEM;
806 }
Daniel Vetterf51b7662010-04-14 00:29:52 +0200807
808 agp_bridge->gatt_table = NULL;
809
810 agp_bridge->gatt_bus_addr = temp;
811
812 return 0;
813}
814
815/* Return the gatt table to a sane state. Use the top of stolen
816 * memory for the GTT.
817 */
818static int intel_i830_free_gatt_table(struct agp_bridge_data *bridge)
819{
820 return 0;
821}
822
823static int intel_i830_fetch_size(void)
824{
825 u16 gmch_ctrl;
826 struct aper_size_info_fixed *values;
827
828 values = A_SIZE_FIX(agp_bridge->driver->aperture_sizes);
829
830 if (agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82830_HB &&
831 agp_bridge->dev->device != PCI_DEVICE_ID_INTEL_82845G_HB) {
832 /* 855GM/852GM/865G has 128MB aperture size */
Daniel Vettere1583162010-04-14 00:29:58 +0200833 agp_bridge->current_size = (void *) values;
Daniel Vetterf51b7662010-04-14 00:29:52 +0200834 agp_bridge->aperture_size_idx = 0;
835 return values[0].size;
836 }
837
838 pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
839
840 if ((gmch_ctrl & I830_GMCH_MEM_MASK) == I830_GMCH_MEM_128M) {
Daniel Vettere1583162010-04-14 00:29:58 +0200841 agp_bridge->current_size = (void *) values;
Daniel Vetterf51b7662010-04-14 00:29:52 +0200842 agp_bridge->aperture_size_idx = 0;
843 return values[0].size;
844 } else {
Daniel Vettere1583162010-04-14 00:29:58 +0200845 agp_bridge->current_size = (void *) (values + 1);
Daniel Vetterf51b7662010-04-14 00:29:52 +0200846 agp_bridge->aperture_size_idx = 1;
847 return values[1].size;
848 }
849
850 return 0;
851}
852
853static int intel_i830_configure(void)
854{
855 struct aper_size_info_fixed *current_size;
856 u32 temp;
857 u16 gmch_ctrl;
858 int i;
859
860 current_size = A_SIZE_FIX(agp_bridge->current_size);
861
862 pci_read_config_dword(intel_private.pcidev, I810_GMADDR, &temp);
863 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
864
865 pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
866 gmch_ctrl |= I830_GMCH_ENABLED;
867 pci_write_config_word(agp_bridge->dev, I830_GMCH_CTRL, gmch_ctrl);
868
869 writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL);
870 readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
871
872 if (agp_bridge->driver->needs_scratch_page) {
873 for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) {
874 writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
875 }
876 readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI Posting. */
877 }
878
879 global_cache_flush();
880
881 intel_i830_setup_flush();
882 return 0;
883}
884
885static void intel_i830_cleanup(void)
886{
887 iounmap(intel_private.registers);
888}
889
890static int intel_i830_insert_entries(struct agp_memory *mem, off_t pg_start,
891 int type)
892{
893 int i, j, num_entries;
894 void *temp;
895 int ret = -EINVAL;
896 int mask_type;
897
898 if (mem->page_count == 0)
899 goto out;
900
901 temp = agp_bridge->current_size;
902 num_entries = A_SIZE_FIX(temp)->num_entries;
903
904 if (pg_start < intel_private.gtt_entries) {
905 dev_printk(KERN_DEBUG, &intel_private.pcidev->dev,
906 "pg_start == 0x%.8lx, intel_private.gtt_entries == 0x%.8x\n",
907 pg_start, intel_private.gtt_entries);
908
909 dev_info(&intel_private.pcidev->dev,
910 "trying to insert into local/stolen memory\n");
911 goto out_err;
912 }
913
914 if ((pg_start + mem->page_count) > num_entries)
915 goto out_err;
916
917 /* The i830 can't check the GTT for entries since its read only,
918 * depend on the caller to make the correct offset decisions.
919 */
920
921 if (type != mem->type)
922 goto out_err;
923
924 mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
925
926 if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
927 mask_type != INTEL_AGP_CACHED_MEMORY)
928 goto out_err;
929
930 if (!mem->is_flushed)
931 global_cache_flush();
932
933 for (i = 0, j = pg_start; i < mem->page_count; i++, j++) {
934 writel(agp_bridge->driver->mask_memory(agp_bridge,
935 page_to_phys(mem->pages[i]), mask_type),
936 intel_private.registers+I810_PTE_BASE+(j*4));
937 }
938 readl(intel_private.registers+I810_PTE_BASE+((j-1)*4));
Daniel Vetterf51b7662010-04-14 00:29:52 +0200939
940out:
941 ret = 0;
942out_err:
943 mem->is_flushed = true;
944 return ret;
945}
946
947static int intel_i830_remove_entries(struct agp_memory *mem, off_t pg_start,
948 int type)
949{
950 int i;
951
952 if (mem->page_count == 0)
953 return 0;
954
955 if (pg_start < intel_private.gtt_entries) {
956 dev_info(&intel_private.pcidev->dev,
957 "trying to disable local/stolen memory\n");
958 return -EINVAL;
959 }
960
961 for (i = pg_start; i < (mem->page_count + pg_start); i++) {
962 writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
963 }
964 readl(intel_private.registers+I810_PTE_BASE+((i-1)*4));
965
Daniel Vetterf51b7662010-04-14 00:29:52 +0200966 return 0;
967}
968
969static struct agp_memory *intel_i830_alloc_by_type(size_t pg_count, int type)
970{
971 if (type == AGP_PHYS_MEMORY)
972 return alloc_agpphysmem_i8xx(pg_count, type);
973 /* always return NULL for other allocation types for now */
974 return NULL;
975}
976
977static int intel_alloc_chipset_flush_resource(void)
978{
979 int ret;
980 ret = pci_bus_alloc_resource(agp_bridge->dev->bus, &intel_private.ifp_resource, PAGE_SIZE,
981 PAGE_SIZE, PCIBIOS_MIN_MEM, 0,
982 pcibios_align_resource, agp_bridge->dev);
983
984 return ret;
985}
986
987static void intel_i915_setup_chipset_flush(void)
988{
989 int ret;
990 u32 temp;
991
992 pci_read_config_dword(agp_bridge->dev, I915_IFPADDR, &temp);
993 if (!(temp & 0x1)) {
994 intel_alloc_chipset_flush_resource();
995 intel_private.resource_valid = 1;
996 pci_write_config_dword(agp_bridge->dev, I915_IFPADDR, (intel_private.ifp_resource.start & 0xffffffff) | 0x1);
997 } else {
998 temp &= ~1;
999
1000 intel_private.resource_valid = 1;
1001 intel_private.ifp_resource.start = temp;
1002 intel_private.ifp_resource.end = temp + PAGE_SIZE;
1003 ret = request_resource(&iomem_resource, &intel_private.ifp_resource);
1004 /* some BIOSes reserve this area in a pnp some don't */
1005 if (ret)
1006 intel_private.resource_valid = 0;
1007 }
1008}
1009
1010static void intel_i965_g33_setup_chipset_flush(void)
1011{
1012 u32 temp_hi, temp_lo;
1013 int ret;
1014
1015 pci_read_config_dword(agp_bridge->dev, I965_IFPADDR + 4, &temp_hi);
1016 pci_read_config_dword(agp_bridge->dev, I965_IFPADDR, &temp_lo);
1017
1018 if (!(temp_lo & 0x1)) {
1019
1020 intel_alloc_chipset_flush_resource();
1021
1022 intel_private.resource_valid = 1;
1023 pci_write_config_dword(agp_bridge->dev, I965_IFPADDR + 4,
1024 upper_32_bits(intel_private.ifp_resource.start));
1025 pci_write_config_dword(agp_bridge->dev, I965_IFPADDR, (intel_private.ifp_resource.start & 0xffffffff) | 0x1);
1026 } else {
1027 u64 l64;
1028
1029 temp_lo &= ~0x1;
1030 l64 = ((u64)temp_hi << 32) | temp_lo;
1031
1032 intel_private.resource_valid = 1;
1033 intel_private.ifp_resource.start = l64;
1034 intel_private.ifp_resource.end = l64 + PAGE_SIZE;
1035 ret = request_resource(&iomem_resource, &intel_private.ifp_resource);
1036 /* some BIOSes reserve this area in a pnp some don't */
1037 if (ret)
1038 intel_private.resource_valid = 0;
1039 }
1040}
1041
1042static void intel_i9xx_setup_flush(void)
1043{
1044 /* return if already configured */
1045 if (intel_private.ifp_resource.start)
1046 return;
1047
1048 if (IS_SNB)
1049 return;
1050
1051 /* setup a resource for this object */
1052 intel_private.ifp_resource.name = "Intel Flush Page";
1053 intel_private.ifp_resource.flags = IORESOURCE_MEM;
1054
1055 /* Setup chipset flush for 915 */
1056 if (IS_I965 || IS_G33 || IS_G4X) {
1057 intel_i965_g33_setup_chipset_flush();
1058 } else {
1059 intel_i915_setup_chipset_flush();
1060 }
1061
1062 if (intel_private.ifp_resource.start) {
1063 intel_private.i9xx_flush_page = ioremap_nocache(intel_private.ifp_resource.start, PAGE_SIZE);
1064 if (!intel_private.i9xx_flush_page)
1065 dev_info(&intel_private.pcidev->dev, "can't ioremap flush page - no chipset flushing");
1066 }
1067}
1068
Chris Wilsonf1befe72010-05-18 12:24:51 +01001069static int intel_i9xx_configure(void)
Daniel Vetterf51b7662010-04-14 00:29:52 +02001070{
1071 struct aper_size_info_fixed *current_size;
1072 u32 temp;
1073 u16 gmch_ctrl;
1074 int i;
1075
1076 current_size = A_SIZE_FIX(agp_bridge->current_size);
1077
1078 pci_read_config_dword(intel_private.pcidev, I915_GMADDR, &temp);
1079
1080 agp_bridge->gart_bus_addr = (temp & PCI_BASE_ADDRESS_MEM_MASK);
1081
1082 pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
1083 gmch_ctrl |= I830_GMCH_ENABLED;
1084 pci_write_config_word(agp_bridge->dev, I830_GMCH_CTRL, gmch_ctrl);
1085
1086 writel(agp_bridge->gatt_bus_addr|I810_PGETBL_ENABLED, intel_private.registers+I810_PGETBL_CTL);
1087 readl(intel_private.registers+I810_PGETBL_CTL); /* PCI Posting. */
1088
1089 if (agp_bridge->driver->needs_scratch_page) {
1090 for (i = intel_private.gtt_entries; i < intel_private.gtt_total_size; i++) {
1091 writel(agp_bridge->scratch_page, intel_private.gtt+i);
1092 }
1093 readl(intel_private.gtt+i-1); /* PCI Posting. */
1094 }
1095
1096 global_cache_flush();
1097
1098 intel_i9xx_setup_flush();
1099
1100 return 0;
1101}
1102
1103static void intel_i915_cleanup(void)
1104{
1105 if (intel_private.i9xx_flush_page)
1106 iounmap(intel_private.i9xx_flush_page);
1107 if (intel_private.resource_valid)
1108 release_resource(&intel_private.ifp_resource);
1109 intel_private.ifp_resource.start = 0;
1110 intel_private.resource_valid = 0;
1111 iounmap(intel_private.gtt);
1112 iounmap(intel_private.registers);
1113}
1114
1115static void intel_i915_chipset_flush(struct agp_bridge_data *bridge)
1116{
1117 if (intel_private.i9xx_flush_page)
1118 writel(1, intel_private.i9xx_flush_page);
1119}
1120
1121static int intel_i915_insert_entries(struct agp_memory *mem, off_t pg_start,
1122 int type)
1123{
1124 int num_entries;
1125 void *temp;
1126 int ret = -EINVAL;
1127 int mask_type;
1128
1129 if (mem->page_count == 0)
1130 goto out;
1131
1132 temp = agp_bridge->current_size;
1133 num_entries = A_SIZE_FIX(temp)->num_entries;
1134
1135 if (pg_start < intel_private.gtt_entries) {
1136 dev_printk(KERN_DEBUG, &intel_private.pcidev->dev,
1137 "pg_start == 0x%.8lx, intel_private.gtt_entries == 0x%.8x\n",
1138 pg_start, intel_private.gtt_entries);
1139
1140 dev_info(&intel_private.pcidev->dev,
1141 "trying to insert into local/stolen memory\n");
1142 goto out_err;
1143 }
1144
1145 if ((pg_start + mem->page_count) > num_entries)
1146 goto out_err;
1147
1148 /* The i915 can't check the GTT for entries since it's read only;
1149 * depend on the caller to make the correct offset decisions.
1150 */
1151
1152 if (type != mem->type)
1153 goto out_err;
1154
1155 mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type);
1156
1157 if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY &&
1158 mask_type != INTEL_AGP_CACHED_MEMORY)
1159 goto out_err;
1160
1161 if (!mem->is_flushed)
1162 global_cache_flush();
1163
1164 intel_agp_insert_sg_entries(mem, pg_start, mask_type);
Daniel Vetterf51b7662010-04-14 00:29:52 +02001165
1166 out:
1167 ret = 0;
1168 out_err:
1169 mem->is_flushed = true;
1170 return ret;
1171}
1172
1173static int intel_i915_remove_entries(struct agp_memory *mem, off_t pg_start,
1174 int type)
1175{
1176 int i;
1177
1178 if (mem->page_count == 0)
1179 return 0;
1180
1181 if (pg_start < intel_private.gtt_entries) {
1182 dev_info(&intel_private.pcidev->dev,
1183 "trying to disable local/stolen memory\n");
1184 return -EINVAL;
1185 }
1186
1187 for (i = pg_start; i < (mem->page_count + pg_start); i++)
1188 writel(agp_bridge->scratch_page, intel_private.gtt+i);
1189
1190 readl(intel_private.gtt+i-1);
1191
Daniel Vetterf51b7662010-04-14 00:29:52 +02001192 return 0;
1193}
1194
1195/* Return the aperture size by just checking the resource length. The effect
1196 * described in the spec of the MSAC registers is just changing of the
1197 * resource size.
1198 */
1199static int intel_i9xx_fetch_size(void)
1200{
1201 int num_sizes = ARRAY_SIZE(intel_i830_sizes);
1202 int aper_size; /* size in megabytes */
1203 int i;
1204
1205 aper_size = pci_resource_len(intel_private.pcidev, 2) / MB(1);
1206
1207 for (i = 0; i < num_sizes; i++) {
1208 if (aper_size == intel_i830_sizes[i].size) {
1209 agp_bridge->current_size = intel_i830_sizes + i;
Daniel Vetterf51b7662010-04-14 00:29:52 +02001210 return aper_size;
1211 }
1212 }
1213
1214 return 0;
1215}
1216
Chris Wilsonf1befe72010-05-18 12:24:51 +01001217static int intel_i915_get_gtt_size(void)
1218{
1219 int size;
1220
1221 if (IS_G33) {
1222 u16 gmch_ctrl;
1223
1224 /* G33's GTT size defined in gmch_ctrl */
1225 pci_read_config_word(agp_bridge->dev, I830_GMCH_CTRL, &gmch_ctrl);
Tim Gardnere7b96f22010-07-09 14:48:50 -06001226 switch (gmch_ctrl & I830_GMCH_GMS_MASK) {
1227 case I830_GMCH_GMS_STOLEN_512:
1228 size = 512;
1229 break;
1230 case I830_GMCH_GMS_STOLEN_1024:
Chris Wilsonf1befe72010-05-18 12:24:51 +01001231 size = 1024;
1232 break;
Tim Gardnere7b96f22010-07-09 14:48:50 -06001233 case I830_GMCH_GMS_STOLEN_8192:
1234 size = 8*1024;
Chris Wilsonf1befe72010-05-18 12:24:51 +01001235 break;
1236 default:
1237 dev_info(&agp_bridge->dev->dev,
1238 "unknown page table size 0x%x, assuming 512KB\n",
Tim Gardnere7b96f22010-07-09 14:48:50 -06001239 (gmch_ctrl & I830_GMCH_GMS_MASK));
Chris Wilsonf1befe72010-05-18 12:24:51 +01001240 size = 512;
1241 }
1242 } else {
1243 /* On previous hardware, the GTT size was just what was
1244 * required to map the aperture.
1245 */
1246 size = agp_bridge->driver->fetch_size();
1247 }
1248
1249 return KB(size);
1250}
1251
Daniel Vetterf51b7662010-04-14 00:29:52 +02001252/* The intel i915 automatically initializes the agp aperture during POST.
1253 * Use the memory already set aside for in the GTT.
1254 */
1255static int intel_i915_create_gatt_table(struct agp_bridge_data *bridge)
1256{
1257 int page_order;
1258 struct aper_size_info_fixed *size;
1259 int num_entries;
1260 u32 temp, temp2;
Chris Wilsonf1befe72010-05-18 12:24:51 +01001261 int gtt_map_size;
Daniel Vetterf51b7662010-04-14 00:29:52 +02001262
1263 size = agp_bridge->current_size;
1264 page_order = size->page_order;
1265 num_entries = size->num_entries;
1266 agp_bridge->gatt_table_real = NULL;
1267
1268 pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);
1269 pci_read_config_dword(intel_private.pcidev, I915_PTEADDR, &temp2);
1270
Chris Wilsonf1befe72010-05-18 12:24:51 +01001271 gtt_map_size = intel_i915_get_gtt_size();
1272
Daniel Vetterf51b7662010-04-14 00:29:52 +02001273 intel_private.gtt = ioremap(temp2, gtt_map_size);
1274 if (!intel_private.gtt)
1275 return -ENOMEM;
1276
1277 intel_private.gtt_total_size = gtt_map_size / 4;
1278
1279 temp &= 0xfff80000;
1280
1281 intel_private.registers = ioremap(temp, 128 * 4096);
1282 if (!intel_private.registers) {
1283 iounmap(intel_private.gtt);
1284 return -ENOMEM;
1285 }
1286
1287 temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
1288 global_cache_flush(); /* FIXME: ? */
1289
1290 /* we have to call this as early as possible after the MMIO base address is known */
1291 intel_i830_init_gtt_entries();
Ondrej Zary8699be32010-06-16 10:13:52 +02001292 if (intel_private.gtt_entries == 0) {
1293 iounmap(intel_private.gtt);
1294 iounmap(intel_private.registers);
1295 return -ENOMEM;
1296 }
Daniel Vetterf51b7662010-04-14 00:29:52 +02001297
1298 agp_bridge->gatt_table = NULL;
1299
1300 agp_bridge->gatt_bus_addr = temp;
1301
1302 return 0;
1303}
1304
1305/*
1306 * The i965 supports 36-bit physical addresses, but to keep
1307 * the format of the GTT the same, the bits that don't fit
1308 * in a 32-bit word are shifted down to bits 4..7.
1309 *
1310 * Gcc is smart enough to notice that "(addr >> 28) & 0xf0"
1311 * is always zero on 32-bit architectures, so no need to make
1312 * this conditional.
1313 */
1314static unsigned long intel_i965_mask_memory(struct agp_bridge_data *bridge,
1315 dma_addr_t addr, int type)
1316{
1317 /* Shift high bits down */
1318 addr |= (addr >> 28) & 0xf0;
1319
1320 /* Type checking must be done elsewhere */
1321 return addr | bridge->driver->masks[type].mask;
1322}
1323
Zhenyu Wang3869d4a2010-07-09 10:40:58 -07001324static unsigned long intel_gen6_mask_memory(struct agp_bridge_data *bridge,
1325 dma_addr_t addr, int type)
1326{
1327 /* Shift high bits down */
1328 addr |= (addr >> 28) & 0xff;
1329
1330 /* Type checking must be done elsewhere */
1331 return addr | bridge->driver->masks[type].mask;
1332}
1333
Daniel Vetterf51b7662010-04-14 00:29:52 +02001334static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size)
1335{
1336 u16 snb_gmch_ctl;
1337
1338 switch (agp_bridge->dev->device) {
1339 case PCI_DEVICE_ID_INTEL_GM45_HB:
1340 case PCI_DEVICE_ID_INTEL_EAGLELAKE_HB:
1341 case PCI_DEVICE_ID_INTEL_Q45_HB:
1342 case PCI_DEVICE_ID_INTEL_G45_HB:
1343 case PCI_DEVICE_ID_INTEL_G41_HB:
1344 case PCI_DEVICE_ID_INTEL_B43_HB:
1345 case PCI_DEVICE_ID_INTEL_IRONLAKE_D_HB:
1346 case PCI_DEVICE_ID_INTEL_IRONLAKE_M_HB:
1347 case PCI_DEVICE_ID_INTEL_IRONLAKE_MA_HB:
1348 case PCI_DEVICE_ID_INTEL_IRONLAKE_MC2_HB:
1349 *gtt_offset = *gtt_size = MB(2);
1350 break;
1351 case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB:
1352 case PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB:
1353 *gtt_offset = MB(2);
1354
1355 pci_read_config_word(intel_private.pcidev, SNB_GMCH_CTRL, &snb_gmch_ctl);
1356 switch (snb_gmch_ctl & SNB_GTT_SIZE_MASK) {
1357 default:
1358 case SNB_GTT_SIZE_0M:
1359 printk(KERN_ERR "Bad GTT size mask: 0x%04x.\n", snb_gmch_ctl);
1360 *gtt_size = MB(0);
1361 break;
1362 case SNB_GTT_SIZE_1M:
1363 *gtt_size = MB(1);
1364 break;
1365 case SNB_GTT_SIZE_2M:
1366 *gtt_size = MB(2);
1367 break;
1368 }
1369 break;
1370 default:
1371 *gtt_offset = *gtt_size = KB(512);
1372 }
1373}
1374
1375/* The intel i965 automatically initializes the agp aperture during POST.
1376 * Use the memory already set aside for in the GTT.
1377 */
1378static int intel_i965_create_gatt_table(struct agp_bridge_data *bridge)
1379{
1380 int page_order;
1381 struct aper_size_info_fixed *size;
1382 int num_entries;
1383 u32 temp;
1384 int gtt_offset, gtt_size;
1385
1386 size = agp_bridge->current_size;
1387 page_order = size->page_order;
1388 num_entries = size->num_entries;
1389 agp_bridge->gatt_table_real = NULL;
1390
1391 pci_read_config_dword(intel_private.pcidev, I915_MMADDR, &temp);
1392
1393 temp &= 0xfff00000;
1394
1395 intel_i965_get_gtt_range(&gtt_offset, &gtt_size);
1396
1397 intel_private.gtt = ioremap((temp + gtt_offset) , gtt_size);
1398
1399 if (!intel_private.gtt)
1400 return -ENOMEM;
1401
1402 intel_private.gtt_total_size = gtt_size / 4;
1403
1404 intel_private.registers = ioremap(temp, 128 * 4096);
1405 if (!intel_private.registers) {
1406 iounmap(intel_private.gtt);
1407 return -ENOMEM;
1408 }
1409
1410 temp = readl(intel_private.registers+I810_PGETBL_CTL) & 0xfffff000;
1411 global_cache_flush(); /* FIXME: ? */
1412
1413 /* we have to call this as early as possible after the MMIO base address is known */
1414 intel_i830_init_gtt_entries();
Ondrej Zary8699be32010-06-16 10:13:52 +02001415 if (intel_private.gtt_entries == 0) {
1416 iounmap(intel_private.gtt);
1417 iounmap(intel_private.registers);
1418 return -ENOMEM;
1419 }
Daniel Vetterf51b7662010-04-14 00:29:52 +02001420
1421 agp_bridge->gatt_table = NULL;
1422
1423 agp_bridge->gatt_bus_addr = temp;
1424
1425 return 0;
1426}
1427
1428static const struct agp_bridge_driver intel_810_driver = {
1429 .owner = THIS_MODULE,
1430 .aperture_sizes = intel_i810_sizes,
1431 .size_type = FIXED_APER_SIZE,
1432 .num_aperture_sizes = 2,
1433 .needs_scratch_page = true,
1434 .configure = intel_i810_configure,
1435 .fetch_size = intel_i810_fetch_size,
1436 .cleanup = intel_i810_cleanup,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001437 .mask_memory = intel_i810_mask_memory,
1438 .masks = intel_i810_masks,
1439 .agp_enable = intel_i810_agp_enable,
1440 .cache_flush = global_cache_flush,
1441 .create_gatt_table = agp_generic_create_gatt_table,
1442 .free_gatt_table = agp_generic_free_gatt_table,
1443 .insert_memory = intel_i810_insert_entries,
1444 .remove_memory = intel_i810_remove_entries,
1445 .alloc_by_type = intel_i810_alloc_by_type,
1446 .free_by_type = intel_i810_free_by_type,
1447 .agp_alloc_page = agp_generic_alloc_page,
1448 .agp_alloc_pages = agp_generic_alloc_pages,
1449 .agp_destroy_page = agp_generic_destroy_page,
1450 .agp_destroy_pages = agp_generic_destroy_pages,
1451 .agp_type_to_mask_type = agp_generic_type_to_mask_type,
1452};
1453
1454static const struct agp_bridge_driver intel_830_driver = {
1455 .owner = THIS_MODULE,
1456 .aperture_sizes = intel_i830_sizes,
1457 .size_type = FIXED_APER_SIZE,
1458 .num_aperture_sizes = 4,
1459 .needs_scratch_page = true,
1460 .configure = intel_i830_configure,
1461 .fetch_size = intel_i830_fetch_size,
1462 .cleanup = intel_i830_cleanup,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001463 .mask_memory = intel_i810_mask_memory,
1464 .masks = intel_i810_masks,
1465 .agp_enable = intel_i810_agp_enable,
1466 .cache_flush = global_cache_flush,
1467 .create_gatt_table = intel_i830_create_gatt_table,
1468 .free_gatt_table = intel_i830_free_gatt_table,
1469 .insert_memory = intel_i830_insert_entries,
1470 .remove_memory = intel_i830_remove_entries,
1471 .alloc_by_type = intel_i830_alloc_by_type,
1472 .free_by_type = intel_i810_free_by_type,
1473 .agp_alloc_page = agp_generic_alloc_page,
1474 .agp_alloc_pages = agp_generic_alloc_pages,
1475 .agp_destroy_page = agp_generic_destroy_page,
1476 .agp_destroy_pages = agp_generic_destroy_pages,
1477 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1478 .chipset_flush = intel_i830_chipset_flush,
1479};
1480
1481static const struct agp_bridge_driver intel_915_driver = {
1482 .owner = THIS_MODULE,
1483 .aperture_sizes = intel_i830_sizes,
1484 .size_type = FIXED_APER_SIZE,
1485 .num_aperture_sizes = 4,
1486 .needs_scratch_page = true,
Chris Wilsonf1befe72010-05-18 12:24:51 +01001487 .configure = intel_i9xx_configure,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001488 .fetch_size = intel_i9xx_fetch_size,
1489 .cleanup = intel_i915_cleanup,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001490 .mask_memory = intel_i810_mask_memory,
1491 .masks = intel_i810_masks,
1492 .agp_enable = intel_i810_agp_enable,
1493 .cache_flush = global_cache_flush,
1494 .create_gatt_table = intel_i915_create_gatt_table,
1495 .free_gatt_table = intel_i830_free_gatt_table,
1496 .insert_memory = intel_i915_insert_entries,
1497 .remove_memory = intel_i915_remove_entries,
1498 .alloc_by_type = intel_i830_alloc_by_type,
1499 .free_by_type = intel_i810_free_by_type,
1500 .agp_alloc_page = agp_generic_alloc_page,
1501 .agp_alloc_pages = agp_generic_alloc_pages,
1502 .agp_destroy_page = agp_generic_destroy_page,
1503 .agp_destroy_pages = agp_generic_destroy_pages,
1504 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1505 .chipset_flush = intel_i915_chipset_flush,
1506#ifdef USE_PCI_DMA_API
1507 .agp_map_page = intel_agp_map_page,
1508 .agp_unmap_page = intel_agp_unmap_page,
1509 .agp_map_memory = intel_agp_map_memory,
1510 .agp_unmap_memory = intel_agp_unmap_memory,
1511#endif
1512};
1513
1514static const struct agp_bridge_driver intel_i965_driver = {
1515 .owner = THIS_MODULE,
1516 .aperture_sizes = intel_i830_sizes,
1517 .size_type = FIXED_APER_SIZE,
1518 .num_aperture_sizes = 4,
1519 .needs_scratch_page = true,
Chris Wilsonf1befe72010-05-18 12:24:51 +01001520 .configure = intel_i9xx_configure,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001521 .fetch_size = intel_i9xx_fetch_size,
1522 .cleanup = intel_i915_cleanup,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001523 .mask_memory = intel_i965_mask_memory,
1524 .masks = intel_i810_masks,
1525 .agp_enable = intel_i810_agp_enable,
1526 .cache_flush = global_cache_flush,
1527 .create_gatt_table = intel_i965_create_gatt_table,
1528 .free_gatt_table = intel_i830_free_gatt_table,
1529 .insert_memory = intel_i915_insert_entries,
1530 .remove_memory = intel_i915_remove_entries,
1531 .alloc_by_type = intel_i830_alloc_by_type,
1532 .free_by_type = intel_i810_free_by_type,
1533 .agp_alloc_page = agp_generic_alloc_page,
1534 .agp_alloc_pages = agp_generic_alloc_pages,
1535 .agp_destroy_page = agp_generic_destroy_page,
1536 .agp_destroy_pages = agp_generic_destroy_pages,
1537 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1538 .chipset_flush = intel_i915_chipset_flush,
1539#ifdef USE_PCI_DMA_API
1540 .agp_map_page = intel_agp_map_page,
1541 .agp_unmap_page = intel_agp_unmap_page,
1542 .agp_map_memory = intel_agp_map_memory,
1543 .agp_unmap_memory = intel_agp_unmap_memory,
1544#endif
1545};
1546
Zhenyu Wang3869d4a2010-07-09 10:40:58 -07001547static const struct agp_bridge_driver intel_gen6_driver = {
1548 .owner = THIS_MODULE,
1549 .aperture_sizes = intel_i830_sizes,
1550 .size_type = FIXED_APER_SIZE,
1551 .num_aperture_sizes = 4,
1552 .needs_scratch_page = true,
1553 .configure = intel_i9xx_configure,
1554 .fetch_size = intel_i9xx_fetch_size,
1555 .cleanup = intel_i915_cleanup,
1556 .mask_memory = intel_gen6_mask_memory,
1557 .masks = intel_i810_masks,
1558 .agp_enable = intel_i810_agp_enable,
1559 .cache_flush = global_cache_flush,
1560 .create_gatt_table = intel_i965_create_gatt_table,
1561 .free_gatt_table = intel_i830_free_gatt_table,
1562 .insert_memory = intel_i915_insert_entries,
1563 .remove_memory = intel_i915_remove_entries,
1564 .alloc_by_type = intel_i830_alloc_by_type,
1565 .free_by_type = intel_i810_free_by_type,
1566 .agp_alloc_page = agp_generic_alloc_page,
1567 .agp_alloc_pages = agp_generic_alloc_pages,
1568 .agp_destroy_page = agp_generic_destroy_page,
1569 .agp_destroy_pages = agp_generic_destroy_pages,
1570 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1571 .chipset_flush = intel_i915_chipset_flush,
1572#ifdef USE_PCI_DMA_API
1573 .agp_map_page = intel_agp_map_page,
1574 .agp_unmap_page = intel_agp_unmap_page,
1575 .agp_map_memory = intel_agp_map_memory,
1576 .agp_unmap_memory = intel_agp_unmap_memory,
1577#endif
1578};
1579
Daniel Vetterf51b7662010-04-14 00:29:52 +02001580static const struct agp_bridge_driver intel_g33_driver = {
1581 .owner = THIS_MODULE,
1582 .aperture_sizes = intel_i830_sizes,
1583 .size_type = FIXED_APER_SIZE,
1584 .num_aperture_sizes = 4,
1585 .needs_scratch_page = true,
Chris Wilsonf1befe72010-05-18 12:24:51 +01001586 .configure = intel_i9xx_configure,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001587 .fetch_size = intel_i9xx_fetch_size,
1588 .cleanup = intel_i915_cleanup,
Daniel Vetterf51b7662010-04-14 00:29:52 +02001589 .mask_memory = intel_i965_mask_memory,
1590 .masks = intel_i810_masks,
1591 .agp_enable = intel_i810_agp_enable,
1592 .cache_flush = global_cache_flush,
1593 .create_gatt_table = intel_i915_create_gatt_table,
1594 .free_gatt_table = intel_i830_free_gatt_table,
1595 .insert_memory = intel_i915_insert_entries,
1596 .remove_memory = intel_i915_remove_entries,
1597 .alloc_by_type = intel_i830_alloc_by_type,
1598 .free_by_type = intel_i810_free_by_type,
1599 .agp_alloc_page = agp_generic_alloc_page,
1600 .agp_alloc_pages = agp_generic_alloc_pages,
1601 .agp_destroy_page = agp_generic_destroy_page,
1602 .agp_destroy_pages = agp_generic_destroy_pages,
1603 .agp_type_to_mask_type = intel_i830_type_to_mask_type,
1604 .chipset_flush = intel_i915_chipset_flush,
1605#ifdef USE_PCI_DMA_API
1606 .agp_map_page = intel_agp_map_page,
1607 .agp_unmap_page = intel_agp_unmap_page,
1608 .agp_map_memory = intel_agp_map_memory,
1609 .agp_unmap_memory = intel_agp_unmap_memory,
1610#endif
1611};