# HG changeset patch
# User Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
# Node ID 3e99cf85d57d5fa56fe5eb47b019f2989009d50c
# Parent 67953e195eb74f79ab2fd70315e585a7f8941161
[POWERPC][XEN] HID paranoia!
Used some HIDs to debug an issue, so decided to clean some stuff up.
Signed-off-by: Jimi Xenidis <jimix@xxxxxxxxxxxxxx>
---
xen/arch/powerpc/powerpc64/ppc970.c | 109 ++++++++++++-------------
xen/include/asm-powerpc/powerpc64/ppc970-hid.h | 105 ++++++++++++++++--------
xen/include/asm-powerpc/powerpc64/processor.h | 7 +
3 files changed, 132 insertions(+), 89 deletions(-)
diff -r 67953e195eb7 -r 3e99cf85d57d xen/arch/powerpc/powerpc64/ppc970.c
--- a/xen/arch/powerpc/powerpc64/ppc970.c Wed Aug 30 15:09:47 2006 -0400
+++ b/xen/arch/powerpc/powerpc64/ppc970.c Wed Aug 30 18:01:15 2006 -0400
@@ -34,17 +34,17 @@
struct rma_settings {
int order;
- int rmlr0;
- int rmlr12;
+ int rmlr_0;
+ int rmlr_1_2;
};
static struct rma_settings rma_orders[] = {
- { .order = 26, .rmlr0 = 0, .rmlr12 = 3, }, /* 64 MB */
- { .order = 27, .rmlr0 = 1, .rmlr12 = 3, }, /* 128 MB */
- { .order = 28, .rmlr0 = 1, .rmlr12 = 0, }, /* 256 MB */
- { .order = 30, .rmlr0 = 0, .rmlr12 = 2, }, /* 1 GB */
- { .order = 34, .rmlr0 = 0, .rmlr12 = 1, }, /* 16 GB */
- { .order = 38, .rmlr0 = 0, .rmlr12 = 0, }, /* 256 GB */
+ { .order = 26, .rmlr_0 = 0, .rmlr_1_2 = 3, }, /* 64 MB */
+ { .order = 27, .rmlr_0 = 1, .rmlr_1_2 = 3, }, /* 128 MB */
+ { .order = 28, .rmlr_0 = 1, .rmlr_1_2 = 0, }, /* 256 MB */
+ { .order = 30, .rmlr_0 = 0, .rmlr_1_2 = 2, }, /* 1 GB */
+ { .order = 34, .rmlr_0 = 0, .rmlr_1_2 = 1, }, /* 16 GB */
+ { .order = 38, .rmlr_0 = 0, .rmlr_1_2 = 0, }, /* 256 GB */
};
static uint log_large_page_sizes[] = {
@@ -130,22 +130,21 @@ void cpu_initialize(int cpuid)
mtdec(timebase_freq);
mthdec(timebase_freq);
- hid0.bits.nap = 1;
- hid0.bits.dpm = 1;
- hid0.bits.nhr = 1;
- hid0.bits.hdice = 1; /* enable HDEC */
- hid0.bits.eb_therm = 1;
- hid0.bits.en_attn = 1;
+ hid0.bits.nap = 1; /* NAP */
+ hid0.bits.dpm = 1; /* Dynamic Power Management */
+ hid0.bits.nhr = 0; /* ! Not Hard Reset */
+ hid0.bits.hdice_en = 1; /* enable HDEC */
+ hid0.bits.en_therm = 0; /* ! Enable ext thermal ints */
+ /* onlu debug Xen should do this */
+ hid0.bits.en_attn = 1; /* Enable attn instruction */
+
#ifdef SERIALIZE
- ulong s = 0;
-
- s |= 1UL << (63-0); /* one_ppc */
- s |= 1UL << (63-2); /* isync_sc */
- s |= 1UL << (63-16); /* inorder */
+ hid0.bits.one_ppc = 1;
+ hid0.bits.isync_sc = 1;
+ hid0.bits.inorder = 1;
/* may not want these */
- s |= 1UL << (63-1); /* do_single */
- s |= 1UL << (63-3); /* ser-gp */
- hid0.word |= s;
+ hid0.bits.do_single = 1;
+ hid0.bits.ser-gp = 1;
#endif
printk("CPU #%d: Hello World! SP = %lx TOC = %lx HID0 = %lx\n",
@@ -153,36 +152,36 @@ void cpu_initialize(int cpuid)
mthid0(hid0.word);
- hid1.bits.bht_pm = 7;
- hid1.bits.en_ls = 1;
-
- hid1.bits.en_cc = 1;
- hid1.bits.en_ic = 1;
-
- hid1.bits.pf_mode = 2;
-
- hid1.bits.en_if_cach = 1;
- hid1.bits.en_ic_rec = 1;
- hid1.bits.en_id_rec = 1;
- hid1.bits.en_er_rec = 1;
-
- hid1.bits.en_sp_itw = 1;
+ hid1.bits.bht_pm = 7; /* branch history table prediction mode */
+ hid1.bits.en_ls = 1; /* enable link stack */
+
+ hid1.bits.en_cc = 1; /* enable count cache */
+ hid1.bits.en_ic = 1; /* enable inst cache */
+
+ hid1.bits.pf_mode = 2; /* prefetch mode */
+
+ hid1.bits.en_if_cach = 1; /* i-fetch cacheability control */
+ hid1.bits.en_ic_rec = 1; /* i-cache parity error recovery */
+ hid1.bits.en_id_rec = 1; /* i-dir parity error recovery */
+ hid1.bits.en_er_rec = 1; /* i-ERAT parity error recovery */
+
+ hid1.bits.en_sp_itw = 1; /* En speculative tablewalks */
mthid1(hid1.word);
/* no changes to hid4 but we want to make sure that secondaries
* are sane */
- if (cpuid > 0)
- mthid4(hid4.word);
-
- hid5.bits.DCBZ_size = 0;
- hid5.bits.DCBZ32_ill = 0;
+ hid4.bits.lg_pg_dis = 0; /* make sure we enable large pages */
+ mthid4(hid4.word);
+
+ hid5.bits.DCBZ_size = 0; /* make dcbz size 32 bytes */
+ hid5.bits.DCBZ32_ill = 0; /* make dzbz 32byte illeagal */
mthid5(hid5.word);
-#ifdef DUMP_HIDS
- printk("hid0 0x%lx\n"
- "hid1 0x%lx\n"
- "hid4 0x%lx\n"
- "hid5 0x%lx\n",
+#ifndef DUMP_HIDS
+ printk("hid0 0x%016lx\n"
+ "hid1 0x%016lx\n"
+ "hid4 0x%016lx\n"
+ "hid5 0x%016lx\n",
mfhid0(), mfhid1(), mfhid4(), mfhid5());
#endif
@@ -200,18 +199,18 @@ void cpu_init_vcpu(struct vcpu *v)
hid4.word = mfhid4();
- hid4.bits.lpes0 = 0; /* exceptions set MSR_HV=1 */
- hid4.bits.lpes1 = 1; /* RMA applies */
-
- hid4.bits.rmor = page_to_maddr(d->arch.rma_page) >> 26;
-
- hid4.bits.lpid01 = d->domain_id & 3;
- hid4.bits.lpid25 = (d->domain_id >> 2) & 0xf;
+ hid4.bits.lpes_0 = 0; /* external exceptions set MSR_HV=1 */
+ hid4.bits.lpes_1 = 1; /* RMA applies */
+
+ hid4.bits.rmor_0_15 = page_to_maddr(d->arch.rma_page) >> 26;
+
+ hid4.bits.lpid_0_1 = d->domain_id & 3;
+ hid4.bits.lpid_2_5 = (d->domain_id >> 2) & 0xf;
rma_settings = cpu_find_rma(d->arch.rma_order + PAGE_SHIFT);
ASSERT(rma_settings != NULL);
- hid4.bits.rmlr0 = rma_settings->rmlr0;
- hid4.bits.rmlr12 = rma_settings->rmlr12;
+ hid4.bits.rmlr_0 = rma_settings->rmlr_0;
+ hid4.bits.rmlr_1_2 = rma_settings->rmlr_1_2;
v->arch.cpu.hid4.word = hid4.word;
}
diff -r 67953e195eb7 -r 3e99cf85d57d
xen/include/asm-powerpc/powerpc64/ppc970-hid.h
--- a/xen/include/asm-powerpc/powerpc64/ppc970-hid.h Wed Aug 30 15:09:47
2006 -0400
+++ b/xen/include/asm-powerpc/powerpc64/ppc970-hid.h Wed Aug 30 18:01:15
2006 -0400
@@ -29,22 +29,30 @@
union hid0 {
struct hid0_bits {
- ulong _unused_0_8: 9;
- ulong nap: 1;
- ulong _unused_10: 1;
- ulong dpm: 1; /* Dynamic Power Management */
- ulong _unused_12_14: 3;
- ulong nhr: 1; /* Not Hard Reset */
- ulong inorder: 1;
+ ulong one_ppc: 1; /* One PowerPC AS insn per dispatch group */
+ ulong do_single: 1; /* Single group completion */
+ ulong isync_sc: 1; /* Disable isync scoreboard optimization */
+ ulong ser_gp: 1; /* Serial Group Dispatch */
+ ulong _reserved_04_08: 5;
+ ulong nap: 1; /* Nap */
+ ulong _reserved_10: 1;
+ ulong dpm: 1; /* Dynamic Power Management */
+ ulong _reserved_12: 1;
+ ulong tg: 1; /* Perfmon threshold granualrity control */
+ ulong hang_dis: 1; /* Disable cpu hang detection mechanism */
+ ulong nhr: 1; /* Not Hard Reset */
+ ulong inorder: 1; /* Serial Group Issue */
ulong _reserved17: 1;
- ulong tb_ctrl: 1;
- ulong ext_tb_enb: 1; /* timebase is linked to external clock */
- ulong _unused_20_22: 3;
- ulong hdice: 1; /* HDEC enable */
- ulong eb_therm: 1; /* Enable ext thermal ints */
+ ulong tb_ctrl: 1; /* Enable time base couting while stopped */
+ ulong ext_tb_enb: 1; /* timebase is linked to external clock */
+ ulong _unused_20_21: 2;
+ ulong ciabr_en: 1; /* CIABR enable */
+ ulong hdice_en: 1; /* HDEC enable */
+ ulong en_therm: 1; /* Enable ext thermal ints */
ulong _unused_25_30: 6;
ulong en_attn: 1; /* Enable attn instruction */
- ulong _unused_32_63: 32;
+ ulong en_mck: 1; /* En external machine check interrupts */
+ ulong _unused_33_63: 31;
} bits;
ulong word;
};
@@ -62,11 +70,11 @@ union hid1 {
ulong en_ic_rec: 1; /* i-cache parity error recovery */
ulong en_id_rec: 1; /* i-dir parity error recovery */
ulong en_er_rec: 1; /* i-ERAT parity error recovery */
- ulong ic_pe: 1;
- ulong icd0_pe: 1;
+ ulong ic_pe: 1; /* Force instruction cache parity error */
+ ulong icd0_pe: 1; /* Force insn cache dir 0 parity error */
ulong _reserved_16: 1;
- ulong ier_pe: 1;
- ulong en_sp_itw: 1;
+ ulong ier_pe: 1; /* force i-ERAT parity error (inject) */
+ ulong en_sp_itw: 1; /* En speculative tablewalks */
ulong _reserved_19_63: 45;
} bits;
ulong word;
@@ -74,32 +82,61 @@ union hid1 {
union hid4 {
struct hid4_bits {
- ulong lpes0: 1; /* LPAR Environment Selector bit 0 */
- ulong rmlr12: 2; /* RMLR 1:2 */
- ulong lpid25: 4; /* LPAR ID bits 2:5 */
- ulong rmor: 16; /* real mode offset region */
- ulong rm_ci: 1; /* real mode cache-inhibit */
- ulong force_ai: 1; /* Force alignment interrupt */
- ulong _unused: 32;
- ulong lpes1: 1; /* LPAR Environment Selector bit 1 */
- ulong rmlr0: 1; /* RMLR 0 */
+ ulong lpes_0: 1; /* LPAR Environment Selector bit 0 */
+ ulong rmlr_1_2: 2; /* RMLR 1:2 */
+ ulong lpid_2_5: 4; /* LPAR ID bits 2:5 */
+ ulong rmor_0_15: 16; /* real mode offset region */
+ ulong rm_ci: 1; /* real mode cache-inhibit */
+ ulong force_ai: 1; /* Force alignment interrupt */
+ ulong dis_pref: 1; /* disable prefetching */
+ ulong res_pref: 1; /* reset data prefetching mechanism */
+ ulong en_sp_dtw: 1; /* enable speculative load tablewalk */
+ ulong l1dc_flsh: 1; /* L1 cache flash invalidate */
+ ulong dis_derpc: 2; /* Disable d-ERAT parity checking */
+ ulong dis_derpg: 1; /* Disable d-ERAT parity generation */
+ ulong dis_derat: 2; /* Disable d-ERAT */
+ ulong dis_dctpc: 2; /* Dis data cache tag paritiy checking */
+ ulong dis_dctpg: 1; /* Dis data cache tag paritiy generation */
+ ulong dis_dcset: 2; /* Disable data cache set */
+ ulong dis_dcpc: 2; /* Disable data cache paritiy checking */
+ ulong dis_dcpg: 1; /* Disable data cache paritiy generation */
+ ulong dis_dcrtpc: 2; /* Disable data cache real add tag parity */
+ ulong dis_tlbpc: 4; /* Disable TLB paritiy checking */
+ ulong dis_tlbpg: 1; /* Disable TLB paritiy generation */
+ ulong dis_tlbset: 4; /* Disable TLB set */
+ ulong dis_slbpc: 1; /* Disable SLB paritiy checking */
+ ulong dis_slbpg: 1; /* Disable SLB paritiy generation */
+ ulong mck_inj: 1; /* Machine check inject enable */
+ ulong dis_stfwd: 1; /* Disbale store forwarding */
+ ulong lpes_1: 1; /* LPAR Environment Selector bit 1 */
+ ulong rmlr_0: 1; /* RMLR 0 */
ulong _reserved: 1;
ulong dis_splarx: 1; /* Disable spec. lwarx/ldarx */
ulong lg_pg_dis: 1; /* Disable large page support */
- ulong lpid01: 2; /* LPAR ID bits 0:1 */
+ ulong lpid_0_1: 2; /* LPAR ID bits 0:1 */
} bits;
ulong word;
};
union hid5 {
struct hid5_bits {
- ulong _reserved_0_31: 32;
- ulong hrmor: 16;
- ulong _reserver_48_49:2;
- ulong _unused_50_55: 6;
- ulong DCBZ_size: 1;
- ulong DCBZ32_ill: 1;
- ulong _unused_58_63: 6;
+ ulong _reserved_0_31: 32;
+ ulong hrmor_0_15: 16;
+ ulong _reserved_48_49: 2;
+ ulong DC_mck: 1; /* Machine check enabled for dcache errors */
+ ulong dis_pwrsave: 1; /* Dis pwrsave on on L1 and d-ERAT */
+ ulong force_G: 1; /* Force gaurded load */
+ ulong DC_repl: 1; /* D-Cache replacement algo */
+ ulong hwr_stms: 1; /* Number of available HW prefetch streams */
+ ulong dst_noop: 1; /* D-stream Touch no-op */
+ ulong DCBZ_size: 1; /* make dcbz size 32 bytes */
+ ulong DCBZ32_ill: 1; /* make dzbz 32byte illeagal */
+ ulong tlb_map: 1; /* TLB mapping */
+ ulong lmq_port: 1; /* Demand miss (LMQ to STS) */
+ ulong lmq_size_0: 1; /* number of outstanding req. to STS */
+ ulong _reserved_61: 1;
+ ulong tch_nop: 1; /* make dcbtand dcbtst ack like no-ops */
+ ulong lmq_size_1: 1; /* second bit to lmq_size_0 */
} bits;
ulong word;
};
diff -r 67953e195eb7 -r 3e99cf85d57d
xen/include/asm-powerpc/powerpc64/processor.h
--- a/xen/include/asm-powerpc/powerpc64/processor.h Wed Aug 30 15:09:47
2006 -0400
+++ b/xen/include/asm-powerpc/powerpc64/processor.h Wed Aug 30 18:01:15
2006 -0400
@@ -138,6 +138,12 @@ static inline void mthid0(ulong val)
__asm__ __volatile__ (
"sync\n"
"mtspr %0, %1\n"
+ "mfspr %0, %1\n"
+ "mfspr %0, %1\n"
+ "mfspr %0, %1\n"
+ "mfspr %0, %1\n"
+ "mfspr %0, %1\n"
+ "mfspr %0, %1\n"
"isync\n"
: : "i"(SPRN_HID0), "r"(val));
}
@@ -152,6 +158,7 @@ static inline void mthid1(ulong val)
{
__asm__ __volatile__ (
"sync\n"
+ "mtspr %0, %1\n"
"mtspr %0, %1\n"
"isync\n"
: : "i"(SPRN_HID1), "r"(val));
_______________________________________________
Xen-ppc-devel mailing list
Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ppc-devel
|