PCI device dump (lspci clone, essentially)
[tpg/acess2.git] / Usermode / Applications / pcidump_src / main.c
1 /*\r
2  AcessOS PCI Dump\r
3 */\r
4 #include <acess/sys.h>\r
5 #include <stdlib.h>\r
6 #include <stdio.h>\r
7 #include <stdint.h>\r
8 #include <string.h>\r
9 \r
10 #define DUMP_BARS       0\r
11 \r
12 #include "pcilist.h"\r
13 \r
14 // === CONSTANTS ===\r
15 const struct {\r
16          int    ID;\r
17         char *Name;\r
18 } csaVENDORS[] = {\r
19         {0x10EC, "Realtek"},\r
20         {0x1106, "VIA Technologies, Inc."},\r
21         {0x8086, "Intel"}\r
22 };\r
23 #define VENDOR_COUNT    (sizeof(csaVENDORS)/sizeof(csaVENDORS[0]))\r
24 \r
25 // === PROTOTYPES ===\r
26 char    *GetVendorName(uint16_t ID);\r
27 char    *GetDeviceName(uint16_t ven, uint16_t dev);\r
28 \r
29 // ==== CODE ====\r
30 int main(int argc, char *argv[], char *envp[])\r
31 {\r
32          int    dp, fp;\r
33         char    tmpPath[256+13] = "/Devices/pci/";\r
34         char    *fileName = tmpPath + sizeof("/Devices/pci");\r
35         uint16_t        vendor, device;\r
36         #if DUMP_BARS\r
37         uint32_t        tmp32;\r
38         #endif\r
39         \r
40         printf("PCI Bus Dump\n");\r
41         // --- Open PCI Directory\r
42         dp = open("/Devices/pci", /*OPEN_FLAG_READ|*/OPENFLAG_EXEC);\r
43         if(dp == -1)\r
44         {\r
45                 fprintf(stderr, "Non-Standard configuration or not running on Acess.\n");\r
46                 fprintf(stderr, "Quitting - Reason: Unable to open PCI driver.\n");\r
47                 return -1;\r
48         }\r
49         \r
50         // --- List Contents\r
51         // Uses `fp` as a temp variable\r
52         while( (fp = readdir(dp, fileName)) )\r
53         {\r
54                 if(fp < 0) {\r
55                         if(fp == -3)    printf("Invalid Permissions to traverse directory\n");\r
56                         break;\r
57                 }\r
58                 \r
59                 printf("Bus %c%c, Index %c%c, Fcn %c: ", fileName[0],fileName[1],\r
60                         fileName[3],fileName[4], fileName[6]);\r
61                 \r
62                 // Open File\r
63                 fp = open(tmpPath, OPENFLAG_READ);\r
64                 if(fp == -1)    continue;\r
65                 \r
66                 read(fp, 2, &vendor);   read(fp, 2, &device);\r
67                 printf(" Vendor 0x%04x, Device 0x%04x\n", vendor, device);\r
68                 printf(" %s - %s\n", GetVendorName(vendor), GetDeviceName(vendor, device));\r
69                 \r
70                 // Reuse vendor and device\r
71                 seek(fp, 0x8, SEEK_SET);\r
72                 read(fp, 2, &vendor);   read(fp, 2, &device);\r
73                 printf(" Revision 0x%04x, Class 0x%04x ()\n", vendor, device);\r
74                 \r
75                 // Read File\r
76                 #if DUMP_BARS\r
77                 seek(fp, 0x10, SEEK_SET);\r
78                 printf("Base Address Registers (BARs):\n");\r
79                 read(fp, 4, &tmp32);    printf(" 0x%08x", tmp32);\r
80                 read(fp, 4, &tmp32);    printf(" 0x%08x", tmp32);\r
81                 read(fp, 4, &tmp32);    printf(" 0x%08x", tmp32);\r
82                 read(fp, 4, &tmp32);    printf(" 0x%08x", tmp32);\r
83                 read(fp, 4, &tmp32);    printf(" 0x%08x", tmp32);\r
84                 read(fp, 4, &tmp32);    printf(" 0x%08x", tmp32);\r
85                 printf("\n");\r
86                 #endif\r
87                 printf("\n");\r
88                 \r
89                 // Close File\r
90                 close(fp);\r
91         }\r
92         close(dp);\r
93         return 0;\r
94 }\r
95 \r
96 char *GetVendorName(uint16_t id)\r
97 {\r
98         int i;\r
99         #if 0\r
100         for( i = 0; i < VENDOR_COUNT; i++)\r
101         {\r
102                 if( csaVENDORS[i].ID == id )\r
103                         return csaVENDORS[i].Name;\r
104         }\r
105         #else\r
106         for( i = 0; i < PCI_VENTABLE_LEN; i++ )\r
107         {\r
108                 if( PciVenTable[i].VenId == id )\r
109                         return PciVenTable[i].VenFull;\r
110         }\r
111         #endif\r
112         return "Unknown";\r
113 }\r
114 \r
115 char *GetDeviceName(uint16_t ven, uint16_t dev)\r
116 {\r
117          int    i;\r
118         for( i = 0; i < PCI_DEVTABLE_LEN; i++ )\r
119         {\r
120                 if( PciDevTable[i].VenId == ven && PciDevTable[i].DevId == dev )\r
121                         return PciDevTable[i].ChipDesc;\r
122         }\r
123         return "Unknown";\r
124 }\r

UCC git Repository :: git.ucc.asn.au