2 * The PCI Library -- Generic Direct Access Functions
4 * Copyright (c) 1997--2022 Martin Mares <mj@ucw.cz>
6 * Can be freely distributed and used under the terms of the GNU GPL.
14 pci_generic_scan_bus(struct pci_access
*a
, byte
*busmap
, int bus
)
19 a
->debug("Scanning bus %02x for devices...\n", bus
);
22 a
->warning("Bus %02x seen twice (firmware bug). Ignored.", bus
);
28 for (dev
=0; dev
<32; dev
++)
32 for (t
->func
=0; !t
->func
|| multi
&& t
->func
<8; t
->func
++)
34 u32 vd
= pci_read_long(t
, PCI_VENDOR_ID
);
37 if (!vd
|| vd
== 0xffffffff)
39 ht
= pci_read_byte(t
, PCI_HEADER_TYPE
);
47 d
->vendor_id
= vd
& 0xffff;
48 d
->device_id
= vd
>> 16U;
49 d
->known_fields
= PCI_FILL_IDENT
;
54 case PCI_HEADER_TYPE_NORMAL
:
56 case PCI_HEADER_TYPE_BRIDGE
:
57 case PCI_HEADER_TYPE_CARDBUS
:
58 pci_generic_scan_bus(a
, busmap
, pci_read_byte(t
, PCI_SECONDARY_BUS
));
61 a
->debug("Device %04x:%02x:%02x.%d has unknown header type %02x.\n", d
->domain
, d
->bus
, d
->dev
, d
->func
, ht
);
69 pci_generic_scan(struct pci_access
*a
)
73 memset(busmap
, 0, sizeof(busmap
));
74 pci_generic_scan_bus(a
, busmap
, 0);
78 get_hdr_type(struct pci_dev
*d
)
81 d
->hdrtype
= pci_read_byte(d
, PCI_HEADER_TYPE
) & 0x7f;
86 pci_generic_fill_info(struct pci_dev
*d
, unsigned int flags
)
88 struct pci_access
*a
= d
->access
;
90 if (want_fill(d
, flags
, PCI_FILL_IDENT
))
92 d
->vendor_id
= pci_read_word(d
, PCI_VENDOR_ID
);
93 d
->device_id
= pci_read_word(d
, PCI_DEVICE_ID
);
96 if (want_fill(d
, flags
, PCI_FILL_CLASS
))
97 d
->device_class
= pci_read_word(d
, PCI_CLASS_DEVICE
);
99 if (want_fill(d
, flags
, PCI_FILL_CLASS_EXT
))
101 d
->prog_if
= pci_read_byte(d
, PCI_CLASS_PROG
);
102 d
->rev_id
= pci_read_byte(d
, PCI_REVISION_ID
);
105 if (want_fill(d
, flags
, PCI_FILL_SUBSYS
))
107 switch (get_hdr_type(d
))
109 case PCI_HEADER_TYPE_NORMAL
:
110 d
->subsys_vendor_id
= pci_read_word(d
, PCI_SUBSYSTEM_VENDOR_ID
);
111 d
->subsys_id
= pci_read_word(d
, PCI_SUBSYSTEM_ID
);
113 case PCI_HEADER_TYPE_CARDBUS
:
114 d
->subsys_vendor_id
= pci_read_word(d
, PCI_CB_SUBSYSTEM_VENDOR_ID
);
115 d
->subsys_id
= pci_read_word(d
, PCI_CB_SUBSYSTEM_ID
);
118 clear_fill(d
, PCI_FILL_SUBSYS
);
122 if (want_fill(d
, flags
, PCI_FILL_IRQ
))
123 d
->irq
= pci_read_byte(d
, PCI_INTERRUPT_LINE
);
125 if (want_fill(d
, flags
, PCI_FILL_BASES
))
128 memset(d
->base_addr
, 0, sizeof(d
->base_addr
));
129 switch (get_hdr_type(d
))
131 case PCI_HEADER_TYPE_NORMAL
:
134 case PCI_HEADER_TYPE_BRIDGE
:
137 case PCI_HEADER_TYPE_CARDBUS
:
143 for (i
=0; i
<cnt
; i
++)
145 u32 x
= pci_read_long(d
, PCI_BASE_ADDRESS_0
+ i
*4);
146 if (!x
|| x
== (u32
) ~0)
148 if ((x
& PCI_BASE_ADDRESS_SPACE
) == PCI_BASE_ADDRESS_SPACE_IO
)
152 if ((x
& PCI_BASE_ADDRESS_MEM_TYPE_MASK
) != PCI_BASE_ADDRESS_MEM_TYPE_64
)
155 a
->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.", d
->domain
, d
->bus
, d
->dev
, d
->func
, i
);
158 u32 y
= pci_read_long(d
, PCI_BASE_ADDRESS_0
+ (++i
)*4);
159 #ifdef PCI_HAVE_64BIT_ADDRESS
160 d
->base_addr
[i
-1] = x
| (((pciaddr_t
) y
) << 32);
163 a
->warning("%04x:%02x:%02x.%d 64-bit device address ignored.", d
->domain
, d
->bus
, d
->dev
, d
->func
);
165 d
->base_addr
[i
-1] = x
;
173 if (want_fill(d
, flags
, PCI_FILL_ROM_BASE
))
176 d
->rom_base_addr
= 0;
177 switch (get_hdr_type(d
))
179 case PCI_HEADER_TYPE_NORMAL
:
180 reg
= PCI_ROM_ADDRESS
;
182 case PCI_HEADER_TYPE_BRIDGE
:
183 reg
= PCI_ROM_ADDRESS1
;
188 u32 u
= pci_read_long(d
, reg
);
190 d
->rom_base_addr
= u
;
194 pci_scan_caps(d
, flags
);
198 pci_generic_block_op(struct pci_dev
*d
, int pos
, byte
*buf
, int len
,
199 int (*r
)(struct pci_dev
*d
, int pos
, byte
*buf
, int len
))
201 if ((pos
& 1) && len
>= 1)
203 if (!r(d
, pos
, buf
, 1))
207 if ((pos
& 3) && len
>= 2)
209 if (!r(d
, pos
, buf
, 2))
211 pos
+= 2; buf
+= 2; len
-= 2;
215 if (!r(d
, pos
, buf
, 4))
217 pos
+= 4; buf
+= 4; len
-= 4;
221 if (!r(d
, pos
, buf
, 2))
223 pos
+= 2; buf
+= 2; len
-= 2;
225 if (len
&& !r(d
, pos
, buf
, 1))
231 pci_generic_block_read(struct pci_dev
*d
, int pos
, byte
*buf
, int len
)
233 return pci_generic_block_op(d
, pos
, buf
, len
, d
->access
->methods
->read
);
237 pci_generic_block_write(struct pci_dev
*d
, int pos
, byte
*buf
, int len
)
239 return pci_generic_block_op(d
, pos
, buf
, len
, d
->access
->methods
->write
);