Lines Matching refs:dev
10 void pci_cap_walk(struct pci_dev *dev, pci_cap_handler_t handler) in pci_cap_walk() argument
16 cap_offset = pci_config_readb(dev->bdf, PCI_CAPABILITY_LIST); in pci_cap_walk()
18 cap_id = pci_config_readb(dev->bdf, cap_offset); in pci_cap_walk()
20 handler(dev, cap_offset, cap_id); in pci_cap_walk()
21 cap_offset = pci_config_readb(dev->bdf, cap_offset + 1); in pci_cap_walk()
27 void pci_msi_set_enable(struct pci_dev *dev, bool enabled) in pci_msi_set_enable() argument
32 offset = dev->msi_offset; in pci_msi_set_enable()
33 msi_control = pci_config_readw(dev->bdf, offset + PCI_MSI_FLAGS); in pci_msi_set_enable()
40 pci_config_writew(dev->bdf, offset + PCI_MSI_FLAGS, msi_control); in pci_msi_set_enable()
43 bool pci_setup_msi(struct pci_dev *dev, uint64_t msi_addr, uint32_t msi_data) in pci_setup_msi() argument
49 assert(dev); in pci_setup_msi()
51 if (!dev->msi_offset) { in pci_setup_msi()
52 printf("MSI: dev %#x does not support MSI.\n", dev->bdf); in pci_setup_msi()
56 addr = dev->bdf; in pci_setup_msi()
57 offset = dev->msi_offset; in pci_setup_msi()
70 pci_msi_set_enable(dev, true); in pci_setup_msi()
75 void pci_cmd_set_clr(struct pci_dev *dev, uint16_t set, uint16_t clr) in pci_cmd_set_clr() argument
77 uint16_t val = pci_config_readw(dev->bdf, PCI_COMMAND); in pci_cmd_set_clr()
84 pci_config_writew(dev->bdf, PCI_COMMAND, val); in pci_cmd_set_clr()
87 bool pci_dev_exists(pcidevaddr_t dev) in pci_dev_exists() argument
89 return (pci_config_readw(dev, PCI_VENDOR_ID) != 0xffff && in pci_dev_exists()
90 pci_config_readw(dev, PCI_DEVICE_ID) != 0xffff); in pci_dev_exists()
96 pcidevaddr_t dev; in pci_find_dev() local
98 for (dev = 0; dev < PCI_DEVFN_MAX; ++dev) { in pci_find_dev()
99 if (pci_config_readw(dev, PCI_VENDOR_ID) == vendor_id && in pci_find_dev()
100 pci_config_readw(dev, PCI_DEVICE_ID) == device_id) in pci_find_dev()
101 return dev; in pci_find_dev()
113 uint32_t pci_bar_get(struct pci_dev *dev, int bar_num) in pci_bar_get() argument
117 return pci_config_readl(dev->bdf, PCI_BASE_ADDRESS_0 + in pci_bar_get()
121 static phys_addr_t __pci_bar_get_addr(struct pci_dev *dev, int bar_num) in __pci_bar_get_addr() argument
123 uint32_t bar = pci_bar_get(dev, bar_num); in __pci_bar_get_addr()
128 if (pci_bar_is64(dev, bar_num)) in __pci_bar_get_addr()
129 addr |= (uint64_t)pci_bar_get(dev, bar_num + 1) << 32; in __pci_bar_get_addr()
131 phys_addr = pci_translate_addr(dev->bdf, addr); in __pci_bar_get_addr()
137 phys_addr_t pci_bar_get_addr(struct pci_dev *dev, int bar_num) in pci_bar_get_addr() argument
141 return dev->resource[bar_num]; in pci_bar_get_addr()
144 void pci_bar_set_addr(struct pci_dev *dev, int bar_num, phys_addr_t addr) in pci_bar_set_addr() argument
149 assert(dev->resource[bar_num] != INVALID_PHYS_ADDR); in pci_bar_set_addr()
152 if (pci_bar_is64(dev, bar_num)) in pci_bar_set_addr()
157 pci_config_writel(dev->bdf, off, (uint32_t)addr); in pci_bar_set_addr()
158 dev->resource[bar_num] = addr; in pci_bar_set_addr()
160 if (pci_bar_is64(dev, bar_num)) { in pci_bar_set_addr()
161 pci_config_writel(dev->bdf, off + 4, (uint32_t)(addr >> 32)); in pci_bar_set_addr()
162 dev->resource[bar_num + 1] = dev->resource[bar_num]; in pci_bar_set_addr()
176 static uint32_t pci_bar_size_helper(struct pci_dev *dev, int bar_num) in pci_bar_size_helper() argument
179 uint16_t bdf = dev->bdf; in pci_bar_size_helper()
190 phys_addr_t pci_bar_size(struct pci_dev *dev, int bar_num) in pci_bar_size() argument
194 size = pci_bar_size_helper(dev, bar_num); in pci_bar_size()
198 bar = pci_bar_get(dev, bar_num); in pci_bar_size()
201 if (pci_bar_is64(dev, bar_num)) { in pci_bar_size()
202 phys_addr_t size64 = pci_bar_size_helper(dev, bar_num + 1); in pci_bar_size()
211 bool pci_bar_is_memory(struct pci_dev *dev, int bar_num) in pci_bar_is_memory() argument
213 uint32_t bar = pci_bar_get(dev, bar_num); in pci_bar_is_memory()
218 bool pci_bar_is_valid(struct pci_dev *dev, int bar_num) in pci_bar_is_valid() argument
220 return dev->resource[bar_num] != INVALID_PHYS_ADDR; in pci_bar_is_valid()
223 bool pci_bar_is64(struct pci_dev *dev, int bar_num) in pci_bar_is64() argument
225 uint32_t bar = pci_bar_get(dev, bar_num); in pci_bar_is64()
234 void pci_bar_print(struct pci_dev *dev, int bar_num) in pci_bar_print() argument
239 if (!pci_bar_is_valid(dev, bar_num)) in pci_bar_print()
242 bar = pci_bar_get(dev, bar_num); in pci_bar_print()
243 size = pci_bar_size(dev, bar_num); in pci_bar_print()
244 start = pci_bar_get_addr(dev, bar_num); in pci_bar_print()
247 if (pci_bar_is64(dev, bar_num)) { in pci_bar_print()
280 void pci_dev_print_id(struct pci_dev *dev) in pci_dev_print_id() argument
282 pcidevaddr_t bdf = dev->bdf; in pci_dev_print_id()
289 static void pci_cap_print(struct pci_dev *dev, int cap_offset, int cap_id) in pci_cap_print() argument
293 uint16_t control = pci_config_readw(dev->bdf, cap_offset + PCI_MSI_FLAGS); in pci_cap_print()
304 void pci_dev_print(struct pci_dev *dev) in pci_dev_print() argument
306 pcidevaddr_t bdf = dev->bdf; in pci_dev_print()
313 pci_dev_print_id(dev); in pci_dev_print()
317 pci_cap_walk(dev, pci_cap_print); in pci_dev_print()
323 if (pci_bar_is_valid(dev, i)) { in pci_dev_print()
325 pci_bar_print(dev, i); in pci_dev_print()
328 if (pci_bar_is64(dev, i)) in pci_dev_print()
346 void pci_dev_init(struct pci_dev *dev, pcidevaddr_t bdf) in pci_dev_init() argument
350 memset(dev, 0, sizeof(*dev)); in pci_dev_init()
351 dev->bdf = bdf; in pci_dev_init()
354 if (pci_bar_size(dev, i)) { in pci_dev_init()
355 dev->resource[i] = __pci_bar_get_addr(dev, i); in pci_dev_init()
356 if (pci_bar_is64(dev, i)) { in pci_dev_init()
358 dev->resource[i + 1] = dev->resource[i]; in pci_dev_init()
362 dev->resource[i] = INVALID_PHYS_ADDR; in pci_dev_init()
367 uint8_t pci_intx_line(struct pci_dev *dev) in pci_intx_line() argument
369 return pci_config_readb(dev->bdf, PCI_INTERRUPT_LINE); in pci_intx_line()
372 static void pci_cap_setup(struct pci_dev *dev, int cap_offset, int cap_id) in pci_cap_setup() argument
376 dev->msi_offset = cap_offset; in pci_cap_setup()
381 void pci_enable_defaults(struct pci_dev *dev) in pci_enable_defaults() argument
384 pci_cmd_set_clr(dev, PCI_COMMAND_MASTER, 0); in pci_enable_defaults()
385 pci_cap_walk(dev, pci_cap_setup); in pci_enable_defaults()