ufs_device.hh revision 12086:069c529a76fd
1/*
2 * Copyright (c) 2013-2015 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder.  You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Rene de Jong
38 */
39
40
41/** @file
42 * This is a base class for UFS devices
43 * The UFS interface consists out of one host controller which connects a
44 * number of devices which together contain up to 8 logic units. A Logical
45 * Unit is an externally addressable, independent, processing entity that
46 * processes SCSI tasks (commands) and performs task management functions.
47 * The decision has been made to abstract the device away, and model the
48 * different logic units. Effectively this means that there is one Host layer
49 * which handles all the UFS commands (everything UTP, UPIU and UNIpro
50 * related) and a SCSI layer, which handles the SCSI interpretation and the
51 * interaction with the "disk" (effectively the LBA that that particular
52 * Logic Unit controls). Each Logic unit should therefor control a disk image
53 * and a timing model. The UFS protocol has three types of commands
54 * (explained later). Each has different phases and each phase need to wait
55 * for its particular data. This is the reason that this model contains a lot
56 * of events. For clarity, a state diagram in doxygen has been provided. To
57 * fully apreciate the stages that the model flows through, the states have
58 * been broken into three state diagrams. It is best if one imagines the
59 * command flow state machine to be happening in the UFSHost layer, and the
60 * other two to flow through all the layers of the model (UFS host, SCSI and
61 * NVM model). See it as a quarry, one state diagram is moving the crane into
62 * place, and the other ones are transporting the dirt down, or the valuables
63 * up. For complete information about the working of UFS please refer to
64 * http://www.jedec.org/standards-documents/results/jesd220 or
65 * http://www.jedec.org/standards-documents/results/jesd223
66 * The documents are available free of charge, although you will need to have
67 * an acount.
68 */
69
70/** UFS command flow state machine
71 *digraph CommandFlow{
72    node [fontsize=10];
73    IDLE -> transferHandler
74    [ label=" transfer/task/command request " fontsize=6];
75    transferHandler -> command
76    [ label=" It is a command " fontsize=6];
77    command -> IDLE
78    [ label=" Command done, no further action " fontsize=6];
79    transferHandler -> taskStart
80    [ label=" It is a task " fontsize=6];
81    taskStart -> finalUTP
82    [ label=" Task handled, now acknowledge (UFS) " fontsize=6];
83    transferHandler -> transferStart
84    [ label=" It is a transfer " fontsize=6];
85    transferStart -> SCSIResume
86    [ label=" Transfer, obtain the specific command " fontsize=6];
87    SCSIResume -> DiskDataFlowPhase
88    [ label=" Disk data transfer (see other graphs) " fontsize=6];
89    SCSIResume -> DeviceDataPhase
90    [ label=" Device info transfer (handled in SCSIResume) "
91        fontsize=6];
92    DiskDataFlowPhase -> transferDone
93    [ label=" Transfer done, acknowledge SCSI command " fontsize=6];
94    DeviceDataPhase -> transferDone
95    [ label=" Transfer done, acknowledge SCSI command " fontsize=6];
96    transferDone -> finalUTP
97    [ label=" Transfer handled, now acknowledge (UFS) " fontsize=6];
98    finalUTP -> readDone
99    [ label=" All handled, clear data structures " fontsize=6];
100    readDone -> IDLE
101    [ label=" All handled, nothing outstanding " fontsize=6];
102    readDone -> transferHandler
103    [ label=" All handled, handle next outstanding " fontsize=6];
104    }
105 */
106/** UFS read transaction flow state machine
107 digraph readFlow{
108    node [fontsize=10];
109    getScatterGather -> commitReadFromDisk
110    [ label=" Put the information about the data transfer to the disk "
111        fontsize=6];
112    commitReadFromDisk -> waitForReads
113    [ label=" Push the reads to the flashmodel and wait for callbacks "
114        fontsize=6];
115    waitForReads -> pushToDMA
116    [ label=" Push to the DMA and wait for them to finish " fontsize=6];
117    pushToDMA -> waitForReads
118    [ label=" Wait for the next disk event " fontsize=6];
119    pushToDMA -> waitForDMA
120    [ label=" Wait for the last DMA transfer to finish " fontsize=6];
121    waitForDMA -> finishTransfer
122    [ label=" Continue with the command flow " fontsize=6];
123    }
124 */
125/** UFS write transaction flow state machine
126 digraph WriteFlow{
127    node [fontsize=10];
128    getScatterGather -> getFromDMA
129    [ label=" Put the transfer information to the DMA " fontsize=6];
130    getFromDMA -> waitForDMA
131    [ label=" Wait for dma actions to arrive " fontsize=6];
132    waitForDMA -> pushToDisk
133    [ label=" Push arrived DMA to disk " fontsize=6];
134    pushToDisk -> waitForDMA
135    [ label=" Wait for next DMA action " fontsize=6];
136    pushToDisk -> waitForDisk
137    [ label=" All DMA actions are done, wait for disk " fontsize=6];
138    waitForDisk -> finishTransfer
139    [ label=" All transactions are done , continue the command flow "
140        fontsize=6];
141    }
142 */
143
144#ifndef __DEV_ARM_UFS_DEVICE_HH__
145#define __DEV_ARM_UFS_DEVICE_HH__
146
147#include <deque>
148
149#include "base/addr_range.hh"
150#include "base/bitfield.hh"
151#include "base/statistics.hh"
152#include "debug/UFSHostDevice.hh"
153#include "dev/arm/abstract_nvm.hh"
154#include "dev/arm/base_gic.hh"
155#include "dev/storage/disk_image.hh"
156#include "dev/dma_device.hh"
157#include "dev/io_device.hh"
158#include "mem/packet.hh"
159#include "mem/packet_access.hh"
160#include "params/UFSHostDevice.hh"
161#include "sim/serialize.hh"
162#include "sim/stats.hh"
163
164/**
165 * Host controller layer: This is your Host controller
166 * This layer handles the UFS functionality.
167 * It tracks all the different transaction stages and uses
168 * the device layer and the flash layer to determine the transaction flow.
169 */
170class UFSHostDevice : public DmaDevice
171{
172  public:
173
174    UFSHostDevice(const UFSHostDeviceParams* p);
175
176    DrainState drain() override;
177    void checkDrain();
178    void serialize(CheckpointOut &cp) const override;
179    void unserialize(CheckpointIn &cp) override;
180
181  private:
182    /**
183     * Host Controller Interface
184     * This is a set of registers that allow the driver to control the
185     * transactions to the flash devices.
186     * As defined in:
187     * http://www.jedec.org/standards-documents/results/jesd223
188     */
189    struct HCIMem {
190        /**
191         * Specify the host capabilities
192         */
193        uint32_t HCCAP;
194        uint32_t HCversion;
195        uint32_t HCHCDDID;
196        uint32_t HCHCPMID;
197
198        /**
199         * Operation and runtime registers
200         */
201        uint32_t ORInterruptStatus;
202        uint32_t ORInterruptEnable;
203        uint32_t ORHostControllerStatus;
204        uint32_t ORHostControllerEnable;
205        uint32_t ORUECPA;
206        uint32_t ORUECDL;
207        uint32_t ORUECN;
208        uint32_t ORUECT;
209        uint32_t ORUECDME;
210        uint32_t ORUTRIACR;
211
212        /**
213         * vendor specific register
214         */
215        uint32_t vendorSpecific;
216
217        /**
218         * Transfer control registers
219         */
220        uint32_t TRUTRLBA;
221        uint32_t TRUTRLBAU;
222        uint32_t TRUTRLDBR;
223        uint32_t TRUTRLCLR;
224        uint32_t TRUTRLRSR;
225
226        /**
227         * Task control registers
228         */
229        uint32_t TMUTMRLBA;
230        uint32_t TMUTMRLBAU;
231        uint32_t TMUTMRLDBR;
232        uint32_t TMUTMRLCLR;
233        uint32_t TMUTMRLRSR;
234
235        /**
236         * Command registers
237         */
238        uint32_t CMDUICCMDR;
239        uint32_t CMDUCMDARG1;
240        uint32_t CMDUCMDARG2;
241        uint32_t CMDUCMDARG3;
242    };
243
244    /**
245     * All the data structures are defined in the UFS standard
246     * This standard be found at the JEDEC website free of charge
247     * (login required):
248     * http://www.jedec.org/standards-documents/results/jesd220
249     */
250
251    /**
252     * struct UTPUPIUHeader - UPIU header structure
253     * dWord0: UPIU header DW-0
254     * dWord1: UPIU header DW-1
255     * dWord2: UPIU header DW-2
256     */
257    struct UTPUPIUHeader {
258        uint32_t dWord0;
259        uint32_t dWord1;
260        uint32_t dWord2;
261    };
262
263    /**
264     * struct UTPUPIURSP - Response UPIU structure
265     * header: UPIU header DW-0 to DW-2
266     * residualTransferCount: Residual transfer count DW-3
267     * reserved: Reserved DW-4 to DW-7
268     * senseDataLen: Sense data length DW-8 U16
269     * senseData: Sense data field DW-8 to DW-12
270     */
271    struct UTPUPIURSP {
272        struct UTPUPIUHeader header;
273        uint32_t residualTransferCount;
274        uint32_t reserved[4];
275        uint16_t senseDataLen;
276        uint8_t senseData[18];
277    };
278
279    /**
280     * struct UTPUPIUTaskReq - Task request UPIU structure
281     * header - UPIU header structure DW0 to DW-2
282     * inputParam1: Input param 1 DW-3
283     * inputParam2: Input param 2 DW-4
284     * inputParam3: Input param 3 DW-5
285     * reserved: Reserver DW-6 to DW-7
286     */
287    struct UTPUPIUTaskReq {
288        struct UTPUPIUHeader header;
289        uint32_t inputParam1;
290        uint32_t inputParam2;
291        uint32_t inputParam3;
292        uint32_t reserved[2];
293    };
294
295    /**
296     * struct UFSHCDSGEntry - UFSHCI PRD Entry
297     * baseAddr: Lower 32bit physical address DW-0
298     * upperAddr: Upper 32bit physical address DW-1
299     * reserved: Reserved for future use DW-2
300     * size: size of physical segment DW-3
301     */
302    struct UFSHCDSGEntry {
303        uint32_t baseAddr;
304        uint32_t upperAddr;
305        uint32_t reserved;
306        uint32_t size;
307    };
308
309    /**
310     * struct UTPTransferCMDDesc - UFS Commad Descriptor structure
311     * commandUPIU: Command UPIU Frame address
312     * responseUPIU: Response UPIU Frame address
313     * PRDTable: Physcial Region Descriptor
314     * All lengths as defined by JEDEC220
315     */
316    struct UTPTransferCMDDesc {
317        uint8_t commandUPIU[128];
318        uint8_t responseUPIU[128];
319        struct UFSHCDSGEntry PRDTable[128];
320    };
321
322    /**
323     * UPIU tranfer message.
324     */
325    struct UPIUMessage {
326        struct UTPUPIUHeader header;
327        uint32_t dataOffset;
328        uint32_t dataCount;
329        std::vector<uint32_t> dataMsg;
330    };
331
332    /**
333     * struct UTPTransferReqDesc - UTRD structure
334     * header: UTRD header DW-0 to DW-3
335     * commandDescBaseAddrLo: UCD base address low DW-4
336     * commandDescBaseAddrHi: UCD base address high DW-5
337     * responseUPIULength: response UPIU length DW-6
338     * responseUPIUOffset: response UPIU offset DW-6
339     * PRDTableLength: Physical region descriptor length DW-7
340     * PRDTableOffset: Physical region descriptor offset DW-7
341     */
342    struct UTPTransferReqDesc {
343
344        /**
345         * struct RequestDescHeader
346         * dword0: Descriptor Header DW0
347         * dword1: Descriptor Header DW1
348         * dword2: Descriptor Header DW2
349         * dword3: Descriptor Header DW3
350         */
351        struct RequestDescHeader {
352            uint32_t dWord0;
353            uint32_t dWord1;
354            uint32_t dWord2;
355            uint32_t dWord3;
356        } header;
357
358        /* DW 4-5*/
359        uint32_t commandDescBaseAddrLo;
360        uint32_t commandDescBaseAddrHi;
361
362        /* DW 6 */
363        uint16_t responseUPIULength;
364        uint16_t responseUPIUOffset;
365
366        /* DW 7 */
367        uint16_t PRDTableLength;
368        uint16_t PRDTableOffset;
369    };
370
371    /**
372     * SCSI reply structure. In here is all the information that is needed to
373     * build a SCSI reply.
374     */
375    struct SCSIReply {
376        uint8_t status;
377        uint32_t msgSize;
378        uint8_t LUN;
379        struct UPIUMessage message;
380        uint8_t senseSize;
381        uint8_t expectMore;//0x01 is for writes, 0x02 is for reads
382        uint64_t offset;
383        uint8_t senseCode[19];
384    };
385
386    /**
387     * Logic unit information structure. SCSI requires information of each LUN.
388     * This structure is defined in the SCSI standard, and can also be found in
389     * the UFS standard. http://www.jedec.org/standards-documents/results/jesd220
390     */
391    struct LUNInfo {
392        uint32_t dWord0;
393        uint32_t dWord1;
394        uint32_t vendor0;
395        uint32_t vendor1;
396        uint32_t product0;
397        uint32_t product1;
398        uint32_t product2;
399        uint32_t product3;
400        uint32_t productRevision;
401    };
402
403    /**
404     * Different events, and scenarios require different types of information.
405     * Keep in mind that for a read-from-disk transaction the host at first a
406     * datastructure fetches to determine where and what the command is, then the
407     * command fetches and the structure fetches to determine where the
408     * different read transactions should be placed and then transfers all the
409     * read fragments. It then answers to the original caller with two replies,
410     * one for the command, and one for UFS. Each of these stages trigger a
411     * different event, and each event needs to know what happened in the
412     * previous stage and what is going to happen in the current one. This
413     * happens also for writes, SCSI maintanance, UFS maintanance, command
414     * management and task management.
415     */
416
417    /**
418     * Transfer information.
419     * @filePointer this does not point to a file, but to a position on the disk
420     * image (which is from the software systems perspective a position in a file)
421     */
422    struct transferInfo {
423        std::vector <uint8_t> buffer;
424        uint32_t size;
425        uint64_t offset;
426        uint32_t filePointer;
427        uint32_t lunID;
428    };
429
430    /**
431     * transfer completion info.
432     * This information is needed by transferDone to finish the transfer.
433     */
434    struct transferDoneInfo {
435        Addr responseStartAddr;
436        uint32_t reqPos;
437        struct UTPUPIURSP requestOut;
438        uint32_t size;
439        Addr address;
440        uint8_t *destination;
441        bool finished;
442        uint32_t lunID;
443    };
444
445    /**
446     * Transfer start information.
447     */
448    struct transferStart {
449        struct UTPTransferReqDesc* destination;
450        uint32_t mask;
451        Addr address;
452        uint32_t size;
453        uint32_t done;
454        uint32_t lun_id;
455    };
456
457    /**
458     * Task start information. This is for the device, so no lun id needed.
459     */
460    struct taskStart {
461        struct UTPUPIUTaskReq destination;
462        uint32_t mask;
463        Addr address;
464        uint32_t size;
465        bool done;
466    };
467
468    /**
469     * After a SCSI command has been identified, the SCSI resume function will
470     * handle it. This information will provide context information.
471     */
472    struct SCSIResumeInfo {
473        struct UTPTransferReqDesc* RequestIn;
474        int reqPos;
475        Addr finalAddress;
476        uint32_t finalSize;
477        std::vector <uint8_t> destination;
478        uint32_t done;
479    };
480
481    /**
482     * Disk transfer burst information. Needed to allow communication between the
483     * disk transactions and dma transactions.
484     */
485    struct writeToDiskBurst {
486        Addr start;
487        uint64_t SCSIDiskOffset;
488        uint32_t size;
489        uint32_t LUN;
490    };
491
492    /**
493     * Statistics
494     */
495    struct UFSHostDeviceStats {
496        /** Queue lengths */
497        Stats::Scalar currentSCSIQueue;
498        Stats::Scalar currentReadSSDQueue;
499        Stats::Scalar currentWriteSSDQueue;
500
501        /** Amount of data read/written */
502        Stats::Scalar totalReadSSD;
503        Stats::Scalar totalWrittenSSD;
504        Stats::Scalar totalReadDiskTransactions;
505        Stats::Scalar totalWriteDiskTransactions;
506        Stats::Scalar totalReadUFSTransactions;
507        Stats::Scalar totalWriteUFSTransactions;
508
509        /** Average bandwidth for reads and writes */
510        Stats::Formula averageReadSSDBW;
511        Stats::Formula averageWriteSSDBW;
512
513        /** Average Queue lengths*/
514        Stats::Average averageSCSIQueue;
515        Stats::Average averageReadSSDQueue;
516        Stats::Average averageWriteSSDQueue;
517
518        /** Number of doorbells rung*/
519        Stats::Formula curDoorbell;
520        Stats::Scalar maxDoorbell;
521        Stats::Average averageDoorbell;
522
523        /** Histogram of latencies*/
524        Stats::Histogram transactionLatency;
525        Stats::Histogram idleTimes;
526    };
527
528    /**
529     * device layer: This is your Logic unit
530     * This layer implements the SCSI functionality of the UFS Device
531     * One logic unit controls one or more disk partitions
532     */
533    class UFSSCSIDevice: SimObject
534    {
535      public:
536        /**
537         * Constructor and destructor
538         */
539        UFSSCSIDevice(const UFSHostDeviceParams* p, uint32_t lun_id, Callback*
540                      transfer_cb, Callback *read_cb);
541        ~UFSSCSIDevice();
542
543        /**
544         * SCSI command handle function; determines what the command is and
545         * returns a reply structure that allows the host device to continue
546         * with the transfer.
547         */
548        struct SCSIReply SCSICMDHandle(uint32_t* SCSI_msg);
549
550        /**
551         * Disk access functions. These will transfer the data from/to the disk
552         */
553
554        /**
555         * Read flash. read the data from the disk image. This function
556         * doesn't model timing behaviour
557         */
558        void readFlash(uint8_t* readaddr, uint64_t offset, uint32_t size);
559
560        /**
561         * Write flash. write the data to the disk image. This function
562         * doesn't model timing behaviour
563         */
564        void writeFlash(uint8_t* writeaddr, uint64_t offset, uint32_t size);
565
566        /**
567         * finished command. Probe to find out wether this logic unit
568         * finished its transfer and triggered the callback; The host needs
569         * this to handle the final part of the transaction.
570         */
571        bool finishedCommand() const {return transferCompleted;};
572
573        /**
574         * Clear signal. Handle for the host to clear the transfer complete
575         * signal.
576         */
577        void clearSignal() {transferCompleted = false;};
578
579        /**
580         * Finished read. Probe to find out which logic unit finished its
581         * read. This is needed, because multiple units can do transactions
582         * at the same time, and need to push back data at the right time in
583         * the right order. (because writes work the other way round, they do
584         * not need this mechanism)
585         */
586        bool finishedRead() const {return readCompleted;};
587
588        /**
589         * Clear signal. Handle for the host to clear the read complete
590         * signal.
591         */
592        void clearReadSignal() {readCompleted = false;};
593
594        /**
595         * Start the transactions to (and from) the disk
596         * The host will queue all the transactions. Once the next phase
597         * commences, this function should be started.
598         */
599        void SSDReadStart(uint32_t total_read);
600        void SSDWriteStart();
601
602        /**
603         * Sets total amount of write transactions that needs to be made.
604         * First they need to be fetched via DMA, so this value is needed in
605         * a later stage.
606         */
607        void setTotalWrite(uint32_t total_write) {totalWrite = total_write;};
608
609        /**
610         * End of transfer information
611         */
612        transferDoneInfo transferInfo;
613
614        /**
615         * Information message queues, as there can be multiple messages
616         * queued for handling in this system. These are the main
617         * communication interfaces between the Host and the device layers
618         */
619
620        /**
621         * SCSIInfoQueue: each LU handles its own SCSI commands.
622         */
623        std::deque<struct SCSIResumeInfo> SCSIInfoQueue;
624
625        /**
626         * SSDReadInfo: Structure from disk to dma, that contains data, and
627         * helper info to get it to the right place in the memory.
628         */
629        std::deque<struct transferInfo> SSDReadInfo;
630
631        /**
632         * SSDWriteDoneInfo: Structure from dma to disk, that contains data,
633         * and helper info to get it to the right place in the memory.
634         * The done is added because it is going to the last phase of the
635         * write transfer.
636         */
637        std::deque<struct transferInfo> SSDWriteDoneInfo;
638
639      private:
640        /**
641         * Functions to indicate that the action to the SSD has completed.
642         */
643        /**
644         * Read Call back; This is the callback function for the memory model
645         */
646        void readCallback();
647
648        /**
649         * SSD Read done; Determines if the final callback of the transaction
650         * should be made at the end of a read transfer.
651         */
652        void SSDReadDone();
653
654        /**
655         * SSD Write Done; This is the callback function for the memory model.
656         */
657        void SSDWriteDone();
658
659        /**
660         * Status of SCSI. This may be linked to a status check in the future.
661         * For now it (mainly) fills a data structure with sense information
662         * for a successfull transaction
663         */
664        void statusCheck(uint8_t status, uint8_t* sensecodelist);
665
666        /**
667         * set signal to indicate that the transaction has been completed.
668         */
669        void setSignal() {transferCompleted = true;};
670
671        /**
672         * set signal to indicate that the read action has been completed
673         */
674        void setReadSignal() {readCompleted = true;};
675
676        /**
677         * The objects this model links to.
678         * 1: the disk data model
679         * 2: the memory timing model
680         */
681        DiskImage* flashDisk;
682        AbstractNVM* flashDevice;
683
684        /**
685         * Logic unit dimensions
686         */
687        const uint32_t blkSize;
688        const uint32_t lunAvail;
689        const uint64_t diskSize;
690        const uint32_t capacityLower;
691        const uint32_t capacityUpper;
692
693        /**
694         * Logic unit info; needed for SCSI Info messages and LU
695         * identification
696         */
697        struct LUNInfo lunInfo;
698        const uint32_t lunID;
699
700        /**
701         * Signals to Host layer
702         * 1: signal for transaction completion
703         * 2: signal for read action completion
704         */
705        bool transferCompleted;
706        bool readCompleted;
707
708        /**
709         * Total amount transactions that need to be made
710         */
711        uint32_t totalRead;
712        uint32_t totalWrite;
713
714        /**
715         * transaction progress tracking
716         */
717        uint32_t amountOfWriteTransfers;
718        uint32_t amountOfReadTransfers;
719
720        /**
721         * Callbacks between Host and Device
722         */
723        Callback* signalDone;
724        Callback* deviceReadCallback;
725
726        /**
727         * Callbacks between Device and Memory
728         */
729        Callback* memReadCallback;
730        Callback* memWriteCallback;
731
732        /*
733         * Default response header layout. For more information refer to
734         * chapter 7 http://www.jedec.org/standards-documents/results/jesd220
735         */
736        static const unsigned int UPIUHeaderDataIndWord0 = 0x0000C022;
737        static const unsigned int UPIUHeaderDataIndWord1 = 0x00000000;
738        static const unsigned int UPIUHeaderDataIndWord2 = 0x40000000;
739
740        /*
741         * SCSI mode pages values assigned in ufs_device.cc
742         * The mode pages give device specific information via the SCSI
743         * protocol. They are defined in
744         * http://www.jedec.org/standards-documents/results/jesd220
745         */
746        static const unsigned int controlPage[3];
747        static const unsigned int recoveryPage[3];
748        static const unsigned int cachingPage[5];
749
750        /*
751         * SCSI command set; defined in
752         * http://www.jedec.org/standards-documents/results/jesd220
753         */
754        enum SCSICommandSet {
755            SCSIInquiry = 0x12,
756            SCSIRead6 = 0x08,
757            SCSIRead10 = 0x28,
758            SCSIRead16 = 0x88,
759            SCSIReadCapacity10 = 0x25,
760            SCSIReadCapacity16 = 0x9E,
761            SCSIReportLUNs = 0xA0,
762            SCSIStartStop = 0x1B,
763            SCSITestUnitReady = 0x00,
764            SCSIVerify10 = 0x2F,
765            SCSIWrite6 = 0x0A,
766            SCSIWrite10 = 0x2A,
767            SCSIWrite16 = 0x8A,
768            SCSIFormatUnit = 0x04,
769            SCSISendDiagnostic = 0x1D,
770            SCSISynchronizeCache = 0x35,
771            //UFS SCSI additional command set for full functionality
772            SCSIModeSelect10 = 0x55,
773            SCSIModeSense6 = 0x1A,
774            SCSIModeSense10 = 0x5A,
775            SCSIRequestSense = 0x03,
776            SCSIUnmap = 0x42,
777            SCSIWriteBuffer = 0x3B,
778            SCSIReadBuffer = 0x3C,
779            //SCSI commands not supported by UFS; but Linux send them anyway
780            SCSIMaintenanceIn = 0xA3
781        };
782
783        /*
784         * SCSI status codes; defined in
785         * http://www.jedec.org/standards-documents/results/jesd220
786         */
787        enum SCSIStatusCodes {
788            SCSIGood = 0x00,
789            SCSICheckCondition = 0x02,
790            SCSIConditionGood = 0x04,
791            SCSIBusy = 0x08,
792            SCSIIntermediateGood = 0x10,
793            SCSIIntermediatCGood = 0x14,
794            SCSIReservationConflict = 0x18,
795            SCSICommandTerminated = 0x22,
796            SCSITaskSetFull = 0x28,
797            SCSIACAActive = 0x30,
798            SCSITaskAborted = 0x40
799        };
800
801        /*
802         * SCSI sense codes; defined in
803         * http://www.jedec.org/standards-documents/results/jesd220
804         */
805        enum SCSISenseCodes {
806            SCSINoSense = 0x00,
807            SCSIRecoverdError = 0x01,
808            SCSINotReady = 0x02,
809            SCSIMediumError = 0x03,
810            SCSIHardwareError = 0x04,
811            SCSIIllegalRequest = 0x05,
812            SCSIUnitAttention = 0x06,
813            SCSIDataProtect = 0x07,
814            SCSIBlankCheck = 0x08,
815            SCSIAbortedCommand = 0x0B,
816            SCSIVolumeOverflow = 0x0D,
817            SCSIMisCompare = 0x0E
818        };
819
820    };
821
822    //All access functions are inherrited; no need to make them public
823    /**
824     * Address range functions
825     */
826    AddrRangeList getAddrRanges() const override;
827
828    /**
829     * register access functions
830     */
831    Tick read(PacketPtr pkt) override;
832    Tick write(PacketPtr pkt) override;
833    // end of access functions
834
835    /**
836     * Initialization function. Sets the sefault HCI register values
837     */
838    void setValues();
839
840    /**
841     * Handler functions. Each function handles a different stage of the
842     * transfer. Note that the UFS protocol specifies three types of messages
843     * to the host (and devices):
844     * 1: Command (to Host specifically)
845     * 2: Task (to device; to control flow, not for data)
846     * 3: Transfer (to device; to transfer data)
847     */
848    /**
849     * request handler. This function finds the cause of the request and
850     * triggers the right follow-up action (command handler, task handler,
851     * or transferhandler)
852     */
853    void requestHandler();
854
855    /**
856     * Command handler function. Handles the command send to the Host
857     * controller
858     */
859    void commandHandler();
860
861    /**
862     * Task Start function. Starts the task handler once the task data
863     * structure has arrived
864     */
865    void taskStart();
866
867    /**
868     * Task handler function. Handles the tasks send to the devices
869     * because there are not many tasks implemented yet this is kept in the
870     * Host controller layer
871     */
872    void taskHandler(struct UTPUPIUTaskReq* request_in,
873                     uint32_t req_pos, Addr finaladdress, uint32_t finalsize);
874
875    /**
876     * Transfer Start function. Starts the transfer handler once the transfer
877     * data structure has arrived
878     */
879    void transferStart();
880
881    /**
882     * Transfer handler function. Handles the transfers send to the devices
883     * Important to understand here is that a Logic unit is not a device (a
884     * device can contain multiple logic units). This function analyses the
885     * first data structure that has been transfered. Which will tell the
886     * host to expect SCSI frames for the rest of the transaction. Note that
887     * the host has no indication whatsoever which LU to address. That will
888     * follow in the next transaction.
889     */
890    void transferHandler(struct UTPTransferReqDesc*
891                         request_in, int req_pos, Addr finaladdress,
892                         uint32_t finalsize, uint32_t done);
893
894    /**
895     * Transfer SCSI function. Determines which Logic unit to address and
896     * starts the SCSI resume function
897     */
898    void SCSIStart();
899
900    /**
901     * Starts the scsi handling function in the apropriate Logic unit,
902     * prepares the right data transfer scheme and kicks it off.
903     */
904    void SCSIResume(uint32_t lun_id);
905
906    /**
907     * LU callback function to indicate that the action has completed.
908     */
909    void LUNSignal();
910
911    /**
912     * transfer done, the beginning of the final stage of the transfer.
913     * Acknowledges UPIU frame and prepares the UTP response frame
914     */
915    void transferDone(Addr responseStartAddr, uint32_t req_pos,
916                      struct UTPUPIURSP request_out, uint32_t size,
917                      Addr address, uint8_t* destination, bool finished,
918                      uint32_t lun_id);
919    /**
920     * final UTP, sends the last acknowledge data structure to the system;
921     * prepares the clean up functions.
922     */
923    void finalUTP();
924
925    /**
926     * Interrupt control functions
927     */
928    void clearInterrupt();
929    void generateInterrupt();
930
931    /**
932     * DMA transfer functions
933     * These allow the host to push/pull the data to the memory
934     * The provided event indicates what the next phase it that will handle
935     * the obtained data, or what the follow up action is once the data has
936     * been pushed to the memory
937     */
938    void writeDevice(Event* additional_action, bool toDisk, Addr start,
939                     int size, uint8_t* destination, uint64_t SCSIDiskOffset,
940                     uint32_t lun_id);
941    void readDevice(bool lastTransfer, Addr SCSIStart, uint32_t SCSISize,
942                    uint8_t* SCSIDestination, bool no_cache,
943                    Event* additional_action);
944
945    /**
946     * Disk transfer management functions
947     * these set up the queues, and initiated them, leading to the data
948     * transaction timing model based on the scatter gather list constructed
949     * in SCSIresume.
950     */
951    void manageWriteTransfer(uint8_t LUN, uint64_t offset, uint32_t
952                             sg_table_length, struct UFSHCDSGEntry* sglist);
953    void manageReadTransfer(uint32_t size, uint32_t LUN, uint64_t offset,
954                            uint32_t sg_table_length,
955                            struct UFSHCDSGEntry* sglist);
956
957    /**
958     * Read done
959     * Started at the end of a transaction after the last read action. Cleans
960     * up UTP descriptor and other remaining data structures. It also raises
961     * the interrupt.
962     */
963    void readDone();
964
965    /**
966     * Write done
967     * After a DMA write with data intended for the disk, this function is
968     * called. It ensures that the disk image is modified, and that the
969     * correct timing function is triggered.
970     */
971    void writeDone();
972
973    /**
974     * Read callback
975     * Call back function for the logic units to indicate the completion of
976     * a read action. Note that this is needed because the read functionality
977     * needs to push data structures back to the memory.
978     */
979    void readCallback();
980
981    /**
982     * Read garbage
983     * A read from disk data structure can vary in size and is therefor
984     * allocated on creation. It can only be destroyed once that particular
985     * read action has completed. This function is called on completion of a
986     * read from disk action to handle this.
987     */
988    void readGarbage();
989
990    /**register statistics*/
991    void regStats() override;
992
993    /**
994     * Host controller information
995     */
996    const Addr pioAddr;
997    const Addr pioSize;
998    const Tick pioDelay;
999    const int intNum;
1000    BaseGic* gic;
1001    const uint32_t lunAvail;
1002    const uint8_t UFSSlots;
1003
1004    /**
1005     * Host controller memory
1006     */
1007    HCIMem UFSHCIMem;
1008
1009    /**
1010     * Track number of DMA transactions in progress
1011     */
1012    int readPendingNum;
1013    int writePendingNum;
1014
1015    /**
1016     * Statistics helper variables
1017     * Active doorbells indicates how many doorbells are in teh process of
1018     * being handled.
1019     * Pending doorbells have been handled and are waiting to be acknowledged
1020     * by the host system.
1021     * The doorbell register is 32 bits wide, so one byte is enough to keep
1022     * track of the numbers
1023     */
1024    uint8_t activeDoorbells;
1025    uint8_t pendingDoorbells;
1026
1027    /**
1028     * interrupt verification
1029     * This keeps track of the number of interrupts generated. It is usefull
1030     * for debug purposes. Make sure that the implemented driver prints the
1031     * number of interrupts it has handled so far to fully benefit from this
1032     * feature.
1033     */
1034    uint32_t countInt;
1035
1036    /**
1037     * Track the transfer
1038     * This is allows the driver to "group" certain transfers together by
1039     * using a tag in the UPIU. The messages with the same tag should be
1040     * handled together, i.e. their doorbells should be cleared when they are
1041     * all done. but we need to keep track of the ones we already handled,
1042     * this integer shadows the doorbells to allow this behaviour.
1043     */
1044    uint32_t transferTrack;
1045    uint32_t taskCommandTrack;
1046
1047    /**
1048     * Helper for latency stats
1049     * These variables keep track of the latency for every doorbell.
1050     * Eventually the latenmcies will be put in a histogram.
1051     */
1052    Tick transactionStart[32];
1053    Tick idlePhaseStart;
1054
1055    /**
1056     * logic units connected to the UFS Host device
1057     * Note again that the "device" as such is represented by one or multiple
1058     * logic units.
1059     */
1060    std::vector<UFSSCSIDevice*> UFSDevice;
1061
1062    /**
1063     * SCSI reply structure, used for direct answering. Might be refered to
1064     * during the assembly of the reply (data, and response; e.g. if
1065     * something goes wrong along the way, the reply will be different)
1066     */
1067    struct SCSIReply request_out_datain;
1068
1069    /**
1070     * SCSI resume info
1071     * information structure for SCSI resume. it keeps track of all the
1072     * information that is needed to successfully complete the transaction
1073     * (response addresses, communicated information so far, etc.).
1074     */
1075    struct SCSIResumeInfo SCSIInfo;
1076
1077    /**
1078     * To finish the transaction one needs information about the original
1079     * message. This is stored in this queue
1080     * transferEnd uses the same structure as transferStartInfo, because all
1081     * the information it needs is in there. It improves readability in the
1082     * cc file.
1083     */
1084    std::deque<struct transferStart> transferEnd;
1085
1086    /**
1087     * When a task/transfer is started it needs information about the
1088     * task/transfer it is about to perform. This is defined in these
1089     * structures. If multiple tasks/transfers are issued at the same time,
1090     * they still need to be fetched one by one. They then need to be
1091     * executed in the order specified by the UFS standard (least significant
1092     * doorbell first). The tasks/transfers are placed in the queue in that
1093     * specific order.
1094     */
1095    std::deque<struct taskStart> taskInfo;
1096    std::deque<struct transferStart> transferStartInfo;
1097
1098    /**
1099     * Information to get a DMA transaction
1100     */
1101    std::deque<struct writeToDiskBurst> dmaWriteInfo;
1102
1103    /**
1104     * Information from DMA transaction to disk
1105     */
1106    std::deque<struct transferInfo> SSDWriteinfo;
1107
1108    /**
1109     * Information from the Disk, waiting to be pushed to the DMA
1110     */
1111    std::deque<struct transferInfo> SSDReadPending;
1112
1113    /**
1114     * garbage queue, ensure clearing of the allocated memory
1115     */
1116    std::deque<struct UTPTransferReqDesc*> garbage;
1117
1118    /**
1119     * RequestHandler stats
1120     */
1121    struct UFSHostDeviceStats stats;
1122
1123    /**
1124     * Transfer flow events
1125     * Basically these events form two queues, one from memory to UFS device
1126     * (DMA) and one from device to flash (SSD). The SSD "queue" is
1127     * maintained by the flash and the lun classes and does not form a queue
1128     * of events as such, but rather a queue of information. This can be done
1129     * because the flow of the events is completely in the control of these
1130     * classes. (Whereas in the DMA case we rely on an external class)
1131     */
1132    std::deque<EventFunctionWrapper> readDoneEvent;
1133    std::deque<EventFunctionWrapper> writeDoneEvent;
1134
1135    /**
1136     * Callbacks for the logic units. One to indicate the completion of a
1137     * transaction, the other one to indicate the completion of a read
1138     * action.
1139     */
1140    Callback* transferDoneCallback;
1141    Callback* memReadCallback;
1142
1143    /**
1144     * The events that control the functionality.
1145     * After a doorbell has been set, either a taskevent or a transfer event
1146     * is scheduled. A transfer event might schedule a SCSI event, all events
1147     * sequences end with an UTP event, which can be considered as the event
1148     * which answers the doorbell.
1149     */
1150    /**
1151     * Wait for the SCSI specific data to arive
1152     */
1153    EventWrapper<UFSHostDevice, &UFSHostDevice::SCSIStart> SCSIResumeEvent;
1154
1155    /**
1156     * Wait for the moment where we can send the last frame
1157     */
1158    EventWrapper<UFSHostDevice, &UFSHostDevice::finalUTP> UTPEvent;
1159
1160    /**
1161     * Event after a read to clean up the UTP data structures
1162     */
1163    std::deque<EventWrapper<UFSHostDevice, &UFSHostDevice::readGarbage> >
1164    readGarbageEventQueue;
1165
1166    /**
1167     * Multiple tasks transfers can be scheduled at once for the device, the
1168     * only thing we know for sure about them is that they will happen in a
1169     * first come first serve order; hence we need to queue.
1170     */
1171    std::deque<EventWrapper<UFSHostDevice, &UFSHostDevice::taskStart> >
1172    taskEventQueue;
1173    std::deque<EventWrapper<UFSHostDevice, &UFSHostDevice::transferStart> >
1174    transferEventQueue;
1175
1176    /**
1177     * Bits of interest within UFS data packages
1178     */
1179    static const unsigned int UTPTransferREQCOMPL = 0x01;//UFS_BIT(0)
1180    static const unsigned int UTPTaskREQCOMPL = 0x200;//UFS_BIT(9)
1181    static const unsigned int UICCommandCOMPL = 0x400;//UFS_BIT(10)
1182    static const unsigned int UICCommandReady = 0x08;//UFS_BIT(3)
1183
1184    /*
1185     * UFSHCI Registers; please refer to
1186     * http://www.jedec.org/standards-documents/results/jesd223
1187     * for their definition.
1188     */
1189    enum UFSHCIRegisters {
1190        regControllerCapabilities = 0x00,
1191        regUFSVersion = 0x08,
1192        regControllerDEVID = 0x10,
1193        regControllerPRODID = 0x14,
1194        regInterruptStatus = 0x20,
1195        regInterruptEnable = 0x24,
1196        regControllerStatus = 0x30,
1197        regControllerEnable = 0x34,
1198        regUICErrorCodePHYAdapterLayer = 0x38,
1199        regUICErrorCodeDataLinkLayer = 0x3C,
1200        regUICErrorCodeNetworkLayer = 0x40,
1201        regUICErrorCodeTransportLayer = 0x44,
1202        regUICErrorCodeDME = 0x48,
1203        regUTPTransferREQINTAGGControl = 0x4C,
1204        regUTPTransferREQListBaseL = 0x50,
1205        regUTPTransferREQListBaseH = 0x54,
1206        regUTPTransferREQDoorbell = 0x58,
1207        regUTPTransferREQListClear = 0x5C,
1208        regUTPTransferREQListRunStop = 0x60,
1209        regUTPTaskREQListBaseL = 0x70,
1210        regUTPTaskREQListBaseH = 0x74,
1211        regUTPTaskREQDoorbell = 0x78,
1212        regUTPTaskREQListClear = 0x7C,
1213        regUTPTaskREQListRunStop = 0x80,
1214        regUICCommand = 0x90,
1215        regUICCommandArg1 = 0x94,
1216        regUICCommandArg2 = 0x98,
1217        regUICCommandArg3 = 0x9C
1218    };
1219};
1220
1221#endif //__DEV_ARM_UFS_DEVICE_HH__
1222