Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47f164de authored by Lendacky, Thomas's avatar Lendacky, Thomas Committed by David S. Miller
Browse files

amd-xgbe: Add PCI device support



Add support for new PCI devices to the driver.

Signed-off-by: default avatarTom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent aba9777a
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -173,8 +173,8 @@ config SUNLANCE

config AMD_XGBE
	tristate "AMD 10GbE Ethernet driver"
	depends on ((OF_NET && OF_ADDRESS) || ACPI) && HAS_IOMEM && HAS_DMA
	depends on ARM64 || COMPILE_TEST
	depends on ((OF_NET && OF_ADDRESS) || ACPI || PCI) && HAS_IOMEM && HAS_DMA
	depends on X86 || ARM64 || COMPILE_TEST
	select BITREVERSE
	select CRC32
	select PTP_1588_CLOCK
+2 −1
Original line number Diff line number Diff line
@@ -3,8 +3,9 @@ obj-$(CONFIG_AMD_XGBE) += amd-xgbe.o
amd-xgbe-objs := xgbe-main.o xgbe-drv.o xgbe-dev.o \
		 xgbe-desc.o xgbe-ethtool.o xgbe-mdio.o \
		 xgbe-ptp.o \
		 xgbe-phy-v1.o \
		 xgbe-phy-v1.o xgbe-phy-v2.o \
		 xgbe-platform.o

amd-xgbe-$(CONFIG_PCI) += xgbe-pci.o
amd-xgbe-$(CONFIG_AMD_XGBE_DCB) += xgbe-dcb.o
amd-xgbe-$(CONFIG_DEBUG_FS) += xgbe-debugfs.o
+99 −0
Original line number Diff line number Diff line
@@ -858,8 +858,15 @@

/* PCS register offsets */
#define PCS_V1_WINDOW_SELECT		0x03fc
#define PCS_V2_WINDOW_DEF		0x9060
#define PCS_V2_WINDOW_SELECT		0x9064

/* PCS register entry bit positions and sizes */
#define PCS_V2_WINDOW_DEF_OFFSET_INDEX	6
#define PCS_V2_WINDOW_DEF_OFFSET_WIDTH	14
#define PCS_V2_WINDOW_DEF_SIZE_INDEX	2
#define PCS_V2_WINDOW_DEF_SIZE_WIDTH	4

/* SerDes integration register offsets */
#define SIR0_KR_RT_1			0x002c
#define SIR0_STATUS			0x0040
@@ -902,6 +909,55 @@
#define RXTX_REG129_RXDFE_CONFIG_INDEX	14
#define RXTX_REG129_RXDFE_CONFIG_WIDTH	2

/* MAC Control register offsets */
#define XP_PROP_0			0x0000
#define XP_PROP_1			0x0004
#define XP_PROP_2			0x0008
#define XP_PROP_3			0x000c
#define XP_PROP_4			0x0010
#define XP_PROP_5			0x0014
#define XP_MAC_ADDR_LO			0x0020
#define XP_MAC_ADDR_HI			0x0024
#define XP_DRIVER_INT_REQ		0x0060
#define XP_DRIVER_INT_RO		0x0064
#define XP_DRIVER_SCRATCH_0		0x0068
#define XP_DRIVER_SCRATCH_1		0x006c
#define XP_INT_EN			0x0078

