From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752144AbdBMKAm (ORCPT ); Mon, 13 Feb 2017 05:00:42 -0500 Received: from Galois.linutronix.de ([146.0.238.70]:38293 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751480AbdBMKAl (ORCPT ); Mon, 13 Feb 2017 05:00:41 -0500 Date: Mon, 13 Feb 2017 11:00:38 +0100 (CET) From: Thomas Gleixner To: Marc Zyngier cc: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, Christoffer Dall , Jason Cooper , Eric Auger Subject: Re: [RFC PATCH 06/33] irqchip/gic-v3-its: Add probing for VLPI properties In-Reply-To: <1484648454-21216-7-git-send-email-marc.zyngier@arm.com> Message-ID: References: <1484648454-21216-1-git-send-email-marc.zyngier@arm.com> <1484648454-21216-7-git-send-email-marc.zyngier@arm.com> User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 17 Jan 2017, Marc Zyngier wrote: > + typer = gic_read_typer(its_base + GITS_TYPER); > its->base = its_base; > its->phys_base = res->start; > - its->ite_size = ((gic_read_typer(its_base + GITS_TYPER) >> 4) & 0xf) + 1; > + its->ite_size = ((typer >> 4) & 0xf) + 1; > + its->is_v4 = !!(typer & GITS_TYPER_VLPIS); > + if (its->is_v4 && !(typer & GITS_TYPER_VMOVP)) { > + int its_number; > + > + its_number = find_first_zero_bit(&its_list_map, 16); s/16/ITS_MAX_ENTITIES or whatever. > + if (its_number >= 16) { > + pr_err("ITS@%pa: No ITSList entry available!\n", > + &res->start); > + err = -EINVAL; > + goto out_free_its; > + } > + > + ctlr = readl_relaxed(its_base + GITS_CTLR); > + ctlr &= ~GITS_CTLR_ITS_NUMBER; > + ctlr |= its_number << GITS_CTLR_ITS_NUMBER_SHIFT; > + writel_relaxed(ctlr, its_base + GITS_CTLR); > + ctlr = readl_relaxed(its_base + GITS_CTLR); > + if ((ctlr & GITS_CTLR_ITS_NUMBER) != (its_number << GITS_CTLR_ITS_NUMBER_SHIFT)) { > + its_number = ctlr & GITS_CTLR_ITS_NUMBER; > + its_number >>= GITS_CTLR_ITS_NUMBER_SHIFT; > + } > + > + if (test_and_set_bit(its_number, &its_list_map)) { You just established above that the bit is not set. I assume that this is code which has no concurrency concerns.... Thanks, tglx