[Skiboot] [PATCH] RFC: Add SKIBOOT_CONFIG_FSP build option to enable/disable FSP support

Stewart Smith stewart at linux.vnet.ibm.com
Thu Nov 19 08:12:52 AEDT 2015


A *very* early crack at having a build config option (I do *not* intend
to merge this as is).

We save around 197kb of space in skiboot.lid when built with
SKIBOOT_CONFIG_FSP=0 (default is to enable).

The end goal is to have a way to avoid the upcoming "oh no, we ran out
of space in the 1MB pnor partition".

Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>
---
 Makefile.main          | 14 ++++++++++++++
 asm/head.S             |  8 ++++++++
 core/fast-reboot.c     |  2 ++
 core/hostservices.c    | 25 +++++++++++++++++++++----
 core/init.c            | 10 +++++++++-
 core/opal.c            |  2 ++
 core/vpd.c             | 10 ++++++++++
 hw/Makefile.inc        |  2 ++
 hw/occ.c               |  8 ++++++++
 hw/psi.c               |  8 +++++++-
 include/fsp.h          |  5 +++++
 include/op-panel.h     |  8 +++++++-
 platforms/Makefile.inc |  2 ++
 13 files changed, 97 insertions(+), 7 deletions(-)

diff --git a/Makefile.main b/Makefile.main
index c45eff5f9a2e..92f17f4ee6e5 100644
--- a/Makefile.main
+++ b/Makefile.main
@@ -69,6 +69,18 @@ ifeq ($(SKIBOOT_GCOV),1)
 CFLAGS += -fprofile-arcs -ftest-coverage -DSKIBOOT_GCOV=1
 endif
 
+ifeq ($(SKIBOOT_CONFIG_FSP),0)
+CFLAGS += -DCONFIG_FSP=0
+HOSTCFLAGS += -DCONFIG_FSP=0
+ASFLAGS += -DCONFIG_FSP=0
+else
+CFLAGS += -DCONFIG_FSP=1
+HOSTCFLAGS += -DCONFIG_FSP=1
+ASFLAGS += -DCONFIG_FSP=1
+SKIBOOT_CONFIG_FSP=1
+endif
+
+
 ifeq ($(STACK_CHECK),1)
 CFLAGS += -fstack-protector-all -pg
 CPPFLAGS += -DSTACK_CHECK_ENABLED
@@ -144,7 +156,9 @@ include $(SRC)/libflash/Makefile.inc
 include $(SRC)/libpore/Makefile.inc
 include $(SRC)/libc/Makefile.inc
 include $(SRC)/ccan/Makefile.inc
+ifeq ($(SKIBOOT_CONFIG_FSP),1)
 include $(SRC)/$(DEVSRC)/Makefile.inc
+endif
 
 # hack for travis-ci and coverity
 gard:
diff --git a/asm/head.S b/asm/head.S
index 6963188463ae..3e0be808269e 100644
--- a/asm/head.S
+++ b/asm/head.S
@@ -735,7 +735,11 @@ naca:
 	.llong	hv_release_data		/* 0x0018 : HV release data */
 	.llong	0			/* 0x0020 : Reserved */
 	.llong	0			/* 0x0028 : Reserved */
+#if CONFIG_FSP
 	.llong	spira			/* 0x0030 : SP Interface Root */
+#else
+	.llong  0
+#endif
 	.llong	hv_lid_load_table	/* 0x0038 : LID load table */
 	.llong	0			/* 0x0040 : Reserved */
 	.space	68
@@ -778,7 +782,11 @@ hv_lid_load_table:
 opal_naca:
 	.llong	opal_boot_trampoline	/* Primary entry (used ?) */
 	.llong	opal_boot_trampoline	/* Secondary entry (used ?) */
+#if CONFIG_FSP
 	.llong	spira			/* Spira pointer */
+#else
+	.llong  0
+#endif
 	.llong	0			/* Load address */
 	.llong	opal_boot_trampoline	/* 0x180 trampoline */
 	.llong	0			/* More stuff as seen in objdump ...*/
