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