[linux-yocto] [PATCH 03/48] drivers/misc: Update PEI Setup Code for Axxia
Daniel Dragomir
daniel.dragomir at windriver.com
Mon Dec 11 05:13:33 PST 2017
From: John Jacques <john.jacques at intel.com>
Use the "cobalt" registers instead of the "config"
registers. The PHY, in the PCIe/sRIO case, overwrites
changes made using the "config" registers.
Signed-off-by: John Jacques <john.jacques at intel.com>
---
drivers/misc/axxia-pei.c | 126 +++++++++++++++++++++++++++++++++++------------
1 file changed, 95 insertions(+), 31 deletions(-)
diff --git a/drivers/misc/axxia-pei.c b/drivers/misc/axxia-pei.c
index 21f0746..b24f819 100644
--- a/drivers/misc/axxia-pei.c
+++ b/drivers/misc/axxia-pei.c
@@ -1113,13 +1113,9 @@ update_settings(void)
(0xff << (i * 8))) >> (i * 8);
ncr_read32(region, offset, &value);
- pr_debug("0x%x.0x%x.0x%x : 0x%x => ",
- NCP_NODE_ID(region), NCP_TARGET_ID(region), offset,
- value);
value &= ~0x72;
value |= pic;
value |= ref_range << 4;
- pr_debug("0x%x\n", value);
ncr_write32(region, offset, value);
}
@@ -1129,9 +1125,11 @@ update_settings(void)
for (i = 0; i < (number_of_serdes * 2); ++i) {
unsigned int offset;
+ int eq_override;
unsigned int eq_main;
unsigned int pre;
unsigned int post;
+ int boost_override;
unsigned int boost;
unsigned int value;
@@ -1149,63 +1147,129 @@ update_settings(void)
switch (i % 4) {
case 0:
- eq_main &= 0x3f;
+ eq_main &= 0xbf;
pre &= 0x3f;
post &= 0x3f;
- boost &= 0x3f;
+ boost &= 0x81;
break;
case 1:
- eq_main = (eq_main & 0x3f00) >> 8;
+ eq_main = (eq_main & 0xbf00) >> 8;
pre = (pre & 0x3f00) >> 8;
post = (post & 0x3f00) >> 8;
- boost = (boost & 0x3f00) >> 8;
+ boost = (boost & 0x8100) >> 8;
break;
case 2:
- eq_main = (eq_main & 0x3f0000) >> 16;
+ eq_main = (eq_main & 0xbf0000) >> 16;
pre = (pre & 0x3f0000) >> 16;
post = (post & 0x3f0000) >> 16;
- boost = (boost & 0x3f0000) >> 16;
+ boost = (boost & 0x810000) >> 16;
break;
case 3:
- eq_main = (eq_main & 0x3f000000) >> 24;
+ eq_main = (eq_main & 0xbf000000) >> 24;
pre = (pre & 0x3f000000) >> 24;
post = (post & 0x3f000000) >> 24;
- boost = (boost & 0x3f000000) >> 24;
+ boost = (boost & 0x81000000) >> 24;
break;
default:
pr_err("Error setting coefficients!\n");
break;
}
- if (is_5600)
- offset = 0x18 + (i * 0x1c);
+ /* Initialize the eq override bit. */
+
+ if (0 != (eq_main & 0x80))
+ eq_override = 1;
else
- offset = 0xc + (i * 0x1c);
+ eq_override = 0;
+
+ eq_main &= 0x3f;
+
+ /* Initialize the vboost override bit. */
+
+ if (0 != (boost & 0x80))
+ boost_override = 1;
+ else
+ boost_override = 0;
+
+ boost &= 1;
+
+ /*
+ * To set the EQ values, use the cobalt registers
+ * (0x115.1+), not the config registers (0x115.0).
+ */
+
+ region = NCP_REGION_ID(0x115, ((i / 2) + 1));
+
+ /*
+ * Set VBOOST (5600 only).
+ */
+
+ if (is_5600 && 0 != boost_override) {
+ /* Set or clear txN_vboost_en. */
+
+ if (0 == (i % 2))
+ offset = 0xe002;
+ else
+ offset = 0xe202;
- if (is_5600) {
ncr_read32(region, offset, &value);
- pr_debug("0x%x.0x%x.0x%x : 0x%x => ",
- NCP_NODE_ID(region), NCP_TARGET_ID(region),
- offset, value);
- value &= ~(1 << 11);
if (0 != boost)
- value |= (1 << 11);
+ value |= (1 << 6);
+ else
+ value &= ~(1 << 6);
+
+ value |= (1 << 7); /* override enable */
- pr_debug("0x%x\n", value);
ncr_write32(region, offset, value);
}
- offset += 0x8;
+ if (0 != eq_override) {
+ /* Set EQ main. */
- ncr_read32(region, offset, &value);
- pr_debug("0x%x.0x%x.0x%x : 0x%x => ",
- NCP_NODE_ID(region), NCP_TARGET_ID(region), offset,
- value);
- value &= ~0x3f3f3f;
- value |= ((post << 16) | (pre << 8) | eq_main);
- pr_debug("0x%x\n", value);
- ncr_write32(region, offset, value);
+ if (0 == (i % 2))
+ offset = 0x24;
+ else
+ offset = 0x44;
+
+ if (is_6700)
+ offset *= 2;
+
+ ncr_read32(region, offset, &value);
+ value &= ~0x3f;
+ value |= eq_main;
+ ncr_write32(region, offset, value);
+
+ /* Set EQ pre/post. */
+
+ if (0 == (i % 2))
+ offset = 0x26;
+ else
+ offset = 0x46;
+
+ if (is_6700)
+ offset *= 2;
+
+ ncr_read32(region, offset, &value);
+ value &= ~0xfff;
+ value |= ((post << 6) | pre);
+ ncr_write32(region, offset, value);
+
+ /* Set the override: 0x115.1.<0x16|0x18> bit 4. */
+
+ if (0 == (i % 2))
+ offset = 0x16;
+ else
+ offset = 0x18;
+
+#if defined(CONFIG_AXXIA_ANY_XLF)
+ offset *= 2;
+#endif
+
+ ncr_read32(region, offset, &value);
+ value |= (1 << 4);
+ ncr_write32(region, offset, value);
+ }
}
return;
--
2.7.4
More information about the linux-yocto
mailing list