Subversion Repositories Kolibri OS

Rev

Rev 1405 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1029 serge 1
 
2
#include "link.h"
3
4
 
5
#include 
6
#include 
7
8
 
9
#include "agp.h"
10
11
 
12
13
 
14
 
15
16
 
17
 
18
19
 
20
 
21
{
22
    u32_t retval;
23
24
 
25
26
 
27
        return 0;
28
29
 
9583 vitalkrilo 30
    {
1029 serge 31
        printf("Can't open /sys/drivers/agp.log\nExit\n");
9583 vitalkrilo 32
        return 0;
1029 serge 33
    }
34
35
 
36
    {
37
        dbgprintf("Device not found\n");
38
        return 0;
39
    };
40
41
 
42
43
 
44
//    dbgprintf("reg service %s as: %x\n", "HDRAW", retval);
45
46
 
47
};
48
49
 
50
 
51
#include "isoch.inc"
52
53
 
54
{
55
    u32_t temp;
56
57
 
58
    pciWriteLong(bridge->PciTag, INTEL_AGPCTRL, temp & ~(1 << 7));
59
    temp = pciReadLong(bridge->PciTag, INTEL_AGPCTRL);
60
    pciWriteLong(bridge->PciTag, INTEL_AGPCTRL, temp | (1 << 7));
61
}
62
63
 
64
 
65
{
66
    { 256, 65536, 64,  0 },
67
    { 128, 32768, 32, 32 },
68
    {  64, 16384, 16, 48 },
69
    {  32,  8192,  8, 56 },
70
    {  16,  4096,  4, 60 },
71
    {   8,  2048,  2, 62 },
72
    {   4,  1024,  1, 63 }
73
};
74
75
 
76
 
77
 
78
{
79
    u32_t temp;
80
    u8_t  temp2;
81
    aper_size_t *current_size;
82
83
 
84
85
 
86
    pciWriteByte(bridge->PciTag, INTEL_APSIZE, current_size->size_value);
87
88
 
89
90
 
91
    {
92
        pciWriteLong(bridge->PciTag, AGP_APBASE, bridge->apbase_config);
93
    }
94
    else
95
    {
96
		/* address to map to */
97
        temp = pciReadLong(bridge->PciTag, AGP_APBASE);
98
        bridge->gart_addr = (temp & PCI_MAP_MEMORY_ADDRESS_MASK);
99
        bridge->apbase_config = temp;
100
	}
101
102
 
103
104
 
105
    pciWriteLong(bridge->PciTag, INTEL_ATTBASE, bridge->gatt_dma);
106
107
 
108
    pciWriteLong(bridge->PciTag, INTEL_AGPCTRL, 0x0000);
109
110
 
111
    temp2 = pciReadByte(bridge->PciTag, INTEL_I845_AGPM);
112
    pciWriteByte(bridge->PciTag, INTEL_I845_AGPM, temp2 | (1 << 1));
113
	/* clear any possible error conditions */
114
    pciWriteWord(bridge->PciTag, INTEL_I845_ERRSTS, 0x001c);
115
	return 0;
116
}
117
118
 
119
 
120
{
121
    count_t pages;
122
123
 
124
125
 
126
    {
127
        if(bridge->gatt_table =
128
           (u32_t*)MapIoMem((void*)bridge->gatt_dma,
129
                            pages<<12, PG_SW+PG_NOCACHE))
130
        {
131
            dbgprintf("gatt map %x at %x %d pages\n",bridge->gatt_dma ,
132
                       bridge->gatt_table, pages);
133
134
 
135
136
 
137
138
 
139
140
 
141
                addr_t tmp;
142
143
 
144
                table++;
145
            }
146
            return 1;
147
        };
148
    };
149
    dbgprintf("unable to get memory for "
150
              "graphics translation table.\n");
151
	return 0;
152
}
153
154
 
155
 
