diff --git a/patch/kernel/mvebu-current/102-revert_i2c_delay.patch b/patch/kernel/mvebu-current/102-revert_i2c_delay.patch deleted file mode 100644 index 930c0f9494..0000000000 --- a/patch/kernel/mvebu-current/102-revert_i2c_delay.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/arch/arm/boot/dts/armada-xp.dtsi -+++ b/arch/arm/boot/dts/armada-xp.dtsi -@@ -237,12 +237,10 @@ - }; - - &i2c0 { -- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c"; - reg = <0x11000 0x100>; - }; - - &i2c1 { -- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c"; - reg = <0x11100 0x100>; - }; - diff --git a/patch/kernel/mvebu-dev/40-pci-add-irq-change-handler-sspl.patch b/patch/kernel/mvebu-dev/10-mvebu-clearfog-pcie-updates.patch similarity index 83% rename from patch/kernel/mvebu-dev/40-pci-add-irq-change-handler-sspl.patch rename to patch/kernel/mvebu-dev/10-mvebu-clearfog-pcie-updates.patch index dd87eade81..6ee38c55de 100644 --- a/patch/kernel/mvebu-dev/40-pci-add-irq-change-handler-sspl.patch +++ b/patch/kernel/mvebu-dev/10-mvebu-clearfog-pcie-updates.patch @@ -1,20 +1,20 @@ -From 9a0c072c8eadc20f8eedc78cf33daa70f8bd5b11 Mon Sep 17 00:00:00 2001 +From 527312a74d9d85ba9520c8cb2979004f6d23c4da Mon Sep 17 00:00:00 2001 From: Russell King Date: Tue, 29 Nov 2016 10:13:46 +0000 -Subject: mvebu/clearfog pcie updates +Subject: [PATCH] mvebu/clearfog pcie updates Signed-off-by: Russell King --- - drivers/pci/controller/pci-mvebu.c | 112 ++++++++++++++++++++++++++++++++++++- - drivers/pci/pci-bridge-emul.c | 83 ++++++++++++++++----------- - drivers/pci/pci-bridge-emul.h | 15 +++++ - drivers/pci/pcie/aspm.c | 2 + + drivers/pci/controller/pci-mvebu.c | 112 ++++++++++++++++++++++++++++- + drivers/pci/pci-bridge-emul.c | 83 ++++++++++++--------- + drivers/pci/pci-bridge-emul.h | 15 ++++ + drivers/pci/pcie/aspm.c | 6 ++ drivers/pci/pcie/portdrv_core.c | 2 + - 5 files changed, 180 insertions(+), 34 deletions(-) + 5 files changed, 184 insertions(+), 34 deletions(-) --- a/drivers/pci/controller/pci-mvebu.c +++ b/drivers/pci/controller/pci-mvebu.c -@@ -53,13 +53,26 @@ +@@ -52,7 +52,14 @@ PCIE_CONF_ADDR_EN) #define PCIE_CONF_DATA_OFF 0x18fc #define PCIE_MASK_OFF 0x1910 @@ -29,19 +29,7 @@ Signed-off-by: Russell King #define PCIE_CTRL_OFF 0x1a00 #define PCIE_CTRL_X1_MODE 0x0001 #define PCIE_STAT_OFF 0x1a04 - #define PCIE_STAT_BUS 0xff00 - #define PCIE_STAT_DEV 0x1f0000 - #define PCIE_STAT_LINK_DOWN BIT(0) -+#define PCIE_SSPL 0x1a0c -+#define PCIE_SSPL_MSGEN BIT(14) -+#define PCIE_SSPL_SPLS(x) (((x) & 3) << 8) -+#define PCIE_SSPL_SPLS_VAL(x) (((x) >> 8) & 3) -+#define PCIE_SSPL_SPLV(x) ((x) & 0xff) -+#define PCIE_SSPL_SPLV_VAL(x) ((x) & 0xff) - #define PCIE_RC_RTSTA 0x1a14 - #define PCIE_DEBUG_CTRL 0x1a60 - #define PCIE_DEBUG_SOFT_RESET BIT(20) -@@ -432,6 +445,54 @@ static void mvebu_pcie_handle_membase_ch +@@ -430,6 +437,54 @@ static void mvebu_pcie_handle_membase_ch &port->memwin); } @@ -96,22 +84,7 @@ Signed-off-by: Russell King static pci_bridge_emul_read_status_t mvebu_pci_bridge_emul_pcie_conf_read(struct pci_bridge_emul *bridge, int reg, u32 *value) -@@ -462,6 +523,14 @@ mvebu_pci_bridge_emul_pcie_conf_read(str - *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); - break; - -+ case PCI_EXP_SLTCAP: -+ { -+ u32 tmp = mvebu_readl(port, PCIE_SSPL); -+ *value = PCIE_SSPL_SPLS_VAL(tmp) << 15 | -+ PCIE_SSPL_SPLV_VAL(tmp) << 7; -+ break; -+ } -+ - case PCI_EXP_SLTCTL: - *value = PCI_EXP_SLTSTA_PDS << 16; - break; -@@ -477,6 +546,30 @@ mvebu_pci_bridge_emul_pcie_conf_read(str +@@ -475,6 +530,30 @@ mvebu_pci_bridge_emul_pcie_conf_read(str return PCI_BRIDGE_EMUL_HANDLED; } @@ -142,7 +115,7 @@ Signed-off-by: Russell King static void mvebu_pci_bridge_emul_base_conf_write(struct pci_bridge_emul *bridge, int reg, u32 old, u32 new, u32 mask) -@@ -494,7 +587,8 @@ mvebu_pci_bridge_emul_base_conf_write(st +@@ -492,7 +571,8 @@ mvebu_pci_bridge_emul_base_conf_write(st mvebu_pcie_handle_iobase_change(port); if ((old ^ new) & PCI_COMMAND_MEMORY) mvebu_pcie_handle_membase_change(port); @@ -152,7 +125,7 @@ Signed-off-by: Russell King break; } -@@ -517,6 +611,11 @@ mvebu_pci_bridge_emul_base_conf_write(st +@@ -515,6 +595,11 @@ mvebu_pci_bridge_emul_base_conf_write(st mvebu_pcie_handle_iobase_change(port); break; @@ -164,7 +137,7 @@ Signed-off-by: Russell King case PCI_PRIMARY_BUS: mvebu_pcie_set_local_bus_nr(port, conf->secondary_bus); break; -@@ -534,6 +633,10 @@ mvebu_pci_bridge_emul_pcie_conf_write(st +@@ -532,6 +617,10 @@ mvebu_pci_bridge_emul_pcie_conf_write(st switch (reg) { case PCI_EXP_DEVCTL: @@ -175,19 +148,7 @@ Signed-off-by: Russell King /* * Armada370 data says these bits must always * be zero when in root complex mode. -@@ -556,9 +659,37 @@ mvebu_pci_bridge_emul_pcie_conf_write(st - mvebu_writel(port, new, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); - break; - -+ case PCI_EXP_SLTCAP: -+ { -+ u32 sspl = PCIE_SSPL_SPLV((new & PCI_EXP_SLTCAP_SPLV) >> 7) | -+ PCIE_SSPL_SPLS((new & PCI_EXP_SLTCAP_SPLS) >> 15) | -+ PCIE_SSPL_MSGEN; -+ mvebu_writel(port, sspl, PCIE_SSPL); -+ break; -+ } -+ +@@ -557,6 +646,25 @@ mvebu_pci_bridge_emul_pcie_conf_write(st case PCI_EXP_RTSTA: mvebu_writel(port, new, PCIE_RC_RTSTA); break; @@ -213,7 +174,7 @@ Signed-off-by: Russell King } } -@@ -566,6 +697,8 @@ static struct pci_bridge_emul_ops mvebu_ +@@ -564,6 +672,8 @@ static struct pci_bridge_emul_ops mvebu_ .write_base = mvebu_pci_bridge_emul_base_conf_write, .read_pcie = mvebu_pci_bridge_emul_pcie_conf_read, .write_pcie = mvebu_pci_bridge_emul_pcie_conf_write, @@ -240,7 +201,7 @@ Signed-off-by: Russell King bridge->pci_regs_behavior = kmemdup(pci_regs_behavior, sizeof(pci_regs_behavior), GFP_KERNEL); -@@ -321,25 +323,26 @@ int pci_bridge_emul_conf_read(struct pci +@@ -323,25 +325,26 @@ int pci_bridge_emul_conf_read(struct pci __le32 *cfgspace; const struct pci_bridge_reg_behavior *behavior; @@ -279,7 +240,7 @@ Signed-off-by: Russell King } if (read_op) -@@ -347,15 +350,20 @@ int pci_bridge_emul_conf_read(struct pci +@@ -349,15 +352,20 @@ int pci_bridge_emul_conf_read(struct pci else ret = PCI_BRIDGE_EMUL_NOT_HANDLED; @@ -304,7 +265,7 @@ Signed-off-by: Russell King if (size == 1) *value = (*value >> (8 * (where & 3))) & 0xff; -@@ -382,12 +390,6 @@ int pci_bridge_emul_conf_write(struct pc +@@ -385,12 +393,6 @@ int pci_bridge_emul_conf_write(struct pc __le32 *cfgspace; const struct pci_bridge_reg_behavior *behavior; @@ -317,7 +278,7 @@ Signed-off-by: Russell King shift = (where & 0x3) * 8; if (size == 4) -@@ -403,27 +405,42 @@ int pci_bridge_emul_conf_write(struct pc +@@ -406,27 +408,42 @@ int pci_bridge_emul_conf_write(struct pc if (ret != PCIBIOS_SUCCESSFUL) return ret; @@ -402,6 +363,21 @@ Signed-off-by: Russell King }; struct pci_bridge_reg_behavior; +--- a/drivers/pci/pcie/aspm.c ++++ b/drivers/pci/pcie/aspm.c +@@ -578,6 +578,12 @@ static void pcie_aspm_cap_init(struct pc + pcie_capability_read_dword(child, PCI_EXP_LNKCAP, &child_lnkcap); + pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &parent_lnkctl); + pcie_capability_read_word(child, PCI_EXP_LNKCTL, &child_lnkctl); ++dev_info(&parent->dev, "up support %x enabled %x\n", ++ (parent_lnkcap & PCI_EXP_LNKCAP_ASPMS) >> 10, ++ !!(parent_lnkctl & PCI_EXP_LNKCTL_ASPMC)); ++dev_info(&parent->dev, "dn support %x enabled %x\n", ++ (child_lnkcap & PCI_EXP_LNKCAP_ASPMS) >> 10, ++ !!(child_lnkctl & PCI_EXP_LNKCTL_ASPMC)); + + /* + * Setup L0s state --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c @@ -325,6 +325,7 @@ int pcie_port_device_register(struct pci diff --git a/patch/kernel/mvebu-dev/102-revert_i2c_delay.patch b/patch/kernel/mvebu-dev/102-revert_i2c_delay.patch deleted file mode 100644 index 930c0f9494..0000000000 --- a/patch/kernel/mvebu-dev/102-revert_i2c_delay.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/arch/arm/boot/dts/armada-xp.dtsi -+++ b/arch/arm/boot/dts/armada-xp.dtsi -@@ -237,12 +237,10 @@ - }; - - &i2c0 { -- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c"; - reg = <0x11000 0x100>; - }; - - &i2c1 { -- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c"; - reg = <0x11100 0x100>; - }; - diff --git a/patch/kernel/mvebu-dev/11-implement-slot-capabilities-SSPL.patch b/patch/kernel/mvebu-dev/11-implement-slot-capabilities-SSPL.patch new file mode 100644 index 0000000000..95282f307a --- /dev/null +++ b/patch/kernel/mvebu-dev/11-implement-slot-capabilities-SSPL.patch @@ -0,0 +1,55 @@ +From 2298f59cecc69b0fc6471c5fd3f7629af2d274b2 Mon Sep 17 00:00:00 2001 +From: Russell King +Date: Tue, 29 Nov 2016 10:13:48 +0000 +Subject: [PATCH] implement slot capabilities (SSPL) + +--- + drivers/pci/controller/pci-mvebu.c | 23 +++++++++++++++++++++++ + 1 file changed, 23 insertions(+) + +--- a/drivers/pci/controller/pci-mvebu.c ++++ b/drivers/pci/controller/pci-mvebu.c +@@ -66,6 +66,12 @@ + #define PCIE_STAT_BUS 0xff00 + #define PCIE_STAT_DEV 0x1f0000 + #define PCIE_STAT_LINK_DOWN BIT(0) ++#define PCIE_SSPL 0x1a0c ++#define PCIE_SSPL_MSGEN BIT(14) ++#define PCIE_SSPL_SPLS(x) (((x) & 3) << 8) ++#define PCIE_SSPL_SPLS_VAL(x) (((x) >> 8) & 3) ++#define PCIE_SSPL_SPLV(x) ((x) & 0xff) ++#define PCIE_SSPL_SPLV_VAL(x) ((x) & 0xff) + #define PCIE_RC_RTSTA 0x1a14 + #define PCIE_DEBUG_CTRL 0x1a60 + #define PCIE_DEBUG_SOFT_RESET BIT(20) +@@ -515,6 +521,14 @@ mvebu_pci_bridge_emul_pcie_conf_read(str + *value = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); + break; + ++ case PCI_EXP_SLTCAP: ++ { ++ u32 tmp = mvebu_readl(port, PCIE_SSPL); ++ *value = PCIE_SSPL_SPLS_VAL(tmp) << 15 | ++ PCIE_SSPL_SPLV_VAL(tmp) << 7; ++ break; ++ } ++ + case PCI_EXP_SLTCTL: + *value = PCI_EXP_SLTSTA_PDS << 16; + break; +@@ -643,6 +657,15 @@ mvebu_pci_bridge_emul_pcie_conf_write(st + mvebu_writel(port, new, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL); + break; + ++ case PCI_EXP_SLTCAP: ++ { ++ u32 sspl = PCIE_SSPL_SPLV((new & PCI_EXP_SLTCAP_SPLV) >> 7) | ++ PCIE_SSPL_SPLS((new & PCI_EXP_SLTCAP_SPLS) >> 15) | ++ PCIE_SSPL_MSGEN; ++ mvebu_writel(port, sspl, PCIE_SSPL); ++ break; ++ } ++ + case PCI_EXP_RTSTA: + mvebu_writel(port, new, PCIE_RC_RTSTA); + break; diff --git a/patch/kernel/mvebu-dev/402-sfp-display-SFP-module-information.patch b/patch/kernel/mvebu-dev/402-sfp-display-SFP-module-information.patch index ca117290eb..cc5d2fa393 100644 --- a/patch/kernel/mvebu-dev/402-sfp-display-SFP-module-information.patch +++ b/patch/kernel/mvebu-dev/402-sfp-display-SFP-module-information.patch @@ -1,18 +1,42 @@ -From e76632d118659347d9261a4470d9f60bfbe0044c Mon Sep 17 00:00:00 2001 +From 88e942a0b703fe54dad925f27f033869e4f10fba Mon Sep 17 00:00:00 2001 From: Russell King Date: Sun, 13 Sep 2015 01:06:31 +0100 -Subject: sfp: display SFP module information +Subject: [PATCH] net: sfp: display SFP module information [*not for + mainline*] + +Display SFP module information verbosely, splitting the generic parts +into a separate file. Signed-off-by: Russell King --- ---- a/drivers/net/phy/sfp.c -+++ b/drivers/net/phy/sfp.c -@@ -531,6 +531,185 @@ static unsigned int sfp_check(void *buf, - return check; - } + drivers/net/phy/Makefile | 2 +- + drivers/net/phy/sff.c | 114 ++++++++++++++++++++ + drivers/net/phy/sff.h | 16 +++ + drivers/net/phy/sfp.c | 228 +++++++++++++++++++++++++++++++++++++-- + 4 files changed, 349 insertions(+), 11 deletions(-) + create mode 100644 drivers/net/phy/sff.c + create mode 100644 drivers/net/phy/sff.h + +--- a/drivers/net/phy/Makefile ++++ b/drivers/net/phy/Makefile +@@ -26,7 +26,7 @@ obj-$(CONFIG_PHYLIB) += libphy.o -+static const char *sfp_link_len(char *buf, size_t size, unsigned int length, -+ unsigned int multiplier) + obj-$(CONFIG_NETWORK_PHY_TIMESTAMPING) += mii_timestamper.o + +-obj-$(CONFIG_SFP) += sfp.o ++obj-$(CONFIG_SFP) += sff.o sfp.o + sfp-obj-$(CONFIG_SFP) += sfp-bus.o + obj-y += $(sfp-obj-y) $(sfp-obj-m) + +--- /dev/null ++++ b/drivers/net/phy/sff.c +@@ -0,0 +1,114 @@ ++#include ++#include ++#include "sff.h" ++ ++const char *sff_link_len(char *buf, size_t size, unsigned int length, ++ unsigned int multiplier) +{ + if (length == 0) + return "unsupported/unspecified"; @@ -21,11 +45,11 @@ Signed-off-by: Russell King + *buf++ = '>'; + size -= 1; + length -= 1; -+ } ++ } + -+ length *= multiplier; ++ length *= multiplier; + -+ if (length >= 1000) ++ if (length >= 1000) + snprintf(buf, size, "%u.%0*ukm", + length / 1000, + multiplier > 100 ? 1 : @@ -36,14 +60,125 @@ Signed-off-by: Russell King + + return buf; +} ++EXPORT_SYMBOL_GPL(sff_link_len); + -+struct bitfield { ++const char *sff_bitfield(char *buf, size_t size, ++ const struct sff_bitfield *bits, unsigned int val) ++{ ++ char *p = buf; ++ int n; ++ ++ *p = '\0'; ++ while (bits->mask) { ++ if ((val & bits->mask) == bits->val) { ++ n = snprintf(p, size, "%s%s", ++ buf != p ? ", " : "", ++ bits->str); ++ if (n == size) ++ break; ++ p += n; ++ size -= n; ++ } ++ bits++; ++ } ++ ++ return buf; ++} ++EXPORT_SYMBOL_GPL(sff_bitfield); ++ ++const char *sff_connector(unsigned int connector) ++{ ++ switch (connector) { ++ case SFF8024_CONNECTOR_UNSPEC: ++ return "unknown/unspecified"; ++ case SFF8024_CONNECTOR_SC: ++ return "SC"; ++ case SFF8024_CONNECTOR_FIBERJACK: ++ return "Fiberjack"; ++ case SFF8024_CONNECTOR_LC: ++ return "LC"; ++ case SFF8024_CONNECTOR_MT_RJ: ++ return "MT-RJ"; ++ case SFF8024_CONNECTOR_MU: ++ return "MU"; ++ case SFF8024_CONNECTOR_SG: ++ return "SG"; ++ case SFF8024_CONNECTOR_OPTICAL_PIGTAIL: ++ return "Optical pigtail"; ++ case SFF8024_CONNECTOR_MPO_1X12: ++ return "MPO 1X12"; ++ case SFF8024_CONNECTOR_MPO_2X16: ++ return "MPO 2X16"; ++ case SFF8024_CONNECTOR_HSSDC_II: ++ return "HSSDC II"; ++ case SFF8024_CONNECTOR_COPPER_PIGTAIL: ++ return "Copper pigtail"; ++ case SFF8024_CONNECTOR_RJ45: ++ return "RJ45"; ++ case SFF8024_CONNECTOR_MXC_2X16: ++ return "MXC 2X16"; ++ default: ++ return "unknown"; ++ } ++} ++EXPORT_SYMBOL_GPL(sff_connector); ++ ++const char *sff_encoding(unsigned int encoding) ++{ ++ switch (encoding) { ++ case SFF8024_ENCODING_UNSPEC: ++ return "unspecified"; ++ case SFF8024_ENCODING_8472_64B66B: ++ return "64b66b"; ++ case SFF8024_ENCODING_8B10B: ++ return "8b10b"; ++ case SFF8024_ENCODING_4B5B: ++ return "4b5b"; ++ case SFF8024_ENCODING_NRZ: ++ return "NRZ"; ++ case SFF8024_ENCODING_8472_MANCHESTER: ++ return "MANCHESTER"; ++ default: ++ return "unknown"; ++ } ++} ++EXPORT_SYMBOL_GPL(sff_encoding); ++ ++MODULE_LICENSE("GPL"); +--- /dev/null ++++ b/drivers/net/phy/sff.h +@@ -0,0 +1,16 @@ ++#ifndef SFF_H ++#define SFF_H ++ ++struct sff_bitfield { + unsigned int mask; + unsigned int val; + const char *str; +}; + -+static const struct bitfield sfp_options[] = { ++const char *sff_link_len(char *buf, size_t size, unsigned int length, ++ unsigned int multiplier); ++const char *sff_bitfield(char *buf, size_t size, ++ const struct sff_bitfield *bits, unsigned int val); ++const char *sff_connector(unsigned int connector); ++const char *sff_encoding(unsigned int encoding); ++#endif +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -17,6 +17,7 @@ + #include + #include + ++#include "sff.h" + #include "sfp.h" + #include "swphy.h" + +@@ -1363,6 +1364,114 @@ static void sfp_hwmon_exit(struct sfp *s + } + #endif + ++static const struct sff_bitfield sfp_options[] = { + { + .mask = SFP_OPTIONS_HIGH_POWER_LEVEL, + .val = SFP_OPTIONS_HIGH_POWER_LEVEL, @@ -99,7 +234,7 @@ Signed-off-by: Russell King + }, { } +}; + -+static const struct bitfield diagmon[] = { ++static const struct sff_bitfield diagmon[] = { + { + .mask = SFP_DIAGMON_DDM, + .val = SFP_DIAGMON_DDM, @@ -119,159 +254,179 @@ Signed-off-by: Russell King + }, { } +}; + -+static const char *sfp_bitfield(char *out, size_t outsz, const struct bitfield *bits, unsigned int val) ++static const struct sff_bitfield sfp_enhopts[] = { ++ { ++ .mask = SFP_ENHOPTS_ALARMWARN, ++ .val = SFP_ENHOPTS_ALARMWARN, ++ .str = "alarmwarn", ++ }, { ++ .mask = SFP_ENHOPTS_SOFT_TX_DISABLE, ++ .val = SFP_ENHOPTS_SOFT_TX_DISABLE, ++ .str = "soft_tx_dis", ++ }, { ++ .mask = SFP_ENHOPTS_SOFT_TX_FAULT, ++ .val = SFP_ENHOPTS_SOFT_TX_FAULT, ++ .str = "soft_tx_fault", ++ }, { ++ .mask = SFP_ENHOPTS_SOFT_RX_LOS, ++ .val = SFP_ENHOPTS_SOFT_RX_LOS, ++ .str = "soft_rx_los", ++ }, { ++ .mask = SFP_ENHOPTS_SOFT_RATE_SELECT, ++ .val = SFP_ENHOPTS_SOFT_RATE_SELECT, ++ .str = "soft_rs", ++ }, { ++ .mask = SFP_ENHOPTS_APP_SELECT_SFF8079, ++ .val = SFP_ENHOPTS_APP_SELECT_SFF8079, ++ .str = "app_sel", ++ }, { ++ .mask = SFP_ENHOPTS_SOFT_RATE_SFF8431, ++ .val = SFP_ENHOPTS_SOFT_RATE_SFF8431, ++ .str = "soft_r8431", ++ }, { } ++}; ++ + /* Helpers */ + static void sfp_module_tx_disable(struct sfp *sfp) + { +@@ -1664,6 +1773,110 @@ static int sfp_cotsworks_fixup_check(str + return 0; + } + ++static void sfp_print_module_info(struct sfp *sfp, const struct sfp_eeprom_id *id, bool cotsworks) +{ -+ char *p = out; -+ int n; -+ -+ *p = '\0'; -+ while (bits->mask) { -+ if ((val & bits->mask) == bits->val) { -+ n = snprintf(p, outsz, "%s%s", -+ out != p ? ", " : "", -+ bits->str); -+ if (n == outsz) -+ break; -+ p += n; -+ outsz -= n; -+ } -+ bits++; -+ } -+ -+ return out; -+} -+ -+static const char *sfp_connector(unsigned int connector) -+{ -+ switch (connector) { -+ case SFF8024_CONNECTOR_UNSPEC: -+ return "unknown/unspecified"; -+ case SFF8024_CONNECTOR_SC: -+ return "SC"; -+ case SFF8024_CONNECTOR_FIBERJACK: -+ return "Fiberjack"; -+ case SFF8024_CONNECTOR_LC: -+ return "LC"; -+ case SFF8024_CONNECTOR_MT_RJ: -+ return "MT-RJ"; -+ case SFF8024_CONNECTOR_MU: -+ return "MU"; -+ case SFF8024_CONNECTOR_SG: -+ return "SG"; -+ case SFF8024_CONNECTOR_OPTICAL_PIGTAIL: -+ return "Optical pigtail"; -+ case SFF8024_CONNECTOR_HSSDC_II: -+ return "HSSDC II"; -+ case SFF8024_CONNECTOR_COPPER_PIGTAIL: -+ return "Copper pigtail"; -+ default: -+ return "unknown"; -+ } -+} -+ -+static const char *sfp_encoding(unsigned int encoding) -+{ -+ switch (encoding) { -+ case SFF8024_ENCODING_UNSPEC: -+ return "unspecified"; -+ case SFF8024_ENCODING_8472_64B66B: -+ return "64b66b"; -+ case SFF8024_ENCODING_8B10B: -+ return "8b10b"; -+ case SFF8024_ENCODING_4B5B: -+ return "4b5b"; -+ case SFF8024_ENCODING_NRZ: -+ return "NRZ"; -+ case SFF8024_ENCODING_8472_MANCHESTER: -+ return "MANCHESTER"; -+ default: -+ return "unknown"; -+ } -+} -+ -+ - /* hwmon */ - #if IS_ENABLED(CONFIG_HWMON) - static umode_t sfp_hwmon_is_visible(const void *data, -@@ -1670,6 +1849,7 @@ static int sfp_sm_mod_probe(struct sfp * - struct sfp_eeprom_id id; - bool cotsworks_sfbg; - bool cotsworks; ++ unsigned int br_nom, br_min, br_max; ++ char date[9]; + char options[80]; - u8 check; - int ret; - -@@ -1744,6 +1924,73 @@ static int sfp_sm_mod_probe(struct sfp * - (int)sizeof(id.ext.vendor_sn), id.ext.vendor_sn, - (int)sizeof(id.ext.datecode), id.ext.datecode); - -+ dev_info(sfp->dev, " %s connector, encoding %s, nominal bitrate %u.%uGbps +%u%% -%u%%\n", -+ sfp_connector(sfp->id.base.connector), -+ sfp_encoding(sfp->id.base.encoding), -+ sfp->id.base.br_nominal / 10, -+ sfp->id.base.br_nominal % 10, -+ sfp->id.ext.br_max, sfp->id.ext.br_min); -+ dev_info(sfp->dev, " 1000BaseSX%c 1000BaseLX%c 1000BaseCX%c 1000BaseT%c 100BaseTLX%c 1000BaseFX%c BaseBX10%c BasePX%c\n", -+ sfp->id.base.e1000_base_sx ? '+' : '-', -+ sfp->id.base.e1000_base_lx ? '+' : '-', -+ sfp->id.base.e1000_base_cx ? '+' : '-', -+ sfp->id.base.e1000_base_t ? '+' : '-', -+ sfp->id.base.e100_base_lx ? '+' : '-', -+ sfp->id.base.e100_base_fx ? '+' : '-', -+ sfp->id.base.e_base_bx10 ? '+' : '-', -+ sfp->id.base.e_base_px ? '+' : '-'); -+ dev_info(sfp->dev, " 10GBaseSR%c 10GBaseLR%c 10GBaseLRM%c 10GBaseER%c\n", -+ sfp->id.base.e10g_base_sr ? '+' : '-', -+ sfp->id.base.e10g_base_lr ? '+' : '-', -+ sfp->id.base.e10g_base_lrm ? '+' : '-', -+ sfp->id.base.e10g_base_er ? '+' : '-'); + -+ if (!sfp->id.base.sfp_ct_passive && !sfp->id.base.sfp_ct_active && -+ !sfp->id.base.e1000_base_t) { ++ /* Cotsworks also gets the date code wrong. */ ++ date[0] = id->ext.datecode[4 - 2 * cotsworks]; ++ date[1] = id->ext.datecode[5 - 2 * cotsworks]; ++ date[2] = '-'; ++ date[3] = id->ext.datecode[2 + 2 * cotsworks]; ++ date[4] = id->ext.datecode[3 + 2 * cotsworks]; ++ date[5] = '-'; ++ date[6] = id->ext.datecode[0]; ++ date[7] = id->ext.datecode[1]; ++ date[8] = '\0'; ++ ++ if (id->base.br_nominal == 0) { ++ br_min = br_nom = br_max = 0; ++ } else if (id->base.br_nominal == 255) { ++ br_nom = 250 * id->ext.br_max; ++ br_max = br_nom + br_nom * id->ext.br_min / 100; ++ br_min = br_nom - br_nom * id->ext.br_min / 100; ++ } else { ++ br_nom = id->base.br_nominal * 100; ++ br_min = br_nom - id->base.br_nominal * id->ext.br_min; ++ br_max = br_nom + id->base.br_nominal * id->ext.br_max; ++ } ++ ++ dev_info(sfp->dev, "module %.*s %.*s rev %.*s sn %.*s dc %s\n", ++ (int)sizeof(id->base.vendor_name), id->base.vendor_name, ++ (int)sizeof(id->base.vendor_pn), id->base.vendor_pn, ++ (int)sizeof(id->base.vendor_rev), id->base.vendor_rev, ++ (int)sizeof(id->ext.vendor_sn), id->ext.vendor_sn, date); ++ dev_info(sfp->dev, " %s connector, encoding %s, bitrate %u.%03u (%u.%03u-%u.%03u) Gbps\n", ++ sff_connector(id->base.connector), ++ sff_encoding(id->base.encoding), ++ br_nom / 1000, br_nom % 1000, ++ br_min / 1000, br_min % 1000, br_max / 1000, br_max % 1000); ++ dev_info(sfp->dev, " 1000BaseSX%c 1000BaseLX%c 1000BaseCX%c 1000BaseT%c 100BaseLX%c 100BaseFX%c BaseBX10%c BasePX%c\n", ++ id->base.e1000_base_sx ? '+' : '-', ++ id->base.e1000_base_lx ? '+' : '-', ++ id->base.e1000_base_cx ? '+' : '-', ++ id->base.e1000_base_t ? '+' : '-', ++ id->base.e100_base_lx ? '+' : '-', ++ id->base.e100_base_fx ? '+' : '-', ++ id->base.e_base_bx10 ? '+' : '-', ++ id->base.e_base_px ? '+' : '-'); ++ dev_info(sfp->dev, " 10GBaseSR%c 10GBaseLR%c 10GBaseLRM%c 10GBaseER%c\n", ++ id->base.e10g_base_sr ? '+' : '-', ++ id->base.e10g_base_lr ? '+' : '-', ++ id->base.e10g_base_lrm ? '+' : '-', ++ id->base.e10g_base_er ? '+' : '-'); ++ ++ if (!id->base.sfp_ct_passive && !id->base.sfp_ct_active && ++ !id->base.e1000_base_t) { + char len_9um[16], len_om[16]; + + dev_info(sfp->dev, " Wavelength %unm, fiber lengths:\n", -+ be16_to_cpup(&sfp->id.base.optical_wavelength)); ++ be16_to_cpup(&id->base.optical_wavelength)); + -+ if (sfp->id.base.link_len[0] == 255) ++ if (id->base.link_len[0] == 255) + strcpy(len_9um, ">254km"); -+ else if (sfp->id.base.link_len[1] && sfp->id.base.link_len[1] != 255) ++ else if (id->base.link_len[1] && id->base.link_len[1] != 255) + sprintf(len_9um, "%um", -+ sfp->id.base.link_len[1] * 100); -+ else if (sfp->id.base.link_len[0]) -+ sprintf(len_9um, "%ukm", sfp->id.base.link_len[0]); -+ else if (sfp->id.base.link_len[1] == 255) ++ id->base.link_len[1] * 100); ++ else if (id->base.link_len[0]) ++ sprintf(len_9um, "%ukm", id->base.link_len[0]); ++ else if (id->base.link_len[1] == 255) + strcpy(len_9um, ">25.4km"); + else + strcpy(len_9um, "unsupported"); + + dev_info(sfp->dev, " 9µm SM : %s\n", len_9um); + dev_info(sfp->dev, " 62.5µm MM OM1: %s\n", -+ sfp_link_len(len_om, sizeof(len_om), -+ sfp->id.base.link_len[3], 10)); ++ sff_link_len(len_om, sizeof(len_om), ++ id->base.link_len[3], 10)); + dev_info(sfp->dev, " 50µm MM OM2: %s\n", -+ sfp_link_len(len_om, sizeof(len_om), -+ sfp->id.base.link_len[2], 10)); ++ sff_link_len(len_om, sizeof(len_om), ++ id->base.link_len[2], 10)); + dev_info(sfp->dev, " 50µm MM OM3: %s\n", -+ sfp_link_len(len_om, sizeof(len_om), -+ sfp->id.base.link_len[5], 10)); ++ sff_link_len(len_om, sizeof(len_om), ++ id->base.link_len[5], 10)); + dev_info(sfp->dev, " 50µm MM OM4: %s\n", -+ sfp_link_len(len_om, sizeof(len_om), -+ sfp->id.base.link_len[4], 10)); ++ sff_link_len(len_om, sizeof(len_om), ++ id->base.link_len[4], 10)); + } else { + char len[16]; + dev_info(sfp->dev, " Copper length: %s\n", -+ sfp_link_len(len, sizeof(len), -+ sfp->id.base.link_len[4], 1)); ++ sff_link_len(len, sizeof(len), ++ id->base.link_len[4], 1)); + } + + dev_info(sfp->dev, " Options: %s\n", -+ sfp_bitfield(options, sizeof(options), sfp_options, -+ be16_to_cpu(sfp->id.ext.options))); ++ sff_bitfield(options, sizeof(options), sfp_options, ++ be16_to_cpu(id->ext.options))); + dev_info(sfp->dev, " Diagnostics: %s\n", -+ sfp_bitfield(options, sizeof(options), diagmon, -+ sfp->id.ext.diagmon)); ++ sff_bitfield(options, sizeof(options), diagmon, ++ id->ext.diagmon)); ++ dev_info(sfp->dev, " EnhOpts: %s\n", ++ sff_bitfield(options, sizeof(options), sfp_enhopts, ++ id->ext.enhopts)); ++} + + static int sfp_sm_mod_probe(struct sfp *sfp, bool report) + { + /* SFP module inserted - read I2C data */ +@@ -1685,9 +1898,9 @@ static int sfp_sm_mod_probe(struct sfp * + return -EAGAIN; + } + +- /* Cotsworks do not seem to update the checksums when they +- * do the final programming with the final module part number, +- * serial number and date code. ++ /* Cotsworks do not seem to update the checksums when they update the ++ * module part number, serial number and date code. They also format ++ * the date code incorrectly. + */ + cotsworks = !memcmp(id.base.vendor_name, "COTSWORKS ", 16); + cotsworks_sfbg = !memcmp(id.base.vendor_pn, "SFBG", 4); +@@ -1735,14 +1948,9 @@ static int sfp_sm_mod_probe(struct sfp * + } + } + +- sfp->id = id; ++ sfp_print_module_info(sfp, &id, cotsworks); + +- dev_info(sfp->dev, "module %.*s %.*s rev %.*s sn %.*s dc %.*s\n", +- (int)sizeof(id.base.vendor_name), id.base.vendor_name, +- (int)sizeof(id.base.vendor_pn), id.base.vendor_pn, +- (int)sizeof(id.base.vendor_rev), id.base.vendor_rev, +- (int)sizeof(id.ext.vendor_sn), id.ext.vendor_sn, +- (int)sizeof(id.ext.datecode), id.ext.datecode); ++ sfp->id = id; + /* Check whether we support this module */ if (!sfp->type->module_supported(&id)) { - dev_err(sfp->dev, diff --git a/patch/kernel/mvebu-dev/92-mvebu-gpio-add_wake_on_gpio_support.patch b/patch/kernel/mvebu-dev/92-mvebu-gpio-add_wake_on_gpio_support.patch index a06b7973b5..9274f2b1a1 100644 --- a/patch/kernel/mvebu-dev/92-mvebu-gpio-add_wake_on_gpio_support.patch +++ b/patch/kernel/mvebu-dev/92-mvebu-gpio-add_wake_on_gpio_support.patch @@ -51,7 +51,7 @@ * Functions implementing the pwm_chip methods */ static struct mvebu_pwm *to_mvebu_pwm(struct pwm_chip *chip) -@@ -1211,7 +1239,7 @@ static int mvebu_gpio_probe(struct platf +@@ -1219,7 +1247,7 @@ static int mvebu_gpio_probe(struct platf err = irq_alloc_domain_generic_chips( mvchip->domain, ngpios, 2, np->name, handle_level_irq, @@ -60,7 +60,7 @@ if (err) { dev_err(&pdev->dev, "couldn't allocate irq chips %s (DT).\n", mvchip->chip.label); -@@ -1229,6 +1257,8 @@ static int mvebu_gpio_probe(struct platf +@@ -1237,6 +1265,8 @@ static int mvebu_gpio_probe(struct platf ct->chip.irq_mask = mvebu_gpio_level_irq_mask; ct->chip.irq_unmask = mvebu_gpio_level_irq_unmask; ct->chip.irq_set_type = mvebu_gpio_irq_set_type; @@ -69,7 +69,7 @@ ct->chip.name = mvchip->chip.label; ct = &gc->chip_types[1]; -@@ -1237,6 +1267,8 @@ static int mvebu_gpio_probe(struct platf +@@ -1245,6 +1275,8 @@ static int mvebu_gpio_probe(struct platf ct->chip.irq_mask = mvebu_gpio_edge_irq_mask; ct->chip.irq_unmask = mvebu_gpio_edge_irq_unmask; ct->chip.irq_set_type = mvebu_gpio_irq_set_type; @@ -78,11 +78,11 @@ ct->handler = handle_edge_irq; ct->chip.name = mvchip->chip.label; -@@ -1252,6 +1284,7 @@ static int mvebu_gpio_probe(struct platf +@@ -1260,6 +1292,7 @@ static int mvebu_gpio_probe(struct platf continue; irq_set_chained_handler_and_data(irq, mvebu_gpio_irq_handler, mvchip); + mvchip->bank_irq[i] = irq; } - /* Some MVEBU SoCs have simple PWM support for GPIO lines */ + return 0; diff --git a/patch/kernel/mvebu-dev/general-increasing_DMA_block_memory_allocation_to_2048.patch b/patch/kernel/mvebu-dev/general-increasing_DMA_block_memory_allocation_to_2048.patch index ff11b4d98c..eef7296e75 100644 --- a/patch/kernel/mvebu-dev/general-increasing_DMA_block_memory_allocation_to_2048.patch +++ b/patch/kernel/mvebu-dev/general-increasing_DMA_block_memory_allocation_to_2048.patch @@ -1,6 +1,6 @@ --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c -@@ -314,7 +314,7 @@ static void *__alloc_remap_buffer(struct +@@ -315,7 +315,7 @@ static void *__alloc_remap_buffer(struct pgprot_t prot, struct page **ret_page, const void *caller, bool want_vaddr); diff --git a/patch/kernel/mvebu-dev/omit_VFP_emulation_exceptions_kernel_mode.patch b/patch/kernel/mvebu-dev/omit_VFP_emulation_exceptions_kernel_mode.patch deleted file mode 100644 index e776c35268..0000000000 --- a/patch/kernel/mvebu-dev/omit_VFP_emulation_exceptions_kernel_mode.patch +++ /dev/null @@ -1,158 +0,0 @@ -From: "Ard Biesheuvel" <(address hidden)> -Subject: entry: omit FP emulation for UND exceptions taken in kernel mode - -There are a couple of problems with the exception entry code that deals -with FP exceptions (which are reported as UND exceptions) when building -the kernel in Thumb2 mode: -- the conditional branch to vfp_kmode_exception in vfp_support_entry() - may be out of range for its target, depending on how the linker decides - to arrange the sections; -- when the UND exception is taken in kernel mode, the emulation handling - logic is entered via the 'call_fpe' label, which means we end up using - the wrong value/mask pairs to match and detect the NEON opcodes. - -Since UND exceptions in kernel mode are unlikely to occur on a hot path -(as opposed to the user mode version which is invoked for VFP support -code and lazy restore), we can use the existing undef hook machinery for -any kernel mode instruction emulation that is needed, including calling -the existing vfp_kmode_exception() routine for unexpected cases. So drop -the call to call_fpe, and instead, install an undef hook that will get -called for NEON and VFP instructions that trigger an UND exception in -kernel mode. - -While at it, make sure that the PC correction is accurate for the -execution mode where the exception was taken, by checking the PSR -Thumb bit. - -Cc: Dmitry Osipenko <(address hidden)> -Cc: Kees Cook <(address hidden)> -Fixes: eff8728fe698 ("vmlinux.lds.h: Add PGO and AutoFDO input sections") -Signed-off-by: Ard Biesheuvel <(address hidden)> -Reviewed-by: Linus Walleij <(address hidden)> -Reviewed-by: Nick Desaulniers <(address hidden)> ---- - ---- a/arch/arm/kernel/entry-armv.S -+++ b/arch/arm/kernel/entry-armv.S -@@ -252,31 +252,10 @@ __und_svc: - #else - svc_entry - #endif -- @ -- @ call emulation code, which returns using r9 if it has emulated -- @ the instruction, or the more conventional lr if we are to treat -- @ this as a real undefined instruction -- @ -- @ r0 - instruction -- @ --#ifndef CONFIG_THUMB2_KERNEL -- ldr r0, [r4, #-4] --#else -- mov r1, #2 -- ldrh r0, [r4, #-2] @ Thumb instruction at LR - 2 -- cmp r0, #0xe800 @ 32-bit instruction if xx >= 0 -- blo __und_svc_fault -- ldrh r9, [r4] @ bottom 16 bits -- add r4, r4, #2 -- str r4, [sp, #S_PC] -- orr r0, r9, r0, lsl #16 --#endif -- badr r9, __und_svc_finish -- mov r2, r4 -- bl call_fpe - - mov r1, #4 @ PC correction to apply --__und_svc_fault: -+ THUMB( tst r5, #PSR_T_BIT ) @ exception taken in Thumb mode? -+ THUMB( movne r1, #2 ) @ if so, fix up PC correction - mov r0, sp @ struct pt_regs *regs - bl __und_fault - ---- a/arch/arm/vfp/vfphw.S -+++ b/arch/arm/vfp/vfphw.S -@@ -79,11 +79,6 @@ ENTRY(vfp_support_entry) - DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10 - - .fpu vfpv2 -- ldr r3, [sp, #S_PSR] @ Neither lazy restore nor FP exceptions -- and r3, r3, #MODE_MASK @ are supported in kernel mode -- teq r3, #USR_MODE -- bne vfp_kmode_exception @ Returns through lr -- - VFPFMRX r1, FPEXC @ Is the VFP enabled? - DBGSTR1 "fpexc %08x", r1 - tst r1, #FPEXC_EN ---- a/arch/arm/vfp/vfpmodule.c -+++ b/arch/arm/vfp/vfpmodule.c -@@ -23,6 +23,7 @@ - #include - #include - #include -+#include - #include - - #include "vfpinstr.h" -@@ -642,7 +643,9 @@ static int vfp_starting_cpu(unsigned int - return 0; - } - --void vfp_kmode_exception(void) -+#ifdef CONFIG_KERNEL_MODE_NEON -+ -+static int vfp_kmode_exception(struct pt_regs *regs, unsigned int instr) - { - /* - * If we reach this point, a floating point exception has been raised -@@ -660,9 +663,51 @@ void vfp_kmode_exception(void) - pr_crit("BUG: unsupported FP instruction in kernel mode\n"); - else - pr_crit("BUG: FP instruction issued in kernel mode with FP unit disabled\n"); -+ pr_crit("FPEXC == 0x%08x\n", fmrx(FPEXC)); -+ return 1; - } - --#ifdef CONFIG_KERNEL_MODE_NEON -+static struct undef_hook vfp_kmode_exception_hook[] = {{ -+ .instr_mask = 0xfe000000, -+ .instr_val = 0xf2000000, -+ .cpsr_mask = MODE_MASK | PSR_T_BIT, -+ .cpsr_val = SVC_MODE, -+ .fn = vfp_kmode_exception, -+}, { -+ .instr_mask = 0xff100000, -+ .instr_val = 0xf4000000, -+ .cpsr_mask = MODE_MASK | PSR_T_BIT, -+ .cpsr_val = SVC_MODE, -+ .fn = vfp_kmode_exception, -+}, { -+ .instr_mask = 0xef000000, -+ .instr_val = 0xef000000, -+ .cpsr_mask = MODE_MASK | PSR_T_BIT, -+ .cpsr_val = SVC_MODE | PSR_T_BIT, -+ .fn = vfp_kmode_exception, -+}, { -+ .instr_mask = 0xff100000, -+ .instr_val = 0xf9000000, -+ .cpsr_mask = MODE_MASK | PSR_T_BIT, -+ .cpsr_val = SVC_MODE | PSR_T_BIT, -+ .fn = vfp_kmode_exception, -+}, { -+ .instr_mask = 0x0c000e00, -+ .instr_val = 0x0c000a00, -+ .cpsr_mask = MODE_MASK, -+ .cpsr_val = SVC_MODE, -+ .fn = vfp_kmode_exception, -+}}; -+ -+static int __init vfp_kmode_exception_hook_init(void) -+{ -+ int i; -+ -+ for (i = 0; i < ARRAY_SIZE(vfp_kmode_exception_hook); i++) -+ register_undef_hook(&vfp_kmode_exception_hook[i]); -+ return 0; -+} -+core_initcall(vfp_kmode_exception_hook_init); - - /* - * Kernel-side NEON support functions diff --git a/patch/kernel/mvebu-legacy/102-revert_i2c_delay.patch b/patch/kernel/mvebu-legacy/102-revert_i2c_delay.patch deleted file mode 100644 index 930c0f9494..0000000000 --- a/patch/kernel/mvebu-legacy/102-revert_i2c_delay.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- a/arch/arm/boot/dts/armada-xp.dtsi -+++ b/arch/arm/boot/dts/armada-xp.dtsi -@@ -237,12 +237,10 @@ - }; - - &i2c0 { -- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c"; - reg = <0x11000 0x100>; - }; - - &i2c1 { -- compatible = "marvell,mv78230-i2c", "marvell,mv64xxx-i2c"; - reg = <0x11100 0x100>; - }; -