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
nexedi
linux
Commits
a23d9f9b
Commit
a23d9f9b
authored
Jul 29, 2002
by
Tim Hockin
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://tux.sfbay/linux-2.5
into scl1.sfbay.sun.com:/home/th122948/bk/linux-2.5
parents
13e895aa
e1cd9bad
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
273 additions
and
263 deletions
+273
-263
drivers/char/nvram.c
drivers/char/nvram.c
+273
-263
No files found.
drivers/char/nvram.c
View file @
a23d9f9b
...
...
@@ -38,12 +38,12 @@
#include <linux/smp_lock.h>
#define PC 1
#define ATARI 2
#define ATARI
2
/* select machine configuration */
#if defined(CONFIG_ATARI)
#define MACH ATARI
#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__)
/* and others?? */
#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__)
/* and others?? */
#define MACH PC
#else
#error Cannot build nvram driver for this machine configuration.
...
...
@@ -52,12 +52,12 @@
#if MACH == PC
/* RTC in a PC */
#define CHECK_DRIVER_INIT()
1
#define CHECK_DRIVER_INIT()
1
/* On PCs, the checksum is built only over bytes 2..31 */
#define PC_CKS_RANGE_START 2
#define PC_CKS_RANGE_END 31
#define PC_CKS_LOC
32
#define PC_CKS_LOC 32
#define mach_check_checksum pc_check_checksum
#define mach_set_checksum pc_set_checksum
...
...
@@ -70,14 +70,14 @@
/* Special parameters for RTC in Atari machines */
#include <asm/atarihw.h>
#include <asm/atariints.h>
#define RTC_PORT(x)
(TT_RTC_BAS + 2*(x))
#define CHECK_DRIVER_INIT()
(MACH_IS_ATARI && ATARIHW_PRESENT(TT_CLK))
#define RTC_PORT(x) (TT_RTC_BAS + 2*(x))
#define CHECK_DRIVER_INIT()
(MACH_IS_ATARI && ATARIHW_PRESENT(TT_CLK))
/* On Ataris, the checksum is over all bytes except the checksum bytes
* themselves; these are at the very end */
#define ATARI_CKS_RANGE_START 0
#define ATARI_CKS_RANGE_END
47
#define ATARI_CKS_LOC
48
#define ATARI_CKS_RANGE_END 47
#define ATARI_CKS_LOC 48
#define mach_check_checksum atari_check_checksum
#define mach_set_checksum atari_set_checksum
...
...
@@ -109,46 +109,50 @@
static
int
nvram_open_cnt
;
/* #times opened */
static
int
nvram_open_mode
;
/* special open modes */
static
spinlock_t
nvram_open_lock
=
SPIN_LOCK_UNLOCKED
;
/* guards
nvram_open_cnt and
nvram_open_mode */
#define NVRAM_WRITE 1
/* opened for writing (exclusive) */
#define NVRAM_EXCL 2
/* opened with O_EXCL */
static
spinlock_t
nvram_open_lock
=
SPIN_LOCK_UNLOCKED
;
/* guards
*
nvram_open_cnt and
*
nvram_open_mode */
#define NVRAM_WRITE 1
/* opened for writing (exclusive) */
#define NVRAM_EXCL 2
/* opened with O_EXCL */
#define RTC_FIRST_BYTE 14
/* RTC register number of first NVRAM byte */
#define NVRAM_BYTES 128-RTC_FIRST_BYTE
/* number of NVRAM bytes */
#define RTC_FIRST_BYTE 14
/* RTC register number of first
* NVRAM byte */
#define NVRAM_BYTES 128-RTC_FIRST_BYTE
/* number of NVRAM bytes */
static
int
mach_check_checksum
(
void
);
static
void
mach_set_checksum
(
void
);
static
int
mach_check_checksum
(
void
);
static
void
mach_set_checksum
(
void
);
#ifdef CONFIG_PROC_FS
static
int
mach_proc_infos
(
unsigned
char
*
contents
,
char
*
buffer
,
int
*
len
,
off_t
*
begin
,
off_t
offset
,
int
size
);
static
int
mach_proc_infos
(
unsigned
char
*
contents
,
char
*
buffer
,
int
*
len
,
off_t
*
begin
,
off_t
offset
,
int
size
);
#endif
/*
* These are the internal NVRAM access functions, which do NOT disable
* interrupts and do not check the checksum. Both tasks are left to higher
* level function, so they need to be done only once per syscall.
*/
static
__inline__
unsigned
char
nvram_read_int
(
int
i
)
static
__inline__
unsigned
char
nvram_read_int
(
int
i
)
{
return
(
CMOS_READ
(
RTC_FIRST_BYTE
+
i
)
);
return
(
CMOS_READ
(
RTC_FIRST_BYTE
+
i
)
);
}
static
__inline__
void
nvram_write_int
(
unsigned
char
c
,
int
i
)
static
__inline__
void
nvram_write_int
(
unsigned
char
c
,
int
i
)
{
CMOS_WRITE
(
c
,
RTC_FIRST_BYTE
+
i
);
CMOS_WRITE
(
c
,
RTC_FIRST_BYTE
+
i
);
}
static
__inline__
int
nvram_check_checksum_int
(
void
)
static
__inline__
int
nvram_check_checksum_int
(
void
)
{
return
(
mach_check_checksum
()
);
return
(
mach_check_checksum
()
);
}
static
__inline__
void
nvram_set_checksum_int
(
void
)
static
__inline__
void
nvram_set_checksum_int
(
void
)
{
mach_set_checksum
();
}
...
...
@@ -166,178 +170,183 @@ static __inline__ void nvram_set_checksum_int( void )
* module), so they access config information themselves.
*/
unsigned
char
nvram_read_byte
(
int
i
)
unsigned
char
nvram_read_byte
(
int
i
)
{
unsigned
long
flags
;
unsigned
char
c
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
c
=
nvram_read_int
(
i
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
return
(
c
);
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
c
=
nvram_read_int
(
i
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
return
(
c
);
}
/* This races nicely with trying to read with checksum checking (nvram_read) */
void
nvram_write_byte
(
unsigned
char
c
,
int
i
)
void
nvram_write_byte
(
unsigned
char
c
,
int
i
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
nvram_write_int
(
c
,
i
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
nvram_write_int
(
c
,
i
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
}
int
nvram_check_checksum
(
void
)
int
nvram_check_checksum
(
void
)
{
unsigned
long
flags
;
int
rv
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
rv
=
nvram_check_checksum_int
();
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
return
(
rv
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
return
(
rv
);
}
void
nvram_set_checksum
(
void
)
void
nvram_set_checksum
(
void
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
spin_lock_irqsave
(
&
rtc_lock
,
flags
);
nvram_set_checksum_int
();
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
spin_unlock_irqrestore
(
&
rtc_lock
,
flags
);
}
#endif
/* MACH == ATARI */
/*
* The are the file operation function for user access to /dev/nvram
*/
static
long
long
nvram_llseek
(
struct
file
*
file
,
loff_t
offset
,
int
origin
)
static
long
long
nvram_llseek
(
struct
file
*
file
,
loff_t
offset
,
int
origin
)
{
lock_kernel
();
switch
(
origin
)
{
case
0
:
switch
(
origin
)
{
case
0
:
/* nothing to do */
break
;
case
1
:
case
1
:
offset
+=
file
->
f_pos
;
break
;
case
2
:
case
2
:
offset
+=
NVRAM_BYTES
;
break
;
}
unlock_kernel
();
return
(
(
offset
>=
0
)
?
(
file
->
f_pos
=
offset
)
:
-
EINVAL
);
return
((
offset
>=
0
)
?
(
file
->
f_pos
=
offset
)
:
-
EINVAL
);
}
static
ssize_t
nvram_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
static
ssize_t
nvram_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
char
contents
[
NVRAM_BYTES
];
char
contents
[
NVRAM_BYTES
];
unsigned
i
=
*
ppos
;
char
*
tmp
;
spin_lock_irq
(
&
rtc_lock
);
spin_lock_irq
(
&
rtc_lock
);
if
(
!
nvram_check_checksum_int
())
goto
checksum_err
;
for
(
tmp
=
contents
;
count
--
>
0
&&
i
<
NVRAM_BYTES
;
++
i
,
++
tmp
)
*
tmp
=
nvram_read_int
(
i
);
spin_unlock_irq
(
&
rtc_lock
);
spin_unlock_irq
(
&
rtc_lock
);
if
(
copy_to_user
(
buf
,
contents
,
tmp
-
contents
))
if
(
copy_to_user
(
buf
,
contents
,
tmp
-
contents
))
return
-
EFAULT
;
*
ppos
=
i
;
return
(
tmp
-
contents
);
checksum_err:
spin_unlock_irq
(
&
rtc_lock
);
checksum_err:
spin_unlock_irq
(
&
rtc_lock
);
return
-
EIO
;
}
static
ssize_t
nvram_write
(
struct
file
*
file
,
const
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
static
ssize_t
nvram_write
(
struct
file
*
file
,
const
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
char
contents
[
NVRAM_BYTES
];
char
contents
[
NVRAM_BYTES
];
unsigned
i
=
*
ppos
;
char
*
tmp
;
char
*
tmp
;
if
(
copy_from_user
(
contents
,
buf
,
(
NVRAM_BYTES
-
i
)
<
count
?
(
NVRAM_BYTES
-
i
)
:
count
))
if
(
copy_from_user
(
contents
,
buf
,
(
NVRAM_BYTES
-
i
)
<
count
?
(
NVRAM_BYTES
-
i
)
:
count
))
return
-
EFAULT
;
spin_lock_irq
(
&
rtc_lock
);
spin_lock_irq
(
&
rtc_lock
);
if
(
!
nvram_check_checksum_int
())
goto
checksum_err
;
for
(
tmp
=
contents
;
count
--
>
0
&&
i
<
NVRAM_BYTES
;
++
i
,
++
tmp
)
nvram_write_int
(
*
tmp
,
i
);
nvram_write_int
(
*
tmp
,
i
);
nvram_set_checksum_int
();
spin_unlock_irq
(
&
rtc_lock
);
spin_unlock_irq
(
&
rtc_lock
);
*
ppos
=
i
;
return
(
tmp
-
contents
);
checksum_err:
spin_unlock_irq
(
&
rtc_lock
);
checksum_err:
spin_unlock_irq
(
&
rtc_lock
);
return
-
EIO
;
}
static
int
nvram_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
static
int
nvram_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
int
i
;
switch
(
cmd
)
{
case
NVRAM_INIT
:
/* initialize NVRAM contents and checksum */
switch
(
cmd
)
{
case
NVRAM_INIT
:
/* initialize NVRAM contents and checksum */
if
(
!
capable
(
CAP_SYS_ADMIN
))
return
(
-
EACCES
);
return
(
-
EACCES
);
spin_lock_irq
(
&
rtc_lock
);
spin_lock_irq
(
&
rtc_lock
);
for
(
i
=
0
;
i
<
NVRAM_BYTES
;
++
i
)
nvram_write_int
(
0
,
i
);
for
(
i
=
0
;
i
<
NVRAM_BYTES
;
++
i
)
nvram_write_int
(
0
,
i
);
nvram_set_checksum_int
();
spin_unlock_irq
(
&
rtc_lock
);
return
(
0
);
case
NVRAM_SETCKS
:
/* just set checksum, contents unchanged
* (maybe useful after checksum garbaged
* somehow...) */
spin_unlock_irq
(
&
rtc_lock
);
return
(
0
);
case
NVRAM_SETCKS
:
/* just set checksum, contents unchanged
* (maybe useful after checksum garbaged
* somehow...) */
if
(
!
capable
(
CAP_SYS_ADMIN
))
return
(
-
EACCES
);
return
(
-
EACCES
);
spin_lock_irq
(
&
rtc_lock
);
spin_lock_irq
(
&
rtc_lock
);
nvram_set_checksum_int
();
spin_unlock_irq
(
&
rtc_lock
);
return
(
0
);
spin_unlock_irq
(
&
rtc_lock
);
return
(
0
);
default:
return
(
-
ENOTTY
);
default:
return
(
-
ENOTTY
);
}
}
static
int
nvram_open
(
struct
inode
*
inode
,
struct
file
*
file
)
static
int
nvram_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
spin_lock
(
&
nvram_open_lock
);
spin_lock
(
&
nvram_open_lock
);
if
((
nvram_open_cnt
&&
(
file
->
f_flags
&
O_EXCL
))
||
(
nvram_open_mode
&
NVRAM_EXCL
)
||
((
file
->
f_mode
&
2
)
&&
(
nvram_open_mode
&
NVRAM_WRITE
)))
{
spin_unlock
(
&
nvram_open_lock
);
return
(
-
EBUSY
);
(
nvram_open_mode
&
NVRAM_EXCL
)
||
((
file
->
f_mode
&
2
)
&&
(
nvram_open_mode
&
NVRAM_WRITE
)))
{
spin_unlock
(
&
nvram_open_lock
);
return
(
-
EBUSY
);
}
if
(
file
->
f_flags
&
O_EXCL
)
...
...
@@ -345,60 +354,65 @@ static int nvram_open( struct inode *inode, struct file *file )
if
(
file
->
f_mode
&
2
)
nvram_open_mode
|=
NVRAM_WRITE
;
nvram_open_cnt
++
;
spin_unlock
(
&
nvram_open_lock
);
return
(
0
);
spin_unlock
(
&
nvram_open_lock
);
return
(
0
);
}
static
int
nvram_release
(
struct
inode
*
inode
,
struct
file
*
file
)
static
int
nvram_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
spin_lock
(
&
nvram_open_lock
);
spin_lock
(
&
nvram_open_lock
);
nvram_open_cnt
--
;
if
(
file
->
f_flags
&
O_EXCL
)
nvram_open_mode
&=
~
NVRAM_EXCL
;
if
(
file
->
f_mode
&
2
)
nvram_open_mode
&=
~
NVRAM_WRITE
;
spin_unlock
(
&
nvram_open_lock
);
return
(
0
);
spin_unlock
(
&
nvram_open_lock
);
return
(
0
);
}
#ifndef CONFIG_PROC_FS
static
int
nvram_read_proc
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
size
,
int
*
eof
,
void
*
data
)
{
return
0
;
}
static
int
nvram_read_proc
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
size
,
int
*
eof
,
void
*
data
)
{
return
0
;
}
#else
static
int
nvram_read_proc
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
size
,
int
*
eof
,
void
*
data
)
static
int
nvram_read_proc
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
size
,
int
*
eof
,
void
*
data
)
{
unsigned
char
contents
[
NVRAM_BYTES
];
int
i
,
len
=
0
;
off_t
begin
=
0
;
spin_lock_irq
(
&
rtc_lock
);
for
(
i
=
0
;
i
<
NVRAM_BYTES
;
++
i
)
contents
[
i
]
=
nvram_read_int
(
i
);
spin_unlock_irq
(
&
rtc_lock
);
*
eof
=
mach_proc_infos
(
contents
,
buffer
,
&
len
,
&
begin
,
offset
,
size
);
if
(
offset
>=
begin
+
len
)
return
(
0
);
*
start
=
buffer
+
(
offset
-
begin
);
return
(
size
<
begin
+
len
-
offset
?
size
:
begin
+
len
-
offset
);
int
i
,
len
=
0
;
off_t
begin
=
0
;
spin_lock_irq
(
&
rtc_lock
);
for
(
i
=
0
;
i
<
NVRAM_BYTES
;
++
i
)
contents
[
i
]
=
nvram_read_int
(
i
);
spin_unlock_irq
(
&
rtc_lock
);
*
eof
=
mach_proc_infos
(
contents
,
buffer
,
&
len
,
&
begin
,
offset
,
size
);
if
(
offset
>=
begin
+
len
)
return
(
0
);
*
start
=
buffer
+
(
offset
-
begin
);
return
(
size
<
begin
+
len
-
offset
?
size
:
begin
+
len
-
offset
);
}
/* This macro frees the machine specific function from bounds checking and
* this like that... */
#define PRINT_PROC(fmt,args...)
\
do {
\
#define PRINT_PROC(fmt,args...) \
do { \
*len += sprintf( buffer+*len, fmt, ##args ); \
if (*begin + *len > offset + size)
\
return( 0 );
\
if (*begin + *len < offset) {
\
*begin += *len;
\
*len = 0;
\
}
\
if (*begin + *len > offset + size) \
return( 0 ); \
if (*begin + *len < offset) { \
*begin += *len; \
*len = 0; \
} \
} while(0)
#endif
/* CONFIG_PROC_FS */
...
...
@@ -419,72 +433,75 @@ static struct miscdevice nvram_dev = {
&
nvram_fops
};
static
int
__init
nvram_init
(
void
)
static
int
__init
nvram_init
(
void
)
{
int
ret
;
/* First test whether the driver should init at all */
if
(
!
CHECK_DRIVER_INIT
())
return
(
-
ENXIO
);
return
(
-
ENXIO
);
ret
=
misc_register
(
&
nvram_dev
);
ret
=
misc_register
(
&
nvram_dev
);
if
(
ret
)
{
printk
(
KERN_ERR
"nvram: can't misc_register on minor=%d
\n
"
,
NVRAM_MINOR
);
printk
(
KERN_ERR
"nvram: can't misc_register on minor=%d
\n
"
,
NVRAM_MINOR
);
goto
out
;
}
if
(
!
create_proc_read_entry
(
"driver/nvram"
,
0
,
0
,
nvram_read_proc
,
NULL
))
{
if
(
!
create_proc_read_entry
(
"driver/nvram"
,
0
,
0
,
nvram_read_proc
,
NULL
))
{
printk
(
KERN_ERR
"nvram: can't create /proc/driver/nvram
\n
"
);
ret
=
-
ENOMEM
;
goto
outmisc
;
}
ret
=
0
;
printk
(
KERN_INFO
"Non-volatile memory driver v"
NVRAM_VERSION
"
\n
"
);
out:
return
(
ret
);
outmisc:
misc_deregister
(
&
nvram_dev
);
out:
return
(
ret
);
outmisc:
misc_deregister
(
&
nvram_dev
);
goto
out
;
}
static
void
__exit
nvram_cleanup_module
(
void
)
static
void
__exit
nvram_cleanup_module
(
void
)
{
remove_proc_entry
(
"driver/nvram"
,
0
);
misc_deregister
(
&
nvram_dev
);
remove_proc_entry
(
"driver/nvram"
,
0
);
misc_deregister
(
&
nvram_dev
);
}
module_init
(
nvram_init
);
module_exit
(
nvram_cleanup_module
);
/*
* Machine specific functions
*/
#if MACH == PC
static
int
pc_check_checksum
(
void
)
static
int
pc_check_checksum
(
void
)
{
int
i
;
unsigned
short
sum
=
0
;
for
(
i
=
PC_CKS_RANGE_START
;
i
<=
PC_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
return
(
(
sum
&
0xffff
)
==
((
nvram_read_int
(
PC_CKS_LOC
)
<<
8
)
|
nvram_read_int
(
PC_CKS_LOC
+
1
))
);
for
(
i
=
PC_CKS_RANGE_START
;
i
<=
PC_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
return
(
(
sum
&
0xffff
)
==
((
nvram_read_int
(
PC_CKS_LOC
)
<<
8
)
|
nvram_read_int
(
PC_CKS_LOC
+
1
))
);
}
static
void
pc_set_checksum
(
void
)
static
void
pc_set_checksum
(
void
)
{
int
i
;
unsigned
short
sum
=
0
;
for
(
i
=
PC_CKS_RANGE_START
;
i
<=
PC_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
nvram_write_int
(
sum
>>
8
,
PC_CKS_LOC
);
nvram_write_int
(
sum
&
0xff
,
PC_CKS_LOC
+
1
);
for
(
i
=
PC_CKS_RANGE_START
;
i
<=
PC_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
nvram_write_int
(
sum
>>
8
,
PC_CKS_LOC
);
nvram_write_int
(
sum
&
0xff
,
PC_CKS_LOC
+
1
);
}
#ifdef CONFIG_PROC_FS
...
...
@@ -501,69 +518,67 @@ static char *gfx_types[] = {
"monochrome"
,
};
static
int
pc_proc_infos
(
unsigned
char
*
nvram
,
char
*
buffer
,
int
*
len
,
off_t
*
begin
,
off_t
offset
,
int
size
)
static
int
pc_proc_infos
(
unsigned
char
*
nvram
,
char
*
buffer
,
int
*
len
,
off_t
*
begin
,
off_t
offset
,
int
size
)
{
int
checksum
;
int
type
;
spin_lock_irq
(
&
rtc_lock
);
spin_lock_irq
(
&
rtc_lock
);
checksum
=
nvram_check_checksum_int
();
spin_unlock_irq
(
&
rtc_lock
);
spin_unlock_irq
(
&
rtc_lock
);
PRINT_PROC
(
"Checksum status: %svalid
\n
"
,
checksum
?
""
:
"not "
);
PRINT_PROC
(
"Checksum status: %svalid
\n
"
,
checksum
?
""
:
"not "
);
PRINT_PROC
(
"# floppies : %d
\n
"
,
(
nvram
[
6
]
&
1
)
?
(
nvram
[
6
]
>>
6
)
+
1
:
0
);
PRINT_PROC
(
"Floppy 0 type : "
);
PRINT_PROC
(
"# floppies : %d
\n
"
,
(
nvram
[
6
]
&
1
)
?
(
nvram
[
6
]
>>
6
)
+
1
:
0
);
PRINT_PROC
(
"Floppy 0 type : "
);
type
=
nvram
[
2
]
>>
4
;
if
(
type
<
sizeof
(
floppy_types
)
/
sizeof
(
*
floppy_types
))
PRINT_PROC
(
"%s
\n
"
,
floppy_types
[
type
]
);
if
(
type
<
sizeof
(
floppy_types
)
/
sizeof
(
*
floppy_types
))
PRINT_PROC
(
"%s
\n
"
,
floppy_types
[
type
]
);
else
PRINT_PROC
(
"%d (unknown)
\n
"
,
type
);
PRINT_PROC
(
"Floppy 1 type : "
);
PRINT_PROC
(
"%d (unknown)
\n
"
,
type
);
PRINT_PROC
(
"Floppy 1 type : "
);
type
=
nvram
[
2
]
&
0x0f
;
if
(
type
<
sizeof
(
floppy_types
)
/
sizeof
(
*
floppy_types
))
PRINT_PROC
(
"%s
\n
"
,
floppy_types
[
type
]
);
if
(
type
<
sizeof
(
floppy_types
)
/
sizeof
(
*
floppy_types
))
PRINT_PROC
(
"%s
\n
"
,
floppy_types
[
type
]
);
else
PRINT_PROC
(
"%d (unknown)
\n
"
,
type
);
PRINT_PROC
(
"%d (unknown)
\n
"
,
type
);
PRINT_PROC
(
"HD 0 type : "
);
PRINT_PROC
(
"HD 0 type : "
);
type
=
nvram
[
4
]
>>
4
;
if
(
type
)
PRINT_PROC
(
"%02x
\n
"
,
type
==
0x0f
?
nvram
[
11
]
:
type
);
PRINT_PROC
(
"%02x
\n
"
,
type
==
0x0f
?
nvram
[
11
]
:
type
);
else
PRINT_PROC
(
"none
\n
"
);
PRINT_PROC
(
"none
\n
"
);
PRINT_PROC
(
"HD 1 type : "
);
PRINT_PROC
(
"HD 1 type : "
);
type
=
nvram
[
4
]
&
0x0f
;
if
(
type
)
PRINT_PROC
(
"%02x
\n
"
,
type
==
0x0f
?
nvram
[
12
]
:
type
);
PRINT_PROC
(
"%02x
\n
"
,
type
==
0x0f
?
nvram
[
12
]
:
type
);
else
PRINT_PROC
(
"none
\n
"
);
PRINT_PROC
(
"HD type 48 data: %d/%d/%d C/H/S, precomp %d, lz %d
\n
"
,
nvram
[
18
]
|
(
nvram
[
19
]
<<
8
),
nvram
[
20
],
nvram
[
25
],
nvram
[
21
]
|
(
nvram
[
22
]
<<
8
),
nvram
[
23
]
|
(
nvram
[
24
]
<<
8
)
);
PRINT_PROC
(
"HD type 49 data: %d/%d/%d C/H/S, precomp %d, lz %d
\n
"
,
nvram
[
39
]
|
(
nvram
[
40
]
<<
8
),
nvram
[
41
],
nvram
[
46
],
nvram
[
42
]
|
(
nvram
[
43
]
<<
8
),
nvram
[
44
]
|
(
nvram
[
45
]
<<
8
)
);
PRINT_PROC
(
"DOS base memory: %d kB
\n
"
,
nvram
[
7
]
|
(
nvram
[
8
]
<<
8
)
);
PRINT_PROC
(
"Extended memory: %d kB (configured), %d kB (tested)
\n
"
,
nvram
[
9
]
|
(
nvram
[
10
]
<<
8
),
nvram
[
34
]
|
(
nvram
[
35
]
<<
8
)
);
PRINT_PROC
(
"Gfx adapter : %s
\n
"
,
gfx_types
[
(
nvram
[
6
]
>>
4
)
&
3
]
);
PRINT_PROC
(
"FPU : %sinstalled
\n
"
,
(
nvram
[
6
]
&
2
)
?
""
:
"not "
);
return
(
1
);
PRINT_PROC
(
"none
\n
"
);
PRINT_PROC
(
"HD type 48 data: %d/%d/%d C/H/S, precomp %d, lz %d
\n
"
,
nvram
[
18
]
|
(
nvram
[
19
]
<<
8
),
nvram
[
20
],
nvram
[
25
],
nvram
[
21
]
|
(
nvram
[
22
]
<<
8
),
nvram
[
23
]
|
(
nvram
[
24
]
<<
8
));
PRINT_PROC
(
"HD type 49 data: %d/%d/%d C/H/S, precomp %d, lz %d
\n
"
,
nvram
[
39
]
|
(
nvram
[
40
]
<<
8
),
nvram
[
41
],
nvram
[
46
],
nvram
[
42
]
|
(
nvram
[
43
]
<<
8
),
nvram
[
44
]
|
(
nvram
[
45
]
<<
8
));
PRINT_PROC
(
"DOS base memory: %d kB
\n
"
,
nvram
[
7
]
|
(
nvram
[
8
]
<<
8
));
PRINT_PROC
(
"Extended memory: %d kB (configured), %d kB (tested)
\n
"
,
nvram
[
9
]
|
(
nvram
[
10
]
<<
8
),
nvram
[
34
]
|
(
nvram
[
35
]
<<
8
));
PRINT_PROC
(
"Gfx adapter : %s
\n
"
,
gfx_types
[(
nvram
[
6
]
>>
4
)
&
3
]);
PRINT_PROC
(
"FPU : %sinstalled
\n
"
,
(
nvram
[
6
]
&
2
)
?
""
:
"not "
);
return
(
1
);
}
#endif
...
...
@@ -571,26 +586,28 @@ static int pc_proc_infos( unsigned char *nvram, char *buffer, int *len,
#if MACH == ATARI
static
int
atari_check_checksum
(
void
)
static
int
atari_check_checksum
(
void
)
{
int
i
;
unsigned
char
sum
=
0
;
for
(
i
=
ATARI_CKS_RANGE_START
;
i
<=
ATARI_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
return
(
nvram_read_int
(
ATARI_CKS_LOC
)
==
(
~
sum
&
0xff
)
&&
nvram_read_int
(
ATARI_CKS_LOC
+
1
)
==
(
sum
&
0xff
)
);
for
(
i
=
ATARI_CKS_RANGE_START
;
i
<=
ATARI_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
return
(
nvram_read_int
(
ATARI_CKS_LOC
)
==
(
~
sum
&
0xff
)
&&
nvram_read_int
(
ATARI_CKS_LOC
+
1
)
==
(
sum
&
0xff
)
);
}
static
void
atari_set_checksum
(
void
)
static
void
atari_set_checksum
(
void
)
{
int
i
;
unsigned
char
sum
=
0
;
for
(
i
=
ATARI_CKS_RANGE_START
;
i
<=
ATARI_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
nvram_write_int
(
~
sum
,
ATARI_CKS_LOC
);
nvram_write_int
(
sum
,
ATARI_CKS_LOC
+
1
);
for
(
i
=
ATARI_CKS_RANGE_START
;
i
<=
ATARI_CKS_RANGE_END
;
++
i
)
sum
+=
nvram_read_int
(
i
);
nvram_write_int
(
~
sum
,
ATARI_CKS_LOC
);
nvram_write_int
(
sum
,
ATARI_CKS_LOC
+
1
);
}
#ifdef CONFIG_PROC_FS
...
...
@@ -635,81 +652,74 @@ static char *colors[] = {
#define fieldsize(a) (sizeof(a)/sizeof(*a))
static
int
atari_proc_infos
(
unsigned
char
*
nvram
,
char
*
buffer
,
int
*
len
,
off_t
*
begin
,
off_t
offset
,
int
size
)
static
int
atari_proc_infos
(
unsigned
char
*
nvram
,
char
*
buffer
,
int
*
len
,
off_t
*
begin
,
off_t
offset
,
int
size
)
{
int
checksum
=
nvram_check_checksum
();
int
i
;
unsigned
vmode
;
PRINT_PROC
(
"Checksum status : %svalid
\n
"
,
checksum
?
""
:
"not "
);
PRINT_PROC
(
"Boot preference : "
);
for
(
i
=
fieldsize
(
boot_prefs
)
-
1
;
i
>=
0
;
--
i
)
{
PRINT_PROC
(
"Checksum status : %svalid
\n
"
,
checksum
?
""
:
"not "
);
PRINT_PROC
(
"Boot preference : "
);
for
(
i
=
fieldsize
(
boot_prefs
)
-
1
;
i
>=
0
;
--
i
)
{
if
(
nvram
[
1
]
==
boot_prefs
[
i
].
val
)
{
PRINT_PROC
(
"%s
\n
"
,
boot_prefs
[
i
].
name
);
PRINT_PROC
(
"%s
\n
"
,
boot_prefs
[
i
].
name
);
break
;
}
}
if
(
i
<
0
)
PRINT_PROC
(
"0x%02x (undefined)
\n
"
,
nvram
[
1
]
);
PRINT_PROC
(
"0x%02x (undefined)
\n
"
,
nvram
[
1
]
);
PRINT_PROC
(
"SCSI arbitration : %s
\n
"
,
(
nvram
[
16
]
&
0x80
)
?
"on"
:
"off"
);
PRINT_PROC
(
"SCSI host ID : "
);
PRINT_PROC
(
"SCSI arbitration : %s
\n
"
,
(
nvram
[
16
]
&
0x80
)
?
"on"
:
"off"
);
PRINT_PROC
(
"SCSI host ID : "
);
if
(
nvram
[
16
]
&
0x80
)
PRINT_PROC
(
"%d
\n
"
,
nvram
[
16
]
&
7
);
PRINT_PROC
(
"%d
\n
"
,
nvram
[
16
]
&
7
);
else
PRINT_PROC
(
"n/a
\n
"
);
PRINT_PROC
(
"n/a
\n
"
);
/* the following entries are defined only for the Falcon */
if
((
atari_mch_cookie
>>
16
)
!=
ATARI_MCH_FALCON
)
return
1
;
PRINT_PROC
(
"OS language : "
);
PRINT_PROC
(
"OS language : "
);
if
(
nvram
[
6
]
<
fieldsize
(
languages
))
PRINT_PROC
(
"%s
\n
"
,
languages
[
nvram
[
6
]]
);
PRINT_PROC
(
"%s
\n
"
,
languages
[
nvram
[
6
]]
);
else
PRINT_PROC
(
"%u (undefined)
\n
"
,
nvram
[
6
]
);
PRINT_PROC
(
"Keyboard language: "
);
PRINT_PROC
(
"%u (undefined)
\n
"
,
nvram
[
6
]
);
PRINT_PROC
(
"Keyboard language: "
);
if
(
nvram
[
7
]
<
fieldsize
(
languages
))
PRINT_PROC
(
"%s
\n
"
,
languages
[
nvram
[
7
]]
);
PRINT_PROC
(
"%s
\n
"
,
languages
[
nvram
[
7
]]
);
else
PRINT_PROC
(
"%u (undefined)
\n
"
,
nvram
[
7
]
);
PRINT_PROC
(
"Date format : "
);
PRINT_PROC
(
dateformat
[
nvram
[
8
]
&
7
],
nvram
[
9
]
?
nvram
[
9
]
:
'/'
,
nvram
[
9
]
?
nvram
[
9
]
:
'/'
);
PRINT_PROC
(
", %dh clock
\n
"
,
nvram
[
8
]
&
16
?
24
:
12
);
PRINT_PROC
(
"Boot delay : "
);
PRINT_PROC
(
"%u (undefined)
\n
"
,
nvram
[
7
]
);
PRINT_PROC
(
"Date format : "
);
PRINT_PROC
(
dateformat
[
nvram
[
8
]
&
7
],
nvram
[
9
]
?
nvram
[
9
]
:
'/'
,
nvram
[
9
]
?
nvram
[
9
]
:
'/'
);
PRINT_PROC
(
", %dh clock
\n
"
,
nvram
[
8
]
&
16
?
24
:
12
);
PRINT_PROC
(
"Boot delay : "
);
if
(
nvram
[
10
]
==
0
)
PRINT_PROC
(
"default"
);
PRINT_PROC
(
"default"
);
else
PRINT_PROC
(
"%ds%s
\n
"
,
nvram
[
10
],
nvram
[
10
]
<
8
?
", no memory test"
:
""
);
PRINT_PROC
(
"%ds%s
\n
"
,
nvram
[
10
],
nvram
[
10
]
<
8
?
", no memory test"
:
""
);
vmode
=
(
nvram
[
14
]
<<
8
)
||
nvram
[
15
];
PRINT_PROC
(
"Video mode : %s colors, %d columns, %s %s monitor
\n
"
,
colors
[
vmode
&
7
],
vmode
&
8
?
80
:
40
,
vmode
&
16
?
"VGA"
:
"TV"
,
vmode
&
32
?
"PAL"
:
"NTSC"
);
PRINT_PROC
(
" %soverscan, compat. mode %s%s
\n
"
,
vmode
&
64
?
""
:
"no "
,
vmode
&
128
?
"on"
:
"off"
,
vmode
&
256
?
(
vmode
&
16
?
", line doubling"
:
", half screen"
)
:
""
);
return
(
1
);
PRINT_PROC
(
"Video mode : %s colors, %d columns, %s %s monitor
\n
"
,
colors
[
vmode
&
7
],
vmode
&
8
?
80
:
40
,
vmode
&
16
?
"VGA"
:
"TV"
,
vmode
&
32
?
"PAL"
:
"NTSC"
);
PRINT_PROC
(
" %soverscan, compat. mode %s%s
\n
"
,
vmode
&
64
?
""
:
"no "
,
vmode
&
128
?
"on"
:
"off"
,
vmode
&
256
?
(
vmode
&
16
?
", line doubling"
:
", half screen"
)
:
""
);
return
(
1
);
}
#endif
#endif
/* MACH == ATARI */
MODULE_LICENSE
(
"GPL"
);
/*
* Local variables:
* c-indent-level: 4
* tab-width: 4
* End:
*/
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