156
{
157
	int i;
158
    aper_size_t *values;
159
160
 
161
162
 
163
164
 
165
    {
166
        if (temp == values[i].size_value)
167
        {
168
            bridge->previous_size =
169
                bridge->current_size = (void *) (values + i);
170
            bridge->aperture_size_idx = i;
171
			return values[i].size;
172
		}
173
	}
174
	return 0;
175
}
176
177
 
178
{
179
    u8_t temp;
180
181
 
182
	return __intel_8xx_fetch_size(temp);
183
}
184
185
 
186
 
187
{
188
	int ret_val;
189
    count_t count;
190
191
 
192
//        return -EINVAL;
193
194
 
195
//        printk(KERN_INFO PFX "memory %p is already bound!\n", curr);
196
//        return -EINVAL;
197
//    }
198
//    if (curr->is_flushed == FALSE) {
199
//        curr->bridge->driver->cache_flush();
200
//        curr->is_flushed = TRUE;
201
//    }
202
//    ret_val = curr->bridge->driver->insert_memory(curr, pg_start, curr->type);
203
204
 
205
206
 
207
208
 
209
210
 
211
    {
212
        *table = dma_addr;
213
        table++;
214
        dma_addr+=4096;
215
    }
216
217
 
218
219
 
220
//        return ret_val;
221
222
 
223
//    curr->pg_start = pg_start;
224
	return 0;
225
}
226
227
 
228
{
229
    u32_t ncapid;
230
231
 
232
	if (bridge->major_version != 0)
233
		return;
234
235
 
236
	bridge->major_version = (ncapid >> AGP_MAJOR_VERSION_SHIFT) & 0xf;
237
	bridge->minor_version = (ncapid >> AGP_MINOR_VERSION_SHIFT) & 0xf;
238
}
239
240
 
241
{
242
    u32_t tmp;
243
244
 
245
        dbgprintf("reserved bits set (%x) in mode 0x%x. Fixed.\n",
246
			*requested_mode & AGP2_RESERVED_MASK, *requested_mode);
247
		*requested_mode &= ~AGP2_RESERVED_MASK;
248
	}
249
250
 
251
	tmp = *requested_mode & 7;
252
	switch (tmp) {
253
		case 0:
254
            dbgprintf("Setting to x1 mode.\n");
255
			*requested_mode |= AGPSTAT2_1X;
256
			break;
257
		case 1:
258
		case 2:
259
			break;
260
		case 3:
261
			*requested_mode &= ~(AGPSTAT2_1X);	/* rate=2 */
262
			break;
263
		case 4:
264
			break;
265
		case 5:
266
		case 6:
267
		case 7:
268
			*requested_mode &= ~(AGPSTAT2_1X|AGPSTAT2_2X); /* rate=4*/
269
			break;
270
	}
271
272
 
273
	if (!((*bridge_agpstat & AGPSTAT_SBA) && (*vga_agpstat & AGPSTAT_SBA) && (*requested_mode & AGPSTAT_SBA)))
274
		*bridge_agpstat &= ~AGPSTAT_SBA;
275
276
 
277
	if (!((*bridge_agpstat & AGPSTAT2_4X) && (*vga_agpstat & AGPSTAT2_4X) && (*requested_mode & AGPSTAT2_4X)))
278
		*bridge_agpstat &= ~AGPSTAT2_4X;
279
280
 
281
		*bridge_agpstat &= ~AGPSTAT2_2X;
282
283
 
284
		*bridge_agpstat &= ~AGPSTAT2_1X;
285
286
 
287
	if (*bridge_agpstat & AGPSTAT2_4X)
288
		*bridge_agpstat &= ~(AGPSTAT2_1X | AGPSTAT2_2X);	/* 4X */
289
290
 
291
		*bridge_agpstat &= ~(AGPSTAT2_1X | AGPSTAT2_4X);	/* 2X */
292
293
 
294
		*bridge_agpstat &= ~(AGPSTAT2_2X | AGPSTAT2_4X);	/* 1X */
