| /* IBM_PROLOG_BEGIN_TAG */ |
| /* This is an automatically generated prolog. */ |
| /* */ |
| /* $Source: src/usr/diag/prdf/common/framework/register/prdfScanFacility.H $ */ |
| /* */ |
| /* OpenPOWER HostBoot Project */ |
| /* */ |
| /* Contributors Listed Below - COPYRIGHT 2012,2018 */ |
| /* [+] International Business Machines Corp. */ |
| /* */ |
| /* */ |
| /* Licensed under the Apache License, Version 2.0 (the "License"); */ |
| /* you may not use this file except in compliance with the License. */ |
| /* You may obtain a copy of the License at */ |
| /* */ |
| /* http://www.apache.org/licenses/LICENSE-2.0 */ |
| /* */ |
| /* Unless required by applicable law or agreed to in writing, software */ |
| /* distributed under the License is distributed on an "AS IS" BASIS, */ |
| /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */ |
| /* implied. See the License for the specific language governing */ |
| /* permissions and limitations under the License. */ |
| /* */ |
| /* IBM_PROLOG_END_TAG */ |
| |
| #ifndef PRDFSCANFACILITY_H |
| #define PRDFSCANFACILITY_H |
| /** |
| @file prdfScanFacility.H |
| @brief Description |
| */ |
| |
| |
| //-------------------------------------------------------------------- |
| // Includes |
| //-------------------------------------------------------------------- |
| |
| #include <register/hei_hardware_register.hpp> |
| #include <register/hei_operator_register.hpp> |
| |
| #include <prdfFlyWeight.H> |
| #include <prdfFlyWeightS.H> |
| #include <vector> |
| #include <prdfHomRegisterAccess.H> |
| #include <prdfScomRegisterAccess.H> |
| #include <prdfPlatServices.H> |
| |
| namespace PRDF |
| { |
| |
| |
| /** |
| PRD Scan Facility |
| @author Doug Gilbert |
| @par The Scan facility is used by PRD to access Scan and Scan Comm |
| @ functions.It attempts to reduce duplicate objects and their |
| @ aggragates as must as possible. |
| */ |
| class ScanFacility |
| { |
| public: |
| /** |
| The Scan Facility is a singleton - this function provides access to it. |
| */ |
| static ScanFacility & Access(void); |
| |
| /** |
| * @brief Returns reference to flyweight object of type ScomRegister. |
| * An object of given address is first searched in flyweight. |
| * If object exist, reference to existing object is returned |
| * else a new one is created. |
| * @param i_address address of the register |
| * @param i_scomLength length of the bit string |
| * @param i_type type of target associated with register |
| * @param i_regOp operations supported for given register |
| * @return returns reference to flyweight object from factory |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetScanCommRegister( uint64_t address, |
| uint32_t i_scomLength, TARGETING::TYPE i_type, |
| SCAN_COMM_REGISTER_CLASS::AccessLevel i_regOp ); |
| |
| /** |
| * @brief Get a register that bitwise inverts the bitstring of a register |
| * when read or written to |
| * @param SCAN_COMM_REGISTER_CLASS source |
| * @post Only one instance of the register with this SCR parameter will |
| * exist |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetNotRegister(SCAN_COMM_REGISTER_CLASS & i_arg); |
| |
| /** |
| * @brief Get a register that bitwise left shift the bitstring of a register |
| * when read or written to |
| * @param SCAN_COMM_REGISTER_CLASS source |
| * @post Only one instance of the register with this SCR parameter and |
| * amount will exist |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetLeftShiftRegister( |
| SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_amount); |
| |
| /** |
| * @brief Get a register that bitwise right shift the bitstring of a register |
| * when read or written to |
| * @param SCAN_COMM_REGISTER_CLASS source |
| * @post Only one instance of the register with this SCR parameter and amount |
| * @ will exist |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetRightShiftRegister( |
| SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_amount); |
| |
| /** |
| * @brief Get a register for the summary construct |
| * @param SCAN_COMM_REGISTER_CLASS source |
| * @param uint16_t i_bit bit to set if any attentions found in i_arg |
| * @post Only one instance of the register with this SCR parameter and |
| * amount will exist |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetSummaryRegister( |
| SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_bit); |
| |
| /** |
| * @brief Get a register that bit-wise ANDs the bitstring of two register |
| * when read or written to |
| * @param The 2 SCR 's to AND |
| * @posrt Only one instance of the register with these SCRs will exist |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetAndRegister(SCAN_COMM_REGISTER_CLASS & i_left, |
| SCAN_COMM_REGISTER_CLASS & i_right); |
| |
| /** |
| * @brief Get a register that bitwise ORs the bitstrings of two register when |
| * read or written |
| * @param the 2 SCR's to OR |
| * @post Only one instance of the register with these SCR's will exist |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetOrRegister(SCAN_COMM_REGISTER_CLASS & i_left, |
| SCAN_COMM_REGISTER_CLASS & i_right); |
| |
| /** |
| * @brief Get a AttnTypeRegister |
| * @params 5 pointers to scr Registers |
| * @post only one instance of the register with these SCR's will exist |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetAttnTypeRegister( |
| SCAN_COMM_REGISTER_CLASS * i_check, |
| SCAN_COMM_REGISTER_CLASS * i_recov, |
| SCAN_COMM_REGISTER_CLASS * i_special, |
| SCAN_COMM_REGISTER_CLASS * i_proccs, |
| SCAN_COMM_REGISTER_CLASS * i_hostattn ); |
| |
| /** |
| * @brief Get a PrdfConstantRegister |
| * @param BitString - the bit string constant to use. |
| * @post only one instance of the register with this BIT_STRING value will |
| * exist. |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetConstantRegister(const BitStringBuffer & i_val); |
| /** |
| * @brief Get a plugin register |
| * @param Reference to target less flyweight object |
| * @param RuleChip associatd with register |
| * @post only one instance of the register with this BIT_STRING value will |
| * exist. |
| */ |
| SCAN_COMM_REGISTER_CLASS & GetPluginRegister( |
| SCAN_COMM_REGISTER_CLASS & i_flyweight, |
| ExtensibleChip & i_RuleChip ); |
| /** |
| * @brief Delete all the plugin register |
| * @param None |
| * @post all the ScomRegisterAccess register flyweight object created for |
| * plugin shall be deleted |
| * exist. |
| */ |
| void ResetPluginRegister(); |
| |
| /** |
| * @brief Intended to reset all the flyweights if PRD is uninitialized due to |
| * a reIPL, reset/reload, or failover. This free up the memory and |
| * avoids memory leaks in the flyweights. |
| */ |
| void reset(); |
| |
| #ifdef FLYWEIGHT_PROFILING |
| /** |
| * @brief prints memory allocated for object residing on flyweight |
| */ |
| void printStats(); |
| #endif |
| |
| /** |
| Destructor |
| */ |
| // ~ScanFacility(); |
| private: // functions |
| /** |
| Constructor |
| * @param |
| * @returns |
| * @pre |
| * @post |
| * @see |
| * @note |
| */ |
| ScanFacility() {} |
| |
| |
| private: // Data |
| typedef FlyWeightS<ScomRegister,50> ScanCommRegisters; |
| //FIXME RTC 64345 Investigate benefit of changing below from FlyWeight to |
| //FlyWeightS |
| typedef FlyWeight<AttnTypeRegister,50> AttnTypeRegisters; |
| typedef FlyWeightS<AndRegister,50> AndRegisters; |
| typedef FlyWeightS<OrRegister,10> OrRegisters; |
| typedef FlyWeightS<NotRegister,50> NotRegisters; |
| typedef FlyWeightS<LeftShiftRegister,10> LeftShiftRegisters; |
| typedef FlyWeightS<RightShiftRegister, 10> RightShiftRegisters; |
| typedef FlyWeightS<SummaryRegister,10> SummaryRegisters; |
| typedef FlyWeight<ConstantRegister, 10> ConstantRegisters; |
| typedef FlyWeightS<ScomRegisterAccess, 10> PluginRegisters; |
| |
| ScanCommRegisters iv_scomRegFw; |
| AttnTypeRegisters iv_attnRegFw; |
| AndRegisters iv_andRegFw; |
| OrRegisters iv_orRegFw; |
| NotRegisters iv_notRegFw; |
| LeftShiftRegisters iv_leftRegFw; |
| SummaryRegisters iv_sumRegFw; |
| RightShiftRegisters iv_rightRegFw; |
| ConstantRegisters iv_constRegFw; |
| PluginRegisters iv_pluginRegFw; |
| |
| }; |
| |
| } // end namespace PRDF |
| |
| #endif /* PRDFSCANFACILITY_H */ |