mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 12:44:03 +02:00
Merge branch 'for-7.3/cxl-type2-support' into cxl-for-next
Remaining cxl/core type2 support cxl: Support dpa without a mailbox cxl: Support Type2 cxl regs mapping
This commit is contained in:
commit
898f5f4fcd
|
|
@ -101,6 +101,8 @@ void __iomem *devm_cxl_iomap_block(struct device *dev, resource_size_t addr,
|
|||
struct dentry *cxl_debugfs_create_dir(const char *dir);
|
||||
int cxl_dpa_set_part(struct cxl_endpoint_decoder *cxled,
|
||||
enum cxl_partition_mode mode);
|
||||
struct cxl_memdev_state;
|
||||
int cxl_mem_get_partition_info(struct cxl_memdev_state *mds);
|
||||
int cxl_dpa_alloc(struct cxl_endpoint_decoder *cxled, u64 size);
|
||||
int cxl_dpa_free(struct cxl_endpoint_decoder *cxled);
|
||||
resource_size_t cxl_dpa_size(struct cxl_endpoint_decoder *cxled);
|
||||
|
|
|
|||
|
|
@ -1152,7 +1152,7 @@ EXPORT_SYMBOL_NS_GPL(cxl_mem_get_event_records, "CXL");
|
|||
*
|
||||
* See CXL @8.2.9.5.2.1 Get Partition Info
|
||||
*/
|
||||
static int cxl_mem_get_partition_info(struct cxl_memdev_state *mds)
|
||||
int cxl_mem_get_partition_info(struct cxl_memdev_state *mds)
|
||||
{
|
||||
struct cxl_mailbox *cxl_mbox = &mds->cxlds.cxl_mbox;
|
||||
struct cxl_mbox_get_partition_info pi;
|
||||
|
|
@ -1308,55 +1308,6 @@ int cxl_mem_sanitize(struct cxl_memdev *cxlmd, u16 cmd)
|
|||
return -EBUSY;
|
||||
}
|
||||
|
||||
static void add_part(struct cxl_dpa_info *info, u64 start, u64 size, enum cxl_partition_mode mode)
|
||||
{
|
||||
int i = info->nr_partitions;
|
||||
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
info->part[i].range = (struct range) {
|
||||
.start = start,
|
||||
.end = start + size - 1,
|
||||
};
|
||||
info->part[i].mode = mode;
|
||||
info->nr_partitions++;
|
||||
}
|
||||
|
||||
int cxl_mem_dpa_fetch(struct cxl_memdev_state *mds, struct cxl_dpa_info *info)
|
||||
{
|
||||
struct cxl_dev_state *cxlds = &mds->cxlds;
|
||||
struct device *dev = cxlds->dev;
|
||||
int rc;
|
||||
|
||||
if (!cxlds->media_ready) {
|
||||
info->size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
info->size = mds->total_bytes;
|
||||
|
||||
if (mds->partition_align_bytes == 0) {
|
||||
add_part(info, 0, mds->volatile_only_bytes, CXL_PARTMODE_RAM);
|
||||
add_part(info, mds->volatile_only_bytes,
|
||||
mds->persistent_only_bytes, CXL_PARTMODE_PMEM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rc = cxl_mem_get_partition_info(mds);
|
||||
if (rc) {
|
||||
dev_err(dev, "Failed to query partition information\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
add_part(info, 0, mds->active_volatile_bytes, CXL_PARTMODE_RAM);
|
||||
add_part(info, mds->active_volatile_bytes, mds->active_persistent_bytes,
|
||||
CXL_PARTMODE_PMEM);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_mem_dpa_fetch, "CXL");
|
||||
|
||||
int cxl_get_dirty_count(struct cxl_memdev_state *mds, u32 *count)
|
||||
{
|
||||
struct cxl_mailbox *cxl_mbox = &mds->cxlds.cxl_mbox;
|
||||
|
|
|
|||
|
|
@ -594,6 +594,73 @@ bool is_cxl_memdev(const struct device *dev)
|
|||
}
|
||||
EXPORT_SYMBOL_NS_GPL(is_cxl_memdev, "CXL");
|
||||
|
||||
static void add_part(struct cxl_dpa_info *info, u64 start, u64 size, enum cxl_partition_mode mode)
|
||||
{
|
||||
int i = info->nr_partitions;
|
||||
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
info->part[i].range = (struct range) {
|
||||
.start = start,
|
||||
.end = start + size - 1,
|
||||
};
|
||||
info->part[i].mode = mode;
|
||||
info->nr_partitions++;
|
||||
}
|
||||
|
||||
int cxl_mem_dpa_fetch(struct cxl_memdev_state *mds, struct cxl_dpa_info *info)
|
||||
{
|
||||
struct cxl_dev_state *cxlds = &mds->cxlds;
|
||||
struct device *dev = cxlds->dev;
|
||||
int rc;
|
||||
|
||||
if (!cxlds->media_ready) {
|
||||
info->size = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
info->size = mds->total_bytes;
|
||||
|
||||
if (mds->partition_align_bytes == 0) {
|
||||
add_part(info, 0, mds->volatile_only_bytes, CXL_PARTMODE_RAM);
|
||||
add_part(info, mds->volatile_only_bytes,
|
||||
mds->persistent_only_bytes, CXL_PARTMODE_PMEM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
rc = cxl_mem_get_partition_info(mds);
|
||||
if (rc) {
|
||||
dev_err(dev, "Failed to query partition information\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
add_part(info, 0, mds->active_volatile_bytes, CXL_PARTMODE_RAM);
|
||||
add_part(info, mds->active_volatile_bytes, mds->active_persistent_bytes,
|
||||
CXL_PARTMODE_PMEM);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_mem_dpa_fetch, "CXL");
|
||||
|
||||
|
||||
/**
|
||||
* cxl_set_capacity: initialize dpa by a driver without a mailbox.
|
||||
*
|
||||
* @cxlds: pointer to cxl_dev_state
|
||||
* @capacity: device volatile memory size
|
||||
*/
|
||||
int cxl_set_capacity(struct cxl_dev_state *cxlds, u64 capacity)
|
||||
{
|
||||
struct cxl_dpa_info range_info = {
|
||||
.size = capacity,
|
||||
};
|
||||
|
||||
add_part(&range_info, 0, capacity, CXL_PARTMODE_RAM);
|
||||
return cxl_dpa_setup(cxlds, &range_info);
|
||||
}
|
||||
EXPORT_SYMBOL_NS_GPL(cxl_set_capacity, "CXL");
|
||||
|
||||
/**
|
||||
* set_exclusive_cxl_commands() - atomically disable user cxl commands
|
||||
* @mds: The device state to operate on
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci-doe.h>
|
||||
#include <cxl/pci.h>
|
||||
#include <linux/aer.h>
|
||||
#include <cxlpci.h>
|
||||
#include <cxlmem.h>
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/idr.h>
|
||||
#include <linux/node.h>
|
||||
#include <cxl/einj.h>
|
||||
#include <cxl/pci.h>
|
||||
#include <cxlmem.h>
|
||||
#include <cxlpci.h>
|
||||
#include <cxl.h>
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
#include <linux/device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pci.h>
|
||||
#include <cxl/pci.h>
|
||||
#include <cxlmem.h>
|
||||
#include <cxlpci.h>
|
||||
#include <pmu.h>
|
||||
|
|
|
|||
|
|
@ -13,16 +13,6 @@
|
|||
*/
|
||||
#define CXL_PCI_DEFAULT_MAX_VECTORS 16
|
||||
|
||||
/* Register Block Identifier (RBI) */
|
||||
enum cxl_regloc_type {
|
||||
CXL_REGLOC_RBI_EMPTY = 0,
|
||||
CXL_REGLOC_RBI_COMPONENT,
|
||||
CXL_REGLOC_RBI_VIRT,
|
||||
CXL_REGLOC_RBI_MEMDEV,
|
||||
CXL_REGLOC_RBI_PMU,
|
||||
CXL_REGLOC_RBI_TYPES
|
||||
};
|
||||
|
||||
/*
|
||||
* Table Access DOE, CDAT Read Entry Response
|
||||
*
|
||||
|
|
@ -112,6 +102,4 @@ static inline void devm_cxl_port_ras_setup(struct cxl_port *port)
|
|||
}
|
||||
#endif
|
||||
|
||||
int cxl_pci_setup_regs(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map);
|
||||
#endif /* __CXL_PCI_H__ */
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@
|
|||
#include <linux/pci.h>
|
||||
#include <linux/aer.h>
|
||||
#include <linux/io.h>
|
||||
#include <cxl/pci.h>
|
||||
#include <cxl/mailbox.h>
|
||||
#include "cxlmem.h"
|
||||
#include "cxlpci.h"
|
||||
|
|
|
|||
|
|
@ -226,4 +226,6 @@ struct cxl_dev_state *_devm_cxl_dev_state_create(struct device *dev,
|
|||
|
||||
struct cxl_memdev *devm_cxl_probe_mem(struct cxl_dev_state *cxlds,
|
||||
struct range *range);
|
||||
|
||||
int cxl_set_capacity(struct cxl_dev_state *cxlds, u64 capacity);
|
||||
#endif /* __CXL_CXL_H__ */
|
||||
|
|
|
|||
22
include/cxl/pci.h
Normal file
22
include/cxl/pci.h
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright(c) 2020 Intel Corporation. All rights reserved. */
|
||||
|
||||
#ifndef __CXL_CXL_PCI_H__
|
||||
#define __CXL_CXL_PCI_H__
|
||||
|
||||
/* Register Block Identifier (RBI) */
|
||||
enum cxl_regloc_type {
|
||||
CXL_REGLOC_RBI_EMPTY = 0,
|
||||
CXL_REGLOC_RBI_COMPONENT,
|
||||
CXL_REGLOC_RBI_VIRT,
|
||||
CXL_REGLOC_RBI_MEMDEV,
|
||||
CXL_REGLOC_RBI_PMU,
|
||||
CXL_REGLOC_RBI_TYPES
|
||||
};
|
||||
|
||||
struct cxl_register_map;
|
||||
struct pci_dev;
|
||||
|
||||
int cxl_pci_setup_regs(struct pci_dev *pdev, enum cxl_regloc_type type,
|
||||
struct cxl_register_map *map);
|
||||
#endif
|
||||
Loading…
Reference in New Issue
Block a user