diff options
Diffstat (limited to 'include/asm-x86/processor-cyrix.h')
| -rw-r--r-- | include/asm-x86/processor-cyrix.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/include/asm-x86/processor-cyrix.h b/include/asm-x86/processor-cyrix.h new file mode 100644 index 000000000000..97568ada1f97 --- /dev/null +++ b/include/asm-x86/processor-cyrix.h | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | /* | ||
| 2 | * NSC/Cyrix CPU indexed register access. Must be inlined instead of | ||
| 3 | * macros to ensure correct access ordering | ||
| 4 | * Access order is always 0x22 (=offset), 0x23 (=value) | ||
| 5 | * | ||
| 6 | * When using the old macros a line like | ||
| 7 | * setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88); | ||
| 8 | * gets expanded to: | ||
| 9 | * do { | ||
| 10 | * outb((CX86_CCR2), 0x22); | ||
| 11 | * outb((({ | ||
| 12 | * outb((CX86_CCR2), 0x22); | ||
| 13 | * inb(0x23); | ||
| 14 | * }) | 0x88), 0x23); | ||
| 15 | * } while (0); | ||
| 16 | * | ||
| 17 | * which in fact violates the access order (= 0x22, 0x22, 0x23, 0x23). | ||
| 18 | */ | ||
| 19 | |||
| 20 | static inline u8 getCx86(u8 reg) | ||
| 21 | { | ||
| 22 | outb(reg, 0x22); | ||
| 23 | return inb(0x23); | ||
| 24 | } | ||
| 25 | |||
| 26 | static inline void setCx86(u8 reg, u8 data) | ||
| 27 | { | ||
| 28 | outb(reg, 0x22); | ||
| 29 | outb(data, 0x23); | ||
| 30 | } | ||
