nubus: Rework /proc/bus/nubus/s/ implementation
The /proc/bus/nubus/s/ directory tree for any slot s is missing a lot of information. The struct file_operations methods have long been left unimplemented (hence the familiar compile-time warning, "Need to set some I/O handlers here"). Slot resources have a complex structure which varies depending on board function. The logic for interpreting these ROM data structures is found in nubus.c. Let's not duplicate that logic in proc.c. Create the /proc/bus/nubus/s/ inodes while scanning slot s. During descent through slot resource subdirectories, call the new nubus_proc_add_foo() functions to create the procfs inodes. Also add a new function, nubus_seq_write_rsrc_mem(), to write the contents of a particular slot resource to a given seq_file. This is used by the procfs file_operations methods, to finally give userspace access to slot ROM information, such as the available video modes. Tested-by: Stan Johnson <userm57@yahoo.com> Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
parent
883b8cb31a
commit
2f7dd07eca
3 changed files with 258 additions and 119 deletions
|
|
@ -13,11 +13,15 @@
|
|||
#include <asm/nubus.h>
|
||||
#include <uapi/linux/nubus.h>
|
||||
|
||||
struct proc_dir_entry;
|
||||
struct seq_file;
|
||||
|
||||
struct nubus_dir {
|
||||
unsigned char *base;
|
||||
unsigned char *ptr;
|
||||
int done;
|
||||
int mask;
|
||||
struct proc_dir_entry *procdir;
|
||||
};
|
||||
|
||||
struct nubus_dirent {
|
||||
|
|
@ -84,12 +88,33 @@ extern struct nubus_board *nubus_boards;
|
|||
|
||||
/* Generic NuBus interface functions, modelled after the PCI interface */
|
||||
#ifdef CONFIG_PROC_FS
|
||||
extern void nubus_proc_init(void);
|
||||
void nubus_proc_init(void);
|
||||
struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board);
|
||||
struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
|
||||
const struct nubus_dirent *ent,
|
||||
struct nubus_board *board);
|
||||
void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
|
||||
const struct nubus_dirent *ent,
|
||||
unsigned int size);
|
||||
void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
|
||||
const struct nubus_dirent *ent);
|
||||
#else
|
||||
static inline void nubus_proc_init(void) {}
|
||||
static inline
|
||||
struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board)
|
||||
{ return NULL; }
|
||||
static inline
|
||||
struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
|
||||
const struct nubus_dirent *ent,
|
||||
struct nubus_board *board)
|
||||
{ return NULL; }
|
||||
static inline void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
|
||||
const struct nubus_dirent *ent,
|
||||
unsigned int size) {}
|
||||
static inline void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
|
||||
const struct nubus_dirent *ent) {}
|
||||
#endif
|
||||
|
||||
int nubus_proc_attach_device(struct nubus_dev *dev);
|
||||
/* If we need more precision we can add some more of these */
|
||||
struct nubus_dev *nubus_find_type(unsigned short category,
|
||||
unsigned short type,
|
||||
|
|
@ -125,8 +150,12 @@ int nubus_get_subdir(const struct nubus_dirent *ent,
|
|||
struct nubus_dir *dir);
|
||||
void nubus_get_rsrc_mem(void *dest, const struct nubus_dirent *dirent,
|
||||
unsigned int len);
|
||||
void nubus_get_rsrc_str(char *dest, const struct nubus_dirent *dirent,
|
||||
unsigned int maxlen);
|
||||
unsigned int nubus_get_rsrc_str(char *dest, const struct nubus_dirent *dirent,
|
||||
unsigned int len);
|
||||
void nubus_seq_write_rsrc_mem(struct seq_file *m,
|
||||
const struct nubus_dirent *dirent,
|
||||
unsigned int len);
|
||||
unsigned char *nubus_dirptr(const struct nubus_dirent *nd);
|
||||
|
||||
/* Returns a pointer to the "standard" slot space. */
|
||||
static inline void *nubus_slot_addr(int slot)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue