10d09e41aSPaolo Bonzini /* 20d09e41aSPaolo Bonzini * pcie_host.h 30d09e41aSPaolo Bonzini * 40d09e41aSPaolo Bonzini * Copyright (c) 2009 Isaku Yamahata <yamahata at valinux co jp> 50d09e41aSPaolo Bonzini * VA Linux Systems Japan K.K. 60d09e41aSPaolo Bonzini * 70d09e41aSPaolo Bonzini * This program is free software; you can redistribute it and/or modify 80d09e41aSPaolo Bonzini * it under the terms of the GNU General Public License as published by 90d09e41aSPaolo Bonzini * the Free Software Foundation; either version 2 of the License, or 100d09e41aSPaolo Bonzini * (at your option) any later version. 110d09e41aSPaolo Bonzini 120d09e41aSPaolo Bonzini * This program is distributed in the hope that it will be useful, 130d09e41aSPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 140d09e41aSPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 150d09e41aSPaolo Bonzini * GNU General Public License for more details. 160d09e41aSPaolo Bonzini 170d09e41aSPaolo Bonzini * You should have received a copy of the GNU General Public License along 180d09e41aSPaolo Bonzini * with this program; if not, see <http://www.gnu.org/licenses/>. 190d09e41aSPaolo Bonzini */ 200d09e41aSPaolo Bonzini 210d09e41aSPaolo Bonzini #ifndef PCIE_HOST_H 220d09e41aSPaolo Bonzini #define PCIE_HOST_H 230d09e41aSPaolo Bonzini 240d09e41aSPaolo Bonzini #include "hw/pci/pci_host.h" 250d09e41aSPaolo Bonzini #include "exec/memory.h" 26db1015e9SEduardo Habkost #include "qom/object.h" 270d09e41aSPaolo Bonzini 280d09e41aSPaolo Bonzini #define TYPE_PCIE_HOST_BRIDGE "pcie-host-bridge" 298063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(PCIExpressHost, PCIE_HOST_BRIDGE) 300d09e41aSPaolo Bonzini 3187f65245SMichael S. Tsirkin #define PCIE_HOST_MCFG_BASE "MCFG" 32cbcaf79eSMichael S. Tsirkin #define PCIE_HOST_MCFG_SIZE "mcfg_size" 3387f65245SMichael S. Tsirkin 34079e3e70SMichael S. Tsirkin /* pcie_host::base_addr == PCIE_BASE_ADDR_UNMAPPED when it isn't mapped. */ 35079e3e70SMichael S. Tsirkin #define PCIE_BASE_ADDR_UNMAPPED ((hwaddr)-1ULL) 36079e3e70SMichael S. Tsirkin 370d09e41aSPaolo Bonzini struct PCIExpressHost { 380d09e41aSPaolo Bonzini PCIHostState pci; 390d09e41aSPaolo Bonzini 400d09e41aSPaolo Bonzini /* express part */ 410d09e41aSPaolo Bonzini 420d09e41aSPaolo Bonzini /* base address where MMCONFIG area is mapped. */ 430d09e41aSPaolo Bonzini hwaddr base_addr; 440d09e41aSPaolo Bonzini 450d09e41aSPaolo Bonzini /* the size of MMCONFIG area. It's host bridge dependent */ 460d09e41aSPaolo Bonzini hwaddr size; 470d09e41aSPaolo Bonzini 480d09e41aSPaolo Bonzini /* MMCONFIG mmio area */ 490d09e41aSPaolo Bonzini MemoryRegion mmio; 500d09e41aSPaolo Bonzini }; 510d09e41aSPaolo Bonzini 520d09e41aSPaolo Bonzini void pcie_host_mmcfg_unmap(PCIExpressHost *e); 5327fb9688SAlexander Graf void pcie_host_mmcfg_init(PCIExpressHost *e, uint32_t size); 540d09e41aSPaolo Bonzini void pcie_host_mmcfg_map(PCIExpressHost *e, hwaddr addr, uint32_t size); 550d09e41aSPaolo Bonzini void pcie_host_mmcfg_update(PCIExpressHost *e, 560d09e41aSPaolo Bonzini int enable, 570d09e41aSPaolo Bonzini hwaddr addr, 580d09e41aSPaolo Bonzini uint32_t size); 590d09e41aSPaolo Bonzini 606f6d2823SMichael S. Tsirkin /* 616f6d2823SMichael S. Tsirkin * PCI express ECAM (Enhanced Configuration Address Mapping) format. 626f6d2823SMichael S. Tsirkin * AKA mmcfg address 638e58f6ecSFrancisco Iglesias * bit 20 - 27: bus number 646f6d2823SMichael S. Tsirkin * bit 15 - 19: device number 656f6d2823SMichael S. Tsirkin * bit 12 - 14: function number 666f6d2823SMichael S. Tsirkin * bit 0 - 11: offset in configuration space of a given device 676f6d2823SMichael S. Tsirkin */ 68*1f1a7b22SFrancisco Iglesias #define PCIE_MMCFG_SIZE_MAX (1ULL << 28) 696f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_SIZE_MIN (1ULL << 20) 706f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_BUS_BIT 20 718e58f6ecSFrancisco Iglesias #define PCIE_MMCFG_BUS_MASK 0xff 726f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_DEVFN_BIT 12 736f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_DEVFN_MASK 0xff 746f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_CONFOFFSET_MASK 0xfff 756f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_BUS(addr) (((addr) >> PCIE_MMCFG_BUS_BIT) & \ 766f6d2823SMichael S. Tsirkin PCIE_MMCFG_BUS_MASK) 776f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_DEVFN(addr) (((addr) >> PCIE_MMCFG_DEVFN_BIT) & \ 786f6d2823SMichael S. Tsirkin PCIE_MMCFG_DEVFN_MASK) 796f6d2823SMichael S. Tsirkin #define PCIE_MMCFG_CONFOFFSET(addr) ((addr) & PCIE_MMCFG_CONFOFFSET_MASK) 806f6d2823SMichael S. Tsirkin 810d09e41aSPaolo Bonzini #endif /* PCIE_HOST_H */ 82