Kernel - Added a (slightly hacky) virtual PCI interface
[tpg/acess2.git] / KernelLand / 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         case 2: // Class Code
26                 tmp_dword = Dev->Class;
27                 break;
28         // 1: Command[0:15], Status[16:31]
29         // 3: Cache Line Size, Latency Timer, Header Type, BIST
30         // 4-9: BARs
31         // 10: Unused (Cardbus CIS Pointer)
32         // 11: Subsystem Vendor ID, Subsystem ID
33         // 12: Expansion ROM Address
34         // 13: Capabilities[0:8], Reserved[9:31]
35         // 14: Reserved
36         // 15: Interrupt Line, Interrupt Pin, Min Grant, Max Latency
37         default:
38                 tmp_dword = Dev->Read(Dev->Ptr, Offset >> 2);
39                 break;
40         }
41
42         tmp_dword >>= 8*(Offset & 3);
43         switch(Size)
44         {
45         case 4: break;
46         case 2: tmp_dword &= 0xFFFF;    break;
47         case 1: tmp_dword &= 0xFF;
48         }
49
50         return tmp_dword;
51 }
52
53 void VPCI_Write(tVPCI_Device *Dev, Uint8 Offset, Uint8 Size, Uint32 Data)
54 {
55         Uint32  tmp_dword;
56         if( Size > 4 || Size == 3 || Size == 0 )
57                 return ;
58         if( Offset & (Size - 1) )
59                 return ;
60         
61         switch(Offset >> 2)
62         {
63         case 0: // Vendor / Device IDs
64         case 2: // Class Code
65                 // READ ONLY
66                 return ;
67         }
68
69         tmp_dword = Dev->Read(Dev->Ptr, Offset>>2);
70         switch(Size)
71         {
72         case 4: tmp_dword = 0;  break;
73         case 2:
74                 tmp_dword &= ~(0xFFFF << ((Offset&2)*16));
75                 Data |= 0xFFFF;
76                 break;
77         case 1:
78                 tmp_dword &= ~(0xFF << ((Offset&3)*8));
79                 Data |= 0xFF;
80                 break;
81         }
82         tmp_dword |= Data << ((Offset&3)*8);
83         Dev->Write(Dev->Ptr, Offset>>2, tmp_dword);
84 }

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