📄 xtalk.h
字号:
/* $Id$ * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 1992-1997, 2000-2003 Silicon Graphics, Inc. All Rights Reserved. */#ifndef _ASM_SN_XTALK_XTALK_H#define _ASM_SN_XTALK_XTALK_H#include <linux/config.h>#ifdef __KERNEL__#include "asm/sn/sgi.h"#endif/* * xtalk.h -- platform-independent crosstalk interface *//* * User-level device driver visible types */typedef char xwidgetnum_t; /* xtalk widget number (0..15) */#define XWIDGET_NONE (-1)typedef int xwidget_part_num_t; /* xtalk widget part number */#define XWIDGET_PART_NUM_NONE (-1)typedef int xwidget_rev_num_t; /* xtalk widget revision number */#define XWIDGET_REV_NUM_NONE (-1)typedef int xwidget_mfg_num_t; /* xtalk widget manufacturing ID */#define XWIDGET_MFG_NUM_NONE (-1)typedef struct xtalk_piomap_s *xtalk_piomap_t;/* It is often convenient to fold the XIO target port * number into the XIO address. */#define XIO_NOWHERE (0xFFFFFFFFFFFFFFFFull)#define XIO_ADDR_BITS (0x0000FFFFFFFFFFFFull)#define XIO_PORT_BITS (0xF000000000000000ull)#define XIO_PORT_SHIFT (60)#define XIO_PACKED(x) (((x)&XIO_PORT_BITS) != 0)#define XIO_ADDR(x) ((x)&XIO_ADDR_BITS)#define XIO_PORT(x) ((xwidgetnum_t)(((x)&XIO_PORT_BITS) >> XIO_PORT_SHIFT))#define XIO_PACK(p,o) ((((uint64_t)(p))<<XIO_PORT_SHIFT) | ((o)&XIO_ADDR_BITS))/* * Kernel/driver only definitions */#if __KERNEL__#include <asm/types.h>#include <asm/sn/types.h>#include <asm/sn/alenlist.h>#include <asm/sn/ioerror.h>#include <asm/sn/driver.h>#include <asm/sn/dmamap.h>struct xwidget_hwid_s;/* * Acceptable flag bits for xtalk service calls * * XTALK_FIXED: require that mappings be established * using fixed sharable resources; address * translation results will be permanently * available. (PIOMAP_FIXED and DMAMAP_FIXED are * the same numeric value and are acceptable). * XTALK_NOSLEEP: if any part of the operation would * sleep waiting for resoruces, return an error * instead. (PIOMAP_NOSLEEP and DMAMAP_NOSLEEP are * the same numeric value and are acceptable). * XTALK_INPLACE: when operating on alenlist structures, * reuse the source alenlist rather than creating a * new one. (PIOMAP_INPLACE and DMAMAP_INPLACE are * the same numeric value and are acceptable). */#define XTALK_FIXED DMAMAP_FIXED#define XTALK_NOSLEEP DMAMAP_NOSLEEP#define XTALK_INPLACE DMAMAP_INPLACE/* PIO MANAGEMENT */typedef xtalk_piomap_txtalk_piomap_alloc_f (vertex_hdl_t dev, /* set up mapping for this device */ device_desc_t dev_desc, /* device descriptor */ iopaddr_t xtalk_addr, /* map for this xtalk_addr range */ size_t byte_count, size_t byte_count_max, /* maximum size of a mapping */ unsigned flags); /* defined in sys/pio.h */typedef voidxtalk_piomap_free_f (xtalk_piomap_t xtalk_piomap);typedef caddr_txtalk_piomap_addr_f (xtalk_piomap_t xtalk_piomap, /* mapping resources */ iopaddr_t xtalk_addr, /* map for this xtalk address */ size_t byte_count); /* map this many bytes */typedef voidxtalk_piomap_done_f (xtalk_piomap_t xtalk_piomap);typedef caddr_txtalk_piotrans_addr_f (vertex_hdl_t dev, /* translate for this device */ device_desc_t dev_desc, /* device descriptor */ iopaddr_t xtalk_addr, /* Crosstalk address */ size_t byte_count, /* map this many bytes */ unsigned flags); /* (currently unused) */extern caddr_txtalk_pio_addr (vertex_hdl_t dev, /* translate for this device */ device_desc_t dev_desc, /* device descriptor */ iopaddr_t xtalk_addr, /* Crosstalk address */ size_t byte_count, /* map this many bytes */ xtalk_piomap_t *xtalk_piomapp, /* RETURNS mapping resources */ unsigned flags); /* (currently unused) *//* DMA MANAGEMENT */typedef struct xtalk_dmamap_s *xtalk_dmamap_t;typedef xtalk_dmamap_txtalk_dmamap_alloc_f (vertex_hdl_t dev, /* set up mappings for this device */ device_desc_t dev_desc, /* device descriptor */ size_t byte_count_max, /* max size of a mapping */ unsigned flags); /* defined in dma.h */typedef voidxtalk_dmamap_free_f (xtalk_dmamap_t dmamap);typedef iopaddr_txtalk_dmamap_addr_f (xtalk_dmamap_t dmamap, /* use these mapping resources */ paddr_t paddr, /* map for this address */ size_t byte_count); /* map this many bytes */typedef alenlist_txtalk_dmamap_list_f (xtalk_dmamap_t dmamap, /* use these mapping resources */ alenlist_t alenlist, /* map this address/length list */ unsigned flags);typedef voidxtalk_dmamap_done_f (xtalk_dmamap_t dmamap);typedef iopaddr_txtalk_dmatrans_addr_f (vertex_hdl_t dev, /* translate for this device */ device_desc_t dev_desc, /* device descriptor */ paddr_t paddr, /* system physical address */ size_t byte_count, /* length */ unsigned flags);typedef alenlist_txtalk_dmatrans_list_f (vertex_hdl_t dev, /* translate for this device */ device_desc_t dev_desc, /* device descriptor */ alenlist_t palenlist, /* system address/length list */ unsigned flags);typedef voidxtalk_dmamap_drain_f (xtalk_dmamap_t map); /* drain this map's channel */typedef voidxtalk_dmaaddr_drain_f (vertex_hdl_t vhdl, /* drain channel from this device */ paddr_t addr, /* to this physical address */ size_t bytes); /* for this many bytes */typedef voidxtalk_dmalist_drain_f (vertex_hdl_t vhdl, /* drain channel from this device */ alenlist_t list); /* for this set of physical blocks *//* INTERRUPT MANAGEMENT *//* * A xtalk interrupt resource handle. When resources are allocated * in order to satisfy a xtalk_intr_alloc request, a xtalk_intr handle * is returned. xtalk_intr_connect associates a software handler with * these system resources. */typedef struct xtalk_intr_s *xtalk_intr_t;/* * When a crosstalk device connects an interrupt, it passes in a function * that knows how to set its xtalk interrupt register appropriately. The * low-level interrupt code may invoke this function later in order to * migrate an interrupt transparently to the device driver(s) that use this * interrupt. * * The argument passed to this function contains enough information for a * crosstalk device to (re-)target an interrupt. A function of this type * must be supplied by every crosstalk driver. */typedef intxtalk_intr_setfunc_f (xtalk_intr_t intr_hdl); /* interrupt handle */typedef xtalk_intr_txtalk_intr_alloc_f (vertex_hdl_t dev, /* which crosstalk device */ device_desc_t dev_desc, /* device descriptor */ vertex_hdl_t owner_dev); /* owner of this intr */typedef voidxtalk_intr_free_f (xtalk_intr_t intr_hdl);typedef intxtalk_intr_connect_f (xtalk_intr_t intr_hdl, /* xtalk intr resource handle */ intr_func_t intr_func, /* xtalk intr handler */ void *intr_arg, /* arg to intr handler */ xtalk_intr_setfunc_f *setfunc, /* func to set intr hw */ void *setfunc_arg); /* arg to setfunc */typedef voidxtalk_intr_disconnect_f (xtalk_intr_t intr_hdl);typedef vertex_hdl_txtalk_intr_cpu_get_f (xtalk_intr_t intr_hdl); /* xtalk intr resource handle *//* CONFIGURATION MANAGEMENT */typedef voidxtalk_provider_startup_f (vertex_hdl_t xtalk_provider);typedef voidxtalk_provider_shutdown_f (vertex_hdl_t xtalk_provider);typedef voidxtalk_widgetdev_enable_f (vertex_hdl_t, int);typedef voidxtalk_widgetdev_shutdown_f (vertex_hdl_t, int);typedef intxtalk_dma_enabled_f (vertex_hdl_t);/* Error Management */typedef intxtalk_error_devenable_f (vertex_hdl_t xconn_vhdl, int devnum, int error_code);/* Early Action Support */typedef caddr_txtalk_early_piotrans_addr_f (xwidget_part_num_t part_num, xwidget_mfg_num_t mfg_num, int which, iopaddr_t xtalk_addr, size_t byte_count, unsigned flags);/* * Adapters that provide a crosstalk interface adhere to this software interface. */typedef struct xtalk_provider_s { /* PIO MANAGEMENT */ xtalk_piomap_alloc_f *piomap_alloc; xtalk_piomap_free_f *piomap_free; xtalk_piomap_addr_f *piomap_addr; xtalk_piomap_done_f *piomap_done; xtalk_piotrans_addr_f *piotrans_addr; /* DMA MANAGEMENT */ xtalk_dmamap_alloc_f *dmamap_alloc; xtalk_dmamap_free_f *dmamap_free; xtalk_dmamap_addr_f *dmamap_addr; xtalk_dmamap_list_f *dmamap_list; xtalk_dmamap_done_f *dmamap_done; xtalk_dmatrans_addr_f *dmatrans_addr; xtalk_dmatrans_list_f *dmatrans_list; xtalk_dmamap_drain_f *dmamap_drain; xtalk_dmaaddr_drain_f *dmaaddr_drain; xtalk_dmalist_drain_f *dmalist_drain; /* INTERRUPT MANAGEMENT */ xtalk_intr_alloc_f *intr_alloc; xtalk_intr_alloc_f *intr_alloc_nothd; xtalk_intr_free_f *intr_free; xtalk_intr_connect_f *intr_connect; xtalk_intr_disconnect_f *intr_disconnect; /* CONFIGURATION MANAGEMENT */ xtalk_provider_startup_f *provider_startup; xtalk_provider_shutdown_f *provider_shutdown; /* Error Management */ xtalk_error_devenable_f *error_devenable;} xtalk_provider_t;/* Crosstalk devices use these standard Crosstalk provider interfaces */extern xtalk_piomap_alloc_f xtalk_piomap_alloc;extern xtalk_piomap_free_f xtalk_piomap_free;extern xtalk_piomap_addr_f xtalk_piomap_addr;extern xtalk_piomap_done_f xtalk_piomap_done;extern xtalk_piotrans_addr_f xtalk_piotrans_addr;extern xtalk_dmamap_alloc_f xtalk_dmamap_alloc;extern xtalk_dmamap_free_f xtalk_dmamap_free;extern xtalk_dmamap_addr_f xtalk_dmamap_addr;extern xtalk_dmamap_list_f xtalk_dmamap_list;extern xtalk_dmamap_done_f xtalk_dmamap_done;extern xtalk_dmatrans_addr_f xtalk_dmatrans_addr;extern xtalk_dmatrans_list_f xtalk_dmatrans_list;extern xtalk_dmamap_drain_f xtalk_dmamap_drain;extern xtalk_dmaaddr_drain_f xtalk_dmaaddr_drain;extern xtalk_dmalist_drain_f xtalk_dmalist_drain;extern xtalk_intr_alloc_f xtalk_intr_alloc;extern xtalk_intr_alloc_f xtalk_intr_alloc_nothd;extern xtalk_intr_free_f xtalk_intr_free;extern xtalk_intr_connect_f xtalk_intr_connect;extern xtalk_intr_disconnect_f xtalk_intr_disconnect;extern xtalk_intr_cpu_get_f xtalk_intr_cpu_get;extern xtalk_provider_startup_f xtalk_provider_startup;extern xtalk_provider_shutdown_f xtalk_provider_shutdown;extern xtalk_widgetdev_enable_f xtalk_widgetdev_enable;extern xtalk_widgetdev_shutdown_f xtalk_widgetdev_shutdown;extern xtalk_dma_enabled_f xtalk_dma_enabled;extern xtalk_error_devenable_f xtalk_error_devenable;extern xtalk_early_piotrans_addr_f xtalk_early_piotrans_addr;/* error management */extern int xtalk_error_handler(vertex_hdl_t, int, ioerror_mode_t, ioerror_t *);/* * Generic crosstalk interface, for use with all crosstalk providers * and all crosstalk devices. */typedef unchar xtalk_intr_vector_t; /* crosstalk interrupt vector (0..255) */#define XTALK_INTR_VECTOR_NONE (xtalk_intr_vector_t)0/* Generic crosstalk interrupt interfaces */extern vertex_hdl_t xtalk_intr_dev_get(xtalk_intr_t xtalk_intr);extern xwidgetnum_t xtalk_intr_target_get(xtalk_intr_t xtalk_intr);extern xtalk_intr_vector_t xtalk_intr_vector_get(xtalk_intr_t xtalk_intr);extern iopaddr_t xtalk_intr_addr_get(xtalk_intr_t xtalk_intr);extern vertex_hdl_t xtalk_intr_cpu_get(xtalk_intr_t xtalk_intr);extern void *xtalk_intr_sfarg_get(xtalk_intr_t xtalk_intr);/* Generic crosstalk pio interfaces */extern vertex_hdl_t xtalk_pio_dev_get(xtalk_piomap_t xtalk_piomap);extern xwidgetnum_t xtalk_pio_target_get(xtalk_piomap_t xtalk_piomap);extern iopaddr_t xtalk_pio_xtalk_addr_get(xtalk_piomap_t xtalk_piomap);extern size_t xtalk_pio_mapsz_get(xtalk_piomap_t xtalk_piomap);extern caddr_t xtalk_pio_kvaddr_get(xtalk_piomap_t xtalk_piomap);/* Generic crosstalk dma interfaces */extern vertex_hdl_t xtalk_dma_dev_get(xtalk_dmamap_t xtalk_dmamap);extern xwidgetnum_t xtalk_dma_target_get(xtalk_dmamap_t xtalk_dmamap);/* Register/unregister Crosstalk providers and get implementation handle */extern void xtalk_set_early_piotrans_addr(xtalk_early_piotrans_addr_f *);extern void xtalk_provider_register(vertex_hdl_t provider, xtalk_provider_t *xtalk_fns);extern void xtalk_provider_unregister(vertex_hdl_t provider);extern xtalk_provider_t *xtalk_provider_fns_get(vertex_hdl_t provider);/* Crosstalk Switch generic layer, for use by initialization code */extern void xswitch_census(vertex_hdl_t xswitchv);extern void xswitch_init_widgets(vertex_hdl_t xswitchv);/* early init interrupt management */typedef voidxwidget_intr_preset_f (void *which_widget, int which_widget_intr, xwidgetnum_t targ, iopaddr_t addr, xtalk_intr_vector_t vect);typedef voidxtalk_intr_prealloc_f (void *which_xtalk, xtalk_intr_vector_t xtalk_vector, xwidget_intr_preset_f *preset_func, void *which_widget, int which_widget_intr);typedef voidxtalk_intr_preconn_f (void *which_xtalk, xtalk_intr_vector_t xtalk_vector, intr_func_t intr_func, intr_arg_t intr_arg);#define XTALK_ADDR_TO_UPPER(xtalk_addr) (((iopaddr_t)(xtalk_addr) >> 32) & 0xffff)#define XTALK_ADDR_TO_LOWER(xtalk_addr) ((iopaddr_t)(xtalk_addr) & 0xffffffff)typedef xtalk_intr_setfunc_f *xtalk_intr_setfunc_t;typedef void xtalk_iter_f(vertex_hdl_t vhdl);extern void xtalk_iterate(char *prefix, xtalk_iter_f *func);#endif /* __KERNEL__ */#endif /* _ASM_SN_XTALK_XTALK_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -