if (dev) {
rc = dca_pci_rc_from_dev(dev);
domain = dca_find_domain(rc); if (!domain) return NULL;
} else { if (!list_empty(&dca_domains))
domain = list_first_entry(&dca_domains, struct dca_domain,
node); else return NULL;
}
list_for_each_entry(dca, &domain->dca_providers, node) if ((!dev) || (dca->ops->dev_managed(dca, dev))) return dca;
return NULL;
}
/** * dca_add_requester - add a dca client to the list * @dev - the device that wants dca service
*/ int dca_add_requester(struct device *dev)
{ struct dca_provider *dca; int err, slot = -ENODEV; unsignedlong flags; struct pci_bus *pci_rc; struct dca_domain *domain;
if (!dev) return -EFAULT;
raw_spin_lock_irqsave(&dca_lock, flags);
/* check if the requester has not been added already */
dca = dca_find_provider_by_dev(dev); if (dca) {
raw_spin_unlock_irqrestore(&dca_lock, flags); return -EEXIST;
}
/** * dca_remove_requester - remove a dca client from the list * @dev - the device that wants dca service
*/ int dca_remove_requester(struct device *dev)
{ struct dca_provider *dca; int slot; unsignedlong flags;
/** * dca_common_get_tag - return the dca tag (serves both new and old api) * @dev - the device that wants dca service * @cpu - the cpuid as returned by get_cpu()
*/ static u8 dca_common_get_tag(struct device *dev, int cpu)
{ struct dca_provider *dca;
u8 tag; unsignedlong flags;
raw_spin_lock_irqsave(&dca_lock, flags);
dca = dca_find_provider_by_dev(dev); if (!dca) {
raw_spin_unlock_irqrestore(&dca_lock, flags); return -ENODEV;
}
tag = dca->ops->get_tag(dca, dev, cpu);
/** * dca3_get_tag - return the dca tag to the requester device * for the given cpu (new api) * @dev - the device that wants dca service * @cpu - the cpuid as returned by get_cpu()
*/
u8 dca3_get_tag(struct device *dev, int cpu)
{ if (!dev) return -EFAULT;
/** * dca_get_tag - return the dca tag for the given cpu (old api) * @cpu - the cpuid as returned by get_cpu()
*/
u8 dca_get_tag(int cpu)
{ return dca_common_get_tag(NULL, cpu);
}
EXPORT_SYMBOL_GPL(dca_get_tag);
/** * alloc_dca_provider - get data struct for describing a dca provider * @ops - pointer to struct of dca operation function pointers * @priv_size - size of extra mem to be added for provider's needs
*/ struct dca_provider *alloc_dca_provider(conststruct dca_ops *ops, int priv_size)
{ struct dca_provider *dca; int alloc_size;
/** * free_dca_provider - release the dca provider data struct * @ops - pointer to struct of dca operation function pointers * @priv_size - size of extra mem to be added for provider's needs
*/ void free_dca_provider(struct dca_provider *dca)
{
kfree(dca);
}
EXPORT_SYMBOL_GPL(free_dca_provider);
/** * register_dca_provider - register a dca provider * @dca - struct created by alloc_dca_provider() * @dev - device providing dca services
*/ int register_dca_provider(struct dca_provider *dca, struct device *dev)
{ int err; unsignedlong flags; struct dca_domain *domain, *newdomain = NULL;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.