build/patch/kernel/mvebu-default/0040-updates-pci.patch
Aditya Prayoga e261c6f828 Move mvebu DEFAULT, NEXT and DEV branch to next kernel (LTS) and U-boot #1426 (#1487)
* Initial Mvebu RFC https://github.com/armbian/build/issues/1426

Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>

* mvebu: add missing patches

Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>

* mvebu: change making u-boot targets to standard way, adjust patches and config

Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>

* helios4: set default branch to use U-Boot 2018.11

Switch over to U-Boot 2018.11 that has been used for some time in next
branch.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: helios4: Enable DEV branch

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* u-boot: Add RTC support on Clearfog and Helios4

Added DM driver for mvebu RTC and enable it on Clearfog and Helios4
configuration.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* add boot-marvell.cmd backward compatibility

The patches added missing variable that used on boot-marvell.cmd and
also adjust the some memory addresses to prevent crash due to usage of
fdt_high and initrd_high.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* helios4: Added SPI NOR flash target

Build bootable SPI NOR flash image.
Change the boot order to USB -> SATA -> MMC

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* Restore SPI support on U-Boot 2019.04

* mvebu: kernel: Added Wake-On-GPIO and WoL support

The patch set was missing during transition.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* [#1429] SolidRun's ARMADA A388 SOM U-Boot ODT Update

Old versions of U-Boot did not configure correctly the ODT on data
signals of DDR RAM on SolidRun's ARMADA A388 SOMs.

According to SolidRun Knowledge Base, the changes already pushed to
mainline U-Boot. But then it was overwritten when Marvell DDR Training
Tool updated

[URL]
https://developer.solid-run.com/knowledge-base/armada-38x-som-u-boot-odt-update/

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* [#1429] mvebu: u-boot: Add revision id for Armada 38x B0

Added patch for SolidRun U-Boot v2018.01 and
for Helios4 U-Boot v2018.11

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* clearfog: Added SPI NOR flash target

Build bootable SPI NOR flash image.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: clearfog: DEV branch use mainline U-Boot

Also move clearfog base patch into its own board folder.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: enable U-Boot uart target

Normal MMC image can be used for uart boot using following command:

./tools/kwboot -b u-boot-spl.kwb /dev/ttyUSBX

But on Helios4, the SPL failed to continue the booting process if ECC is
enabled, so disable it.

Since the usage of uart boot is more for rescue/debug, disable autoboot.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: NEXT branch use mainline U-Boot

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: helios4: fix fancontrol related bug during buster testing

- On kernel 4.19, cpu thermal sensor changed the name from
armada_thermal into f10e4078.thermal. Added this new name to udev rules
- Since DEFAULT branch now use kernel 4.14, update fancontrol
configuration
- Load lm75 kernel module
- On kernel 4.19, cpu temp reading about 20 degree C lower, update
fancontrol configuration.

[URL]
https://forum.armbian.com/topic/10214-clearfogpro-possible-change-in-temperature-reporting-between-414next-and-419dev

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: helios4: Override vendor provided fancontrol unit

systemd emit following message on dmesg

systemd[1]: /lib/systemd/system/fancontrol.service:9: PIDFile=
references path below legacy directory /var/run/, updating
/var/run/fancontrol.pid \xe2\x86\x92 /run/fancontrol.pid; please update
the unit file accordingly.

Override and change the value in the unit file to remove the message.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: DEV branch use its own u-boot patch folder

The patches are copied over from u-boot-mvebu-next

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: u-boot: Make clearfog model distinction more obvious

While at it, also change SerDes LANE4 into USB 3.0 on Clearfog Base.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* lib: Use apt-get install instead of dpkg on install_deb_chroot()

dpkg -i does not install dependencies required by the package.
This is needed if the BSP package requires other package that is not
installed during debootstrap.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* config: mvebu: helios4: Move various tweak to family_tweak_bsp()

Various tweak in family_tweaks_s() only applied to SD card image.
Move it to family_tweaks_bsp() so it will also included on the BSP
package and applied to existing user.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* config: mvebu: helios4: Add /etc/modules to BSP

On kernel 4.19, user need to modify the /etc/modules to add lm75 kernel
module. Pack the file into BSP so user no longer needed to modify it.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: kernel: Make zbud as built-in module

To remove the following error:
[    1.705485] zswap: default zpool zbud not available
[    1.705488] zswap: pool creation failed

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* bootscripts: mvebu: Add default value for spi_workaround

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: kernel: Backport armada_thermal changes to 4.14 (#1452)

On kernel 4.19, armada_thermal driver has been fixed to address
Marvell's Errata #132698 (The changes first appear on LK 4.16). The
result is temperature reading is around 20 degree Celsius lower.

Currently armbian-motd apply -20C tweak for both LK 4.14 and LK 4.19
which is incorrect. Instead of adding some logic on what condition to
apply the tweak, it is better to remove the tweak and patch the kernel
instead.

Revert commit b3dd4e9 ("[ mvebu ] Put back Armada temperature tweak in
motd")
which is part of #1421 solution.

[URL]
https://forum.armbian.com/topic/10214-clearfogpro-possible-change-in-temperature-reporting-between-414next-and-419dev/

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: helios4: unified fancontrol config

Since LK 4.14 on DEFAULT branch already patched and the temp reading is
same as LK 4.19 on NEXT branch, it is no longer needed to separate
fancontrol configuration file.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* u-boot: helios4: Remove rev id patch

The patch is already applied in helios4 repo, no need to have it in
armbian.
This revert helios4 part of commit 7411c55

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* u-boot: clearfog: enable PCIe support and PCIe reset

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* u-boot: clearfog: add boot-marvell.cmd backward compatibility

The patches added missing variable that used on boot-marvell.cmd and
also adjust the some memory addresses to prevent crash due to usage of
fdt_high and initrd_high.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu: helios4: tweak regarding temperature setting

Make fan speed similar compared to pre-patched armada-thermal. Target
PWM value around 70 during idle.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* config: sources: clearfog to use u-boot 2018.01 for NEXT branch

This changes also affect Helios4. Moved the shared U-Boot source setting
back to Helios4 for NEXT branch.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* config: boards: build Stretch image for Clearfog and Helios4

Also remove DEV from Helios4 CLI_TARGET

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* kernel: mvebu-next: Disable access to SPI Flash

User need to set spi_workaround=yes to enable SPI Flash access and lost
access to internal SATA.

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu-next: adjust kernel config

* mvebu-dev: bump to 5.2 and adjust kernel configuraion. Tested for building.

* Adjust kernel config, add AUFS

Signed-off-by: Igor Pecovnik <igor.pecovnik@gmail.com>

* mvebu-next: Adjust kernel config, add debug GPIO

Signed-off-by: Aditya Prayoga <aditya@kobol.io>

* mvebu-dev: separate Clearfog Base U-boot configuration file and patch

Signed-off-by: Aditya Prayoga <aditya@kobol.io>
2019-07-31 12:51:00 +02:00

196 lines
6.2 KiB
Diff

diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
index 53b79c5..7980be0 100644
--- a/drivers/pci/host/pci-mvebu.c
+++ b/drivers/pci/host/pci-mvebu.c
@@ -51,7 +51,14 @@
PCIE_CONF_ADDR_EN)
#define PCIE_CONF_DATA_OFF 0x18fc
#define PCIE_MASK_OFF 0x1910
+#define PCIE_MASK_PM_PME BIT(28)
#define PCIE_MASK_ENABLE_INTS 0x0f000000
+#define PCIE_MASK_ERR_COR BIT(18)
+#define PCIE_MASK_ERR_NONFATAL BIT(17)
+#define PCIE_MASK_ERR_FATAL BIT(16)
+#define PCIE_MASK_FERR_DET BIT(10)
+#define PCIE_MASK_NFERR_DET BIT(9)
+#define PCIE_MASK_CORERR_DET BIT(8)
#define PCIE_CTRL_OFF 0x1a00
#define PCIE_CTRL_X1_MODE 0x0001
#define PCIE_STAT_OFF 0x1a04
@@ -455,6 +462,54 @@ static void mvebu_pcie_handle_membase_change(struct mvebu_pcie_port *port)
MVEBU_MBUS_NO_REMAP);
}
+static void mvebu_pcie_handle_irq_change(struct mvebu_pcie_port *port)
+{
+ u32 reg, old;
+ u16 devctl, rtctl;
+
+ /*
+ * Errors from downstream devices:
+ * bridge control register SERR: enables reception of errors
+ * Errors from this device, or received errors:
+ * command SERR: enables ERR_NONFATAL and ERR_FATAL messages
+ * => when enabled, these conditions also flag SERR in status register
+ * devctl CERE: enables ERR_CORR messages
+ * devctl NFERE: enables ERR_NONFATAL messages
+ * devctl FERE: enables ERR_FATAL messages
+ * Enabled messages then have three paths:
+ * 1. rtctl: enables system error indication
+ * 2. root error status register updated
+ * 3. root error command register: forwarding via MSI
+ */
+ old = mvebu_readl(port, PCIE_MASK_OFF);
+ reg = old & ~(PCIE_MASK_PM_PME | PCIE_MASK_FERR_DET |
+ PCIE_MASK_NFERR_DET | PCIE_MASK_CORERR_DET |
+ PCIE_MASK_ERR_COR | PCIE_MASK_ERR_NONFATAL |
+ PCIE_MASK_ERR_FATAL);
+
+ devctl = port->bridge.pcie_devctl;
+ if (devctl & PCI_EXP_DEVCTL_FERE)
+ reg |= PCIE_MASK_FERR_DET | PCIE_MASK_ERR_FATAL;
+ if (devctl & PCI_EXP_DEVCTL_NFERE)
+ reg |= PCIE_MASK_NFERR_DET | PCIE_MASK_ERR_NONFATAL;
+ if (devctl & PCI_EXP_DEVCTL_CERE)
+ reg |= PCIE_MASK_CORERR_DET | PCIE_MASK_ERR_COR;
+ if (port->bridge.command & PCI_COMMAND_SERR)
+ reg |= PCIE_MASK_FERR_DET | PCIE_MASK_NFERR_DET |
+ PCIE_MASK_ERR_FATAL | PCIE_MASK_ERR_NONFATAL;
+
+ if (!(port->bridge.bridgectrl & PCI_BRIDGE_CTL_SERR))
+ reg &= ~(PCIE_MASK_ERR_COR | PCIE_MASK_ERR_NONFATAL |
+ PCIE_MASK_ERR_FATAL);
+
+ rtctl = port->bridge.pcie_rtctl;
+ if (rtctl & PCI_EXP_RTCTL_PMEIE)
+ reg |= PCIE_MASK_PM_PME;
+
+ if (old != reg)
+ mvebu_writel(port, reg, PCIE_MASK_OFF);
+}
+
/*
* Initialize the configuration space of the PCI-to-PCI bridge
* associated with the given PCIe interface.
@@ -478,6 +533,7 @@ static void mvebu_sw_pci_bridge_init(struct mvebu_pcie_port *port)
/* Add capabilities */
bridge->status = PCI_STATUS_CAP_LIST;
+ bridge->bridgectrl = PCI_BRIDGE_CTL_SERR;
}
/*
@@ -550,7 +606,7 @@ static int mvebu_sw_pci_bridge_read(struct mvebu_pcie_port *port,
case PCI_INTERRUPT_LINE:
/* LINE PIN MIN_GNT MAX_LAT */
- *value = 0;
+ *value = bridge->bridgectrl << 16;
break;
case PCISWCAP_EXP_LIST_ID:
@@ -599,6 +655,16 @@ static int mvebu_sw_pci_bridge_read(struct mvebu_pcie_port *port,
*value = mvebu_readl(port, PCIE_RC_RTSTA);
break;
+ case 0x100 ... 0x128:
+ *value = mvebu_readl(port, where & ~3);
+ break;
+
+ case 0x100 + PCI_ERR_ROOT_COMMAND:
+ case 0x100 + PCI_ERR_ROOT_STATUS:
+ case 0x100 + PCI_ERR_ROOT_ERR_SRC:
+ *value = 0;
+ break;
+
/* PCIe requires the v2 fields to be hard-wired to zero */
case PCISWCAP_EXP_DEVCAP2:
case PCISWCAP_EXP_DEVCTL2:
@@ -629,7 +695,7 @@ static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
unsigned int where, int size, u32 value)
{
struct mvebu_sw_pci_bridge *bridge = &port->bridge;
- u32 mask, reg;
+ u32 mask, reg, old;
int err;
if (size == 4)
@@ -649,8 +715,7 @@ static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
switch (where & ~3) {
case PCI_COMMAND:
- {
- u32 old = bridge->command;
+ old = bridge->command;
if (!mvebu_has_ioport(port))
value &= ~PCI_COMMAND_IO;
@@ -660,8 +725,9 @@ static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
mvebu_pcie_handle_iobase_change(port);
if ((old ^ bridge->command) & PCI_COMMAND_MEMORY)
mvebu_pcie_handle_membase_change(port);
+ if ((old ^ bridge->command) & PCI_COMMAND_SERR)
+ mvebu_pcie_handle_irq_change(port);
break;
- }
case PCI_BASE_ADDRESS_0 ... PCI_BASE_ADDRESS_1:
bridge->bar[((where & ~3) - PCI_BASE_ADDRESS_0) / 4] = value;
@@ -690,6 +756,17 @@ static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
mvebu_pcie_handle_iobase_change(port);
break;
+ case PCI_INTERRUPT_LINE:
+ value >>= 16;
+ old = bridge->bridgectrl;
+ /* PCIe only has three bits here */
+ bridge->bridgectrl = value & (PCI_BRIDGE_CTL_BUS_RESET |
+ PCI_BRIDGE_CTL_SERR |
+ PCI_BRIDGE_CTL_PARITY);
+ if ((old ^ bridge->bridgectrl) & PCI_BRIDGE_CTL_SERR)
+ mvebu_pcie_handle_irq_change(port);
+ break;
+
case PCI_PRIMARY_BUS:
bridge->primary_bus = value & 0xff;
bridge->secondary_bus = (value >> 8) & 0xff;
@@ -699,6 +776,14 @@ static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
break;
case PCISWCAP_EXP_DEVCTL:
+ old = bridge->pcie_devctl;
+ bridge->pcie_devctl = value & (PCI_EXP_DEVCTL_FERE |
+ PCI_EXP_DEVCTL_NFERE |
+ PCI_EXP_DEVCTL_CERE |
+ PCI_EXP_DEVCTL_URRE);
+ if (bridge->pcie_devctl ^ old)
+ mvebu_pcie_handle_irq_change(port);
+
/*
* Armada370 data says these bits must always
* be zero when in root complex mode.
@@ -739,10 +824,24 @@ static int mvebu_sw_pci_bridge_write(struct mvebu_pcie_port *port,
mvebu_writel(port, value, PCIE_CAP_PCIEXP + PCI_EXP_LNKCTL);
break;
+ case PCISWCAP_EXP_RTCTL:
+ old = bridge->pcie_rtctl;
+ bridge->pcie_rtctl = value & (PCI_EXP_RTCTL_SECEE |
+ PCI_EXP_RTCTL_SENFEE |
+ PCI_EXP_RTCTL_SEFEE |
+ PCI_EXP_RTCTL_PMEIE);
+ if (bridge->pcie_rtctl ^ old)
+ mvebu_pcie_handle_irq_change(port);
+ break;
+
case PCISWCAP_EXP_RTSTA:
mvebu_writel(port, value, PCIE_RC_RTSTA);
break;
+ case 0x100 ... 0x128:
+ mvebu_writel(port, value, where & ~3);
+ break;
+
default:
break;
}