return true;
 }
 
+static void npc_scan_exact_result(struct npc_mcam *mcam, u8 bit_number,
+                                 u8 key_nibble, u8 intf)
+{
+       u8 offset = (key_nibble * 4) % 64; /* offset within key word */
+       u8 kwi = (key_nibble * 4) / 64; /* which word in key */
+       u8 nr_bits = 4; /* bits in a nibble */
+       u8 type;
+
+       switch (bit_number) {
+       case 40 ... 43:
+               type = NPC_EXACT_RESULT;
+               break;
+
+       default:
+               return;
+       }
+       npc_set_kw_masks(mcam, type, nr_bits, kwi, offset, intf);
+}
+
 static void npc_scan_parse_result(struct npc_mcam *mcam, u8 bit_number,
                                  u8 key_nibble, u8 intf)
 {
 {
        struct npc_mcam *mcam = &rvu->hw->mcam;
        u8 lid, lt, ld, bitnr;
+       u64 cfg, masked_cfg;
        u8 key_nibble = 0;
-       u64 cfg;
 
        /* Scan and note how parse result is going to be in key.
         * A bit set in PARSE_NIBBLE_ENA corresponds to a nibble from
         * will be concatenated in key.
         */
        cfg = rvu_read64(rvu, blkaddr, NPC_AF_INTFX_KEX_CFG(intf));
-       cfg &= NPC_PARSE_NIBBLE;
-       for_each_set_bit(bitnr, (unsigned long *)&cfg, 31) {
+       masked_cfg = cfg & NPC_PARSE_NIBBLE;
+       for_each_set_bit(bitnr, (unsigned long *)&masked_cfg, 31) {
                npc_scan_parse_result(mcam, bitnr, key_nibble, intf);
                key_nibble++;
        }
 
+       /* Ignore exact match bits for mcam entries except the first rule
+        * which is drop on hit. This first rule is configured explitcitly by
+        * exact match code.
+        */
+       masked_cfg = cfg & NPC_EXACT_NIBBLE;
+       bitnr = NPC_EXACT_NIBBLE_START;
+       for_each_set_bit_from(bitnr, (unsigned long *)&masked_cfg,
+                             NPC_EXACT_NIBBLE_START) {
+               npc_scan_exact_result(mcam, bitnr, key_nibble, intf);
+               key_nibble++;
+       }
+
        /* Scan and note how layer data is going to be in key */
        for (lid = 0; lid < NPC_MAX_LID; lid++) {
                for (lt = 0; lt < NPC_MAX_LT; lt++) {