2021-02-16 20:09:51 -08:00
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright(c) 2020 Intel Corporation. */
# ifndef __CXL_H__
# define __CXL_H__
# include <linux/bitfield.h>
# include <linux/bitops.h>
# include <linux/io.h>
/* CXL 2.0 8.2.8.1 Device Capabilities Array Register */
# define CXLDEV_CAP_ARRAY_OFFSET 0x0
# define CXLDEV_CAP_ARRAY_CAP_ID 0
# define CXLDEV_CAP_ARRAY_ID_MASK GENMASK_ULL(15, 0)
# define CXLDEV_CAP_ARRAY_COUNT_MASK GENMASK_ULL(47, 32)
/* CXL 2.0 8.2.8.2 CXL Device Capability Header Register */
# define CXLDEV_CAP_HDR_CAP_ID_MASK GENMASK(15, 0)
/* CXL 2.0 8.2.8.2.1 CXL Device Capabilities */
# define CXLDEV_CAP_CAP_ID_DEVICE_STATUS 0x1
# define CXLDEV_CAP_CAP_ID_PRIMARY_MAILBOX 0x2
# define CXLDEV_CAP_CAP_ID_SECONDARY_MAILBOX 0x3
# define CXLDEV_CAP_CAP_ID_MEMDEV 0x4000
/* CXL 2.0 8.2.8.4 Mailbox Registers */
# define CXLDEV_MBOX_CAPS_OFFSET 0x00
# define CXLDEV_MBOX_CAP_PAYLOAD_SIZE_MASK GENMASK(4, 0)
# define CXLDEV_MBOX_CTRL_OFFSET 0x04
# define CXLDEV_MBOX_CTRL_DOORBELL BIT(0)
# define CXLDEV_MBOX_CMD_OFFSET 0x08
# define CXLDEV_MBOX_CMD_COMMAND_OPCODE_MASK GENMASK_ULL(15, 0)
# define CXLDEV_MBOX_CMD_PAYLOAD_LENGTH_MASK GENMASK_ULL(36, 16)
# define CXLDEV_MBOX_STATUS_OFFSET 0x10
# define CXLDEV_MBOX_STATUS_RET_CODE_MASK GENMASK_ULL(47, 32)
# define CXLDEV_MBOX_BG_CMD_STATUS_OFFSET 0x18
# define CXLDEV_MBOX_PAYLOAD_OFFSET 0x20
/* CXL 2.0 8.2.8.5.1.1 Memory Device Status Register */
# define CXLMDEV_STATUS_OFFSET 0x0
# define CXLMDEV_DEV_FATAL BIT(0)
# define CXLMDEV_FW_HALT BIT(1)
# define CXLMDEV_STATUS_MEDIA_STATUS_MASK GENMASK(3, 2)
# define CXLMDEV_MS_NOT_READY 0
# define CXLMDEV_MS_READY 1
# define CXLMDEV_MS_ERROR 2
# define CXLMDEV_MS_DISABLED 3
# define CXLMDEV_READY(status) \
( FIELD_GET ( CXLMDEV_STATUS_MEDIA_STATUS_MASK , status ) = = \
CXLMDEV_MS_READY )
# define CXLMDEV_MBOX_IF_READY BIT(4)
# define CXLMDEV_RESET_NEEDED_MASK GENMASK(7, 5)
# define CXLMDEV_RESET_NEEDED_NOT 0
# define CXLMDEV_RESET_NEEDED_COLD 1
# define CXLMDEV_RESET_NEEDED_WARM 2
# define CXLMDEV_RESET_NEEDED_HOT 3
# define CXLMDEV_RESET_NEEDED_CXL 4
# define CXLMDEV_RESET_NEEDED(status) \
( FIELD_GET ( CXLMDEV_RESET_NEEDED_MASK , status ) ! = \
CXLMDEV_RESET_NEEDED_NOT )
2021-02-16 20:09:52 -08:00
struct cxl_memdev ;
2021-02-16 20:09:51 -08:00
/**
* struct cxl_mem - A CXL memory device
* @ pdev : The PCI device associated with this CXL device .
* @ regs : IO mappings to the device ' s MMIO
* @ status_regs : CXL 2.0 8.2 .8 .3 Device Status Registers
* @ mbox_regs : CXL 2.0 8.2 .8 .4 Mailbox Registers
* @ memdev_regs : CXL 2.0 8.2 .8 .5 Memory Device Registers
* @ payload_size : Size of space for payload
* ( CXL 2.0 8.2 .8 .4 .3 Mailbox Capabilities Register )
* @ mbox_mutex : Mutex to synchronize mailbox access .
* @ firmware_version : Firmware version for the memory device .
2021-02-16 20:09:55 -08:00
* @ enabled_commands : Hardware commands found enabled in CEL .
2021-02-16 20:09:51 -08:00
* @ pmem_range : Persistent memory capacity information .
* @ ram_range : Volatile memory capacity information .
*/
struct cxl_mem {
struct pci_dev * pdev ;
void __iomem * regs ;
2021-02-16 20:09:52 -08:00
struct cxl_memdev * cxlmd ;
2021-02-16 20:09:51 -08:00
void __iomem * status_regs ;
void __iomem * mbox_regs ;
void __iomem * memdev_regs ;
size_t payload_size ;
struct mutex mbox_mutex ; /* Protects device mailbox and firmware */
char firmware_version [ 0x10 ] ;
2021-02-16 20:09:55 -08:00
unsigned long * enabled_cmds ;
2021-02-16 20:09:51 -08:00
struct range pmem_range ;
struct range ram_range ;
} ;
2021-02-16 20:09:52 -08:00
extern struct bus_type cxl_bus_type ;
2021-02-16 20:09:51 -08:00
# endif /* __CXL_H__ */