Index: sys/arm/xilinx/zy7_mp.c =================================================================== --- sys/arm/xilinx/zy7_mp.c +++ sys/arm/xilinx/zy7_mp.c @@ -45,20 +45,34 @@ #include #include -#define ZYNQ7_CPU1_ENTRY 0xfffffff0 +#define ZYNQ7_CPU1_ENTRY 0xfffffff0 -#define SCU_CONTROL_REG 0xf8f00000 -#define SCU_CONTROL_ENABLE (1 << 0) +#define SCU_CONTROL_REG 0xf8f00000 +#define SCU_CONTROL_ENABLE 1 +#define SCU_CONFIG_REG 0xf8f00004 +#define SCU_CONFIG_N_CPUS_MASK 3 void zynq7_mp_setmaxid(platform_t plat) { + bus_space_handle_t scu_handle; - mp_maxid = 1; - mp_ncpus = 2; + if (mp_ncpus != 0) + return; + + /* Map in SCU config register. */ + if (bus_space_map(fdtbus_bs_tag, SCU_CONFIG_REG, 4, 0, + &scu_handle) != 0) + panic("zynq7_mp_setmaxid: Could not map SCU config reg.\n"); + + mp_maxid = bus_space_read_4(fdtbus_bs_tag, scu_handle, 0) & + SCU_CONFIG_N_CPUS_MASK; + mp_ncpus = mp_maxid + 1; + + bus_space_unmap(fdtbus_bs_tag, scu_handle, 4); } -void +void zynq7_mp_start_ap(platform_t plat) { bus_space_handle_t scu_handle; @@ -67,8 +81,8 @@ /* Map in SCU control register. */ if (bus_space_map(fdtbus_bs_tag, SCU_CONTROL_REG, 4, - 0, &scu_handle) != 0) - panic("platform_mp_start_ap: Couldn't map SCU config reg\n"); + 0, &scu_handle) != 0) + panic("zynq7_mp_start_ap: Could not map SCU control reg.\n"); /* Set SCU enable bit. */ scu_ctrl = bus_space_read_4(fdtbus_bs_tag, scu_handle, 0); @@ -80,7 +94,7 @@ /* Map in magic location to give entry address to CPU1. */ if (bus_space_map(fdtbus_bs_tag, ZYNQ7_CPU1_ENTRY, 4, 0, &ocm_handle) != 0) - panic("platform_mp_start_ap: Couldn't map OCM\n"); + panic("zynq7_mp_start_ap: Could not map OCM\n"); /* Write start address for CPU1. */ bus_space_write_4(fdtbus_bs_tag, ocm_handle, 0,