ARMv7 Vexpress fixes for v4.10

Couple of fixes to MCPM/CCI drivers to check and ensure that the kernel
 is actually allowed to take control over CCI ports(i.e. running in
 secure mode) before enabling MCPM.
 
 This is needed to boot Linux in HYP mode (very useful for development
 on virtualization) with CONFIG_MCPM enabled kernel.
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1
 
 iQIcBAABCAAGBQJYEyg8AAoJEABBurwxfuKY7XkQAJyqWD4h8QkJbtgKxTpOK17M
 8unQ55COpZzstjcPBhUwMKuPQKZEUvUQ0E8g6xPv7ttNCJt40XOe4ygNbsA1qiL+
 TZpe2e5wUNd06Wjbr1LZIVcQ1TlZWzkFOxwjjkvf1NHSOv4eapiETj1Z1HXuWwpl
 nRPTjjBU0ie0+gfx+ZxbH04JI/giegDcF1p344oNhwDyIoq3z/VRnVx14seZMV/a
 EYvniBqtyTNT9Q8yx60xh+AYZhlstHBvHkwkgqZKBaDoOlhj2S3xroD9T4XFlQlk
 2xCtpsuHBoUjlfWlWgF3WwaaTD4Tbzj4bUhnJ/mtYjrZ1ShskikkoWiJDWIrzkpJ
 Kh+y075aldR24SvcQhLY18h/KDgACKGi3iZL4IqZ/0tuIonfmQNBFrJS+HrqLB56
 ALn9E12a/hSNIma7YOfslLfQvb7zX7byD2oWxLyWacYaquGDS8DdmzJrkyhV33KQ
 1ZulIUCC6yQNkUIguFYluMPl/tHNodtYiuI8OGfL7IiSJBAcNZ+v9bHqPHasBb7X
 zP2CNXZLpgQ7iWHUJETOsHy1Joqf9F0ATQXW6gy1R8xu9ST0dNvSe4V0p9J4oo9G
 iSNEpaaromUrM4q+ZZIUF+GqKcpt4DrOfIgUZuSwj44Ukx3OL9uQ6T8d2P2Q7gIB
 NU/KESLcgJUPGXvJ5w2U
 =U8Hw
 -----END PGP SIGNATURE-----

Merge tag 'vexpress-fixes-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux into next/soc

ARMv7 Vexpress fixes for v4.10

Couple of fixes to MCPM/CCI drivers to check and ensure that the kernel
is actually allowed to take control over CCI ports(i.e. running in
secure mode) before enabling MCPM.

This is needed to boot Linux in HYP mode (very useful for development
on virtualization) with CONFIG_MCPM enabled kernel.

* tag 'vexpress-fixes-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/sudeep.holla/linux:
  drivers: cci: add missing CCI port availability firmware check
  ARM: vexpress: refine MCPM smp operations override criteria

Signed-off-by: Olof Johansson <[email protected]>
This commit is contained in:
Olof Johansson 2016-10-29 11:40:52 -07:00
commit 21dbf0b34d
2 changed files with 36 additions and 8 deletions

View file

@ -26,19 +26,37 @@
bool __init vexpress_smp_init_ops(void)
{
#ifdef CONFIG_MCPM
int cpu;
struct device_node *cpu_node, *cci_node;
/*
* The best way to detect a multi-cluster configuration at the moment
* is to look for the presence of a CCI in the system.
* The best way to detect a multi-cluster configuration
* is to detect if the kernel can take over CCI ports
* control. Loop over possible CPUs and check if CCI
* port control is available.
* Override the default vexpress_smp_ops if so.
*/
struct device_node *node;
node = of_find_compatible_node(NULL, NULL, "arm,cci-400");
if (node && of_device_is_available(node)) {
mcpm_smp_set_ops();
return true;
for_each_possible_cpu(cpu) {
bool available;
cpu_node = of_get_cpu_node(cpu, NULL);
if (WARN(!cpu_node, "Missing cpu device node!"))
return false;
cci_node = of_parse_phandle(cpu_node, "cci-control-port", 0);
available = cci_node && of_device_is_available(cci_node);
of_node_put(cci_node);
of_node_put(cpu_node);
if (!available)
return false;
}
#endif
mcpm_smp_set_ops();
return true;
#else
return false;
#endif
}
static const struct of_device_id vexpress_smp_dt_scu_match[] __initconst = {

View file

@ -2190,6 +2190,9 @@ static int cci_probe_ports(struct device_node *np)
if (!of_match_node(arm_cci_ctrl_if_matches, cp))
continue;
if (!of_device_is_available(cp))
continue;
i = nb_ace + nb_ace_lite;
if (i >= nb_cci_ports)
@ -2232,6 +2235,13 @@ static int cci_probe_ports(struct device_node *np)
ports[i].dn = cp;
}
/*
* If there is no CCI port that is under kernel control
* return early and report probe status.
*/
if (!nb_ace && !nb_ace_lite)
return -ENODEV;
/* initialize a stashed array of ACE ports to speed-up look-up */
cci_ace_init_ports();