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