/* Copyright 2013-2014 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 #include #include #include #include /* * Note: This file os only used on P7/P7+ */ #define MAX_IO_HUBS 0x80 static struct io_hub *cec_iohubs[MAX_IO_HUBS]; struct io_hub *cec_get_hub_by_id(uint32_t hub_id) { if (hub_id >= MAX_IO_HUBS) return NULL; return cec_iohubs[hub_id]; } void cec_register(struct io_hub *hub) { assert(hub->hub_id < MAX_IO_HUBS); cec_iohubs[hub->hub_id] = hub; } void cec_reset(void) { unsigned int i; /* Reset IO Hubs */ for (i = 0; i < MAX_IO_HUBS; i++) { if (!cec_iohubs[i] || !cec_iohubs[i]->ops->reset) continue; cec_iohubs[i]->ops->reset(cec_iohubs[i]); } } /* This was only supported by p5ioc, which was dropped */ static int64_t opal_pci_set_hub_tce_memory(uint64_t hub_id, uint64_t tce_mem_addr __unused, uint64_t tce_mem_size __unused) { struct io_hub *hub = cec_get_hub_by_id(hub_id); if (!hub) return OPAL_PARAMETER; return OPAL_UNSUPPORTED; } opal_call(OPAL_PCI_SET_HUB_TCE_MEMORY, opal_pci_set_hub_tce_memory, 3); static int64_t opal_pci_get_hub_diag_data(uint64_t hub_id, void *diag_buffer, uint64_t diag_buffer_len) { struct io_hub *hub = cec_get_hub_by_id(hub_id); if (!opal_addr_valid(diag_buffer)) return OPAL_PARAMETER; if (!hub) return OPAL_PARAMETER; if (!hub->ops->get_diag_data) return OPAL_UNSUPPORTED; return hub->ops->get_diag_data(hub, diag_buffer, diag_buffer_len); } opal_call(OPAL_PCI_GET_HUB_DIAG_DATA, opal_pci_get_hub_diag_data, 3);