Path: blob/master/arch/powerpc/sysdev/bestcomm/ata.c
10818 views
/*1* Bestcomm ATA task driver2*3*4* Patterned after bestcomm/fec.c by Dale Farnsworth <[email protected]>5* 2003-2004 (c) MontaVista, Software, Inc.6*7* Copyright (C) 2006-2007 Sylvain Munaut <[email protected]>8* Copyright (C) 2006 Freescale - John Rigby9*10* This file is licensed under the terms of the GNU General Public License11* version 2. This program is licensed "as is" without any warranty of any12* kind, whether express or implied.13*/1415#include <linux/kernel.h>16#include <linux/module.h>17#include <linux/types.h>18#include <asm/io.h>1920#include "bestcomm.h"21#include "bestcomm_priv.h"22#include "ata.h"232425/* ======================================================================== */26/* Task image/var/inc */27/* ======================================================================== */2829/* ata task image */30extern u32 bcom_ata_task[];3132/* ata task vars that need to be set before enabling the task */33struct bcom_ata_var {34u32 enable; /* (u16*) address of task's control register */35u32 bd_base; /* (struct bcom_bd*) beginning of ring buffer */36u32 bd_last; /* (struct bcom_bd*) end of ring buffer */37u32 bd_start; /* (struct bcom_bd*) current bd */38u32 buffer_size; /* size of receive buffer */39};4041/* ata task incs that need to be set before enabling the task */42struct bcom_ata_inc {43u16 pad0;44s16 incr_bytes;45u16 pad1;46s16 incr_dst;47u16 pad2;48s16 incr_src;49};505152/* ======================================================================== */53/* Task support code */54/* ======================================================================== */5556struct bcom_task *57bcom_ata_init(int queue_len, int maxbufsize)58{59struct bcom_task *tsk;60struct bcom_ata_var *var;61struct bcom_ata_inc *inc;6263/* Prefetch breaks ATA DMA. Turn it off for ATA DMA */64bcom_disable_prefetch();6566tsk = bcom_task_alloc(queue_len, sizeof(struct bcom_ata_bd), 0);67if (!tsk)68return NULL;6970tsk->flags = BCOM_FLAGS_NONE;7172bcom_ata_reset_bd(tsk);7374var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum);75inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);7677if (bcom_load_image(tsk->tasknum, bcom_ata_task)) {78bcom_task_free(tsk);79return NULL;80}8182var->enable = bcom_eng->regs_base +83offsetof(struct mpc52xx_sdma, tcr[tsk->tasknum]);84var->bd_base = tsk->bd_pa;85var->bd_last = tsk->bd_pa + ((tsk->num_bd-1) * tsk->bd_size);86var->bd_start = tsk->bd_pa;87var->buffer_size = maxbufsize;8889/* Configure some stuff */90bcom_set_task_pragma(tsk->tasknum, BCOM_ATA_PRAGMA);91bcom_set_task_auto_start(tsk->tasknum, tsk->tasknum);9293out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_RX], BCOM_IPR_ATA_RX);94out_8(&bcom_eng->regs->ipr[BCOM_INITIATOR_ATA_TX], BCOM_IPR_ATA_TX);9596out_be32(&bcom_eng->regs->IntPend, 1<<tsk->tasknum); /* Clear ints */9798return tsk;99}100EXPORT_SYMBOL_GPL(bcom_ata_init);101102void bcom_ata_rx_prepare(struct bcom_task *tsk)103{104struct bcom_ata_inc *inc;105106inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);107108inc->incr_bytes = -(s16)sizeof(u32);109inc->incr_src = 0;110inc->incr_dst = sizeof(u32);111112bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_RX);113}114EXPORT_SYMBOL_GPL(bcom_ata_rx_prepare);115116void bcom_ata_tx_prepare(struct bcom_task *tsk)117{118struct bcom_ata_inc *inc;119120inc = (struct bcom_ata_inc *) bcom_task_inc(tsk->tasknum);121122inc->incr_bytes = -(s16)sizeof(u32);123inc->incr_src = sizeof(u32);124inc->incr_dst = 0;125126bcom_set_initiator(tsk->tasknum, BCOM_INITIATOR_ATA_TX);127}128EXPORT_SYMBOL_GPL(bcom_ata_tx_prepare);129130void bcom_ata_reset_bd(struct bcom_task *tsk)131{132struct bcom_ata_var *var;133134/* Reset all BD */135memset(tsk->bd, 0x00, tsk->num_bd * tsk->bd_size);136137tsk->index = 0;138tsk->outdex = 0;139140var = (struct bcom_ata_var *) bcom_task_var(tsk->tasknum);141var->bd_start = var->bd_base;142}143EXPORT_SYMBOL_GPL(bcom_ata_reset_bd);144145void bcom_ata_release(struct bcom_task *tsk)146{147/* Nothing special for the ATA tasks */148bcom_task_free(tsk);149}150EXPORT_SYMBOL_GPL(bcom_ata_release);151152153MODULE_DESCRIPTION("BestComm ATA task driver");154MODULE_AUTHOR("John Rigby");155MODULE_LICENSE("GPL v2");156157158159