Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / Kernel / drv / vpci.c
1 /*
2  * Acess2 Kernel
3  * - By John Hodge (thePowersGang)
4  *
5  * drv/vpci.c
6  * - Virtual PCI Bus
7  */
8 #include <virtual_pci.h>
9
10 // === CODE ===
11 Uint32 VPCI_Read(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size)
12 {
13         Uint32  tmp_dword = 0;
14
15         if( Size > 4 || Size == 3 || Size == 0 )
16                 return 0;
17         if( Offset & (Size - 1) )
18                 return 0;
19         
20         switch( Offset >> 2 )
21         {
22         case 0: // Vendor[0:15], Device[16:31]
23                 tmp_dword = (Dev->Vendor) | (Dev->Device << 16);
24                 break;
25         // 1: Command[0:15], Status[16:31]
26         case 2: // Class Code
27                 tmp_dword = Dev->Class;
28                 break;
29         // 3: Cache Line Size, Latency Timer, Header Type, BIST
30         case 4 ... 9:   // 4-9: BARs
31                 tmp_dword = Dev->BARs[ (Offset>>2) - 4 ];
32                 break;
33         // 10: Unused (Cardbus CIS Pointer)
34         // 11: Subsystem Vendor ID, Subsystem ID
35         // 12: Expansion ROM Address
36         // 13: Capabilities[0:8], Reserved[9:31]
37         // 14: Reserved
38         // 15: Interrupt Line, Interrupt Pin, Min Grant, Max Latency
39         default:
40                 if( Dev->Read )
41                         tmp_dword = Dev->Read(Dev->Ptr, Offset >> 2);
42                 break;
43         }
44
45         tmp_dword >>= 8*(Offset & 3);
46         switch(Size)
47         {
48         case 4: break;
49         case 2: tmp_dword &= 0xFFFF;    break;
50         case 1: tmp_dword &= 0xFF;
51         }
52
53         return tmp_dword;
54 }
55
56 void VPCI_Write(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size, Uint32 Data)
57 {
58         Uint32  tmp_dword;
59         if( Size > 4 || Size == 3 || Size == 0 )
60                 return ;
61         if( Offset & (Size - 1) )
62                 return ;
63         
64         switch(Offset >> 2)
65         {
66         case 0: // Vendor / Device IDs
67         case 2: // Class Code
68                 // READ ONLY
69                 return ;
70         }
71
72         if( Size != 4 && Dev->Read )
73                 tmp_dword = Dev->Read(Dev->Ptr, Offset>>2);
74         else
75                 tmp_dword = 0;
76         switch(Size)
77         {
78         case 4: tmp_dword = 0;  break;
79         case 2:
80                 tmp_dword &= ~(0xFFFF << ((Offset&2)*16));
81                 Data |= 0xFFFF;
82                 break;
83         case 1:
84                 tmp_dword &= ~(0xFF << ((Offset&3)*8));
85                 Data |= 0xFF;
86                 break;
87         }
88         tmp_dword |= Data << ((Offset&3)*8);
89         if( Dev->Write )
90                 Dev->Write(Dev->Ptr, Offset>>2, tmp_dword);
91 }

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