1 /* 2 * Copyright (c) 2021 Travis Geiseblrecht 3 * 4 * Use of this source code is governed by a MIT-style 5 * license that can be found in the LICENSE file or at 6 * https://opensource.org/licenses/MIT 7 */ 8 #pragma once 9 10 #include <sys/types.h> 11 #include <stdio.h> 12 #include <dev/bus/pci.h> 13 14 namespace pci { 15 16 // TODO: move into separate file 17 struct resource_range { 18 pci_resource_type type; 19 uint64_t base; 20 uint64_t size; 21 dumpresource_range22 void dump() { 23 printf("resource type %d: base %#llx size %#llx\n", 24 type, base, size); 25 } 26 }; 27 28 struct resource_range_set { 29 resource_range io; 30 resource_range mmio; 31 resource_range mmio64; 32 resource_range mmio_prefetchable; 33 resource_range mmio64_prefetchable; 34 dumpresource_range_set35 void dump() { 36 printf("resource range set:\n"); 37 io.dump(); 38 mmio.dump(); 39 mmio64.dump(); 40 mmio_prefetchable.dump(); 41 mmio64_prefetchable.dump(); 42 } 43 }; 44 45 class resource_allocator { 46 public: 47 resource_allocator() = default; 48 ~resource_allocator() = default; 49 50 status_t set_range(const resource_range &range, bool prefetchable = false); 51 status_t allocate_io(uint32_t size, uint8_t align, uint32_t *out); 52 status_t allocate_mmio(bool can_be_64bit, bool prefetchable, uint64_t size, uint8_t align, uint64_t *out); 53 54 private: 55 resource_range &type_to_range(pci_resource_type type, bool prefetchable); 56 57 resource_range_set ranges_ = {}; 58 }; 59 60 } // namespace pci 61