On Fri, 5 Nov 2021 16:50:55 -0700 <ira.weiny@xxxxxxxxx> wrote: > From: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > > Read CDAT raw table data from the cxl_mem state object. Currently this > is only supported by a PCI CXL object through a DOE mailbox which supports > CDAT. But any cxl_mem type object can provide this data later if need > be. For example for testing. > > Cache this data for later parsing. Provide a sysfs binary attribute to > allow dumping of the CDAT. > > Binary dumping is modeled on /sys/firmware/ACPI/tables/ > > The ability to dump this table will be very useful for emulation of real > devices once they become available as QEMU CXL type 3 device emulation will > be able to load this file in. > > This does not support table updates at runtime. It will always provide > whatever was there when first cached. Handling of table updates can be > implemented later. > > Once there are more users, this code can move out to driver/cxl/cdat.c > or similar. > > Finally create a complete list of DOE defines within cdat.h for anyone > wishing to decode the CDAT table. > > Co-developed-by: Ira Weiny <ira.weiny@xxxxxxxxx> > Signed-off-by: Ira Weiny <ira.weiny@xxxxxxxxx> > Signed-off-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> > > > static struct attribute_group cxl_memdev_ram_attribute_group = { > @@ -293,6 +329,16 @@ devm_cxl_add_memdev(struct cxl_dev_state *cxlds) > if (rc) > goto err; > > + /* Cache the data early to ensure is_visible() works */ > + if (!cxl_mem_cdat_get_length(cxlds, &cxlmd->cdat_length)) { > + cxlmd->cdat_table = devm_kzalloc(dev, cxlmd->cdat_length, GFP_KERNEL); I think this devm_ call should be using the parent device, not this one. As it stands it breaks Ben's mem.c driver which probes for this device and fails because you can't call probe for a device that already has things in it's devres queue. Too many patches in flight at the same time makes for some entertaining rebases if you want them all at once.. Jonathan > + if (!cxlmd->cdat_table) { > + rc = -ENOMEM; > + goto err; > + } > + cxl_mem_cdat_read_table(cxlds, cxlmd->cdat_table, cxlmd->cdat_length); > + } > + > /* > * Activate ioctl operations, no cxl_memdev_rwsem manipulation > * needed as this is ordered with cdev_add() publishing the device.