linux/include/linux/nubus.h
<<
>>
Prefs
   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
  92extern struct bus_type nubus_bus_type;
  93
  94/* Generic NuBus interface functions, modelled after the PCI interface */
  95#ifdef CONFIG_PROC_FS
  96void nubus_proc_init(void);
  97struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board);
  98struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
  99                                               const struct nubus_dirent *ent,
 100                                               struct nubus_board *board);
 101void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
 102                             const struct nubus_dirent *ent,
 103                             unsigned int size);
 104void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
 105                         const struct nubus_dirent *ent);
 106#else
 107static inline void nubus_proc_init(void) {}
 108static inline
 109struct proc_dir_entry *nubus_proc_add_board(struct nubus_board *board)
 110{ return NULL; }
 111static inline
 112struct proc_dir_entry *nubus_proc_add_rsrc_dir(struct proc_dir_entry *procdir,
 113                                               const struct nubus_dirent *ent,
 114                                               struct nubus_board *board)
 115{ return NULL; }
 116static inline void nubus_proc_add_rsrc_mem(struct proc_dir_entry *procdir,
 117                                           const struct nubus_dirent *ent,
 118                                           unsigned int size) {}
 119static inline void nubus_proc_add_rsrc(struct proc_dir_entry *procdir,
 120                                       const struct nubus_dirent *ent) {}
 121#endif
 122
 123struct nubus_rsrc *nubus_first_rsrc_or_null(void);
 124struct nubus_rsrc *nubus_next_rsrc_or_null(struct nubus_rsrc *from);
 125
 126#define for_each_func_rsrc(f) \
 127        for (f = nubus_first_rsrc_or_null(); f; f = nubus_next_rsrc_or_null(f))
 128
 129#define for_each_board_func_rsrc(b, f) \
 130        for_each_func_rsrc(f) if (f->board != b) {} else
 131
 132/* These are somewhat more NuBus-specific.  They all return 0 for
 133   success and -1 for failure, as you'd expect. */
 134
 135/* The root directory which contains the board and functional
 136   directories */
 137int nubus_get_root_dir(const struct nubus_board *board,
 138                       struct nubus_dir *dir);
 139/* The board directory */
 140int nubus_get_board_dir(const struct nubus_board *board,
 141                        struct nubus_dir *dir);
 142/* The functional directory */
 143int nubus_get_func_dir(const struct nubus_rsrc *fres, struct nubus_dir *dir);
 144
 145/* These work on any directory gotten via the above */
 146int nubus_readdir(struct nubus_dir *dir,
 147                  struct nubus_dirent *ent);
 148int nubus_find_rsrc(struct nubus_dir *dir,
 149                    unsigned char rsrc_type,
 150                    struct nubus_dirent *ent);
 151int nubus_rewinddir(struct nubus_dir *dir);
 152
 153/* Things to do with directory entries */
 154int nubus_get_subdir(const struct nubus_dirent *ent,
 155                     struct nubus_dir *dir);
 156void nubus_get_rsrc_mem(void *dest, const struct nubus_dirent *dirent,
 157                        unsigned int len);
 158unsigned int nubus_get_rsrc_str(char *dest, const struct nubus_dirent *dirent,
 159                                unsigned int len);
 160void nubus_seq_write_rsrc_mem(struct seq_file *m,
 161                              const struct nubus_dirent *dirent,
 162                              unsigned int len);
 163unsigned char *nubus_dirptr(const struct nubus_dirent *nd);
 164
 165/* Declarations relating to driver model objects */
 166int nubus_parent_device_register(void);
 167int nubus_device_register(struct nubus_board *board);
 168int nubus_driver_register(struct nubus_driver *ndrv);
 169void nubus_driver_unregister(struct nubus_driver *ndrv);
 170int nubus_proc_show(struct seq_file *m, void *data);
 171
 172static inline void nubus_set_drvdata(struct nubus_board *board, void *data)
 173{
 174        dev_set_drvdata(&board->dev, data);
 175}
 176
 177static inline void *nubus_get_drvdata(struct nubus_board *board)
 178{
 179        return dev_get_drvdata(&board->dev);
 180}
 181
 182/* Returns a pointer to the "standard" slot space. */
 183static inline void *nubus_slot_addr(int slot)
 184{
 185        return (void *)(0xF0000000 | (slot << 24));
 186}
 187
 188#endif /* LINUX_NUBUS_H */
 189