[Skiboot] [PATCH] phb4: Updated inits as of PHB4 spec 0.52
Benjamin Herrenschmidt
benh at kernel.crashing.org
Fri Nov 11 07:58:05 AEDT 2016
This includes some DD2.0 support
Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
---
hw/phb4.c | 78 ++++++++++++++++++++++++++++++++++-------------------
include/phb4-regs.h | 4 +--
include/phb4.h | 8 ++----
3 files changed, 55 insertions(+), 35 deletions(-)
diff --git a/hw/phb4.c b/hw/phb4.c
index 25b418f..5c6b9c0 100644
--- a/hw/phb4.c
+++ b/hw/phb4.c
@@ -2578,8 +2578,8 @@ static void phb4_init_errors(struct phb4 *p)
out_be64(p->regs + 0x0d00, 0xffffffffffffffffull);
out_be64(p->regs + 0x0d08, 0x0000000000000000ull);
out_be64(p->regs + 0x0d18, 0xffffffffffffffffull);
- out_be64(p->regs + 0x0d28, 0x0000420a00000000ull);
- out_be64(p->regs + 0x0d30, 0xdff7bd01f7ddfff0ull); /* XXX CAPI has diff. value */
+ out_be64(p->regs + 0x0d28, 0x0000400a00000000ull);
+ out_be64(p->regs + 0x0d30, 0xdff7fd01f7ddfff0ull); /* XXX CAPI has diff. value */
out_be64(p->regs + 0x0d40, 0x0000000000000000ull);
out_be64(p->regs + 0x0d48, 0x0000000000000000ull);
out_be64(p->regs + 0x0d50, 0x0000000000000000ull);
@@ -2589,8 +2589,11 @@ static void phb4_init_errors(struct phb4 *p)
out_be64(p->regs + 0x0d80, 0xffffffffffffffffull);
out_be64(p->regs + 0x0d88, 0x0000000000000000ull);
out_be64(p->regs + 0x0d98, 0xffffffffffffffffull);
- out_be64(p->regs + 0x0da8, 0xd00000b801000060ull);
- out_be64(p->regs + 0x0db0, 0x2bffd703fe7fbf8full); /* XXX CAPI has diff. value */
+ if (p->rev == PHB4_REV_NIMBUS_DD10)
+ out_be64(p->regs + 0x0da8, 0xc00000b801000060ull);
+ else
+ out_be64(p->regs + 0x0da8, 0xc00008b801000060ull);
+ out_be64(p->regs + 0x0db0, 0x3bffd703fe7fbf8full); /* XXX CAPI has diff. value */
out_be64(p->regs + 0x0dc0, 0x0000000000000000ull);
out_be64(p->regs + 0x0dc8, 0x0000000000000000ull);
out_be64(p->regs + 0x0dd0, 0x0000000000000000ull);
@@ -2611,8 +2614,11 @@ static void phb4_init_errors(struct phb4 *p)
out_be64(p->regs + 0x0e80, 0xffffffffffffffffull);
out_be64(p->regs + 0x0e88, 0x0000000000000000ull);
out_be64(p->regs + 0x0e98, 0xffffffffffffffffull);
- out_be64(p->regs + 0x0ea8, 0x6000000000000000ull);
- out_be64(p->regs + 0x0eb0, 0x9baeffaf00000000ull); /* XXX CAPI has diff. value */
+ if (p->rev == PHB4_REV_NIMBUS_DD10)
+ out_be64(p->regs + 0x0ea8, 0x6000000000000000ull);
+ else
+ out_be64(p->regs + 0x0ea8, 0x60000000c0000000ull);
+ out_be64(p->regs + 0x0eb0, 0x9faeffaf3fffffffull); /* XXX CAPI has diff. value */
out_be64(p->regs + 0x0ec0, 0x0000000000000000ull);
out_be64(p->regs + 0x0ec8, 0x0000000000000000ull);
out_be64(p->regs + 0x0ed0, 0x0000000000000000ull);
@@ -2679,12 +2685,16 @@ static void phb4_init_hw(struct phb4 *p, bool first_init)
out_be64(p->regs + PHB_PCIE_LANE_EQ_CNTL3, be64_to_cpu(p->lane_eq[3]));
out_be64(p->regs + PHB_PCIE_LANE_EQ_CNTL20, be64_to_cpu(p->lane_eq[4]));
out_be64(p->regs + PHB_PCIE_LANE_EQ_CNTL21, be64_to_cpu(p->lane_eq[5]));
- out_be64(p->regs + PHB_PCIE_LANE_EQ_CNTL22, be64_to_cpu(p->lane_eq[6]));
- out_be64(p->regs + PHB_PCIE_LANE_EQ_CNTL23, be64_to_cpu(p->lane_eq[7]));
+ if (p->rev == PHB4_REV_NIMBUS_DD10) {
+ out_be64(p->regs + PHB_PCIE_LANE_EQ_CNTL22,
+ be64_to_cpu(p->lane_eq[6]));
+ out_be64(p->regs + PHB_PCIE_LANE_EQ_CNTL23,
+ be64_to_cpu(p->lane_eq[7]));
+ }
}
/* Init_14 - Clear link training */
- phb4_pcicfg_write32(&p->phb, 0, 0x78, 0x0000FE07);
+ phb4_pcicfg_write32(&p->phb, 0, 0x78, 0x0400FE07);
/* Init_15 - deassert cores reset */
/*
@@ -3116,12 +3126,34 @@ static void phb4_create(struct dt_node *np)
if (!p->phb.base_loc_code)
PHBERR(p, "Base location code not found !\n");
+ /*
+ * Grab CEC IO VPD load info from the root of the device-tree,
+ * on P8 there's a single such VPD for the whole machine
+ */
+ prop = dt_find_property(dt_root, "ibm,io-vpd");
+ if (!prop) {
+ /* LX VPD Lid not already loaded */
+ vpd_iohub_load(dt_root);
+ }
+
+ /* Obtain informatin about the PHB from the hardware directly */
+ if (!phb4_read_capabilities(p))
+ goto failed;
+
/* Check for lane equalization values from HB or HDAT */
p->lane_eq = dt_prop_get_def_size(np, "ibm,lane-eq", NULL, &lane_eq_len);
- if (p->lane_eq && lane_eq_len != (16 * 4)) {
- PHBERR(p, "Device-tree has ibm,lane-eq with wrong len %ld\n",
- lane_eq_len);
- p->lane_eq = NULL;
+ if (p->lane_eq) {
+ uint32_t want_len;
+
+ if (p->rev == PHB4_REV_NIMBUS_DD10)
+ want_len = 8 * 8;
+ else
+ want_len = 6 * 8;
+ if (lane_eq_len != want_len) {
+ PHBERR(p, "Device-tree has ibm,lane-eq with wrong len %ld"
+ " (want %d)\n", lane_eq_len, want_len);
+ p->lane_eq = NULL;
+ }
}
if (p->lane_eq) {
PHBDBG(p, "Override lane equalization settings:\n");
@@ -3135,20 +3167,6 @@ static void phb4_create(struct dt_node *np)
be64_to_cpu(p->lane_eq[6]), be64_to_cpu(p->lane_eq[7]));
}
- /*
- * Grab CEC IO VPD load info from the root of the device-tree,
- * on P8 there's a single such VPD for the whole machine
- */
- prop = dt_find_property(dt_root, "ibm,io-vpd");
- if (!prop) {
- /* LX VPD Lid not already loaded */
- vpd_iohub_load(dt_root);
- }
-
- /* Obtain informatin about the PHB from the hardware directly */
- if (!phb4_read_capabilities(p))
- goto failed;
-
/* Allocate a block of interrupts. We need to know if it needs
* 2K or 4K interrupts ... for now we just use 4K but that
* needs to be fixed
@@ -3338,6 +3356,12 @@ static void phb4_probe_stack(struct dt_node *stk_node, uint32_t pec_index,
return;
}
+ /* Check ETU reset */
+ xscom_read(gcid, pci_stack + XPEC_PCI_STK_ETU_RESET, &val);
+ prlog(PR_ERR, "ETU reset: %llx\n", val);
+ xscom_write(gcid, pci_stack + XPEC_PCI_STK_ETU_RESET, 0);
+ time_wait_ms(1);
+
// show we can read phb mmio space
foo = (void *)(phb_bar + 0x800); // phb version register
prlog(PR_ERR, "Version reg: 0x%016llx\n", in_be64(foo));
diff --git a/include/phb4-regs.h b/include/phb4-regs.h
index 7b76c6f..16f30f6 100644
--- a/include/phb4-regs.h
+++ b/include/phb4-regs.h
@@ -183,8 +183,8 @@
#define PHB_PCIE_LANE_EQ_CNTL3 0x1AE8
#define PHB_PCIE_LANE_EQ_CNTL20 0x1AF0
#define PHB_PCIE_LANE_EQ_CNTL21 0x1AF8
-#define PHB_PCIE_LANE_EQ_CNTL22 0x1B00
-#define PHB_PCIE_LANE_EQ_CNTL23 0x1B08
+#define PHB_PCIE_LANE_EQ_CNTL22 0x1B00 /* DD1 only */
+#define PHB_PCIE_LANE_EQ_CNTL23 0x1B08 /* DD1 only */
/*
* PHB4 xscom address defines
diff --git a/include/phb4.h b/include/phb4.h
index 9b73edb..f9c299c 100644
--- a/include/phb4.h
+++ b/include/phb4.h
@@ -231,12 +231,8 @@ struct phb4 {
unsigned int chip_id; /* Chip ID (== GCID on P8) */
enum phb4_state state;
unsigned int rev; /* 00MMmmmm */
-#define PHB4_REV_MURANO_DD10 0xa30001
-#define PHB4_REV_VENICE_DD10 0xa30002
-#define PHB4_REV_MURANO_DD20 0xa30003
-#define PHB4_REV_MURANO_DD21 0xa30004
-#define PHB4_REV_VENICE_DD20 0xa30005
-#define PHB4_REV_NAPLES_DD10 0xb30001
+#define PHB4_REV_NIMBUS_DD10 0xa40001
+#define PHB4_REV_NUMBUS_DD20 0xa40002
void *regs;
void *int_mmio;
uint64_t pe_xscom; /* XSCOM bases */
More information about the Skiboot
mailing list