Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Kirill Smelkov
linux
Commits
ff4b4265
Commit
ff4b4265
authored
22 years ago
by
Alan Cox
Committed by
Linus Torvalds
22 years ago
Browse files
Options
Download
Email Patches
Plain Diff
[PATCH] clean up siimage, use generic mmio ops
parent
04f8ba95
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
51 additions
and
126 deletions
+51
-126
drivers/ide/pci/siimage.c
drivers/ide/pci/siimage.c
+48
-69
drivers/ide/pci/siimage.h
drivers/ide/pci/siimage.h
+3
-57
No files found.
drivers/ide/pci/siimage.c
View file @
ff4b4265
/*
* linux/drivers/ide/siimage.c Version 1.0
1 Sept 11
, 200
2
* linux/drivers/ide/
pci/
siimage.c Version 1.0
2 Jan 30
, 200
3
*
* Copyright (C) 2001-2002 Andre Hedrick <andre@linux-ide.org>
*/
...
...
@@ -31,15 +31,15 @@ static char * print_siimage_get_info (char *buf, struct pci_dev *dev, int index)
{
char
*
p
=
buf
;
u8
mmio
=
(
pci_get_drvdata
(
dev
)
!=
NULL
)
?
1
:
0
;
u
32
bmdma
=
(
mmio
)
?
((
u
32
)
pci_get_drvdata
(
dev
))
:
u
nsigned
long
bmdma
=
(
mmio
)
?
((
u
nsigned
long
)
pci_get_drvdata
(
dev
))
:
(
pci_resource_start
(
dev
,
4
));
p
+=
sprintf
(
p
,
"
\n
Controller: %d
\n
"
,
index
);
p
+=
sprintf
(
p
,
"SiI%x Chipset.
\n
"
,
dev
->
device
);
if
(
mmio
)
p
+=
sprintf
(
p
,
"MMIO Base 0x%
08
x
\n
"
,
bmdma
);
p
+=
sprintf
(
p
,
"%s-DMA Base 0x%
08
x
\n
"
,
(
mmio
)
?
"MMIO"
:
"BM"
,
bmdma
);
p
+=
sprintf
(
p
,
"%s-DMA Base 0x%
08
x
\n
"
,
(
mmio
)
?
"MMIO"
:
"BM"
,
bmdma
+
8
);
p
+=
sprintf
(
p
,
"MMIO Base 0x%
l
x
\n
"
,
bmdma
);
p
+=
sprintf
(
p
,
"%s-DMA Base 0x%
l
x
\n
"
,
(
mmio
)
?
"MMIO"
:
"BM"
,
bmdma
);
p
+=
sprintf
(
p
,
"%s-DMA Base 0x%
l
x
\n
"
,
(
mmio
)
?
"MMIO"
:
"BM"
,
bmdma
+
8
);
p
+=
sprintf
(
p
,
"--------------- Primary Channel "
"---------------- Secondary Channel "
...
...
@@ -248,9 +248,9 @@ static int config_chipset_for_dma (ide_drive_t *drive)
{
u8
speed
=
ide_dma_speed
(
drive
,
siimage_ratemask
(
drive
));
config_chipset_for_pio
(
drive
,
(
!
(
speed
)
))
;
config_chipset_for_pio
(
drive
,
!
speed
);
if
(
(
!
(
speed
)
))
if
(
!
speed
)
return
0
;
if
(
ide_set_xfer_rate
(
drive
,
speed
))
...
...
@@ -267,7 +267,7 @@ static int siimage_config_drive_for_dma (ide_drive_t *drive)
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
struct
hd_driveid
*
id
=
drive
->
id
;
if
(
(
id
!=
NULL
)
&&
(
(
id
->
capability
&
1
)
!=
0
)
&&
drive
->
autodma
)
{
if
(
id
!=
NULL
&&
(
id
->
capability
&
1
)
!=
0
&&
drive
->
autodma
)
{
if
(
!
(
hwif
->
atapi_dma
))
goto
fast_ata_pio
;
/* Consult the list of known "bad" drives */
...
...
@@ -317,10 +317,9 @@ static int siimage_io_ide_dma_test_irq (ide_drive_t *drive)
return
1
;
/* return 1 if Device INTR asserted */
if
((
pci_read_config_byte
(
hwif
->
pci_dev
,
SELREG
(
1
),
&
dma_altstat
)
),
(
(
dma_altstat
&
8
)
==
8
))
pci_read_config_byte
(
hwif
->
pci_dev
,
SELREG
(
1
),
&
dma_altstat
)
;
if
(
dma_altstat
&
8
)
return
0
;
//return 1;
return
0
;
}
...
...
@@ -355,7 +354,7 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive)
hwif
->
OUTL
(
sata_error
,
SATA_ERROR_REG
);
watchdog
=
(
sata_error
&
0x00680000
)
?
1
:
0
;
#if 1
printk
(
"%s: sata_error = 0x%08x, "
printk
(
KERN_WARNING
"%s: sata_error = 0x%08x, "
"watchdog = %d, %s
\n
"
,
drive
->
name
,
sata_error
,
watchdog
,
__FUNCTION__
);
...
...
@@ -426,7 +425,7 @@ static int siimage_reset_poll (ide_drive_t *drive)
ide_hwif_t
*
hwif
=
HWIF
(
drive
);
if
((
hwif
->
INL
(
SATA_STATUS_REG
)
&
0x03
)
!=
0x03
)
{
printk
(
"%s: reset phy dead, status=0x%08x
\n
"
,
printk
(
KERN_WARNING
"%s: reset phy dead, status=0x%08x
\n
"
,
hwif
->
name
,
hwif
->
INL
(
SATA_STATUS_REG
));
HWGROUP
(
drive
)
->
poll_timeout
=
0
;
#if 0
...
...
@@ -475,10 +474,10 @@ static void siimage_reset (ide_drive_t *drive)
if
(
SATA_STATUS_REG
)
{
u32
sata_stat
=
hwif
->
INL
(
SATA_STATUS_REG
);
printk
(
"%s: reset phy, status=0x%08x, %s
\n
"
,
printk
(
KERN_WARNING
"%s: reset phy, status=0x%08x, %s
\n
"
,
hwif
->
name
,
sata_stat
,
__FUNCTION__
);
if
(
!
(
sata_stat
))
{
printk
(
"%s: reset phy dead, status=0x%08x
\n
"
,
printk
(
KERN_WARNING
"%s: reset phy dead, status=0x%08x
\n
"
,
hwif
->
name
,
sata_stat
);
drive
->
failures
++
;
}
...
...
@@ -491,7 +490,7 @@ static void proc_reports_siimage (struct pci_dev *dev, u8 clocking, const char *
if
(
dev
->
device
==
PCI_DEVICE_ID_SII_3112
)
goto
sata_skip
;
printk
(
"%s: BASE CLOCK "
,
name
);
printk
(
KERN_INFO
"%s: BASE CLOCK "
,
name
);
clocking
&=
~
0x0C
;
switch
(
clocking
)
{
case
0x03
:
printk
(
"DISABLED !
\n
"
);
break
;
...
...
@@ -514,13 +513,12 @@ static void proc_reports_siimage (struct pci_dev *dev, u8 clocking, const char *
#endif
/* DISPLAY_SIIMAGE_TIMINGS && CONFIG_PROC_FS */
}
#ifdef CONFIG_TRY_MMIO_SIIMAGE
static
unsigned
int
setup_mmio_siimage
(
struct
pci_dev
*
dev
,
const
char
*
name
)
{
u
32
bar5
=
pci_resource_start
(
dev
,
5
);
u
32
end5
=
pci_resource_end
(
dev
,
5
);
u
nsigned
long
bar5
=
pci_resource_start
(
dev
,
5
);
u
nsigned
long
end5
=
pci_resource_end
(
dev
,
5
);
u8
tmpbyte
=
0
;
u
32
addr
;
u
nsigned
long
addr
;
void
*
ioaddr
;
ioaddr
=
ioremap_nocache
(
bar5
,
(
end5
-
bar5
));
...
...
@@ -529,82 +527,77 @@ static unsigned int setup_mmio_siimage (struct pci_dev *dev, const char *name)
return
0
;
pci_set_master
(
dev
);
addr
=
(
u32
)
ioaddr
;
pci_set_drvdata
(
dev
,
(
void
*
)
addr
)
;
pci_set_drvdata
(
dev
,
ioaddr
)
;
addr
=
(
unsigned
long
)
io
addr
;
if
(
dev
->
device
==
PCI_DEVICE_ID_SII_3112
)
{
sii_out
l
(
0
,
DEVADDR
(
0x148
));
sii_out
l
(
0
,
DEVADDR
(
0x1C8
));
write
l
(
0
,
DEVADDR
(
0x148
));
write
l
(
0
,
DEVADDR
(
0x1C8
));
}
sii_out
b
(
0
,
DEVADDR
(
0xB4
));
sii_out
b
(
0
,
DEVADDR
(
0xF4
));
tmpbyte
=
sii_in
b
(
DEVADDR
(
0x4A
));
write
b
(
0
,
DEVADDR
(
0xB4
));
write
b
(
0
,
DEVADDR
(
0xF4
));
tmpbyte
=
read
b
(
DEVADDR
(
0x4A
));
switch
(
tmpbyte
)
{
case
0x01
:
sii_out
b
(
tmpbyte
|
0x10
,
DEVADDR
(
0x4A
));
tmpbyte
=
sii_in
b
(
DEVADDR
(
0x4A
));
write
b
(
tmpbyte
|
0x10
,
DEVADDR
(
0x4A
));
tmpbyte
=
read
b
(
DEVADDR
(
0x4A
));
case
0x31
:
/* if clocking is disabled */
/* 133 clock attempt to force it on */
sii_out
b
(
tmpbyte
&
~
0x20
,
DEVADDR
(
0x4A
));
tmpbyte
=
sii_in
b
(
DEVADDR
(
0x4A
));
write
b
(
tmpbyte
&
~
0x20
,
DEVADDR
(
0x4A
));
tmpbyte
=
read
b
(
DEVADDR
(
0x4A
));
case
0x11
:
case
0x21
:
break
;
default:
tmpbyte
&=
~
0x30
;
tmpbyte
|=
0x20
;
sii_out
b
(
tmpbyte
,
DEVADDR
(
0x4A
));
write
b
(
tmpbyte
,
DEVADDR
(
0x4A
));
break
;
}
sii_out
b
(
0x72
,
DEVADDR
(
0xA1
));
sii_out
w
(
0x328A
,
DEVADDR
(
0xA2
));
sii_out
l
(
0x62DD62DD
,
DEVADDR
(
0xA4
));
sii_out
l
(
0x43924392
,
DEVADDR
(
0xA8
));
sii_out
l
(
0x40094009
,
DEVADDR
(
0xAC
));
sii_out
b
(
0x72
,
DEVADDR
(
0xE1
));
sii_out
w
(
0x328A
,
DEVADDR
(
0xE2
));
sii_out
l
(
0x62DD62DD
,
DEVADDR
(
0xE4
));
sii_out
l
(
0x43924392
,
DEVADDR
(
0xE8
));
sii_out
l
(
0x40094009
,
DEVADDR
(
0xEC
));
write
b
(
0x72
,
DEVADDR
(
0xA1
));
write
w
(
0x328A
,
DEVADDR
(
0xA2
));
write
l
(
0x62DD62DD
,
DEVADDR
(
0xA4
));
write
l
(
0x43924392
,
DEVADDR
(
0xA8
));
write
l
(
0x40094009
,
DEVADDR
(
0xAC
));
write
b
(
0x72
,
DEVADDR
(
0xE1
));
write
w
(
0x328A
,
DEVADDR
(
0xE2
));
write
l
(
0x62DD62DD
,
DEVADDR
(
0xE4
));
write
l
(
0x43924392
,
DEVADDR
(
0xE8
));
write
l
(
0x40094009
,
DEVADDR
(
0xEC
));
if
(
dev
->
device
==
PCI_DEVICE_ID_SII_3112
)
{
sii_out
l
(
0xFFFF0000
,
DEVADDR
(
0x108
));
sii_out
l
(
0xFFFF0000
,
DEVADDR
(
0x188
));
sii_out
l
(
0x00680000
,
DEVADDR
(
0x148
));
sii_out
l
(
0x00680000
,
DEVADDR
(
0x1C8
));
write
l
(
0xFFFF0000
,
DEVADDR
(
0x108
));
write
l
(
0xFFFF0000
,
DEVADDR
(
0x188
));
write
l
(
0x00680000
,
DEVADDR
(
0x148
));
write
l
(
0x00680000
,
DEVADDR
(
0x1C8
));
}
tmpbyte
=
sii_in
b
(
DEVADDR
(
0x4A
));
tmpbyte
=
read
b
(
DEVADDR
(
0x4A
));
proc_reports_siimage
(
dev
,
(
tmpbyte
>>=
4
),
name
);
return
1
;
}
#endif
/* CONFIG_TRY_MMIO_SIIMAGE */
static
unsigned
int
__init
init_chipset_siimage
(
struct
pci_dev
*
dev
,
const
char
*
name
)
{
u32
class_rev
=
0
;
u8
tmpbyte
=
0
;
#ifdef CONFIG_TRY_MMIO_SIIMAGE
u8
BA5_EN
=
0
;
#endif
/* CONFIG_TRY_MMIO_SIIMAGE */
pci_read_config_dword
(
dev
,
PCI_CLASS_REVISION
,
&
class_rev
);
class_rev
&=
0xff
;
pci_write_config_byte
(
dev
,
PCI_CACHE_LINE_SIZE
,
(
class_rev
)
?
1
:
255
);
#ifdef CONFIG_TRY_MMIO_SIIMAGE
pci_read_config_byte
(
dev
,
0x8A
,
&
BA5_EN
);
if
((
BA5_EN
&
0x01
)
||
(
pci_resource_start
(
dev
,
5
)))
{
if
(
setup_mmio_siimage
(
dev
,
name
))
{
return
0
;
}
}
#endif
/* CONFIG_TRY_MMIO_SIIMAGE */
pci_write_config_byte
(
dev
,
0x80
,
0x00
);
pci_write_config_byte
(
dev
,
0x84
,
0x00
);
...
...
@@ -653,22 +646,12 @@ static unsigned int __init init_chipset_siimage (struct pci_dev *dev, const char
static
void
__init
init_mmio_iops_siimage
(
ide_hwif_t
*
hwif
)
{
struct
pci_dev
*
dev
=
hwif
->
pci_dev
;
u
32
addr
=
(
u
32
)
pci_get_drvdata
(
hwif
->
pci_dev
);
u
nsigned
long
addr
=
(
u
nsigned
long
)
pci_get_drvdata
(
hwif
->
pci_dev
);
u8
ch
=
hwif
->
channel
;
// u16 i = 0;
hw_regs_t
hw
;
hwif
->
OUTB
=
sii_outb
;
hwif
->
OUTW
=
sii_outw
;
hwif
->
OUTL
=
sii_outl
;
hwif
->
OUTSW
=
sii_outsw
;
hwif
->
OUTSL
=
sii_outsl
;
hwif
->
INB
=
sii_inb
;
hwif
->
INW
=
sii_inw
;
hwif
->
INL
=
sii_inl
;
hwif
->
INSW
=
sii_insw
;
hwif
->
INSL
=
sii_insl
;
default_hwif_mmiops
(
hwif
);
memset
(
&
hw
,
0
,
sizeof
(
hw_regs_t
));
#if 1
...
...
@@ -706,7 +689,7 @@ static void __init init_mmio_iops_siimage (ide_hwif_t *hwif)
#endif
#if 0
printk("%s: ", hwif->name);
printk(
KERN_DEBUG
"%s: ", hwif->name);
for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++)
printk("0x%08x ", DEVADDR((ch) ? 0xC0 : 0x80)|(i));
printk("0x%08x ", DEVADDR((ch) ? 0xCA : 0x8A)|(i));
...
...
@@ -726,7 +709,6 @@ static void __init init_mmio_iops_siimage (ide_hwif_t *hwif)
hw
.
priv
=
(
void
*
)
addr
;
// hw.priv = pci_get_drvdata(hwif->pci_dev);
hw
.
irq
=
hwif
->
pci_dev
->
irq
;
// hw.iops = siimage_iops;
memcpy
(
&
hwif
->
hw
,
&
hw
,
sizeof
(
hw
));
memcpy
(
hwif
->
io_ports
,
hwif
->
hw
.
io_ports
,
sizeof
(
hwif
->
hw
.
io_ports
));
...
...
@@ -777,9 +759,6 @@ static unsigned int __init ata66_siimage (ide_hwif_t *hwif)
pci_read_config_byte
(
hwif
->
pci_dev
,
SELREG
(
0
),
&
ata66
);
return
(
ata66
&
0x01
)
?
1
:
0
;
}
#ifndef CONFIG_TRY_MMIO_SIIMAGE
if
(
hwif
->
mmio
)
BUG
();
#endif
/* CONFIG_TRY_MMIO_SIIMAGE */
return
(
hwif
->
INB
(
SELADDR
(
0
))
&
0x01
)
?
1
:
0
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/ide/pci/siimage.h
View file @
ff4b4265
...
...
@@ -9,8 +9,6 @@
#define DISPLAY_SIIMAGE_TIMINGS
#define CONFIG_TRY_MMIO_SIIMAGE
//#undef CONFIG_TRY_MMIO_SIIMAGE
#undef SIIMAGE_VIRTUAL_DMAPIO
#undef SIIMAGE_BUFFERED_TASKFILE
#undef SIIMAGE_LARGE_DMA
...
...
@@ -31,63 +29,11 @@ typedef struct ide_io_ops_s siimage_iops {
#define ADJREG(B,R) ((B)|(R)|((hwif->channel)<<(4+(2*(hwif->mmio)))))
#define SELREG(R) ADJREG((0xA0),(R))
#define SELADDR(R) ((((u
32
)hwif->hwif_data)*(hwif->mmio))|SELREG((R)))
#define HWIFADDR(R) ((((u
32
)hwif->hwif_data)*(hwif->mmio))|(R))
#define DEVADDR(R) (((u
32
) pci_get_drvdata(dev))|(R))
#define SELADDR(R) ((((u
nsigned long
)hwif->hwif_data)*(hwif->mmio))|SELREG((R)))
#define HWIFADDR(R) ((((u
nsigned long
)hwif->hwif_data)*(hwif->mmio))|(R))
#define DEVADDR(R) (((u
nsigned long
) pci_get_drvdata(dev))|(R))
inline
u8
sii_inb
(
u32
port
)
{
return
(
u8
)
readb
(
port
);
}
inline
u16
sii_inw
(
u32
port
)
{
return
(
u16
)
readw
(
port
);
}
inline
void
sii_insw
(
u32
port
,
void
*
addr
,
u32
count
)
{
while
(
count
--
)
{
*
(
u16
*
)
addr
=
readw
(
port
);
addr
+=
2
;
}
}
inline
u32
sii_inl
(
u32
port
)
{
return
(
u32
)
readl
(
port
);
}
inline
void
sii_insl
(
u32
port
,
void
*
addr
,
u32
count
)
{
sii_insw
(
port
,
addr
,
(
count
)
<<
1
);
// while (count--) { *(u32 *)addr = readl(port); addr += 4; }
}
inline
void
sii_outb
(
u8
value
,
u32
port
)
{
writeb
(
value
,
port
);
}
inline
void
sii_outw
(
u16
value
,
u32
port
)
{
writew
(
value
,
port
);
}
inline
void
sii_outsw
(
u32
port
,
void
*
addr
,
u32
count
)
{
while
(
count
--
)
{
writew
(
*
(
u16
*
)
addr
,
port
);
addr
+=
2
;
}
}
inline
void
sii_outl
(
u32
value
,
u32
port
)
{
writel
(
value
,
port
);
}
inline
void
sii_outsl
(
u32
port
,
void
*
addr
,
u32
count
)
{
sii_outsw
(
port
,
addr
,
(
count
)
<<
1
);
// while (count--) { writel(*(u32 *)addr, port); addr += 4; }
}
#if defined(DISPLAY_SIIMAGE_TIMINGS) && defined(CONFIG_PROC_FS)
#include <linux/stat.h>
#include <linux/proc_fs.h>
...
...
This diff is collapsed.
Click to expand it.
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