Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1498 serge 1
 
1625 serge 2
#include 
3
#include 
4
#include 
5
#include 
1498 serge 6
7
 
8
#include "acpi_bus.h"
1627 serge 9
#include "dmdev.h"
1867 serge 10
1498 serge 11
 
1627 serge 12
13
 
1625 serge 14
#define ACPI_BUS_HID            "KLBSYBUS"
15
#define ACPI_BUS_DEVICE_NAME    "System Bus"
16
17
 
18
 
19
20
 
1867 serge 21
LIST_HEAD(acpi_bus_id_list);
22
LIST_HEAD(dmdev_tree);
23
1625 serge 24
 
1627 serge 25
 
1625 serge 26
{
27
    char bus_id[15];
28
    unsigned int instance_no;
29
    struct list_head node;
30
};
31
32
 
33
 
1498 serge 34
#define ACPI_NS_SYSTEM_BUS      "_SB_"
35
36
 
37
	ACPI_IRQ_MODEL_PIC = 0,
38
	ACPI_IRQ_MODEL_IOAPIC,
39
	ACPI_IRQ_MODEL_IOSAPIC,
40
	ACPI_IRQ_MODEL_PLATFORM,
41
	ACPI_IRQ_MODEL_COUNT
42
};
43
44
 
1625 serge 45
    ACPI_BUS_REMOVAL_NORMAL = 0,
46
    ACPI_BUS_REMOVAL_EJECT,
47
    ACPI_BUS_REMOVAL_SUPRISE,
48
    ACPI_BUS_REMOVAL_TYPE_COUNT
49
};
50
1498 serge 51
 
1625 serge 52
 
53
#define PCI_MAX_PINS    4
54
55
 
56
57
 
58
static ACPI_HANDLE pci_root_handle;
59
60
 
61
 
1498 serge 62
    (addr_t)((addr_t)(addr) + (addr_t)(off))
63
64
 
65
//    (addr_t)((addr_t)(addr) + OS_BASE)
66
67
 
68
69
 
1867 serge 70
int sprintf(char *buf, const char *fmt, ...);
2216 Serge 71
1867 serge 72
 
1633 serge 73
1625 serge 74
 
1633 serge 75
 
1627 serge 76
1625 serge 77
 
1627 serge 78
extern struct resource ioport_resource;
79
1625 serge 80
 
1627 serge 81
{
1625 serge 82
    IO_PIC  = 0,
1627 serge 83
    IO_APIC
84
};
1625 serge 85
86
 
1867 serge 87
resource_to_addr(ACPI_RESOURCE *resource, ACPI_RESOURCE_ADDRESS64 *addr);
88
89
 
90
91
 
92
93
 
2187 Serge 94
1867 serge 95
 
2187 Serge 96
 
1627 serge 97
{
1625 serge 98
    ACPI_OBJECT arg1;
1627 serge 99
    ACPI_OBJECT_LIST args;
100
    ACPI_STATUS as;
101
1625 serge 102
 
1627 serge 103
    arg1.Integer.Value = mode;
104
    args.Count = 1;
105
    args.Pointer = &arg1;
106
1625 serge 107
 
1627 serge 108
    /*
109
     * We can silently ignore failure as it may not be implemented, ACPI should
110
     * provide us with correct information anyway
111
     */
112
    if (ACPI_SUCCESS(as))
113
        dbgprintf(PREFIX "machine set to %s mode\n", mode ? "APIC" : "PIC");
114
}
1625 serge 115
116
 
1498 serge 117
 
118
 
1627 serge 119
1625 serge 120
 
1627 serge 121
1625 serge 122
 
123
 
1633 serge 124
1498 serge 125
 
1627 serge 126
#define ACPI_PCI_ROOT_DEVICE_NAME   "PCI Root Bridge"
127
1498 serge 128
 
1627 serge 129
get_root_bridge_busnr_callback(ACPI_RESOURCE *resource, void *data)
130
{
1625 serge 131
    struct resource *res = data;
1627 serge 132
    ACPI_RESOURCE_ADDRESS64 address;
133
1498 serge 134
 
1627 serge 135
        resource->Type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
136
        resource->Type != ACPI_RESOURCE_TYPE_ADDRESS64)
