xref: /openbmc/linux/include/linux/nubus.h (revision 72b44f65)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds   nubus.h: various definitions and prototypes for NuBus drivers to use.
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds   Originally written by Alan Cox.
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds   Hacked to death by C. Scott Ananian and David Huggins-Daines.
81ff2775aSFinn Thain */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #ifndef LINUX_NUBUS_H
111da177e4SLinus Torvalds #define LINUX_NUBUS_H
121da177e4SLinus Torvalds 
137f86c765SFinn Thain #include <linux/device.h>
141da177e4SLinus Torvalds #include <asm/nubus.h>
15607ca46eSDavid Howells #include <uapi/linux/nubus.h>
161da177e4SLinus Torvalds 
172f7dd07eSFinn Thain struct proc_dir_entry;
182f7dd07eSFinn Thain struct seq_file;
192f7dd07eSFinn Thain 
201ff2775aSFinn Thain struct nubus_dir {
211ff2775aSFinn Thain 	unsigned char *base;
221ff2775aSFinn Thain 	unsigned char *ptr;
231ff2775aSFinn Thain 	int done;
241ff2775aSFinn Thain 	int mask;
252f7dd07eSFinn Thain 	struct proc_dir_entry *procdir;
261ff2775aSFinn Thain };
271ff2775aSFinn Thain 
281ff2775aSFinn Thain struct nubus_dirent {
291ff2775aSFinn Thain 	unsigned char *base;
301ff2775aSFinn Thain 	unsigned char type;
311ff2775aSFinn Thain 	__u32 data;	/* Actually 24 bits used */
321ff2775aSFinn Thain 	int mask;
331ff2775aSFinn Thain };
341ff2775aSFinn Thain 
351da177e4SLinus Torvalds struct nubus_board {
367f86c765SFinn Thain 	struct device dev;
371da177e4SLinus Torvalds 
381da177e4SLinus Torvalds 	/* Only 9-E actually exist, though 0-8 are also theoretically
391da177e4SLinus Torvalds 	   possible, and 0 is a special case which represents the
401da177e4SLinus Torvalds 	   motherboard and onboard peripherals (Ethernet, video) */
411da177e4SLinus Torvalds 	int slot;
421da177e4SLinus Torvalds 	/* For slot 0, this is bogus. */
431da177e4SLinus Torvalds 	char name[64];
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds 	/* Format block */
461da177e4SLinus Torvalds 	unsigned char *fblock;
471da177e4SLinus Torvalds 	/* Root directory (does *not* always equal fblock + doffset!) */
481da177e4SLinus Torvalds 	unsigned char *directory;
491da177e4SLinus Torvalds 
501da177e4SLinus Torvalds 	unsigned long slot_addr;
511da177e4SLinus Torvalds 	/* Offset to root directory (sometimes) */
521da177e4SLinus Torvalds 	unsigned long doffset;
531da177e4SLinus Torvalds 	/* Length over which to compute the crc */
541da177e4SLinus Torvalds 	unsigned long rom_length;
551da177e4SLinus Torvalds 	/* Completely useless most of the time */
561da177e4SLinus Torvalds 	unsigned long crc;
571da177e4SLinus Torvalds 	unsigned char rev;
581da177e4SLinus Torvalds 	unsigned char format;
591da177e4SLinus Torvalds 	unsigned char lanes;
606c8b89eaSFinn Thain 
616c8b89eaSFinn Thain 	/* Directory entry in /proc/bus/nubus */
626c8b89eaSFinn Thain 	struct proc_dir_entry *procdir;
631da177e4SLinus Torvalds };
641da177e4SLinus Torvalds 
65189e19e8SFinn Thain struct nubus_rsrc {
6641b84816SFinn Thain 	struct list_head list;
671da177e4SLinus Torvalds 
68189e19e8SFinn Thain 	/* The functional resource ID */
691da177e4SLinus Torvalds 	unsigned char resid;
701da177e4SLinus Torvalds 	/* These are mostly here for convenience; we could always read
711da177e4SLinus Torvalds 	   them from the ROMs if we wanted to */
721da177e4SLinus Torvalds 	unsigned short category;
731da177e4SLinus Torvalds 	unsigned short type;
741da177e4SLinus Torvalds 	unsigned short dr_sw;
751da177e4SLinus Torvalds 	unsigned short dr_hw;
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds 	/* Functional directory */
781da177e4SLinus Torvalds 	unsigned char *directory;
791da177e4SLinus Torvalds 	/* Much of our info comes from here */
801da177e4SLinus Torvalds 	struct nubus_board *board;
811da177e4SLinus Torvalds };
821da177e4SLinus Torvalds 
83189e19e8SFinn Thain /* This is all NuBus functional resources (used to find devices later on) */
8441b84816SFinn Thain extern struct list_head nubus_func_rsrcs;
857f86c765SFinn Thain 
867f86c765SFinn Thain struct nubus_driver {
877f86c765SFinn Thain 	struct device_driver driver;
887f86c765SFinn Thain 	int (*probe)(struct nubus_board *board);
89b2c943e5SUwe Kleine-König 	void (*remove)(struct nubus_board *board);
907f86c765SFinn Thain };
917f86c765SFinn Thain 
927f86c765SFinn Thain extern struct bus_type nubus_bus_type;
931da177e4SLinus Torvalds 
941da177e4SLinus Torvalds /* Generic NuBus interface functions, modelled after the PCI interface */
9511db656aSDavid Howells #ifdef CONFIG_PROC_FS
96*72b44f65SFinn Thain extern bool nubus_populate_procfs;
972f7dd07eSFinn Thain void nubus_proc_init(void);
982f7dd07eSFinn Thain struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board);
992f7dd07eSFinn Thain struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
1002f7dd07eSFinn Thain 					       const struct nubus_dirent *ent,
1012f7dd07eSFinn Thain 					       struct nubus_board *board);
1022f7dd07eSFinn Thain void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
1032f7dd07eSFinn Thain 			     const struct nubus_dirent *ent,
1042f7dd07eSFinn Thain 			     unsigned int size);
1052f7dd07eSFinn Thain void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
1062f7dd07eSFinn Thain 			 const struct nubus_dirent *ent);
10711db656aSDavid Howells #else
nubus_proc_init(void)10811db656aSDavid Howells static inline void nubus_proc_init(void) {}
1092f7dd07eSFinn Thain static inline
nubus_proc_add_board(struct nubus_board * board)1102f7dd07eSFinn Thain struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board)
1112f7dd07eSFinn Thain { return NULL; }
1122f7dd07eSFinn Thain static inline
nubus_proc_add_rsrc_dir(struct proc_dir_entry * procdir,const struct nubus_dirent * ent,struct nubus_board * board)1132f7dd07eSFinn Thain struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
1142f7dd07eSFinn Thain 					       const struct nubus_dirent *ent,
1152f7dd07eSFinn Thain 					       struct nubus_board *board)
1162f7dd07eSFinn Thain { return NULL; }
nubus_proc_add_rsrc_mem(struct proc_dir_entry * procdir,const struct nubus_dirent * ent,unsigned int size)1172f7dd07eSFinn Thain static inline void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
1182f7dd07eSFinn Thain 					   const struct nubus_dirent *ent,
1192f7dd07eSFinn Thain 					   unsigned int size) {}
nubus_proc_add_rsrc(struct proc_dir_entry * procdir,const struct nubus_dirent * ent)1202f7dd07eSFinn Thain static inline void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
1212f7dd07eSFinn Thain 				       const struct nubus_dirent *ent) {}
12211db656aSDavid Howells #endif
1239f97977dSFinn Thain 
12441b84816SFinn Thain struct nubus_rsrc *nubus_first_rsrc_or_null(void);
12541b84816SFinn Thain struct nubus_rsrc *nubus_next_rsrc_or_null(struct nubus_rsrc *from);
126189e19e8SFinn Thain 
12741b84816SFinn Thain #define for_each_func_rsrc(f) \
12841b84816SFinn Thain 	for (f = nubus_first_rsrc_or_null(); f; f = nubus_next_rsrc_or_null(f))
1291da177e4SLinus Torvalds 
1307f86c765SFinn Thain #define for_each_board_func_rsrc(b, f) \
1317f86c765SFinn Thain 	for_each_func_rsrc(f) if (f->board != b) {} else
1327f86c765SFinn Thain 
1331da177e4SLinus Torvalds /* These are somewhat more NuBus-specific.  They all return 0 for
1341da177e4SLinus Torvalds    success and -1 for failure, as you'd expect. */
1351da177e4SLinus Torvalds 
1361da177e4SLinus Torvalds /* The root directory which contains the board and functional
1371da177e4SLinus Torvalds    directories */
1381da177e4SLinus Torvalds int nubus_get_root_dir(const struct nubus_board *board,
1391da177e4SLinus Torvalds 		       struct nubus_dir *dir);
1401da177e4SLinus Torvalds /* The board directory */
1411da177e4SLinus Torvalds int nubus_get_board_dir(const struct nubus_board *board,
1421da177e4SLinus Torvalds 			struct nubus_dir *dir);
1431da177e4SLinus Torvalds /* The functional directory */
144189e19e8SFinn Thain int nubus_get_func_dir(const struct nubus_rsrc *fres, struct nubus_dir *dir);
1451da177e4SLinus Torvalds 
1461da177e4SLinus Torvalds /* These work on any directory gotten via the above */
1471da177e4SLinus Torvalds int nubus_readdir(struct nubus_dir *dir,
1481da177e4SLinus Torvalds 		  struct nubus_dirent *ent);
1491da177e4SLinus Torvalds int nubus_find_rsrc(struct nubus_dir *dir,
1501da177e4SLinus Torvalds 		    unsigned char rsrc_type,
1511da177e4SLinus Torvalds 		    struct nubus_dirent *ent);
1521da177e4SLinus Torvalds int nubus_rewinddir(struct nubus_dir *dir);
1531da177e4SLinus Torvalds 
1541da177e4SLinus Torvalds /* Things to do with directory entries */
1551da177e4SLinus Torvalds int nubus_get_subdir(const struct nubus_dirent *ent,
1561da177e4SLinus Torvalds 		     struct nubus_dir *dir);
1572f828fb2SFinn Thain void nubus_get_rsrc_mem(void *dest, const struct nubus_dirent *dirent,
1582f828fb2SFinn Thain 			unsigned int len);
1592f7dd07eSFinn Thain unsigned int nubus_get_rsrc_str(char *dest, const struct nubus_dirent *dirent,
1602f7dd07eSFinn Thain 				unsigned int len);
1612f7dd07eSFinn Thain void nubus_seq_write_rsrc_mem(struct seq_file *m,
1622f7dd07eSFinn Thain 			      const struct nubus_dirent *dirent,
1632f7dd07eSFinn Thain 			      unsigned int len);
1642f7dd07eSFinn Thain unsigned char *nubus_dirptr(const struct nubus_dirent *nd);
1651ff2775aSFinn Thain 
1667f86c765SFinn Thain /* Declarations relating to driver model objects */
167bdeeed09SFinn Thain int nubus_parent_device_register(void);
1687f86c765SFinn Thain int nubus_device_register(struct nubus_board *board);
1697f86c765SFinn Thain int nubus_driver_register(struct nubus_driver *ndrv);
1707f86c765SFinn Thain void nubus_driver_unregister(struct nubus_driver *ndrv);
1717f86c765SFinn Thain int nubus_proc_show(struct seq_file *m, void *data);
1727f86c765SFinn Thain 
nubus_set_drvdata(struct nubus_board * board,void * data)1737f86c765SFinn Thain static inline void nubus_set_drvdata(struct nubus_board *board, void *data)
1747f86c765SFinn Thain {
1757f86c765SFinn Thain 	dev_set_drvdata(&board->dev, data);
1767f86c765SFinn Thain }
1777f86c765SFinn Thain 
nubus_get_drvdata(struct nubus_board * board)1787f86c765SFinn Thain static inline void *nubus_get_drvdata(struct nubus_board *board)
1797f86c765SFinn Thain {
1807f86c765SFinn Thain 	return dev_get_drvdata(&board->dev);
1817f86c765SFinn Thain }
1827f86c765SFinn Thain 
1831ff2775aSFinn Thain /* Returns a pointer to the "standard" slot space. */
nubus_slot_addr(int slot)1841ff2775aSFinn Thain static inline void *nubus_slot_addr(int slot)
1851ff2775aSFinn Thain {
1861ff2775aSFinn Thain 	return (void *)(0xF0000000 | (slot << 24));
1871ff2775aSFinn Thain }
1881ff2775aSFinn Thain 
1891da177e4SLinus Torvalds #endif /* LINUX_NUBUS_H */
190