drivers/cxl/core/port.c

Source file repositories/reference/linux-study-clean/drivers/cxl/core/port.c

File Facts

System
Linux kernel
Corpus path
drivers/cxl/core/port.c
Extension
.c
Size
64687 bytes
Lines
2566
Domain
Driver Families
Bucket
drivers/cxl
Inferred role
Driver Families: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

static int cxl_bus_match(struct device *dev, const struct device_driver *drv)
{
	return cxl_device_id(dev) == to_cxl_drv(drv)->id;
}

static int cxl_bus_probe(struct device *dev)
{
	int rc;

	rc = to_cxl_drv(dev->driver)->probe(dev);
	dev_dbg(dev, "probe: %d\n", rc);
	return rc;
}

static void cxl_bus_remove(struct device *dev)
{
	struct cxl_driver *cxl_drv = to_cxl_drv(dev->driver);

	if (cxl_drv->remove)
		cxl_drv->remove(dev);
}

static struct workqueue_struct *cxl_bus_wq;

static int cxl_rescan_attach(struct device *dev, void *data)
{
	int rc = device_attach(dev);

	dev_vdbg(dev, "rescan: %s\n", rc ? "attach" : "detached");

	return 0;
}

static void cxl_bus_rescan_queue(struct work_struct *w)
{
	bus_for_each_dev(&cxl_bus_type, NULL, NULL, cxl_rescan_attach);
}

void cxl_bus_rescan(void)
{
	static DECLARE_WORK(rescan_work, cxl_bus_rescan_queue);

	queue_work(cxl_bus_wq, &rescan_work);
}
EXPORT_SYMBOL_NS_GPL(cxl_bus_rescan, "CXL");

void cxl_bus_drain(void)
{
	drain_workqueue(cxl_bus_wq);
}
EXPORT_SYMBOL_NS_GPL(cxl_bus_drain, "CXL");

bool schedule_cxl_memdev_detach(struct cxl_memdev *cxlmd)
{
	return queue_work(cxl_bus_wq, &cxlmd->detach_work);
}
EXPORT_SYMBOL_NS_GPL(schedule_cxl_memdev_detach, "CXL");

static void add_latency(struct access_coordinate *c, long latency)
{
	for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) {
		c[i].write_latency += latency;
		c[i].read_latency += latency;
	}
}

static bool coordinates_valid(struct access_coordinate *c)
{
	for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) {
		if (c[i].read_bandwidth && c[i].write_bandwidth &&
		    c[i].read_latency && c[i].write_latency)
			continue;
		return false;
	}

	return true;
}

static void set_min_bandwidth(struct access_coordinate *c, unsigned int bw)
{
	for (int i = 0; i < ACCESS_COORDINATE_MAX; i++) {
		c[i].write_bandwidth = min(c[i].write_bandwidth, bw);
		c[i].read_bandwidth = min(c[i].read_bandwidth, bw);
	}
}

static void set_access_coordinates(struct access_coordinate *out,
				   struct access_coordinate *in)
{
	for (int i = 0; i < ACCESS_COORDINATE_MAX; i++)

Annotation

Implementation Notes