Thread (109 messages) 109 messages, 6 authors, 2017-10-18
STALE3148d

[PATCH v3 16/28] arm64/sve: Probe SVE capabilities and usable vector lengths

From: Suzuki.Poulose@arm.com (Suzuki K Poulose)
Date: 2017-10-16 16:58:45
Also in: kvmarm, linux-arch

On 16/10/17 17:55, Dave Martin wrote:
On Mon, Oct 16, 2017 at 05:47:16PM +0100, Suzuki K Poulose wrote:
quoted
On 16/10/17 17:44, Dave Martin wrote:
quoted
On Mon, Oct 16, 2017 at 05:27:59PM +0100, Suzuki K Poulose wrote:
quoted
On 16/10/17 16:46, Dave Martin wrote:
quoted
On Thu, Oct 12, 2017 at 01:56:51PM +0100, Suzuki K Poulose wrote:
quoted
On 10/10/17 19:38, Dave Martin wrote:
[...]
quoted
quoted
quoted
quoted
@@ -670,6 +689,14 @@ void update_cpu_features(int cpu,
  					info->reg_mvfr2, boot->reg_mvfr2);
  	}
+	if (id_aa64pfr0_sve(info->reg_id_aa64pfr0)) {
+		taint |= check_update_ftr_reg(SYS_ZCR_EL1, cpu,
+					info->reg_zcr, boot->reg_zcr);
+
+		if (!sys_caps_initialised)
+			sve_update_vq_map();
+	}
nit: I am not sure if we should also check if the "current" sanitised value
of the id_aa64pfr0 also supports sve and skip the update if it isn't. The code
is as such fine without the check, its just that we can avoid computing the
map. It is in the CPU boot up path and hence is not performance critical.
So, either way we are fine.

Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com>
I think I prefer to avoid adding extra code to optimise the "broken SoC
design" case.
Sure.
quoted
Maybe we could revisit this later if needed.

Can you suggest some code?  Maybe the check is simpler than I think.
Something like :

if (id_aa64pfr0_sve(read_sanitised_ftr_reg(SYS_IDAA64PFR0)) &&
     id_aa64pfr0_sve(id_aa64pfr0)) {
     ...
}

should be enough.

Or even we could hack it to :

if (id_aa64pfr0_sve(id_aa64pfr0 | read_sanitised_ftr_reg(SYS_IDAA64PFR0)))

As I mentioned, the code as such is fine. Its just that we try to detect
if the SVE is already moot and skip the steps for this CPU.
How about the following, keeping the outer
if(id_aa64pfr0_sve(int->reg_id_aa64pfr0)) from my current code:

-		if (!sys_caps_initialised)
+		/* Probe vector lengths, unless we already gave up on SVE */
+		if (id_aa64pfr0_sve(read_sanitised_ftr_reg(ID_AA64PFR0_SVE)) &&
+		    !sys_caps_initialised)
			sve_update_vq_map();
Yep, that looks neater.
Sorry, that should have been

	if (id_aa64pfr0_sve(read_sanitised_ftr_reg(SYS_ID_AA64PFR0_EL1)) &&

(Disturbingly, the original does build and then hits a BUG(), because
ID_AA64PFR0_SVE happens to be defined).
Ouch ! I didn't notice that ;-). Good to see the BUG() catching such mistakes.

With the above, are you happy for me to apply your Reviewed-by, or would
you prefer to wait for the respin?
With the changes as we discussed above, please feel free to
add :

Reviewed-by : Suzuki K Poulose [off-list ref]
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help