tsm_dev
static struct pci_tsm *dsm_probe(struct tsm_dev *tsmdev, struct pci_dev *pdev)
struct tsm_dev *tsmdev;
struct tsm_dev *tsmdev;
pdev->tsm = ops->probe(dsm_dev->tsm->tsm_dev, pdev);
static int pci_tsm_connect(struct pci_dev *pdev, struct tsm_dev *tsm_dev)
const struct pci_tsm_ops *ops = tsm_dev->pci_ops;
struct pci_tsm *pci_tsm __free(tsm_remove) = ops->probe(tsm_dev, pdev);
struct tsm_dev *tsm_dev;
tsm_dev = pdev->tsm->tsm_dev;
return sysfs_emit(buf, "%s\n", dev_name(&tsm_dev->dev));
static bool is_link_tsm(struct tsm_dev *tsm_dev)
return tsm_dev && tsm_dev->pci_ops && tsm_dev->pci_ops->link_ops.probe;
static bool is_devsec_tsm(struct tsm_dev *tsm_dev)
return tsm_dev && tsm_dev->pci_ops && tsm_dev->pci_ops->devsec_ops.lock;
struct tsm_dev *tsm_dev __free(put_tsm_dev) = find_tsm_dev(id);
if (!is_link_tsm(tsm_dev))
rc = pci_tsm_connect(pdev, tsm_dev);
return tsm->tsm_dev->pci_ops;
if (!is_link_tsm(pdev->tsm->tsm_dev))
if (!is_link_tsm(pdev->tsm->tsm_dev))
struct tsm_dev *tsm_dev;
tsm_dev = pdev->tsm->tsm_dev;
if (!sysfs_streq(buf, dev_name(&tsm_dev->dev)))
return sysfs_emit(buf, "%s\n", dev_name(&tsm->tsm_dev->dev));
struct tsm_dev *tsm_dev)
if (!is_link_tsm(tsm_dev))
tsm->tsm_dev = tsm_dev;
struct tsm_dev *tsm_dev)
return pci_tsm_link_constructor(pdev, &tsm->base_tsm, tsm_dev);
int pci_tsm_register(struct tsm_dev *tsm_dev)
if (!tsm_dev)
if (!is_link_tsm(tsm_dev) && !is_devsec_tsm(tsm_dev))
if (is_link_tsm(tsm_dev) && is_devsec_tsm(tsm_dev))
if (is_link_tsm(tsm_dev) && pci_tsm_link_count++ == 0) {
} else if (is_devsec_tsm(tsm_dev)) {
static void __pci_tsm_destroy(struct pci_dev *pdev, struct tsm_dev *tsm_dev)
if (is_link_tsm(tsm_dev) && is_pci_tsm_pf0(pdev) && !pci_tsm_link_count)
if (!tsm_dev)
tsm_dev = tsm->tsm_dev;
else if (tsm_dev != tsm->tsm_dev)
if (is_link_tsm(tsm_dev) && is_pci_tsm_pf0(pdev))
void pci_tsm_unregister(struct tsm_dev *tsm_dev)
if (is_link_tsm(tsm_dev))
if (is_devsec_tsm(tsm_dev))
__pci_tsm_destroy(pdev, tsm_dev);
if (tsm_dev->pci_ops)
pci_tsm_unregister(tsm_dev);
device_unregister(&tsm_dev->dev);
struct tsm_dev *tsm_dev = container_of(dev, typeof(*tsm_dev), dev);
ida_free(&tsm_ida, tsm_dev->id);
kfree(tsm_dev);
struct tsm_dev *tsm_dev = container_of(dev, struct tsm_dev, dev);
return tsm_dev->id == id;
struct tsm_dev *find_tsm_dev(int id)
return container_of(dev, struct tsm_dev, dev);
static struct tsm_dev *alloc_tsm_dev(struct device *parent)
struct tsm_dev *tsm_dev __free(kfree) =
kzalloc_obj(*tsm_dev);
if (!tsm_dev)
tsm_dev->id = id;
dev = &tsm_dev->dev;
return no_free_ptr(tsm_dev);
static struct tsm_dev *tsm_register_pci_or_reset(struct tsm_dev *tsm_dev,
return tsm_dev;
tsm_dev->pci_ops = pci_ops;
rc = pci_tsm_register(tsm_dev);
dev_err(tsm_dev->dev.parent,
device_unregister(&tsm_dev->dev);
kobject_uevent(&tsm_dev->dev.kobj, KOBJ_CHANGE);
return tsm_dev;
struct tsm_dev *tsm_register(struct device *parent, struct pci_tsm_ops *pci_ops)
struct tsm_dev *tsm_dev __free(put_tsm_dev) = alloc_tsm_dev(parent);
if (IS_ERR(tsm_dev))
return tsm_dev;
dev = &tsm_dev->dev;
rc = dev_set_name(dev, "tsm%d", tsm_dev->id);
return tsm_register_pci_or_reset(no_free_ptr(tsm_dev), pci_ops);
void tsm_unregister(struct tsm_dev *tsm_dev)
struct tsm_dev *tsm_dev;
int pci_tsm_register(struct tsm_dev *tsm_dev);
void pci_tsm_unregister(struct tsm_dev *tsm_dev);
struct tsm_dev *tsm_dev);
struct tsm_dev *tsm_dev);
static inline int pci_tsm_register(struct tsm_dev *tsm_dev)
static inline void pci_tsm_unregister(struct tsm_dev *tsm_dev)
struct pci_tsm *(*probe)(struct tsm_dev *tsm_dev,
struct pci_tsm *(*lock)(struct tsm_dev *tsm_dev,
struct tsm_dev;
DEFINE_FREE(put_tsm_dev, struct tsm_dev *,
struct tsm_dev *tsm_register(struct device *parent, struct pci_tsm_ops *ops);
void tsm_unregister(struct tsm_dev *tsm_dev);
struct tsm_dev *find_tsm_dev(int id);