/* MAC Control register entry bit positions and sizes */
#define XP_DRIVER_INT_REQ_REQUEST_INDEX		0
#define XP_DRIVER_INT_REQ_REQUEST_WIDTH		1
#define XP_DRIVER_INT_RO_STATUS_INDEX		0
#define XP_DRIVER_INT_RO_STATUS_WIDTH		1
#define XP_DRIVER_SCRATCH_0_COMMAND_INDEX	0
#define XP_DRIVER_SCRATCH_0_COMMAND_WIDTH	8
#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_INDEX	8
#define XP_DRIVER_SCRATCH_0_SUB_COMMAND_WIDTH	8
#define XP_MAC_ADDR_HI_VALID_INDEX		31
#define XP_MAC_ADDR_HI_VALID_WIDTH		1
#define XP_PROP_0_CONN_TYPE_INDEX		28
#define XP_PROP_0_CONN_TYPE_WIDTH		3
#define XP_PROP_0_MDIO_ADDR_INDEX		16
#define XP_PROP_0_MDIO_ADDR_WIDTH		5
#define XP_PROP_0_PORT_ID_INDEX			0
#define XP_PROP_0_PORT_ID_WIDTH			8
#define XP_PROP_0_PORT_MODE_INDEX		8
#define XP_PROP_0_PORT_MODE_WIDTH		4
#define XP_PROP_0_PORT_SPEEDS_INDEX		23
#define XP_PROP_0_PORT_SPEEDS_WIDTH		4
#define XP_PROP_1_MAX_RX_DMA_INDEX		24
#define XP_PROP_1_MAX_RX_DMA_WIDTH		5
#define XP_PROP_1_MAX_RX_QUEUES_INDEX		8
#define XP_PROP_1_MAX_RX_QUEUES_WIDTH		5
#define XP_PROP_1_MAX_TX_DMA_INDEX		16
#define XP_PROP_1_MAX_TX_DMA_WIDTH		5
#define XP_PROP_1_MAX_TX_QUEUES_INDEX		0
#define XP_PROP_1_MAX_TX_QUEUES_WIDTH		5
#define XP_PROP_2_RX_FIFO_SIZE_INDEX		16
#define XP_PROP_2_RX_FIFO_SIZE_WIDTH		16
#define XP_PROP_2_TX_FIFO_SIZE_INDEX		0
#define XP_PROP_2_TX_FIFO_SIZE_WIDTH		16