295
296
 
297
    if (bridge->flags & AGP_ERRATA_FASTWRITES)
298
		*bridge_agpstat &= ~AGPSTAT_FW;
299
300
 
301
		*bridge_agpstat &= ~AGPSTAT_SBA;
302
303
 
304
		*bridge_agpstat &= ~(AGPSTAT2_2X | AGPSTAT2_4X);
305
		*bridge_agpstat |= AGPSTAT2_1X;
306
	}
307
308
 
309
	if (*bridge_agpstat & AGPSTAT2_1X)
310
		*bridge_agpstat &= ~AGPSTAT_FW;
311
}
312
313
 
314
 
315
                             u32_t *bridge_agpstat,
316
                             u32_t *vga_agpstat)
317
{
318
    u32_t origbridge = *bridge_agpstat, origvga = *vga_agpstat;
319
    u32_t tmp;
320
321
 
322
    {
323
        dbgprintf("reserved bits set (%x) in mode 0x%x. Fixed.\n",
324
			*requested_mode & AGP3_RESERVED_MASK, *requested_mode);
325
		*requested_mode &= ~AGP3_RESERVED_MASK;
326
	}
327
328
 
329
	tmp = *requested_mode & 7;
330
	if (tmp == 0) {
331
        dbgprintf("Setting to AGP3 x4 mode.\n");
332
		*requested_mode |= AGPSTAT3_4X;
333
	}
334
	if (tmp >= 3) {
335
        dbgprintf("Setting to AGP3 x8 mode.\n");
336
		*requested_mode = (*requested_mode & ~7) | AGPSTAT3_8X;
337
	}
338
339
 
340
	 * Don't allow the mode register to override values. */
341
	*bridge_agpstat = ((*bridge_agpstat & ~AGPSTAT_ARQSZ) |
342
        max_t(u32_t,(*bridge_agpstat & AGPSTAT_ARQSZ),(*vga_agpstat & AGPSTAT_ARQSZ)));
343
344
 
345
	 * Don't allow the mode register to override values. */
346
	*bridge_agpstat = ((*bridge_agpstat & ~AGPSTAT_CAL_MASK) |
347
        min_t(u32_t,(*bridge_agpstat & AGPSTAT_CAL_MASK),(*vga_agpstat & AGPSTAT_CAL_MASK)));
348
349
 
350
	*bridge_agpstat |= AGPSTAT_SBA;
351
352
 
353
	 * Set speed.
354
	 * Check for invalid speeds. This can happen when applications
355
	 * written before the AGP 3.0 standard pass AGP2.x modes to AGP3 hardware
356
	 */
357
	if (*requested_mode & AGPSTAT_MODE_3_0) {
358
		/*
359
		 * Caller hasn't a clue what it is doing. Bridge is in 3.0 mode,
360
		 * have been passed a 3.0 mode, but with 2.x speed bits set.
361
		 * AGP2.x 4x -> AGP3.0 4x.
362
		 */
363
		if (*requested_mode & AGPSTAT2_4X) {
364
            dbgprintf("broken AGP3 flags (%x). Fixed.\n", *requested_mode);
365
			*requested_mode &= ~AGPSTAT2_4X;
366
			*requested_mode |= AGPSTAT3_4X;
367
		}
368
	} else {
369
		/*
370
		 * The caller doesn't know what they are doing. We are in 3.0 mode,
371
		 * but have been passed an AGP 2.x mode.
372
		 * Convert AGP 1x,2x,4x -> AGP 3.0 4x.
373
		 */
374
        dbgprintf("broken AGP2 flags (%x) in AGP3 mode. Fixed.\n",*requested_mode);
375
		*requested_mode &= ~(AGPSTAT2_4X | AGPSTAT2_2X | AGPSTAT2_1X);
376
		*requested_mode |= AGPSTAT3_4X;
377
	}
378
379
 
380
		if (!(*bridge_agpstat & AGPSTAT3_8X)) {
381
			*bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
382
			*bridge_agpstat |= AGPSTAT3_4X;
383
            dbgprintf("requested AGPx8 but bridge not capable.\n");
384
			return;
385
		}
386
		if (!(*vga_agpstat & AGPSTAT3_8X)) {
387
			*bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
388
			*bridge_agpstat |= AGPSTAT3_4X;
389
            dbgprintf("requested AGPx8 but graphic card not capable.\n");
390
			return;
391
		}
392
		/* All set, bridge & device can do AGP x8*/
393
		*bridge_agpstat &= ~(AGPSTAT3_4X | AGPSTAT3_RSVD);
394
		goto done;
395
396
 
397
398
 
399
		 * If we didn't specify AGPx8, we can only do x4.
400
		 * If the hardware can't do x4, we're up shit creek, and never
401
		 *  should have got this far.
402
		 */
403
		*bridge_agpstat &= ~(AGPSTAT3_8X | AGPSTAT3_RSVD);
404
		if ((*bridge_agpstat & AGPSTAT3_4X) && (*vga_agpstat & AGPSTAT3_4X))
405
			*bridge_agpstat |= AGPSTAT3_4X;
406
		else {
407
            dbgprintf("Badness. Don't know which AGP mode to set. "
408
							"[bridge_agpstat:%x vga_agpstat:%x fell back to:- bridge_agpstat:%x vga_agpstat:%x]\n",
409
							origbridge, origvga, *bridge_agpstat, *vga_agpstat);
410
			if (!(*bridge_agpstat & AGPSTAT3_4X))
411
                dbgprintf("Bridge couldn't do AGP x4.\n");
412
			if (!(*vga_agpstat & AGPSTAT3_4X))
413
                dbgprintf("Graphic card couldn't do AGP x4.\n");
414
			return;
415
		}
416
	}
