Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1117 serge 1
 
1403 serge 2
#include 
1630 serge 3
#include 
1963 serge 4
#include 
5271 serge 5
#include 
6
#include 
1117 serge 7
8
 
5271 serge 9
5078 serge 10
 
1120 serge 11
1117 serge 12
 
13
#define IORESOURCE_PCI_FIXED            (1<<4)  /* Do not move resource */
14
15
 
16
17
 
18
 * Translate the low bits of the PCI base
19
 * to the resource type
20
 */
21
static inline unsigned int pci_calc_resource_flags(unsigned int flags)
22
{
23
    if (flags & PCI_BASE_ADDRESS_SPACE_IO)
24
        return IORESOURCE_IO;
25
26
 
27
        return IORESOURCE_MEM | IORESOURCE_PREFETCH;
28
29
 
30
}
31
32
 
33
 
5271 serge 34
{
1117 serge 35
    u32 size = mask & maxbase;      /* Find the significant bits */
5271 serge 36
1117 serge 37
 
38
        return 0;
39
40
 
41
       from that the extent.  */
42
    size = (size & ~(size-1)) - 1;
43
44
 
45
       already been programmed with all 1s.  */
46
    if (base == maxbase && ((base | size) & mask) != mask)
47
        return 0;
48
49
 
50
}
51
52
 
5271 serge 53
{
1117 serge 54
    u64 size = mask & maxbase;      /* Find the significant bits */
5271 serge 55
1117 serge 56
 
57
        return 0;
58
59
 
60
       from that the extent.  */
61
    size = (size & ~(size-1)) - 1;
62
63
 
64
       already been programmed with all 1s.  */
65
    if (base == maxbase && ((base | size) & mask) != mask)
66
        return 0;
67
68
 
69
}
70
71
 
5271 serge 72
{
1117 serge 73
    if ((mask & (PCI_BASE_ADDRESS_SPACE|PCI_BASE_ADDRESS_MEM_TYPE_MASK)) ==
74
        (PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64))
75
        return 1;
76
    return 0;
77
}
78
79
 
