rules.h, thread.h, lib/cbfs: Add ENV_STAGE_SUPPORTS_COOP

This change consolidates the COOP rules. Co-op in theory works in all
x86 stages now, but it hasn't been enabled yet.

BUG=b:179699789
TEST=Boot guybrush to OS and verify preloads still work

Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Change-Id: I1197406d1d36391998b08e3076146bb2fff59d00
Reviewed-on: https://review.coreboot.org/c/coreboot/+/59550
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
diff --git a/src/include/rules.h b/src/include/rules.h
index d08929c..02b55c5 100644
--- a/src/include/rules.h
+++ b/src/include/rules.h
@@ -303,6 +303,13 @@
 /* When set <arch/smp/spinlock.h> is included for the spinlock implementation. */
 #define ENV_STAGE_SUPPORTS_SMP		(CONFIG(SMP) && STAGE_HAS_SPINLOCKS)
 
+#if ENV_X86 && CONFIG(COOP_MULTITASKING) && (ENV_RAMSTAGE || ENV_ROMSTAGE)
+/* TODO: Enable in all x86 stages */
+#define ENV_STAGE_SUPPORTS_COOP         1
+#else
+#define ENV_STAGE_SUPPORTS_COOP         0
+#endif
+
 /**
  * For pre-DRAM stages and post-CAR always build with simple device model, ie.
  * PCI, PNP and CPU functions operate without use of devicetree. The reason
diff --git a/src/include/thread.h b/src/include/thread.h
index 19b69fa..4f10782 100644
--- a/src/include/thread.h
+++ b/src/include/thread.h
@@ -38,7 +38,7 @@
 /* Waits until the thread has terminated and returns the error code */
 enum cb_err thread_join(struct thread_handle *handle);
 
-#if (ENV_RAMSTAGE || ENV_ROMSTAGE) && CONFIG(COOP_MULTITASKING)
+#if ENV_STAGE_SUPPORTS_COOP
 
 struct thread {
 	int id;
diff --git a/src/lib/cbfs.c b/src/lib/cbfs.c
index 3a044f7..d2a4b84 100644
--- a/src/lib/cbfs.c
+++ b/src/lib/cbfs.c
@@ -359,7 +359,7 @@
 	enum cb_err err;
 	struct cbfs_preload_context *context;
 
-	if (!CONFIG(CBFS_PRELOAD) || (!ENV_RAMSTAGE && !ENV_ROMSTAGE))
+	if (!CONFIG(CBFS_PRELOAD) || !ENV_STAGE_SUPPORTS_COOP)
 		return CB_ERR_ARG;
 
 	context = find_cbfs_preload_context(name);