Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
d88ffccb
Commit
d88ffccb
authored
Jan 13, 2009
by
Greg Ungerer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
m68knommu: remove the obsolete and long unused comempci chip support
Signed-off-by:
Greg Ungerer
<
gerg@uclinux.org
>
parent
e8158851
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
0 additions
and
981 deletions
+0
-981
arch/m68knommu/kernel/Makefile
arch/m68knommu/kernel/Makefile
+0
-1
arch/m68knommu/kernel/comempci.c
arch/m68knommu/kernel/comempci.c
+0
-980
No files found.
arch/m68knommu/kernel/Makefile
View file @
d88ffccb
...
...
@@ -8,4 +8,3 @@ obj-y += dma.o entry.o init_task.o irq.o m68k_ksyms.o process.o ptrace.o \
setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o
obj-$(CONFIG_MODULES)
+=
module.o
obj-$(CONFIG_COMEMPCI)
+=
comempci.o
arch/m68knommu/kernel/comempci.c
deleted
100644 → 0
View file @
e8158851
/*****************************************************************************/
/*
* comemlite.c -- PCI access code for embedded CO-MEM Lite PCI controller.
*
* (C) Copyright 1999-2003, Greg Ungerer (gerg@snapgear.com).
* (C) Copyright 2000, Lineo (www.lineo.com)
*/
/*****************************************************************************/
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/pci.h>
#include <linux/ptrace.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <asm/coldfire.h>
#include <asm/mcfsim.h>
#include <asm/irq.h>
#include <asm/anchor.h>
#ifdef CONFIG_eLIA
#include <asm/elia.h>
#endif
/*****************************************************************************/
/*
* Debug configuration defines. DEBUGRES sets debugging output for
* the resource allocation phase. DEBUGPCI traces on pcibios_ function
* calls, and DEBUGIO traces all accesses to devices on the PCI bus.
*/
/*#define DEBUGRES 1*/
/*#define DEBUGPCI 1*/
/*#define DEBUGIO 1*/
/*****************************************************************************/
/*
* PCI markers for bus present and active slots.
*/
int
pci_bus_is_present
=
0
;
unsigned
long
pci_slotmask
=
0
;
/*
* We may or may not need to swap the bytes of PCI bus tranfers.
* The endianess is re-roder automatically by the CO-MEM, but it
* will get the wrong byte order for a pure data stream.
*/
#define pci_byteswap 0
/*
* Resource tracking. The CO-MEM part creates a virtual address
* space that all the PCI devices live in - it is not in any way
* directly mapped into the ColdFire address space. So we can
* really assign any resources we like to devices, as long as
* they do not clash with other PCI devices.
*/
unsigned
int
pci_iobase
=
PCIBIOS_MIN_IO
;
/* Arbitrary start address */
unsigned
int
pci_membase
=
PCIBIOS_MIN_MEM
;
/* Arbitrary start address */
#define PCI_MINIO 0x100
/* 256 byte minimum I/O */
#define PCI_MINMEM 0x00010000
/* 64k minimum chunk */
/*
* The CO-MEM's shared memory segment is visible inside the PCI
* memory address space. We need to keep track of the address that
* this is mapped at, to setup the bus masters pointers.
*/
unsigned
int
pci_shmemaddr
;
/*****************************************************************************/
void
pci_interrupt
(
int
irq
,
void
*
id
,
struct
pt_regs
*
fp
);
/*****************************************************************************/
/*
* Some platforms have custom ways of reseting the PCI bus.
*/
void
pci_resetbus
(
void
)
{
#ifdef CONFIG_eLIA
int
i
;
#ifdef DEBUGPCI
printk
(
KERN_DEBUG
"pci_resetbus()
\n
"
);
#endif
*
((
volatile
unsigned
short
*
)
(
MCF_MBAR
+
MCFSIM_PADDR
))
|=
eLIA_PCIRESET
;
for
(
i
=
0
;
(
i
<
1000
);
i
++
)
{
*
((
volatile
unsigned
short
*
)
(
MCF_MBAR
+
MCFSIM_PADAT
))
=
(
ppdata
|
eLIA_PCIRESET
);
}
*
((
volatile
unsigned
short
*
)
(
MCF_MBAR
+
MCFSIM_PADAT
))
=
ppdata
;
#endif
}
/*****************************************************************************/
int
pcibios_assign_resource_slot
(
int
slot
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
char
*
ip
;
unsigned
int
idsel
,
addr
,
val
,
align
,
i
;
int
bar
;
#ifdef DEBUGPCI
printk
(
KERN_INFO
"pcibios_assign_resource_slot(slot=%x)
\n
"
,
slot
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
idsel
=
COMEM_DA_ADDR
(
0x1
<<
(
slot
+
16
));
/* Try to assign resource to each BAR */
for
(
bar
=
0
;
(
bar
<
6
);
bar
++
)
{
addr
=
COMEM_PCIBUS
+
PCI_BASE_ADDRESS_0
+
(
bar
*
4
);
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGRD
|
idsel
;
val
=
rp
[
LREG
(
addr
)];
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"-----------------------------------"
"-------------------------------------
\n
"
);
printk
(
KERN_DEBUG
"BAR[%d]: read=%08x "
,
bar
,
val
);
#endif
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGWR
|
idsel
;
rp
[
LREG
(
addr
)]
=
0xffffffff
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGRD
|
idsel
;
val
=
rp
[
LREG
(
addr
)];
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"write=%08x "
,
val
);
#endif
if
(
val
==
0
)
{
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"
\n
"
);
#endif
continue
;
}
/* Determine space required by BAR */
/* FIXME: this should go backwords from 0x80000000... */
for
(
i
=
0
;
(
i
<
32
);
i
++
)
{
if
((
0x1
<<
i
)
&
(
val
&
0xfffffffc
))
break
;
}
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"size=%08x(%d)
\n
"
,
(
0x1
<<
i
),
i
);
#endif
i
=
0x1
<<
i
;
/* Assign a resource */
if
(
val
&
PCI_BASE_ADDRESS_SPACE_IO
)
{
if
(
i
<
PCI_MINIO
)
i
=
PCI_MINIO
;
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"BAR[%d]: IO size=%08x iobase=%08x
\n
"
,
bar
,
i
,
pci_iobase
);
#endif
if
(
i
>
0xffff
)
{
/* Invalid size?? */
val
=
0
|
PCI_BASE_ADDRESS_SPACE_IO
;
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"BAR[%d]: too big for IO??
\n
"
,
bar
);
#endif
}
else
{
/* Check for un-alignment */
if
((
align
=
pci_iobase
%
i
))
pci_iobase
+=
(
i
-
align
);
val
=
pci_iobase
|
PCI_BASE_ADDRESS_SPACE_IO
;
pci_iobase
+=
i
;
}
}
else
{
if
(
i
<
PCI_MINMEM
)
i
=
PCI_MINMEM
;
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"BAR[%d]: MEMORY size=%08x membase=%08x
\n
"
,
bar
,
i
,
pci_membase
);
#endif
/* Check for un-alignment */
if
((
align
=
pci_membase
%
i
))
pci_membase
+=
(
i
-
align
);
val
=
pci_membase
|
PCI_BASE_ADDRESS_SPACE_MEMORY
;
pci_membase
+=
i
;
}
/* Write resource back into BAR register */
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGWR
|
idsel
;
rp
[
LREG
(
addr
)]
=
val
;
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"BAR[%d]: assigned bar=%08x
\n
"
,
bar
,
val
);
#endif
}
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"-----------------------------------"
"-------------------------------------
\n
"
);
#endif
/* Assign IRQ if one is wanted... */
ip
=
(
volatile
unsigned
char
*
)
(
COMEM_BASE
+
COMEM_PCIBUS
);
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGRD
|
idsel
;
addr
=
(
PCI_INTERRUPT_PIN
&
0xfc
)
+
(
~
PCI_INTERRUPT_PIN
&
0x03
);
if
(
ip
[
addr
])
{
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGWR
|
idsel
;
addr
=
(
PCI_INTERRUPT_LINE
&
0xfc
)
+
(
~
PCI_INTERRUPT_LINE
&
0x03
);
ip
[
addr
]
=
25
;
#ifdef DEBUGRES
printk
(
KERN_DEBUG
"IRQ LINE=25
\n
"
);
#endif
}
return
(
0
);
}
/*****************************************************************************/
int
pcibios_enable_slot
(
int
slot
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
short
*
wp
;
unsigned
int
idsel
,
addr
;
unsigned
short
cmd
;
#ifdef DEBUGPCI
printk
(
KERN_DEBUG
"pcibios_enbale_slot(slot=%x)
\n
"
,
slot
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
wp
=
(
volatile
unsigned
short
*
)
COMEM_BASE
;
idsel
=
COMEM_DA_ADDR
(
0x1
<<
(
slot
+
16
));
/* Get current command settings */
addr
=
COMEM_PCIBUS
+
PCI_COMMAND
;
addr
=
(
addr
&
~
0x3
)
+
(
~
addr
&
0x02
);
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGRD
|
idsel
;
cmd
=
wp
[
WREG
(
addr
)];
/*val = ((val & 0xff) << 8) | ((val >> 8) & 0xff);*/
/* Enable I/O and memory accesses to this device */
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_CFGWR
|
idsel
;
cmd
|=
PCI_COMMAND_IO
|
PCI_COMMAND_MEMORY
|
PCI_COMMAND_MASTER
;
wp
[
WREG
(
addr
)]
=
cmd
;
return
(
0
);
}
/*****************************************************************************/
void
pcibios_assign_resources
(
void
)
{
volatile
unsigned
long
*
rp
;
unsigned
long
sel
,
id
;
int
slot
;
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
/*
* Do a quick scan of the PCI bus and see what is here.
*/
for
(
slot
=
COMEM_MINDEV
;
(
slot
<=
COMEM_MAXDEV
);
slot
++
)
{
sel
=
COMEM_DA_CFGRD
|
COMEM_DA_ADDR
(
0x1
<<
(
slot
+
16
));
rp
[
LREG
(
COMEM_DAHBASE
)]
=
sel
;
rp
[
LREG
(
COMEM_PCIBUS
)]
=
0
;
/* Clear bus */
id
=
rp
[
LREG
(
COMEM_PCIBUS
)];
if
((
id
!=
0
)
&&
((
id
&
0xffff0000
)
!=
(
sel
&
0xffff0000
)))
{
printk
(
KERN_INFO
"PCI: slot=%d id=%08x
\n
"
,
slot
,
(
int
)
id
);
pci_slotmask
|=
0x1
<<
slot
;
pcibios_assign_resource_slot
(
slot
);
pcibios_enable_slot
(
slot
);
}
}
}
/*****************************************************************************/
int
pcibios_init
(
void
)
{
volatile
unsigned
long
*
rp
;
unsigned
long
sel
,
id
;
int
slot
;
#ifdef DEBUGPCI
printk
(
KERN_DEBUG
"pcibios_init()
\n
"
);
#endif
pci_resetbus
();
/*
* Do some sort of basic check to see if the CO-MEM part
* is present... This works ok, but I think we really need
* something better...
*/
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
if
((
rp
[
LREG
(
COMEM_LBUSCFG
)]
&
0xff
)
!=
0x50
)
{
printk
(
KERN_INFO
"PCI: no PCI bus present
\n
"
);
return
(
0
);
}
#ifdef COMEM_BRIDGEDEV
/*
* Setup the PCI bridge device first. It needs resources too,
* so that bus masters can get to its shared memory.
*/
slot
=
COMEM_BRIDGEDEV
;
sel
=
COMEM_DA_CFGRD
|
COMEM_DA_ADDR
(
0x1
<<
(
slot
+
16
));
rp
[
LREG
(
COMEM_DAHBASE
)]
=
sel
;
rp
[
LREG
(
COMEM_PCIBUS
)]
=
0
;
/* Clear bus */
id
=
rp
[
LREG
(
COMEM_PCIBUS
)];
if
((
id
==
0
)
||
((
id
&
0xffff0000
)
==
(
sel
&
0xffff0000
)))
{
printk
(
KERN_INFO
"PCI: no PCI bus bridge present
\n
"
);
return
(
0
);
}
printk
(
KERN_INFO
"PCI: bridge device at slot=%d id=%08x
\n
"
,
slot
,
(
int
)
id
);
pci_slotmask
|=
0x1
<<
slot
;
pci_shmemaddr
=
pci_membase
;
pcibios_assign_resource_slot
(
slot
);
pcibios_enable_slot
(
slot
);
#endif
pci_bus_is_present
=
1
;
/* Get PCI irq for local vectoring */
if
(
request_irq
(
COMEM_IRQ
,
pci_interrupt
,
0
,
"PCI bridge"
,
NULL
))
{
printk
(
KERN_WARNING
"PCI: failed to acquire interrupt %d
\n
"
,
COMEM_IRQ
);
}
else
{
mcf_autovector
(
COMEM_IRQ
);
}
pcibios_assign_resources
();
return
(
0
);
}
/*****************************************************************************/
char
*
pcibios_setup
(
char
*
option
)
{
/* Nothing for us to handle. */
return
(
option
);
}
/*****************************************************************************/
void
pcibios_fixup_bus
(
struct
pci_bus
*
b
)
{
}
/*****************************************************************************/
void
pcibios_align_resource
(
void
*
data
,
struct
resource
*
res
,
resource_size_t
size
,
resource_size_t
align
)
{
}
/*****************************************************************************/
int
pcibios_enable_device
(
struct
pci_dev
*
dev
,
int
mask
)
{
int
slot
;
slot
=
PCI_SLOT
(
dev
->
devfn
);
if
((
dev
->
bus
==
0
)
&&
(
pci_slotmask
&
(
1
<<
slot
)))
pcibios_enable_slot
(
slot
);
return
(
0
);
}
/*****************************************************************************/
/*
* Local routines to interrcept the standard I/O and vector handling
* code. Don't include this 'till now - initialization code above needs
* access to the real code too.
*/
#include <asm/mcfpci.h>
/*****************************************************************************/
void
pci_outb
(
unsigned
char
val
,
unsigned
int
addr
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
char
*
bp
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_outb(val=%02x,addr=%x)
\n
"
,
val
,
addr
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
bp
=
(
volatile
unsigned
char
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IOWR
|
COMEM_DA_ADDR
(
addr
);
addr
=
(
addr
&
~
0x3
)
+
(
~
addr
&
0x03
);
bp
[(
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
addr
))]
=
val
;
}
/*****************************************************************************/
void
pci_outw
(
unsigned
short
val
,
unsigned
int
addr
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
short
*
sp
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_outw(val=%04x,addr=%x)
\n
"
,
val
,
addr
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
sp
=
(
volatile
unsigned
short
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IOWR
|
COMEM_DA_ADDR
(
addr
);
addr
=
(
addr
&
~
0x3
)
+
(
~
addr
&
0x02
);
if
(
pci_byteswap
)
val
=
((
val
&
0xff
)
<<
8
)
|
((
val
>>
8
)
&
0xff
);
sp
[
WREG
(
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
addr
))]
=
val
;
}
/*****************************************************************************/
void
pci_outl
(
unsigned
int
val
,
unsigned
int
addr
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
int
*
lp
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_outl(val=%08x,addr=%x)
\n
"
,
val
,
addr
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
lp
=
(
volatile
unsigned
int
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IOWR
|
COMEM_DA_ADDR
(
addr
);
if
(
pci_byteswap
)
val
=
(
val
<<
24
)
|
((
val
&
0x0000ff00
)
<<
8
)
|
((
val
&
0x00ff0000
)
>>
8
)
|
(
val
>>
24
);
lp
[
LREG
(
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
addr
))]
=
val
;
}
/*****************************************************************************/
unsigned
long
pci_blmask
[]
=
{
0x000000e0
,
0x000000d0
,
0x000000b0
,
0x00000070
};
unsigned
char
pci_inb
(
unsigned
int
addr
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
char
*
bp
;
unsigned
long
r
;
unsigned
char
val
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_inb(addr=%x)
\n
"
,
addr
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
bp
=
(
volatile
unsigned
char
*
)
COMEM_BASE
;
r
=
COMEM_DA_IORD
|
COMEM_DA_ADDR
(
addr
)
|
pci_blmask
[(
addr
&
0x3
)];
rp
[
LREG
(
COMEM_DAHBASE
)]
=
r
;
addr
=
(
addr
&
~
0x3
)
+
(
~
addr
&
0x3
);
val
=
bp
[(
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
addr
))];
return
(
val
);
}
/*****************************************************************************/
unsigned
long
pci_bwmask
[]
=
{
0x000000c0
,
0x000000c0
,
0x00000030
,
0x00000030
};
unsigned
short
pci_inw
(
unsigned
int
addr
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
short
*
sp
;
unsigned
long
r
;
unsigned
short
val
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_inw(addr=%x)"
,
addr
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
r
=
COMEM_DA_IORD
|
COMEM_DA_ADDR
(
addr
)
|
pci_bwmask
[(
addr
&
0x3
)];
rp
[
LREG
(
COMEM_DAHBASE
)]
=
r
;
sp
=
(
volatile
unsigned
short
*
)
COMEM_BASE
;
addr
=
(
addr
&
~
0x3
)
+
(
~
addr
&
0x02
);
val
=
sp
[
WREG
(
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
addr
))];
if
(
pci_byteswap
)
val
=
((
val
&
0xff
)
<<
8
)
|
((
val
>>
8
)
&
0xff
);
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"=%04x
\n
"
,
val
);
#endif
return
(
val
);
}
/*****************************************************************************/
unsigned
int
pci_inl
(
unsigned
int
addr
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
int
*
lp
;
unsigned
int
val
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_inl(addr=%x)"
,
addr
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
lp
=
(
volatile
unsigned
int
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IORD
|
COMEM_DA_ADDR
(
addr
);
val
=
lp
[
LREG
(
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
addr
))];
if
(
pci_byteswap
)
val
=
(
val
<<
24
)
|
((
val
&
0x0000ff00
)
<<
8
)
|
((
val
&
0x00ff0000
)
>>
8
)
|
(
val
>>
24
);
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"=%08x
\n
"
,
val
);
#endif
return
(
val
);
}
/*****************************************************************************/
void
pci_outsb
(
void
*
addr
,
void
*
buf
,
int
len
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
char
*
bp
;
unsigned
char
*
dp
=
(
unsigned
char
*
)
buf
;
unsigned
int
a
=
(
unsigned
int
)
addr
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_outsb(addr=%x,buf=%x,len=%d)
\n
"
,
(
int
)
addr
,
(
int
)
buf
,
len
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IOWR
|
COMEM_DA_ADDR
(
a
);
a
=
(
a
&
~
0x3
)
+
(
~
a
&
0x03
);
bp
=
(
volatile
unsigned
char
*
)
(
COMEM_BASE
+
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
a
));
while
(
len
--
)
*
bp
=
*
dp
++
;
}
/*****************************************************************************/
void
pci_outsw
(
void
*
addr
,
void
*
buf
,
int
len
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
short
*
wp
;
unsigned
short
w
,
*
dp
=
(
unsigned
short
*
)
buf
;
unsigned
int
a
=
(
unsigned
int
)
addr
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_outsw(addr=%x,buf=%x,len=%d)
\n
"
,
(
int
)
addr
,
(
int
)
buf
,
len
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IOWR
|
COMEM_DA_ADDR
(
a
);
a
=
(
a
&
~
0x3
)
+
(
~
a
&
0x2
);
wp
=
(
volatile
unsigned
short
*
)
(
COMEM_BASE
+
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
a
));
while
(
len
--
)
{
w
=
*
dp
++
;
if
(
pci_byteswap
)
w
=
((
w
&
0xff
)
<<
8
)
|
((
w
>>
8
)
&
0xff
);
*
wp
=
w
;
}
}
/*****************************************************************************/
void
pci_outsl
(
void
*
addr
,
void
*
buf
,
int
len
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
long
*
lp
;
unsigned
long
l
,
*
dp
=
(
unsigned
long
*
)
buf
;
unsigned
int
a
=
(
unsigned
int
)
addr
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_outsl(addr=%x,buf=%x,len=%d)
\n
"
,
(
int
)
addr
,
(
int
)
buf
,
len
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IOWR
|
COMEM_DA_ADDR
(
a
);
lp
=
(
volatile
unsigned
long
*
)
(
COMEM_BASE
+
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
a
));
while
(
len
--
)
{
l
=
*
dp
++
;
if
(
pci_byteswap
)
l
=
(
l
<<
24
)
|
((
l
&
0x0000ff00
)
<<
8
)
|
((
l
&
0x00ff0000
)
>>
8
)
|
(
l
>>
24
);
*
lp
=
l
;
}
}
/*****************************************************************************/
void
pci_insb
(
void
*
addr
,
void
*
buf
,
int
len
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
char
*
bp
;
unsigned
char
*
dp
=
(
unsigned
char
*
)
buf
;
unsigned
int
a
=
(
unsigned
int
)
addr
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_insb(addr=%x,buf=%x,len=%d)
\n
"
,
(
int
)
addr
,
(
int
)
buf
,
len
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IORD
|
COMEM_DA_ADDR
(
a
);
a
=
(
a
&
~
0x3
)
+
(
~
a
&
0x03
);
bp
=
(
volatile
unsigned
char
*
)
(
COMEM_BASE
+
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
a
));
while
(
len
--
)
*
dp
++
=
*
bp
;
}
/*****************************************************************************/
void
pci_insw
(
void
*
addr
,
void
*
buf
,
int
len
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
short
*
wp
;
unsigned
short
w
,
*
dp
=
(
unsigned
short
*
)
buf
;
unsigned
int
a
=
(
unsigned
int
)
addr
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_insw(addr=%x,buf=%x,len=%d)
\n
"
,
(
int
)
addr
,
(
int
)
buf
,
len
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IORD
|
COMEM_DA_ADDR
(
a
);
a
=
(
a
&
~
0x3
)
+
(
~
a
&
0x2
);
wp
=
(
volatile
unsigned
short
*
)
(
COMEM_BASE
+
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
a
));
while
(
len
--
)
{
w
=
*
wp
;
if
(
pci_byteswap
)
w
=
((
w
&
0xff
)
<<
8
)
|
((
w
>>
8
)
&
0xff
);
*
dp
++
=
w
;
}
}
/*****************************************************************************/
void
pci_insl
(
void
*
addr
,
void
*
buf
,
int
len
)
{
volatile
unsigned
long
*
rp
;
volatile
unsigned
long
*
lp
;
unsigned
long
l
,
*
dp
=
(
unsigned
long
*
)
buf
;
unsigned
int
a
=
(
unsigned
int
)
addr
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_insl(addr=%x,buf=%x,len=%d)
\n
"
,
(
int
)
addr
,
(
int
)
buf
,
len
);
#endif
rp
=
(
volatile
unsigned
long
*
)
COMEM_BASE
;
rp
[
LREG
(
COMEM_DAHBASE
)]
=
COMEM_DA_IORD
|
COMEM_DA_ADDR
(
a
);
lp
=
(
volatile
unsigned
long
*
)
(
COMEM_BASE
+
COMEM_PCIBUS
+
COMEM_DA_OFFSET
(
a
));
while
(
len
--
)
{
l
=
*
lp
;
if
(
pci_byteswap
)
l
=
(
l
<<
24
)
|
((
l
&
0x0000ff00
)
<<
8
)
|
((
l
&
0x00ff0000
)
>>
8
)
|
(
l
>>
24
);
*
dp
++
=
l
;
}
}
/*****************************************************************************/
struct
pci_localirqlist
{
void
(
*
handler
)(
int
,
void
*
,
struct
pt_regs
*
);
const
char
*
device
;
void
*
dev_id
;
};
struct
pci_localirqlist
pci_irqlist
[
COMEM_MAXPCI
];
/*****************************************************************************/
int
pci_request_irq
(
unsigned
int
irq
,
void
(
*
handler
)(
int
,
void
*
,
struct
pt_regs
*
),
unsigned
long
flags
,
const
char
*
device
,
void
*
dev_id
)
{
int
i
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_request_irq(irq=%d,handler=%x,flags=%x,device=%s,"
"dev_id=%x)
\n
"
,
irq
,
(
int
)
handler
,
(
int
)
flags
,
device
,
(
int
)
dev_id
);
#endif
/* Check if this interrupt handler is already lodged */
for
(
i
=
0
;
(
i
<
COMEM_MAXPCI
);
i
++
)
{
if
(
pci_irqlist
[
i
].
handler
==
handler
)
return
(
0
);
}
/* Find a free spot to put this handler */
for
(
i
=
0
;
(
i
<
COMEM_MAXPCI
);
i
++
)
{
if
(
pci_irqlist
[
i
].
handler
==
0
)
{
pci_irqlist
[
i
].
handler
=
handler
;
pci_irqlist
[
i
].
device
=
device
;
pci_irqlist
[
i
].
dev_id
=
dev_id
;
return
(
0
);
}
}
/* Couldn't fit?? */
return
(
1
);
}
/*****************************************************************************/
void
pci_free_irq
(
unsigned
int
irq
,
void
*
dev_id
)
{
int
i
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_free_irq(irq=%d,dev_id=%x)
\n
"
,
irq
,
(
int
)
dev_id
);
#endif
if
(
dev_id
==
(
void
*
)
NULL
)
return
;
/* Check if this interrupt handler is lodged */
for
(
i
=
0
;
(
i
<
COMEM_MAXPCI
);
i
++
)
{
if
(
pci_irqlist
[
i
].
dev_id
==
dev_id
)
{
pci_irqlist
[
i
].
handler
=
NULL
;
pci_irqlist
[
i
].
device
=
NULL
;
pci_irqlist
[
i
].
dev_id
=
NULL
;
break
;
}
}
}
/*****************************************************************************/
void
pci_interrupt
(
int
irq
,
void
*
id
,
struct
pt_regs
*
fp
)
{
int
i
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_interrupt(irq=%d,id=%x,fp=%x)
\n
"
,
irq
,
(
int
)
id
,
(
int
)
fp
);
#endif
for
(
i
=
0
;
(
i
<
COMEM_MAXPCI
);
i
++
)
{
if
(
pci_irqlist
[
i
].
handler
)
(
*
pci_irqlist
[
i
].
handler
)(
irq
,
pci_irqlist
[
i
].
dev_id
,
fp
);
}
}
/*****************************************************************************/
/*
* The shared memory region is broken up into contiguous 512 byte
* regions for easy allocation... This is not an optimal solution
* but it makes allocation and freeing regions really easy.
*/
#define PCI_MEMSLOTSIZE 512
#define PCI_MEMSLOTS (COMEM_SHMEMSIZE / PCI_MEMSLOTSIZE)
char
pci_shmemmap
[
PCI_MEMSLOTS
];
void
*
pci_bmalloc
(
int
size
)
{
int
i
,
j
,
nrslots
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_bmalloc(size=%d)
\n
"
,
size
);
#endif
if
(
size
<=
0
)
return
((
void
*
)
NULL
);
nrslots
=
(
size
-
1
)
/
PCI_MEMSLOTSIZE
;
for
(
i
=
0
;
(
i
<
(
PCI_MEMSLOTS
-
nrslots
));
i
++
)
{
if
(
pci_shmemmap
[
i
]
==
0
)
{
for
(
j
=
i
+
1
;
(
j
<
(
i
+
nrslots
));
j
++
)
{
if
(
pci_shmemmap
[
j
])
goto
restart
;
}
for
(
j
=
i
;
(
j
<=
i
+
nrslots
);
j
++
)
pci_shmemmap
[
j
]
=
1
;
break
;
}
restart:
}
return
((
void
*
)
(
COMEM_BASE
+
COMEM_SHMEM
+
(
i
*
PCI_MEMSLOTSIZE
)));
}
/*****************************************************************************/
void
pci_bmfree
(
void
*
mp
,
int
size
)
{
int
i
,
j
,
nrslots
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_bmfree(mp=%x,size=%d)
\n
"
,
(
int
)
mp
,
size
);
#endif
nrslots
=
size
/
PCI_MEMSLOTSIZE
;
i
=
(((
unsigned
long
)
mp
)
-
(
COMEM_BASE
+
COMEM_SHMEM
))
/
PCI_MEMSLOTSIZE
;
for
(
j
=
i
;
(
j
<
(
i
+
nrslots
));
j
++
)
pci_shmemmap
[
j
]
=
0
;
}
/*****************************************************************************/
unsigned
long
pci_virt_to_bus
(
volatile
void
*
address
)
{
unsigned
long
l
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_virt_to_bus(address=%x)"
,
(
int
)
address
);
#endif
l
=
((
unsigned
long
)
address
)
-
COMEM_BASE
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"=%x
\n
"
,
(
int
)
(
l
+
pci_shmemaddr
));
#endif
return
(
l
+
pci_shmemaddr
);
}
/*****************************************************************************/
void
*
pci_bus_to_virt
(
unsigned
long
address
)
{
unsigned
long
l
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_bus_to_virt(address=%x)"
,
(
int
)
address
);
#endif
l
=
address
-
pci_shmemaddr
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"=%x
\n
"
,
(
int
)
(
address
+
COMEM_BASE
));
#endif
return
((
void
*
)
(
address
+
COMEM_BASE
));
}
/*****************************************************************************/
void
pci_bmcpyto
(
void
*
dst
,
void
*
src
,
int
len
)
{
unsigned
long
*
dp
,
*
sp
,
val
;
unsigned
char
*
dcp
,
*
scp
;
int
i
,
j
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_bmcpyto(dst=%x,src=%x,len=%d)
\n
"
,
(
int
)
dst
,
(
int
)
src
,
len
);
#endif
dp
=
(
unsigned
long
*
)
dst
;
sp
=
(
unsigned
long
*
)
src
;
i
=
len
>>
2
;
#if 0
printk(KERN_INFO "DATA:");
scp = (unsigned char *) sp;
for (i = 0; (i < len); i++) {
if ((i % 16) == 0) printk(KERN_INFO "\n%04x: ", i);
printk(KERN_INFO "%02x ", *scp++);
}
printk(KERN_INFO "\n");
#endif
for
(
j
=
0
;
(
i
>=
0
);
i
--
,
j
++
)
{
val
=
*
sp
++
;
val
=
(
val
<<
24
)
|
((
val
&
0x0000ff00
)
<<
8
)
|
((
val
&
0x00ff0000
)
>>
8
)
|
(
val
>>
24
);
*
dp
++
=
val
;
}
if
(
len
&
0x3
)
{
dcp
=
(
unsigned
char
*
)
dp
;
scp
=
((
unsigned
char
*
)
sp
)
+
3
;
for
(
i
=
0
;
(
i
<
(
len
&
0x3
));
i
++
)
*
dcp
++
=
*
scp
--
;
}
}
/*****************************************************************************/
void
pci_bmcpyfrom
(
void
*
dst
,
void
*
src
,
int
len
)
{
unsigned
long
*
dp
,
*
sp
,
val
;
unsigned
char
*
dcp
,
*
scp
;
int
i
;
#ifdef DEBUGIO
printk
(
KERN_DEBUG
"pci_bmcpyfrom(dst=%x,src=%x,len=%d)
\n
"
,(
int
)
dst
,(
int
)
src
,
len
);
#endif
dp
=
(
unsigned
long
*
)
dst
;
sp
=
(
unsigned
long
*
)
src
;
i
=
len
>>
2
;
for
(;
(
i
>=
0
);
i
--
)
{
val
=
*
sp
++
;
val
=
(
val
<<
24
)
|
((
val
&
0x0000ff00
)
<<
8
)
|
((
val
&
0x00ff0000
)
>>
8
)
|
(
val
>>
24
);
*
dp
++
=
val
;
}
if
(
len
&
0x3
)
{
dcp
=
((
unsigned
char
*
)
dp
)
+
3
;
scp
=
(
unsigned
char
*
)
sp
;
for
(
i
=
0
;
(
i
<
(
len
&
0x3
));
i
++
)
*
dcp
++
=
*
scp
--
;
}
#if 0
printk(KERN_INFO "DATA:");
dcp = (unsigned char *) dst;
for (i = 0; (i < len); i++) {
if ((i % 16) == 0) printk(KERN_INFO "\n%04x: ", i);
printk(KERN_INFO "%02x ", *dcp++);
}
printk(KERN_INFO "\n");
#endif
}
/*****************************************************************************/
void
*
pci_alloc_consistent
(
struct
pci_dev
*
dev
,
size_t
size
,
dma_addr_t
*
dma_addr
)
{
void
*
mp
;
if
((
mp
=
pci_bmalloc
(
size
))
!=
NULL
)
{
dma_addr
=
mp
-
(
COMEM_BASE
+
COMEM_SHMEM
);
return
(
mp
);
}
*
dma_addr
=
(
dma_addr_t
)
NULL
;
return
(
NULL
);
}
/*****************************************************************************/
void
pci_free_consistent
(
struct
pci_dev
*
dev
,
size_t
size
,
void
*
cpu_addr
,
dma_addr_t
dma_addr
)
{
pci_bmfree
(
cpu_addr
,
size
);
}
/*****************************************************************************/
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