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