137
        return AE_OK;
1625 serge 138
1498 serge 139
 
1627 serge 140
    if ((address.AddressLength > 0) &&
141
        (address.ResourceType == ACPI_BUS_NUMBER_RANGE)) {
142
        res->start = address.Minimum;
143
        res->end = address.Minimum + address.AddressLength - 1;
144
    }
1625 serge 145
1627 serge 146
 
147
}
1625 serge 148
1500 serge 149
 
1625 serge 150
 
151
 
1627 serge 152
                         struct resource *res)
153
{
1625 serge 154
    ACPI_STATUS status;
155
156
 
1627 serge 157
    status =
158
        AcpiWalkResources(handle, METHOD_NAME__CRS,
159
                get_root_bridge_busnr_callback, res);
160
    if (ACPI_FAILURE(status))
1625 serge 161
        return status;
1627 serge 162
    if (res->start == -1)
163
        return AE_ERROR;
164
    return AE_OK;
165
}
166
1498 serge 167
 
168
 
1628 serge 169
{
170
    int status;
171
    struct acpi_device *child = NULL;
172
173
 
174
        if (device->parent && device->parent->ops.bind) {
175
            status = device->parent->ops.bind(device);
176
            if (!status) {
177
                list_for_each_entry(child, &device->children, node)
178
                    acpi_pci_bridge_scan(child);
179
            }
180
        }
181
}
182
183
 
184
 
185
 
1627 serge 186
{
187
    struct acpi_device *bridge;
188
    char *name;
189
    unsigned int res_num;
190
    struct resource *res;
191
    struct pci_bus *bus;
192
    int busnum;
193
};
194
1625 serge 195
 
1498 serge 196
 
1627 serge 197
resource_to_addr(ACPI_RESOURCE *resource, ACPI_RESOURCE_ADDRESS64 *addr)
198
{
1498 serge 199
    ACPI_STATUS status;
1625 serge 200
    struct acpi_resource_memory24 *memory24;
1627 serge 201
    struct acpi_resource_memory32 *memory32;
202
    struct acpi_resource_fixed_memory32 *fixed_memory32;
203
1498 serge 204
 
1627 serge 205
    switch (resource->Type) {
206
    case ACPI_RESOURCE_TYPE_MEMORY24:
207
        memory24 = &resource->Data.Memory24;
208
        addr->ResourceType = ACPI_MEMORY_RANGE;
209
        addr->Minimum = memory24->Minimum;
210
        addr->AddressLength = memory24->AddressLength;
211
        addr->Maximum = addr->Minimum + addr->AddressLength - 1;
212
        return AE_OK;
213
    case ACPI_RESOURCE_TYPE_MEMORY32:
214
        memory32 = &resource->Data.Memory32;
215
        addr->ResourceType = ACPI_MEMORY_RANGE;
216
        addr->Minimum = memory32->Minimum;
217
        addr->AddressLength = memory32->AddressLength;
218
        addr->Maximum = addr->Minimum + addr->AddressLength - 1;
219
        return AE_OK;
220
    case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
221
        fixed_memory32 = &resource->Data.FixedMemory32;
222
        addr->ResourceType = ACPI_MEMORY_RANGE;
223
        addr->Minimum = fixed_memory32->Address;
224
        addr->AddressLength = fixed_memory32->AddressLength;
225
        addr->Maximum = addr->Minimum + addr->AddressLength - 1;
226
        return AE_OK;
227
    case ACPI_RESOURCE_TYPE_ADDRESS16:
228
    case ACPI_RESOURCE_TYPE_ADDRESS32:
229
    case ACPI_RESOURCE_TYPE_ADDRESS64:
230
        status = AcpiResourceToAddress64(resource, addr);
231
        if (ACPI_SUCCESS(status) &&
232
            (addr->ResourceType == ACPI_MEMORY_RANGE ||
233
            addr->ResourceType == ACPI_IO_RANGE) &&
234
            addr->AddressLength > 0) {
235
            return AE_OK;
236
        }
237
        break;
238
    }
239
    return AE_ERROR;
240
}
1625 serge 241
242
 
243
 
