aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2015-02-18 14:57:28 +1100
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-02-18 15:40:42 +1100
commit789c171a6783918783855eb195a9502dfe3791ba (patch)
tree37f7b2bc1e1832e5db438a200e69f8b33ade1a4e
parent0aecda9cb221649e184fdfb9c9cb11be37d60f51 (diff)
downloadskiboot-789c171a6783918783855eb195a9502dfe3791ba.zip
skiboot-789c171a6783918783855eb195a9502dfe3791ba.tar.gz
skiboot-789c171a6783918783855eb195a9502dfe3791ba.tar.bz2
Replace is_mambo_chip with a better chip quirk mechanism
And add some basic qemu quirks Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
-rw-r--r--core/chip.c14
-rw-r--r--core/init.c4
-rw-r--r--hw/chiptod.c4
-rw-r--r--hw/homer.c2
-rw-r--r--hw/occ.c4
-rw-r--r--hw/slw.c2
-rw-r--r--hw/xscom.c2
-rw-r--r--include/chip.h18
8 files changed, 35 insertions, 15 deletions
diff --git a/core/chip.c b/core/chip.c
index b805fe1..2ba7b6e 100644
--- a/core/chip.c
+++ b/core/chip.c
@@ -20,7 +20,7 @@
#include <device.h>
static struct proc_chip *chips[MAX_CHIPS];
-bool is_mambo_chip;
+enum proc_chip_quirks proc_chip_quirks;
uint32_t pir_to_chip_id(uint32_t pir)
{
@@ -68,8 +68,16 @@ void init_chips(void)
struct dt_node *xn;
/* Detect mambo chip */
- if (dt_find_by_path(dt_root, "/mambo"))
- is_mambo_chip = true;
+ if (dt_find_by_path(dt_root, "/mambo")) {
+ proc_chip_quirks |= QUIRK_NO_CHIPTOD | QUIRK_MAMBO_CALLOUTS
+ | QUIRK_NO_F000F | QUIRK_NO_PBA | QUIRK_NO_OCC_IRQ
+ | QUIRK_DISABLE_NAP;
+ prlog(PR_NOTICE, "CHIP: Detected Mambo simulator\n");
+ }
+ if (dt_node_is_compatible(dt_root, "qemu,powernv")) {
+ proc_chip_quirks |= QUIRK_NO_CHIPTOD | QUIRK_NO_PBA | QUIRK_NO_OCC_IRQ;
+ prlog(PR_NOTICE, "CHIP: Detected Qemu simulator\n");
+ }
/* We walk the chips based on xscom nodes in the tree */
dt_for_each_compatible(dt_root, xn, "ibm,xscom") {
diff --git a/core/init.c b/core/init.c
index 42b56c1..681fa22 100644
--- a/core/init.c
+++ b/core/init.c
@@ -559,7 +559,7 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
* to access chips via that path early on.
*/
init_chips();
- if (is_mambo_chip)
+ if (chip_quirk(QUIRK_MAMBO_CALLOUTS))
enable_mambo_console();
xscom_init();
mfsi_init();
@@ -628,7 +628,7 @@ void __noreturn main_cpu_entry(const void *fdt, u32 master_cpu)
* value (so they appear to go backward at this point), and synchronize
* all core timebases to the global ChipTOD network
*/
- chiptod_init(master_cpu);
+ chiptod_init();
/* Initialize i2c */
p8_i2c_init();
diff --git a/hw/chiptod.c b/hw/chiptod.c
index 804e2c8..88bc466 100644
--- a/hw/chiptod.c
+++ b/hw/chiptod.c
@@ -770,8 +770,8 @@ void chiptod_init(void)
struct cpu_thread *cpu0, *cpu;
bool sres;
- /* Mambo doesn't simulate the chiptod */
- if (is_mambo_chip)
+ /* Mambo and qemu doesn't simulate the chiptod */
+ if (chip_quirk(QUIRK_NO_CHIPTOD))
return;
op_display(OP_LOG, OP_MOD_CHIPTOD, 0);
diff --git a/hw/homer.c b/hw/homer.c
index 6145e25..95ae73a 100644
--- a/hw/homer.c
+++ b/hw/homer.c
@@ -111,7 +111,7 @@ void homer_init(void)
{
struct proc_chip *chip;
- if (proc_gen != proc_gen_p8 || is_mambo_chip)
+ if (proc_gen != proc_gen_p8 || chip_quirk(QUIRK_NO_PBA))
return;
/*
diff --git a/hw/occ.c b/hw/occ.c
index 1e47b8f..6dbbe6b 100644
--- a/hw/occ.c
+++ b/hw/occ.c
@@ -538,8 +538,8 @@ static struct fsp_client fsp_occ_client = {
void occ_send_dummy_interrupt(void)
{
- /* Mambo chip and P7 don't do this */
- if (is_mambo_chip || proc_gen != proc_gen_p8)
+ /* Emulators and P7 doesn't do this */
+ if (proc_gen != proc_gen_p8 || chip_quirk(QUIRK_NO_OCC_IRQ))
return;
xscom_writeme(OCB_OCI_OCCMISC_OR,
OCB_OCI_OCIMISC_IRQ |
diff --git a/hw/slw.c b/hw/slw.c
index a196540..458560c 100644
--- a/hw/slw.c
+++ b/hw/slw.c
@@ -525,7 +525,7 @@ static void add_cpu_idle_state_properties(void)
/* Mambo currently misbehaves in nap mode vs. timebase, so let's
* disable idle states
*/
- if (is_mambo_chip)
+ if (chip_quirk(QUIRK_DISABLE_NAP))
return;
/*
diff --git a/hw/xscom.c b/hw/xscom.c
index 33c04b1..3914bbf 100644
--- a/hw/xscom.c
+++ b/hw/xscom.c
@@ -441,7 +441,7 @@ static void xscom_init_chip_info(struct proc_chip *chip)
/* Mambo chip model lacks the f000f register, just make
* something up (Murano DD2.1)
*/
- if (is_mambo_chip)
+ if (chip_quirk(QUIRK_NO_F000F))
val = 0x221EF04980000000;
else
rc = xscom_read(chip->id, 0xf000f, &val);
diff --git a/include/chip.h b/include/chip.h
index 83671fa..ae0902f 100644
--- a/include/chip.h
+++ b/include/chip.h
@@ -89,6 +89,21 @@ enum proc_chip_type {
PROC_CHIP_P8_VENICE,
};
+/* Simulator quirks */
+enum proc_chip_quirks {
+ QUIRK_NO_CHIPTOD = 0x00000001,
+ QUIRK_MAMBO_CALLOUTS = 0x00000002,
+ QUIRK_NO_F000F = 0x00000004,
+ QUIRK_NO_PBA = 0x00000008,
+ QUIRK_NO_OCC_IRQ = 0x00000010,
+ QUIRK_DISABLE_NAP = 0x00000020,
+} proc_chip_quirks;
+
+static inline bool chip_quirk(unsigned int q)
+{
+ return !!(proc_chip_quirks & q);
+}
+
#define MAX_CHIPS (1 << 6) /* 6-bit chip ID */
/*
@@ -139,9 +154,6 @@ struct proc_chip {
struct list_head i2cms;
};
-/* Mambo simplified chip model lacks some features, handle it here */
-extern bool is_mambo_chip;
-
extern uint32_t pir_to_chip_id(uint32_t pir);
extern uint32_t pir_to_core_id(uint32_t pir);
extern uint32_t pir_to_thread_id(uint32_t pir);