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
f8cc5756
Commit
f8cc5756
authored
Oct 14, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
parents
bf7c7dec
b4d1b825
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
215 additions
and
392 deletions
+215
-392
arch/sparc64/kernel/pci_iommu.c
arch/sparc64/kernel/pci_iommu.c
+159
-204
arch/sparc64/kernel/pci_psycho.c
arch/sparc64/kernel/pci_psycho.c
+5
-39
arch/sparc64/kernel/pci_sabre.c
arch/sparc64/kernel/pci_sabre.c
+4
-35
arch/sparc64/kernel/pci_schizo.c
arch/sparc64/kernel/pci_schizo.c
+3
-54
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/smp.c
+0
-7
arch/sparc64/mm/ultra.S
arch/sparc64/mm/ultra.S
+0
-16
arch/sparc64/prom/misc.c
arch/sparc64/prom/misc.c
+0
-12
drivers/scsi/qlogicpti.c
drivers/scsi/qlogicpti.c
+35
-4
include/asm-sparc64/pbm.h
include/asm-sparc64/pbm.h
+9
-21
No files found.
arch/sparc64/kernel/pci_iommu.c
View file @
f8cc5756
This diff is collapsed.
Click to expand it.
arch/sparc64/kernel/pci_psycho.c
View file @
f8cc5756
...
...
@@ -1207,13 +1207,9 @@ static void psycho_scan_bus(struct pci_controller_info *p)
static
void
psycho_iommu_init
(
struct
pci_controller_info
*
p
)
{
struct
pci_iommu
*
iommu
=
p
->
pbm_A
.
iommu
;
unsigned
long
tsbbase
,
i
;
unsigned
long
i
;
u64
control
;
/* Setup initial software IOMMU state. */
spin_lock_init
(
&
iommu
->
lock
);
iommu
->
ctx_lowest_free
=
1
;
/* Register addresses. */
iommu
->
iommu_control
=
p
->
pbm_A
.
controller_regs
+
PSYCHO_IOMMU_CONTROL
;
iommu
->
iommu_tsbbase
=
p
->
pbm_A
.
controller_regs
+
PSYCHO_IOMMU_TSBBASE
;
...
...
@@ -1240,40 +1236,10 @@ static void psycho_iommu_init(struct pci_controller_info *p)
/* Leave diag mode enabled for full-flushing done
* in pci_iommu.c
*/
pci_iommu_table_init
(
iommu
,
IO_TSB_SIZE
,
0xc0000000
,
0xffffffff
);
iommu
->
dummy_page
=
__get_free_pages
(
GFP_KERNEL
,
0
);
if
(
!
iommu
->
dummy_page
)
{
prom_printf
(
"PSYCHO_IOMMU: Error, gfp(dummy_page) failed.
\n
"
);
prom_halt
();
}
memset
((
void
*
)
iommu
->
dummy_page
,
0
,
PAGE_SIZE
);
iommu
->
dummy_page_pa
=
(
unsigned
long
)
__pa
(
iommu
->
dummy_page
);
/* Using assumed page size 8K with 128K entries we need 1MB iommu page
* table (128K ioptes * 8 bytes per iopte). This is
* page order 7 on UltraSparc.
*/
tsbbase
=
__get_free_pages
(
GFP_KERNEL
,
get_order
(
IO_TSB_SIZE
));
if
(
!
tsbbase
)
{
prom_printf
(
"PSYCHO_IOMMU: Error, gfp(tsb) failed.
\n
"
);
prom_halt
();
}
iommu
->
page_table
=
(
iopte_t
*
)
tsbbase
;
iommu
->
page_table_sz_bits
=
17
;
iommu
->
page_table_map_base
=
0xc0000000
;
iommu
->
dma_addr_mask
=
0xffffffff
;
pci_iommu_table_init
(
iommu
,
IO_TSB_SIZE
);
/* We start with no consistent mappings. */
iommu
->
lowest_consistent_map
=
1
<<
(
iommu
->
page_table_sz_bits
-
PBM_LOGCLUSTERS
);
for
(
i
=
0
;
i
<
PBM_NCLUSTERS
;
i
++
)
{
iommu
->
alloc_info
[
i
].
flush
=
0
;
iommu
->
alloc_info
[
i
].
next
=
0
;
}
psycho_write
(
p
->
pbm_A
.
controller_regs
+
PSYCHO_IOMMU_TSBBASE
,
__pa
(
tsbbase
));
psycho_write
(
p
->
pbm_A
.
controller_regs
+
PSYCHO_IOMMU_TSBBASE
,
__pa
(
iommu
->
page_table
));
control
=
psycho_read
(
p
->
pbm_A
.
controller_regs
+
PSYCHO_IOMMU_CONTROL
);
control
&=
~
(
PSYCHO_IOMMU_CTRL_TSBSZ
|
PSYCHO_IOMMU_CTRL_TBWSZ
);
...
...
@@ -1281,7 +1247,7 @@ static void psycho_iommu_init(struct pci_controller_info *p)
psycho_write
(
p
->
pbm_A
.
controller_regs
+
PSYCHO_IOMMU_CONTROL
,
control
);
/* If necessary, hook us up for starfire IRQ translations. */
if
(
this_is_starfire
)
if
(
this_is_starfire
)
p
->
starfire_cookie
=
starfire_hookup
(
p
->
pbm_A
.
portid
);
else
p
->
starfire_cookie
=
NULL
;
...
...
arch/sparc64/kernel/pci_sabre.c
View file @
f8cc5756
...
...
@@ -1267,13 +1267,9 @@ static void sabre_iommu_init(struct pci_controller_info *p,
u32
dma_mask
)
{
struct
pci_iommu
*
iommu
=
p
->
pbm_A
.
iommu
;
unsigned
long
tsbbase
,
i
,
order
;
unsigned
long
i
;
u64
control
;
/* Setup initial software IOMMU state. */
spin_lock_init
(
&
iommu
->
lock
);
iommu
->
ctx_lowest_free
=
1
;
/* Register addresses. */
iommu
->
iommu_control
=
p
->
pbm_A
.
controller_regs
+
SABRE_IOMMU_CONTROL
;
iommu
->
iommu_tsbbase
=
p
->
pbm_A
.
controller_regs
+
SABRE_IOMMU_TSBBASE
;
...
...
@@ -1295,26 +1291,10 @@ static void sabre_iommu_init(struct pci_controller_info *p,
/* Leave diag mode enabled for full-flushing done
* in pci_iommu.c
*/
pci_iommu_table_init
(
iommu
,
tsbsize
*
1024
*
8
,
dvma_offset
,
dma_mask
);
iommu
->
dummy_page
=
__get_free_pages
(
GFP_KERNEL
,
0
);
if
(
!
iommu
->
dummy_page
)
{
prom_printf
(
"PSYCHO_IOMMU: Error, gfp(dummy_page) failed.
\n
"
);
prom_halt
();
}
memset
((
void
*
)
iommu
->
dummy_page
,
0
,
PAGE_SIZE
);
iommu
->
dummy_page_pa
=
(
unsigned
long
)
__pa
(
iommu
->
dummy_page
);
tsbbase
=
__get_free_pages
(
GFP_KERNEL
,
order
=
get_order
(
tsbsize
*
1024
*
8
));
if
(
!
tsbbase
)
{
prom_printf
(
"SABRE_IOMMU: Error, gfp(tsb) failed.
\n
"
);
prom_halt
();
}
iommu
->
page_table
=
(
iopte_t
*
)
tsbbase
;
iommu
->
page_table_map_base
=
dvma_offset
;
iommu
->
dma_addr_mask
=
dma_mask
;
pci_iommu_table_init
(
iommu
,
PAGE_SIZE
<<
order
);
sabre_write
(
p
->
pbm_A
.
controller_regs
+
SABRE_IOMMU_TSBBASE
,
__pa
(
tsbbase
));
sabre_write
(
p
->
pbm_A
.
controller_regs
+
SABRE_IOMMU_TSBBASE
,
__pa
(
iommu
->
page_table
));
control
=
sabre_read
(
p
->
pbm_A
.
controller_regs
+
SABRE_IOMMU_CONTROL
);
control
&=
~
(
SABRE_IOMMUCTRL_TSBSZ
|
SABRE_IOMMUCTRL_TBWSZ
);
...
...
@@ -1322,11 +1302,9 @@ static void sabre_iommu_init(struct pci_controller_info *p,
switch
(
tsbsize
)
{
case
64
:
control
|=
SABRE_IOMMU_TSBSZ_64K
;
iommu
->
page_table_sz_bits
=
16
;
break
;
case
128
:
control
|=
SABRE_IOMMU_TSBSZ_128K
;
iommu
->
page_table_sz_bits
=
17
;
break
;
default:
prom_printf
(
"iommu_init: Illegal TSB size %d
\n
"
,
tsbsize
);
...
...
@@ -1334,15 +1312,6 @@ static void sabre_iommu_init(struct pci_controller_info *p,
break
;
}
sabre_write
(
p
->
pbm_A
.
controller_regs
+
SABRE_IOMMU_CONTROL
,
control
);
/* We start with no consistent mappings. */
iommu
->
lowest_consistent_map
=
1
<<
(
iommu
->
page_table_sz_bits
-
PBM_LOGCLUSTERS
);
for
(
i
=
0
;
i
<
PBM_NCLUSTERS
;
i
++
)
{
iommu
->
alloc_info
[
i
].
flush
=
0
;
iommu
->
alloc_info
[
i
].
next
=
0
;
}
}
static
void
pbm_register_toplevel_resources
(
struct
pci_controller_info
*
p
,
...
...
arch/sparc64/kernel/pci_schizo.c
View file @
f8cc5756
...
...
@@ -1765,7 +1765,7 @@ static void schizo_pbm_strbuf_init(struct pci_pbm_info *pbm)
static
void
schizo_pbm_iommu_init
(
struct
pci_pbm_info
*
pbm
)
{
struct
pci_iommu
*
iommu
=
pbm
->
iommu
;
unsigned
long
tsbbase
,
i
,
tagbase
,
database
,
order
;
unsigned
long
i
,
tagbase
,
database
;
u32
vdma
[
2
],
dma_mask
;
u64
control
;
int
err
,
tsbsize
;
...
...
@@ -1800,10 +1800,6 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
prom_halt
();
};
/* Setup initial software IOMMU state. */
spin_lock_init
(
&
iommu
->
lock
);
iommu
->
ctx_lowest_free
=
1
;
/* Register addresses, SCHIZO has iommu ctx flushing. */
iommu
->
iommu_control
=
pbm
->
pbm_regs
+
SCHIZO_IOMMU_CONTROL
;
iommu
->
iommu_tsbbase
=
pbm
->
pbm_regs
+
SCHIZO_IOMMU_TSBBASE
;
...
...
@@ -1832,56 +1828,9 @@ static void schizo_pbm_iommu_init(struct pci_pbm_info *pbm)
/* Leave diag mode enabled for full-flushing done
* in pci_iommu.c
*/
pci_iommu_table_init
(
iommu
,
tsbsize
*
8
*
1024
,
vdma
[
0
],
dma_mask
);
iommu
->
dummy_page
=
__get_free_pages
(
GFP_KERNEL
,
0
);
if
(
!
iommu
->
dummy_page
)
{
prom_printf
(
"PSYCHO_IOMMU: Error, gfp(dummy_page) failed.
\n
"
);
prom_halt
();
}
memset
((
void
*
)
iommu
->
dummy_page
,
0
,
PAGE_SIZE
);
iommu
->
dummy_page_pa
=
(
unsigned
long
)
__pa
(
iommu
->
dummy_page
);
/* Using assumed page size 8K with 128K entries we need 1MB iommu page
* table (128K ioptes * 8 bytes per iopte). This is
* page order 7 on UltraSparc.
*/
order
=
get_order
(
tsbsize
*
8
*
1024
);
tsbbase
=
__get_free_pages
(
GFP_KERNEL
,
order
);
if
(
!
tsbbase
)
{
prom_printf
(
"%s: Error, gfp(tsb) failed.
\n
"
,
pbm
->
name
);
prom_halt
();
}
iommu
->
page_table
=
(
iopte_t
*
)
tsbbase
;
iommu
->
page_table_map_base
=
vdma
[
0
];
iommu
->
dma_addr_mask
=
dma_mask
;
pci_iommu_table_init
(
iommu
,
PAGE_SIZE
<<
order
);
switch
(
tsbsize
)
{
case
64
:
iommu
->
page_table_sz_bits
=
16
;
break
;
case
128
:
iommu
->
page_table_sz_bits
=
17
;
break
;
default:
prom_printf
(
"iommu_init: Illegal TSB size %d
\n
"
,
tsbsize
);
prom_halt
();
break
;
};
/* We start with no consistent mappings. */
iommu
->
lowest_consistent_map
=
1
<<
(
iommu
->
page_table_sz_bits
-
PBM_LOGCLUSTERS
);
for
(
i
=
0
;
i
<
PBM_NCLUSTERS
;
i
++
)
{
iommu
->
alloc_info
[
i
].
flush
=
0
;
iommu
->
alloc_info
[
i
].
next
=
0
;
}
schizo_write
(
iommu
->
iommu_tsbbase
,
__pa
(
tsbbase
));
schizo_write
(
iommu
->
iommu_tsbbase
,
__pa
(
iommu
->
page_table
));
control
=
schizo_read
(
iommu
->
iommu_control
);
control
&=
~
(
SCHIZO_IOMMU_CTRL_TSBSZ
|
SCHIZO_IOMMU_CTRL_TBWSZ
);
...
...
arch/sparc64/kernel/smp.c
View file @
f8cc5756
...
...
@@ -1001,13 +1001,6 @@ void smp_penguin_jailcell(int irq, struct pt_regs *regs)
preempt_enable
();
}
extern
unsigned
long
xcall_promstop
;
void
smp_promstop_others
(
void
)
{
smp_cross_call
(
&
xcall_promstop
,
0
,
0
,
0
);
}
#define prof_multiplier(__cpu) cpu_data(__cpu).multiplier
#define prof_counter(__cpu) cpu_data(__cpu).counter
...
...
arch/sparc64/mm/ultra.S
View file @
f8cc5756
...
...
@@ -453,22 +453,6 @@ xcall_flush_dcache_page_spitfire: /* %g1 == physical page address
nop
nop
.
globl
xcall_promstop
xcall_promstop
:
rdpr
%
pstate
,
%
g2
wrpr
%
g2
,
PSTATE_IG
|
PSTATE_AG
,
%
pstate
rdpr
%
pil
,
%
g2
wrpr
%
g0
,
15
,
%
pil
sethi
%
hi
(
109
f
),
%
g7
b
,
pt
%
xcc
,
etrap_irq
109
:
or
%
g7
,
%
lo
(
109
b
),
%
g7
flushw
call
prom_stopself
nop
/
*
We
should
not
return
,
just
spin
if
we
do
...
*/
1
:
b
,
a
,
pt
%
xcc
,
1
b
nop
.
data
errata32_hwbug
:
...
...
arch/sparc64/prom/misc.c
View file @
f8cc5756
...
...
@@ -68,19 +68,11 @@ void prom_cmdline(void)
local_irq_restore
(
flags
);
}
#ifdef CONFIG_SMP
extern
void
smp_promstop_others
(
void
);
#endif
/* Drop into the prom, but completely terminate the program.
* No chance of continuing.
*/
void
prom_halt
(
void
)
{
#ifdef CONFIG_SMP
smp_promstop_others
();
udelay
(
8000
);
#endif
again:
p1275_cmd
(
"exit"
,
P1275_INOUT
(
0
,
0
));
goto
again
;
/* PROM is out to get me -DaveM */
...
...
@@ -88,10 +80,6 @@ again:
void
prom_halt_power_off
(
void
)
{
#ifdef CONFIG_SMP
smp_promstop_others
();
udelay
(
8000
);
#endif
p1275_cmd
(
"SUNW,power-off"
,
P1275_INOUT
(
0
,
0
));
/* if nothing else helps, we just halt */
...
...
drivers/scsi/qlogicpti.c
View file @
f8cc5756
...
...
@@ -1119,6 +1119,36 @@ static inline void update_can_queue(struct Scsi_Host *host, u_int in_ptr, u_int
host
->
sg_tablesize
=
QLOGICPTI_MAX_SG
(
num_free
);
}
static
unsigned
int
scsi_rbuf_get
(
struct
scsi_cmnd
*
cmd
,
unsigned
char
**
buf_out
)
{
unsigned
char
*
buf
;
unsigned
int
buflen
;
if
(
cmd
->
use_sg
)
{
struct
scatterlist
*
sg
;
sg
=
(
struct
scatterlist
*
)
cmd
->
request_buffer
;
buf
=
kmap_atomic
(
sg
->
page
,
KM_IRQ0
)
+
sg
->
offset
;
buflen
=
sg
->
length
;
}
else
{
buf
=
cmd
->
request_buffer
;
buflen
=
cmd
->
request_bufflen
;
}
*
buf_out
=
buf
;
return
buflen
;
}
static
void
scsi_rbuf_put
(
struct
scsi_cmnd
*
cmd
,
unsigned
char
*
buf
)
{
if
(
cmd
->
use_sg
)
{
struct
scatterlist
*
sg
;
sg
=
(
struct
scatterlist
*
)
cmd
->
request_buffer
;
kunmap_atomic
(
buf
-
sg
->
offset
,
KM_IRQ0
);
}
}
/*
* Until we scan the entire bus with inquiries, go throught this fella...
*/
...
...
@@ -1145,11 +1175,9 @@ static void ourdone(struct scsi_cmnd *Cmnd)
int
ok
=
host_byte
(
Cmnd
->
result
)
==
DID_OK
;
if
(
Cmnd
->
cmnd
[
0
]
==
0x12
&&
ok
)
{
unsigned
char
*
iqd
;
unsigned
int
iqd_len
;
if
(
Cmnd
->
use_sg
!=
0
)
BUG
();
iqd
=
((
unsigned
char
*
)
Cmnd
->
buffer
);
iqd_len
=
scsi_rbuf_get
(
Cmnd
,
&
iqd
);
/* tags handled in midlayer */
/* enable sync mode? */
...
...
@@ -1163,6 +1191,9 @@ static void ourdone(struct scsi_cmnd *Cmnd)
if
(
iqd
[
7
]
&
0x20
)
{
qpti
->
dev_param
[
tgt
].
device_flags
|=
0x20
;
}
scsi_rbuf_put
(
Cmnd
,
iqd
);
qpti
->
sbits
|=
(
1
<<
tgt
);
}
else
if
(
!
ok
)
{
qpti
->
sbits
|=
(
1
<<
tgt
);
...
...
include/asm-sparc64/pbm.h
View file @
f8cc5756
...
...
@@ -27,23 +27,27 @@
* PCI bus.
*/
#define PBM_LOGCLUSTERS 3
#define PBM_NCLUSTERS (1 << PBM_LOGCLUSTERS)
struct
pci_controller_info
;
/* This contains the software state necessary to drive a PCI
* controller's IOMMU.
*/
struct
pci_iommu_arena
{
unsigned
long
*
map
;
unsigned
int
hint
;
unsigned
int
limit
;
};
struct
pci_iommu
{
/* This protects the controller's IOMMU and all
* streaming buffers underneath.
*/
spinlock_t
lock
;
struct
pci_iommu_arena
arena
;
/* IOMMU page table, a linear array of ioptes. */
iopte_t
*
page_table
;
/* The page table itself. */
int
page_table_sz_bits
;
/* log2 of ow many pages does it map? */
/* Base PCI memory space address where IOMMU mappings
* begin.
...
...
@@ -62,12 +66,6 @@ struct pci_iommu {
*/
unsigned
long
write_complete_reg
;
/* The lowest used consistent mapping entry. Since
* we allocate consistent maps out of cluster 0 this
* is relative to the beginning of closter 0.
*/
u32
lowest_consistent_map
;
/* In order to deal with some buggy third-party PCI bridges that
* do wrong prefetching, we never mark valid mappings as invalid.
* Instead we point them at this dummy page.
...
...
@@ -75,16 +73,6 @@ struct pci_iommu {
unsigned
long
dummy_page
;
unsigned
long
dummy_page_pa
;
/* If PBM_NCLUSTERS is ever decreased to 4 or lower,
* or if largest supported page_table_sz * 8K goes above
* 2GB, you must increase the size of the type of
* these counters. You have been duly warned. -DaveM
*/
struct
{
u16
next
;
u16
flush
;
}
alloc_info
[
PBM_NCLUSTERS
];
/* CTX allocation. */
unsigned
long
ctx_lowest_free
;
unsigned
long
ctx_bitmap
[
IOMMU_NUM_CTXS
/
(
sizeof
(
unsigned
long
)
*
8
)];
...
...
@@ -102,7 +90,7 @@ struct pci_iommu {
u32
dma_addr_mask
;
};
extern
void
pci_iommu_table_init
(
struct
pci_iommu
*
,
int
);
extern
void
pci_iommu_table_init
(
struct
pci_iommu
*
iommu
,
int
tsbsize
,
u32
dma_offset
,
u32
dma_addr_mask
);
/* This describes a PCI bus module's streaming buffer. */
struct
pci_strbuf
{
...
...
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