1627 serge 244
count_resource(ACPI_RESOURCE *acpi_res, void *data)
245
{
1625 serge 246
    struct pci_root_info *info = data;
1627 serge 247
    ACPI_RESOURCE_ADDRESS64 addr;
248
    ACPI_STATUS status;
249
1625 serge 250
 
1627 serge 251
    if (ACPI_SUCCESS(status))
252
        info->res_num++;
253
    return AE_OK;
254
}
1625 serge 255
1498 serge 256
 
257
 
1627 serge 258
{
1625 serge 259
    struct pci_root_info *info = data;
1627 serge 260
    struct resource *res;
261
    struct acpi_resource_address64 addr;
262
    ACPI_STATUS status;
263
    unsigned long flags;
264
    u64 start, end;
265
1625 serge 266
 
1627 serge 267
    if (!ACPI_SUCCESS(status))
268
        return AE_OK;
269
1625 serge 270
 
1627 serge 271
    {
272
        flags = IORESOURCE_MEM;
273
        if (addr.Info.Mem.Caching == ACPI_PREFETCHABLE_MEMORY)
274
            flags |= IORESOURCE_PREFETCH;
275
    }
1498 serge 276
    else if (addr.ResourceType == ACPI_IO_RANGE)
1627 serge 277
    {
278
        flags = IORESOURCE_IO;
279
    } else
280
        return AE_OK;
281
1625 serge 282
 
1627 serge 283
    end = addr.Maximum + addr.TranslationOffset;
284
1625 serge 285
 
1627 serge 286
    res->name = info->name;
287
    res->flags = flags;
288
    res->start = start;
289
    res->end = end;
290
    res->child = NULL;
291
1625 serge 292
 
1627 serge 293
        printk("host bridge window %pR (ignored)\n", res);
294
        return AE_OK;
295
    }
296
1625 serge 297
 
2187 Serge 298
    if (addr.TranslationOffset)
299
        dev_info(NULL, "host bridge window %pR "
300
             "(PCI address [%#llx-%#llx])\n",
301
             res, res->start - addr.TranslationOffset,
302
             res->end - addr.TranslationOffset);
303
    else
304
        dev_info(NULL,
305
             "host bridge window %pR\n", res);
306
307
 
1627 serge 308
}
1498 serge 309
310
 
311
 
1625 serge 312
 
1627 serge 313
get_current_resources(struct acpi_device *device, int busnum,
314
            int domain, struct pci_bus *bus)
315
{
1625 serge 316
    struct pci_root_info info;
1627 serge 317
    size_t size;
318
1625 serge 319
 
1627 serge 320
1625 serge 321
 
1627 serge 322
//        pci_bus_remove_resources(bus);
323
1625 serge 324
 
1627 serge 325
    info.bus = bus;
326
    info.res_num = 0;
327
    AcpiWalkResources(device->handle, METHOD_NAME__CRS, count_resource,
328
                &info);
329
    if (!info.res_num)
330
        return;
331
1625 serge 332
 
1627 serge 333
    info.res = kmalloc(size, GFP_KERNEL);
334
    if (!info.res)
335
        goto res_alloc_fail;
336
1625 serge 337
 
2216 Serge 338
339
 
1627 serge 340
1625 serge 341
 
1627 serge 342
        goto name_alloc_fail;
343
1625 serge 344
 
1627 serge 345
    AcpiWalkResources(device->handle, METHOD_NAME__CRS, setup_resource,
346
                &info);
347
1625 serge 348
 
1627 serge 349
1625 serge 350
 
1627 serge 351
    kfree(info.res);
352
res_alloc_fail:
353
    return;
354
}
1625 serge 355
356
 
357
 
1627 serge 358
    .read = NULL,
359
    .write = NULL,
360
};
361
1625 serge 362
 
363
 
1627 serge 364
{
1625 serge 365
    struct acpi_device *device = root->device;
1627 serge 366
    int domain = root->segment;
367
    int busnum = root->secondary.start;
368
    struct pci_bus *bus;
369
    struct pci_sysdata *sd;
370
	int node = 0;
2187 Serge 371
1625 serge 372
 
1627 serge 373
        printk(KERN_WARNING "pci_bus %04x:%02x: "
374
               "ignored (multiple domains not supported)\n",
375
               domain, busnum);
376
        return NULL;
377
    }
