cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

nubus.h (5675B)


      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 */