1/* $Id: sbus.h,v 1.1.1.1 2008/10/15 03:27:26 james26_jang Exp $ 2 * sbus.h: Defines for the Sun SBus. 3 * 4 * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu) 5 */ 6 7#ifndef _SPARC_SBUS_H 8#define _SPARC_SBUS_H 9 10#include <linux/ioport.h> 11 12#include <asm/oplib.h> 13#include <asm/iommu.h> 14#include <asm/scatterlist.h> 15 16/* We scan which devices are on the SBus using the PROM node device 17 * tree. SBus devices are described in two different ways. You can 18 * either get an absolute address at which to access the device, or 19 * you can get a SBus 'slot' number and an offset within that slot. 20 */ 21 22/* The base address at which to calculate device OBIO addresses. */ 23#define SUN_SBUS_BVADDR 0xf8000000 24#define SBUS_OFF_MASK 0x01ffffff 25 26/* These routines are used to calculate device address from slot 27 * numbers + offsets, and vice versa. 28 */ 29 30extern __inline__ unsigned long sbus_devaddr(int slotnum, unsigned long offset) 31{ 32 return (unsigned long) (SUN_SBUS_BVADDR+((slotnum)<<25)+(offset)); 33} 34 35extern __inline__ int sbus_dev_slot(unsigned long dev_addr) 36{ 37 return (int) (((dev_addr)-SUN_SBUS_BVADDR)>>25); 38} 39 40struct sbus_bus; 41 42/* Linux SBUS device tables */ 43struct sbus_dev { 44 struct sbus_bus *bus; /* Back ptr to sbus */ 45 struct sbus_dev *next; /* next device on this SBus or null */ 46 struct sbus_dev *child; /* For ledma and espdma on sun4m */ 47 struct sbus_dev *parent; /* Parent device if not toplevel */ 48 int prom_node; /* PROM device tree node for this device */ 49 char prom_name[64]; /* PROM device name */ 50 int slot; 51 52 struct resource resource[PROMREG_MAX]; 53 54 struct linux_prom_registers reg_addrs[PROMREG_MAX]; 55 int num_registers, ranges_applied; 56 57 struct linux_prom_ranges device_ranges[PROMREG_MAX]; 58 int num_device_ranges; 59 60 unsigned int irqs[4]; 61 int num_irqs; 62}; 63 64/* This struct describes the SBus(s) found on this machine. */ 65struct sbus_bus { 66 void *iommu; /* Opaque IOMMU cookie */ 67 struct sbus_dev *devices; /* Link to devices on this SBus */ 68 struct sbus_bus *next; /* next SBus, if more than one SBus */ 69 int prom_node; /* PROM device tree node for this SBus */ 70 char prom_name[64]; /* Usually "sbus" or "sbi" */ 71 int clock_freq; 72 73 struct linux_prom_ranges sbus_ranges[PROMREG_MAX]; 74 int num_sbus_ranges; 75 76 int devid; 77 int board; 78}; 79 80extern struct sbus_bus *sbus_root; 81 82extern __inline__ int 83sbus_is_slave(struct sbus_dev *dev) 84{ 85 return 0; 86} 87 88/* Device probing routines could find these handy */ 89#define for_each_sbus(bus) \ 90 for((bus) = sbus_root; (bus); (bus)=(bus)->next) 91 92#define for_each_sbusdev(device, bus) \ 93 for((device) = (bus)->devices; (device); (device)=(device)->next) 94 95#define for_all_sbusdev(device, bus) \ 96 for ((bus) = sbus_root; (bus); (bus) = (bus)->next) \ 97 for ((device) = (bus)->devices; (device); (device) = (device)->next) 98 99/* Driver DVMA interfaces. */ 100#define sbus_can_dma_64bit(sdev) (0) /* actually, sparc_cpu_model==sun4d */ 101#define sbus_can_burst64(sdev) (0) /* actually, sparc_cpu_model==sun4d */ 102extern void sbus_set_sbus64(struct sbus_dev *, int); 103 104/* These yield IOMMU mappings in consistent mode. */ 105extern void *sbus_alloc_consistent(struct sbus_dev *, long, u32 *dma_addrp); 106extern void sbus_free_consistent(struct sbus_dev *, long, void *, u32); 107 108#define SBUS_DMA_BIDIRECTIONAL 0 109#define SBUS_DMA_TODEVICE 1 110#define SBUS_DMA_FROMDEVICE 2 111#define SBUS_DMA_NONE 3 112 113/* All the rest use streaming mode mappings. */ 114extern dma_addr_t sbus_map_single(struct sbus_dev *, void *, size_t, int); 115extern void sbus_unmap_single(struct sbus_dev *, dma_addr_t, size_t, int); 116extern int sbus_map_sg(struct sbus_dev *, struct scatterlist *, int, int); 117extern void sbus_unmap_sg(struct sbus_dev *, struct scatterlist *, int, int); 118 119/* Finally, allow explicit synchronization of streamable mappings. */ 120extern void sbus_dma_sync_single(struct sbus_dev *, dma_addr_t, size_t, int); 121extern void sbus_dma_sync_sg(struct sbus_dev *, struct scatterlist *, int, int); 122 123#endif /* !(_SPARC_SBUS_H) */ 124