1625 serge 378
379
 
2187 Serge 380
    /* Allocate per-root-bus (not per bus) arch-specific data.
1627 serge 381
     * TODO: leak; this memory is never freed.
382
     * It's arguable whether it's worth the trouble to care.
383
     */
1625 serge 384
    sd = kzalloc(sizeof(*sd), GFP_KERNEL);
1627 serge 385
    if (!sd) {
386
        printk(KERN_WARNING "pci_bus %04x:%02x: "
387
               "ignored (out of memory)\n", domain, busnum);
388
        return NULL;
389
    }
1625 serge 390
391
 
1627 serge 392
    sd->node = node;
393
    /*
1625 serge 394
     * Maybe the desired pci bus has been already scanned. In such case
1627 serge 395
     * it is unnecessary to scan the pci bus with the given domain,busnum.
396
     */
1625 serge 397
    bus = pci_find_bus(domain, busnum);
1627 serge 398
    if (bus) {
399
        /*
400
         * If the desired bus exits, the content of bus->sysdata will
401
         * be replaced by sd.
402
         */
403
        memcpy(bus->sysdata, sd, sizeof(*sd));
404
        kfree(sd);
405
    } else {
406
        bus = pci_create_bus(busnum, &pci_root_ops, sd);
407
        if (bus) {
408
            get_current_resources(device, busnum, domain, bus);
409
            bus->subordinate = pci_scan_child_bus(bus);
1628 serge 410
        }
1625 serge 411
    }
412
413
 
1627 serge 414
        kfree(sd);
415
1625 serge 416
 
1627 serge 417
        printk("on NUMA node %d\n", node);
418
    }
419
1625 serge 420
 
1627 serge 421
}
1625 serge 422
423
 
424
 
425
 
1627 serge 426
{
1625 serge 427
    unsigned long long segment, bus;
1627 serge 428
    ACPI_STATUS status;
429
    int result;
1625 serge 430
    struct acpi_pci_root *root;
1627 serge 431
    ACPI_HANDLE handle;
432
    struct acpi_device *child;
433
    u32 flags, base_flags;
434
1625 serge 435
 
1627 serge 436
    if (!root)
437
        return -ENOMEM;
1625 serge 438
1627 serge 439
 
440
    status = acpi_evaluate_integer(device->handle, METHOD_NAME__SEG, NULL,
441
                       &segment);
442
    if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
443
        printk(KERN_ERR PREFIX "can't evaluate _SEG\n");
444
        result = -ENODEV;
445
        goto end;
446
    }
1625 serge 447
448
 
1627 serge 449
    root->secondary.flags = IORESOURCE_BUS;
450
    status = try_get_root_bridge_busnr(device->handle, &root->secondary);
451
    if (ACPI_FAILURE(status))
452
    {
453
        /*
454
         * We need both the start and end of the downstream bus range
455
         * to interpret _CBA (MMCONFIG base address), so it really is
456
         * supposed to be in _CRS.  If we don't find it there, all we
457
         * can do is assume [_BBN-0xFF] or [0-0xFF].
458
         */
459
        root->secondary.end = 0xFF;
460
        printk(KERN_WARNING PREFIX
461
               "no secondary bus range in _CRS\n");
462
        status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN,                           NULL, &bus);
463
        if (ACPI_SUCCESS(status))
464
            root->secondary.start = bus;
465
        else if (status == AE_NOT_FOUND)
466
            root->secondary.start = 0;
467
        else {
468
            printk(KERN_ERR PREFIX "can't evaluate _BBN\n");
469
            result = -ENODEV;
470
            goto end;
471
        }
472
    }
473
1625 serge 474
 
1627 serge 475
    root->device = device;
476
    root->segment = segment & 0xFFFF;
477
    strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME);
478
    strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
479
    device->driver_data = root;
480
1625 serge 481
 
482
     * All supported architectures that use ACPI have support for
1627 serge 483
     * PCI domains, so we indicate this in _OSC support capabilities.
484
     */
1625 serge 485
//    flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT;
1627 serge 486
//    acpi_pci_osc_support(root, flags);
487
1625 serge 488
 
489
     * TBD: Need PCI interface for enumeration/configuration of roots.
