|
@@ -112,32 +112,21 @@ struct linda {
|
112
|
112
|
* This card requires atomic 64-bit accesses. Strange things happen
|
113
|
113
|
* if you try to use 32-bit accesses; sometimes they work, sometimes
|
114
|
114
|
* they don't, sometimes you get random data.
|
115
|
|
- *
|
116
|
|
- * These accessors use the "movq" MMX instruction, and so won't work
|
117
|
|
- * on really old Pentiums (which won't have PCIe anyway, so this is
|
118
|
|
- * something of a moot point).
|
119
|
115
|
*/
|
120
|
116
|
|
121
|
117
|
/**
|
122
|
118
|
* Read Linda qword register
|
123
|
119
|
*
|
124
|
120
|
* @v linda Linda device
|
125
|
|
- * @v dwords Register buffer to read into
|
|
121
|
+ * @v qword Register buffer to read into
|
126
|
122
|
* @v offset Register offset
|
127
|
123
|
*/
|
128
|
|
-static void linda_readq ( struct linda *linda, uint32_t *dwords,
|
|
124
|
+static void linda_readq ( struct linda *linda, uint64_t *qword,
|
129
|
125
|
unsigned long offset ) {
|
130
|
|
- void *addr = ( linda->regs + offset );
|
131
|
|
-
|
132
|
|
- __asm__ __volatile__ ( "movq (%1), %%mm0\n\t"
|
133
|
|
- "movq %%mm0, (%0)\n\t"
|
134
|
|
- : : "r" ( dwords ), "r" ( addr ) : "memory" );
|
135
|
|
-
|
136
|
|
- DBGIO ( "[%08lx] => %08x%08x\n",
|
137
|
|
- virt_to_phys ( addr ), dwords[1], dwords[0] );
|
|
126
|
+ *qword = readq ( linda->regs + offset );
|
138
|
127
|
}
|
139
|
128
|
#define linda_readq( _linda, _ptr, _offset ) \
|
140
|
|
- linda_readq ( (_linda), (_ptr)->u.dwords, (_offset) )
|
|
129
|
+ linda_readq ( (_linda), (_ptr)->u.qwords, (_offset) )
|
141
|
130
|
#define linda_readq_array8b( _linda, _ptr, _offset, _idx ) \
|
142
|
131
|
linda_readq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) )
|
143
|
132
|
#define linda_readq_array64k( _linda, _ptr, _offset, _idx ) \
|
|
@@ -147,22 +136,15 @@ static void linda_readq ( struct linda *linda, uint32_t *dwords,
|
147
|
136
|
* Write Linda qword register
|
148
|
137
|
*
|
149
|
138
|
* @v linda Linda device
|
150
|
|
- * @v dwords Register buffer to write
|
|
139
|
+ * @v qword Register buffer to write
|
151
|
140
|
* @v offset Register offset
|
152
|
141
|
*/
|
153
|
|
-static void linda_writeq ( struct linda *linda, const uint32_t *dwords,
|
|
142
|
+static void linda_writeq ( struct linda *linda, const uint64_t *qword,
|
154
|
143
|
unsigned long offset ) {
|
155
|
|
- void *addr = ( linda->regs + offset );
|
156
|
|
-
|
157
|
|
- DBGIO ( "[%08lx] <= %08x%08x\n",
|
158
|
|
- virt_to_phys ( addr ), dwords[1], dwords[0] );
|
159
|
|
-
|
160
|
|
- __asm__ __volatile__ ( "movq (%0), %%mm0\n\t"
|
161
|
|
- "movq %%mm0, (%1)\n\t"
|
162
|
|
- : : "r" ( dwords ), "r" ( addr ) : "memory" );
|
|
144
|
+ writeq ( *qword, ( linda->regs + offset ) );
|
163
|
145
|
}
|
164
|
146
|
#define linda_writeq( _linda, _ptr, _offset ) \
|
165
|
|
- linda_writeq ( (_linda), (_ptr)->u.dwords, (_offset) )
|
|
147
|
+ linda_writeq ( (_linda), (_ptr)->u.qwords, (_offset) )
|
166
|
148
|
#define linda_writeq_array8b( _linda, _ptr, _offset, _idx ) \
|
167
|
149
|
linda_writeq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) )
|
168
|
150
|
#define linda_writeq_array64k( _linda, _ptr, _offset, _idx ) \
|