183e37327SMatt Spinler /**
2e84b4ddbSPatrick Venture * Copyright (C) 2017 IBM Corporation
383e37327SMatt Spinler *
483e37327SMatt Spinler * Licensed under the Apache License, Version 2.0 (the "License");
583e37327SMatt Spinler * you may not use this file except in compliance with the License.
683e37327SMatt Spinler * You may obtain a copy of the License at
783e37327SMatt Spinler *
883e37327SMatt Spinler * http://www.apache.org/licenses/LICENSE-2.0
983e37327SMatt Spinler *
1083e37327SMatt Spinler * Unless required by applicable law or agreed to in writing, software
1183e37327SMatt Spinler * distributed under the License is distributed on an "AS IS" BASIS,
1283e37327SMatt Spinler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1383e37327SMatt Spinler * See the License for the specific language governing permissions and
1483e37327SMatt Spinler * limitations under the License.
1583e37327SMatt Spinler */
1683e37327SMatt Spinler #include "cfam_access.hpp"
17f78d9042SPatrick Venture #include "ext_interface.hpp"
1883e37327SMatt Spinler #include "p9_cfam.hpp"
19d9bdcf72SMatt Spinler #include "registration.hpp"
2083e37327SMatt Spinler #include "targeting.hpp"
21f78d9042SPatrick Venture
22f78d9042SPatrick Venture #include <phosphor-logging/log.hpp>
2383e37327SMatt Spinler
2483e37327SMatt Spinler namespace openpower
2583e37327SMatt Spinler {
2683e37327SMatt Spinler namespace p9
2783e37327SMatt Spinler {
2883e37327SMatt Spinler
2983e37327SMatt Spinler using namespace phosphor::logging;
3083e37327SMatt Spinler using namespace openpower::cfam::access;
3183e37327SMatt Spinler using namespace openpower::cfam::p9;
3283e37327SMatt Spinler using namespace openpower::targeting;
3383e37327SMatt Spinler
3483e37327SMatt Spinler /**
3583e37327SMatt Spinler * @brief Starts the self boot engine on P9 position 0 to kick off a boot.
3683e37327SMatt Spinler * @return void
3783e37327SMatt Spinler */
startHost()3883e37327SMatt Spinler void startHost()
3983e37327SMatt Spinler {
4083e37327SMatt Spinler Targeting targets;
4183e37327SMatt Spinler const auto& master = *(targets.begin());
4283e37327SMatt Spinler
4383e37327SMatt Spinler log<level::INFO>("Running P9 procedure startHost",
4483e37327SMatt Spinler entry("NUM_PROCS=%d", targets.size()));
4583e37327SMatt Spinler
4683e37327SMatt Spinler // Ensure asynchronous clock mode is set
4783e37327SMatt Spinler writeReg(master, P9_LL_MODE_REG, 0x00000001);
4883e37327SMatt Spinler
4983e37327SMatt Spinler // Clock mux select override
5083e37327SMatt Spinler for (const auto& t : targets)
5183e37327SMatt Spinler {
52f78d9042SPatrick Venture writeRegWithMask(t, P9_ROOT_CTRL8, 0x0000000C, 0x0000000C);
5383e37327SMatt Spinler }
5483e37327SMatt Spinler
5583e37327SMatt Spinler // Enable P9 checkstop to be reported to the BMC
5683e37327SMatt Spinler
5783e37327SMatt Spinler // Setup FSI2PIB to report checkstop
5883e37327SMatt Spinler writeReg(master, P9_FSI_A_SI1S, 0x20000000);
5983e37327SMatt Spinler
6083e37327SMatt Spinler // Enable Xstop/ATTN interrupt
6183e37327SMatt Spinler writeReg(master, P9_FSI2PIB_TRUE_MASK, 0x60000000);
6283e37327SMatt Spinler
6383e37327SMatt Spinler // Arm it
6483e37327SMatt Spinler writeReg(master, P9_FSI2PIB_INTERRUPT, 0xFFFFFFFF);
6583e37327SMatt Spinler
6683e37327SMatt Spinler // Kick off the SBE to start the boot
6783e37327SMatt Spinler
682548c7a3SAndrew Geissler // Choose seeprom side to boot from
692548c7a3SAndrew Geissler cfam_data_t sbeSide = 0;
70d1df1e27SAndrew Geissler if (getBootCount() > 0)
712548c7a3SAndrew Geissler {
722548c7a3SAndrew Geissler sbeSide = 0;
732548c7a3SAndrew Geissler log<level::INFO>("Setting SBE seeprom side to 0",
742548c7a3SAndrew Geissler entry("SBE_SIDE_SELECT=%d", 0));
752548c7a3SAndrew Geissler }
762548c7a3SAndrew Geissler else
772548c7a3SAndrew Geissler {
782548c7a3SAndrew Geissler sbeSide = 0x00004000;
792548c7a3SAndrew Geissler log<level::INFO>("Setting SBE seeprom side to 1",
802548c7a3SAndrew Geissler entry("SBE_SIDE_SELECT=%d", 1));
812548c7a3SAndrew Geissler }
822548c7a3SAndrew Geissler // Bit 17 of the ctrl status reg indicates sbe seeprom boot side
832548c7a3SAndrew Geissler // 0 -> Side 0, 1 -> Side 1
842548c7a3SAndrew Geissler writeRegWithMask(master, P9_SBE_CTRL_STATUS, sbeSide, 0x00004000);
852548c7a3SAndrew Geissler
86ed212d50SAndrew Geissler // Ensure SBE start bit is 0 to handle warm reboot scenarios
87ed212d50SAndrew Geissler writeRegWithMask(master, P9_CBS_CS, 0x00000000, 0x80000000);
88ed212d50SAndrew Geissler
8983e37327SMatt Spinler // Start the SBE
9083e37327SMatt Spinler writeRegWithMask(master, P9_CBS_CS, 0x80000000, 0x80000000);
9183e37327SMatt Spinler }
9283e37327SMatt Spinler
93*63508a73SBrad Bishop REGISTER_PROCEDURE("startHost", startHost)
9483e37327SMatt Spinler
95f78d9042SPatrick Venture } // namespace p9
96f78d9042SPatrick Venture } // namespace openpower
97