Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
sh
drivers
pci
ops-dreamcast.c
Go to the documentation of this file.
1
/*
2
* PCI operations for the Sega Dreamcast
3
*
4
* Copyright (C) 2001, 2002 M. R. Brown
5
* Copyright (C) 2002, 2003 Paul Mundt
6
*
7
* This file is subject to the terms and conditions of the GNU General Public
8
* License. See the file "COPYING" in the main directory of this archive
9
* for more details.
10
*/
11
12
#include <linux/sched.h>
13
#include <linux/kernel.h>
14
#include <
linux/param.h
>
15
#include <
linux/interrupt.h
>
16
#include <
linux/init.h
>
17
#include <
linux/irq.h
>
18
#include <linux/pci.h>
19
#include <linux/module.h>
20
#include <
linux/io.h
>
21
#include <mach/pci.h>
22
23
/*
24
* The !gapspci_config_access case really shouldn't happen, ever, unless
25
* someone implicitly messes around with the last devfn value.. otherwise we
26
* only support a single device anyways, and if we didn't have a BBA, we
27
* wouldn't make it terribly far through the PCI setup anyways.
28
*
29
* Also, we could very easily support both Type 0 and Type 1 configurations
30
* here, but since it doesn't seem that there is any such implementation in
31
* existence, we don't bother.
32
*
33
* I suppose if someone actually gets around to ripping the chip out of
34
* the BBA and hanging some more devices off of it, then this might be
35
* something to take into consideration. However, due to the cost of the BBA,
36
* and the general lack of activity by DC hardware hackers, this doesn't seem
37
* likely to happen anytime soon.
38
*/
39
static
int
gapspci_config_access(
unsigned
char
bus
,
unsigned
int
devfn
)
40
{
41
return
(bus == 0) && (devfn == 0);
42
}
43
44
/*
45
* We can also actually read and write in b/w/l sizes! Thankfully this part
46
* was at least done right, and we don't have to do the stupid masking and
47
* shifting that we do on the 7751! Small wonders never cease to amaze.
48
*/
49
static
int
gapspci_read(
struct
pci_bus
*bus,
unsigned
int
devfn,
int
where,
int
size
,
u32
*
val
)
50
{
51
*val = 0xffffffff;
52
53
if
(!gapspci_config_access(bus->
number
, devfn))
54
return
PCIBIOS_DEVICE_NOT_FOUND
;
55
56
switch
(size) {
57
case
1: *val =
inb
(
GAPSPCI_BBA_CONFIG
+where);
break
;
58
case
2: *val =
inw
(
GAPSPCI_BBA_CONFIG
+where);
break
;
59
case
4: *val =
inl
(
GAPSPCI_BBA_CONFIG
+where);
break
;
60
}
61
62
return
PCIBIOS_SUCCESSFUL
;
63
}
64
65
static
int
gapspci_write(
struct
pci_bus
*bus,
unsigned
int
devfn,
int
where,
int
size,
u32
val)
66
{
67
if
(!gapspci_config_access(bus->
number
, devfn))
68
return
PCIBIOS_DEVICE_NOT_FOUND
;
69
70
switch
(size) {
71
case
1:
outb
((
u8
)val,
GAPSPCI_BBA_CONFIG
+where);
break
;
72
case
2:
outw
((
u16
)val,
GAPSPCI_BBA_CONFIG
+where);
break
;
73
case
4:
outl
((
u32
)val,
GAPSPCI_BBA_CONFIG
+where);
break
;
74
}
75
76
return
PCIBIOS_SUCCESSFUL
;
77
}
78
79
struct
pci_ops
gapspci_pci_ops
= {
80
.read = gapspci_read,
81
.write = gapspci_write,
82
};
Generated on Thu Jan 10 2013 13:17:10 for Linux Kernel by
1.8.2