Peel and chop your onion. Rinse your broccoli, cut off and discard the stems, and cut up the florets.
In a large pot, melt your butter over medium heat. Add the onions and cook for three or four minutes, until they begin to soften. Sprinkle the flour over the onions and stir to mix, cooking for one minute. Slowly whisk in the milk and half and half.
Add in the broccoli and stir in your salt, pepper, garlic powder, and red pepper flakes. Cover the pot until it starts to simmer. Remove the lid, lower the heat, and let the broccoli simmer for 30 minutes, or until it is tender, stirring occasionally. While the broccoli is cooking, shred your cheddar and grate your Parmesan, if needed.
When the broccoli is tender, add 2 ¼ cups cheddar to the pot a handful at a time, stirring after each addition until the cheese melts. Stir in the Parmesan.
Use a potato masher to break up the broccoli a bit for a slightly chunky soup. If you want a smoother soup, use an immersion blender or regular blender. (See notes.)
In your pot, whisk chicken stock into your broccoli-cheddar soup over low heat. The soup is ready when it's heated through.
Serve the soup topped with your reserved shredded cheddar and additional red pepper flakes at the table. Store leftovers in the refrigerator for up to four days.
Notes
I used to blend the soup a bit with an immersion blender(affiliate link), but we prefer it a little more chunky, as shown in the pictures. A potato masher(affiliate link) does the job just fine.If you want a smoother soup, feel free to use a regular or immersion blender. If you use a regular blender, you'll have to puree the soup in two batches so it fits.