1: /*
2: * The PCI Library -- Access to i386 I/O ports on Haiku
3: *
4: * Copyright (c) 2009 Francois Revol <revol@free.fr>
5: *
6: * Can be freely distributed and used under the terms of the GNU GPL.
7: */
8:
9: #include <Drivers.h>
10: #include <ISA.h>
11: #include <PCI.h>
12:
13: /* from haiku/trunk/headers/private/drivers/poke.h */
14:
15: #define POKE_DEVICE_NAME "poke"
16: #define POKE_DEVICE_FULLNAME "/dev/misc/poke"
17: #define POKE_SIGNATURE 'wltp' // "We Like To Poke"
18:
19: enum {
20: POKE_PORT_READ = B_DEVICE_OP_CODES_END + 1,
21: POKE_PORT_WRITE,
22: POKE_PORT_INDEXED_READ,
23: POKE_PORT_INDEXED_WRITE,
24: POKE_PCI_READ_CONFIG,
25: POKE_PCI_WRITE_CONFIG,
26: POKE_GET_NTH_PCI_INFO,
27: POKE_GET_PHYSICAL_ADDRESS,
28: POKE_MAP_MEMORY,
29: POKE_UNMAP_MEMORY
30: };
31:
32:
33: typedef struct {
34: uint32 signature;
35: uint8 index;
36: pci_info* info;
37: status_t status;
38: } pci_info_args;
39:
40:
41: typedef struct {
42: uint32 signature;
43: uint16 port;
44: uint8 size; // == index for POKE_PORT_INDEXED_*
45: uint32 value;
46: } port_io_args;
47:
48:
49: typedef struct {
50: uint32 signature;
51: uint8 bus;
52: uint8 device;
53: uint8 function;
54: uint8 size;
55: uint8 offset;
56: uint32 value;
57: } pci_io_args;
58:
59:
60: /* en poke.h*/
61:
62: static int poke_driver_fd;
63:
64: static int
65: intel_setup_io(struct pci_access *a UNUSED)
66: {
67: poke_driver_fd = open(POKE_DEVICE_FULLNAME, O_RDWR);
68: return (poke_driver_fd < 0) ? 0 : 1;
69: }
70:
71: static inline int
72: intel_cleanup_io(struct pci_access *a UNUSED)
73: {
74: close(poke_driver_fd);
75: return 1;
76: }
77:
78: static inline u8
79: inb (u16 port)
80: {
81: port_io_args args = { POKE_SIGNATURE, port, sizeof(u8), 0 };
82: if (ioctl(poke_driver_fd, POKE_PORT_READ, &args, sizeof(args)) < 0)
83: return 0;
84: return (u8)args.value;
85: }
86:
87: static inline u16
88: inw (u16 port)
89: {
90: port_io_args args = { POKE_SIGNATURE, port, sizeof(u16), 0 };
91: if (ioctl(poke_driver_fd, POKE_PORT_READ, &args, sizeof(args)) < 0)
92: return 0;
93: return (u16)args.value;
94: }
95:
96: static inline u32
97: inl (u16 port)
98: {
99: port_io_args args = { POKE_SIGNATURE, port, sizeof(u32), 0 };
100: if (ioctl(poke_driver_fd, POKE_PORT_READ, &args, sizeof(args)) < 0)
101: return 0;
102: return (u32)args.value;
103: }
104:
105: static inline void
106: outb (u8 value, u16 port)
107: {
108: port_io_args args = { POKE_SIGNATURE, port, sizeof(u8), value };
109: ioctl(poke_driver_fd, POKE_PORT_WRITE, &args, sizeof(args));
110: }
111:
112: static inline void
113: outw (u16 value, u16 port)
114: {
115: port_io_args args = { POKE_SIGNATURE, port, sizeof(u16), value };
116: ioctl(poke_driver_fd, POKE_PORT_WRITE, &args, sizeof(args));
117: }
118:
119: static inline void
120: outl (u32 value, u16 port)
121: {
122: port_io_args args = { POKE_SIGNATURE, port, sizeof(u32), value };
123: ioctl(poke_driver_fd, POKE_PORT_WRITE, &args, sizeof(args));
124: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>