Lines Matching +full:data +full:- +full:bus

1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/pci-acpi.h>
13 #include <linux/pci-ecam.h>
52 const struct loongson_pci_data *data; member
58 dev->class = PCI_CLASS_BRIDGE_PCI_NORMAL; in bridge_class_quirk()
73 pdev->mmio_always_on = 1; in system_bus_quirk()
74 pdev->non_compliant_bars = 1; in system_bus_quirk()
93 struct pci_bus *bus = pdev->bus; in loongson_set_min_mrrs_quirk() local
108 while (!pci_is_root_bus(bus)) { in loongson_set_min_mrrs_quirk()
109 bridge = bus->self; in loongson_set_min_mrrs_quirk()
110 bus = bus->parent; in loongson_set_min_mrrs_quirk()
126 struct pci_host_bridge *bridge = pci_find_host_bridge(pdev->bus); in loongson_mrrs_quirk()
128 bridge->no_inc_mrrs = 1; in loongson_mrrs_quirk()
149 pdev->pin = 1 + (PCI_FUNC(pdev->devfn) & 3); in loongson_pci_pin_quirk()
168 u16 val, class = dev->class >> 8; in loongson_pci_msi_quirk()
173 pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &val); in loongson_pci_msi_quirk()
175 pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, val); in loongson_pci_msi_quirk()
179 static struct loongson_pci *pci_bus_to_loongson_pci(struct pci_bus *bus) in pci_bus_to_loongson_pci() argument
184 return (struct loongson_pci *)(bus->sysdata); in pci_bus_to_loongson_pci()
186 cfg = bus->sysdata; in pci_bus_to_loongson_pci()
187 return (struct loongson_pci *)(cfg->priv); in pci_bus_to_loongson_pci()
190 static void __iomem *cfg0_map(struct loongson_pci *priv, struct pci_bus *bus, in cfg0_map() argument
194 unsigned char busnum = bus->number; in cfg0_map()
196 if (!pci_is_root_bus(bus)) { in cfg0_map()
201 return priv->cfg0_base + addroff; in cfg0_map()
204 static void __iomem *cfg1_map(struct loongson_pci *priv, struct pci_bus *bus, in cfg1_map() argument
208 unsigned char busnum = bus->number; in cfg1_map()
210 if (!pci_is_root_bus(bus)) { in cfg1_map()
215 return priv->cfg1_base + addroff; in cfg1_map()
218 static bool pdev_may_exist(struct pci_bus *bus, unsigned int device, in pdev_may_exist() argument
221 return !(pci_is_root_bus(bus) && in pdev_may_exist()
225 static void __iomem *pci_loongson_map_bus(struct pci_bus *bus, in pci_loongson_map_bus() argument
230 struct loongson_pci *priv = pci_bus_to_loongson_pci(bus); in pci_loongson_map_bus()
233 * Do not read more than one device on the bus other than in pci_loongson_map_bus()
234 * the host bus. in pci_loongson_map_bus()
236 if ((priv->data->flags & FLAG_DEV_FIX) && bus->self) { in pci_loongson_map_bus()
237 if (!pci_is_root_bus(bus) && (device > 0)) in pci_loongson_map_bus()
241 /* Don't access non-existent devices */ in pci_loongson_map_bus()
242 if (priv->data->flags & FLAG_DEV_HIDDEN) { in pci_loongson_map_bus()
243 if (!pdev_may_exist(bus, device, function)) in pci_loongson_map_bus()
248 if (where < PCI_CFG_SPACE_SIZE && priv->cfg0_base) in pci_loongson_map_bus()
249 return cfg0_map(priv, bus, devfn, where); in pci_loongson_map_bus()
252 if (where < PCI_CFG_SPACE_EXP_SIZE && priv->cfg1_base) in pci_loongson_map_bus()
253 return cfg1_map(priv, bus, devfn, where); in pci_loongson_map_bus()
278 /* LS2K/LS7A accept 8/16/32-bit PCI config operations */
285 /* RS780/SR5690 only accept 32-bit PCI config operations */
308 { .compatible = "loongson,ls2k-pci",
309 .data = &ls2k_pci_data, },
310 { .compatible = "loongson,ls7a-pci",
311 .data = &ls7a_pci_data, },
312 { .compatible = "loongson,rs780e-pci",
313 .data = &rs780e_pci_data, },
320 struct device *dev = &pdev->dev; in loongson_pci_probe()
321 struct device_node *node = dev->of_node; in loongson_pci_probe()
326 return -ENODEV; in loongson_pci_probe()
330 return -ENODEV; in loongson_pci_probe()
333 priv->pdev = pdev; in loongson_pci_probe()
334 priv->data = of_device_get_match_data(dev); in loongson_pci_probe()
336 if (priv->data->flags & FLAG_CFG0) { in loongson_pci_probe()
341 priv->cfg0_base = devm_pci_remap_cfg_resource(dev, regs); in loongson_pci_probe()
342 if (IS_ERR(priv->cfg0_base)) in loongson_pci_probe()
343 return PTR_ERR(priv->cfg0_base); in loongson_pci_probe()
347 if (priv->data->flags & FLAG_CFG1) { in loongson_pci_probe()
352 priv->cfg1_base = devm_pci_remap_cfg_resource(dev, regs); in loongson_pci_probe()
353 if (IS_ERR(priv->cfg1_base)) in loongson_pci_probe()
354 priv->cfg1_base = NULL; in loongson_pci_probe()
358 bridge->sysdata = priv; in loongson_pci_probe()
359 bridge->ops = priv->data->ops; in loongson_pci_probe()
360 bridge->map_irq = loongson_map_irq; in loongson_pci_probe()
367 .name = "loongson-pci",
380 struct device *dev = cfg->parent; in loongson_pci_ecam_init()
382 struct loongson_pci_data *data; in loongson_pci_ecam_init() local
386 return -ENOMEM; in loongson_pci_ecam_init()
388 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in loongson_pci_ecam_init()
389 if (!data) in loongson_pci_ecam_init()
390 return -ENOMEM; in loongson_pci_ecam_init()
392 cfg->priv = priv; in loongson_pci_ecam_init()
393 data->flags = FLAG_CFG1 | FLAG_DEV_HIDDEN; in loongson_pci_ecam_init()
394 priv->data = data; in loongson_pci_ecam_init()
395 priv->cfg1_base = cfg->win - (cfg->busr.start << 16); in loongson_pci_ecam_init()