1/* 2 * Copyright (c) 2018 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 here under. 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: Giacomo Travaglini 38 */ 39 40/** 41 * @file 42 * Declaration of the Stream generator for issuing memory requests 43 * with variable/fixed stream and substream IDs. 44 */ 45 46#ifndef __CPU_TRAFFIC_GEN_STREAM_GEN_HH__ 47#define __CPU_TRAFFIC_GEN_STREAM_GEN_HH__ 48 49#include "params/BaseTrafficGen.hh" 50 51class StreamGen 52{ 53 protected: 54 StreamGen(const BaseTrafficGenParams *p) 55 : streamIds(p->sids), substreamIds(p->ssids) 56 { 57 // A non empty vector of StreamIDs must be provided. 58 // SubstreamIDs are not mandatory hence having an empty 59 // vector means that they are not used and no configuration 60 // error must be thrown 61 fatal_if(streamIds.empty(), 62 "Must provide a vector of StreamIDs"); 63 } 64 65 public: 66 virtual ~StreamGen() {}; 67 68 virtual uint32_t pickStreamID() = 0; 69 virtual uint32_t pickSubStreamID() = 0; 70 71 /** 72 * Factory method for constructing a Stream generator. 73 * The Stream generator type is selected by the 74 * StreamGenType enum parameter. 75 * 76 * @params p pointer to BaseTrafficGenParams struct where 77 * the stream generator type is stored. 78 * @return a pointer to the newly alocated StremGen 79 */ 80 static StreamGen* create(const BaseTrafficGenParams *p); 81 82 /** 83 * Returns true if the substreamID generation is valid 84 * and hence should be taken into account. 85 * It is valid if the set of substreamIDs passed as a 86 * parameter to the TrafficGenerator is a non empty list. 87 * 88 * @return true if ssid is valid, false otherwise 89 */ 90 bool ssidValid() const { return !substreamIds.empty(); } 91 92 protected: 93 /** 94 * Store preset Stream and Substream IDs to use for requests 95 * This is the set of available streamIDs the generator can 96 * pick. The actual ID being picked for a specific memory 97 * request is selected by the pickStreamID and pickSubStreamID 98 * methods. 99 */ 100 std::vector<uint32_t> streamIds; 101 std::vector<uint32_t> substreamIds; 102}; 103 104class FixedStreamGen : public StreamGen 105{ 106 public: 107 FixedStreamGen(const BaseTrafficGenParams *p) 108 : StreamGen(p) 109 { 110 // For a fixed stream generator only one sid must be provided. The 111 // ssid can have either 0 (not used) or 1 value. 112 fatal_if(streamIds.size() != 1 || substreamIds.size() > 1, 113 "Invalid sids/ssids configuration"); 114 } 115 116 uint32_t pickStreamID() override 117 { return streamIds[0]; } 118 119 uint32_t pickSubStreamID() override 120 { return substreamIds[0]; } 121}; 122 123class RandomStreamGen : public StreamGen 124{ 125 public: 126 RandomStreamGen(const BaseTrafficGenParams *p) 127 : StreamGen(p) 128 {} 129 130 uint32_t pickStreamID() override 131 { return randomPick(streamIds); } 132 133 uint32_t pickSubStreamID() override 134 { return randomPick(substreamIds); } 135 136 protected: 137 /** Function to pick one of the preset Stream or Substream ID */ 138 uint32_t randomPick(const std::vector<uint32_t> &svec); 139}; 140 141#endif // __CPU_TRAFFIC_GEN_STREAM_GEN_HH__ 142