Subversion Repositories Kolibri OS

Rev

Rev 951 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
948 serge 1
 
2
#include "link.h"
951 serge 3
948 serge 4
 
5
#include 
6
#include 
7
8
 
9
#include "agp.h"
10
11
 
12
13
 
14
 
951 serge 15
948 serge 16
 
17
 
18
19
 
20
 
21
{
22
    u32_t retval;
23
24
 
25
26
 
27
        return 0;
28
29
 
30
    {
31
        printf("Can't open /rd/1/drivers/agp.log\nExit\n");
32
        return 0;
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
 
951 serge 51
#include "isoch.inc"
953 serge 52
951 serge 53
 
948 serge 54
{
55
    u32_t temp;
56
57
 
951 serge 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
}
948 serge 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
 
951 serge 78
{
948 serge 79
    u32_t temp;
80
    u8_t  temp2;
81
    aper_size_t *current_size;
82
83
 
951 serge 84
948 serge 85
 
86
    pciWriteByte(bridge->PciTag, INTEL_APSIZE, current_size->size_value);
951 serge 87
948 serge 88
 
89
90
 
951 serge 91
    {
948 serge 92
        pciWriteLong(bridge->PciTag, AGP_APBASE, bridge->apbase_config);
951 serge 93
    }
948 serge 94
    else
95
    {
96
		/* address to map to */
97
        temp = pciReadLong(bridge->PciTag, AGP_APBASE);
951 serge 98
        bridge->gart_addr = (temp & PCI_MAP_MEMORY_ADDRESS_MASK);
99
        bridge->apbase_config = temp;
100
	}
948 serge 101
102
 
103
104
 
105
    pciWriteLong(bridge->PciTag, INTEL_ATTBASE, bridge->gatt_dma);
951 serge 106
948 serge 107
 
108
    pciWriteLong(bridge->PciTag, INTEL_AGPCTRL, 0x0000);
951 serge 109
948 serge 110
 
111
    temp2 = pciReadByte(bridge->PciTag, INTEL_I845_AGPM);
951 serge 112
    pciWriteByte(bridge->PciTag, INTEL_I845_AGPM, temp2 | (1 << 1));
113
	/* clear any possible error conditions */
948 serge 114
    pciWriteWord(bridge->PciTag, INTEL_I845_ERRSTS, 0x001c);
951 serge 115
	return 0;
948 serge 116
}
117
118
 
119
 
951 serge 120
{
948 serge 121
    count_t pages;
122
123
 
124
125
 
951 serge 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
948 serge 134
 
951 serge 135
948 serge 136
 
951 serge 137
948 serge 138
 
951 serge 139
948 serge 140
 
951 serge 141
                addr_t tmp;
142
948 serge 143
 
951 serge 144
                table++;
145
            }
146
            return 1;
147
        };
148
    };
149
    dbgprintf("unable to get memory for "
150
              "graphics translation table.\n");
151
	return 0;
948 serge 152
}
153
154
 
155
 
156
{
157
	int i;
158
    aper_size_t *values;
159
160
 
951 serge 161
948 serge 162
 
163
164
 
165
    {
166
        if (temp == values[i].size_value)
167
        {
168
            bridge->previous_size =
951 serge 169
                bridge->current_size = (void *) (values + i);
170
            bridge->aperture_size_idx = i;
171
			return values[i].size;
948 serge 172
		}
173
	}
174
	return 0;
175
}
176
177
 
178
{
179
    u8_t temp;
180
181
 
951 serge 182
	return __intel_8xx_fetch_size(temp);
948 serge 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
 
951 serge 205
948 serge 206
 
207
208
 
209
210
 
211
    {
212
        *table = dma_addr;
213
        table++;
214
        dma_addr+=4096;
215
    }
216
217
 
951 serge 218
948 serge 219
 
220
//        return ret_val;
221
222
 
223
//    curr->pg_start = pg_start;
224
	return 0;
225
}
226
227
 
951 serge 228
{
229
    u32_t ncapid;
230
948 serge 231
 
951 serge 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
 
505
{
506
    u32_t bridge_agpstat, temp;
507
508
 
509
510
 
511
           bridge->major_version, bridge->minor_version);
512
513
 
514
                     bridge->capndx + PCI_AGP_STATUS);
515
516
 
517
	if (bridge_agpstat == 0)
518
		/* Something bad happened. FIXME: Return error code? */
519
		return;
520
521
 
522
523
 
524
    if (bridge->major_version >= 3)
525
    {
526
        if (bridge->mode & AGPSTAT_MODE_3_0)
527
        {
528
			/* If we have 3.5, we can do the isoch stuff. */
529
            if (bridge->minor_version >= 5)
530
                agp_3_5_enable(bridge);
531
            agp_device_command(bridge_agpstat, TRUE);
532
			return;
533
        }
534
        else
535
        {
536
		    /* Disable calibration cycle in RX91<1> when not in AGP3.0 mode of operation.*/
537
		    bridge_agpstat &= ~(7<<10) ;
538
            temp = pciReadLong(bridge->PciTag, bridge->capndx+AGPCTRL);
539
		    temp |= (1<<9);
540
            pciWriteLong(bridge->PciTag, bridge->capndx+AGPCTRL, temp);
541
542
 
543
                      " falling back to 2.x\n");
544
		}
545
	}
546
547
 
548
    agp_device_command(bridge_agpstat, FALSE);
549
}
550
551
 
552
 
948 serge 553
{
554
    .aperture_sizes     = intel_8xx_sizes,
951 serge 555
//    .size_type          = U8_APER_SIZE,
948 serge 556
//    .num_aperture_sizes = 7,
557
    .configure          = intel_845_configure,
558
    .fetch_size         = intel_8xx_fetch_size,
559
//    .cleanup            = intel_8xx_cleanup,
560
    .tlb_flush          = intel_8xx_tlbflush,
561
//    .mask_memory        = agp_generic_mask_memory,
562
//    .masks              = intel_generic_masks,
563
//    .agp_enable         = agp_generic_enable,
564
//    .cache_flush        = global_cache_flush,
565
    .create_gatt_table  = agp_generic_create_gatt_table,
951 serge 566
//    .free_gatt_table    = agp_generic_free_gatt_table,
948 serge 567
//    .insert_memory      = agp_generic_insert_memory,
568
//    .remove_memory      = agp_generic_remove_memory,
569
//    .alloc_by_type      = agp_generic_alloc_by_type,
570
//    .free_by_type       = agp_generic_free_by_type,
571
//    .agp_alloc_page     = agp_generic_alloc_page,
572
//    .agp_destroy_page   = agp_generic_destroy_page,
573
};
574
575
 
951 serge 576
{
577
    size_t size_value;
578
948 serge 579
 
951 serge 580
581
 
582
583
 
584
585
 
586
587
 
588
        dbgprintf("unable to determine aperture size.\n");
589
        return 0;
590
    };
591
592
 
593
594
 
595
    {
596
        bridge->configure();
597
        return 1;
598
    }
599
    return 0;
600
}
601
602
 
603
 
948 serge 604
>