Commit ab95bc9a authored by Raju Rangoju's avatar Raju Rangoju Committed by Paolo Abeni
Browse files

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: default avatarRaju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: default avatarSimon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250509155325.720499-5-Raju.Rangoju@amd.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent e49479f3
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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
+27 −7
Original line number Diff line number Diff line
@@ -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 */
	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);
+1 −0
Original line number Diff line number Diff line
@@ -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)