2015-06-10 06:15:52 +08:00
|
|
|
/*
|
|
|
|
* CXL Flash Device Driver
|
|
|
|
*
|
|
|
|
* Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
|
|
|
|
* Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
|
|
|
|
*
|
|
|
|
* Copyright (C) 2015 IBM Corporation
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version
|
|
|
|
* 2 of the License, or (at your option) any later version.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _CXLFLASH_MAIN_H
|
|
|
|
#define _CXLFLASH_MAIN_H
|
|
|
|
|
|
|
|
#include <linux/list.h>
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <scsi/scsi.h>
|
|
|
|
#include <scsi/scsi_device.h>
|
|
|
|
|
2018-05-12 03:06:05 +08:00
|
|
|
#include "backend.h"
|
|
|
|
|
2015-06-10 06:15:52 +08:00
|
|
|
#define CXLFLASH_NAME "cxlflash"
|
|
|
|
#define CXLFLASH_ADAPTER_NAME "IBM POWER CXL Flash Adapter"
|
2017-06-22 10:15:18 +08:00
|
|
|
#define CXLFLASH_MAX_ADAPTERS 32
|
2015-06-10 06:15:52 +08:00
|
|
|
|
2015-12-15 05:07:43 +08:00
|
|
|
#define PCI_DEVICE_ID_IBM_CORSA 0x04F0
|
|
|
|
#define PCI_DEVICE_ID_IBM_FLASH_GT 0x0600
|
2017-02-17 11:39:32 +08:00
|
|
|
#define PCI_DEVICE_ID_IBM_BRIARD 0x0624
|
2015-06-10 06:15:52 +08:00
|
|
|
|
|
|
|
/* Since there is only one target, make it 0 */
|
|
|
|
#define CXLFLASH_TARGET 0
|
|
|
|
#define CXLFLASH_MAX_CDB_LEN 16
|
|
|
|
|
|
|
|
/* Really only one target per bus since the Texan is directly attached */
|
|
|
|
#define CXLFLASH_MAX_NUM_TARGETS_PER_BUS 1
|
|
|
|
#define CXLFLASH_MAX_NUM_LUNS_PER_TARGET 65536
|
|
|
|
|
|
|
|
#define CXLFLASH_PCI_ERROR_RECOVERY_TIMEOUT (120 * HZ)
|
|
|
|
|
|
|
|
/* FC defines */
|
|
|
|
#define FC_MTIP_CMDCONFIG 0x010
|
|
|
|
#define FC_MTIP_STATUS 0x018
|
2017-06-22 10:16:13 +08:00
|
|
|
#define FC_MAX_NUM_LUNS 0x080 /* Max LUNs host can provision for port */
|
|
|
|
#define FC_CUR_NUM_LUNS 0x088 /* Cur number LUNs provisioned for port */
|
|
|
|
#define FC_MAX_CAP_PORT 0x090 /* Max capacity all LUNs for port (4K blocks) */
|
|
|
|
#define FC_CUR_CAP_PORT 0x098 /* Cur capacity all LUNs for port (4K blocks) */
|
2015-06-10 06:15:52 +08:00
|
|
|
|
|
|
|
#define FC_PNAME 0x300
|
|
|
|
#define FC_CONFIG 0x320
|
|
|
|
#define FC_CONFIG2 0x328
|
|
|
|
#define FC_STATUS 0x330
|
|
|
|
#define FC_ERROR 0x380
|
|
|
|
#define FC_ERRCAP 0x388
|
|
|
|
#define FC_ERRMSK 0x390
|
|
|
|
#define FC_CNT_CRCERR 0x538
|
|
|
|
#define FC_CRC_THRESH 0x580
|
|
|
|
|
|
|
|
#define FC_MTIP_CMDCONFIG_ONLINE 0x20ULL
|
|
|
|
#define FC_MTIP_CMDCONFIG_OFFLINE 0x40ULL
|
|
|
|
|
|
|
|
#define FC_MTIP_STATUS_MASK 0x30ULL
|
|
|
|
#define FC_MTIP_STATUS_ONLINE 0x20ULL
|
|
|
|
#define FC_MTIP_STATUS_OFFLINE 0x10ULL
|
|
|
|
|
|
|
|
/* TIMEOUT and RETRY definitions */
|
|
|
|
|
|
|
|
/* AFU command timeout values */
|
|
|
|
#define MC_AFU_SYNC_TIMEOUT 5 /* 5 secs */
|
2017-06-22 10:16:13 +08:00
|
|
|
#define MC_LUN_PROV_TIMEOUT 5 /* 5 secs */
|
2017-06-22 10:16:22 +08:00
|
|
|
#define MC_AFU_DEBUG_TIMEOUT 5 /* 5 secs */
|
2015-06-10 06:15:52 +08:00
|
|
|
|
|
|
|
/* AFU command room retry limit */
|
|
|
|
#define MC_ROOM_RETRY_CNT 10
|
|
|
|
|
|
|
|
/* FC CRC clear periodic timer */
|
|
|
|
#define MC_CRC_THRESH 100 /* threshold in 5 mins */
|
|
|
|
|
|
|
|
#define FC_PORT_STATUS_RETRY_CNT 100 /* 100 100ms retries = 10 seconds */
|
|
|
|
#define FC_PORT_STATUS_RETRY_INTERVAL_US 100000 /* microseconds */
|
|
|
|
|
|
|
|
/* VPD defines */
|
|
|
|
#define CXLFLASH_VPD_LEN 256
|
|
|
|
#define WWPN_LEN 16
|
|
|
|
#define WWPN_BUF_LEN (WWPN_LEN + 1)
|
|
|
|
|
|
|
|
enum undo_level {
|
2016-03-26 03:26:34 +08:00
|
|
|
UNDO_NOOP = 0,
|
2015-06-10 06:15:52 +08:00
|
|
|
FREE_IRQ,
|
|
|
|
UNMAP_ONE,
|
|
|
|
UNMAP_TWO,
|
2016-03-26 03:26:34 +08:00
|
|
|
UNMAP_THREE
|
2015-06-10 06:15:52 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct dev_dependent_vals {
|
|
|
|
u64 max_sectors;
|
2016-06-16 07:49:38 +08:00
|
|
|
u64 flags;
|
2017-10-26 05:36:20 +08:00
|
|
|
#define CXLFLASH_NOTIFY_SHUTDOWN 0x0000000000000001ULL
|
|
|
|
#define CXLFLASH_WWPN_VPD_REQUIRED 0x0000000000000002ULL
|
2018-03-27 00:35:21 +08:00
|
|
|
#define CXLFLASH_OCXL_DEV 0x0000000000000004ULL
|
2015-06-10 06:15:52 +08:00
|
|
|
};
|
|
|
|
|
2018-05-12 03:06:05 +08:00
|
|
|
static inline const struct cxlflash_backend_ops *
|
|
|
|
cxlflash_assign_ops(struct dev_dependent_vals *ddv)
|
|
|
|
{
|
|
|
|
const struct cxlflash_backend_ops *ops = NULL;
|
|
|
|
|
2018-07-05 13:26:23 +08:00
|
|
|
#ifdef CONFIG_OCXL_BASE
|
2018-05-12 03:06:05 +08:00
|
|
|
if (ddv->flags & CXLFLASH_OCXL_DEV)
|
|
|
|
ops = &cxlflash_ocxl_ops;
|
2018-05-12 03:06:19 +08:00
|
|
|
#endif
|
|
|
|
|
2018-07-05 13:26:23 +08:00
|
|
|
#ifdef CONFIG_CXL_BASE
|
2018-05-12 03:06:05 +08:00
|
|
|
if (!(ddv->flags & CXLFLASH_OCXL_DEV))
|
|
|
|
ops = &cxlflash_cxl_ops;
|
2018-05-12 03:06:19 +08:00
|
|
|
#endif
|
2018-05-12 03:06:05 +08:00
|
|
|
|
|
|
|
return ops;
|
|
|
|
}
|
|
|
|
|
2015-06-10 06:15:52 +08:00
|
|
|
struct asyc_intr_info {
|
|
|
|
u64 status;
|
|
|
|
char *desc;
|
|
|
|
u8 port;
|
|
|
|
u8 action;
|
|
|
|
#define CLR_FC_ERROR 0x01
|
|
|
|
#define LINK_RESET 0x02
|
2015-10-22 04:13:37 +08:00
|
|
|
#define SCAN_HOST 0x04
|
2015-06-10 06:15:52 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif /* _CXLFLASH_MAIN_H */
|