File Index
Files and directories
Sign in
FILE

nubus.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/nubus.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3  nubus.h: various definitions and prototypes for NuBus drivers to use.
  4
  5  Originally written by Alan Cox.
  6
  7  Hacked to death by C. Scott Ananian and David Huggins-Daines.
  8*/
  9
 10#ifndef LINUX_NUBUS_H
 11#define LINUX_NUBUS_H
 12
 13#include <linux/device.h>
 14#include <asm/nubus.h>
 15#include <uapi/linux/nubus.h>
 16
 17struct proc_dir_entry;
 18struct seq_file;
 19
 20struct nubus_dir {
 21	unsigned char *base;
 22	unsigned char *ptr;
 23	int done;
 24	int mask;
 25	struct proc_dir_entry *procdir;
 26};
 27
 28struct nubus_dirent {
 29	unsigned char *base;
 30	unsigned char type;
 31	__u32 data;	/* Actually 24 bits used */
 32	int mask;
 33};
 34
 35struct nubus_board {
 36	struct device dev;
 37
 38	/* Only 9-E actually exist, though 0-8 are also theoretically
 39	   possible, and 0 is a special case which represents the
 40	   motherboard and onboard peripherals (Ethernet, video) */
 41	int slot;
 42	/* For slot 0, this is bogus. */
 43	char name[64];
 44
 45	/* Format block */
 46	unsigned char *fblock;
 47	/* Root directory (does *not* always equal fblock + doffset!) */
 48	unsigned char *directory;
 49
 50	unsigned long slot_addr;
 51	/* Offset to root directory (sometimes) */
 52	unsigned long doffset;
 53	/* Length over which to compute the crc */
 54	unsigned long rom_length;
 55	/* Completely useless most of the time */
 56	unsigned long crc;
 57	unsigned char rev;
 58	unsigned char format;
 59	unsigned char lanes;
 60
 61	/* Directory entry in /proc/bus/nubus */
 62	struct proc_dir_entry *procdir;
 63};
 64
 65struct nubus_rsrc {
 66	struct list_head list;
 67
 68	/* The functional resource ID */
 69	unsigned char resid;
 70	/* These are mostly here for convenience; we could always read
 71	   them from the ROMs if we wanted to */
 72	unsigned short category;
 73	unsigned short type;
 74	unsigned short dr_sw;
 75	unsigned short dr_hw;
 76
 77	/* Functional directory */
 78	unsigned char *directory;
 79	/* Much of our info comes from here */
 80	struct nubus_board *board;
 81};
 82
 83/* This is all NuBus functional resources (used to find devices later on) */
 84extern struct list_head nubus_func_rsrcs;
 85
 86struct nubus_driver {
 87	struct device_driver driver;
 88	int (*probe)(struct nubus_board *board);
 89	void (*remove)(struct nubus_board *board);
 90};
 91
 92/* Generic NuBus interface functions, modelled after the PCI interface */
 93#ifdef CONFIG_PROC_FS
 94extern bool nubus_populate_procfs;
 95void nubus_proc_init(void);
 96struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board);
 97struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
 98					       const struct nubus_dirent *ent,
 99					       struct nubus_board *board);
100void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
101			     const struct nubus_dirent *ent,
102			     unsigned int size);
103void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
104			 const struct nubus_dirent *ent);
105#else
106static inline void nubus_proc_init(void) {}
107static inline
108struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board)
109{ return NULL; }
110static inline
111struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
112					       const struct nubus_dirent *ent,
113					       struct nubus_board *board)
114{ return NULL; }
115static inline void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
116					   const struct nubus_dirent *ent,
117					   unsigned int size) {}
118static inline void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
119				       const struct nubus_dirent *ent) {}
120#endif
121
122struct nubus_rsrc *nubus_first_rsrc_or_null(void);
123struct nubus_rsrc *nubus_next_rsrc_or_null(struct nubus_rsrc *from);
124
125#define for_each_func_rsrc(f) \
126	for (f = nubus_first_rsrc_or_null(); f; f = nubus_next_rsrc_or_null(f))
127
128#define for_each_board_func_rsrc(b, f) \
129	for_each_func_rsrc(f) if (f->board != b) {} else
130
131/* These are somewhat more NuBus-specific.  They all return 0 for
132   success and -1 for failure, as you'd expect. */
133
134/* The root directory which contains the board and functional
135   directories */
136int nubus_get_root_dir(const struct nubus_board *board,
137		       struct nubus_dir *dir);
138/* The board directory */
139int nubus_get_board_dir(const struct nubus_board *board,
140			struct nubus_dir *dir);
141/* The functional directory */
142int nubus_get_func_dir(const struct nubus_rsrc *fres, struct nubus_dir *dir);
143
144/* These work on any directory gotten via the above */
145int nubus_readdir(struct nubus_dir *dir,
146		  struct nubus_dirent *ent);
147int nubus_find_rsrc(struct nubus_dir *dir,
148		    unsigned char rsrc_type,
149		    struct nubus_dirent *ent);
150int nubus_rewinddir(struct nubus_dir *dir);
151
152/* Things to do with directory entries */
153int nubus_get_subdir(const struct nubus_dirent *ent,
154		     struct nubus_dir *dir);
155void nubus_get_rsrc_mem(void *dest, const struct nubus_dirent *dirent,
156			unsigned int len);
157unsigned int nubus_get_rsrc_str(char *dest, const struct nubus_dirent *dirent,
158				unsigned int len);
159void nubus_seq_write_rsrc_mem(struct seq_file *m,
160			      const struct nubus_dirent *dirent,
161			      unsigned int len);
162unsigned char *nubus_dirptr(const struct nubus_dirent *nd);
163
164/* Declarations relating to driver model objects */
165int nubus_parent_device_register(void);
166int nubus_device_register(struct nubus_board *board);
167int nubus_driver_register(struct nubus_driver *ndrv);
168void nubus_driver_unregister(struct nubus_driver *ndrv);
169int nubus_proc_show(struct seq_file *m, void *data);
170
171static inline void nubus_set_drvdata(struct nubus_board *board, void *data)
172{
173	dev_set_drvdata(&board->dev, data);
174}
175
176static inline void *nubus_get_drvdata(struct nubus_board *board)
177{
178	return dev_get_drvdata(&board->dev);
179}
180
181/* Returns a pointer to the "standard" slot space. */
182static inline void *nubus_slot_addr(int slot)
183{
184	return (void *)(0xF0000000 | (slot << 24));
185}
186
187#endif /* LINUX_NUBUS_H */
~/ Read-only file preview.