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

Commit c634700f authored by Edward Cree's avatar Edward Cree Committed by David S. Miller
Browse files

sfc: get PIO buffer size from the NIC



The 8000 series SFC NICs have 4K PIO buffers, rather than the 2K of
 the 7000 series.  Rather than having a hard-coded PIO buffer size
 (ER_DZ_TX_PIOBUF_SIZE), read it from the GET_CAPABILITIES_V2 MCDI
 response.

Signed-off-by: default avatarEdward Cree <ecree@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent de1deff9
Loading
Loading
Loading
Loading
+10 −6
Original line number Original line Diff line number Diff line
@@ -197,11 +197,15 @@ static int efx_ef10_init_datapath_caps(struct efx_nic *efx)
	nic_data->datapath_caps =
	nic_data->datapath_caps =
		MCDI_DWORD(outbuf, GET_CAPABILITIES_OUT_FLAGS1);
		MCDI_DWORD(outbuf, GET_CAPABILITIES_OUT_FLAGS1);


	if (outlen >= MC_CMD_GET_CAPABILITIES_V2_OUT_LEN)
	if (outlen >= MC_CMD_GET_CAPABILITIES_V2_OUT_LEN) {
		nic_data->datapath_caps2 = MCDI_DWORD(outbuf,
		nic_data->datapath_caps2 = MCDI_DWORD(outbuf,
				GET_CAPABILITIES_V2_OUT_FLAGS2);
				GET_CAPABILITIES_V2_OUT_FLAGS2);
	else
		nic_data->piobuf_size = MCDI_WORD(outbuf,
				GET_CAPABILITIES_V2_OUT_SIZE_PIO_BUFF);
	} else {
		nic_data->datapath_caps2 = 0;
		nic_data->datapath_caps2 = 0;
		nic_data->piobuf_size = ER_DZ_TX_PIOBUF_SIZE;
	}


	/* record the DPCPU firmware IDs to determine VEB vswitching support.
	/* record the DPCPU firmware IDs to determine VEB vswitching support.
	 */
	 */
@@ -823,8 +827,8 @@ static int efx_ef10_link_piobufs(struct efx_nic *efx)
			offset = ((efx->tx_channel_offset + efx->n_tx_channels -
			offset = ((efx->tx_channel_offset + efx->n_tx_channels -
				   tx_queue->channel->channel - 1) *
				   tx_queue->channel->channel - 1) *
				  efx_piobuf_size);
				  efx_piobuf_size);
			index = offset / ER_DZ_TX_PIOBUF_SIZE;
			index = offset / nic_data->piobuf_size;
			offset = offset % ER_DZ_TX_PIOBUF_SIZE;
			offset = offset % nic_data->piobuf_size;


			/* When the host page size is 4K, the first
			/* When the host page size is 4K, the first
			 * host page in the WC mapping may be within
			 * host page in the WC mapping may be within
@@ -1159,11 +1163,11 @@ static int efx_ef10_dimension_resources(struct efx_nic *efx)
	 * functions of the controller.
	 * functions of the controller.
	 */
	 */
	if (efx_piobuf_size != 0 &&
	if (efx_piobuf_size != 0 &&
	    ER_DZ_TX_PIOBUF_SIZE / efx_piobuf_size * EF10_TX_PIOBUF_COUNT >=
	    nic_data->piobuf_size / efx_piobuf_size * EF10_TX_PIOBUF_COUNT >=
	    efx->n_tx_channels) {
	    efx->n_tx_channels) {
		unsigned int n_piobufs =
		unsigned int n_piobufs =
			DIV_ROUND_UP(efx->n_tx_channels,
			DIV_ROUND_UP(efx->n_tx_channels,
				     ER_DZ_TX_PIOBUF_SIZE / efx_piobuf_size);
				     nic_data->piobuf_size / efx_piobuf_size);


		rc = efx_ef10_alloc_piobufs(efx, n_piobufs);
		rc = efx_ef10_alloc_piobufs(efx, n_piobufs);
		if (rc)
		if (rc)
+2 −0
Original line number Original line Diff line number Diff line
@@ -343,6 +343,7 @@ enum {
 * @pio_write_base: Base address for writing PIO buffers
 * @pio_write_base: Base address for writing PIO buffers
 * @pio_write_vi_base: Relative VI number for @pio_write_base
 * @pio_write_vi_base: Relative VI number for @pio_write_base
 * @piobuf_handle: Handle of each PIO buffer allocated
 * @piobuf_handle: Handle of each PIO buffer allocated
 * @piobuf_size: size of a single PIO buffer
 * @must_restore_piobufs: Flag: PIO buffers have yet to be restored after MC
 * @must_restore_piobufs: Flag: PIO buffers have yet to be restored after MC
 *	reboot
 *	reboot
 * @rx_rss_context: Firmware handle for our RSS context
 * @rx_rss_context: Firmware handle for our RSS context
@@ -380,6 +381,7 @@ struct efx_ef10_nic_data {
	void __iomem *wc_membase, *pio_write_base;
	void __iomem *wc_membase, *pio_write_base;
	unsigned int pio_write_vi_base;
	unsigned int pio_write_vi_base;
	unsigned int piobuf_handle[EF10_TX_PIOBUF_COUNT];
	unsigned int piobuf_handle[EF10_TX_PIOBUF_COUNT];
	u16 piobuf_size;
	bool must_restore_piobufs;
	bool must_restore_piobufs;
	u32 rx_rss_context;
	u32 rx_rss_context;
	bool rx_rss_context_exclusive;
	bool rx_rss_context_exclusive;
+0 −1
Original line number Original line Diff line number Diff line
@@ -28,7 +28,6 @@


#ifdef EFX_USE_PIO
#ifdef EFX_USE_PIO


#define EFX_PIOBUF_SIZE_MAX ER_DZ_TX_PIOBUF_SIZE
#define EFX_PIOBUF_SIZE_DEF ALIGN(256, L1_CACHE_BYTES)
#define EFX_PIOBUF_SIZE_DEF ALIGN(256, L1_CACHE_BYTES)
unsigned int efx_piobuf_size __read_mostly = EFX_PIOBUF_SIZE_DEF;
unsigned int efx_piobuf_size __read_mostly = EFX_PIOBUF_SIZE_DEF;