Lines Matching refs:pdev

75     struct rt_pci_device *pdev = rt_calloc(1, sizeof(*pdev));  in rt_pci_alloc_device()  local
77 if (!pdev) in rt_pci_alloc_device()
82 rt_list_init(&pdev->list); in rt_pci_alloc_device()
83 pdev->bus = bus; in rt_pci_alloc_device()
88 rt_list_insert_before(&bus->devices_nodes, &pdev->list); in rt_pci_alloc_device()
92 pdev->subsystem_vendor = PCI_ANY_ID; in rt_pci_alloc_device()
93 pdev->subsystem_device = PCI_ANY_ID; in rt_pci_alloc_device()
95 pdev->irq = -1; in rt_pci_alloc_device()
97 for (int i = 0; i < RT_ARRAY_SIZE(pdev->resource); ++i) in rt_pci_alloc_device()
99 pdev->resource[i].flags = PCI_BUS_REGION_F_NONE; in rt_pci_alloc_device()
103 rt_list_init(&pdev->msi_desc_nodes); in rt_pci_alloc_device()
104 rt_spin_lock_init(&pdev->msi_lock); in rt_pci_alloc_device()
107 return pdev; in rt_pci_alloc_device()
113 struct rt_pci_device *pdev = RT_NULL; in rt_pci_scan_single_device() local
130 if (!(pdev = rt_pci_alloc_device(bus))) in rt_pci_scan_single_device()
135 pdev->devfn = devfn; in rt_pci_scan_single_device()
136 pdev->vendor = vendor; in rt_pci_scan_single_device()
137 pdev->device = device; in rt_pci_scan_single_device()
139 rt_dm_dev_set_name(&pdev->parent, "%04x:%02x:%02x.%u", in rt_pci_scan_single_device()
140 rt_pci_domain(pdev), pdev->bus->number, in rt_pci_scan_single_device()
141 RT_PCI_SLOT(pdev->devfn), RT_PCI_FUNC(pdev->devfn)); in rt_pci_scan_single_device()
143 if (rt_pci_setup_device(pdev)) in rt_pci_scan_single_device()
145 rt_free(pdev); in rt_pci_scan_single_device()
146 pdev = RT_NULL; in rt_pci_scan_single_device()
151 pci_procfs_attach(pdev); in rt_pci_scan_single_device()
152 rt_pci_device_register(pdev); in rt_pci_scan_single_device()
155 return pdev; in rt_pci_scan_single_device()
158 static rt_bool_t pci_intx_mask_broken(struct rt_pci_device *pdev) in pci_intx_mask_broken() argument
163 rt_pci_read_config_u16(pdev, PCIR_COMMAND, &orig); in pci_intx_mask_broken()
165 rt_pci_write_config_u16(pdev, PCIR_COMMAND, toggle); in pci_intx_mask_broken()
166 rt_pci_read_config_u16(pdev, PCIR_COMMAND, &new); in pci_intx_mask_broken()
168 rt_pci_write_config_u16(pdev, PCIR_COMMAND, orig); in pci_intx_mask_broken()
178 static void pci_read_irq(struct rt_pci_device *pdev) in pci_read_irq() argument
182 rt_pci_read_config_u8(pdev, PCIR_INTPIN, &irq); in pci_read_irq()
183 pdev->pin = irq; in pci_read_irq()
187 rt_pci_read_config_u8(pdev, PCIR_INTLINE, &irq); in pci_read_irq()
189 pdev->irq = irq; in pci_read_irq()
192 static void pcie_set_port_type(struct rt_pci_device *pdev) in pcie_set_port_type() argument
196 if (!(pos = rt_pci_find_capability(pdev, PCIY_EXPRESS))) in pcie_set_port_type()
201 pdev->pcie_cap = pos; in pcie_set_port_type()
204 static void pci_configure_ari(struct rt_pci_device *pdev) in pci_configure_ari() argument
209 if (!rt_pci_is_pcie(pdev) || pdev->devfn) in pci_configure_ari()
214 bridge = pdev->bus->self; in pci_configure_ari()
216 if (rt_pci_is_root_bus(pdev->bus) || !bridge) in pci_configure_ari()
229 if (rt_pci_find_ext_capability(pdev, PCIZ_ARI)) in pci_configure_ari()
243 static rt_uint16_t pci_cfg_space_size_ext(struct rt_pci_device *pdev) in pci_cfg_space_size_ext() argument
247 if (rt_pci_read_config_u32(pdev, PCI_REGMAX + 1, &status)) in pci_cfg_space_size_ext()
255 static rt_uint16_t pci_cfg_space_size(struct rt_pci_device *pdev) in pci_cfg_space_size() argument
259 rt_uint16_t class = pdev->class >> 8; in pci_cfg_space_size()
263 return pci_cfg_space_size_ext(pdev); in pci_cfg_space_size()
266 if (rt_pci_is_pcie(pdev)) in pci_cfg_space_size()
268 return pci_cfg_space_size_ext(pdev); in pci_cfg_space_size()
271 pos = rt_pci_find_capability(pdev, PCIY_PCIX); in pci_cfg_space_size()
277 rt_pci_read_config_u32(pdev, pos + PCIXR_STATUS, &status); in pci_cfg_space_size()
280 return pci_cfg_space_size_ext(pdev); in pci_cfg_space_size()
286 static void pci_init_capabilities(struct rt_pci_device *pdev) in pci_init_capabilities() argument
288 rt_pci_pme_init(pdev); in pci_init_capabilities()
291 rt_pci_msi_init(pdev); /* Disable MSI */ in pci_init_capabilities()
292 rt_pci_msix_init(pdev); /* Disable MSI-X */ in pci_init_capabilities()
295 pcie_set_port_type(pdev); in pci_init_capabilities()
296 pdev->cfg_size = pci_cfg_space_size(pdev); in pci_init_capabilities()
297 pci_configure_ari(pdev); in pci_init_capabilities()
299 pdev->no_msi = RT_FALSE; in pci_init_capabilities()
300 pdev->msi_enabled = RT_FALSE; in pci_init_capabilities()
301 pdev->msix_enabled = RT_FALSE; in pci_init_capabilities()
304 rt_err_t rt_pci_setup_device(struct rt_pci_device *pdev) in rt_pci_setup_device() argument
310 if (!pdev) in rt_pci_setup_device()
315 if (!(host_bridge = rt_pci_find_host_bridge(pdev->bus))) in rt_pci_setup_device()
320 rt_pci_ofw_device_init(pdev); in rt_pci_setup_device()
322 rt_pci_read_config_u32(pdev, PCIR_REVID, &class); in rt_pci_setup_device()
324 pdev->revision = class & 0xff; in rt_pci_setup_device()
325 pdev->class = class >> 8; /* Upper 3 bytes */ in rt_pci_setup_device()
326 rt_pci_read_config_u8(pdev, PCIR_HDRTYPE, &pdev->hdr_type); in rt_pci_setup_device()
329 rt_pci_write_config_u16(pdev, PCIR_STATUS, 0xffff); in rt_pci_setup_device()
331 if (pdev->hdr_type & 0x80) in rt_pci_setup_device()
333 pdev->multi_function = RT_TRUE; in rt_pci_setup_device()
335 pdev->hdr_type &= PCIM_HDRTYPE; in rt_pci_setup_device()
337 if (pci_intx_mask_broken(pdev)) in rt_pci_setup_device()
339 pdev->broken_intx_masking = RT_TRUE; in rt_pci_setup_device()
342 rt_dm_dev_set_name(&pdev->parent, "%04x:%02x:%02x.%u", rt_pci_domain(pdev), in rt_pci_setup_device()
343 pdev->bus->number, RT_PCI_SLOT(pdev->devfn), RT_PCI_FUNC(pdev->devfn)); in rt_pci_setup_device()
345 switch (pdev->hdr_type) in rt_pci_setup_device()
352 pci_read_irq(pdev); in rt_pci_setup_device()
353 rt_pci_device_alloc_resource(host_bridge, pdev); in rt_pci_setup_device()
354 rt_pci_read_config_u16(pdev, PCIR_SUBVEND_0, &pdev->subsystem_vendor); in rt_pci_setup_device()
355 rt_pci_read_config_u16(pdev, PCIR_SUBDEV_0, &pdev->subsystem_device); in rt_pci_setup_device()
359 pci_read_irq(pdev); in rt_pci_setup_device()
360 rt_pci_device_alloc_resource(host_bridge, pdev); in rt_pci_setup_device()
361 pos = rt_pci_find_capability(pdev, PCIY_SUBVENDOR); in rt_pci_setup_device()
364 rt_pci_read_config_u16(pdev, PCIR_SUBVENDCAP, &pdev->subsystem_vendor); in rt_pci_setup_device()
365 rt_pci_read_config_u16(pdev, PCIR_SUBDEVCAP, &pdev->subsystem_device); in rt_pci_setup_device()
374 pci_read_irq(pdev); in rt_pci_setup_device()
375 rt_pci_device_alloc_resource(host_bridge, pdev); in rt_pci_setup_device()
376 rt_pci_read_config_u16(pdev, PCIR_SUBVEND_2, &pdev->subsystem_vendor); in rt_pci_setup_device()
377 rt_pci_read_config_u16(pdev, PCIR_SUBDEV_2, &pdev->subsystem_device); in rt_pci_setup_device()
381 LOG_E("Ignoring device unknown header type %02x", pdev->hdr_type); in rt_pci_setup_device()
385 LOG_E("Ignoring class %08x (doesn't match header type %02x)", pdev->class, pdev->hdr_type); in rt_pci_setup_device()
386 pdev->class = PCIC_NOT_DEFINED << 8; in rt_pci_setup_device()
389 pci_init_capabilities(pdev); in rt_pci_setup_device()
391 if (rt_pci_is_pcie(pdev)) in rt_pci_setup_device()
393 rt_pci_read_config_u16(pdev, pdev->pcie_cap + PCIER_FLAGS, &pdev->exp_flags); in rt_pci_setup_device()
402 struct rt_pci_host_bridge *host_bridge, struct rt_pci_device *pdev) in pci_child_bus_init() argument
408 bus->self = pdev; in pci_child_bus_init()
432 static rt_bool_t pci_ea_fixed_busnrs(struct rt_pci_device *pdev, in pci_ea_fixed_busnrs() argument
439 pos = rt_pci_find_capability(pdev, PCIY_EA); in pci_ea_fixed_busnrs()
446 rt_pci_read_config_u32(pdev, offset, &dw); in pci_ea_fixed_busnrs()
460 static void pcie_fixup_link(struct rt_pci_device *pdev) in pcie_fixup_link() argument
462 int pos = pdev->pcie_cap; in pcie_fixup_link()
464 rt_uint16_t exp_type = pdev->exp_flags & PCIEM_FLAGS_TYPE; in pcie_fixup_link()
466 if ((pdev->exp_flags & PCIEM_FLAGS_VERSION) < 2) in pcie_fixup_link()
478 rt_pci_read_config_u16(pdev, pos + PCIER_LINK_CTL, &exp_lnkctl); in pcie_fixup_link()
479 rt_pci_read_config_u16(pdev, pos + PCIER_LINK_CTL2, &exp_lnkctl2); in pcie_fixup_link()
481 rt_pci_write_config_u16(pdev, pos + PCIER_LINK_CTL2, in pcie_fixup_link()
483 rt_pci_write_config_u16(pdev, pos + PCIER_LINK_CTL, in pcie_fixup_link()
488 rt_pci_read_config_u16(pdev, pos + PCIER_LINK_STA, &exp_lnksta); in pcie_fixup_link()
499 rt_pci_write_config_u16(pdev, pos + PCIER_LINK_CTL2, exp_lnkctl2); in pcie_fixup_link()
500 rt_pci_write_config_u16(pdev, pos + PCIER_LINK_CTL, in pcie_fixup_link()
508 static rt_uint32_t pci_scan_bridge_extend(struct rt_pci_bus *bus, struct rt_pci_device *pdev, in pci_scan_bridge_extend() argument
519 if (pdev->hdr_type == PCIM_HDRTYPE_CARDBUS) in pci_scan_bridge_extend()
526 rt_pci_read_config_u32(pdev, PCIR_PRIBUS_1, &value); in pci_scan_bridge_extend()
542 if (pdev->pcie_cap) in pci_scan_bridge_extend()
544 pcie_fixup_link(pdev); in pci_scan_bridge_extend()
555 rt_pci_write_config_u16(pdev, PCIR_STATUS, RT_UINT16_MAX); in pci_scan_bridge_extend()
557 fixed_buses = pci_ea_fixed_busnrs(pdev, &fixed_sec, &fixed_sub); in pci_scan_bridge_extend()
565 rt_pci_write_config_u32(pdev, PCIR_PRIBUS_1, value & ~0xffffff); in pci_scan_bridge_extend()
573 if (pci_child_bus_init(next_bus, bus_no, host_bridge, pdev)) in pci_scan_bridge_extend()
580 rt_pci_write_config_u32(pdev, PCIR_PRIBUS_1, value); in pci_scan_bridge_extend()
586 rt_pci_write_config_u32(pdev, PCIR_PRIBUS_1, value); in pci_scan_bridge_extend()
592 rt_pci_write_config_u8(pdev, PCIR_SUBBUS_1, bus_no); in pci_scan_bridge_extend()
598 rt_uint32_t rt_pci_scan_bridge(struct rt_pci_bus *bus, struct rt_pci_device *pdev, in rt_pci_scan_bridge() argument
601 if (!bus || !pdev) in rt_pci_scan_bridge()
606 return pci_scan_bridge_extend(bus, pdev, bus_no_start, 0, reconfigured); in rt_pci_scan_bridge()
611 struct rt_pci_device *pdev; in only_one_child() local
618 pdev = bus->self; in only_one_child()
620 if (rt_pci_is_pcie(pdev)) in only_one_child()
622 rt_uint16_t exp_type = pdev->exp_flags & PCIEM_FLAGS_TYPE; in only_one_child()
635 static int next_fn(struct rt_pci_bus *bus, struct rt_pci_device *pdev, int fn) in next_fn() argument
642 if (!pdev) in next_fn()
647 pos = rt_pci_find_ext_capability(pdev, PCIZ_ARI); in next_fn()
654 rt_pci_read_config_u16(pdev, pos + PCIR_ARI_CAP, &cap); in next_fn()
670 if (pdev && !pdev->multi_function) in next_fn()
681 struct rt_pci_device *pdev = RT_NULL; in rt_pci_scan_slot() local
693 for (int func = 0; func >= 0; func = next_fn(bus, pdev, func)) in rt_pci_scan_slot()
695 pdev = rt_pci_scan_single_device(bus, devfn + func); in rt_pci_scan_slot()
697 if (pdev) in rt_pci_scan_slot()
703 pdev->multi_function = RT_TRUE; in rt_pci_scan_slot()
718 struct rt_pci_device *pdev = RT_NULL; in rt_pci_scan_child_buses() local
736 rt_pci_foreach_bridge(pdev, bus) in rt_pci_scan_child_buses()
740 bus_no = pci_scan_bridge_extend(bus, pdev, bus_no, buses, RT_TRUE); in rt_pci_scan_child_buses()
836 static rt_bool_t pci_remove_bus_device(struct rt_pci_device *pdev, void *data) in pci_remove_bus_device() argument
839 rt_bus_remove_device(&pdev->parent); in pci_remove_bus_device()
899 rt_err_t rt_pci_device_remove(struct rt_pci_device *pdev) in rt_pci_device_remove() argument
903 if (pdev) in rt_pci_device_remove()
905 struct rt_pci_bus *bus = pdev->bus; in rt_pci_device_remove()
907 pci_procfs_detach(pdev); in rt_pci_device_remove()
911 while (pdev->parent.ref_count > 1) in rt_pci_device_remove()
919 rt_list_remove(&pdev->list); in rt_pci_device_remove()
923 rt_free(pdev); in rt_pci_device_remove()