1627 serge 490
     */
1625 serge 491
492
 
1627 serge 493
    list_add_tail(&root->node, &acpi_pci_roots);
494
1625 serge 495
 
1627 serge 496
           acpi_device_name(device), acpi_device_bid(device),
497
           root->segment, &root->secondary);
498
1625 serge 499
 
500
     * Scan the Root Bridge
1627 serge 501
     * --------------------
502
     * Must do this prior to any attempt to bind the root device, as the
503
     * PCI namespace does not get created until this call is made (and
504
     * thus the root bridge's pci_dev does not exist).
505
     */
1625 serge 506
507
 
1627 serge 508
    if (!root->bus) {
509
        printk(KERN_ERR PREFIX
510
                "Bus %04x:%02x not present in PCI namespace\n",
511
                root->segment, (unsigned int)root->secondary.start);
512
        result = -ENODEV;
513
        goto end;
514
    }
515
1625 serge 516
 
1627 serge 517
     * Attach ACPI-PCI Context
518
     * -----------------------
519
     * Thus binding the ACPI and PCI devices.
520
     */
521
    result = acpi_pci_bind_root(device);
1628 serge 522
    if (result)
523
        goto end;
524
1625 serge 525
 
526
     * PCI Routing Table
1627 serge 527
     * -----------------
528
     * Evaluate and parse _PRT, if exists.
529
     */
1625 serge 530
    status = AcpiGetHandle(device->handle, METHOD_NAME__PRT, &handle);
1627 serge 531
    if (ACPI_SUCCESS(status))
1625 serge 532
        result = acpi_pci_irq_add_prt(device->handle, root->bus);
1627 serge 533
1625 serge 534
 
1627 serge 535
     * Scan and bind all _ADR-Based Devices
536
     */
537
    list_for_each_entry(child, &device->children, node)
1628 serge 538
        acpi_pci_bridge_scan(child);
539
1625 serge 540
 
1627 serge 541
1625 serge 542
 
1627 serge 543
    if (!list_empty(&root->node))
544
        list_del(&root->node);
545
    kfree(root);
546
    return result;
547
}
1625 serge 548
549
 
550
 
1627 serge 551
{
1625 serge 552
    {"PNP0A03", 0},
1627 serge 553
    {"",        0},
554
};
1625 serge 555
556
 
