forked from Minki/linux
d5e2d00898
Highlights: - Restructure Linux PTE on Book3S/64 to Radix format from Paul Mackerras - Book3s 64 MMU cleanup in preparation for Radix MMU from Aneesh Kumar K.V - Add POWER9 cputable entry from Michael Neuling - FPU/Altivec/VSX save/restore optimisations from Cyril Bur - Add support for new ftrace ABI on ppc64le from Torsten Duwe Various cleanups & minor fixes from: - Adam Buchbinder, Andrew Donnellan, Balbir Singh, Christophe Leroy, Cyril Bur, Luis Henriques, Madhavan Srinivasan, Pan Xinhui, Russell Currey, Sukadev Bhattiprolu, Suraj Jitindar Singh. General: - atomics: Allow architectures to define their own __atomic_op_* helpers from Boqun Feng - Implement atomic{, 64}_*_return_* variants and acquire/release/relaxed variants for (cmp)xchg from Boqun Feng - Add powernv_defconfig from Jeremy Kerr - Fix BUG_ON() reporting in real mode from Balbir Singh - Add xmon command to dump OPAL msglog from Andrew Donnellan - Add xmon command to dump process/task similar to ps(1) from Douglas Miller - Clean up memory hotplug failure paths from David Gibson pci/eeh: - Redesign SR-IOV on PowerNV to give absolute isolation between VFs from Wei Yang. - EEH Support for SRIOV VFs from Wei Yang and Gavin Shan. - PCI/IOV: Rename and export virtfn_{add, remove} from Wei Yang - PCI: Add pcibios_bus_add_device() weak function from Wei Yang - MAINTAINERS: Update EEH details and maintainership from Russell Currey cxl: - Support added to the CXL driver for running on both bare-metal and hypervisor systems, from Christophe Lombard and Frederic Barrat. - Ignore probes for virtual afu pci devices from Vaibhav Jain perf: - Export Power8 generic and cache events to sysfs from Sukadev Bhattiprolu - hv-24x7: Fix usage with chip events, display change in counter values, display domain indices in sysfs, eliminate domain suffix in event names, from Sukadev Bhattiprolu Freescale: - Updates from Scott: "Highlights include 8xx optimizations, 32-bit checksum optimizations, 86xx consolidation, e5500/e6500 cpu hotplug, more fman and other dt bits, and minor fixes/cleanup." -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJW69OrAAoJEFHr6jzI4aWAe5EQAJw/hE6WBQc6a7Tj70AnXOqR qk/m5pZjuTwQxfBteIvHR1pE5eXdlvtAjcD254LVkFkAbIn19W/h2k0VX/nlee7P n/VRHRifjtGmukqHrPYJJ7ua9mNlY7pxh3leGSixBFASnSWqMxNNNziNQtSTcuCs TjHiw6NkZ/kzeunA4bAfE4yHVUZjmL74oiS9JbLyaVHqoW4fqWLlh26AKo2yYMZI qPicBBG4HBi3FGvoexnKxlJNdcV4HO7LzDjJmCSfUKYCJi+Pw19T5qmhso0q0qVz vHg/A8HNeG4Hn83pNVmLeQSAIQRZ3DvTtcLgbjPo+TVwm/hzrRRBWipTeOVbkLW8 2bcOXT4t7LWUq15EAJ1LYgYZGzcLrfRfUeOcuQ1TWd3+PcfY9pE7FmizsxAAfaVe E9j9mpz4XnIqBtWkFHneTIHkQ5OWptyKuZJEaYH0nut4VsP0k8NarkseafGqBPu7 5eG83gbiQbCVixfOgblV9eocJ29JcwpjPAY4CZSGJimShg909FV7WRgZgJkKWrbK dBRco8Jcp4VglGfo2qymv7Uj4KwQoypBREOhiKUvrAsVlDxPfx+bcskhjGu9xGDC xs/+nme0/lKa/wg5K4C3mQ1GAlkMWHI0ojhJjsyODbetup5UbkEu03wjAaTdO9dT Y6ptGm0rYAJluPNlziFj =qkAt -----END PGP SIGNATURE----- Merge tag 'powerpc-4.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux Pull powerpc updates from Michael Ellerman: "This was delayed a day or two by some build-breakage on old toolchains which we've now fixed. There's two PCI commits both acked by Bjorn. There's one commit to mm/hugepage.c which is (co)authored by Kirill. Highlights: - Restructure Linux PTE on Book3S/64 to Radix format from Paul Mackerras - Book3s 64 MMU cleanup in preparation for Radix MMU from Aneesh Kumar K.V - Add POWER9 cputable entry from Michael Neuling - FPU/Altivec/VSX save/restore optimisations from Cyril Bur - Add support for new ftrace ABI on ppc64le from Torsten Duwe Various cleanups & minor fixes from: - Adam Buchbinder, Andrew Donnellan, Balbir Singh, Christophe Leroy, Cyril Bur, Luis Henriques, Madhavan Srinivasan, Pan Xinhui, Russell Currey, Sukadev Bhattiprolu, Suraj Jitindar Singh. General: - atomics: Allow architectures to define their own __atomic_op_* helpers from Boqun Feng - Implement atomic{, 64}_*_return_* variants and acquire/release/ relaxed variants for (cmp)xchg from Boqun Feng - Add powernv_defconfig from Jeremy Kerr - Fix BUG_ON() reporting in real mode from Balbir Singh - Add xmon command to dump OPAL msglog from Andrew Donnellan - Add xmon command to dump process/task similar to ps(1) from Douglas Miller - Clean up memory hotplug failure paths from David Gibson pci/eeh: - Redesign SR-IOV on PowerNV to give absolute isolation between VFs from Wei Yang. - EEH Support for SRIOV VFs from Wei Yang and Gavin Shan. - PCI/IOV: Rename and export virtfn_{add, remove} from Wei Yang - PCI: Add pcibios_bus_add_device() weak function from Wei Yang - MAINTAINERS: Update EEH details and maintainership from Russell Currey cxl: - Support added to the CXL driver for running on both bare-metal and hypervisor systems, from Christophe Lombard and Frederic Barrat. - Ignore probes for virtual afu pci devices from Vaibhav Jain perf: - Export Power8 generic and cache events to sysfs from Sukadev Bhattiprolu - hv-24x7: Fix usage with chip events, display change in counter values, display domain indices in sysfs, eliminate domain suffix in event names, from Sukadev Bhattiprolu Freescale: - Updates from Scott: "Highlights include 8xx optimizations, 32-bit checksum optimizations, 86xx consolidation, e5500/e6500 cpu hotplug, more fman and other dt bits, and minor fixes/cleanup" * tag 'powerpc-4.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (179 commits) powerpc: Fix unrecoverable SLB miss during restore_math() powerpc/8xx: Fix do_mtspr_cpu6() build on older compilers powerpc/rcpm: Fix build break when SMP=n powerpc/book3e-64: Use hardcoded mttmr opcode powerpc/fsl/dts: Add "jedec,spi-nor" flash compatible powerpc/T104xRDB: add tdm riser card node to device tree powerpc32: PAGE_EXEC required for inittext powerpc/mpc85xx: Add pcsphy nodes to FManV3 device tree powerpc/mpc85xx: Add MDIO bus muxing support to the board device tree(s) powerpc/86xx: Introduce and use common dtsi powerpc/86xx: Update device tree powerpc/86xx: Move dts files to fsl directory powerpc/86xx: Switch to kconfig fragments approach powerpc/86xx: Update defconfigs powerpc/86xx: Consolidate common platform code powerpc32: Remove one insn in mulhdu powerpc32: small optimisation in flush_icache_range() powerpc: Simplify test in __dma_sync() powerpc32: move xxxxx_dcache_range() functions inline powerpc32: Remove clear_pages() and define clear_page() inline ...
208 lines
5.4 KiB
C
208 lines
5.4 KiB
C
/*
|
|
* 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_COMMON_H
|
|
#define _CXLFLASH_COMMON_H
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/rwsem.h>
|
|
#include <linux/types.h>
|
|
#include <scsi/scsi.h>
|
|
#include <scsi/scsi_device.h>
|
|
|
|
extern const struct file_operations cxlflash_cxl_fops;
|
|
|
|
#define MAX_CONTEXT CXLFLASH_MAX_CONTEXT /* num contexts per afu */
|
|
|
|
#define CXLFLASH_BLOCK_SIZE 4096 /* 4K blocks */
|
|
#define CXLFLASH_MAX_XFER_SIZE 16777216 /* 16MB transfer */
|
|
#define CXLFLASH_MAX_SECTORS (CXLFLASH_MAX_XFER_SIZE/512) /* SCSI wants
|
|
max_sectors
|
|
in units of
|
|
512 byte
|
|
sectors
|
|
*/
|
|
|
|
#define MAX_RHT_PER_CONTEXT (PAGE_SIZE / sizeof(struct sisl_rht_entry))
|
|
|
|
/* AFU command retry limit */
|
|
#define MC_RETRY_CNT 5 /* sufficient for SCSI check and
|
|
certain AFU errors */
|
|
|
|
/* Command management definitions */
|
|
#define CXLFLASH_NUM_CMDS (2 * CXLFLASH_MAX_CMDS) /* Must be a pow2 for
|
|
alignment and more
|
|
efficient array
|
|
index derivation
|
|
*/
|
|
|
|
#define CXLFLASH_MAX_CMDS 256
|
|
#define CXLFLASH_MAX_CMDS_PER_LUN CXLFLASH_MAX_CMDS
|
|
|
|
/* RRQ for master issued cmds */
|
|
#define NUM_RRQ_ENTRY CXLFLASH_MAX_CMDS
|
|
|
|
|
|
static inline void check_sizes(void)
|
|
{
|
|
BUILD_BUG_ON_NOT_POWER_OF_2(CXLFLASH_NUM_CMDS);
|
|
}
|
|
|
|
/* AFU defines a fixed size of 4K for command buffers (borrow 4K page define) */
|
|
#define CMD_BUFSIZE SIZE_4K
|
|
|
|
/* flags in IOA status area for host use */
|
|
#define B_DONE 0x01
|
|
#define B_ERROR 0x02 /* set with B_DONE */
|
|
#define B_TIMEOUT 0x04 /* set with B_DONE & B_ERROR */
|
|
|
|
enum cxlflash_lr_state {
|
|
LINK_RESET_INVALID,
|
|
LINK_RESET_REQUIRED,
|
|
LINK_RESET_COMPLETE
|
|
};
|
|
|
|
enum cxlflash_init_state {
|
|
INIT_STATE_NONE,
|
|
INIT_STATE_PCI,
|
|
INIT_STATE_AFU,
|
|
INIT_STATE_SCSI
|
|
};
|
|
|
|
enum cxlflash_state {
|
|
STATE_NORMAL, /* Normal running state, everything good */
|
|
STATE_RESET, /* Reset state, trying to reset/recover */
|
|
STATE_FAILTERM /* Failed/terminating state, error out users/threads */
|
|
};
|
|
|
|
/*
|
|
* Each context has its own set of resource handles that is visible
|
|
* only from that context.
|
|
*/
|
|
|
|
struct cxlflash_cfg {
|
|
struct afu *afu;
|
|
struct cxl_context *mcctx;
|
|
|
|
struct pci_dev *dev;
|
|
struct pci_device_id *dev_id;
|
|
struct Scsi_Host *host;
|
|
|
|
ulong cxlflash_regs_pci;
|
|
|
|
struct work_struct work_q;
|
|
enum cxlflash_init_state init_state;
|
|
enum cxlflash_lr_state lr_state;
|
|
int lr_port;
|
|
atomic_t scan_host_needed;
|
|
|
|
struct cxl_afu *cxl_afu;
|
|
|
|
atomic_t recovery_threads;
|
|
struct mutex ctx_recovery_mutex;
|
|
struct mutex ctx_tbl_list_mutex;
|
|
struct rw_semaphore ioctl_rwsem;
|
|
struct ctx_info *ctx_tbl[MAX_CONTEXT];
|
|
struct list_head ctx_err_recovery; /* contexts w/ recovery pending */
|
|
struct file_operations cxl_fops;
|
|
|
|
/* Parameters that are LUN table related */
|
|
int last_lun_index[CXLFLASH_NUM_FC_PORTS];
|
|
int promote_lun_index;
|
|
struct list_head lluns; /* list of llun_info structs */
|
|
|
|
wait_queue_head_t tmf_waitq;
|
|
spinlock_t tmf_slock;
|
|
bool tmf_active;
|
|
wait_queue_head_t reset_waitq;
|
|
enum cxlflash_state state;
|
|
};
|
|
|
|
struct afu_cmd {
|
|
struct sisl_ioarcb rcb; /* IOARCB (cache line aligned) */
|
|
struct sisl_ioasa sa; /* IOASA must follow IOARCB */
|
|
spinlock_t slock;
|
|
struct completion cevent;
|
|
char *buf; /* per command buffer */
|
|
struct afu *parent;
|
|
int slot;
|
|
atomic_t free;
|
|
|
|
u8 cmd_tmf:1;
|
|
|
|
/* As per the SISLITE spec the IOARCB EA has to be 16-byte aligned.
|
|
* However for performance reasons the IOARCB/IOASA should be
|
|
* cache line aligned.
|
|
*/
|
|
} __aligned(cache_line_size());
|
|
|
|
struct afu {
|
|
/* Stuff requiring alignment go first. */
|
|
|
|
u64 rrq_entry[NUM_RRQ_ENTRY]; /* 2K RRQ */
|
|
/*
|
|
* Command & data for AFU commands.
|
|
*/
|
|
struct afu_cmd cmd[CXLFLASH_NUM_CMDS];
|
|
|
|
/* Beware of alignment till here. Preferably introduce new
|
|
* fields after this point
|
|
*/
|
|
|
|
/* AFU HW */
|
|
struct cxl_ioctl_start_work work;
|
|
struct cxlflash_afu_map __iomem *afu_map; /* entire MMIO map */
|
|
struct sisl_host_map __iomem *host_map; /* MC host map */
|
|
struct sisl_ctrl_map __iomem *ctrl_map; /* MC control map */
|
|
|
|
struct kref mapcount;
|
|
|
|
ctx_hndl_t ctx_hndl; /* master's context handle */
|
|
u64 *hrrq_start;
|
|
u64 *hrrq_end;
|
|
u64 *hrrq_curr;
|
|
bool toggle;
|
|
bool read_room;
|
|
atomic64_t room;
|
|
u64 hb;
|
|
u32 cmd_couts; /* Number of command checkouts */
|
|
u32 internal_lun; /* User-desired LUN mode for this AFU */
|
|
|
|
char version[16];
|
|
u64 interface_version;
|
|
|
|
struct cxlflash_cfg *parent; /* Pointer back to parent cxlflash_cfg */
|
|
|
|
};
|
|
|
|
static inline u64 lun_to_lunid(u64 lun)
|
|
{
|
|
__be64 lun_id;
|
|
|
|
int_to_scsilun(lun, (struct scsi_lun *)&lun_id);
|
|
return be64_to_cpu(lun_id);
|
|
}
|
|
|
|
int cxlflash_afu_sync(struct afu *, ctx_hndl_t, res_hndl_t, u8);
|
|
void cxlflash_list_init(void);
|
|
void cxlflash_term_global_luns(void);
|
|
void cxlflash_free_errpage(void);
|
|
int cxlflash_ioctl(struct scsi_device *, int, void __user *);
|
|
void cxlflash_stop_term_user_contexts(struct cxlflash_cfg *);
|
|
int cxlflash_mark_contexts_error(struct cxlflash_cfg *);
|
|
void cxlflash_term_local_luns(struct cxlflash_cfg *);
|
|
void cxlflash_restore_luntable(struct cxlflash_cfg *);
|
|
|
|
#endif /* ifndef _CXLFLASH_COMMON_H */
|