80
{
81
    u32  pos, reg, next;
5271 serge 82
    u32  l, sz;
83
    struct resource *res;
1117 serge 84
85
 
86
    {
87
        u64  l64;
5271 serge 88
        u64  sz64;
89
        u32  raw_sz;
90
1117 serge 91
 
92
93
 
94
95
 
96
        l = PciRead32(dev->busnr, dev->devfn, reg);
2160 serge 97
        PciWrite32(dev->busnr, dev->devfn, reg, ~0);
98
        sz = PciRead32(dev->busnr, dev->devfn, reg);
99
        PciWrite32(dev->busnr, dev->devfn, reg, l);
100
1117 serge 101
 
102
            continue;
103
104
 
105
            l = 0;
106
107
 
108
        if ((l & PCI_BASE_ADDRESS_SPACE) ==
109
                        PCI_BASE_ADDRESS_SPACE_MEMORY)
110
        {
111
            sz = pci_size(l, sz, (u32)PCI_BASE_ADDRESS_MEM_MASK);
5271 serge 112
            /*
1117 serge 113
             * For 64bit prefetchable memory sz could be 0, if the
114
             * real size is bigger than 4G, so we need to check
115
             * szhi for that.
116
             */
117
            if (!is_64bit_memory(l) && !sz)
118
                    continue;
119
            res->start = l & PCI_BASE_ADDRESS_MEM_MASK;
120
            res->flags |= l & ~PCI_BASE_ADDRESS_MEM_MASK;
121
        }
122
        else {
123
            sz = pci_size(l, sz, PCI_BASE_ADDRESS_IO_MASK & 0xffff);
124
            if (!sz)
125
                continue;
126
            res->start = l & PCI_BASE_ADDRESS_IO_MASK;
127
            res->flags |= l & ~PCI_BASE_ADDRESS_IO_MASK;
128
        }
129
        res->end = res->start + (unsigned long) sz;
130
        res->flags |= pci_calc_resource_flags(l);
131
        if (is_64bit_memory(l))
132
        {
133
            u32 szhi, lhi;
5271 serge 134
1117 serge 135
 
2160 serge 136
            PciWrite32(dev->busnr, dev->devfn, reg+4, ~0);
137
            szhi = PciRead32(dev->busnr, dev->devfn, reg+4);
138
            PciWrite32(dev->busnr, dev->devfn, reg+4, lhi);
139
            sz64 = ((u64)szhi << 32) | raw_sz;
5271 serge 140
            l64 = ((u64)lhi << 32) | l;
141
            sz64 = pci_size64(l64, sz64, PCI_BASE_ADDRESS_MEM_MASK);
1117 serge 142
            next++;
143
144
 
145
            if (!sz64) {
146
                res->start = 0;
147
                res->end = 0;
148
                res->flags = 0;
149
                continue;
150
            }
151
            res->start = l64 & PCI_BASE_ADDRESS_MEM_MASK;
152
            res->end = res->start + sz64;
153
#else
154
            if (sz64 > 0x100000000ULL) {
155
                printk(KERN_ERR "PCI: Unable to handle 64-bit "
156
                                "BAR for device %s\n", pci_name(dev));
157
                res->start = 0;
158
                res->flags = 0;
159
            }
160
            else if (lhi)
161
            {
162
                /* 64-bit wide address, treat as disabled */
163
                PciWrite32(dev->busnr, dev->devfn, reg,
2160 serge 164
                        l & ~(u32)PCI_BASE_ADDRESS_MEM_MASK);
5271 serge 165
                PciWrite32(dev->busnr, dev->devfn, reg+4, 0);
2160 serge 166
                res->start = 0;
1117 serge 167
                res->end = sz;
168
            }
169
#endif
170
        }
171
    }
172
173
 
174
    {
175
        dev->rom_base_reg = rom;
176
        res = &dev->resource[PCI_ROM_RESOURCE];
177
178
 
2160 serge 179
        PciWrite32(dev->busnr, dev->devfn, rom, ~PCI_ROM_ADDRESS_ENABLE);
180
        sz = PciRead32(dev->busnr, dev->devfn, rom);
181
        PciWrite32(dev->busnr, dev->devfn, rom, l);
182
1117 serge 183
 
184
            l = 0;
185
186
 
187
        {
188
            sz = pci_size(l, sz, (u32)PCI_ROM_ADDRESS_MASK);
5271 serge 189
1117 serge 190
 
191
            {
192
                res->flags = (l & IORESOURCE_ROM_ENABLE) |
193
                                  IORESOURCE_MEM | IORESOURCE_PREFETCH |
194
                                  IORESOURCE_READONLY | IORESOURCE_CACHEABLE;
195
                res->start = l & PCI_ROM_ADDRESS_MASK;
196
                res->end = res->start + (unsigned long) sz;
197
            }
198
        }
199
    }
200
}
201
202
 
203
{
204
    u8 irq;
5271 serge 205
1117 serge 206
 
2160 serge 207
    dev->pin = irq;
1117 serge 208
    if (irq)
209
        irq = PciRead8(dev->busnr, dev->devfn, PCI_INTERRUPT_LINE);
2160 serge 210
    dev->irq = irq;
1117 serge 211
};
212
213
 
214
 
