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 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 |
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(); |
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 = |
115 daddr / redistSize; 116 daddr = daddr % redistSize; |
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 = |
156 daddr / redistSize; 157 daddr = daddr % redistSize; |
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 --- |