Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
3119cfff
Commit
3119cfff
authored
Jun 20, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/gregkh/linux/pci-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
e6d3a689
13ce7788
Changes
26
Hide whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
391 additions
and
235 deletions
+391
-235
MAINTAINERS
MAINTAINERS
+3
-3
arch/i386/pci/common.c
arch/i386/pci/common.c
+20
-3
arch/i386/pci/direct.c
arch/i386/pci/direct.c
+25
-57
arch/i386/pci/fixup.c
arch/i386/pci/fixup.c
+3
-3
arch/i386/pci/irq.c
arch/i386/pci/irq.c
+1
-1
arch/i386/pci/legacy.c
arch/i386/pci/legacy.c
+3
-3
arch/i386/pci/numa.c
arch/i386/pci/numa.c
+7
-19
arch/i386/pci/pcbios.c
arch/i386/pci/pcbios.c
+5
-17
arch/i386/pci/pci.h
arch/i386/pci/pci.h
+1
-1
arch/ia64/pci/pci.c
arch/ia64/pci/pci.c
+19
-14
drivers/acpi/osl.c
drivers/acpi/osl.c
+12
-29
drivers/acpi/pci_root.c
drivers/acpi/pci_root.c
+0
-2
drivers/pci/bus.c
drivers/pci/bus.c
+6
-0
drivers/pci/hotplug.c
drivers/pci/hotplug.c
+23
-11
drivers/pci/pci-driver.c
drivers/pci/pci-driver.c
+10
-10
drivers/pci/pci-sysfs.c
drivers/pci/pci-sysfs.c
+11
-13
drivers/pci/pci.h
drivers/pci/pci.h
+3
-0
drivers/pci/probe.c
drivers/pci/probe.c
+1
-1
drivers/pci/proc.c
drivers/pci/proc.c
+26
-20
drivers/pci/search.c
drivers/pci/search.c
+135
-16
include/asm-alpha/pci.h
include/asm-alpha/pci.h
+12
-0
include/asm-ia64/pci.h
include/asm-ia64/pci.h
+10
-0
include/asm-ppc/pci.h
include/asm-ppc/pci.h
+7
-0
include/asm-ppc64/pci.h
include/asm-ppc64/pci.h
+7
-0
include/asm-sparc64/pci.h
include/asm-sparc64/pci.h
+7
-0
include/linux/pci.h
include/linux/pci.h
+34
-12
No files found.
MAINTAINERS
View file @
3119cfff
...
...
@@ -1429,10 +1429,10 @@ W: http://www.ife.ee.ethz.ch/~sailer/linux/pciaudio.html
S: Maintained
PCI SUBSYSTEM
P:
Martin Mares
M:
mj@ucw.cz
P:
Greg Kroah-Hartman
M:
greg@kroah.com
L: linux-kernel@vger.kernel.org
S:
Odd Fixes
S:
Supported
PCI HOTPLUG CORE
P: Greg Kroah-Hartman
...
...
arch/i386/pci/common.c
View file @
3119cfff
...
...
@@ -23,7 +23,24 @@ unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2;
int
pcibios_last_bus
=
-
1
;
struct
pci_bus
*
pci_root_bus
=
NULL
;
struct
pci_ops
*
pci_root_ops
=
NULL
;
struct
pci_raw_ops
*
raw_pci_ops
;
static
int
pci_read
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
value
)
{
return
raw_pci_ops
->
read
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
int
pci_write
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
value
)
{
return
raw_pci_ops
->
write
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
struct
pci_ops
pci_root_ops
=
{
.
read
=
pci_read
,
.
write
=
pci_write
,
};
/*
* legacy, numa, and acpi all want to call pcibios_scan_root
...
...
@@ -115,7 +132,7 @@ struct pci_bus * __devinit pcibios_scan_root(int busnum)
printk
(
"PCI: Probing PCI hardware (bus %02x)
\n
"
,
busnum
);
return
pci_scan_bus
(
busnum
,
pci_root_ops
,
NULL
);
return
pci_scan_bus
(
busnum
,
&
pci_root_ops
,
NULL
);
}
extern
u8
pci_cache_line_size
;
...
...
@@ -124,7 +141,7 @@ static int __init pcibios_init(void)
{
struct
cpuinfo_x86
*
c
=
&
boot_cpu_data
;
if
(
!
pci_root
_ops
)
{
if
(
!
raw_pci
_ops
)
{
printk
(
"PCI: System does not support PCI
\n
"
);
return
0
;
}
...
...
arch/i386/pci/direct.c
View file @
3119cfff
...
...
@@ -13,7 +13,7 @@
#define PCI_CONF1_ADDRESS(bus, dev, fn, reg) \
(0x80000000 | (bus << 16) | (dev << 11) | (fn << 8) | (reg & ~3))
static
int
__
pci_conf1_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
static
int
pci_conf1_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
{
unsigned
long
flags
;
...
...
@@ -41,7 +41,7 @@ static int __pci_conf1_read (int seg, int bus, int dev, int fn, int reg, int len
return
0
;
}
static
int
__
pci_conf1_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
static
int
pci_conf1_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
{
unsigned
long
flags
;
...
...
@@ -71,19 +71,7 @@ static int __pci_conf1_write (int seg, int bus, int dev, int fn, int reg, int le
#undef PCI_CONF1_ADDRESS
static
int
pci_conf1_read
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
value
)
{
return
__pci_conf1_read
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
int
pci_conf1_write
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
value
)
{
return
__pci_conf1_write
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
struct
pci_ops
pci_direct_conf1
=
{
struct
pci_raw_ops
pci_direct_conf1
=
{
.
read
=
pci_conf1_read
,
.
write
=
pci_conf1_write
,
};
...
...
@@ -95,7 +83,7 @@ struct pci_ops pci_direct_conf1 = {
#define PCI_CONF2_ADDRESS(dev, reg) (u16)(0xC000 | (dev << 8) | reg)
static
int
__
pci_conf2_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
static
int
pci_conf2_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
{
unsigned
long
flags
;
...
...
@@ -129,7 +117,7 @@ static int __pci_conf2_read (int seg, int bus, int dev, int fn, int reg, int len
return
0
;
}
static
int
__
pci_conf2_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
static
int
pci_conf2_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
{
unsigned
long
flags
;
...
...
@@ -165,19 +153,7 @@ static int __pci_conf2_write (int seg, int bus, int dev, int fn, int reg, int le
#undef PCI_CONF2_ADDRESS
static
int
pci_conf2_read
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
value
)
{
return
__pci_conf2_read
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
int
pci_conf2_write
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
value
)
{
return
__pci_conf2_write
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
struct
pci_ops
pci_direct_conf2
=
{
static
struct
pci_raw_ops
pci_direct_conf2
=
{
.
read
=
pci_conf2_read
,
.
write
=
pci_conf2_write
,
};
...
...
@@ -193,38 +169,30 @@ static struct pci_ops pci_direct_conf2 = {
* This should be close to trivial, but it isn't, because there are buggy
* chipsets (yes, you guessed it, by Intel and Compaq) that have no class ID.
*/
static
int
__devinit
pci_sanity_check
(
struct
pci_ops
*
o
)
static
int
__devinit
pci_sanity_check
(
struct
pci_
raw_
ops
*
o
)
{
u32
x
=
0
;
int
retval
=
0
;
struct
pci_bus
*
bus
;
/* Fake bus and device */
struct
pci_dev
*
dev
;
int
devfn
;
if
(
pci_probe
&
PCI_NO_CHECKS
)
return
1
;
bus
=
kmalloc
(
sizeof
(
*
bus
),
GFP_ATOMIC
);
dev
=
kmalloc
(
sizeof
(
*
dev
),
GFP_ATOMIC
);
if
(
!
bus
||
!
dev
)
{
printk
(
KERN_ERR
"Out of memory in %s
\n
"
,
__FUNCTION__
);
goto
exit
;
for
(
devfn
=
0
;
devfn
<
0x100
;
devfn
++
)
{
if
(
o
->
read
(
0
,
0
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
PCI_CLASS_DEVICE
,
2
,
&
x
))
continue
;
if
(
x
==
PCI_CLASS_BRIDGE_HOST
||
x
==
PCI_CLASS_DISPLAY_VGA
)
return
1
;
if
(
o
->
read
(
0
,
0
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
PCI_VENDOR_ID
,
2
,
&
x
))
continue
;
if
(
x
==
PCI_VENDOR_ID_INTEL
||
x
==
PCI_VENDOR_ID_COMPAQ
)
return
1
;
}
bus
->
number
=
0
;
dev
->
bus
=
bus
;
for
(
dev
->
devfn
=
0
;
dev
->
devfn
<
0x100
;
dev
->
devfn
++
)
if
((
!
o
->
read
(
bus
,
dev
->
devfn
,
PCI_CLASS_DEVICE
,
2
,
&
x
)
&&
(
x
==
PCI_CLASS_BRIDGE_HOST
||
x
==
PCI_CLASS_DISPLAY_VGA
))
||
(
!
o
->
read
(
bus
,
dev
->
devfn
,
PCI_VENDOR_ID
,
2
,
&
x
)
&&
(
x
==
PCI_VENDOR_ID_INTEL
||
x
==
PCI_VENDOR_ID_COMPAQ
)))
{
retval
=
1
;
goto
exit
;
}
DBG
(
"PCI: Sanity check failed
\n
"
);
exit:
kfree
(
dev
);
kfree
(
bus
);
return
retval
;
return
0
;
}
static
int
__init
pci_direct_init
(
void
)
...
...
@@ -247,9 +215,9 @@ static int __init pci_direct_init(void)
local_irq_restore
(
flags
);
printk
(
KERN_INFO
"PCI: Using configuration type 1
\n
"
);
if
(
!
request_region
(
0xCF8
,
8
,
"PCI conf1"
))
pci_root
_ops
=
NULL
;
raw_pci
_ops
=
NULL
;
else
pci_root
_ops
=
&
pci_direct_conf1
;
raw_pci
_ops
=
&
pci_direct_conf1
;
return
0
;
}
outl
(
tmp
,
0xCF8
);
...
...
@@ -267,9 +235,9 @@ static int __init pci_direct_init(void)
local_irq_restore
(
flags
);
printk
(
KERN_INFO
"PCI: Using configuration type 2
\n
"
);
if
(
!
request_region
(
0xCF8
,
4
,
"PCI conf2"
))
pci_root
_ops
=
NULL
;
raw_pci
_ops
=
NULL
;
else
pci_root
_ops
=
&
pci_direct_conf2
;
raw_pci
_ops
=
&
pci_direct_conf2
;
return
0
;
}
}
...
...
arch/i386/pci/fixup.c
View file @
3119cfff
...
...
@@ -23,9 +23,9 @@ static void __devinit pci_fixup_i450nx(struct pci_dev *d)
pci_read_config_byte
(
d
,
reg
++
,
&
subb
);
DBG
(
"i450NX PXB %d: %02x/%02x/%02x
\n
"
,
pxb
,
busno
,
suba
,
subb
);
if
(
busno
)
pci_scan_bus
(
busno
,
pci_root_ops
,
NULL
);
/* Bus A */
pci_scan_bus
(
busno
,
&
pci_root_ops
,
NULL
);
/* Bus A */
if
(
suba
<
subb
)
pci_scan_bus
(
suba
+
1
,
pci_root_ops
,
NULL
);
/* Bus B */
pci_scan_bus
(
suba
+
1
,
&
pci_root_ops
,
NULL
);
/* Bus B */
}
pcibios_last_bus
=
-
1
;
}
...
...
@@ -39,7 +39,7 @@ static void __devinit pci_fixup_i450gx(struct pci_dev *d)
u8
busno
;
pci_read_config_byte
(
d
,
0x4a
,
&
busno
);
printk
(
KERN_INFO
"PCI: i440KX/GX host bridge %s: secondary bus %02x
\n
"
,
d
->
slot_name
,
busno
);
pci_scan_bus
(
busno
,
pci_root_ops
,
NULL
);
pci_scan_bus
(
busno
,
&
pci_root_ops
,
NULL
);
pcibios_last_bus
=
-
1
;
}
...
...
arch/i386/pci/irq.c
View file @
3119cfff
...
...
@@ -107,7 +107,7 @@ static void __init pirq_peer_trick(void)
* It might be a secondary bus, but in this case its parent is already
* known (ascending bus order) and therefore pci_scan_bus returns immediately.
*/
if
(
busmap
[
i
]
&&
pci_scan_bus
(
i
,
pci_root_bus
->
ops
,
NULL
))
if
(
busmap
[
i
]
&&
pci_scan_bus
(
i
,
&
pci_root_
ops
,
NULL
))
printk
(
KERN_INFO
"PCI: Discovered primary peer bus %02x [IRQ]
\n
"
,
i
);
pcibios_last_bus
=
-
1
;
}
...
...
arch/i386/pci/legacy.c
View file @
3119cfff
...
...
@@ -31,14 +31,14 @@ static void __devinit pcibios_fixup_peer_bridges(void)
if
(
pci_bus_exists
(
&
pci_root_buses
,
n
))
continue
;
bus
->
number
=
n
;
bus
->
ops
=
pci_root_ops
;
bus
->
ops
=
&
pci_root_ops
;
dev
->
bus
=
bus
;
for
(
dev
->
devfn
=
0
;
dev
->
devfn
<
256
;
dev
->
devfn
+=
8
)
if
(
!
pci_read_config_word
(
dev
,
PCI_VENDOR_ID
,
&
l
)
&&
l
!=
0x0000
&&
l
!=
0xffff
)
{
DBG
(
"Found device at %02x:%02x [%04x]
\n
"
,
n
,
dev
->
devfn
,
l
);
printk
(
KERN_INFO
"PCI: Discovered peer bus %02x
\n
"
,
n
);
pci_scan_bus
(
n
,
pci_root_ops
,
NULL
);
pci_scan_bus
(
n
,
&
pci_root_ops
,
NULL
);
break
;
}
}
...
...
@@ -49,7 +49,7 @@ static void __devinit pcibios_fixup_peer_bridges(void)
static
int
__init
pci_legacy_init
(
void
)
{
if
(
!
pci_root
_ops
)
{
if
(
!
raw_pci
_ops
)
{
printk
(
"PCI: System does not support PCI
\n
"
);
return
0
;
}
...
...
arch/i386/pci/numa.c
View file @
3119cfff
...
...
@@ -13,7 +13,7 @@
#define PCI_CONF1_MQ_ADDRESS(bus, dev, fn, reg) \
(0x80000000 | (BUS2LOCAL(bus) << 16) | (dev << 11) | (fn << 8) | (reg & ~3))
static
int
__
pci_conf1_mq_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
static
int
pci_conf1_mq_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
{
unsigned
long
flags
;
...
...
@@ -41,7 +41,7 @@ static int __pci_conf1_mq_read (int seg, int bus, int dev, int fn, int reg, int
return
0
;
}
static
int
__
pci_conf1_mq_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
static
int
pci_conf1_mq_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
{
unsigned
long
flags
;
...
...
@@ -71,19 +71,7 @@ static int __pci_conf1_mq_write (int seg, int bus, int dev, int fn, int reg, int
#undef PCI_CONF1_MQ_ADDRESS
static
int
pci_conf1_mq_read
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
value
)
{
return
__pci_conf1_mq_read
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
int
pci_conf1_mq_write
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
value
)
{
return
__pci_conf1_mq_write
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
struct
pci_ops
pci_direct_conf1_mq
=
{
static
struct
pci_raw_ops
pci_direct_conf1_mq
=
{
.
read
=
pci_conf1_mq_read
,
.
write
=
pci_conf1_mq_write
};
...
...
@@ -106,9 +94,9 @@ static void __devinit pci_fixup_i450nx(struct pci_dev *d)
pci_read_config_byte
(
d
,
reg
++
,
&
subb
);
DBG
(
"i450NX PXB %d: %02x/%02x/%02x
\n
"
,
pxb
,
busno
,
suba
,
subb
);
if
(
busno
)
pci_scan_bus
(
QUADLOCAL2BUS
(
quad
,
busno
),
pci_root_ops
,
NULL
);
/* Bus A */
pci_scan_bus
(
QUADLOCAL2BUS
(
quad
,
busno
),
&
pci_root_ops
,
NULL
);
/* Bus A */
if
(
suba
<
subb
)
pci_scan_bus
(
QUADLOCAL2BUS
(
quad
,
suba
+
1
),
pci_root_ops
,
NULL
);
/* Bus B */
pci_scan_bus
(
QUADLOCAL2BUS
(
quad
,
suba
+
1
),
&
pci_root_ops
,
NULL
);
/* Bus B */
}
pcibios_last_bus
=
-
1
;
}
...
...
@@ -121,7 +109,7 @@ static int __init pci_numa_init(void)
{
int
quad
;
pci_root
_ops
=
&
pci_direct_conf1_mq
;
raw_pci
_ops
=
&
pci_direct_conf1_mq
;
if
(
pcibios_scanned
++
)
return
0
;
...
...
@@ -132,7 +120,7 @@ static int __init pci_numa_init(void)
printk
(
"Scanning PCI bus %d for quad %d
\n
"
,
QUADLOCAL2BUS
(
quad
,
0
),
quad
);
pci_scan_bus
(
QUADLOCAL2BUS
(
quad
,
0
),
pci_root_ops
,
NULL
);
&
pci_root_ops
,
NULL
);
}
}
return
0
;
...
...
arch/i386/pci/pcbios.c
View file @
3119cfff
...
...
@@ -172,7 +172,7 @@ static int __devinit pci_bios_find_device (unsigned short vendor, unsigned short
return
(
int
)
(
ret
&
0xff00
)
>>
8
;
}
static
int
__
pci_bios_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
static
int
pci_bios_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
{
unsigned
long
result
=
0
;
unsigned
long
flags
;
...
...
@@ -227,7 +227,7 @@ static int __pci_bios_read (int seg, int bus, int dev, int fn, int reg, int len,
return
(
int
)((
result
&
0xff00
)
>>
8
);
}
static
int
__
pci_bios_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
static
int
pci_bios_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
{
unsigned
long
result
=
0
;
unsigned
long
flags
;
...
...
@@ -282,24 +282,12 @@ static int __pci_bios_write (int seg, int bus, int dev, int fn, int reg, int len
return
(
int
)((
result
&
0xff00
)
>>
8
);
}
static
int
pci_bios_read
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
value
)
{
return
__pci_bios_read
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
int
pci_bios_write
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
value
)
{
return
__pci_bios_write
(
0
,
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
/*
* Function table for BIOS32 access
*/
static
struct
pci_ops
pci_bios_access
=
{
static
struct
pci_
raw_
ops
pci_bios_access
=
{
.
read
=
pci_bios_read
,
.
write
=
pci_bios_write
};
...
...
@@ -308,7 +296,7 @@ static struct pci_ops pci_bios_access = {
* Try to find PCI BIOS.
*/
static
struct
pci_ops
*
__devinit
pci_find_bios
(
void
)
static
struct
pci_
raw_
ops
*
__devinit
pci_find_bios
(
void
)
{
union
bios32
*
check
;
unsigned
char
sum
;
...
...
@@ -484,7 +472,7 @@ int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq)
static
int
__init
pci_pcbios_init
(
void
)
{
if
((
pci_probe
&
PCI_PROBE_BIOS
)
&&
((
pci_root
_ops
=
pci_find_bios
())))
{
&&
((
raw_pci
_ops
=
pci_find_bios
())))
{
pci_probe
|=
PCI_BIOS_SORT
;
pci_bios_present
=
1
;
}
...
...
arch/i386/pci/pci.h
View file @
3119cfff
...
...
@@ -37,7 +37,7 @@ int pcibios_enable_resources(struct pci_dev *, int);
extern
int
pcibios_last_bus
;
extern
struct
pci_bus
*
pci_root_bus
;
extern
struct
pci_ops
*
pci_root_ops
;
extern
struct
pci_ops
pci_root_ops
;
/* pci-irq.c */
...
...
arch/ia64/pci/pci.c
View file @
3119cfff
...
...
@@ -59,7 +59,7 @@ struct pci_fixup pcibios_fixups[1];
static
int
__
pci_sal_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
pci_sal_read
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
*
value
)
{
int
result
=
0
;
u64
data
=
0
;
...
...
@@ -75,7 +75,7 @@ __pci_sal_read (int seg, int bus, int dev, int fn, int reg, int len, u32 *value)
}
static
int
__
pci_sal_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
pci_sal_write
(
int
seg
,
int
bus
,
int
dev
,
int
fn
,
int
reg
,
int
len
,
u32
value
)
{
if
((
seg
>
255
)
||
(
bus
>
255
)
||
(
dev
>
31
)
||
(
fn
>
7
)
||
(
reg
>
255
))
return
-
EINVAL
;
...
...
@@ -83,28 +83,33 @@ __pci_sal_write (int seg, int bus, int dev, int fn, int reg, int len, u32 value)
return
ia64_sal_pci_config_write
(
PCI_SAL_ADDRESS
(
seg
,
bus
,
dev
,
fn
,
reg
),
len
,
value
);
}
struct
pci_raw_ops
pci_sal_ops
=
{
.
read
=
pci_sal_read
,
.
write
=
pci_sal_write
};
struct
pci_raw_ops
*
raw_pci_ops
=
&
pci_sal_ops
;
/* default to SAL */
static
int
pci_
sal_
read
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
value
)
pci_read
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
value
)
{
return
__pci_sal_read
(
pci_domain_nr
(
bus
),
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
)
,
where
,
size
,
value
);
return
raw_pci_ops
->
read
(
pci_domain_nr
(
bus
),
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
static
int
pci_
sal_
write
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
value
)
pci_write
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
value
)
{
return
__pci_sal_write
(
pci_domain_nr
(
bus
),
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
)
,
where
,
size
,
value
);
return
raw_pci_ops
->
write
(
pci_domain_nr
(
bus
),
bus
->
number
,
PCI_SLOT
(
devfn
),
PCI_FUNC
(
devfn
),
where
,
size
,
value
);
}
st
ruct
pci_ops
pci_sal
_ops
=
{
.
read
=
pci_sal
_read
,
.
write
=
pci_sal_write
st
atic
struct
pci_ops
pci_root
_ops
=
{
.
read
=
pci
_read
,
.
write
=
pci_write
,
};
struct
pci_ops
*
pci_root_ops
=
&
pci_sal_ops
;
/* default to SAL */
static
int
__init
pci_acpi_init
(
void
)
{
...
...
@@ -307,7 +312,7 @@ pcibios_scan_root (void *handle, int seg, int bus)
info
.
name
=
name
;
acpi_walk_resources
(
handle
,
METHOD_NAME__CRS
,
add_window
,
&
info
);
return
scan_root_bus
(
bus
,
pci_root_ops
,
controller
);
return
scan_root_bus
(
bus
,
&
pci_root_ops
,
controller
);
out3:
kfree
(
controller
->
window
);
...
...
drivers/acpi/osl.c
View file @
3119cfff
...
...
@@ -69,8 +69,6 @@ static int acpi_irq_irq = 0;
static
OSD_HANDLER
acpi_irq_handler
=
NULL
;
static
void
*
acpi_irq_context
=
NULL
;
extern
struct
pci_ops
*
pci_root_ops
;
acpi_status
acpi_os_initialize
(
void
)
{
...
...
@@ -79,7 +77,7 @@ acpi_os_initialize(void)
* it while walking the namespace (bus 0 and root bridges w/ _BBNs).
*/
#ifdef CONFIG_ACPI_PCI
if
(
!
pci_root
_ops
)
{
if
(
!
raw_pci
_ops
)
{
printk
(
KERN_ERR
PREFIX
"Access to PCI configuration space unavailable
\n
"
);
return
AE_NULL_ENTRY
;
}
...
...
@@ -446,15 +444,9 @@ acpi_os_write_memory(
#ifdef CONFIG_ACPI_PCI
acpi_status
acpi_os_read_pci_configuration
(
struct
acpi_pci_id
*
pci_id
,
u32
reg
,
void
*
value
,
u32
width
)
acpi_os_read_pci_configuration
(
struct
acpi_pci_id
*
pci_id
,
u32
reg
,
void
*
value
,
u32
width
)
{
int
result
=
0
;
int
size
=
0
;
struct
pci_bus
bus
;
int
result
,
size
;
if
(
!
value
)
return
AE_BAD_PARAMETER
;
...
...
@@ -470,27 +462,19 @@ acpi_os_read_pci_configuration (
size
=
4
;
break
;
default:
BUG
()
;
return
AE_ERROR
;
}
bus
.
number
=
pci_id
->
bus
;
result
=
pci_root_ops
->
read
(
&
bus
,
PCI_DEVFN
(
pci_id
->
device
,
pci_id
->
function
),
reg
,
size
,
value
);
result
=
raw_pci_ops
->
read
(
pci_id
->
segment
,
pci_id
->
bus
,
pci_id
->
device
,
pci_id
->
function
,
reg
,
size
,
value
);
return
(
result
?
AE_ERROR
:
AE_OK
);
}
acpi_status
acpi_os_write_pci_configuration
(
struct
acpi_pci_id
*
pci_id
,
u32
reg
,
acpi_integer
value
,
u32
width
)
acpi_os_write_pci_configuration
(
struct
acpi_pci_id
*
pci_id
,
u32
reg
,
acpi_integer
value
,
u32
width
)
{
int
result
=
0
;
int
size
=
0
;
struct
pci_bus
bus
;
int
result
,
size
;
switch
(
width
)
{
case
8
:
...
...
@@ -503,13 +487,12 @@ acpi_os_write_pci_configuration (
size
=
4
;
break
;
default:
BUG
()
;
return
AE_ERROR
;
}
bus
.
number
=
pci_id
->
bus
;
result
=
pci_root_ops
->
write
(
&
bus
,
PCI_DEVFN
(
pci_id
->
device
,
pci_id
->
function
),
reg
,
size
,
value
);
result
=
raw_pci_ops
->
write
(
pci_id
->
segment
,
pci_id
->
bus
,
pci_id
->
device
,
pci_id
->
function
,
reg
,
size
,
value
);
return
(
result
?
AE_ERROR
:
AE_OK
);
}
...
...
drivers/acpi/pci_root.c
View file @
3119cfff
...
...
@@ -44,8 +44,6 @@ ACPI_MODULE_NAME ("pci_root")
#define ACPI_PCI_ROOT_DRIVER_NAME "ACPI PCI Root Bridge Driver"
#define ACPI_PCI_ROOT_DEVICE_NAME "PCI Root Bridge"
extern
struct
pci_ops
*
pci_root_ops
;
static
int
acpi_pci_root_add
(
struct
acpi_device
*
device
);
static
int
acpi_pci_root_remove
(
struct
acpi_device
*
device
,
int
type
);
...
...
drivers/pci/bus.c
View file @
3119cfff
...
...
@@ -93,7 +93,11 @@ void __devinit pci_bus_add_devices(struct pci_bus *bus)
continue
;
device_add
(
&
dev
->
dev
);
spin_lock
(
&
pci_bus_lock
);
list_add_tail
(
&
dev
->
global_list
,
&
pci_devices
);
spin_unlock
(
&
pci_bus_lock
);
pci_proc_attach_device
(
dev
);
pci_create_sysfs_dev_files
(
dev
);
...
...
@@ -108,7 +112,9 @@ void __devinit pci_bus_add_devices(struct pci_bus *bus)
* it and then scan for unattached PCI devices.
*/
if
(
dev
->
subordinate
&&
list_empty
(
&
dev
->
subordinate
->
node
))
{
spin_lock
(
&
pci_bus_lock
);
list_add_tail
(
&
dev
->
subordinate
->
node
,
&
dev
->
bus
->
children
);
spin_unlock
(
&
pci_bus_lock
);
pci_bus_add_devices
(
dev
->
subordinate
);
}
}
...
...
drivers/pci/hotplug.c
View file @
3119cfff
...
...
@@ -173,6 +173,24 @@ int pci_visit_dev (struct pci_visit *fn, struct pci_dev_wrapped *wrapped_dev,
}
EXPORT_SYMBOL
(
pci_visit_dev
);
static
void
pci_destroy_dev
(
struct
pci_dev
*
dev
)
{
pci_proc_detach_device
(
dev
);
device_unregister
(
&
dev
->
dev
);
/* Remove the device from the device lists, and prevent any further
* list accesses from this device */
spin_lock
(
&
pci_bus_lock
);
list_del
(
&
dev
->
bus_list
);
list_del
(
&
dev
->
global_list
);
dev
->
bus_list
.
next
=
dev
->
bus_list
.
prev
=
NULL
;
dev
->
global_list
.
next
=
dev
->
global_list
.
prev
=
NULL
;
spin_unlock
(
&
pci_bus_lock
);
pci_free_resources
(
dev
);
pci_dev_put
(
dev
);
}
/**
* pci_remove_device_safe - remove an unused hotplug device
* @dev: the device to remove
...
...
@@ -186,11 +204,7 @@ int pci_remove_device_safe(struct pci_dev *dev)
{
if
(
pci_dev_driver
(
dev
))
return
-
EBUSY
;
device_unregister
(
&
dev
->
dev
);
list_del
(
&
dev
->
bus_list
);
list_del
(
&
dev
->
global_list
);
pci_free_resources
(
dev
);
pci_proc_detach_device
(
dev
);
pci_destroy_dev
(
dev
);
return
0
;
}
EXPORT_SYMBOL
(
pci_remove_device_safe
);
...
...
@@ -237,17 +251,15 @@ void pci_remove_bus_device(struct pci_dev *dev)
pci_remove_behind_bridge
(
dev
);
pci_proc_detach_bus
(
b
);
spin_lock
(
&
pci_bus_lock
);
list_del
(
&
b
->
node
);
spin_unlock
(
&
pci_bus_lock
);
kfree
(
b
);
dev
->
subordinate
=
NULL
;
}
device_unregister
(
&
dev
->
dev
);
list_del
(
&
dev
->
bus_list
);
list_del
(
&
dev
->
global_list
);
pci_free_resources
(
dev
);
pci_proc_detach_device
(
dev
);
pci_put_dev
(
dev
);
pci_destroy_dev
(
dev
);
}
/**
...
...
drivers/pci/pci-driver.c
View file @
3119cfff
...
...
@@ -138,10 +138,10 @@ static int pci_device_probe(struct device * dev)
drv
=
to_pci_driver
(
dev
->
driver
);
pci_dev
=
to_pci_dev
(
dev
);
pci_
get_dev
(
pci_dev
);
pci_
dev_get
(
pci_dev
);
error
=
__pci_device_probe
(
drv
,
pci_dev
);
if
(
error
)
pci_
put_dev
(
pci_dev
);
pci_
dev_put
(
pci_dev
);
return
error
;
}
...
...
@@ -156,7 +156,7 @@ static int pci_device_remove(struct device * dev)
drv
->
remove
(
pci_dev
);
pci_dev
->
driver
=
NULL
;
}
pci_
put_dev
(
pci_dev
);
pci_
dev_put
(
pci_dev
);
return
0
;
}
...
...
@@ -448,18 +448,18 @@ static int pci_bus_match(struct device * dev, struct device_driver * drv)
}
/**
* pci_
get_dev
- increments the reference count of the pci device structure
* pci_
dev_get
- increments the reference count of the pci device structure
* @dev: the device being referenced
*
* Each live reference to a device should be refcounted.
*
* Drivers for PCI devices should normally record such references in
* their probe() methods, when they bind to a device, and release
* them by calling pci_
put_dev
(), in their disconnect() methods.
* them by calling pci_
dev_put
(), in their disconnect() methods.
*
* A pointer to the device with the incremented reference counter is returned.
*/
struct
pci_dev
*
pci_
get_dev
(
struct
pci_dev
*
dev
)
struct
pci_dev
*
pci_
dev_get
(
struct
pci_dev
*
dev
)
{
struct
device
*
tmp
;
...
...
@@ -474,13 +474,13 @@ struct pci_dev *pci_get_dev (struct pci_dev *dev)
}
/**
* pci_
put_dev
- release a use of the pci device structure
* pci_
dev_put
- release a use of the pci device structure
* @dev: device that's been disconnected
*
* Must be called when a user of a device is finished with it. When the last
* user of the device calls this function, the memory of the device is freed.
*/
void
pci_
put_dev
(
struct
pci_dev
*
dev
)
void
pci_
dev_put
(
struct
pci_dev
*
dev
)
{
if
(
dev
)
put_device
(
&
dev
->
dev
);
...
...
@@ -504,5 +504,5 @@ EXPORT_SYMBOL(pci_register_driver);
EXPORT_SYMBOL
(
pci_unregister_driver
);
EXPORT_SYMBOL
(
pci_dev_driver
);
EXPORT_SYMBOL
(
pci_bus_type
);
EXPORT_SYMBOL
(
pci_
get_dev
);
EXPORT_SYMBOL
(
pci_
put_dev
);
EXPORT_SYMBOL
(
pci_
dev_get
);
EXPORT_SYMBOL
(
pci_
dev_put
);
drivers/pci/pci-sysfs.c
View file @
3119cfff
...
...
@@ -18,12 +18,6 @@
#include "pci.h"
#if BITS_PER_LONG == 32
#define LONG_FORMAT "\t%08lx"
#else
#define LONG_FORMAT "\t%16lx"
#endif
/* show configuration fields */
#define pci_config_attr(field, format_string) \
static ssize_t \
...
...
@@ -36,11 +30,11 @@ show_##field (struct device *dev, char *buf) \
} \
static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
pci_config_attr
(
vendor
,
"%04x
\n
"
);
pci_config_attr
(
device
,
"%04x
\n
"
);
pci_config_attr
(
subsystem_vendor
,
"%04x
\n
"
);
pci_config_attr
(
subsystem_device
,
"%04x
\n
"
);
pci_config_attr
(
class
,
"%06x
\n
"
);
pci_config_attr
(
vendor
,
"
0x
%04x
\n
"
);
pci_config_attr
(
device
,
"
0x
%04x
\n
"
);
pci_config_attr
(
subsystem_vendor
,
"
0x
%04x
\n
"
);
pci_config_attr
(
subsystem_device
,
"
0x
%04x
\n
"
);
pci_config_attr
(
class
,
"
0x
%06x
\n
"
);
pci_config_attr
(
irq
,
"%u
\n
"
);
/* show resources */
...
...
@@ -50,9 +44,13 @@ pci_show_resources(struct device * dev, char * buf)
struct
pci_dev
*
pci_dev
=
to_pci_dev
(
dev
);
char
*
str
=
buf
;
int
i
;
int
max
=
7
;
if
(
pci_dev
->
subordinate
)
max
=
DEVICE_COUNT_RESOURCE
;
for
(
i
=
0
;
i
<
DEVICE_COUNT_RESOURCE
&&
pci_resource_start
(
pci_dev
,
i
)
;
i
++
)
{
str
+=
sprintf
(
str
,
LONG_FORMAT
LONG_FORMAT
LONG_FORMAT
"
\n
"
,
for
(
i
=
0
;
i
<
max
;
i
++
)
{
str
+=
sprintf
(
str
,
"0x%016lx 0x%016lx 0x%016lx
\n
"
,
pci_resource_start
(
pci_dev
,
i
),
pci_resource_end
(
pci_dev
,
i
),
pci_resource_flags
(
pci_dev
,
i
));
...
...
drivers/pci/pci.h
View file @
3119cfff
...
...
@@ -58,3 +58,6 @@ struct pci_visit {
extern
int
pci_visit_dev
(
struct
pci_visit
*
fn
,
struct
pci_dev_wrapped
*
wrapped_dev
,
struct
pci_bus_wrapped
*
wrapped_parent
);
/* Lock for read/write access to pci device and bus lists */
extern
spinlock_t
pci_bus_lock
;
drivers/pci/probe.c
View file @
3119cfff
...
...
@@ -524,7 +524,7 @@ pci_scan_device(struct pci_bus *bus, int devfn)
}
device_initialize
(
&
dev
->
dev
);
dev
->
dev
.
release
=
pci_release_dev
;
pci_
get_dev
(
dev
);
pci_
dev_get
(
dev
);
pci_name_device
(
dev
);
...
...
drivers/pci/proc.c
View file @
3119cfff
...
...
@@ -308,39 +308,45 @@ static struct file_operations proc_bus_pci_operations = {
/* iterator */
static
void
*
pci_seq_start
(
struct
seq_file
*
m
,
loff_t
*
pos
)
{
struct
list_head
*
p
=
&
pci_devices
;
struct
pci_dev
*
dev
=
NULL
;
loff_t
n
=
*
pos
;
/* XXX: surely we need some locking for traversing the list? */
dev
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
dev
);
while
(
n
--
)
{
p
=
p
->
next
;
if
(
p
==
&
pci_devices
)
return
NULL
;
dev
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
dev
)
;
if
(
dev
==
NULL
)
goto
exit
;
}
return
p
;
exit:
return
dev
;
}
static
void
*
pci_seq_next
(
struct
seq_file
*
m
,
void
*
v
,
loff_t
*
pos
)
{
struct
list_head
*
p
=
v
;
struct
pci_dev
*
dev
=
v
;
(
*
pos
)
++
;
return
p
->
next
!=
&
pci_devices
?
(
void
*
)
p
->
next
:
NULL
;
dev
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
dev
);
return
dev
;
}
static
void
pci_seq_stop
(
struct
seq_file
*
m
,
void
*
v
)
{
/* release whatever locks we need */
if
(
v
)
{
struct
pci_dev
*
dev
=
v
;
pci_dev_put
(
dev
);
}
}
static
int
show_device
(
struct
seq_file
*
m
,
void
*
v
)
{
struct
list_head
*
p
=
v
;
const
struct
pci_dev
*
dev
;
const
struct
pci_dev
*
dev
=
v
;
const
struct
pci_driver
*
drv
;
int
i
;
if
(
p
==
&
pci_devices
)
if
(
dev
==
NULL
)
return
0
;
dev
=
pci_dev_g
(
p
);
drv
=
pci_dev_driver
(
dev
);
seq_printf
(
m
,
"%02x%02x
\t
%04x%04x
\t
%x"
,
dev
->
bus
->
number
,
...
...
@@ -383,7 +389,8 @@ int pci_proc_attach_device(struct pci_dev *dev)
return
-
EACCES
;
if
(
!
(
de
=
bus
->
procdir
))
{
sprintf
(
name
,
"%02x"
,
bus
->
number
);
if
(
pci_name_bus
(
name
,
bus
))
return
-
EEXIST
;
de
=
bus
->
procdir
=
proc_mkdir
(
name
,
proc_bus_pci_dir
);
if
(
!
de
)
return
-
ENOMEM
;
...
...
@@ -451,19 +458,18 @@ int pci_proc_detach_bus(struct pci_bus* bus)
*/
static
int
show_dev_config
(
struct
seq_file
*
m
,
void
*
v
)
{
struct
list_head
*
p
=
v
;
struct
pci_dev
*
dev
;
struct
pci_dev
*
dev
=
v
;
struct
pci_dev
*
first_
dev
;
struct
pci_driver
*
drv
;
u32
class_rev
;
unsigned
char
latency
,
min_gnt
,
max_lat
,
*
class
;
int
reg
;
if
(
p
==
&
pci_devices
)
{
first_dev
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
NULL
);
if
(
dev
==
first_dev
)
seq_puts
(
m
,
"PCI devices found:
\n
"
);
return
0
;
}
pci_dev_put
(
first_dev
);
dev
=
pci_dev_g
(
p
);
drv
=
pci_dev_driver
(
dev
);
pci_read_config_dword
(
dev
,
PCI_CLASS_REVISION
,
&
class_rev
);
...
...
drivers/pci/search.c
View file @
3119cfff
/*
* PCI searching functions.
*
* Copyright 1993 -- 1997 Drew Eckhardt, Frederic Potter,
* David Mosberger-Tang
* Copyright 1997 -- 2000 Martin Mares <mj@ucw.cz>
* Copyright 2003 -- Greg Kroah-Hartman <greg@kroah.com>
*/
#include <linux/pci.h>
#include <linux/module.h>
spinlock_t
pci_bus_lock
=
SPIN_LOCK_UNLOCKED
;
static
struct
pci_bus
*
pci_do_find_bus
(
struct
pci_bus
*
bus
,
unsigned
char
busnr
)
{
...
...
@@ -52,11 +63,15 @@ pci_find_bus(unsigned char busnr)
struct
pci_bus
*
pci_find_next_bus
(
const
struct
pci_bus
*
from
)
{
struct
list_head
*
n
=
from
?
from
->
node
.
next
:
pci_root_buses
.
next
;
struct
list_head
*
n
;
struct
pci_bus
*
b
=
NULL
;
WARN_ON
(
irqs_disabled
());
spin_lock
(
&
pci_bus_lock
);
n
=
from
?
from
->
node
.
next
:
pci_root_buses
.
next
;
if
(
n
!=
&
pci_root_buses
)
b
=
pci_bus_b
(
n
);
spin_unlock
(
&
pci_bus_lock
);
return
b
;
}
...
...
@@ -97,24 +112,36 @@ pci_find_slot(unsigned int bus, unsigned int devfn)
* device structure is returned. Otherwise, %NULL is returned.
* A new search is initiated by passing %NULL to the @from argument.
* Otherwise if @from is not %NULL, searches continue from next device on the global list.
*
* NOTE: Do not use this function anymore, use pci_get_subsys() instead, as
* the pci device returned by this function can disappear at any moment in
* time.
*/
struct
pci_dev
*
pci_find_subsys
(
unsigned
int
vendor
,
unsigned
int
device
,
unsigned
int
ss_vendor
,
unsigned
int
ss_device
,
const
struct
pci_dev
*
from
)
{
struct
list_head
*
n
=
from
?
from
->
global_list
.
next
:
pci_devices
.
next
;
struct
list_head
*
n
;
struct
pci_dev
*
dev
;
WARN_ON
(
irqs_disabled
());
spin_lock
(
&
pci_bus_lock
);
n
=
from
?
from
->
global_list
.
next
:
pci_devices
.
next
;
while
(
n
!=
&
pci_devices
)
{
struct
pci_dev
*
dev
=
pci_dev_g
(
n
);
while
(
n
&&
(
n
!=
&
pci_devices
)
)
{
dev
=
pci_dev_g
(
n
);
if
((
vendor
==
PCI_ANY_ID
||
dev
->
vendor
==
vendor
)
&&
(
device
==
PCI_ANY_ID
||
dev
->
device
==
device
)
&&
(
ss_vendor
==
PCI_ANY_ID
||
dev
->
subsystem_vendor
==
ss_vendor
)
&&
(
ss_device
==
PCI_ANY_ID
||
dev
->
subsystem_device
==
ss_device
))
return
dev
;
goto
exit
;
n
=
n
->
next
;
}
return
NULL
;
dev
=
NULL
;
exit:
spin_unlock
(
&
pci_bus_lock
);
return
dev
;
}
/**
...
...
@@ -128,6 +155,10 @@ pci_find_subsys(unsigned int vendor, unsigned int device,
* returned. Otherwise, %NULL is returned.
* A new search is initiated by passing %NULL to the @from argument.
* Otherwise if @from is not %NULL, searches continue from next device on the global list.
*
* NOTE: Do not use this function anymore, use pci_get_device() instead, as
* the pci device returned by this function can disappear at any moment in
* time.
*/
struct
pci_dev
*
pci_find_device
(
unsigned
int
vendor
,
unsigned
int
device
,
const
struct
pci_dev
*
from
)
...
...
@@ -135,6 +166,77 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *
return
pci_find_subsys
(
vendor
,
device
,
PCI_ANY_ID
,
PCI_ANY_ID
,
from
);
}
/**
* pci_get_subsys - begin or continue searching for a PCI device by vendor/subvendor/device/subdevice id
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
* @ss_vendor: PCI subsystem vendor id to match, or %PCI_ANY_ID to match all vendor ids
* @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids
* @from: Previous PCI device found in search, or %NULL for new search.
*
* Iterates through the list of known PCI devices. If a PCI device is
* found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its
* device structure is returned, and the reference count to the device is
* incremented. Otherwise, %NULL is returned. A new search is initiated by
* passing %NULL to the @from argument. Otherwise if @from is not %NULL,
* searches continue from next device on the global list.
* The reference count for @from is always decremented if it is not %NULL.
*/
struct
pci_dev
*
pci_get_subsys
(
unsigned
int
vendor
,
unsigned
int
device
,
unsigned
int
ss_vendor
,
unsigned
int
ss_device
,
struct
pci_dev
*
from
)
{
struct
list_head
*
n
;
struct
pci_dev
*
dev
;
WARN_ON
(
irqs_disabled
());
spin_lock
(
&
pci_bus_lock
);
n
=
from
?
from
->
global_list
.
next
:
pci_devices
.
next
;
while
(
n
&&
(
n
!=
&
pci_devices
))
{
dev
=
pci_dev_g
(
n
);
if
((
vendor
==
PCI_ANY_ID
||
dev
->
vendor
==
vendor
)
&&
(
device
==
PCI_ANY_ID
||
dev
->
device
==
device
)
&&
(
ss_vendor
==
PCI_ANY_ID
||
dev
->
subsystem_vendor
==
ss_vendor
)
&&
(
ss_device
==
PCI_ANY_ID
||
dev
->
subsystem_device
==
ss_device
))
goto
exit
;
n
=
n
->
next
;
}
dev
=
NULL
;
exit:
pci_dev_put
(
from
);
dev
=
pci_dev_get
(
dev
);
spin_unlock
(
&
pci_bus_lock
);
return
dev
;
}
/**
* pci_get_device - begin or continue searching for a PCI device by vendor/device id
* @vendor: PCI vendor id to match, or %PCI_ANY_ID to match all vendor ids
* @device: PCI device id to match, or %PCI_ANY_ID to match all device ids
* @from: Previous PCI device found in search, or %NULL for new search.
*
* Iterates through the list of known PCI devices. If a PCI device is
* found with a matching @vendor and @device, a pointer to its device structure is
* returned. Otherwise, %NULL is returned.
* A new search is initiated by passing %NULL to the @from argument.
* Otherwise if @from is not %NULL, searches continue from next device on the global list.
*
* Iterates through the list of known PCI devices. If a PCI device is
* found with a matching @vendor and @device, the reference count to the
* device is incremented and a pointer to its device structure is returned.
* Otherwise, %NULL is returned. A new search is initiated by passing %NULL
* to the @from argument. Otherwise if @from is not %NULL, searches continue
* from next device on the global list. The reference count for @from is
* always decremented if it is not %NULL.
*/
struct
pci_dev
*
pci_get_device
(
unsigned
int
vendor
,
unsigned
int
device
,
struct
pci_dev
*
from
)
{
return
pci_get_subsys
(
vendor
,
device
,
PCI_ANY_ID
,
PCI_ANY_ID
,
from
);
}
/**
* pci_find_device_reverse - begin or continue searching for a PCI device by vendor/device id
...
...
@@ -151,16 +253,24 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev *
struct
pci_dev
*
pci_find_device_reverse
(
unsigned
int
vendor
,
unsigned
int
device
,
const
struct
pci_dev
*
from
)
{
struct
list_head
*
n
=
from
?
from
->
global_list
.
prev
:
pci_devices
.
prev
;
struct
list_head
*
n
;
struct
pci_dev
*
dev
;
while
(
n
!=
&
pci_devices
)
{
struct
pci_dev
*
dev
=
pci_dev_g
(
n
);
WARN_ON
(
irqs_disabled
());
spin_lock
(
&
pci_bus_lock
);
n
=
from
?
from
->
global_list
.
prev
:
pci_devices
.
prev
;
while
(
n
&&
(
n
!=
&
pci_devices
))
{
dev
=
pci_dev_g
(
n
);
if
((
vendor
==
PCI_ANY_ID
||
dev
->
vendor
==
vendor
)
&&
(
device
==
PCI_ANY_ID
||
dev
->
device
==
device
))
return
dev
;
goto
exit
;
n
=
n
->
prev
;
}
return
NULL
;
dev
=
NULL
;
exit:
spin_unlock
(
&
pci_bus_lock
);
return
dev
;
}
...
...
@@ -179,15 +289,22 @@ pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct p
struct
pci_dev
*
pci_find_class
(
unsigned
int
class
,
const
struct
pci_dev
*
from
)
{
struct
list_head
*
n
=
from
?
from
->
global_list
.
next
:
pci_devices
.
next
;
struct
list_head
*
n
;
struct
pci_dev
*
dev
;
while
(
n
!=
&
pci_devices
)
{
struct
pci_dev
*
dev
=
pci_dev_g
(
n
);
spin_lock
(
&
pci_bus_lock
);
n
=
from
?
from
->
global_list
.
next
:
pci_devices
.
next
;
while
(
n
&&
(
n
!=
&
pci_devices
))
{
dev
=
pci_dev_g
(
n
);
if
(
dev
->
class
==
class
)
return
dev
;
goto
exit
;
n
=
n
->
next
;
}
return
NULL
;
dev
=
NULL
;
exit:
spin_unlock
(
&
pci_bus_lock
);
return
dev
;
}
EXPORT_SYMBOL
(
pci_find_bus
);
...
...
@@ -196,3 +313,5 @@ EXPORT_SYMBOL(pci_find_device);
EXPORT_SYMBOL
(
pci_find_device_reverse
);
EXPORT_SYMBOL
(
pci_find_slot
);
EXPORT_SYMBOL
(
pci_find_subsys
);
EXPORT_SYMBOL
(
pci_get_device
);
EXPORT_SYMBOL
(
pci_get_subsys
);
include/asm-alpha/pci.h
View file @
3119cfff
...
...
@@ -194,6 +194,18 @@ pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
/* Bus number == domain number until we get above 256 busses */
static
inline
int
pci_name_bus
(
char
*
name
,
struct
pci_bus
*
bus
)
{
int
domain
=
pci_domain_nr
(
bus
)
if
(
domain
<
256
)
{
sprintf
(
name
,
"%02x"
,
domain
);
}
else
{
sprintf
(
name
,
"%04x:%02x"
,
domain
,
bus
->
number
);
}
return
0
;
}
#endif
/* __KERNEL__ */
/* Values for the `which' argument to sys_pciconfig_iobase. */
...
...
include/asm-ia64/pci.h
View file @
3119cfff
...
...
@@ -102,6 +102,16 @@ struct pci_controller {
#define PCI_CONTROLLER(busdev) ((struct pci_controller *) busdev->sysdata)
#define pci_domain_nr(busdev) (PCI_CONTROLLER(busdev)->segment)
static
inline
int
pci_name_bus
(
char
*
name
,
struct
pci_bus
*
bus
)
{
if
(
pci_domain_nr
(
bus
)
==
0
)
{
sprintf
(
name
,
"%02x"
,
bus
->
number
);
}
else
{
sprintf
(
name
,
"%04x:%02x"
,
pci_domain_nr
(
bus
),
bus
->
number
);
}
return
0
;
}
/* generic pci stuff */
#include <asm-generic/pci.h>
...
...
include/asm-ppc/pci.h
View file @
3119cfff
...
...
@@ -269,6 +269,13 @@ pci_dac_dma_sync_single(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len,
/* Return the index of the PCI controller for device PDEV. */
#define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index
/* Set the name of the bus as it appears in /proc/bus/pci */
static
inline
int
pci_name_bus
(
char
*
name
,
struct
pci_bus
*
bus
)
{
sprintf
(
name
,
"%02x"
,
bus
->
number
);
return
0
;
}
/* Map a range of PCI memory or I/O space for a device into user space */
int
pci_mmap_page_range
(
struct
pci_dev
*
pdev
,
struct
vm_area_struct
*
vma
,
enum
pci_mmap_state
mmap_state
,
int
write_combine
);
...
...
include/asm-ppc64/pci.h
View file @
3119cfff
...
...
@@ -88,6 +88,13 @@ static inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask)
extern
int
pci_domain_nr
(
struct
pci_bus
*
bus
);
/* Set the name of the bus as it appears in /proc/bus/pci */
static
inline
int
pci_name_bus
(
char
*
name
,
struct
pci_bus
*
bus
)
{
sprintf
(
name
,
"%02x"
,
bus
->
number
);
return
0
;
}
struct
vm_area_struct
;
/* Map a range of PCI memory or I/O space for a device into user space */
int
pci_mmap_page_range
(
struct
pci_dev
*
pdev
,
struct
vm_area_struct
*
vma
,
...
...
include/asm-sparc64/pci.h
View file @
3119cfff
...
...
@@ -191,6 +191,13 @@ pci_dac_dma_sync_single(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len,
extern
int
pci_domain_nr
(
struct
pci_bus
*
bus
);
/* Set the name of the bus as it appears in /proc/bus/pci */
static
inline
int
pci_name_bus
(
char
*
name
,
struct
pci_bus
*
bus
)
{
sprintf
(
name
,
"%02x"
,
bus
->
number
);
return
0
;
}
/* Platform support for /proc/bus/pci/X/Y mmap()s. */
#define HAVE_PCI_MMAP
...
...
include/linux/pci.h
View file @
3119cfff
...
...
@@ -486,6 +486,13 @@ struct pci_ops {
int
(
*
write
)(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
val
);
};
struct
pci_raw_ops
{
int
(
*
read
)(
int
dom
,
int
bus
,
int
dev
,
int
func
,
int
reg
,
int
len
,
u32
*
val
);
int
(
*
write
)(
int
dom
,
int
bus
,
int
dev
,
int
func
,
int
reg
,
int
len
,
u32
val
);
};
extern
struct
pci_raw_ops
*
raw_pci_ops
;
struct
pci_bus_region
{
unsigned
long
start
;
unsigned
long
end
;
...
...
@@ -549,8 +556,8 @@ char *pci_class_name(u32 class);
void
pci_read_bridge_bases
(
struct
pci_bus
*
child
);
struct
resource
*
pci_find_parent_resource
(
const
struct
pci_dev
*
dev
,
struct
resource
*
res
);
int
pci_get_interrupt_pin
(
struct
pci_dev
*
dev
,
struct
pci_dev
**
bridge
);
extern
struct
pci_dev
*
pci_
get_dev
(
struct
pci_dev
*
dev
);
extern
void
pci_
put_dev
(
struct
pci_dev
*
dev
);
extern
struct
pci_dev
*
pci_
dev_get
(
struct
pci_dev
*
dev
);
extern
void
pci_
dev_put
(
struct
pci_dev
*
dev
);
extern
void
pci_remove_bus_device
(
struct
pci_dev
*
dev
);
...
...
@@ -566,6 +573,10 @@ struct pci_dev *pci_find_slot (unsigned int bus, unsigned int devfn);
int
pci_find_capability
(
struct
pci_dev
*
dev
,
int
cap
);
struct
pci_bus
*
pci_find_next_bus
(
const
struct
pci_bus
*
from
);
struct
pci_dev
*
pci_get_device
(
unsigned
int
vendor
,
unsigned
int
device
,
struct
pci_dev
*
from
);
struct
pci_dev
*
pci_get_subsys
(
unsigned
int
vendor
,
unsigned
int
device
,
unsigned
int
ss_vendor
,
unsigned
int
ss_device
,
struct
pci_dev
*
from
);
int
pci_bus_read_config_byte
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
u8
*
val
);
int
pci_bus_read_config_word
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
u16
*
val
);
int
pci_bus_read_config_dword
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
u32
*
val
);
...
...
@@ -688,6 +699,13 @@ static inline struct pci_dev *pci_find_subsys(unsigned int vendor, unsigned int
unsigned
int
ss_vendor
,
unsigned
int
ss_device
,
const
struct
pci_dev
*
from
)
{
return
NULL
;
}
static
inline
struct
pci_dev
*
pci_get_device
(
unsigned
int
vendor
,
unsigned
int
device
,
struct
pci_dev
*
from
)
{
return
NULL
;
}
static
inline
struct
pci_dev
*
pci_get_subsys
(
unsigned
int
vendor
,
unsigned
int
device
,
unsigned
int
ss_vendor
,
unsigned
int
ss_device
,
struct
pci_dev
*
from
)
{
return
NULL
;
}
static
inline
void
pci_set_master
(
struct
pci_dev
*
dev
)
{
}
static
inline
int
pci_enable_device
(
struct
pci_dev
*
dev
)
{
return
-
EIO
;
}
static
inline
void
pci_disable_device
(
struct
pci_dev
*
dev
)
{
}
...
...
@@ -743,6 +761,20 @@ static inline int pci_module_init(struct pci_driver *drv)
return
rc
;
}
/*
* PCI domain support. Sometimes called PCI segment (eg by ACPI),
* a PCI domain is defined to be a set of PCI busses which share
* configuration space.
*/
#ifndef CONFIG_PCI_DOMAINS
static
inline
int
pci_domain_nr
(
struct
pci_bus
*
bus
)
{
return
0
;
}
static
inline
int
pci_name_bus
(
char
*
name
,
struct
pci_bus
*
bus
)
{
sprintf
(
name
,
"%02x"
,
bus
->
number
);
return
0
;
}
#endif
#endif
/* !CONFIG_PCI */
/* these helpers provide future and backwards compatibility
...
...
@@ -800,15 +832,5 @@ extern int pci_pci_problems;
#define PCIPCI_VSFX 16
#define PCIPCI_ALIMAGIK 32
/*
* PCI domain support. Sometimes called PCI segment (eg by ACPI),
* a PCI domain is defined to be a set of PCI busses which share
* configuration space.
*/
#ifndef CONFIG_PCI_DOMAINS
static
inline
int
pci_domain_nr
(
struct
pci_bus
*
bus
)
{
return
0
;
}
#endif
#endif
/* __KERNEL__ */
#endif
/* LINUX_PCI_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment