xref: /openbmc/linux/drivers/pci/hotplug/cpqphp_sysfs.c (revision 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2)
1*1da177e4SLinus Torvalds /*
2*1da177e4SLinus Torvalds  * Compaq Hot Plug Controller Driver
3*1da177e4SLinus Torvalds  *
4*1da177e4SLinus Torvalds  * Copyright (C) 1995,2001 Compaq Computer Corporation
5*1da177e4SLinus Torvalds  * Copyright (C) 2001,2003 Greg Kroah-Hartman (greg@kroah.com)
6*1da177e4SLinus Torvalds  * Copyright (C) 2001 IBM Corp.
7*1da177e4SLinus Torvalds  *
8*1da177e4SLinus Torvalds  * All rights reserved.
9*1da177e4SLinus Torvalds  *
10*1da177e4SLinus Torvalds  * This program is free software; you can redistribute it and/or modify
11*1da177e4SLinus Torvalds  * it under the terms of the GNU General Public License as published by
12*1da177e4SLinus Torvalds  * the Free Software Foundation; either version 2 of the License, or (at
13*1da177e4SLinus Torvalds  * your option) any later version.
14*1da177e4SLinus Torvalds  *
15*1da177e4SLinus Torvalds  * This program is distributed in the hope that it will be useful, but
16*1da177e4SLinus Torvalds  * WITHOUT ANY WARRANTY; without even the implied warranty of
17*1da177e4SLinus Torvalds  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
18*1da177e4SLinus Torvalds  * NON INFRINGEMENT.  See the GNU General Public License for more
19*1da177e4SLinus Torvalds  * details.
20*1da177e4SLinus Torvalds  *
21*1da177e4SLinus Torvalds  * You should have received a copy of the GNU General Public License
22*1da177e4SLinus Torvalds  * along with this program; if not, write to the Free Software
23*1da177e4SLinus Torvalds  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24*1da177e4SLinus Torvalds  *
25*1da177e4SLinus Torvalds  * Send feedback to <greg@kroah.com>
26*1da177e4SLinus Torvalds  *
27*1da177e4SLinus Torvalds  */
28*1da177e4SLinus Torvalds 
29*1da177e4SLinus Torvalds #include <linux/config.h>
30*1da177e4SLinus Torvalds #include <linux/module.h>
31*1da177e4SLinus Torvalds #include <linux/kernel.h>
32*1da177e4SLinus Torvalds #include <linux/types.h>
33*1da177e4SLinus Torvalds #include <linux/proc_fs.h>
34*1da177e4SLinus Torvalds #include <linux/workqueue.h>
35*1da177e4SLinus Torvalds #include <linux/pci.h>
36*1da177e4SLinus Torvalds #include "cpqphp.h"
37*1da177e4SLinus Torvalds 
38*1da177e4SLinus Torvalds 
39*1da177e4SLinus Torvalds /* A few routines that create sysfs entries for the hot plug controller */
40*1da177e4SLinus Torvalds 
41*1da177e4SLinus Torvalds static ssize_t show_ctrl (struct device *dev, char *buf)
42*1da177e4SLinus Torvalds {
43*1da177e4SLinus Torvalds 	struct pci_dev *pci_dev;
44*1da177e4SLinus Torvalds 	struct controller *ctrl;
45*1da177e4SLinus Torvalds 	char * out = buf;
46*1da177e4SLinus Torvalds 	int index;
47*1da177e4SLinus Torvalds 	struct pci_resource *res;
48*1da177e4SLinus Torvalds 
49*1da177e4SLinus Torvalds 	pci_dev = container_of (dev, struct pci_dev, dev);
50*1da177e4SLinus Torvalds 	ctrl = pci_get_drvdata(pci_dev);
51*1da177e4SLinus Torvalds 
52*1da177e4SLinus Torvalds 	out += sprintf(buf, "Free resources: memory\n");
53*1da177e4SLinus Torvalds 	index = 11;
54*1da177e4SLinus Torvalds 	res = ctrl->mem_head;
55*1da177e4SLinus Torvalds 	while (res && index--) {
56*1da177e4SLinus Torvalds 		out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
57*1da177e4SLinus Torvalds 		res = res->next;
58*1da177e4SLinus Torvalds 	}
59*1da177e4SLinus Torvalds 	out += sprintf(out, "Free resources: prefetchable memory\n");
60*1da177e4SLinus Torvalds 	index = 11;
61*1da177e4SLinus Torvalds 	res = ctrl->p_mem_head;
62*1da177e4SLinus Torvalds 	while (res && index--) {
63*1da177e4SLinus Torvalds 		out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
64*1da177e4SLinus Torvalds 		res = res->next;
65*1da177e4SLinus Torvalds 	}
66*1da177e4SLinus Torvalds 	out += sprintf(out, "Free resources: IO\n");
67*1da177e4SLinus Torvalds 	index = 11;
68*1da177e4SLinus Torvalds 	res = ctrl->io_head;
69*1da177e4SLinus Torvalds 	while (res && index--) {
70*1da177e4SLinus Torvalds 		out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
71*1da177e4SLinus Torvalds 		res = res->next;
72*1da177e4SLinus Torvalds 	}
73*1da177e4SLinus Torvalds 	out += sprintf(out, "Free resources: bus numbers\n");
74*1da177e4SLinus Torvalds 	index = 11;
75*1da177e4SLinus Torvalds 	res = ctrl->bus_head;
76*1da177e4SLinus Torvalds 	while (res && index--) {
77*1da177e4SLinus Torvalds 		out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
78*1da177e4SLinus Torvalds 		res = res->next;
79*1da177e4SLinus Torvalds 	}
80*1da177e4SLinus Torvalds 
81*1da177e4SLinus Torvalds 	return out - buf;
82*1da177e4SLinus Torvalds }
83*1da177e4SLinus Torvalds static DEVICE_ATTR (ctrl, S_IRUGO, show_ctrl, NULL);
84*1da177e4SLinus Torvalds 
85*1da177e4SLinus Torvalds static ssize_t show_dev (struct device *dev, char *buf)
86*1da177e4SLinus Torvalds {
87*1da177e4SLinus Torvalds 	struct pci_dev *pci_dev;
88*1da177e4SLinus Torvalds 	struct controller *ctrl;
89*1da177e4SLinus Torvalds 	char * out = buf;
90*1da177e4SLinus Torvalds 	int index;
91*1da177e4SLinus Torvalds 	struct pci_resource *res;
92*1da177e4SLinus Torvalds 	struct pci_func *new_slot;
93*1da177e4SLinus Torvalds 	struct slot *slot;
94*1da177e4SLinus Torvalds 
95*1da177e4SLinus Torvalds 	pci_dev = container_of (dev, struct pci_dev, dev);
96*1da177e4SLinus Torvalds 	ctrl = pci_get_drvdata(pci_dev);
97*1da177e4SLinus Torvalds 
98*1da177e4SLinus Torvalds 	slot=ctrl->slot;
99*1da177e4SLinus Torvalds 
100*1da177e4SLinus Torvalds 	while (slot) {
101*1da177e4SLinus Torvalds 		new_slot = cpqhp_slot_find(slot->bus, slot->device, 0);
102*1da177e4SLinus Torvalds 		if (!new_slot)
103*1da177e4SLinus Torvalds 			break;
104*1da177e4SLinus Torvalds 		out += sprintf(out, "assigned resources: memory\n");
105*1da177e4SLinus Torvalds 		index = 11;
106*1da177e4SLinus Torvalds 		res = new_slot->mem_head;
107*1da177e4SLinus Torvalds 		while (res && index--) {
108*1da177e4SLinus Torvalds 			out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
109*1da177e4SLinus Torvalds 			res = res->next;
110*1da177e4SLinus Torvalds 		}
111*1da177e4SLinus Torvalds 		out += sprintf(out, "assigned resources: prefetchable memory\n");
112*1da177e4SLinus Torvalds 		index = 11;
113*1da177e4SLinus Torvalds 		res = new_slot->p_mem_head;
114*1da177e4SLinus Torvalds 		while (res && index--) {
115*1da177e4SLinus Torvalds 			out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
116*1da177e4SLinus Torvalds 			res = res->next;
117*1da177e4SLinus Torvalds 		}
118*1da177e4SLinus Torvalds 		out += sprintf(out, "assigned resources: IO\n");
119*1da177e4SLinus Torvalds 		index = 11;
120*1da177e4SLinus Torvalds 		res = new_slot->io_head;
121*1da177e4SLinus Torvalds 		while (res && index--) {
122*1da177e4SLinus Torvalds 			out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
123*1da177e4SLinus Torvalds 			res = res->next;
124*1da177e4SLinus Torvalds 		}
125*1da177e4SLinus Torvalds 		out += sprintf(out, "assigned resources: bus numbers\n");
126*1da177e4SLinus Torvalds 		index = 11;
127*1da177e4SLinus Torvalds 		res = new_slot->bus_head;
128*1da177e4SLinus Torvalds 		while (res && index--) {
129*1da177e4SLinus Torvalds 			out += sprintf(out, "start = %8.8x, length = %8.8x\n", res->base, res->length);
130*1da177e4SLinus Torvalds 			res = res->next;
131*1da177e4SLinus Torvalds 		}
132*1da177e4SLinus Torvalds 		slot=slot->next;
133*1da177e4SLinus Torvalds 	}
134*1da177e4SLinus Torvalds 
135*1da177e4SLinus Torvalds 	return out - buf;
136*1da177e4SLinus Torvalds }
137*1da177e4SLinus Torvalds static DEVICE_ATTR (dev, S_IRUGO, show_dev, NULL);
138*1da177e4SLinus Torvalds 
139*1da177e4SLinus Torvalds void cpqhp_create_ctrl_files (struct controller *ctrl)
140*1da177e4SLinus Torvalds {
141*1da177e4SLinus Torvalds 	device_create_file (&ctrl->pci_dev->dev, &dev_attr_ctrl);
142*1da177e4SLinus Torvalds 	device_create_file (&ctrl->pci_dev->dev, &dev_attr_dev);
143*1da177e4SLinus Torvalds }
144