{
        struct nlm_soc_info *nodep;
        uint64_t syspcibase;
-       uint32_t syscoremask;
+       uint32_t syscoremask, mask, fusemask;
        int core, n, cpu;
 
        for (n = 0; n < NLM_NR_NODES; n++) {
                if (n != 0)
                        nlm_node_init(n);
                nodep = nlm_get_node(n);
-               syscoremask = nlm_read_sys_reg(nodep->sysbase, SYS_CPU_RESET);
+
+               fusemask = nlm_read_sys_reg(nodep->sysbase,
+                                       SYS_EFUSE_DEVICE_CFG_STATUS0);
+               switch (read_c0_prid() & 0xff00) {
+               case PRID_IMP_NETLOGIC_XLP3XX:
+                       mask = 0xf;
+                       break;
+               case PRID_IMP_NETLOGIC_XLP2XX:
+                       mask = 0x3;
+                       break;
+               case PRID_IMP_NETLOGIC_XLP8XX:
+               default:
+                       mask = 0xff;
+                       break;
+               }
+
+               /*
+                * Fused out cores are set in the fusemask, and the remaining
+                * cores are renumbered to range 0 .. nactive-1
+                */
+               syscoremask = (1 << hweight32(~fusemask & mask)) - 1;
+
                /* The boot cpu */
-               if (n == 0) {
-                       syscoremask |= 1;
+               if (n == 0)
                        nodep->coremask = 1;
-               }
 
                for (core = 0; core < NLM_CORES_PER_NODE; core++) {
                        /* we will be on node 0 core 0 */