|
@@ -29,24 +29,35 @@
|
|
|
#define FTR_ENTRY_OFFSET PPC_LONG
|
|
|
#endif
|
|
|
|
|
|
+#define START_FTR_SECTION(label) label##1:
|
|
|
+
|
|
|
+#define FTR_SECTION_ELSE_NESTED(label) \
|
|
|
+label##2: \
|
|
|
+ .pushsection __ftr_alt_##label,"a"; \
|
|
|
+ .align 2; \
|
|
|
+label##3:
|
|
|
+
|
|
|
#define MAKE_FTR_SECTION_ENTRY(msk, val, label, sect) \
|
|
|
-99: \
|
|
|
- .section sect,"a"; \
|
|
|
+label##4: \
|
|
|
+ .popsection; \
|
|
|
+ .pushsection sect,"a"; \
|
|
|
.align 3; \
|
|
|
-98: \
|
|
|
+label##5: \
|
|
|
FTR_ENTRY_LONG msk; \
|
|
|
FTR_ENTRY_LONG val; \
|
|
|
- FTR_ENTRY_OFFSET label##b-98b; \
|
|
|
- FTR_ENTRY_OFFSET 99b-98b; \
|
|
|
- .previous
|
|
|
-
|
|
|
+ FTR_ENTRY_OFFSET label##1b-label##5b; \
|
|
|
+ FTR_ENTRY_OFFSET label##2b-label##5b; \
|
|
|
+ FTR_ENTRY_OFFSET label##3b-label##5b; \
|
|
|
+ FTR_ENTRY_OFFSET label##4b-label##5b; \
|
|
|
+ .popsection;
|
|
|
|
|
|
|
|
|
/* CPU feature dependent sections */
|
|
|
-#define BEGIN_FTR_SECTION_NESTED(label) label:
|
|
|
-#define BEGIN_FTR_SECTION BEGIN_FTR_SECTION_NESTED(97)
|
|
|
+#define BEGIN_FTR_SECTION_NESTED(label) START_FTR_SECTION(label)
|
|
|
+#define BEGIN_FTR_SECTION START_FTR_SECTION(97)
|
|
|
|
|
|
-#define END_FTR_SECTION_NESTED(msk, val, label) \
|
|
|
+#define END_FTR_SECTION_NESTED(msk, val, label) \
|
|
|
+ FTR_SECTION_ELSE_NESTED(label) \
|
|
|
MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
|
|
|
|
|
|
#define END_FTR_SECTION(msk, val) \
|
|
@@ -55,12 +66,27 @@
|
|
|
#define END_FTR_SECTION_IFSET(msk) END_FTR_SECTION((msk), (msk))
|
|
|
#define END_FTR_SECTION_IFCLR(msk) END_FTR_SECTION((msk), 0)
|
|
|
|
|
|
+/* CPU feature sections with alternatives, use BEGIN_FTR_SECTION to start */
|
|
|
+#define FTR_SECTION_ELSE FTR_SECTION_ELSE_NESTED(97)
|
|
|
+#define ALT_FTR_SECTION_END_NESTED(msk, val, label) \
|
|
|
+ MAKE_FTR_SECTION_ENTRY(msk, val, label, __ftr_fixup)
|
|
|
+#define ALT_FTR_SECTION_END_NESTED_IFSET(msk, label) \
|
|
|
+ ALT_FTR_SECTION_END_NESTED(msk, msk, label)
|
|
|
+#define ALT_FTR_SECTION_END_NESTED_IFCLR(msk, label) \
|
|
|
+ ALT_FTR_SECTION_END_NESTED(msk, 0, label)
|
|
|
+#define ALT_FTR_SECTION_END(msk, val) \
|
|
|
+ ALT_FTR_SECTION_END_NESTED(msk, val, 97)
|
|
|
+#define ALT_FTR_SECTION_END_IFSET(msk) \
|
|
|
+ ALT_FTR_SECTION_END_NESTED_IFSET(msk, 97)
|
|
|
+#define ALT_FTR_SECTION_END_IFCLR(msk) \
|
|
|
+ ALT_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
|
|
|
|
|
|
/* Firmware feature dependent sections */
|
|
|
-#define BEGIN_FW_FTR_SECTION_NESTED(label) label:
|
|
|
-#define BEGIN_FW_FTR_SECTION BEGIN_FW_FTR_SECTION_NESTED(97)
|
|
|
+#define BEGIN_FW_FTR_SECTION_NESTED(label) START_FTR_SECTION(label)
|
|
|
+#define BEGIN_FW_FTR_SECTION START_FTR_SECTION(97)
|
|
|
|
|
|
-#define END_FW_FTR_SECTION_NESTED(msk, val, label) \
|
|
|
+#define END_FW_FTR_SECTION_NESTED(msk, val, label) \
|
|
|
+ FTR_SECTION_ELSE_NESTED(label) \
|
|
|
MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
|
|
|
|
|
|
#define END_FW_FTR_SECTION(msk, val) \
|
|
@@ -69,6 +95,22 @@
|
|
|
#define END_FW_FTR_SECTION_IFSET(msk) END_FW_FTR_SECTION((msk), (msk))
|
|
|
#define END_FW_FTR_SECTION_IFCLR(msk) END_FW_FTR_SECTION((msk), 0)
|
|
|
|
|
|
+/* Firmware feature sections with alternatives */
|
|
|
+#define FW_FTR_SECTION_ELSE_NESTED(label) FTR_SECTION_ELSE_NESTED(label)
|
|
|
+#define FW_FTR_SECTION_ELSE FTR_SECTION_ELSE_NESTED(97)
|
|
|
+#define ALT_FW_FTR_SECTION_END_NESTED(msk, val, label) \
|
|
|
+ MAKE_FTR_SECTION_ENTRY(msk, val, label, __fw_ftr_fixup)
|
|
|
+#define ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, label) \
|
|
|
+ ALT_FW_FTR_SECTION_END_NESTED(msk, msk, label)
|
|
|
+#define ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, label) \
|
|
|
+ ALT_FW_FTR_SECTION_END_NESTED(msk, 0, label)
|
|
|
+#define ALT_FW_FTR_SECTION_END(msk, val) \
|
|
|
+ ALT_FW_FTR_SECTION_END_NESTED(msk, val, 97)
|
|
|
+#define ALT_FW_FTR_SECTION_END_IFSET(msk) \
|
|
|
+ ALT_FW_FTR_SECTION_END_NESTED_IFSET(msk, 97)
|
|
|
+#define ALT_FW_FTR_SECTION_END_IFCLR(msk) \
|
|
|
+ ALT_FW_FTR_SECTION_END_NESTED_IFCLR(msk, 97)
|
|
|
+
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
|
|
#endif /* __ASM_POWERPC_FEATURE_FIXUPS_H */
|