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
83ef64b9
Commit
83ef64b9
authored
Aug 24, 2008
by
David S. Miller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sparc64: Use consistent chmc_ prefix in variables, types, and functions.
Signed-off-by:
David S. Miller
<
davem@davemloft.net
>
parent
b28422e3
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
120 additions
and
117 deletions
+120
-117
arch/sparc64/kernel/chmc.c
arch/sparc64/kernel/chmc.c
+120
-117
No files found.
arch/sparc64/kernel/chmc.c
View file @
83ef64b9
...
...
@@ -35,35 +35,35 @@ MODULE_VERSION(DRV_MODULE_VERSION);
#define CHMCTRL_NDGRPS 2
#define CHMCTRL_NDIMMS 4
#define DIMMS_PER_MC (CHMCTRL_NDGRPS * CHMCTRL_NDIMMS)
#define
CHMC_
DIMMS_PER_MC (CHMCTRL_NDGRPS * CHMCTRL_NDIMMS)
/* OBP memory-layout property format. */
struct
obp_map
{
struct
chmc_
obp_map
{
unsigned
char
dimm_map
[
144
];
unsigned
char
pin_map
[
576
];
};
#define DIMM_LABEL_SZ 8
struct
obp_mem_layout
{
struct
chmc_
obp_mem_layout
{
/* One max 8-byte string label per DIMM. Usually
* this matches the label on the motherboard where
* that DIMM resides.
*/
char
dimm_labels
[
DIMMS_PER_MC
][
DIMM_LABEL_SZ
];
char
dimm_labels
[
CHMC_
DIMMS_PER_MC
][
DIMM_LABEL_SZ
];
/* If symmetric use map[0], else it is
* asymmetric and map[1] should be used.
*/
char
symmetric
;
struct
obp_map
map
[
2
];
struct
chmc_
obp_map
map
[
2
];
};
#define CHMCTRL_NBANKS 4
struct
bank_info
{
struct
mctrl_info
*
m
p
;
struct
chmc_
bank_info
{
struct
chmc
*
p
;
int
bank_id
;
u64
raw_reg
;
...
...
@@ -77,11 +77,11 @@ struct bank_info {
unsigned
long
size
;
};
struct
mctrl_info
{
struct
chmc
{
struct
list_head
list
;
int
portid
;
struct
obp_mem_layout
layout_prop
;
struct
chmc_
obp_mem_layout
layout_prop
;
int
layout_size
;
void
__iomem
*
regs
;
...
...
@@ -92,13 +92,13 @@ struct mctrl_info {
u64
timing_control4
;
u64
memaddr_control
;
struct
bank_info
logical_banks
[
CHMCTRL_NBANKS
];
struct
chmc_bank_info
logical_banks
[
CHMCTRL_NBANKS
];
};
static
LIST_HEAD
(
mctrl_list
);
/* Does BANK decode PHYS_ADDR? */
static
int
bank_match
(
struct
bank_info
*
bp
,
unsigned
long
phys_addr
)
static
int
chmc_bank_match
(
struct
chmc_
bank_info
*
bp
,
unsigned
long
phys_addr
)
{
unsigned
long
upper_bits
=
(
phys_addr
&
PA_UPPER_BITS
)
>>
PA_UPPER_BITS_SHIFT
;
unsigned
long
lower_bits
=
(
phys_addr
&
PA_LOWER_BITS
)
>>
PA_LOWER_BITS_SHIFT
;
...
...
@@ -130,14 +130,13 @@ static int bank_match(struct bank_info *bp, unsigned long phys_addr)
}
/* Given PHYS_ADDR, search memory controller banks for a match. */
static
struct
bank_info
*
find_bank
(
unsigned
long
phys_addr
)
static
struct
chmc_bank_info
*
chmc_
find_bank
(
unsigned
long
phys_addr
)
{
struct
list_head
*
mctrl_head
=
&
mctrl_list
;
struct
list_head
*
mctrl_entry
=
mctrl_head
->
next
;
for
(;;)
{
struct
mctrl_info
*
mp
=
list_entry
(
mctrl_entry
,
struct
mctrl_info
,
list
);
struct
chmc
*
p
=
list_entry
(
mctrl_entry
,
struct
chmc
,
list
);
int
bank_no
;
if
(
mctrl_entry
==
mctrl_head
)
...
...
@@ -145,10 +144,10 @@ static struct bank_info *find_bank(unsigned long phys_addr)
mctrl_entry
=
mctrl_entry
->
next
;
for
(
bank_no
=
0
;
bank_no
<
CHMCTRL_NBANKS
;
bank_no
++
)
{
struct
bank_info
*
bp
;
struct
chmc_
bank_info
*
bp
;
bp
=
&
m
p
->
logical_banks
[
bank_no
];
if
(
bank_match
(
bp
,
phys_addr
))
bp
=
&
p
->
logical_banks
[
bank_no
];
if
(
chmc_
bank_match
(
bp
,
phys_addr
))
return
bp
;
}
}
...
...
@@ -163,11 +162,11 @@ int chmc_getunumber(int syndrome_code,
unsigned
long
phys_addr
,
char
*
buf
,
int
buflen
)
{
struct
bank_info
*
bp
;
struct
obp_mem_layout
*
prop
;
struct
chmc_
bank_info
*
bp
;
struct
chmc_
obp_mem_layout
*
prop
;
int
bank_in_controller
,
first_dimm
;
bp
=
find_bank
(
phys_addr
);
bp
=
chmc_
find_bank
(
phys_addr
);
if
(
bp
==
NULL
||
syndrome_code
<
SYNDROME_MIN
||
syndrome_code
>
SYNDROME_MAX
)
{
...
...
@@ -178,13 +177,13 @@ int chmc_getunumber(int syndrome_code,
return
0
;
}
prop
=
&
bp
->
m
p
->
layout_prop
;
prop
=
&
bp
->
p
->
layout_prop
;
bank_in_controller
=
bp
->
bank_id
&
(
CHMCTRL_NBANKS
-
1
);
first_dimm
=
(
bank_in_controller
&
(
CHMCTRL_NDGRPS
-
1
));
first_dimm
*=
CHMCTRL_NDIMMS
;
if
(
syndrome_code
!=
SYNDROME_MIN
)
{
struct
obp_map
*
map
;
struct
chmc_
obp_map
*
map
;
int
qword
,
where_in_line
,
where
,
map_index
,
map_offset
;
unsigned
int
map_val
;
...
...
@@ -252,7 +251,7 @@ int chmc_getunumber(int syndrome_code,
* the code is executing, you must use special ASI load/store else
* you go through the global mapping.
*/
static
u64
read_mcreg
(
struct
mctrl_info
*
m
p
,
unsigned
long
offset
)
static
u64
chmc_read_mcreg
(
struct
chmc
*
p
,
unsigned
long
offset
)
{
unsigned
long
ret
,
this_cpu
;
...
...
@@ -260,14 +259,14 @@ static u64 read_mcreg(struct mctrl_info *mp, unsigned long offset)
this_cpu
=
real_hard_smp_processor_id
();
if
(
m
p
->
portid
==
this_cpu
)
{
if
(
p
->
portid
==
this_cpu
)
{
__asm__
__volatile__
(
"ldxa [%1] %2, %0"
:
"=r"
(
ret
)
:
"r"
(
offset
),
"i"
(
ASI_MCU_CTRL_REG
));
}
else
{
__asm__
__volatile__
(
"ldxa [%1] %2, %0"
:
"=r"
(
ret
)
:
"r"
(
m
p
->
regs
+
offset
),
:
"r"
(
p
->
regs
+
offset
),
"i"
(
ASI_PHYS_BYPASS_EC_E
));
}
...
...
@@ -277,164 +276,168 @@ static u64 read_mcreg(struct mctrl_info *mp, unsigned long offset)
}
#if 0 /* currently unused */
static void
write_mcreg(struct mctrl_info *m
p, unsigned long offset, u64 val)
static void
chmc_write_mcreg(struct chmc *
p, unsigned long offset, u64 val)
{
if (
m
p->portid == smp_processor_id()) {
if (p->portid == smp_processor_id()) {
__asm__ __volatile__("stxa %0, [%1] %2"
: : "r" (val),
"r" (offset), "i" (ASI_MCU_CTRL_REG));
} else {
__asm__ __volatile__("ldxa %0, [%1] %2"
: : "r" (val),
"r" (
m
p->regs + offset),
"r" (p->regs + offset),
"i" (ASI_PHYS_BYPASS_EC_E));
}
}
#endif
static
void
interpret_one_decode_reg
(
struct
mctrl_info
*
m
p
,
int
which_bank
,
u64
val
)
static
void
chmc_interpret_one_decode_reg
(
struct
chmc
*
p
,
int
which_bank
,
u64
val
)
{
struct
bank_info
*
p
=
&
m
p
->
logical_banks
[
which_bank
];
p
->
mp
=
m
p
;
p
->
bank_id
=
(
CHMCTRL_NBANKS
*
m
p
->
portid
)
+
which_bank
;
p
->
raw_reg
=
val
;
p
->
valid
=
(
val
&
MEM_DECODE_VALID
)
>>
MEM_DECODE_VALID_SHIFT
;
p
->
uk
=
(
val
&
MEM_DECODE_UK
)
>>
MEM_DECODE_UK_SHIFT
;
p
->
um
=
(
val
&
MEM_DECODE_UM
)
>>
MEM_DECODE_UM_SHIFT
;
p
->
lk
=
(
val
&
MEM_DECODE_LK
)
>>
MEM_DECODE_LK_SHIFT
;
p
->
lm
=
(
val
&
MEM_DECODE_LM
)
>>
MEM_DECODE_LM_SHIFT
;
p
->
base
=
(
p
->
um
);
p
->
base
&=
~
(
p
->
uk
);
p
->
base
<<=
PA_UPPER_BITS_SHIFT
;
switch
(
p
->
lk
)
{
struct
chmc_bank_info
*
bp
=
&
p
->
logical_banks
[
which_bank
];
bp
->
p
=
p
;
bp
->
bank_id
=
(
CHMCTRL_NBANKS
*
p
->
portid
)
+
which_bank
;
b
p
->
raw_reg
=
val
;
b
p
->
valid
=
(
val
&
MEM_DECODE_VALID
)
>>
MEM_DECODE_VALID_SHIFT
;
b
p
->
uk
=
(
val
&
MEM_DECODE_UK
)
>>
MEM_DECODE_UK_SHIFT
;
b
p
->
um
=
(
val
&
MEM_DECODE_UM
)
>>
MEM_DECODE_UM_SHIFT
;
b
p
->
lk
=
(
val
&
MEM_DECODE_LK
)
>>
MEM_DECODE_LK_SHIFT
;
b
p
->
lm
=
(
val
&
MEM_DECODE_LM
)
>>
MEM_DECODE_LM_SHIFT
;
bp
->
base
=
(
b
p
->
um
);
bp
->
base
&=
~
(
b
p
->
uk
);
b
p
->
base
<<=
PA_UPPER_BITS_SHIFT
;
switch
(
b
p
->
lk
)
{
case
0xf
:
default:
p
->
interleave
=
1
;
b
p
->
interleave
=
1
;
break
;
case
0xe
:
p
->
interleave
=
2
;
b
p
->
interleave
=
2
;
break
;
case
0xc
:
p
->
interleave
=
4
;
b
p
->
interleave
=
4
;
break
;
case
0x8
:
p
->
interleave
=
8
;
b
p
->
interleave
=
8
;
break
;
case
0x0
:
p
->
interleave
=
16
;
b
p
->
interleave
=
16
;
break
;
};
/* UK[10] is reserved, and UK[11] is not set for the SDRAM
* bank size definition.
*/
p
->
size
=
(((
unsigned
long
)
p
->
uk
&
bp
->
size
=
(((
unsigned
long
)
b
p
->
uk
&
((
1UL
<<
10UL
)
-
1UL
))
+
1UL
)
<<
PA_UPPER_BITS_SHIFT
;
p
->
size
/=
p
->
interleave
;
bp
->
size
/=
b
p
->
interleave
;
}
static
void
fetch_decode_regs
(
struct
mctrl_info
*
m
p
)
static
void
chmc_fetch_decode_regs
(
struct
chmc
*
p
)
{
if
(
m
p
->
layout_size
==
0
)
if
(
p
->
layout_size
==
0
)
return
;
interpret_one_decode_reg
(
m
p
,
0
,
read_mcreg
(
m
p
,
CHMCTRL_DECODE1
));
interpret_one_decode_reg
(
m
p
,
1
,
read_mcreg
(
m
p
,
CHMCTRL_DECODE2
));
interpret_one_decode_reg
(
m
p
,
2
,
read_mcreg
(
m
p
,
CHMCTRL_DECODE3
));
interpret_one_decode_reg
(
m
p
,
3
,
read_mcreg
(
m
p
,
CHMCTRL_DECODE4
));
chmc_interpret_one_decode_reg
(
p
,
0
,
chmc_read_mcreg
(
p
,
CHMCTRL_DECODE1
));
chmc_interpret_one_decode_reg
(
p
,
1
,
chmc_read_mcreg
(
p
,
CHMCTRL_DECODE2
));
chmc_interpret_one_decode_reg
(
p
,
2
,
chmc_read_mcreg
(
p
,
CHMCTRL_DECODE3
));
chmc_interpret_one_decode_reg
(
p
,
3
,
chmc_read_mcreg
(
p
,
CHMCTRL_DECODE4
));
}
static
int
__devinit
chmc_probe
(
struct
of_device
*
op
,
const
struct
of_device_id
*
match
)
{
struct
device_node
*
dp
=
op
->
node
;
struct
mctrl_info
*
mp
;
unsigned
long
ver
;
const
void
*
pval
;
int
len
,
portid
;
struct
chmc
*
p
;
int
err
;
err
=
-
ENODEV
;
__asm__
(
"rdpr %%ver, %0"
:
"=r"
(
ver
));
if
((
ver
>>
32UL
)
==
__JALAPENO_ID
||
(
ver
>>
32UL
)
==
__SERRANO_ID
)
return
-
ENODEV
;
mp
=
kzalloc
(
sizeof
(
*
mp
),
GFP_KERNEL
);
if
(
!
mp
)
return
-
ENOMEM
;
goto
out
;
portid
=
of_getintprop_default
(
dp
,
"portid"
,
-
1
);
if
(
portid
==
-
1
)
goto
fail
;
goto
out
;
mp
->
portid
=
portid
;
pval
=
of_get_property
(
dp
,
"memory-layout"
,
&
len
);
mp
->
layout_size
=
len
;
if
(
!
pval
)
mp
->
layout_size
=
0
;
else
{
if
(
mp
->
layout_size
>
sizeof
(
mp
->
layout_prop
))
{
if
(
pval
&&
len
>
sizeof
(
p
->
layout_prop
))
{
printk
(
KERN_ERR
PFX
"Unexpected memory-layout property "
"size %d.
\n
"
,
mp
->
layout_size
);
goto
fail
;
"size %d.
\n
"
,
len
);
goto
out
;
}
memcpy
(
&
mp
->
layout_prop
,
pval
,
len
);
err
=
-
ENOMEM
;
p
=
kzalloc
(
sizeof
(
*
p
),
GFP_KERNEL
);
if
(
!
p
)
{
printk
(
KERN_ERR
PFX
"Could not allocate struct chmc.
\n
"
);
goto
out
;
}
mp
->
regs
=
of_ioremap
(
&
op
->
resource
[
0
],
0
,
0x48
,
"chmc"
);
if
(
!
mp
->
regs
)
{
p
->
portid
=
portid
;
p
->
layout_size
=
len
;
if
(
!
pval
)
p
->
layout_size
=
0
;
else
memcpy
(
&
p
->
layout_prop
,
pval
,
len
);
p
->
regs
=
of_ioremap
(
&
op
->
resource
[
0
],
0
,
0x48
,
"chmc"
);
if
(
!
p
->
regs
)
{
printk
(
KERN_ERR
PFX
"Could not map registers.
\n
"
);
goto
fail
;
goto
out_free
;
}
if
(
m
p
->
layout_size
!=
0UL
)
{
mp
->
timing_control1
=
read_mcreg
(
m
p
,
CHMCTRL_TCTRL1
);
mp
->
timing_control2
=
read_mcreg
(
m
p
,
CHMCTRL_TCTRL2
);
mp
->
timing_control3
=
read_mcreg
(
m
p
,
CHMCTRL_TCTRL3
);
mp
->
timing_control4
=
read_mcreg
(
m
p
,
CHMCTRL_TCTRL4
);
mp
->
memaddr_control
=
read_mcreg
(
m
p
,
CHMCTRL_MACTRL
);
if
(
p
->
layout_size
!=
0UL
)
{
p
->
timing_control1
=
chmc_read_mcreg
(
p
,
CHMCTRL_TCTRL1
);
p
->
timing_control2
=
chmc_read_mcreg
(
p
,
CHMCTRL_TCTRL2
);
p
->
timing_control3
=
chmc_read_mcreg
(
p
,
CHMCTRL_TCTRL3
);
p
->
timing_control4
=
chmc_read_mcreg
(
p
,
CHMCTRL_TCTRL4
);
p
->
memaddr_control
=
chmc_read_mcreg
(
p
,
CHMCTRL_MACTRL
);
}
fetch_decode_regs
(
m
p
);
chmc_fetch_decode_regs
(
p
);
list_add
(
&
m
p
->
list
,
&
mctrl_list
);
list_add
(
&
p
->
list
,
&
mctrl_list
);
/* Report the device. */
printk
(
KERN_INFO
PFX
"UltraSPARC-III memory controller at %s [%s]
\n
"
,
dp
->
full_name
,
(
m
p
->
layout_size
?
"ACTIVE"
:
"INACTIVE"
));
(
p
->
layout_size
?
"ACTIVE"
:
"INACTIVE"
));
dev_set_drvdata
(
&
op
->
dev
,
m
p
);
dev_set_drvdata
(
&
op
->
dev
,
p
);
return
0
;
err
=
0
;
fail:
if
(
mp
)
{
if
(
mp
->
regs
!=
NULL
)
of_iounmap
(
&
op
->
resource
[
0
],
mp
->
regs
,
0x48
);
kfree
(
mp
);
}
return
-
1
;
out:
return
err
;
out_free:
kfree
(
p
);
goto
out
;
}
static
int
__devexit
chmc_remove
(
struct
of_device
*
op
)
{
struct
mctrl_info
*
m
p
=
dev_get_drvdata
(
&
op
->
dev
);
struct
chmc
*
p
=
dev_get_drvdata
(
&
op
->
dev
);
if
(
m
p
)
{
list_del
(
&
m
p
->
list
);
of_iounmap
(
&
op
->
resource
[
0
],
m
p
->
regs
,
0x48
);
kfree
(
m
p
);
if
(
p
)
{
list_del
(
&
p
->
list
);
of_iounmap
(
&
op
->
resource
[
0
],
p
->
regs
,
0x48
);
kfree
(
p
);
}
return
0
;
}
...
...
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