cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

ixgb_param.c (11637B)


      1// SPDX-License-Identifier: GPL-2.0
      2/* Copyright(c) 1999 - 2008 Intel Corporation. */
      3
      4#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
      5
      6#include "ixgb.h"
      7
      8/* This is the only thing that needs to be changed to adjust the
      9 * maximum number of ports that the driver can manage.
     10 */
     11
     12#define IXGB_MAX_NIC 8
     13
     14#define OPTION_UNSET	-1
     15#define OPTION_DISABLED 0
     16#define OPTION_ENABLED  1
     17
     18/* All parameters are treated the same, as an integer array of values.
     19 * This macro just reduces the need to repeat the same declaration code
     20 * over and over (plus this helps to avoid typo bugs).
     21 */
     22
     23#define IXGB_PARAM_INIT { [0 ... IXGB_MAX_NIC] = OPTION_UNSET }
     24#define IXGB_PARAM(X, desc)					\
     25	static int X[IXGB_MAX_NIC+1]		\
     26		= IXGB_PARAM_INIT;				\
     27	static unsigned int num_##X = 0;			\
     28	module_param_array_named(X, X, int, &num_##X, 0);	\
     29	MODULE_PARM_DESC(X, desc);
     30
     31/* Transmit Descriptor Count
     32 *
     33 * Valid Range: 64-4096
     34 *
     35 * Default Value: 256
     36 */
     37
     38IXGB_PARAM(TxDescriptors, "Number of transmit descriptors");
     39
     40/* Receive Descriptor Count
     41 *
     42 * Valid Range: 64-4096
     43 *
     44 * Default Value: 1024
     45 */
     46
     47IXGB_PARAM(RxDescriptors, "Number of receive descriptors");
     48
     49/* User Specified Flow Control Override
     50 *
     51 * Valid Range: 0-3
     52 *  - 0 - No Flow Control
     53 *  - 1 - Rx only, respond to PAUSE frames but do not generate them
     54 *  - 2 - Tx only, generate PAUSE frames but ignore them on receive
     55 *  - 3 - Full Flow Control Support
     56 *
     57 * Default Value: 2 - Tx only (silicon bug avoidance)
     58 */
     59
     60IXGB_PARAM(FlowControl, "Flow Control setting");
     61
     62/* XsumRX - Receive Checksum Offload Enable/Disable
     63 *
     64 * Valid Range: 0, 1
     65 *  - 0 - disables all checksum offload
     66 *  - 1 - enables receive IP/TCP/UDP checksum offload
     67 *        on 82597 based NICs
     68 *
     69 * Default Value: 1
     70 */
     71
     72IXGB_PARAM(XsumRX, "Disable or enable Receive Checksum offload");
     73
     74/* Transmit Interrupt Delay in units of 0.8192 microseconds
     75 *
     76 * Valid Range: 0-65535
     77 *
     78 * Default Value: 32
     79 */
     80
     81IXGB_PARAM(TxIntDelay, "Transmit Interrupt Delay");
     82
     83/* Receive Interrupt Delay in units of 0.8192 microseconds
     84 *
     85 * Valid Range: 0-65535
     86 *
     87 * Default Value: 72
     88 */
     89
     90IXGB_PARAM(RxIntDelay, "Receive Interrupt Delay");
     91
     92/* Receive Flow control high threshold (when we send a pause frame)
     93 * (FCRTH)
     94 *
     95 * Valid Range: 1,536 - 262,136 (0x600 - 0x3FFF8, 8 byte granularity)
     96 *
     97 * Default Value: 196,608 (0x30000)
     98 */
     99
    100IXGB_PARAM(RxFCHighThresh, "Receive Flow Control High Threshold");
    101
    102/* Receive Flow control low threshold (when we send a resume frame)
    103 * (FCRTL)
    104 *
    105 * Valid Range: 64 - 262,136 (0x40 - 0x3FFF8, 8 byte granularity)
    106 *              must be less than high threshold by at least 8 bytes
    107 *
    108 * Default Value:  163,840 (0x28000)
    109 */
    110
    111IXGB_PARAM(RxFCLowThresh, "Receive Flow Control Low Threshold");
    112
    113/* Flow control request timeout (how long to pause the link partner's tx)
    114 * (PAP 15:0)
    115 *
    116 * Valid Range: 1 - 65535
    117 *
    118 * Default Value:  65535 (0xffff) (we'll send an xon if we recover)
    119 */
    120
    121IXGB_PARAM(FCReqTimeout, "Flow Control Request Timeout");
    122
    123/* Interrupt Delay Enable
    124 *
    125 * Valid Range: 0, 1
    126 *
    127 *  - 0 - disables transmit interrupt delay
    128 *  - 1 - enables transmmit interrupt delay
    129 *
    130 * Default Value: 1
    131 */
    132
    133IXGB_PARAM(IntDelayEnable, "Transmit Interrupt Delay Enable");
    134
    135
    136#define DEFAULT_TIDV	   		     32
    137#define MAX_TIDV			 0xFFFF
    138#define MIN_TIDV			      0
    139
    140#define DEFAULT_RDTR		   	     72
    141#define MAX_RDTR			 0xFFFF
    142#define MIN_RDTR			      0
    143
    144#define XSUMRX_DEFAULT		 OPTION_ENABLED
    145
    146#define DEFAULT_FCRTL	  		0x28000
    147#define DEFAULT_FCRTH			0x30000
    148#define MIN_FCRTL			      0
    149#define MAX_FCRTL			0x3FFE8
    150#define MIN_FCRTH			      8
    151#define MAX_FCRTH			0x3FFF0
    152
    153#define MIN_FCPAUSE			      1
    154#define MAX_FCPAUSE			 0xffff
    155#define DEFAULT_FCPAUSE		  	 0xFFFF /* this may be too long */
    156
    157struct ixgb_option {
    158	enum { enable_option, range_option, list_option } type;
    159	const char *name;
    160	const char *err;
    161	int def;
    162	union {
    163		struct {	/* range_option info */
    164			int min;
    165			int max;
    166		} r;
    167		struct {	/* list_option info */
    168			int nr;
    169			const struct ixgb_opt_list {
    170				int i;
    171				const char *str;
    172			} *p;
    173		} l;
    174	} arg;
    175};
    176
    177static int
    178ixgb_validate_option(unsigned int *value, const struct ixgb_option *opt)
    179{
    180	if (*value == OPTION_UNSET) {
    181		*value = opt->def;
    182		return 0;
    183	}
    184
    185	switch (opt->type) {
    186	case enable_option:
    187		switch (*value) {
    188		case OPTION_ENABLED:
    189			pr_info("%s Enabled\n", opt->name);
    190			return 0;
    191		case OPTION_DISABLED:
    192			pr_info("%s Disabled\n", opt->name);
    193			return 0;
    194		}
    195		break;
    196	case range_option:
    197		if (*value >= opt->arg.r.min && *value <= opt->arg.r.max) {
    198			pr_info("%s set to %i\n", opt->name, *value);
    199			return 0;
    200		}
    201		break;
    202	case list_option: {
    203		int i;
    204		const struct ixgb_opt_list *ent;
    205
    206		for (i = 0; i < opt->arg.l.nr; i++) {
    207			ent = &opt->arg.l.p[i];
    208			if (*value == ent->i) {
    209				if (ent->str[0] != '\0')
    210					pr_info("%s\n", ent->str);
    211				return 0;
    212			}
    213		}
    214	}
    215		break;
    216	default:
    217		BUG();
    218	}
    219
    220	pr_info("Invalid %s specified (%i) %s\n", opt->name, *value, opt->err);
    221	*value = opt->def;
    222	return -1;
    223}
    224
    225/**
    226 * ixgb_check_options - Range Checking for Command Line Parameters
    227 * @adapter: board private structure
    228 *
    229 * This routine checks all command line parameters for valid user
    230 * input.  If an invalid value is given, or if no user specified
    231 * value exists, a default value is used.  The final value is stored
    232 * in a variable in the adapter structure.
    233 **/
    234
    235void
    236ixgb_check_options(struct ixgb_adapter *adapter)
    237{
    238	int bd = adapter->bd_number;
    239	if (bd >= IXGB_MAX_NIC) {
    240		pr_notice("Warning: no configuration for board #%i\n", bd);
    241		pr_notice("Using defaults for all values\n");
    242	}
    243
    244	{ /* Transmit Descriptor Count */
    245		static const struct ixgb_option opt = {
    246			.type = range_option,
    247			.name = "Transmit Descriptors",
    248			.err  = "using default of " __MODULE_STRING(DEFAULT_TXD),
    249			.def  = DEFAULT_TXD,
    250			.arg  = { .r = { .min = MIN_TXD,
    251					 .max = MAX_TXD}}
    252		};
    253		struct ixgb_desc_ring *tx_ring = &adapter->tx_ring;
    254
    255		if (num_TxDescriptors > bd) {
    256			tx_ring->count = TxDescriptors[bd];
    257			ixgb_validate_option(&tx_ring->count, &opt);
    258		} else {
    259			tx_ring->count = opt.def;
    260		}
    261		tx_ring->count = ALIGN(tx_ring->count, IXGB_REQ_TX_DESCRIPTOR_MULTIPLE);
    262	}
    263	{ /* Receive Descriptor Count */
    264		static const struct ixgb_option opt = {
    265			.type = range_option,
    266			.name = "Receive Descriptors",
    267			.err  = "using default of " __MODULE_STRING(DEFAULT_RXD),
    268			.def  = DEFAULT_RXD,
    269			.arg  = { .r = { .min = MIN_RXD,
    270					 .max = MAX_RXD}}
    271		};
    272		struct ixgb_desc_ring *rx_ring = &adapter->rx_ring;
    273
    274		if (num_RxDescriptors > bd) {
    275			rx_ring->count = RxDescriptors[bd];
    276			ixgb_validate_option(&rx_ring->count, &opt);
    277		} else {
    278			rx_ring->count = opt.def;
    279		}
    280		rx_ring->count = ALIGN(rx_ring->count, IXGB_REQ_RX_DESCRIPTOR_MULTIPLE);
    281	}
    282	{ /* Receive Checksum Offload Enable */
    283		static const struct ixgb_option opt = {
    284			.type = enable_option,
    285			.name = "Receive Checksum Offload",
    286			.err  = "defaulting to Enabled",
    287			.def  = OPTION_ENABLED
    288		};
    289
    290		if (num_XsumRX > bd) {
    291			unsigned int rx_csum = XsumRX[bd];
    292			ixgb_validate_option(&rx_csum, &opt);
    293			adapter->rx_csum = rx_csum;
    294		} else {
    295			adapter->rx_csum = opt.def;
    296		}
    297	}
    298	{ /* Flow Control */
    299
    300		static const struct ixgb_opt_list fc_list[] = {
    301		       { ixgb_fc_none, "Flow Control Disabled" },
    302		       { ixgb_fc_rx_pause, "Flow Control Receive Only" },
    303		       { ixgb_fc_tx_pause, "Flow Control Transmit Only" },
    304		       { ixgb_fc_full, "Flow Control Enabled" },
    305		       { ixgb_fc_default, "Flow Control Hardware Default" }
    306		};
    307
    308		static const struct ixgb_option opt = {
    309			.type = list_option,
    310			.name = "Flow Control",
    311			.err  = "reading default settings from EEPROM",
    312			.def  = ixgb_fc_tx_pause,
    313			.arg  = { .l = { .nr = ARRAY_SIZE(fc_list),
    314					 .p = fc_list }}
    315		};
    316
    317		if (num_FlowControl > bd) {
    318			unsigned int fc = FlowControl[bd];
    319			ixgb_validate_option(&fc, &opt);
    320			adapter->hw.fc.type = fc;
    321		} else {
    322			adapter->hw.fc.type = opt.def;
    323		}
    324	}
    325	{ /* Receive Flow Control High Threshold */
    326		static const struct ixgb_option opt = {
    327			.type = range_option,
    328			.name = "Rx Flow Control High Threshold",
    329			.err  = "using default of " __MODULE_STRING(DEFAULT_FCRTH),
    330			.def  = DEFAULT_FCRTH,
    331			.arg  = { .r = { .min = MIN_FCRTH,
    332					 .max = MAX_FCRTH}}
    333		};
    334
    335		if (num_RxFCHighThresh > bd) {
    336			adapter->hw.fc.high_water = RxFCHighThresh[bd];
    337			ixgb_validate_option(&adapter->hw.fc.high_water, &opt);
    338		} else {
    339			adapter->hw.fc.high_water = opt.def;
    340		}
    341		if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
    342			pr_info("Ignoring RxFCHighThresh when no RxFC\n");
    343	}
    344	{ /* Receive Flow Control Low Threshold */
    345		static const struct ixgb_option opt = {
    346			.type = range_option,
    347			.name = "Rx Flow Control Low Threshold",
    348			.err  = "using default of " __MODULE_STRING(DEFAULT_FCRTL),
    349			.def  = DEFAULT_FCRTL,
    350			.arg  = { .r = { .min = MIN_FCRTL,
    351					 .max = MAX_FCRTL}}
    352		};
    353
    354		if (num_RxFCLowThresh > bd) {
    355			adapter->hw.fc.low_water = RxFCLowThresh[bd];
    356			ixgb_validate_option(&adapter->hw.fc.low_water, &opt);
    357		} else {
    358			adapter->hw.fc.low_water = opt.def;
    359		}
    360		if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
    361			pr_info("Ignoring RxFCLowThresh when no RxFC\n");
    362	}
    363	{ /* Flow Control Pause Time Request*/
    364		static const struct ixgb_option opt = {
    365			.type = range_option,
    366			.name = "Flow Control Pause Time Request",
    367			.err  = "using default of "__MODULE_STRING(DEFAULT_FCPAUSE),
    368			.def  = DEFAULT_FCPAUSE,
    369			.arg = { .r = { .min = MIN_FCPAUSE,
    370					.max = MAX_FCPAUSE}}
    371		};
    372
    373		if (num_FCReqTimeout > bd) {
    374			unsigned int pause_time = FCReqTimeout[bd];
    375			ixgb_validate_option(&pause_time, &opt);
    376			adapter->hw.fc.pause_time = pause_time;
    377		} else {
    378			adapter->hw.fc.pause_time = opt.def;
    379		}
    380		if (!(adapter->hw.fc.type & ixgb_fc_tx_pause) )
    381			pr_info("Ignoring FCReqTimeout when no RxFC\n");
    382	}
    383	/* high low and spacing check for rx flow control thresholds */
    384	if (adapter->hw.fc.type & ixgb_fc_tx_pause) {
    385		/* high must be greater than low */
    386		if (adapter->hw.fc.high_water < (adapter->hw.fc.low_water + 8)) {
    387			/* set defaults */
    388			pr_info("RxFCHighThresh must be >= (RxFCLowThresh + 8), Using Defaults\n");
    389			adapter->hw.fc.high_water = DEFAULT_FCRTH;
    390			adapter->hw.fc.low_water  = DEFAULT_FCRTL;
    391		}
    392	}
    393	{ /* Receive Interrupt Delay */
    394		static const struct ixgb_option opt = {
    395			.type = range_option,
    396			.name = "Receive Interrupt Delay",
    397			.err  = "using default of " __MODULE_STRING(DEFAULT_RDTR),
    398			.def  = DEFAULT_RDTR,
    399			.arg  = { .r = { .min = MIN_RDTR,
    400					 .max = MAX_RDTR}}
    401		};
    402
    403		if (num_RxIntDelay > bd) {
    404			adapter->rx_int_delay = RxIntDelay[bd];
    405			ixgb_validate_option(&adapter->rx_int_delay, &opt);
    406		} else {
    407			adapter->rx_int_delay = opt.def;
    408		}
    409	}
    410	{ /* Transmit Interrupt Delay */
    411		static const struct ixgb_option opt = {
    412			.type = range_option,
    413			.name = "Transmit Interrupt Delay",
    414			.err  = "using default of " __MODULE_STRING(DEFAULT_TIDV),
    415			.def  = DEFAULT_TIDV,
    416			.arg  = { .r = { .min = MIN_TIDV,
    417					 .max = MAX_TIDV}}
    418		};
    419
    420		if (num_TxIntDelay > bd) {
    421			adapter->tx_int_delay = TxIntDelay[bd];
    422			ixgb_validate_option(&adapter->tx_int_delay, &opt);
    423		} else {
    424			adapter->tx_int_delay = opt.def;
    425		}
    426	}
    427
    428	{ /* Transmit Interrupt Delay Enable */
    429		static const struct ixgb_option opt = {
    430			.type = enable_option,
    431			.name = "Tx Interrupt Delay Enable",
    432			.err  = "defaulting to Enabled",
    433			.def  = OPTION_ENABLED
    434		};
    435
    436		if (num_IntDelayEnable > bd) {
    437			unsigned int ide = IntDelayEnable[bd];
    438			ixgb_validate_option(&ide, &opt);
    439			adapter->tx_int_delay_enable = ide;
    440		} else {
    441			adapter->tx_int_delay_enable = opt.def;
    442		}
    443	}
    444}