xref: /haiku/src/add-ons/kernel/bus_managers/pci/pci_io.cpp (revision 1978089f7cec856677e46204e992c7273d70b9af)
1 /*
2  * Copyright 2006, Marcus Overhagen. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 
6 
7 #include "pci.h"
8 #include "pci_private.h"
9 #include "arch_cpu.h"
10 
11 
12 //#define TRACE_PCI_IO
13 #undef TRACE
14 #ifdef TRACE_PCI_IO
15 #	define TRACE(x...) dprintf("PCI_IO: " x)
16 #else
17 #	define TRACE(x...) ;
18 #endif
19 
20 
21 #if defined(__i386__) || defined(__x86_64__)
22 
23 uint8
24 pci_read_io_8(int mapped_io_addr)
25 {
26 	return in8(mapped_io_addr);
27 }
28 
29 
30 void
31 pci_write_io_8(int mapped_io_addr, uint8 value)
32 {
33 	out8(value, mapped_io_addr);
34 }
35 
36 
37 uint16
38 pci_read_io_16(int mapped_io_addr)
39 {
40 	return in16(mapped_io_addr);
41 }
42 
43 
44 void
45 pci_write_io_16(int mapped_io_addr, uint16 value)
46 {
47 	out16(value, mapped_io_addr);
48 }
49 
50 
51 uint32
52 pci_read_io_32(int mapped_io_addr)
53 {
54 	return in32(mapped_io_addr);
55 }
56 
57 
58 void
59 pci_write_io_32(int mapped_io_addr, uint32 value)
60 {
61 	out32(value, mapped_io_addr);
62 }
63 
64 #else
65 
66 static uint8*
67 get_io_port_address(int ioPort)
68 {
69 	uint8 domain;
70 	pci_resource_range range;
71 	uint8 *mappedAdr;
72 
73 	if (gPCI->LookupRange(B_IO_PORT, ioPort, domain, range, &mappedAdr) < B_OK)
74 		return NULL;
75 
76 	return mappedAdr + ioPort;
77 }
78 
79 
80 uint8
81 pci_read_io_8(int mapped_io_addr)
82 {
83 	TRACE("pci_read_io_8(%d)\n", mapped_io_addr);
84 	vuint8* ptr = get_io_port_address(mapped_io_addr);
85 	if (ptr == NULL)
86 		return 0;
87 
88 	return *ptr;
89 }
90 
91 
92 void
93 pci_write_io_8(int mapped_io_addr, uint8 value)
94 {
95 	TRACE("pci_write_io_8(%d)\n", mapped_io_addr);
96 	vuint8* ptr = get_io_port_address(mapped_io_addr);
97 	if (ptr == NULL)
98 		return;
99 
100 	*ptr = value;
101 }
102 
103 
104 uint16
105 pci_read_io_16(int mapped_io_addr)
106 {
107 	TRACE("pci_read_io_16(%d)\n", mapped_io_addr);
108 	vuint16* ptr = (uint16*)get_io_port_address(mapped_io_addr);
109 	if (ptr == NULL)
110 		return 0;
111 
112 	return *ptr;
113 }
114 
115 
116 void
117 pci_write_io_16(int mapped_io_addr, uint16 value)
118 {
119 	TRACE("pci_write_io_16(%d)\n", mapped_io_addr);
120 	vuint16* ptr = (uint16*)get_io_port_address(mapped_io_addr);
121 	if (ptr == NULL)
122 		return;
123 
124 	*ptr = value;
125 }
126 
127 
128 uint32
129 pci_read_io_32(int mapped_io_addr)
130 {
131 	TRACE("pci_read_io_32(%d)\n", mapped_io_addr);
132 	vuint32* ptr = (uint32*)get_io_port_address(mapped_io_addr);
133 	if (ptr == NULL)
134 		return 0;
135 
136 	return *ptr;
137 }
138 
139 
140 void
141 pci_write_io_32(int mapped_io_addr, uint32 value)
142 {
143 	TRACE("pci_write_io_32(%d)\n", mapped_io_addr);
144 	vuint32* ptr = (vuint32*)get_io_port_address(mapped_io_addr);
145 	if (ptr == NULL)
146 		return;
147 
148 	*ptr = value;
149 }
150 
151 #endif
152