rc += altera_tse_initialize(0,
                                    CONFIG_SYS_ALTERA_TSE_MAC_BASE,
                                    CONFIG_SYS_ALTERA_TSE_SGDMA_RX_BASE,
-                                   CONFIG_SYS_ALTERA_TSE_SGDMA_TX_BASE);
+                                   CONFIG_SYS_ALTERA_TSE_SGDMA_TX_BASE,
+#if defined(CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_BASE) && \
+       (CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_SIZE > 0)
+                                   CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_BASE,
+                                   CONFIG_SYS_ALTERA_TSE_SGDMA_DESC_SIZE);
+#else
+                                   0,
+                                   0);
+#endif
 #endif
 #ifdef CONFIG_ETHOC
        rc += ethoc_initialize(0, CONFIG_SYS_ETHOC_BASE);
 
 
 /* TSE init code */
 int altera_tse_initialize(u8 dev_num, int mac_base,
-                         int sgdma_rx_base, int sgdma_tx_base)
+                         int sgdma_rx_base, int sgdma_tx_base,
+                         u32 sgdma_desc_base, u32 sgdma_desc_size)
 {
        struct altera_tse_priv *priv;
        struct eth_device *dev;
                free(dev);
                return 0;
        }
-       tx_desc = dma_alloc_coherent(sizeof(*tx_desc) * (3 + PKTBUFSRX),
-                                    &dma_handle);
+       if (sgdma_desc_size) {
+               if (sgdma_desc_size < (sizeof(*tx_desc) * (3 + PKTBUFSRX))) {
+                       printf("ALTERA_TSE-%hu: "
+                              "descriptor memory is too small\n", dev_num);
+                       free(priv);
+                       free(dev);
+                       return 0;
+               }
+               tx_desc = (struct alt_sgdma_descriptor *)sgdma_desc_base;
+       } else {
+               tx_desc = dma_alloc_coherent(sizeof(*tx_desc) * (3 + PKTBUFSRX),
+                                            &dma_handle);
+       }
+
        rx_desc = tx_desc + 2;
        debug("tx desc: address = 0x%x\n", (unsigned int)tx_desc);
        debug("rx desc: address = 0x%x\n", (unsigned int)rx_desc);
 
 
 /* Driver initialization prototypes */
 int altera_tse_initialize(u8 dev_num, int mac_base,
-                         int sgdma_rx_base, int sgdma_tx_base);
+                         int sgdma_rx_base, int sgdma_tx_base,
+                         u32 sgdma_desc_base, u32 sgdma_desc_size);
 int at91emac_register(bd_t *bis, unsigned long iobase);
 int au1x00_enet_initialize(bd_t*);
 int ax88180_initialize(bd_t *bis);