mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-15 13:22:55 +00:00
Non-critical fixes for omaps for v3.11 merge window.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iQIcBAABAgAGBQJRuK6ZAAoJEBvUPslcq6VzNRIP/2A20ibUpXBP4tJlY3g2RAfz F3n0xy9PpPlkVYuswKK6CLzdO2Z79GLF2obqPhZQ2K6S4FIVOk3r6CSveXaEeybh AWeweD4/9TzO8AwOgydQ35dajXlXUoXH2tgBnjC9BxwzIyROWOrluLTorHtBuHr8 xSb3orjVwYg2v9pPOhoKmen88rAyw/AIeSl+1cTVuEhF3/h02dV6SrP/mzUwofxM H3S48N1BDaGkdP2urCLb2lATK/mhrKI+7NnbJetHfk3l4sb/fkia0XPBaEI5weeA QbZSDayN0ykguRVim5hZmkjKBwh5PO6WlrFutnLWVCao6zHnFqSQUqsbrG8eIkPi m3x3aJAY8XGNc0QSIuk4QJ0FA+inbaRtZo9hld9deAHMCeJlcBO4C53GtimlVZuj tdEmu8WJYFPs/mKGNaYjlz2h4JqPtwvBpg7zfh3n8NAKjVXcpXdI50vurHNGYlHL 4o5+tnFy2b5L/YKnuhXajvJeMedJjvG80liliyS6DbQRHs0+aZQamAcDnMcENgBu hzw/aHV0060mdjZDIkNcS0Z5AJZ1EXMTeGkO+f6XmlGg4gqIeMsUZGojpw418cyT Z6fDvrir2NRLume0tJZQNd4DzDDf85zQ9qFmtL6WUNPSrJ6Y5a0BfZnzkGZgRZgu hg55Xb0qnyfTaUNTCLUb =vzQW -----END PGP SIGNATURE----- Merge tag 'omap-for-v3.11/fixes-non-critical-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap into next/fixes-non-critical From Tony Lindgren: Non-critical fixes for omaps for v3.11 merge window. * tag 'omap-for-v3.11/fixes-non-critical-signed' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap: ARM: OMAP2+: omap-usb-host: Fix memory leaks ARM: OMAP2+: Fix serial init for device tree based booting arm/omap: use const char properly ARM: OMAP2+: devices: Do not print error when dss_hdmi hwmod lookup fails ARM: OMAP2+: devices: Do not print error when DMIC hwmod lookup fails ARM: OMAP2+: devices: Do not print error when McPDM hwmod lookup fails ARM: OMAP: add vdds_sdi supply for omapdss_sdi.0 ARM: OMAP: add vdds_dsi supply for omapdss_dpi.0 ARM: OMAP: fix dsi regulator names + Linux 3.10-rc5 Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
9d6dec733b
@ -34,7 +34,7 @@ command:
|
||||
After a while you will start to get messages about current status or error like
|
||||
in the original code.
|
||||
|
||||
Note that running a new test will stop any in progress test.
|
||||
Note that running a new test will not stop any in progress test.
|
||||
|
||||
The following command should return actual state of the test.
|
||||
% cat /sys/kernel/debug/dmatest/run
|
||||
@ -52,8 +52,8 @@ To wait for test done the user may perform a busy loop that checks the state.
|
||||
|
||||
The module parameters that is supplied to the kernel command line will be used
|
||||
for the first performed test. After user gets a control, the test could be
|
||||
interrupted or re-run with same or different parameters. For the details see
|
||||
the above section "Part 2 - When dmatest is built as a module..."
|
||||
re-run with the same or different parameters. For the details see the above
|
||||
section "Part 2 - When dmatest is built as a module..."
|
||||
|
||||
In both cases the module parameters are used as initial values for the test case.
|
||||
You always could check them at run-time by running
|
||||
|
@ -33,6 +33,9 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||
removing extended attributes) the on-disk superblock feature
|
||||
bit field will be updated to reflect this format being in use.
|
||||
|
||||
CRC enabled filesystems always use the attr2 format, and so
|
||||
will reject the noattr2 mount option if it is set.
|
||||
|
||||
barrier
|
||||
Enables the use of block layer write barriers for writes into
|
||||
the journal and unwritten extent conversion. This allows for
|
||||
|
12
MAINTAINERS
12
MAINTAINERS
@ -2890,8 +2890,8 @@ F: drivers/media/dvb-frontends/ec100*
|
||||
|
||||
ECRYPT FILE SYSTEM
|
||||
M: Tyler Hicks <tyhicks@canonical.com>
|
||||
M: Dustin Kirkland <dustin.kirkland@gazzang.com>
|
||||
L: ecryptfs@vger.kernel.org
|
||||
W: http://ecryptfs.org
|
||||
W: https://launchpad.net/ecryptfs
|
||||
S: Supported
|
||||
F: Documentation/filesystems/ecryptfs.txt
|
||||
@ -4448,6 +4448,16 @@ S: Maintained
|
||||
F: drivers/scsi/*iscsi*
|
||||
F: include/scsi/*iscsi*
|
||||
|
||||
ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR
|
||||
M: Or Gerlitz <ogerlitz@mellanox.com>
|
||||
M: Roi Dayan <roid@mellanox.com>
|
||||
L: linux-rdma@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.openfabrics.org
|
||||
W: www.open-iscsi.org
|
||||
Q: http://patchwork.kernel.org/project/linux-rdma/list/
|
||||
F: drivers/infiniband/ulp/iser
|
||||
|
||||
ISDN SUBSYSTEM
|
||||
M: Karsten Keil <isdn@linux-pingi.de>
|
||||
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Unicycling Gorilla
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -44,6 +44,7 @@
|
||||
reg = <0x7e201000 0x1000>;
|
||||
interrupts = <2 25>;
|
||||
clock-frequency = <3000000>;
|
||||
arm,primecell-periphid = <0x00241011>;
|
||||
};
|
||||
|
||||
gpio: gpio {
|
||||
|
@ -141,8 +141,8 @@
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
||||
reg = <0x43fa4000 0x4000>;
|
||||
clocks = <&clks 62>;
|
||||
clock-names = "ipg";
|
||||
clocks = <&clks 62>, <&clks 62>;
|
||||
clock-names = "ipg", "per";
|
||||
interrupts = <14>;
|
||||
status = "disabled";
|
||||
};
|
||||
@ -182,8 +182,8 @@
|
||||
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
||||
reg = <0x50004000 0x4000>;
|
||||
interrupts = <0>;
|
||||
clocks = <&clks 80>;
|
||||
clock-names = "ipg";
|
||||
clocks = <&clks 80>, <&clks 80>;
|
||||
clock-names = "ipg", "per";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -210,8 +210,8 @@
|
||||
#size-cells = <0>;
|
||||
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
||||
reg = <0x50010000 0x4000>;
|
||||
clocks = <&clks 79>;
|
||||
clock-names = "ipg";
|
||||
clocks = <&clks 79>, <&clks 79>;
|
||||
clock-names = "ipg", "per";
|
||||
interrupts = <13>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -131,7 +131,7 @@
|
||||
compatible = "fsl,imx27-cspi";
|
||||
reg = <0x1000e000 0x1000>;
|
||||
interrupts = <16>;
|
||||
clocks = <&clks 53>, <&clks 0>;
|
||||
clocks = <&clks 53>, <&clks 53>;
|
||||
clock-names = "ipg", "per";
|
||||
status = "disabled";
|
||||
};
|
||||
@ -142,7 +142,7 @@
|
||||
compatible = "fsl,imx27-cspi";
|
||||
reg = <0x1000f000 0x1000>;
|
||||
interrupts = <15>;
|
||||
clocks = <&clks 52>, <&clks 0>;
|
||||
clocks = <&clks 52>, <&clks 52>;
|
||||
clock-names = "ipg", "per";
|
||||
status = "disabled";
|
||||
};
|
||||
@ -223,7 +223,7 @@
|
||||
compatible = "fsl,imx27-cspi";
|
||||
reg = <0x10017000 0x1000>;
|
||||
interrupts = <6>;
|
||||
clocks = <&clks 51>, <&clks 0>;
|
||||
clocks = <&clks 51>, <&clks 51>;
|
||||
clock-names = "ipg", "per";
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -631,7 +631,7 @@
|
||||
compatible = "fsl,imx51-cspi", "fsl,imx35-cspi";
|
||||
reg = <0x83fc0000 0x4000>;
|
||||
interrupts = <38>;
|
||||
clocks = <&clks 55>, <&clks 0>;
|
||||
clocks = <&clks 55>, <&clks 55>;
|
||||
clock-names = "ipg", "per";
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -714,7 +714,7 @@
|
||||
compatible = "fsl,imx53-cspi", "fsl,imx35-cspi";
|
||||
reg = <0x63fc0000 0x4000>;
|
||||
interrupts = <38>;
|
||||
clocks = <&clks 55>, <&clks 0>;
|
||||
clocks = <&clks 55>, <&clks 55>;
|
||||
clock-names = "ipg", "per";
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -33,18 +33,6 @@
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
/*
|
||||
* We need to delay page freeing for SMP as other CPUs can access pages
|
||||
* which have been removed but not yet had their TLB entries invalidated.
|
||||
* Also, as ARMv7 speculative prefetch can drag new entries into the TLB,
|
||||
* we need to apply this same delaying tactic to ensure correct operation.
|
||||
*/
|
||||
#if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7)
|
||||
#define tlb_fast_mode(tlb) 0
|
||||
#else
|
||||
#define tlb_fast_mode(tlb) 1
|
||||
#endif
|
||||
|
||||
#define MMU_GATHER_BUNDLE 8
|
||||
|
||||
/*
|
||||
@ -112,12 +100,10 @@ static inline void __tlb_alloc_page(struct mmu_gather *tlb)
|
||||
static inline void tlb_flush_mmu(struct mmu_gather *tlb)
|
||||
{
|
||||
tlb_flush(tlb);
|
||||
if (!tlb_fast_mode(tlb)) {
|
||||
free_pages_and_swap_cache(tlb->pages, tlb->nr);
|
||||
tlb->nr = 0;
|
||||
if (tlb->pages == tlb->local)
|
||||
__tlb_alloc_page(tlb);
|
||||
}
|
||||
free_pages_and_swap_cache(tlb->pages, tlb->nr);
|
||||
tlb->nr = 0;
|
||||
if (tlb->pages == tlb->local)
|
||||
__tlb_alloc_page(tlb);
|
||||
}
|
||||
|
||||
static inline void
|
||||
@ -178,11 +164,6 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
|
||||
|
||||
static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||
{
|
||||
if (tlb_fast_mode(tlb)) {
|
||||
free_page_and_swap_cache(page);
|
||||
return 1; /* avoid calling tlb_flush_mmu */
|
||||
}
|
||||
|
||||
tlb->pages[tlb->nr++] = page;
|
||||
VM_BUG_ON(tlb->nr > tlb->max);
|
||||
return tlb->max - tlb->nr;
|
||||
|
@ -492,6 +492,11 @@ static void vcpu_pause(struct kvm_vcpu *vcpu)
|
||||
wait_event_interruptible(*wq, !vcpu->arch.pause);
|
||||
}
|
||||
|
||||
static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return vcpu->arch.target >= 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
|
||||
* @vcpu: The VCPU pointer
|
||||
@ -508,8 +513,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||
int ret;
|
||||
sigset_t sigsaved;
|
||||
|
||||
/* Make sure they initialize the vcpu with KVM_ARM_VCPU_INIT */
|
||||
if (unlikely(vcpu->arch.target < 0))
|
||||
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
||||
return -ENOEXEC;
|
||||
|
||||
ret = kvm_vcpu_first_run_init(vcpu);
|
||||
@ -710,6 +714,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
||||
case KVM_SET_ONE_REG:
|
||||
case KVM_GET_ONE_REG: {
|
||||
struct kvm_one_reg reg;
|
||||
|
||||
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
||||
return -ENOEXEC;
|
||||
|
||||
if (copy_from_user(®, argp, sizeof(reg)))
|
||||
return -EFAULT;
|
||||
if (ioctl == KVM_SET_ONE_REG)
|
||||
@ -722,6 +730,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
||||
struct kvm_reg_list reg_list;
|
||||
unsigned n;
|
||||
|
||||
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
||||
return -ENOEXEC;
|
||||
|
||||
if (copy_from_user(®_list, user_list, sizeof(reg_list)))
|
||||
return -EFAULT;
|
||||
n = reg_list.n;
|
||||
|
@ -43,7 +43,14 @@ static phys_addr_t hyp_idmap_vector;
|
||||
|
||||
static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
||||
{
|
||||
kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
|
||||
/*
|
||||
* This function also gets called when dealing with HYP page
|
||||
* tables. As HYP doesn't have an associated struct kvm (and
|
||||
* the HYP page tables are fairly static), we don't do
|
||||
* anything there.
|
||||
*/
|
||||
if (kvm)
|
||||
kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
|
||||
}
|
||||
|
||||
static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
|
||||
@ -78,18 +85,20 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)
|
||||
return p;
|
||||
}
|
||||
|
||||
static void clear_pud_entry(pud_t *pud)
|
||||
static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr)
|
||||
{
|
||||
pmd_t *pmd_table = pmd_offset(pud, 0);
|
||||
pud_clear(pud);
|
||||
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||
pmd_free(NULL, pmd_table);
|
||||
put_page(virt_to_page(pud));
|
||||
}
|
||||
|
||||
static void clear_pmd_entry(pmd_t *pmd)
|
||||
static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr)
|
||||
{
|
||||
pte_t *pte_table = pte_offset_kernel(pmd, 0);
|
||||
pmd_clear(pmd);
|
||||
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||
pte_free_kernel(NULL, pte_table);
|
||||
put_page(virt_to_page(pmd));
|
||||
}
|
||||
@ -100,11 +109,12 @@ static bool pmd_empty(pmd_t *pmd)
|
||||
return page_count(pmd_page) == 1;
|
||||
}
|
||||
|
||||
static void clear_pte_entry(pte_t *pte)
|
||||
static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr)
|
||||
{
|
||||
if (pte_present(*pte)) {
|
||||
kvm_set_pte(pte, __pte(0));
|
||||
put_page(virt_to_page(pte));
|
||||
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||
}
|
||||
}
|
||||
|
||||
@ -114,7 +124,8 @@ static bool pte_empty(pte_t *pte)
|
||||
return page_count(pte_page) == 1;
|
||||
}
|
||||
|
||||
static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size)
|
||||
static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
|
||||
unsigned long long start, u64 size)
|
||||
{
|
||||
pgd_t *pgd;
|
||||
pud_t *pud;
|
||||
@ -138,15 +149,15 @@ static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size)
|
||||
}
|
||||
|
||||
pte = pte_offset_kernel(pmd, addr);
|
||||
clear_pte_entry(pte);
|
||||
clear_pte_entry(kvm, pte, addr);
|
||||
range = PAGE_SIZE;
|
||||
|
||||
/* If we emptied the pte, walk back up the ladder */
|
||||
if (pte_empty(pte)) {
|
||||
clear_pmd_entry(pmd);
|
||||
clear_pmd_entry(kvm, pmd, addr);
|
||||
range = PMD_SIZE;
|
||||
if (pmd_empty(pmd)) {
|
||||
clear_pud_entry(pud);
|
||||
clear_pud_entry(kvm, pud, addr);
|
||||
range = PUD_SIZE;
|
||||
}
|
||||
}
|
||||
@ -165,14 +176,14 @@ void free_boot_hyp_pgd(void)
|
||||
mutex_lock(&kvm_hyp_pgd_mutex);
|
||||
|
||||
if (boot_hyp_pgd) {
|
||||
unmap_range(boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE);
|
||||
unmap_range(boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
||||
unmap_range(NULL, boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE);
|
||||
unmap_range(NULL, boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
||||
kfree(boot_hyp_pgd);
|
||||
boot_hyp_pgd = NULL;
|
||||
}
|
||||
|
||||
if (hyp_pgd)
|
||||
unmap_range(hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
||||
unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
||||
|
||||
kfree(init_bounce_page);
|
||||
init_bounce_page = NULL;
|
||||
@ -200,9 +211,10 @@ void free_hyp_pgds(void)
|
||||
|
||||
if (hyp_pgd) {
|
||||
for (addr = PAGE_OFFSET; virt_addr_valid(addr); addr += PGDIR_SIZE)
|
||||
unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
||||
unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
||||
for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE)
|
||||
unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
||||
unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
||||
|
||||
kfree(hyp_pgd);
|
||||
hyp_pgd = NULL;
|
||||
}
|
||||
@ -393,7 +405,7 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm)
|
||||
*/
|
||||
static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size)
|
||||
{
|
||||
unmap_range(kvm->arch.pgd, start, size);
|
||||
unmap_range(kvm, kvm->arch.pgd, start, size);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -675,7 +687,6 @@ static void handle_hva_to_gpa(struct kvm *kvm,
|
||||
static void kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, void *data)
|
||||
{
|
||||
unmap_stage2_range(kvm, gpa, PAGE_SIZE);
|
||||
kvm_tlb_flush_vmid_ipa(kvm, gpa);
|
||||
}
|
||||
|
||||
int kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
|
||||
|
@ -386,6 +386,8 @@ int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
|
||||
|
||||
void __init exynos_init_io(struct map_desc *mach_desc, int size)
|
||||
{
|
||||
debug_ll_io_init();
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
if (initial_boot_params)
|
||||
of_scan_flat_dt(exynos_fdt_map_chipid, NULL);
|
||||
|
@ -181,14 +181,14 @@ static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy",
|
||||
static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", };
|
||||
static const char *periph_sels[] = { "periph_pre", "periph_clk2", };
|
||||
static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", };
|
||||
static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
||||
static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "periph", "pll3_pfd1_540m", };
|
||||
static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", };
|
||||
static const char *gpu_axi_sels[] = { "axi", "ahb", };
|
||||
static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", };
|
||||
static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
|
||||
static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", };
|
||||
static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
|
||||
static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
|
||||
static const char *ldb_di_sels[] = { "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
|
||||
static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
||||
static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
||||
static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
||||
|
@ -41,13 +41,3 @@ void __init qnap_dt_ts219_init(void)
|
||||
|
||||
pm_power_off = qnap_tsx1x_power_off;
|
||||
}
|
||||
|
||||
/* FIXME: Will not work with DT. Maybe use MPP40_GPIO? */
|
||||
static int __init ts219_pci_init(void)
|
||||
{
|
||||
if (machine_is_ts219())
|
||||
kirkwood_pcie_init(KW_PCIE0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(ts219_pci_init);
|
||||
|
@ -32,15 +32,21 @@ ENTRY(ll_set_cpu_coherent)
|
||||
|
||||
/* Add CPU to SMP group - Atomic */
|
||||
add r3, r0, #ARMADA_XP_CFB_CTL_REG_OFFSET
|
||||
ldr r2, [r3]
|
||||
1:
|
||||
ldrex r2, [r3]
|
||||
orr r2, r2, r1
|
||||
str r2, [r3]
|
||||
strex r0, r2, [r3]
|
||||
cmp r0, #0
|
||||
bne 1b
|
||||
|
||||
/* Enable coherency on CPU - Atomic */
|
||||
add r3, r0, #ARMADA_XP_CFB_CFG_REG_OFFSET
|
||||
ldr r2, [r3]
|
||||
add r3, r3, #ARMADA_XP_CFB_CFG_REG_OFFSET
|
||||
1:
|
||||
ldrex r2, [r3]
|
||||
orr r2, r2, r1
|
||||
str r2, [r3]
|
||||
strex r0, r2, [r3]
|
||||
cmp r0, #0
|
||||
bne 1b
|
||||
|
||||
dsb
|
||||
|
||||
|
@ -293,7 +293,8 @@ static struct regulator_consumer_supply cm_t35_vsim_supply[] = {
|
||||
static struct regulator_consumer_supply cm_t35_vio_supplies[] = {
|
||||
REGULATOR_SUPPLY("vcc", "spi1.0"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dpi.0"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
|
@ -222,6 +222,7 @@ static struct twl4030_gpio_platform_data devkit8000_gpio_data = {
|
||||
|
||||
static struct regulator_consumer_supply devkit8000_vpll1_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dpi.0"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"),
|
||||
};
|
||||
|
||||
|
@ -272,7 +272,8 @@ static struct regulator_init_data ldp_vaux1 = {
|
||||
|
||||
static struct regulator_consumer_supply ldp_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dpi.0"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data ldp_vpll2 = {
|
||||
|
@ -343,6 +343,7 @@ static struct regulator_consumer_supply pandora_vmmc3_supply[] = {
|
||||
static struct regulator_consumer_supply pandora_vdds_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_sdi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dpi.0"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"),
|
||||
};
|
||||
|
||||
|
@ -553,6 +553,7 @@ static struct regulator_consumer_supply rx51_vio_supplies[] = {
|
||||
|
||||
static struct regulator_consumer_supply rx51_vaux1_consumers[] = {
|
||||
REGULATOR_SUPPLY("vdds_sdi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_sdi", "omapdss_sdi.0"),
|
||||
/* Si4713 supply */
|
||||
REGULATOR_SUPPLY("vdd", "2-0063"),
|
||||
/* lis3lv02d */
|
||||
|
@ -249,6 +249,7 @@ void omap_ctrl_write_dsp_boot_addr(u32 bootaddr)
|
||||
u32 offset = cpu_is_omap243x() ? OMAP243X_CONTROL_IVA2_BOOTADDR :
|
||||
cpu_is_omap34xx() ? OMAP343X_CONTROL_IVA2_BOOTADDR :
|
||||
cpu_is_omap44xx() ? OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR :
|
||||
soc_is_omap54xx() ? OMAP4_CTRL_MODULE_CORE_DSP_BOOTADDR :
|
||||
0;
|
||||
|
||||
if (!offset) {
|
||||
|
@ -374,10 +374,8 @@ static void __init omap_init_mcpdm(void)
|
||||
struct platform_device *pdev;
|
||||
|
||||
oh = omap_hwmod_lookup("mcpdm");
|
||||
if (!oh) {
|
||||
printk(KERN_ERR "Could not look up mcpdm hw_mod\n");
|
||||
if (!oh)
|
||||
return;
|
||||
}
|
||||
|
||||
pdev = omap_device_build("omap-mcpdm", -1, oh, NULL, 0);
|
||||
WARN(IS_ERR(pdev), "Can't build omap_device for omap-mcpdm.\n");
|
||||
@ -395,10 +393,8 @@ static void __init omap_init_dmic(void)
|
||||
struct platform_device *pdev;
|
||||
|
||||
oh = omap_hwmod_lookup("dmic");
|
||||
if (!oh) {
|
||||
pr_err("Could not look up dmic hw_mod\n");
|
||||
if (!oh)
|
||||
return;
|
||||
}
|
||||
|
||||
pdev = omap_device_build("omap-dmic", -1, oh, NULL, 0);
|
||||
WARN(IS_ERR(pdev), "Can't build omap_device for omap-dmic.\n");
|
||||
@ -421,10 +417,8 @@ static void __init omap_init_hdmi_audio(void)
|
||||
struct platform_device *pdev;
|
||||
|
||||
oh = omap_hwmod_lookup("dss_hdmi");
|
||||
if (!oh) {
|
||||
printk(KERN_ERR "Could not look up dss_hdmi hw_mod\n");
|
||||
if (!oh)
|
||||
return;
|
||||
}
|
||||
|
||||
pdev = omap_device_build("omap-hdmi-audio-dai", -1, oh, NULL, 0);
|
||||
WARN(IS_ERR(pdev),
|
||||
|
@ -601,7 +601,7 @@ void __init omap2_set_globals_tap(u32 class, void __iomem *tap)
|
||||
|
||||
#ifdef CONFIG_SOC_BUS
|
||||
|
||||
static const char const *omap_types[] = {
|
||||
static const char * const omap_types[] = {
|
||||
[OMAP2_DEVICE_TYPE_TEST] = "TST",
|
||||
[OMAP2_DEVICE_TYPE_EMU] = "EMU",
|
||||
[OMAP2_DEVICE_TYPE_SEC] = "HS",
|
||||
|
@ -176,6 +176,9 @@ static char *cmdline_find_option(char *str)
|
||||
|
||||
static int __init omap_serial_early_init(void)
|
||||
{
|
||||
if (of_have_populated_dt())
|
||||
return -ENODEV;
|
||||
|
||||
do {
|
||||
char oh_name[MAX_UART_HWMOD_NAME_LEN];
|
||||
struct omap_hwmod *oh;
|
||||
|
@ -140,6 +140,7 @@ static struct regulator_init_data omap3_vdac_idata = {
|
||||
|
||||
static struct regulator_consumer_supply omap3_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dpi.0"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi.0"),
|
||||
};
|
||||
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/usb/phy.h>
|
||||
#include <linux/usb/nop-usb-xceiv.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "omap_device.h"
|
||||
@ -560,7 +561,8 @@ static int usbhs_add_regulator(char *name, char *dev_id, char *dev_supply,
|
||||
struct regulator_init_data *reg_data;
|
||||
struct fixed_voltage_config *config;
|
||||
struct platform_device *pdev;
|
||||
int ret;
|
||||
struct platform_device_info pdevinfo;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
supplies = kzalloc(sizeof(*supplies), GFP_KERNEL);
|
||||
if (!supplies)
|
||||
@ -571,7 +573,7 @@ static int usbhs_add_regulator(char *name, char *dev_id, char *dev_supply,
|
||||
|
||||
reg_data = kzalloc(sizeof(*reg_data), GFP_KERNEL);
|
||||
if (!reg_data)
|
||||
return -ENOMEM;
|
||||
goto err_data;
|
||||
|
||||
reg_data->constraints.valid_ops_mask = REGULATOR_CHANGE_STATUS;
|
||||
reg_data->consumer_supplies = supplies;
|
||||
@ -580,39 +582,53 @@ static int usbhs_add_regulator(char *name, char *dev_id, char *dev_supply,
|
||||
config = kmemdup(&hsusb_reg_config, sizeof(hsusb_reg_config),
|
||||
GFP_KERNEL);
|
||||
if (!config)
|
||||
return -ENOMEM;
|
||||
goto err_config;
|
||||
|
||||
config->supply_name = kstrdup(name, GFP_KERNEL);
|
||||
if (!config->supply_name)
|
||||
goto err_supplyname;
|
||||
|
||||
config->supply_name = name;
|
||||
config->gpio = gpio;
|
||||
config->enable_high = polarity;
|
||||
config->init_data = reg_data;
|
||||
|
||||
/* create a regulator device */
|
||||
pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
|
||||
if (!pdev)
|
||||
return -ENOMEM;
|
||||
memset(&pdevinfo, 0, sizeof(pdevinfo));
|
||||
pdevinfo.name = reg_name;
|
||||
pdevinfo.id = PLATFORM_DEVID_AUTO;
|
||||
pdevinfo.data = config;
|
||||
pdevinfo.size_data = sizeof(*config);
|
||||
|
||||
pdev->id = PLATFORM_DEVID_AUTO;
|
||||
pdev->name = reg_name;
|
||||
pdev->dev.platform_data = config;
|
||||
pdev = platform_device_register_full(&pdevinfo);
|
||||
if (IS_ERR(pdev)) {
|
||||
ret = PTR_ERR(pdev);
|
||||
pr_err("%s: Failed registering regulator %s for %s : %d\n",
|
||||
__func__, name, dev_id, ret);
|
||||
goto err_register;
|
||||
}
|
||||
|
||||
ret = platform_device_register(pdev);
|
||||
if (ret)
|
||||
pr_err("%s: Failed registering regulator %s for %s\n",
|
||||
__func__, name, dev_id);
|
||||
return 0;
|
||||
|
||||
err_register:
|
||||
kfree(config->supply_name);
|
||||
err_supplyname:
|
||||
kfree(config);
|
||||
err_config:
|
||||
kfree(reg_data);
|
||||
err_data:
|
||||
kfree(supplies);
|
||||
return ret;
|
||||
}
|
||||
|
||||
#define MAX_STR 20
|
||||
|
||||
int usbhs_init_phys(struct usbhs_phy_data *phy, int num_phys)
|
||||
{
|
||||
char *rail_name;
|
||||
int i, len;
|
||||
char rail_name[MAX_STR];
|
||||
int i;
|
||||
struct platform_device *pdev;
|
||||
char *phy_id;
|
||||
|
||||
/* the phy_id will be something like "nop_usb_xceiv.1" */
|
||||
len = strlen(nop_name) + 3; /* 3 -> ".1" and NULL terminator */
|
||||
struct platform_device_info pdevinfo;
|
||||
|
||||
for (i = 0; i < num_phys; i++) {
|
||||
|
||||
@ -627,25 +643,26 @@ int usbhs_init_phys(struct usbhs_phy_data *phy, int num_phys)
|
||||
!gpio_is_valid(phy->vcc_gpio))
|
||||
continue;
|
||||
|
||||
phy_id = kmalloc(MAX_STR, GFP_KERNEL);
|
||||
if (!phy_id) {
|
||||
pr_err("%s: kmalloc() failed\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* create a NOP PHY device */
|
||||
pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
|
||||
if (!pdev)
|
||||
return -ENOMEM;
|
||||
memset(&pdevinfo, 0, sizeof(pdevinfo));
|
||||
pdevinfo.name = nop_name;
|
||||
pdevinfo.id = phy->port;
|
||||
pdevinfo.data = phy->platform_data;
|
||||
pdevinfo.size_data = sizeof(struct nop_usb_xceiv_platform_data);
|
||||
|
||||
pdev->id = phy->port;
|
||||
pdev->name = nop_name;
|
||||
pdev->dev.platform_data = phy->platform_data;
|
||||
|
||||
phy_id = kmalloc(len, GFP_KERNEL);
|
||||
if (!phy_id)
|
||||
return -ENOMEM;
|
||||
|
||||
scnprintf(phy_id, len, "nop_usb_xceiv.%d\n",
|
||||
pdev->id);
|
||||
|
||||
if (platform_device_register(pdev)) {
|
||||
pr_err("%s: Failed to register device %s\n",
|
||||
__func__, phy_id);
|
||||
scnprintf(phy_id, MAX_STR, "nop_usb_xceiv.%d",
|
||||
phy->port);
|
||||
pdev = platform_device_register_full(&pdevinfo);
|
||||
if (IS_ERR(pdev)) {
|
||||
pr_err("%s: Failed to register device %s : %ld\n",
|
||||
__func__, phy_id, PTR_ERR(pdev));
|
||||
kfree(phy_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -653,26 +670,15 @@ int usbhs_init_phys(struct usbhs_phy_data *phy, int num_phys)
|
||||
|
||||
/* Do we need RESET regulator ? */
|
||||
if (gpio_is_valid(phy->reset_gpio)) {
|
||||
|
||||
rail_name = kmalloc(13, GFP_KERNEL);
|
||||
if (!rail_name)
|
||||
return -ENOMEM;
|
||||
|
||||
scnprintf(rail_name, 13, "hsusb%d_reset", phy->port);
|
||||
|
||||
scnprintf(rail_name, MAX_STR,
|
||||
"hsusb%d_reset", phy->port);
|
||||
usbhs_add_regulator(rail_name, phy_id, "reset",
|
||||
phy->reset_gpio, 1);
|
||||
}
|
||||
|
||||
/* Do we need VCC regulator ? */
|
||||
if (gpio_is_valid(phy->vcc_gpio)) {
|
||||
|
||||
rail_name = kmalloc(13, GFP_KERNEL);
|
||||
if (!rail_name)
|
||||
return -ENOMEM;
|
||||
|
||||
scnprintf(rail_name, 13, "hsusb%d_vcc", phy->port);
|
||||
|
||||
scnprintf(rail_name, MAX_STR, "hsusb%d_vcc", phy->port);
|
||||
usbhs_add_regulator(rail_name, phy_id, "vcc",
|
||||
phy->vcc_gpio, phy->vcc_polarity);
|
||||
}
|
||||
|
@ -252,7 +252,7 @@ static struct sh_timer_config cmt10_platform_data = {
|
||||
.name = "CMT10",
|
||||
.channel_offset = 0x10,
|
||||
.timer_bit = 0,
|
||||
.clockevent_rating = 125,
|
||||
.clockevent_rating = 80,
|
||||
.clocksource_rating = 125,
|
||||
};
|
||||
|
||||
|
@ -374,6 +374,7 @@ static struct ab8500_regulator_reg_init ab8500_reg_init[] = {
|
||||
static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
|
||||
/* supplies to the display/camera */
|
||||
[AB8500_LDO_AUX1] = {
|
||||
.supply_regulator = "ab8500-ext-supply3",
|
||||
.constraints = {
|
||||
.name = "V-DISPLAY",
|
||||
.min_uV = 2800000,
|
||||
@ -387,6 +388,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
|
||||
},
|
||||
/* supplies to the on-board eMMC */
|
||||
[AB8500_LDO_AUX2] = {
|
||||
.supply_regulator = "ab8500-ext-supply3",
|
||||
.constraints = {
|
||||
.name = "V-eMMC1",
|
||||
.min_uV = 1100000,
|
||||
@ -402,6 +404,7 @@ static struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = {
|
||||
},
|
||||
/* supply for VAUX3, supplies to SDcard slots */
|
||||
[AB8500_LDO_AUX3] = {
|
||||
.supply_regulator = "ab8500-ext-supply3",
|
||||
.constraints = {
|
||||
.name = "V-MMC-SD",
|
||||
.min_uV = 1100000,
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include <asm/proc-fns.h>
|
||||
|
||||
#include "db8500-regs.h"
|
||||
#include "id.h"
|
||||
|
||||
static atomic_t master = ATOMIC_INIT(0);
|
||||
static DEFINE_SPINLOCK(master_lock);
|
||||
@ -114,6 +115,9 @@ static struct cpuidle_driver ux500_idle_driver = {
|
||||
|
||||
int __init ux500_idle_init(void)
|
||||
{
|
||||
if (!(cpu_is_u8500_family() || cpu_is_ux540_family()))
|
||||
return -ENODEV;
|
||||
|
||||
/* Configure wake up reasons */
|
||||
prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |
|
||||
PRCMU_WAKEUP(ABB));
|
||||
|
@ -66,6 +66,9 @@ uart_rd(unsigned int reg)
|
||||
|
||||
static void putc(int ch)
|
||||
{
|
||||
if (!config_enabled(CONFIG_DEBUG_LL))
|
||||
return;
|
||||
|
||||
if (uart_rd(S3C2410_UFCON) & S3C2410_UFCON_FIFOMODE) {
|
||||
int level;
|
||||
|
||||
@ -118,7 +121,12 @@ static void arch_decomp_error(const char *x)
|
||||
#ifdef CONFIG_S3C_BOOT_UART_FORCE_FIFO
|
||||
static inline void arch_enable_uart_fifo(void)
|
||||
{
|
||||
u32 fifocon = uart_rd(S3C2410_UFCON);
|
||||
u32 fifocon;
|
||||
|
||||
if (!config_enabled(CONFIG_DEBUG_LL))
|
||||
return;
|
||||
|
||||
fifocon = uart_rd(S3C2410_UFCON);
|
||||
|
||||
if (!(fifocon & S3C2410_UFCON_FIFOMODE)) {
|
||||
fifocon |= S3C2410_UFCON_RESETBOTH;
|
||||
|
@ -46,12 +46,6 @@
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/machvec.h>
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
# define tlb_fast_mode(tlb) ((tlb)->nr == ~0U)
|
||||
#else
|
||||
# define tlb_fast_mode(tlb) (1)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we can't allocate a page to make a big batch of page pointers
|
||||
* to work on, then just handle a few from the on-stack structure.
|
||||
@ -60,7 +54,7 @@
|
||||
|
||||
struct mmu_gather {
|
||||
struct mm_struct *mm;
|
||||
unsigned int nr; /* == ~0U => fast mode */
|
||||
unsigned int nr;
|
||||
unsigned int max;
|
||||
unsigned char fullmm; /* non-zero means full mm flush */
|
||||
unsigned char need_flush; /* really unmapped some PTEs? */
|
||||
@ -103,6 +97,7 @@ extern struct ia64_tr_entry *ia64_idtrs[NR_CPUS];
|
||||
static inline void
|
||||
ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long end)
|
||||
{
|
||||
unsigned long i;
|
||||
unsigned int nr;
|
||||
|
||||
if (!tlb->need_flush)
|
||||
@ -141,13 +136,11 @@ ia64_tlb_flush_mmu (struct mmu_gather *tlb, unsigned long start, unsigned long e
|
||||
|
||||
/* lastly, release the freed pages */
|
||||
nr = tlb->nr;
|
||||
if (!tlb_fast_mode(tlb)) {
|
||||
unsigned long i;
|
||||
tlb->nr = 0;
|
||||
tlb->start_addr = ~0UL;
|
||||
for (i = 0; i < nr; ++i)
|
||||
free_page_and_swap_cache(tlb->pages[i]);
|
||||
}
|
||||
|
||||
tlb->nr = 0;
|
||||
tlb->start_addr = ~0UL;
|
||||
for (i = 0; i < nr; ++i)
|
||||
free_page_and_swap_cache(tlb->pages[i]);
|
||||
}
|
||||
|
||||
static inline void __tlb_alloc_page(struct mmu_gather *tlb)
|
||||
@ -167,20 +160,7 @@ tlb_gather_mmu(struct mmu_gather *tlb, struct mm_struct *mm, unsigned int full_m
|
||||
tlb->mm = mm;
|
||||
tlb->max = ARRAY_SIZE(tlb->local);
|
||||
tlb->pages = tlb->local;
|
||||
/*
|
||||
* Use fast mode if only 1 CPU is online.
|
||||
*
|
||||
* It would be tempting to turn on fast-mode for full_mm_flush as well. But this
|
||||
* doesn't work because of speculative accesses and software prefetching: the page
|
||||
* table of "mm" may (and usually is) the currently active page table and even
|
||||
* though the kernel won't do any user-space accesses during the TLB shoot down, a
|
||||
* compiler might use speculation or lfetch.fault on what happens to be a valid
|
||||
* user-space address. This in turn could trigger a TLB miss fault (or a VHPT
|
||||
* walk) and re-insert a TLB entry we just removed. Slow mode avoids such
|
||||
* problems. (We could make fast-mode work by switching the current task to a
|
||||
* different "mm" during the shootdown.) --davidm 08/02/2002
|
||||
*/
|
||||
tlb->nr = (num_online_cpus() == 1) ? ~0U : 0;
|
||||
tlb->nr = 0;
|
||||
tlb->fullmm = full_mm_flush;
|
||||
tlb->start_addr = ~0UL;
|
||||
}
|
||||
@ -214,11 +194,6 @@ static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||
{
|
||||
tlb->need_flush = 1;
|
||||
|
||||
if (tlb_fast_mode(tlb)) {
|
||||
free_page_and_swap_cache(page);
|
||||
return 1; /* avoid calling tlb_flush_mmu */
|
||||
}
|
||||
|
||||
if (!tlb->nr && tlb->pages == tlb->local)
|
||||
__tlb_alloc_page(tlb);
|
||||
|
||||
|
@ -86,6 +86,7 @@ static inline int gpio_cansleep(unsigned gpio)
|
||||
return gpio < MCFGPIO_PIN_MAX ? 0 : __gpio_cansleep(gpio);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_GPIOLIB
|
||||
static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)
|
||||
{
|
||||
int err;
|
||||
@ -105,5 +106,5 @@ static inline int gpio_request_one(unsigned gpio, unsigned long flags, const cha
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_GPIOLIB */
|
||||
#endif
|
||||
|
@ -2752,11 +2752,9 @@ func_return get_new_page
|
||||
#ifdef CONFIG_MAC
|
||||
|
||||
L(scc_initable_mac):
|
||||
.byte 9,12 /* Reset */
|
||||
.byte 4,0x44 /* x16, 1 stopbit, no parity */
|
||||
.byte 3,0xc0 /* receiver: 8 bpc */
|
||||
.byte 5,0xe2 /* transmitter: 8 bpc, assert dtr/rts */
|
||||
.byte 9,0 /* no interrupts */
|
||||
.byte 10,0 /* NRZ */
|
||||
.byte 11,0x50 /* use baud rate generator */
|
||||
.byte 12,1,13,0 /* 38400 baud */
|
||||
@ -2899,6 +2897,7 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
||||
is_not_mac(L(serial_init_not_mac))
|
||||
|
||||
#ifdef SERIAL_DEBUG
|
||||
|
||||
/* You may define either or both of these. */
|
||||
#define MAC_USE_SCC_A /* Modem port */
|
||||
#define MAC_USE_SCC_B /* Printer port */
|
||||
@ -2908,9 +2907,21 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
||||
#define mac_scc_cha_b_data_offset 0x4
|
||||
#define mac_scc_cha_a_data_offset 0x6
|
||||
|
||||
#if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B)
|
||||
movel %pc@(L(mac_sccbase)),%a0
|
||||
/* Reset SCC device */
|
||||
moveb #9,%a0@(mac_scc_cha_a_ctrl_offset)
|
||||
moveb #0xc0,%a0@(mac_scc_cha_a_ctrl_offset)
|
||||
/* Wait for 5 PCLK cycles, which is about 68 CPU cycles */
|
||||
/* 5 / 3.6864 MHz = approx. 1.36 us = 68 / 50 MHz */
|
||||
movel #35,%d0
|
||||
5:
|
||||
subq #1,%d0
|
||||
jne 5b
|
||||
#endif
|
||||
|
||||
#ifdef MAC_USE_SCC_A
|
||||
/* Initialize channel A */
|
||||
movel %pc@(L(mac_sccbase)),%a0
|
||||
lea %pc@(L(scc_initable_mac)),%a1
|
||||
5: moveb %a1@+,%d0
|
||||
jmi 6f
|
||||
@ -2922,9 +2933,6 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
||||
|
||||
#ifdef MAC_USE_SCC_B
|
||||
/* Initialize channel B */
|
||||
#ifndef MAC_USE_SCC_A /* Load mac_sccbase only if needed */
|
||||
movel %pc@(L(mac_sccbase)),%a0
|
||||
#endif /* MAC_USE_SCC_A */
|
||||
lea %pc@(L(scc_initable_mac)),%a1
|
||||
7: moveb %a1@+,%d0
|
||||
jmi 8f
|
||||
@ -2933,6 +2941,7 @@ func_start serial_init,%d0/%d1/%a0/%a1
|
||||
jra 7b
|
||||
8:
|
||||
#endif /* MAC_USE_SCC_B */
|
||||
|
||||
#endif /* SERIAL_DEBUG */
|
||||
|
||||
jra L(serial_init_done)
|
||||
@ -3006,17 +3015,17 @@ func_start serial_putc,%d0/%d1/%a0/%a1
|
||||
|
||||
#ifdef SERIAL_DEBUG
|
||||
|
||||
#ifdef MAC_USE_SCC_A
|
||||
#if defined(MAC_USE_SCC_A) || defined(MAC_USE_SCC_B)
|
||||
movel %pc@(L(mac_sccbase)),%a1
|
||||
#endif
|
||||
|
||||
#ifdef MAC_USE_SCC_A
|
||||
3: btst #2,%a1@(mac_scc_cha_a_ctrl_offset)
|
||||
jeq 3b
|
||||
moveb %d0,%a1@(mac_scc_cha_a_data_offset)
|
||||
#endif /* MAC_USE_SCC_A */
|
||||
|
||||
#ifdef MAC_USE_SCC_B
|
||||
#ifndef MAC_USE_SCC_A /* Load mac_sccbase only if needed */
|
||||
movel %pc@(L(mac_sccbase)),%a1
|
||||
#endif /* MAC_USE_SCC_A */
|
||||
4: btst #2,%a1@(mac_scc_cha_b_ctrl_offset)
|
||||
jeq 4b
|
||||
moveb %d0,%a1@(mac_scc_cha_b_data_offset)
|
||||
|
@ -102,21 +102,23 @@ do { \
|
||||
|
||||
#define flush_cache_range(vma, start, len) do { } while (0)
|
||||
|
||||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
||||
do { \
|
||||
u32 addr = virt_to_phys(dst); \
|
||||
memcpy((dst), (src), (len)); \
|
||||
if (vma->vm_flags & VM_EXEC) { \
|
||||
invalidate_icache_range((unsigned) (addr), \
|
||||
(unsigned) (addr) + PAGE_SIZE); \
|
||||
flush_dcache_range((unsigned) (addr), \
|
||||
(unsigned) (addr) + PAGE_SIZE); \
|
||||
} \
|
||||
} while (0)
|
||||
static inline void copy_to_user_page(struct vm_area_struct *vma,
|
||||
struct page *page, unsigned long vaddr,
|
||||
void *dst, void *src, int len)
|
||||
{
|
||||
u32 addr = virt_to_phys(dst);
|
||||
memcpy(dst, src, len);
|
||||
if (vma->vm_flags & VM_EXEC) {
|
||||
invalidate_icache_range(addr, addr + PAGE_SIZE);
|
||||
flush_dcache_range(addr, addr + PAGE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
|
||||
do { \
|
||||
memcpy((dst), (src), (len)); \
|
||||
} while (0)
|
||||
static inline void copy_from_user_page(struct vm_area_struct *vma,
|
||||
struct page *page, unsigned long vaddr,
|
||||
void *dst, void *src, int len)
|
||||
{
|
||||
memcpy(dst, src, len);
|
||||
}
|
||||
|
||||
#endif /* _ASM_MICROBLAZE_CACHEFLUSH_H */
|
||||
|
@ -99,13 +99,13 @@ static inline int access_ok(int type, const void __user *addr,
|
||||
if ((get_fs().seg < ((unsigned long)addr)) ||
|
||||
(get_fs().seg < ((unsigned long)addr + size - 1))) {
|
||||
pr_debug("ACCESS fail: %s at 0x%08x (size 0x%x), seg 0x%08x\n",
|
||||
type ? "WRITE" : "READ ", (u32)addr, (u32)size,
|
||||
type ? "WRITE" : "READ ", (__force u32)addr, (u32)size,
|
||||
(u32)get_fs().seg);
|
||||
return 0;
|
||||
}
|
||||
ok:
|
||||
pr_debug("ACCESS OK: %s at 0x%08x (size 0x%x), seg 0x%08x\n",
|
||||
type ? "WRITE" : "READ ", (u32)addr, (u32)size,
|
||||
type ? "WRITE" : "READ ", (__force u32)addr, (u32)size,
|
||||
(u32)get_fs().seg);
|
||||
return 1;
|
||||
}
|
||||
|
@ -428,13 +428,16 @@ static void octeon_restart(char *command)
|
||||
*/
|
||||
static void octeon_kill_core(void *arg)
|
||||
{
|
||||
mb();
|
||||
if (octeon_is_simulation()) {
|
||||
/* The simulator needs the watchdog to stop for dead cores */
|
||||
cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0);
|
||||
if (octeon_is_simulation())
|
||||
/* A break instruction causes the simulator stop a core */
|
||||
asm volatile ("sync\nbreak");
|
||||
}
|
||||
asm volatile ("break" ::: "memory");
|
||||
|
||||
local_irq_disable();
|
||||
/* Disable watchdog on this core. */
|
||||
cvmx_write_csr(CVMX_CIU_WDOGX(cvmx_get_core_num()), 0);
|
||||
/* Spin in a low power mode. */
|
||||
while (true)
|
||||
asm volatile ("wait" ::: "memory");
|
||||
}
|
||||
|
||||
|
||||
|
@ -496,10 +496,6 @@ struct kvm_mips_callbacks {
|
||||
uint32_t cause);
|
||||
int (*irq_clear) (struct kvm_vcpu *vcpu, unsigned int priority,
|
||||
uint32_t cause);
|
||||
int (*vcpu_ioctl_get_regs) (struct kvm_vcpu *vcpu,
|
||||
struct kvm_regs *regs);
|
||||
int (*vcpu_ioctl_set_regs) (struct kvm_vcpu *vcpu,
|
||||
struct kvm_regs *regs);
|
||||
};
|
||||
extern struct kvm_mips_callbacks *kvm_mips_callbacks;
|
||||
int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks);
|
||||
|
@ -16,6 +16,38 @@
|
||||
#include <asm/isadep.h>
|
||||
#include <uapi/asm/ptrace.h>
|
||||
|
||||
/*
|
||||
* This struct defines the way the registers are stored on the stack during a
|
||||
* system call/exception. As usual the registers k0/k1 aren't being saved.
|
||||
*/
|
||||
struct pt_regs {
|
||||
#ifdef CONFIG_32BIT
|
||||
/* Pad bytes for argument save space on the stack. */
|
||||
unsigned long pad0[6];
|
||||
#endif
|
||||
|
||||
/* Saved main processor registers. */
|
||||
unsigned long regs[32];
|
||||
|
||||
/* Saved special registers. */
|
||||
unsigned long cp0_status;
|
||||
unsigned long hi;
|
||||
unsigned long lo;
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
unsigned long acx;
|
||||
#endif
|
||||
unsigned long cp0_badvaddr;
|
||||
unsigned long cp0_cause;
|
||||
unsigned long cp0_epc;
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
unsigned long cp0_tcstatus;
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
#ifdef CONFIG_CPU_CAVIUM_OCTEON
|
||||
unsigned long long mpl[3]; /* MTM{0,1,2} */
|
||||
unsigned long long mtp[3]; /* MTP{0,1,2} */
|
||||
#endif
|
||||
} __aligned(8);
|
||||
|
||||
struct task_struct;
|
||||
|
||||
extern int ptrace_getregs(struct task_struct *child, __s64 __user *data);
|
||||
|
@ -1,55 +1,138 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
|
||||
* Authors: Sanjay Lal <sanjayl@kymasys.com>
|
||||
*/
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*
|
||||
* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
|
||||
* Copyright (C) 2013 Cavium, Inc.
|
||||
* Authors: Sanjay Lal <sanjayl@kymasys.com>
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_KVM_MIPS_H
|
||||
#define __LINUX_KVM_MIPS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define __KVM_MIPS
|
||||
/*
|
||||
* KVM MIPS specific structures and definitions.
|
||||
*
|
||||
* Some parts derived from the x86 version of this file.
|
||||
*/
|
||||
|
||||
#define N_MIPS_COPROC_REGS 32
|
||||
#define N_MIPS_COPROC_SEL 8
|
||||
|
||||
/* for KVM_GET_REGS and KVM_SET_REGS */
|
||||
/*
|
||||
* for KVM_GET_REGS and KVM_SET_REGS
|
||||
*
|
||||
* If Config[AT] is zero (32-bit CPU), the register contents are
|
||||
* stored in the lower 32-bits of the struct kvm_regs fields and sign
|
||||
* extended to 64-bits.
|
||||
*/
|
||||
struct kvm_regs {
|
||||
__u32 gprs[32];
|
||||
__u32 hi;
|
||||
__u32 lo;
|
||||
__u32 pc;
|
||||
|
||||
__u32 cp0reg[N_MIPS_COPROC_REGS][N_MIPS_COPROC_SEL];
|
||||
/* out (KVM_GET_REGS) / in (KVM_SET_REGS) */
|
||||
__u64 gpr[32];
|
||||
__u64 hi;
|
||||
__u64 lo;
|
||||
__u64 pc;
|
||||
};
|
||||
|
||||
/* for KVM_GET_SREGS and KVM_SET_SREGS */
|
||||
struct kvm_sregs {
|
||||
};
|
||||
|
||||
/* for KVM_GET_FPU and KVM_SET_FPU */
|
||||
/*
|
||||
* for KVM_GET_FPU and KVM_SET_FPU
|
||||
*
|
||||
* If Status[FR] is zero (32-bit FPU), the upper 32-bits of the FPRs
|
||||
* are zero filled.
|
||||
*/
|
||||
struct kvm_fpu {
|
||||
__u64 fpr[32];
|
||||
__u32 fir;
|
||||
__u32 fccr;
|
||||
__u32 fexr;
|
||||
__u32 fenr;
|
||||
__u32 fcsr;
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* For MIPS, we use KVM_SET_ONE_REG and KVM_GET_ONE_REG to access CP0
|
||||
* registers. The id field is broken down as follows:
|
||||
*
|
||||
* bits[2..0] - Register 'sel' index.
|
||||
* bits[7..3] - Register 'rd' index.
|
||||
* bits[15..8] - Must be zero.
|
||||
* bits[63..16] - 1 -> CP0 registers.
|
||||
*
|
||||
* Other sets registers may be added in the future. Each set would
|
||||
* have its own identifier in bits[63..16].
|
||||
*
|
||||
* The addr field of struct kvm_one_reg must point to an aligned
|
||||
* 64-bit wide location. For registers that are narrower than
|
||||
* 64-bits, the value is stored in the low order bits of the location,
|
||||
* and sign extended to 64-bits.
|
||||
*
|
||||
* The registers defined in struct kvm_regs are also accessible, the
|
||||
* id values for these are below.
|
||||
*/
|
||||
|
||||
#define KVM_REG_MIPS_R0 0
|
||||
#define KVM_REG_MIPS_R1 1
|
||||
#define KVM_REG_MIPS_R2 2
|
||||
#define KVM_REG_MIPS_R3 3
|
||||
#define KVM_REG_MIPS_R4 4
|
||||
#define KVM_REG_MIPS_R5 5
|
||||
#define KVM_REG_MIPS_R6 6
|
||||
#define KVM_REG_MIPS_R7 7
|
||||
#define KVM_REG_MIPS_R8 8
|
||||
#define KVM_REG_MIPS_R9 9
|
||||
#define KVM_REG_MIPS_R10 10
|
||||
#define KVM_REG_MIPS_R11 11
|
||||
#define KVM_REG_MIPS_R12 12
|
||||
#define KVM_REG_MIPS_R13 13
|
||||
#define KVM_REG_MIPS_R14 14
|
||||
#define KVM_REG_MIPS_R15 15
|
||||
#define KVM_REG_MIPS_R16 16
|
||||
#define KVM_REG_MIPS_R17 17
|
||||
#define KVM_REG_MIPS_R18 18
|
||||
#define KVM_REG_MIPS_R19 19
|
||||
#define KVM_REG_MIPS_R20 20
|
||||
#define KVM_REG_MIPS_R21 21
|
||||
#define KVM_REG_MIPS_R22 22
|
||||
#define KVM_REG_MIPS_R23 23
|
||||
#define KVM_REG_MIPS_R24 24
|
||||
#define KVM_REG_MIPS_R25 25
|
||||
#define KVM_REG_MIPS_R26 26
|
||||
#define KVM_REG_MIPS_R27 27
|
||||
#define KVM_REG_MIPS_R28 28
|
||||
#define KVM_REG_MIPS_R29 29
|
||||
#define KVM_REG_MIPS_R30 30
|
||||
#define KVM_REG_MIPS_R31 31
|
||||
|
||||
#define KVM_REG_MIPS_HI 32
|
||||
#define KVM_REG_MIPS_LO 33
|
||||
#define KVM_REG_MIPS_PC 34
|
||||
|
||||
/*
|
||||
* KVM MIPS specific structures and definitions
|
||||
*
|
||||
*/
|
||||
struct kvm_debug_exit_arch {
|
||||
__u64 epc;
|
||||
};
|
||||
|
||||
/* for KVM_SET_GUEST_DEBUG */
|
||||
struct kvm_guest_debug_arch {
|
||||
};
|
||||
|
||||
/* definition of registers in kvm_run */
|
||||
struct kvm_sync_regs {
|
||||
};
|
||||
|
||||
/* dummy definition */
|
||||
struct kvm_sregs {
|
||||
};
|
||||
|
||||
struct kvm_mips_interrupt {
|
||||
/* in */
|
||||
__u32 cpu;
|
||||
__u32 irq;
|
||||
};
|
||||
|
||||
/* definition of registers in kvm_run */
|
||||
struct kvm_sync_regs {
|
||||
};
|
||||
|
||||
#endif /* __LINUX_KVM_MIPS_H */
|
||||
|
@ -22,16 +22,12 @@
|
||||
#define DSP_CONTROL 77
|
||||
#define ACX 78
|
||||
|
||||
#ifndef __KERNEL__
|
||||
/*
|
||||
* This struct defines the way the registers are stored on the stack during a
|
||||
* system call/exception. As usual the registers k0/k1 aren't being saved.
|
||||
*/
|
||||
struct pt_regs {
|
||||
#ifdef CONFIG_32BIT
|
||||
/* Pad bytes for argument save space on the stack. */
|
||||
unsigned long pad0[6];
|
||||
#endif
|
||||
|
||||
/* Saved main processor registers. */
|
||||
unsigned long regs[32];
|
||||
|
||||
@ -39,20 +35,11 @@ struct pt_regs {
|
||||
unsigned long cp0_status;
|
||||
unsigned long hi;
|
||||
unsigned long lo;
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
unsigned long acx;
|
||||
#endif
|
||||
unsigned long cp0_badvaddr;
|
||||
unsigned long cp0_cause;
|
||||
unsigned long cp0_epc;
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
unsigned long cp0_tcstatus;
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
#ifdef CONFIG_CPU_CAVIUM_OCTEON
|
||||
unsigned long long mpl[3]; /* MTM{0,1,2} */
|
||||
unsigned long long mtp[3]; /* MTP{0,1,2} */
|
||||
#endif
|
||||
} __attribute__ ((aligned (8)));
|
||||
#endif /* __KERNEL__ */
|
||||
|
||||
/* Arbitrarily choose the same ptrace numbers as used by the Sparc code. */
|
||||
#define PTRACE_GETREGS 12
|
||||
|
@ -119,4 +119,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");
|
||||
#undef TASK_SIZE
|
||||
#define TASK_SIZE TASK_SIZE32
|
||||
|
||||
#undef cputime_to_timeval
|
||||
#define cputime_to_timeval cputime_to_compat_timeval
|
||||
static __inline__ void
|
||||
cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value)
|
||||
{
|
||||
unsigned long jiffies = cputime_to_jiffies(cputime);
|
||||
|
||||
value->tv_usec = (jiffies % HZ) * (1000000L / HZ);
|
||||
value->tv_sec = jiffies / HZ;
|
||||
}
|
||||
|
||||
#include "../../../fs/binfmt_elf.c"
|
||||
|
@ -162,4 +162,15 @@ MODULE_AUTHOR("Ralf Baechle (ralf@linux-mips.org)");
|
||||
#undef TASK_SIZE
|
||||
#define TASK_SIZE TASK_SIZE32
|
||||
|
||||
#undef cputime_to_timeval
|
||||
#define cputime_to_timeval cputime_to_compat_timeval
|
||||
static __inline__ void
|
||||
cputime_to_compat_timeval(const cputime_t cputime, struct compat_timeval *value)
|
||||
{
|
||||
unsigned long jiffies = cputime_to_jiffies(cputime);
|
||||
|
||||
value->tv_usec = (jiffies % HZ) * (1000000L / HZ);
|
||||
value->tv_sec = jiffies / HZ;
|
||||
}
|
||||
|
||||
#include "../../../fs/binfmt_elf.c"
|
||||
|
@ -40,6 +40,7 @@
|
||||
#include <asm/processor.h>
|
||||
#include <asm/vpe.h>
|
||||
#include <asm/rtlx.h>
|
||||
#include <asm/setup.h>
|
||||
|
||||
static struct rtlx_info *rtlx;
|
||||
static int major;
|
||||
|
@ -897,22 +897,24 @@ out_sigsegv:
|
||||
|
||||
asmlinkage void do_tr(struct pt_regs *regs)
|
||||
{
|
||||
unsigned int opcode, tcode = 0;
|
||||
u32 opcode, tcode = 0;
|
||||
u16 instr[2];
|
||||
unsigned long epc = exception_epc(regs);
|
||||
unsigned long epc = msk_isa16_mode(exception_epc(regs));
|
||||
|
||||
if ((__get_user(instr[0], (u16 __user *)msk_isa16_mode(epc))) ||
|
||||
(__get_user(instr[1], (u16 __user *)msk_isa16_mode(epc + 2))))
|
||||
if (get_isa16_mode(regs->cp0_epc)) {
|
||||
if (__get_user(instr[0], (u16 __user *)(epc + 0)) ||
|
||||
__get_user(instr[1], (u16 __user *)(epc + 2)))
|
||||
goto out_sigsegv;
|
||||
opcode = (instr[0] << 16) | instr[1];
|
||||
|
||||
/* Immediate versions don't provide a code. */
|
||||
if (!(opcode & OPCODE)) {
|
||||
if (get_isa16_mode(regs->cp0_epc))
|
||||
/* microMIPS */
|
||||
tcode = (opcode >> 12) & 0x1f;
|
||||
else
|
||||
tcode = ((opcode >> 6) & ((1 << 10) - 1));
|
||||
opcode = (instr[0] << 16) | instr[1];
|
||||
/* Immediate versions don't provide a code. */
|
||||
if (!(opcode & OPCODE))
|
||||
tcode = (opcode >> 12) & ((1 << 4) - 1);
|
||||
} else {
|
||||
if (__get_user(opcode, (u32 __user *)epc))
|
||||
goto out_sigsegv;
|
||||
/* Immediate versions don't provide a code. */
|
||||
if (!(opcode & OPCODE))
|
||||
tcode = (opcode >> 6) & ((1 << 10) - 1);
|
||||
}
|
||||
|
||||
do_trap_or_bp(regs, tcode, "Trap");
|
||||
|
@ -195,7 +195,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
|
||||
long
|
||||
kvm_arch_dev_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
|
||||
{
|
||||
return -EINVAL;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
void kvm_arch_free_memslot(struct kvm_memory_slot *free,
|
||||
@ -401,7 +401,7 @@ int
|
||||
kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu,
|
||||
struct kvm_guest_debug *dbg)
|
||||
{
|
||||
return -EINVAL;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||
@ -475,14 +475,223 @@ int
|
||||
kvm_arch_vcpu_ioctl_get_mpstate(struct kvm_vcpu *vcpu,
|
||||
struct kvm_mp_state *mp_state)
|
||||
{
|
||||
return -EINVAL;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
int
|
||||
kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu,
|
||||
struct kvm_mp_state *mp_state)
|
||||
{
|
||||
return -EINVAL;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
#define KVM_REG_MIPS_CP0_INDEX (0x10000 + 8 * 0 + 0)
|
||||
#define KVM_REG_MIPS_CP0_ENTRYLO0 (0x10000 + 8 * 2 + 0)
|
||||
#define KVM_REG_MIPS_CP0_ENTRYLO1 (0x10000 + 8 * 3 + 0)
|
||||
#define KVM_REG_MIPS_CP0_CONTEXT (0x10000 + 8 * 4 + 0)
|
||||
#define KVM_REG_MIPS_CP0_USERLOCAL (0x10000 + 8 * 4 + 2)
|
||||
#define KVM_REG_MIPS_CP0_PAGEMASK (0x10000 + 8 * 5 + 0)
|
||||
#define KVM_REG_MIPS_CP0_PAGEGRAIN (0x10000 + 8 * 5 + 1)
|
||||
#define KVM_REG_MIPS_CP0_WIRED (0x10000 + 8 * 6 + 0)
|
||||
#define KVM_REG_MIPS_CP0_HWRENA (0x10000 + 8 * 7 + 0)
|
||||
#define KVM_REG_MIPS_CP0_BADVADDR (0x10000 + 8 * 8 + 0)
|
||||
#define KVM_REG_MIPS_CP0_COUNT (0x10000 + 8 * 9 + 0)
|
||||
#define KVM_REG_MIPS_CP0_ENTRYHI (0x10000 + 8 * 10 + 0)
|
||||
#define KVM_REG_MIPS_CP0_COMPARE (0x10000 + 8 * 11 + 0)
|
||||
#define KVM_REG_MIPS_CP0_STATUS (0x10000 + 8 * 12 + 0)
|
||||
#define KVM_REG_MIPS_CP0_CAUSE (0x10000 + 8 * 13 + 0)
|
||||
#define KVM_REG_MIPS_CP0_EBASE (0x10000 + 8 * 15 + 1)
|
||||
#define KVM_REG_MIPS_CP0_CONFIG (0x10000 + 8 * 16 + 0)
|
||||
#define KVM_REG_MIPS_CP0_CONFIG1 (0x10000 + 8 * 16 + 1)
|
||||
#define KVM_REG_MIPS_CP0_CONFIG2 (0x10000 + 8 * 16 + 2)
|
||||
#define KVM_REG_MIPS_CP0_CONFIG3 (0x10000 + 8 * 16 + 3)
|
||||
#define KVM_REG_MIPS_CP0_CONFIG7 (0x10000 + 8 * 16 + 7)
|
||||
#define KVM_REG_MIPS_CP0_XCONTEXT (0x10000 + 8 * 20 + 0)
|
||||
#define KVM_REG_MIPS_CP0_ERROREPC (0x10000 + 8 * 30 + 0)
|
||||
|
||||
static u64 kvm_mips_get_one_regs[] = {
|
||||
KVM_REG_MIPS_R0,
|
||||
KVM_REG_MIPS_R1,
|
||||
KVM_REG_MIPS_R2,
|
||||
KVM_REG_MIPS_R3,
|
||||
KVM_REG_MIPS_R4,
|
||||
KVM_REG_MIPS_R5,
|
||||
KVM_REG_MIPS_R6,
|
||||
KVM_REG_MIPS_R7,
|
||||
KVM_REG_MIPS_R8,
|
||||
KVM_REG_MIPS_R9,
|
||||
KVM_REG_MIPS_R10,
|
||||
KVM_REG_MIPS_R11,
|
||||
KVM_REG_MIPS_R12,
|
||||
KVM_REG_MIPS_R13,
|
||||
KVM_REG_MIPS_R14,
|
||||
KVM_REG_MIPS_R15,
|
||||
KVM_REG_MIPS_R16,
|
||||
KVM_REG_MIPS_R17,
|
||||
KVM_REG_MIPS_R18,
|
||||
KVM_REG_MIPS_R19,
|
||||
KVM_REG_MIPS_R20,
|
||||
KVM_REG_MIPS_R21,
|
||||
KVM_REG_MIPS_R22,
|
||||
KVM_REG_MIPS_R23,
|
||||
KVM_REG_MIPS_R24,
|
||||
KVM_REG_MIPS_R25,
|
||||
KVM_REG_MIPS_R26,
|
||||
KVM_REG_MIPS_R27,
|
||||
KVM_REG_MIPS_R28,
|
||||
KVM_REG_MIPS_R29,
|
||||
KVM_REG_MIPS_R30,
|
||||
KVM_REG_MIPS_R31,
|
||||
|
||||
KVM_REG_MIPS_HI,
|
||||
KVM_REG_MIPS_LO,
|
||||
KVM_REG_MIPS_PC,
|
||||
|
||||
KVM_REG_MIPS_CP0_INDEX,
|
||||
KVM_REG_MIPS_CP0_CONTEXT,
|
||||
KVM_REG_MIPS_CP0_PAGEMASK,
|
||||
KVM_REG_MIPS_CP0_WIRED,
|
||||
KVM_REG_MIPS_CP0_BADVADDR,
|
||||
KVM_REG_MIPS_CP0_ENTRYHI,
|
||||
KVM_REG_MIPS_CP0_STATUS,
|
||||
KVM_REG_MIPS_CP0_CAUSE,
|
||||
/* EPC set via kvm_regs, et al. */
|
||||
KVM_REG_MIPS_CP0_CONFIG,
|
||||
KVM_REG_MIPS_CP0_CONFIG1,
|
||||
KVM_REG_MIPS_CP0_CONFIG2,
|
||||
KVM_REG_MIPS_CP0_CONFIG3,
|
||||
KVM_REG_MIPS_CP0_CONFIG7,
|
||||
KVM_REG_MIPS_CP0_ERROREPC
|
||||
};
|
||||
|
||||
static int kvm_mips_get_reg(struct kvm_vcpu *vcpu,
|
||||
const struct kvm_one_reg *reg)
|
||||
{
|
||||
u64 __user *uaddr = (u64 __user *)(long)reg->addr;
|
||||
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
s64 v;
|
||||
|
||||
switch (reg->id) {
|
||||
case KVM_REG_MIPS_R0 ... KVM_REG_MIPS_R31:
|
||||
v = (long)vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0];
|
||||
break;
|
||||
case KVM_REG_MIPS_HI:
|
||||
v = (long)vcpu->arch.hi;
|
||||
break;
|
||||
case KVM_REG_MIPS_LO:
|
||||
v = (long)vcpu->arch.lo;
|
||||
break;
|
||||
case KVM_REG_MIPS_PC:
|
||||
v = (long)vcpu->arch.pc;
|
||||
break;
|
||||
|
||||
case KVM_REG_MIPS_CP0_INDEX:
|
||||
v = (long)kvm_read_c0_guest_index(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CONTEXT:
|
||||
v = (long)kvm_read_c0_guest_context(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_PAGEMASK:
|
||||
v = (long)kvm_read_c0_guest_pagemask(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_WIRED:
|
||||
v = (long)kvm_read_c0_guest_wired(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_BADVADDR:
|
||||
v = (long)kvm_read_c0_guest_badvaddr(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_ENTRYHI:
|
||||
v = (long)kvm_read_c0_guest_entryhi(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_STATUS:
|
||||
v = (long)kvm_read_c0_guest_status(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CAUSE:
|
||||
v = (long)kvm_read_c0_guest_cause(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_ERROREPC:
|
||||
v = (long)kvm_read_c0_guest_errorepc(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CONFIG:
|
||||
v = (long)kvm_read_c0_guest_config(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CONFIG1:
|
||||
v = (long)kvm_read_c0_guest_config1(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CONFIG2:
|
||||
v = (long)kvm_read_c0_guest_config2(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CONFIG3:
|
||||
v = (long)kvm_read_c0_guest_config3(cop0);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CONFIG7:
|
||||
v = (long)kvm_read_c0_guest_config7(cop0);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return put_user(v, uaddr);
|
||||
}
|
||||
|
||||
static int kvm_mips_set_reg(struct kvm_vcpu *vcpu,
|
||||
const struct kvm_one_reg *reg)
|
||||
{
|
||||
u64 __user *uaddr = (u64 __user *)(long)reg->addr;
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
u64 v;
|
||||
|
||||
if (get_user(v, uaddr) != 0)
|
||||
return -EFAULT;
|
||||
|
||||
switch (reg->id) {
|
||||
case KVM_REG_MIPS_R0:
|
||||
/* Silently ignore requests to set $0 */
|
||||
break;
|
||||
case KVM_REG_MIPS_R1 ... KVM_REG_MIPS_R31:
|
||||
vcpu->arch.gprs[reg->id - KVM_REG_MIPS_R0] = v;
|
||||
break;
|
||||
case KVM_REG_MIPS_HI:
|
||||
vcpu->arch.hi = v;
|
||||
break;
|
||||
case KVM_REG_MIPS_LO:
|
||||
vcpu->arch.lo = v;
|
||||
break;
|
||||
case KVM_REG_MIPS_PC:
|
||||
vcpu->arch.pc = v;
|
||||
break;
|
||||
|
||||
case KVM_REG_MIPS_CP0_INDEX:
|
||||
kvm_write_c0_guest_index(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CONTEXT:
|
||||
kvm_write_c0_guest_context(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_PAGEMASK:
|
||||
kvm_write_c0_guest_pagemask(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_WIRED:
|
||||
kvm_write_c0_guest_wired(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_BADVADDR:
|
||||
kvm_write_c0_guest_badvaddr(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_ENTRYHI:
|
||||
kvm_write_c0_guest_entryhi(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_STATUS:
|
||||
kvm_write_c0_guest_status(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_CAUSE:
|
||||
kvm_write_c0_guest_cause(cop0, v);
|
||||
break;
|
||||
case KVM_REG_MIPS_CP0_ERROREPC:
|
||||
kvm_write_c0_guest_errorepc(cop0, v);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
long
|
||||
@ -491,9 +700,38 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
|
||||
struct kvm_vcpu *vcpu = filp->private_data;
|
||||
void __user *argp = (void __user *)arg;
|
||||
long r;
|
||||
int intr;
|
||||
|
||||
switch (ioctl) {
|
||||
case KVM_SET_ONE_REG:
|
||||
case KVM_GET_ONE_REG: {
|
||||
struct kvm_one_reg reg;
|
||||
if (copy_from_user(®, argp, sizeof(reg)))
|
||||
return -EFAULT;
|
||||
if (ioctl == KVM_SET_ONE_REG)
|
||||
return kvm_mips_set_reg(vcpu, ®);
|
||||
else
|
||||
return kvm_mips_get_reg(vcpu, ®);
|
||||
}
|
||||
case KVM_GET_REG_LIST: {
|
||||
struct kvm_reg_list __user *user_list = argp;
|
||||
u64 __user *reg_dest;
|
||||
struct kvm_reg_list reg_list;
|
||||
unsigned n;
|
||||
|
||||
if (copy_from_user(®_list, user_list, sizeof(reg_list)))
|
||||
return -EFAULT;
|
||||
n = reg_list.n;
|
||||
reg_list.n = ARRAY_SIZE(kvm_mips_get_one_regs);
|
||||
if (copy_to_user(user_list, ®_list, sizeof(reg_list)))
|
||||
return -EFAULT;
|
||||
if (n < reg_list.n)
|
||||
return -E2BIG;
|
||||
reg_dest = user_list->reg;
|
||||
if (copy_to_user(reg_dest, kvm_mips_get_one_regs,
|
||||
sizeof(kvm_mips_get_one_regs)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
}
|
||||
case KVM_NMI:
|
||||
/* Treat the NMI as a CPU reset */
|
||||
r = kvm_mips_reset_vcpu(vcpu);
|
||||
@ -505,8 +743,6 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
|
||||
if (copy_from_user(&irq, argp, sizeof(irq)))
|
||||
goto out;
|
||||
|
||||
intr = (int)irq.irq;
|
||||
|
||||
kvm_debug("[%d] %s: irq: %d\n", vcpu->vcpu_id, __func__,
|
||||
irq.irq);
|
||||
|
||||
@ -514,7 +750,7 @@ kvm_arch_vcpu_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
|
||||
break;
|
||||
}
|
||||
default:
|
||||
r = -EINVAL;
|
||||
r = -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
out:
|
||||
@ -565,7 +801,7 @@ long kvm_arch_vm_ioctl(struct file *filp, unsigned int ioctl, unsigned long arg)
|
||||
|
||||
switch (ioctl) {
|
||||
default:
|
||||
r = -EINVAL;
|
||||
r = -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
return r;
|
||||
@ -593,13 +829,13 @@ void kvm_arch_exit(void)
|
||||
int
|
||||
kvm_arch_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
int
|
||||
kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
|
||||
@ -609,12 +845,12 @@ int kvm_arch_vcpu_postcreate(struct kvm_vcpu *vcpu)
|
||||
|
||||
int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
int kvm_arch_vcpu_ioctl_set_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
|
||||
int kvm_arch_vcpu_fault(struct kvm_vcpu *vcpu, struct vm_fault *vmf)
|
||||
@ -627,6 +863,9 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||
int r;
|
||||
|
||||
switch (ext) {
|
||||
case KVM_CAP_ONE_REG:
|
||||
r = 1;
|
||||
break;
|
||||
case KVM_CAP_COALESCED_MMIO:
|
||||
r = KVM_COALESCED_MMIO_PAGE_OFFSET;
|
||||
break;
|
||||
@ -635,7 +874,6 @@ int kvm_dev_ioctl_check_extension(long ext)
|
||||
break;
|
||||
}
|
||||
return r;
|
||||
|
||||
}
|
||||
|
||||
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
||||
@ -677,28 +915,28 @@ int kvm_arch_vcpu_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
vcpu->arch.gprs[i] = regs->gprs[i];
|
||||
|
||||
for (i = 1; i < ARRAY_SIZE(vcpu->arch.gprs); i++)
|
||||
vcpu->arch.gprs[i] = regs->gpr[i];
|
||||
vcpu->arch.gprs[0] = 0; /* zero is special, and cannot be set. */
|
||||
vcpu->arch.hi = regs->hi;
|
||||
vcpu->arch.lo = regs->lo;
|
||||
vcpu->arch.pc = regs->pc;
|
||||
|
||||
return kvm_mips_callbacks->vcpu_ioctl_set_regs(vcpu, regs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_vcpu_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 32; i++)
|
||||
regs->gprs[i] = vcpu->arch.gprs[i];
|
||||
for (i = 0; i < ARRAY_SIZE(vcpu->arch.gprs); i++)
|
||||
regs->gpr[i] = vcpu->arch.gprs[i];
|
||||
|
||||
regs->hi = vcpu->arch.hi;
|
||||
regs->lo = vcpu->arch.lo;
|
||||
regs->pc = vcpu->arch.pc;
|
||||
|
||||
return kvm_mips_callbacks->vcpu_ioctl_get_regs(vcpu, regs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void kvm_mips_comparecount_func(unsigned long data)
|
||||
|
@ -345,54 +345,6 @@ static int kvm_trap_emul_handle_break(struct kvm_vcpu *vcpu)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
kvm_trap_emul_ioctl_set_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
|
||||
kvm_write_c0_guest_index(cop0, regs->cp0reg[MIPS_CP0_TLB_INDEX][0]);
|
||||
kvm_write_c0_guest_context(cop0, regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0]);
|
||||
kvm_write_c0_guest_badvaddr(cop0, regs->cp0reg[MIPS_CP0_BAD_VADDR][0]);
|
||||
kvm_write_c0_guest_entryhi(cop0, regs->cp0reg[MIPS_CP0_TLB_HI][0]);
|
||||
kvm_write_c0_guest_epc(cop0, regs->cp0reg[MIPS_CP0_EXC_PC][0]);
|
||||
|
||||
kvm_write_c0_guest_status(cop0, regs->cp0reg[MIPS_CP0_STATUS][0]);
|
||||
kvm_write_c0_guest_cause(cop0, regs->cp0reg[MIPS_CP0_CAUSE][0]);
|
||||
kvm_write_c0_guest_pagemask(cop0,
|
||||
regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0]);
|
||||
kvm_write_c0_guest_wired(cop0, regs->cp0reg[MIPS_CP0_TLB_WIRED][0]);
|
||||
kvm_write_c0_guest_errorepc(cop0, regs->cp0reg[MIPS_CP0_ERROR_PC][0]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
kvm_trap_emul_ioctl_get_regs(struct kvm_vcpu *vcpu, struct kvm_regs *regs)
|
||||
{
|
||||
struct mips_coproc *cop0 = vcpu->arch.cop0;
|
||||
|
||||
regs->cp0reg[MIPS_CP0_TLB_INDEX][0] = kvm_read_c0_guest_index(cop0);
|
||||
regs->cp0reg[MIPS_CP0_TLB_CONTEXT][0] = kvm_read_c0_guest_context(cop0);
|
||||
regs->cp0reg[MIPS_CP0_BAD_VADDR][0] = kvm_read_c0_guest_badvaddr(cop0);
|
||||
regs->cp0reg[MIPS_CP0_TLB_HI][0] = kvm_read_c0_guest_entryhi(cop0);
|
||||
regs->cp0reg[MIPS_CP0_EXC_PC][0] = kvm_read_c0_guest_epc(cop0);
|
||||
|
||||
regs->cp0reg[MIPS_CP0_STATUS][0] = kvm_read_c0_guest_status(cop0);
|
||||
regs->cp0reg[MIPS_CP0_CAUSE][0] = kvm_read_c0_guest_cause(cop0);
|
||||
regs->cp0reg[MIPS_CP0_TLB_PG_MASK][0] =
|
||||
kvm_read_c0_guest_pagemask(cop0);
|
||||
regs->cp0reg[MIPS_CP0_TLB_WIRED][0] = kvm_read_c0_guest_wired(cop0);
|
||||
regs->cp0reg[MIPS_CP0_ERROR_PC][0] = kvm_read_c0_guest_errorepc(cop0);
|
||||
|
||||
regs->cp0reg[MIPS_CP0_CONFIG][0] = kvm_read_c0_guest_config(cop0);
|
||||
regs->cp0reg[MIPS_CP0_CONFIG][1] = kvm_read_c0_guest_config1(cop0);
|
||||
regs->cp0reg[MIPS_CP0_CONFIG][2] = kvm_read_c0_guest_config2(cop0);
|
||||
regs->cp0reg[MIPS_CP0_CONFIG][3] = kvm_read_c0_guest_config3(cop0);
|
||||
regs->cp0reg[MIPS_CP0_CONFIG][7] = kvm_read_c0_guest_config7(cop0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kvm_trap_emul_vm_init(struct kvm *kvm)
|
||||
{
|
||||
return 0;
|
||||
@ -471,8 +423,6 @@ static struct kvm_mips_callbacks kvm_trap_emul_callbacks = {
|
||||
.dequeue_io_int = kvm_mips_dequeue_io_int_cb,
|
||||
.irq_deliver = kvm_mips_irq_deliver_cb,
|
||||
.irq_clear = kvm_mips_irq_clear_cb,
|
||||
.vcpu_ioctl_get_regs = kvm_trap_emul_ioctl_get_regs,
|
||||
.vcpu_ioctl_set_regs = kvm_trap_emul_ioctl_set_regs,
|
||||
};
|
||||
|
||||
int kvm_mips_emulation_init(struct kvm_mips_callbacks **install_callbacks)
|
||||
|
@ -301,10 +301,6 @@ static u32 tlb_handler[128] __cpuinitdata;
|
||||
static struct uasm_label labels[128] __cpuinitdata;
|
||||
static struct uasm_reloc relocs[128] __cpuinitdata;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
static int check_for_high_segbits __cpuinitdata;
|
||||
#endif
|
||||
|
||||
static int check_for_high_segbits __cpuinitdata;
|
||||
|
||||
static unsigned int kscratch_used_mask __cpuinitdata;
|
||||
|
@ -88,7 +88,7 @@ void __init plat_mem_setup(void)
|
||||
__dt_setup_arch(&__dtb_start);
|
||||
|
||||
if (soc_info.mem_size)
|
||||
add_memory_region(soc_info.mem_base, soc_info.mem_size,
|
||||
add_memory_region(soc_info.mem_base, soc_info.mem_size * SZ_1M,
|
||||
BOOT_MEM_RAM);
|
||||
else
|
||||
detect_memory_region(soc_info.mem_base,
|
||||
|
@ -212,7 +212,9 @@ appldata_timer_handler(ctl_table *ctl, int write,
|
||||
return 0;
|
||||
}
|
||||
if (!write) {
|
||||
len = sprintf(buf, appldata_timer_active ? "1\n" : "0\n");
|
||||
strncpy(buf, appldata_timer_active ? "1\n" : "0\n",
|
||||
ARRAY_SIZE(buf));
|
||||
len = strnlen(buf, ARRAY_SIZE(buf));
|
||||
if (len > *lenp)
|
||||
len = *lenp;
|
||||
if (copy_to_user(buffer, buf, len))
|
||||
@ -317,7 +319,8 @@ appldata_generic_handler(ctl_table *ctl, int write,
|
||||
return 0;
|
||||
}
|
||||
if (!write) {
|
||||
len = sprintf(buf, ops->active ? "1\n" : "0\n");
|
||||
strncpy(buf, ops->active ? "1\n" : "0\n", ARRAY_SIZE(buf));
|
||||
len = strnlen(buf, ARRAY_SIZE(buf));
|
||||
if (len > *lenp)
|
||||
len = *lenp;
|
||||
if (copy_to_user(buffer, buf, len)) {
|
||||
|
@ -71,8 +71,8 @@ static inline void dma_free_coherent(struct device *dev, size_t size,
|
||||
{
|
||||
struct dma_map_ops *dma_ops = get_dma_ops(dev);
|
||||
|
||||
dma_ops->free(dev, size, cpu_addr, dma_handle, NULL);
|
||||
debug_dma_free_coherent(dev, size, cpu_addr, dma_handle);
|
||||
dma_ops->free(dev, size, cpu_addr, dma_handle, NULL);
|
||||
}
|
||||
|
||||
#endif /* _ASM_S390_DMA_MAPPING_H */
|
||||
|
@ -36,6 +36,7 @@ static inline void * phys_to_virt(unsigned long address)
|
||||
}
|
||||
|
||||
void *xlate_dev_mem_ptr(unsigned long phys);
|
||||
#define xlate_dev_mem_ptr xlate_dev_mem_ptr
|
||||
void unxlate_dev_mem_ptr(unsigned long phys, void *addr);
|
||||
|
||||
/*
|
||||
|
@ -646,7 +646,7 @@ static inline pgste_t pgste_update_all(pte_t *ptep, pgste_t pgste)
|
||||
unsigned long address, bits;
|
||||
unsigned char skey;
|
||||
|
||||
if (!pte_present(*ptep))
|
||||
if (pte_val(*ptep) & _PAGE_INVALID)
|
||||
return pgste;
|
||||
address = pte_val(*ptep) & PAGE_MASK;
|
||||
skey = page_get_storage_key(address);
|
||||
@ -680,7 +680,7 @@ static inline pgste_t pgste_update_young(pte_t *ptep, pgste_t pgste)
|
||||
#ifdef CONFIG_PGSTE
|
||||
int young;
|
||||
|
||||
if (!pte_present(*ptep))
|
||||
if (pte_val(*ptep) & _PAGE_INVALID)
|
||||
return pgste;
|
||||
/* Get referenced bit from storage key */
|
||||
young = page_reset_referenced(pte_val(*ptep) & PAGE_MASK);
|
||||
@ -706,7 +706,7 @@ static inline void pgste_set_key(pte_t *ptep, pgste_t pgste, pte_t entry)
|
||||
unsigned long address;
|
||||
unsigned long okey, nkey;
|
||||
|
||||
if (!pte_present(entry))
|
||||
if (pte_val(entry) & _PAGE_INVALID)
|
||||
return;
|
||||
address = pte_val(entry) & PAGE_MASK;
|
||||
okey = nkey = page_get_storage_key(address);
|
||||
@ -1098,6 +1098,9 @@ static inline pte_t ptep_modify_prot_start(struct mm_struct *mm,
|
||||
pte = *ptep;
|
||||
if (!mm_exclusive(mm))
|
||||
__ptep_ipte(address, ptep);
|
||||
|
||||
if (mm_has_pgste(mm))
|
||||
pgste = pgste_update_all(&pte, pgste);
|
||||
return pte;
|
||||
}
|
||||
|
||||
@ -1105,9 +1108,13 @@ static inline void ptep_modify_prot_commit(struct mm_struct *mm,
|
||||
unsigned long address,
|
||||
pte_t *ptep, pte_t pte)
|
||||
{
|
||||
pgste_t pgste;
|
||||
|
||||
if (mm_has_pgste(mm)) {
|
||||
pgste = *(pgste_t *)(ptep + PTRS_PER_PTE);
|
||||
pgste_set_key(ptep, pgste, pte);
|
||||
pgste_set_pte(ptep, pte);
|
||||
pgste_set_unlock(ptep, *(pgste_t *)(ptep + PTRS_PER_PTE));
|
||||
pgste_set_unlock(ptep, pgste);
|
||||
} else
|
||||
*ptep = pte;
|
||||
}
|
||||
|
@ -428,34 +428,27 @@ void smp_stop_cpu(void)
|
||||
* This is the main routine where commands issued by other
|
||||
* cpus are handled.
|
||||
*/
|
||||
static void smp_handle_ext_call(void)
|
||||
{
|
||||
unsigned long bits;
|
||||
|
||||
/* handle bit signal external calls */
|
||||
bits = xchg(&pcpu_devices[smp_processor_id()].ec_mask, 0);
|
||||
if (test_bit(ec_stop_cpu, &bits))
|
||||
smp_stop_cpu();
|
||||
if (test_bit(ec_schedule, &bits))
|
||||
scheduler_ipi();
|
||||
if (test_bit(ec_call_function, &bits))
|
||||
generic_smp_call_function_interrupt();
|
||||
if (test_bit(ec_call_function_single, &bits))
|
||||
generic_smp_call_function_single_interrupt();
|
||||
}
|
||||
|
||||
static void do_ext_call_interrupt(struct ext_code ext_code,
|
||||
unsigned int param32, unsigned long param64)
|
||||
{
|
||||
unsigned long bits;
|
||||
int cpu;
|
||||
|
||||
cpu = smp_processor_id();
|
||||
if (ext_code.code == 0x1202)
|
||||
inc_irq_stat(IRQEXT_EXC);
|
||||
else
|
||||
inc_irq_stat(IRQEXT_EMS);
|
||||
/*
|
||||
* handle bit signal external calls
|
||||
*/
|
||||
bits = xchg(&pcpu_devices[cpu].ec_mask, 0);
|
||||
|
||||
if (test_bit(ec_stop_cpu, &bits))
|
||||
smp_stop_cpu();
|
||||
|
||||
if (test_bit(ec_schedule, &bits))
|
||||
scheduler_ipi();
|
||||
|
||||
if (test_bit(ec_call_function, &bits))
|
||||
generic_smp_call_function_interrupt();
|
||||
|
||||
if (test_bit(ec_call_function_single, &bits))
|
||||
generic_smp_call_function_single_interrupt();
|
||||
|
||||
inc_irq_stat(ext_code.code == 0x1202 ? IRQEXT_EXC : IRQEXT_EMS);
|
||||
smp_handle_ext_call();
|
||||
}
|
||||
|
||||
void arch_send_call_function_ipi_mask(const struct cpumask *mask)
|
||||
@ -760,6 +753,8 @@ int __cpu_disable(void)
|
||||
{
|
||||
unsigned long cregs[16];
|
||||
|
||||
/* Handle possible pending IPIs */
|
||||
smp_handle_ext_call();
|
||||
set_cpu_online(smp_processor_id(), false);
|
||||
/* Disable pseudo page faults on this cpu. */
|
||||
pfault_fini();
|
||||
|
@ -492,7 +492,7 @@ static int gmap_connect_pgtable(unsigned long address, unsigned long segment,
|
||||
mp = (struct gmap_pgtable *) page->index;
|
||||
rmap->gmap = gmap;
|
||||
rmap->entry = segment_ptr;
|
||||
rmap->vmaddr = address;
|
||||
rmap->vmaddr = address & PMD_MASK;
|
||||
spin_lock(&mm->page_table_lock);
|
||||
if (*segment_ptr == segment) {
|
||||
list_add(&rmap->list, &mp->mapper);
|
||||
|
@ -1240,9 +1240,12 @@ static int decode_modrm(struct x86_emulate_ctxt *ctxt,
|
||||
ctxt->modrm_seg = VCPU_SREG_DS;
|
||||
|
||||
if (ctxt->modrm_mod == 3) {
|
||||
int highbyte_regs = ctxt->rex_prefix == 0;
|
||||
|
||||
op->type = OP_REG;
|
||||
op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes;
|
||||
op->addr.reg = decode_register(ctxt, ctxt->modrm_rm, ctxt->d & ByteOp);
|
||||
op->addr.reg = decode_register(ctxt, ctxt->modrm_rm,
|
||||
highbyte_regs && (ctxt->d & ByteOp));
|
||||
if (ctxt->d & Sse) {
|
||||
op->type = OP_XMM;
|
||||
op->bytes = 16;
|
||||
@ -3997,7 +4000,8 @@ static const struct opcode twobyte_table[256] = {
|
||||
DI(ImplicitOps | Priv, invd), DI(ImplicitOps | Priv, wbinvd), N, N,
|
||||
N, D(ImplicitOps | ModRM), N, N,
|
||||
/* 0x10 - 0x1F */
|
||||
N, N, N, N, N, N, N, N, D(ImplicitOps | ModRM), N, N, N, N, N, N, N,
|
||||
N, N, N, N, N, N, N, N,
|
||||
D(ImplicitOps | ModRM), N, N, N, N, N, N, D(ImplicitOps | ModRM),
|
||||
/* 0x20 - 0x2F */
|
||||
DIP(ModRM | DstMem | Priv | Op3264, cr_read, check_cr_read),
|
||||
DIP(ModRM | DstMem | Priv | Op3264, dr_read, check_dr_read),
|
||||
@ -4836,6 +4840,7 @@ twobyte_insn:
|
||||
case 0x08: /* invd */
|
||||
case 0x0d: /* GrpP (prefetch) */
|
||||
case 0x18: /* Grp16 (prefetch/nop) */
|
||||
case 0x1f: /* nop */
|
||||
break;
|
||||
case 0x20: /* mov cr, reg */
|
||||
ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg);
|
||||
|
@ -1861,11 +1861,14 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_lapic *apic = vcpu->arch.apic;
|
||||
unsigned int sipi_vector;
|
||||
unsigned long pe;
|
||||
|
||||
if (!kvm_vcpu_has_lapic(vcpu))
|
||||
if (!kvm_vcpu_has_lapic(vcpu) || !apic->pending_events)
|
||||
return;
|
||||
|
||||
if (test_and_clear_bit(KVM_APIC_INIT, &apic->pending_events)) {
|
||||
pe = xchg(&apic->pending_events, 0);
|
||||
|
||||
if (test_bit(KVM_APIC_INIT, &pe)) {
|
||||
kvm_lapic_reset(vcpu);
|
||||
kvm_vcpu_reset(vcpu);
|
||||
if (kvm_vcpu_is_bsp(apic->vcpu))
|
||||
@ -1873,7 +1876,7 @@ void kvm_apic_accept_events(struct kvm_vcpu *vcpu)
|
||||
else
|
||||
vcpu->arch.mp_state = KVM_MP_STATE_INIT_RECEIVED;
|
||||
}
|
||||
if (test_and_clear_bit(KVM_APIC_SIPI, &apic->pending_events) &&
|
||||
if (test_bit(KVM_APIC_SIPI, &pe) &&
|
||||
vcpu->arch.mp_state == KVM_MP_STATE_INIT_RECEIVED) {
|
||||
/* evaluate pending_events before reading the vector */
|
||||
smp_rmb();
|
||||
|
@ -628,7 +628,9 @@ int pcibios_add_device(struct pci_dev *dev)
|
||||
|
||||
pa_data = boot_params.hdr.setup_data;
|
||||
while (pa_data) {
|
||||
data = phys_to_virt(pa_data);
|
||||
data = ioremap(pa_data, sizeof(*rom));
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
|
||||
if (data->type == SETUP_PCI) {
|
||||
rom = (struct pci_setup_rom *)data;
|
||||
@ -645,6 +647,7 @@ int pcibios_add_device(struct pci_dev *dev)
|
||||
}
|
||||
}
|
||||
pa_data = data->next;
|
||||
iounmap(data);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -919,13 +919,14 @@ static int ghes_probe(struct platform_device *ghes_dev)
|
||||
break;
|
||||
case ACPI_HEST_NOTIFY_EXTERNAL:
|
||||
/* External interrupt vector is GSI */
|
||||
if (acpi_gsi_to_irq(generic->notify.vector, &ghes->irq)) {
|
||||
rc = acpi_gsi_to_irq(generic->notify.vector, &ghes->irq);
|
||||
if (rc) {
|
||||
pr_err(GHES_PFX "Failed to map GSI to IRQ for generic hardware error source: %d\n",
|
||||
generic->header.source_id);
|
||||
goto err_edac_unreg;
|
||||
}
|
||||
if (request_irq(ghes->irq, ghes_irq_func,
|
||||
0, "GHES IRQ", ghes)) {
|
||||
rc = request_irq(ghes->irq, ghes_irq_func, 0, "GHES IRQ", ghes);
|
||||
if (rc) {
|
||||
pr_err(GHES_PFX "Failed to register IRQ for generic hardware error source: %d\n",
|
||||
generic->header.source_id);
|
||||
goto err_edac_unreg;
|
||||
|
@ -278,11 +278,13 @@ int acpi_bus_init_power(struct acpi_device *device)
|
||||
if (result)
|
||||
return result;
|
||||
} else if (state == ACPI_STATE_UNKNOWN) {
|
||||
/* No power resources and missing _PSC? Try to force D0. */
|
||||
/*
|
||||
* No power resources and missing _PSC? Cross fingers and make
|
||||
* it D0 in hope that this is what the BIOS put the device into.
|
||||
* [We tried to force D0 here by executing _PS0, but that broke
|
||||
* Toshiba P870-303 in a nasty way.]
|
||||
*/
|
||||
state = ACPI_STATE_D0;
|
||||
result = acpi_dev_pm_explicit_set(device, state);
|
||||
if (result)
|
||||
return result;
|
||||
}
|
||||
device->power.state = state;
|
||||
return 0;
|
||||
|
@ -456,6 +456,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion dm4 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Pavilion g6 Notebook PC",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion g6 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP 1000 Notebook PC",
|
||||
@ -464,6 +472,14 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP 1000 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = video_ignore_initial_backlight,
|
||||
.ident = "HP Pavilion m4",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP Pavilion m4 Notebook PC"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
/*
|
||||
* acard-ahci.c - ACard AHCI SATA support
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ahci.c - AHCI SATA support
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
@ -423,6 +423,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9125 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9192),
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ahci.h - Common AHCI SATA definitions and declarations
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ata_piix.c - Intel PATA/SATA controllers
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
@ -151,6 +151,7 @@ enum piix_controller_ids {
|
||||
piix_pata_vmw, /* PIIX4 for VMware, spurious DMA_ERR */
|
||||
ich8_sata_snb,
|
||||
ich8_2port_sata_snb,
|
||||
ich8_2port_sata_byt,
|
||||
};
|
||||
|
||||
struct piix_map_db {
|
||||
@ -334,6 +335,9 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
||||
{ 0x8086, 0x8d60, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata_snb },
|
||||
/* SATA Controller IDE (Wellsburg) */
|
||||
{ 0x8086, 0x8d68, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
||||
/* SATA Controller IDE (BayTrail) */
|
||||
{ 0x8086, 0x0F20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
|
||||
{ 0x8086, 0x0F21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata_byt },
|
||||
|
||||
{ } /* terminate list */
|
||||
};
|
||||
@ -441,6 +445,7 @@ static const struct piix_map_db *piix_map_db_table[] = {
|
||||
[tolapai_sata] = &tolapai_map_db,
|
||||
[ich8_sata_snb] = &ich8_map_db,
|
||||
[ich8_2port_sata_snb] = &ich8_2port_map_db,
|
||||
[ich8_2port_sata_byt] = &ich8_2port_map_db,
|
||||
};
|
||||
|
||||
static struct pci_bits piix_enable_bits[] = {
|
||||
@ -1254,6 +1259,16 @@ static struct ata_port_info piix_port_info[] = {
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &piix_sata_ops,
|
||||
},
|
||||
|
||||
[ich8_2port_sata_byt] =
|
||||
{
|
||||
.flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR | PIIX_FLAG_PIO16,
|
||||
.pio_mask = ATA_PIO4,
|
||||
.mwdma_mask = ATA_MWDMA2,
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &piix_sata_ops,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
#define AHCI_PCI_BAR 5
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* libahci.c - Common AHCI SATA low-level routines
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* libata-core.c - helper library for ATA
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
@ -1602,6 +1602,12 @@ unsigned ata_exec_internal_sg(struct ata_device *dev,
|
||||
qc->tf = *tf;
|
||||
if (cdb)
|
||||
memcpy(qc->cdb, cdb, ATAPI_CDB_LEN);
|
||||
|
||||
/* some SATA bridges need us to indicate data xfer direction */
|
||||
if (tf->protocol == ATAPI_PROT_DMA && (dev->flags & ATA_DFLAG_DMADIR) &&
|
||||
dma_dir == DMA_FROM_DEVICE)
|
||||
qc->tf.feature |= ATAPI_DMADIR;
|
||||
|
||||
qc->flags |= ATA_QCFLAG_RESULT_TF;
|
||||
qc->dma_dir = dma_dir;
|
||||
if (dma_dir != DMA_NONE) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* libata-eh.c - libata error handling
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* libata-scsi.c - helper library for ATA
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* libata-sff.c - helper library for PCI IDE BMDMA
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* pdc_adma.c - Pacific Digital Corporation ADMA
|
||||
*
|
||||
* Maintained by: Mark Lord <mlord@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
*
|
||||
* Copyright 2005 Mark Lord
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* sata_promise.c - Promise SATA
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Mikael Pettersson <mikpe@it.uu.se>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
|
@ -549,6 +549,7 @@ static void sata_rcar_bmdma_start(struct ata_queued_cmd *qc)
|
||||
|
||||
/* start host DMA transaction */
|
||||
dmactl = ioread32(priv->base + ATAPI_CONTROL1_REG);
|
||||
dmactl &= ~ATAPI_CONTROL1_STOP;
|
||||
dmactl |= ATAPI_CONTROL1_START;
|
||||
iowrite32(dmactl, priv->base + ATAPI_CONTROL1_REG);
|
||||
}
|
||||
@ -618,17 +619,16 @@ static struct ata_port_operations sata_rcar_port_ops = {
|
||||
.bmdma_status = sata_rcar_bmdma_status,
|
||||
};
|
||||
|
||||
static int sata_rcar_serr_interrupt(struct ata_port *ap)
|
||||
static void sata_rcar_serr_interrupt(struct ata_port *ap)
|
||||
{
|
||||
struct sata_rcar_priv *priv = ap->host->private_data;
|
||||
struct ata_eh_info *ehi = &ap->link.eh_info;
|
||||
int freeze = 0;
|
||||
int handled = 0;
|
||||
u32 serror;
|
||||
|
||||
serror = ioread32(priv->base + SCRSERR_REG);
|
||||
if (!serror)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
DPRINTK("SError @host_intr: 0x%x\n", serror);
|
||||
|
||||
@ -641,7 +641,6 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap)
|
||||
ata_ehi_push_desc(ehi, "%s", "hotplug");
|
||||
|
||||
freeze = serror & SERR_COMM_WAKE ? 0 : 1;
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
/* freeze or abort */
|
||||
@ -649,11 +648,9 @@ static int sata_rcar_serr_interrupt(struct ata_port *ap)
|
||||
ata_port_freeze(ap);
|
||||
else
|
||||
ata_port_abort(ap);
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
static int sata_rcar_ata_interrupt(struct ata_port *ap)
|
||||
static void sata_rcar_ata_interrupt(struct ata_port *ap)
|
||||
{
|
||||
struct ata_queued_cmd *qc;
|
||||
int handled = 0;
|
||||
@ -662,7 +659,9 @@ static int sata_rcar_ata_interrupt(struct ata_port *ap)
|
||||
if (qc)
|
||||
handled |= ata_bmdma_port_intr(ap, qc);
|
||||
|
||||
return handled;
|
||||
/* be sure to clear ATA interrupt */
|
||||
if (!handled)
|
||||
sata_rcar_check_status(ap);
|
||||
}
|
||||
|
||||
static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance)
|
||||
@ -677,20 +676,21 @@ static irqreturn_t sata_rcar_interrupt(int irq, void *dev_instance)
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
sataintstat = ioread32(priv->base + SATAINTSTAT_REG);
|
||||
sataintstat &= SATA_RCAR_INT_MASK;
|
||||
if (!sataintstat)
|
||||
goto done;
|
||||
/* ack */
|
||||
iowrite32(sataintstat & ~SATA_RCAR_INT_MASK,
|
||||
priv->base + SATAINTSTAT_REG);
|
||||
iowrite32(~sataintstat & 0x7ff, priv->base + SATAINTSTAT_REG);
|
||||
|
||||
ap = host->ports[0];
|
||||
|
||||
if (sataintstat & SATAINTSTAT_ATA)
|
||||
handled |= sata_rcar_ata_interrupt(ap);
|
||||
sata_rcar_ata_interrupt(ap);
|
||||
|
||||
if (sataintstat & SATAINTSTAT_SERR)
|
||||
handled |= sata_rcar_serr_interrupt(ap);
|
||||
sata_rcar_serr_interrupt(ap);
|
||||
|
||||
handled = 1;
|
||||
done:
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* sata_sil.c - Silicon Image SATA
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* sata_sx4.c - Promise SATA
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* sata_via.c - VIA Serial ATA controllers
|
||||
*
|
||||
* Maintained by: Jeff Garzik <jgarzik@pobox.com>
|
||||
* Maintained by: Tejun Heo <tj@kernel.org>
|
||||
* Please ALWAYS copy linux-ide@vger.kernel.org
|
||||
* on emails.
|
||||
*
|
||||
|
@ -347,11 +347,11 @@ static u32 get_cur_val(const struct cpumask *mask)
|
||||
switch (per_cpu(acfreq_data, cpumask_first(mask))->cpu_feature) {
|
||||
case SYSTEM_INTEL_MSR_CAPABLE:
|
||||
cmd.type = SYSTEM_INTEL_MSR_CAPABLE;
|
||||
cmd.addr.msr.reg = MSR_IA32_PERF_STATUS;
|
||||
cmd.addr.msr.reg = MSR_IA32_PERF_CTL;
|
||||
break;
|
||||
case SYSTEM_AMD_MSR_CAPABLE:
|
||||
cmd.type = SYSTEM_AMD_MSR_CAPABLE;
|
||||
cmd.addr.msr.reg = MSR_AMD_PERF_STATUS;
|
||||
cmd.addr.msr.reg = MSR_AMD_PERF_CTL;
|
||||
break;
|
||||
case SYSTEM_IO_CAPABLE:
|
||||
cmd.type = SYSTEM_IO_CAPABLE;
|
||||
|
@ -45,7 +45,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
|
||||
struct cpufreq_freqs freqs;
|
||||
struct opp *opp;
|
||||
unsigned long volt = 0, volt_old = 0, tol = 0;
|
||||
long freq_Hz;
|
||||
long freq_Hz, freq_exact;
|
||||
unsigned int index;
|
||||
int ret;
|
||||
|
||||
@ -60,6 +60,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
|
||||
freq_Hz = clk_round_rate(cpu_clk, freq_table[index].frequency * 1000);
|
||||
if (freq_Hz < 0)
|
||||
freq_Hz = freq_table[index].frequency * 1000;
|
||||
freq_exact = freq_Hz;
|
||||
freqs.new = freq_Hz / 1000;
|
||||
freqs.old = clk_get_rate(cpu_clk) / 1000;
|
||||
|
||||
@ -98,7 +99,7 @@ static int cpu0_set_target(struct cpufreq_policy *policy,
|
||||
}
|
||||
}
|
||||
|
||||
ret = clk_set_rate(cpu_clk, freqs.new * 1000);
|
||||
ret = clk_set_rate(cpu_clk, freq_exact);
|
||||
if (ret) {
|
||||
pr_err("failed to set clock rate: %d\n", ret);
|
||||
if (cpu_reg)
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include <linux/tick.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include "cpufreq_governor.h"
|
||||
|
||||
@ -180,8 +181,10 @@ void gov_queue_work(struct dbs_data *dbs_data, struct cpufreq_policy *policy,
|
||||
if (!all_cpus) {
|
||||
__gov_queue_work(smp_processor_id(), dbs_data, delay);
|
||||
} else {
|
||||
get_online_cpus();
|
||||
for_each_cpu(i, policy->cpus)
|
||||
__gov_queue_work(i, dbs_data, delay);
|
||||
put_online_cpus();
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gov_queue_work);
|
||||
|
@ -716,8 +716,7 @@ static int dmatest_func(void *data)
|
||||
}
|
||||
dma_async_issue_pending(chan);
|
||||
|
||||
wait_event_freezable_timeout(done_wait,
|
||||
done.done || kthread_should_stop(),
|
||||
wait_event_freezable_timeout(done_wait, done.done,
|
||||
msecs_to_jiffies(params->timeout));
|
||||
|
||||
status = dma_async_is_tx_complete(chan, cookie, NULL, NULL);
|
||||
@ -997,7 +996,6 @@ static void stop_threaded_test(struct dmatest_info *info)
|
||||
static int __restart_threaded_test(struct dmatest_info *info, bool run)
|
||||
{
|
||||
struct dmatest_params *params = &info->params;
|
||||
int ret;
|
||||
|
||||
/* Stop any running test first */
|
||||
__stop_threaded_test(info);
|
||||
@ -1012,13 +1010,23 @@ static int __restart_threaded_test(struct dmatest_info *info, bool run)
|
||||
memcpy(params, &info->dbgfs_params, sizeof(*params));
|
||||
|
||||
/* Run test with new parameters */
|
||||
ret = __run_threaded_test(info);
|
||||
if (ret) {
|
||||
__stop_threaded_test(info);
|
||||
pr_err("dmatest: Can't run test\n");
|
||||
return __run_threaded_test(info);
|
||||
}
|
||||
|
||||
static bool __is_threaded_test_run(struct dmatest_info *info)
|
||||
{
|
||||
struct dmatest_chan *dtc;
|
||||
|
||||
list_for_each_entry(dtc, &info->channels, node) {
|
||||
struct dmatest_thread *thread;
|
||||
|
||||
list_for_each_entry(thread, &dtc->threads, node) {
|
||||
if (!thread->done)
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
return false;
|
||||
}
|
||||
|
||||
static ssize_t dtf_write_string(void *to, size_t available, loff_t *ppos,
|
||||
@ -1091,22 +1099,10 @@ static ssize_t dtf_read_run(struct file *file, char __user *user_buf,
|
||||
{
|
||||
struct dmatest_info *info = file->private_data;
|
||||
char buf[3];
|
||||
struct dmatest_chan *dtc;
|
||||
bool alive = false;
|
||||
|
||||
mutex_lock(&info->lock);
|
||||
list_for_each_entry(dtc, &info->channels, node) {
|
||||
struct dmatest_thread *thread;
|
||||
|
||||
list_for_each_entry(thread, &dtc->threads, node) {
|
||||
if (!thread->done) {
|
||||
alive = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (alive) {
|
||||
if (__is_threaded_test_run(info)) {
|
||||
buf[0] = 'Y';
|
||||
} else {
|
||||
__stop_threaded_test(info);
|
||||
@ -1132,7 +1128,12 @@ static ssize_t dtf_write_run(struct file *file, const char __user *user_buf,
|
||||
|
||||
if (strtobool(buf, &bv) == 0) {
|
||||
mutex_lock(&info->lock);
|
||||
ret = __restart_threaded_test(info, bv);
|
||||
|
||||
if (__is_threaded_test_run(info))
|
||||
ret = -EBUSY;
|
||||
else
|
||||
ret = __restart_threaded_test(info, bv);
|
||||
|
||||
mutex_unlock(&info->lock);
|
||||
}
|
||||
|
||||
|
@ -1566,10 +1566,12 @@ static void dma_tc_handle(struct d40_chan *d40c)
|
||||
return;
|
||||
}
|
||||
|
||||
if (d40_queue_start(d40c) == NULL)
|
||||
if (d40_queue_start(d40c) == NULL) {
|
||||
d40c->busy = false;
|
||||
pm_runtime_mark_last_busy(d40c->base->dev);
|
||||
pm_runtime_put_autosuspend(d40c->base->dev);
|
||||
|
||||
pm_runtime_mark_last_busy(d40c->base->dev);
|
||||
pm_runtime_put_autosuspend(d40c->base->dev);
|
||||
}
|
||||
|
||||
d40_desc_remove(d40d);
|
||||
d40_desc_done(d40c, d40d);
|
||||
|
@ -1054,7 +1054,7 @@ EXPORT_SYMBOL(drm_vblank_off);
|
||||
*/
|
||||
void drm_vblank_pre_modeset(struct drm_device *dev, int crtc)
|
||||
{
|
||||
/* vblank is not initialized (IRQ not installed ?) */
|
||||
/* vblank is not initialized (IRQ not installed ?), or has been freed */
|
||||
if (!dev->num_crtcs)
|
||||
return;
|
||||
/*
|
||||
@ -1076,6 +1076,10 @@ void drm_vblank_post_modeset(struct drm_device *dev, int crtc)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
|
||||
/* vblank is not initialized (IRQ not installed ?), or has been freed */
|
||||
if (!dev->num_crtcs)
|
||||
return;
|
||||
|
||||
if (dev->vblank_inmodeset[crtc]) {
|
||||
spin_lock_irqsave(&dev->vbl_lock, irqflags);
|
||||
dev->vblank_disable_allowed = 1;
|
||||
|
@ -91,14 +91,11 @@ i915_gem_wait_for_error(struct i915_gpu_error *error)
|
||||
{
|
||||
int ret;
|
||||
|
||||
#define EXIT_COND (!i915_reset_in_progress(error))
|
||||
#define EXIT_COND (!i915_reset_in_progress(error) || \
|
||||
i915_terminally_wedged(error))
|
||||
if (EXIT_COND)
|
||||
return 0;
|
||||
|
||||
/* GPU is already declared terminally dead, give up. */
|
||||
if (i915_terminally_wedged(error))
|
||||
return -EIO;
|
||||
|
||||
/*
|
||||
* Only wait 10 seconds for the gpu reset to complete to avoid hanging
|
||||
* userspace. If it takes that long something really bad is going on and
|
||||
|
@ -7937,6 +7937,11 @@ intel_modeset_check_state(struct drm_device *dev)
|
||||
memset(&pipe_config, 0, sizeof(pipe_config));
|
||||
active = dev_priv->display.get_pipe_config(crtc,
|
||||
&pipe_config);
|
||||
|
||||
/* hw state is inconsistent with the pipe A quirk */
|
||||
if (crtc->pipe == PIPE_A && dev_priv->quirks & QUIRK_PIPEA_FORCE)
|
||||
active = crtc->active;
|
||||
|
||||
WARN(crtc->active != active,
|
||||
"crtc active state doesn't match with hw state "
|
||||
"(expected %i, found %i)\n", crtc->active, active);
|
||||
|
@ -815,10 +815,10 @@ static const struct dmi_system_id intel_no_lvds[] = {
|
||||
},
|
||||
{
|
||||
.callback = intel_no_lvds_dmi_callback,
|
||||
.ident = "Hewlett-Packard HP t5740e Thin Client",
|
||||
.ident = "Hewlett-Packard HP t5740",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "HP t5740e Thin Client"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, " t5740"),
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -1776,7 +1776,7 @@ static void intel_sdvo_get_lvds_modes(struct drm_connector *connector)
|
||||
* Assume that the preferred modes are
|
||||
* arranged in priority order.
|
||||
*/
|
||||
intel_ddc_get_modes(connector, intel_sdvo->i2c);
|
||||
intel_ddc_get_modes(connector, &intel_sdvo->ddc);
|
||||
if (list_empty(&connector->probed_modes) == false)
|
||||
goto end;
|
||||
|
||||
|
@ -1034,13 +1034,14 @@ static int mga_crtc_mode_set(struct drm_crtc *crtc,
|
||||
else
|
||||
hi_pri_lvl = 5;
|
||||
|
||||
WREG8(0x1fde, 0x06);
|
||||
WREG8(0x1fdf, hi_pri_lvl);
|
||||
WREG8(MGAREG_CRTCEXT_INDEX, 0x06);
|
||||
WREG8(MGAREG_CRTCEXT_DATA, hi_pri_lvl);
|
||||
} else {
|
||||
WREG8(MGAREG_CRTCEXT_INDEX, 0x06);
|
||||
if (mdev->reg_1e24 >= 0x01)
|
||||
WREG8(0x1fdf, 0x03);
|
||||
WREG8(MGAREG_CRTCEXT_DATA, 0x03);
|
||||
else
|
||||
WREG8(0x1fdf, 0x04);
|
||||
WREG8(MGAREG_CRTCEXT_DATA, 0x04);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
@ -50,11 +50,16 @@ nv50_dac_sense(struct nv50_disp_priv *priv, int or, u32 loadval)
|
||||
{
|
||||
const u32 doff = (or * 0x800);
|
||||
int load = -EINVAL;
|
||||
nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80150000);
|
||||
nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);
|
||||
nv_wr32(priv, 0x61a00c + doff, 0x00100000 | loadval);
|
||||
udelay(9500);
|
||||
mdelay(9);
|
||||
udelay(500);
|
||||
nv_wr32(priv, 0x61a00c + doff, 0x80000000);
|
||||
load = (nv_rd32(priv, 0x61a00c + doff) & 0x38000000) >> 27;
|
||||
nv_wr32(priv, 0x61a00c + doff, 0x00000000);
|
||||
nv_mask(priv, 0x61a004 + doff, 0x807f0000, 0x80550000);
|
||||
nv_wait(priv, 0x61a004 + doff, 0x80000000, 0x00000000);
|
||||
return load;
|
||||
}
|
||||
|
||||
|
@ -55,6 +55,10 @@ nv84_hdmi_ctrl(struct nv50_disp_priv *priv, int head, int or, u32 data)
|
||||
nv_wr32(priv, 0x616510 + hoff, 0x00000000);
|
||||
nv_mask(priv, 0x616500 + hoff, 0x00000001, 0x00000001);
|
||||
|
||||
nv_mask(priv, 0x6165d0 + hoff, 0x00070001, 0x00010001); /* SPARE, HW_CTS */
|
||||
nv_mask(priv, 0x616568 + hoff, 0x00010101, 0x00000000); /* ACR_CTRL, ?? */
|
||||
nv_mask(priv, 0x616578 + hoff, 0x80000000, 0x80000000); /* ACR_0441_ENABLE */
|
||||
|
||||
/* ??? */
|
||||
nv_mask(priv, 0x61733c, 0x00100000, 0x00100000); /* RESETF */
|
||||
nv_mask(priv, 0x61733c, 0x10000000, 0x10000000); /* LOOKUP_EN */
|
||||
|
@ -40,14 +40,13 @@
|
||||
* FIFO channel objects
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
nv50_fifo_playlist_update(struct nv50_fifo_priv *priv)
|
||||
static void
|
||||
nv50_fifo_playlist_update_locked(struct nv50_fifo_priv *priv)
|
||||
{
|
||||
struct nouveau_bar *bar = nouveau_bar(priv);
|
||||
struct nouveau_gpuobj *cur;
|
||||
int i, p;
|
||||
|
||||
mutex_lock(&nv_subdev(priv)->mutex);
|
||||
cur = priv->playlist[priv->cur_playlist];
|
||||
priv->cur_playlist = !priv->cur_playlist;
|
||||
|
||||
@ -61,6 +60,13 @@ nv50_fifo_playlist_update(struct nv50_fifo_priv *priv)
|
||||
nv_wr32(priv, 0x0032f4, cur->addr >> 12);
|
||||
nv_wr32(priv, 0x0032ec, p);
|
||||
nv_wr32(priv, 0x002500, 0x00000101);
|
||||
}
|
||||
|
||||
void
|
||||
nv50_fifo_playlist_update(struct nv50_fifo_priv *priv)
|
||||
{
|
||||
mutex_lock(&nv_subdev(priv)->mutex);
|
||||
nv50_fifo_playlist_update_locked(priv);
|
||||
mutex_unlock(&nv_subdev(priv)->mutex);
|
||||
}
|
||||
|
||||
@ -489,7 +495,7 @@ nv50_fifo_init(struct nouveau_object *object)
|
||||
|
||||
for (i = 0; i < 128; i++)
|
||||
nv_wr32(priv, 0x002600 + (i * 4), 0x00000000);
|
||||
nv50_fifo_playlist_update(priv);
|
||||
nv50_fifo_playlist_update_locked(priv);
|
||||
|
||||
nv_wr32(priv, 0x003200, 0x00000001);
|
||||
nv_wr32(priv, 0x003250, 0x00000001);
|
||||
|
@ -218,7 +218,7 @@ struct nv04_display_class {
|
||||
#define NV50_DISP_DAC_PWR_STATE 0x00000040
|
||||
#define NV50_DISP_DAC_PWR_STATE_ON 0x00000000
|
||||
#define NV50_DISP_DAC_PWR_STATE_OFF 0x00000040
|
||||
#define NV50_DISP_DAC_LOAD 0x0002000c
|
||||
#define NV50_DISP_DAC_LOAD 0x00020100
|
||||
#define NV50_DISP_DAC_LOAD_VALUE 0x00000007
|
||||
|
||||
#define NV50_DISP_PIOR_MTHD 0x00030000
|
||||
|
@ -1554,7 +1554,9 @@ nv50_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
|
||||
{
|
||||
struct nv50_disp *disp = nv50_disp(encoder->dev);
|
||||
int ret, or = nouveau_encoder(encoder)->or;
|
||||
u32 load = 0;
|
||||
u32 load = nouveau_drm(encoder->dev)->vbios.dactestval;
|
||||
if (load == 0)
|
||||
load = 340;
|
||||
|
||||
ret = nv_exec(disp->core, NV50_DISP_DAC_LOAD + or, &load, sizeof(load));
|
||||
if (ret || load != 7)
|
||||
|
@ -667,6 +667,8 @@ atombios_digital_setup(struct drm_encoder *encoder, int action)
|
||||
int
|
||||
atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
{
|
||||
struct drm_device *dev = encoder->dev;
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
struct drm_connector *connector;
|
||||
struct radeon_connector *radeon_connector;
|
||||
@ -693,7 +695,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
case DRM_MODE_CONNECTOR_DVII:
|
||||
case DRM_MODE_CONNECTOR_HDMIB: /* HDMI-B is basically DL-DVI; analog works fine */
|
||||
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
radeon_audio &&
|
||||
!ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else if (radeon_connector->use_digital)
|
||||
return ATOM_ENCODER_MODE_DVI;
|
||||
@ -704,7 +707,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
case DRM_MODE_CONNECTOR_HDMIA:
|
||||
default:
|
||||
if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
radeon_audio &&
|
||||
!ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else
|
||||
return ATOM_ENCODER_MODE_DVI;
|
||||
@ -718,7 +722,8 @@ atombios_get_encoder_mode(struct drm_encoder *encoder)
|
||||
(dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
|
||||
return ATOM_ENCODER_MODE_DP;
|
||||
else if (drm_detect_hdmi_monitor(radeon_connector->edid) &&
|
||||
radeon_audio)
|
||||
radeon_audio &&
|
||||
!ASIC_IS_DCE6(rdev)) /* remove once we support DCE6 */
|
||||
return ATOM_ENCODER_MODE_HDMI;
|
||||
else
|
||||
return ATOM_ENCODER_MODE_DVI;
|
||||
|
@ -4754,6 +4754,12 @@ static int evergreen_startup(struct radeon_device *rdev)
|
||||
rdev->ring[R600_RING_TYPE_UVD_INDEX].ring_size = 0;
|
||||
|
||||
/* Enable IRQ */
|
||||
if (!rdev->irq.installed) {
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = r600_irq_init(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
||||
@ -4923,10 +4929,6 @@ int evergreen_init(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
|
||||
r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
|
||||
|
||||
|
@ -2025,6 +2025,12 @@ static int cayman_startup(struct radeon_device *rdev)
|
||||
}
|
||||
|
||||
/* Enable IRQ */
|
||||
if (!rdev->irq.installed) {
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = r600_irq_init(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
||||
@ -2190,10 +2196,6 @@ int cayman_init(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
ring->ring_obj = NULL;
|
||||
r600_ring_init(rdev, ring, 1024 * 1024);
|
||||
|
||||
|
@ -3869,6 +3869,12 @@ static int r100_startup(struct radeon_device *rdev)
|
||||
}
|
||||
|
||||
/* Enable IRQ */
|
||||
if (!rdev->irq.installed) {
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r100_irq_set(rdev);
|
||||
rdev->config.r100.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
||||
/* 1M ring buffer */
|
||||
@ -4022,9 +4028,6 @@ int r100_init(struct radeon_device *rdev)
|
||||
r100_mc_init(rdev);
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
|
@ -1382,6 +1382,12 @@ static int r300_startup(struct radeon_device *rdev)
|
||||
}
|
||||
|
||||
/* Enable IRQ */
|
||||
if (!rdev->irq.installed) {
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r100_irq_set(rdev);
|
||||
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
||||
/* 1M ring buffer */
|
||||
@ -1514,9 +1520,6 @@ int r300_init(struct radeon_device *rdev)
|
||||
r300_mc_init(rdev);
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
|
@ -265,6 +265,12 @@ static int r420_startup(struct radeon_device *rdev)
|
||||
}
|
||||
|
||||
/* Enable IRQ */
|
||||
if (!rdev->irq.installed) {
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r100_irq_set(rdev);
|
||||
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
||||
/* 1M ring buffer */
|
||||
@ -411,10 +417,6 @@ int r420_init(struct radeon_device *rdev)
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r) {
|
||||
return r;
|
||||
}
|
||||
/* Memory manager */
|
||||
r = radeon_bo_init(rdev);
|
||||
if (r) {
|
||||
|
@ -194,6 +194,12 @@ static int r520_startup(struct radeon_device *rdev)
|
||||
}
|
||||
|
||||
/* Enable IRQ */
|
||||
if (!rdev->irq.installed) {
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
rs600_irq_set(rdev);
|
||||
rdev->config.r300.hdp_cntl = RREG32(RADEON_HOST_PATH_CNTL);
|
||||
/* 1M ring buffer */
|
||||
@ -295,9 +301,6 @@ int r520_init(struct radeon_device *rdev)
|
||||
rv515_debugfs(rdev);
|
||||
/* Fence driver */
|
||||
r = radeon_fence_driver_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
/* Memory manager */
|
||||
|
@ -1046,6 +1046,24 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev)
|
||||
return -1;
|
||||
}
|
||||
|
||||
uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg)
|
||||
{
|
||||
uint32_t r;
|
||||
|
||||
WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg));
|
||||
r = RREG32(R_0028FC_MC_DATA);
|
||||
WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR);
|
||||
return r;
|
||||
}
|
||||
|
||||
void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v)
|
||||
{
|
||||
WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) |
|
||||
S_0028F8_MC_IND_WR_EN(1));
|
||||
WREG32(R_0028FC_MC_DATA, v);
|
||||
WREG32(R_0028F8_MC_INDEX, 0x7F);
|
||||
}
|
||||
|
||||
static void r600_mc_program(struct radeon_device *rdev)
|
||||
{
|
||||
struct rv515_mc_save save;
|
||||
@ -1181,6 +1199,8 @@ static int r600_mc_init(struct radeon_device *rdev)
|
||||
{
|
||||
u32 tmp;
|
||||
int chansize, numchan;
|
||||
uint32_t h_addr, l_addr;
|
||||
unsigned long long k8_addr;
|
||||
|
||||
/* Get VRAM informations */
|
||||
rdev->mc.vram_is_ddr = true;
|
||||
@ -1221,7 +1241,30 @@ static int r600_mc_init(struct radeon_device *rdev)
|
||||
if (rdev->flags & RADEON_IS_IGP) {
|
||||
rs690_pm_info(rdev);
|
||||
rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
|
||||
|
||||
if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) {
|
||||
/* Use K8 direct mapping for fast fb access. */
|
||||
rdev->fastfb_working = false;
|
||||
h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL));
|
||||
l_addr = RREG32_MC(R_000011_K8_FB_LOCATION);
|
||||
k8_addr = ((unsigned long long)h_addr) << 32 | l_addr;
|
||||
#if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE)
|
||||
if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL)
|
||||
#endif
|
||||
{
|
||||
/* FastFB shall be used with UMA memory. Here it is simply disabled when sideport
|
||||
* memory is present.
|
||||
*/
|
||||
if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) {
|
||||
DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n",
|
||||
(unsigned long long)rdev->mc.aper_base, k8_addr);
|
||||
rdev->mc.aper_base = (resource_size_t)k8_addr;
|
||||
rdev->fastfb_working = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
radeon_update_bandwidth_info(rdev);
|
||||
return 0;
|
||||
}
|
||||
@ -3202,6 +3245,12 @@ static int r600_startup(struct radeon_device *rdev)
|
||||
}
|
||||
|
||||
/* Enable IRQ */
|
||||
if (!rdev->irq.installed) {
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
}
|
||||
|
||||
r = r600_irq_init(rdev);
|
||||
if (r) {
|
||||
DRM_ERROR("radeon: IH init failed (%d).\n", r);
|
||||
@ -3356,10 +3405,6 @@ int r600_init(struct radeon_device *rdev)
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
r = radeon_irq_kms_init(rdev);
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL;
|
||||
r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024);
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user