2160 serge 215
{
1117 serge 216
    u32  class;
5271 serge 217
1117 serge 218
 
2160 serge 219
    dev->revision = class & 0xff;
1117 serge 220
    class >>= 8;                                /* upper 3 bytes */
221
    dev->class = class;
222
223
 
224
//    dev->current_state = PCI_UNKNOWN;
225
226
 
227
 //   pci_fixup_device(pci_fixup_early, dev);
228
    class = dev->class >> 8;
229
230
 
231
    {
232
        case PCI_HEADER_TYPE_NORMAL:                /* standard header */
233
            if (class == PCI_CLASS_BRIDGE_PCI)
234
                goto bad;
235
            pci_read_irq(dev);
236
            pci_read_bases(dev, 6, PCI_ROM_ADDRESS);
237
            dev->subsystem_vendor = PciRead16(dev->busnr, dev->devfn,PCI_SUBSYSTEM_VENDOR_ID);
2160 serge 238
            dev->subsystem_device = PciRead16(dev->busnr, dev->devfn, PCI_SUBSYSTEM_ID);
239
1117 serge 240
 
241
             *      Do the ugly legacy mode stuff here rather than broken chip
242
             *      quirk code. Legacy mode ATA controllers have fixed
243
             *      addresses. These are not always echoed in BAR0-3, and
244
             *      BAR0-3 in a few cases contain junk!
245
             */
246
            if (class == PCI_CLASS_STORAGE_IDE)
247
            {
248
                u8 progif;
5271 serge 249
1117 serge 250
 
2160 serge 251
                if ((progif & 1) == 0)
1117 serge 252
                {
253
                    dev->resource[0].start = 0x1F0;
254
                    dev->resource[0].end = 0x1F7;
255
                    dev->resource[0].flags = LEGACY_IO_RESOURCE;
256
                    dev->resource[1].start = 0x3F6;
257
                    dev->resource[1].end = 0x3F6;
258
                    dev->resource[1].flags = LEGACY_IO_RESOURCE;
259
                }
260
                if ((progif & 4) == 0)
261
                {
262
                    dev->resource[2].start = 0x170;
263
                    dev->resource[2].end = 0x177;
264
                    dev->resource[2].flags = LEGACY_IO_RESOURCE;
265
                    dev->resource[3].start = 0x376;
266
                    dev->resource[3].end = 0x376;
267
                    dev->resource[3].flags = LEGACY_IO_RESOURCE;
268
                };
269
            }
270
            break;
271
272
 
273
                if (class != PCI_CLASS_BRIDGE_PCI)
274
                        goto bad;
275
                /* The PCI-to-PCI bridge spec requires that subtractive
276
                   decoding (i.e. transparent) bridge must have programming
277
                   interface code of 0x01. */
278
                pci_read_irq(dev);
279
                dev->transparent = ((dev->class & 0xff) == 1);
280
                pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
281
                break;
282
283
 
284
                if (class != PCI_CLASS_BRIDGE_CARDBUS)
285
                        goto bad;
286
                pci_read_irq(dev);
287
                pci_read_bases(dev, 1, 0);
288
                dev->subsystem_vendor = PciRead16(dev->busnr,
2160 serge 289
                                                  dev->devfn,
1117 serge 290
                                                  PCI_CB_SUBSYSTEM_VENDOR_ID);
291
292
 
2160 serge 293
                                                  dev->devfn,
1117 serge 294
                                                  PCI_CB_SUBSYSTEM_ID);
295
                break;
296
297
 
298
                printk(KERN_ERR "PCI: device %s has unknown header type %02x, ignoring.\n",
299
                        pci_name(dev), dev->hdr_type);
300
                return -1;
301
302
 
303
                printk(KERN_ERR "PCI: %s: class %x doesn't match header type %02x. Ignoring class.\n",
304
                       pci_name(dev), class, dev->hdr_type);
305
                dev->class = PCI_CLASS_NOT_DEFINED;
306
    }
307
308
 
309
310
 
311
};
312
313
 
5271 serge 314
{
1117 serge 315
    pci_dev_t  *dev;
1403 serge 316
1117 serge 317
 
5271 serge 318
    u8    hdr;
319
1117 serge 320
 
321
322
 
2160 serge 323
1117 serge 324
 
325
    if (id == 0xffffffff || id == 0x00000000 ||
326
        id == 0x0000ffff || id == 0xffff0000)
327
        return NULL;
328
329
 
330
    {
331
332
 
333
        timeout *= 2;
334
335
 
2160 serge 336
1117 serge 337
 
338
        if (timeout > 60 * 100)
339
        {
340
            printk(KERN_WARNING "Device %04x:%02x:%02x.%d not "
341
                   "responding\n", busnr,PCI_SLOT(devfn),PCI_FUNC(devfn));
2160 serge 342
            return NULL;
1117 serge 343
        }
344
    };
345
346
 
2997 Serge 347
        return NULL;
348
349
 
2160 serge 350
1117 serge 351
 
1404 serge 352
    if(unlikely(dev == NULL))
2997 Serge 353
        return NULL;
354
1117 serge 355
 
1120 serge 356
1117 serge 357
 
358
 
2160 serge 359
    dev->pci_dev.devfn    = devfn;
1117 serge 360
    dev->pci_dev.hdr_type = hdr & 0x7f;
361
    dev->pci_dev.multifunction    = !!(hdr & 0x80);
362
    dev->pci_dev.vendor   = id & 0xffff;
363
    dev->pci_dev.device   = (id >> 16) & 0xffff;
364
365
 
366
367
 
368
369
 
370
371
 
2997 Serge 372
 
373
 
374
 
5271 serge 375
{
1117 serge 376
    int  func, nr = 0;
377
378
 
379
    {
380
        pci_dev_t  *dev;
1403 serge 381
1117 serge 382
 
383
        if( dev )
384
        {
385
            list_add(&dev->link, &devices);
1120 serge 386
1117 serge 387
 
388
389
 
390
             * If this is a single function device,
391
             * don't scan past the first function.
392
             */
393
            if (!dev->pci_dev.multifunction)
394
            {
395
                if (func > 0) {
396
                    dev->pci_dev.multifunction = 1;
397
                }
398
                else {
399
                    break;
400
                }
401
             }
402
        }
403
        else {
404
            if (func == 0)
405
                break;
406
        }
407
    };
408
409
 
410
};
411
412
 
1239 serge 413
414
 
415
                   u8 pos, int cap, int *ttl)
416
{
417
    u8 id;
418
419
 
420
        pos = PciRead8(bus, devfn, pos);
421
        if (pos < 0x40)
422
            break;
423
        pos &= ~3;
424
        id = PciRead8(bus, devfn, pos + PCI_CAP_LIST_ID);
425
        if (id == 0xff)
426
            break;
427
        if (id == cap)
428
            return pos;
429
        pos += PCI_CAP_LIST_NEXT;
430
    }
431
    return 0;
432
}
433
434
 
435
                   u8 pos, int cap)
436
{
437
    int ttl = PCI_FIND_CAP_TTL;
438
439
 
440
}
441
442
 
443
                    unsigned int devfn, u8 hdr_type)
444
{
445
    u16 status;
446
447
 
448
    if (!(status & PCI_STATUS_CAP_LIST))
449
        return 0;
450
451
 
452
    case PCI_HEADER_TYPE_NORMAL:
453
    case PCI_HEADER_TYPE_BRIDGE:
454
        return PCI_CAPABILITY_LIST;
455
    case PCI_HEADER_TYPE_CARDBUS:
456
        return PCI_CB_CAPABILITY_LIST;
457
    default:
458
        return 0;
459
    }
460
461
 
462
}
463
464
 
465
 
466
{
467
    int pos;
468
469
 
2160 serge 470
    if (pos)
1239 serge 471
        pos = __pci_find_next_cap(dev->busnr, dev->devfn, pos, cap);
2160 serge 472
1239 serge 473
 
474
}
475
476
 
477
 
2997 Serge 478
 
479
 
480
{
1963 serge 481
    pci_dev_t  *dev;
2997 Serge 482
    u32       last_bus;
5271 serge 483
    u32       bus = 0 , devfn = 0;
484
1117 serge 485
 
1963 serge 486
 
2997 Serge 487
1963 serge 488
 
489
 
2997 Serge 490
        return -1;
491
1963 serge 492
 
2997 Serge 493
    {
494
        for (devfn = 0; devfn < 0x100; devfn += 8)
495
            pci_scan_slot(bus, devfn);
496
1963 serge 497
 
498
 
2997 Serge 499
    for(dev = (pci_dev_t*)devices.next;
500
        &dev->link != &devices;
501
        dev = (pci_dev_t*)dev->link.next)
502
    {
503
        dbgprintf("PCI device %x:%x bus:%x devfn:%x\n",
504
                dev->pci_dev.vendor,
505
                dev->pci_dev.device,
506
                dev->pci_dev.busnr,
507
                dev->pci_dev.devfn);
508
1963 serge 509
 
2997 Serge 510
    return 0;
511
}
512
1963 serge 513
 
2997 Serge 514
{
515
    pci_dev_t *dev;
516
    const struct pci_device_id *ent;
517
1963 serge 518
 
2997 Serge 519
        &dev->link != &devices;
520
        dev = (pci_dev_t*)dev->link.next)
521
    {
522
        if( dev->pci_dev.vendor != idlist->vendor )
523
            continue;
524
525
 
526
        {
527
            if(unlikely(ent->device == dev->pci_dev.device))
528
            {
529
                pdev->pci_dev = dev->pci_dev;
530
                return  ent;
531
            }
532
        };
533
    }
534
535
 
536
};
537
538
 
539
pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from)
540
{
541
    pci_dev_t *dev;
542
543
 
544
545
 
546
    {
547
        for(; &dev->link != &devices;
548
            dev = (pci_dev_t*)dev->link.next)
549
        {
550
            if( &dev->pci_dev == from)
551
            {
552
                dev = (pci_dev_t*)dev->link.next;
553
                break;
1963 serge 554
            };
2997 Serge 555
        }
1963 serge 556
    };
2997 Serge 557
1963 serge 558
 
2997 Serge 559
        dev = (pci_dev_t*)dev->link.next)
560
    {
561
        if( dev->pci_dev.vendor != vendor )
562
                continue;
563
1963 serge 564
 
2997 Serge 565
        {
566
            return &dev->pci_dev;
567
        }
568
    }
569
    return NULL;
570
};
571
1963 serge 572
 
573
 
2997 Serge 574
{
575
    pci_dev_t *dev;
576
1963 serge 577
 
2997 Serge 578
        &dev->link != &devices;
579
        dev = (pci_dev_t*)dev->link.next)
580
    {
581
        if ( dev->pci_dev.busnr == bus && dev->pci_dev.devfn == devfn)
582
            return &dev->pci_dev;
583
    }
584
    return NULL;
585
}
1963 serge 586
587
 
2997 Serge 588
{
1117 serge 589
    pci_dev_t *dev;
2997 Serge 590
1117 serge 591
 
2997 Serge 592
593
 
594
    {
1117 serge 595
        for(; &dev->link != &devices;
2997 Serge 596
            dev = (pci_dev_t*)dev->link.next)
597
        {
598
            if( &dev->pci_dev == from)
599
            {
600
                dev = (pci_dev_t*)dev->link.next;
601
                break;
602
            };
603
        }
604
    };
605
1117 serge 606
 
2997 Serge 607
        dev = (pci_dev_t*)dev->link.next)
608
    {
609
        if( dev->pci_dev.class == class)
610
        {
611
            return &dev->pci_dev;
612
        }
1117 serge 613
    }
614
2997 Serge 615
 
616
}
1117 serge 617
618
 
619
 
2997 Serge 620
#define PIO_MASK        0x0ffffUL
621
#define PIO_RESERVED    0x40000UL
622
623
 
624
    unsigned long port = (unsigned long __force)addr;  \
625
    if (port >= PIO_RESERVED) {                        \
626
        is_mmio;                                       \
627
    } else if (port > PIO_OFFSET) {                    \
628
        port &= PIO_MASK;                              \
629
        is_pio;                                        \
630
    };                                                 \
631
} while (0)
632
633
 
634
void __iomem *ioport_map(unsigned long port, unsigned int nr)
635
{
1117 serge 636
    if (port > PIO_MASK)
3764 Serge 637
        return NULL;
638
    return (void __iomem *) (unsigned long) (port + PIO_OFFSET);
639
}
2997 Serge 640
1117 serge 641
 
2997 Serge 642
{
643
    resource_size_t start = pci_resource_start(dev, bar);
644
    resource_size_t len = pci_resource_len(dev, bar);
645
    unsigned long flags = pci_resource_flags(dev, bar);
646
1117 serge 647
 
2997 Serge 648
        return NULL;
649
    if (maxlen && len > maxlen)
650
        len = maxlen;
651
    if (flags & IORESOURCE_IO)
652
        return ioport_map(start, len);
653
    if (flags & IORESOURCE_MEM) {
654
        return ioremap(start, len);
655
    }
656
    /* What? */
657
    return NULL;
658
}
1117 serge 659
660
 
2997 Serge 661
{
662
    IO_COND(addr, /* nothing */, iounmap(addr));
663
}
664
1117 serge 665
 
2997 Serge 666
 
667
pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
668
                         struct resource *res)
669
{
1117 serge 670
    region->start = res->start;
2997 Serge 671
    region->end = res->end;
672
}
673
1117 serge 674
 
675
 
2997 Serge 676
{
677
    struct resource *res = pdev->resource + PCI_ROM_RESOURCE;
678
    struct pci_bus_region region;
679
    u32 rom_addr;
680
1117 serge 681
 
2997 Serge 682
            return -1;
683
684
 
685
    pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr);
686
    rom_addr &= ~PCI_ROM_ADDRESS_MASK;
687
    rom_addr |= region.start | PCI_ROM_ADDRESS_ENABLE;
688
    pci_write_config_dword(pdev, pdev->rom_base_reg, rom_addr);
689
    return 0;
690
}
1117 serge 691
692
 
2997 Serge 693
{
694
    u32 rom_addr;
695
    pci_read_config_dword(pdev, pdev->rom_base_reg, &rom_addr);
696
    rom_addr &= ~PCI_ROM_ADDRESS_ENABLE;
697
    pci_write_config_dword(pdev, pdev->rom_base_reg, rom_addr);
698
}
699
1117 serge 700
 
701
 * pci_get_rom_size - obtain the actual size of the ROM image
2997 Serge 702
 * @pdev: target PCI device
703
 * @rom: kernel virtual pointer to image of ROM
704
 * @size: size of PCI window
705
 *  return: size of actual ROM image
706
 *
1117 serge 707
 * Determine the actual length of the ROM image.
2997 Serge 708
 * The PCI window size could be much larger than the
709
 * actual image size.
710
 */
1117 serge 711
size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
2997 Serge 712
{
1117 serge 713
        void __iomem *image;
2997 Serge 714
        int last_image;
715
1117 serge 716
 
2997 Serge 717
        do {
718
                void __iomem *pds;
719
                /* Standard PCI ROMs start out with these bytes 55 AA */
720
                if (readb(image) != 0x55) {
721
                        dev_err(&pdev->dev, "Invalid ROM contents\n");
722
                        break;
723
            }
1117 serge 724
                if (readb(image + 1) != 0xAA)
2997 Serge 725
                        break;
726
                /* get the PCI data structure and check its signature */
727
                pds = image + readw(image + 24);
728
                if (readb(pds) != 'P')
729
                        break;
730
                if (readb(pds + 1) != 'C')
731
                        break;
732
                if (readb(pds + 2) != 'I')
733
                        break;
734
                if (readb(pds + 3) != 'R')
735
                        break;
736
                last_image = readb(pds + 21) & 0x80;
737
                /* this length is reliable */
738
                image += readw(pds + 16) * 512;
739
        } while (!last_image);
740
1963 serge 741
 
2997 Serge 742
        /* there are known ROMs that get the size wrong */
743
        return min((size_t)(image - rom), size);
744
}
745
1117 serge 746
 
747
 
748
 * pci_map_rom - map a PCI ROM to kernel space
749
 * @pdev: pointer to pci device struct
750
 * @size: pointer to receive size of pci window over ROM
751
 *
752
 * Return: kernel virtual pointer to image of ROM
2997 Serge 753
 *
754
 * Map a PCI ROM into kernel space. If ROM is boot video ROM,
1117 serge 755
 * the shadow BIOS copy will be returned instead of the
756
 * actual ROM.
757
 */
