Lines Matching +full:cpu +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0
39 GUEST_ASSERT(count--); in gicv3_gicd_wait_for_rwp()
49 GUEST_ASSERT(count--); in gicv3_gicr_wait_for_rwp()
109 * All other fields are read-only, so no need to read CTLR first. In in gicv3_set_eoi_split()
117 uint32_t gicv3_reg_readl(uint32_t cpu_or_dist, uint64_t offset) in gicv3_reg_readl() argument
121 return readl(base + offset); in gicv3_reg_readl()
124 void gicv3_reg_writel(uint32_t cpu_or_dist, uint64_t offset, uint32_t reg_val) in gicv3_reg_writel() argument
128 writel(reg_val, base + offset); in gicv3_reg_writel()
131 uint32_t gicv3_getl_fields(uint32_t cpu_or_dist, uint64_t offset, uint32_t mask) in gicv3_getl_fields() argument
133 return gicv3_reg_readl(cpu_or_dist, offset) & mask; in gicv3_getl_fields()
136 void gicv3_setl_fields(uint32_t cpu_or_dist, uint64_t offset, in gicv3_setl_fields() argument
139 uint32_t tmp = gicv3_reg_readl(cpu_or_dist, offset) & ~mask; in gicv3_setl_fields()
142 gicv3_reg_writel(cpu_or_dist, offset, tmp); in gicv3_setl_fields()
146 * We use a single offset for the distributor and redistributor maps as they
150 * map that doesn't implement it; like GICR_WAKER's offset of 0x0014 being
153 static void gicv3_access_reg(uint32_t intid, uint64_t offset, in gicv3_access_reg() argument
157 uint32_t cpu = guest_get_vcpuid(); in gicv3_access_reg() local
173 mask = ((1U << bits_per_field) - 1) << shift; in gicv3_access_reg()
175 /* Set offset to the actual register holding intid's config. */ in gicv3_access_reg()
176 offset += (intid / fields_per_reg) * (reg_bits / 8); in gicv3_access_reg()
178 cpu_or_dist = (intid_range == SPI_RANGE) ? DIST_BIT : cpu; in gicv3_access_reg()
181 gicv3_setl_fields(cpu_or_dist, offset, mask, *val << shift); in gicv3_access_reg()
182 *val = gicv3_getl_fields(cpu_or_dist, offset, mask) >> shift; in gicv3_access_reg()
185 static void gicv3_write_reg(uint32_t intid, uint64_t offset, in gicv3_write_reg() argument
188 gicv3_access_reg(intid, offset, reg_bits, in gicv3_write_reg()
192 static uint32_t gicv3_read_reg(uint32_t intid, uint64_t offset, in gicv3_read_reg() argument
197 gicv3_access_reg(intid, offset, reg_bits, in gicv3_read_reg()
207 /* Sets the intid to be level-sensitive or edge-triggered. */
221 uint32_t cpu = guest_get_vcpuid(); in gicv3_irq_enable() local
224 gicv3_wait_for_rwp(is_spi ? DIST_BIT : cpu); in gicv3_irq_enable()
230 uint32_t cpu = guest_get_vcpuid(); in gicv3_irq_disable() local
233 gicv3_wait_for_rwp(is_spi ? DIST_BIT : cpu); in gicv3_irq_disable()
276 GUEST_ASSERT(count--); in gicv3_enable_redist()
281 static inline void *gicr_base_cpu(void *redist_base, uint32_t cpu) in gicr_base_cpu() argument
284 return redist_base + cpu * SZ_64K * 2; in gicr_base_cpu()
287 static void gicv3_cpu_init(unsigned int cpu, void *redist_base) in gicv3_cpu_init() argument
293 GUEST_ASSERT(cpu < gicv3_data.nr_cpus); in gicv3_cpu_init()
295 redist_base_cpu = gicr_base_cpu(redist_base, cpu); in gicv3_cpu_init()
301 * Mark all the SGI and PPI interrupts as non-secure Group-1. in gicv3_cpu_init()
322 /* Enable non-secure Group-1 interrupts */ in gicv3_cpu_init()
325 gicv3_data.redist_base[cpu] = redist_base_cpu; in gicv3_cpu_init()
338 * Mark all the SPI interrupts as non-secure Group-1. in gicv3_dist_init()
352 /* Wait for the settings to sync-in */ in gicv3_dist_init()
374 * The redistributor and CPU interfaces are initialized in gicv3_init()