diff --git a/core/fast-reboot.c b/core/fast-reboot.c
index 30b77e9bc294..4e798bcec82a 100644
--- a/core/fast-reboot.c
+++ b/core/fast-reboot.c
@@ -322,8 +322,10 @@ void __noreturn fast_reboot(void)
 	/* Set our state to active */
 	this_cpu()->state = cpu_state_active;
 
+#if CONFIG_FSP
 	/* Poke the consoles (see comments in the code there) */
 	fsp_console_reset();
+#endif
 
 	/* Reset/EOI the PSI interrupt */
 	psi_irq_reset();
diff --git a/core/hostservices.c b/core/hostservices.c
index 672b57f883cf..76480a13b935 100644
--- a/core/hostservices.c
+++ b/core/hostservices.c
@@ -265,10 +265,13 @@ struct hbrt_elog_ent {
 	struct list_node link;
 };
 static LIST_HEAD(hbrt_elogs);
+#if CONFIG_FSP
 static struct lock hbrt_elog_lock = LOCK_UNLOCKED;
 static bool hbrt_elog_sending;
 static void hservice_start_elog_send(void);
+#endif /* CONFIG_FSP */
 
+#if CONFIG_FSP == 1
 static void hservice_elog_write_complete(struct fsp_msg *msg)
 {
 	struct hbrt_elog_ent *ent = msg->user_data;
@@ -290,7 +293,7 @@ static void hservice_start_elog_send(void)
 	struct fsp_msg *msg;
 	struct hbrt_elog_ent *ent;
 
- again:
+again:
 	if (list_empty(&hbrt_elogs))
 		return;
 	ent = list_pop(&hbrt_elogs, struct hbrt_elog_ent, link);
@@ -314,7 +317,7 @@ static void hservice_start_elog_send(void)
 	if (!fsp_queue_msg(msg, hservice_elog_write_complete))
 		return;
 	prerror("FSP: Error queueing elog update\n");
- error:
+error:
 	if (msg)
 		fsp_freemsg(msg);
 	fsp_tce_unmap(PSI_DMA_HBRT_LOG_WRITE_BUF,
@@ -324,12 +327,18 @@ static void hservice_start_elog_send(void)
 	hbrt_elog_sending = false;
 	goto again;
 }
+#endif /* CONFIG_FSP */
 
 static int hservice_send_error_log(uint32_t plid, uint32_t dsize, void *data)
 {
+#if CONFIG_FSP
 	struct hbrt_elog_ent *ent;
 	void *abuf;
-
+#else
+	(void)plid;
+	(void)dsize;
+	(void)data;
+#endif
 	prlog(PR_ERR, "HBRT: Error log generated with plid 0x%08x\n", plid);
 
 	/* We only know how to send error logs to FSP */
@@ -337,6 +346,7 @@ static int hservice_send_error_log(uint32_t plid, uint32_t dsize, void *data)
 		prerror("HBRT: Warning, error log from HBRT discarded !\n");
 		return OPAL_UNSUPPORTED;
 	}
+#if CONFIG_FSP
 	if (dsize > PSI_DMA_HBRT_LOG_WRITE_BUF_SZ) {
 		prerror("HBRT: Warning, error log from HBRT too big (%d) !\n",
 			dsize);
@@ -368,7 +378,7 @@ static int hservice_send_error_log(uint32_t plid, uint32_t dsize, void *data)
 	if (!hbrt_elog_sending)
 		hservice_start_elog_send();
 	unlock(&hbrt_elog_lock);
-
+#endif /* CONFIG_FSP */
 	return 0;
 }
 
@@ -394,6 +404,7 @@ struct hbrt_lid {
 };
 static LIST_HEAD(hbrt_lid_list);
 
+#if CONFIG_FSP
 static bool hbrt_lid_preload_complete = false;
 
 bool hservices_lid_preload_complete(void)
@@ -509,6 +520,7 @@ static int hservice_lid_unload(void *buf __unused)
 	/* We do nothing as the LID is held in cache */
 	return 0;
 }
