188 lines · 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_H11#define LINUX_NUBUS_H12 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 theoretically39 possible, and 0 is a special case which represents the40 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 read71 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_FS94extern 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#else106static inline void nubus_proc_init(void) {}107static inline108struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board)109{ return NULL; }110static inline111struct 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#endif121 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) {} else130 131/* These are somewhat more NuBus-specific. They all return 0 for132 success and -1 for failure, as you'd expect. */133 134/* The root directory which contains the board and functional135 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 */188