758
void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)
2997 Serge 759
{
1117 serge 760
    struct resource *res = &pdev->resource[PCI_ROM_RESOURCE];
761
    loff_t start;
2997 Serge 762
    void __iomem *rom;
763
1117 serge 764
 
1963 serge 765
     * IORESOURCE_ROM_SHADOW set on x86, x86_64 and IA64 supports legacy
766
     * memory map if the VGA enable bit of the Bridge Control register is
767
     * set for embedded VGA.
768
     */
769
    if (res->flags & IORESOURCE_ROM_SHADOW) {
770
        /* primary video rom always starts here */
771
        start = (loff_t)0xC0000;
2997 Serge 772
        *size = 0x20000; /* cover C000:0 through E000:0 */
1963 serge 773
    } else {
774
                if (res->flags &
3764 Serge 775
                        (IORESOURCE_ROM_COPY | IORESOURCE_ROM_BIOS_COPY)) {
776
            *size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
1963 serge 777
             return (void __iomem *)(unsigned long)
2997 Serge 778
             pci_resource_start(pdev, PCI_ROM_RESOURCE);
779
        } else {
1963 serge 780
    				start = (loff_t)0xC0000;
5271 serge 781
    				*size = 0x20000; /* cover C000:0 through E000:0 */
782
1963 serge 783
 
784
    }
785
786
 
787
    if (!rom) {
788
            /* restore enable if ioremap fails */
789
            if (!(res->flags & (IORESOURCE_ROM_ENABLE |
790
                                IORESOURCE_ROM_SHADOW |
791
                                IORESOURCE_ROM_COPY)))
792
                    pci_disable_rom(pdev);
793
            return NULL;
794
    }
795
796
 
797
     * Try to find the true size of the ROM since sometimes the PCI window
798
     * size is much larger than the actual size of the ROM.
799
     * True size is important if the ROM is going to be copied.
800
     */
801
    *size = pci_get_rom_size(pdev, rom, *size);
2997 Serge 802
    return rom;
803
}
804
1963 serge 805
 
2997 Serge 806
{
807
    struct resource *res = &pdev->resource[PCI_ROM_RESOURCE];
808
1117 serge 809
 
2997 Serge 810
            return;
811
1117 serge 812
 
2997 Serge 813
814
 
815
    if (!(res->flags & (IORESOURCE_ROM_ENABLE | IORESOURCE_ROM_SHADOW)))
816
            pci_disable_rom(pdev);
817
}
818
819
 
820
{
821
    u16 old_cmd, cmd;
822
823
 
824
    if (enable)
825
        cmd = old_cmd | PCI_COMMAND_MASTER;
826
    else
1117 serge 827
        cmd = old_cmd & ~PCI_COMMAND_MASTER;
2997 Serge 828
    if (cmd != old_cmd) {
829
            dbgprintf("%s bus mastering\n",
5271 serge 830
                    enable ? "enabling" : "disabling");
831
        pci_write_config_word(dev, PCI_COMMAND, cmd);
2997 Serge 832
        }
833
    dev->is_busmaster = enable;
834
}
835
1117 serge 836
 
2997 Serge 837
 
838
 * @dev: the PCI device to enable
839
 *
840
 * Enables bus-mastering on the device and calls pcibios_set_master()
841
 * to do the needed arch specific settings.
842
 */
843
void pci_set_master(struct pci_dev *dev)
844
{
845
        __pci_set_master(dev, true);
846
//        pcibios_set_master(dev);
847
}
1117 serge 848
849
 
2997 Serge 850
 * pci_clear_master - disables bus-mastering for device dev
851
 * @dev: the PCI device to disable
852
 */
853
void pci_clear_master(struct pci_dev *dev)
854
{
855
        __pci_set_master(dev, false);
856
}
857
1119 serge 858
 
2997 Serge 859
 
860
{
1119 serge 861
    return dev->pcie_flags_reg & PCI_EXP_FLAGS_VERS;
2997 Serge 862
}
863
1119 serge 864
 
2997 Serge 865
{
866
    return true;
867
}
868
1119 serge 869
 
2997 Serge 870
{
871
    int type = pci_pcie_type(dev);
872
873
 
874
           type == PCI_EXP_TYPE_ROOT_PORT ||
875
           type == PCI_EXP_TYPE_ENDPOINT ||
876
           type == PCI_EXP_TYPE_LEG_END;
877
}
878
879
 
880
{
881
    int type = pci_pcie_type(dev);
882
883
 
884
           type == PCI_EXP_TYPE_ROOT_PORT ||
885
           (type == PCI_EXP_TYPE_DOWNSTREAM &&
886
        dev->pcie_flags_reg & PCI_EXP_FLAGS_SLOT);
887
}
888
889
 
890
{
891
    int type = pci_pcie_type(dev);
892
893
 
894
           type == PCI_EXP_TYPE_ROOT_PORT ||
895
           type == PCI_EXP_TYPE_RC_EC;
896
}
897
898
 
899
{
900
    if (!pci_is_pcie(dev))
901
        return false;
902
903
 
904
    case PCI_EXP_FLAGS_TYPE:
905
        return true;
906
    case PCI_EXP_DEVCAP:
907
    case PCI_EXP_DEVCTL:
908
    case PCI_EXP_DEVSTA:
909
        return pcie_cap_has_devctl(dev);
910
    case PCI_EXP_LNKCAP:
911
    case PCI_EXP_LNKCTL:
912
    case PCI_EXP_LNKSTA:
913
        return pcie_cap_has_lnkctl(dev);
914
    case PCI_EXP_SLTCAP:
915
    case PCI_EXP_SLTCTL:
916
    case PCI_EXP_SLTSTA:
917
        return pcie_cap_has_sltctl(dev);
918
    case PCI_EXP_RTCTL:
919
    case PCI_EXP_RTCAP:
920
    case PCI_EXP_RTSTA:
921
        return pcie_cap_has_rtctl(dev);
922
    case PCI_EXP_DEVCAP2:
923
    case PCI_EXP_DEVCTL2:
924
    case PCI_EXP_LNKCAP2:
925
    case PCI_EXP_LNKCTL2:
926
    case PCI_EXP_LNKSTA2:
927
        return pcie_cap_version(dev) > 1;
928
    default:
929
        return false;
930
    }
931
}
932
933
 
