From db10d5d59c677daa184e07ca4fb43ecab1ddc942 Mon Sep 17 00:00:00 2001 From: Namhoon Kim Date: Tue, 14 Mar 2017 16:02:39 -0400 Subject: added net ISR support --- arch/arm/mm/dma-mapping.c | 19 +++++++++++++++++++ drivers/net/ethernet/freescale/fec_main.c | 5 +++++ litmus/bank_proc.c | 4 +++- litmus/cache_proc.c | 2 +- litmus/litmus.c | 2 +- litmus/page_dev.c | 2 -- litmus/sched_mc2.c | 4 +++- 7 files changed, 32 insertions(+), 6 deletions(-) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 7e7583ddd607..d0c70d97346b 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -341,6 +341,24 @@ void __init init_dma_coherent_pool_size(unsigned long size) atomic_pool_size = size; } +#define BANK_MASK 0x38000000 +#define BANK_SHIFT 27 + +#define CACHE_MASK 0x0000f000 +#define CACHE_SHIFT 12 + +/* Decoding page color, 0~15 */ +static inline unsigned int page_color(struct page *page) +{ + return ((page_to_phys(page)& CACHE_MASK) >> CACHE_SHIFT); +} + +/* Decoding page bank number, 0~7 */ +static inline unsigned int page_bank(struct page *page) +{ + return ((page_to_phys(page)& BANK_MASK) >> BANK_SHIFT); +} + /* * Initialise the coherent pool for atomic allocations. */ @@ -375,6 +393,7 @@ static int __init atomic_pool_init(void) (void *)PAGE_SHIFT); pr_info("DMA: preallocated %zd KiB pool for atomic coherent allocations\n", atomic_pool_size / 1024); + pr_info("DMA: coherent pool located in 0x%p phys %08x color %d bank %d\n", ptr, page_to_phys(page), page_color(page), page_bank(page)); return 0; } diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 66d47e448e4d..ad3759e8a749 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -61,6 +61,8 @@ #include +#include + #include "fec.h" static void set_multicast_list(struct net_device *ndev); @@ -1587,6 +1589,8 @@ fec_enet_interrupt(int irq, void *dev_id) writel(int_events, fep->hwp + FEC_IEVENT); fec_enet_collect_events(fep, int_events); + enter_irq_mode(); + if ((fep->work_tx || fep->work_rx) && fep->link) { ret = IRQ_HANDLED; @@ -1605,6 +1609,7 @@ fec_enet_interrupt(int irq, void *dev_id) if (fep->ptp_clock) fec_ptp_check_pps_event(fep); + exit_irq_mode(); return ret; } diff --git a/litmus/bank_proc.c b/litmus/bank_proc.c index 2284f4fd5816..b84f2603293e 100644 --- a/litmus/bank_proc.c +++ b/litmus/bank_proc.c @@ -247,9 +247,11 @@ static int do_add_pages(void) counter[color]++; // printk("page(%d) = color %x, bank %x, [color] =%d \n", color, page_color(page), page_bank(page), atomic_read(&color_groups[color].nr_pages)); //show_nr_pages(); - if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR && color>=32) { + //if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR && color>=32) { //if (atomic_read(&color_groups[color].nr_pages) < PAGES_PER_COLOR) { //if ( PAGES_PER_COLOR && color>=16*2) { + //if (color>=32) { + if (color>=0) { add_page_to_color_list(page); // printk("add page(%d) = color %x, bank %x\n", color, page_color(page), page_bank(page)); } else{ diff --git a/litmus/cache_proc.c b/litmus/cache_proc.c index 15c1b0145be2..9c50a0147f0d 100644 --- a/litmus/cache_proc.c +++ b/litmus/cache_proc.c @@ -531,7 +531,6 @@ void inline enter_irq_mode(void) return; prev_lockdown_i_reg[cpu] = readl_relaxed(ld_i_reg(cpu)); prev_lockdown_d_reg[cpu] = readl_relaxed(ld_d_reg(cpu)); - writel_relaxed(way_partitions[8], ld_i_reg(cpu)); writel_relaxed(way_partitions[8], ld_d_reg(cpu)); } @@ -542,6 +541,7 @@ void inline exit_irq_mode(void) if (os_isolation == 0) return; + writel_relaxed(prev_lockdown_i_reg[cpu], ld_i_reg(cpu)); writel_relaxed(prev_lockdown_d_reg[cpu], ld_d_reg(cpu)); } diff --git a/litmus/litmus.c b/litmus/litmus.c index 7fbabcee64d5..84446acb0869 100644 --- a/litmus/litmus.c +++ b/litmus/litmus.c @@ -549,7 +549,7 @@ asmlinkage long sys_test_call(unsigned int param) continue; } - TRACE_TASK(current, "addr: %08x, pfn: %05lx, _mapcount: %d, _count: %d flags: %s%s%s mapping: %p\n", vma_itr->vm_start + PAGE_SIZE*i, page_to_pfn(old_page), page_mapcount(old_page), page_count(old_page), vma_itr->vm_flags&VM_READ?"r":"-", vma_itr->vm_flags&VM_WRITE?"w":"-", vma_itr->vm_flags&VM_EXEC?"x":"-", &(old_page->mapping)); + TRACE_TASK(current, "addr: %08x, phy: %08x, pfn: %05lx, _mapcount: %d, _count: %d flags: %s%s%s mapping: %p\n", vma_itr->vm_start + PAGE_SIZE*i, page_to_phys(old_page), page_to_pfn(old_page), page_mapcount(old_page), page_count(old_page), vma_itr->vm_flags&VM_READ?"r":"-", vma_itr->vm_flags&VM_WRITE?"w":"-", vma_itr->vm_flags&VM_EXEC?"x":"-", &(old_page->mapping)); put_page(old_page); } vma_itr = vma_itr->vm_next; diff --git a/litmus/page_dev.c b/litmus/page_dev.c index 16a6b756353b..1e91b989dae2 100644 --- a/litmus/page_dev.c +++ b/litmus/page_dev.c @@ -269,8 +269,6 @@ static int __init init_litmus_page_dev(void) mutex_init(&dev_mutex); - printk(KERN_INFO "Registering LITMUS^RT proc page_dev sysctl.\n"); - litmus_sysctls = register_sysctl_table(litmus_dir_table); if (!litmus_sysctls) { printk(KERN_WARNING "Could not register LITMUS^RT page_dev sysctl.\n"); diff --git a/litmus/sched_mc2.c b/litmus/sched_mc2.c index 6c02a56959b5..b0300abf18e4 100644 --- a/litmus/sched_mc2.c +++ b/litmus/sched_mc2.c @@ -620,8 +620,10 @@ static inline void pre_schedule(struct task_struct *prev, int cpu) static inline void post_schedule(struct task_struct *next, int cpu) { enum crit_level lev; - if ((!next) || !is_realtime(next)) + if ((!next) || !is_realtime(next)) { + do_partition(NUM_CRIT_LEVELS, -1); return; + } lev = get_task_crit_level(next); do_partition(lev, cpu); -- cgit v1.2.2