blob: 383d92c6c7e63b7574c3b4c72596bce6cdc59cc7 [file] [log] [blame]
/* Copyright 2017 IBM 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.
*/
#include <skiboot.h>
#include <pci.h>
#include <pci-quirk.h>
#include <ast.h>
static void quirk_astbmc_vga(struct phb *phb __unused,
struct pci_device *pd)
{
struct dt_node *np = pd->dn;
uint32_t revision, mcr_configuration, mcr_scu_mpll, mcr_scu_strap;
/*
* These accesses will only work if the BMC address 0x1E6E2180 is set
* to 0x7B, which is its default state on current systems. In future,
* for security purposes it is proposed to configure this register to
* disallow accesses from the host, and provide the properties that
* the Linux ast VGA driver used through the device tree instead.
* Here we set those properties so we can test how things would work
* if the window into BMC memory was closed.
*
* If both the petitboot kernel and the host kernel have an ast driver
* that reads properties from the device tree, setting 0x1E6E2180 to
* 0x79 will disable the backdoor into BMC memory and the only way the
* ast driver can operate is using the device tree properties.
*/
revision = ast_ahb_readl(SCU_REVISION_ID);
mcr_configuration = ast_ahb_readl(MCR_CONFIGURATION);
mcr_scu_mpll = ast_ahb_readl(MCR_SCU_MPLL);
mcr_scu_strap = ast_ahb_readl(MCR_SCU_STRAP);
dt_add_property_cells(np, "aspeed,scu-revision-id", revision);
dt_add_property_cells(np, "aspeed,mcr-configuration", mcr_configuration);
dt_add_property_cells(np, "aspeed,mcr-scu-mpll", mcr_scu_mpll);
dt_add_property_cells(np, "aspeed,mcr-scu-strap", mcr_scu_strap);
/*
* if
* - the petitboot kernel supports an ast driver that uses DT
* - every host kernel supports an ast driver that uses DT
* - the host can't flash unsigned skiboots
*
* then enabling the line below will allow the host and the BMC to be
* securely isolated from each other, without changing what's running
* on the BMC.
*/
/* ast_ahb_writel(0x79, 0x1E6E2180); */
}
/* Quirks are: {fixup function, vendor ID, (device ID or PCI_ANY_ID)} */
static const struct pci_quirk quirk_table[] = {
/* ASPEED 2400 VGA device */
{ &quirk_astbmc_vga, 0x1a03, 0x2000 },
{NULL}
};
void pci_handle_quirk(struct phb *phb,
struct pci_device *pd,
uint16_t vendor_id,
uint16_t device_id)
{
const struct pci_quirk *quirks = quirk_table;
while (quirks->vendor_id) {
if (vendor_id == quirks->vendor_id &&
(quirks->device_id == PCI_ANY_ID ||
device_id == quirks->device_id))
quirks->fixup(phb, pd);
quirks++;
}
}