+#endif /* CONFIG_FSP */
 
 static uint64_t hservice_get_reserved_mem(const char *name)
 {
@@ -757,8 +769,13 @@ static struct host_interfaces hinterface = {
 	.send_error_log = hservice_send_error_log,
 	.scom_read = hservice_scom_read,
 	.scom_write = hservice_scom_write,
+#if CONFIG_FSP
 	.lid_load = hservice_lid_load,
 	.lid_unload = hservice_lid_unload,
+#else
+	.lid_load = NULL,
+	.lid_unload = NULL,
+#endif
 	.get_reserved_mem = hservice_get_reserved_mem,
 	.wakeup = hservice_wakeup,
 	.nanosleep = hservice_nanosleep,
diff --git a/core/init.c b/core/init.c
index 54a5735f8239..98b97c50884b 100644
--- a/core/init.c
+++ b/core/init.c
@@ -16,7 +16,9 @@
 
 #include <skiboot.h>
 #include <fsp.h>
+#if CONFIG_FSP == 1
 #include <fsp-sysparam.h>
+#endif
 #include <psi.h>
 #include <chiptod.h>
 #include <nx.h>
@@ -408,6 +410,7 @@ void __noreturn load_and_boot_kernel(bool is_reboot)
 
 	ipmi_set_fw_progress_sensor(IPMI_FW_OS_BOOT);
 
+#if CONFIG_FSP == 1
 	if (!is_reboot) {
 		/* We wait for the nvram read to complete here so we can
 		 * grab stuff from there such as the kernel arguments
@@ -418,7 +421,7 @@ void __noreturn load_and_boot_kernel(bool is_reboot)
 		fsp_code_update_wait_vpd(true);
 	}
 	fsp_console_select_stdout();
-
+#endif
 	/*
 	 * OCC takes few secs to boot.  Call this as late as
 	 * as possible to avoid delay.
@@ -552,6 +555,7 @@ static void do_ctors(void)
 
 void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 {
+	(void)master_cpu;
 	/*
 	 * WARNING: At this point. the timebases have
 	 * *not* been synchronized yet. Do not use any timebase
@@ -608,11 +612,15 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
 	 * Hack alert: When entering via the OPAL entry point, fdt
 	 * is set to -1, we record that and pass it to parse_hdat
 	 */
+#if CONFIG_FSP
 	if (fdt == (void *)-1ul)
 		parse_hdat(true, master_cpu);
 	else if (fdt == NULL)
 		parse_hdat(false, master_cpu);
 	else {
+#else
+	{
+#endif /* CONFIG_FSP */
 		dt_expand(fdt);
 	}
 
diff --git a/core/opal.c b/core/opal.c
index b6411f0c9b06..bc635aa52693 100644
--- a/core/opal.c
+++ b/core/opal.c
@@ -329,7 +329,9 @@ static int64_t opal_poll_events(__be64 *outstanding_event_mask)
 
 	/* Test the host initiated reset */
 	if (hir_trigger == 0xdeadbeef) {
+#if CONFIG_FSP == 1
 		fsp_trigger_reset();
+#endif
 		hir_trigger = 0;
 	}
 
diff --git a/core/vpd.c b/core/vpd.c
index 85a993730946..85c80c52c8b6 100644
--- a/core/vpd.c
+++ b/core/vpd.c
@@ -116,12 +116,17 @@ const void *vpd_find(const void *vpd, size_t vpd_size,
 }
 
 static void *vpd;
+#if CONFIG_FSP
 static size_t vpd_size;
 static uint32_t vpd_lid_no;
+#endif
 
 /* Helper to load a VPD LID. Pass a ptr to the corresponding LX keyword */
 static void *vpd_lid_preload(const uint8_t *lx)
 {
+#if !CONFIG_FSP
+	(void)lx;
+#else
 	int rc;
 
 	/* Now this is a guess game as we don't have the info from the
@@ -166,11 +171,15 @@ static void *vpd_lid_preload(const uint8_t *lx)
 	return vpd;
  fail:
 	free(vpd);
+#endif /* CONFIG_FSP */
 	return NULL;
 }
 
 void vpd_iohub_load(struct dt_node *hub_node)
 {
+#if !CONFIG_FSP
+	(void)hub_node;
+#else
 	char record[4] = "LXR0";
 	const void *valid_lx;
 	uint8_t lx_size;
@@ -225,6 +234,7 @@ void vpd_iohub_load(struct dt_node *hub_node)
 fail:
 	free(vpd);
 	vpd = NULL;
+#endif /* CONFIG_FSP */
 	prerror("VPD: Failed to load VPD LID\n");
 	return;
 }
diff --git a/hw/Makefile.inc b/hw/Makefile.inc
index a9dd9f1fc0bd..72c470a4e7b9 100644
--- a/hw/Makefile.inc
+++ b/hw/Makefile.inc
@@ -9,7 +9,9 @@ HW_OBJS += phb3.o sfc-ctrl.o fake-rtc.o bt.o p8-i2c.o prd.o
 HW_OBJS += dts.o lpc-rtc.o npu.o npu-hw-procedures.o
 HW=hw/built-in.o
 
+ifeq ($(SKIBOOT_CONFIG_FSP),1)
 include $(SRC)/hw/fsp/Makefile.inc
+endif
 include $(SRC)/hw/ec/Makefile.inc
 include $(SRC)/hw/ast-bmc/Makefile.inc
 include $(SRC)/hw/ipmi/Makefile.inc
diff --git a/hw/occ.c b/hw/occ.c
index 0e3d95366b20..a2dfb1d618c9 100644
--- a/hw/occ.c
+++ b/hw/occ.c
@@ -62,6 +62,7 @@ struct occ_pstate_table {
 	struct occ_pstate_entry pstates[MAX_PSTATES];
 };
 
+#if CONFIG_FSP == 1
 DEFINE_LOG_ENTRY(OPAL_RC_OCC_LOAD, OPAL_PLATFORM_ERR_EVT, OPAL_OCC,
 		OPAL_CEC_HARDWARE, OPAL_PREDICTIVE_ERR_GENERAL,
 		OPAL_NA);
@@ -69,6 +70,7 @@ DEFINE_LOG_ENTRY(OPAL_RC_OCC_LOAD, OPAL_PLATFORM_ERR_EVT, OPAL_OCC,
 DEFINE_LOG_ENTRY(OPAL_RC_OCC_RESET, OPAL_PLATFORM_ERR_EVT, OPAL_OCC,
 		OPAL_CEC_HARDWARE, OPAL_PREDICTIVE_ERR_GENERAL,
 		OPAL_NA);
+#endif
 
 DEFINE_LOG_ENTRY(OPAL_RC_OCC_PSTATE_INIT, OPAL_PLATFORM_ERR_EVT, OPAL_OCC,
 		OPAL_CEC_HARDWARE, OPAL_INFO,
@@ -497,6 +499,7 @@ int find_master_and_slave_occ(uint64_t **master, uint64_t **slave,
 	}
 	return 0;
 }
+#if CONFIG_FSP == 1
 
 static void occ_queue_load(u8 scope, u32 dbob_id, u32 seq_id)
 {
@@ -717,6 +720,7 @@ static void occ_do_reset(u8 scope, u32 dbob_id, u32 seq_id)
 		}
 	}
 }
+#endif /* CONFIG_FSP */
 
 #define PV_OCC_GP0		0x01000000
 #define PV_OCC_GP0_AND		0x01000004
@@ -746,6 +750,7 @@ void occ_pnor_set_owner(enum pnor_owner owner)
 		occ_pnor_set_one_owner(chip->id, owner);
 }
 
+#if CONFIG_FSP
 static bool fsp_occ_msg(u32 cmd_sub_mod, struct fsp_msg *msg)
 {
 	u32 dbob_id, seq_id;
@@ -787,6 +792,7 @@ static bool fsp_occ_msg(u32 cmd_sub_mod, struct fsp_msg *msg)
 static struct fsp_client fsp_occ_client = {
 	.message = fsp_occ_msg,
 };
+#endif /* CONFIG_FSP */
 
 #define OCB_OCI_OCCMISC		0x6a020
 #define OCB_OCI_OCCMISC_AND	0x6a021
@@ -857,6 +863,7 @@ void occ_interrupt(uint32_t chip_id)
 		xscom_write(chip_id, OCB_OCI_OCCMISC_OR, OCB_OCI_OCIMISC_IRQ);
 }
 
+#if CONFIG_FSP == 1
 void occ_fsp_init(void)
 {
 	/* OCC is P8 only */
@@ -867,5 +874,6 @@ void occ_fsp_init(void)
 	if (fsp_present())
 		fsp_register_client(&fsp_occ_client, FSP_MCLASS_OCC);
 }
+#endif /* CONFIG_FSP */
 
 
diff --git a/hw/psi.c b/hw/psi.c
index 0823ec80f268..d0cfb085c86f 100644
--- a/hw/psi.c
+++ b/hw/psi.c
@@ -196,7 +196,9 @@ static void psi_link_poll(void *data __unused)
 				psi_activate_phb(psi);
 				psi_set_link_polling(false);
 				unlock(&psi_lock);
+#if CONFIG_FSP
 				fsp_reinit_fsp();
+#endif /* CONFIG_FSP */
 				return;
 			}
 		}