417
418
 
419
	/* Apply any errata. */
420
    if (bridge->flags & AGP_ERRATA_FASTWRITES)
421
		*bridge_agpstat &= ~AGPSTAT_FW;
422
423
 
424
		*bridge_agpstat &= ~AGPSTAT_SBA;
425
426
 
427
		*bridge_agpstat &= ~(AGPSTAT2_2X | AGPSTAT2_4X);
428
		*bridge_agpstat |= AGPSTAT2_1X;
429
	}
430
}
431
432
 
433
 
434
                                u32_t bridge_agpstat)
435
{
436
    PCITAG  vgaTag;
437
    u32_t   vga_agpstat;
438
    int     cap_ptr;
439
440
 
441
    {
442
        vgaTag = pci_find_class(PCI_CLASS_DISPLAY_VGA);
443
        if (vgaTag == -1)
444
        {
445
            dbgprintf("Couldn't find an AGP VGA controller.\n");
446
			return 0;
447
		}
448
        cap_ptr = pci_find_capability(vgaTag, PCI_CAP_ID_AGP);
449
		if (cap_ptr)
450
			break;
451
	}
452
453
 
454
	 * Ok, here we have a AGP device. Disable impossible
455
	 * settings, and adjust the readqueue to the minimum.
456
	 */
457
    vga_agpstat = pciReadLong(vgaTag, cap_ptr+PCI_AGP_STATUS);
458
459
 
460
	bridge_agpstat = ((bridge_agpstat & ~AGPSTAT_RQ_DEPTH) |
461
         min_t(u32_t, (requested_mode & AGPSTAT_RQ_DEPTH),
462
         min_t(u32_t, (bridge_agpstat & AGPSTAT_RQ_DEPTH), (vga_agpstat & AGPSTAT_RQ_DEPTH))));
463
464
 
465
	if (!((bridge_agpstat & AGPSTAT_FW) &&
466
          (vga_agpstat & AGPSTAT_FW) &&
467
          (requested_mode & AGPSTAT_FW)))
468
		bridge_agpstat &= ~AGPSTAT_FW;
469
470
 
471
    if (bridge->mode & AGPSTAT_MODE_3_0)
472
		agp_v3_parse_one(&requested_mode, &bridge_agpstat, &vga_agpstat);
473
	else
474
		agp_v2_parse_one(&requested_mode, &bridge_agpstat, &vga_agpstat);
475
476
 
477
}
478
479
 
