]> rtime.felk.cvut.cz Git - l4.git/blob - kernel/fiasco/src/jdb/ia32/jdb_kern_info-pci.cpp
Update
[l4.git] / kernel / fiasco / src / jdb / ia32 / jdb_kern_info-pci.cpp
1 IMPLEMENTATION[ia32,amd64]:
2
3 #include <cstdio>
4 #include "pci.h"
5 #include "simpleio.h"
6 #include "static_init.h"
7
8 class Jdb_kern_info_pci : public Jdb_kern_info_module
9 {
10 };
11
12 static Jdb_kern_info_pci k_P INIT_PRIORITY(JDB_MODULE_INIT_PRIO+1);
13
14 PUBLIC
15 Jdb_kern_info_pci::Jdb_kern_info_pci()
16   : Jdb_kern_info_module('P', "PCI devices")
17 {
18   Jdb_kern_info::register_subcmd(this);
19 }
20
21 PUBLIC
22 void
23 Jdb_kern_info_pci::show()
24 {
25   static const char * const classes[] =
26     { "unknown", "mass storage contoller", "network controller", 
27       "display controller", "multimedia device", "memory controller",
28       "bridge device", "simple communication controller", 
29       "system peripheral", "input device", "docking station", 
30       "processor", "serial bus controller", "wireless controller",
31       "intelligent I/O controller", "satellite communication controller",
32       "encryption/decryption controller", 
33       "data aquisition/signal processing controller" };
34   Mword bus, buses, dev, subdev, subdevs;
35
36   for (bus = 0, buses = 1; bus < buses; bus++)
37     {
38       for (dev = 0; dev < 32; dev++)
39         {
40           Pci::Cfg_addr _device(bus, dev);
41
42           Unsigned8 hdr_type; Pci::read_cfg(_device + 0x0E, &hdr_type);
43           subdevs = (hdr_type & 0x80) ? 8 : 1;
44
45           for (subdev = 0; subdev < subdevs; subdev++)
46             {
47               _device.func(subdev);
48               Unsigned16 vendor; Pci::read_cfg(_device + 0x00, &vendor);
49               Unsigned16 device; Pci::read_cfg(_device + 0x02, &device);
50
51               if ((vendor == 0xffff && device == 0xffff) ||
52                   (device == 0x0000 && device == 0x0000))
53                 break;
54
55               Unsigned8 classcode; Pci::read_cfg(_device + 0x0b, &classcode);
56               Unsigned8 subclass;  Pci::read_cfg(_device + 0x0a, &subclass);
57
58               if (classcode == 0x06 && subclass == 0x04)
59                 buses++;
60
61               printf("%02lx:%02lx.%1lx Class %02x%02x: %04x:%04x ",
62                      bus, dev, subdev, (unsigned)classcode,
63                      (unsigned)subclass, (unsigned)device, (unsigned)vendor);
64               if (classcode < sizeof(classes)/sizeof(classes[0]))
65                 printf("%s", classes[classcode]);
66               putchar('\n');
67             }
68         }
69     }
70 }