2 * The PCI Library -- Generic Direct Access Functions
4 * Copyright (c) 1997--2000 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 pci_generic_fill_info(struct pci_dev
*d
, int flags
)
80 struct pci_access
*a
= d
->access
;
82 if ((flags
& (PCI_FILL_BASES
| PCI_FILL_ROM_BASE
)) && d
->hdrtype
< 0)
83 d
->hdrtype
= pci_read_byte(d
, PCI_HEADER_TYPE
) & 0x7f;
84 if (flags
& PCI_FILL_IDENT
)
86 d
->vendor_id
= pci_read_word(d
, PCI_VENDOR_ID
);
87 d
->device_id
= pci_read_word(d
, PCI_DEVICE_ID
);
89 if (flags
& PCI_FILL_CLASS
)
90 d
->device_class
= pci_read_word(d
, PCI_CLASS_DEVICE
);
91 if (flags
& PCI_FILL_IRQ
)
92 d
->irq
= pci_read_byte(d
, PCI_INTERRUPT_LINE
);
93 if (flags
& PCI_FILL_BASES
)
96 memset(d
->base_addr
, 0, sizeof(d
->base_addr
));
99 case PCI_HEADER_TYPE_NORMAL
:
102 case PCI_HEADER_TYPE_BRIDGE
:
105 case PCI_HEADER_TYPE_CARDBUS
:
111 for (i
=0; i
<cnt
; i
++)
113 u32 x
= pci_read_long(d
, PCI_BASE_ADDRESS_0
+ i
*4);
114 if (!x
|| x
== (u32
) ~0)
116 if ((x
& PCI_BASE_ADDRESS_SPACE
) == PCI_BASE_ADDRESS_SPACE_IO
)
120 if ((x
& PCI_BASE_ADDRESS_MEM_TYPE_MASK
) != PCI_BASE_ADDRESS_MEM_TYPE_64
)
123 a
->warning("%04x:%02x:%02x.%d: Invalid 64-bit address seen for BAR %d.", d
->domain
, d
->bus
, d
->dev
, d
->func
, i
);
126 u32 y
= pci_read_long(d
, PCI_BASE_ADDRESS_0
+ (++i
)*4);
127 #ifdef PCI_HAVE_64BIT_ADDRESS
128 d
->base_addr
[i
-1] = x
| (((pciaddr_t
) y
) << 32);
131 a
->warning("%04x:%02x:%02x.%d 64-bit device address ignored.", d
->domain
, d
->bus
, d
->dev
, d
->func
);
133 d
->base_addr
[i
-1] = x
;
140 if (flags
& PCI_FILL_ROM_BASE
)
143 d
->rom_base_addr
= 0;
146 case PCI_HEADER_TYPE_NORMAL
:
147 reg
= PCI_ROM_ADDRESS
;
149 case PCI_HEADER_TYPE_BRIDGE
:
150 reg
= PCI_ROM_ADDRESS1
;
155 u32 u
= pci_read_long(d
, reg
);
157 d
->rom_base_addr
= u
;
160 if (flags
& (PCI_FILL_CAPS
| PCI_FILL_EXT_CAPS
))
161 flags
|= pci_scan_caps(d
, flags
);
162 return flags
& ~PCI_FILL_SIZES
;
166 pci_generic_block_op(struct pci_dev
*d
, int pos
, byte
*buf
, int len
,
167 int (*r
)(struct pci_dev
*d
, int pos
, byte
*buf
, int len
))
169 if ((pos
& 1) && len
>= 1)
171 if (!r(d
, pos
, buf
, 1))
175 if ((pos
& 3) && len
>= 2)
177 if (!r(d
, pos
, buf
, 2))
179 pos
+= 2; buf
+= 2; len
-= 2;
183 if (!r(d
, pos
, buf
, 4))
185 pos
+= 4; buf
+= 4; len
-= 4;
189 if (!r(d
, pos
, buf
, 2))
191 pos
+= 2; buf
+= 2; len
-= 2;
193 if (len
&& !r(d
, pos
, buf
, 1))
199 pci_generic_block_read(struct pci_dev
*d
, int pos
, byte
*buf
, int len
)
201 return pci_generic_block_op(d
, pos
, buf
, len
, d
->access
->methods
->read
);
205 pci_generic_block_write(struct pci_dev
*d
, int pos
, byte
*buf
, int len
)
207 return pci_generic_block_op(d
, pos
, buf
, len
, d
->access
->methods
->write
);