934
 * Note that these accessor functions are only for the "PCI Express
935
 * Capability" (see PCIe spec r3.0, sec 7.8).  They do not apply to the
936
 * other "PCI Express Extended Capabilities" (AER, VC, ACS, MFVC, etc.)
937
 */
938
int pcie_capability_read_word(struct pci_dev *dev, int pos, u16 *val)
939
{
940
    int ret;
941
942
 
943
    if (pos & 1)
944
        return -EINVAL;
945
946
 
947
        ret = pci_read_config_word(dev, pci_pcie_cap(dev) + pos, val);
948
        /*
949
         * Reset *val to 0 if pci_read_config_word() fails, it may
950
         * have been written as 0xFFFF if hardware error happens
951
         * during pci_read_config_word().
952
         */
953
        if (ret)
954
            *val = 0;
955
        return ret;
956
    }
957
958
 
959
     * For Functions that do not implement the Slot Capabilities,
960
     * Slot Status, and Slot Control registers, these spaces must
961
     * be hardwired to 0b, with the exception of the Presence Detect
962
     * State bit in the Slot Status register of Downstream Ports,
963
     * which must be hardwired to 1b.  (PCIe Base Spec 3.0, sec 7.8)
964
     */
965
    if (pci_is_pcie(dev) && pos == PCI_EXP_SLTSTA &&
966
         pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM) {
967
        *val = PCI_EXP_SLTSTA_PDS;
968
    }
969
970
 
971
}
972
EXPORT_SYMBOL(pcie_capability_read_word);
973
974
 
975
{
976
    int ret;
977
978
 
979
    if (pos & 3)
980
        return -EINVAL;
981
982
 
983
        ret = pci_read_config_dword(dev, pci_pcie_cap(dev) + pos, val);
984
        /*
985
         * Reset *val to 0 if pci_read_config_dword() fails, it may
986
         * have been written as 0xFFFFFFFF if hardware error happens
987
         * during pci_read_config_dword().
988
         */
989
        if (ret)
990
            *val = 0;
991
        return ret;
992
    }
993
994
 
995
         pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM) {
996
        *val = PCI_EXP_SLTSTA_PDS;
997
    }
998
999
 
1000
}
1001
EXPORT_SYMBOL(pcie_capability_read_dword);
1002
1003
 
1004
{
1005
    if (pos & 1)
1006
        return -EINVAL;
1007
1008
 
1009
        return 0;
1119 serge 1010
2997 Serge 1011
 
1012
}
1119 serge 1013
EXPORT_SYMBOL(pcie_capability_write_word);
2997 Serge 1014
1119 serge 1015
 
2997 Serge 1016
{
1017
    if (pos & 3)
1018
        return -EINVAL;
1019
1963 serge 1020
 
2997 Serge 1021
        return 0;
1022
1023
 
1024
}
1025
EXPORT_SYMBOL(pcie_capability_write_dword);
1026
1027
 
5078 serge 1028
                                       u16 clear, u16 set)
1029
{
1030
        int ret;
1031
        u16 val;
1032
1033
 
1034
        if (!ret) {
1035
                val &= ~clear;
1036
                val |= set;
1037
                ret = pcie_capability_write_word(dev, pos, val);
1038
        }
1039
1040
 
1041
}
1042
1043
 
1044
 
1045
 
1046
{
1047
        u16 ctl;
1048
1049
 
1050
1051
 
1052
}
1053
EXPORT_SYMBOL(pcie_get_readrq);
1054
1055
 
1056
 * pcie_set_readrq - set PCI Express maximum memory read request
1057
 * @dev: PCI device to query
1058
 * @rq: maximum memory read count in bytes
1059
 *    valid values are 128, 256, 512, 1024, 2048, 4096
1060
 *
1061
 * If possible sets maximum memory read request in bytes
1062
 */
1063
int pcie_set_readrq(struct pci_dev *dev, int rq)
1064
{
1065
        u16 v;
1066
1067
 
1068
                return -EINVAL;
1069
1070
 
1071
1072
 
1073
                                                  PCI_EXP_DEVCTL_READRQ, v);
1074
}
1075