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

qsfp.c (21086B)


      1// SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause
      2/*
      3 * Copyright(c) 2015, 2016 Intel Corporation.
      4 */
      5
      6#include <linux/delay.h>
      7#include <linux/pci.h>
      8#include <linux/vmalloc.h>
      9
     10#include "hfi.h"
     11
     12/* for the given bus number, return the CSR for reading an i2c line */
     13static inline u32 i2c_in_csr(u32 bus_num)
     14{
     15	return bus_num ? ASIC_QSFP2_IN : ASIC_QSFP1_IN;
     16}
     17
     18/* for the given bus number, return the CSR for writing an i2c line */
     19static inline u32 i2c_oe_csr(u32 bus_num)
     20{
     21	return bus_num ? ASIC_QSFP2_OE : ASIC_QSFP1_OE;
     22}
     23
     24static void hfi1_setsda(void *data, int state)
     25{
     26	struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data;
     27	struct hfi1_devdata *dd = bus->controlling_dd;
     28	u64 reg;
     29	u32 target_oe;
     30
     31	target_oe = i2c_oe_csr(bus->num);
     32	reg = read_csr(dd, target_oe);
     33	/*
     34	 * The OE bit value is inverted and connected to the pin.  When
     35	 * OE is 0 the pin is left to be pulled up, when the OE is 1
     36	 * the pin is driven low.  This matches the "open drain" or "open
     37	 * collector" convention.
     38	 */
     39	if (state)
     40		reg &= ~QSFP_HFI0_I2CDAT;
     41	else
     42		reg |= QSFP_HFI0_I2CDAT;
     43	write_csr(dd, target_oe, reg);
     44	/* do a read to force the write into the chip */
     45	(void)read_csr(dd, target_oe);
     46}
     47
     48static void hfi1_setscl(void *data, int state)
     49{
     50	struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data;
     51	struct hfi1_devdata *dd = bus->controlling_dd;
     52	u64 reg;
     53	u32 target_oe;
     54
     55	target_oe = i2c_oe_csr(bus->num);
     56	reg = read_csr(dd, target_oe);
     57	/*
     58	 * The OE bit value is inverted and connected to the pin.  When
     59	 * OE is 0 the pin is left to be pulled up, when the OE is 1
     60	 * the pin is driven low.  This matches the "open drain" or "open
     61	 * collector" convention.
     62	 */
     63	if (state)
     64		reg &= ~QSFP_HFI0_I2CCLK;
     65	else
     66		reg |= QSFP_HFI0_I2CCLK;
     67	write_csr(dd, target_oe, reg);
     68	/* do a read to force the write into the chip */
     69	(void)read_csr(dd, target_oe);
     70}
     71
     72static int hfi1_getsda(void *data)
     73{
     74	struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data;
     75	u64 reg;
     76	u32 target_in;
     77
     78	hfi1_setsda(data, 1);	/* clear OE so we do not pull line down */
     79	udelay(2);		/* 1us pull up + 250ns hold */
     80
     81	target_in = i2c_in_csr(bus->num);
     82	reg = read_csr(bus->controlling_dd, target_in);
     83	return !!(reg & QSFP_HFI0_I2CDAT);
     84}
     85
     86static int hfi1_getscl(void *data)
     87{
     88	struct hfi1_i2c_bus *bus = (struct hfi1_i2c_bus *)data;
     89	u64 reg;
     90	u32 target_in;
     91
     92	hfi1_setscl(data, 1);	/* clear OE so we do not pull line down */
     93	udelay(2);		/* 1us pull up + 250ns hold */
     94
     95	target_in = i2c_in_csr(bus->num);
     96	reg = read_csr(bus->controlling_dd, target_in);
     97	return !!(reg & QSFP_HFI0_I2CCLK);
     98}
     99
    100/*
    101 * Allocate and initialize the given i2c bus number.
    102 * Returns NULL on failure.
    103 */
    104static struct hfi1_i2c_bus *init_i2c_bus(struct hfi1_devdata *dd,
    105					 struct hfi1_asic_data *ad, int num)
    106{
    107	struct hfi1_i2c_bus *bus;
    108	int ret;
    109
    110	bus = kzalloc(sizeof(*bus), GFP_KERNEL);
    111	if (!bus)
    112		return NULL;
    113
    114	bus->controlling_dd = dd;
    115	bus->num = num;	/* our bus number */
    116
    117	bus->algo.setsda = hfi1_setsda;
    118	bus->algo.setscl = hfi1_setscl;
    119	bus->algo.getsda = hfi1_getsda;
    120	bus->algo.getscl = hfi1_getscl;
    121	bus->algo.udelay = 5;
    122	bus->algo.timeout = usecs_to_jiffies(100000);
    123	bus->algo.data = bus;
    124
    125	bus->adapter.owner = THIS_MODULE;
    126	bus->adapter.algo_data = &bus->algo;
    127	bus->adapter.dev.parent = &dd->pcidev->dev;
    128	snprintf(bus->adapter.name, sizeof(bus->adapter.name),
    129		 "hfi1_i2c%d", num);
    130
    131	ret = i2c_bit_add_bus(&bus->adapter);
    132	if (ret) {
    133		dd_dev_info(dd, "%s: unable to add i2c bus %d, err %d\n",
    134			    __func__, num, ret);
    135		kfree(bus);
    136		return NULL;
    137	}
    138
    139	return bus;
    140}
    141
    142/*
    143 * Initialize i2c buses.
    144 * Return 0 on success, -errno on error.
    145 */
    146int set_up_i2c(struct hfi1_devdata *dd, struct hfi1_asic_data *ad)
    147{
    148	ad->i2c_bus0 = init_i2c_bus(dd, ad, 0);
    149	ad->i2c_bus1 = init_i2c_bus(dd, ad, 1);
    150	if (!ad->i2c_bus0 || !ad->i2c_bus1)
    151		return -ENOMEM;
    152	return 0;
    153};
    154
    155static void clean_i2c_bus(struct hfi1_i2c_bus *bus)
    156{
    157	if (bus) {
    158		i2c_del_adapter(&bus->adapter);
    159		kfree(bus);
    160	}
    161}
    162
    163void clean_up_i2c(struct hfi1_devdata *dd, struct hfi1_asic_data *ad)
    164{
    165	if (!ad)
    166		return;
    167	clean_i2c_bus(ad->i2c_bus0);
    168	ad->i2c_bus0 = NULL;
    169	clean_i2c_bus(ad->i2c_bus1);
    170	ad->i2c_bus1 = NULL;
    171}
    172
    173static int i2c_bus_write(struct hfi1_devdata *dd, struct hfi1_i2c_bus *i2c,
    174			 u8 slave_addr, int offset, int offset_size,
    175			 u8 *data, u16 len)
    176{
    177	int ret;
    178	int num_msgs;
    179	u8 offset_bytes[2];
    180	struct i2c_msg msgs[2];
    181
    182	switch (offset_size) {
    183	case 0:
    184		num_msgs = 1;
    185		msgs[0].addr = slave_addr;
    186		msgs[0].flags = 0;
    187		msgs[0].len = len;
    188		msgs[0].buf = data;
    189		break;
    190	case 2:
    191		offset_bytes[1] = (offset >> 8) & 0xff;
    192		fallthrough;
    193	case 1:
    194		num_msgs = 2;
    195		offset_bytes[0] = offset & 0xff;
    196
    197		msgs[0].addr = slave_addr;
    198		msgs[0].flags = 0;
    199		msgs[0].len = offset_size;
    200		msgs[0].buf = offset_bytes;
    201
    202		msgs[1].addr = slave_addr;
    203		msgs[1].flags = I2C_M_NOSTART;
    204		msgs[1].len = len;
    205		msgs[1].buf = data;
    206		break;
    207	default:
    208		return -EINVAL;
    209	}
    210
    211	i2c->controlling_dd = dd;
    212	ret = i2c_transfer(&i2c->adapter, msgs, num_msgs);
    213	if (ret != num_msgs) {
    214		dd_dev_err(dd, "%s: bus %d, i2c slave 0x%x, offset 0x%x, len 0x%x; write failed, ret %d\n",
    215			   __func__, i2c->num, slave_addr, offset, len, ret);
    216		return ret < 0 ? ret : -EIO;
    217	}
    218	return 0;
    219}
    220
    221static int i2c_bus_read(struct hfi1_devdata *dd, struct hfi1_i2c_bus *bus,
    222			u8 slave_addr, int offset, int offset_size,
    223			u8 *data, u16 len)
    224{
    225	int ret;
    226	int num_msgs;
    227	u8 offset_bytes[2];
    228	struct i2c_msg msgs[2];
    229
    230	switch (offset_size) {
    231	case 0:
    232		num_msgs = 1;
    233		msgs[0].addr = slave_addr;
    234		msgs[0].flags = I2C_M_RD;
    235		msgs[0].len = len;
    236		msgs[0].buf = data;
    237		break;
    238	case 2:
    239		offset_bytes[1] = (offset >> 8) & 0xff;
    240		fallthrough;
    241	case 1:
    242		num_msgs = 2;
    243		offset_bytes[0] = offset & 0xff;
    244
    245		msgs[0].addr = slave_addr;
    246		msgs[0].flags = 0;
    247		msgs[0].len = offset_size;
    248		msgs[0].buf = offset_bytes;
    249
    250		msgs[1].addr = slave_addr;
    251		msgs[1].flags = I2C_M_RD;
    252		msgs[1].len = len;
    253		msgs[1].buf = data;
    254		break;
    255	default:
    256		return -EINVAL;
    257	}
    258
    259	bus->controlling_dd = dd;
    260	ret = i2c_transfer(&bus->adapter, msgs, num_msgs);
    261	if (ret != num_msgs) {
    262		dd_dev_err(dd, "%s: bus %d, i2c slave 0x%x, offset 0x%x, len 0x%x; read failed, ret %d\n",
    263			   __func__, bus->num, slave_addr, offset, len, ret);
    264		return ret < 0 ? ret : -EIO;
    265	}
    266	return 0;
    267}
    268
    269/*
    270 * Raw i2c write.  No set-up or lock checking.
    271 *
    272 * Return 0 on success, -errno on error.
    273 */
    274static int __i2c_write(struct hfi1_pportdata *ppd, u32 target, int i2c_addr,
    275		       int offset, void *bp, int len)
    276{
    277	struct hfi1_devdata *dd = ppd->dd;
    278	struct hfi1_i2c_bus *bus;
    279	u8 slave_addr;
    280	int offset_size;
    281
    282	bus = target ? dd->asic_data->i2c_bus1 : dd->asic_data->i2c_bus0;
    283	slave_addr = (i2c_addr & 0xff) >> 1; /* convert to 7-bit addr */
    284	offset_size = (i2c_addr >> 8) & 0x3;
    285	return i2c_bus_write(dd, bus, slave_addr, offset, offset_size, bp, len);
    286}
    287
    288/*
    289 * Caller must hold the i2c chain resource.
    290 *
    291 * Return number of bytes written, or -errno.
    292 */
    293int i2c_write(struct hfi1_pportdata *ppd, u32 target, int i2c_addr, int offset,
    294	      void *bp, int len)
    295{
    296	int ret;
    297
    298	if (!check_chip_resource(ppd->dd, i2c_target(target), __func__))
    299		return -EACCES;
    300
    301	ret = __i2c_write(ppd, target, i2c_addr, offset, bp, len);
    302	if (ret)
    303		return ret;
    304
    305	return len;
    306}
    307
    308/*
    309 * Raw i2c read.  No set-up or lock checking.
    310 *
    311 * Return 0 on success, -errno on error.
    312 */
    313static int __i2c_read(struct hfi1_pportdata *ppd, u32 target, int i2c_addr,
    314		      int offset, void *bp, int len)
    315{
    316	struct hfi1_devdata *dd = ppd->dd;
    317	struct hfi1_i2c_bus *bus;
    318	u8 slave_addr;
    319	int offset_size;
    320
    321	bus = target ? dd->asic_data->i2c_bus1 : dd->asic_data->i2c_bus0;
    322	slave_addr = (i2c_addr & 0xff) >> 1; /* convert to 7-bit addr */
    323	offset_size = (i2c_addr >> 8) & 0x3;
    324	return i2c_bus_read(dd, bus, slave_addr, offset, offset_size, bp, len);
    325}
    326
    327/*
    328 * Caller must hold the i2c chain resource.
    329 *
    330 * Return number of bytes read, or -errno.
    331 */
    332int i2c_read(struct hfi1_pportdata *ppd, u32 target, int i2c_addr, int offset,
    333	     void *bp, int len)
    334{
    335	int ret;
    336
    337	if (!check_chip_resource(ppd->dd, i2c_target(target), __func__))
    338		return -EACCES;
    339
    340	ret = __i2c_read(ppd, target, i2c_addr, offset, bp, len);
    341	if (ret)
    342		return ret;
    343
    344	return len;
    345}
    346
    347/*
    348 * Write page n, offset m of QSFP memory as defined by SFF 8636
    349 * by writing @addr = ((256 * n) + m)
    350 *
    351 * Caller must hold the i2c chain resource.
    352 *
    353 * Return number of bytes written or -errno.
    354 */
    355int qsfp_write(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp,
    356	       int len)
    357{
    358	int count = 0;
    359	int offset;
    360	int nwrite;
    361	int ret = 0;
    362	u8 page;
    363
    364	if (!check_chip_resource(ppd->dd, i2c_target(target), __func__))
    365		return -EACCES;
    366
    367	while (count < len) {
    368		/*
    369		 * Set the qsfp page based on a zero-based address
    370		 * and a page size of QSFP_PAGESIZE bytes.
    371		 */
    372		page = (u8)(addr / QSFP_PAGESIZE);
    373
    374		ret = __i2c_write(ppd, target, QSFP_DEV | QSFP_OFFSET_SIZE,
    375				  QSFP_PAGE_SELECT_BYTE_OFFS, &page, 1);
    376		/* QSFPs require a 5-10msec delay after write operations */
    377		mdelay(5);
    378		if (ret) {
    379			hfi1_dev_porterr(ppd->dd, ppd->port,
    380					 "QSFP chain %d can't write QSFP_PAGE_SELECT_BYTE: %d\n",
    381					 target, ret);
    382			break;
    383		}
    384
    385		offset = addr % QSFP_PAGESIZE;
    386		nwrite = len - count;
    387		/* truncate write to boundary if crossing boundary */
    388		if (((addr % QSFP_RW_BOUNDARY) + nwrite) > QSFP_RW_BOUNDARY)
    389			nwrite = QSFP_RW_BOUNDARY - (addr % QSFP_RW_BOUNDARY);
    390
    391		ret = __i2c_write(ppd, target, QSFP_DEV | QSFP_OFFSET_SIZE,
    392				  offset, bp + count, nwrite);
    393		/* QSFPs require a 5-10msec delay after write operations */
    394		mdelay(5);
    395		if (ret)	/* stop on error */
    396			break;
    397
    398		count += nwrite;
    399		addr += nwrite;
    400	}
    401
    402	if (ret < 0)
    403		return ret;
    404	return count;
    405}
    406
    407/*
    408 * Perform a stand-alone single QSFP write.  Acquire the resource, do the
    409 * write, then release the resource.
    410 */
    411int one_qsfp_write(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp,
    412		   int len)
    413{
    414	struct hfi1_devdata *dd = ppd->dd;
    415	u32 resource = qsfp_resource(dd);
    416	int ret;
    417
    418	ret = acquire_chip_resource(dd, resource, QSFP_WAIT);
    419	if (ret)
    420		return ret;
    421	ret = qsfp_write(ppd, target, addr, bp, len);
    422	release_chip_resource(dd, resource);
    423
    424	return ret;
    425}
    426
    427/*
    428 * Access page n, offset m of QSFP memory as defined by SFF 8636
    429 * by reading @addr = ((256 * n) + m)
    430 *
    431 * Caller must hold the i2c chain resource.
    432 *
    433 * Return the number of bytes read or -errno.
    434 */
    435int qsfp_read(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp,
    436	      int len)
    437{
    438	int count = 0;
    439	int offset;
    440	int nread;
    441	int ret = 0;
    442	u8 page;
    443
    444	if (!check_chip_resource(ppd->dd, i2c_target(target), __func__))
    445		return -EACCES;
    446
    447	while (count < len) {
    448		/*
    449		 * Set the qsfp page based on a zero-based address
    450		 * and a page size of QSFP_PAGESIZE bytes.
    451		 */
    452		page = (u8)(addr / QSFP_PAGESIZE);
    453		ret = __i2c_write(ppd, target, QSFP_DEV | QSFP_OFFSET_SIZE,
    454				  QSFP_PAGE_SELECT_BYTE_OFFS, &page, 1);
    455		/* QSFPs require a 5-10msec delay after write operations */
    456		mdelay(5);
    457		if (ret) {
    458			hfi1_dev_porterr(ppd->dd, ppd->port,
    459					 "QSFP chain %d can't write QSFP_PAGE_SELECT_BYTE: %d\n",
    460					 target, ret);
    461			break;
    462		}
    463
    464		offset = addr % QSFP_PAGESIZE;
    465		nread = len - count;
    466		/* truncate read to boundary if crossing boundary */
    467		if (((addr % QSFP_RW_BOUNDARY) + nread) > QSFP_RW_BOUNDARY)
    468			nread = QSFP_RW_BOUNDARY - (addr % QSFP_RW_BOUNDARY);
    469
    470		ret = __i2c_read(ppd, target, QSFP_DEV | QSFP_OFFSET_SIZE,
    471				 offset, bp + count, nread);
    472		if (ret)	/* stop on error */
    473			break;
    474
    475		count += nread;
    476		addr += nread;
    477	}
    478
    479	if (ret < 0)
    480		return ret;
    481	return count;
    482}
    483
    484/*
    485 * Perform a stand-alone single QSFP read.  Acquire the resource, do the
    486 * read, then release the resource.
    487 */
    488int one_qsfp_read(struct hfi1_pportdata *ppd, u32 target, int addr, void *bp,
    489		  int len)
    490{
    491	struct hfi1_devdata *dd = ppd->dd;
    492	u32 resource = qsfp_resource(dd);
    493	int ret;
    494
    495	ret = acquire_chip_resource(dd, resource, QSFP_WAIT);
    496	if (ret)
    497		return ret;
    498	ret = qsfp_read(ppd, target, addr, bp, len);
    499	release_chip_resource(dd, resource);
    500
    501	return ret;
    502}
    503
    504/*
    505 * This function caches the QSFP memory range in 128 byte chunks.
    506 * As an example, the next byte after address 255 is byte 128 from
    507 * upper page 01H (if existing) rather than byte 0 from lower page 00H.
    508 * Access page n, offset m of QSFP memory as defined by SFF 8636
    509 * in the cache by reading byte ((128 * n) + m)
    510 * The calls to qsfp_{read,write} in this function correctly handle the
    511 * address map difference between this mapping and the mapping implemented
    512 * by those functions
    513 *
    514 * The caller must be holding the QSFP i2c chain resource.
    515 */
    516int refresh_qsfp_cache(struct hfi1_pportdata *ppd, struct qsfp_data *cp)
    517{
    518	u32 target = ppd->dd->hfi1_id;
    519	int ret;
    520	unsigned long flags;
    521	u8 *cache = &cp->cache[0];
    522
    523	/* ensure sane contents on invalid reads, for cable swaps */
    524	memset(cache, 0, (QSFP_MAX_NUM_PAGES * 128));
    525	spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
    526	ppd->qsfp_info.cache_valid = 0;
    527	spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock, flags);
    528
    529	if (!qsfp_mod_present(ppd)) {
    530		ret = -ENODEV;
    531		goto bail;
    532	}
    533
    534	ret = qsfp_read(ppd, target, 0, cache, QSFP_PAGESIZE);
    535	if (ret != QSFP_PAGESIZE) {
    536		dd_dev_info(ppd->dd,
    537			    "%s: Page 0 read failed, expected %d, got %d\n",
    538			    __func__, QSFP_PAGESIZE, ret);
    539		goto bail;
    540	}
    541
    542	/* Is paging enabled? */
    543	if (!(cache[2] & 4)) {
    544		/* Paging enabled, page 03 required */
    545		if ((cache[195] & 0xC0) == 0xC0) {
    546			/* all */
    547			ret = qsfp_read(ppd, target, 384, cache + 256, 128);
    548			if (ret <= 0 || ret != 128) {
    549				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    550				goto bail;
    551			}
    552			ret = qsfp_read(ppd, target, 640, cache + 384, 128);
    553			if (ret <= 0 || ret != 128) {
    554				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    555				goto bail;
    556			}
    557			ret = qsfp_read(ppd, target, 896, cache + 512, 128);
    558			if (ret <= 0 || ret != 128) {
    559				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    560				goto bail;
    561			}
    562		} else if ((cache[195] & 0x80) == 0x80) {
    563			/* only page 2 and 3 */
    564			ret = qsfp_read(ppd, target, 640, cache + 384, 128);
    565			if (ret <= 0 || ret != 128) {
    566				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    567				goto bail;
    568			}
    569			ret = qsfp_read(ppd, target, 896, cache + 512, 128);
    570			if (ret <= 0 || ret != 128) {
    571				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    572				goto bail;
    573			}
    574		} else if ((cache[195] & 0x40) == 0x40) {
    575			/* only page 1 and 3 */
    576			ret = qsfp_read(ppd, target, 384, cache + 256, 128);
    577			if (ret <= 0 || ret != 128) {
    578				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    579				goto bail;
    580			}
    581			ret = qsfp_read(ppd, target, 896, cache + 512, 128);
    582			if (ret <= 0 || ret != 128) {
    583				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    584				goto bail;
    585			}
    586		} else {
    587			/* only page 3 */
    588			ret = qsfp_read(ppd, target, 896, cache + 512, 128);
    589			if (ret <= 0 || ret != 128) {
    590				dd_dev_info(ppd->dd, "%s failed\n", __func__);
    591				goto bail;
    592			}
    593		}
    594	}
    595
    596	spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
    597	ppd->qsfp_info.cache_valid = 1;
    598	ppd->qsfp_info.cache_refresh_required = 0;
    599	spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock, flags);
    600
    601	return 0;
    602
    603bail:
    604	memset(cache, 0, (QSFP_MAX_NUM_PAGES * 128));
    605	return ret;
    606}
    607
    608const char * const hfi1_qsfp_devtech[16] = {
    609	"850nm VCSEL", "1310nm VCSEL", "1550nm VCSEL", "1310nm FP",
    610	"1310nm DFB", "1550nm DFB", "1310nm EML", "1550nm EML",
    611	"Cu Misc", "1490nm DFB", "Cu NoEq", "Cu Eq",
    612	"Undef", "Cu Active BothEq", "Cu FarEq", "Cu NearEq"
    613};
    614
    615#define QSFP_DUMP_CHUNK 16 /* Holds longest string */
    616#define QSFP_DEFAULT_HDR_CNT 224
    617
    618#define QSFP_PWR(pbyte) (((pbyte) >> 6) & 3)
    619#define QSFP_HIGH_PWR(pbyte) ((pbyte) & 3)
    620/* For use with QSFP_HIGH_PWR macro */
    621#define QSFP_HIGH_PWR_UNUSED	0 /* Bits [1:0] = 00 implies low power module */
    622
    623/*
    624 * Takes power class byte [Page 00 Byte 129] in SFF 8636
    625 * Returns power class as integer (1 through 7, per SFF 8636 rev 2.4)
    626 */
    627int get_qsfp_power_class(u8 power_byte)
    628{
    629	if (QSFP_HIGH_PWR(power_byte) == QSFP_HIGH_PWR_UNUSED)
    630		/* power classes count from 1, their bit encodings from 0 */
    631		return (QSFP_PWR(power_byte) + 1);
    632	/*
    633	 * 00 in the high power classes stands for unused, bringing
    634	 * balance to the off-by-1 offset above, we add 4 here to
    635	 * account for the difference between the low and high power
    636	 * groups
    637	 */
    638	return (QSFP_HIGH_PWR(power_byte) + 4);
    639}
    640
    641int qsfp_mod_present(struct hfi1_pportdata *ppd)
    642{
    643	struct hfi1_devdata *dd = ppd->dd;
    644	u64 reg;
    645
    646	reg = read_csr(dd, dd->hfi1_id ? ASIC_QSFP2_IN : ASIC_QSFP1_IN);
    647	return !(reg & QSFP_HFI0_MODPRST_N);
    648}
    649
    650/*
    651 * This function maps QSFP memory addresses in 128 byte chunks in the following
    652 * fashion per the CableInfo SMA query definition in the IBA 1.3 spec/OPA Gen 1
    653 * spec
    654 * For addr 000-127, lower page 00h
    655 * For addr 128-255, upper page 00h
    656 * For addr 256-383, upper page 01h
    657 * For addr 384-511, upper page 02h
    658 * For addr 512-639, upper page 03h
    659 *
    660 * For addresses beyond this range, it returns the invalid range of data buffer
    661 * set to 0.
    662 * For upper pages that are optional, if they are not valid, returns the
    663 * particular range of bytes in the data buffer set to 0.
    664 */
    665int get_cable_info(struct hfi1_devdata *dd, u32 port_num, u32 addr, u32 len,
    666		   u8 *data)
    667{
    668	struct hfi1_pportdata *ppd;
    669	u32 excess_len = len;
    670	int ret = 0, offset = 0;
    671
    672	if (port_num > dd->num_pports || port_num < 1) {
    673		dd_dev_info(dd, "%s: Invalid port number %d\n",
    674			    __func__, port_num);
    675		ret = -EINVAL;
    676		goto set_zeroes;
    677	}
    678
    679	ppd = dd->pport + (port_num - 1);
    680	if (!qsfp_mod_present(ppd)) {
    681		ret = -ENODEV;
    682		goto set_zeroes;
    683	}
    684
    685	if (!ppd->qsfp_info.cache_valid) {
    686		ret = -EINVAL;
    687		goto set_zeroes;
    688	}
    689
    690	if (addr >= (QSFP_MAX_NUM_PAGES * 128)) {
    691		ret = -ERANGE;
    692		goto set_zeroes;
    693	}
    694
    695	if ((addr + len) > (QSFP_MAX_NUM_PAGES * 128)) {
    696		excess_len = (addr + len) - (QSFP_MAX_NUM_PAGES * 128);
    697		memcpy(data, &ppd->qsfp_info.cache[addr], (len - excess_len));
    698		data += (len - excess_len);
    699		goto set_zeroes;
    700	}
    701
    702	memcpy(data, &ppd->qsfp_info.cache[addr], len);
    703
    704	if (addr <= QSFP_MONITOR_VAL_END &&
    705	    (addr + len) >= QSFP_MONITOR_VAL_START) {
    706		/* Overlap with the dynamic channel monitor range */
    707		if (addr < QSFP_MONITOR_VAL_START) {
    708			if (addr + len <= QSFP_MONITOR_VAL_END)
    709				len = addr + len - QSFP_MONITOR_VAL_START;
    710			else
    711				len = QSFP_MONITOR_RANGE;
    712			offset = QSFP_MONITOR_VAL_START - addr;
    713			addr = QSFP_MONITOR_VAL_START;
    714		} else if (addr == QSFP_MONITOR_VAL_START) {
    715			offset = 0;
    716			if (addr + len > QSFP_MONITOR_VAL_END)
    717				len = QSFP_MONITOR_RANGE;
    718		} else {
    719			offset = 0;
    720			if (addr + len > QSFP_MONITOR_VAL_END)
    721				len = QSFP_MONITOR_VAL_END - addr + 1;
    722		}
    723		/* Refresh the values of the dynamic monitors from the cable */
    724		ret = one_qsfp_read(ppd, dd->hfi1_id, addr, data + offset, len);
    725		if (ret != len) {
    726			ret = -EAGAIN;
    727			goto set_zeroes;
    728		}
    729	}
    730
    731	return 0;
    732
    733set_zeroes:
    734	memset(data, 0, excess_len);
    735	return ret;
    736}
    737
    738static const char *pwr_codes[8] = {"N/AW",
    739				  "1.5W",
    740				  "2.0W",
    741				  "2.5W",
    742				  "3.5W",
    743				  "4.0W",
    744				  "4.5W",
    745				  "5.0W"
    746				 };
    747
    748int qsfp_dump(struct hfi1_pportdata *ppd, char *buf, int len)
    749{
    750	u8 *cache = &ppd->qsfp_info.cache[0];
    751	u8 bin_buff[QSFP_DUMP_CHUNK];
    752	char lenstr[6];
    753	int sofar;
    754	int bidx = 0;
    755	u8 *atten = &cache[QSFP_ATTEN_OFFS];
    756	u8 *vendor_oui = &cache[QSFP_VOUI_OFFS];
    757	u8 power_byte = 0;
    758
    759	sofar = 0;
    760	lenstr[0] = ' ';
    761	lenstr[1] = '\0';
    762
    763	if (ppd->qsfp_info.cache_valid) {
    764		if (QSFP_IS_CU(cache[QSFP_MOD_TECH_OFFS]))
    765			snprintf(lenstr, sizeof(lenstr), "%dM ",
    766				 cache[QSFP_MOD_LEN_OFFS]);
    767
    768		power_byte = cache[QSFP_MOD_PWR_OFFS];
    769		sofar += scnprintf(buf + sofar, len - sofar, "PWR:%.3sW\n",
    770				pwr_codes[get_qsfp_power_class(power_byte)]);
    771
    772		sofar += scnprintf(buf + sofar, len - sofar, "TECH:%s%s\n",
    773				lenstr,
    774			hfi1_qsfp_devtech[(cache[QSFP_MOD_TECH_OFFS]) >> 4]);
    775
    776		sofar += scnprintf(buf + sofar, len - sofar, "Vendor:%.*s\n",
    777				   QSFP_VEND_LEN, &cache[QSFP_VEND_OFFS]);
    778
    779		sofar += scnprintf(buf + sofar, len - sofar, "OUI:%06X\n",
    780				   QSFP_OUI(vendor_oui));
    781
    782		sofar += scnprintf(buf + sofar, len - sofar, "Part#:%.*s\n",
    783				   QSFP_PN_LEN, &cache[QSFP_PN_OFFS]);
    784
    785		sofar += scnprintf(buf + sofar, len - sofar, "Rev:%.*s\n",
    786				   QSFP_REV_LEN, &cache[QSFP_REV_OFFS]);
    787
    788		if (QSFP_IS_CU(cache[QSFP_MOD_TECH_OFFS]))
    789			sofar += scnprintf(buf + sofar, len - sofar,
    790				"Atten:%d, %d\n",
    791				QSFP_ATTEN_SDR(atten),
    792				QSFP_ATTEN_DDR(atten));
    793
    794		sofar += scnprintf(buf + sofar, len - sofar, "Serial:%.*s\n",
    795				   QSFP_SN_LEN, &cache[QSFP_SN_OFFS]);
    796
    797		sofar += scnprintf(buf + sofar, len - sofar, "Date:%.*s\n",
    798				   QSFP_DATE_LEN, &cache[QSFP_DATE_OFFS]);
    799
    800		sofar += scnprintf(buf + sofar, len - sofar, "Lot:%.*s\n",
    801				   QSFP_LOT_LEN, &cache[QSFP_LOT_OFFS]);
    802
    803		while (bidx < QSFP_DEFAULT_HDR_CNT) {
    804			int iidx;
    805
    806			memcpy(bin_buff, &cache[bidx], QSFP_DUMP_CHUNK);
    807			for (iidx = 0; iidx < QSFP_DUMP_CHUNK; ++iidx) {
    808				sofar += scnprintf(buf + sofar, len - sofar,
    809					" %02X", bin_buff[iidx]);
    810			}
    811			sofar += scnprintf(buf + sofar, len - sofar, "\n");
    812			bidx += QSFP_DUMP_CHUNK;
    813		}
    814	}
    815	return sofar;
    816}