/* Descriptor/Packet entry bit positions and sizes */
#define RX_PACKET_ERRORS_CRC_INDEX		2
#define RX_PACKET_ERRORS_CRC_WIDTH		1
@@ -1240,6 +1296,16 @@ do { \
/* Macros for building, reading or writing register values or bits
 * within the register values of XPCS registers.
 */
#define XPCS_GET_BITS(_var, _prefix, _field)				\
	GET_BITS((_var),                                                \
		 _prefix##_##_field##_INDEX,                            \
		 _prefix##_##_field##_WIDTH)

#define XPCS_SET_BITS(_var, _prefix, _field, _val)                      \
	SET_BITS((_var),                                                \
		 _prefix##_##_field##_INDEX,                            \
		 _prefix##_##_field##_WIDTH, (_val))

#define XPCS32_IOWRITE(_pdata, _off, _val)				\
	iowrite32(_val, (_pdata)->xpcs_regs + (_off))

@@ -1328,6 +1394,39 @@ do { \
	XRXTX_IOWRITE((_pdata), _reg, reg_val);				\
} while (0)

/* Macros for building, reading or writing register values or bits
 * within the register values of MAC Control registers.
 */
#define XP_GET_BITS(_var, _prefix, _field)				\
	GET_BITS((_var),						\
		 _prefix##_##_field##_INDEX,				\
		 _prefix##_##_field##_WIDTH)

#define XP_SET_BITS(_var, _prefix, _field, _val)			\
	SET_BITS((_var),						\
		 _prefix##_##_field##_INDEX,				\
		 _prefix##_##_field##_WIDTH, (_val))

#define XP_IOREAD(_pdata, _reg)						\
	ioread32((_pdata)->xprop_regs + (_reg))

#define XP_IOREAD_BITS(_pdata, _reg, _field)				\
	GET_BITS(XP_IOREAD((_pdata), (_reg)),				\
		 _reg##_##_field##_INDEX,				\
		 _reg##_##_field##_WIDTH)

#define XP_IOWRITE(_pdata, _reg, _val)					\
	iowrite32((_val), (_pdata)->xprop_regs + (_reg))

#define XP_IOWRITE_BITS(_pdata, _reg, _field, _val)			\
do {									\
	u32 reg_val = XP_IOREAD((_pdata), (_reg));			\
	SET_BITS(reg_val,						\
		 _reg##_##_field##_INDEX,				\
		 _reg##_##_field##_WIDTH, (_val));			\
	XP_IOWRITE((_pdata), (_reg), reg_val);				\
} while (0)

/* Macros for building, reading or writing register values or bits
 * using MDIO.  Different from above because of the use of standardized
 * Linux include values.  No shifting is performed with the bit
+76 −0
Original line number Diff line number Diff line
@@ -316,6 +316,66 @@ static const struct file_operations xpcs_reg_value_fops = {
	.write = xpcs_reg_value_write,
};

static ssize_t xprop_reg_addr_read(struct file *filp, char __user *buffer,
				   size_t count, loff_t *ppos)
{
	struct xgbe_prv_data *pdata = filp->private_data;

	return xgbe_common_read(buffer, count, ppos, pdata->debugfs_xprop_reg);
}

static ssize_t xprop_reg_addr_write(struct file *filp,
				    const char __user *buffer,
				    size_t count, loff_t *ppos)
{
	struct xgbe_prv_data *pdata = filp->private_data;

	return xgbe_common_write(buffer, count, ppos,
				 &pdata->debugfs_xprop_reg);
}

static ssize_t xprop_reg_value_read(struct file *filp, char __user *buffer,
				    size_t count, loff_t *ppos)
{
	struct xgbe_prv_data *pdata = filp->private_data;
	unsigned int value;

	value = XP_IOREAD(pdata, pdata->debugfs_xprop_reg);

	return xgbe_common_read(buffer, count, ppos, value);
}

static ssize_t xprop_reg_value_write(struct file *filp,
				     const char __user *buffer,
				     size_t count, loff_t *ppos)
{
	struct xgbe_prv_data *pdata = filp->private_data;
	unsigned int value;
	ssize_t len;

	len = xgbe_common_write(buffer, count, ppos, &value);
	if (len < 0)
		return len;

	XP_IOWRITE(pdata, pdata->debugfs_xprop_reg, value);

	return len;
}

static const struct file_operations xprop_reg_addr_fops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read =  xprop_reg_addr_read,
	.write = xprop_reg_addr_write,
};

static const struct file_operations xprop_reg_value_fops = {
	.owner = THIS_MODULE,
	.open = simple_open,
	.read =  xprop_reg_value_read,
	.write = xprop_reg_value_write,
};

void xgbe_debugfs_init(struct xgbe_prv_data *pdata)
{
	struct dentry *pfile;
@@ -367,6 +427,22 @@ void xgbe_debugfs_init(struct xgbe_prv_data *pdata)
	if (!pfile)
		netdev_err(pdata->netdev, "debugfs_create_file failed\n");

	if (pdata->xprop_regs) {
		pfile = debugfs_create_file("xprop_register", 0600,
					    pdata->xgbe_debugfs, pdata,
					    &xprop_reg_addr_fops);
		if (!pfile)
			netdev_err(pdata->netdev,
				   "debugfs_create_file failed\n");

		pfile = debugfs_create_file("xprop_register_value", 0600,
					    pdata->xgbe_debugfs, pdata,
					    &xprop_reg_value_fops);
		if (!pfile)
			netdev_err(pdata->netdev,
				   "debugfs_create_file failed\n");
	}

	kfree(buf);
}

+11 −7
Original line number Diff line number Diff line
@@ -374,6 +374,10 @@ static irqreturn_t xgbe_isr(int irq, void *data)
		}
	}

	/* If there is not a separate AN irq, handle it here */
	if (pdata->dev_irq == pdata->an_irq)
		pdata->phy_if.an_isr(irq, pdata);

isr_done:
	return IRQ_HANDLED;
}
@@ -864,16 +868,16 @@ static int xgbe_start(struct xgbe_prv_data *pdata)

	hw_if->init(pdata);

	ret = phy_if->phy_start(pdata);
	if (ret)
		goto err_phy;

	xgbe_napi_enable(pdata, 1);

	ret = xgbe_request_irqs(pdata);
	if (ret)
		goto err_napi;

	ret = phy_if->phy_start(pdata);
	if (ret)
		goto err_irqs;

	hw_if->enable_tx(pdata);
	hw_if->enable_rx(pdata);

@@ -886,12 +890,12 @@ static int xgbe_start(struct xgbe_prv_data *pdata)

	return 0;

err_irqs:
	xgbe_free_irqs(pdata);

err_napi:
	xgbe_napi_disable(pdata, 1);

	phy_if->phy_stop(pdata);

err_phy:
	hw_if->exit(pdata);

	return ret;
Loading