From: Sebastian Huber <sebastian.hu...@embedded-brains.de>

---
 freebsd/sys/powerpc/mpc85xx/mpc85xx.c | 38 +++++++++++++++++++++++++++
 freebsd/sys/powerpc/mpc85xx/mpc85xx.h |  2 ++
 2 files changed, 40 insertions(+)

diff --git a/freebsd/sys/powerpc/mpc85xx/mpc85xx.c 
b/freebsd/sys/powerpc/mpc85xx/mpc85xx.c
index ec7eaa3f..7f3df540 100644
--- a/freebsd/sys/powerpc/mpc85xx/mpc85xx.c
+++ b/freebsd/sys/powerpc/mpc85xx/mpc85xx.c
@@ -82,6 +82,29 @@ ccsr_write4(uintptr_t addr, uint32_t val)
        powerpc_iomb();
 }
 
+static int
+mpc85xx_is_p20xx(void)
+{
+       uint32_t ver;
+       int is_p20xx;
+
+       ver = SVR_VER(mfspr(SPR_SVR));
+       switch (ver) {
+       case SVR_P2010:
+       case SVR_P2010E:
+       case SVR_P2020:
+       case SVR_P2020E:
+       case SVR_P2041:
+       case SVR_P2041E:
+               is_p20xx = 1;
+               break;
+       default:
+               is_p20xx = 0;
+       }
+
+       return (is_p20xx);
+}
+
 int
 law_getmax(void)
 {
@@ -100,6 +123,14 @@ law_getmax(void)
        case SVR_MPC8548E:
                law_max = 10;
                break;
+       case SVR_P2010:
+       case SVR_P2010E:
+       case SVR_P2020:
+       case SVR_P2020E:
+       case SVR_P2041:
+       case SVR_P2041E:
+               law_max = 12;
+               break;
        case SVR_P5020:
        case SVR_P5020E:
        case SVR_P5021:
@@ -124,6 +155,10 @@ law_write(uint32_t n, uint64_t bar, uint32_t sr)
                ccsr_write4(OCP85XX_LAWBARL(n), bar);
                ccsr_write4(OCP85XX_LAWSR_QORIQ(n), sr);
                ccsr_read4(OCP85XX_LAWSR_QORIQ(n));
+       } else if (mpc85xx_is_p20xx()) {
+               ccsr_write4(OCP85XX_LAWBAR_P20XX(n), bar >> 12);
+               ccsr_write4(OCP85XX_LAWAR(n), sr);
+               ccsr_read4(OCP85XX_LAWAR(n));
        } else {
                ccsr_write4(OCP85XX_LAWBAR(n), bar >> 12);
                ccsr_write4(OCP85XX_LAWSR_85XX(n), sr);
@@ -148,6 +183,9 @@ law_read(uint32_t n, uint64_t *bar, uint32_t *sr)
                *bar = (uint64_t)ccsr_read4(OCP85XX_LAWBARH(n)) << 32 |
                    ccsr_read4(OCP85XX_LAWBARL(n));
                *sr = ccsr_read4(OCP85XX_LAWSR_QORIQ(n));
+       } else if (mpc85xx_is_p20xx()) {
+               *bar = (uint64_t)ccsr_read4(OCP85XX_LAWBAR_P20XX(n)) << 12;
+               *sr = ccsr_read4(OCP85XX_LAWAR(n));
        } else {
                *bar = (uint64_t)ccsr_read4(OCP85XX_LAWBAR(n)) << 12;
                *sr = ccsr_read4(OCP85XX_LAWSR_85XX(n));
diff --git a/freebsd/sys/powerpc/mpc85xx/mpc85xx.h 
b/freebsd/sys/powerpc/mpc85xx/mpc85xx.h
index 1a0be6cb..0f1ee5cc 100644
--- a/freebsd/sys/powerpc/mpc85xx/mpc85xx.h
+++ b/freebsd/sys/powerpc/mpc85xx/mpc85xx.h
@@ -79,6 +79,8 @@ extern vm_size_t              ccsrbar_size;
 #define        OCP85XX_LAWSR_85XX(n)   (CCSRBAR_VA + 0xc10 + 0x10 * (n))
 #define        OCP85XX_LAWSR(n)        (mpc85xx_is_qoriq() ? 
OCP85XX_LAWSR_QORIQ(n) : \
                                 OCP85XX_LAWSR_85XX(n))
+#define        OCP85XX_LAWBAR_P20XX(n) (CCSRBAR_VA + 0xc08 + 0x20 * (n))
+#define        OCP85XX_LAWAR(n)        (CCSRBAR_VA + 0xc10 + 0x20 * (n))
 
 /* Attribute register */
 #define        OCP85XX_ENA_MASK        0x80000000
-- 
2.35.3

_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to