Commit | Line | Data |
---|---|---|
2874c5fd | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
394b701c MP |
2 | /* |
3 | * RapidIO configuration space access support | |
4 | * | |
5 | * Copyright 2005 MontaVista Software, Inc. | |
6 | * Matt Porter <mporter@kernel.crashing.org> | |
394b701c MP |
7 | */ |
8 | ||
9 | #include <linux/rio.h> | |
10 | #include <linux/module.h> | |
11 | ||
394b701c MP |
12 | /* |
13 | * Wrappers for all RIO configuration access functions. They just check | |
31d1e130 | 14 | * alignment and call the low-level functions pointed to by rio_mport->ops. |
394b701c MP |
15 | */ |
16 | ||
17 | #define RIO_8_BAD 0 | |
18 | #define RIO_16_BAD (offset & 1) | |
19 | #define RIO_32_BAD (offset & 3) | |
20 | ||
21 | /** | |
22 | * RIO_LOP_READ - Generate rio_local_read_config_* functions | |
23 | * @size: Size of configuration space read (8, 16, 32 bits) | |
24 | * @type: C type of value argument | |
25 | * @len: Length of configuration space read (1, 2, 4 bytes) | |
26 | * | |
27 | * Generates rio_local_read_config_* functions used to access | |
28 | * configuration space registers on the local device. | |
29 | */ | |
30 | #define RIO_LOP_READ(size,type,len) \ | |
31 | int __rio_local_read_config_##size \ | |
32 | (struct rio_mport *mport, u32 offset, type *value) \ | |
33 | { \ | |
34 | int res; \ | |
394b701c MP |
35 | u32 data = 0; \ |
36 | if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ | |
ad1e9380 | 37 | res = mport->ops->lcread(mport, mport->id, offset, len, &data); \ |
394b701c | 38 | *value = (type)data; \ |
394b701c MP |
39 | return res; \ |
40 | } | |
41 | ||
42 | /** | |
43 | * RIO_LOP_WRITE - Generate rio_local_write_config_* functions | |
44 | * @size: Size of configuration space write (8, 16, 32 bits) | |
45 | * @type: C type of value argument | |
46 | * @len: Length of configuration space write (1, 2, 4 bytes) | |
47 | * | |
48 | * Generates rio_local_write_config_* functions used to access | |
49 | * configuration space registers on the local device. | |
50 | */ | |
51 | #define RIO_LOP_WRITE(size,type,len) \ | |
52 | int __rio_local_write_config_##size \ | |
53 | (struct rio_mport *mport, u32 offset, type value) \ | |
54 | { \ | |
394b701c | 55 | if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ |
31d1e130 | 56 | return mport->ops->lcwrite(mport, mport->id, offset, len, value);\ |
394b701c MP |
57 | } |
58 | ||
59 | RIO_LOP_READ(8, u8, 1) | |
60 | RIO_LOP_READ(16, u16, 2) | |
61 | RIO_LOP_READ(32, u32, 4) | |
62 | RIO_LOP_WRITE(8, u8, 1) | |
63 | RIO_LOP_WRITE(16, u16, 2) | |
64 | RIO_LOP_WRITE(32, u32, 4) | |
65 | ||
66 | EXPORT_SYMBOL_GPL(__rio_local_read_config_8); | |
67 | EXPORT_SYMBOL_GPL(__rio_local_read_config_16); | |
68 | EXPORT_SYMBOL_GPL(__rio_local_read_config_32); | |
69 | EXPORT_SYMBOL_GPL(__rio_local_write_config_8); | |
70 | EXPORT_SYMBOL_GPL(__rio_local_write_config_16); | |
71 | EXPORT_SYMBOL_GPL(__rio_local_write_config_32); | |
72 | ||
73 | /** | |
74 | * RIO_OP_READ - Generate rio_mport_read_config_* functions | |
75 | * @size: Size of configuration space read (8, 16, 32 bits) | |
76 | * @type: C type of value argument | |
77 | * @len: Length of configuration space read (1, 2, 4 bytes) | |
78 | * | |
79 | * Generates rio_mport_read_config_* functions used to access | |
80 | * configuration space registers on the local device. | |
81 | */ | |
82 | #define RIO_OP_READ(size,type,len) \ | |
83 | int rio_mport_read_config_##size \ | |
84 | (struct rio_mport *mport, u16 destid, u8 hopcount, u32 offset, type *value) \ | |
85 | { \ | |
86 | int res; \ | |
394b701c MP |
87 | u32 data = 0; \ |
88 | if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ | |
ad1e9380 | 89 | res = mport->ops->cread(mport, mport->id, destid, hopcount, offset, len, &data); \ |
394b701c | 90 | *value = (type)data; \ |
394b701c MP |
91 | return res; \ |
92 | } | |
93 | ||
94 | /** | |
95 | * RIO_OP_WRITE - Generate rio_mport_write_config_* functions | |
96 | * @size: Size of configuration space write (8, 16, 32 bits) | |
97 | * @type: C type of value argument | |
98 | * @len: Length of configuration space write (1, 2, 4 bytes) | |
99 | * | |
100 | * Generates rio_mport_write_config_* functions used to access | |
101 | * configuration space registers on the local device. | |
102 | */ | |
103 | #define RIO_OP_WRITE(size,type,len) \ | |
104 | int rio_mport_write_config_##size \ | |
105 | (struct rio_mport *mport, u16 destid, u8 hopcount, u32 offset, type value) \ | |
106 | { \ | |
394b701c | 107 | if (RIO_##size##_BAD) return RIO_BAD_SIZE; \ |
31d1e130 IN |
108 | return mport->ops->cwrite(mport, mport->id, destid, hopcount, \ |
109 | offset, len, value); \ | |
394b701c MP |
110 | } |
111 | ||
112 | RIO_OP_READ(8, u8, 1) | |
113 | RIO_OP_READ(16, u16, 2) | |
114 | RIO_OP_READ(32, u32, 4) | |
115 | RIO_OP_WRITE(8, u8, 1) | |
116 | RIO_OP_WRITE(16, u16, 2) | |
117 | RIO_OP_WRITE(32, u32, 4) | |
118 | ||
119 | EXPORT_SYMBOL_GPL(rio_mport_read_config_8); | |
120 | EXPORT_SYMBOL_GPL(rio_mport_read_config_16); | |
121 | EXPORT_SYMBOL_GPL(rio_mport_read_config_32); | |
122 | EXPORT_SYMBOL_GPL(rio_mport_write_config_8); | |
123 | EXPORT_SYMBOL_GPL(rio_mport_write_config_16); | |
124 | EXPORT_SYMBOL_GPL(rio_mport_write_config_32); | |
125 | ||
126 | /** | |
127 | * rio_mport_send_doorbell - Send a doorbell message | |
128 | * | |
129 | * @mport: RIO master port | |
130 | * @destid: RIO device destination ID | |
131 | * @data: Doorbell message data | |
132 | * | |
133 | * Send a doorbell message to a RIO device. The doorbell message | |
134 | * has a 16-bit info field provided by the data argument. | |
135 | */ | |
136 | int rio_mport_send_doorbell(struct rio_mport *mport, u16 destid, u16 data) | |
137 | { | |
31d1e130 | 138 | return mport->ops->dsend(mport, mport->id, destid, data); |
394b701c MP |
139 | } |
140 | ||
141 | EXPORT_SYMBOL_GPL(rio_mport_send_doorbell); |