1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * drivers/pci/slot.c 4 * Copyright (C) 2006 Matthew Wilcox <matthew@wil.cx> 5 * Copyright (C) 2006-2009 Hewlett-Packard Development Company, L.P. 6 * Alex Chiang <achiang@hp.com> 7 */ 8 9 #include <linux/kobject.h> 10 #include <linux/slab.h> 11 #include <linux/module.h> 12 #include <linux/pci.h> 13 #include <linux/err.h> 14 #include "pci.h" 15 16 struct kset *pci_slots_kset; 17 EXPORT_SYMBOL_GPL(pci_slots_kset); 18 static DEFINE_MUTEX(pci_slot_mutex); 19 20 static ssize_t pci_slot_attr_show(struct kobject *kobj, 21 struct attribute *attr, char *buf) 22 { 23 struct pci_slot *slot = to_pci_slot(kobj); 24 struct pci_slot_attribute *attribute = to_pci_slot_attr(attr); 25 return attribute->show ? attribute->show(slot, buf) : -EIO; 26 } 27 28 static ssize_t pci_slot_attr_store(struct kobject *kobj, 29 struct attribute *attr, const char *buf, size_t len) 30 { 31 struct pci_slot *slot = to_pci_slot(kobj); 32 struct pci_slot_attribute *attribute = to_pci_slot_attr(attr); 33 return attribute->store ? attribute->store(slot, buf, len) : -EIO; 34 } 35 36 static const struct sysfs_ops pci_slot_sysfs_ops = { 37 .show = pci_slot_attr_show, 38 .store = pci_slot_attr_store, 39 }; 40 41 static ssize_t address_read_file(struct pci_slot *slot, char *buf) 42 { 43 if (slot->number == 0xff) 44 return sprintf(buf, "%04x:%02x\n", 45 pci_domain_nr(slot->bus), 46 slot->bus->number); 47 else 48 return sprintf(buf, "%04x:%02x:%02x\n", 49 pci_domain_nr(slot->bus), 50 slot->bus->number, 51 slot->number); 52 } 53 54 /* these strings match up with the values in pci_bus_speed */ 55 static const char *pci_bus_speed_strings[] = { 56 "33 MHz PCI", /* 0x00 */ 57 "66 MHz PCI", /* 0x01 */ 58 "66 MHz PCI-X", /* 0x02 */ 59 "100 MHz PCI-X", /* 0x03 */ 60 "133 MHz PCI-X", /* 0x04 */ 61 NULL, /* 0x05 */ 62 NULL, /* 0x06 */ 63 NULL, /* 0x07 */ 64 NULL, /* 0x08 */ 65 "66 MHz PCI-X 266", /* 0x09 */ 66 "100 MHz PCI-X 266", /* 0x0a */ 67 "133 MHz PCI-X 266", /* 0x0b */ 68 "Unknown AGP", /* 0x0c */ 69 "1x AGP", /* 0x0d */ 70 "2x AGP", /* 0x0e */ 71 "4x AGP", /* 0x0f */ 72 "8x AGP", /* 0x10 */ 73 "66 MHz PCI-X 533", /* 0x11 */ 74 "100 MHz PCI-X 533", /* 0x12 */ 75 "133 MHz PCI-X 533", /* 0x13 */ 76 "2.5 GT/s PCIe", /* 0x14 */ 77 "5.0 GT/s PCIe", /* 0x15 */ 78 "8.0 GT/s PCIe", /* 0x16 */ 79 "16.0 GT/s PCIe", /* 0x17 */ 80 }; 81 82 static ssize_t bus_speed_read(enum pci_bus_speed speed, char *buf) 83 { 84 const char *speed_string; 85 86 if (speed < ARRAY_SIZE(pci_bus_speed_strings)) 87 speed_string = pci_bus_speed_strings[speed]; 88 else 89 speed_string = "Unknown"; 90 91 return sprintf(buf, "%s\n", speed_string); 92 } 93 94 static ssize_t max_speed_read_file(struct pci_slot *slot, char *buf) 95 { 96 return bus_speed_read(slot->bus->max_bus_speed, buf); 97 } 98 99 static ssize_t cur_speed_read_file(struct pci_slot *slot, char *buf) 100 { 101 return bus_speed_read(slot->bus->cur_bus_speed, buf); 102 } 103 104 static void pci_slot_release(struct kobject *kobj) 105 { 106 struct pci_dev *dev; 107 struct pci_slot *slot = to_pci_slot(kobj); 108 109 dev_dbg(&slot->bus->dev, "dev %02x, released physical slot %s\n", 110 slot->number, pci_slot_name(slot)); 111 112 down_read(&pci_bus_sem); 113 list_for_each_entry(dev, &slot->bus->devices, bus_list) 114 if (PCI_SLOT(dev->devfn) == slot->number) 115 dev->slot = NULL; 116 up_read(&pci_bus_sem); 117 118 list_del(&slot->list); 119 120 kfree(slot); 121 } 122 123 static struct pci_slot_attribute pci_slot_attr_address = 124 __ATTR(address, S_IRUGO, address_read_file, NULL); 125 static struct pci_slot_attribute pci_slot_attr_max_speed = 126 __ATTR(max_bus_speed, S_IRUGO, max_speed_read_file, NULL); 127 static struct pci_slot_attribute pci_slot_attr_cur_speed = 128 __ATTR(cur_bus_speed, S_IRUGO, cur_speed_read_file, NULL); 129 130 static struct attribute *pci_slot_default_attrs[] = { 131 &pci_slot_attr_address.attr, 132 &pci_slot_attr_max_speed.attr, 133 &pci_slot_attr_cur_speed.attr, 134 NULL, 135 }; 136 137 static struct kobj_type pci_slot_ktype = { 138 .sysfs_ops = &pci_slot_sysfs_ops, 139 .release = &pci_slot_release, 140 .default_attrs = pci_slot_default_attrs, 141 }; 142 143 static char *make_slot_name(const char *name) 144 { 145 char *new_name; 146 int len, max, dup; 147 148 new_name = kstrdup(name, GFP_KERNEL); 149 if (!new_name) 150 return NULL; 151 152 /* 153 * Make sure we hit the realloc case the first time through the 154 * loop. 'len' will be strlen(name) + 3 at that point which is 155 * enough space for "name-X" and the trailing NUL. 156 */ 157 len = strlen(name) + 2; 158 max = 1; 159 dup = 1; 160 161 for (;;) { 162 struct kobject *dup_slot; 163 dup_slot = kset_find_obj(pci_slots_kset, new_name); 164 if (!dup_slot) 165 break; 166 kobject_put(dup_slot); 167 if (dup == max) { 168 len++; 169 max *= 10; 170 kfree(new_name); 171 new_name = kmalloc(len, GFP_KERNEL); 172 if (!new_name) 173 break; 174 } 175 sprintf(new_name, "%s-%d", name, dup++); 176 } 177 178 return new_name; 179 } 180 181 static int rename_slot(struct pci_slot *slot, const char *name) 182 { 183 int result = 0; 184 char *slot_name; 185 186 if (strcmp(pci_slot_name(slot), name) == 0) 187 return result; 188 189 slot_name = make_slot_name(name); 190 if (!slot_name) 191 return -ENOMEM; 192 193 result = kobject_rename(&slot->kobj, slot_name); 194 kfree(slot_name); 195 196 return result; 197 } 198 199 void pci_dev_assign_slot(struct pci_dev *dev) 200 { 201 struct pci_slot *slot; 202 203 mutex_lock(&pci_slot_mutex); 204 list_for_each_entry(slot, &dev->bus->slots, list) 205 if (PCI_SLOT(dev->devfn) == slot->number) 206 dev->slot = slot; 207 mutex_unlock(&pci_slot_mutex); 208 } 209 210 static struct pci_slot *get_slot(struct pci_bus *parent, int slot_nr) 211 { 212 struct pci_slot *slot; 213 214 /* We already hold pci_slot_mutex */ 215 list_for_each_entry(slot, &parent->slots, list) 216 if (slot->number == slot_nr) { 217 kobject_get(&slot->kobj); 218 return slot; 219 } 220 221 return NULL; 222 } 223 224 /** 225 * pci_create_slot - create or increment refcount for physical PCI slot 226 * @parent: struct pci_bus of parent bridge 227 * @slot_nr: PCI_SLOT(pci_dev->devfn) or -1 for placeholder 228 * @name: user visible string presented in /sys/bus/pci/slots/<name> 229 * @hotplug: set if caller is hotplug driver, NULL otherwise 230 * 231 * PCI slots have first class attributes such as address, speed, width, 232 * and a &struct pci_slot is used to manage them. This interface will 233 * either return a new &struct pci_slot to the caller, or if the pci_slot 234 * already exists, its refcount will be incremented. 235 * 236 * Slots are uniquely identified by a @pci_bus, @slot_nr tuple. 237 * 238 * There are known platforms with broken firmware that assign the same 239 * name to multiple slots. Workaround these broken platforms by renaming 240 * the slots on behalf of the caller. If firmware assigns name N to 241 * multiple slots: 242 * 243 * The first slot is assigned N 244 * The second slot is assigned N-1 245 * The third slot is assigned N-2 246 * etc. 247 * 248 * Placeholder slots: 249 * In most cases, @pci_bus, @slot_nr will be sufficient to uniquely identify 250 * a slot. There is one notable exception - pSeries (rpaphp), where the 251 * @slot_nr cannot be determined until a device is actually inserted into 252 * the slot. In this scenario, the caller may pass -1 for @slot_nr. 253 * 254 * The following semantics are imposed when the caller passes @slot_nr == 255 * -1. First, we no longer check for an existing %struct pci_slot, as there 256 * may be many slots with @slot_nr of -1. The other change in semantics is 257 * user-visible, which is the 'address' parameter presented in sysfs will 258 * consist solely of a dddd:bb tuple, where dddd is the PCI domain of the 259 * %struct pci_bus and bb is the bus number. In other words, the devfn of 260 * the 'placeholder' slot will not be displayed. 261 */ 262 struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr, 263 const char *name, 264 struct hotplug_slot *hotplug) 265 { 266 struct pci_dev *dev; 267 struct pci_slot *slot; 268 int err = 0; 269 char *slot_name = NULL; 270 271 mutex_lock(&pci_slot_mutex); 272 273 if (slot_nr == -1) 274 goto placeholder; 275 276 /* 277 * Hotplug drivers are allowed to rename an existing slot, 278 * but only if not already claimed. 279 */ 280 slot = get_slot(parent, slot_nr); 281 if (slot) { 282 if (hotplug) { 283 if ((err = slot->hotplug ? -EBUSY : 0) 284 || (err = rename_slot(slot, name))) { 285 kobject_put(&slot->kobj); 286 slot = NULL; 287 goto err; 288 } 289 } 290 goto out; 291 } 292 293 placeholder: 294 slot = kzalloc(sizeof(*slot), GFP_KERNEL); 295 if (!slot) { 296 err = -ENOMEM; 297 goto err; 298 } 299 300 slot->bus = parent; 301 slot->number = slot_nr; 302 303 slot->kobj.kset = pci_slots_kset; 304 305 slot_name = make_slot_name(name); 306 if (!slot_name) { 307 err = -ENOMEM; 308 goto err; 309 } 310 311 err = kobject_init_and_add(&slot->kobj, &pci_slot_ktype, NULL, 312 "%s", slot_name); 313 if (err) 314 goto err; 315 316 INIT_LIST_HEAD(&slot->list); 317 list_add(&slot->list, &parent->slots); 318 319 down_read(&pci_bus_sem); 320 list_for_each_entry(dev, &parent->devices, bus_list) 321 if (PCI_SLOT(dev->devfn) == slot_nr) 322 dev->slot = slot; 323 up_read(&pci_bus_sem); 324 325 dev_dbg(&parent->dev, "dev %02x, created physical slot %s\n", 326 slot_nr, pci_slot_name(slot)); 327 328 out: 329 kfree(slot_name); 330 mutex_unlock(&pci_slot_mutex); 331 return slot; 332 err: 333 kfree(slot); 334 slot = ERR_PTR(err); 335 goto out; 336 } 337 EXPORT_SYMBOL_GPL(pci_create_slot); 338 339 /** 340 * pci_destroy_slot - decrement refcount for physical PCI slot 341 * @slot: struct pci_slot to decrement 342 * 343 * %struct pci_slot is refcounted, so destroying them is really easy; we 344 * just call kobject_put on its kobj and let our release methods do the 345 * rest. 346 */ 347 void pci_destroy_slot(struct pci_slot *slot) 348 { 349 dev_dbg(&slot->bus->dev, "dev %02x, dec refcount to %d\n", 350 slot->number, kref_read(&slot->kobj.kref) - 1); 351 352 mutex_lock(&pci_slot_mutex); 353 kobject_put(&slot->kobj); 354 mutex_unlock(&pci_slot_mutex); 355 } 356 EXPORT_SYMBOL_GPL(pci_destroy_slot); 357 358 #if defined(CONFIG_HOTPLUG_PCI) || defined(CONFIG_HOTPLUG_PCI_MODULE) 359 #include <linux/pci_hotplug.h> 360 /** 361 * pci_hp_create_link - create symbolic link to the hotplug driver module. 362 * @pci_slot: struct pci_slot 363 * 364 * Helper function for pci_hotplug_core.c to create symbolic link to 365 * the hotplug driver module. 366 */ 367 void pci_hp_create_module_link(struct pci_slot *pci_slot) 368 { 369 struct hotplug_slot *slot = pci_slot->hotplug; 370 struct kobject *kobj = NULL; 371 int ret; 372 373 if (!slot || !slot->ops) 374 return; 375 kobj = kset_find_obj(module_kset, slot->ops->mod_name); 376 if (!kobj) 377 return; 378 ret = sysfs_create_link(&pci_slot->kobj, kobj, "module"); 379 if (ret) 380 dev_err(&pci_slot->bus->dev, "Error creating sysfs link (%d)\n", 381 ret); 382 kobject_put(kobj); 383 } 384 EXPORT_SYMBOL_GPL(pci_hp_create_module_link); 385 386 /** 387 * pci_hp_remove_link - remove symbolic link to the hotplug driver module. 388 * @pci_slot: struct pci_slot 389 * 390 * Helper function for pci_hotplug_core.c to remove symbolic link to 391 * the hotplug driver module. 392 */ 393 void pci_hp_remove_module_link(struct pci_slot *pci_slot) 394 { 395 sysfs_remove_link(&pci_slot->kobj, "module"); 396 } 397 EXPORT_SYMBOL_GPL(pci_hp_remove_module_link); 398 #endif 399 400 static int pci_slot_init(void) 401 { 402 struct kset *pci_bus_kset; 403 404 pci_bus_kset = bus_get_kset(&pci_bus_type); 405 pci_slots_kset = kset_create_and_add("slots", NULL, 406 &pci_bus_kset->kobj); 407 if (!pci_slots_kset) { 408 printk(KERN_ERR "PCI: Slot initialization failure\n"); 409 return -ENOMEM; 410 } 411 return 0; 412 } 413 414 subsys_initcall(pci_slot_init); 415