/* * This file is part of the coreboot project. * * Copyright (C) 2013 Alexandru Gagniuc * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include "via_early_smbus.h" /** * \brief Print an error, should it occur. If no error, just exit. * * @param smbus_dev The base SMBus IO port * @param host_status The data returned on the host status register after * a transaction is processed. * @param loops The number of times a transaction was attempted. * @return 0 if no error occurred * 1 if an error was detected */ int smbus_print_error(u32 smbus_dev, u8 host_status, int loops) { /* Check if there actually was an error. */ if ((host_status == 0x00 || host_status == 0x40 || host_status == 0x42) && (loops < SMBUS_TIMEOUT)) return 0; if (loops >= SMBUS_TIMEOUT) printsmbus("SMBus timeout\n"); if (host_status & (1 << 4)) printsmbus("Interrupt/SMI# was Failed Bus Transaction\n"); if (host_status & (1 << 3)) printsmbus("Bus error\n"); if (host_status & (1 << 2)) printsmbus("Device error\n"); if (host_status & (1 << 1)) printsmbus("Interrupt/SMI# completed successfully\n"); if (host_status & (1 << 0)) printsmbus("Host busy\n"); return 1; }