flash_device.hh revision 10905
110801Srene.dejong@arm.com/*
210801Srene.dejong@arm.com * Copyright (c) 2013-2015 ARM Limited
310801Srene.dejong@arm.com * All rights reserved
410801Srene.dejong@arm.com *
510801Srene.dejong@arm.com * The license below extends only to copyright in the software and shall
610801Srene.dejong@arm.com * not be construed as granting a license to any other intellectual
710801Srene.dejong@arm.com * property including but not limited to intellectual property relating
810801Srene.dejong@arm.com * to a hardware implementation of the functionality of the software
910801Srene.dejong@arm.com * licensed hereunder.  You may use the software subject to the license
1010801Srene.dejong@arm.com * terms below provided that you ensure that this notice is replicated
1110801Srene.dejong@arm.com * unmodified and in its entirety in all distributions of the software,
1210801Srene.dejong@arm.com * modified or unmodified, in source code or in binary form.
1310801Srene.dejong@arm.com *
1410801Srene.dejong@arm.com * Redistribution and use in source and binary forms, with or without
1510801Srene.dejong@arm.com * modification, are permitted provided that the following conditions are
1610801Srene.dejong@arm.com * met: redistributions of source code must retain the above copyright
1710801Srene.dejong@arm.com * notice, this list of conditions and the following disclaimer;
1810801Srene.dejong@arm.com * redistributions in binary form must reproduce the above copyright
1910801Srene.dejong@arm.com * notice, this list of conditions and the following disclaimer in the
2010801Srene.dejong@arm.com * documentation and/or other materials provided with the distribution;
2110801Srene.dejong@arm.com * neither the name of the copyright holders nor the names of its
2210801Srene.dejong@arm.com * contributors may be used to endorse or promote products derived from
2310801Srene.dejong@arm.com * this software without specific prior written permission.
2410801Srene.dejong@arm.com *
2510801Srene.dejong@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2610801Srene.dejong@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2710801Srene.dejong@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2810801Srene.dejong@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2910801Srene.dejong@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3010801Srene.dejong@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3110801Srene.dejong@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3210801Srene.dejong@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3310801Srene.dejong@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3410801Srene.dejong@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3510801Srene.dejong@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3610801Srene.dejong@arm.com *
3710801Srene.dejong@arm.com * Authors: Rene de Jong
3810801Srene.dejong@arm.com */
3910801Srene.dejong@arm.com#ifndef __DEV_ARM_FLASH_DEVICE_HH__
4010801Srene.dejong@arm.com#define __DEV_ARM_FLASH_DEVICE_HH__
4110801Srene.dejong@arm.com
4210801Srene.dejong@arm.com#include <deque>
4310801Srene.dejong@arm.com
4410801Srene.dejong@arm.com#include "base/statistics.hh"
4510801Srene.dejong@arm.com#include "debug/FlashDevice.hh"
4610801Srene.dejong@arm.com#include "dev/arm/abstract_nvm.hh"
4710801Srene.dejong@arm.com#include "enums/DataDistribution.hh"
4810801Srene.dejong@arm.com#include "params/FlashDevice.hh"
4910801Srene.dejong@arm.com#include "sim/serialize.hh"
5010801Srene.dejong@arm.com
5110801Srene.dejong@arm.com/**
5210801Srene.dejong@arm.com * Flash Device model
5310801Srene.dejong@arm.com * The Flash Device model is a timing model for a NAND flash device.
5410801Srene.dejong@arm.com * It doesn't tranfer any data
5510801Srene.dejong@arm.com */
5610801Srene.dejong@arm.comclass FlashDevice : public AbstractNVM
5710801Srene.dejong@arm.com{
5810801Srene.dejong@arm.com  public:
5910801Srene.dejong@arm.com
6010801Srene.dejong@arm.com    /** Initialize functions*/
6110801Srene.dejong@arm.com    FlashDevice(const FlashDeviceParams*);
6210801Srene.dejong@arm.com    ~FlashDevice();
6310801Srene.dejong@arm.com
6410801Srene.dejong@arm.com    /** Checkpoint functions*/
6510801Srene.dejong@arm.com    unsigned int drain(DrainManager *dm);
6610801Srene.dejong@arm.com    void checkDrain();
6710905Sandreas.sandberg@arm.com
6810905Sandreas.sandberg@arm.com    void serialize(CheckpointOut &cp) const M5_ATTR_OVERRIDE;
6910905Sandreas.sandberg@arm.com    void unserialize(CheckpointIn &cp) M5_ATTR_OVERRIDE;
7010801Srene.dejong@arm.com
7110801Srene.dejong@arm.com  private:
7210801Srene.dejong@arm.com    /** Defines the possible actions to the flash*/
7310801Srene.dejong@arm.com    enum Actions {
7410801Srene.dejong@arm.com        ActionRead,
7510801Srene.dejong@arm.com        ActionWrite,
7610801Srene.dejong@arm.com        ActionErase,
7710801Srene.dejong@arm.com        /**
7810801Srene.dejong@arm.com         * A copy involves taking all the used pages from a block and store
7910801Srene.dejong@arm.com         *  it in another
8010801Srene.dejong@arm.com         */
8110801Srene.dejong@arm.com        ActionCopy
8210801Srene.dejong@arm.com    };
8310801Srene.dejong@arm.com
8410801Srene.dejong@arm.com    /** Every logical address maps to a physical block and a physical page*/
8510801Srene.dejong@arm.com    struct PageMapEntry {
8610801Srene.dejong@arm.com        uint32_t page;
8710801Srene.dejong@arm.com        uint32_t block;
8810801Srene.dejong@arm.com    };
8910801Srene.dejong@arm.com
9010801Srene.dejong@arm.com    struct CallBackEntry {
9110801Srene.dejong@arm.com        Tick time;
9210801Srene.dejong@arm.com        Callback *function;
9310801Srene.dejong@arm.com    };
9410801Srene.dejong@arm.com
9510801Srene.dejong@arm.com    struct FlashDeviceStats {
9610801Srene.dejong@arm.com        /** Amount of GC activations*/
9710801Srene.dejong@arm.com        Stats::Scalar totalGCActivations;
9810801Srene.dejong@arm.com
9910801Srene.dejong@arm.com        /** Histogram of address accesses*/
10010801Srene.dejong@arm.com        Stats::Histogram writeAccess;
10110801Srene.dejong@arm.com        Stats::Histogram readAccess;
10210801Srene.dejong@arm.com        Stats::Histogram fileSystemAccess;
10310801Srene.dejong@arm.com
10410801Srene.dejong@arm.com        /** Histogram of access latencies*/
10510801Srene.dejong@arm.com        Stats::Histogram writeLatency;
10610801Srene.dejong@arm.com        Stats::Histogram readLatency;
10710801Srene.dejong@arm.com    };
10810801Srene.dejong@arm.com
10910801Srene.dejong@arm.com    /** Device access functions Inherrited from AbstractNVM*/
11010801Srene.dejong@arm.com    virtual void initializeMemory(uint64_t disk_size, uint32_t sector_size)
11110801Srene.dejong@arm.com    {
11210801Srene.dejong@arm.com        initializeFlash(disk_size, sector_size);
11310801Srene.dejong@arm.com    }
11410801Srene.dejong@arm.com
11510801Srene.dejong@arm.com    virtual void readMemory(uint64_t address, uint32_t amount,
11610801Srene.dejong@arm.com                            Callback *event)
11710801Srene.dejong@arm.com    {
11810801Srene.dejong@arm.com        accessDevice(address, amount, event, ActionRead);
11910801Srene.dejong@arm.com    }
12010801Srene.dejong@arm.com    virtual void writeMemory(uint64_t address, uint32_t amount,
12110801Srene.dejong@arm.com                             Callback *event)
12210801Srene.dejong@arm.com    {
12310801Srene.dejong@arm.com        accessDevice(address, amount, event, ActionWrite);
12410801Srene.dejong@arm.com    }
12510801Srene.dejong@arm.com
12610801Srene.dejong@arm.com    /**Initialization function; called when all disk specifics are known*/
12710801Srene.dejong@arm.com    void initializeFlash(uint64_t disk_size, uint32_t sector_size);
12810801Srene.dejong@arm.com
12910801Srene.dejong@arm.com    /**Flash action function*/
13010801Srene.dejong@arm.com    void accessDevice(uint64_t address, uint32_t amount, Callback *event,
13110801Srene.dejong@arm.com                      Actions action);
13210801Srene.dejong@arm.com
13310801Srene.dejong@arm.com    /** Event rescheduler*/
13410801Srene.dejong@arm.com    void actionComplete();
13510801Srene.dejong@arm.com
13610801Srene.dejong@arm.com    /** FTL functionality */
13710801Srene.dejong@arm.com    Tick remap(uint64_t logic_page_addr);
13810801Srene.dejong@arm.com
13910801Srene.dejong@arm.com    /** Access time calculator*/
14010801Srene.dejong@arm.com    Tick accessTimes(uint64_t address, Actions accesstype);
14110801Srene.dejong@arm.com
14210801Srene.dejong@arm.com    /** Function to indicate that a page is known*/
14310801Srene.dejong@arm.com    void clearUnknownPages(uint32_t index);
14410801Srene.dejong@arm.com
14510801Srene.dejong@arm.com    /** Function to test if a page is known*/
14610801Srene.dejong@arm.com    bool getUnknownPages(uint32_t index);
14710801Srene.dejong@arm.com
14810801Srene.dejong@arm.com    /**Stats register function*/
14910801Srene.dejong@arm.com    void regStats();
15010801Srene.dejong@arm.com
15110801Srene.dejong@arm.com    /** Disk sizes in bytes */
15210801Srene.dejong@arm.com    uint64_t diskSize;
15310801Srene.dejong@arm.com    const uint32_t blockSize;
15410801Srene.dejong@arm.com    const uint32_t pageSize;
15510801Srene.dejong@arm.com
15610801Srene.dejong@arm.com    /** Garbage collection algorithm emulator */
15710801Srene.dejong@arm.com    const uint32_t GCActivePercentage;
15810801Srene.dejong@arm.com
15910801Srene.dejong@arm.com    /** Access latencies */
16010801Srene.dejong@arm.com    const Tick readLatency;
16110801Srene.dejong@arm.com    const Tick writeLatency;
16210801Srene.dejong@arm.com    const Tick eraseLatency;
16310801Srene.dejong@arm.com
16410801Srene.dejong@arm.com    /** Flash organization */
16510801Srene.dejong@arm.com    const Enums::DataDistribution dataDistribution;
16610801Srene.dejong@arm.com    const uint32_t numPlanes;
16710801Srene.dejong@arm.com
16810801Srene.dejong@arm.com    /** RequestHandler stats */
16910801Srene.dejong@arm.com    struct FlashDeviceStats stats;
17010801Srene.dejong@arm.com
17110801Srene.dejong@arm.com    /** Disk dimensions in pages and blocks */
17210801Srene.dejong@arm.com    uint32_t pagesPerBlock;
17310801Srene.dejong@arm.com    uint32_t pagesPerDisk;
17410801Srene.dejong@arm.com    uint32_t blocksPerDisk;
17510801Srene.dejong@arm.com
17610801Srene.dejong@arm.com    uint32_t planeMask;
17710801Srene.dejong@arm.com
17810801Srene.dejong@arm.com    /**
17910801Srene.dejong@arm.com     * drain manager
18010801Srene.dejong@arm.com     * Needed to be able to implement checkpoint functionality
18110801Srene.dejong@arm.com     */
18210801Srene.dejong@arm.com
18310801Srene.dejong@arm.com    DrainManager *drainManager;
18410801Srene.dejong@arm.com
18510801Srene.dejong@arm.com    /**
18610801Srene.dejong@arm.com     * when the disk is first started we are unsure of the number of
18710801Srene.dejong@arm.com     * used pages, this variable will help determining what we do know.
18810801Srene.dejong@arm.com     */
18910801Srene.dejong@arm.com    std::vector<uint32_t> unknownPages;
19010801Srene.dejong@arm.com    /** address to logic place has a block and a page field*/
19110801Srene.dejong@arm.com    std::vector<struct PageMapEntry> locationTable;
19210801Srene.dejong@arm.com    /** number of valid entries per block*/
19310801Srene.dejong@arm.com    std::vector<uint32_t> blockValidEntries;
19410801Srene.dejong@arm.com    /** number of empty entries*/
19510801Srene.dejong@arm.com    std::vector<uint32_t> blockEmptyEntries;
19610801Srene.dejong@arm.com
19710801Srene.dejong@arm.com    /**This vector of queues keeps track of all the callbacks per plane*/
19810801Srene.dejong@arm.com    std::vector<std::deque<struct CallBackEntry> > planeEventQueue;
19910801Srene.dejong@arm.com
20010801Srene.dejong@arm.com    /** Completion event */
20110801Srene.dejong@arm.com    EventWrapper<FlashDevice, &FlashDevice::actionComplete> planeEvent;
20210801Srene.dejong@arm.com};
20310801Srene.dejong@arm.com#endif //__DEV_ARM_FLASH_DEVICE_HH__
204