In large pot, sauté onions, garlic and ginger in olive oil for about 5 minutes.
Add the water, lentils, chickpeas, cannellini beans, tomatoes, carrots, celery, garam masala, cardamom, cayenne pepper and cumin. Bring to the boil for a few minutes then simmer for 1 to 1½ hours or longer, until the lentils are tender.
Purée half the soup in a food processor or blender. Return the puréed soup to the pot, stir and serve.