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