Lines Matching refs:pdev
38 static inline bool is_dsm(struct pci_dev *pdev) in is_dsm() argument
40 return pdev->tsm && pdev->tsm->dsm_dev == pdev; in is_dsm()
43 static inline bool has_tee(struct pci_dev *pdev) in has_tee() argument
45 return pdev->devcap & PCI_EXP_DEVCAP_TEE; in has_tee()
59 pci_WARN_ONCE(tsm->pdev, 1, "invalid context object\n"); in to_pci_tsm_pf0()
68 struct pci_dev *pdev; in tsm_remove() local
73 pdev = tsm->pdev; in tsm_remove()
75 pdev->tsm = NULL; in tsm_remove()
79 static void pci_tsm_walk_fns(struct pci_dev *pdev, in DEFINE_FREE()
80 int (*cb)(struct pci_dev *pdev, void *data), in DEFINE_FREE()
86 pdev->bus, PCI_DEVFN(PCI_SLOT(pdev->devfn), i)); in DEFINE_FREE()
114 if (pci_pcie_type(pdev) == PCI_EXP_TYPE_UPSTREAM && is_dsm(pdev)) in DEFINE_FREE()
115 pci_walk_bus(pdev->subordinate, cb, data); in DEFINE_FREE()
118 static void pci_tsm_walk_fns_reverse(struct pci_dev *pdev, in pci_tsm_walk_fns_reverse() argument
119 int (*cb)(struct pci_dev *pdev, in pci_tsm_walk_fns_reverse() argument
124 if (pci_pcie_type(pdev) == PCI_EXP_TYPE_UPSTREAM && is_dsm(pdev)) in pci_tsm_walk_fns_reverse()
125 pci_walk_bus_reverse(pdev->subordinate, cb, data); in pci_tsm_walk_fns_reverse()
130 pdev->bus, PCI_DEVFN(PCI_SLOT(pdev->devfn), i)); in pci_tsm_walk_fns_reverse()
154 static void link_sysfs_disable(struct pci_dev *pdev) in link_sysfs_disable() argument
156 sysfs_update_group(&pdev->dev.kobj, &pci_tsm_auth_attr_group); in link_sysfs_disable()
157 sysfs_update_group(&pdev->dev.kobj, &pci_tsm_attr_group); in link_sysfs_disable()
160 static void link_sysfs_enable(struct pci_dev *pdev) in link_sysfs_enable() argument
162 bool tee = has_tee(pdev); in link_sysfs_enable()
164 pci_dbg(pdev, "%s Security Manager detected (%s%s%s)\n", in link_sysfs_enable()
165 pdev->tsm ? "Device" : "Platform TEE", in link_sysfs_enable()
166 pdev->ide_cap ? "IDE" : "", pdev->ide_cap && tee ? " " : "", in link_sysfs_enable()
169 sysfs_update_group(&pdev->dev.kobj, &pci_tsm_auth_attr_group); in link_sysfs_enable()
170 sysfs_update_group(&pdev->dev.kobj, &pci_tsm_attr_group); in link_sysfs_enable()
173 static int probe_fn(struct pci_dev *pdev, void *dsm) in probe_fn() argument
178 pdev->tsm = ops->probe(dsm_dev->tsm->tsm_dev, pdev); in probe_fn()
179 pci_dbg(pdev, "setup TSM context: DSM: %s status: %s\n", in probe_fn()
180 pci_name(dsm_dev), pdev->tsm ? "success" : "failed"); in probe_fn()
181 if (pdev->tsm) in probe_fn()
182 link_sysfs_enable(pdev); in probe_fn()
186 static int pci_tsm_connect(struct pci_dev *pdev, struct tsm_dev *tsm_dev) in pci_tsm_connect() argument
191 struct pci_tsm *pci_tsm __free(tsm_remove) = ops->probe(tsm_dev, pdev); in pci_tsm_connect()
199 pdev->tsm = pci_tsm; in pci_tsm_connect()
200 tsm_pf0 = to_pci_tsm_pf0(pdev->tsm); in pci_tsm_connect()
207 rc = ops->connect(pdev); in pci_tsm_connect()
211 pdev->tsm = no_free_ptr(pci_tsm); in pci_tsm_connect()
225 if (has_tee(pdev)) in pci_tsm_connect()
226 pci_tsm_walk_fns(pdev, probe_fn, pdev); in pci_tsm_connect()
233 struct pci_dev *pdev = to_pci_dev(dev); in connect_show() local
241 if (!pdev->tsm) in connect_show()
244 tsm_dev = pdev->tsm->tsm_dev; in connect_show()
263 struct pci_dev *pdev = to_pci_dev(dev); in connect_store() local
274 if (pdev->tsm) in connect_store()
281 rc = pci_tsm_connect(pdev, tsm_dev); in connect_store()
288 static int remove_fn(struct pci_dev *pdev, void *data) in remove_fn() argument
290 tsm_remove(pdev->tsm); in remove_fn()
291 link_sysfs_disable(pdev); in remove_fn()
300 static int __pci_tsm_unbind(struct pci_dev *pdev, void *data) in __pci_tsm_unbind() argument
307 if (!pdev->tsm) in __pci_tsm_unbind()
310 tsm_pf0 = to_pci_tsm_pf0(pdev->tsm); in __pci_tsm_unbind()
313 tdi = pdev->tsm->tdi; in __pci_tsm_unbind()
317 to_pci_tsm_ops(pdev->tsm)->unbind(tdi); in __pci_tsm_unbind()
318 pdev->tsm->tdi = NULL; in __pci_tsm_unbind()
323 void pci_tsm_unbind(struct pci_dev *pdev) in pci_tsm_unbind() argument
326 __pci_tsm_unbind(pdev, NULL); in pci_tsm_unbind()
342 int pci_tsm_bind(struct pci_dev *pdev, struct kvm *kvm, u32 tdi_id) in pci_tsm_bind() argument
352 if (!pdev->tsm) in pci_tsm_bind()
355 if (!is_link_tsm(pdev->tsm->tsm_dev)) in pci_tsm_bind()
358 tsm_pf0 = to_pci_tsm_pf0(pdev->tsm); in pci_tsm_bind()
362 if (pdev->tsm->tdi) { in pci_tsm_bind()
363 if (pdev->tsm->tdi->kvm != kvm) in pci_tsm_bind()
368 tdi = to_pci_tsm_ops(pdev->tsm)->bind(pdev, kvm, tdi_id); in pci_tsm_bind()
372 pdev->tsm->tdi = tdi; in pci_tsm_bind()
403 ssize_t pci_tsm_guest_req(struct pci_dev *pdev, enum pci_tsm_req_scope scope, in pci_tsm_guest_req() argument
419 if (!pdev->tsm) in pci_tsm_guest_req()
422 if (!is_link_tsm(pdev->tsm->tsm_dev)) in pci_tsm_guest_req()
425 tsm_pf0 = to_pci_tsm_pf0(pdev->tsm); in pci_tsm_guest_req()
430 tdi = pdev->tsm->tdi; in pci_tsm_guest_req()
433 return to_pci_tsm_ops(pdev->tsm)->guest_req(tdi, scope, req_in, in_len, in pci_tsm_guest_req()
438 static void pci_tsm_unbind_all(struct pci_dev *pdev) in pci_tsm_unbind_all() argument
440 pci_tsm_walk_fns_reverse(pdev, __pci_tsm_unbind, NULL); in pci_tsm_unbind_all()
441 __pci_tsm_unbind(pdev, NULL); in pci_tsm_unbind_all()
444 static void __pci_tsm_disconnect(struct pci_dev *pdev) in __pci_tsm_disconnect() argument
446 struct pci_tsm_pf0 *tsm_pf0 = to_pci_tsm_pf0(pdev->tsm); in __pci_tsm_disconnect()
447 const struct pci_tsm_ops *ops = to_pci_tsm_ops(pdev->tsm); in __pci_tsm_disconnect()
452 pci_tsm_unbind_all(pdev); in __pci_tsm_disconnect()
459 pci_tsm_walk_fns_reverse(pdev, remove_fn, NULL); in __pci_tsm_disconnect()
460 ops->disconnect(pdev); in __pci_tsm_disconnect()
463 static void pci_tsm_disconnect(struct pci_dev *pdev) in pci_tsm_disconnect() argument
465 __pci_tsm_disconnect(pdev); in pci_tsm_disconnect()
466 tsm_remove(pdev->tsm); in pci_tsm_disconnect()
473 struct pci_dev *pdev = to_pci_dev(dev); in disconnect_store() local
481 if (!pdev->tsm) in disconnect_store()
484 tsm_dev = pdev->tsm->tsm_dev; in disconnect_store()
488 pci_tsm_disconnect(pdev); in disconnect_store()
496 struct pci_dev *pdev = to_pci_dev(dev); in bound_show() local
505 tsm = pdev->tsm; in bound_show()
523 struct pci_dev *pdev = to_pci_dev(dev); in dsm_show() local
531 tsm = pdev->tsm; in dsm_show()
542 struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj)); in pci_tsm_link_group_visible() local
547 if (!pci_is_pcie(pdev)) in pci_tsm_link_group_visible()
550 if (is_pci_tsm_pf0(pdev)) in pci_tsm_link_group_visible()
557 if (pdev->tsm) in pci_tsm_link_group_visible()
572 struct pci_dev *pdev = to_pci_dev(kobj_to_dev(kobj)); in pci_tsm_attr_visible() local
575 if (is_pci_tsm_pf0(pdev) && has_tee(pdev)) in pci_tsm_attr_visible()
577 if (pdev->tsm && has_tee(pdev->tsm->dsm_dev)) in pci_tsm_attr_visible()
582 if (is_pci_tsm_pf0(pdev)) in pci_tsm_attr_visible()
584 if (pdev->tsm && has_tee(pdev->tsm->dsm_dev)) in pci_tsm_attr_visible()
590 if (is_pci_tsm_pf0(pdev)) in pci_tsm_attr_visible()
642 static struct pci_dev *pf0_dev_get(struct pci_dev *pdev) in pf0_dev_get() argument
644 struct pci_dev *pf_dev = pci_physfn(pdev); in pf0_dev_get()
660 static struct pci_dev *find_dsm_dev(struct pci_dev *pdev) in find_dsm_dev() argument
665 if (is_pci_tsm_pf0(pdev)) in find_dsm_dev()
666 return pdev; in find_dsm_dev()
668 struct pci_dev *pf0 __free(pci_dev_put) = pf0_dev_get(pdev); in find_dsm_dev()
680 if (!pdev->dev.parent) in find_dsm_dev()
682 grandparent = pdev->dev.parent->parent; in find_dsm_dev()
704 void pci_tsm_tdi_constructor(struct pci_dev *pdev, struct pci_tdi *tdi, in pci_tsm_tdi_constructor() argument
707 tdi->pdev = pdev; in pci_tsm_tdi_constructor()
719 int pci_tsm_link_constructor(struct pci_dev *pdev, struct pci_tsm *tsm, in pci_tsm_link_constructor() argument
725 tsm->dsm_dev = find_dsm_dev(pdev); in pci_tsm_link_constructor()
727 pci_warn(pdev, "failed to find Device Security Manager\n"); in pci_tsm_link_constructor()
730 tsm->pdev = pdev; in pci_tsm_link_constructor()
743 int pci_tsm_pf0_constructor(struct pci_dev *pdev, struct pci_tsm_pf0 *tsm, in pci_tsm_pf0_constructor() argument
747 tsm->doe_mb = pci_find_doe_mailbox(pdev, PCI_VENDOR_ID_PCI_SIG, in pci_tsm_pf0_constructor()
750 pci_warn(pdev, "TSM init failure, no CMA mailbox\n"); in pci_tsm_pf0_constructor()
754 return pci_tsm_link_constructor(pdev, &tsm->base_tsm, tsm_dev); in pci_tsm_pf0_constructor()
766 struct pci_dev *pdev = NULL; in pci_tsm_register() local
782 for_each_pci_dev(pdev) in pci_tsm_register()
783 if (is_pci_tsm_pf0(pdev)) in pci_tsm_register()
784 link_sysfs_enable(pdev); in pci_tsm_register()
792 static void pci_tsm_fn_exit(struct pci_dev *pdev) in pci_tsm_fn_exit() argument
794 __pci_tsm_unbind(pdev, NULL); in pci_tsm_fn_exit()
795 tsm_remove(pdev->tsm); in pci_tsm_fn_exit()
807 static void __pci_tsm_destroy(struct pci_dev *pdev, struct tsm_dev *tsm_dev) in __pci_tsm_destroy() argument
809 struct pci_tsm *tsm = pdev->tsm; in __pci_tsm_destroy()
818 if (is_link_tsm(tsm_dev) && is_pci_tsm_pf0(pdev) && !pci_tsm_link_count) in __pci_tsm_destroy()
819 link_sysfs_disable(pdev); in __pci_tsm_destroy()
831 if (is_link_tsm(tsm_dev) && is_pci_tsm_pf0(pdev)) in __pci_tsm_destroy()
832 pci_tsm_disconnect(pdev); in __pci_tsm_destroy()
834 pci_tsm_fn_exit(pdev); in __pci_tsm_destroy()
837 void pci_tsm_destroy(struct pci_dev *pdev) in pci_tsm_destroy() argument
840 __pci_tsm_destroy(pdev, NULL); in pci_tsm_destroy()
843 void pci_tsm_init(struct pci_dev *pdev) in pci_tsm_init() argument
852 if (pdev->tsm) in pci_tsm_init()
856 struct pci_dev *dsm = find_dsm_dev(pdev); in pci_tsm_init()
868 probe_fn(pdev, dsm); in pci_tsm_init()
874 struct pci_dev *pdev = NULL; in pci_tsm_unregister() local
881 for_each_pci_dev_reverse(pdev) in pci_tsm_unregister()
882 __pci_tsm_destroy(pdev, tsm_dev); in pci_tsm_unregister()
885 int pci_tsm_doe_transfer(struct pci_dev *pdev, u8 type, const void *req, in pci_tsm_doe_transfer() argument
890 if (!pdev->tsm || !is_pci_tsm_pf0(pdev)) in pci_tsm_doe_transfer()
893 tsm = to_pci_tsm_pf0(pdev->tsm); in pci_tsm_doe_transfer()