gic_v3.cc (13877:a4ac726b549d) gic_v3.cc (13878:40a2ec55ad89)
1/*
2 * Copyright (c) 2018 Metempsy Technology Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 34 unchanged lines hidden (view full) ---

43Gicv3::Gicv3(const Params * p)
44 : BaseGic(p)
45{
46}
47
48void
49Gicv3::init()
50{
1/*
2 * Copyright (c) 2018 Metempsy Technology Consulting
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 34 unchanged lines hidden (view full) ---

43Gicv3::Gicv3(const Params * p)
44 : BaseGic(p)
45{
46}
47
48void
49Gicv3::init()
50{
51 distRange = RangeSize(params()->dist_addr,
52 Gicv3Distributor::ADDR_RANGE_SIZE - 1);
53 redistRange = RangeSize(params()->redist_addr,
54 Gicv3Redistributor::ADDR_RANGE_SIZE * sys->numContexts() - 1);
55 addrRanges = {distRange, redistRange};
56 BaseGic::init();
57 distributor = new Gicv3Distributor(this, params()->it_lines);
58 redistributors.resize(sys->numContexts(), nullptr);
59 cpuInterfaces.resize(sys->numContexts(), nullptr);
60
61 panic_if(sys->numContexts() > params()->cpu_max,
62 "Exceeding maximum number of PEs supported by GICv3: "
63 "using %u while maximum is %u\n", sys->numContexts(),
64 params()->cpu_max);
65
66 for (int i = 0; i < sys->numContexts(); i++) {
67 redistributors[i] = new Gicv3Redistributor(this, i);
68 cpuInterfaces[i] = new Gicv3CPUInterface(this, i);
69 }
70
51 distributor = new Gicv3Distributor(this, params()->it_lines);
52 redistributors.resize(sys->numContexts(), nullptr);
53 cpuInterfaces.resize(sys->numContexts(), nullptr);
54
55 panic_if(sys->numContexts() > params()->cpu_max,
56 "Exceeding maximum number of PEs supported by GICv3: "
57 "using %u while maximum is %u\n", sys->numContexts(),
58 params()->cpu_max);
59
60 for (int i = 0; i < sys->numContexts(); i++) {
61 redistributors[i] = new Gicv3Redistributor(this, i);
62 cpuInterfaces[i] = new Gicv3CPUInterface(this, i);
63 }
64
65 distRange = RangeSize(params()->dist_addr,
66 Gicv3Distributor::ADDR_RANGE_SIZE - 1);
67
68 redistSize = redistributors[0]->addrRangeSize;
69 redistRange = RangeSize(params()->redist_addr,
70 redistSize * sys->numContexts() - 1);
71
72 addrRanges = {distRange, redistRange};
73
71 distributor->init();
72
73 for (int i = 0; i < sys->numContexts(); i++) {
74 redistributors[i]->init();
75 cpuInterfaces[i]->init();
76 }
74 distributor->init();
75
76 for (int i = 0; i < sys->numContexts(); i++) {
77 redistributors[i]->init();
78 cpuInterfaces[i]->init();
79 }
80
81 BaseGic::init();
77}
78
79void
80Gicv3::initState()
81{
82 distributor->initState();
83
84 for (int i = 0; i < sys->numContexts(); i++) {

--- 17 unchanged lines hidden (view full) ---

102 resp = distributor->read(daddr, size, is_secure_access);
103 delay = params()->dist_pio_delay;
104 DPRINTF(GIC, "Gicv3::read(): (distributor) context_id %d register %#x "
105 "size %d is_secure_access %d (value %#x)\n",
106 pkt->req->contextId(), daddr, size, is_secure_access, resp);
107 } else if (redistRange.contains(addr)) {
108 Addr daddr = addr - redistRange.start();
109 uint32_t redistributor_id =
82}
83
84void
85Gicv3::initState()
86{
87 distributor->initState();
88
89 for (int i = 0; i < sys->numContexts(); i++) {

--- 17 unchanged lines hidden (view full) ---

107 resp = distributor->read(daddr, size, is_secure_access);
108 delay = params()->dist_pio_delay;
109 DPRINTF(GIC, "Gicv3::read(): (distributor) context_id %d register %#x "
110 "size %d is_secure_access %d (value %#x)\n",
111 pkt->req->contextId(), daddr, size, is_secure_access, resp);
112 } else if (redistRange.contains(addr)) {
113 Addr daddr = addr - redistRange.start();
114 uint32_t redistributor_id =
110 daddr / Gicv3Redistributor::ADDR_RANGE_SIZE;
111 daddr = daddr % Gicv3Redistributor::ADDR_RANGE_SIZE;
115 daddr / redistSize;
116 daddr = daddr % redistSize;
112 panic_if(redistributor_id >= redistributors.size(),
113 "Invalid redistributor_id!");
114 panic_if(!redistributors[redistributor_id], "Redistributor is null!");
115 resp = redistributors[redistributor_id]->read(daddr, size,
116 is_secure_access);
117 delay = params()->redist_pio_delay;
118 DPRINTF(GIC, "Gicv3::read(): (redistributor %d) context_id %d "
119 "register %#x size %d is_secure_access %d (value %#x)\n",

--- 23 unchanged lines hidden (view full) ---

143 DPRINTF(GIC, "Gicv3::write(): (distributor) context_id %d "
144 "register %#x size %d is_secure_access %d value %#x\n",
145 pkt->req->contextId(), daddr, size, is_secure_access, data);
146 distributor->write(daddr, data, size, is_secure_access);
147 delay = params()->dist_pio_delay;
148 } else if (redistRange.contains(addr)) {
149 Addr daddr = addr - redistRange.start();
150 uint32_t redistributor_id =
117 panic_if(redistributor_id >= redistributors.size(),
118 "Invalid redistributor_id!");
119 panic_if(!redistributors[redistributor_id], "Redistributor is null!");
120 resp = redistributors[redistributor_id]->read(daddr, size,
121 is_secure_access);
122 delay = params()->redist_pio_delay;
123 DPRINTF(GIC, "Gicv3::read(): (redistributor %d) context_id %d "
124 "register %#x size %d is_secure_access %d (value %#x)\n",

--- 23 unchanged lines hidden (view full) ---

148 DPRINTF(GIC, "Gicv3::write(): (distributor) context_id %d "
149 "register %#x size %d is_secure_access %d value %#x\n",
150 pkt->req->contextId(), daddr, size, is_secure_access, data);
151 distributor->write(daddr, data, size, is_secure_access);
152 delay = params()->dist_pio_delay;
153 } else if (redistRange.contains(addr)) {
154 Addr daddr = addr - redistRange.start();
155 uint32_t redistributor_id =
151 daddr / Gicv3Redistributor::ADDR_RANGE_SIZE;
152 daddr = daddr % Gicv3Redistributor::ADDR_RANGE_SIZE;
156 daddr / redistSize;
157 daddr = daddr % redistSize;
153 panic_if(redistributor_id >= redistributors.size(),
154 "Invalid redistributor_id!");
155 panic_if(!redistributors[redistributor_id], "Redistributor is null!");
156 DPRINTF(GIC, "Gicv3::write(): (redistributor %d) context_id %d "
157 "register %#x size %d is_secure_access %d value %#x\n",
158 redistributor_id, pkt->req->contextId(), daddr, size,
159 is_secure_access, data);
160 redistributors[redistributor_id]->write(daddr, data, size,

--- 104 unchanged lines hidden ---
158 panic_if(redistributor_id >= redistributors.size(),
159 "Invalid redistributor_id!");
160 panic_if(!redistributors[redistributor_id], "Redistributor is null!");
161 DPRINTF(GIC, "Gicv3::write(): (redistributor %d) context_id %d "
162 "register %#x size %d is_secure_access %d value %#x\n",
163 redistributor_id, pkt->req->contextId(), daddr, size,
164 is_secure_access, data);
165 redistributors[redistributor_id]->write(daddr, data, size,

--- 104 unchanged lines hidden ---