1d943d79aSZbigniew Bodek /*- 2d943d79aSZbigniew Bodek * Copyright (c) 2015 The FreeBSD Foundation 3d943d79aSZbigniew Bodek * All rights reserved. 4d943d79aSZbigniew Bodek * 5d943d79aSZbigniew Bodek * This software was developed by Semihalf under 6d943d79aSZbigniew Bodek * the sponsorship of the FreeBSD Foundation. 7d943d79aSZbigniew Bodek * 8d943d79aSZbigniew Bodek * Redistribution and use in source and binary forms, with or without 9d943d79aSZbigniew Bodek * modification, are permitted provided that the following conditions 10d943d79aSZbigniew Bodek * are met: 11d943d79aSZbigniew Bodek * 1. Redistributions of source code must retain the above copyright 12d943d79aSZbigniew Bodek * notice, this list of conditions and the following disclaimer. 13d943d79aSZbigniew Bodek * 2. Redistributions in binary form must reproduce the above copyright 14d943d79aSZbigniew Bodek * notice, this list of conditions and the following disclaimer in the 15d943d79aSZbigniew Bodek * documentation and/or other materials provided with the distribution. 16d943d79aSZbigniew Bodek * 17d943d79aSZbigniew Bodek * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18d943d79aSZbigniew Bodek * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19d943d79aSZbigniew Bodek * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20d943d79aSZbigniew Bodek * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21d943d79aSZbigniew Bodek * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22d943d79aSZbigniew Bodek * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23d943d79aSZbigniew Bodek * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24d943d79aSZbigniew Bodek * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25d943d79aSZbigniew Bodek * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26d943d79aSZbigniew Bodek * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27d943d79aSZbigniew Bodek * SUCH DAMAGE. 28d943d79aSZbigniew Bodek */ 29d943d79aSZbigniew Bodek 30d943d79aSZbigniew Bodek /* Common PCIe functions for Cavium Thunder SOC */ 31d943d79aSZbigniew Bodek 32d943d79aSZbigniew Bodek #include <sys/cdefs.h> 33d943d79aSZbigniew Bodek __FBSDID("$FreeBSD$"); 34d943d79aSZbigniew Bodek 35d943d79aSZbigniew Bodek #include <sys/param.h> 36d943d79aSZbigniew Bodek #include <sys/systm.h> 37d943d79aSZbigniew Bodek #include <sys/kernel.h> 38d943d79aSZbigniew Bodek #include <sys/bus.h> 39*bc5758b6SZbigniew Bodek #include <sys/rman.h> 40*bc5758b6SZbigniew Bodek 41d943d79aSZbigniew Bodek #include <machine/bus.h> 42d943d79aSZbigniew Bodek #include <machine/cpu.h> 43d943d79aSZbigniew Bodek #include <machine/intr.h> 44d943d79aSZbigniew Bodek 45d943d79aSZbigniew Bodek #include "thunder_pcie_common.h" 46d943d79aSZbigniew Bodek 47d943d79aSZbigniew Bodek uint32_t 48d943d79aSZbigniew Bodek range_addr_is_pci(struct pcie_range *ranges, uint64_t addr, uint64_t size) 49d943d79aSZbigniew Bodek { 50d943d79aSZbigniew Bodek struct pcie_range *r; 51d943d79aSZbigniew Bodek int tuple; 52d943d79aSZbigniew Bodek 536f675c9dSZbigniew Bodek for (tuple = 0; tuple < RANGES_TUPLES_MAX; tuple++) { 54d943d79aSZbigniew Bodek r = &ranges[tuple]; 55d943d79aSZbigniew Bodek if (addr >= r->pci_base && 56d943d79aSZbigniew Bodek addr < (r->pci_base + r->size) && 57d943d79aSZbigniew Bodek size < r->size) { 58d943d79aSZbigniew Bodek /* Address is within PCI range */ 59d943d79aSZbigniew Bodek return (1); 60d943d79aSZbigniew Bodek } 61d943d79aSZbigniew Bodek } 62d943d79aSZbigniew Bodek 63d943d79aSZbigniew Bodek /* Address is outside PCI range */ 64d943d79aSZbigniew Bodek return (0); 65d943d79aSZbigniew Bodek } 66d943d79aSZbigniew Bodek 67d943d79aSZbigniew Bodek uint32_t 68d943d79aSZbigniew Bodek range_addr_is_phys(struct pcie_range *ranges, uint64_t addr, uint64_t size) 69d943d79aSZbigniew Bodek { 70d943d79aSZbigniew Bodek struct pcie_range *r; 71d943d79aSZbigniew Bodek int tuple; 72d943d79aSZbigniew Bodek 736f675c9dSZbigniew Bodek for (tuple = 0; tuple < RANGES_TUPLES_MAX; tuple++) { 74d943d79aSZbigniew Bodek r = &ranges[tuple]; 75d943d79aSZbigniew Bodek if (addr >= r->phys_base && 76d943d79aSZbigniew Bodek addr < (r->phys_base + r->size) && 77d943d79aSZbigniew Bodek size < r->size) { 78d943d79aSZbigniew Bodek /* Address is within Physical range */ 79d943d79aSZbigniew Bodek return (1); 80d943d79aSZbigniew Bodek } 81d943d79aSZbigniew Bodek } 82d943d79aSZbigniew Bodek 83d943d79aSZbigniew Bodek /* Address is outside Physical range */ 84d943d79aSZbigniew Bodek return (0); 85d943d79aSZbigniew Bodek } 86d943d79aSZbigniew Bodek 87d943d79aSZbigniew Bodek uint64_t 88d943d79aSZbigniew Bodek range_addr_pci_to_phys(struct pcie_range *ranges, uint64_t pci_addr) 89d943d79aSZbigniew Bodek { 90d943d79aSZbigniew Bodek struct pcie_range *r; 91d943d79aSZbigniew Bodek uint64_t offset; 92d943d79aSZbigniew Bodek int tuple; 93d943d79aSZbigniew Bodek 94d943d79aSZbigniew Bodek /* Find physical address corresponding to given bus address */ 956f675c9dSZbigniew Bodek for (tuple = 0; tuple < RANGES_TUPLES_MAX; tuple++) { 96d943d79aSZbigniew Bodek r = &ranges[tuple]; 97d943d79aSZbigniew Bodek if (pci_addr >= r->pci_base && 98d943d79aSZbigniew Bodek pci_addr < (r->pci_base + r->size)) { 99d943d79aSZbigniew Bodek /* Given pci addr is in this range. 100d943d79aSZbigniew Bodek * Translate bus addr to phys addr. 101d943d79aSZbigniew Bodek */ 102d943d79aSZbigniew Bodek offset = pci_addr - r->pci_base; 103d943d79aSZbigniew Bodek return (r->phys_base + offset); 104d943d79aSZbigniew Bodek } 105d943d79aSZbigniew Bodek } 106d943d79aSZbigniew Bodek return (0); 107d943d79aSZbigniew Bodek } 108d943d79aSZbigniew Bodek 109