amd-xgbe: Add XGBE_XPCS_ACCESS_V3 support to xgbe_pci_probe()

A new version of XPCS access routines have been introduced, add the
support to xgbe_pci_probe() to use these routines.

Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250509155325.720499-5-Raju.Rangoju@amd.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
Raju Rangoju
2025-05-09 21:23:24 +05:30
committed by Paolo Abeni
parent e49479f30e
commit ab95bc9aa7
3 changed files with 33 additions and 7 deletions

View File

@@ -791,6 +791,11 @@
#define PCS_V2_RV_WINDOW_SELECT 0x1064
#define PCS_V2_YC_WINDOW_DEF 0x18060
#define PCS_V2_YC_WINDOW_SELECT 0x18064
#define PCS_V3_RN_WINDOW_DEF 0xf8078
#define PCS_V3_RN_WINDOW_SELECT 0xf807c
#define PCS_RN_SMN_BASE_ADDR 0x11e00000
#define PCS_RN_PORT_ADDR_SIZE 0x100000
/* PCS register entry bit positions and sizes */
#define PCS_V2_WINDOW_DEF_OFFSET_INDEX 6

View File

@@ -9,6 +9,7 @@
#include <linux/device.h>
#include <linux/pci.h>
#include <linux/log2.h>
#include "xgbe-smn.h"
#include "xgbe.h"
#include "xgbe-common.h"
@@ -98,14 +99,14 @@ static int xgbe_config_irqs(struct xgbe_prv_data *pdata)
static int xgbe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
struct xgbe_prv_data *pdata;
struct device *dev = &pdev->dev;
void __iomem * const *iomap_table;
struct pci_dev *rdev;
unsigned int port_addr_size, reg;
struct device *dev = &pdev->dev;
struct xgbe_prv_data *pdata;
unsigned int ma_lo, ma_hi;
unsigned int reg;
int bar_mask;
int ret;
struct pci_dev *rdev;
int bar_mask, ret;
u32 address;
pdata = xgbe_alloc_pdata(dev);
if (IS_ERR(pdata)) {
@@ -181,6 +182,10 @@ static int xgbe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
/* Yellow Carp devices do not need rrc */
pdata->vdata->enable_rrc = 0;
break;
case XGBE_RN_PCI_DEVICE_ID:
pdata->xpcs_window_def_reg = PCS_V3_RN_WINDOW_DEF;
pdata->xpcs_window_sel_reg = PCS_V3_RN_WINDOW_SELECT;
break;
default:
pdata->xpcs_window_def_reg = PCS_V2_WINDOW_DEF;
pdata->xpcs_window_sel_reg = PCS_V2_WINDOW_SELECT;
@@ -193,7 +198,22 @@ static int xgbe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
pci_dev_put(rdev);
/* Configure the PCS indirect addressing support */
reg = XPCS32_IOREAD(pdata, pdata->xpcs_window_def_reg);
if (pdata->vdata->xpcs_access == XGBE_XPCS_ACCESS_V3) {
reg = XP_IOREAD(pdata, XP_PROP_0);
port_addr_size = PCS_RN_PORT_ADDR_SIZE *
XP_GET_BITS(reg, XP_PROP_0, PORT_ID);
pdata->smn_base = PCS_RN_SMN_BASE_ADDR + port_addr_size;
address = pdata->smn_base + (pdata->xpcs_window_def_reg);
ret = amd_smn_read(0, address, &reg);
if (ret) {
pci_err(pdata->pcidev, "Failed to read data\n");
goto err_pci_enable;
}
} else {
reg = XPCS32_IOREAD(pdata, pdata->xpcs_window_def_reg);
}
pdata->xpcs_window = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, OFFSET);
pdata->xpcs_window <<= 6;
pdata->xpcs_window_size = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, SIZE);

View File

@@ -241,6 +241,7 @@
/* XGBE PCI device id */
#define XGBE_RV_PCI_DEVICE_ID 0x15d0
#define XGBE_YC_PCI_DEVICE_ID 0x14b5
#define XGBE_RN_PCI_DEVICE_ID 0x1630
/* Generic low and high masks */
#define XGBE_GEN_HI_MASK GENMASK(31, 16)