480
 
481
{
482
    PCITAG device = 0;
483
	int mode;
484
485
 
486
	if (agp_v3)
487
		mode *= 4;
488
489
 
490
    {
491
        int agp = pci_find_capability(device, PCI_CAP_ID_AGP);
492
		if (!agp)
493
			continue;
494
495
 
496
                agp_v3 ? 3 : 2, mode);
497
        pciWriteLong(device, agp + PCI_AGP_COMMAND, bridge_agpstat);
498
	}
499
}
500
501
 
502
 
503
{
504
    u32_t bridge_agpstat, temp;
505
506
 
507
508
 
509
           bridge->major_version, bridge->minor_version);
510
511
 
512
                     bridge->capndx + PCI_AGP_STATUS);
513
514
 
515
	if (bridge_agpstat == 0)
516
		/* Something bad happened. FIXME: Return error code? */
517
		return;
518
519
 
520
521
 
522
    if (bridge->major_version >= 3)
523
    {
524
        if (bridge->mode & AGPSTAT_MODE_3_0)
525
        {
526
			/* If we have 3.5, we can do the isoch stuff. */
527
            if (bridge->minor_version >= 5)
528
                agp_3_5_enable(bridge);
529
            agp_device_command(bridge_agpstat, TRUE);
530
			return;
531
        }
532
        else
533
        {
534
		    /* Disable calibration cycle in RX91<1> when not in AGP3.0 mode of operation.*/
535
		    bridge_agpstat &= ~(7<<10) ;
536
            temp = pciReadLong(bridge->PciTag, bridge->capndx+AGPCTRL);
537
		    temp |= (1<<9);
538
            pciWriteLong(bridge->PciTag, bridge->capndx+AGPCTRL, temp);
539
540
 
541
                      " falling back to 2.x\n");
542
		}
543
	}
544
545
 
546
    agp_device_command(bridge_agpstat, FALSE);
547
}
548
549
 
550
 
551
{
552
    .aperture_sizes     = intel_8xx_sizes,
553
//    .size_type          = U8_APER_SIZE,
554
//    .num_aperture_sizes = 7,
555
    .configure          = intel_845_configure,
556
    .fetch_size         = intel_8xx_fetch_size,
557
//    .cleanup            = intel_8xx_cleanup,
558
    .tlb_flush          = intel_8xx_tlbflush,
559
//    .mask_memory        = agp_generic_mask_memory,
560
//    .masks              = intel_generic_masks,
561
//    .agp_enable         = agp_generic_enable,
562
//    .cache_flush        = global_cache_flush,
563
    .create_gatt_table  = agp_generic_create_gatt_table,
564
//    .free_gatt_table    = agp_generic_free_gatt_table,
565
//    .insert_memory      = agp_generic_insert_memory,
566
//    .remove_memory      = agp_generic_remove_memory,
567
//    .alloc_by_type      = agp_generic_alloc_by_type,
568
//    .free_by_type       = agp_generic_free_by_type,
569
//    .agp_alloc_page     = agp_generic_alloc_page,
570
//    .agp_destroy_page   = agp_generic_destroy_page,
571
};
572
573
 
574
{
575
    size_t size_value;
576
577
 
578
579
 
580
581
 
582
583
 
584
585
 
586
        dbgprintf("unable to determine aperture size.\n");
587
        return 0;
588
    };
589
590
 
591
592
 
593
    {
594
        bridge->configure();
595
        return 1;
596
    }
597
    return 0;
598
}
599
600
 
601
 
602
>