xref: /linux-6.15/include/linux/dca.h (revision 2bb129eb)
1e2fc4d19SMaciej Sosnowski /*
2e2fc4d19SMaciej Sosnowski  * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
3e2fc4d19SMaciej Sosnowski  *
4e2fc4d19SMaciej Sosnowski  * This program is free software; you can redistribute it and/or modify it
5e2fc4d19SMaciej Sosnowski  * under the terms of the GNU General Public License as published by the Free
6e2fc4d19SMaciej Sosnowski  * Software Foundation; either version 2 of the License, or (at your option)
7e2fc4d19SMaciej Sosnowski  * any later version.
8e2fc4d19SMaciej Sosnowski  *
9e2fc4d19SMaciej Sosnowski  * This program is distributed in the hope that it will be useful, but WITHOUT
10e2fc4d19SMaciej Sosnowski  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11e2fc4d19SMaciej Sosnowski  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12e2fc4d19SMaciej Sosnowski  * more details.
13e2fc4d19SMaciej Sosnowski  *
14e2fc4d19SMaciej Sosnowski  * You should have received a copy of the GNU General Public License along with
15e2fc4d19SMaciej Sosnowski  * this program; if not, write to the Free Software Foundation, Inc., 59
16e2fc4d19SMaciej Sosnowski  * Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17e2fc4d19SMaciej Sosnowski  *
18e2fc4d19SMaciej Sosnowski  * The full GNU General Public License is included in this distribution in the
19e2fc4d19SMaciej Sosnowski  * file called COPYING.
20e2fc4d19SMaciej Sosnowski  */
217589670fSShannon Nelson #ifndef DCA_H
227589670fSShannon Nelson #define DCA_H
231a5aeeecSMaciej Sosnowski 
241a5aeeecSMaciej Sosnowski #include <linux/pci.h>
251a5aeeecSMaciej Sosnowski 
267589670fSShannon Nelson /* DCA Provider API */
277589670fSShannon Nelson 
287589670fSShannon Nelson /* DCA Notifier Interface */
297589670fSShannon Nelson void dca_register_notify(struct notifier_block *nb);
307589670fSShannon Nelson void dca_unregister_notify(struct notifier_block *nb);
317589670fSShannon Nelson 
327589670fSShannon Nelson #define DCA_PROVIDER_ADD     0x0001
337589670fSShannon Nelson #define DCA_PROVIDER_REMOVE  0x0002
347589670fSShannon Nelson 
357589670fSShannon Nelson struct dca_provider {
367f1b358aSMaciej Sosnowski 	struct list_head	node;
37*2bb129ebSJulia Lawall 	const struct dca_ops	*ops;
38765cdb6cSKay Sievers 	struct device 		*cd;
397589670fSShannon Nelson 	int			 id;
407589670fSShannon Nelson };
417589670fSShannon Nelson 
421a5aeeecSMaciej Sosnowski struct dca_domain {
431a5aeeecSMaciej Sosnowski 	struct list_head	node;
441a5aeeecSMaciej Sosnowski 	struct list_head	dca_providers;
451a5aeeecSMaciej Sosnowski 	struct pci_bus		*pci_rc;
461a5aeeecSMaciej Sosnowski };
471a5aeeecSMaciej Sosnowski 
487589670fSShannon Nelson struct dca_ops {
497589670fSShannon Nelson 	int	(*add_requester)    (struct dca_provider *, struct device *);
507589670fSShannon Nelson 	int	(*remove_requester) (struct dca_provider *, struct device *);
517f1b358aSMaciej Sosnowski 	u8	(*get_tag)	    (struct dca_provider *, struct device *,
527f1b358aSMaciej Sosnowski 				     int cpu);
537f1b358aSMaciej Sosnowski 	int	(*dev_managed)      (struct dca_provider *, struct device *);
547589670fSShannon Nelson };
557589670fSShannon Nelson 
56*2bb129ebSJulia Lawall struct dca_provider *alloc_dca_provider(const struct dca_ops *ops,
57*2bb129ebSJulia Lawall 					int priv_size);
587589670fSShannon Nelson void free_dca_provider(struct dca_provider *dca);
597589670fSShannon Nelson int register_dca_provider(struct dca_provider *dca, struct device *dev);
601a5aeeecSMaciej Sosnowski void unregister_dca_provider(struct dca_provider *dca, struct device *dev);
617589670fSShannon Nelson 
627589670fSShannon Nelson static inline void *dca_priv(struct dca_provider *dca)
637589670fSShannon Nelson {
647589670fSShannon Nelson 	return (void *)dca + sizeof(struct dca_provider);
657589670fSShannon Nelson }
667589670fSShannon Nelson 
677589670fSShannon Nelson /* Requester API */
687f1b358aSMaciej Sosnowski #define DCA_GET_TAG_TWO_ARGS
697589670fSShannon Nelson int dca_add_requester(struct device *dev);
707589670fSShannon Nelson int dca_remove_requester(struct device *dev);
717589670fSShannon Nelson u8 dca_get_tag(int cpu);
727f1b358aSMaciej Sosnowski u8 dca3_get_tag(struct device *dev, int cpu);
737589670fSShannon Nelson 
747589670fSShannon Nelson /* internal stuff */
757589670fSShannon Nelson int __init dca_sysfs_init(void);
767589670fSShannon Nelson void __exit dca_sysfs_exit(void);
777589670fSShannon Nelson int dca_sysfs_add_provider(struct dca_provider *dca, struct device *dev);
787589670fSShannon Nelson void dca_sysfs_remove_provider(struct dca_provider *dca);
797589670fSShannon Nelson int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot);
807589670fSShannon Nelson void dca_sysfs_remove_req(struct dca_provider *dca, int slot);
817589670fSShannon Nelson 
827589670fSShannon Nelson #endif /* DCA_H */
83