1627 serge 557
{
1625 serge 558
    struct acpi_device *child;
559
560
 
1627 serge 561
    {
562
        dbgprintf(PREFIX "PCI root %s\n", device->pnp.bus_id);
563
        acpi_pci_root_add(device);
564
    };
565
1625 serge 566
 
567
    {
568
        acpi_init_pci(child);
1627 serge 569
    };
1625 serge 570
1627 serge 571
 
1625 serge 572
573
 
1627 serge 574
 
1498 serge 575
{
576
    u32_t retval;
577
578
 
1500 serge 579
580
 
1498 serge 581
582
 
583
        return 0;
584
585
 
1625 serge 586
    {
587
        printf("Can't open /rd/1/drivers/acpi.log\nExit\n");
588
        return 0;
589
    }
590
591
 
1500 serge 592
    if (status != AE_OK) {
593
          dbgprintf("AcpiInitializeSubsystem failed (%s)\n",
594
                     AcpiFormatException(status));
595
          goto err;
596
    }
597
1498 serge 598
 
2216 Serge 599
    if (status != AE_OK) {
1500 serge 600
          dbgprintf("AcpiInitializeTables failed (%s)\n",
601
                     AcpiFormatException(status));
602
          goto err;
603
    }
604
1498 serge 605
 
1500 serge 606
    if (status != AE_OK) {
607
          dbgprintf("AcpiLoadTables failed (%s)\n",
608
                     AcpiFormatException(status));
609
          goto err;
610
    }
611
1498 serge 612
 
1625 serge 613
1498 serge 614
 
2187 Serge 615
    if (status != AE_OK) {
1498 serge 616
        dbgprintf("AcpiEnableSubsystem failed (%s)\n",
617
            AcpiFormatException(status));
618
        goto err;
619
    }
620
621
 
2187 Serge 622
    if (ACPI_FAILURE (status))
1498 serge 623
    {
624
        dbgprintf("AcpiInitializeObjects failed (%s)\n",
625
            AcpiFormatException(status));
626
        goto err;
627
    }
628
629
 
1625 serge 630
 
631
632
 
1627 serge 633
1625 serge 634
 
1627 serge 635
1625 serge 636
 
1633 serge 637
638
 
1867 serge 639
1625 serge 640
 
1867 serge 641
1625 serge 642
 
2187 Serge 643
644
 
1867 serge 645
1625 serge 646
 
1867 serge 647
1498 serge 648
 
1867 serge 649
1498 serge 650
 
1867 serge 651
{
652
    size_t len = strlen (str) + 1;
653
    char *copy = malloc(len);
654
    if (copy)
655
    {
656
        memcpy (copy, str, len);
657
    }
1498 serge 658
    return copy;
1867 serge 659
}
660
1498 serge 661
 
662
 
1867 serge 663
{
664
    struct pci_bus *tbus;
665
    struct pci_dev *dev;
666
    dmdev_t        *dmdev;
667
1498 serge 668
 
1867 serge 669
1498 serge 670
 
1867 serge 671
//    dmdev->type = 1;
672
//    dmdev->acpi_dev = bus->self->acpi_dev;
673
//    dmdev->pci_dev = bus->self;
674
//    list_add_tail(&dmdev->list, &dmdev_tree);
675
1498 serge 676
 
1867 serge 677
    {
678
        dmdev = (dmdev_t*)kzalloc(sizeof(dmdev_t),GFP_KERNEL);
679
1498 serge 680
 
1867 serge 681
        dmdev->type = 1;
682
        dmdev->acpi_dev = dev->acpi_dev;
683
        dmdev->pci_dev = dev;
684
        list_add_tail(&dmdev->list, &dmdev_tree);
685
    };
686
1498 serge 687
 
1867 serge 688
    {
689
        dm_add_pci_bus(tbus);
690
    };
691
1498 serge 692
 
1867 serge 693
1498 serge 694
 
1867 serge 695
count_dev_resources(ACPI_RESOURCE *acpi_res, void *data)
696
{
697
    (*(int*)data)++;
698
    return AE_OK;
699
}
700
1498 serge 701
 
702
 
1867 serge 703
{
1625 serge 704
    struct acpi_device *child;
1867 serge 705
    ACPI_DEVICE_INFO *info = NULL;
706
    ACPI_STATUS status;
1625 serge 707
708
 
1867 serge 709
    uint32_t  res_num = 0;
710
1625 serge 711
 
1867 serge 712
1625 serge 713
 
1867 serge 714
    {
715
        if( strcmp(info->HardwareId.String,"PNP0C0F") == 0)
716
        {
717
            kfree(info);
718
            return;
719
        };
720
    };
721
1625 serge 722
 
1867 serge 723
1625 serge 724
 
1867 serge 725
    {
726
        AcpiWalkResources(device->handle, METHOD_NAME__CRS,
727
                          count_dev_resources, &res_num);
728
1625 serge 729
 
1867 serge 730
        {
731
            dmdev = (dmdev_t*)kzalloc(sizeof(dmdev_t),GFP_KERNEL);
732
1625 serge 733
 
1867 serge 734
            dmdev->type = 0;
735
            dmdev->acpi_dev = device;
736
            dmdev->pci_dev = NULL;
737
            list_add_tail(&dmdev->list, &dmdev_tree);
738
        };
739
    };
740
    list_for_each_entry(child, &device->children, node)
741
    {
1625 serge 742
        dm_add_acpi(child);
1867 serge 743
    };
1625 serge 744
};
1867 serge 745
1625 serge 746
 
1867 serge 747
{
1625 serge 748
    struct acpi_pci_root *root;
1867 serge 749
1625 serge 750
 
751
 
1867 serge 752
    {
1625 serge 753
        struct pci_bus *pbus, *tbus;
1867 serge 754
        struct pci_dev *dev;
755
1625 serge 756
 
1867 serge 757
1625 serge 758
 
1867 serge 759
    };
760
1625 serge 761
 
1867 serge 762
};
763
1625 serge 764
 
1867 serge 765
{
1625 serge 766
    if(res->flags !=0 )
1867 serge 767
    {
768
        if(res->flags & IORESOURCE_IO)
769
            dbgprintf("  IO range ");
770
        else if(res->flags & IORESOURCE_MEM)
771
            dbgprintf("  MMIO range ");
772
        dbgprintf("%x - %x\n", res->start, res->end);
773
    };
774
};
775
1625 serge 776
 
1867 serge 777
print_acpi_resource(ACPI_RESOURCE *acpi_res, void *data)
778
{
1625 serge 779
    ACPI_RESOURCE_ADDRESS64 addr;
1867 serge 780
    ACPI_STATUS status;
781
    int i;
782
1625 serge 783
 
1867 serge 784
    {
1625 serge 785
        case ACPI_RESOURCE_TYPE_IRQ:
1867 serge 786
        {
787
            ACPI_RESOURCE_IRQ *irq_data = (ACPI_RESOURCE_IRQ*)&acpi_res->Data;
788
            dbgprintf(" IRQ %d\n", irq_data->Interrupts[0]);
789
        };
790
        break;
791
1625 serge 792
 
1867 serge 793
        {
794
            ACPI_RESOURCE_EXTENDED_IRQ *irq_data = (ACPI_RESOURCE_EXTENDED_IRQ*)&acpi_res->Data;
795
            dbgprintf(" IRQ %d\n", irq_data->Interrupts[0]);
796
        };
797
        break;
798
1625 serge 799
 
1867 serge 800
        {
801
            ACPI_RESOURCE_DMA *dma_data = (ACPI_RESOURCE_DMA*) &acpi_res->Data;
802
            for(i=0; i < dma_data->ChannelCount; i++)
803
            {
804
                dbgprintf(" DMA %s channel %d\n",
805
                          dma_data->Type == ACPI_TYPE_A ? "Type A":
806
                          dma_data->Type == ACPI_TYPE_B ? "Type B" :
807
                          dma_data->Type == ACPI_TYPE_F ? "Type F" : "",
808
                          dma_data->Channels[i]);
809
            }
810
        };
811
        break;
812
1625 serge 813
 
1867 serge 814
        {
815
            ACPI_RESOURCE_IO *io_data = (ACPI_RESOURCE_IO*) &acpi_res->Data;
816
1625 serge 817
 
1867 serge 818
                       io_data->Minimum+io_data->AddressLength-1);
819
        }
820
        break;
821
1625 serge 822
 
1867 serge 823
        {
824
            ACPI_RESOURCE_FIXED_IO *io_data = (ACPI_RESOURCE_FIXED_IO*) &acpi_res->Data;
825
            dbgprintf(" Fixed IO range 0%x-0%x\n",io_data->Address,
826
                       io_data->Address+io_data->AddressLength-1);
827
        };
828
        break;
829
1625 serge 830
 
1867 serge 831
        case ACPI_RESOURCE_TYPE_MEMORY32:
832
        case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
833
        {
834
            ACPI_RESOURCE_ADDRESS64 addr64;
835
            resource_to_addr(acpi_res, &addr64);
836
            dbgprintf(" Memory range 0%x-0%x\n",
837
                       (uint32_t)addr64.Minimum, (uint32_t)addr64.Maximum);
838
        }
839
        break;
840
1625 serge 841
 
1867 serge 842
        case ACPI_RESOURCE_TYPE_ADDRESS32:
843
        case ACPI_RESOURCE_TYPE_ADDRESS64:
844
        {
845
            ACPI_RESOURCE_ADDRESS64 addr64;
846
            ACPI_STATUS status;
847
1625 serge 848
 
1867 serge 849
            if (ACPI_SUCCESS(status))
850
            {
851
                dbgprintf(" Address range 0%x-0%x\n",
852
                       (uint32_t)addr64.Minimum, (uint32_t)addr64.Maximum);
853
            }
854
        };
855
        break;
856
    };
857
1625 serge 858
 
859
};
1867 serge 860
1625 serge 861
 
862
 
1867 serge 863
{
1625 serge 864
    struct pci_dev     *pcidev;
1867 serge 865
    struct acpi_device *acpidev;
866
    dmdev_t  *dmdev;
867
    uint32_t  i;
868
1625 serge 869
 
1867 serge 870
1625 serge 871
 
1867 serge 872
    {
873
        switch(dmdev->type)
874
        {
875
            case 0:
876
               if(dmdev->acpi_dev != NULL)
877
               {
878
                    acpidev = dmdev->acpi_dev;
879
                    dbgprintf("\n%s\n", acpidev->pnp.bus_id);
880
                    AcpiWalkResources(acpidev->handle, METHOD_NAME__CRS,
881
                                      print_acpi_resource, NULL);
882
               };
883
               break;
884
1625 serge 885
 
1867 serge 886
               if(dmdev->pci_dev != NULL)
887
               {
888
                   pcidev = dmdev->pci_dev;
889
                   dbgprintf("\nPCI_%x_%x bus:%d devfn: %x\n",
890
                               pcidev->vendor, pcidev->device,
891
                               pcidev->busnr, pcidev->devfn);
892
1625 serge 893
 
1867 serge 894
                       print_pci_resource(&pcidev->resource[i]);
895
1625 serge 896
 
1867 serge 897
                       dbgprintf("  APIC IRQ: %d\n", acpi_get_irq(pcidev));
898
               };
899
               break;
900
        };
901
    };
902
};
903
1625 serge 904
 
1627 serge 905
 
2187 Serge 906
{
907
    uint32_t  busaddr;
908
    uint32_t  devid;
909
    uint32_t  irq;
910
    uint32_t  unused;
911
}devinfo_t;
912
913
 
914
typedef struct
915
{
916
  char sec;
917
  char min;
918
  char hour;
919
  char rsv;
920
}detime_t;
921
922
 
923
{
924
  char  day;
925
  char  month;
926
  short year;
927
}dedate_t;
928
929
 
930
{
931
  unsigned    attr;
932
  unsigned    flags;
933
  union
934
  {
935
     detime_t  ctime;
936
     unsigned  cr_time;
937
  };
938
  union
939
  {
940
     dedate_t  cdate;
941
     unsigned  cr_date;
942
  };
943
  union
944
  {
945
     detime_t  atime;
946
     unsigned  acc_time;
947
  };
948
  union
949
  {
950
     dedate_t  adate;
951
     unsigned  acc_date;
952
  };
953
  union
954
  {
955
     detime_t  mtime;
956
     unsigned  mod_time;
957
  };
958
  union
959
  {
960
     dedate_t  mdate;
961
     unsigned  mod_date;
962
  };
963
  unsigned    size;
964
  unsigned    size_high;
965
} FILEINFO;
966
967
 
968
969
 
970
 
971
{
972
    struct pci_dev   *pcidev;
973
    dmdev_t          *dmdev;
974
    devinfo_t        *data;
975
    int               writes;
976
    int               len;
977
    int i = 0;
978
979
 
980
    {
981
        if(dmdev->type ==1)
982
        {
983
            if(dmdev->pci_dev != NULL)
984
            {
985
                pcidev = dmdev->pci_dev;
986
                if(pcidev->pin)
987
                    i++;
988
            };
989
        };
990
    };
991
992
 
993
    data = (devinfo_t*)malloc(len);
994
995
 
996
997
 
998
    {
999
        if(dmdev->type == 1)
1000
        {
1001
1002
 
1003
            {
1004
                pcidev = dmdev->pci_dev;
1005
                if(pcidev->pin && (acpi_get_irq(pcidev) != -1) )
1006
                {
1007
                    data[i].busaddr = (pcidev->busnr<<8)|pcidev->devfn;
1008
                    data[i].devid   = ((uint32_t)pcidev->device<<16) |
1009
                                       pcidev->vendor;
1010
                    data[i].irq     =  acpi_get_irq(pcidev);
1011
                    data[i].unused  =  0;
1012
                    i++;
1013
                }
1014
            };
1015
        };
1016
    };
1017
1018
 
1019
1020
 
1021
1022
 
1023
1024
 
1025
    {
1026
        if( create_file(path))
1027
        {
1028
            free(data);
1029
            return false;
1030
        }
1031
    }
1032
    else
1033
        set_file_size(path, 0);
1034
1035
 
1036
1037
 
1038
};
1039