@@ -381,8 +383,10 @@ static void psi_interrupt(void *data, uint32_t isn __unused)
 		 */
 		if (!psi->active)
 			psi_spurious_fsp_irq(psi);
+#if CONFIG_FSP
 		else
 			fsp_interrupt();
+#endif /* CONFIG_FSP */
 	}
 
 	 /* P8 additional interrupt? */
@@ -392,7 +396,9 @@ static void psi_interrupt(void *data, uint32_t isn __unused)
 	/* Poll the console buffers on any interrupt since we don't
 	 * get send notifications
 	 */
-	fsp_console_poll(NULL);
+#if CONFIG_FSP
+		fsp_console_poll(NULL);
+#endif
 }
 
 static int64_t psi_p7_set_xive(void *data, uint32_t isn __unused,
diff --git a/include/fsp.h b/include/fsp.h
index a61bd58eb239..a2b068bb5689 100644
--- a/include/fsp.h
+++ b/include/fsp.h
@@ -24,6 +24,10 @@
 #include <skiboot.h>
 #include <psi.h>
 
+#if !CONFIG_FSP
+static inline bool fsp_present(void) { return false; }
+#else
+
 /* Current max number of FSPs
  * one primary and one secondary is all we support
  */
@@ -831,4 +835,5 @@ extern void fsp_chiptod_init(void);
 /* Terminate immediate */
 extern void __attribute__((noreturn)) ibm_fsp_terminate(const char *msg);
 
+#endif /* CONFIG_FSP */
 #endif /* __FSP_H */
diff --git a/include/op-panel.h b/include/op-panel.h
index dfb4e11a376d..1277827a2b38 100644
--- a/include/op-panel.h
+++ b/include/op-panel.h
@@ -57,11 +57,17 @@ enum op_module {
  * 'BA070002' : MS VPD doesn't have an MSAC
  * 'BA070003' : MS VPD doesn't have a total config
  */
-
+#if CONFIG_FSP
 extern void op_display(enum op_severity, enum op_module, uint16_t code);
 
 extern void op_panel_disable_src_echo(void);
 extern void op_panel_clear_src(void);
+#else
+static inline void op_display(enum op_severity s, enum op_module m, uint16_t code) { (void)s; (void)m; (void)code; }
+static inline void op_panel_disable_src_echo(void) {}
+static inline void op_panel_clear_src(void) {}
+#endif /* CONFIG_FSP */
+
 extern void fsp_oppanel_init(void);
 
 #endif /* __OP_PANEL_H */
diff --git a/platforms/Makefile.inc b/platforms/Makefile.inc
index 90cd0f1c3762..e31d48f69809 100644
--- a/platforms/Makefile.inc
+++ b/platforms/Makefile.inc
@@ -3,7 +3,9 @@ PLATDIR = platforms
 SUBDIRS += $(PLATDIR)
 PLATFORMS = $(PLATDIR)/built-in.o
 
+ifeq ($(SKIBOOT_CONFIG_FSP),1)
 include $(SRC)/$(PLATDIR)/ibm-fsp/Makefile.inc
+endif
 include $(SRC)/$(PLATDIR)/rhesus/Makefile.inc
 include $(SRC)/$(PLATDIR)/astbmc/Makefile.inc
 include $(SRC)/$(PLATDIR)/mambo/Makefile.inc
-- 
2.1.4



More information about the Skiboot mailing list