1*cd248341SJan Glauber /* 2*cd248341SJan Glauber * Copyright IBM Corp. 2012 3*cd248341SJan Glauber * 4*cd248341SJan Glauber * Author(s): 5*cd248341SJan Glauber * Jan Glauber <jang@linux.vnet.ibm.com> 6*cd248341SJan Glauber * 7*cd248341SJan Glauber * The System z PCI code is a rewrite from a prototype by 8*cd248341SJan Glauber * the following people (Kudoz!): 9*cd248341SJan Glauber * Alexander Schmidt <alexschm@de.ibm.com> 10*cd248341SJan Glauber * Christoph Raisch <raisch@de.ibm.com> 11*cd248341SJan Glauber * Hannes Hering <hering2@de.ibm.com> 12*cd248341SJan Glauber * Hoang-Nam Nguyen <hnguyen@de.ibm.com> 13*cd248341SJan Glauber * Jan-Bernd Themann <themann@de.ibm.com> 14*cd248341SJan Glauber * Stefan Roscher <stefan.roscher@de.ibm.com> 15*cd248341SJan Glauber * Thomas Klein <tklein@de.ibm.com> 16*cd248341SJan Glauber */ 17*cd248341SJan Glauber 18*cd248341SJan Glauber #define COMPONENT "zPCI" 19*cd248341SJan Glauber #define pr_fmt(fmt) COMPONENT ": " fmt 20*cd248341SJan Glauber 21*cd248341SJan Glauber #include <linux/kernel.h> 22*cd248341SJan Glauber #include <linux/slab.h> 23*cd248341SJan Glauber #include <linux/err.h> 24*cd248341SJan Glauber #include <linux/export.h> 25*cd248341SJan Glauber #include <linux/delay.h> 26*cd248341SJan Glauber #include <linux/seq_file.h> 27*cd248341SJan Glauber #include <linux/pci.h> 28*cd248341SJan Glauber #include <linux/msi.h> 29*cd248341SJan Glauber 30*cd248341SJan Glauber #include <asm/facility.h> 31*cd248341SJan Glauber #include <asm/pci_insn.h> 32*cd248341SJan Glauber 33*cd248341SJan Glauber #define DEBUG /* enable pr_debug */ 34*cd248341SJan Glauber 35*cd248341SJan Glauber #define ZPCI_NR_DMA_SPACES 1 36*cd248341SJan Glauber #define ZPCI_NR_DEVICES CONFIG_PCI_NR_FUNCTIONS 37*cd248341SJan Glauber 38*cd248341SJan Glauber /* list of all detected zpci devices */ 39*cd248341SJan Glauber LIST_HEAD(zpci_list); 40*cd248341SJan Glauber DEFINE_MUTEX(zpci_list_lock); 41*cd248341SJan Glauber 42*cd248341SJan Glauber static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES); 43*cd248341SJan Glauber static DEFINE_SPINLOCK(zpci_domain_lock); 44*cd248341SJan Glauber 45*cd248341SJan Glauber /* I/O Map */ 46*cd248341SJan Glauber static DEFINE_SPINLOCK(zpci_iomap_lock); 47*cd248341SJan Glauber static DECLARE_BITMAP(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES); 48*cd248341SJan Glauber struct zpci_iomap_entry *zpci_iomap_start; 49*cd248341SJan Glauber EXPORT_SYMBOL_GPL(zpci_iomap_start); 50*cd248341SJan Glauber 51*cd248341SJan Glauber struct zpci_dev *get_zdev(struct pci_dev *pdev) 52*cd248341SJan Glauber { 53*cd248341SJan Glauber return (struct zpci_dev *) pdev->sysdata; 54*cd248341SJan Glauber } 55*cd248341SJan Glauber 56*cd248341SJan Glauber struct zpci_dev *get_zdev_by_fid(u32 fid) 57*cd248341SJan Glauber { 58*cd248341SJan Glauber struct zpci_dev *tmp, *zdev = NULL; 59*cd248341SJan Glauber 60*cd248341SJan Glauber mutex_lock(&zpci_list_lock); 61*cd248341SJan Glauber list_for_each_entry(tmp, &zpci_list, entry) { 62*cd248341SJan Glauber if (tmp->fid == fid) { 63*cd248341SJan Glauber zdev = tmp; 64*cd248341SJan Glauber break; 65*cd248341SJan Glauber } 66*cd248341SJan Glauber } 67*cd248341SJan Glauber mutex_unlock(&zpci_list_lock); 68*cd248341SJan Glauber return zdev; 69*cd248341SJan Glauber } 70*cd248341SJan Glauber 71*cd248341SJan Glauber bool zpci_fid_present(u32 fid) 72*cd248341SJan Glauber { 73*cd248341SJan Glauber return (get_zdev_by_fid(fid) != NULL) ? true : false; 74*cd248341SJan Glauber } 75*cd248341SJan Glauber 76*cd248341SJan Glauber static struct zpci_dev *get_zdev_by_bus(struct pci_bus *bus) 77*cd248341SJan Glauber { 78*cd248341SJan Glauber return (bus && bus->sysdata) ? (struct zpci_dev *) bus->sysdata : NULL; 79*cd248341SJan Glauber } 80*cd248341SJan Glauber 81*cd248341SJan Glauber int pci_domain_nr(struct pci_bus *bus) 82*cd248341SJan Glauber { 83*cd248341SJan Glauber return ((struct zpci_dev *) bus->sysdata)->domain; 84*cd248341SJan Glauber } 85*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_domain_nr); 86*cd248341SJan Glauber 87*cd248341SJan Glauber int pci_proc_domain(struct pci_bus *bus) 88*cd248341SJan Glauber { 89*cd248341SJan Glauber return pci_domain_nr(bus); 90*cd248341SJan Glauber } 91*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_proc_domain); 92*cd248341SJan Glauber 93*cd248341SJan Glauber /* Store PCI function information block */ 94*cd248341SJan Glauber static int zpci_store_fib(struct zpci_dev *zdev, u8 *fc) 95*cd248341SJan Glauber { 96*cd248341SJan Glauber struct zpci_fib *fib; 97*cd248341SJan Glauber u8 status, cc; 98*cd248341SJan Glauber 99*cd248341SJan Glauber fib = (void *) get_zeroed_page(GFP_KERNEL); 100*cd248341SJan Glauber if (!fib) 101*cd248341SJan Glauber return -ENOMEM; 102*cd248341SJan Glauber 103*cd248341SJan Glauber do { 104*cd248341SJan Glauber cc = __stpcifc(zdev->fh, 0, fib, &status); 105*cd248341SJan Glauber if (cc == 2) { 106*cd248341SJan Glauber msleep(ZPCI_INSN_BUSY_DELAY); 107*cd248341SJan Glauber memset(fib, 0, PAGE_SIZE); 108*cd248341SJan Glauber } 109*cd248341SJan Glauber } while (cc == 2); 110*cd248341SJan Glauber 111*cd248341SJan Glauber if (cc) 112*cd248341SJan Glauber pr_err_once("%s: cc: %u status: %u\n", 113*cd248341SJan Glauber __func__, cc, status); 114*cd248341SJan Glauber 115*cd248341SJan Glauber /* Return PCI function controls */ 116*cd248341SJan Glauber *fc = fib->fc; 117*cd248341SJan Glauber 118*cd248341SJan Glauber free_page((unsigned long) fib); 119*cd248341SJan Glauber return (cc) ? -EIO : 0; 120*cd248341SJan Glauber } 121*cd248341SJan Glauber 122*cd248341SJan Glauber #define ZPCI_PCIAS_CFGSPC 15 123*cd248341SJan Glauber 124*cd248341SJan Glauber static int zpci_cfg_load(struct zpci_dev *zdev, int offset, u32 *val, u8 len) 125*cd248341SJan Glauber { 126*cd248341SJan Glauber u64 req = ZPCI_CREATE_REQ(zdev->fh, ZPCI_PCIAS_CFGSPC, len); 127*cd248341SJan Glauber u64 data; 128*cd248341SJan Glauber int rc; 129*cd248341SJan Glauber 130*cd248341SJan Glauber rc = pcilg_instr(&data, req, offset); 131*cd248341SJan Glauber data = data << ((8 - len) * 8); 132*cd248341SJan Glauber data = le64_to_cpu(data); 133*cd248341SJan Glauber if (!rc) 134*cd248341SJan Glauber *val = (u32) data; 135*cd248341SJan Glauber else 136*cd248341SJan Glauber *val = 0xffffffff; 137*cd248341SJan Glauber return rc; 138*cd248341SJan Glauber } 139*cd248341SJan Glauber 140*cd248341SJan Glauber static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len) 141*cd248341SJan Glauber { 142*cd248341SJan Glauber u64 req = ZPCI_CREATE_REQ(zdev->fh, ZPCI_PCIAS_CFGSPC, len); 143*cd248341SJan Glauber u64 data = val; 144*cd248341SJan Glauber int rc; 145*cd248341SJan Glauber 146*cd248341SJan Glauber data = cpu_to_le64(data); 147*cd248341SJan Glauber data = data >> ((8 - len) * 8); 148*cd248341SJan Glauber rc = pcistg_instr(data, req, offset); 149*cd248341SJan Glauber return rc; 150*cd248341SJan Glauber } 151*cd248341SJan Glauber 152*cd248341SJan Glauber void __devinit pcibios_fixup_bus(struct pci_bus *bus) 153*cd248341SJan Glauber { 154*cd248341SJan Glauber } 155*cd248341SJan Glauber 156*cd248341SJan Glauber resource_size_t pcibios_align_resource(void *data, const struct resource *res, 157*cd248341SJan Glauber resource_size_t size, 158*cd248341SJan Glauber resource_size_t align) 159*cd248341SJan Glauber { 160*cd248341SJan Glauber return 0; 161*cd248341SJan Glauber } 162*cd248341SJan Glauber 163*cd248341SJan Glauber /* Create a virtual mapping cookie for a PCI BAR */ 164*cd248341SJan Glauber void __iomem *pci_iomap(struct pci_dev *pdev, int bar, unsigned long max) 165*cd248341SJan Glauber { 166*cd248341SJan Glauber struct zpci_dev *zdev = get_zdev(pdev); 167*cd248341SJan Glauber u64 addr; 168*cd248341SJan Glauber int idx; 169*cd248341SJan Glauber 170*cd248341SJan Glauber if ((bar & 7) != bar) 171*cd248341SJan Glauber return NULL; 172*cd248341SJan Glauber 173*cd248341SJan Glauber idx = zdev->bars[bar].map_idx; 174*cd248341SJan Glauber spin_lock(&zpci_iomap_lock); 175*cd248341SJan Glauber zpci_iomap_start[idx].fh = zdev->fh; 176*cd248341SJan Glauber zpci_iomap_start[idx].bar = bar; 177*cd248341SJan Glauber spin_unlock(&zpci_iomap_lock); 178*cd248341SJan Glauber 179*cd248341SJan Glauber addr = ZPCI_IOMAP_ADDR_BASE | ((u64) idx << 48); 180*cd248341SJan Glauber return (void __iomem *) addr; 181*cd248341SJan Glauber } 182*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_iomap); 183*cd248341SJan Glauber 184*cd248341SJan Glauber void pci_iounmap(struct pci_dev *pdev, void __iomem *addr) 185*cd248341SJan Glauber { 186*cd248341SJan Glauber unsigned int idx; 187*cd248341SJan Glauber 188*cd248341SJan Glauber idx = (((__force u64) addr) & ~ZPCI_IOMAP_ADDR_BASE) >> 48; 189*cd248341SJan Glauber spin_lock(&zpci_iomap_lock); 190*cd248341SJan Glauber zpci_iomap_start[idx].fh = 0; 191*cd248341SJan Glauber zpci_iomap_start[idx].bar = 0; 192*cd248341SJan Glauber spin_unlock(&zpci_iomap_lock); 193*cd248341SJan Glauber } 194*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_iounmap); 195*cd248341SJan Glauber 196*cd248341SJan Glauber static int pci_read(struct pci_bus *bus, unsigned int devfn, int where, 197*cd248341SJan Glauber int size, u32 *val) 198*cd248341SJan Glauber { 199*cd248341SJan Glauber struct zpci_dev *zdev = get_zdev_by_bus(bus); 200*cd248341SJan Glauber 201*cd248341SJan Glauber if (!zdev || devfn != ZPCI_DEVFN) 202*cd248341SJan Glauber return 0; 203*cd248341SJan Glauber return zpci_cfg_load(zdev, where, val, size); 204*cd248341SJan Glauber } 205*cd248341SJan Glauber 206*cd248341SJan Glauber static int pci_write(struct pci_bus *bus, unsigned int devfn, int where, 207*cd248341SJan Glauber int size, u32 val) 208*cd248341SJan Glauber { 209*cd248341SJan Glauber struct zpci_dev *zdev = get_zdev_by_bus(bus); 210*cd248341SJan Glauber 211*cd248341SJan Glauber if (!zdev || devfn != ZPCI_DEVFN) 212*cd248341SJan Glauber return 0; 213*cd248341SJan Glauber return zpci_cfg_store(zdev, where, val, size); 214*cd248341SJan Glauber } 215*cd248341SJan Glauber 216*cd248341SJan Glauber static struct pci_ops pci_root_ops = { 217*cd248341SJan Glauber .read = pci_read, 218*cd248341SJan Glauber .write = pci_write, 219*cd248341SJan Glauber }; 220*cd248341SJan Glauber 221*cd248341SJan Glauber static void zpci_map_resources(struct zpci_dev *zdev) 222*cd248341SJan Glauber { 223*cd248341SJan Glauber struct pci_dev *pdev = zdev->pdev; 224*cd248341SJan Glauber resource_size_t len; 225*cd248341SJan Glauber int i; 226*cd248341SJan Glauber 227*cd248341SJan Glauber for (i = 0; i < PCI_BAR_COUNT; i++) { 228*cd248341SJan Glauber len = pci_resource_len(pdev, i); 229*cd248341SJan Glauber if (!len) 230*cd248341SJan Glauber continue; 231*cd248341SJan Glauber pdev->resource[i].start = (resource_size_t) pci_iomap(pdev, i, 0); 232*cd248341SJan Glauber pdev->resource[i].end = pdev->resource[i].start + len - 1; 233*cd248341SJan Glauber pr_debug("BAR%i: -> start: %Lx end: %Lx\n", 234*cd248341SJan Glauber i, pdev->resource[i].start, pdev->resource[i].end); 235*cd248341SJan Glauber } 236*cd248341SJan Glauber }; 237*cd248341SJan Glauber 238*cd248341SJan Glauber static void zpci_unmap_resources(struct pci_dev *pdev) 239*cd248341SJan Glauber { 240*cd248341SJan Glauber resource_size_t len; 241*cd248341SJan Glauber int i; 242*cd248341SJan Glauber 243*cd248341SJan Glauber for (i = 0; i < PCI_BAR_COUNT; i++) { 244*cd248341SJan Glauber len = pci_resource_len(pdev, i); 245*cd248341SJan Glauber if (!len) 246*cd248341SJan Glauber continue; 247*cd248341SJan Glauber pci_iounmap(pdev, (void *) pdev->resource[i].start); 248*cd248341SJan Glauber } 249*cd248341SJan Glauber }; 250*cd248341SJan Glauber 251*cd248341SJan Glauber struct zpci_dev *zpci_alloc_device(void) 252*cd248341SJan Glauber { 253*cd248341SJan Glauber struct zpci_dev *zdev; 254*cd248341SJan Glauber 255*cd248341SJan Glauber /* Alloc memory for our private pci device data */ 256*cd248341SJan Glauber zdev = kzalloc(sizeof(*zdev), GFP_KERNEL); 257*cd248341SJan Glauber if (!zdev) 258*cd248341SJan Glauber return ERR_PTR(-ENOMEM); 259*cd248341SJan Glauber return zdev; 260*cd248341SJan Glauber } 261*cd248341SJan Glauber 262*cd248341SJan Glauber void zpci_free_device(struct zpci_dev *zdev) 263*cd248341SJan Glauber { 264*cd248341SJan Glauber kfree(zdev); 265*cd248341SJan Glauber } 266*cd248341SJan Glauber 267*cd248341SJan Glauber /* Called on removal of pci_dev, leaves zpci and bus device */ 268*cd248341SJan Glauber static void zpci_remove_device(struct pci_dev *pdev) 269*cd248341SJan Glauber { 270*cd248341SJan Glauber struct zpci_dev *zdev = get_zdev(pdev); 271*cd248341SJan Glauber 272*cd248341SJan Glauber dev_info(&pdev->dev, "Removing device %u\n", zdev->domain); 273*cd248341SJan Glauber zdev->state = ZPCI_FN_STATE_CONFIGURED; 274*cd248341SJan Glauber zpci_unmap_resources(pdev); 275*cd248341SJan Glauber list_del(&zdev->entry); /* can be called from init */ 276*cd248341SJan Glauber zdev->pdev = NULL; 277*cd248341SJan Glauber } 278*cd248341SJan Glauber 279*cd248341SJan Glauber static void zpci_scan_devices(void) 280*cd248341SJan Glauber { 281*cd248341SJan Glauber struct zpci_dev *zdev; 282*cd248341SJan Glauber 283*cd248341SJan Glauber mutex_lock(&zpci_list_lock); 284*cd248341SJan Glauber list_for_each_entry(zdev, &zpci_list, entry) 285*cd248341SJan Glauber if (zdev->state == ZPCI_FN_STATE_CONFIGURED) 286*cd248341SJan Glauber zpci_scan_device(zdev); 287*cd248341SJan Glauber mutex_unlock(&zpci_list_lock); 288*cd248341SJan Glauber } 289*cd248341SJan Glauber 290*cd248341SJan Glauber /* 291*cd248341SJan Glauber * Too late for any s390 specific setup, since interrupts must be set up 292*cd248341SJan Glauber * already which requires DMA setup too and the pci scan will access the 293*cd248341SJan Glauber * config space, which only works if the function handle is enabled. 294*cd248341SJan Glauber */ 295*cd248341SJan Glauber int pcibios_enable_device(struct pci_dev *pdev, int mask) 296*cd248341SJan Glauber { 297*cd248341SJan Glauber struct resource *res; 298*cd248341SJan Glauber u16 cmd; 299*cd248341SJan Glauber int i; 300*cd248341SJan Glauber 301*cd248341SJan Glauber pci_read_config_word(pdev, PCI_COMMAND, &cmd); 302*cd248341SJan Glauber 303*cd248341SJan Glauber for (i = 0; i < PCI_BAR_COUNT; i++) { 304*cd248341SJan Glauber res = &pdev->resource[i]; 305*cd248341SJan Glauber 306*cd248341SJan Glauber if (res->flags & IORESOURCE_IO) 307*cd248341SJan Glauber return -EINVAL; 308*cd248341SJan Glauber 309*cd248341SJan Glauber if (res->flags & IORESOURCE_MEM) 310*cd248341SJan Glauber cmd |= PCI_COMMAND_MEMORY; 311*cd248341SJan Glauber } 312*cd248341SJan Glauber pci_write_config_word(pdev, PCI_COMMAND, cmd); 313*cd248341SJan Glauber return 0; 314*cd248341SJan Glauber } 315*cd248341SJan Glauber 316*cd248341SJan Glauber void pcibios_disable_device(struct pci_dev *pdev) 317*cd248341SJan Glauber { 318*cd248341SJan Glauber zpci_remove_device(pdev); 319*cd248341SJan Glauber pdev->sysdata = NULL; 320*cd248341SJan Glauber } 321*cd248341SJan Glauber 322*cd248341SJan Glauber static struct resource *zpci_alloc_bus_resource(unsigned long start, unsigned long size, 323*cd248341SJan Glauber unsigned long flags, int domain) 324*cd248341SJan Glauber { 325*cd248341SJan Glauber struct resource *r; 326*cd248341SJan Glauber char *name; 327*cd248341SJan Glauber int rc; 328*cd248341SJan Glauber 329*cd248341SJan Glauber r = kzalloc(sizeof(*r), GFP_KERNEL); 330*cd248341SJan Glauber if (!r) 331*cd248341SJan Glauber return ERR_PTR(-ENOMEM); 332*cd248341SJan Glauber r->start = start; 333*cd248341SJan Glauber r->end = r->start + size - 1; 334*cd248341SJan Glauber r->flags = flags; 335*cd248341SJan Glauber r->parent = &iomem_resource; 336*cd248341SJan Glauber name = kmalloc(18, GFP_KERNEL); 337*cd248341SJan Glauber if (!name) { 338*cd248341SJan Glauber kfree(r); 339*cd248341SJan Glauber return ERR_PTR(-ENOMEM); 340*cd248341SJan Glauber } 341*cd248341SJan Glauber sprintf(name, "PCI Bus: %04x:%02x", domain, ZPCI_BUS_NR); 342*cd248341SJan Glauber r->name = name; 343*cd248341SJan Glauber 344*cd248341SJan Glauber rc = request_resource(&iomem_resource, r); 345*cd248341SJan Glauber if (rc) 346*cd248341SJan Glauber pr_debug("request resource %pR failed\n", r); 347*cd248341SJan Glauber return r; 348*cd248341SJan Glauber } 349*cd248341SJan Glauber 350*cd248341SJan Glauber static int zpci_alloc_iomap(struct zpci_dev *zdev) 351*cd248341SJan Glauber { 352*cd248341SJan Glauber int entry; 353*cd248341SJan Glauber 354*cd248341SJan Glauber spin_lock(&zpci_iomap_lock); 355*cd248341SJan Glauber entry = find_first_zero_bit(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES); 356*cd248341SJan Glauber if (entry == ZPCI_IOMAP_MAX_ENTRIES) { 357*cd248341SJan Glauber spin_unlock(&zpci_iomap_lock); 358*cd248341SJan Glauber return -ENOSPC; 359*cd248341SJan Glauber } 360*cd248341SJan Glauber set_bit(entry, zpci_iomap); 361*cd248341SJan Glauber spin_unlock(&zpci_iomap_lock); 362*cd248341SJan Glauber return entry; 363*cd248341SJan Glauber } 364*cd248341SJan Glauber 365*cd248341SJan Glauber static void zpci_free_iomap(struct zpci_dev *zdev, int entry) 366*cd248341SJan Glauber { 367*cd248341SJan Glauber spin_lock(&zpci_iomap_lock); 368*cd248341SJan Glauber memset(&zpci_iomap_start[entry], 0, sizeof(struct zpci_iomap_entry)); 369*cd248341SJan Glauber clear_bit(entry, zpci_iomap); 370*cd248341SJan Glauber spin_unlock(&zpci_iomap_lock); 371*cd248341SJan Glauber } 372*cd248341SJan Glauber 373*cd248341SJan Glauber static int zpci_create_device_bus(struct zpci_dev *zdev) 374*cd248341SJan Glauber { 375*cd248341SJan Glauber struct resource *res; 376*cd248341SJan Glauber LIST_HEAD(resources); 377*cd248341SJan Glauber int i; 378*cd248341SJan Glauber 379*cd248341SJan Glauber /* allocate mapping entry for each used bar */ 380*cd248341SJan Glauber for (i = 0; i < PCI_BAR_COUNT; i++) { 381*cd248341SJan Glauber unsigned long addr, size, flags; 382*cd248341SJan Glauber int entry; 383*cd248341SJan Glauber 384*cd248341SJan Glauber if (!zdev->bars[i].size) 385*cd248341SJan Glauber continue; 386*cd248341SJan Glauber entry = zpci_alloc_iomap(zdev); 387*cd248341SJan Glauber if (entry < 0) 388*cd248341SJan Glauber return entry; 389*cd248341SJan Glauber zdev->bars[i].map_idx = entry; 390*cd248341SJan Glauber 391*cd248341SJan Glauber /* only MMIO is supported */ 392*cd248341SJan Glauber flags = IORESOURCE_MEM; 393*cd248341SJan Glauber if (zdev->bars[i].val & 8) 394*cd248341SJan Glauber flags |= IORESOURCE_PREFETCH; 395*cd248341SJan Glauber if (zdev->bars[i].val & 4) 396*cd248341SJan Glauber flags |= IORESOURCE_MEM_64; 397*cd248341SJan Glauber 398*cd248341SJan Glauber addr = ZPCI_IOMAP_ADDR_BASE + ((u64) entry << 48); 399*cd248341SJan Glauber 400*cd248341SJan Glauber size = 1UL << zdev->bars[i].size; 401*cd248341SJan Glauber 402*cd248341SJan Glauber res = zpci_alloc_bus_resource(addr, size, flags, zdev->domain); 403*cd248341SJan Glauber if (IS_ERR(res)) { 404*cd248341SJan Glauber zpci_free_iomap(zdev, entry); 405*cd248341SJan Glauber return PTR_ERR(res); 406*cd248341SJan Glauber } 407*cd248341SJan Glauber pci_add_resource(&resources, res); 408*cd248341SJan Glauber } 409*cd248341SJan Glauber 410*cd248341SJan Glauber zdev->bus = pci_create_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops, 411*cd248341SJan Glauber zdev, &resources); 412*cd248341SJan Glauber if (!zdev->bus) 413*cd248341SJan Glauber return -EIO; 414*cd248341SJan Glauber 415*cd248341SJan Glauber zdev->bus->max_bus_speed = zdev->max_bus_speed; 416*cd248341SJan Glauber return 0; 417*cd248341SJan Glauber } 418*cd248341SJan Glauber 419*cd248341SJan Glauber static int zpci_alloc_domain(struct zpci_dev *zdev) 420*cd248341SJan Glauber { 421*cd248341SJan Glauber spin_lock(&zpci_domain_lock); 422*cd248341SJan Glauber zdev->domain = find_first_zero_bit(zpci_domain, ZPCI_NR_DEVICES); 423*cd248341SJan Glauber if (zdev->domain == ZPCI_NR_DEVICES) { 424*cd248341SJan Glauber spin_unlock(&zpci_domain_lock); 425*cd248341SJan Glauber return -ENOSPC; 426*cd248341SJan Glauber } 427*cd248341SJan Glauber set_bit(zdev->domain, zpci_domain); 428*cd248341SJan Glauber spin_unlock(&zpci_domain_lock); 429*cd248341SJan Glauber return 0; 430*cd248341SJan Glauber } 431*cd248341SJan Glauber 432*cd248341SJan Glauber static void zpci_free_domain(struct zpci_dev *zdev) 433*cd248341SJan Glauber { 434*cd248341SJan Glauber spin_lock(&zpci_domain_lock); 435*cd248341SJan Glauber clear_bit(zdev->domain, zpci_domain); 436*cd248341SJan Glauber spin_unlock(&zpci_domain_lock); 437*cd248341SJan Glauber } 438*cd248341SJan Glauber 439*cd248341SJan Glauber int zpci_create_device(struct zpci_dev *zdev) 440*cd248341SJan Glauber { 441*cd248341SJan Glauber int rc; 442*cd248341SJan Glauber 443*cd248341SJan Glauber rc = zpci_alloc_domain(zdev); 444*cd248341SJan Glauber if (rc) 445*cd248341SJan Glauber goto out; 446*cd248341SJan Glauber 447*cd248341SJan Glauber rc = zpci_create_device_bus(zdev); 448*cd248341SJan Glauber if (rc) 449*cd248341SJan Glauber goto out_bus; 450*cd248341SJan Glauber 451*cd248341SJan Glauber mutex_lock(&zpci_list_lock); 452*cd248341SJan Glauber list_add_tail(&zdev->entry, &zpci_list); 453*cd248341SJan Glauber mutex_unlock(&zpci_list_lock); 454*cd248341SJan Glauber 455*cd248341SJan Glauber if (zdev->state == ZPCI_FN_STATE_STANDBY) 456*cd248341SJan Glauber return 0; 457*cd248341SJan Glauber 458*cd248341SJan Glauber return 0; 459*cd248341SJan Glauber 460*cd248341SJan Glauber out_bus: 461*cd248341SJan Glauber zpci_free_domain(zdev); 462*cd248341SJan Glauber out: 463*cd248341SJan Glauber return rc; 464*cd248341SJan Glauber } 465*cd248341SJan Glauber 466*cd248341SJan Glauber void zpci_stop_device(struct zpci_dev *zdev) 467*cd248341SJan Glauber { 468*cd248341SJan Glauber /* 469*cd248341SJan Glauber * Note: SCLP disables fh via set-pci-fn so don't 470*cd248341SJan Glauber * do that here. 471*cd248341SJan Glauber */ 472*cd248341SJan Glauber } 473*cd248341SJan Glauber EXPORT_SYMBOL_GPL(zpci_stop_device); 474*cd248341SJan Glauber 475*cd248341SJan Glauber int zpci_scan_device(struct zpci_dev *zdev) 476*cd248341SJan Glauber { 477*cd248341SJan Glauber zdev->pdev = pci_scan_single_device(zdev->bus, ZPCI_DEVFN); 478*cd248341SJan Glauber if (!zdev->pdev) { 479*cd248341SJan Glauber pr_err("pci_scan_single_device failed for fid: 0x%x\n", 480*cd248341SJan Glauber zdev->fid); 481*cd248341SJan Glauber goto out; 482*cd248341SJan Glauber } 483*cd248341SJan Glauber 484*cd248341SJan Glauber zpci_map_resources(zdev); 485*cd248341SJan Glauber pci_bus_add_devices(zdev->bus); 486*cd248341SJan Glauber 487*cd248341SJan Glauber /* now that pdev was added to the bus mark it as used */ 488*cd248341SJan Glauber zdev->state = ZPCI_FN_STATE_ONLINE; 489*cd248341SJan Glauber return 0; 490*cd248341SJan Glauber 491*cd248341SJan Glauber out: 492*cd248341SJan Glauber return -EIO; 493*cd248341SJan Glauber } 494*cd248341SJan Glauber EXPORT_SYMBOL_GPL(zpci_scan_device); 495*cd248341SJan Glauber 496*cd248341SJan Glauber static inline int barsize(u8 size) 497*cd248341SJan Glauber { 498*cd248341SJan Glauber return (size) ? (1 << size) >> 10 : 0; 499*cd248341SJan Glauber } 500*cd248341SJan Glauber 501*cd248341SJan Glauber static int zpci_mem_init(void) 502*cd248341SJan Glauber { 503*cd248341SJan Glauber /* TODO: use realloc */ 504*cd248341SJan Glauber zpci_iomap_start = kzalloc(ZPCI_IOMAP_MAX_ENTRIES * sizeof(*zpci_iomap_start), 505*cd248341SJan Glauber GFP_KERNEL); 506*cd248341SJan Glauber if (!zpci_iomap_start) 507*cd248341SJan Glauber goto error_zdev; 508*cd248341SJan Glauber return 0; 509*cd248341SJan Glauber 510*cd248341SJan Glauber error_zdev: 511*cd248341SJan Glauber return -ENOMEM; 512*cd248341SJan Glauber } 513*cd248341SJan Glauber 514*cd248341SJan Glauber static void zpci_mem_exit(void) 515*cd248341SJan Glauber { 516*cd248341SJan Glauber kfree(zpci_iomap_start); 517*cd248341SJan Glauber } 518*cd248341SJan Glauber 519*cd248341SJan Glauber unsigned int pci_probe = 1; 520*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_probe); 521*cd248341SJan Glauber 522*cd248341SJan Glauber char * __init pcibios_setup(char *str) 523*cd248341SJan Glauber { 524*cd248341SJan Glauber if (!strcmp(str, "off")) { 525*cd248341SJan Glauber pci_probe = 0; 526*cd248341SJan Glauber return NULL; 527*cd248341SJan Glauber } 528*cd248341SJan Glauber return str; 529*cd248341SJan Glauber } 530*cd248341SJan Glauber 531*cd248341SJan Glauber static int __init pci_base_init(void) 532*cd248341SJan Glauber { 533*cd248341SJan Glauber int rc; 534*cd248341SJan Glauber 535*cd248341SJan Glauber if (!pci_probe) 536*cd248341SJan Glauber return 0; 537*cd248341SJan Glauber 538*cd248341SJan Glauber if (!test_facility(2) || !test_facility(69) 539*cd248341SJan Glauber || !test_facility(71) || !test_facility(72)) 540*cd248341SJan Glauber return 0; 541*cd248341SJan Glauber 542*cd248341SJan Glauber pr_info("Probing PCI hardware: PCI:%d SID:%d AEN:%d\n", 543*cd248341SJan Glauber test_facility(69), test_facility(70), 544*cd248341SJan Glauber test_facility(71)); 545*cd248341SJan Glauber 546*cd248341SJan Glauber rc = zpci_mem_init(); 547*cd248341SJan Glauber if (rc) 548*cd248341SJan Glauber goto out_mem; 549*cd248341SJan Glauber 550*cd248341SJan Glauber zpci_scan_devices(); 551*cd248341SJan Glauber return 0; 552*cd248341SJan Glauber 553*cd248341SJan Glauber zpci_mem_exit(); 554*cd248341SJan Glauber out_mem: 555*cd248341SJan Glauber return rc; 556*cd248341SJan Glauber } 557*cd248341SJan Glauber subsys_initcall(pci_base_init); 558