Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6
[pandora-kernel.git] / drivers / staging / tidspbridge / core / ue_deh.c
index 3430418..e24ea0c 100644 (file)
 #include <dspbridge/drv.h>
 #include <dspbridge/wdt.h>
 
-static u32 fault_addr;
-
-static void mmu_fault_dpc(unsigned long data)
-{
-       struct deh_mgr *deh = (void *)data;
-
-       if (!deh)
-               return;
-
-       bridge_deh_notify(deh, DSP_MMUFAULT, 0);
-}
-
-static irqreturn_t mmu_fault_isr(int irq, void *data)
-{
-       struct deh_mgr *deh = data;
-       struct cfg_hostres *resources;
-       u32 event;
-
-       if (!deh)
-               return IRQ_HANDLED;
-
-       resources = deh->hbridge_context->resources;
-       if (!resources) {
-               dev_dbg(bridge, "%s: Failed to get Host Resources\n",
-                               __func__);
-               return IRQ_HANDLED;
-       }
-
-       hw_mmu_event_status(resources->dw_dmmu_base, &event);
-       if (event == HW_MMU_TRANSLATION_FAULT) {
-               hw_mmu_fault_addr_read(resources->dw_dmmu_base, &fault_addr);
-               dev_dbg(bridge, "%s: event=0x%x, fault_addr=0x%x\n", __func__,
-                               event, fault_addr);
-               /*
-                * Schedule a DPC directly. In the future, it may be
-                * necessary to check if DSP MMU fault is intended for
-                * Bridge.
-                */
-               tasklet_schedule(&deh->dpc_tasklet);
-
-               /* Disable the MMU events, else once we clear it will
-                * start to raise INTs again */
-               hw_mmu_event_disable(resources->dw_dmmu_base,
-                               HW_MMU_TRANSLATION_FAULT);
-       } else {
-               hw_mmu_event_disable(resources->dw_dmmu_base,
-                               HW_MMU_ALL_INTERRUPTS);
-       }
-       return IRQ_HANDLED;
-}
-
 int bridge_deh_create(struct deh_mgr **ret_deh,
                struct dev_object *hdev_obj)
 {
@@ -109,18 +58,9 @@ int bridge_deh_create(struct deh_mgr **ret_deh,
        }
        ntfy_init(deh->ntfy_obj);
 
-       /* Create a MMUfault DPC */
-       tasklet_init(&deh->dpc_tasklet, mmu_fault_dpc, (u32) deh);
-
        /* Fill in context structure */
        deh->hbridge_context = hbridge_context;
 
-       /* Install ISR function for DSP MMU fault */
-       status = request_irq(INT_DSP_MMU_IRQ, mmu_fault_isr, 0,
-                       "DspBridge\tiommu fault", deh);
-       if (status < 0)
-               goto err;
-
        *ret_deh = deh;
        return 0;
 
@@ -140,11 +80,6 @@ int bridge_deh_destroy(struct deh_mgr *deh)
                ntfy_delete(deh->ntfy_obj);
                kfree(deh->ntfy_obj);
        }
-       /* Disable DSP MMU fault */
-       free_irq(INT_DSP_MMU_IRQ, deh);
-
-       /* Free DPC object */
-       tasklet_kill(&deh->dpc_tasklet);
 
        /* Deallocate the DEH manager object */
        kfree(deh);
@@ -166,48 +101,6 @@ int bridge_deh_register_notify(struct deh_mgr *deh, u32 event_mask,
                return ntfy_unregister(deh->ntfy_obj, hnotification);
 }
 
-#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
-static void mmu_fault_print_stack(struct bridge_dev_context *dev_context)
-{
-       struct cfg_hostres *resources;
-       struct hw_mmu_map_attrs_t map_attrs = {
-               .endianism = HW_LITTLE_ENDIAN,
-               .element_size = HW_ELEM_SIZE16BIT,
-               .mixed_size = HW_MMU_CPUES,
-       };
-       void *dummy_va_addr;
-
-       resources = dev_context->resources;
-       dummy_va_addr = (void*)__get_free_page(GFP_ATOMIC);
-
-       /*
-        * Before acking the MMU fault, let's make sure MMU can only
-        * access entry #0. Then add a new entry so that the DSP OS
-        * can continue in order to dump the stack.
-        */
-       hw_mmu_twl_disable(resources->dw_dmmu_base);
-       hw_mmu_tlb_flush_all(resources->dw_dmmu_base);
-
-       hw_mmu_tlb_add(resources->dw_dmmu_base,
-                       virt_to_phys(dummy_va_addr), fault_addr,
-                       HW_PAGE_SIZE4KB, 1,
-                       &map_attrs, HW_SET, HW_SET);
-
-       dsp_clk_enable(DSP_CLK_GPT8);
-
-       dsp_gpt_wait_overflow(DSP_CLK_GPT8, 0xfffffffe);
-
-       /* Clear MMU interrupt */
-       hw_mmu_event_ack(resources->dw_dmmu_base,
-                       HW_MMU_TRANSLATION_FAULT);
-       dump_dsp_stack(dev_context);
-       dsp_clk_disable(DSP_CLK_GPT8);
-
-       hw_mmu_disable(resources->dw_dmmu_base);
-       free_page((unsigned long)dummy_va_addr);
-}
-#endif
-
 static inline const char *event_to_string(int event)
 {
        switch (event) {
@@ -240,13 +133,7 @@ void bridge_deh_notify(struct deh_mgr *deh, int event, int info)
 #endif
                break;
        case DSP_MMUFAULT:
-               dev_err(bridge, "%s: %s, addr=0x%x", __func__,
-                               str, fault_addr);
-#ifdef CONFIG_TIDSPBRIDGE_BACKTRACE
-               print_dsp_trace_buffer(dev_context);
-               dump_dl_modules(dev_context);
-               mmu_fault_print_stack(dev_context);
-#endif
+               dev_err(bridge, "%s: %s, addr=0x%x", __func__, str, info);
                break;
        default:
                dev_err(bridge, "%s: %s", __func__, str);