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*/
6511168Sandreas.hansson@arm.com    DrainState drain() override;
6610801Srene.dejong@arm.com    void checkDrain();
6710905Sandreas.sandberg@arm.com
6811168Sandreas.hansson@arm.com    void serialize(CheckpointOut &cp) const override;
6911168Sandreas.hansson@arm.com    void unserialize(CheckpointIn &cp) 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*/
11011174Sandreas.hansson@arm.com    void initializeMemory(uint64_t disk_size, uint32_t sector_size) override
11110801Srene.dejong@arm.com    {
11210801Srene.dejong@arm.com        initializeFlash(disk_size, sector_size);
11310801Srene.dejong@arm.com    }
11410801Srene.dejong@arm.com
11511174Sandreas.hansson@arm.com    void readMemory(uint64_t address, uint32_t amount,
11611174Sandreas.hansson@arm.com                    Callback *event) override
11710801Srene.dejong@arm.com    {
11810801Srene.dejong@arm.com        accessDevice(address, amount, event, ActionRead);
11910801Srene.dejong@arm.com    }
12011174Sandreas.hansson@arm.com
12111174Sandreas.hansson@arm.com    void writeMemory(uint64_t address, uint32_t amount,
12211174Sandreas.hansson@arm.com                     Callback *event) override
12310801Srene.dejong@arm.com    {
12410801Srene.dejong@arm.com        accessDevice(address, amount, event, ActionWrite);
12510801Srene.dejong@arm.com    }
12610801Srene.dejong@arm.com
12710801Srene.dejong@arm.com    /**Initialization function; called when all disk specifics are known*/
12810801Srene.dejong@arm.com    void initializeFlash(uint64_t disk_size, uint32_t sector_size);
12910801Srene.dejong@arm.com
13010801Srene.dejong@arm.com    /**Flash action function*/
13110801Srene.dejong@arm.com    void accessDevice(uint64_t address, uint32_t amount, Callback *event,
13210801Srene.dejong@arm.com                      Actions action);
13310801Srene.dejong@arm.com
13410801Srene.dejong@arm.com    /** Event rescheduler*/
13510801Srene.dejong@arm.com    void actionComplete();
13610801Srene.dejong@arm.com
13710801Srene.dejong@arm.com    /** FTL functionality */
13810801Srene.dejong@arm.com    Tick remap(uint64_t logic_page_addr);
13910801Srene.dejong@arm.com
14010801Srene.dejong@arm.com    /** Access time calculator*/
14110801Srene.dejong@arm.com    Tick accessTimes(uint64_t address, Actions accesstype);
14210801Srene.dejong@arm.com
14310801Srene.dejong@arm.com    /** Function to indicate that a page is known*/
14410801Srene.dejong@arm.com    void clearUnknownPages(uint32_t index);
14510801Srene.dejong@arm.com
14610801Srene.dejong@arm.com    /** Function to test if a page is known*/
14710801Srene.dejong@arm.com    bool getUnknownPages(uint32_t index);
14810801Srene.dejong@arm.com
14910801Srene.dejong@arm.com    /**Stats register function*/
15011174Sandreas.hansson@arm.com    void regStats() override;
15110801Srene.dejong@arm.com
15210801Srene.dejong@arm.com    /** Disk sizes in bytes */
15310801Srene.dejong@arm.com    uint64_t diskSize;
15410801Srene.dejong@arm.com    const uint32_t blockSize;
15510801Srene.dejong@arm.com    const uint32_t pageSize;
15610801Srene.dejong@arm.com
15710801Srene.dejong@arm.com    /** Garbage collection algorithm emulator */
15810801Srene.dejong@arm.com    const uint32_t GCActivePercentage;
15910801Srene.dejong@arm.com
16010801Srene.dejong@arm.com    /** Access latencies */
16110801Srene.dejong@arm.com    const Tick readLatency;
16210801Srene.dejong@arm.com    const Tick writeLatency;
16310801Srene.dejong@arm.com    const Tick eraseLatency;
16410801Srene.dejong@arm.com
16510801Srene.dejong@arm.com    /** Flash organization */
16610801Srene.dejong@arm.com    const Enums::DataDistribution dataDistribution;
16710801Srene.dejong@arm.com    const uint32_t numPlanes;
16810801Srene.dejong@arm.com
16910801Srene.dejong@arm.com    /** RequestHandler stats */
17010801Srene.dejong@arm.com    struct FlashDeviceStats stats;
17110801Srene.dejong@arm.com
17210801Srene.dejong@arm.com    /** Disk dimensions in pages and blocks */
17310801Srene.dejong@arm.com    uint32_t pagesPerBlock;
17410801Srene.dejong@arm.com    uint32_t pagesPerDisk;
17510801Srene.dejong@arm.com    uint32_t blocksPerDisk;
17610801Srene.dejong@arm.com
17710801Srene.dejong@arm.com    uint32_t planeMask;
17810801Srene.dejong@arm.com
17910801Srene.dejong@arm.com    /**
18010801Srene.dejong@arm.com     * when the disk is first started we are unsure of the number of
18110801Srene.dejong@arm.com     * used pages, this variable will help determining what we do know.
18210801Srene.dejong@arm.com     */
18310801Srene.dejong@arm.com    std::vector<uint32_t> unknownPages;
18410801Srene.dejong@arm.com    /** address to logic place has a block and a page field*/
18510801Srene.dejong@arm.com    std::vector<struct PageMapEntry> locationTable;
18610801Srene.dejong@arm.com    /** number of valid entries per block*/
18710801Srene.dejong@arm.com    std::vector<uint32_t> blockValidEntries;
18810801Srene.dejong@arm.com    /** number of empty entries*/
18910801Srene.dejong@arm.com    std::vector<uint32_t> blockEmptyEntries;
19010801Srene.dejong@arm.com
19110801Srene.dejong@arm.com    /**This vector of queues keeps track of all the callbacks per plane*/
19210801Srene.dejong@arm.com    std::vector<std::deque<struct CallBackEntry> > planeEventQueue;
19310801Srene.dejong@arm.com
19410801Srene.dejong@arm.com    /** Completion event */
19512086Sspwilson2@wisc.edu    EventFunctionWrapper planeEvent;
19610801Srene.dejong@arm.com};
19710801Srene.dejong@arm.com#endif //__DEV_ARM_FLASH_DEVICE_HH__
198