162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * CXL Flash Device Driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation 662306a36Sopenharmony_ci * Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 2015 IBM Corporation 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef _CXLFLASH_MAIN_H 1262306a36Sopenharmony_ci#define _CXLFLASH_MAIN_H 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/list.h> 1562306a36Sopenharmony_ci#include <linux/types.h> 1662306a36Sopenharmony_ci#include <scsi/scsi.h> 1762306a36Sopenharmony_ci#include <scsi/scsi_device.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#include "backend.h" 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define CXLFLASH_NAME "cxlflash" 2262306a36Sopenharmony_ci#define CXLFLASH_ADAPTER_NAME "IBM POWER CXL Flash Adapter" 2362306a36Sopenharmony_ci#define CXLFLASH_MAX_ADAPTERS 32 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define PCI_DEVICE_ID_IBM_CORSA 0x04F0 2662306a36Sopenharmony_ci#define PCI_DEVICE_ID_IBM_FLASH_GT 0x0600 2762306a36Sopenharmony_ci#define PCI_DEVICE_ID_IBM_BRIARD 0x0624 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci/* Since there is only one target, make it 0 */ 3062306a36Sopenharmony_ci#define CXLFLASH_TARGET 0 3162306a36Sopenharmony_ci#define CXLFLASH_MAX_CDB_LEN 16 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci/* Really only one target per bus since the Texan is directly attached */ 3462306a36Sopenharmony_ci#define CXLFLASH_MAX_NUM_TARGETS_PER_BUS 1 3562306a36Sopenharmony_ci#define CXLFLASH_MAX_NUM_LUNS_PER_TARGET 65536 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#define CXLFLASH_PCI_ERROR_RECOVERY_TIMEOUT (120 * HZ) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* FC defines */ 4062306a36Sopenharmony_ci#define FC_MTIP_CMDCONFIG 0x010 4162306a36Sopenharmony_ci#define FC_MTIP_STATUS 0x018 4262306a36Sopenharmony_ci#define FC_MAX_NUM_LUNS 0x080 /* Max LUNs host can provision for port */ 4362306a36Sopenharmony_ci#define FC_CUR_NUM_LUNS 0x088 /* Cur number LUNs provisioned for port */ 4462306a36Sopenharmony_ci#define FC_MAX_CAP_PORT 0x090 /* Max capacity all LUNs for port (4K blocks) */ 4562306a36Sopenharmony_ci#define FC_CUR_CAP_PORT 0x098 /* Cur capacity all LUNs for port (4K blocks) */ 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#define FC_PNAME 0x300 4862306a36Sopenharmony_ci#define FC_CONFIG 0x320 4962306a36Sopenharmony_ci#define FC_CONFIG2 0x328 5062306a36Sopenharmony_ci#define FC_STATUS 0x330 5162306a36Sopenharmony_ci#define FC_ERROR 0x380 5262306a36Sopenharmony_ci#define FC_ERRCAP 0x388 5362306a36Sopenharmony_ci#define FC_ERRMSK 0x390 5462306a36Sopenharmony_ci#define FC_CNT_CRCERR 0x538 5562306a36Sopenharmony_ci#define FC_CRC_THRESH 0x580 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#define FC_MTIP_CMDCONFIG_ONLINE 0x20ULL 5862306a36Sopenharmony_ci#define FC_MTIP_CMDCONFIG_OFFLINE 0x40ULL 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci#define FC_MTIP_STATUS_MASK 0x30ULL 6162306a36Sopenharmony_ci#define FC_MTIP_STATUS_ONLINE 0x20ULL 6262306a36Sopenharmony_ci#define FC_MTIP_STATUS_OFFLINE 0x10ULL 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* TIMEOUT and RETRY definitions */ 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* AFU command timeout values */ 6762306a36Sopenharmony_ci#define MC_AFU_SYNC_TIMEOUT 5 /* 5 secs */ 6862306a36Sopenharmony_ci#define MC_LUN_PROV_TIMEOUT 5 /* 5 secs */ 6962306a36Sopenharmony_ci#define MC_AFU_DEBUG_TIMEOUT 5 /* 5 secs */ 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* AFU command room retry limit */ 7262306a36Sopenharmony_ci#define MC_ROOM_RETRY_CNT 10 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* FC CRC clear periodic timer */ 7562306a36Sopenharmony_ci#define MC_CRC_THRESH 100 /* threshold in 5 mins */ 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci#define FC_PORT_STATUS_RETRY_CNT 100 /* 100 100ms retries = 10 seconds */ 7862306a36Sopenharmony_ci#define FC_PORT_STATUS_RETRY_INTERVAL_US 100000 /* microseconds */ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci/* VPD defines */ 8162306a36Sopenharmony_ci#define CXLFLASH_VPD_LEN 256 8262306a36Sopenharmony_ci#define WWPN_LEN 16 8362306a36Sopenharmony_ci#define WWPN_BUF_LEN (WWPN_LEN + 1) 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cienum undo_level { 8662306a36Sopenharmony_ci UNDO_NOOP = 0, 8762306a36Sopenharmony_ci FREE_IRQ, 8862306a36Sopenharmony_ci UNMAP_ONE, 8962306a36Sopenharmony_ci UNMAP_TWO, 9062306a36Sopenharmony_ci UNMAP_THREE 9162306a36Sopenharmony_ci}; 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistruct dev_dependent_vals { 9462306a36Sopenharmony_ci u64 max_sectors; 9562306a36Sopenharmony_ci u64 flags; 9662306a36Sopenharmony_ci#define CXLFLASH_NOTIFY_SHUTDOWN 0x0000000000000001ULL 9762306a36Sopenharmony_ci#define CXLFLASH_WWPN_VPD_REQUIRED 0x0000000000000002ULL 9862306a36Sopenharmony_ci#define CXLFLASH_OCXL_DEV 0x0000000000000004ULL 9962306a36Sopenharmony_ci}; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic inline const struct cxlflash_backend_ops * 10262306a36Sopenharmony_cicxlflash_assign_ops(struct dev_dependent_vals *ddv) 10362306a36Sopenharmony_ci{ 10462306a36Sopenharmony_ci const struct cxlflash_backend_ops *ops = NULL; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci#ifdef CONFIG_OCXL_BASE 10762306a36Sopenharmony_ci if (ddv->flags & CXLFLASH_OCXL_DEV) 10862306a36Sopenharmony_ci ops = &cxlflash_ocxl_ops; 10962306a36Sopenharmony_ci#endif 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci#ifdef CONFIG_CXL_BASE 11262306a36Sopenharmony_ci if (!(ddv->flags & CXLFLASH_OCXL_DEV)) 11362306a36Sopenharmony_ci ops = &cxlflash_cxl_ops; 11462306a36Sopenharmony_ci#endif 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci return ops; 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistruct asyc_intr_info { 12062306a36Sopenharmony_ci u64 status; 12162306a36Sopenharmony_ci char *desc; 12262306a36Sopenharmony_ci u8 port; 12362306a36Sopenharmony_ci u8 action; 12462306a36Sopenharmony_ci#define CLR_FC_ERROR 0x01 12562306a36Sopenharmony_ci#define LINK_RESET 0x02 12662306a36Sopenharmony_ci#define SCAN_HOST 0x04 12762306a36Sopenharmony_ci}; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci#endif /* _CXLFLASH_MAIN_H */ 130