Xenomai API  2.5.6.1
ksrc/drivers/analogy/national_instruments/mite.h
Go to the documentation of this file.
00001 
00021 #ifndef __ANALOGY_NI_MITE_H__
00022 #define __ANALOGY_NI_MITE_H__
00023 
00024 #include <linux/pci.h>
00025 
00026 #include <analogy/analogy_driver.h>
00027 
00028 #define PCI_VENDOR_ID_NATINST 0x1093
00029 #define PCI_MITE_SIZE 4096
00030 #define PCI_DAQ_SIZE 4096
00031 #define PCI_DAQ_SIZE_660X 8192
00032 #define PCIMIO_COMPAT
00033 #define MAX_MITE_DMA_CHANNELS 8
00034 
00035 #define TOP_OF_PAGE(x) ((x)|(~(PAGE_MASK)))
00036 
00037 struct mite_dma_descriptor {
00038         u32 count;
00039         u32 addr;
00040         u32 next;
00041         u32 dar;
00042 };
00043 
00044 struct mite_dma_descriptor_ring {
00045         struct pci_dev *pcidev;
00046         u32 n_links;
00047         struct mite_dma_descriptor *descriptors;
00048         dma_addr_t descriptors_dma_addr;
00049 };
00050 
00051 struct mite_channel {
00052         struct mite_struct *mite;
00053         u32 channel;
00054         u32 dir;
00055         u32 done;
00056         struct mite_dma_descriptor_ring *ring;
00057 };
00058 
00059 struct mite_struct {
00060         struct list_head list;
00061         a4l_lock_t lock;
00062         u32 used;
00063         u32 num_channels;
00064 
00065         struct mite_channel channels[MAX_MITE_DMA_CHANNELS];
00066         u32 channel_allocated[MAX_MITE_DMA_CHANNELS];
00067 
00068         struct pci_dev *pcidev;
00069         resource_size_t mite_phys_addr;
00070         void *mite_io_addr;
00071         resource_size_t daq_phys_addr;
00072         void *daq_io_addr;
00073 };
00074 
00075 static inline
00076 struct mite_dma_descriptor_ring *mite_alloc_ring(struct mite_struct *mite)
00077 {
00078         struct mite_dma_descriptor_ring *ring =
00079                 kmalloc(sizeof(struct mite_dma_descriptor_ring), GFP_DMA);
00080 
00081         if (ring == NULL)
00082                 return ring;
00083 
00084         memset(ring, 0, sizeof(struct mite_dma_descriptor_ring));
00085 
00086         ring->pcidev = mite->pcidev;
00087         if (ring->pcidev == NULL) {
00088                 kfree(ring);
00089                 return NULL;
00090         }
00091 
00092         return ring;
00093 };
00094 
00095 static inline void mite_free_ring(struct mite_dma_descriptor_ring *ring)
00096 {
00097         if (ring) {
00098                 if (ring->descriptors) {
00099                         pci_free_consistent(
00100                                 ring->pcidev,
00101                                 ring->n_links *
00102                                 sizeof(struct mite_dma_descriptor),
00103                                 ring->descriptors, ring->descriptors_dma_addr);
00104                 }
00105                 kfree(ring);
00106         }
00107 };
00108 
00109 static inline unsigned int mite_irq(struct mite_struct *mite)
00110 {
00111         return mite->pcidev->irq;
00112 };
00113 static inline unsigned int mite_device_id(struct mite_struct *mite)
00114 {
00115         return mite->pcidev->device;
00116 };
00117 
00118 int mite_setup(struct mite_struct *mite, int use_iodwbsr_1);
00119 void mite_unsetup(struct mite_struct *mite);
00120 void mite_list_devices(void);
00121 struct mite_struct * mite_find_device(int bus,
00122                                       int slot, unsigned short device_id);
00123 struct mite_channel *mite_request_channel_in_range(struct mite_struct *mite,
00124         struct mite_dma_descriptor_ring *ring, unsigned min_channel,
00125         unsigned max_channel);
00126 static inline struct mite_channel *mite_request_channel(struct mite_struct
00127         *mite, struct mite_dma_descriptor_ring *ring)
00128 {
00129         return mite_request_channel_in_range(mite, ring, 0,
00130                 mite->num_channels - 1);
00131 }
00132 void mite_release_channel(struct mite_channel *mite_chan);
00133 
00134 void mite_dma_arm(struct mite_channel *mite_chan);
00135 void mite_dma_disarm(struct mite_channel *mite_chan);
00136 int mite_sync_input_dma(struct mite_channel *mite_chan, a4l_subd_t *subd);
00137 int mite_sync_output_dma(struct mite_channel *mite_chan, a4l_subd_t *subd);
00138 u32 mite_bytes_written_to_memory_lb(struct mite_channel *mite_chan);
00139 u32 mite_bytes_written_to_memory_ub(struct mite_channel *mite_chan);
00140 u32 mite_bytes_read_from_memory_lb(struct mite_channel *mite_chan);
00141 u32 mite_bytes_read_from_memory_ub(struct mite_channel *mite_chan);
00142 u32 mite_bytes_in_transit(struct mite_channel *mite_chan);
00143 u32 mite_get_status(struct mite_channel *mite_chan);
00144 int mite_done(struct mite_channel *mite_chan);
00145 void mite_prep_dma(struct mite_channel *mite_chan,
00146                    unsigned int num_device_bits, unsigned int num_memory_bits);
00147 int mite_buf_change(struct mite_dma_descriptor_ring *ring, a4l_subd_t *subd);
00148 
00149 #ifdef CONFIG_DEBUG_MITE
00150 void mite_print_chsr(unsigned int chsr);
00151 void mite_dump_regs(struct mite_channel *mite_chan);
00152 #endif
00153 
00154 static inline int CHAN_OFFSET(int channel)
00155 {
00156         return 0x500 + 0x100 * channel;
00157 };
00158 
00159 enum mite_registers {
00160         /* The bits 0x90180700 in MITE_UNKNOWN_DMA_BURST_REG can be
00161            written and read back.  The bits 0x1f always read as 1.
00162            The rest always read as zero. */
00163         MITE_UNKNOWN_DMA_BURST_REG = 0x28,
00164         MITE_IODWBSR = 0xc0,    //IO Device Window Base Size Register
00165         MITE_IODWBSR_1 = 0xc4,  // IO Device Window Base Size Register 1
00166         MITE_IODWCR_1 = 0xf4,
00167         MITE_PCI_CONFIG_OFFSET = 0x300,
00168         MITE_CSIGR = 0x460      //chip signature
00169 };
00170 static inline int MITE_CHOR(int channel)        // channel operation
00171 {
00172         return CHAN_OFFSET(channel) + 0x0;
00173 };
00174 static inline int MITE_CHCR(int channel)        // channel control
00175 {
00176         return CHAN_OFFSET(channel) + 0x4;
00177 };
00178 static inline int MITE_TCR(int channel) // transfer count
00179 {
00180         return CHAN_OFFSET(channel) + 0x8;
00181 };
00182 static inline int MITE_MCR(int channel) // memory configuration
00183 {
00184         return CHAN_OFFSET(channel) + 0xc;
00185 };
00186 static inline int MITE_MAR(int channel) // memory address
00187 {
00188         return CHAN_OFFSET(channel) + 0x10;
00189 };
00190 static inline int MITE_DCR(int channel) // device configuration
00191 {
00192         return CHAN_OFFSET(channel) + 0x14;
00193 };
00194 static inline int MITE_DAR(int channel) // device address
00195 {
00196         return CHAN_OFFSET(channel) + 0x18;
00197 };
00198 static inline int MITE_LKCR(int channel)        // link configuration
00199 {
00200         return CHAN_OFFSET(channel) + 0x1c;
00201 };
00202 static inline int MITE_LKAR(int channel)        // link address
00203 {
00204         return CHAN_OFFSET(channel) + 0x20;
00205 };
00206 static inline int MITE_LLKAR(int channel)       // see mite section of tnt5002 manual
00207 {
00208         return CHAN_OFFSET(channel) + 0x24;
00209 };
00210 static inline int MITE_BAR(int channel) // base address
00211 {
00212         return CHAN_OFFSET(channel) + 0x28;
00213 };
00214 static inline int MITE_BCR(int channel) // base count
00215 {
00216         return CHAN_OFFSET(channel) + 0x2c;
00217 };
00218 static inline int MITE_SAR(int channel) // ? address
00219 {
00220         return CHAN_OFFSET(channel) + 0x30;
00221 };
00222 static inline int MITE_WSCR(int channel)        // ?
00223 {
00224         return CHAN_OFFSET(channel) + 0x34;
00225 };
00226 static inline int MITE_WSER(int channel)        // ?
00227 {
00228         return CHAN_OFFSET(channel) + 0x38;
00229 };
00230 static inline int MITE_CHSR(int channel)        // channel status
00231 {
00232         return CHAN_OFFSET(channel) + 0x3c;
00233 };
00234 static inline int MITE_FCR(int channel) // fifo count
00235 {
00236         return CHAN_OFFSET(channel) + 0x40;
00237 };
00238 
00239 enum MITE_IODWBSR_bits {
00240         WENAB = 0x80,           // window enable
00241 };
00242 
00243 static inline unsigned MITE_IODWBSR_1_WSIZE_bits(unsigned size)
00244 {
00245         unsigned order = 0;
00246         while (size >>= 1)
00247                 ++order;
00248         BUG_ON(order < 1);
00249         return (order - 1) & 0x1f;
00250 }
00251 
00252 enum MITE_UNKNOWN_DMA_BURST_bits {
00253         UNKNOWN_DMA_BURST_ENABLE_BITS = 0x600
00254 };
00255 
00256 static inline int mite_csigr_version(u32 csigr_bits)
00257 {
00258         return csigr_bits & 0xf;
00259 };
00260 static inline int mite_csigr_type(u32 csigr_bits)
00261 {                               // original mite = 0, minimite = 1
00262         return (csigr_bits >> 4) & 0xf;
00263 };
00264 static inline int mite_csigr_mmode(u32 csigr_bits)
00265 {                               // mite mode, minimite = 1
00266         return (csigr_bits >> 8) & 0x3;
00267 };
00268 static inline int mite_csigr_imode(u32 csigr_bits)
00269 {                               // cpu port interface mode, pci = 0x3
00270         return (csigr_bits >> 12) & 0x3;
00271 };
00272 static inline int mite_csigr_dmac(u32 csigr_bits)
00273 {                               // number of dma channels
00274         return (csigr_bits >> 16) & 0xf;
00275 };
00276 static inline int mite_csigr_wpdep(u32 csigr_bits)
00277 {                               // write post fifo depth
00278         unsigned int wpdep_bits = (csigr_bits >> 20) & 0x7;
00279         if (wpdep_bits == 0)
00280                 return 0;
00281         else
00282                 return 1 << (wpdep_bits - 1);
00283 };
00284 static inline int mite_csigr_wins(u32 csigr_bits)
00285 {
00286         return (csigr_bits >> 24) & 0x1f;
00287 };
00288 static inline int mite_csigr_iowins(u32 csigr_bits)
00289 {                               // number of io windows
00290         return (csigr_bits >> 29) & 0x7;
00291 };
00292 
00293 enum MITE_MCR_bits {
00294         MCRPON = 0,
00295 };
00296 
00297 enum MITE_DCR_bits {
00298         DCR_NORMAL = (1 << 29),
00299         DCRPON = 0,
00300 };
00301 
00302 enum MITE_CHOR_bits {
00303         CHOR_DMARESET = (1 << 31),
00304         CHOR_SET_SEND_TC = (1 << 11),
00305         CHOR_CLR_SEND_TC = (1 << 10),
00306         CHOR_SET_LPAUSE = (1 << 9),
00307         CHOR_CLR_LPAUSE = (1 << 8),
00308         CHOR_CLRDONE = (1 << 7),
00309         CHOR_CLRRB = (1 << 6),
00310         CHOR_CLRLC = (1 << 5),
00311         CHOR_FRESET = (1 << 4),
00312         CHOR_ABORT = (1 << 3),  /* stop without emptying fifo */
00313         CHOR_STOP = (1 << 2),   /* stop after emptying fifo */
00314         CHOR_CONT = (1 << 1),
00315         CHOR_START = (1 << 0),
00316         CHOR_PON = (CHOR_CLR_SEND_TC | CHOR_CLR_LPAUSE),
00317 };
00318 
00319 enum MITE_CHCR_bits {
00320         CHCR_SET_DMA_IE = (1 << 31),
00321         CHCR_CLR_DMA_IE = (1 << 30),
00322         CHCR_SET_LINKP_IE = (1 << 29),
00323         CHCR_CLR_LINKP_IE = (1 << 28),
00324         CHCR_SET_SAR_IE = (1 << 27),
00325         CHCR_CLR_SAR_IE = (1 << 26),
00326         CHCR_SET_DONE_IE = (1 << 25),
00327         CHCR_CLR_DONE_IE = (1 << 24),
00328         CHCR_SET_MRDY_IE = (1 << 23),
00329         CHCR_CLR_MRDY_IE = (1 << 22),
00330         CHCR_SET_DRDY_IE = (1 << 21),
00331         CHCR_CLR_DRDY_IE = (1 << 20),
00332         CHCR_SET_LC_IE = (1 << 19),
00333         CHCR_CLR_LC_IE = (1 << 18),
00334         CHCR_SET_CONT_RB_IE = (1 << 17),
00335         CHCR_CLR_CONT_RB_IE = (1 << 16),
00336         CHCR_FIFODIS = (1 << 15),
00337         CHCR_FIFO_ON = 0,
00338         CHCR_BURSTEN = (1 << 14),
00339         CHCR_NO_BURSTEN = 0,
00340         CHCR_BYTE_SWAP_DEVICE = (1 << 6),
00341         CHCR_BYTE_SWAP_MEMORY = (1 << 4),
00342         CHCR_DIR = (1 << 3),
00343         CHCR_DEV_TO_MEM = CHCR_DIR,
00344         CHCR_MEM_TO_DEV = 0,
00345         CHCR_NORMAL = (0 << 0),
00346         CHCR_CONTINUE = (1 << 0),
00347         CHCR_RINGBUFF = (2 << 0),
00348         CHCR_LINKSHORT = (4 << 0),
00349         CHCR_LINKLONG = (5 << 0),
00350         CHCRPON =
00351                 (CHCR_CLR_DMA_IE | CHCR_CLR_LINKP_IE | CHCR_CLR_SAR_IE |
00352                 CHCR_CLR_DONE_IE | CHCR_CLR_MRDY_IE | CHCR_CLR_DRDY_IE |
00353                 CHCR_CLR_LC_IE | CHCR_CLR_CONT_RB_IE),
00354 };
00355 
00356 enum ConfigRegister_bits {
00357         CR_REQS_MASK = 0x7 << 16,
00358         CR_ASEQDONT = 0x0 << 10,
00359         CR_ASEQUP = 0x1 << 10,
00360         CR_ASEQDOWN = 0x2 << 10,
00361         CR_ASEQ_MASK = 0x3 << 10,
00362         CR_PSIZE8 = (1 << 8),
00363         CR_PSIZE16 = (2 << 8),
00364         CR_PSIZE32 = (3 << 8),
00365         CR_PORTCPU = (0 << 6),
00366         CR_PORTIO = (1 << 6),
00367         CR_PORTVXI = (2 << 6),
00368         CR_PORTMXI = (3 << 6),
00369         CR_AMDEVICE = (1 << 0),
00370 };
00371 static inline int CR_REQS(int source)
00372 {
00373         return (source & 0x7) << 16;
00374 };
00375 static inline int CR_REQSDRQ(unsigned drq_line)
00376 {
00377         /* This also works on m-series when
00378            using channels (drq_line) 4 or 5. */
00379         return CR_REQS((drq_line & 0x3) | 0x4);
00380 }
00381 static inline int CR_RL(unsigned int retry_limit)
00382 {
00383         int value = 0;
00384 
00385         while (retry_limit) {
00386                 retry_limit >>= 1;
00387                 value++;
00388         }
00389         if (value > 0x7)
00390                 __a4l_err("bug! retry_limit too large\n");
00391 
00392         return (value & 0x7) << 21;
00393 }
00394 
00395 enum CHSR_bits {
00396         CHSR_INT = (1 << 31),
00397         CHSR_LPAUSES = (1 << 29),
00398         CHSR_SARS = (1 << 27),
00399         CHSR_DONE = (1 << 25),
00400         CHSR_MRDY = (1 << 23),
00401         CHSR_DRDY = (1 << 21),
00402         CHSR_LINKC = (1 << 19),
00403         CHSR_CONTS_RB = (1 << 17),
00404         CHSR_ERROR = (1 << 15),
00405         CHSR_SABORT = (1 << 14),
00406         CHSR_HABORT = (1 << 13),
00407         CHSR_STOPS = (1 << 12),
00408         CHSR_OPERR_mask = (3 << 10),
00409         CHSR_OPERR_NOERROR = (0 << 10),
00410         CHSR_OPERR_FIFOERROR = (1 << 10),
00411         CHSR_OPERR_LINKERROR = (1 << 10),       /* ??? */
00412         CHSR_XFERR = (1 << 9),
00413         CHSR_END = (1 << 8),
00414         CHSR_DRQ1 = (1 << 7),
00415         CHSR_DRQ0 = (1 << 6),
00416         CHSR_LxERR_mask = (3 << 4),
00417         CHSR_LBERR = (1 << 4),
00418         CHSR_LRERR = (2 << 4),
00419         CHSR_LOERR = (3 << 4),
00420         CHSR_MxERR_mask = (3 << 2),
00421         CHSR_MBERR = (1 << 2),
00422         CHSR_MRERR = (2 << 2),
00423         CHSR_MOERR = (3 << 2),
00424         CHSR_DxERR_mask = (3 << 0),
00425         CHSR_DBERR = (1 << 0),
00426         CHSR_DRERR = (2 << 0),
00427         CHSR_DOERR = (3 << 0),
00428 };
00429 
00430 static inline void mite_dma_reset(struct mite_channel *mite_chan)
00431 {
00432         writel(CHOR_DMARESET | CHOR_FRESET,
00433                 mite_chan->mite->mite_io_addr + MITE_CHOR(mite_chan->channel));
00434 };
00435 
00436 #endif /* !__ANALOGY_NI_MITE_H__ */
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines