aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-mmc-sdhci-acpi-fix-for-tuning-issue-in-E3000.patch45
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-spi-spi-amd-Add-AMD-SPI-controller-driver-support.patch397
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0002-usb-xhci-Add-LPM-support-to-AMD-xhci-controller.patch32
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0003-amd-xgbe-fix-for-the-crash-which-happens-during-SFP-.patch77
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0004-spi-spi-amd-fix-warning.patch32
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0005-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch32
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0006-spi-amd-Fix-duplicate-iounmap-in-error-path.patch41
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0007-spi-amd-Pass-probe-errors-back-to-driver-core.patch32
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0008-spi-amd-Drop-duplicate-driver-data-assignments.patch41
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0009-spi-amd-Fix-refcount-underflow-on-remove.patch63
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0010-spi-amd-Drop-superfluous-member-from-struct-amd_spi.patch62
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0011-spi-spidev-Add-dummy-spidev-device-to-SPI-bus.patch100
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0012-spi-spi-amd-Fix-a-NULL-vs-IS_ERR-check-in-amd_spi_pr.patch39
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0013-amd-xgbe-Fix-for-Network-fluctuations.patch39
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0014-amd-xgbe-Reset-the-PHY-rx-data-path-when-mailbox-com.patch84
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0015-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch67
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0016-amd-xgbe-sets-XGBE_LINK_INIT-when-there-is-a-link-fa.patch39
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0017-amd-xgbe-improved-KR-training-sequence.patch282
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0018-amd-xgbe-rrc-is-required-only-for-Fixed-PHY-configur.patch33
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0019-amd-xgbe-increased-cdr-delay.patch35
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0020-amd-xgbe-synchronization-between-AN-state-machine-an.patch123
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/afalg.cfg41
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-ccp.cfg27
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-emmc-patches.scc1
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-spi-patches.scc9
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-usb-patches.scc1
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe-patches.scc10
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe.cfg51
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-extra-config.cfg313
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-standard-only.cfg3
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-config.cfg402
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-features.scc0
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-patches.scc0
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86.cfg59
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/disable-graphics.cfg4
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/kvm.cfg39
36 files changed, 2655 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-mmc-sdhci-acpi-fix-for-tuning-issue-in-E3000.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-mmc-sdhci-acpi-fix-for-tuning-issue-in-E3000.patch
new file mode 100644
index 00000000..5e7e8a07
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-mmc-sdhci-acpi-fix-for-tuning-issue-in-E3000.patch
@@ -0,0 +1,45 @@
+From 6943e68cd564d7197a2c914bc12c037ca138adad Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Tue, 9 Feb 2021 23:44:03 +0530
+Subject: [PATCH] mmc: sdhci-acpi: fix for tuning issue in E3000
+
+ HS400 mode has tuning issue in E3000, The fix avoids swutching
+to HS from HS200 speed.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Signed-off-by: Rahul Kumar <rahul.kumar1@amd.com>
+---
+ drivers/mmc/host/sdhci-acpi.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/drivers/mmc/host/sdhci-acpi.c b/drivers/mmc/host/sdhci-acpi.c
+index b2d924c5e82e..9622fa3108d1 100644
+--- a/drivers/mmc/host/sdhci-acpi.c
++++ b/drivers/mmc/host/sdhci-acpi.c
+@@ -582,6 +582,14 @@ static void amd_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
+ unsigned int old_timing = host->timing;
+ u16 val;
+
++ if (host->quirks2 & SDHCI_QUIRK2_TUNING_WORK_AROUND) {
++ if (mmc->ios.clock == 52000000 && host->clock == 200000000)
++ return;
++
++ if (mmc->ios.timing == 1 && host->timing == 9)
++ return;
++ }
++
+ sdhci_set_ios(mmc, ios);
+
+ if (old_timing != host->timing && amd_host->tuned_clock) {
+@@ -658,6 +666,8 @@ static int sdhci_acpi_emmc_amd_probe_slot(struct platform_device *pdev,
+ (host->mmc->caps & MMC_CAP_1_8V_DDR))
+ host->mmc->caps2 = MMC_CAP2_HS400_1_8V;
+
++ host->quirks2 |= SDHCI_QUIRK2_TUNING_WORK_AROUND;
++
+ host->mmc_host_ops.select_drive_strength = amd_select_drive_strength;
+ host->mmc_host_ops.set_ios = amd_set_ios;
+ host->mmc_host_ops.execute_tuning = amd_sdhci_execute_tuning;
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-spi-spi-amd-Add-AMD-SPI-controller-driver-support.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-spi-spi-amd-Add-AMD-SPI-controller-driver-support.patch
new file mode 100644
index 00000000..65e4aa9a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0001-spi-spi-amd-Add-AMD-SPI-controller-driver-support.patch
@@ -0,0 +1,397 @@
+From 8bc785f4b21ad0d1bb660a3b20750835ef0f47a0 Mon Sep 17 00:00:00 2001
+From: Sanjay R Mehta <sanju.mehta@amd.com>
+Date: Sat, 25 Apr 2020 14:59:48 -0500
+Subject: [PATCH 01/21] spi: spi-amd: Add AMD SPI controller driver support
+
+This driver supports SPI Controller for AMD SOCs.This driver
+supports SPI operations using FIFO mode of transfer.
+
+Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Link: https://lore.kernel.org/r/1587844788-33997-1-git-send-email-sanju.mehta@amd.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/Kconfig | 6 +
+ drivers/spi/Makefile | 1 +
+ drivers/spi/spi-amd.c | 333 ++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 340 insertions(+)
+ mode change 100644 => 100755 drivers/spi/Kconfig
+ mode change 100644 => 100755 drivers/spi/Makefile
+ create mode 100755 drivers/spi/spi-amd.c
+
+diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig
+old mode 100644
+new mode 100755
+index 5bf754208777..6404cacb377b
+--- a/drivers/spi/Kconfig
++++ b/drivers/spi/Kconfig
+@@ -876,6 +876,12 @@ config SPI_ZYNQMP_GQSPI
+ help
+ Enables Xilinx GQSPI controller driver for Zynq UltraScale+ MPSoC.
+
++config SPI_AMD
++ tristate "AMD SPI controller"
++ depends on SPI_MASTER || COMPILE_TEST
++ help
++ Enables SPI controller driver for AMD SoC.
++
+ #
+ # Add new SPI master controllers in alphabetical order above this line
+ #
+diff --git a/drivers/spi/Makefile b/drivers/spi/Makefile
+old mode 100644
+new mode 100755
+index bb49c9e6d0a0..7af5aca3ed04
+--- a/drivers/spi/Makefile
++++ b/drivers/spi/Makefile
+@@ -122,6 +122,7 @@ obj-$(CONFIG_SPI_XLP) += spi-xlp.o
+ obj-$(CONFIG_SPI_XTENSA_XTFPGA) += spi-xtensa-xtfpga.o
+ obj-$(CONFIG_SPI_ZYNQ_QSPI) += spi-zynq-qspi.o
+ obj-$(CONFIG_SPI_ZYNQMP_GQSPI) += spi-zynqmp-gqspi.o
++obj-$(CONFIG_SPI_AMD) += spi-amd.o
+
+ # SPI slave protocol handlers
+ obj-$(CONFIG_SPI_SLAVE_TIME) += spi-slave-time.o
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+new file mode 100755
+index 000000000000..0d9debe1386e
+--- /dev/null
++++ b/drivers/spi/spi-amd.c
+@@ -0,0 +1,333 @@
++// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
++//
++// AMD SPI controller driver
++//
++// Copyright (c) 2020, Advanced Micro Devices, Inc.
++//
++// Author: Sanjay R Mehta <sanju.mehta@amd.com>
++
++#include <linux/acpi.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/delay.h>
++#include <linux/spi/spi.h>
++
++#define AMD_SPI_CTRL0_REG 0x00
++#define AMD_SPI_EXEC_CMD BIT(16)
++#define AMD_SPI_FIFO_CLEAR BIT(20)
++#define AMD_SPI_BUSY BIT(31)
++
++#define AMD_SPI_OPCODE_MASK 0xFF
++
++#define AMD_SPI_ALT_CS_REG 0x1D
++#define AMD_SPI_ALT_CS_MASK 0x3
++
++#define AMD_SPI_FIFO_BASE 0x80
++#define AMD_SPI_TX_COUNT_REG 0x48
++#define AMD_SPI_RX_COUNT_REG 0x4B
++#define AMD_SPI_STATUS_REG 0x4C
++
++#define AMD_SPI_MEM_SIZE 200
++
++/* M_CMD OP codes for SPI */
++#define AMD_SPI_XFER_TX 1
++#define AMD_SPI_XFER_RX 2
++
++struct amd_spi {
++ void __iomem *io_remap_addr;
++ unsigned long io_base_addr;
++ u32 rom_addr;
++ struct spi_master *master;
++ u8 chip_select;
++};
++
++static inline u8 amd_spi_readreg8(struct spi_master *master, int idx)
++{
++ struct amd_spi *amd_spi = spi_master_get_devdata(master);
++
++ return ioread8((u8 __iomem *)amd_spi->io_remap_addr + idx);
++}
++
++static inline void amd_spi_writereg8(struct spi_master *master, int idx,
++ u8 val)
++{
++ struct amd_spi *amd_spi = spi_master_get_devdata(master);
++
++ iowrite8(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
++}
++
++static inline void amd_spi_setclear_reg8(struct spi_master *master, int idx,
++ u8 set, u8 clear)
++{
++ u8 tmp = amd_spi_readreg8(master, idx);
++
++ tmp = (tmp & ~clear) | set;
++ amd_spi_writereg8(master, idx, tmp);
++}
++
++static inline u32 amd_spi_readreg32(struct spi_master *master, int idx)
++{
++ struct amd_spi *amd_spi = spi_master_get_devdata(master);
++
++ return ioread32((u8 __iomem *)amd_spi->io_remap_addr + idx);
++}
++
++static inline void amd_spi_writereg32(struct spi_master *master, int idx,
++ u32 val)
++{
++ struct amd_spi *amd_spi = spi_master_get_devdata(master);
++
++ iowrite32(val, ((u8 __iomem *)amd_spi->io_remap_addr + idx));
++}
++
++static inline void amd_spi_setclear_reg32(struct spi_master *master, int idx,
++ u32 set, u32 clear)
++{
++ u32 tmp = amd_spi_readreg32(master, idx);
++
++ tmp = (tmp & ~clear) | set;
++ amd_spi_writereg32(master, idx, tmp);
++}
++
++static void amd_spi_select_chip(struct spi_master *master)
++{
++ struct amd_spi *amd_spi = spi_master_get_devdata(master);
++ u8 chip_select = amd_spi->chip_select;
++
++ amd_spi_setclear_reg8(master, AMD_SPI_ALT_CS_REG, chip_select,
++ AMD_SPI_ALT_CS_MASK);
++}
++
++static void amd_spi_clear_fifo_ptr(struct spi_master *master)
++{
++ amd_spi_setclear_reg32(master, AMD_SPI_CTRL0_REG, AMD_SPI_FIFO_CLEAR,
++ AMD_SPI_FIFO_CLEAR);
++}
++
++static void amd_spi_set_opcode(struct spi_master *master, u8 cmd_opcode)
++{
++ amd_spi_setclear_reg32(master, AMD_SPI_CTRL0_REG, cmd_opcode,
++ AMD_SPI_OPCODE_MASK);
++}
++
++static inline void amd_spi_set_rx_count(struct spi_master *master,
++ u8 rx_count)
++{
++ amd_spi_setclear_reg8(master, AMD_SPI_RX_COUNT_REG, rx_count, 0xff);
++}
++
++static inline void amd_spi_set_tx_count(struct spi_master *master,
++ u8 tx_count)
++{
++ amd_spi_setclear_reg8(master, AMD_SPI_TX_COUNT_REG, tx_count, 0xff);
++}
++
++static inline int amd_spi_busy_wait(struct amd_spi *amd_spi)
++{
++ bool spi_busy;
++ int timeout = 100000;
++
++ /* poll for SPI bus to become idle */
++ spi_busy = (ioread32((u8 __iomem *)amd_spi->io_remap_addr +
++ AMD_SPI_CTRL0_REG) & AMD_SPI_BUSY) == AMD_SPI_BUSY;
++ while (spi_busy) {
++ usleep_range(10, 20);
++ if (timeout-- < 0)
++ return -ETIMEDOUT;
++
++ spi_busy = (ioread32((u8 __iomem *)amd_spi->io_remap_addr +
++ AMD_SPI_CTRL0_REG) & AMD_SPI_BUSY) == AMD_SPI_BUSY;
++ }
++
++ return 0;
++}
++
++static void amd_spi_execute_opcode(struct spi_master *master)
++{
++ struct amd_spi *amd_spi = spi_master_get_devdata(master);
++
++ /* Set ExecuteOpCode bit in the CTRL0 register */
++ amd_spi_setclear_reg32(master, AMD_SPI_CTRL0_REG, AMD_SPI_EXEC_CMD,
++ AMD_SPI_EXEC_CMD);
++
++ amd_spi_busy_wait(amd_spi);
++}
++
++static int amd_spi_master_setup(struct spi_device *spi)
++{
++ struct spi_master *master = spi->master;
++
++ amd_spi_clear_fifo_ptr(master);
++
++ return 0;
++}
++
++static inline int amd_spi_fifo_xfer(struct amd_spi *amd_spi,
++ struct spi_message *message)
++{
++ struct spi_master *master = amd_spi->master;
++ struct spi_transfer *xfer = NULL;
++ u8 cmd_opcode, opcode = 0;
++ u8 *buf = NULL;
++ u32 m_cmd = 0;
++ u32 i = 0;
++ u32 tx_len = 0, rx_len = 0;
++
++ list_for_each_entry(xfer, &message->transfers,
++ transfer_list) {
++ if (xfer->rx_buf)
++ m_cmd = AMD_SPI_XFER_RX;
++ if (xfer->tx_buf)
++ m_cmd = AMD_SPI_XFER_TX;
++
++ if (m_cmd & AMD_SPI_XFER_TX) {
++ buf = (u8 *)xfer->tx_buf;
++ tx_len = xfer->len - 1;
++ cmd_opcode = *(u8 *)xfer->tx_buf;
++ buf++;
++ amd_spi_set_opcode(master, cmd_opcode);
++
++ /* Write data into the FIFO. */
++ for (i = 0; i < tx_len; i++) {
++ iowrite8(buf[i],
++ ((u8 __iomem *)amd_spi->io_remap_addr +
++ AMD_SPI_FIFO_BASE + i));
++ }
++
++ amd_spi_set_tx_count(master, tx_len);
++ amd_spi_clear_fifo_ptr(master);
++ /* Execute command */
++ amd_spi_execute_opcode(master);
++ }
++ if (m_cmd & AMD_SPI_XFER_RX) {
++ /*
++ * Store no. of bytes to be received from
++ * FIFO
++ */
++ rx_len = xfer->len;
++ buf = (u8 *)xfer->rx_buf;
++ amd_spi_set_rx_count(master, rx_len);
++ amd_spi_clear_fifo_ptr(master);
++ /* Execute command */
++ amd_spi_execute_opcode(master);
++ /* Read data from FIFO to receive buffer */
++ for (i = 0; i < rx_len; i++)
++ buf[i] = amd_spi_readreg8(master,
++ AMD_SPI_FIFO_BASE +
++ tx_len + i);
++ }
++ }
++
++ /* Update statistics */
++ message->actual_length = tx_len + rx_len + 1;
++ /* complete the transaction */
++ message->status = 0;
++ spi_finalize_current_message(master);
++
++ return 0;
++}
++
++static int amd_spi_master_transfer(struct spi_master *master,
++ struct spi_message *msg)
++{
++ struct amd_spi *amd_spi = spi_master_get_devdata(master);
++ struct spi_device *spi = msg->spi;
++
++ amd_spi->chip_select = spi->chip_select;
++ amd_spi_select_chip(master);
++
++ /*
++ * Extract spi_transfers from the spi message and
++ * program the controller.
++ */
++ amd_spi_fifo_xfer(amd_spi, msg);
++
++ return 0;
++}
++
++static int amd_spi_probe(struct platform_device *pdev)
++{
++ struct device *dev = &pdev->dev;
++ struct spi_master *master;
++ struct amd_spi *amd_spi;
++ struct resource *res;
++ int err = 0;
++
++ /* Allocate storage for spi_master and driver private data */
++ master = spi_alloc_master(dev, sizeof(struct amd_spi));
++ if (!master) {
++ dev_err(dev, "Error allocating SPI master\n");
++ return -ENOMEM;
++ }
++
++ amd_spi = spi_master_get_devdata(master);
++ amd_spi->master = master;
++
++ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++ amd_spi->io_remap_addr = devm_ioremap_resource(&pdev->dev, res);
++
++ if (!amd_spi->io_remap_addr) {
++ dev_err(dev, "error %d ioremap of SPI registers failed\n", err);
++ err = -ENOMEM;
++ goto err_free_master;
++ }
++ dev_dbg(dev, "io_remap_address: %p\n", amd_spi->io_remap_addr);
++
++ /* Initialize the spi_master fields */
++ master->bus_num = 0;
++ master->num_chipselect = 4;
++ master->mode_bits = 0;
++ master->flags = SPI_MASTER_HALF_DUPLEX;
++ master->setup = amd_spi_master_setup;
++ master->transfer_one_message = amd_spi_master_transfer;
++
++ /* Register the controller with SPI framework */
++ err = spi_register_master(master);
++ if (err) {
++ dev_err(dev, "error %d registering SPI controller\n", err);
++ goto err_iounmap;
++ }
++ platform_set_drvdata(pdev, amd_spi);
++
++ return 0;
++
++err_iounmap:
++ iounmap(amd_spi->io_remap_addr);
++err_free_master:
++ spi_master_put(master);
++
++ return 0;
++}
++
++static int amd_spi_remove(struct platform_device *pdev)
++{
++ struct amd_spi *amd_spi = platform_get_drvdata(pdev);
++
++ spi_unregister_master(amd_spi->master);
++ spi_master_put(amd_spi->master);
++ platform_set_drvdata(pdev, NULL);
++
++ return 0;
++}
++
++static const struct acpi_device_id spi_acpi_match[] = {
++ { "AMDI0061", 0 },
++ {},
++};
++MODULE_DEVICE_TABLE(acpi, spi_acpi_match);
++
++static struct platform_driver amd_spi_driver = {
++ .driver = {
++ .name = "amd_spi",
++ .acpi_match_table = ACPI_PTR(spi_acpi_match),
++ },
++ .probe = amd_spi_probe,
++ .remove = amd_spi_remove,
++};
++
++module_platform_driver(amd_spi_driver);
++
++MODULE_LICENSE("Dual BSD/GPL");
++MODULE_AUTHOR("Sanjay Mehta <sanju.mehta@amd.com>");
++MODULE_DESCRIPTION("AMD SPI Master Controller Driver");
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0002-usb-xhci-Add-LPM-support-to-AMD-xhci-controller.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0002-usb-xhci-Add-LPM-support-to-AMD-xhci-controller.patch
new file mode 100644
index 00000000..abacbcbf
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0002-usb-xhci-Add-LPM-support-to-AMD-xhci-controller.patch
@@ -0,0 +1,32 @@
+From bbc77f325f5b9bba1836cf5e25e8ad5529397807 Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Fri, 24 Jul 2020 15:43:52 +0530
+Subject: [PATCH 02/21] usb: xhci: Add LPM support to AMD xhci controller
+
+xHCI quirk for LPM and Runtime power management for AMD Raven xHCI
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/usb/host/xhci-pci.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
+index bbd616324faa..c69e7d46799c 100644
+--- a/drivers/usb/host/xhci-pci.c
++++ b/drivers/usb/host/xhci-pci.c
+@@ -152,6 +152,12 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
+ if (pdev->vendor == PCI_VENDOR_ID_AMD)
+ xhci->quirks |= XHCI_TRUST_TX_LENGTH;
+
++ if (pdev->vendor == PCI_VENDOR_ID_AMD &&
++ (pdev->device == 0x15e0 || pdev->device == 0x15e1 || pdev->device == 0x15e5)) {
++ xhci->quirks |= XHCI_LPM_SUPPORT;
++ xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW;
++ }
++
+ if ((pdev->vendor == PCI_VENDOR_ID_AMD) &&
+ ((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) ||
+ (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_3) ||
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0003-amd-xgbe-fix-for-the-crash-which-happens-during-SFP-.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0003-amd-xgbe-fix-for-the-crash-which-happens-during-SFP-.patch
new file mode 100644
index 00000000..7135fab9
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0003-amd-xgbe-fix-for-the-crash-which-happens-during-SFP-.patch
@@ -0,0 +1,77 @@
+From 60c3eb8f81b87dbacb1b9adadce3fbe08d8c1ba8 Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Thu, 13 Feb 2020 15:26:20 +0530
+Subject: [PATCH 03/21] amd-xgbe fix for the crash which happens during SFP
+ hotplug
+
+ INFO: task kworker/u32:3:238 blocked for more than 120 seconds.
+ Tainted: G E 5.4.2-sfp-fix+ #58
+ "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
+ kworker/u32:3 D 0 238 2 0x80004000
+ Workqueue: enp2s0f1 xgbe_service [amd_xgbe]
+ Call Trace:
+ ? __schedule+0x293/0x700
+ schedule+0x2f/0xa0
+ schedule_preempt_disabled+0xa/0x10
+ __mutex_lock.isra.9+0x26d/0x4e0
+ ? xgbe_phy_get_comm_ownership+0x1f/0x110 [amd_xgbe]
+ xgbe_phy_get_comm_ownership+0x1f/0x110 [amd_xgbe]
+ xgbe_phy_mii_read+0x28/0xb0 [amd_xgbe]
+ ? kernfs_put+0xe9/0x190
+ __mdiobus_read+0x3b/0xd0
+ __phy_modify_changed+0x2b/0x80
+ phy_modify+0x38/0x60
+ phy_suspend+0x84/0xc0
+ phy_detach+0x5e/0x120
+ xgbe_phy_free_phy_device.isra.22+0x1d/0x50 [amd_xgbe]
+ xgbe_phy_sfp_mod_absent.isra.25+0xe/0x50 [amd_xgbe]
+ xgbe_phy_sfp_detect+0x16a/0x9b0 [amd_xgbe]
+ ? xgbe_phy_link_status+0x10a/0x490 [amd_xgbe]
+ xgbe_phy_link_status+0x10a/0x490 [amd_xgbe]
+ xgbe_phy_status+0x57/0x380 [amd_xgbe]
+ process_one_work+0x1f4/0x3e0
+ worker_thread+0x2d/0x3e0
+ ? process_one_work+0x3e0/0x3e0
+ kthread+0x113/0x130
+ ? kthread_park+0x90/0x90
+ ret_from_fork+0x22/0x40
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+index 128cd648ba99..fcb3a06fc70f 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+@@ -1279,7 +1279,7 @@ static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata)
+
+ memcpy(&phy_data->sfp_eeprom, &sfp_eeprom, sizeof(sfp_eeprom));
+
+- xgbe_phy_free_phy_device(pdata);
++
+ } else {
+ phy_data->sfp_changed = 0;
+ }
+@@ -1316,7 +1316,6 @@ static void xgbe_phy_sfp_mod_absent(struct xgbe_prv_data *pdata)
+ {
+ struct xgbe_phy_data *phy_data = pdata->phy_data;
+
+- xgbe_phy_free_phy_device(pdata);
+
+ phy_data->sfp_mod_absent = 1;
+ phy_data->sfp_phy_avail = 0;
+@@ -1368,6 +1367,9 @@ static void xgbe_phy_sfp_detect(struct xgbe_prv_data *pdata)
+ xgbe_phy_sfp_phy_settings(pdata);
+
+ xgbe_phy_put_comm_ownership(pdata);
++
++ if((phy_data->sfp_mod_absent) || (phy_data->sfp_changed))
++ xgbe_phy_free_phy_device(pdata);
+ }
+
+ static int xgbe_phy_module_eeprom(struct xgbe_prv_data *pdata,
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0004-spi-spi-amd-fix-warning.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0004-spi-spi-amd-fix-warning.patch
new file mode 100644
index 00000000..d42090d8
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0004-spi-spi-amd-fix-warning.patch
@@ -0,0 +1,32 @@
+From 299b3d7816c818651bdd1b9f3be73c7aa92228cf Mon Sep 17 00:00:00 2001
+From: Sanjay R Mehta <sanju.mehta@amd.com>
+Date: Mon, 27 Apr 2020 23:56:41 -0500
+Subject: [PATCH 04/21] spi: spi-amd: fix warning
+
+remove unused variable "opcode"
+
+Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Link: https://lore.kernel.org/r/1588049801-37995-1-git-send-email-sanju.mehta@amd.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spi-amd.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+index 0d9debe1386e..c5a16dd44fa3 100755
+--- a/drivers/spi/spi-amd.c
++++ b/drivers/spi/spi-amd.c
+@@ -168,7 +168,7 @@ static inline int amd_spi_fifo_xfer(struct amd_spi *amd_spi,
+ {
+ struct spi_master *master = amd_spi->master;
+ struct spi_transfer *xfer = NULL;
+- u8 cmd_opcode, opcode = 0;
++ u8 cmd_opcode;
+ u8 *buf = NULL;
+ u32 m_cmd = 0;
+ u32 i = 0;
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0005-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0005-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch
new file mode 100644
index 00000000..b399de63
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0005-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch
@@ -0,0 +1,32 @@
+From 6b2a531663d7ef38c935c65e36def871a135c64d Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Sun, 12 Apr 2020 20:49:35 +0530
+Subject: [PATCH 05/21] amd-xgbe Fix NETDEV WATCHDOG: transmit queue timed out
+
+netif_carrier_off() called immediately after netif_tx_stop_all_queues()
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 3 +++
+ 1 file changed, 3 insertions(+)
+ mode change 100644 => 100755 drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+old mode 100644
+new mode 100755
+index 3bd20f765120..1ad361644245
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+@@ -1443,6 +1443,9 @@ static void xgbe_stop(struct xgbe_prv_data *pdata)
+ return;
+
+ netif_tx_stop_all_queues(netdev);
++ /* Bug fix to crash while resetting the port */
++ netif_carrier_off(pdata->netdev);
++ netif_dbg(pdata, link, pdata->netdev," netif_carrier_off is doing before stopping PHY \n");
+
+ xgbe_stop_timers(pdata);
+ flush_workqueue(pdata->dev_workqueue);
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0006-spi-amd-Fix-duplicate-iounmap-in-error-path.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0006-spi-amd-Fix-duplicate-iounmap-in-error-path.patch
new file mode 100644
index 00000000..a06c68be
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0006-spi-amd-Fix-duplicate-iounmap-in-error-path.patch
@@ -0,0 +1,41 @@
+From 2d846fc42efeab7c963e723e69ab03ed65d8d90f Mon Sep 17 00:00:00 2001
+From: Lukas Wunner <lukas@wunner.de>
+Date: Mon, 4 May 2020 13:12:01 +0200
+Subject: [PATCH 06/21] spi: amd: Fix duplicate iounmap in error path
+
+The AMD SPI driver uses devm_ioremap_resource() to map its registers, so
+they're automatically unmapped via device_release() when the last ref on
+the SPI controller is dropped. The additional iounmap() in the ->probe()
+error path is thus unnecessary.
+
+Signed-off-by: Lukas Wunner <lukas@wunner.de>
+Link: https://lore.kernel.org/r/497cc38ae2beb7900ae05a1463eb83ff96e2770e.1588590210.git.lukas@wunner.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spi-amd.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+index c5a16dd44fa3..fe088ef9752f 100755
+--- a/drivers/spi/spi-amd.c
++++ b/drivers/spi/spi-amd.c
+@@ -286,14 +286,12 @@ static int amd_spi_probe(struct platform_device *pdev)
+ err = spi_register_master(master);
+ if (err) {
+ dev_err(dev, "error %d registering SPI controller\n", err);
+- goto err_iounmap;
++ goto err_free_master;
+ }
+ platform_set_drvdata(pdev, amd_spi);
+
+ return 0;
+
+-err_iounmap:
+- iounmap(amd_spi->io_remap_addr);
+ err_free_master:
+ spi_master_put(master);
+
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0007-spi-amd-Pass-probe-errors-back-to-driver-core.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0007-spi-amd-Pass-probe-errors-back-to-driver-core.patch
new file mode 100644
index 00000000..2352a9bb
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0007-spi-amd-Pass-probe-errors-back-to-driver-core.patch
@@ -0,0 +1,32 @@
+From 0199162e835d63769a67215407b95dcfa6203762 Mon Sep 17 00:00:00 2001
+From: Lukas Wunner <lukas@wunner.de>
+Date: Mon, 4 May 2020 13:12:02 +0200
+Subject: [PATCH 07/21] spi: amd: Pass probe errors back to driver core
+
+If probing fails, the AMD SPI driver pretends success to the driver core
+by returning 0. Return the errno instead.
+
+Signed-off-by: Lukas Wunner <lukas@wunner.de>
+Link: https://lore.kernel.org/r/689f29a359718dab4f5de9ee66c02ea97b3bd9e8.1588590210.git.lukas@wunner.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spi-amd.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+index fe088ef9752f..bafdb6249824 100755
+--- a/drivers/spi/spi-amd.c
++++ b/drivers/spi/spi-amd.c
+@@ -295,7 +295,7 @@ static int amd_spi_probe(struct platform_device *pdev)
+ err_free_master:
+ spi_master_put(master);
+
+- return 0;
++ return err;
+ }
+
+ static int amd_spi_remove(struct platform_device *pdev)
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0008-spi-amd-Drop-duplicate-driver-data-assignments.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0008-spi-amd-Drop-duplicate-driver-data-assignments.patch
new file mode 100644
index 00000000..70ec6382
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0008-spi-amd-Drop-duplicate-driver-data-assignments.patch
@@ -0,0 +1,41 @@
+From 9d509fee50d4b3fdf6f3a2f1a6ad2081073aebb5 Mon Sep 17 00:00:00 2001
+From: Lukas Wunner <lukas@wunner.de>
+Date: Mon, 4 May 2020 13:12:03 +0200
+Subject: [PATCH 08/21] spi: amd: Drop duplicate driver data assignments
+
+The AMD SPI driver calls platform_set_drvdata() on probe even though
+it's already been set by __spi_alloc_controller(). Likewise, it calls
+platform_set_drvdata() on remove even though it's going to be set by
+__device_release_driver(). Drop the duplicate assignments.
+
+Signed-off-by: Lukas Wunner <lukas@wunner.de>
+Link: https://lore.kernel.org/r/499f8ad4759c2ff0f586e0459fb9a293faecff6d.1588590210.git.lukas@wunner.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spi-amd.c | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+index bafdb6249824..f8d008ea112d 100755
+--- a/drivers/spi/spi-amd.c
++++ b/drivers/spi/spi-amd.c
+@@ -288,7 +288,6 @@ static int amd_spi_probe(struct platform_device *pdev)
+ dev_err(dev, "error %d registering SPI controller\n", err);
+ goto err_free_master;
+ }
+- platform_set_drvdata(pdev, amd_spi);
+
+ return 0;
+
+@@ -304,7 +303,6 @@ static int amd_spi_remove(struct platform_device *pdev)
+
+ spi_unregister_master(amd_spi->master);
+ spi_master_put(amd_spi->master);
+- platform_set_drvdata(pdev, NULL);
+
+ return 0;
+ }
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0009-spi-amd-Fix-refcount-underflow-on-remove.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0009-spi-amd-Fix-refcount-underflow-on-remove.patch
new file mode 100644
index 00000000..5344b1d6
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0009-spi-amd-Fix-refcount-underflow-on-remove.patch
@@ -0,0 +1,63 @@
+From 2cbb984d07b92762a7e1d32ffbbb965849268cc1 Mon Sep 17 00:00:00 2001
+From: Lukas Wunner <lukas@wunner.de>
+Date: Mon, 4 May 2020 13:12:04 +0200
+Subject: [PATCH 09/21] spi: amd: Fix refcount underflow on remove
+
+The AMD SPI driver calls spi_master_put() in its ->remove() hook even
+though the preceding call to spi_unregister_master() already drops a
+ref, thus leading to a refcount underflow. Drop the superfluous call
+to spi_master_put().
+
+This only leaves the call to spi_unregister_master() in the ->remove()
+hook, so it's safe to change the ->probe() hook to use the devm version
+of spi_register_master() and drop the ->remove() hook altogether.
+
+Signed-off-by: Lukas Wunner <lukas@wunner.de>
+Link: https://lore.kernel.org/r/5e53ccdf1eecd4e015dba99d0d77389107f8a2e3.1588590210.git.lukas@wunner.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spi-amd.c | 13 +------------
+ 1 file changed, 1 insertion(+), 12 deletions(-)
+
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+index f8d008ea112d..489a95fff49e 100755
+--- a/drivers/spi/spi-amd.c
++++ b/drivers/spi/spi-amd.c
+@@ -283,7 +283,7 @@ static int amd_spi_probe(struct platform_device *pdev)
+ master->transfer_one_message = amd_spi_master_transfer;
+
+ /* Register the controller with SPI framework */
+- err = spi_register_master(master);
++ err = devm_spi_register_master(dev, master);
+ if (err) {
+ dev_err(dev, "error %d registering SPI controller\n", err);
+ goto err_free_master;
+@@ -297,16 +297,6 @@ static int amd_spi_probe(struct platform_device *pdev)
+ return err;
+ }
+
+-static int amd_spi_remove(struct platform_device *pdev)
+-{
+- struct amd_spi *amd_spi = platform_get_drvdata(pdev);
+-
+- spi_unregister_master(amd_spi->master);
+- spi_master_put(amd_spi->master);
+-
+- return 0;
+-}
+-
+ static const struct acpi_device_id spi_acpi_match[] = {
+ { "AMDI0061", 0 },
+ {},
+@@ -319,7 +309,6 @@ static struct platform_driver amd_spi_driver = {
+ .acpi_match_table = ACPI_PTR(spi_acpi_match),
+ },
+ .probe = amd_spi_probe,
+- .remove = amd_spi_remove,
+ };
+
+ module_platform_driver(amd_spi_driver);
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0010-spi-amd-Drop-superfluous-member-from-struct-amd_spi.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0010-spi-amd-Drop-superfluous-member-from-struct-amd_spi.patch
new file mode 100644
index 00000000..902e8cda
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0010-spi-amd-Drop-superfluous-member-from-struct-amd_spi.patch
@@ -0,0 +1,62 @@
+From ee070973c9d449c2cf45e91bee82ec936e49f068 Mon Sep 17 00:00:00 2001
+From: Lukas Wunner <lukas@wunner.de>
+Date: Mon, 4 May 2020 13:12:05 +0200
+Subject: [PATCH 10/21] spi: amd: Drop superfluous member from struct amd_spi
+
+The AMD SPI driver stores a pointer to the spi_master in struct amd_spi
+so that it can get from the latter to the former in amd_spi_fifo_xfer().
+
+It's simpler to just pass the pointer from the sole caller
+amd_spi_master_transfer() and drop the pointer from struct amd_spi.
+
+Signed-off-by: Lukas Wunner <lukas@wunner.de>
+Link: https://lore.kernel.org/r/a088b684ad292faf3bd036e51529e608e5c94638.1588590210.git.lukas@wunner.de
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spi-amd.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+index 489a95fff49e..f1b08db9d5b8 100755
+--- a/drivers/spi/spi-amd.c
++++ b/drivers/spi/spi-amd.c
+@@ -38,7 +38,6 @@ struct amd_spi {
+ void __iomem *io_remap_addr;
+ unsigned long io_base_addr;
+ u32 rom_addr;
+- struct spi_master *master;
+ u8 chip_select;
+ };
+
+@@ -164,9 +163,9 @@ static int amd_spi_master_setup(struct spi_device *spi)
+ }
+
+ static inline int amd_spi_fifo_xfer(struct amd_spi *amd_spi,
++ struct spi_master *master,
+ struct spi_message *message)
+ {
+- struct spi_master *master = amd_spi->master;
+ struct spi_transfer *xfer = NULL;
+ u8 cmd_opcode;
+ u8 *buf = NULL;
+@@ -241,7 +240,7 @@ static int amd_spi_master_transfer(struct spi_master *master,
+ * Extract spi_transfers from the spi message and
+ * program the controller.
+ */
+- amd_spi_fifo_xfer(amd_spi, msg);
++ amd_spi_fifo_xfer(amd_spi, master, msg);
+
+ return 0;
+ }
+@@ -262,7 +261,6 @@ static int amd_spi_probe(struct platform_device *pdev)
+ }
+
+ amd_spi = spi_master_get_devdata(master);
+- amd_spi->master = master;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ amd_spi->io_remap_addr = devm_ioremap_resource(&pdev->dev, res);
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0011-spi-spidev-Add-dummy-spidev-device-to-SPI-bus.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0011-spi-spidev-Add-dummy-spidev-device-to-SPI-bus.patch
new file mode 100644
index 00000000..c9e7a733
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0011-spi-spidev-Add-dummy-spidev-device-to-SPI-bus.patch
@@ -0,0 +1,100 @@
+From e7658110e2be857000c76fd33c6355138f0c86fe Mon Sep 17 00:00:00 2001
+From: Sanjay R Mehta <sanju.mehta@amd.com>
+Date: Tue, 3 Mar 2020 14:44:41 +0530
+Subject: [PATCH 11/21] spi: spidev: Add dummy spidev device to SPI bus
+
+Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spidev.c | 40 +++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 39 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
+index be503a0e6ef7..571533b3d65c 100644
+--- a/drivers/spi/spidev.c
++++ b/drivers/spi/spidev.c
+@@ -27,6 +27,8 @@
+
+ #include <linux/uaccess.h>
+
++#define SPI_BUS 0
++#define SPI_BUS_CS1 0
+
+ /*
+ * This supports access to SPI devices using normal userspace I/O calls.
+@@ -46,6 +48,7 @@
+
+ static DECLARE_BITMAP(minors, N_SPI_MINORS);
+
++struct spi_device *spi_device;
+
+ /* Bit masks for spi_device.mode management. Note that incorrect
+ * settings for some settings can cause *lots* of trouble for other
+@@ -737,7 +740,7 @@ static int spidev_probe(struct spi_device *spi)
+ of_device_is_compatible(spi->dev.of_node, "spidev"),
+ "%pOF: buggy DT: spidev listed directly in DT\n", spi->dev.of_node);
+
+- spidev_probe_acpi(spi);
++// spidev_probe_acpi(spi);
+
+ /* Allocate driver data */
+ spidev = kzalloc(sizeof(*spidev), GFP_KERNEL);
+@@ -823,6 +826,32 @@ static struct spi_driver spidev_spi_driver = {
+
+ /*-------------------------------------------------------------------------*/
+
++static int __init add_spi_device_to_bus(void)
++{
++ struct spi_master *spi_master;
++ struct spi_board_info spi_info;
++
++ spi_master = spi_busnum_to_master(SPI_BUS);
++ if (!spi_master) {
++ printk(KERN_ALERT "Please make sure to \'modprobe "
++ "spi_amd\' driver first\n");
++ return -1;
++ }
++ memset(&spi_info, 0, sizeof(struct spi_board_info));
++
++ strlcpy(spi_info.modalias, "spidev", SPI_NAME_SIZE);
++ spi_info.bus_num = SPI_BUS; //Bus number of SPI master
++ spi_info.chip_select = SPI_BUS_CS1; //CS on which SPI device is connected
++
++ spi_device = spi_new_device(spi_master, &spi_info);
++ if (!spi_device)
++ return -ENODEV;
++
++ return 0;
++}
++
++
++
+ static int __init spidev_init(void)
+ {
+ int status;
+@@ -847,6 +876,14 @@ static int __init spidev_init(void)
+ class_destroy(spidev_class);
+ unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
+ }
++
++ status = add_spi_device_to_bus();
++ if (status < 0) {
++ spi_unregister_driver(&spidev_spi_driver);
++ class_destroy(spidev_class);
++ unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
++ }
++
+ return status;
+ }
+ module_init(spidev_init);
+@@ -854,6 +891,7 @@ module_init(spidev_init);
+ static void __exit spidev_exit(void)
+ {
+ spi_unregister_driver(&spidev_spi_driver);
++ spi_unregister_device(spi_device);
+ class_destroy(spidev_class);
+ unregister_chrdev(SPIDEV_MAJOR, spidev_spi_driver.driver.name);
+ }
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0012-spi-spi-amd-Fix-a-NULL-vs-IS_ERR-check-in-amd_spi_pr.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0012-spi-spi-amd-Fix-a-NULL-vs-IS_ERR-check-in-amd_spi_pr.patch
new file mode 100644
index 00000000..4aedddc5
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0012-spi-spi-amd-Fix-a-NULL-vs-IS_ERR-check-in-amd_spi_pr.patch
@@ -0,0 +1,39 @@
+From 4eb734b0a4ab01dbc903941efc830ae33001c9a0 Mon Sep 17 00:00:00 2001
+From: Wei Yongjun <weiyongjun1@huawei.com>
+Date: Wed, 29 Apr 2020 02:54:26 +0000
+Subject: [PATCH 12/21] spi: spi-amd: Fix a NULL vs IS_ERR() check in
+ amd_spi_probe()
+
+In case of error, the function devm_ioremap_resource() returns ERR_PTR()
+and never returns NULL. The NULL test in the return value check should
+be replaced with IS_ERR().
+
+Fixes: bbb336f39efc ("spi: spi-amd: Add AMD SPI controller driver support")
+Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
+Link: https://lore.kernel.org/r/20200429025426.167664-1-weiyongjun1@huawei.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/spi/spi-amd.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/spi/spi-amd.c b/drivers/spi/spi-amd.c
+index f1b08db9d5b8..d0aacd4de1b9 100755
+--- a/drivers/spi/spi-amd.c
++++ b/drivers/spi/spi-amd.c
+@@ -264,10 +264,9 @@ static int amd_spi_probe(struct platform_device *pdev)
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ amd_spi->io_remap_addr = devm_ioremap_resource(&pdev->dev, res);
+-
+- if (!amd_spi->io_remap_addr) {
++ if (IS_ERR(amd_spi->io_remap_addr)) {
++ err = PTR_ERR(amd_spi->io_remap_addr);
+ dev_err(dev, "error %d ioremap of SPI registers failed\n", err);
+- err = -ENOMEM;
+ goto err_free_master;
+ }
+ dev_dbg(dev, "io_remap_address: %p\n", amd_spi->io_remap_addr);
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0013-amd-xgbe-Fix-for-Network-fluctuations.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0013-amd-xgbe-Fix-for-Network-fluctuations.patch
new file mode 100644
index 00000000..714d9f43
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0013-amd-xgbe-Fix-for-Network-fluctuations.patch
@@ -0,0 +1,39 @@
+From 4f83ed07a25427cafd91d3722c08dc7f1f6d185f Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Tue, 12 Jan 2021 15:11:03 +0530
+Subject: [PATCH 13/21] amd-xgbe: Fix for Network fluctuations
+
+BEL SFP, when connected to amd-xgbe shows frequent link down and up events on dmesg.
+Refer ticket EMBDEV-8951. This fix avoids the frquent link up/down issue.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+index fcb3a06fc70f..59554673c142 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+@@ -1045,6 +1045,18 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
+ }
+ phy_data->phydev = phydev;
+
++ switch (phy_data->port_mode) {
++ case XGBE_PORT_MODE_SFP:
++ /* reset the sfp phy EMBDEV-8951 */
++ if(phydev)
++ genphy_soft_reset(phydev);
++ else
++ netdev_err(pdata->netdev, "phy reset failed\n");
++ break;
++ default:
++ break;
++ }
++
+ xgbe_phy_external_phy_quirks(pdata);
+
+ linkmode_and(phydev->advertising, phydev->advertising,
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0014-amd-xgbe-Reset-the-PHY-rx-data-path-when-mailbox-com.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0014-amd-xgbe-Reset-the-PHY-rx-data-path-when-mailbox-com.patch
new file mode 100644
index 00000000..ea4ff263
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0014-amd-xgbe-Reset-the-PHY-rx-data-path-when-mailbox-com.patch
@@ -0,0 +1,84 @@
+From d3b72967f59f01071b6d7d0ff5cf15704f38b441 Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Fri, 4 Dec 2020 13:59:10 +0530
+Subject: [PATCH 14/21] amd-xgbe: Reset the PHY rx data path when mailbox
+ command timeout
+
+Sometimes mailbox command timeout when the RX data path becomes
+unresponsive. This prevents the submission of new mailbox commands.
+This fix identify the timeout and reset the RX data path
+so that next message can be submitted properly.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-common.h | 8 +++++++
+ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 24 +++++++++++++++++----
+ 2 files changed, 28 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h
+index b40d4377cc71..9d536cef0498 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h
+@@ -1319,6 +1319,14 @@
+ #define MDIO_VEND2_AN_STAT 0x8002
+ #endif
+
++#ifndef MDIO_MMD_DIGITAL_STAT
++#define MDIO_MMD_DIGITAL_STAT 0x8010
++#endif
++
++#ifndef MDIO_PMA_RX_CTRL1
++#define MDIO_PMA_RX_CTRL1 0x8051
++#endif
++
+ #ifndef MDIO_VEND2_PMA_CDR_CONTROL
+ #define MDIO_VEND2_PMA_CDR_CONTROL 0x8056
+ #endif
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+index 59554673c142..e7e3eabd0e5d 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+@@ -1967,11 +1967,15 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata,
+ {
+ unsigned int s0 = 0;
+ unsigned int wait;
++ unsigned int i;
++ int reg;
+
+ /* Log if a previous command did not complete */
+- if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS))
+- netif_dbg(pdata, link, pdata->netdev,
++ if (XP_IOREAD_BITS(pdata, XP_DRIVER_INT_RO, STATUS)) {
++ netif_err(pdata, link, pdata->netdev,
+ "firmware mailbox not ready for command\n");
++ goto rx_reset;
++ }
+
+ /* Construct the command */
+ XP_SET_BITS(s0, XP_DRIVER_SCRATCH_0, COMMAND, cmd);
+@@ -1991,8 +1995,20 @@ static void xgbe_phy_perform_ratechange(struct xgbe_prv_data *pdata,
+ usleep_range(1000, 2000);
+ }
+
+- netif_dbg(pdata, link, pdata->netdev,
+- "firmware mailbox command did not complete\n");
++rx_reset:
++ reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_MMD_DIGITAL_STAT);
++ if (reg & 0x10) {
++ /* mailbox command timed out, reset Rx block */
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_CTRL1,
++ BIT(4) /* mask */, BIT(4)/* value*/);
++
++ for (i = 0; i < 100; i++)
++ usleep_range(1000, 2000);
++
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_CTRL1,
++ BIT(4) /* mask */, 0/* value*/);
++ netif_err(pdata, link, pdata->netdev, " rxX_reset done!\n");
++ }
+ }
+
+ static void xgbe_phy_rrc(struct xgbe_prv_data *pdata)
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0015-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0015-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch
new file mode 100644
index 00000000..f8820035
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0015-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch
@@ -0,0 +1,67 @@
+From be0ee5cdadf2fbf57cd68b18050b541f28a89c68 Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Tue, 12 Jan 2021 22:06:07 +0530
+Subject: [PATCH 15/21] amd-xgbe: Fix NETDEV WATCHDOG transmit queue timed out
+ crash
+
+netif_carrier_off() called immediately after netif_tx_stop_all_queues()
+to avoid the kernel crash trace
+
+ ------------[ cut here ]------------
+ NETDEV WATCHDOG: enp3s0f2 (amd-xgbe): transmit queue 0 timed out
+ WARNING: CPU: 3 PID: 0 at net/sched/sch_generic.c:461 dev_watchdog+0x20d/0x220
+ Modules linked in: amd_xgbe(E) amd-xgbe 0000:03:00.2 enp3s0f2: Link is Down
+ CPU: 3 PID: 0 Comm: swapper/3 Tainted: G E
+ Hardware name: AMD Bilby-RV2/Bilby-RV2, BIOS RBB1202A 10/18/2019
+ RIP: 0010:dev_watchdog+0x20d/0x220
+ Code: 00 49 63 4e e0 eb 92 4c 89 e7 c6 05 c6 e2 c1 00 01 e8 e7 ce fc ff 89 d9 48
+ RSP: 0018:ffff90cfc28c3e88 EFLAGS: 00010286
+ RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000006
+ RDX: 0000000000000007 RSI: 0000000000000086 RDI: ffff90cfc28d63c0
+ RBP: ffff90cfb977845c R08: 0000000000000050 R09: 0000000000196018
+ R10: ffff90cfc28c3ef8 R11: 0000000000000000 R12: ffff90cfb9778000
+ R13: 0000000000000003 R14: ffff90cfb9778480 R15: 0000000000000010
+ FS: 0000000000000000(0000) GS:ffff90cfc28c0000(0000) knlGS:0000000000000000
+ CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+ CR2: 00007f240ff2d9d0 CR3: 00000001e3e0a000 CR4: 00000000003406e0
+ Call Trace:
+ <IRQ>
+ ? pfifo_fast_reset+0x100/0x100
+ call_timer_fn+0x2b/0x130
+ run_timer_softirq+0x3e8/0x440
+ ? enqueue_hrtimer+0x39/0x90
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-drv.c | 2 ++
+ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 1 -
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+index 1ad361644245..b498c4bb9261 100755
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
+@@ -1255,6 +1255,8 @@ int xgbe_powerdown(struct net_device *netdev, unsigned int caller)
+ netif_device_detach(netdev);
+
+ netif_tx_stop_all_queues(netdev);
++ /* Bug fix to crash while resetting the port */
++ netif_carrier_off(pdata->netdev);
+
+ xgbe_stop_timers(pdata);
+ flush_workqueue(pdata->dev_workqueue);
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+index 8a3a60bb2688..4d5506d92897 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+@@ -1396,7 +1396,6 @@ static void xgbe_phy_stop(struct xgbe_prv_data *pdata)
+ pdata->phy_if.phy_impl.stop(pdata);
+
+ pdata->phy.link = 0;
+- netif_carrier_off(pdata->netdev);
+
+ xgbe_phy_adjust_link(pdata);
+ }
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0016-amd-xgbe-sets-XGBE_LINK_INIT-when-there-is-a-link-fa.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0016-amd-xgbe-sets-XGBE_LINK_INIT-when-there-is-a-link-fa.patch
new file mode 100644
index 00000000..b674ec86
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0016-amd-xgbe-sets-XGBE_LINK_INIT-when-there-is-a-link-fa.patch
@@ -0,0 +1,39 @@
+From 8d9dec6286b439c393b562b2e812369640eea93e Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Fri, 23 Oct 2020 01:45:15 +0530
+Subject: [PATCH 16/21] amd-xgbe sets XGBE_LINK_INIT when there is a link
+ failure
+
+When "link down" happens due to a link partner, the xgbe driver
+will not set XGBE_LINK_INIT. This is observed when the port speed
+capability is set to 10G in backplane mode.
+
+This fix sets XGBE_LINK_INIT when there is a link failure and
+XGBE_LINK_INIT is not set. This helps the driver to restart AN
+when AN link timeout happens.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+index 4d5506d92897..ce33ff9b4b6d 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+@@ -1371,6 +1371,12 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata)
+ xgbe_phy_status_result(pdata);
+
+ netif_carrier_off(pdata->netdev);
++
++ if (link_aneg && ((pdata->phy_if.phy_impl.cur_mode(pdata) == XGBE_MODE_KR) ||
++ (pdata->phy_if.phy_impl.cur_mode(pdata) == XGBE_MODE_KX_1000))) {
++ if (!test_bit(XGBE_LINK_INIT, &pdata->dev_state))
++ set_bit(XGBE_LINK_INIT, &pdata->dev_state);
++ }
+ }
+
+ adjust_link:
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0017-amd-xgbe-improved-KR-training-sequence.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0017-amd-xgbe-improved-KR-training-sequence.patch
new file mode 100644
index 00000000..8e551c83
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0017-amd-xgbe-improved-KR-training-sequence.patch
@@ -0,0 +1,282 @@
+From 91c7874f43cd3289bd97bc0b1e8ffe8f5973b18b Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Sat, 9 Jan 2021 12:26:09 +0530
+Subject: [PATCH 17/21] amd-xgbe: improved KR training sequence
+
+amd-xgbe driver handles KR training sequence directly by
+programming the h/w IP registers. This causes KR training
+failure if the h/w blocks are not operated correctly or they are
+not in sync. The new sequence increase the stability of AN process
+in KR mode by making sure that the h/w blocks are in expected
+state when the AN is in progress.
+
+This patch fix the problem of long linkup time due to repeated KR failure
+observed in AMD platforms.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-common.h | 8 +++
+ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 44 ++++++++++++++--
+ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 56 ++++++++++++++-------
+ drivers/net/ethernet/amd/xgbe/xgbe.h | 5 ++
+ 4 files changed, 92 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-common.h b/drivers/net/ethernet/amd/xgbe/xgbe-common.h
+index 9d536cef0498..6a5aa7e4c3ee 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-common.h
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-common.h
+@@ -1319,10 +1319,18 @@
+ #define MDIO_VEND2_AN_STAT 0x8002
+ #endif
+
++#ifndef MDIO_PMA_RX_EQ_CTRL
++#define MDIO_PMA_RX_EQ_CTRL 0x8009
++#endif
++
+ #ifndef MDIO_MMD_DIGITAL_STAT
+ #define MDIO_MMD_DIGITAL_STAT 0x8010
+ #endif
+
++#ifndef MDIO_PMA_RX_CTRL0
++#define MDIO_PMA_RX_CTRL0 0x8050
++#endif
++
+ #ifndef MDIO_PMA_RX_CTRL1
+ #define MDIO_PMA_RX_CTRL1 0x8051
+ #endif
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+index ce33ff9b4b6d..7b17b9d0c40a 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+@@ -402,6 +402,16 @@ static void xgbe_an73_set(struct xgbe_prv_data *pdata, bool enable,
+ reg |= MDIO_AN_CTRL1_RESTART;
+
+ XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_CTRL1, reg);
++
++ if (xgbe_in_kr_mode(pdata) && (enable || restart)) {
++ reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
++ reg |= XGBE_KR_TRAINING_ENABLE;
++ reg |= XGBE_KR_TRAINING_START;
++ XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
++
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_EQ_CTRL,
++ BIT(15), BIT(15)); /* Disable RX Adapter */
++ }
+ }
+
+ static void xgbe_an73_restart(struct xgbe_prv_data *pdata)
+@@ -409,7 +419,7 @@ static void xgbe_an73_restart(struct xgbe_prv_data *pdata)
+ xgbe_an73_enable_interrupts(pdata);
+ xgbe_an73_set(pdata, true, true);
+
+- netif_dbg(pdata, link, pdata->netdev, "CL73 AN enabled/restarted\n");
++ netif_dbg(pdata, link, pdata->netdev, "CL73 AN enabled/restarted, CL72 started\n");
+ }
+
+ static void xgbe_an73_disable(struct xgbe_prv_data *pdata)
+@@ -489,20 +499,40 @@ static enum xgbe_an xgbe_an73_tx_training(struct xgbe_prv_data *pdata,
+ XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_FECCTRL, reg);
+
+ /* Start KR training */
++ if (!pdata->phy_if.phy_impl.kr_training_cdroff(pdata))
++ netif_dbg(pdata, link, pdata->netdev, "setting phy_data->phy_cdr_notrack\n");
++
++ pdata->cdr_delay_required = 1;
++
+ if (pdata->phy_if.phy_impl.kr_training_pre)
+ pdata->phy_if.phy_impl.kr_training_pre(pdata);
+
+ reg = XMDIO_READ(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL);
+- reg |= XGBE_KR_TRAINING_ENABLE;
+ reg |= XGBE_KR_TRAINING_START;
+ XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
+
++ pdata->kr_done = 1;
++
+ netif_dbg(pdata, link, pdata->netdev,
+ "KR training initiated\n");
+
++ /* set RX_EQ_MGMT_MODE to disable RX Adapt Requests */
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_EQ_CTRL, BIT(15), BIT(15));
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_CDR_CONTROL,
++ XGBE_PMA_CDR_TRACK_EN_MASK,
++ XGBE_PMA_CDR_TRACK_EN_OFF);
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_CTRL0, BIT(8), 0);
+ if (pdata->phy_if.phy_impl.kr_training_post)
+ pdata->phy_if.phy_impl.kr_training_post(pdata);
+
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_CTRL0, BIT(8), BIT(8));
++ pdata->cdr_delay_required = 0;
++ udelay(1);
++ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_RX_EQ_CTRL,
++ BIT(15), 0);
++ if (pdata->phy_if.phy_impl.update_cdr_delay)
++ pdata->phy_if.phy_impl.update_cdr_delay(pdata);
++
+ return XGBE_AN_PAGE_RECEIVED;
+ }
+
+@@ -897,8 +927,6 @@ static void xgbe_an73_state_machine(struct xgbe_prv_data *pdata)
+ pdata->kx_state = XGBE_RX_BPA;
+ pdata->an_start = 0;
+
+- if (pdata->phy_if.phy_impl.an_post)
+- pdata->phy_if.phy_impl.an_post(pdata);
+
+ netif_dbg(pdata, link, pdata->netdev, "CL73 AN result: %s\n",
+ xgbe_state_as_string(pdata->an_result));
+@@ -1243,6 +1271,9 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode)
+ /* Re-enable auto-negotiation interrupt */
+ enable_irq(pdata->an_irq);
+
++ if (pdata->phy_if.phy_impl.an_post)
++ pdata->phy_if.phy_impl.an_post(pdata);
++
+ xgbe_an_init(pdata);
+ xgbe_an_restart(pdata);
+
+@@ -1360,6 +1391,10 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata)
+ clear_bit(XGBE_LINK_INIT, &pdata->dev_state);
+
+ netif_carrier_on(pdata->netdev);
++
++ if (link_aneg && pdata->kr_done)
++ pdata->phy_if.phy_impl.reset_cdr_delay(pdata);
++
+ } else {
+ if (test_bit(XGBE_LINK_INIT, &pdata->dev_state)) {
+ xgbe_check_link_timeout(pdata);
+@@ -1455,6 +1490,7 @@ static int xgbe_phy_start(struct xgbe_prv_data *pdata)
+
+ /* Indicate the PHY is up and running */
+ pdata->phy_started = 1;
++ pdata->an_result = XGBE_AN_NO_LINK;
+
+ xgbe_an_init(pdata);
+ xgbe_an_enable_interrupts(pdata);
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+index e7e3eabd0e5d..a02a906cff4d 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+@@ -2917,13 +2917,16 @@ static void xgbe_phy_cdr_track(struct xgbe_prv_data *pdata)
+ if (!phy_data->phy_cdr_notrack)
+ return;
+
+- usleep_range(phy_data->phy_cdr_delay,
+- phy_data->phy_cdr_delay + 500);
++ /* when there is no link, no need to use the cdr delay, when ever a page is */
++ /* received , pdata->cdr_delay_required is set to 1 */
++ if (pdata->cdr_delay_required) {
++ usleep_range(phy_data->phy_cdr_delay,
++ phy_data->phy_cdr_delay + 500);
++ }
+
+ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_CDR_CONTROL,
+ XGBE_PMA_CDR_TRACK_EN_MASK,
+ XGBE_PMA_CDR_TRACK_EN_ON);
+-
+ phy_data->phy_cdr_notrack = 0;
+ }
+
+@@ -2940,9 +2943,7 @@ static void xgbe_phy_cdr_notrack(struct xgbe_prv_data *pdata)
+ XMDIO_WRITE_BITS(pdata, MDIO_MMD_PMAPMD, MDIO_VEND2_PMA_CDR_CONTROL,
+ XGBE_PMA_CDR_TRACK_EN_MASK,
+ XGBE_PMA_CDR_TRACK_EN_OFF);
+-
+ xgbe_phy_rrc(pdata);
+-
+ phy_data->phy_cdr_notrack = 1;
+ }
+
+@@ -2952,6 +2953,36 @@ static void xgbe_phy_kr_training_post(struct xgbe_prv_data *pdata)
+ xgbe_phy_cdr_track(pdata);
+ }
+
++static void xgbe_phy_reset_cdr_delay(struct xgbe_prv_data *pdata)
++{
++ struct xgbe_phy_data *phy_data = pdata->phy_data;
++
++ phy_data->phy_cdr_delay = XGBE_CDR_DELAY_INIT;
++ pdata->kr_done = 0;
++}
++
++static void xgbe_phy_update_cdr_delay(struct xgbe_prv_data *pdata)
++{
++ struct xgbe_phy_data *phy_data = pdata->phy_data;
++
++ if (phy_data->phy_cdr_delay < XGBE_CDR_DELAY_MAX)
++ phy_data->phy_cdr_delay += XGBE_CDR_DELAY_INC;
++ else
++ phy_data->phy_cdr_delay = XGBE_CDR_DELAY_INIT;
++}
++
++static int xgbe_phy_kr_training_cdroff(struct xgbe_prv_data *pdata)
++{
++ int ret;
++ struct xgbe_phy_data *phy_data = pdata->phy_data;
++
++ ret = phy_data->phy_cdr_notrack;
++ if (!phy_data->phy_cdr_notrack)
++ phy_data->phy_cdr_notrack = 1;
++
++ return ret;
++}
++
+ static void xgbe_phy_kr_training_pre(struct xgbe_prv_data *pdata)
+ {
+ if (pdata->debugfs_an_cdr_track_early)
+@@ -2969,18 +3000,6 @@ static void xgbe_phy_an_post(struct xgbe_prv_data *pdata)
+ break;
+
+ xgbe_phy_cdr_track(pdata);
+-
+- switch (pdata->an_result) {
+- case XGBE_AN_READY:
+- case XGBE_AN_COMPLETE:
+- break;
+- default:
+- if (phy_data->phy_cdr_delay < XGBE_CDR_DELAY_MAX)
+- phy_data->phy_cdr_delay += XGBE_CDR_DELAY_INC;
+- else
+- phy_data->phy_cdr_delay = XGBE_CDR_DELAY_INIT;
+- break;
+- }
+ break;
+ default:
+ break;
+@@ -3417,6 +3436,9 @@ void xgbe_init_function_ptrs_phy_v2(struct xgbe_phy_if *phy_if)
+
+ phy_impl->kr_training_pre = xgbe_phy_kr_training_pre;
+ phy_impl->kr_training_post = xgbe_phy_kr_training_post;
++ phy_impl->kr_training_cdroff = xgbe_phy_kr_training_cdroff;
++ phy_impl->reset_cdr_delay = xgbe_phy_reset_cdr_delay;
++ phy_impl->update_cdr_delay = xgbe_phy_update_cdr_delay;
+
+ phy_impl->module_info = xgbe_phy_module_info;
+ phy_impl->module_eeprom = xgbe_phy_module_eeprom;
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h
+index 47bcbcf58048..bb8bb6597743 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe.h
++++ b/drivers/net/ethernet/amd/xgbe/xgbe.h
+@@ -889,6 +889,9 @@ struct xgbe_phy_impl_if {
+ /* Pre/Post KR training enablement support */
+ void (*kr_training_pre)(struct xgbe_prv_data *);
+ void (*kr_training_post)(struct xgbe_prv_data *);
++ int (*kr_training_cdroff)(struct xgbe_prv_data *pdata);
++ void (*reset_cdr_delay)(struct xgbe_prv_data *pdata);
++ void (*update_cdr_delay)(struct xgbe_prv_data *pdata);
+
+ /* SFP module related info */
+ int (*module_info)(struct xgbe_prv_data *pdata,
+@@ -1267,6 +1270,8 @@ struct xgbe_prv_data {
+ unsigned int fec_ability;
+ unsigned long an_start;
+ enum xgbe_an_mode an_mode;
++ unsigned int kr_done;
++ unsigned int cdr_delay_required;
+
+ /* I2C support */
+ struct xgbe_i2c i2c;
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0018-amd-xgbe-rrc-is-required-only-for-Fixed-PHY-configur.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0018-amd-xgbe-rrc-is-required-only-for-Fixed-PHY-configur.patch
new file mode 100644
index 00000000..726fa33d
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0018-amd-xgbe-rrc-is-required-only-for-Fixed-PHY-configur.patch
@@ -0,0 +1,33 @@
+From 88d67055f583bd937cbd923e4f2def16490ae1be Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Tue, 10 Nov 2020 12:42:28 +0530
+Subject: [PATCH 18/21] amd-xgbe: rrc is required only for Fixed PHY
+ configuration
+
+xgbe driver does RRC in every 10 seconds if the link is down.
+When AN is enabled and KR training is in progress,
+doing RRC cause KR training failure. The patch enables RRC only
+if AN is disabled.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+index a02a906cff4d..28e2c5961747 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+@@ -2608,7 +2608,8 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
+ /* No link, attempt a receiver reset cycle */
+ if (phy_data->rrc_count++ > XGBE_RRC_FREQUENCY) {
+ phy_data->rrc_count = 0;
+- xgbe_phy_rrc(pdata);
++ if (pdata->phy.autoneg == AUTONEG_DISABLE)
++ xgbe_phy_rrc(pdata);
+ }
+
+ return 0;
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0019-amd-xgbe-increased-cdr-delay.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0019-amd-xgbe-increased-cdr-delay.patch
new file mode 100644
index 00000000..933bf4c8
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0019-amd-xgbe-increased-cdr-delay.patch
@@ -0,0 +1,35 @@
+From 405444ebad260912ba3cf22596ad73e1eb8c0207 Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Wed, 11 Nov 2020 12:13:33 +0530
+Subject: [PATCH 19/21] amd-xgbe: increased cdr delay
+
+amd-xgbe driver needs delay to emable CDR.
+Some link partner's use 20ms of idle time before sending valid clock.
+The patch uses a delay of 22ms for the first time and increases
+by a step of 22ms.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+index 28e2c5961747..ea00a6c4eba3 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+@@ -149,9 +149,9 @@
+ #define XGBE_RATECHANGE_COUNT 500
+
+ /* CDR delay values for KR support (in usec) */
+-#define XGBE_CDR_DELAY_INIT 10000
+-#define XGBE_CDR_DELAY_INC 10000
+-#define XGBE_CDR_DELAY_MAX 100000
++#define XGBE_CDR_DELAY_INIT 22000
++#define XGBE_CDR_DELAY_INC 22000
++#define XGBE_CDR_DELAY_MAX 110000
+
+ /* RRC frequency during link status check */
+ #define XGBE_RRC_FREQUENCY 10
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0020-amd-xgbe-synchronization-between-AN-state-machine-an.patch b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0020-amd-xgbe-synchronization-between-AN-state-machine-an.patch
new file mode 100644
index 00000000..fdd79105
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/0020-amd-xgbe-synchronization-between-AN-state-machine-an.patch
@@ -0,0 +1,123 @@
+From f2d1ad6e4092c6a176f69232970a033589e86373 Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Sat, 9 Jan 2021 23:41:36 +0530
+Subject: [PATCH 20/21] amd-xgbe: synchronization between AN state machine and
+ status polling timer thread
+
+xgbe driver uses a TIMEOUT to restart AN process if link is down.
+This create issue when TIMEOUT comes in between a KR training or RCC
+is in process. The patch avoids AN restart if TIMEOUT happens
+during KR cycle or RRC.
+
+TIMEOUT value also reduced to 1 sec to enable fast
+synchronization between LP.
+
+Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
+---
+ drivers/net/ethernet/amd/xgbe/xgbe-mdio.c | 29 +++++++++++++++++++--
+ drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c | 1 +
+ drivers/net/ethernet/amd/xgbe/xgbe.h | 4 ++-
+ 3 files changed, 31 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+index 7b17b9d0c40a..e4db9b9eb29b 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+@@ -512,6 +512,7 @@ static enum xgbe_an xgbe_an73_tx_training(struct xgbe_prv_data *pdata,
+ XMDIO_WRITE(pdata, MDIO_MMD_PMAPMD, MDIO_PMA_10GBR_PMD_CTRL, reg);
+
+ pdata->kr_done = 1;
++ pdata->kr_start_time = jiffies;
+
+ netif_dbg(pdata, link, pdata->netdev,
+ "KR training initiated\n");
+@@ -884,6 +885,8 @@ static void xgbe_an73_state_machine(struct xgbe_prv_data *pdata)
+ break;
+
+ case XGBE_AN_PAGE_RECEIVED:
++ if (xgbe_in_kr_mode(pdata))
++ pdata->an_int = 0;
+ pdata->an_state = xgbe_an73_page_received(pdata);
+ pdata->an_supported++;
+ break;
+@@ -1306,11 +1309,34 @@ static bool xgbe_phy_aneg_done(struct xgbe_prv_data *pdata)
+ static void xgbe_check_link_timeout(struct xgbe_prv_data *pdata)
+ {
+ unsigned long link_timeout;
++ int wait = 200;
++ unsigned long kr_time;
++ unsigned long rrc_time;
+
+ link_timeout = pdata->link_check + (XGBE_LINK_TIMEOUT * HZ);
+ if (time_after(jiffies, link_timeout)) {
+ netif_dbg(pdata, link, pdata->netdev, "AN link timeout\n");
+- xgbe_phy_config_aneg(pdata);
++ /* AN restart should not happen within 500ms of start of RRC or KR tarining */
++ /* This loop ensures no AN restart during RRC window and KR training window */
++ while (wait--) {
++ mutex_lock(&pdata->an_mutex);
++ kr_time = pdata->kr_start_time + msecs_to_jiffies(XGBE_AN_MS_TIMEOUT);
++ rrc_time = pdata->rrc_start_time + msecs_to_jiffies(XGBE_AN_MS_TIMEOUT);
++ mutex_unlock(&pdata->an_mutex);
++ if (time_after(jiffies, kr_time) && time_after(jiffies, rrc_time))
++ break;
++ if (pdata->an_result == XGBE_AN_COMPLETE)
++ break;
++
++ usleep_range(5000, 6000);
++ }
++ /* AN restart is required, if AN result is not COMPLETE */
++ if (pdata->an_result != XGBE_AN_COMPLETE)
++ xgbe_phy_config_aneg(pdata);
++ else if ((pdata->an_result == XGBE_AN_COMPLETE) &&
++ (xgbe_cur_mode(pdata) == XGBE_MODE_KX_1000))
++ xgbe_phy_config_aneg(pdata);
++
+ }
+ }
+
+@@ -1490,7 +1516,6 @@ static int xgbe_phy_start(struct xgbe_prv_data *pdata)
+
+ /* Indicate the PHY is up and running */
+ pdata->phy_started = 1;
+- pdata->an_result = XGBE_AN_NO_LINK;
+
+ xgbe_an_init(pdata);
+ xgbe_an_enable_interrupts(pdata);
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+index ea00a6c4eba3..8392d60eba9d 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
++++ b/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
+@@ -2945,6 +2945,7 @@ static void xgbe_phy_cdr_notrack(struct xgbe_prv_data *pdata)
+ XGBE_PMA_CDR_TRACK_EN_MASK,
+ XGBE_PMA_CDR_TRACK_EN_OFF);
+ xgbe_phy_rrc(pdata);
++ pdata->rrc_start_time = jiffies;
+ phy_data->phy_cdr_notrack = 1;
+ }
+
+diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h
+index bb8bb6597743..c20471a1ea18 100644
+--- a/drivers/net/ethernet/amd/xgbe/xgbe.h
++++ b/drivers/net/ethernet/amd/xgbe/xgbe.h
+@@ -289,7 +289,7 @@
+
+ /* Auto-negotiation */
+ #define XGBE_AN_MS_TIMEOUT 500
+-#define XGBE_LINK_TIMEOUT 5
++#define XGBE_LINK_TIMEOUT 1
+
+ #define XGBE_SGMII_AN_LINK_STATUS BIT(1)
+ #define XGBE_SGMII_AN_LINK_SPEED (BIT(2) | BIT(3))
+@@ -1271,6 +1271,8 @@ struct xgbe_prv_data {
+ unsigned long an_start;
+ enum xgbe_an_mode an_mode;
+ unsigned int kr_done;
++ unsigned long kr_start_time;
++ unsigned long rrc_start_time;
+ unsigned int cdr_delay_required;
+
+ /* I2C support */
+--
+2.17.1
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/afalg.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/afalg.cfg
new file mode 100644
index 00000000..3a101779
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/afalg.cfg
@@ -0,0 +1,41 @@
+#
+# General setup
+#
+CONFIG_AUDIT=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+CONFIG_AUDITSYSCALL=y
+
+CONFIG_INTEGRITY_AUDIT=y
+
+#
+# Crypto core or helper
+#
+
+CONFIG_CRYPTO_USER=m
+CONFIG_CRYPTO_CRYPTD=m
+
+# Authenticated Encryption with Associated Data
+#
+CONFIG_CRYPTO_ECHAINIV=m
+
+
+#
+# Ciphers
+#
+CONFIG_CRYPTO_DES3_EDE_X86_64=m
+
+#
+# Random Number Generation
+#
+CONFIG_CRYPTO_ANSI_CPRNG=m
+CONFIG_CRYPTO_DRBG_MENU=y
+CONFIG_CRYPTO_DRBG_HMAC=y
+CONFIG_CRYPTO_DRBG_HASH=y
+CONFIG_CRYPTO_DRBG_CTR=y
+CONFIG_CRYPTO_DRBG=y
+CONFIG_CRYPTO_JITTERENTROPY=y
+CONFIG_CRYPTO_USER_API=m
+CONFIG_CRYPTO_USER_API_HASH=m
+CONFIG_CRYPTO_USER_API_SKCIPHER=m
+CONFIG_CRYPTO_USER_API_RNG=m
+CONFIG_CRYPTO_USER_API_AEAD=m
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-ccp.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-ccp.cfg
new file mode 100644
index 00000000..cc9d9e10
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-ccp.cfg
@@ -0,0 +1,27 @@
+CONFIG_SERIAL_8250_DMA=y
+CONFIG_DMADEVICES=y
+# CONFIG_DMADEVICES_DEBUG is not set
+#
+# DMA Devices
+#
+CONFIG_DMA_ENGINE=y
+CONFIG_DMA_VIRTUAL_CHANNELS=y
+CONFIG_DMA_ACPI=y
+# CONFIG_INTEL_IDMA64 is not set
+# CONFIG_INTEL_IOATDMA is not set
+# CONFIG_QCOM_HIDMA_MGMT is not set
+# CONFIG_QCOM_HIDMA is not set
+CONFIG_DW_DMAC_CORE=y
+# CONFIG_DW_DMAC is not set
+# CONFIG_DW_DMAC_PCI is not set
+CONFIG_HSU_DMA=y
+#
+# DMA Clients
+#
+# CONFIG_ASYNC_TX_DMA is not set
+# CONFIG_DMATEST is not set
+CONFIG_CRYPTO_DEV_CCP=y
+CONFIG_CRYPTO_DEV_CCP_DD=y
+CONFIG_CRYPTO_DEV_CCP_CRYPTO=y
+CONFIG_CRYPTO_DEV_SP_CCP=y
+CONFIG_CRYPTO_DEV_SP_PSP=y
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-emmc-patches.scc b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-emmc-patches.scc
new file mode 100644
index 00000000..fbdb685d
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-emmc-patches.scc
@@ -0,0 +1 @@
+patch 0001-mmc-sdhci-acpi-fix-for-tuning-issue-in-E3000.patch
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-spi-patches.scc b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-spi-patches.scc
new file mode 100644
index 00000000..185231bc
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-spi-patches.scc
@@ -0,0 +1,9 @@
+patch 0001-spi-spi-amd-Add-AMD-SPI-controller-driver-support.patch
+patch 0004-spi-spi-amd-fix-warning.patch
+patch 0006-spi-amd-Fix-duplicate-iounmap-in-error-path.patch
+patch 0007-spi-amd-Pass-probe-errors-back-to-driver-core.patch
+patch 0008-spi-amd-Drop-duplicate-driver-data-assignments.patch
+patch 0009-spi-amd-Fix-refcount-underflow-on-remove.patch
+patch 0010-spi-amd-Drop-superfluous-member-from-struct-amd_spi.patch
+patch 0011-spi-spidev-Add-dummy-spidev-device-to-SPI-bus.patch
+patch 0012-spi-spi-amd-Fix-a-NULL-vs-IS_ERR-check-in-amd_spi_pr.patch
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-usb-patches.scc b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-usb-patches.scc
new file mode 100644
index 00000000..a058ba2a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-usb-patches.scc
@@ -0,0 +1 @@
+patch 0002-usb-xhci-Add-LPM-support-to-AMD-xhci-controller.patch
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe-patches.scc b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe-patches.scc
new file mode 100644
index 00000000..f218cb71
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe-patches.scc
@@ -0,0 +1,10 @@
+patch 0003-amd-xgbe-fix-for-the-crash-which-happens-during-SFP-.patch
+patch 0005-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch
+patch 0013-amd-xgbe-Fix-for-Network-fluctuations.patch
+patch 0014-amd-xgbe-Reset-the-PHY-rx-data-path-when-mailbox-com.patch
+patch 0015-amd-xgbe-Fix-NETDEV-WATCHDOG-transmit-queue-timed-ou.patch
+patch 0016-amd-xgbe-sets-XGBE_LINK_INIT-when-there-is-a-link-fa.patch
+patch 0017-amd-xgbe-improved-KR-training-sequence.patch
+patch 0018-amd-xgbe-rrc-is-required-only-for-Fixed-PHY-configur.patch
+patch 0019-amd-xgbe-increased-cdr-delay.patch
+patch 0020-amd-xgbe-synchronization-between-AN-state-machine-an.patch
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe.cfg
new file mode 100644
index 00000000..463ed1e8
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amd-xgbe.cfg
@@ -0,0 +1,51 @@
+CONFIG_MDIO=y
+CONFIG_AMD_XGBE=y
+CONFIG_AMD_XGBE_HAVE_ECC=y
+CONFIG_PHYLIB=y
+CONFIG_MDIO_GPIO=y
+
+CONFIG_USB_USBNET=y
+CONFIG_USB_NET_AX8817X=y
+CONFIG_USB_NET_AX88179_178A=y
+CONFIG_USB_NET_CDCETHER=y
+# CONFIG_USB_NET_CDC_EEM is not set
+CONFIG_USB_NET_CDC_NCM=y
+# CONFIG_USB_NET_HUAWEI_CDC_NCM is not set
+# CONFIG_USB_NET_CDC_MBIM is not set
+# CONFIG_USB_NET_DM9601 is not set
+# CONFIG_USB_NET_SR9700 is not set
+# CONFIG_USB_NET_SR9800 is not set
+# CONFIG_USB_NET_SMSC75XX is not set
+# CONFIG_USB_NET_SMSC95XX is not set
+# CONFIG_USB_NET_GL620A is not set
+CONFIG_USB_NET_NET1080=y
+# CONFIG_USB_NET_PLUSB is not set
+# CONFIG_USB_NET_MCS7830 is not set
+# CONFIG_USB_NET_RNDIS_HOST is not set
+CONFIG_USB_NET_CDC_SUBSET_ENABLE=y
+CONFIG_USB_NET_CDC_SUBSET=y
+# CONFIG_USB_ALI_M5632 is not set
+# CONFIG_USB_AN2720 is not set
+CONFIG_USB_BELKIN=y
+CONFIG_USB_ARMLINUX=y
+# CONFIG_USB_EPSON2888 is not set
+# CONFIG_USB_KC2190 is not set
+CONFIG_USB_NET_ZAURUS=y
+CONFIG_USB_NET_CX82310_ETH=y
+# CONFIG_USB_NET_KALMIA is not set
+# CONFIG_USB_NET_QMI_WWAN is not set
+# CONFIG_USB_HSO is not set
+# CONFIG_USB_NET_INT51X1 is not set
+# CONFIG_USB_IPHETH is not set
+# CONFIG_USB_SIERRA_NET is not set
+# CONFIG_USB_VL600 is not set
+# CONFIG_USB_NET_CH9200 is not set
+
+CONFIG_VFIO_PCI=y
+
+CONFIG_X86_X2APIC=y
+CONFIG_X86_NUMACHIP=y
+CONFIG_INET_TCP_DIAG=m
+CONFIG_INET_UDP_DIAG=m
+CONFIG_INET_DIAG=m
+CONFIG_NETLABEL=y
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-extra-config.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-extra-config.cfg
new file mode 100644
index 00000000..6f780afd
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-extra-config.cfg
@@ -0,0 +1,313 @@
+CONFIG_PERF_EVENTS_INTEL_UNCORE=y
+CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_PGTABLE_LEVELS=4
+CONFIG_CROSS_MEMORY_ATTACH=y
+CONFIG_USELIB=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+CONFIG_GENERIC_IRQ_LEGACY_ALLOC_HWIRQ=y
+CONFIG_GENERIC_MSI_IRQ=y
+CONFIG_CLOCKSOURCE_VALIDATE_LAST_CYCLE=y
+CONFIG_SRCU=y
+# CONFIG_TASKS_RCU is not set
+CONFIG_BUILD_BIN2C=y
+CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
+CONFIG_PAGE_COUNTER=y
+CONFIG_BPF=y
+CONFIG_MULTIUSER=y
+CONFIG_SGETMASK_SYSCALL=y
+CONFIG_SYSFS_SYSCALL=y
+# CONFIG_BPF_SYSCALL is not set
+CONFIG_ADVISE_SYSCALLS=y
+CONFIG_HAVE_DMA_CONTIGUOUS=y
+CONFIG_HAVE_ARCH_HUGE_VMAP=y
+CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
+CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
+# CONFIG_MODULE_COMPRESS is not set
+CONFIG_RWSEM_SPIN_ON_OWNER=y
+CONFIG_LOCK_SPIN_ON_OWNER=y
+CONFIG_X86_FEATURE_NAMES=y
+# CONFIG_X86_GOLDFISH is not set
+CONFIG_IOSF_MBI=m
+# CONFIG_IOSF_MBI_DEBUG is not set
+CONFIG_X86_VSYSCALL_EMULATION=y
+CONFIG_X86_DIRECT_GBPAGES=y
+CONFIG_MEMORY_BALLOON=y
+# CONFIG_ZSWAP is not set
+# CONFIG_ZPOOL is not set
+# CONFIG_ZBUD is not set
+CONFIG_GENERIC_EARLY_IOREMAP=y
+# CONFIG_X86_PMEM_LEGACY is not set
+# CONFIG_X86_INTEL_MPX is not set
+# CONFIG_EFI_MIXED is not set
+CONFIG_HAVE_LIVEPATCH=y
+# CONFIG_LIVEPATCH is not set
+CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
+CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
+CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
+CONFIG_ACPI_HOTPLUG_IOAPIC=y
+# CONFIG_ACPI_REDUCED_HARDWARE_ONLY is not set
+CONFIG_HAVE_ACPI_APEI=y
+CONFIG_HAVE_ACPI_APEI_NMI=y
+# CONFIG_PMIC_OPREGION is not set
+CONFIG_PMC_ATOM=y
+CONFIG_NET_UDP_TUNNEL=m
+# CONFIG_NET_FOU is not set
+# CONFIG_NET_FOU_IP_TUNNELS is not set
+# CONFIG_GENEVE is not set
+CONFIG_NET_PTP_CLASSIFY=y
+CONFIG_BRIDGE_NETFILTER=m
+CONFIG_NF_NAT_REDIRECT=m
+# CONFIG_NETFILTER_XT_NAT is not set
+# CONFIG_NF_LOG_ARP is not set
+# CONFIG_NF_LOG_IPV4 is not set
+CONFIG_NF_REJECT_IPV4=m
+CONFIG_NF_NAT_PPTP=m
+CONFIG_NF_NAT_H323=m
+# CONFIG_IP_NF_NAT is not set
+# CONFIG_NF_REJECT_IPV6 is not set
+# CONFIG_NF_LOG_IPV6 is not set
+CONFIG_TIPC_MEDIA_UDP=y
+# CONFIG_NET_ACT_VLAN is not set
+# CONFIG_NET_ACT_BPF is not set
+# CONFIG_NET_ACT_CONNMARK is not set
+# CONFIG_MPLS is not set
+# CONFIG_NET_SWITCHDEV is not set
+CONFIG_BT_BREDR=y
+CONFIG_BT_LE=y
+# CONFIG_BT_SELFTEST is not set
+CONFIG_BT_DEBUGFS=y
+CONFIG_BT_INTEL=m
+CONFIG_BT_BCM=m
+CONFIG_BT_HCIBTUSB_BCM=y
+# CONFIG_BT_HCIUART_INTEL is not set
+# CONFIG_BT_HCIUART_BCM is not set
+CONFIG_UEVENT_HELPER=y
+# CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
+CONFIG_ALLOW_DEV_COREDUMP=y
+# CONFIG_BLK_DEV_PMEM is not set
+# CONFIG_INTEL_MEI_TXE is not set
+# CONFIG_INTEL_MIC_BUS is not set
+# CONFIG_ECHO is not set
+# CONFIG_CXL_BASE is not set
+# CONFIG_SCSI_AM53C974 is not set
+# CONFIG_SCSI_WD719X is not set
+# CONFIG_DM_ERA is not set
+# CONFIG_DM_LOG_WRITES is not set
+# CONFIG_IPVLAN is not set
+# CONFIG_NET_VENDOR_AGERE is not set
+# CONFIG_ET131X is not set
+# CONFIG_ALTERA_TSE is not set
+# CONFIG_BCMGENET is not set
+# CONFIG_CX_ECAT is not set
+# CONFIG_FM10K is not set
+# CONFIG_NET_VENDOR_QUALCOMM is not set
+# CONFIG_NET_VENDOR_ROCKER is not set
+# CONFIG_NET_VENDOR_SAMSUNG is not set
+# CONFIG_SXGBE_ETH is not set
+# CONFIG_BCM7XXX_PHY is not set
+# CONFIG_MDIO_BCM_UNIMAC is not set
+CONFIG_USB_NET_DRIVERS=y
+# CONFIG_ATH9K_DYNACK is not set
+# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
+CONFIG_ATH9K_PCOEM=y
+CONFIG_BRCMFMAC_PROTO_BCDC=y
+# CONFIG_BRCMFMAC_PCIE is not set
+CONFIG_IWLWIFI_LEDS=y
+# CONFIG_RTL8723BE is not set
+# CONFIG_RTL8192EE is not set
+# CONFIG_RTL8821AE is not set
+# CONFIG_RSI_91X is not set
+# CONFIG_MOUSE_PS2_FOCALTECH is not set
+# CONFIG_MOUSE_ELAN_I2C is not set
+# CONFIG_TABLET_SERIAL_WACOM4 is not set
+# CONFIG_TOUCHSCREEN_GOODIX is not set
+# CONFIG_TOUCHSCREEN_ELAN is not set
+# CONFIG_TOUCHSCREEN_SX8654 is not set
+CONFIG_DEVMEM=y
+CONFIG_SERIAL_EARLYCON=y
+# CONFIG_SERIAL_8250_FINTEK is not set
+# CONFIG_SERIAL_SC16IS7XX is not set
+# CONFIG_IPMI_SSIF is not set
+# CONFIG_TCG_CRB is not set
+# CONFIG_TCG_TIS_ST33ZP24 is not set
+# CONFIG_XILLYBUS is not set
+CONFIG_ACPI_I2C_OPREGION=y
+# CONFIG_I2C_SLAVE is not set
+# CONFIG_SPI_CADENCE is not set
+# CONFIG_SPMI is not set
+# CONFIG_PINCTRL_BAYTRAIL is not set
+# CONFIG_PINCTRL_CHERRYVIEW is not set
+# CONFIG_PINCTRL_SUNRISEPOINT is not set
+CONFIG_GPIOLIB_IRQCHIP=y
+# CONFIG_GPIO_DWAPB is not set
+# CONFIG_GPIO_F7188X is not set
+# CONFIG_GPIO_ICH is not set
+# CONFIG_GPIO_LYNXPOINT is not set
+# CONFIG_GPIO_SCH311X is not set
+# CONFIG_GPIO_ADP5588 is not set
+# CONFIG_GPIO_BT8XX is not set
+# CONFIG_BATTERY_GAUGE_LTC2941 is not set
+# CONFIG_SENSORS_APPLESMC is not set
+# CONFIG_SENSORS_G760A is not set
+# CONFIG_SENSORS_G762 is not set
+# CONFIG_SENSORS_I5500 is not set
+# CONFIG_SENSORS_CORETEMP is not set
+# CONFIG_SENSORS_POWR1220 is not set
+# CONFIG_SENSORS_LTC2945 is not set
+# CONFIG_SENSORS_LTC4151 is not set
+# CONFIG_SENSORS_LTC4215 is not set
+# CONFIG_SENSORS_LTC4222 is not set
+# CONFIG_SENSORS_LTC4245 is not set
+# CONFIG_SENSORS_LTC4260 is not set
+# CONFIG_SENSORS_LTC4261 is not set
+# CONFIG_SENSORS_MAX1111 is not set
+# CONFIG_SENSORS_MAX16065 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_MAX1668 is not set
+# CONFIG_SENSORS_MAX197 is not set
+# CONFIG_SENSORS_MAX6639 is not set
+# CONFIG_SENSORS_MAX6642 is not set
+# CONFIG_SENSORS_MAX6650 is not set
+# CONFIG_SENSORS_MAX6697 is not set
+# CONFIG_SENSORS_MCP3021 is not set
+# CONFIG_SENSORS_ADCXX is not set
+# CONFIG_SENSORS_NTC_THERMISTOR is not set
+# CONFIG_SENSORS_NCT6683 is not set
+# CONFIG_SENSORS_NCT6775 is not set
+# CONFIG_SENSORS_NCT7802 is not set
+# CONFIG_SENSORS_NCT7904 is not set
+# CONFIG_SENSORS_SHTC1 is not set
+# CONFIG_SENSORS_SMM665 is not set
+# CONFIG_SENSORS_ADC128D818 is not set
+# CONFIG_SENSORS_TMP103 is not set
+# CONFIG_THERMAL_GOV_BANG_BANG is not set
+# CONFIG_INTEL_SOC_DTS_THERMAL is not set
+# CONFIG_INT340X_THERMAL is not set
+# CONFIG_XILINX_WATCHDOG is not set
+# CONFIG_CADENCE_WATCHDOG is not set
+CONFIG_BCMA_DRIVER_PCI=y
+# CONFIG_MFD_BCM590XX is not set
+# CONFIG_MFD_AXP20X is not set
+# CONFIG_MFD_DA9150 is not set
+# CONFIG_MFD_DLN2 is not set
+# CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set
+# CONFIG_INTEL_SOC_PMIC is not set
+# CONFIG_MFD_MAX77843 is not set
+# CONFIG_MFD_MT6397 is not set
+# CONFIG_MFD_MENF21BMC is not set
+# CONFIG_MFD_RT5033 is not set
+# CONFIG_MFD_RN5T618 is not set
+# CONFIG_MFD_SKY81452 is not set
+# CONFIG_MFD_TPS65218 is not set
+# CONFIG_MEDIA_SDR_SUPPORT is not set
+# CONFIG_USB_GSPCA_DTCS033 is not set
+# CONFIG_USB_GSPCA_TOUPTEK is not set
+# CONFIG_DRM_I2C_ADV7511 is not set
+# CONFIG_DRM_VGEM is not set
+# CONFIG_HSA_AMD is not set
+CONFIG_FB_CMDLINE=y
+CONFIG_HDMI=y
+CONFIG_DUMMY_CONSOLE_COLUMNS=80
+CONFIG_DUMMY_CONSOLE_ROWS=25
+# CONFIG_HID_BETOP_FF is not set
+# CONFIG_HID_CP2112 is not set
+# CONFIG_HID_GT683R is not set
+# CONFIG_HID_LENOVO is not set
+# CONFIG_HID_LOGITECH_HIDPP is not set
+# CONFIG_HID_PENMOUNT is not set
+# CONFIG_HID_PLANTRONICS is not set
+# CONFIG_HID_RMI is not set
+# CONFIG_USB_OTG_FSM is not set
+CONFIG_USB_XHCI_PCI=y
+# CONFIG_USB_MAX3421_HCD is not set
+# CONFIG_USB_UAS is not set
+# CONFIG_USBIP_CORE is not set
+# CONFIG_USB_ISP1760 is not set
+# CONFIG_USB_LINK_LAYER_TEST is not set
+# CONFIG_USB_CHAOSKEY is not set
+# CONFIG_USB_LED_TRIG is not set
+# CONFIG_MMC_USDHI6ROL0 is not set
+# CONFIG_MMC_TOSHIBA_PCI is not set
+# CONFIG_LEDS_CLASS_FLASH is not set
+# CONFIG_LEDS_LP8860 is not set
+# CONFIG_EDAC_IE31200 is not set
+# CONFIG_RTC_DRV_ABB5ZES3 is not set
+# CONFIG_RTC_DRV_ABX80X is not set
+# CONFIG_RTC_DRV_PCF85063 is not set
+# CONFIG_RTC_DRV_DS1343 is not set
+# CONFIG_RTC_DRV_DS1347 is not set
+# CONFIG_RTC_DRV_MCP795 is not set
+# CONFIG_RTC_DRV_DS1685_FAMILY is not set
+# CONFIG_RTC_DRV_DS2404 is not set
+# CONFIG_RTC_DRV_XGENE is not set
+# CONFIG_FB_SM750 is not set
+# CONFIG_GS_FPGABOOT is not set
+# CONFIG_UNISYSSPAR is not set
+# CONFIG_FB_TFT is not set
+# CONFIG_DELL_SMO8800 is not set
+# CONFIG_TOSHIBA_HAPS is not set
+# CONFIG_COMMON_CLK_PXA is not set
+# CONFIG_COMMON_CLK_CDCE706 is not set
+# CONFIG_ATMEL_PIT is not set
+# CONFIG_SH_TIMER_CMT is not set
+# CONFIG_SH_TIMER_MTU2 is not set
+# CONFIG_SH_TIMER_TMU is not set
+# CONFIG_EM_TIMER_STI is not set
+# CONFIG_SOC_TI is not set
+# CONFIG_PM_DEVFREQ_EVENT is not set
+# CONFIG_BCM_KONA_USB2_PHY is not set
+# CONFIG_MCB is not set
+CONFIG_RAS=y
+# CONFIG_THUNDERBOLT is not set
+# CONFIG_ANDROID is not set
+CONFIG_EFI_RUNTIME_WRAPPERS=y
+# CONFIG_F2FS_FS is not set
+# CONFIG_FS_DAX is not set
+# CONFIG_OVERLAY_FS is not set
+CONFIG_KERNFS=y
+CONFIG_EFIVAR_FS=m
+# CONFIG_SQUASHFS_LZ4 is not set
+# CONFIG_PSTORE_PMSG is not set
+# CONFIG_NFSD_PNFS is not set
+CONFIG_GRACE_PERIOD=y
+CONFIG_MESSAGE_LOGLEVEL_DEFAULT=4
+# CONFIG_DEBUG_INFO_SPLIT is not set
+# CONFIG_DEBUG_INFO_DWARF4 is not set
+# CONFIG_GDB_SCRIPTS is not set
+# CONFIG_PAGE_OWNER is not set
+# CONFIG_PAGE_EXTENSION is not set
+CONFIG_HAVE_ARCH_KASAN=y
+# CONFIG_KASAN is not set
+CONFIG_KASAN_SHADOW_OFFSET=0xdffffc0000000000
+# CONFIG_SCHED_STACK_END_CHECK is not set
+# CONFIG_DEBUG_TIMEKEEPING is not set
+# CONFIG_LOCK_TORTURE_TEST is not set
+# CONFIG_PROVE_RCU is not set
+# CONFIG_TORTURE_TEST is not set
+# CONFIG_TRACEPOINT_BENCHMARK is not set
+# CONFIG_TEST_HEXDUMP is not set
+# CONFIG_TEST_RHASHTABLE is not set
+# CONFIG_TEST_LKM is not set
+# CONFIG_TEST_BPF is not set
+# CONFIG_TEST_FIRMWARE is not set
+# CONFIG_TEST_UDELAY is not set
+# CONFIG_MEMTEST is not set
+CONFIG_INTEGRITY=y
+# CONFIG_INTEGRITY_SIGNATURE is not set
+# CONFIG_CRYPTO_GF128MUL is not set
+CONFIG_CRYPTO_GCM=m
+CONFIG_CRYPTO_GHASH=m
+# CONFIG_CRYPTO_DES3_EDE_X86_64 is not set
+# CONFIG_CRYPTO_DRBG_MENU is not set
+# CONFIG_CRYPTO_USER_API_RNG is not set
+# CONFIG_CRYPTO_DEV_QAT_DH895xCC is not set
+CONFIG_KVM_COMPAT=y
+# CONFIG_HAVE_ARCH_BITREVERSE is not set
+CONFIG_RATIONAL=y
+CONFIG_ARCH_HAS_FAST_MULTIPLIER=y
+# CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set
+CONFIG_HAS_IOPORT_MAP=y
+CONFIG_GLOB=y
+# CONFIG_GLOB_SELFTEST is not set
+# CONFIG_PINMUX is not set
+CONFIG_UIO=y
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-standard-only.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-standard-only.cfg
new file mode 100644
index 00000000..bfc1701d
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-standard-only.cfg
@@ -0,0 +1,3 @@
+CONFIG_TRANSPARENT_HUGEPAGE=y
+CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
+CONFIG_X86_POWERNOW_K8=y
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-config.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-config.cfg
new file mode 100644
index 00000000..896e633f
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-config.cfg
@@ -0,0 +1,402 @@
+CONFIG_X86_BIGSMP=y
+
+#
+# IRQ subsystem
+#
+CONFIG_GENERIC_IRQ_CHIP=y
+CONFIG_IRQ_DOMAIN=y
+
+CONFIG_CGROUP_PERF=y
+# CONFIG_CGROUP_DEBUG is not set
+CONFIG_CHECKPOINT_RESTORE=y
+CONFIG_SCHED_AUTOGROUP=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_MODVERSIONS=y
+CONFIG_MODULE_SRCVERSION_ALL=y
+CONFIG_BLK_DEV_BSGLIB=y
+CONFIG_BLK_DEV_INTEGRITY=y
+CONFIG_BLK_DEV_THROTTLING=y
+CONFIG_BLK_CMDLINE_PARSER=y
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+
+#
+# IO Schedulers
+#
+CONFIG_X86_AMD_PLATFORM_DEVICE=y
+CONFIG_PROCESSOR_SELECT=y
+CONFIG_CPU_SUP_AMD=y
+CONFIG_HPET_TIMER=y
+CONFIG_HPET_EMULATE_RTC=y
+CONFIG_GART_IOMMU=y
+CONFIG_CALGARY_IOMMU=y
+CONFIG_CALGARY_IOMMU_ENABLED_BY_DEFAULT=y
+CONFIG_SWIOTLB=y
+CONFIG_NR_CPUS=256
+CONFIG_X86_MCE=y
+CONFIG_X86_MCE_AMD=y
+CONFIG_X86_MCE_INJECT=m
+
+#
+# Performance monitoring
+#
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_AMD=y
+CONFIG_X86_MSR=m
+CONFIG_X86_CPUID=m
+CONFIG_NUMA=y
+CONFIG_AMD_NUMA=y
+CONFIG_X86_64_ACPI_NUMA=y
+CONFIG_NODES_SPAN_OTHER_NODES=y
+CONFIG_NODES_SHIFT=6
+CONFIG_ARCH_MEMORY_PROBE=y
+CONFIG_NEED_MULTIPLE_NODES=y
+CONFIG_MEMORY_ISOLATION=y
+CONFIG_HAVE_BOOTMEM_INFO_NODE=y
+CONFIG_MEMORY_HOTPLUG=y
+CONFIG_MEMORY_HOTPLUG_SPARSE=y
+CONFIG_MEMORY_HOTREMOVE=y
+CONFIG_ARCH_ENABLE_HUGEPAGE_MIGRATION=y
+CONFIG_BOUNCE=y
+CONFIG_MMU_NOTIFIER=y
+CONFIG_KSM=y
+CONFIG_MEMORY_FAILURE=y
+CONFIG_CLEANCACHE=y
+CONFIG_FRONTSWAP=y
+CONFIG_CMA=y
+CONFIG_KEXEC=y
+CONFIG_CRASH_DUMP=y
+CONFIG_PHYSICAL_ALIGN=0x1000000
+CONFIG_RANDOMIZE_MEMORY=y
+CONFIG_RANDOMIZE_MEMORY_PHYSICAL_PADDING=0xa
+CONFIG_COMPAT_VDSO=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
+CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
+CONFIG_USE_PERCPU_NUMA_NODE_ID=y
+
+#
+# Power management and ACPI options
+#
+CONFIG_ARCH_HIBERNATION_HEADER=y
+CONFIG_HIBERNATE_CALLBACKS=y
+CONFIG_HIBERNATION=y
+CONFIG_PM_STD_PARTITION=""
+CONFIG_PM_TRACE=y
+CONFIG_PM_TRACE_RTC=y
+CONFIG_ACPI_VIDEO=m
+CONFIG_ACPI_NUMA=y
+CONFIG_ACPI_SBS=m
+CONFIG_ACPI_HED=y
+CONFIG_ACPI_BGRT=y
+CONFIG_ACPI_APEI=y
+CONFIG_ACPI_APEI_PCIEAER=y
+CONFIG_ACPI_APEI_MEMORY_FAILURE=y
+CONFIG_ACPI_APEI_EINJ=m
+CONFIG_ACPI_APEI_ERST_DEBUG=m
+CONFIG_SFI=y
+
+#
+# CPU Frequency scaling
+#
+CONFIG_CPU_FREQ_GOV_POWERSAVE=y
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y
+
+#
+# CPU frequency scaling drivers
+#
+CONFIG_X86_PCC_CPUFREQ=y
+CONFIG_X86_ACPI_CPUFREQ=y
+CONFIG_X86_ACPI_CPUFREQ_CPB=y
+CONFIG_X86_POWERNOW_K8=y
+CONFIG_X86_AMD_FREQ_SENSITIVITY=m
+CONFIG_X86_SPEEDSTEP_CENTRINO=y
+CONFIG_X86_P4_CLOCKMOD=m
+
+#
+# shared options
+#
+CONFIG_X86_SPEEDSTEP_LIB=m
+
+
+#
+# Bus options (PCI etc.)
+#
+CONFIG_PCI_MMCONFIG=y
+CONFIG_PCI_REALLOC_ENABLE_AUTO=y
+CONFIG_PCI_STUB=m
+CONFIG_PCI_ATS=y
+CONFIG_PCI_IOV=y
+CONFIG_PCI_PRI=y
+CONFIG_PCI_PASID=y
+CONFIG_HOTPLUG_PCI_CPCI=y
+CONFIG_HOTPLUG_PCI_CPCI_GENERIC=m
+CONFIG_HOTPLUG_PCI_SHPC=m
+
+#
+# PCI host controller drivers
+#
+CONFIG_AMD_NB=y
+
+#
+# RapidIO Switch drivers
+#
+CONFIG_X86_SYSFB=y
+
+
+#
+# Queueing/Scheduling
+#
+CONFIG_NET_SCH_FQ=m
+#
+# Misc devices
+#
+CONFIG_ENCLOSURE_SERVICES=m
+
+#
+# EEPROM support
+#
+CONFIG_EEPROM_LEGACY=m
+
+
+#
+# Controllers with non-SFF native interface
+#
+CONFIG_SATA_AHCI_PLATFORM=m
+
+
+#
+# Distributed Switch Architecture drivers
+#
+CONFIG_E1000=y
+CONFIG_E1000E=y
+CONFIG_E1000E_HWTS=y
+CONFIG_IGB=y
+CONFIG_IGB_HWMON=y
+CONFIG_IGBVF=y
+CONFIG_IXGB=y
+CONFIG_IXGBE=y
+CONFIG_IXGBE_HWMON=y
+CONFIG_IXGBEVF=y
+
+#
+# MDIO bus device drivers
+#
+CONFIG_MDIO_GPIO=m
+
+#
+# MII PHY device drivers
+#
+CONFIG_AMD_PHY=m
+
+CONFIG_SERIAL_8250_NR_UARTS=48
+CONFIG_SERIAL_8250_RUNTIME_UARTS=32
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+CONFIG_SERIAL_8250_DETECT_IRQ=y
+CONFIG_SERIAL_8250_RSA=y
+CONFIG_SERIAL_8250_DW=y
+
+#
+# Non-8250 serial port support
+#
+CONFIG_IPMI_HANDLER=m
+CONFIG_HW_RANDOM_TPM=m
+CONFIG_NVRAM=m
+
+#
+# PCMCIA character devices
+#
+CONFIG_HANGCHECK_TIMER=m
+CONFIG_TCG_TPM=y
+
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_ALGOBIT=y
+CONFIG_I2C_PIIX4=m
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+CONFIG_I2C_CBUS_GPIO=m
+CONFIG_I2C_DESIGNWARE_CORE=y
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+CONFIG_I2C_DESIGNWARE_PCI=m
+CONFIG_I2C_DESIGNWARE_BAYTRAIL=y
+CONFIG_I2C_GPIO=m
+CONFIG_I2C_KEMPLD=m
+CONFIG_I2C_OCORES=m
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+#
+# SPI Protocol Masters
+#
+CONFIG_SPI_SPIDEV=m
+#
+# Pin controllers
+#
+CONFIG_PINCTRL_AMD=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_ACPI=y
+CONFIG_DEBUG_GPIO=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_GENERIC=y
+#
+# Memory mapped GPIO drivers
+#
+CONFIG_GPIO_GENERIC_PLATFORM=y
+
+#
+# PCI GPIO expanders
+#
+CONFIG_GPIO_ML_IOH=m
+
+#
+# Native drivers
+#
+CONFIG_SENSORS_K10TEMP=m
+CONFIG_SENSORS_FAM15H_POWER=m
+
+#
+# ACPI drivers
+#
+CONFIG_SENSORS_ACPI_POWER=m
+
+
+#
+# Graphics support
+#
+CONFIG_AGP_AMD64=y
+CONFIG_VGA_SWITCHEROO=y
+
+
+#
+# Frame buffer Devices
+#
+
+#
+# Frame buffer hardware drivers
+#
+
+#
+# Console display driver support
+#
+
+
+#
+# CODEC drivers
+#
+
+
+#
+# USB HID support
+#
+CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+
+CONFIG_USB_OHCI_HCD_PCI=y
+CONFIG_USB_OHCI_HCD_PLATFORM=y
+
+#
+# MMC/SD/SDIO Card Drivers
+#
+CONFIG_MMC_BLOCK=y
+CONFIG_MMC_BLOCK_MINORS=8
+
+#
+# MMC/SD/SDIO Host Controller Drivers
+#
+CONFIG_MMC_SPI=m
+
+CONFIG_EDAC_SUPPORT=y
+CONFIG_EDAC=y
+CONFIG_EDAC_LEGACY_SYSFS=y
+CONFIG_EDAC_DECODE_MCE=y
+CONFIG_EDAC_AMD64=y
+CONFIG_EDAC_AMD64_ERROR_INJECTION=y
+
+#
+# DMABUF options
+#
+CONFIG_AUXDISPLAY=y
+
+
+#
+# Clock Source drivers
+#
+CONFIG_IOMMU_API=y
+CONFIG_IOMMU_SUPPORT=y
+
+#
+# Generic IOMMU Pagetable Support
+#
+CONFIG_IOMMU_IOVA=y
+CONFIG_AMD_IOMMU=y
+CONFIG_AMD_IOMMU_V2=y
+CONFIG_DMAR_TABLE=y
+CONFIG_IRQ_REMAP=y
+
+#
+# Broadcom SoC drivers
+#
+CONFIG_PM_DEVFREQ=y
+
+#
+# DEVFREQ Governors
+#
+CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y
+CONFIG_DEVFREQ_GOV_PERFORMANCE=y
+CONFIG_DEVFREQ_GOV_POWERSAVE=y
+CONFIG_DEVFREQ_GOV_USERSPACE=y
+# CONFIG_DEVFREQ_GOV_PASSIVE is not set
+
+
+CONFIG_MEMORY=y
+
+#
+# Firmware Drivers
+#
+CONFIG_EDD=y
+CONFIG_EDD_OFF=y
+CONFIG_DMI_SYSFS=m
+
+#
+# EFI (Extensible Firmware Interface) Support
+#
+CONFIG_EFI_VARS=y
+CONFIG_EFI_VARS_PSTORE=m
+CONFIG_EFI_RUNTIME_MAP=y
+CONFIG_UEFI_CPER=y
+
+#
+# CD-ROM/DVD Filesystems
+#
+CONFIG_UDF_FS=m
+
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_VMCORE=y
+CONFIG_HUGETLBFS=y
+CONFIG_HUGETLB_PAGE=y
+CONFIG_PSTORE=y
+
+#
+# Compile-time checks and compiler options
+#
+CONFIG_DEBUG_KERNEL=y
+
+CONFIG_SECURITYFS=y
+CONFIG_GENERIC_ALLOCATOR=y
+CONFIG_INTERVAL_TREE=y
+
+#
+# Graphics support
+#
+
+#
+# Console display driver support
+#
+
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-features.scc b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-features.scc
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-features.scc
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-patches.scc b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-patches.scc
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86-user-patches.scc
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86.cfg
new file mode 100644
index 00000000..b321cee6
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/amdx86.cfg
@@ -0,0 +1,59 @@
+CONFIG_PRINTK=y
+
+# Basic hardware support for the box - network, USB, PCI, sound
+CONFIG_NETDEVICES=y
+CONFIG_ATA=y
+CONFIG_ATA_GENERIC=y
+CONFIG_ATA_SFF=y
+CONFIG_PCI=y
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PCI=y
+CONFIG_USB_SUPPORT=y
+CONFIG_USB=y
+CONFIG_PATA_SCH=y
+CONFIG_USB_EHCI_HCD=y
+CONFIG_PCIEPORTBUS=y
+CONFIG_NET=y
+CONFIG_USB_UHCI_HCD=y
+CONFIG_BLK_DEV_SD=y
+CONFIG_CHR_DEV_SG=y
+
+# Make sure these are on, otherwise the bootup won't be fun
+CONFIG_EXT3_FS=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+CONFIG_MODULES=y
+CONFIG_SHMEM=y
+CONFIG_TMPFS=y
+CONFIG_PACKET=y
+
+CONFIG_I2C=y
+CONFIG_AGP=y
+CONFIG_PM=y
+CONFIG_ACPI=y
+CONFIG_INPUT=y
+
+# Needed for booting (and using) USB memory sticks
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ISO8859_1=y
+
+CONFIG_RD_GZIP=y
+
+# Filesystems
+CONFIG_EXT2_FS_SECURITY=y
+CONFIG_NFSD=m
+CONFIG_NFSD_V3=y
+CONFIG_NFSD_V4=y
+CONFIG_QFMT_V2
+CONFIG_QUOTA=y
+CONFIG_QUOTA_NETLINK_INTERFACE=y
+CONFIG_QUOTA_TREE=m
+CONFIG_QUOTACTL=y
+CONFIG_SQUASHFS=y
+CONFIG_SQUASHFS_XATTR=y
+CONFIG_SQUASHFS_ZLIB=y
+CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
+CONFIG_TMPFS_POSIX_ACL=y
+CONFIG_TMPFS_XATTR=y
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/disable-graphics.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/disable-graphics.cfg
new file mode 100644
index 00000000..da9cb204
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/disable-graphics.cfg
@@ -0,0 +1,4 @@
+# CONFIG_FB is not set
+# CONFIG_DRM is not set
+# CONFIG_AGP is not set
+# CONFIG_VGA_SWITCHEROO is not set
diff --git a/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/kvm.cfg b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/kvm.cfg
new file mode 100644
index 00000000..f4ca1c77
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-5.4/linux-yocto-5.4.69-amdx86/kvm.cfg
@@ -0,0 +1,39 @@
+CONFIG_TASKSTATS=y
+CONFIG_TASK_DELAY_ACCT=y
+# CONFIG_TASK_XACCT is not set
+
+CONFIG_USER_RETURN_NOTIFIER=y
+CONFIG_PREEMPT_NOTIFIERS=y
+CONFIG_VFIO_IOMMU_TYPE1=y
+CONFIG_VFIO_VIRQFD=y
+CONFIG_VFIO=y
+# CONFIG_VFIO_NOIOMMU is not set
+CONFIG_VFIO_PCI=y
+# CONFIG_VFIO_PCI_VGA is not set
+CONFIG_VFIO_PCI_MMAP=y
+CONFIG_VFIO_PCI_INTX=y
+CONFIG_VFIO_PCI_IGD=y
+CONFIG_IRQ_BYPASS_MANAGER=y
+CONFIG_VIRT_DRIVERS=y
+CONFIG_SCHED_INFO=y
+CONFIG_VIRTIO_PCI_LEGACY=y
+CONFIG_VIRTIO_INPUT=y
+
+CONFIG_HAVE_KVM_IRQCHIP=y
+CONFIG_HAVE_KVM_IRQFD=y
+CONFIG_HAVE_KVM_IRQ_ROUTING=y
+CONFIG_HAVE_KVM_EVENTFD=y
+CONFIG_KVM_MMIO=y
+CONFIG_KVM_ASYNC_PF=y
+CONFIG_HAVE_KVM_MSI=y
+CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
+CONFIG_KVM_VFIO=y
+CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
+CONFIG_KVM_COMPAT=y
+CONFIG_HAVE_KVM_IRQ_BYPASS=y
+CONFIG_KVM=y
+# CONFIG_KVM_INTEL is not set
+CONFIG_KVM_AMD=y
+# CONFIG_KVM_MMU_AUDIT is not set
+
+CONFIG_KVM_AMD_SEV=y