Peel the potatoes if you'd like, and then cut them into 1" pieces.
Put the 2T of butter or bacon grease to a large pot or dutch oven. Heat on medium heat to melt it, and then add the onion. Cook the onion in the butter until tender.
Add the potatoes, ham hocks, garlic, broth, salt, pepper, and berbere to the pot. Bring to a boil, and then lower to a simmer. Cover and allow to simmer on low for 3-4 hours.
Once the potatoes are cooked through, remove the ham hocks and place them on a plate or baking sheet. Remove the meat from the bones and set aside. You may have to wait for them to cool slightly before you can handle them. You can mash the potatoes in the meantime (see next step).
With a potato masher, mash all the potatoes until they are broken up and the soup is creamy. It's ok to leave some chunks of potato if you'd like. Then add the meat back into the soup and cover while you make the roux.
In a pan, melt the 4T of bacon grease or butter over medium heat. Once melted and simmering, add in the flour and whisk to combine into a paste. Then add the milk slowly, a few drizzles at a time, whisking in between each addition until the milk is completely incorporated. Once the roux has absorbed all of the milk, add it into the simmering soup and whisk well.
Add the sour cream and optional cheddar cheese in last, stirring to combine. Then serve.